diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e2cb77606d8..73dbf5ce07c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,13 +4,20 @@ stages: - publish - optional -image: parity/rust:gitlab-ci - +image: parity/rust-parity-ethereum-build:xenial variables: + GIT_STRATEGY: fetch + GIT_SUBMODULE_STRATEGY: recursive CI_SERVER_NAME: "GitLab CI" CARGO_HOME: "${CI_PROJECT_DIR}/.cargo" CARGO_TARGET: x86_64-unknown-linux-gnu +.no_git: &no_git + variables: + GIT_STRATEGY: none + GIT_SUBMODULE_STRATEGY: none + + .releaseable_branches: # list of git refs for building GitLab artifacts (think "pre-release binaries") only: &releaseable_branches - stable @@ -25,42 +32,54 @@ variables: when: on_success expire_in: 1 mos paths: - - artifacts/ - -.determine_version: &determine_version - - VERSION="$(sed -r -n '1,/^version/s/^version = "([^"]+)".*$/\1/p' Cargo.toml)" - - DATE_STR="$(date +%Y%m%d)" - - ID_SHORT="$(echo ${CI_COMMIT_SHA} | cut -c 1-7)" - - test "${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}" = "nightly" && VERSION="${VERSION}-${ID_SHORT}-${DATE_STR}" - - export VERSION - - echo "Version = ${VERSION}" + - artifacts/ test-linux: stage: test variables: RUN_TESTS: all script: - - scripts/gitlab/test-all.sh stable + - scripts/gitlab/test-all.sh + - sccache -s tags: - - rust-stable + - linux-docker test-audit: stage: test script: - - scripts/gitlab/cargo-audit.sh + - set -e + - set -u + - cargo audit tags: - - rust-stable + - linux-docker -build-linux: +build-linux: &build-linux stage: build only: *releaseable_branches - variables: - CARGO_TARGET: x86_64-unknown-linux-gnu script: - scripts/gitlab/build-unix.sh + - sccache -s <<: *collect_artifacts tags: - - rust-stable + - linux-docker + +build-linux-i386: + <<: *build-linux + image: parity/rust-parity-ethereum-build:i386 + variables: + CARGO_TARGET: i686-unknown-linux-gnu + +build-linux-arm64: + <<: *build-linux + image: parity/rust-parity-ethereum-build:arm64 + variables: + CARGO_TARGET: aarch64-unknown-linux-gnu + +build-linux-armhf: + <<: *build-linux + image: parity/rust-parity-ethereum-build:armhf + variables: + CARGO_TARGET: armv7-unknown-linux-gnueabihf build-darwin: stage: build @@ -97,19 +116,81 @@ publish-docker: script: - scripts/gitlab/publish-docker.sh parity -publish-awss3: +publish-snap: &publish-snap stage: publish only: *releaseable_branches + image: snapcore/snapcraft + variables: + BUILD_ARCH: amd64 cache: {} + dependencies: + - build-linux + tags: + - linux-docker + script: + - scripts/gitlab/publish-snap.sh + <<: *collect_artifacts + +publish-snap-i386: + <<: *publish-snap + variables: + BUILD_ARCH: i386 + dependencies: + - build-linux-i386 + +publish-snap-arm64: + <<: *publish-snap + variables: + BUILD_ARCH: arm64 + dependencies: + - build-linux-arm64 + +publish-snap-armhf: + <<: *publish-snap + variables: + BUILD_ARCH: armhf + dependencies: + - build-linux-armhf + +publish-onchain: + stage: publish + only: *releaseable_branches + cache: {} dependencies: - build-linux - build-darwin - build-windows - before_script: *determine_version script: - - scripts/gitlab/publish-awss3.sh + - scripts/gitlab/publish-onchain.sh tags: - - shell + - linux-docker + +publish-awss3-release: + image: parity/awscli:latest + stage: publish + only: *releaseable_branches + <<: *no_git + cache: {} + dependencies: + - build-linux + - build-darwin + - build-windows + script: + - echo "__________Push binaries to AWS S3____________" + - case "${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}" in + (beta|stable|nightly) + export BUCKET=releases.parity.io/ethereum; + ;; + (*) + export BUCKET=builds-parity; + ;; + esac + - aws s3 sync ./artifacts s3://${BUCKET}/${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}/ + after_script: + - aws s3 ls s3://${BUCKET}/${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}/ + --recursive --human-readable --summarize + tags: + - linux-docker publish-docs: stage: publish @@ -121,7 +202,7 @@ publish-docs: script: - scripts/gitlab/publish-docs.sh tags: - - shell + - linux-docker build-android: stage: optional @@ -131,25 +212,6 @@ build-android: script: - scripts/gitlab/build-unix.sh tags: - - rust-arm - allow_failure: true - -test-beta: - stage: optional - variables: - RUN_TESTS: cargo - script: - - scripts/gitlab/test-all.sh beta - tags: - - rust-beta - allow_failure: true - -test-nightly: - stage: optional - variables: - RUN_TESTS: all - script: - - scripts/gitlab/test-all.sh nightly - tags: - - rust-nightly + - linux-docker allow_failure: true + <<: *collect_artifacts diff --git a/CHANGELOG.md b/CHANGELOG.md index 71591c5fff2..62119ce7ab1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,276 +1,163 @@ -## Parity-Ethereum [v2.2.5](https://github.com/paritytech/parity-ethereum/releases/tag/v2.2.5) (2018-12-14) -Parity-Ethereum 2.2.5-beta is an important release that introduces Constantinople fork at block 7080000 on Mainnet. -This release also contains a fix for chains using AuRa + EmptySteps. Read carefully if this applies to you. -If you have a chain with`empty_steps` already running, some blocks most likely contain non-strict entries (unordered or duplicated empty steps). In this release`strict_empty_steps_transition` **is enabled by default at block 0** for any chain with `empty_steps`. -If your network uses `empty_steps` you **must**: -- plan a hard fork and change `strict_empty_steps_transition` to the desire fork block -- update the clients of the whole network to 2.2.5-beta / 2.1.10-stable. -If for some reason you don't want to do this please set`strict_empty_steps_transition` to `0xfffffffff` to disable it. +## Parity-Ethereum [v2.3.0](https://github.com/paritytech/parity-ethereum/releases/tag/v2.3.0) (2019-01-16) -The full list of included changes: -- Backports for beta 2.2.5 ([#10047](https://github.com/paritytech/parity-ethereum/pull/10047)) - - Bump beta to 2.2.5 ([#10047](https://github.com/paritytech/parity-ethereum/pull/10047)) - - Fix empty steps ([#9939](https://github.com/paritytech/parity-ethereum/pull/9939)) - - Prevent sending empty step message twice - - Prevent sending empty step and then block in the same step - - Don't accept double empty steps - - Do basic validation of self-sealed blocks - - Strict empty steps validation ([#10041](https://github.com/paritytech/parity-ethereum/pull/10041)) - - Enables strict verification of empty steps - there can be no duplicates and empty steps should be ordered inside the seal. - - Note that authorities won't produce invalid seals after [#9939](https://github.com/paritytech/parity-ethereum/pull/9939), this PR just adds verification to the seal to prevent forging incorrect blocks and potentially causing consensus issues. - - This features is enabled by default so any AuRa + EmptySteps chain should set strict_empty_steps_transition fork block number in their spec and upgrade to v2.2.5-beta or v2.1.10-stable. - - ethcore: enable constantinople on ethereum ([#10031](https://github.com/paritytech/parity-ethereum/pull/10031)) - - ethcore: change blockreward to 2e18 for foundation after constantinople - - ethcore: delay diff bomb by 2e6 blocks for foundation after constantinople - - ethcore: enable eip-{145,1014,1052,1283} for foundation after constantinople - - Change test miner max memory to malloc reports. ([#10024](https://github.com/paritytech/parity-ethereum/pull/10024)) - - Fix: test corpus_inaccessible panic ([#10019](https://github.com/paritytech/parity-ethereum/pull/10019)) +Parity-Ethereum 2.3.0-beta is a consensus-relevant security release that reverts Constantinople on the Ethereum network. Upgrading is mandatory for Ethereum, and strongly recommended for other networks. -## Parity-Ethereum [v2.2.2](https://github.com/paritytech/parity-ethereum/releases/tag/v2.2.2) (2018-11-29) +- **Consensus** - Ethereum Network: Pull Constantinople protocol upgrade on Ethereum (#10189) + - Read more: [Security Alert: Ethereum Constantinople Postponement](https://blog.ethereum.org/2019/01/15/security-alert-ethereum-constantinople-postponement/) +- **Networking** - All networks: Ping nodes from discovery (#10167) +- **Wasm** - Kovan Network: Update pwasm-utils to 0.6.1 (#10134) -Parity-Ethereum 2.2.2-beta is an exciting release. Among others, it improves sync performance, peering stability, block propagation, and transaction propagation times. Also, a warp-sync no longer removes existing blocks from the database, but rather reuses locally available information to decrease sync times and reduces required bandwidth. +Other notable changes: -Before upgrading to 2.2.2, please also verify the validity of your chain specs. Parity Ethereum now denies unknown fields in the specification. To do this, use the chainspec tool: +- Existing blocks in the database are now kept when restoring a Snapshot. (#8643) +- Block and transaction propagation is improved significantly. (#9954) +- The ERC-191 Signed Data Standard is now supported by `personal_sign191`. (#9701) +- Add support for ERC-191/712 `eth_signTypedData` as a standard for machine-verifiable and human-readable typed data signing with Ethereum keys. (#9631) +- Add support for ERC-1186 `eth_getProof` (#9001) +- Add experimental RPCs flag to enable ERC-191, ERC-712, and ERC-1186 APIs via `--jsonrpc-experimental` (#9928) +- Make `CALLCODE` to trace value to be the code address. (#9881) -``` -cargo build --release -p chainspec -./target/release/chainspec /path/to/spec.json -``` +Configuration changes: -Last but not least, JSONRPC APIs which are not yet accepted as an EIP in the `eth`, `personal`, or `web3` namespace, are now considere experimental as their final specification might change in future. These APIs have to be manually enabled by explicitly running `--jsonrpc-experimental`. +- The EIP-98 transition is now disabled by default. If you previously had no `eip98transition` specified in your chain specification, you would enable this now manually on block `0x0`. (#9955) +- Also, unknown fields in chain specs are now rejected. (#9972) +- The Tendermint engine was removed from Parity Ethereum and is no longer available and maintained. (#9980) +- Ropsten testnet data and keys moved from `test/` to `ropsten/` subdir. To reuse your old keys and data either copy or symlink them to the new location. (#10123) +- Strict empty steps validation (#10041) + - If you have a chain with`empty_steps` already running, some blocks most likely contain non-strict entries (unordered or duplicated empty steps). In this release `strict_empty_steps_transition` is enabled by default at block `0x0` for any chain with `empty_steps`. + - If your network uses `empty_steps` you **must** (A) plan a hard fork and change `strict_empty_steps_transition` to the desired fork block and (B) update the clients of the whole network to 2.2.7-stable / 2.3.0-beta. If for some reason you don't want to do this please set`strict_empty_steps_transition` to `0xfffffffff` to disable it. -The full list of included changes: - -- Backports For beta 2.2.2 ([#9976](https://github.com/paritytech/parity-ethereum/pull/9976)) - - Version: bump beta to 2.2.2 - - Add experimental RPCs flag ([#9928](https://github.com/paritytech/parity-ethereum/pull/9928)) - - Keep existing blocks when restoring a Snapshot ([#8643](https://github.com/paritytech/parity-ethereum/pull/8643)) - - Rename db_restore => client - - First step: make it compile! - - Second step: working implementation! - - Refactoring - - Fix tests - - Migrate ancient blocks interacting backward - - Early return in block migration if snapshot is aborted - - Remove RwLock getter (PR Grumble I) - - Remove dependency on `Client`: only used Traits - - Add test for recovering aborted snapshot recovery - - Add test for migrating old blocks - - Release RwLock earlier - - Revert Cargo.lock - - Update _update ancient block_ logic: set local in `commit` - - Update typo in ethcore/src/snapshot/service.rs - - Adjust requests costs for light client ([#9925](https://github.com/paritytech/parity-ethereum/pull/9925)) - - Pip Table Cost relative to average peers instead of max peers - - Add tracing in PIP new_cost_table - - Update stat peer_count - - Use number of leeching peers for Light serve costs - - Fix test::light_params_load_share_depends_on_max_peers (wrong type) - - Remove (now) useless test - - Remove `load_share` from LightParams.Config - - Add LEECHER_COUNT_FACTOR - - Pr Grumble: u64 to u32 for f64 casting - - Prevent u32 overflow for avg_peer_count - - Add tests for LightSync::Statistics - - Fix empty steps ([#9939](https://github.com/paritytech/parity-ethereum/pull/9939)) - - Don't send empty step twice or empty step then block. - - Perform basic validation of locally sealed blocks. - - Don't include empty step twice. - - Prevent silent errors in daemon mode, closes [#9367](https://github.com/paritytech/parity-ethereum/issues/9367) ([#9946](https://github.com/paritytech/parity-ethereum/pull/9946)) - - Fix a deadlock ([#9952](https://github.com/paritytech/parity-ethereum/pull/9952)) - - Update informant: - - Decimal in Mgas/s - - Print every 5s (not randomly between 5s and 10s) - - Fix dead-lock in `blockchain.rs` - - Update locks ordering - - Fix light client informant while syncing ([#9932](https://github.com/paritytech/parity-ethereum/pull/9932)) - - Add `is_idle` to LightSync to check importing status - - Use SyncStateWrapper to make sure is_idle gets updates - - Update is_major_import to use verified queue size as well - - Add comment for `is_idle` - - Add Debug to `SyncStateWrapper` - - `fn get` -> `fn into_inner` - - Ci: rearrange pipeline by logic ([#9970](https://github.com/paritytech/parity-ethereum/pull/9970)) - - Ci: rearrange pipeline by logic - - Ci: rename docs script - - Fix docker build ([#9971](https://github.com/paritytech/parity-ethereum/pull/9971)) - - Deny unknown fields for chainspec ([#9972](https://github.com/paritytech/parity-ethereum/pull/9972)) - - Add deny_unknown_fields to chainspec - - Add tests and fix existing one - - Remove serde_ignored dependency for chainspec - - Fix rpc test eth chain spec - - Fix starting_nonce_test spec - - Improve block and transaction propagation ([#9954](https://github.com/paritytech/parity-ethereum/pull/9954)) - - Refactor sync to add priority tasks. - - Send priority tasks notifications. - - Propagate blocks, optimize transactions. - - Implement transaction propagation. Use sync_channel. - - Tone down info. - - Prevent deadlock by not waiting forever for sync lock. - - Fix lock order. - - Don't use sync_channel to prevent deadlocks. - - Fix tests. - - Fix unstable peers and slowness in sync ([#9967](https://github.com/paritytech/parity-ethereum/pull/9967)) - - Don't sync all peers after each response - - Update formating - - Fix tests: add `continue_sync` to `Sync_step` - - Update ethcore/sync/src/chain/mod.rs - - Fix rpc middlewares - - Fix Cargo.lock - - Json: resolve merge in spec - - Rpc: fix starting_nonce_test - - Ci: allow nightl job to fail - -## Parity-Ethereum [v2.2.1](https://github.com/paritytech/parity-ethereum/releases/tag/v2.2.1) (2018-11-15) - -Parity-Ethereum 2.2.1-beta is the first v2.2 release, and might introduce features that break previous work flows, among others: - -- Prevent zero network ID ([#9763](https://github.com/paritytech/parity-ethereum/pull/9763)) and drop support for Olympic testnet ([#9801](https://github.com/paritytech/parity-ethereum/pull/9801)): The Olympic test net is dead for years and never used a chain ID but network ID zero. Parity Ethereum is now preventing the network ID to be zero, thus Olympic support is dropped. Make sure to chose positive non-zero network IDs in future. -- Multithreaded snapshot creation ([#9239](https://github.com/paritytech/parity-ethereum/pull/9239)): adds a CLI argument `--snapshot-threads` which specifies the number of threads. This helps improving the performance of full nodes that wish to provide warp-snapshots for the network. The gain in performance comes with a slight drawback in increased snapshot size. -- Expose config max-round-blocks-to-import ([#9439](https://github.com/paritytech/parity-ethereum/pull/9439)): Parity Ethereum imports blocks in rounds. If at the end of any round, the queue is not empty, we consider it to be _importing_ and won't notify pubsub. On large re-orgs (10+ blocks), this is possible. The default `max_round_blocks_to_import` is increased to 12 and configurable via the `--max-round-blocks-to-import` CLI flag. With unstable network conditions, it is advised to increase the number. This shouldn't have any noticeable performance impact unless the number is set to really large. -- Increase Gas-floor-target and Gas Cap ([#9564](https://github.com/paritytech/parity-ethereum/pull/9564)): the default values for gas floor target are `8_000_000` and gas cap `10_000_000`, similar to Geth 1.8.15+. -- Produce portable binaries ([#9725](https://github.com/paritytech/parity-ethereum/pull/9725)): we now produce portable binaries, but it may incur some performance degradation. For ultimate performance it's now better to compile Parity Ethereum from source with `PORTABLE=OFF` environment variable. -- RPC: `parity_allTransactionHashes` ([#9745](https://github.com/paritytech/parity-ethereum/pull/9745)): Get all pending transactions from the queue with the high performant `parity_allTransactionHashes` RPC method. -- Support `eth_chainId` RPC method ([#9783](https://github.com/paritytech/parity-ethereum/pull/9783)): implements EIP-695 to get the chainID via RPC. -- AuRa: finalize blocks ([#9692](https://github.com/paritytech/parity-ethereum/pull/9692)): The AuRa engine was updated to emit ancestry actions to finalize blocks. The full client stores block finality in the database, the engine builds finality from an ancestry of `ExtendedHeader`; `is_epoch_end` was updated to take a vec of recently finalized headers; `is_epoch_end_light` was added which maintains the previous interface and is used by the light client since the client itself doesn't track finality. +_Note:_ This release marks Parity 2.3 as _beta_. All versions of Parity 2.2 are now considered _stable_. The full list of included changes: -- Backport to parity 2.2.1 beta ([#9905](https://github.com/paritytech/parity-ethereum/pull/9905)) - - Bump version to 2.2.1 - - Fix: Intermittent failing CI due to addr in use ([#9885](https://github.com/paritytech/parity-ethereum/pull/9885)) - - Fix Parity not closing on Ctrl-C ([#9886](https://github.com/paritytech/parity-ethereum/pull/9886)) - - Fix json tracer overflow ([#9873](https://github.com/paritytech/parity-ethereum/pull/9873)) - - Fix docker script ([#9854](https://github.com/paritytech/parity-ethereum/pull/9854)) - - Add hardcoded headers for light client ([#9907](https://github.com/paritytech/parity-ethereum/pull/9907)) - - Gitlab-ci: make android release build succeed ([#9743](https://github.com/paritytech/parity-ethereum/pull/9743)) - - Allow to seal work on latest block ([#9876](https://github.com/paritytech/parity-ethereum/pull/9876)) - - Remove rust-toolchain file ([#9906](https://github.com/paritytech/parity-ethereum/pull/9906)) - - Light-fetch: Differentiate between out-of-gas/manual throw and use required gas from response on failure ([#9824](https://github.com/paritytech/parity-ethereum/pull/9824)) - - Eip-712 implementation ([#9631](https://github.com/paritytech/parity-ethereum/pull/9631)) - - Eip-191 implementation ([#9701](https://github.com/paritytech/parity-ethereum/pull/9701)) - - Simplify cargo audit ([#9918](https://github.com/paritytech/parity-ethereum/pull/9918)) - - Fix performance issue importing Kovan blocks ([#9914](https://github.com/paritytech/parity-ethereum/pull/9914)) - - Ci: nuke the gitlab caches ([#9855](https://github.com/paritytech/parity-ethereum/pull/9855)) -- Backports to parity beta 2.2.0 ([#9820](https://github.com/paritytech/parity-ethereum/pull/9820)) - - Ci: remove failing tests for android, windows, and macos ([#9788](https://github.com/paritytech/parity-ethereum/pull/9788)) - - Implement NoProof for json tests and update tests reference ([#9814](https://github.com/paritytech/parity-ethereum/pull/9814)) - - Move state root verification before gas used ([#9841](https://github.com/paritytech/parity-ethereum/pull/9841)) - - Classic.json Bootnode Update ([#9828](https://github.com/paritytech/parity-ethereum/pull/9828)) -- Rpc: parity_allTransactionHashes ([#9745](https://github.com/paritytech/parity-ethereum/pull/9745)) -- Revert "prevent zero networkID ([#9763](https://github.com/paritytech/parity-ethereum/pull/9763))" ([#9815](https://github.com/paritytech/parity-ethereum/pull/9815)) -- Allow zero chain id in EIP155 signing process ([#9792](https://github.com/paritytech/parity-ethereum/pull/9792)) -- Add readiness check for docker container ([#9804](https://github.com/paritytech/parity-ethereum/pull/9804)) -- Insert dev account before unlocking ([#9813](https://github.com/paritytech/parity-ethereum/pull/9813)) -- Removed "rustup" & added new runner tag ([#9731](https://github.com/paritytech/parity-ethereum/pull/9731)) -- Expose config max-round-blocks-to-import ([#9439](https://github.com/paritytech/parity-ethereum/pull/9439)) -- Aura: finalize blocks ([#9692](https://github.com/paritytech/parity-ethereum/pull/9692)) -- Sync: retry different peer after empty subchain heads response ([#9753](https://github.com/paritytech/parity-ethereum/pull/9753)) -- Fix(light-rpc/parity) : Remove unused client ([#9802](https://github.com/paritytech/parity-ethereum/pull/9802)) -- Drops support for olympic testnet, closes [#9800](https://github.com/paritytech/parity-ethereum/issues/9800) ([#9801](https://github.com/paritytech/parity-ethereum/pull/9801)) -- Replace `tokio_core` with `tokio` (`ring` -> 0.13) ([#9657](https://github.com/paritytech/parity-ethereum/pull/9657)) -- Support eth_chainId RPC method ([#9783](https://github.com/paritytech/parity-ethereum/pull/9783)) -- Ethcore: bump ropsten forkblock checkpoint ([#9775](https://github.com/paritytech/parity-ethereum/pull/9775)) -- Docs: changelogs for 2.0.8 and 2.1.3 ([#9758](https://github.com/paritytech/parity-ethereum/pull/9758)) -- Prevent zero networkID ([#9763](https://github.com/paritytech/parity-ethereum/pull/9763)) -- Skip seal fields count check when --no-seal-check is used ([#9757](https://github.com/paritytech/parity-ethereum/pull/9757)) -- Aura: fix panic on extra_info with unsealed block ([#9755](https://github.com/paritytech/parity-ethereum/pull/9755)) -- Docs: update changelogs ([#9742](https://github.com/paritytech/parity-ethereum/pull/9742)) -- Removed extra assert in generation_session_is_removed_when_succeeded ([#9738](https://github.com/paritytech/parity-ethereum/pull/9738)) -- Make checkpoint_storage_at use plain loop instead of recursion ([#9734](https://github.com/paritytech/parity-ethereum/pull/9734)) -- Use signed 256-bit integer for sstore gas refund substate ([#9746](https://github.com/paritytech/parity-ethereum/pull/9746)) -- Heads ref not present for branches beta and stable ([#9741](https://github.com/paritytech/parity-ethereum/pull/9741)) -- Add Callisto support ([#9534](https://github.com/paritytech/parity-ethereum/pull/9534)) -- Add --force to cargo audit install script ([#9735](https://github.com/paritytech/parity-ethereum/pull/9735)) -- Remove unused expired value from Handshake ([#9732](https://github.com/paritytech/parity-ethereum/pull/9732)) -- Add hardcoded headers ([#9730](https://github.com/paritytech/parity-ethereum/pull/9730)) -- Produce portable binaries ([#9725](https://github.com/paritytech/parity-ethereum/pull/9725)) -- Gitlab ci: releasable_branches: change variables condition to schedule ([#9729](https://github.com/paritytech/parity-ethereum/pull/9729)) -- Update a few parity-common dependencies ([#9663](https://github.com/paritytech/parity-ethereum/pull/9663)) -- Hf in POA Core (2018-10-22) ([#9724](https://github.com/paritytech/parity-ethereum/pull/9724)) -- Schedule nightly builds ([#9717](https://github.com/paritytech/parity-ethereum/pull/9717)) -- Fix ancient blocks sync ([#9531](https://github.com/paritytech/parity-ethereum/pull/9531)) -- Ci: Skip docs job for nightly ([#9693](https://github.com/paritytech/parity-ethereum/pull/9693)) -- Fix (light/provider) : Make `read_only executions` read-only ([#9591](https://github.com/paritytech/parity-ethereum/pull/9591)) -- Ethcore: fix detection of major import ([#9552](https://github.com/paritytech/parity-ethereum/pull/9552)) -- Return 0 on error ([#9705](https://github.com/paritytech/parity-ethereum/pull/9705)) -- Ethcore: delay ropsten hardfork ([#9704](https://github.com/paritytech/parity-ethereum/pull/9704)) -- Make instantSeal engine backwards compatible, closes [#9696](https://github.com/paritytech/parity-ethereum/issues/9696) ([#9700](https://github.com/paritytech/parity-ethereum/pull/9700)) -- Implement CREATE2 gas changes and fix some potential overflowing ([#9694](https://github.com/paritytech/parity-ethereum/pull/9694)) -- Don't hash the init_code of CREATE. ([#9688](https://github.com/paritytech/parity-ethereum/pull/9688)) -- Ethcore: minor optimization of modexp by using LR exponentiation ([#9697](https://github.com/paritytech/parity-ethereum/pull/9697)) -- Removed redundant clone before each block import ([#9683](https://github.com/paritytech/parity-ethereum/pull/9683)) -- Add Foundation Bootnodes ([#9666](https://github.com/paritytech/parity-ethereum/pull/9666)) -- Docker: run as parity user ([#9689](https://github.com/paritytech/parity-ethereum/pull/9689)) -- Ethcore: mcip3 block reward contract ([#9605](https://github.com/paritytech/parity-ethereum/pull/9605)) -- Verify block syncing responses against requests ([#9670](https://github.com/paritytech/parity-ethereum/pull/9670)) -- Add a new RPC `parity_submitWorkDetail` similar `eth_submitWork` but return block hash ([#9404](https://github.com/paritytech/parity-ethereum/pull/9404)) -- Resumable EVM and heap-allocated callstack ([#9360](https://github.com/paritytech/parity-ethereum/pull/9360)) -- Update parity-wordlist library ([#9682](https://github.com/paritytech/parity-ethereum/pull/9682)) -- Ci: Remove unnecessary pipes ([#9681](https://github.com/paritytech/parity-ethereum/pull/9681)) -- Test.sh: use cargo --target for platforms other than linux, win or mac ([#9650](https://github.com/paritytech/parity-ethereum/pull/9650)) -- Ci: fix push script ([#9679](https://github.com/paritytech/parity-ethereum/pull/9679)) -- Hardfork the testnets ([#9562](https://github.com/paritytech/parity-ethereum/pull/9562)) -- Calculate sha3 instead of sha256 for push-release. ([#9673](https://github.com/paritytech/parity-ethereum/pull/9673)) -- Ethcore-io retries failed work steal ([#9651](https://github.com/paritytech/parity-ethereum/pull/9651)) -- Fix(light_fetch): avoid race with BlockNumber::Latest ([#9665](https://github.com/paritytech/parity-ethereum/pull/9665)) -- Test fix for windows cache name... ([#9658](https://github.com/paritytech/parity-ethereum/pull/9658)) -- Refactor(fetch) : light use only one `DNS` thread ([#9647](https://github.com/paritytech/parity-ethereum/pull/9647)) -- Ethereum libfuzzer integration small change ([#9547](https://github.com/paritytech/parity-ethereum/pull/9547)) -- Cli: remove reference to --no-ui in --unlock flag help ([#9616](https://github.com/paritytech/parity-ethereum/pull/9616)) -- Remove master from releasable branches ([#9655](https://github.com/paritytech/parity-ethereum/pull/9655)) -- Ethcore/VerificationQueue don't spawn up extra `worker-threads` when explictly specified not to ([#9620](https://github.com/paritytech/parity-ethereum/pull/9620)) -- Rpc: parity_getBlockReceipts ([#9527](https://github.com/paritytech/parity-ethereum/pull/9527)) -- Remove unused dependencies ([#9589](https://github.com/paritytech/parity-ethereum/pull/9589)) -- Ignore key_server_cluster randomly failing tests ([#9639](https://github.com/paritytech/parity-ethereum/pull/9639)) -- Ethcore: handle vm exception when estimating gas ([#9615](https://github.com/paritytech/parity-ethereum/pull/9615)) -- Fix bad-block reporting no reason ([#9638](https://github.com/paritytech/parity-ethereum/pull/9638)) -- Use static call and apparent value transfer for block reward contract code ([#9603](https://github.com/paritytech/parity-ethereum/pull/9603)) -- Hf in POA Sokol (2018-09-19) ([#9607](https://github.com/paritytech/parity-ethereum/pull/9607)) -- Bump smallvec to 0.6 in ethcore-light, ethstore and whisper ([#9588](https://github.com/paritytech/parity-ethereum/pull/9588)) -- Add constantinople conf to EvmTestClient. ([#9570](https://github.com/paritytech/parity-ethereum/pull/9570)) -- Fix(network): don't disconnect reserved peers ([#9608](https://github.com/paritytech/parity-ethereum/pull/9608)) -- Fix failing node-table tests on mac os, closes [#9632](https://github.com/paritytech/parity-ethereum/issues/9632) ([#9633](https://github.com/paritytech/parity-ethereum/pull/9633)) -- Update ropsten.json ([#9602](https://github.com/paritytech/parity-ethereum/pull/9602)) -- Simplify ethcore errors by removing BlockImportError ([#9593](https://github.com/paritytech/parity-ethereum/pull/9593)) -- Fix windows compilation, replaces [#9561](https://github.com/paritytech/parity-ethereum/issues/9561) ([#9621](https://github.com/paritytech/parity-ethereum/pull/9621)) -- Master: rpc-docs set github token ([#9610](https://github.com/paritytech/parity-ethereum/pull/9610)) -- Docs: add changelogs for 1.11.10, 1.11.11, 2.0.3, 2.0.4, 2.0.5, 2.0.6, 2.1.0, and 2.1.1 ([#9554](https://github.com/paritytech/parity-ethereum/pull/9554)) -- Docs(rpc): annotate tag with the provided message ([#9601](https://github.com/paritytech/parity-ethereum/pull/9601)) -- Ci: fix regex roll_eyes ([#9597](https://github.com/paritytech/parity-ethereum/pull/9597)) -- Remove snapcraft clean ([#9585](https://github.com/paritytech/parity-ethereum/pull/9585)) -- Add snapcraft package image (master) ([#9584](https://github.com/paritytech/parity-ethereum/pull/9584)) -- Docs(rpc): push the branch along with tags ([#9578](https://github.com/paritytech/parity-ethereum/pull/9578)) -- Fix typo for jsonrpc-threads flag ([#9574](https://github.com/paritytech/parity-ethereum/pull/9574)) -- Fix informant compile ([#9571](https://github.com/paritytech/parity-ethereum/pull/9571)) -- Added ropsten bootnodes ([#9569](https://github.com/paritytech/parity-ethereum/pull/9569)) -- Increase Gas-floor-target and Gas Cap ([#9564](https://github.com/paritytech/parity-ethereum/pull/9564)) -- While working on the platform tests make them non-breaking ([#9563](https://github.com/paritytech/parity-ethereum/pull/9563)) -- Improve P2P discovery ([#9526](https://github.com/paritytech/parity-ethereum/pull/9526)) -- Move dockerfile for android build container to scripts repo ([#9560](https://github.com/paritytech/parity-ethereum/pull/9560)) -- Simultaneous platform tests WIP ([#9557](https://github.com/paritytech/parity-ethereum/pull/9557)) -- Update ethabi-derive, serde, serde_json, serde_derive, syn && quote ([#9553](https://github.com/paritytech/parity-ethereum/pull/9553)) -- Ci: fix rpc docs generation 2 ([#9550](https://github.com/paritytech/parity-ethereum/pull/9550)) -- Ci: always run build pipelines for win, mac, linux, and android ([#9537](https://github.com/paritytech/parity-ethereum/pull/9537)) -- Multithreaded snapshot creation ([#9239](https://github.com/paritytech/parity-ethereum/pull/9239)) -- New ethabi ([#9511](https://github.com/paritytech/parity-ethereum/pull/9511)) -- Remove initial token for WS. ([#9545](https://github.com/paritytech/parity-ethereum/pull/9545)) -- Net_version caches network_id to avoid redundant aquire of sync readlock ([#9544](https://github.com/paritytech/parity-ethereum/pull/9544)) -- Correct before_script for nightly build versions ([#9543](https://github.com/paritytech/parity-ethereum/pull/9543)) -- Deps: bump kvdb-rocksdb to 0.1.4 ([#9539](https://github.com/paritytech/parity-ethereum/pull/9539)) -- State: test when contract creation fails, old storage values should re-appear ([#9532](https://github.com/paritytech/parity-ethereum/pull/9532)) -- Allow dropping light client RPC query with no results ([#9318](https://github.com/paritytech/parity-ethereum/pull/9318)) -- Bump master to 2.2.0 ([#9517](https://github.com/paritytech/parity-ethereum/pull/9517)) -- Enable all Constantinople hard fork changes in constantinople_test.json ([#9505](https://github.com/paritytech/parity-ethereum/pull/9505)) -- [Light] Validate `account balance` before importing transactions ([#9417](https://github.com/paritytech/parity-ethereum/pull/9417)) -- In create memory calculation is the same for create2 because the additional parameter was popped before. ([#9522](https://github.com/paritytech/parity-ethereum/pull/9522)) -- Update patricia trie to 0.2.2 ([#9525](https://github.com/paritytech/parity-ethereum/pull/9525)) -- Replace hardcoded JSON with serde json! macro ([#9489](https://github.com/paritytech/parity-ethereum/pull/9489)) -- Fix typo in version string ([#9516](https://github.com/paritytech/parity-ethereum/pull/9516)) +- Backports for 2.3.0 beta ([#10164](https://github.com/paritytech/parity-ethereum/pull/10164)) +- Snap: fix path in script ([#10157](https://github.com/paritytech/parity-ethereum/pull/10157)) +- Make sure parent block is not in importing queue when importing ancient blocks ([#10138](https://github.com/paritytech/parity-ethereum/pull/10138)) +- Ci: re-enable snap publishing ([#10142](https://github.com/paritytech/parity-ethereum/pull/10142)) +- Hf in POA Core (2019-01-18) - Constantinople ([#10155](https://github.com/paritytech/parity-ethereum/pull/10155)) +- Update EWF's tobalaba chainspec ([#10152](https://github.com/paritytech/parity-ethereum/pull/10152)) +- Replace ethcore-logger with env-logger. ([#10102](https://github.com/paritytech/parity-ethereum/pull/10102)) +- Finality: dont require chain head to be in the chain ([#10054](https://github.com/paritytech/parity-ethereum/pull/10054)) +- Remove caching for node connections ([#10143](https://github.com/paritytech/parity-ethereum/pull/10143)) +- Blooms file iterator empty on out of range position. ([#10145](https://github.com/paritytech/parity-ethereum/pull/10145)) +- Autogen docs for the "Configuring Parity Ethereum" wiki page. ([#10067](https://github.com/paritytech/parity-ethereum/pull/10067)) +- Misc: bump license header to 2019 ([#10135](https://github.com/paritytech/parity-ethereum/pull/10135)) +- Hide most of the logs from cpp example. ([#10139](https://github.com/paritytech/parity-ethereum/pull/10139)) +- Don't try to send oversized packets ([#10042](https://github.com/paritytech/parity-ethereum/pull/10042)) +- Private tx enabled flag added into STATUS packet ([#9999](https://github.com/paritytech/parity-ethereum/pull/9999)) +- Update pwasm-utils to 0.6.1 ([#10134](https://github.com/paritytech/parity-ethereum/pull/10134)) +- Extract blockchain from ethcore ([#10114](https://github.com/paritytech/parity-ethereum/pull/10114)) +- Ethcore: update hardcoded headers ([#10123](https://github.com/paritytech/parity-ethereum/pull/10123)) +- Identity fix ([#10128](https://github.com/paritytech/parity-ethereum/pull/10128)) +- Use LenCachingMutex to optimize verification. ([#10117](https://github.com/paritytech/parity-ethereum/pull/10117)) +- Pyethereum keystore support ([#9710](https://github.com/paritytech/parity-ethereum/pull/9710)) +- Bump rocksdb-sys to 0.5.5 ([#10124](https://github.com/paritytech/parity-ethereum/pull/10124)) +- Parity-clib: `async C bindings to RPC requests` + `subscribe/unsubscribe to websocket events` ([#9920](https://github.com/paritytech/parity-ethereum/pull/9920)) +- Refactor (hardware wallet) : reduce the number of threads ([#9644](https://github.com/paritytech/parity-ethereum/pull/9644)) +- Hf in POA Sokol (2019-01-04) ([#10077](https://github.com/paritytech/parity-ethereum/pull/10077)) +- Fix broken links ([#10119](https://github.com/paritytech/parity-ethereum/pull/10119)) +- Follow-up to [#10105](https://github.com/paritytech/parity-ethereum/issues/10105) ([#10107](https://github.com/paritytech/parity-ethereum/pull/10107)) +- Move EIP-712 crate back to parity-ethereum ([#10106](https://github.com/paritytech/parity-ethereum/pull/10106)) +- Move a bunch of stuff around ([#10101](https://github.com/paritytech/parity-ethereum/pull/10101)) +- Revert "Add --frozen when running cargo ([#10081](https://github.com/paritytech/parity-ethereum/pull/10081))" ([#10105](https://github.com/paritytech/parity-ethereum/pull/10105)) +- Fix left over small grumbles on whitespaces ([#10084](https://github.com/paritytech/parity-ethereum/pull/10084)) +- Add --frozen when running cargo ([#10081](https://github.com/paritytech/parity-ethereum/pull/10081)) +- Fix pubsub new_blocks notifications to include all blocks ([#9987](https://github.com/paritytech/parity-ethereum/pull/9987)) +- Update some dependencies for compilation with pc-windows-gnu ([#10082](https://github.com/paritytech/parity-ethereum/pull/10082)) +- Fill transaction hash on ethGetLog of light client. ([#9938](https://github.com/paritytech/parity-ethereum/pull/9938)) +- Update changelog update for 2.2.5-beta and 2.1.10-stable ([#10064](https://github.com/paritytech/parity-ethereum/pull/10064)) +- Implement len caching for parking_lot RwLock ([#10032](https://github.com/paritytech/parity-ethereum/pull/10032)) +- Update parking_lot to 0.7 ([#10050](https://github.com/paritytech/parity-ethereum/pull/10050)) +- Bump crossbeam. ([#10048](https://github.com/paritytech/parity-ethereum/pull/10048)) +- Ethcore: enable constantinople on ethereum ([#10031](https://github.com/paritytech/parity-ethereum/pull/10031)) +- Strict empty steps validation ([#10041](https://github.com/paritytech/parity-ethereum/pull/10041)) +- Center the Subtitle, use some CAPS ([#10034](https://github.com/paritytech/parity-ethereum/pull/10034)) +- Change test miner max memory to malloc reports. ([#10024](https://github.com/paritytech/parity-ethereum/pull/10024)) +- Sort the storage for private state ([#10018](https://github.com/paritytech/parity-ethereum/pull/10018)) +- Fix: test corpus_inaccessible panic ([#10019](https://github.com/paritytech/parity-ethereum/pull/10019)) +- Ci: move future releases to ethereum subdir on s3 ([#10017](https://github.com/paritytech/parity-ethereum/pull/10017)) +- Light(on_demand): decrease default time window to 10 secs ([#10016](https://github.com/paritytech/parity-ethereum/pull/10016)) +- Light client : failsafe crate (circuit breaker) ([#9790](https://github.com/paritytech/parity-ethereum/pull/9790)) +- Lencachingmutex ([#9988](https://github.com/paritytech/parity-ethereum/pull/9988)) +- Version and notification for private contract wrapper added ([#9761](https://github.com/paritytech/parity-ethereum/pull/9761)) +- Handle failing case for update account cache in require ([#9989](https://github.com/paritytech/parity-ethereum/pull/9989)) +- Add tokio runtime to ethcore io worker ([#9979](https://github.com/paritytech/parity-ethereum/pull/9979)) +- Move daemonize before creating account provider ([#10003](https://github.com/paritytech/parity-ethereum/pull/10003)) +- Docs: update changelogs ([#9990](https://github.com/paritytech/parity-ethereum/pull/9990)) +- Fix daemonize ([#10000](https://github.com/paritytech/parity-ethereum/pull/10000)) +- Fix Bloom migration ([#9992](https://github.com/paritytech/parity-ethereum/pull/9992)) +- Remove tendermint engine support ([#9980](https://github.com/paritytech/parity-ethereum/pull/9980)) +- Calculate gas for deployment transaction ([#9840](https://github.com/paritytech/parity-ethereum/pull/9840)) +- Fix unstable peers and slowness in sync ([#9967](https://github.com/paritytech/parity-ethereum/pull/9967)) +- Adds parity_verifySignature RPC method ([#9507](https://github.com/paritytech/parity-ethereum/pull/9507)) +- Improve block and transaction propagation ([#9954](https://github.com/paritytech/parity-ethereum/pull/9954)) +- Deny unknown fields for chainspec ([#9972](https://github.com/paritytech/parity-ethereum/pull/9972)) +- Fix docker build ([#9971](https://github.com/paritytech/parity-ethereum/pull/9971)) +- Ci: rearrange pipeline by logic ([#9970](https://github.com/paritytech/parity-ethereum/pull/9970)) +- Add changelogs for 2.0.9, 2.1.4, 2.1.6, and 2.2.1 ([#9963](https://github.com/paritytech/parity-ethereum/pull/9963)) +- Add Error message when sync is still in progress. ([#9475](https://github.com/paritytech/parity-ethereum/pull/9475)) +- Make CALLCODE to trace value to be the code address ([#9881](https://github.com/paritytech/parity-ethereum/pull/9881)) +- Fix light client informant while syncing ([#9932](https://github.com/paritytech/parity-ethereum/pull/9932)) +- Add a optional json dump state to evm-bin ([#9706](https://github.com/paritytech/parity-ethereum/pull/9706)) +- Disable EIP-98 transition by default ([#9955](https://github.com/paritytech/parity-ethereum/pull/9955)) +- Remove secret_store runtimes. ([#9888](https://github.com/paritytech/parity-ethereum/pull/9888)) +- Fix a deadlock ([#9952](https://github.com/paritytech/parity-ethereum/pull/9952)) +- Chore(eip712): remove unused `failure-derive` ([#9958](https://github.com/paritytech/parity-ethereum/pull/9958)) +- Do not use the home directory as the working dir in docker ([#9834](https://github.com/paritytech/parity-ethereum/pull/9834)) +- Prevent silent errors in daemon mode, closes [#9367](https://github.com/paritytech/parity-ethereum/issues/9367) ([#9946](https://github.com/paritytech/parity-ethereum/pull/9946)) +- Fix empty steps ([#9939](https://github.com/paritytech/parity-ethereum/pull/9939)) +- Adjust requests costs for light client ([#9925](https://github.com/paritytech/parity-ethereum/pull/9925)) +- Eip-1186: add `eth_getProof` RPC-Method ([#9001](https://github.com/paritytech/parity-ethereum/pull/9001)) +- Missing blocks in filter_changes RPC ([#9947](https://github.com/paritytech/parity-ethereum/pull/9947)) +- Allow rust-nightly builds fail in nightly builds ([#9944](https://github.com/paritytech/parity-ethereum/pull/9944)) +- Update eth-secp256k1 to include fix for BSDs ([#9935](https://github.com/paritytech/parity-ethereum/pull/9935)) +- Unbreak build on rust -stable ([#9934](https://github.com/paritytech/parity-ethereum/pull/9934)) +- Keep existing blocks when restoring a Snapshot ([#8643](https://github.com/paritytech/parity-ethereum/pull/8643)) +- Add experimental RPCs flag ([#9928](https://github.com/paritytech/parity-ethereum/pull/9928)) +- Clarify poll lifetime ([#9922](https://github.com/paritytech/parity-ethereum/pull/9922)) +- Docs(require rust 1.30) ([#9923](https://github.com/paritytech/parity-ethereum/pull/9923)) +- Use block header for building finality ([#9914](https://github.com/paritytech/parity-ethereum/pull/9914)) +- Simplify cargo audit ([#9918](https://github.com/paritytech/parity-ethereum/pull/9918)) +- Light-fetch: Differentiate between out-of-gas/manual throw and use required gas from response on failure ([#9824](https://github.com/paritytech/parity-ethereum/pull/9824)) +- Eip 191 ([#9701](https://github.com/paritytech/parity-ethereum/pull/9701)) +- Fix(logger): `reqwest` no longer a dependency ([#9908](https://github.com/paritytech/parity-ethereum/pull/9908)) +- Remove rust-toolchain file ([#9906](https://github.com/paritytech/parity-ethereum/pull/9906)) +- Foundation: 6692865, ropsten: 4417537, kovan: 9363457 ([#9907](https://github.com/paritytech/parity-ethereum/pull/9907)) +- Ethcore: use Machine::verify_transaction on parent block ([#9900](https://github.com/paritytech/parity-ethereum/pull/9900)) +- Chore(rpc-tests): remove unused rand ([#9896](https://github.com/paritytech/parity-ethereum/pull/9896)) +- Fix: Intermittent failing CI due to addr in use ([#9885](https://github.com/paritytech/parity-ethereum/pull/9885)) +- Chore(bump docopt): 0.8 -> 1.0 ([#9889](https://github.com/paritytech/parity-ethereum/pull/9889)) +- Use expect ([#9883](https://github.com/paritytech/parity-ethereum/pull/9883)) +- Use Weak reference in PubSubClient ([#9886](https://github.com/paritytech/parity-ethereum/pull/9886)) +- Ci: nuke the gitlab caches ([#9855](https://github.com/paritytech/parity-ethereum/pull/9855)) +- Remove unused code ([#9884](https://github.com/paritytech/parity-ethereum/pull/9884)) +- Fix json tracer overflow ([#9873](https://github.com/paritytech/parity-ethereum/pull/9873)) +- Allow to seal work on latest block ([#9876](https://github.com/paritytech/parity-ethereum/pull/9876)) +- Fix docker script ([#9854](https://github.com/paritytech/parity-ethereum/pull/9854)) +- Health endpoint ([#9847](https://github.com/paritytech/parity-ethereum/pull/9847)) +- Gitlab-ci: make android release build succeed ([#9743](https://github.com/paritytech/parity-ethereum/pull/9743)) +- Clean up existing benchmarks ([#9839](https://github.com/paritytech/parity-ethereum/pull/9839)) +- Update Callisto block reward code to support HF1 ([#9811](https://github.com/paritytech/parity-ethereum/pull/9811)) +- Option to disable keep alive for JSON-RPC http transport ([#9848](https://github.com/paritytech/parity-ethereum/pull/9848)) +- Classic.json Bootnode Update ([#9828](https://github.com/paritytech/parity-ethereum/pull/9828)) +- Support MIX. ([#9767](https://github.com/paritytech/parity-ethereum/pull/9767)) +- Ci: remove failing tests for android, windows, and macos ([#9788](https://github.com/paritytech/parity-ethereum/pull/9788)) +- Implement NoProof for json tests and update tests reference (replaces [#9744](https://github.com/paritytech/parity-ethereum/issues/9744)) ([#9814](https://github.com/paritytech/parity-ethereum/pull/9814)) +- Chore(bump regex) ([#9842](https://github.com/paritytech/parity-ethereum/pull/9842)) +- Ignore global cache for patched accounts ([#9752](https://github.com/paritytech/parity-ethereum/pull/9752)) +- Move state root verification before gas used ([#9841](https://github.com/paritytech/parity-ethereum/pull/9841)) +- Fix(docker-aarch64) : cross-compile config ([#9798](https://github.com/paritytech/parity-ethereum/pull/9798)) +- Version: bump nightly to 2.3.0 ([#9819](https://github.com/paritytech/parity-ethereum/pull/9819)) +- Tests modification for windows CI ([#9671](https://github.com/paritytech/parity-ethereum/pull/9671)) +- Eip-712 implementation ([#9631](https://github.com/paritytech/parity-ethereum/pull/9631)) +- Fix typo ([#9826](https://github.com/paritytech/parity-ethereum/pull/9826)) +- Clean up serde rename and use rename_all = camelCase when possible ([#9823](https://github.com/paritytech/parity-ethereum/pull/9823)) ## Previous releases -- [CHANGELOG-2.1](docs/CHANGELOG-2.1.md) (_stable_) +- [CHANGELOG-2.2](docs/CHANGELOG-2.2.md) (_stable_) +- [CHANGELOG-2.1](docs/CHANGELOG-2.1.md) (EOL: 2019-01-16) - [CHANGELOG-2.0](docs/CHANGELOG-2.0.md) (EOL: 2018-11-15) - [CHANGELOG-1.11](docs/CHANGELOG-1.11.md) (EOL: 2018-09-19) - [CHANGELOG-1.10](docs/CHANGELOG-1.10.md) (EOL: 2018-07-18) diff --git a/Cargo.lock b/Cargo.lock index 97e0119b5c0..71061696dee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. [[package]] name = "aho-corasick" version = "0.6.8" @@ -58,7 +60,7 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -70,7 +72,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -80,8 +82,8 @@ name = "backtrace-sys" version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -98,6 +100,14 @@ dependencies = [ "safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "base64" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "bincode" version = "0.8.0" @@ -192,7 +202,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.25" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -247,6 +257,17 @@ dependencies = [ "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "cli-signer" +version = "1.4.0" +dependencies = [ + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-rpc 1.12.0", + "parity-rpc-client 1.4.0", + "rpassword 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cloudabi" version = "0.0.3" @@ -260,7 +281,7 @@ name = "cmake" version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -279,14 +300,17 @@ dependencies = [ name = "common-types" version = "0.1.0" dependencies = [ - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethjson 0.1.0", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ethkey 0.3.0", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-machine 0.1.0", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "rlp_derive 0.1.0", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unexpected 0.1.0", ] [[package]] @@ -392,7 +416,7 @@ dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -406,7 +430,7 @@ dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -419,7 +443,7 @@ dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -474,10 +498,10 @@ dependencies = [ [[package]] name = "ct-logs" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "sct 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -486,18 +510,10 @@ version = "1.1.1" source = "git+https://github.com/paritytech/rust-ctrlc.git#b523017108bb2d571a7a69bd97bc406e63bc7a9d" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "daemonize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "difference" version = "1.0.0" @@ -516,7 +532,7 @@ name = "dir" version = "0.1.2" dependencies = [ "app_dirs 1.2.1 (git+https://github.com/paritytech/app-dirs-rs)", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "home 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "journaldb 0.2.0", ] @@ -526,7 +542,7 @@ name = "docopt" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", @@ -539,16 +555,16 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "eip712" +name = "eip-712" version = "0.1.0" dependencies = [ "ethabi 6.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lunarity-lexer 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -570,16 +586,15 @@ name = "elastic-array" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", ] [[package]] -name = "env_logger" -version = "0.4.3" +name = "enum_primitive" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -608,7 +623,7 @@ version = "0.5.7" source = "git+https://github.com/paritytech/rust-secp256k1#ccc06e7480148b723eb44ac56cf4d20eec380b6f" dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -619,7 +634,7 @@ version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", @@ -641,7 +656,7 @@ dependencies = [ "heck 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -651,12 +666,14 @@ dependencies = [ "criterion 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "primal 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -666,7 +683,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "fixed-hash 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -683,27 +700,27 @@ dependencies = [ "common-types 0.1.0", "criterion 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethabi 6.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethabi-contract 6.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethabi-derive 6.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethash 1.12.0", + "ethcore-accounts 0.1.0", + "ethcore-blockchain 0.1.0", "ethcore-bloom-journal 0.1.0", + "ethcore-call-contract 0.1.0", + "ethcore-db 0.1.0", "ethcore-io 1.12.0", - "ethcore-logger 1.12.0", "ethcore-miner 1.12.0", "ethcore-stratum 1.12.0", - "ethcore-transaction 0.1.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethjson 0.1.0", "ethkey 0.3.0", - "ethstore 0.2.0", "evm 0.1.0", - "fake-hardware-wallet 0.0.1", - "hardware-wallet 1.12.0", - "hashdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "fetch 0.1.0", + "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", "itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", "journaldb 0.2.0", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -711,21 +728,21 @@ dependencies = [ "kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-memorydb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-rocksdb 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "len-caching-lock 0.1.1", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "macros 0.1.0", "memory-cache 0.1.0", - "memorydb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-crypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-crypto 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-machine 0.1.0", + "parity-runtime 0.1.0", "parity-snappy 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "patricia-trie 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "patricia-trie-ethereum 0.1.0", "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -736,9 +753,9 @@ dependencies = [ "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "stats 0.1.0", - "stop-guard 0.1.0", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "trace-time 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "trie-standardmap 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "triehash-ethereum 0.2.0", "unexpected 0.1.0", @@ -747,6 +764,51 @@ dependencies = [ "wasm 0.1.0", ] +[[package]] +name = "ethcore-accounts" +version = "0.1.0" +dependencies = [ + "common-types 0.1.0", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ethkey 0.3.0", + "ethstore 0.2.1", + "fake-hardware-wallet 0.0.1", + "hardware-wallet 1.12.0", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", + "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ethcore-blockchain" +version = "0.1.0" +dependencies = [ + "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", + "blooms-db 0.1.0", + "common-types 0.1.0", + "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", + "ethcore-db 0.1.0", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ethkey 0.3.0", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", + "itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb-memorydb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rlp_compress 0.1.0", + "rlp_derive 0.1.0", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ethcore-bloom-journal" version = "0.1.0" @@ -755,8 +817,26 @@ dependencies = [ ] [[package]] -name = "ethcore-devtools" -version = "1.12.0" +name = "ethcore-call-contract" +version = "0.1.0" +dependencies = [ + "common-types 0.1.0", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ethcore-db" +version = "0.1.0" +dependencies = [ + "common-types 0.1.0", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", + "kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rlp_derive 0.1.0", +] [[package]] name = "ethcore-io" @@ -780,28 +860,30 @@ name = "ethcore-light" version = "1.12.0" dependencies = [ "bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "common-types 0.1.0", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore 1.12.0", + "ethcore-blockchain 0.1.0", + "ethcore-db 0.1.0", "ethcore-io 1.12.0", "ethcore-network 1.12.0", - "ethcore-transaction 0.1.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "failsafe 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "fastmap 0.1.0", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", "itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", + "journaldb 0.2.0", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", "kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-memorydb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "memory-cache 0.1.0", - "memorydb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "patricia-trie 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "patricia-trie-ethereum 0.1.0", "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -811,6 +893,7 @@ dependencies = [ "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "stats 0.1.0", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "triehash-ethereum 0.2.0", "vm 0.1.0", ] @@ -823,7 +906,7 @@ dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -835,16 +918,20 @@ name = "ethcore-miner" version = "1.12.0" dependencies = [ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", + "common-types 0.1.0", "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethabi 6.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethabi-contract 6.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethabi-derive 6.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethash 1.12.0", - "ethcore-transaction 0.1.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethcore-call-contract 0.1.0", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.3.0", "fetch 0.1.0", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.11 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", + "hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -865,13 +952,17 @@ dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-io 1.12.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.3.0", "ipnetwork 0.12.8 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-crypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-crypto 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-snappy 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -881,20 +972,21 @@ dependencies = [ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-io 1.12.0", - "ethcore-logger 1.12.0", "ethcore-network 1.12.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.3.0", "igd 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "ipnetwork 0.12.8 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-crypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-crypto 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-path 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-snappy 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -914,27 +1006,27 @@ dependencies = [ name = "ethcore-private-tx" version = "1.0.0" dependencies = [ + "common-types 0.1.0", + "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethabi 6.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethabi-contract 6.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethabi-derive 6.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore 1.12.0", + "ethcore-call-contract 0.1.0", "ethcore-io 1.12.0", - "ethcore-logger 1.12.0", "ethcore-miner 1.12.0", - "ethcore-transaction 0.1.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethjson 0.1.0", "ethkey 0.3.0", "fetch 0.1.0", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-crypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-crypto 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "patricia-trie 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "patricia-trie-ethereum 0.1.0", "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -945,6 +1037,7 @@ dependencies = [ "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "transaction-pool 1.13.3 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -953,24 +1046,26 @@ name = "ethcore-secretstore" version = "1.0.0" dependencies = [ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "common-types 0.1.0", + "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", "ethabi 6.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethabi-contract 6.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethabi-derive 6.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore 1.12.0", - "ethcore-logger 1.12.0", + "ethcore-accounts 0.1.0", + "ethcore-call-contract 0.1.0", "ethcore-sync 1.12.0", - "ethcore-transaction 0.1.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.3.0", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.11 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-rocksdb 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-crypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-crypto 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-runtime 0.1.0", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -992,14 +1087,15 @@ dependencies = [ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore 1.12.0", + "ethcore-blockchain 0.1.0", + "ethcore-db 0.1.0", "ethcore-io 1.12.0", "ethcore-private-tx 1.0.0", "ethcore-sync 1.12.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-rocksdb 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "stop-guard 0.1.0", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "trace-time 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1009,11 +1105,9 @@ name = "ethcore-stratum" version = "1.12.0" dependencies = [ "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-logger 1.12.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-macros 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-tcp-server 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-tcp-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1026,6 +1120,7 @@ name = "ethcore-sync" version = "1.12.0" dependencies = [ "common-types 0.1.0", + "enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore 1.12.0", "ethcore-io 1.12.0", @@ -1033,12 +1128,12 @@ dependencies = [ "ethcore-network 1.12.0", "ethcore-network-devp2p 1.12.0", "ethcore-private-tx 1.0.0", - "ethcore-transaction 0.1.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.3.0", + "ethstore 0.2.1", "fastmap 0.1.0", - "hashdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", "kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1054,29 +1149,14 @@ dependencies = [ "triehash-ethereum 0.2.0", ] -[[package]] -name = "ethcore-transaction" -version = "0.1.0" -dependencies = [ - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethjson 0.1.0", - "ethkey 0.3.0", - "evm 0.1.0", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unexpected 0.1.0", -] - [[package]] name = "ethereum-types" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "fixed-hash 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1084,7 +1164,7 @@ dependencies = [ [[package]] name = "ethereum-types-serialize" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1094,7 +1174,7 @@ dependencies = [ name = "ethjson" version = "0.1.0" dependencies = [ - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1108,11 +1188,11 @@ dependencies = [ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "edit-distance 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "mem 0.1.0", - "parity-crypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memzero 0.1.0", + "parity-crypto 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wordlist 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1139,16 +1219,17 @@ dependencies = [ [[package]] name = "ethstore" -version = "0.2.0" +version = "0.2.1" dependencies = [ "dir 0.1.2", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.3.0", "itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-crypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-crypto 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wordlist 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1164,11 +1245,12 @@ dependencies = [ [[package]] name = "ethstore-cli" -version = "0.1.0" +version = "0.1.1" dependencies = [ "dir 0.1.2", "docopt 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ethstore 0.2.0", + "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", + "ethstore 0.2.1", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "panic_hook 0.1.0", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1184,10 +1266,10 @@ version = "0.1.0" dependencies = [ "bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "criterion 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "memory-cache 0.1.0", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1200,11 +1282,11 @@ dependencies = [ name = "evmbin" version = "0.1.0" dependencies = [ + "common-types 0.1.0", "docopt 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore 1.12.0", - "ethcore-transaction 0.1.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethjson 0.1.0", "evm 0.1.0", "panic_hook 0.1.0", @@ -1244,7 +1326,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1254,14 +1336,14 @@ version = "0.0.1" dependencies = [ "fetch 0.1.0", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.11 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "fake-hardware-wallet" version = "0.0.1" dependencies = [ - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.3.0", ] @@ -1274,7 +1356,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "fastmap" version = "0.1.0" dependencies = [ - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "plain_hasher 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1283,7 +1365,7 @@ name = "fdlimit" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1292,9 +1374,9 @@ version = "0.1.0" dependencies = [ "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.11 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper-rustls 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper-rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1305,8 +1387,8 @@ name = "fixed-hash" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1326,12 +1408,17 @@ name = "fs-swap" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fs_extra" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "fuchsia-zircon" version = "0.3.3" @@ -1410,7 +1497,7 @@ dependencies = [ "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1428,7 +1515,7 @@ name = "handlebars" version = "0.32.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "pest_derive 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1442,7 +1529,7 @@ dependencies = [ name = "hardware-wallet" version = "1.12.0" dependencies = [ - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.3.0", "hidapi 0.3.1 (git+https://github.com/paritytech/hidapi-rs)", "libusb 0.3.0 (git+https://github.com/paritytech/libusb-rs)", @@ -1455,15 +1542,16 @@ dependencies = [ ] [[package]] -name = "hashdb" -version = "0.3.0" +name = "hash-db" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "heapsize" version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" +source = "git+https://github.com/cheme/heapsize.git?branch=ec-macfix#421df390a930cb523a09e5528e6fe57b534b3b26" dependencies = [ + "jemallocator 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1485,8 +1573,8 @@ name = "hidapi" version = "0.3.1" source = "git+https://github.com/paritytech/hidapi-rs#d4d323767d6f27cf5a3d73fbae0b0f2134d579bf" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1500,7 +1588,7 @@ dependencies = [ [[package]] name = "http" -version = "0.1.13" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1548,14 +1636,14 @@ dependencies = [ [[package]] name = "hyper" -version = "0.12.11" +version = "0.12.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "h2 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1567,26 +1655,27 @@ dependencies = [ "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hyper-rustls" -version = "0.14.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ct-logs 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "ct-logs 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.11 (registry+https://github.com/rust-lang/crates.io-index)", - "rustls 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-rustls 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki-roots 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1640,7 +1729,7 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1678,9 +1767,28 @@ name = "itoa" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "jemalloc-sys" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", + "fs_extra 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "jemallocator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "jemalloc-sys 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "jni" -version = "0.10.2" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cesu8 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1700,17 +1808,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "journaldb" version = "0.2.0" dependencies = [ - "ethcore-logger 1.12.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "fastmap 0.1.0", - "hashdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", "kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-memorydb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "memorydb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1718,8 +1826,8 @@ dependencies = [ [[package]] name = "jsonrpc-core" -version = "9.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2#f8a54f46f7f1d68b4e7899ca1e929803bf966a5b" +version = "10.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1728,14 +1836,24 @@ dependencies = [ "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "jsonrpc-derive" +version = "10.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "jsonrpc-http-server" -version = "9.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2#f8a54f46f7f1d68b4e7899ca1e929803bf966a5b" +version = "10.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hyper 0.12.11 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-server-utils 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", + "hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-server-utils 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1743,46 +1861,37 @@ dependencies = [ [[package]] name = "jsonrpc-ipc-server" -version = "9.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2#f8a54f46f7f1d68b4e7899ca1e929803bf966a5b" +version = "10.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-server-utils 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", + "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-server-utils 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-tokio-ipc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "jsonrpc-macros" -version = "9.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2#f8a54f46f7f1d68b4e7899ca1e929803bf966a5b" -dependencies = [ - "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-pubsub 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "jsonrpc-pubsub" -version = "9.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2#f8a54f46f7f1d68b4e7899ca1e929803bf966a5b" +version = "10.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", + "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-server-utils" -version = "9.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2#f8a54f46f7f1d68b4e7899ca1e929803bf966a5b" +version = "10.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "globset 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1792,28 +1901,28 @@ dependencies = [ [[package]] name = "jsonrpc-tcp-server" -version = "9.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2#f8a54f46f7f1d68b4e7899ca1e929803bf966a5b" +version = "10.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-server-utils 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", + "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-server-utils 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-ws-server" -version = "9.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2#f8a54f46f7f1d68b4e7899ca1e929803bf966a5b" +version = "10.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-server-utils 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", + "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-server-utils 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-ws 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.7.5 (git+https://github.com/tomusdrw/ws-rs)", ] [[package]] @@ -1821,7 +1930,7 @@ name = "keccak-hash" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1829,8 +1938,8 @@ dependencies = [ name = "keccak-hasher" version = "0.1.1" dependencies = [ - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "plain_hasher 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1885,11 +1994,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "lazy_static" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "lazycell" @@ -1905,7 +2011,7 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.43" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1913,7 +2019,7 @@ name = "libloading" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1923,7 +2029,7 @@ version = "0.3.0" source = "git+https://github.com/paritytech/libusb-rs#442708954a720bc89a9cf41e7be021a778bdbc27" dependencies = [ "bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "libusb-sys 0.2.4 (git+https://github.com/paritytech/libusb-sys)", ] @@ -1932,8 +2038,8 @@ name = "libusb-sys" version = "0.2.4" source = "git+https://github.com/paritytech/libusb-sys#1d33d9840a82adaf4d6a1a0f5141f022e5676802" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2006,17 +2112,13 @@ name = "matches" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "mem" -version = "0.1.0" - [[package]] name = "memchr" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2025,7 +2127,7 @@ name = "memmap" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2038,25 +2140,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "memory-cache" version = "0.1.0" dependencies = [ - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", "lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "memory_units" -version = "0.3.0" +name = "memory-db" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", +] [[package]] -name = "memorydb" +name = "memory_units" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "hashdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "plain_hasher 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -] + +[[package]] +name = "memzero" +version = "0.1.0" [[package]] name = "migration-rocksdb" @@ -2098,7 +2202,7 @@ dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2106,6 +2210,17 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "mio-extras" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio-named-pipes" version = "0.1.6" @@ -2123,7 +2238,7 @@ version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2176,7 +2291,7 @@ version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2191,7 +2306,7 @@ dependencies = [ "ethcore-io 1.12.0", "ethcore-network 1.12.0", "ethcore-network-devp2p 1.12.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-memorydb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2222,7 +2337,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2261,7 +2376,7 @@ name = "num_cpus" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2324,36 +2439,55 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "parity-clib" version = "1.12.0" dependencies = [ - "jni 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "jni 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "panic_hook 0.1.0", - "parity-ethereum 2.3.0", + "parity-ethereum 2.5.0", + "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-current-thread 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-crypto" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-daemonize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parity-ethereum" -version = "2.3.0" +version = "2.5.0" dependencies = [ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "blooms-db 0.1.0", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cli-signer 1.4.0", + "common-types 0.1.0", "ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)", - "daemonize 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "dir 0.1.2", "docopt 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore 1.12.0", + "ethcore-accounts 0.1.0", + "ethcore-blockchain 0.1.0", + "ethcore-call-contract 0.1.0", + "ethcore-db 0.1.0", "ethcore-io 1.12.0", "ethcore-light 1.12.0", "ethcore-logger 1.12.0", @@ -2363,35 +2497,35 @@ dependencies = [ "ethcore-secretstore 1.0.0", "ethcore-service 0.1.0", "ethcore-sync 1.12.0", - "ethcore-transaction 0.1.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.3.0", + "ethstore 0.2.1", "fake-fetch 0.0.1", "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "ipnetwork 0.12.8 (registry+https://github.com/rust-lang/crates.io-index)", "journaldb 0.2.0", - "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", + "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-rocksdb 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "mem 0.1.0", "migration-rocksdb 0.1.0", "node-filter 1.12.0", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "number_prefix 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "panic_hook 0.1.0", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-daemonize 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-hash-fetch 1.12.0", "parity-ipfs-api 1.12.0", "parity-local-store 0.1.0", "parity-path 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-rpc 1.12.0", - "parity-rpc-client 1.4.0", "parity-runtime 0.1.0", "parity-updater 1.12.0", - "parity-version 2.3.0", + "parity-version 2.5.0", "parity-whisper 0.1.0", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2399,7 +2533,6 @@ dependencies = [ "registrar 0.0.1", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "rpassword 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rpc-cli 1.4.0", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2420,7 +2553,7 @@ dependencies = [ "ethabi 6.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethabi-contract 6.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethabi-derive 6.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "fake-fetch 0.0.1", "fetch 0.1.0", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2442,9 +2575,9 @@ version = "1.12.0" dependencies = [ "cid 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore 1.12.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-http-server 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-http-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "multihash 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2455,9 +2588,8 @@ dependencies = [ name = "parity-local-store" version = "0.1.0" dependencies = [ - "ethcore 1.12.0", + "common-types 0.1.0", "ethcore-io 1.12.0", - "ethcore-transaction 0.1.0", "ethkey 0.3.0", "kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-memorydb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2472,7 +2604,7 @@ dependencies = [ name = "parity-machine" version = "0.1.0" dependencies = [ - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2485,18 +2617,18 @@ name = "parity-rocksdb" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "local-encoding 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-rocksdb-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-rocksdb-sys 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-rocksdb-sys" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cmake 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "local-encoding 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-snappy-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2507,10 +2639,11 @@ version = "1.12.0" dependencies = [ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "cid 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "eip712 0.1.0", + "common-types 0.1.0", + "eip-712 0.1.0", "ethash 1.12.0", "ethcore 1.12.0", - "ethcore-devtools 1.12.0", + "ethcore-accounts 0.1.0", "ethcore-io 1.12.0", "ethcore-light 1.12.0", "ethcore-logger 1.12.0", @@ -2518,24 +2651,21 @@ dependencies = [ "ethcore-network 1.12.0", "ethcore-private-tx 1.0.0", "ethcore-sync 1.12.0", - "ethcore-transaction 0.1.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethjson 0.1.0", "ethkey 0.3.0", - "ethstore 0.2.0", + "ethstore 0.2.1", "fake-fetch 0.0.1", - "fake-hardware-wallet 0.0.1", "fastmap 0.1.0", "fetch 0.1.0", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hardware-wallet 1.12.0", "itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-http-server 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-ipc-server 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-macros 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-pubsub 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-ws-server 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", + "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-derive 10.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-http-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-ipc-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-pubsub 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-ws-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb-memorydb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2543,12 +2673,11 @@ dependencies = [ "multihash 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "order-stat 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-crypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-crypto 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-runtime 0.1.0", "parity-updater 1.12.0", - "parity-version 2.3.0", + "parity-version 2.5.0", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "patricia-trie 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2563,6 +2692,7 @@ dependencies = [ "tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "transaction-pool 1.13.3 (registry+https://github.com/rust-lang/crates.io-index)", "transient-hashmap 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "vm 0.1.0", ] @@ -2570,9 +2700,10 @@ dependencies = [ name = "parity-rpc-client" version = "1.4.0" dependencies = [ + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-ws-server 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", + "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-ws-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2596,7 +2727,7 @@ name = "parity-snappy" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "parity-snappy-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2606,7 +2737,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cmake 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2630,20 +2761,21 @@ dependencies = [ name = "parity-updater" version = "1.12.0" dependencies = [ + "common-types 0.1.0", "ethabi 6.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethabi-contract 6.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethabi-derive 6.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore 1.12.0", "ethcore-sync 1.12.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-hash-fetch 1.12.0", "parity-path 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-version 2.3.0", + "parity-version 2.5.0", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2653,7 +2785,7 @@ dependencies = [ [[package]] name = "parity-version" -version = "2.3.0" +version = "2.5.0" dependencies = [ "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2678,16 +2810,16 @@ dependencies = [ "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-network 1.12.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.3.0", "hex 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-macros 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-pubsub 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", + "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-derive 10.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-pubsub 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "mem 0.1.0", + "memzero 0.1.0", "ordered-float 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-crypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-crypto 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2705,10 +2837,27 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-ws" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot" version = "0.6.4" @@ -2732,7 +2881,7 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2745,7 +2894,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2754,31 +2903,20 @@ dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "patricia-trie" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "patricia-trie-ethereum" version = "0.1.0" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "journaldb 0.2.0", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", - "memorydb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "patricia-trie 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2942,8 +3080,8 @@ name = "pwasm-run-test" version = "0.1.0" dependencies = [ "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-logger 1.12.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethjson 0.1.0", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2955,7 +3093,7 @@ dependencies = [ [[package]] name = "pwasm-utils" -version = "0.2.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2987,7 +3125,7 @@ version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2997,7 +3135,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3008,7 +3146,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3020,7 +3158,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3102,8 +3240,8 @@ version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3189,12 +3327,12 @@ dependencies = [ [[package]] name = "ring" -version = "0.13.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3205,7 +3343,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3215,7 +3353,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3224,7 +3362,7 @@ name = "rlp_compress" version = "0.1.0" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3235,7 +3373,7 @@ dependencies = [ "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3244,21 +3382,11 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "rprompt 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rpc-cli" -version = "1.4.0" -dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-rpc 1.12.0", - "parity-rpc-client 1.4.0", - "rpassword 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "rprompt" version = "1.0.3" @@ -3270,7 +3398,7 @@ version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3306,15 +3434,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.13.1" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sct 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3347,10 +3475,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sct" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ring 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3360,6 +3488,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3379,7 +3508,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3394,12 +3523,12 @@ dependencies = [ [[package]] name = "sha1" -version = "0.2.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sha1" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3480,7 +3609,7 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3497,10 +3626,6 @@ dependencies = [ "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "stop-guard" -version = "0.1.0" - [[package]] name = "string" version = "0.1.1" @@ -3523,7 +3648,7 @@ dependencies = [ [[package]] name = "syn" -version = "0.15.11" +version = "0.15.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3546,7 +3671,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3579,7 +3704,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3596,7 +3721,7 @@ name = "termion" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3622,7 +3747,7 @@ name = "thread-id" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3637,7 +3762,7 @@ name = "thread_local" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3653,7 +3778,7 @@ name = "time" version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3779,7 +3904,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3802,12 +3927,13 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.7.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rustls 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3887,7 +4013,7 @@ dependencies = [ "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3943,12 +4069,23 @@ dependencies = [ "protobuf 1.7.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "trie-db" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "trie-standardmap" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3956,10 +4093,10 @@ dependencies = [ [[package]] name = "triehash" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hashdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3967,9 +4104,9 @@ dependencies = [ name = "triehash-ethereum" version = "0.2.0" dependencies = [ - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.1.1", - "triehash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3999,7 +4136,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4094,7 +4231,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4108,11 +4245,11 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "if_chain 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", "validator 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4140,15 +4277,14 @@ name = "vm" version = "0.1.0" dependencies = [ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "common-types 0.1.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethjson 0.1.0", "keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "patricia-trie 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "patricia-trie-ethereum 0.1.0", "rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4191,12 +4327,12 @@ name = "wasm" version = "0.1.0" dependencies = [ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-logger 1.12.0", - "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", - "pwasm-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "pwasm-utils 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "vm 0.1.0", "wasmi 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4214,20 +4350,20 @@ dependencies = [ [[package]] name = "webpki" -version = "0.18.1" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ring 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "webpki-roots" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "webpki 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4235,12 +4371,12 @@ name = "whisper-cli" version = "0.1.0" dependencies = [ "docopt 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-logger 1.12.0", + "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-network 1.12.0", "ethcore-network-devp2p 1.12.0", - "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-http-server 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", - "jsonrpc-pubsub 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)", + "jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-http-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-pubsub 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "panic_hook 0.1.0", "parity-whisper 0.1.0", @@ -4294,22 +4430,6 @@ dependencies = [ "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ws" -version = "0.7.5" -source = "git+https://github.com/tomusdrw/ws-rs#f12d19c4c19422fc79af28a3181f598bc07ecd1e" -dependencies = [ - "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -4353,6 +4473,7 @@ dependencies = [ "checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a" "checksum backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c66d56ac8dabd07f6aacdaf633f4b8262f5b3601a810a0dcddffd5c22c69daa0" "checksum base-x 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5cda5d0f5584d129112ad8bf4775b9fd2b9f1e30738c7b1a25314ba2244d6a51" +"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" "checksum bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e103c8b299b28a9c6990458b7013dc4a8356a9b854c51b9883241f5866fac36e" "checksum bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9bf6104718e80d7b26a68fdbacff3481cfc05df670821affc7e9cbc1884400c" @@ -4366,7 +4487,7 @@ dependencies = [ "checksum byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "90492c5858dd7d2e78691cfb89f90d273a2800fc11d98f60786e5d87e2f83781" "checksum bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0ce55bd354b095246fc34caf4e9e242f5297a7fd938b090cadfea6eee614aa62" "checksum cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "926013f2860c46252efceabb19f4a6b308197505082c609025aa6706c011d427" -"checksum cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "f159dfd43363c4d08055a07703eb7a3406b0dac4d0584d96965a3262db3c9d16" +"checksum cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a8b715cb4597106ea87c7c84b2f1d452c7492033765df7f32651e66fcf749" "checksum cesu8 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" "checksum cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4e7bb64a8ebb0d856483e1e682ea3422f883c5f5615a90d51a2c82fe87fdd3" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" @@ -4393,16 +4514,15 @@ dependencies = [ "checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" "checksum csv 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d54f6b0fd69128a2894b1a3e57af5849a0963c1cc77b165d30b896e40296452" "checksum csv-core 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4dd8e6d86f7ba48b4276ef1317edc8cc36167546d8972feb4a2b5fec0b374105" -"checksum ct-logs 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "95a4bf5107667e12bf6ce31a3a5066d67acc88942b6742117a41198734aaccaa" +"checksum ct-logs 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1b4660f8b07a560a88c02d76286edb9f0d5d64e495d2b0f233186155aa51be1f" "checksum ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)" = "" -"checksum daemonize 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4093d27eb267d617f03c2ee25d4c3ca525b89a76154001954a11984508ffbde5" "checksum difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3304d19798a8e067e48d8e69b2c37f0b5e9b4e462504ad9e27e9f3fce02bba8" "checksum digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "03b072242a8cbaf9c145665af9d250c59af3b958f83ed6824e13533cf76d5b90" "checksum docopt 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "db2906c2579b5b7207fc1e328796a9a8835dc44e22dbe8e460b1d636f9a7b225" "checksum edit-distance 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3bd26878c3d921f89797a4e1a1711919f999a9f6946bb6f5a4ffda126d297b7e" "checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0" "checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" -"checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b" +"checksum enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180" "checksum env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)" = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38" "checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" "checksum eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)" = "" @@ -4410,8 +4530,8 @@ dependencies = [ "checksum ethabi-contract 6.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "795e25fd868e12a59ca235dbe1f6cc8f1eba8f67d6a39438b29535e0126e0c27" "checksum ethabi-derive 6.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "66a587250c8190be9d6ae28d67b8957ed97cb9eee2e272173a20593ab054a075" "checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386" -"checksum ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "35b3c5a18bc5e73a32a110ac743ec04b02bbbcd3b71d3118d40a6113d509378a" -"checksum ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ac59a21a9ce98e188f3dace9eb67a6c4a3c67ec7fbc7218cb827852679dc002" +"checksum ethereum-types 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e742184dc63a01c8ea0637369f8faa27c40f537949908a237f95c05e68d2c96" +"checksum ethereum-types-serialize 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1873d77b32bc1891a79dad925f2acbc318ee942b38b9110f9dbc5fbeffcea350" "checksum failsafe 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad3bf1642583ea2f1fa38a1e8546613a7488816941b33e5f0fccceac61879118" "checksum failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6dd377bcc1b1b7ce911967e3ec24fa19c3224394ec05b54aa7b083d498341ac7" "checksum failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "64c2d913fe8ed3b6c6518eedf4538255b989945c14c2a7d5cbff62a5e2120596" @@ -4421,6 +4541,7 @@ dependencies = [ "checksum fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum fs-swap 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "921d332c89b3b61a826de38c61ee5b6e02c56806cade1b0e5d81bd71f57a71bb" +"checksum fs_extra 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5f2a4a2034423744d2cc7ca2068453168dcdb82c438419e639a26bd87839c674" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" @@ -4433,18 +4554,18 @@ dependencies = [ "checksum h2 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "a27e7ed946e8335bdf9a191bc1b9b14a03ba822d013d2f58437f4fabcbd7fc2c" "checksum hamming 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65043da274378d68241eb9a8f8f8aa54e349136f7b8e12f63e3ef44043cc30e1" "checksum handlebars 0.32.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d89ec99d1594f285d4590fc32bac5f75cdab383f1123d504d27862c644a807dd" -"checksum hashdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d91261ee336dd046ac7df28306cb297b7a7228bd1ae25e9a57f4ed5e0ab628c7" -"checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" +"checksum hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b03501f6e1a2a97f1618879aba3156f14ca2847faa530c4e28859638bd11483" +"checksum heapsize 0.4.2 (git+https://github.com/cheme/heapsize.git?branch=ec-macfix)" = "" "checksum heck 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea04fa3ead4e05e51a7c806fc07271fdbde4e246a6c6d1efd52e72230b771b82" "checksum hex 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d6a22814455d41612f41161581c2883c0c6a1c41852729b17d5ed88f01e153aa" "checksum hidapi 0.3.1 (git+https://github.com/paritytech/hidapi-rs)" = "" "checksum home 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "80dff82fb58cfbbc617fb9a9184b010be0529201553cda50ad04372bc2333aff" -"checksum http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "24f58e8c2d8e886055c3ead7b28793e1455270b5fb39650984c224bc538ba581" +"checksum http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "1a10e5b573b9a0146545010f50772b9e8b1dd0a256564cc4307694c68832a2f5" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" "checksum humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0484fda3e7007f2a4a0d9c3a703ca38c71c54c55602ce4660c419fd32e188c9e" "checksum hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)" = "34a590ca09d341e94cddf8e5af0bbccde205d5fbc2fa3c09dd67c7f85cea59d7" -"checksum hyper 0.12.11 (registry+https://github.com/rust-lang/crates.io-index)" = "78d50abbd1790e0f4c74cb1d4a2211b439bac661d54107ad5564c55e77906762" -"checksum hyper-rustls 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "68f2aa6b1681795bf4da8063f718cd23145aa0c9a5143d9787b345aa60d38ee4" +"checksum hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)" = "f1ebec079129e43af5e234ef36ee3d7e6085687d145b7ea653b262d16c6b65f1" +"checksum hyper-rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff2c61fbda2bc72e793e329190a3e8f0ae74cb896905c8b301304c4c93f2755" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum if_chain 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4bac95d9aa0624e7b78187d6fb8ab012b41d9f6f54b1bcb61e61c4845f8357ec" "checksum igd 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a254e265e8810deb357a9de757f784787ec415d056ededf410c0aa460afee9e" @@ -4457,25 +4578,27 @@ dependencies = [ "checksum itertools 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)" = "f58856976b776fedd95533137617a02fb25719f40e7d9b01c7043cd65474f450" "checksum itertools-num 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "83ca7b70b838f2e34bc6c2f367a1ed1cfe34fb82464adecadd31cdcc7da882fc" "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" -"checksum jni 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ecfa3b81afc64d9a6539c4eece96ac9a93c551c713a313800dade8e33d7b5c1" +"checksum jemalloc-sys 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "bfc62c8e50e381768ce8ee0428ee53741929f7ebd73e4d83f669bcf7693e00ae" +"checksum jemallocator 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9f0cd42ac65f758063fea55126b0148b1ce0a6354ff78e07a4d6806bc65c4ab3" +"checksum jni 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "294eca097d1dc0bf59de5ab9f7eafa5f77129e9f6464c957ed3ddeb705fb4292" "checksum jni-sys 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" -"checksum jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)" = "" -"checksum jsonrpc-http-server 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)" = "" -"checksum jsonrpc-ipc-server 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)" = "" -"checksum jsonrpc-macros 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)" = "" -"checksum jsonrpc-pubsub 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)" = "" -"checksum jsonrpc-server-utils 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)" = "" -"checksum jsonrpc-tcp-server 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)" = "" -"checksum jsonrpc-ws-server 9.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-2.2)" = "" +"checksum jsonrpc-core 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a5152c3fda235dfd68341b3edf4121bc4428642c93acbd6de88c26bf95fc5d7" +"checksum jsonrpc-derive 10.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c14be84e86c75935be83a34c6765bf31f97ed6c9163bb0b83007190e9703940a" +"checksum jsonrpc-http-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "99e1ce36c7cc9dcab398024d76849ab2cb917ee812653bce6f74fc9eb7c82d16" +"checksum jsonrpc-ipc-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fac6b8682243740a32bfb288880c71cc06eca29616cdf551e4136a190b11b96d" +"checksum jsonrpc-pubsub 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "56608ed54b1b2a69f4357cb8bdfbcbd99fe1179383c03a09bb428931bd35f592" +"checksum jsonrpc-server-utils 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5521613b31ea22d36d9f95ad642058dccec846a94ed8690957652d479f620707" +"checksum jsonrpc-tcp-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c873dac37a601fb88d40ba49eeac3f1aa60953c06b2e99ddbf0569b6f8028478" +"checksum jsonrpc-ws-server 10.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20b8333a5a6e6ccbcf5c90f90919de557cba4929efa164e9bd0e8e497eb20e46" "checksum keccak-hash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "253bbe643c32c816bf58fa5a88248fafedeebb139705ad17a62add3517854a86" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "72ae89206cea31c32014b39d5a454b96135894221610dbfd19cf4d2d044fa546" "checksum kvdb-memorydb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "45bcdf5eb083602cff61a6f8438dce2a7900d714e893fc48781c39fb119d37aa" "checksum kvdb-rocksdb 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "06cf755dc587839ba34d3cbe3f12b6ad55850fbcdfe67336157a021a1a5c43ae" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" -"checksum lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca488b89a5657b0a2ecd45b95609b3e848cf1755da332a0da46e2b2b1cb371a7" +"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" "checksum lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddba4c30a78328befecec92fc94970e53b3ae385827d28620f0f5bb2493081e0" -"checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" +"checksum libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "e962c7641008ac010fa60a7dfdc1712449f29c44ef2d4702394aea943ee75047" "checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2" "checksum libusb 0.3.0 (git+https://github.com/paritytech/libusb-rs)" = "" "checksum libusb-sys 0.2.4 (git+https://github.com/paritytech/libusb-sys)" = "" @@ -4491,11 +4614,12 @@ dependencies = [ "checksum memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b3629fe9fdbff6daa6c33b90f7c08355c1aca05a3d01fa8063b822fcf185f3b" "checksum memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2ffa2c986de11a9df78620c01eeaaf27d94d3ff02bf81bfcca953102dd0c6ff" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" +"checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" -"checksum memorydb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e143fbad9f90d2158bca3c4b09015276a6de6f085a77088943901cb26828780f" "checksum mime 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)" = "0a907b83e7b9e987032439a387e187119cddafc92d5c2aaeb1d92580a793f630" "checksum mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30de2e4613efcba1ec63d8133f344076952090c122992a903359be5a4f99c3ed" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" +"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" "checksum mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e374eff525ce1c5b7687c4cef63943e7686524a387933ad27ca7ec43779cb3" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" @@ -4519,20 +4643,21 @@ dependencies = [ "checksum ordermap 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa5168b4cf41f3835e4bc6ffb32f51bc9365dc50cb351904595b3931d917fd0c" -"checksum parity-crypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8adf489acb31f1922db0ce43803b6f48a425241a8473611be3cc625a8e4a4c47" +"checksum parity-crypto 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b9db194dfbcfe3b398d63d765437a5c7232d59906e203055f0e993f6458ff1" +"checksum parity-daemonize 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "69b1910b2793ff52713fca0a4ee92544ebec59ccd218ea74560be6f947b4ca77" "checksum parity-path 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5962540f99d3895d9addf535f37ab1397886bc2c68e59efd040ef458e5f8c3f7" "checksum parity-rocksdb 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cd55d2d6d6000ec99f021cf52c9acc7d2a402e14f95ced4c5de230696fabe00b" -"checksum parity-rocksdb-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c172000a0115db7615befec1e52a2f5b25dbfa08a969659df494d24b7e6457b5" +"checksum parity-rocksdb-sys 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5bbb241262c768522f6460f0e2672dee185c8504d4d0a5a5bab45c1147981c4f" "checksum parity-snappy 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2c5f9d149b13134b8b354d93a92830efcbee6fe5b73a2e6e540fe70d4dd8a63" "checksum parity-snappy-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1a413d51e5e1927320c9de992998e4a279dffb8c8a7363570198bd8383e66f1b" "checksum parity-tokio-ipc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eb002c2d3539ccd3b82bd915ec060028d4ab350ad203dbffa20028c1e483af5b" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parity-wordlist 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf13102febd98f4ad416a526b42deb82daf482626ba6ab10d0ebf8f45327514c" +"checksum parity-ws 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2fec5048fba72a2e01baeb0d08089db79aead4b57e2443df172fb1840075a233" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9723236a9525c757d9725b993511e3fc941e33f27751942232f0058298297edf" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -"checksum patricia-trie 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "10438ba40c2f6e9ceca55277d8e7f6a5dafd58cabd802e6d97e16f02aab83a03" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0fce5d8b5cc33983fc74f78ad552b5522ab41442c4ca91606e4236eb4b5ceefc" "checksum pest_derive 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3294f437119209b084c797604295f40227cffa35c57220b1e99a6ff3bf8ee4" @@ -4551,7 +4676,7 @@ dependencies = [ "checksum proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "3d7b7eaaa90b4a90a932a9ea6666c95a389e424eff347f0f793979289429feee" "checksum protobuf 1.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "52fbc45bf6709565e44ef31847eb7407b3c3c80af811ee884a04da071dcca12b" "checksum pulldown-cmark 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8361e81576d2e02643b04950e487ec172b687180da65c731c03cf336784e6c07" -"checksum pwasm-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "90d2b3c5bf24275fc77db6b14ec00a7a085d8ff9d1c4215fb6f6263e8d7b01bc" +"checksum pwasm-utils 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e9135bed7b452e20dbb395a2d519abaf0c46d60e7ecc02daeeab447d29bada1" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" "checksum quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dd636425967c33af890042c483632d33fa7a18f19ad1d7ea72e8998c6ef8dea5" @@ -4576,7 +4701,7 @@ dependencies = [ "checksum regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "747ba3b235651f6e2f67dfa8bcdcd073ddb7c243cb21c442fc12395dfcac212d" "checksum relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1576e382688d7e9deecea24417e350d3062d97e32e45d70b1cde65994ff1489a" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" -"checksum ring 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe642b9dd1ba0038d78c4a3999d1ee56178b4d415c1e1fbaba83b06dce012f0" +"checksum ring 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)" = "be5386a5f59e5f5bcaea38b50ad26c09e3918a0abc0610640b3be5cfd85d6894" "checksum rlp 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "524c5ad554859785dfc8469df3ed5e0b5784d4d335877ed47c8d90fc0eb238fe" "checksum rlp 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "16d1effe9845d54f90e7be8420ee49e5c94623140b97ee4bc6fb5bfddb745720" "checksum rpassword 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b273c91bd242ca03ad6d71c143b6f17a48790e61f21a6c78568fa2b6774a24a4" @@ -4587,20 +4712,20 @@ dependencies = [ "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rustls 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "942b71057b31981152970d57399c25f72e27a6ee0d207a669d8304cabf44705b" +"checksum rustls 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38af00e78b66109e7184a0ee16940f41583161b7ec0518af258e4bcaed15db25" "checksum ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7153dd96dade874ab973e098cb62fcdbb89a03682e46b144fd09550998d4a4a7" "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" "checksum same-file 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "10f7794e2fda7f594866840e95f5c5962e886e228e68b6505885811a94dd728c" "checksum scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum sct 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb8f61f9e6eadd062a71c380043d28036304a4706b3c4dd001ff3387ed00745a" +"checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "15c141fc7027dd265a47c090bf864cf62b42c4d228bbcf4e51a0c9e2b0d3f7ef" "checksum serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "225de307c6302bec3898c51ca302fc94a7a1697ef0845fcee6448f33c032249c" "checksum serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "43344e7ce05d0d8280c5940cabb4964bea626aa58b1ec0e8c73fa2a8512a38ce" -"checksum sha1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc30b1e1e8c40c121ca33b86c23308a090d19974ef001b4bf6e61fd1a0fb095c" "checksum sha1 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "171698ce4ec7cbb93babeb3190021b4d72e96ccb98e33d277ae4ea959d6f2d9e" +"checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eb6be24e4c23a84d7184280d2722f7f2731fcdd4a9d886efbfe4413e4847ea0" "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" "checksum simplelog 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e95345f185d5adeb8ec93459d2dc99654e294cc6ccf5b75414d8ea262de9a13" @@ -4616,7 +4741,7 @@ dependencies = [ "checksum string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00caf261d6f90f588f8450b8e1230fa0d5be49ee6140fdfbcb55335aff350970" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -"checksum syn 0.15.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b036b7b35e846707c0e55c2c9441fa47867c0f87fca416921db3261b1d8c741a" +"checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" @@ -4644,7 +4769,7 @@ dependencies = [ "checksum tokio-named-pipes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d282d483052288b2308ba5ee795f5673b159c9bdf63c385a05609da782a5eae" "checksum tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4b26fd37f1125738b2170c80b551f69ff6fecb277e6e5ca885e53eec2b005018" "checksum tokio-retry 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f05746ae87dca83a2016b4f5dba5b237b897dd12fd324f60afe282112f16969a" -"checksum tokio-rustls 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "208d62fa3e015426e3c64039d9d20adf054a3c9b4d9445560f1c41c75bef3eab" +"checksum tokio-rustls 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7223fa02f4b2d9f3736f13cc3dea3723aaec57ca4b3dded922126ebbb2cb8ce9" "checksum tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" "checksum tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ad235e9dadd126b2d47f6736f65aa1fdcd6420e66ca63f44177bc78df89f912" "checksum tokio-threadpool 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "bbd8a8b911301c60cbfaa2a6588fb210e5c1038375b8bdecc47aa09a94c3c05f" @@ -4658,8 +4783,9 @@ dependencies = [ "checksum transaction-pool 1.13.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e5866e5126b14358f1d7af4bf51a0be677a363799b90e655edcec8254edef1d2" "checksum transient-hashmap 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aeb4b191d033a35edfce392a38cdcf9790b6cebcb30fa690c312c29da4dc433e" "checksum trezor-sys 1.0.0 (git+https://github.com/paritytech/trezor-sys)" = "" +"checksum trie-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7319e28ca295f27359d944a682f7f65b419158bf1590c92cadc0000258d788" "checksum trie-standardmap 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e26f52976a57a0859616d6fcec87092ac35d08eabbd78dc3dabee93b480ea5f" -"checksum triehash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cd9cb3a626dd9a19a1b5f84087143b19409db793d902c5ddee4b6212020713f1" +"checksum triehash 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0d26efb4ddf87870fc08dc9a6580dc3061be350d7b9d0eb30aef1c8b4227aa46" "checksum try-lock 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2aa4715743892880f70885373966c83d73ef1b0838a664ef0c76fffd35e7c2" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" @@ -4687,8 +4813,8 @@ dependencies = [ "checksum want 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a05d9d966753fa4b5c8db73fcab5eed4549cfe0e1e4e66911e5564a0085c35d1" "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" "checksum wasmi 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b4a6d379e9332b1b1f52c5a87f2481c85c7c931d8ec411963dfb8f26b1ec1e3" -"checksum webpki 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)" = "17d7967316d8411ca3b01821ee6c332bde138ba4363becdb492f12e514daa17f" -"checksum webpki-roots 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "85d1f408918fd590908a70d36b7ac388db2edc221470333e4d6e5b598e44cabf" +"checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" +"checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" @@ -4696,7 +4822,6 @@ dependencies = [ "checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" -"checksum ws 0.7.5 (git+https://github.com/tomusdrw/ws-rs)" = "" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum xdg 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a66b7c2281ebde13cf4391d70d4c7e5946c3c25e72a7b859ca8f677dcd0b0c61" "checksum xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c1cb601d29fe2c2ac60a2b2e5e293994d87a1f6fa9687a31a15270f909be9c2" diff --git a/Cargo.toml b/Cargo.toml index e6d41dea005..ee4440dd010 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,14 +2,13 @@ description = "Parity Ethereum client" name = "parity-ethereum" # NOTE Make sure to update util/version/Cargo.toml as well -version = "2.3.0" +version = "2.5.0" license = "GPL-3.0" authors = ["Parity Technologies "] [dependencies] blooms-db = { path = "util/blooms-db" } log = "0.4" -env_logger = "0.5" rustc-hex = "1.0" docopt = "1.0" clap = "2" @@ -30,45 +29,49 @@ serde_derive = "1.0" futures = "0.1" fdlimit = "0.1" ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" } -jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -ethcore = { path = "ethcore", features = ["parity"] } +jsonrpc-core = "10.0.1" parity-bytes = "0.1" +common-types = { path = "ethcore/types" } +ethcore = { path = "ethcore", features = ["parity"] } +ethcore-accounts = { path = "accounts", optional = true } +ethcore-blockchain = { path = "ethcore/blockchain" } +ethcore-call-contract = { path = "ethcore/call-contract"} +ethcore-db = { path = "ethcore/db" } ethcore-io = { path = "util/io" } ethcore-light = { path = "ethcore/light" } -ethcore-logger = { path = "logger" } +ethcore-logger = { path = "parity/logger" } ethcore-miner = { path = "miner" } ethcore-network = { path = "util/network" } ethcore-private-tx = { path = "ethcore/private-tx" } ethcore-service = { path = "ethcore/service" } ethcore-sync = { path = "ethcore/sync" } -ethcore-transaction = { path = "ethcore/transaction" } ethereum-types = "0.4" -node-filter = { path = "ethcore/node_filter" } -ethkey = { path = "ethkey" } +ethkey = { path = "accounts/ethkey" } +ethstore = { path = "accounts/ethstore" } +node-filter = { path = "ethcore/node-filter" } rlp = { version = "0.3.0", features = ["ethereum"] } -rpc-cli = { path = "rpc_cli" } -parity-hash-fetch = { path = "hash-fetch" } +cli-signer= { path = "cli-signer" } +parity-daemonize = "0.3" +parity-hash-fetch = { path = "updater/hash-fetch" } parity-ipfs-api = { path = "ipfs" } -parity-local-store = { path = "local-store" } +parity-local-store = { path = "miner/local-store" } parity-runtime = { path = "util/runtime" } parity-rpc = { path = "rpc" } -parity-rpc-client = { path = "rpc_client" } parity-updater = { path = "updater" } parity-version = { path = "util/version" } parity-whisper = { path = "whisper" } parity-path = "0.1" dir = { path = "util/dir" } -panic_hook = { path = "util/panic_hook" } +panic_hook = { path = "util/panic-hook" } keccak-hash = "0.1" migration-rocksdb = { path = "util/migration-rocksdb" } kvdb = "0.1" kvdb-rocksdb = "0.1.3" journaldb = { path = "util/journaldb" } -mem = { path = "util/mem" } -ethcore-secretstore = { path = "secret_store", optional = true } +ethcore-secretstore = { path = "secret-store", optional = true } -registrar = { path = "registrar" } +registrar = { path = "util/registrar" } [build-dependencies] rustc_version = "0.2" @@ -78,22 +81,22 @@ pretty_assertions = "0.1" ipnetwork = "0.12.6" tempdir = "0.3" fake-fetch = { path = "util/fake-fetch" } +lazy_static = "1.2.0" [target.'cfg(windows)'.dependencies] winapi = { version = "0.3.4", features = ["winsock2", "winuser", "shellapi"] } -[target.'cfg(not(windows))'.dependencies] -daemonize = "0.3" - [features] +default = ["accounts"] +accounts = ["ethcore-accounts", "parity-rpc/accounts"] miner-debug = ["ethcore/miner-debug"] json-tests = ["ethcore/json-tests"] -ci-skip-issue = ["ethcore/ci-skip-issue"] +ci-skip-tests = ["ethcore/ci-skip-tests"] test-heavy = ["ethcore/test-heavy"] evm-debug = ["ethcore/evm-debug"] evm-debug-tests = ["ethcore/evm-debug-tests"] slow-blocks = ["ethcore/slow-blocks"] -secretstore = ["ethcore-secretstore"] +secretstore = ["ethcore-secretstore", "ethcore-secretstore/accounts"] final = ["parity-version/final"] deadlock_detection = ["parking_lot/deadlock_detection"] # to create a memory profile (requires nightly rust), use e.g. @@ -121,19 +124,22 @@ name = "parity" debug = false [workspace] +# This should only list projects that are not +# in the dependency tree in any other way +# (i.e. pretty much only standalone CLI tools) members = [ + "accounts/ethkey/cli", + "accounts/ethstore/cli", "chainspec", "ethcore/wasm/run", - "ethcore/types", - "ethkey/cli", - "ethstore/cli", "evmbin", - "miner", "parity-clib", - "whisper", "whisper/cli", "util/triehash-ethereum", "util/keccak-hasher", "util/patricia-trie-ethereum", - "util/fastmap", + "util/fastmap" ] + +[patch.crates-io] +heapsize = { git = "https://github.com/cheme/heapsize.git", branch = "ec-macfix" } diff --git a/README.md b/README.md index 972fd907091..1c0302535f2 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,8 @@ To start Parity Ethereum as a regular user using `systemd` init: 1. Copy `./scripts/parity.service` to your `systemd` user directory (usually `~/.config/systemd/user`). -2. To configure Parity Ethereum, write a `/etc/parity/config.toml` config file, see [Configuring Parity Ethereum](https://paritytech.github.io/wiki/Configuring-Parity) for details. +2. Copy release to bin folder, write `sudo install ./target/release/parity /usr/bin/parity` +3. To configure Parity Ethereum, write a `/etc/parity/config.toml` config file, see [Configuring Parity Ethereum](https://paritytech.github.io/wiki/Configuring-Parity) for details. ## Parity Ethereum toolchain @@ -133,8 +134,8 @@ In addition to the Parity Ethereum client, there are additional tools in this re - [evmbin](https://github.com/paritytech/parity-ethereum/blob/master/evmbin/) - EVM implementation for Parity Ethereum. - [ethabi](https://github.com/paritytech/ethabi) - Parity Ethereum function calls encoding. -- [ethstore](https://github.com/paritytech/parity-ethereum/blob/master/ethstore/) - Parity Ethereum key management. -- [ethkey](https://github.com/paritytech/parity-ethereum/blob/master/ethkey/) - Parity Ethereum keys generator. +- [ethstore](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethstore) - Parity Ethereum key management. +- [ethkey](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethkey) - Parity Ethereum keys generator. - [whisper](https://github.com/paritytech/parity-ethereum/blob/master/whisper/) - Implementation of Whisper-v2 PoC. ## Join the chat! diff --git a/accounts/Cargo.toml b/accounts/Cargo.toml new file mode 100644 index 00000000000..072593cd104 --- /dev/null +++ b/accounts/Cargo.toml @@ -0,0 +1,28 @@ +[package] +description = "Account management for Parity Ethereum" +homepage = "http://parity.io" +license = "GPL-3.0" +name = "ethcore-accounts" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +common-types = { path = "../ethcore/types" } +ethkey = { path = "ethkey" } +ethstore = { path = "ethstore" } +log = "0.4" +parking_lot = "0.7" +serde = "1.0" +serde_derive = "1.0" +serde_json = "1.0" + +[target.'cfg(any(target_os = "linux", target_os = "macos", target_os = "windows"))'.dependencies] +hardware-wallet = { path = "hw" } + +[target.'cfg(not(any(target_os = "linux", target_os = "macos", target_os = "windows")))'.dependencies] +fake-hardware-wallet = { path = "fake-hardware-wallet" } + +[dev-dependencies] +ethereum-types = "0.4" +tempdir = "0.3" diff --git a/ethkey/.gitignore b/accounts/ethkey/.gitignore similarity index 100% rename from ethkey/.gitignore rename to accounts/ethkey/.gitignore diff --git a/ethkey/.travis.yml b/accounts/ethkey/.travis.yml similarity index 100% rename from ethkey/.travis.yml rename to accounts/ethkey/.travis.yml diff --git a/ethkey/Cargo.toml b/accounts/ethkey/Cargo.toml similarity index 86% rename from ethkey/Cargo.toml rename to accounts/ethkey/Cargo.toml index 536e5b47d9c..ec784bd11d7 100644 --- a/ethkey/Cargo.toml +++ b/accounts/ethkey/Cargo.toml @@ -6,12 +6,12 @@ authors = ["Parity Technologies "] [dependencies] byteorder = "1.0" edit-distance = "2.0" -parity-crypto = "0.2" +parity-crypto = "0.3.0" eth-secp256k1 = { git = "https://github.com/paritytech/rust-secp256k1" } ethereum-types = "0.4" lazy_static = "1.0" log = "0.4" -mem = { path = "../util/mem" } +memzero = { path = "../../util/memzero" } parity-wordlist = "1.2" quick-error = "1.2.2" rand = "0.4" diff --git a/ethkey/README.md b/accounts/ethkey/README.md similarity index 97% rename from ethkey/README.md rename to accounts/ethkey/README.md index a82da0a9cf7..6fc98b020d6 100644 --- a/ethkey/README.md +++ b/accounts/ethkey/README.md @@ -6,7 +6,7 @@ Parity Ethereum keys generator. ``` Parity Ethereum keys generator. - Copyright 2015-2018 Parity Technologies (UK) Ltd. + Copyright 2015-2019 Parity Technologies (UK) Ltd. Usage: ethkey info [options] @@ -216,6 +216,6 @@ _This project is a part of the Parity Ethereum toolchain._ - [evmbin](https://github.com/paritytech/parity-ethereum/blob/master/evmbin/) - EVM implementation for Parity Ethereum. - [ethabi](https://github.com/paritytech/ethabi) - Parity Ethereum function calls encoding. -- [ethstore](https://github.com/paritytech/parity-ethereum/blob/master/ethstore/) - Parity Ethereum key management. -- [ethkey](https://github.com/paritytech/parity-ethereum/blob/master/ethkey/) - Parity Ethereum keys generator. +- [ethstore](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethstore) - Parity Ethereum key management. +- [ethkey](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethkey) - Parity Ethereum keys generator. - [whisper](https://github.com/paritytech/parity-ethereum/blob/master/whisper/) - Implementation of Whisper-v2 PoC. diff --git a/ethkey/cli/Cargo.toml b/accounts/ethkey/cli/Cargo.toml similarity index 86% rename from ethkey/cli/Cargo.toml rename to accounts/ethkey/cli/Cargo.toml index 90b5b8e147b..d43aa2c5c0a 100644 --- a/ethkey/cli/Cargo.toml +++ b/accounts/ethkey/cli/Cargo.toml @@ -7,7 +7,7 @@ authors = ["Parity Technologies "] docopt = "1.0" env_logger = "0.5" ethkey = { path = "../" } -panic_hook = { path = "../../util/panic_hook" } +panic_hook = { path = "../../../util/panic-hook" } parity-wordlist="1.2" rustc-hex = "1.0" serde = "1.0" diff --git a/ethkey/cli/src/main.rs b/accounts/ethkey/cli/src/main.rs similarity index 97% rename from ethkey/cli/src/main.rs rename to accounts/ethkey/cli/src/main.rs index e908baec32b..759f5f484c1 100644 --- a/ethkey/cli/src/main.rs +++ b/accounts/ethkey/cli/src/main.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate docopt; extern crate env_logger; @@ -35,7 +35,7 @@ use rustc_hex::{FromHex, FromHexError}; const USAGE: &'static str = r#" Parity Ethereum keys generator. - Copyright 2015-2018 Parity Technologies (UK) Ltd. + Copyright 2015-2019 Parity Technologies (UK) Ltd. Usage: ethkey info [options] @@ -168,7 +168,7 @@ fn main() { Ok(ok) => println!("{}", ok), Err(Error::Docopt(ref e)) => e.exit(), Err(err) => { - println!("{}", err); + eprintln!("{}", err); process::exit(1); } } diff --git a/ethkey/src/brain.rs b/accounts/ethkey/src/brain.rs similarity index 84% rename from ethkey/src/brain.rs rename to accounts/ethkey/src/brain.rs index 55b525e2a41..3a970e17c8d 100644 --- a/ethkey/src/brain.rs +++ b/accounts/ethkey/src/brain.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use keccak::Keccak256; use super::{KeyPair, Generator, Secret}; diff --git a/ethkey/src/brain_prefix.rs b/accounts/ethkey/src/brain_prefix.rs similarity index 84% rename from ethkey/src/brain_prefix.rs rename to accounts/ethkey/src/brain_prefix.rs index accf9473700..ba0d8129615 100644 --- a/ethkey/src/brain_prefix.rs +++ b/accounts/ethkey/src/brain_prefix.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use super::{Generator, KeyPair, Error, Brain}; use parity_wordlist as wordlist; diff --git a/ethkey/src/brain_recover.rs b/accounts/ethkey/src/brain_recover.rs similarity index 93% rename from ethkey/src/brain_recover.rs rename to accounts/ethkey/src/brain_recover.rs index 51331932328..f9922fae97f 100644 --- a/ethkey/src/brain_recover.rs +++ b/accounts/ethkey/src/brain_recover.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::HashSet; diff --git a/ethkey/src/crypto.rs b/accounts/ethkey/src/crypto.rs similarity index 94% rename from ethkey/src/crypto.rs rename to accounts/ethkey/src/crypto.rs index 8049f16b584..ec883dcb6d9 100644 --- a/ethkey/src/crypto.rs +++ b/accounts/ethkey/src/crypto.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use secp256k1; use std::io; diff --git a/ethkey/src/error.rs b/accounts/ethkey/src/error.rs similarity index 86% rename from ethkey/src/error.rs rename to accounts/ethkey/src/error.rs index 7cba375d0f2..ee191157453 100644 --- a/ethkey/src/error.rs +++ b/accounts/ethkey/src/error.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::{fmt, error}; diff --git a/ethkey/src/extended.rs b/accounts/ethkey/src/extended.rs similarity index 98% rename from ethkey/src/extended.rs rename to accounts/ethkey/src/extended.rs index e48f6b5616e..7d02271ebbd 100644 --- a/ethkey/src/extended.rs +++ b/accounts/ethkey/src/extended.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Extended keys diff --git a/ethkey/src/keccak.rs b/accounts/ethkey/src/keccak.rs similarity index 70% rename from ethkey/src/keccak.rs rename to accounts/ethkey/src/keccak.rs index 3801d841ab0..202c211933c 100644 --- a/ethkey/src/keccak.rs +++ b/accounts/ethkey/src/keccak.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use tiny_keccak::Keccak; diff --git a/ethkey/src/keypair.rs b/accounts/ethkey/src/keypair.rs similarity index 90% rename from ethkey/src/keypair.rs rename to accounts/ethkey/src/keypair.rs index 610c14524fe..2919f0cfb79 100644 --- a/ethkey/src/keypair.rs +++ b/accounts/ethkey/src/keypair.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use secp256k1::key; diff --git a/ethkey/src/lib.rs b/accounts/ethkey/src/lib.rs similarity index 86% rename from ethkey/src/lib.rs rename to accounts/ethkey/src/lib.rs index 013a60cd3a8..5c58333c711 100644 --- a/ethkey/src/lib.rs +++ b/accounts/ethkey/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . // #![warn(missing_docs)] @@ -20,7 +20,7 @@ extern crate byteorder; extern crate edit_distance; extern crate parity_crypto; extern crate ethereum_types; -extern crate mem; +extern crate memzero; extern crate parity_wordlist; #[macro_use] extern crate quick_error; diff --git a/ethkey/src/math.rs b/accounts/ethkey/src/math.rs similarity index 92% rename from ethkey/src/math.rs rename to accounts/ethkey/src/math.rs index 6b1d4013bd7..8c3fe650df6 100644 --- a/ethkey/src/math.rs +++ b/accounts/ethkey/src/math.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use super::{SECP256K1, Public, Secret, Error}; use secp256k1::key; diff --git a/ethkey/src/password.rs b/accounts/ethkey/src/password.rs similarity index 79% rename from ethkey/src/password.rs rename to accounts/ethkey/src/password.rs index d349663739b..6ad665e396c 100644 --- a/ethkey/src/password.rs +++ b/accounts/ethkey/src/password.rs @@ -1,18 +1,18 @@ -// Copyright 2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::{fmt, ptr}; @@ -57,4 +57,3 @@ impl<'a> From<&'a str> for Password { Password::from(String::from(s)) } } - diff --git a/ethkey/src/prefix.rs b/accounts/ethkey/src/prefix.rs similarity index 80% rename from ethkey/src/prefix.rs rename to accounts/ethkey/src/prefix.rs index 2668050ef8e..6695e93c50e 100644 --- a/ethkey/src/prefix.rs +++ b/accounts/ethkey/src/prefix.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use super::{Random, Generator, KeyPair, Error}; diff --git a/ethkey/src/random.rs b/accounts/ethkey/src/random.rs similarity index 78% rename from ethkey/src/random.rs rename to accounts/ethkey/src/random.rs index d42bb4ea4df..1966cb361b6 100644 --- a/ethkey/src/random.rs +++ b/accounts/ethkey/src/random.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use rand::os::OsRng; use super::{Generator, KeyPair, SECP256K1}; diff --git a/ethkey/src/secret.rs b/accounts/ethkey/src/secret.rs similarity index 95% rename from ethkey/src/secret.rs rename to accounts/ethkey/src/secret.rs index a3560698af4..84e849cabc5 100644 --- a/ethkey/src/secret.rs +++ b/accounts/ethkey/src/secret.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use std::ops::Deref; @@ -21,7 +21,7 @@ use rustc_hex::ToHex; use secp256k1::constants::{SECRET_KEY_SIZE as SECP256K1_SECRET_KEY_SIZE}; use secp256k1::key; use ethereum_types::H256; -use mem::Memzero; +use memzero::Memzero; use {Error, SECP256K1}; #[derive(Clone, PartialEq, Eq)] diff --git a/ethkey/src/signature.rs b/accounts/ethkey/src/signature.rs similarity index 96% rename from ethkey/src/signature.rs rename to accounts/ethkey/src/signature.rs index cd6d88fe187..cc712df6904 100644 --- a/ethkey/src/signature.rs +++ b/accounts/ethkey/src/signature.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::ops::{Deref, DerefMut}; use std::cmp::PartialEq; diff --git a/ethstore/.editorconfig b/accounts/ethstore/.editorconfig similarity index 100% rename from ethstore/.editorconfig rename to accounts/ethstore/.editorconfig diff --git a/ethstore/.gitignore b/accounts/ethstore/.gitignore similarity index 100% rename from ethstore/.gitignore rename to accounts/ethstore/.gitignore diff --git a/ethstore/.travis.yml b/accounts/ethstore/.travis.yml similarity index 100% rename from ethstore/.travis.yml rename to accounts/ethstore/.travis.yml diff --git a/ethstore/Cargo.toml b/accounts/ethstore/Cargo.toml similarity index 81% rename from ethstore/Cargo.toml rename to accounts/ethstore/Cargo.toml index e16eadc447e..4563a803276 100644 --- a/ethstore/Cargo.toml +++ b/accounts/ethstore/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ethstore" -version = "0.2.0" +version = "0.2.1" authors = ["Parity Technologies "] [dependencies] @@ -16,12 +16,13 @@ tiny-keccak = "1.4" time = "0.1.34" itertools = "0.5" parking_lot = "0.7" -parity-crypto = "0.2" +parity-crypto = "0.3.0" ethereum-types = "0.4" -dir = { path = "../util/dir" } +dir = { path = "../../util/dir" } smallvec = "0.6" parity-wordlist = "1.0" tempdir = "0.3" +lazy_static = "1.2.0" [dev-dependencies] matches = "0.1" diff --git a/ethstore/README.md b/accounts/ethstore/README.md similarity index 98% rename from ethstore/README.md rename to accounts/ethstore/README.md index 6099c413248..77c37bd2462 100644 --- a/ethstore/README.md +++ b/accounts/ethstore/README.md @@ -6,7 +6,7 @@ Parity Ethereum key management. ``` Parity Ethereum key management tool. - Copyright 2015-2018 Parity Technologies (UK) Ltd. + Copyright 2015-2019 Parity Technologies (UK) Ltd. Usage: ethstore insert [--dir DIR] [--vault VAULT] [--vault-pwd VAULTPWD] @@ -335,6 +335,6 @@ _This project is a part of the Parity Ethereum toolchain._ - [evmbin](https://github.com/paritytech/parity-ethereum/blob/master/evmbin/) - EVM implementation for Parity Ethereum. - [ethabi](https://github.com/paritytech/ethabi) - Parity Ethereum function calls encoding. -- [ethstore](https://github.com/paritytech/parity-ethereum/blob/master/ethstore/) - Parity Ethereum key management. -- [ethkey](https://github.com/paritytech/parity-ethereum/blob/master/ethkey/) - Parity Ethereum keys generator. +- [ethstore](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethstore) - Parity Ethereum key management. +- [ethkey](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethkey) - Parity Ethereum keys generator. - [whisper](https://github.com/paritytech/parity-ethereum/blob/master/whisper/) - Implementation of Whisper-v2 PoC. diff --git a/ethstore/cli/Cargo.toml b/accounts/ethstore/cli/Cargo.toml similarity index 72% rename from ethstore/cli/Cargo.toml rename to accounts/ethstore/cli/Cargo.toml index c6a4f75da13..82858eaa762 100644 --- a/ethstore/cli/Cargo.toml +++ b/accounts/ethstore/cli/Cargo.toml @@ -1,18 +1,19 @@ [package] name = "ethstore-cli" -version = "0.1.0" +version = "0.1.1" authors = ["Parity Technologies "] [dependencies] docopt = "1.0" +env_logger = "0.5" num_cpus = "1.6" rustc-hex = "1.0" serde = "1.0" serde_derive = "1.0" parking_lot = "0.7" ethstore = { path = "../" } -dir = { path = '../../util/dir' } -panic_hook = { path = "../../util/panic_hook" } +dir = { path = '../../../util/dir' } +panic_hook = { path = "../../../util/panic-hook" } [[bin]] name = "ethstore" diff --git a/ethstore/cli/src/crack.rs b/accounts/ethstore/cli/src/crack.rs similarity index 84% rename from ethstore/cli/src/crack.rs rename to accounts/ethstore/cli/src/crack.rs index 00844b7f016..abe171c3560 100644 --- a/ethstore/cli/src/crack.rs +++ b/accounts/ethstore/cli/src/crack.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::{cmp, thread}; use std::sync::Arc; diff --git a/ethstore/cli/src/main.rs b/accounts/ethstore/cli/src/main.rs similarity index 88% rename from ethstore/cli/src/main.rs rename to accounts/ethstore/cli/src/main.rs index 6751f713c6e..0f564406395 100644 --- a/ethstore/cli/src/main.rs +++ b/accounts/ethstore/cli/src/main.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate dir; extern crate docopt; @@ -23,6 +23,8 @@ extern crate parking_lot; extern crate rustc_hex; extern crate serde; +extern crate env_logger; + #[macro_use] extern crate serde_derive; @@ -39,13 +41,13 @@ mod crack; pub const USAGE: &'static str = r#" Parity Ethereum key management tool. - Copyright 2015-2018 Parity Technologies (UK) Ltd. + Copyright 2015-2019 Parity Technologies (UK) Ltd. Usage: ethstore insert [--dir DIR] [--vault VAULT] [--vault-pwd VAULTPWD] ethstore change-pwd
[--dir DIR] [--vault VAULT] [--vault-pwd VAULTPWD] ethstore list [--dir DIR] [--vault VAULT] [--vault-pwd VAULTPWD] - ethstore import [--src DIR] [--dir DIR] + ethstore import [] [--src DIR] [--dir DIR] ethstore import-wallet [--dir DIR] [--vault VAULT] [--vault-pwd VAULTPWD] ethstore find-wallet-pass ethstore remove
[--dir DIR] [--vault VAULT] [--vault-pwd VAULTPWD] @@ -146,30 +148,34 @@ impl fmt::Display for Error { fn main() { panic_hook::set_abort(); + if env::var("RUST_LOG").is_err() { + env::set_var("RUST_LOG", "warn") + } + env_logger::try_init().expect("Logger initialized only once."); match execute(env::args()) { Ok(result) => println!("{}", result), Err(Error::Docopt(ref e)) => e.exit(), Err(err) => { - println!("{}", err); + eprintln!("{}", err); process::exit(1); } } } -fn key_dir(location: &str) -> Result, Error> { - let dir: Box = match location { - "geth" => Box::new(RootDiskDirectory::create(dir::geth(false))?), - "geth-test" => Box::new(RootDiskDirectory::create(dir::geth(true))?), +fn key_dir(location: &str, password: Option) -> Result, Error> { + let dir: RootDiskDirectory = match location { + "geth" => RootDiskDirectory::create(dir::geth(false))?, + "geth-test" => RootDiskDirectory::create(dir::geth(true))?, path if path.starts_with("parity") => { let chain = path.split('-').nth(1).unwrap_or("ethereum"); let path = dir::parity(chain); - Box::new(RootDiskDirectory::create(path)?) + RootDiskDirectory::create(path)? }, - path => Box::new(RootDiskDirectory::create(path)?), + path => RootDiskDirectory::create(path)?, }; - Ok(dir) + Ok(Box::new(dir.with_password(password))) } fn open_args_vault(store: &EthStore, args: &Args) -> Result { @@ -202,9 +208,9 @@ fn format_vaults(vaults: &[String]) -> String { } fn load_password(path: &str) -> Result { - let mut file = fs::File::open(path).map_err(|e| ethstore::Error::Custom(format!("Error opening password file {}: {}", path, e)))?; + let mut file = fs::File::open(path).map_err(|e| ethstore::Error::Custom(format!("Error opening password file '{}': {}", path, e)))?; let mut password = String::new(); - file.read_to_string(&mut password).map_err(|e| ethstore::Error::Custom(format!("Error reading password file {}: {}", path, e)))?; + file.read_to_string(&mut password).map_err(|e| ethstore::Error::Custom(format!("Error reading password file '{}': {}", path, e)))?; // drop EOF let _ = password.pop(); Ok(password.into()) @@ -214,7 +220,7 @@ fn execute(command: I) -> Result where I: IntoIterator(command: I) -> Result where I: IntoIterator None, + _ => Some(load_password(&args.arg_password)?) + }; + let src = key_dir(&args.flag_src, password)?; + let dst = key_dir(&args.flag_dir, None)?; + let accounts = import_accounts(&*src, &*dst)?; Ok(format_accounts(&accounts)) } else if args.cmd_import_wallet { diff --git a/ethstore/cli/tests/cli.rs b/accounts/ethstore/cli/tests/cli.rs similarity index 89% rename from ethstore/cli/tests/cli.rs rename to accounts/ethstore/cli/tests/cli.rs index 1b899f7082e..39e40864f2a 100644 --- a/ethstore/cli/tests/cli.rs +++ b/accounts/ethstore/cli/tests/cli.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate tempdir; use std::process::Command; diff --git a/ethstore/src/account/cipher.rs b/accounts/ethstore/src/account/cipher.rs similarity index 79% rename from ethstore/src/account/cipher.rs rename to accounts/ethstore/src/account/cipher.rs index 92a5304edb9..1d97b69e8fe 100644 --- a/ethstore/src/account/cipher.rs +++ b/accounts/ethstore/src/account/cipher.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use json; diff --git a/ethstore/src/account/crypto.rs b/accounts/ethstore/src/account/crypto.rs similarity index 83% rename from ethstore/src/account/crypto.rs rename to accounts/ethstore/src/account/crypto.rs index 07f84af7fa4..a3f6f9e9a30 100644 --- a/ethstore/src/account/crypto.rs +++ b/accounts/ethstore/src/account/crypto.rs @@ -1,20 +1,21 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::str; +use std::num::NonZeroU32; use ethkey::{Password, Secret}; use {json, Error, crypto}; use crypto::Keccak256; @@ -73,18 +74,19 @@ impl From for String { impl Crypto { /// Encrypt account secret - pub fn with_secret(secret: &Secret, password: &Password, iterations: u32) -> Result { + pub fn with_secret(secret: &Secret, password: &Password, iterations: NonZeroU32) -> Result { Crypto::with_plain(&*secret, password, iterations) } /// Encrypt custom plain data - pub fn with_plain(plain: &[u8], password: &Password, iterations: u32) -> Result { + pub fn with_plain(plain: &[u8], password: &Password, iterations: NonZeroU32) -> Result { let salt: [u8; 32] = Random::random(); let iv: [u8; 16] = Random::random(); // two parts of derived key // DK = [ DK[0..15] DK[16..31] ] = [derived_left_bits, derived_right_bits] - let (derived_left_bits, derived_right_bits) = crypto::derive_key_iterations(password.as_bytes(), &salt, iterations); + let (derived_left_bits, derived_right_bits) = + crypto::derive_key_iterations(password.as_bytes(), &salt, iterations); // preallocated (on-stack in case of `Secret`) buffer to hold cipher // length = length(plain) as we are using CTR-approach @@ -104,7 +106,7 @@ impl Crypto { ciphertext: ciphertext.into_vec(), kdf: Kdf::Pbkdf2(Pbkdf2 { dklen: crypto::KEY_LENGTH as u32, - salt: salt, + salt: salt.to_vec(), c: iterations, prf: Prf::HmacSha256, }), @@ -158,13 +160,17 @@ impl Crypto { #[cfg(test)] mod tests { use ethkey::{Generator, Random}; - use super::{Crypto, Error}; + use super::{Crypto, Error, NonZeroU32}; + + lazy_static! { + static ref ITERATIONS: NonZeroU32 = NonZeroU32::new(10240).expect("10240 > 0; qed"); + } #[test] fn crypto_with_secret_create() { let keypair = Random.generate().unwrap(); let passwd = "this is sparta".into(); - let crypto = Crypto::with_secret(keypair.secret(), &passwd, 10240).unwrap(); + let crypto = Crypto::with_secret(keypair.secret(), &passwd, *ITERATIONS).unwrap(); let secret = crypto.secret(&passwd).unwrap(); assert_eq!(keypair.secret(), &secret); } @@ -172,7 +178,7 @@ mod tests { #[test] fn crypto_with_secret_invalid_password() { let keypair = Random.generate().unwrap(); - let crypto = Crypto::with_secret(keypair.secret(), &"this is sparta".into(), 10240).unwrap(); + let crypto = Crypto::with_secret(keypair.secret(), &"this is sparta".into(), *ITERATIONS).unwrap(); assert_matches!(crypto.secret(&"this is sparta!".into()), Err(Error::InvalidPassword)) } @@ -180,7 +186,7 @@ mod tests { fn crypto_with_null_plain_data() { let original_data = b""; let passwd = "this is sparta".into(); - let crypto = Crypto::with_plain(&original_data[..], &passwd, 10240).unwrap(); + let crypto = Crypto::with_plain(&original_data[..], &passwd, *ITERATIONS).unwrap(); let decrypted_data = crypto.decrypt(&passwd).unwrap(); assert_eq!(original_data[..], *decrypted_data); } @@ -189,7 +195,7 @@ mod tests { fn crypto_with_tiny_plain_data() { let original_data = b"{}"; let passwd = "this is sparta".into(); - let crypto = Crypto::with_plain(&original_data[..], &passwd, 10240).unwrap(); + let crypto = Crypto::with_plain(&original_data[..], &passwd, *ITERATIONS).unwrap(); let decrypted_data = crypto.decrypt(&passwd).unwrap(); assert_eq!(original_data[..], *decrypted_data); } @@ -198,7 +204,7 @@ mod tests { fn crypto_with_huge_plain_data() { let original_data: Vec<_> = (1..65536).map(|i| (i % 256) as u8).collect(); let passwd = "this is sparta".into(); - let crypto = Crypto::with_plain(&original_data, &passwd, 10240).unwrap(); + let crypto = Crypto::with_plain(&original_data, &passwd, *ITERATIONS).unwrap(); let decrypted_data = crypto.decrypt(&passwd).unwrap(); assert_eq!(&original_data, &decrypted_data); } diff --git a/ethstore/src/account/kdf.rs b/accounts/ethstore/src/account/kdf.rs similarity index 84% rename from ethstore/src/account/kdf.rs rename to accounts/ethstore/src/account/kdf.rs index 4d6d7cd956d..06b361cdca3 100644 --- a/ethstore/src/account/kdf.rs +++ b/accounts/ethstore/src/account/kdf.rs @@ -1,20 +1,21 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use json; +use std::num::NonZeroU32; #[derive(Debug, PartialEq, Clone)] pub enum Prf { @@ -23,10 +24,10 @@ pub enum Prf { #[derive(Debug, PartialEq, Clone)] pub struct Pbkdf2 { - pub c: u32, + pub c: NonZeroU32, pub dklen: u32, pub prf: Prf, - pub salt: [u8; 32], + pub salt: Vec, } #[derive(Debug, PartialEq, Clone)] @@ -35,7 +36,7 @@ pub struct Scrypt { pub p: u32, pub n: u32, pub r: u32, - pub salt: [u8; 32], + pub salt: Vec, } #[derive(Debug, PartialEq, Clone)] diff --git a/ethstore/src/account/mod.rs b/accounts/ethstore/src/account/mod.rs similarity index 68% rename from ethstore/src/account/mod.rs rename to accounts/ethstore/src/account/mod.rs index e13237d8270..b979d34a5ac 100644 --- a/ethstore/src/account/mod.rs +++ b/accounts/ethstore/src/account/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . mod cipher; mod crypto; diff --git a/ethstore/src/account/safe_account.rs b/accounts/ethstore/src/account/safe_account.rs similarity index 72% rename from ethstore/src/account/safe_account.rs rename to accounts/ethstore/src/account/safe_account.rs index 849dafab103..63971ef6a27 100644 --- a/ethstore/src/account/safe_account.rs +++ b/accounts/ethstore/src/account/safe_account.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethkey::{self, KeyPair, sign, Address, Password, Signature, Message, Public, Secret}; use ethkey::crypto::ecdh::agree; @@ -20,6 +20,7 @@ use {json, Error}; use account::Version; use crypto; use super::crypto::Crypto; +use std::num::NonZeroU32; /// Account representation. #[derive(Debug, PartialEq, Clone)] @@ -45,7 +46,7 @@ impl Into for SafeAccount { json::KeyFile { id: From::from(self.id), version: self.version.into(), - address: self.address.into(), + address: Some(self.address.into()), crypto: self.crypto.into(), name: Some(self.name.into()), meta: Some(self.meta.into()), @@ -59,7 +60,7 @@ impl SafeAccount { keypair: &KeyPair, id: [u8; 16], password: &Password, - iterations: u32, + iterations: NonZeroU32, name: String, meta: String ) -> Result { @@ -77,16 +78,43 @@ impl SafeAccount { /// Create a new `SafeAccount` from the given `json`; if it was read from a /// file, the `filename` should be `Some` name. If it is as yet anonymous, then it /// can be left `None`. - pub fn from_file(json: json::KeyFile, filename: Option) -> Self { - SafeAccount { + /// In case `password` is provided, we will attempt to read the secret from the keyfile + /// and derive the address from it instead of reading it directly. + /// Providing password is required for `json::KeyFile`s with no address. + pub fn from_file(json: json::KeyFile, filename: Option, password: &Option) -> Result { + let crypto = Crypto::from(json.crypto); + let address = match (password, &json.address) { + (None, Some(json_address)) => json_address.into(), + (None, None) => Err(Error::Custom( + "This keystore does not contain address. You need to provide password to import it".into()))?, + (Some(password), json_address) => { + let derived_address = KeyPair::from_secret( + crypto.secret(&password).map_err(|_| Error::InvalidPassword)? + )?.address(); + + match json_address { + Some(json_address) => { + let json_address = json_address.into(); + if derived_address != json_address { + warn!("Detected address mismatch when opening an account. Derived: {:?}, in json got: {:?}", + derived_address, json_address); + } + }, + _ => {}, + } + derived_address + } + }; + + Ok(SafeAccount { id: json.id.into(), version: json.version.into(), - address: json.address.into(), - crypto: json.crypto.into(), - filename: filename, + address, + crypto, + filename, name: json.name.unwrap_or(String::new()), meta: json.meta.unwrap_or("{}".to_owned()), - } + }) } /// Create a new `SafeAccount` from the given vault `json`; if it was read from a @@ -97,18 +125,18 @@ impl SafeAccount { let meta_plain = meta_crypto.decrypt(password)?; let meta_plain = json::VaultKeyMeta::load(&meta_plain).map_err(|e| Error::Custom(format!("{:?}", e)))?; - Ok(SafeAccount::from_file(json::KeyFile { + SafeAccount::from_file(json::KeyFile { id: json.id, version: json.version, crypto: json.crypto, - address: meta_plain.address, + address: Some(meta_plain.address), name: meta_plain.name, meta: meta_plain.meta, - }, filename)) + }, filename, &None) } /// Create a new `VaultKeyFile` from the given `self` - pub fn into_vault_file(self, iterations: u32, password: &Password) -> Result { + pub fn into_vault_file(self, iterations: NonZeroU32, password: &Password) -> Result { let meta_plain = json::VaultKeyMeta { address: self.address.into(), name: Some(self.name), @@ -150,7 +178,7 @@ impl SafeAccount { } /// Change account's password. - pub fn change_password(&self, old_password: &Password, new_password: &Password, iterations: u32) -> Result { + pub fn change_password(&self, old_password: &Password, new_password: &Password, iterations: NonZeroU32) -> Result { let secret = self.crypto.secret(old_password)?; let result = SafeAccount { id: self.id.clone(), @@ -173,14 +201,19 @@ impl SafeAccount { #[cfg(test)] mod tests { use ethkey::{Generator, Random, verify_public, Message}; - use super::SafeAccount; + use super::{SafeAccount, NonZeroU32}; + + lazy_static! { + static ref ITERATIONS: NonZeroU32 = NonZeroU32::new(10240).expect("10240 > 0; qed"); + } + #[test] fn sign_and_verify_public() { let keypair = Random.generate().unwrap(); let password = "hello world".into(); let message = Message::default(); - let account = SafeAccount::create(&keypair, [0u8; 16], &password, 10240, "Test".to_owned(), "{}".to_owned()); + let account = SafeAccount::create(&keypair, [0u8; 16], &password, *ITERATIONS, "Test".to_owned(), "{}".to_owned()); let signature = account.unwrap().sign(&password, &message).unwrap(); assert!(verify_public(keypair.public(), &signature, &message).unwrap()); } @@ -190,10 +223,9 @@ mod tests { let keypair = Random.generate().unwrap(); let first_password = "hello world".into(); let sec_password = "this is sparta".into(); - let i = 10240; let message = Message::default(); - let account = SafeAccount::create(&keypair, [0u8; 16], &first_password, i, "Test".to_owned(), "{}".to_owned()).unwrap(); - let new_account = account.change_password(&first_password, &sec_password, i).unwrap(); + let account = SafeAccount::create(&keypair, [0u8; 16], &first_password, *ITERATIONS, "Test".to_owned(), "{}".to_owned()).unwrap(); + let new_account = account.change_password(&first_password, &sec_password, *ITERATIONS).unwrap(); assert!(account.sign(&first_password, &message).is_ok()); assert!(account.sign(&sec_password, &message).is_err()); assert!(new_account.sign(&first_password, &message).is_err()); diff --git a/ethstore/src/account/version.rs b/accounts/ethstore/src/account/version.rs similarity index 71% rename from ethstore/src/account/version.rs rename to accounts/ethstore/src/account/version.rs index d206a2c12d7..3048b95b0a1 100644 --- a/ethstore/src/account/version.rs +++ b/accounts/ethstore/src/account/version.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use json; diff --git a/ethstore/src/accounts_dir/disk.rs b/accounts/ethstore/src/accounts_dir/disk.rs similarity index 92% rename from ethstore/src/accounts_dir/disk.rs rename to accounts/ethstore/src/accounts_dir/disk.rs index cf4841e7489..00c59b254d2 100644 --- a/ethstore/src/accounts_dir/disk.rs +++ b/accounts/ethstore/src/accounts_dir/disk.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::{fs, io}; use std::io::Write; @@ -23,6 +23,7 @@ use {json, SafeAccount, Error}; use json::Uuid; use super::{KeyDirectory, VaultKeyDirectory, VaultKeyDirectoryProvider, VaultKey}; use super::vault::{VAULT_FILE_NAME, VaultDiskDirectory}; +use ethkey::Password; const IGNORED_FILES: &'static [&'static str] = &[ "thumbs.db", @@ -106,6 +107,7 @@ pub type RootDiskDirectory = DiskDirectory; pub trait KeyFileManager: Send + Sync { /// Read `SafeAccount` from given key file stream fn read(&self, filename: Option, reader: T) -> Result where T: io::Read; + /// Write `SafeAccount` to given key file stream fn write(&self, account: SafeAccount, writer: &mut T) -> Result<(), Error> where T: io::Write; } @@ -117,7 +119,10 @@ pub struct DiskDirectory where T: KeyFileManager { } /// Keys file manager for root keys directory -pub struct DiskKeyFileManager; +#[derive(Default)] +pub struct DiskKeyFileManager { + password: Option, +} impl RootDiskDirectory { pub fn create

(path: P) -> Result where P: AsRef { @@ -125,8 +130,13 @@ impl RootDiskDirectory { Ok(Self::at(path)) } + /// allows to read keyfiles with given password (needed for keyfiles w/o address) + pub fn with_password(&self, password: Option) -> Self { + DiskDirectory::new(&self.path, DiskKeyFileManager { password }) + } + pub fn at

(path: P) -> Self where P: AsRef { - DiskDirectory::new(path, DiskKeyFileManager) + DiskDirectory::new(path, DiskKeyFileManager::default()) } } @@ -319,7 +329,7 @@ impl VaultKeyDirectoryProvider for DiskDirectory where T: KeyFileManager { impl KeyFileManager for DiskKeyFileManager { fn read(&self, filename: Option, reader: T) -> Result where T: io::Read { let key_file = json::KeyFile::load(reader).map_err(|e| Error::Custom(format!("{:?}", e)))?; - Ok(SafeAccount::from_file(key_file, filename)) + SafeAccount::from_file(key_file, filename, &self.password) } fn write(&self, mut account: SafeAccount, writer: &mut T) -> Result<(), Error> where T: io::Write { @@ -346,11 +356,16 @@ mod test { extern crate tempdir; use std::{env, fs}; + use std::num::NonZeroU32; use super::{KeyDirectory, RootDiskDirectory, VaultKey}; use account::SafeAccount; use ethkey::{Random, Generator}; use self::tempdir::TempDir; + lazy_static! { + static ref ITERATIONS: NonZeroU32 = NonZeroU32::new(1024).expect("1024 > 0; qed"); + } + #[test] fn should_create_new_account() { // given @@ -361,7 +376,7 @@ mod test { let directory = RootDiskDirectory::create(dir.clone()).unwrap(); // when - let account = SafeAccount::create(&keypair, [0u8; 16], &password, 1024, "Test".to_owned(), "{}".to_owned()); + let account = SafeAccount::create(&keypair, [0u8; 16], &password, *ITERATIONS, "Test".to_owned(), "{}".to_owned()); let res = directory.insert(account.unwrap()); // then @@ -382,7 +397,7 @@ mod test { let directory = RootDiskDirectory::create(dir.clone()).unwrap(); // when - let account = SafeAccount::create(&keypair, [0u8; 16], &password, 1024, "Test".to_owned(), "{}".to_owned()).unwrap(); + let account = SafeAccount::create(&keypair, [0u8; 16], &password, *ITERATIONS, "Test".to_owned(), "{}".to_owned()).unwrap(); let filename = "test".to_string(); let dedup = true; @@ -418,7 +433,7 @@ mod test { // and when let before_root_items_count = fs::read_dir(&dir).unwrap().count(); - let vault = directory.as_vault_provider().unwrap().create(vault_name, VaultKey::new(&password, 1024)); + let vault = directory.as_vault_provider().unwrap().create(vault_name, VaultKey::new(&password, *ITERATIONS)); // then assert!(vault.is_ok()); @@ -426,7 +441,7 @@ mod test { assert!(after_root_items_count > before_root_items_count); // and when - let vault = directory.as_vault_provider().unwrap().open(vault_name, VaultKey::new(&password, 1024)); + let vault = directory.as_vault_provider().unwrap().open(vault_name, VaultKey::new(&password, *ITERATIONS)); // then assert!(vault.is_ok()); @@ -443,8 +458,9 @@ mod test { let temp_path = TempDir::new("").unwrap(); let directory = RootDiskDirectory::create(&temp_path).unwrap(); let vault_provider = directory.as_vault_provider().unwrap(); - vault_provider.create("vault1", VaultKey::new(&"password1".into(), 1)).unwrap(); - vault_provider.create("vault2", VaultKey::new(&"password2".into(), 1)).unwrap(); + let iter = NonZeroU32::new(1).expect("1 > 0; qed"); + vault_provider.create("vault1", VaultKey::new(&"password1".into(), iter)).unwrap(); + vault_provider.create("vault2", VaultKey::new(&"password2".into(), iter)).unwrap(); // then let vaults = vault_provider.list_vaults().unwrap(); @@ -466,7 +482,7 @@ mod test { let keypair = Random.generate().unwrap(); let password = "test pass".into(); - let account = SafeAccount::create(&keypair, [0u8; 16], &password, 1024, "Test".to_owned(), "{}".to_owned()); + let account = SafeAccount::create(&keypair, [0u8; 16], &password, *ITERATIONS, "Test".to_owned(), "{}".to_owned()); directory.insert(account.unwrap()).expect("Account should be inserted ok"); let new_hash = directory.files_hash().expect("New files hash should be calculated ok"); diff --git a/ethstore/src/accounts_dir/memory.rs b/accounts/ethstore/src/accounts_dir/memory.rs similarity index 87% rename from ethstore/src/accounts_dir/memory.rs rename to accounts/ethstore/src/accounts_dir/memory.rs index 71ddfa536e3..617e7bcb024 100644 --- a/ethstore/src/accounts_dir/memory.rs +++ b/accounts/ethstore/src/accounts_dir/memory.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::HashMap; use parking_lot::RwLock; diff --git a/ethstore/src/accounts_dir/mod.rs b/accounts/ethstore/src/accounts_dir/mod.rs similarity index 87% rename from ethstore/src/accounts_dir/mod.rs rename to accounts/ethstore/src/accounts_dir/mod.rs index 1191a73d2de..9b1328e115a 100644 --- a/ethstore/src/accounts_dir/mod.rs +++ b/accounts/ethstore/src/accounts_dir/mod.rs @@ -1,22 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Accounts Directory use ethkey::Password; +use std::num::NonZeroU32; use std::path::{PathBuf}; use {SafeAccount, Error}; @@ -41,7 +42,7 @@ pub struct VaultKey { /// Vault password pub password: Password, /// Number of iterations to produce a derived key from password - pub iterations: u32, + pub iterations: NonZeroU32, } /// Keys directory @@ -96,7 +97,7 @@ pub use self::vault::VaultDiskDirectory; impl VaultKey { /// Create new vault key - pub fn new(password: &Password, iterations: u32) -> Self { + pub fn new(password: &Password, iterations: NonZeroU32) -> Self { VaultKey { password: password.clone(), iterations: iterations, diff --git a/ethstore/src/accounts_dir/vault.rs b/accounts/ethstore/src/accounts_dir/vault.rs similarity index 94% rename from ethstore/src/accounts_dir/vault.rs rename to accounts/ethstore/src/accounts_dir/vault.rs index 0cba3368979..c54de7c12c1 100644 --- a/ethstore/src/accounts_dir/vault.rs +++ b/accounts/ethstore/src/accounts_dir/vault.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::{fs, io}; use std::path::{PathBuf, Path}; @@ -282,11 +282,17 @@ mod test { use std::fs; use std::io::Write; + use std::num::NonZeroU32; use std::path::PathBuf; use super::VaultKey; use super::{VAULT_FILE_NAME, check_vault_name, make_vault_dir_path, create_vault_file, read_vault_file, VaultDiskDirectory}; use self::tempdir::TempDir; + + lazy_static! { + static ref ITERATIONS: NonZeroU32 = NonZeroU32::new(1024).expect("1024 > 0; qed"); + } + #[test] fn check_vault_name_succeeds() { assert!(check_vault_name("vault")); @@ -325,7 +331,7 @@ mod test { fn create_vault_file_succeeds() { // given let temp_path = TempDir::new("").unwrap(); - let key = VaultKey::new(&"password".into(), 1024); + let key = VaultKey::new(&"password".into(), *ITERATIONS); let mut vault_dir: PathBuf = temp_path.path().into(); vault_dir.push("vault"); fs::create_dir_all(&vault_dir).unwrap(); @@ -344,7 +350,7 @@ mod test { fn read_vault_file_succeeds() { // given let temp_path = TempDir::new("").unwrap(); - let key = VaultKey::new(&"password".into(), 1024); + let key = VaultKey::new(&"password".into(), *ITERATIONS); let vault_file_contents = r#"{"crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"758696c8dc6378ab9b25bb42790da2f5"},"ciphertext":"54eb50683717d41caaeb12ea969f2c159daada5907383f26f327606a37dc7168","kdf":"pbkdf2","kdfparams":{"c":1024,"dklen":32,"prf":"hmac-sha256","salt":"3c320fa566a1a7963ac8df68a19548d27c8f40bf92ef87c84594dcd5bbc402b6"},"mac":"9e5c2314c2a0781962db85611417c614bd6756666b6b1e93840f5b6ed895f003"}}"#; let dir: PathBuf = temp_path.path().into(); let mut vault_file_path: PathBuf = dir.clone(); @@ -365,7 +371,7 @@ mod test { fn read_vault_file_fails() { // given let temp_path = TempDir::new("").unwrap(); - let key = VaultKey::new(&"password1".into(), 1024); + let key = VaultKey::new(&"password1".into(), *ITERATIONS); let dir: PathBuf = temp_path.path().into(); let mut vault_file_path: PathBuf = dir.clone(); vault_file_path.push(VAULT_FILE_NAME); @@ -394,7 +400,7 @@ mod test { fn vault_directory_can_be_created() { // given let temp_path = TempDir::new("").unwrap(); - let key = VaultKey::new(&"password".into(), 1024); + let key = VaultKey::new(&"password".into(), *ITERATIONS); let dir: PathBuf = temp_path.path().into(); // when @@ -414,7 +420,7 @@ mod test { fn vault_directory_cannot_be_created_if_already_exists() { // given let temp_path = TempDir::new("").unwrap(); - let key = VaultKey::new(&"password".into(), 1024); + let key = VaultKey::new(&"password".into(), *ITERATIONS); let dir: PathBuf = temp_path.path().into(); let mut vault_dir = dir.clone(); vault_dir.push("vault"); @@ -431,7 +437,7 @@ mod test { fn vault_directory_cannot_be_opened_if_not_exists() { // given let temp_path = TempDir::new("").unwrap(); - let key = VaultKey::new(&"password".into(), 1024); + let key = VaultKey::new(&"password".into(), *ITERATIONS); let dir: PathBuf = temp_path.path().into(); // when diff --git a/ethstore/src/error.rs b/accounts/ethstore/src/error.rs similarity index 91% rename from ethstore/src/error.rs rename to accounts/ethstore/src/error.rs index 6a2c257633a..fceaf16768b 100644 --- a/ethstore/src/error.rs +++ b/accounts/ethstore/src/error.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use std::io::Error as IoError; diff --git a/ethstore/src/ethkey.rs b/accounts/ethstore/src/ethkey.rs similarity index 74% rename from ethstore/src/ethkey.rs rename to accounts/ethstore/src/ethkey.rs index 34e89a4fb58..8cd2c533adc 100644 --- a/ethstore/src/ethkey.rs +++ b/accounts/ethstore/src/ethkey.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! ethkey reexport to make documentation look pretty. pub use _ethkey::*; diff --git a/ethstore/src/ethstore.rs b/accounts/ethstore/src/ethstore.rs similarity index 98% rename from ethstore/src/ethstore.rs rename to accounts/ethstore/src/ethstore.rs index 2deafbad667..92eb949673f 100644 --- a/ethstore/src/ethstore.rs +++ b/accounts/ethstore/src/ethstore.rs @@ -1,26 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::{BTreeMap, HashMap}; +use std::num::NonZeroU32; use std::mem; use std::path::PathBuf; use parking_lot::{Mutex, RwLock}; use std::time::{Instant, Duration}; -use crypto::KEY_ITERATIONS; use random::Random; use ethkey::{self, Signature, Password, Address, Message, Secret, Public, KeyPair, ExtendedKeyPair}; use accounts_dir::{KeyDirectory, VaultKeyDirectory, VaultKey, SetKeyError}; @@ -29,6 +29,12 @@ use presale::PresaleWallet; use json::{self, Uuid, OpaqueKeyFile}; use {import, Error, SimpleSecretStore, SecretStore, SecretVaultRef, StoreAccountRef, Derivation, OpaqueSecret}; + +lazy_static! { + static ref KEY_ITERATIONS: NonZeroU32 = + NonZeroU32::new(crypto::KEY_ITERATIONS as u32).expect("KEY_ITERATIONS > 0; qed"); +} + /// Accounts store. pub struct EthStore { store: EthMultiStore, @@ -37,11 +43,11 @@ pub struct EthStore { impl EthStore { /// Open a new accounts store with given key directory backend. pub fn open(directory: Box) -> Result { - Self::open_with_iterations(directory, KEY_ITERATIONS as u32) + Self::open_with_iterations(directory, *KEY_ITERATIONS) } /// Open a new account store with given key directory backend and custom number of iterations. - pub fn open_with_iterations(directory: Box, iterations: u32) -> Result { + pub fn open_with_iterations(directory: Box, iterations: NonZeroU32) -> Result { Ok(EthStore { store: EthMultiStore::open_with_iterations(directory, iterations)?, }) @@ -168,7 +174,7 @@ impl SecretStore for EthStore { fn import_wallet(&self, vault: SecretVaultRef, json: &[u8], password: &Password, gen_id: bool) -> Result { let json_keyfile = json::KeyFile::load(json).map_err(|_| Error::InvalidKeyFile("Invalid JSON format".to_owned()))?; - let mut safe_account = SafeAccount::from_file(json_keyfile, None); + let mut safe_account = SafeAccount::from_file(json_keyfile, None, &None)?; if gen_id { safe_account.id = Random::random(); @@ -257,7 +263,7 @@ impl SecretStore for EthStore { /// Similar to `EthStore` but may store many accounts (with different passwords) for the same `Address` pub struct EthMultiStore { dir: Box, - iterations: u32, + iterations: NonZeroU32, // order lock: cache, then vaults cache: RwLock>>, vaults: Mutex>>, @@ -273,11 +279,11 @@ struct Timestamp { impl EthMultiStore { /// Open new multi-accounts store with given key directory backend. pub fn open(directory: Box) -> Result { - Self::open_with_iterations(directory, KEY_ITERATIONS as u32) + Self::open_with_iterations(directory, *KEY_ITERATIONS) } /// Open new multi-accounts store with given key directory backend and custom number of iterations for new keys. - pub fn open_with_iterations(directory: Box, iterations: u32) -> Result { + pub fn open_with_iterations(directory: Box, iterations: NonZeroU32) -> Result { let store = EthMultiStore { dir: directory, vaults: Mutex::new(HashMap::new()), diff --git a/ethstore/src/import.rs b/accounts/ethstore/src/import.rs similarity index 83% rename from ethstore/src/import.rs rename to accounts/ethstore/src/import.rs index 876119fd50a..87e9783eae7 100644 --- a/ethstore/src/import.rs +++ b/accounts/ethstore/src/import.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::HashSet; use std::path::Path; @@ -25,7 +25,7 @@ use Error; /// Import an account from a file. pub fn import_account(path: &Path, dst: &KeyDirectory) -> Result { - let key_manager = DiskKeyFileManager; + let key_manager = DiskKeyFileManager::default(); let existing_accounts = dst.load()?.into_iter().map(|a| a.address).collect::>(); let filename = path.file_name().and_then(|n| n.to_str()).map(|f| f.to_owned()); let account = fs::File::open(&path) @@ -42,7 +42,9 @@ pub fn import_account(path: &Path, dst: &KeyDirectory) -> Result /// Import all accounts from one directory to the other. pub fn import_accounts(src: &KeyDirectory, dst: &KeyDirectory) -> Result, Error> { let accounts = src.load()?; - let existing_accounts = dst.load()?.into_iter().map(|a| a.address).collect::>(); + let existing_accounts = dst.load()?.into_iter() + .map(|a| a.address) + .collect::>(); accounts.into_iter() .filter(|a| !existing_accounts.contains(&a.address)) diff --git a/ethstore/src/json/bytes.rs b/accounts/ethstore/src/json/bytes.rs similarity index 84% rename from ethstore/src/json/bytes.rs rename to accounts/ethstore/src/json/bytes.rs index b5aae19222a..71391d8d185 100644 --- a/ethstore/src/json/bytes.rs +++ b/accounts/ethstore/src/json/bytes.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::{ops, str}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; diff --git a/ethstore/src/json/cipher.rs b/accounts/ethstore/src/json/cipher.rs similarity index 88% rename from ethstore/src/json/cipher.rs rename to accounts/ethstore/src/json/cipher.rs index 6fffdde9e2a..38d897b64b0 100644 --- a/ethstore/src/json/cipher.rs +++ b/accounts/ethstore/src/json/cipher.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use serde::{Serialize, Serializer, Deserialize, Deserializer}; diff --git a/ethstore/src/json/crypto.rs b/accounts/ethstore/src/json/crypto.rs similarity index 90% rename from ethstore/src/json/crypto.rs rename to accounts/ethstore/src/json/crypto.rs index 0a926cc83fe..34664f98b0e 100644 --- a/ethstore/src/json/crypto.rs +++ b/accounts/ethstore/src/json/crypto.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::{fmt, str}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -52,6 +52,7 @@ enum CryptoField { Kdf, KdfParams, Mac, + Version, } impl<'a> Deserialize<'a> for CryptoField { @@ -81,6 +82,7 @@ impl<'a> Visitor<'a> for CryptoFieldVisitor { "kdf" => Ok(CryptoField::Kdf), "kdfparams" => Ok(CryptoField::KdfParams), "mac" => Ok(CryptoField::Mac), + "version" => Ok(CryptoField::Version), _ => Err(Error::custom(format!("Unknown field: '{}'", value))), } } @@ -122,6 +124,8 @@ impl<'a> Visitor<'a> for CryptoVisitor { Some(CryptoField::Kdf) => { kdf = Some(visitor.next_value()?); } Some(CryptoField::KdfParams) => { kdfparams = Some(visitor.next_value()?); } Some(CryptoField::Mac) => { mac = Some(visitor.next_value()?); } + // skip not required version field (it appears in pyethereum generated keystores) + Some(CryptoField::Version) => { visitor.next_value().unwrap_or(()) } None => { break; } } } diff --git a/ethstore/src/json/error.rs b/accounts/ethstore/src/json/error.rs similarity index 80% rename from ethstore/src/json/error.rs rename to accounts/ethstore/src/json/error.rs index 81b805bfe2c..e02ecb9633a 100644 --- a/ethstore/src/json/error.rs +++ b/accounts/ethstore/src/json/error.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; diff --git a/ethstore/src/json/hash.rs b/accounts/ethstore/src/json/hash.rs similarity index 90% rename from ethstore/src/json/hash.rs rename to accounts/ethstore/src/json/hash.rs index c2ad547734f..6678abb73a4 100644 --- a/ethstore/src/json/hash.rs +++ b/accounts/ethstore/src/json/hash.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::{ops, fmt, str}; use rustc_hex::{FromHex, ToHex}; diff --git a/ethstore/src/json/id.rs b/accounts/ethstore/src/json/id.rs similarity index 91% rename from ethstore/src/json/id.rs rename to accounts/ethstore/src/json/id.rs index 7df5c8f7e5a..27550428fa1 100644 --- a/ethstore/src/json/id.rs +++ b/accounts/ethstore/src/json/id.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Universaly unique identifier. use std::{fmt, str}; diff --git a/ethstore/src/json/kdf.rs b/accounts/ethstore/src/json/kdf.rs similarity index 89% rename from ethstore/src/json/kdf.rs rename to accounts/ethstore/src/json/kdf.rs index f8df3c2285f..a8bb8b261ce 100644 --- a/ethstore/src/json/kdf.rs +++ b/accounts/ethstore/src/json/kdf.rs @@ -1,23 +1,24 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; +use std::num::NonZeroU32; use serde::{Serialize, Serializer, Deserialize, Deserializer}; use serde::de::{Visitor, Error as SerdeError}; -use super::{Error, H256}; +use super::{Error, Bytes}; #[derive(Debug, PartialEq)] pub enum KdfSer { @@ -108,10 +109,10 @@ impl<'a> Visitor<'a> for PrfVisitor { #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Pbkdf2 { - pub c: u32, + pub c: NonZeroU32, pub dklen: u32, pub prf: Prf, - pub salt: H256, + pub salt: Bytes, } #[derive(Debug, PartialEq, Serialize, Deserialize)] @@ -120,7 +121,7 @@ pub struct Scrypt { pub p: u32, pub n: u32, pub r: u32, - pub salt: H256, + pub salt: Bytes, } #[derive(Debug, PartialEq)] diff --git a/ethstore/src/json/key_file.rs b/accounts/ethstore/src/json/key_file.rs similarity index 93% rename from ethstore/src/json/key_file.rs rename to accounts/ethstore/src/json/key_file.rs index 2c3cf3fdd5d..60c3ae859f3 100644 --- a/ethstore/src/json/key_file.rs +++ b/accounts/ethstore/src/json/key_file.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use std::io::{Read, Write}; @@ -46,7 +46,7 @@ pub struct KeyFile { pub id: Uuid, pub version: Version, pub crypto: Crypto, - pub address: H160, + pub address: Option, pub name: Option, pub meta: Option, } @@ -158,11 +158,6 @@ impl<'a> Visitor<'a> for KeyFileVisitor { None => return Err(V::Error::missing_field("crypto")), }; - let address = match address { - Some(address) => address, - None => return Err(V::Error::missing_field("address")), - }; - let result = KeyFile { id: id, version: version, @@ -222,7 +217,7 @@ mod tests { let expected = KeyFile { id: Uuid::from_str("8777d9f6-7860-4b9b-88b7-0b57ee6b3a73").unwrap(), version: Version::V3, - address: "6edddfc6349aff20bc6467ccf276c5b52487f7a8".into(), + address: Some("6edddfc6349aff20bc6467ccf276c5b52487f7a8".into()), crypto: Crypto { cipher: Cipher::Aes128Ctr(Aes128Ctr { iv: "b5a7ec855ec9e2c405371356855fec83".into(), @@ -273,7 +268,7 @@ mod tests { let expected = KeyFile { id: "8777d9f6-7860-4b9b-88b7-0b57ee6b3a73".into(), version: Version::V3, - address: "6edddfc6349aff20bc6467ccf276c5b52487f7a8".into(), + address: Some("6edddfc6349aff20bc6467ccf276c5b52487f7a8".into()), crypto: Crypto { cipher: Cipher::Aes128Ctr(Aes128Ctr { iv: "b5a7ec855ec9e2c405371356855fec83".into(), @@ -301,7 +296,7 @@ mod tests { let file = KeyFile { id: "8777d9f6-7860-4b9b-88b7-0b57ee6b3a73".into(), version: Version::V3, - address: "6edddfc6349aff20bc6467ccf276c5b52487f7a8".into(), + address: Some("6edddfc6349aff20bc6467ccf276c5b52487f7a8".into()), crypto: Crypto { cipher: Cipher::Aes128Ctr(Aes128Ctr { iv: "b5a7ec855ec9e2c405371356855fec83".into(), diff --git a/ethstore/src/json/mod.rs b/accounts/ethstore/src/json/mod.rs similarity index 79% rename from ethstore/src/json/mod.rs rename to accounts/ethstore/src/json/mod.rs index e39bff651e4..2b6348aae2e 100644 --- a/ethstore/src/json/mod.rs +++ b/accounts/ethstore/src/json/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Contract interface specification. diff --git a/ethstore/src/json/presale.rs b/accounts/ethstore/src/json/presale.rs similarity index 93% rename from ethstore/src/json/presale.rs rename to accounts/ethstore/src/json/presale.rs index 478f328a43a..70568d510f3 100644 --- a/ethstore/src/json/presale.rs +++ b/accounts/ethstore/src/json/presale.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io::Read; use serde_json; diff --git a/ethstore/src/json/vault_file.rs b/accounts/ethstore/src/json/vault_file.rs similarity index 83% rename from ethstore/src/json/vault_file.rs rename to accounts/ethstore/src/json/vault_file.rs index e9620442272..0da870931d6 100644 --- a/ethstore/src/json/vault_file.rs +++ b/accounts/ethstore/src/json/vault_file.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io::{Read, Write}; use serde_json; @@ -41,6 +41,11 @@ impl VaultFile { mod test { use serde_json; use json::{VaultFile, Crypto, Cipher, Aes128Ctr, Kdf, Pbkdf2, Prf}; + use std::num::NonZeroU32; + + lazy_static! { + static ref ITERATIONS: NonZeroU32 = NonZeroU32::new(1024).expect("1024 > 0; qed"); + } #[test] fn to_and_from_json() { @@ -51,7 +56,7 @@ mod test { }), ciphertext: "4d6938a1f49b7782".into(), kdf: Kdf::Pbkdf2(Pbkdf2 { - c: 1024, + c: *ITERATIONS, dklen: 32, prf: Prf::HmacSha256, salt: "b6a9338a7ccd39288a86dba73bfecd9101b4f3db9c9830e7c76afdbd4f6872e5".into(), @@ -76,7 +81,7 @@ mod test { }), ciphertext: "4d6938a1f49b7782".into(), kdf: Kdf::Pbkdf2(Pbkdf2 { - c: 1024, + c: *ITERATIONS, dklen: 32, prf: Prf::HmacSha256, salt: "b6a9338a7ccd39288a86dba73bfecd9101b4f3db9c9830e7c76afdbd4f6872e5".into(), diff --git a/ethstore/src/json/vault_key_file.rs b/accounts/ethstore/src/json/vault_key_file.rs similarity index 91% rename from ethstore/src/json/vault_key_file.rs rename to accounts/ethstore/src/json/vault_key_file.rs index 818487d52b6..dd4ba497988 100644 --- a/ethstore/src/json/vault_key_file.rs +++ b/accounts/ethstore/src/json/vault_key_file.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io::{Read, Write}; use serde::de::Error; @@ -106,6 +106,11 @@ mod test { use serde_json; use json::{VaultKeyFile, Version, Crypto, Cipher, Aes128Ctr, Kdf, Pbkdf2, Prf, insert_vault_name_to_json_meta, remove_vault_name_from_json_meta}; + use std::num::NonZeroU32; + + lazy_static! { + static ref ITERATIONS: NonZeroU32 = NonZeroU32::new(10240).expect("10240 > 0; qed"); + } #[test] fn to_and_from_json() { @@ -118,7 +123,7 @@ mod test { }), ciphertext: "4befe0a66d9a4b6fec8e39eb5c90ac5dafdeaab005fff1af665fd1f9af925c91".into(), kdf: Kdf::Pbkdf2(Pbkdf2 { - c: 10240, + c: *ITERATIONS, dklen: 32, prf: Prf::HmacSha256, salt: "f17731e84ecac390546692dbd4ccf6a3a2720dc9652984978381e61c28a471b2".into(), @@ -131,7 +136,7 @@ mod test { }), ciphertext: "fef0d113d7576c1702daf380ad6f4c5408389e57991cae2a174facd74bd549338e1014850bddbab7eb486ff5f5c9c5532800c6a6d4db2be2212cd5cd3769244ab230e1f369e8382a9e6d7c0a".into(), kdf: Kdf::Pbkdf2(Pbkdf2 { - c: 10240, + c: *ITERATIONS, dklen: 32, prf: Prf::HmacSha256, salt: "aca82865174a82249a198814b263f43a631f272cbf7ed329d0f0839d259c652a".into(), diff --git a/ethstore/src/json/version.rs b/accounts/ethstore/src/json/version.rs similarity index 81% rename from ethstore/src/json/version.rs rename to accounts/ethstore/src/json/version.rs index 683d4a520fa..cd8439c59f2 100644 --- a/ethstore/src/json/version.rs +++ b/accounts/ethstore/src/json/version.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use serde::{Serialize, Serializer, Deserialize, Deserializer}; diff --git a/ethstore/src/lib.rs b/accounts/ethstore/src/lib.rs similarity index 82% rename from ethstore/src/lib.rs rename to accounts/ethstore/src/lib.rs index ad58bd0e984..c0955caeb0d 100644 --- a/ethstore/src/lib.rs +++ b/accounts/ethstore/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Ethereum key-management. @@ -36,6 +36,8 @@ extern crate ethereum_types; extern crate ethkey as _ethkey; extern crate parity_wordlist; +#[macro_use] +extern crate lazy_static; #[macro_use] extern crate log; #[macro_use] diff --git a/ethstore/src/presale.rs b/accounts/ethstore/src/presale.rs similarity index 85% rename from ethstore/src/presale.rs rename to accounts/ethstore/src/presale.rs index 7ffde7973c6..8ca5d0b98bb 100644 --- a/ethstore/src/presale.rs +++ b/accounts/ethstore/src/presale.rs @@ -1,20 +1,21 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fs; +use std::num::NonZeroU32; use std::path::Path; use json; use ethkey::{Address, Secret, KeyPair, Password}; @@ -58,7 +59,8 @@ impl PresaleWallet { let mut derived_key = [0u8; 32]; let salt = pbkdf2::Salt(password.as_bytes()); let sec = pbkdf2::Secret(password.as_bytes()); - pbkdf2::sha256(2000, salt, sec, &mut derived_key); + let iter = NonZeroU32::new(2000).expect("2000 > 0; qed"); + pbkdf2::sha256(iter, salt, sec, &mut derived_key); let mut key = vec![0; self.ciphertext.len()]; let len = crypto::aes::decrypt_128_cbc(&derived_key[0..16], &self.iv, &self.ciphertext, &mut key) diff --git a/ethstore/src/random.rs b/accounts/ethstore/src/random.rs similarity index 77% rename from ethstore/src/random.rs rename to accounts/ethstore/src/random.rs index b8b7a71fa8b..969c8a366d5 100644 --- a/ethstore/src/random.rs +++ b/accounts/ethstore/src/random.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use rand::{Rng, OsRng}; diff --git a/ethstore/src/secret_store.rs b/accounts/ethstore/src/secret_store.rs similarity index 96% rename from ethstore/src/secret_store.rs rename to accounts/ethstore/src/secret_store.rs index b8417bc61c4..5571f83c0cd 100644 --- a/ethstore/src/secret_store.rs +++ b/accounts/ethstore/src/secret_store.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::hash::{Hash, Hasher}; use std::path::PathBuf; diff --git a/ethstore/tests/api.rs b/accounts/ethstore/tests/api.rs similarity index 94% rename from ethstore/tests/api.rs rename to accounts/ethstore/tests/api.rs index 11ab4f8edda..c274737522b 100644 --- a/ethstore/tests/api.rs +++ b/accounts/ethstore/tests/api.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate rand; extern crate ethstore; diff --git a/ethstore/tests/res/ciphertext/30.json b/accounts/ethstore/tests/res/ciphertext/30.json similarity index 100% rename from ethstore/tests/res/ciphertext/30.json rename to accounts/ethstore/tests/res/ciphertext/30.json diff --git a/ethstore/tests/res/ciphertext/31.json b/accounts/ethstore/tests/res/ciphertext/31.json similarity index 100% rename from ethstore/tests/res/ciphertext/31.json rename to accounts/ethstore/tests/res/ciphertext/31.json diff --git a/ethstore/tests/res/geth_keystore/UTC--2016-02-17T09-20-45.721400158Z--3f49624084b67849c7b4e805c5988c21a430f9d9 b/accounts/ethstore/tests/res/geth_keystore/UTC--2016-02-17T09-20-45.721400158Z--3f49624084b67849c7b4e805c5988c21a430f9d9 similarity index 100% rename from ethstore/tests/res/geth_keystore/UTC--2016-02-17T09-20-45.721400158Z--3f49624084b67849c7b4e805c5988c21a430f9d9 rename to accounts/ethstore/tests/res/geth_keystore/UTC--2016-02-17T09-20-45.721400158Z--3f49624084b67849c7b4e805c5988c21a430f9d9 diff --git a/ethstore/tests/res/geth_keystore/UTC--2016-02-20T09-33-03.984382741Z--5ba4dcf897e97c2bdf8315b9ef26c13c085988cf b/accounts/ethstore/tests/res/geth_keystore/UTC--2016-02-20T09-33-03.984382741Z--5ba4dcf897e97c2bdf8315b9ef26c13c085988cf similarity index 100% rename from ethstore/tests/res/geth_keystore/UTC--2016-02-20T09-33-03.984382741Z--5ba4dcf897e97c2bdf8315b9ef26c13c085988cf rename to accounts/ethstore/tests/res/geth_keystore/UTC--2016-02-20T09-33-03.984382741Z--5ba4dcf897e97c2bdf8315b9ef26c13c085988cf diff --git a/ethstore/tests/res/geth_keystore/UTC--2016-04-03T08-58-49.834202900Z--63121b431a52f8043c16fcf0d1df9cb7b5f66649 b/accounts/ethstore/tests/res/geth_keystore/UTC--2016-04-03T08-58-49.834202900Z--63121b431a52f8043c16fcf0d1df9cb7b5f66649 similarity index 100% rename from ethstore/tests/res/geth_keystore/UTC--2016-04-03T08-58-49.834202900Z--63121b431a52f8043c16fcf0d1df9cb7b5f66649 rename to accounts/ethstore/tests/res/geth_keystore/UTC--2016-04-03T08-58-49.834202900Z--63121b431a52f8043c16fcf0d1df9cb7b5f66649 diff --git a/ethstore/tests/res/pat/p1.json b/accounts/ethstore/tests/res/pat/p1.json similarity index 100% rename from ethstore/tests/res/pat/p1.json rename to accounts/ethstore/tests/res/pat/p1.json diff --git a/ethstore/tests/res/pat/p2.json b/accounts/ethstore/tests/res/pat/p2.json similarity index 100% rename from ethstore/tests/res/pat/p2.json rename to accounts/ethstore/tests/res/pat/p2.json diff --git a/ethstore/tests/util/mod.rs b/accounts/ethstore/tests/util/mod.rs similarity index 61% rename from ethstore/tests/util/mod.rs rename to accounts/ethstore/tests/util/mod.rs index 1a7abc93eff..76500796275 100644 --- a/ethstore/tests/util/mod.rs +++ b/accounts/ethstore/tests/util/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . mod transient_dir; diff --git a/ethstore/tests/util/transient_dir.rs b/accounts/ethstore/tests/util/transient_dir.rs similarity index 85% rename from ethstore/tests/util/transient_dir.rs rename to accounts/ethstore/tests/util/transient_dir.rs index c0969418d8c..67511a9b99b 100644 --- a/ethstore/tests/util/transient_dir.rs +++ b/accounts/ethstore/tests/util/transient_dir.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::path::PathBuf; use std::{env, fs}; diff --git a/util/fake-hardware-wallet/Cargo.toml b/accounts/fake-hardware-wallet/Cargo.toml similarity index 84% rename from util/fake-hardware-wallet/Cargo.toml rename to accounts/fake-hardware-wallet/Cargo.toml index 5325c77330e..5e20d8a6d31 100644 --- a/util/fake-hardware-wallet/Cargo.toml +++ b/accounts/fake-hardware-wallet/Cargo.toml @@ -7,4 +7,4 @@ authors = ["Parity Technologies "] [dependencies] ethereum-types = "0.4" -ethkey = { path = "../../ethkey" } +ethkey = { path = "../../accounts/ethkey" } diff --git a/util/fake-hardware-wallet/src/lib.rs b/accounts/fake-hardware-wallet/src/lib.rs similarity index 87% rename from util/fake-hardware-wallet/src/lib.rs rename to accounts/fake-hardware-wallet/src/lib.rs index 2bf905d7bf7..d04590865cd 100644 --- a/util/fake-hardware-wallet/src/lib.rs +++ b/accounts/fake-hardware-wallet/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Dummy module for platforms that does not provide support for hardware wallets (libusb) diff --git a/hw/Cargo.toml b/accounts/hw/Cargo.toml similarity index 100% rename from hw/Cargo.toml rename to accounts/hw/Cargo.toml diff --git a/hw/src/ledger.rs b/accounts/hw/src/ledger.rs similarity index 90% rename from hw/src/ledger.rs rename to accounts/hw/src/ledger.rs index f9e20654839..9bad48ec545 100644 --- a/hw/src/ledger.rs +++ b/accounts/hw/src/ledger.rs @@ -1,27 +1,27 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Ledger hardware wallet module. Supports Ledger Blue and Nano S. //! See for protocol details. use std::cmp::min; use std::str::FromStr; -use std::sync::{atomic, atomic::AtomicBool, Arc, Weak}; +use std::sync::Arc; use std::time::{Duration, Instant}; -use std::{fmt, thread}; +use std::fmt; use ethereum_types::{H256, Address}; use ethkey::Signature; @@ -29,7 +29,7 @@ use hidapi; use libusb; use parking_lot::{Mutex, RwLock}; use semver::Version as FirmwareVersion; -use super::{WalletInfo, KeyPath, Device, DeviceDirection, Wallet, USB_DEVICE_CLASS_DEVICE, POLLING_DURATION}; +use super::{WalletInfo, KeyPath, Device, DeviceDirection, Wallet, is_valid_hid_device}; const APDU_TAG: u8 = 0x05; const APDU_CLA: u8 = 0xe0; @@ -71,14 +71,14 @@ pub enum Error { KeyNotFound, /// Signing has been cancelled by user. UserCancel, - /// Invalid device - InvalidDevice, /// Impossible error Impossible, /// No device arrived NoDeviceArrived, /// No device left NoDeviceLeft, + /// Invalid PID or VID + InvalidDevice, } impl fmt::Display for Error { @@ -89,10 +89,10 @@ impl fmt::Display for Error { Error::LibUsb(ref e) => write!(f, "LibUSB communication error: {}", e), Error::KeyNotFound => write!(f, "Key not found"), Error::UserCancel => write!(f, "Operation has been cancelled"), - Error::InvalidDevice => write!(f, "Unsupported product was entered"), Error::Impossible => write!(f, "Placeholder error"), Error::NoDeviceArrived => write!(f, "No device arrived"), Error::NoDeviceLeft=> write!(f, "No device left"), + Error::InvalidDevice => write!(f, "Device with non-supported product ID or vendor ID was detected"), } } } @@ -110,7 +110,7 @@ impl From for Error { } /// Ledger device manager. -pub (crate) struct Manager { +pub struct Manager { usb: Arc>, devices: RwLock>, key_path: RwLock, @@ -118,64 +118,35 @@ pub (crate) struct Manager { impl Manager { /// Create a new instance. - pub fn new(hidapi: Arc>, exiting: Arc) -> Result, libusb::Error> { - let manager = Arc::new(Self { - usb: hidapi, + pub fn new(usb: Arc>) -> Arc { + Arc::new(Self { + usb, devices: RwLock::new(Vec::new()), key_path: RwLock::new(KeyPath::Ethereum), - }); - - let usb_context = Arc::new(libusb::Context::new()?); - let m = manager.clone(); - - // Subscribe to all Ledger devices - // This means that we need to check that the given productID is supported - // None => LIBUSB_HOTPLUG_MATCH_ANY, in other words that all are subscribed to - // More info can be found: - usb_context.register_callback( - Some(LEDGER_VID), None, Some(USB_DEVICE_CLASS_DEVICE), - Box::new(EventHandler::new(Arc::downgrade(&manager)))).expect("usb_callback"); - - // Ledger event handler thread - thread::Builder::new() - .spawn(move || { - if let Err(e) = m.update_devices(DeviceDirection::Arrived) { - debug!(target: "hw", "Ledger couldn't connect at startup, error: {}", e); - } - loop { - usb_context.handle_events(Some(Duration::from_millis(500))) - .unwrap_or_else(|e| debug!(target: "hw", "Ledger event handler error: {}", e)); - if exiting.load(atomic::Ordering::Acquire) { - break; - } - } - }) - .ok(); - - Ok(manager) + }) } // Transport Protocol: // * Communication Channel Id (2 bytes big endian ) - // * Command Tag (1 byte) + // * Command Tag (1 byte) // * Packet Sequence ID (2 bytes big endian) - // * Payload (Optional) + // * Payload (Optional) // // Payload - // * APDU Total Length (2 bytes big endian) - // * APDU_CLA (1 byte) - // * APDU_INS (1 byte) - // * APDU_P1 (1 byte) - // * APDU_P2 (1 byte) - // * APDU_LENGTH (1 byte) - // * APDU_Payload (Variable) - // + // * APDU Total Length (2 bytes big endian) + // * APDU_CLA (1 byte) + // * APDU_INS (1 byte) + // * APDU_P1 (1 byte) + // * APDU_P2 (1 byte) + // * APDU_LENGTH (1 byte) + // * APDU_Payload (Variable) + // fn write(handle: &hidapi::HidDevice, command: u8, p1: u8, p2: u8, data: &[u8]) -> Result<(), Error> { let data_len = data.len(); let mut offset = 0; let mut sequence_number = 0; let mut hid_chunk = [0_u8; HID_PACKET_SIZE]; - + while sequence_number == 0 || offset < data_len { let header = if sequence_number == 0 { LEDGER_TRANSPORT_HEADER_LEN + APDU_PAYLOAD_HEADER_LEN } else { LEDGER_TRANSPORT_HEADER_LEN }; let size = min(64 - header, data_len - offset); @@ -203,22 +174,22 @@ impl Manager { } Ok(()) } - + // Transport Protocol: // * Communication Channel Id (2 bytes big endian ) - // * Command Tag (1 byte) + // * Command Tag (1 byte) // * Packet Sequence ID (2 bytes big endian) - // * Payload (Optional) + // * Payload (Optional) // // Payload - // * APDU Total Length (2 bytes big endian) - // * APDU_CLA (1 byte) - // * APDU_INS (1 byte) - // * APDU_P1 (1 byte) - // * APDU_P2 (1 byte) - // * APDU_LENGTH (1 byte) - // * APDU_Payload (Variable) - // + // * APDU Total Length (2 bytes big endian) + // * APDU_CLA (1 byte) + // * APDU_INS (1 byte) + // * APDU_P1 (1 byte) + // * APDU_P2 (1 byte) + // * APDU_LENGTH (1 byte) + // * APDU_Payload (Variable) + // fn read(handle: &hidapi::HidDevice) -> Result, Error> { let mut message_size = 0; let mut message = Vec::new(); @@ -280,18 +251,6 @@ impl Manager { Self::read(&handle) } - fn is_valid_ledger(device: &libusb::Device) -> Result<(), Error> { - let desc = device.device_descriptor()?; - let vendor_id = desc.vendor_id(); - let product_id = desc.product_id(); - - if vendor_id == LEDGER_VID && LEDGER_PIDS.contains(&product_id) { - Ok(()) - } else { - Err(Error::InvalidDevice) - } - } - fn get_firmware_version(handle: &hidapi::HidDevice) -> Result { let ver = Self::send_apdu(&handle, commands::GET_APP_CONFIGURATION, 0, 0, &[])?; if ver.len() != 4 { @@ -306,7 +265,7 @@ impl Manager { KeyPath::EthereumClassic => &ETC_DERIVATION_PATH_BE, } } - + fn signer_helper(&self, address: &Address, data: &[u8], command: u8) -> Result { let usb = self.usb.lock(); let devices = self.devices.read(); @@ -326,14 +285,14 @@ impl Manager { // Copy the address of the key (only done once) chunk[0..derivation_path.len()].copy_from_slice(derivation_path); - + let key_length = derivation_path.len(); let max_payload_size = MAX_CHUNK_SIZE - key_length; let data_len = data.len(); - + let mut result = Vec::new(); let mut offset = 0; - + while offset < data_len { let p1 = if offset == 0 { 0 } else { 0x80 }; let take = min(max_payload_size, data_len - offset); @@ -363,26 +322,14 @@ impl Manager { } } -// Try to connect to the device using polling in at most the time specified by the `timeout` -fn try_connect_polling(ledger: &Manager, timeout: &Duration, device_direction: DeviceDirection) -> bool { - let start_time = Instant::now(); - while start_time.elapsed() <= *timeout { - if let Ok(num_devices) = ledger.update_devices(device_direction) { - trace!(target: "hw", "{} number of Ledger(s) {}", num_devices, device_direction); - return true; - } - } - false -} - -impl <'a>Wallet<'a> for Manager { +impl<'a> Wallet<'a> for Manager { type Error = Error; type Transaction = &'a [u8]; fn sign_transaction(&self, address: &Address, transaction: Self::Transaction) -> Result { self.signer_helper(address, transaction, commands::SIGN_ETH_TRANSACTION) } - + fn set_key_path(&self, key_path: KeyPath) { *self.key_path.write() = key_path; } @@ -393,8 +340,16 @@ impl <'a>Wallet<'a> for Manager { let devices = usb.devices(); let num_prev_devices = self.devices.read().len(); + // Sometimes when a ledger is connected at run-time with no other devices connected it will case a `disconnected` event. + // To work around this, ignore such spurious events and poll a couple of extra times in order to get the correct state. + if DeviceDirection::Left == device_direction && num_prev_devices == 0 { + return Err(Error::NoDeviceArrived); + } + let detected_devices = devices.iter() - .filter(|&d| d.vendor_id == LEDGER_VID && LEDGER_PIDS.contains(&d.product_id)) + .filter(|&d| is_valid_ledger(d.vendor_id, d.product_id) && + is_valid_hid_device(d.usage_page, d.interface_number) + ) .fold(Vec::new(), |mut v, d| { match self.read_device(&usb, &d) { Ok(info) => { @@ -419,7 +374,7 @@ impl <'a>Wallet<'a> for Manager { } DeviceDirection::Left => { if num_prev_devices > num_curr_devices { - Ok(num_prev_devices- num_curr_devices) + Ok(num_prev_devices - num_curr_devices) } else { Err(Error::NoDeviceLeft) } @@ -491,62 +446,42 @@ impl <'a>Wallet<'a> for Manager { } } -/// Ledger event handler -/// A separate thread is handling incoming events -/// -/// Note, that this run to completion and race-conditions can't occur but this can -/// therefore starve other events for being process with a spinlock or similar -struct EventHandler { - ledger: Weak, -} - -impl EventHandler { - /// Ledger event handler constructor - fn new(ledger: Weak) -> Self { - Self { ledger } - } +/// Check if the detected device is a valid `Ledger device` by checking both the product ID and the vendor ID +pub fn is_valid_ledger(vendor_id: u16, product_id: u16) -> bool { + vendor_id == LEDGER_VID && LEDGER_PIDS.contains(&product_id) } -impl libusb::Hotplug for EventHandler { - fn device_arrived(&mut self, device: libusb::Device) { - debug!(target: "hw", "Ledger arrived"); - if let (Some(ledger), Ok(_)) = (self.ledger.upgrade(), Manager::is_valid_ledger(&device)) { - if try_connect_polling(&ledger, &POLLING_DURATION, DeviceDirection::Arrived) != true { - debug!(target: "hw", "No Ledger device was connected"); - } - } - } - - fn device_left(&mut self, device: libusb::Device) { - debug!(target: "hw", "Ledger left"); - if let (Some(ledger), Ok(_)) = (self.ledger.upgrade(), Manager::is_valid_ledger(&device)) { - if try_connect_polling(&ledger, &POLLING_DURATION, DeviceDirection::Left) != true { - debug!(target: "hw", "No Ledger device was disconnected"); - } +/// Poll the device in maximum `max_polling_duration` if it doesn't succeed +pub fn try_connect_polling(ledger: &Manager, max_polling_duration: &Duration, device_direction: DeviceDirection) -> bool { + let start_time = Instant::now(); + while start_time.elapsed() <= *max_polling_duration { + if let Ok(num_devices) = ledger.update_devices(device_direction) { + trace!(target: "hw", "{} number of Ledger(s) {}", num_devices, device_direction); + return true; } } + false } - #[cfg(test)] mod tests { use rustc_hex::FromHex; use super::*; + use ::HardwareWalletManager; /// This test can't be run without an actual ledger device connected with the `Ledger Wallet Ethereum application` running #[test] #[ignore] fn sign_personal_message() { - let manager = Manager::new( - Arc::new(Mutex::new(hidapi::HidApi::new().expect("HidApi"))), - Arc::new(AtomicBool::new(false)) - ).expect("HardwareWalletManager"); + let manager = HardwareWalletManager::new().unwrap(); + + let ledger = &manager.ledger; // Update device list - manager.update_devices(DeviceDirection::Arrived).expect("No Ledger found, make sure you have a unlocked Ledger connected with the Ledger Wallet Ethereum running"); + ledger.update_devices(DeviceDirection::Arrived).expect("No Ledger found, make sure you have a unlocked Ledger connected with the Ledger Wallet Ethereum running"); // Fetch the ethereum address of a connected ledger device - let address = manager.list_devices() + let address = ledger.list_devices() .iter() .filter(|d| d.manufacturer == "Ledger".to_string()) .nth(0) @@ -555,7 +490,7 @@ mod tests { // 44 bytes transaction let tx = FromHex::from_hex("eb018504a817c80082520894a6ca2e6707f2cc189794a9dd459d5b05ed1bcd1c8703f26fcfb7a22480018080").unwrap(); - let signature = manager.sign_transaction(&address, &tx); + let signature = ledger.sign_transaction(&address, &tx); assert!(signature.is_ok()); } @@ -563,38 +498,36 @@ mod tests { #[test] #[ignore] fn smoke() { - let manager = Manager::new( - Arc::new(Mutex::new(hidapi::HidApi::new().expect("HidApi"))), - Arc::new(AtomicBool::new(false)) - ).expect("HardwareWalletManager"); + let manager = HardwareWalletManager::new().unwrap(); + let ledger = &manager.ledger; // Update device list - manager.update_devices(DeviceDirection::Arrived).expect("No Ledger found, make sure you have a unlocked Ledger connected with the Ledger Wallet Ethereum running"); + ledger.update_devices(DeviceDirection::Arrived).expect("No Ledger found, make sure you have a unlocked Ledger connected with the Ledger Wallet Ethereum running"); // Fetch the ethereum address of a connected ledger device - let address = manager.list_devices() + let address = ledger.list_devices() .iter() .filter(|d| d.manufacturer == "Ledger".to_string()) .nth(0) - .map(|d| d.address.clone()) + .map(|d| d.address) .expect("No ledger device detected"); // 44 bytes transaction let tx = FromHex::from_hex("eb018504a817c80082520894a6ca2e6707f2cc189794a9dd459d5b05ed1bcd1c8703f26fcfb7a22480018080").unwrap(); - let signature = manager.sign_transaction(&address, &tx); + let signature = ledger.sign_transaction(&address, &tx); println!("Got {:?}", signature); assert!(signature.is_ok()); // 218 bytes transaction let large_tx = FromHex::from_hex("f86b028511cfc15d00825208940975ca9f986eee35f5cbba2d672ad9bc8d2a08448766c92c5cf830008026a0d2b0d401b543872d2a6a50de92455decbb868440321bf63a13b310c069e2ba5ba03c6d51bcb2e1653be86546b87f8a12ddb45b6d4e568420299b96f64c19701040f86b028511cfc15d00825208940975ca9f986eee35f5cbba2d672ad9bc8d2a08448766c92c5cf830008026a0d2b0d401b543872d2a6a50de92455decbb868440321bf63a13b310c069e2ba5ba03c6d51bcb2e1653be86546b87f8a12ddb45b6d4e568420299b96f64c19701040").unwrap(); - let signature = manager.sign_transaction(&address, &large_tx); + let signature = ledger.sign_transaction(&address, &large_tx); println!("Got {:?}", signature); assert!(signature.is_ok()); // 36206 bytes transaction (You need to confirm many transaction on your `Ledger` for this) let huge_tx = FromHex::from_hex("f86b028511cfc15d00825208940975ca9f986eee35f5cbba2d672ad9bc8d2a08448766c92c5cf830008026a0d2b0d401b543872d2a6a50de92455decbb868440321bf63a13b310c069e2ba5ba03c6d51bcb2e1653be86546b87f8a12ddb45b6d4e568420299b96f64c19701040f86b028511cfc15d00825208940975ca9f986eee35f5cbba2d672ad9bc8d2a08448766c92c5cf830008026a0d2b0d401b543872d2a6a50de92455decbb868440321bf63a13b310c069e2ba5ba03c6d51bcb2e1653be86546b87f8a12ddb45b6d4e568420299b96f64c1970104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7cd58ab9190c2792714ab06df5b67e66d9e3873eed251d7beb4fa252d6fed6a0ab1e5fabd284f40878d38f6e63d72eec55c6e1aa8d79c06adf714e3523a1f83da763f4bcc9d34424aba82981534066379c1cba244352042de13168556be761f8b1000807b6a6cd340b97a93cd850ee54335b1043bac153c1b0736a88919bb1a21d6befba34d9af51a9b3eb39164c64fe88efe62f136d0bc83cad1f963aec6344b9e406f7381ad2462dcf1434c90c426ee907e6a05abe39c2b36d1dfb966bcf5a4de5af9f07819256357489365c96b21d92a103a776b656fc10ad1083cf679d240bf09bf2eb7635d7bfa969ce7fbb4e0cd5835f79ca9f5583e3a9eca219fab2f773d9c7e838a7a9ef8755dc22e4880367c2b5e40795fe526fc5d1461e50d5cb053e001206460fc6617a38499db525112a7edde38b9547853ad6e5ab359233611148f196501deafae414acde9df81efd7c4144b8fd27f63ac252ecede9609b3f9e634ae95c13058ad2b4529bbb07b5d7ac567c2da994084c3c73ef7c453fc139fcdb3939461da5bf0fa3f2a83517463d02b903af5d845929cf12c9a1479f6801f20085887a94d72814671dac994e14b2faa3251d465ce16d855f33259d94fcc9553b25b488d5c45fe74de60c303bc75bcdde9374ca268767f5767638d1aec5f6f95cab8e9e27b9a80ddf3dbbe24f790debd9e3baa30145d499dd1afb5662a11788b1bb3dedc1ebc5eff9641fa6918d958e4738bae3854e4cd43f9173cd4c9c821190ec287c18035a530c2dc63077d292b3a35b3756ba9e08295a02e37d332552f9f4fdbb945df004aa5b072f9f0e9fc2e4ed6fe455d95b003e5e593dcbfad0b3b47aa855b34008e0e9a2e1cc23b975a3e6808be59dcaa8a87145c1d5183c799d06100d500227e6a758757b4f7d042b3485aa0ce5e91b2b2e67d3cfdf1c226b7ab90e40f0a0d30cbbf425f495bd5a80202909ad419745a59210e2c42a1846e656f67a764ee307abbd76fbb0c99a702253b7a753c3b93e974881f3c97987856b57449e92ffa759da041a2acac59ea2d53836098196355ae0aa2a185dbb002a67c1a278a6032f156bc1e6d7f4ff6c674126af272fdfd1dcd6a810f42878164f1c7ae346b0dd91b678b363d0e33f4b81f2d7cc14da555dcbe4b9f80ac0fed6265a6ecce278888c9794373dcb0d20aa811a9fe9864fab25eaf12764bb2f1a68cd8756cd0b3583f6e5ec74ca5c327b3f6599fa9ec32ccd1831ae323689ef4a1b1a587cbbd2120e0bb8e59f9fc87d93e0365eb36557be6c45c30c1baeba33cdaa877a87e51fd70f2b5521078607d012d65f1fcca8051a01004a6d10f662dfa6445b2ac015cb3ce8fde56bbff93f5d620171e638c6e05504c2aeeeb74c7667aee1709846cb84d345a011c21c1b4e3fd09774ab4dcc63bda04bb0f4fc49d6145d202d807cc2d8eab29b3babe15e53a3656daf0b022ac37513f77660d43d60bdd3e882eef239bfe13dba2e12707733d56e49f638005e06019a7335d8184f1039ab18084de896a946c23045e5c164dc9d32f2f227c89f717a87d1243516b922e5f270c751f1bdb2b1d3a38a15b18a7b8b7e0818573f31320d496e14a348f979b7606c5124e007493f2f40c931f68e3483a46ab2b853a90bd38ae85e6252fece6fd36f7dad0d07b6763d8001a0d6abee62452904f979cc52fa15001b06eef08f17d6e16d493d227ce9277392337a1c71713603e03803d38d1c24184b52049bc029f4f00b22d2acdef91c776a74aa184cc84b0e764f463ed05c2e16a7a0dcb6c27dd4aeca8aeac1545b48896775ba3fe9de4ea36e946d8f4ec16ca7ae58165e8ddc9189d5cc569888a59733529add4b213ea5c00ad3ed3709c0175b542513c90e18f2d4fa2301389102839d969e9f0d614943fe489750f27382f7ab273f51fcb995f449fa5fba108ad0955ed0819a0a62308021ac4ab0c97f04de9fb8533489b2685447ad71c7f9a9bc89975f9cdde87a3af89ae5bff37d1f192a31b7c5aad50486931bc07820d7dae398960965baba6cfc05c56df18b8ef0f5db488eb87be803fc94e3ad3bd6e4f358fe7ce15ca21c9a4752ddfa98337177a7c096d829886e8d71340a01644c64090c84e88235b11bd1fefe506d59733cdd82286fb466ee215914b06a138356e82c0ae6d5fd8e5fb310eb375540308d95b5d53832a5dae9652f91c1e8c14402991e38836813604dcaf272fc552e7682a6eaa7aacfd4ed1c7107b0232cdee00aef865c5577f2391937b76e34810f9d49fe31e54425b6f5e1d0e436e1366e9762d8295877e27ae495ace18fccfaafd850544c9be949d15d421cf6f4bb180225f7f86ca64480975c486df0eeb4fa80a4632cff28d36585cb5dc534553454ea810260983d02060caf6b1eb2b9443b1552ff73d243fecc9779635ed137a3bc8c04ef13f0329a7a5a54b2af0738218cc91be0ee63512f009435d8623ff4e8cdaf743818510b22e42b586a7e5e75525bb61dd2deb96adc95e07998a265d58fe4df4b9ead5b5f15b9daee510558fbdfae7a56931a6f4c729c18e0d29c467fed504810b7d9dfa0613d1657d9bfa5887e3f327cf46d7059a8a0fd654c60cb9c683c55439cd5186d1615f45f7108f261aff77791cf24c975120acf2b357dfbd2defafac0016525cff9400e0feeddff27910fbf2fa84c35fcaaec90863b605db5adbad0593601447605d68b943249861f8cd33c6419c7611403376a6bb438ee857ced2e6842f99ed1b4a9dc79f835813a4f8d07c14f1ef98773286e79cec1c9ce8c26e00418f1b27c7ef104fc96ea2b2ddefb46e2fec4feef2771a1d7e2643586b6fb97094a8d298de12a6f8f78d88e5d67442ed3310fb40aa6439b89c834e43ecd4a80c0a1d74ce6a90a67bcc996a7e93b6f397fe7ab2fa43711a72b84f8c94bd1e4ac62657b98a4b814d8ef2bb469165464a90d5353aa95d09b6ef4ffef081cab5e9dc12d743364f06d4118a585f7d455fd6e3b01434a728a768987c181409eb939e9396666560d394fb151fc67cb9cddea0a94d3e33382bd0617c95304da97994f110eafaaaff6eecb54421e01dc850dc73d77df18bbf68ecc8b37ee2fff7b6f88c139f7d88d763248deb8b4e16a8fab216c0ce88faea030f3a5c994c6e4ef6a9a68cbc9310787232198b020a7c014a1fa32c1736885603dd4921cd360bfb7dca7aafcbe81d7621dbeb4e5c094c2584c339ce70176d7fd2a6cfc4bbea6b433377eff7320d412947ac774688010369b197ec4d0471b9cc73cf9a3e71bd10901beefb10ca1c53428b89ea63427aae9ede5ba104d3fb54d0447458dd9780cd4e925f1edad33f6f0884cc47da562a3c6e2f5a958a8d8723919c4b88d067343a246c6722b6f9f82018d5213648792f38fa8ea1e635b3983dc1f941630fb3762ef1814ee3f41691b24583ddca585289568b4e64f82448b54797d382916e562b3f4795e2d726facea988249e2c3f72d44ec7197b6f783c6c7a133004d5e131b7b4d6a9557c56942ca4bd1f070a2b46c3a6b81bb9a4d570ac6afea75de65ecd331dff1e0252e0f9095f974f47b2d340d67704343b2e8832232210d2f79665bebccab528745c1dc3b28a78aafa3785c29ce2eb6a8403e4d8eded1cc2554ece0a542aa2febd711164f7d7e3a492a87b01d6b4206e593b3aa6d431e908282fcfee0d14dae4b99176a16fa32f730c2d336dcfe7eff84a7aaab1fc32ac8c2e9ab6ebb72c0306bc6998ec22d6cf20c2b6660cfbbeb064b3047c1cf650df12bd153cd7eec5dc181e46575f07c8e292cc191117cd28302d1f9c72d79b1f4062dd683ca95c3a744ac310764e56b2f02a0c2850a2f24c1b298e712374e9adfe68e5414386d7671bd52f6f472eebfdf51677ce379afe7b8085459fb1e6966f5cef45b256489b7ec8a8939cd931009c8a26642f1ff78cab06a5d25522a922cd5e4541dcdbde4848177a42476b141ce9ea035d28742cee0e5e85eb78ceb2b720e112aeb76cd0eb3fc34574c7476110b3b9dff5c19fceae816715b31fc289c0e7149e8488a59e075ac6683f237886a63a25ad23bf903480b9acf3f724d5ace0ca3a842939d4828910cc735e6513dfc4055624d68a048a626fab6b910eaf558c1b43daf1cf26338bca68b5e308b734b61624c97bf70a82430d586a6c3cf59e1bab2532fd9fa1f6fe4f757c7ede0cabea52f2cbf00cc88ca7db4ccc0ff92c0836e7405ebef2ad2e4b7d3b455d8e4d9ae575d884347bdadb67f5e24058a44ae1335280b671ec3bb9d8247e28fecedf5c151fe892bb0f6e67351752e4b1bf75dcd5af3e62ab4aedc5aa32a1606b4a0de3156b356b0fe74e898065d1e720b81663453fc97f935da3b5755a0629f38d6ae5f8e5e77eb64bbef5fc70d4081ebee7a9f7169df4f0e11796f7a79e9128ec996b6fbd8f6fa56e11f17db4925c27f4cd3ddbdee8a50e0b0d4d8f6e527302cbc4dbeef4b0338e6ac7515c1e796b39c8e83f457b50925c39d405f4cd3c1aaf3188c5ac62bf1dd362bc8c9d4e49d3d2b7c2dd2291fa4bb22d7cbe7963b654d92643b789366d1dce842f47919a1cf5073da8916701f907c4d2f8a710c58e85b59f590123d3f8e57cdc14df41a1481a893b9f9505dc0637ba9b27657b0ceab87b0e4bc742924e6d8bf895b407c54df8622018417f9e543fe49f5b10a7a5fc66e5589304af33a20ea108ddf63facebcb20d22eac2fdf4a97285ae6d3f87865fae1331d00e631dfe5366345e0d78bb39a8077484a941176bc63f469f001cfd230347580b6226d6adff5ab112dcd53e7118925296b1a05978a703e383e6ffa5158fc36781f74501564992ab244d3475e1ee8e7146033da2dc116489b84c378e4a750947eb9ccb982a197f13976bb105c81624618c697f32a5b9e03f3675b2315fe773e4922c2e3da7f68ac225107405ece58dc6bbe2bd8947f3e4269ce245589497cd892c750f9ace0440f48057090c8a6cbd5046d3d982d634b4ad6ba41c7a38b7b8b0f91cb6898e769479fc3c7e7d2010b7fb38ef13c17db705a36455a34969803323806009a4e141a5c42da0f7a5e4760d07250d7e483ca6274e57cc2885e5728c24c8b5102845e8bb74b1c394fa7a206ec052c953967380d64c148ca480ab0edbc5da1a7a1e649c2ebfd19fefc52d81aeed7cd83f3c1d2128bd66feb99d5d8fbced01383d2abbf9be47f3390dd336c22b533a731d1c59c3bc5361d781ca15430d84f3c67d6981ab99100f53b6b5623df9d8eecc99d24e02d9301d636c2d5988e98a54339d5b516379a67d50dd9994a28fae5b806c56b353a84cb31729487a6d9851960b83ebc5178be689720a80c5c412e67f8ed55724534c92ab15c3bbc5bf13dfbff02d41ce4c9bc112746b62dea2b21d034e9a31e276eacfeeafc672b95e701ec0fc7ebd4b020a73fc37361b3f136246a0e3a8378442eb5e60abd7da2032dca9b5556aa22e5007c901f438c5e1baeb5d3ec6128a84d310363c6ec17d4ffece27f502b5c63d20cb1d11d0cfc316074faa820a03e6c577389e5e82ebe5f0976b6f5266618f5eb56986714d5cc75fe87176e92dcf01c58029d2b838022c0812c933db17dc4566d233720075065fda26f44b0ed3a46b6143fe180b7a1e6c1558f87b875aedf8c2fa968e2c925f0c08c7e0f23a9cf1b46f7955d9f1db300dab801f5672e2a7231bb2b622b0dc0dd9f2ec64a5f10c239e613247f8685369ed60b2d262c038fcc43924c5aca318385c12412b10d89753f9dfca43eff5f2be7d7d7b2788b877efa8b46ec5c9e99f922839bef71c613cd44cba597cf68de366eaa8874032c14d8012b41e72fd66422f7031d26be0dc4fef8f36a3c124e4ae767a665a94233812984c4466f5bd698b5fc22153c9c2f4110d9defb23c00e722692983b32ee0e84514169910bb21b14066d048960b29b3ff4c090dd5723ca4dcdebd207d4f88da831f0ee7de4aa302a06589a4aba3ca696e7d3c3e9a93af79db91f7a06b0ad825a8652f74bdb72f580e9afb31aae58807e24067f08dd719abb4e6e458bc8aa272d7a5bbd00710c43a1fea220b9022a26b574997517d04573786a4c3e09d30f3ec32f328462e26d4f7ff015121758ce1a2fd51e7f419eb6d8ac04497ab812aa6ba2e981a312ca16c38ed887b2342b0a91348198797919671a23e2b0634b523f931e48ce0d8eb840c54045d9193afec069803901e5ec1108782503cabd0f43373a85acacfa8af44ef2b1d09e4589d2dd4fdcefbf435cb61254f189ad433fa6a4e190627732ae4ef2b0c85cfcbbbaa0137033034e70a3906112dc76ec101f3198e25fb38aad46261d6019690dbf059d66c44e7ada244589c55edfc2e7d18c0ddfcd2d3841bd54d8502763cd0f4696d44686ae3be29ba3063ff6e7aee14de126dc43302f7c0b57d59eb4fdfc4903ccbd3f7309225dd90b5f25c5ade49c14334c0e00fd18b1dc611b10fbbb98c560ad4908842e765c661b9bce005aeede6461254338b8dad3203ee1b58bac1062c7e02e2aa6d420283ed81525839f2c8ff54ac71cc105042c594fb7fd7b55c14cd1247347a197ea8f93c1bbeada1dbf3e59b798c9b15765ab23f856fcf4eeaa5892c3857646bcfd8ad2bf0a15607e0d6696a8548da32955f1f8476f8a20fe4f59b3e9bf4468730b8d46c824a370d37695d1bdcac521032804c5cc66505637701e653ccbddb052f4ecf185b3605d0ba3a4fd99161973e36a35bf79571841ef7506db822dd2a5c959f36418a8dd8acb5b3ecbf3e7918a73695501ef8f440aba43c6e4575880ba3bb83e0a839254fd8d8c6b979d79337a68d218565a5dcb1518c6c82aa73ce7f54a9434ceb5f5fd503137164d74a230e46ce298b98576fea88806bc51e393acdb2abac1da23219b4dbcfba366d834d40dd8e616d214c3478136050555539eba776bf506870c3d20c4a4645b9a7c4ffa976534068009840aadae71f578ef1a325717f64dff840b9dda81b123086a47a172e6793e68af6140b1492058fecd68c4c23db1cc13d2b57f52d0cba89cd4c26d1bd580dd2a054a1d934a80b9eda8ffb503b7e3e62d00a3d075235410149e976529d8029595e4daaae1aa685f3cbdac9b26916320e75b0846d2de8673600212bb648b26e3f1709df425136f33f46129afc90839d24de1e9fee51c685db8a280a5dd4c3ac1539664cc36ffd4537af480d4082146e7395cd6de1f8b652bca8853ec742366702afd6ed79a5920e4ad1317545266f6dbb796ace0fdc731997cd94e1bd8e6689c856adcf153909cfe882b9b02650f4f9eb8620983f0c6b95b3558682d8134a9ec8fa97e174173041115b2eae21fa0b72d0a3c7c2bf9b022fa141a8b495de8321c152b0a9a942c5baf290a234ade4e8b579238a627196fa5621b196ecbe31583517ec4ed82e8d3fb21a892dfd65ccfccd2d36c5d32afa4d4bf201d684c4b1c8c1207db455dede5b908ac63d5fc0bd2b36e11df53bd52e5ce27a9af9444a8cc4391ccc82914b79ba2971ef4ea5d5c30372e7cdbe9bedfcea9ccc8140f8c3ad1bcda29d11fe51affc74f17c9832798e10222701e0d6e93fd109cc9a12df4ee5d38c531574d39a9f4357a60f8150ee509c68e469b4eb0e9be2e6ef9099f1bb949f738fa801d223316fbb1e179b74445228c8b3c40440306e4821077860c37d6b8c17230fcf7ea48d0bb0d98fd3f1f00655e11a8b2e0a7d5da8427784a8fc6d1a2d4d1d3adcc02030b50a700788ce4078c199fc733e2ad469dd9c775d7a8025b4db9b960619f0263b7f09d038cdf85045ac2a1cc5a18364048bf242af713ac4db889489d781ff16b1dcdf66acd89bd6c7651f25a17ce751b67697739dc4d1a125fdd5a8ecbb0cfaf31cd4179249e91171ef3e628dda697afed9d09b53260ae475d59ccb45a6ffd85a2c4241fd134462cf2ec21b51422439aac77954d1b2396761f16e1c6e3242b538f23f584b95cd4b811e35a526748050a7eaa02cebdf8887d94287c99500bf9c2afb7f36ff47e17906534097b02f10620958e889d2392d30660e513c22f580a505314eea4a865d97adb9136c495403e321f425348b56ce8f8e8e91ccd702ade0bbd1efdebef8344bb9defd471ef4b214976556f59f679e0fa39a2007bb9902f5a60ba044c4316c27f6b634241acdc3ce437c4fad599aabba291bfd71c05eca6d9df49abc33ae7709f6622e516c22418e7ab86144f6baf3697bfeeee65294175e5dc9ce5ec82da64537f5f5b83f5a938e41fa8f6f97f9102fda8bcbfb6a5c58f79648b97e948a074e459b9b75a1793cf7d9ca5d7ab27cf7035ece0612d348a23c0fed509c5e18d19b1e659af237c3b9aba4fa8477de805c5f8ccd0cbf3846b6ee1bc9ef76a190952115bd08a5108c8bba76d8d762184c122d081c6dc8b4c49a7f0e16ad4cbed86c6818d4f22c03a100c9afe3675a2f354bf1c2cde1f5e5a63b95761e10d27c9482539387e3aeeaadaeab59faaa20cf595d4d8c57509c751446282581ed28cc55736211e6fabb63d0f299e39ac1cd2af1431bfb03f86e5e59691dffad4e275d4611cb2d7d3be3defcb77907c94db86d989a2ca7e19729e3454eef23b0d58bff8203b08f41b40913f2d2dd2e8c98af09e5aaee76030d8201640d78e7bcfc6c1171e04cb39a6bd060ca41ebbfd090883d8b3569c39fc19cb5d87c15062c9f09138d4e3d3f3421227fb2ac48b224438b12702cb67e2db161a3c771d866c3cc55d15a094f72fe314092e846256e44a1dc513b02bbdd976321f470f81f36e719b9acf22179855d36ad0c50dab79da662e9ea7f9685ec0b44817271ffe2b7254ab7f3ddc389847e17edbd33fbf789bcd604ccca0c01c60deca286858b16dfa17c5875916e0159dfd4f0495c08bf6de51365e2175e47325d5ee71c96ea8ce24c4541886e0854bf7dd8a980aea1aba9add0316f3d052a2eea95c02c241523f3274ee62c883c4ac440d7626cdb4f0aba7a4ea686b2778cd7d7be220357de63cce55a3928aab4c200a2cd65b04d831ba0b54dc91cd6ea410359512130d2a0122f3c9752ba6210ea3b115caf891f0a0a7ef210d1988324a9af926cea8487640a473aefb2e3b4b9259ca4da66089d7f7800f87cb2bd068b8c268dfac897b9a2dd1ff4ac2b19a48b7e95a39ebc6afa2dceca7928ed8e43630d673e5c7ba1fb4afbbd40243ed411b6519420e738c24ab183f900872f10248190358636c789b842f156987d0593fa7cb813f5c688652f871aada7cb5a9c2e15ddedac147151b4d5a7bc4b33cecac961a3487984918868515ca73ebc647945fd9044f3c085b184b3f9d333a7b74927fbbe4a0d846744e0fd6bc36f9381f76422633946fe79e64c3fd63e30096ef400df8cd8c884bad1955b82c013c1a190db92699d39217e46d3db284f35b18b782e791d722d12b85c8a26ac98e9dea8356f9d3ca58833aef4ffd883953f24c96f5351438dccf33693230db5d72389905b49d7308cc30b805fa968532a976009a527bfce9ea921ff4ea9723be5b5972ace8553441a4dac7f0b2114edd3a25666d70c4f94131a63f4521dbd004309157bb32f9fc649058ffbe747bc3addc523f805f1b34787b0f446c9ed1d1966550c7d0c10e342316c6b34899064d0d2dcbb09087ac20572103ee01193a3eab06c06e3206cd60bdbe367af81dee5ab3e5dde9836c558e54c9bb6aa306a609225cf25a65b575fa97d9c962b72b798e9a7fd8192ba879964cedf623d544c8929af5c8dea56721d25578434e2b234289895c697c9c1bc4556e4f6df479a837d1e9132c011e47f9e23fd27b70e7601fdd24f28937efb9e46673b9f56914638c793f5c3b625664f2b221afb3fce5aee92a84d45bab5cda58c49777f82b2b1c8293d727fec90dd73581b087367add474dc7b4cad75cea1e43619ef3fa1b35175f5f0889c031c2083e764b0f4389fffeb307831b73763e73d2c3112adff579d4dcfa1c09d3f2c5927568a70027242e6bec83c5e2cf7e125d8b5e4ad2ec339fb79bb15b8b9a6db0ea9408fc6fb8ca6efe9ae0c8c25900d859b17fc44c4a262c7a5e06ae9e2083fc6dc36bd08d648e9a1a3d8fcbedf12777d690ff15dc7096e7c8b33e71b19005c9e1b20d2c2b6f5c7c1204edc691b389b6ad04f896ed297922bb92b9e6d10a2df2a83dc71c15d2010b595c72d5677017d6d7938ca3538d671e13b8496583b4f9fa59fd481f1f438f92b01a6c5f7169d44b93c0b6863c1a183e871e7f50e26e6d41243a1c509d423309dc886dbb9ac245263ae9d6024456e72b57e17cb08ef00f4fa4dd9fd27de0685c4c6c680ad654e3d81dbb450f0a5e7821412d442c2034093e3fb10234e6a51b98fd388eafd0eec66b42c275a3547f72c7f3d16ed81395e9a2664faacdf99bb22327280e518e4ff047451e6f7420b562c68877c96e129d0cbe18896aff48d49da028dc97aa0108da9b29c540c5238d676dccafdf463694aea34ad4f513b6c7a58d071c335ff1313d41b7cdd902904b8c9fbea2ed34878b407ebb8144f603683ce4ce61eb0690a00d492978aac3a0f3010b7479667811c3332c06553c14809c723316c84d084530e93a63bf0b7658f7bf367d29577236e23ab658a685f2612f0216a932a24aa4f70b8d0609aa9ca14e4d91b8ed9fb62864ded646012ef675ea359117c07f528d7dfb742aab9ac892851e97c94f72d5c34d4feebc7f67e09fdc6f633f050833192f15a7acf4f8c8beb3adf3860fb26fee39a416ec362e4b6d9ced09fa57b3d5b7fb7de018e4fd93eb65634c08f6d4f1e2f490c2a8b1be2794a27de0dbecc9949fd1d5eefa0fc6f0033a2bdecfcaa267280b445e92385d2edd4c2b31bdc5d54ddd6cb30b3c370a893c217945d346d1c5b8b98ac754a01afeba6f5526939ccfe9f2432461a99c7b9b44a3983eb65fb064c32f8c72e18b8f6e42e72a1bac21b3cf94526f81089b235794412d1aed20f48324d742d4079e9546f495248cf7f42839852d604598ca2079fe44b125ae9970973b57c156e83fabe6d64c9aaab5c243d1dc71520d45317b913205979fe5bc075b0068d8a5ceb7c8ff9149c763c22b08d35a09feb8156bf7d8eda212a102906e251efcef1ebed894556f18444a0938b4c050f2b873505bdce97cd4fe539a944b94e281292f38850dec9e9f108d3b2d5a83837d114bcb3d6e6511629f310d194328eb05a7b88e7a053e97dd92881c89a1169e7d23a4fa1ebf532eed2579fc4482b9c93da2b5e9619f289f346160996cc61a3f380ea71b25e777af37dce79039cf90a2bf16ddd46733fe9c1cddbe7a42fc5faa7869c96ec463e9817495bc24a23cd9968213927522ddb0d6ba5db92f5736a5723135305a6c083a9bb54da7e43da3ebb07066ad94e597706062118fef17e9e65363f71d8859d30527a495f06bb025c1d26c6fc80e9b140c7108c57ee5583063bd8d2a7efe6a3026a79f2294e09ce980be8ce1a017132ccf48a63eb32454b12506a6099d4e310f07612e77da46aa0caed8fb0446fd6091140db2cb1432bb93cbf681cefae9d849fee6b0d87898d52d31a209ca6f168b6305011e2c9a55fc5ad2237d7c2d06b98e0703ff2a89fc7af8471aecd2a6cc0a4745082db863bc8d46209d51135333a03b328345b86d6cfc23d6d7384fae5d8546f05725ab139e2c25b0dd9b2113b2774391aa058cf90915bc97a94e74ca0ff6785243122f12decdc48aaa8ff27200007f35e928e62269f7f07407802c9a10648a91180d559c5c37cf3f425c9949b9e38ce4c99b71810babe45344d929906776a66fab175e20bc5930f1dc4b5b888301028b6e0f92293e468d0c6b191f0840ed822c036e6257bbd4f0db8e931463826c0be855add67bff5fdc6d4de7347fa07e63d68f4b6876774a39dff1ae927614f8a879f128713e24b263850f1ab3176ed0e9ca9369af947bb8e862e927cf803ea7b53b68eb8c5f87f1cde2399122b7892ccd4071610f0873981ece2ed719bebb0d508037e46b95610d14e9a826549cfedecea1d32074aa439592929873b49d9434f35646adeabc8b52e323ec2dd6d0d6e27b530361fd8bf9e4e3a0a58e3079dc63156a684bd5cde53ba8c9c51da274bd61cdab187a3fc0a84d5005319f05fc7ddbda575f73f3178336413f8ba0b99cbfdd5c350a3a925260284d75fe06371716f951d76078df7cbe6f25beab46b8f4222c74f68822d6747314b688839540d3bb9bd0f45a028e780fe2b5c78e28dbce66680f1e57b68d6088101146aa9f976bad10933e4f5481444a46d40413ae5d00044a29dd3760c712c04771976280f793ac5bf8cc1187976096e4620d646358f207a9166b9d27030721fc00688a0df926e6f4944ba6e78dc862a8e55e3d1a20d2993d8c8410548e9bf1b6efa181daf8bc060bd1af3dbd8853d6d3f54bdd1f6270b20fcf7f90310109b98f6b366a4ebc6f717962e408bf865d0128fc9ed607f848d376ab1c50e66152f74916a28539a762c75387d144bdaf4a0b8b0e7baec532e8d531501674a8727547916fbcb2e45f9c7d41063bcfec3de1b0adee000e555397ab16fb0977a8c3ac1385dfc89eb7db5cceb9109077d36ca9ff5fcf9feed6b985693746a95ba34f7d2875f61ee8606302b6470f8ad17b781daab036e288e5ee083a3a36eb116a34f5ad97e1675181818289f514efe868feeec3b48b1a574b9405668aa536e572f0e2b46fdfccaea5b2f65285f6a9a05c020bf440f5db912c8ac289c67b9d724225eff88366992f08711f35112e66b765872d39b54cdb5c4c0719b2c17dfade7e2f19281e6ae7885708ee8a8f6f90ce79387e6e47b33f15f212c5b386a5aa5f93cb597698dae4b5999ccb4d652a08c41ed27c45d2ecbd112a679374ddd6606ca76ceca9ab08f7f648d248622ddd633dfc121f9470930ae058cfa9455ddbd25a38aaf48f242ab6e0dc895c5b2af0d9ab0c996df526f144cce6297af5f3ac5fa1d159f52e072b827dbd273afcc6e3b8fa1151acaaca5965a4b6cf5b0ea6275da3208159c6bd6d716eb61309eb4ddfe1bbc4ef8d013d477668cb3506ebb4724ccc72affdab79dcdfaaee55a5946b4a3f768dae9fedddedc6c5712296f26c025ed2ee299cd15b1e692c616094f500fc53fcd9838401c0ea6b6ccb883c149a52d875501ec2e647b1d6720a8227e33cbc1f429ef60103f3334e3de2e40ed4a59d811b8cc51a695de25ebc66eca519222dafa22dbca634220097b1d3f9aeddc91d11019d7215629122b4dc6e3211ad842288b581c31e44fa79e1f7855d8fa77e7a224cf571aa3c16b5f4fe5feb16d7d1bdecc543b0e8ff01c677ec6801e87241ddaa02a5c83bbfd1d84c62e269f6ce8a708e693b86d8e5439f129431a4c1c0bc6ad47784c38e1cacf6c523da23f65a76c264b96aabb50aa9e299be6abd1c9d078ac3b2c5f2c3986b5707f143513b4ea91a2052731ef5b48780dd0cc6626a0f0c358454f6eb36df7caee6f8dfb3ea19a0ae79c0d1587140147be3efb2a0da1305d5fe056010c518e3471572d889304c4ce00acc78fed04a4b888d5e7e57d6cb5cf4e5cf1f8782e1b25ad948eb3e443db75af9233aaaf6659adbe0ef33d4b3ba5214b85e656719df2eba42235b2e268f80e3c5971d28957f8e93f5b04a3d5eaa607fd4bb838ae48661bd093342762cfd1ed60b21f04f5b95c3e5426ca6127b04810e2ee25bb56ae81d7840328d8d4f7d1bd341ed58b102d9860806f4a4d117c044f472c85ba422eab084faf8994cfe0a880bc46dc9c1a8c11995610756e2ac50c5fea8ebbcb53dcc76b1944ce364f8878f42310fe0f8cc211c62f627d12b20527dfd84b78c98b1122050cbcbdb70e08010f68294a6a805d3fab97e76cd695f918e73763ac2c3dfe4a8d75db87dc37e2399fd854f3284d29c7bae3d3e31c4375ad9e047f03a5204c2ba93b6025c112ea2c9fcd731e380a8aaa42860c859c2e2cfd333f0bee741e21f78776defea86e862711f0d0bbf64003ee848a8d1a12dd00c024cbee343d1093e653555c033c198401caeb951860392b5b1eed6200828aa310ed466e41d855dc4231464adc2b6b6fd66e03fd42736fb791387efec28b37d0686272a6bb181a621aae7be06866bdc1c4be69e94642c8d3782f5ab7cc8c890699008b52a11b149a517771b93bc2ae597dedaf0237ea8d9674e26fc75c3b468e04e2fc317d03484a75fb274f7ba1617bbb72ec16da1fd4109952d052e9de7c00761736dd17e70db0976692626ccf8bc9e88ad6c25ed88a2f7c2750add4ceb95744f690ee5f2fa423a2b62ae57c1105958bd8e81025c9412fa71f5d1e81bd6cffa01f489fab7e90ab8a3c8aaffc8e3d594beb254c460347196473117ec2a416dea464eaff95da6cec26b5535954901298f11932ebeca52aded139f2d5aa2c24174e2f6c701ce1f4564c60861ce3b9cdac1cfecf071295c5ec581f0f075096fa457373c124b6c8cae3aaf915e4701ad94ec9c01e5ca0552019bd7f107a7d5afab9e4a5e7cc7b4c5416656ad064f4a0f89afbf7c5b884b69a12fbce8aa73a49b2e5c5728c67a7396bb8341afdf52213b2f7f8e84962cccbeaea63a3c7b24881ecdde39cc57b4f211cd57c6f982217758042f61b648496e62b612b7b8bbe1b9f15d237aeac42b54d15166b5c71eb27ccca1fc9e050adc62a267eb82ca2144ba323a73aa11e2fdaa87695c70316754faf7aec44a49b668362b0b35e884019227e7b9a35e8841e64e0009c713d7f3e4a74cc3feaecf4c99b8d0ecd85c8ff89771b63a38e3af990641f28fa7e4ea560577d600f43ccd467d6a347fef04d392d42f8e97659348c68b41299f94db4b713d61868adbd20a4db74f61bd0d1e7846bfc8b8f8bb50bf50c2fbfdaa87328933741aa2b1ca50cb759c1276f1a7930952ed656921f5ce5569ed16b31b2a1b6009c784199ae60ce2e35d573808a195974536f220cd14dd634bd06800435cf1219047f6246c2d9bdea5e489ab4862f0cb0f01439ad2ad1e2042b3f63b8611a87efbe842613c21761de4c79291a8491092c20134252b8e900e5d3cc70e75d32cc41452c5c33b66087213c34f67ae73fd56a183be858f1c3bcd73d814bb9e3f78cd18992b0ea401d8f25c3b60c055df8e6430b62899bc86167d0b5e2bbf16d75bf3f2b94c26542202bbfa0abe99be1a07c78140f42c12f51576007bb5439966a47cadf5c4ea624a75e7a4f01d8733aee57e3497c013de4a33cf54a94acad9b1aad837865a6881db9a725310eed49581d2223f2b0984757bf3fc5122c5dd572ecc781b48fc508122775779d2b2849e11684a585ce844d21352f8d35ea53f0f34d772bd9ca76cc4dc33aa3f2e72418c097614fa5260eaf3c2d724d3599dfa0991a9c0eec9c4d550886c85e1ab2541e9868a36afbe0d9c07c93e44c4c73c66f88e770e5d4e4ac331fafc6870c928fca85756c444c6e8f6cf75865859abf0cfecc8e89b8c806a2e6af7cb752215bec6201eeb41759b27d599931dc2ae75d605b3e387bf263ebfd09ce2154b81479675555ec74ad85150f8eb8c1b3c4f31f6409648f9c1b4678c82e8e2afa9c887f3210afffed160d1634ab0259e1bf5565d8598605a435bd289afbbc12034f67199b67bb0fddb4b9180908c483ae5a8eed16221687e1f524d010ce5db78d1b999069f225479fd6bf0681c7ee95d4665925bc96399989b85284087e67d5a070f2713feb78bcb91bc019f3f19bf3abb7cf36ebb98f09fd64b61e2bddc9ae6335da48ba85b62562726e142bb9d9e5c8f278dbaa0657dfe3e410f03211a072555624d98790aefe8e7b0281ff6af3de79dd5a414632f9d4913a480e9cd6990f94350304f853ba5679a4cb3a647b98bf1eee6cf70f77581a1ff82a9ffd7296e8fd172d37b1b0d1621692cbfeff8de18658f04af5d5be08bce66e5dfec5989b674219f9ceb6a1037c80a8febdfac63d482debd34c3057a677420f0bdd66e2c2b25a9c1d34b76b4a998ad3ee21d1e49f812422c83016c12c201ac2b0f07ddc00638846f215bfa6c575cbfd577178eb0282ade2c459a13386f5dee8a7502321292a7de077f4fd12967b8c8055596e7a43287639843b6ebee58d463fa044562ec2da7f9c2a7f28cce685178eddd3b9fe7b10202997b6b170555a71555cfebd06cba6bb019f8cfac2ec5db3b1d1ca88acef9accf76b6a74600e590a0eba1c839d6a577d3877e7d6d010b04fc58e160ec9733bf200a9e0b24fe8ef32613cf2c7b1515008b8833e34d3967ccbc8bbe30fd1810f23bb153b814392eb37d8917e96260b3cb16895ef13b96d72c81a14b908224571680dd56d04a59a6583a232ec58e8cff16f6428b5e3dd19f362992608aba912b642aac9950777627ffa4eadfe9f31b73c3fbca11d2abb623b732f3d7c296806151257c9f2306dee1c84eb05d586e7a82a8750905716b3e51600250a1e3b4bf274130a1bfa47117cc8b6db3741ba04d977015b8ee250c3ffaf859fdf0372b88fec188830b5870f251889584333547f3436a548801fd3236da2ccb2b504f85ef1d259bc3e00f0ced934a4b297ecce0d668fb3ecb524d3ff4380a7856c7060006de31931d0b26ec1d084e0dce3b9a123741cdc326b441131d777799623c6340410c331c7e8a4a8175d7d250274cc4ffebd5d46d855bf90842888893c348f0a447998e3aaffc81c9b65e3a772eca5c2f0907ee13ab6a2babe99f388755fa3ac9dc79a2ba4ad7a869a876448ed1d4dd6a8c678065cfc90df8470b29c83719bfcbec7c5e3244a665a28593ad42ab84663bccf570a8e8b783565f909b5e6e8cd69ed6f79fc945ce5d845c998f25b9dc118c96dd2c0f592a73497dbd9e050632c8d82656a71460d0ae7f5f38636692a78083b2fffaa517dc2dfe18ae020e6a5562be54ed9046c7129b3a57dcbd1917efb0579fa9a3978690fded8e52e4860db75b2a93c77316a6e84df4965291a7531e2abc0fcc0d0016acc29680baa575cb7be1a03206236310eb5120ab4069e0f8f0cc3f6bd188ca91963eafc2bc66b1a42f8c49359cf3171a72eef94eddd8aab03f770cb2f489aece4e09a85fe6b9790ced5feced19e4cfe6bcafd1a5d99fe56b78f7a14fdea11fd5e331e23191a3f74b32d8ff2740409f346aedf469eb8aca16b43dcc44c400ae3e6d1c4717ae1f18a2f70830aa0c4d5734922374dad8c006ab97e02a4263999ecad0b1e9f24ed0b599467c962932ec610e63c0b3ac845f5d4d10979c92bd884669908696172609e0da039728baa1f0dca8885d5439ca420e87f5c449908b2a5f69b65b60adbf5d74b21eb1f4e0d79558c59b4499c245a9952de8d3a51021f2e77c44e06a489df3b72d28e5d03ddd358ced4f5a1fe057e58b86f9e717cb9001cec6d6665cc0f5b9cf89873e6e7d10355746e99494766c937683684312b630337d1c411f3f2eddc52a8267e19d38ee12c810cc4e33193e26790b13d1847c56282ac86697996daa386b06ec2ceaa97fac9c018baf644622c74546177267b053a82292c1a1cf194909beba3f2670acf1d095b0caed4b8da2fe48c9da3dc61969d938707a62ce9cf55b89ceaa04a9069d38f4e89db794a335933c5b45fe215976e76dc71b7719c2ef29d06d2dbcfce0470007331a221dbce6baa3f418f989d7dd927d343152ee310d084799300e8d3801f9d464d9bbd5687e3203cfb8e589fbab39ad4851b07bd13b29d7f4b767858d13c5937a482207470f673593aa9abe339b3d63b7ea4ad60e51e7f9080381eb07213ad1996ba7bd28f8b44b7ea037e0bf9716f56820f908fd4027249df11aea06df25b3860cb18b68a7df5ed0d14730035291346049e1e5cbdefb30719548fde4f986bd9871a71b5bc7f6e03ea4fcf1c6ddfecb06413832ac27b08d203070acdaf432bafdb288908dfd673caddbfe41af8255ff7106d39db8d003ec1abcc3000bd7fe1daec2624bbe8417f81150f20a8a48324100ef1570a6de7c0a21e16f6991b23016671bc96ee55e99a97a5a0120af8ecb816137d5f40b9e71d56cbecf61569dcd2f850ede77437be06fd85b54d7220b9bcd13e682a8227c7a05a4efc8d258b0331b0f47cf45ec370b491d6b2e4e601e50483480d9437fdf570b6be69b28b964972fac047f8aaecbe567c8ee3d583a46d5b58fa3c361dd3ad73c91727e4d0594f428acfa977206c20995612834497928d507eb62aca1752a8f3048c932b9f0f80f7c627a87f2b50d581961b8739bddfe2afabb1c757f366acd1e639de808409f598755dad254c60b5aefbbdcbad52f72c756e5e4b286a6866af769593f66256fadc939d3d23d1db9096038b40ed224ace023f2e3ea84fb4092c974cb44ffbe489f0ddbdd79e66281ef9c44e81781b849b0d3101c17e54ebf8bd69393b9220c75c7d3c564862ef35d7dfedc855e2ea15a6159c6c2bd01d2c4f3c316ddc43f937cc295fe35365a69ffe68a2a3bfa7eff90c2fe8563f6438117c31ab48cbd5a3ef1c7a03a03a048be4a9fe0de1d6a86feb144731f4e84f1b509db65d35b1b8ec3d0f462392da10694b207ef1d9fa2581b572f9c45012151f039ebed848b3fc211b2b4d6d48266e8bf800e68cb1165cfb17cb14af4fff107e57bc90b9e32006dd090ae12ff39b000c474f77da32549f51d07bb23d233485be9143c55849b5fa241337c050d48d88e4723f7f1032120cb609c584cb10cd777404556df84cd095c4a9668d392cb9a6197ce04e4234d48b47f8deaad83ee95292c9a9e9d42838c12e34046483ebd821284ac349fddb3d89c0e9a85716ca5f2c60569686d3580c6c7bce0a0ec4183fea724ad02763f66f85992fedf49c67a54c8ecc5b47d6e00cfeaf23b2425b795be93d65d92fe0ac761cca8b2feb4fd7a4bd21bc98a7328f178a61aabc2edf843e23ee94c757a457d448f3588b4e39cb14d855c35372c2060966df0e3382afe2d18988ee7676511e43afae09d6e16b50bfd290c1202c5c82520bfadb7b9eff22c2e9d202e7606f23182c08f0d405cfda6e8bf4b222a14a96015602cd77b2e0af5027938348075115b146166990bdccdaefa94626e140f8ea6fe6b51fb38fbf7ec39b89e68174db08d243a5da08a573545993db451bcd7462ba2c308849e6f54fd68eac003dff1971d19a00ae1d326d9db706197ce15397066ca114645ee39bb1a950c068908be503b2cf3ee74048dd92808e07172ba1362b3ad4103953c990e19b4581c54b5a240d90ec56150fdd5d9d1e497090941b541a9fa202d09f2790bd29f53fcf2adeddd4b4ecbff252921feca36cbe51e5185234641c8df314dec556280e408ad6605cb82f9fa5cbec32b2d478e876b4c3bc5019c344ee2f0bc33d26ae3b69e349771a8069f38f879d82e1c68f84d44516db921ca606b6e310e9ef0729b9fc76eaff94d3e44f865a6943eecc5ea1dc097e69e91344f7b287223fdf25ed3512e1fa34b0879ade1a2786571435e71d3fab19a6ba93b5d83e20f05afba10ab48ddee2c6feee813635318ac35bece3a339fb5c2278df5b9a6b7859343ff5530a2dbeda669a47a5eb0efc46c148ab00165563023536cf71f189c6b855ca6aaa056233ba82edf29e82d96c6118a0e6bf37d2ab2945ed1904f1dfd19ede3dfcf257aea6d560e3776159ffc384b3540deb1cc38d1022e530c2d46557a21eeb744ed5c00843f7b6d5953f1ff4770d26dde34c4cfbd308074e0df53264afc5a3a7ab8a57dae296c39bd72b88ad988319ba9e13ea529783d5c926d2f48599720695fd174f8873d0f660f002d8d0ee134271450c12e9dddb641b240795c2c09b958778e16081bc9180442c45fa916de16c83f16c50092eef58a56191bbcd906eb475b97d37b7f5cb00a79a9ad66a636e1052f9dd1e75d02a5af4840dfda7eac68c749bb857675e67b450a484d3e7b13a77fdabff0e97dfb705e5f4f6cf1e95a5f6cc38e099634a020087f868580ce2ec0837525b8c58f08444d7fd4333a589c0356de22568b4fad8766ee3325cbd65843f2c713ecdb44c96411ea871c039915b546ed6fbafbd51805ac48d06c6924d3f7036e1814250f50f27342c8c4ded3e68b6b3f161d46379c1088a7a123f48f0e7cb5a348f472eb155956fe232fd301e64f341041683ce3b25bba7f290a10282a8dba3a2a3da24461a5be148c2241d627889adca5acad981583fac81d0ee4ef77038c1f80db9dfe740720904512691a9c8545a9d173c08c2e8599010c972c2c34287d91ac7803a5700a0d6e29b7774f8f487b70cf8d0ec9474443e2c0c051116b16aef491c3945a65e6ddcd7931a7259e56902a2866b95d3c0bb7a3ea61b1f3b54ae56e6a7366ea895056ea0d1c251cd74f7b82b0d47464826f4aca77434df3d909271a825b57890cd830011981d95229cc0427cdc97758ddbc76d6cc77ba06c92d19daac8bbecbf55535e98bd4754ec06a6e632225c43bc46068baa688636eaba53926ca093a7addcd6a696a902ac35631aa43d9d66f77270cc7bf66140dac239034ba304e1aa0a265131e9fb2b7f079861b0e4cb9c911ce82ef0b685002476baf26401dc8cc444543129f82ac6b103881c596b19d9eba8ed6b230c17914d5c34a0040c18dc54d8c4b637ee683637fc5a82ac1cf12691bb28fc0bbb307fc032ec3d2b06eaec56ed769b5e892816c7350dce89551e87918f67a117c39f256a368586c78c2e9614e9658161511a8dad53afe8cb9eebe67c6596a90eeea1d3d2466a4d77a1129c0a4409b98d8ac0b925c4b2b3500665a3cf4ceb82cb0b6732eea8a796f9b79d2ea49be97066bc1f606d9f1f59f41d2acbb878a0783093fc4ab0ef866ff60a6a1a58d3cee90307f09247b5212f8709856251ff5d8fb77657110bbb3f3aeff07898f049c821a82c11e27b0c176a9feb12de5d08498018f7607156c5065cb56bf9d6867a4495f26a07e0f01312c2ee897b82d8eba0cbc473da402814dba727521cfec6afac2cc59cdd6a75e1f8f40585e5cda51a7434a81ccf4b7de33c663dc174ba973cebc5a56831005d231c719ea34ce42999c471fccfdbdbaf1acd2f9c16f258e32c70511c475ab264173246ebf31459a05ecb4df443066b61a243903e80ff907af17a96d7afd9763df8f8c4fc49775bc805e2dc165bd6f1c4e06688521557ed9ddb6860fbed1e32957bea1174b3a9aa809d7fa6301fbbb6b3774cd856095f14c6378cfe98f05d4f06fae91769165dd0adfc51bf8f57d701ef14a99d608db0a104ea78fe5b13794cb8529afa5352d1dbc8235d96148c8f9c2e29d6e2359a8dbeba56c9376b26f8384c66548979f4d982fe0652cd86bb60e6f2463ec63dcdd5f93d4bfaefe48f8012c63b32ad3c02ec9088896f6a0c8b1097c1ad911ada7a2d6f0d201a28b70752182885464dd688535bdfc045e8dafbe34b20eca00848e757b4a37de219be5a5fe7a4bc5cfaad29ed92e9eda2bed08407e0d0f53caf6b3590210067d8b9ef16f9a8f5612315dfa415f1efc8d7349394143a149480ce3ccd60ccaff0d9a8a797820f41b431ce3afc4adb2e07cde16015087e09e08bd13471dee960db35cbc3b53c187a5bca7ed50017e09b2ae2c837b1f6557753c7f5b004332ffa2b52d8a2269e7cf9cc397c6079aa5add61d7a560a894e71510e104f52a93622e34037b1db70a05bcfc546ea2ec7153e69a8df18fa9eadaae2c1438710477a9a23e0f7092c310c5288e2d39d362a0a33f9e3d8d9792b51a71d9014abcff66ee509baa3dad341b1e4b6c601a2966f77172a4df0f32170f3386a6600b0b63699fe21e26eeb475507e99f666e0ac349b9e23463450f4fa4498356887d9e1c5f7d18ade51e526d27ccae799d6775336ca9ca8e54d707639ecb0618a3c675533494e2435c0b3780a66defddd217d2cc464014bef8a051d8f292abf9e5cafa78c600c21ed3d40ede937b1e162a1e14757d39d77d4fad8711b6b46ae707b82ced0739f9fb6bcd9b557982e89bb3af5f3fb5448ea960f454f4475ee78970acda37501a8825a04cecf3e544651eea8933379da3c3e7de0a875d689003c00d276470fda3b6ed6473cf8094ab91784d1c0f9468379e8e9729dc1032a5ca14378f8147409f13cd6994de961e2245b35c814596087625d3d3267fc0c1e5614a4af94993091ead40bc9e1d3093228b70c188855ae9e914b15aacfd4f83fde83072af92b2cc968c93cac74e15322eaff32a7bbbb982fb725aeb71f34bf16323d9c0a11dbaf3ab676a9cd1dcfc3f8a0c66d1f082f23806133002c50b59d4513dbe3419d5002263287ff47abdba0862341effe669f26b375337170c8e0742113e1063e8141c4aa9eb4970471f3187f581b71e6f7fe2f8043d065620da8a066d112fedeb33525eb1061c0d0fe9fb415bddae8ed2eb5c3ae6aa0549230e436afacaddc389b2c66499d7fdec2090e7e13560ca0a64803554c7cd9cfcc1cb48427cf9ccd954bb7446c887e2756db2882ff12eaa64efae3a24b35d1d0402922efe90319510495420301d3360f4486d3f87e3dc4f9337bf3fb4e3c6a82850a840153a1936e7cf74086757b72a8db19d33a62a29f3dd4fdef454d9222031aa0958af21851b66aebc09a5c08efd204f3ff18cb1055e8181d6630309fcc91c0d6daef19e618a3ee23e817a586d02364710cfab0b9f2cf18502a34e67d112f1730d44ccae54dc221d7f3877bb828e7109878109f8e95e2e1407df4e588801d25d9c2a1c501e74890631e9a92d823ebbe6b5635488f7d48788ef77658e3bbaf287536b37d3a7ab1ec1749656f2ebfe562765e71dd3e1b895d9b5c315fcf2b3a063c57e74ad1e7586b293ede4c77732f38d316c14210a121153fc50007f78ed64a8e207e9d04b312ae7f97a946c74d2a1181b67e845c3ac6e340b2428c8a5546679707fded3406fc221900b118a3279e13b74926c793e27fc4cc32ae478b4421d6eef75d3a273ff61d0e95b4981e8dd57e16bb00e09bfbbc2ce60cd844a9abb839b8b671fabddfd6e86a30c0a24e73c3c17770f34641951e5dc73ca11d8f8419a7407d483e0f5f1714df0a1775574b5500e8a5a28c655dbc28d7a1ca4b83fd4ebcc7ef2e4994c97c87659681acebe7417328c8612e8570e7ade7ead7f4fc711c9c539362779e6be525bdf5ec037f670b5235c06a1acd89b4ffc21668a7269cc73bf6d1399852eebb8b1dde8ef072e8d80832ba32c8e9480da2c4f5c3209c557f31beef41c00d22ee7c7e2c1bf9952ba8a03c1afae9b4aa63135d2b131f2b2804afcdcc762e1bcec8c8151f471572888933ce97dd787121ced446aa9718bf3766bb6d8a752692c59489d5b565e1693aa0f67b352f915808e415cba13a9864bbd33ebc97dfdc0d357d6769f2f545cc6529c0f634da901ae63bfcbab0a3896bc43faed6a6c23bb4e92f3d669d2e0ff485287cce322b98d02866f026cc556ec8aba6608ac2b5dbc29e104ef2e28d7b51ce63110025bdbfc5d44e8aa7a04ecece07b9860618a162e7289e8d672bb9b15b6ffc87f738b0c7a2b733c5794afe58b1beee4b6780ed453bf2ef2b584dcf32bf732c98fe359abced05fc115e531b088c61b0d5d5058af10120581d7db192e13a5b7b17874f000343aecc8d5005b91b13720bc831de5f1de5e3ddce27ba05213cd126a7cda0afa9745f498200269a5736f63b0faec36bbd646a868100c17cb7f6639f2f14b6c52198fab04c1645bed8763799acf8fef62b82fda1825a3379c000255002788d686695b4c17be3931e69db8980d0216024e9b7b0588cdf8c8102d11f55f971b3163c392cfaa796e0b85dd0bbacd6ca50b3ab80c2e90fa0c18d3526e05b2a46c2eab823c0511b43c71122d533e27ee6d6e34706fc411c67a3b87440a3429df3009996743ed3e4dc244fac98a789f17818a926a0aae81ecde260982b80acc299f57a570a86ee28d0414edc91fb6d5f9a88aeb31bf22270bf3517aefe1140b05be97123cc43df6e8e8e4df96803fdd59715c87afcf0189fb5448663eb35d2c4e5b13dd0233a95f8d6187bf0d5d3ba35adba59e162e877d5a0397d9495ebfc771ae68283be15d883e91b81b1bb0cd8da6c300df7e2bc8a21094cadc974c8270d8ee37fc7e7501a57eaecbc244ed61cfc8d556e38c0611a5269c3b930ee5f37a9771f0c152a5e28df07a104360c973b9a83d3ec5c0aa012bff141842e9b68222647c7d022753dbaae024877f421ff36b3721c26a39b3009683c8c510ba0ba8b5dc1033f9b56e9a43b3141a92599378622a2ca8136f5f1f51cf7b7dce7d043f65f8562b33c4864adc30e7d4c808b10abbbd92f94272b68b063f7d7baf7fd6eb31cc76690042233bc8dee7253f89ce23de7a535af022dae95ac321694d6ce311744d9c152e4424a0a502d221b2e602ada71c60a2f15b7086d75867476b0633063297681fbb0a3e154efe552cdbd9d3203f2e447b60b643b823ea12f504f33f6b6c3bd20e54cf38e3c45c5d472814db60741687894e6cc3c78196d5e722499d202334fb742f14dc2ccb7d114ae0c4cd61ce2ed0cc7fe25a395d6b73c1dfee9174e59d129e7f3c42f93a246d918028d4e2dc804438799 ").unwrap(); - let signature = manager.sign_transaction(&address, &huge_tx); + let signature = ledger.sign_transaction(&address, &huge_tx); println!("Got {:?}", signature); assert!(signature.is_ok()); } diff --git a/hw/src/lib.rs b/accounts/hw/src/lib.rs similarity index 64% rename from hw/src/lib.rs rename to accounts/hw/src/lib.rs index 98e682a305b..a7da8da45e2 100644 --- a/hw/src/lib.rs +++ b/accounts/hw/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Hardware wallet management. @@ -34,15 +34,18 @@ extern crate trezor_sys; mod ledger; mod trezor; -use std::sync::{Arc, atomic, atomic::AtomicBool}; +use std::sync::{Arc, atomic, atomic::AtomicBool, Weak}; use std::{fmt, time::Duration}; +use std::thread; use ethereum_types::U256; use ethkey::{Address, Signature}; use parking_lot::Mutex; -const USB_DEVICE_CLASS_DEVICE: u8 = 0; -const POLLING_DURATION: Duration = Duration::from_millis(500); +const HID_GLOBAL_USAGE_PAGE: u16 = 0xFF00; +const HID_USB_DEVICE_CLASS: u8 = 0; +const MAX_POLLING_DURATION: Duration = Duration::from_millis(500); +const USB_EVENT_POLLING_INTERVAL: Duration = Duration::from_millis(500); /// `HardwareWallet` device #[derive(Debug)] @@ -60,7 +63,7 @@ pub trait Wallet<'a> { /// Sign transaction data with wallet managing `address`. fn sign_transaction(&self, address: &Address, transaction: Self::Transaction) -> Result; - + /// Set key derivation path for a chain. fn set_key_path(&self, key_path: KeyPath); @@ -189,7 +192,7 @@ impl From for Error { } /// Specifies the direction of the `HardwareWallet` i.e, whether it arrived or left -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Copy, Clone, PartialEq)] pub enum DeviceDirection { /// Device arrived Arrived, @@ -218,13 +221,47 @@ impl HardwareWalletManager { pub fn new() -> Result { let exiting = Arc::new(AtomicBool::new(false)); let hidapi = Arc::new(Mutex::new(hidapi::HidApi::new().map_err(|e| Error::Hid(e.to_string().clone()))?)); - let ledger = ledger::Manager::new(hidapi.clone(), exiting.clone())?; - let trezor = trezor::Manager::new(hidapi.clone(), exiting.clone())?; + let ledger = ledger::Manager::new(hidapi.clone()); + let trezor = trezor::Manager::new(hidapi.clone()); + let usb_context = Arc::new(libusb::Context::new()?); + + let l = ledger.clone(); + let t = trezor.clone(); + let exit = exiting.clone(); + + // Subscribe to all vendor IDs (VIDs) and product IDs (PIDs) + // This means that the `HardwareWalletManager` is responsible to validate the detected device + usb_context.register_callback( + None, None, Some(HID_USB_DEVICE_CLASS), + Box::new(EventHandler::new( + Arc::downgrade(&ledger), + Arc::downgrade(&trezor) + )) + )?; + + // Hardware event subscriber thread + thread::Builder::new() + .name("hw_wallet_manager".to_string()) + .spawn(move || { + if let Err(e) = l.update_devices(DeviceDirection::Arrived) { + debug!(target: "hw", "Ledger couldn't connect at startup, error: {}", e); + } + if let Err(e) = t.update_devices(DeviceDirection::Arrived) { + debug!(target: "hw", "Trezor couldn't connect at startup, error: {}", e); + } + + while !exit.load(atomic::Ordering::Acquire) { + if let Err(e) = usb_context.handle_events(Some(USB_EVENT_POLLING_INTERVAL)) { + debug!(target: "hw", "HardwareWalletManager event handler error: {}", e); + } + } + }) + .ok(); Ok(Self { exiting, - ledger, trezor, + ledger, }) } @@ -292,10 +329,74 @@ impl HardwareWalletManager { impl Drop for HardwareWalletManager { fn drop(&mut self) { - // Indicate to the USB Hotplug handlers that they - // shall terminate but don't wait for them to terminate. - // If they don't terminate for some reason USB Hotplug events will be handled + // Indicate to the USB Hotplug handler that it + // shall terminate but don't wait for it to terminate. + // If it doesn't terminate for some reason USB Hotplug events will be handled // even if the HardwareWalletManger has been dropped self.exiting.store(true, atomic::Ordering::Release); } } + +/// Hardware wallet event handler +/// +/// Note, that this runs to completion and race-conditions can't occur but it can +/// stop other events for being processed with an infinite loop or similar +struct EventHandler { + ledger: Weak, + trezor: Weak, +} + +impl EventHandler { + /// Trezor event handler constructor + pub fn new(ledger: Weak, trezor: Weak) -> Self { + Self { ledger, trezor } + } + + fn extract_device_info(device: &libusb::Device) -> Result<(u16, u16), Error> { + let desc = device.device_descriptor()?; + Ok((desc.vendor_id(), desc.product_id())) + } +} + +impl libusb::Hotplug for EventHandler { + fn device_arrived(&mut self, device: libusb::Device) { + // Upgrade reference to an Arc + if let (Some(ledger), Some(trezor)) = (self.ledger.upgrade(), self.trezor.upgrade()) { + // Version ID and Product ID are available + if let Ok((vid, pid)) = Self::extract_device_info(&device) { + if trezor::is_valid_trezor(vid, pid) { + if !trezor::try_connect_polling(&trezor, &MAX_POLLING_DURATION, DeviceDirection::Arrived) { + trace!(target: "hw", "Trezor device was detected but connection failed"); + } + } else if ledger::is_valid_ledger(vid, pid) { + if !ledger::try_connect_polling(&ledger, &MAX_POLLING_DURATION, DeviceDirection::Arrived) { + trace!(target: "hw", "Ledger device was detected but connection failed"); + } + } + } + } + } + + fn device_left(&mut self, device: libusb::Device) { + // Upgrade reference to an Arc + if let (Some(ledger), Some(trezor)) = (self.ledger.upgrade(), self.trezor.upgrade()) { + // Version ID and Product ID are available + if let Ok((vid, pid)) = Self::extract_device_info(&device) { + if trezor::is_valid_trezor(vid, pid) { + if !trezor::try_connect_polling(&trezor, &MAX_POLLING_DURATION, DeviceDirection::Left) { + trace!(target: "hw", "Trezor device was detected but disconnection failed"); + } + } else if ledger::is_valid_ledger(vid, pid) { + if !ledger::try_connect_polling(&ledger, &MAX_POLLING_DURATION, DeviceDirection::Left) { + trace!(target: "hw", "Ledger device was detected but disconnection failed"); + } + } + } + } + } +} + +/// Helper to determine if a device is a valid HID +pub fn is_valid_hid_device(usage_page: u16, interface_number: i32) -> bool { + usage_page == HID_GLOBAL_USAGE_PAGE || interface_number == HID_USB_DEVICE_CLASS as i32 +} diff --git a/hw/src/trezor.rs b/accounts/hw/src/trezor.rs similarity index 75% rename from hw/src/trezor.rs rename to accounts/hw/src/trezor.rs index efd259d7806..b20123ed8b3 100644 --- a/hw/src/trezor.rs +++ b/accounts/hw/src/trezor.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Trezor hardware wallet module. Supports Trezor v1. //! See @@ -20,9 +20,9 @@ //! for protocol details. use std::cmp::{min, max}; -use std::sync::{atomic, atomic::AtomicBool, Arc, Weak}; +use std::sync::Arc; use std::time::{Duration, Instant}; -use std::{fmt, thread}; +use std::fmt; use ethereum_types::{U256, H256, Address}; use ethkey::Signature; @@ -30,7 +30,7 @@ use hidapi; use libusb; use parking_lot::{Mutex, RwLock}; use protobuf::{self, Message, ProtobufEnum}; -use super::{DeviceDirection, WalletInfo, TransactionInfo, KeyPath, Wallet, Device, USB_DEVICE_CLASS_DEVICE, POLLING_DURATION}; +use super::{DeviceDirection, WalletInfo, TransactionInfo, KeyPath, Wallet, Device, is_valid_hid_device}; use trezor_sys::messages::{EthereumAddress, PinMatrixAck, MessageType, EthereumTxRequest, EthereumSignTx, EthereumGetAddress, EthereumTxAck, ButtonAck}; /// Trezor v1 vendor ID @@ -48,6 +48,8 @@ pub enum Error { Protocol(&'static str), /// Hidapi error. Usb(hidapi::HidError), + /// Libusb error + LibUsb(libusb::Error), /// Device with request key is not available. KeyNotFound, /// Signing has been cancelled by user. @@ -62,6 +64,8 @@ pub enum Error { NoDeviceArrived, /// No device left NoDeviceLeft, + /// Invalid PID or VID + InvalidDevice, } impl fmt::Display for Error { @@ -69,13 +73,15 @@ impl fmt::Display for Error { match *self { Error::Protocol(ref s) => write!(f, "Trezor protocol error: {}", s), Error::Usb(ref e) => write!(f, "USB communication error: {}", e), + Error::LibUsb(ref e) => write!(f, "LibUSB communication error: {}", e), Error::KeyNotFound => write!(f, "Key not found"), Error::UserCancel => write!(f, "Operation has been cancelled"), Error::BadMessageType => write!(f, "Bad Message Type in RPC call"), Error::LockedDevice(ref s) => write!(f, "Device is locked, needs PIN to perform operations: {}", s), Error::NoSigningMessage=> write!(f, "Signing messages are not supported by Trezor"), Error::NoDeviceArrived => write!(f, "No device arrived"), - Error::NoDeviceLeft=> write!(f, "No device left"), + Error::NoDeviceLeft => write!(f, "No device left"), + Error::InvalidDevice => write!(f, "Device with non-supported product ID or vendor ID was detected"), } } } @@ -86,6 +92,12 @@ impl From for Error { } } +impl From for Error { + fn from(err: libusb::Error) -> Self { + Error::LibUsb(err) + } +} + impl From for Error { fn from(_: protobuf::ProtobufError) -> Self { Error::Protocol(&"Could not read response from Trezor Device") @@ -93,7 +105,7 @@ impl From for Error { } /// Trezor device manager -pub (crate) struct Manager { +pub struct Manager { usb: Arc>, devices: RwLock>, locked_devices: RwLock>, @@ -108,42 +120,13 @@ enum HidVersion { impl Manager { /// Create a new instance. - pub fn new(hidapi: Arc>, exiting: Arc) -> Result, libusb::Error> { - let manager = Arc::new(Self { - usb: hidapi, + pub fn new(usb: Arc>) -> Arc { + Arc::new(Self { + usb, devices: RwLock::new(Vec::new()), locked_devices: RwLock::new(Vec::new()), key_path: RwLock::new(KeyPath::Ethereum), - }); - - let usb_context = Arc::new(libusb::Context::new()?); - let m = manager.clone(); - - // Subscribe to TREZOR V1 - // Note, this support only TREZOR V1 because TREZOR V2 has a different vendorID for some reason - // Also, we now only support one product as the second argument specifies - usb_context.register_callback( - Some(TREZOR_VID), Some(TREZOR_PIDS[0]), Some(USB_DEVICE_CLASS_DEVICE), - Box::new(EventHandler::new(Arc::downgrade(&manager))))?; - - // Trezor event thread - thread::Builder::new() - .name("hw_wallet_trezor".to_string()) - .spawn(move || { - if let Err(e) = m.update_devices(DeviceDirection::Arrived) { - debug!(target: "hw", "Trezor couldn't connect at startup, error: {}", e); - } - loop { - usb_context.handle_events(Some(Duration::from_millis(500))) - .unwrap_or_else(|e| debug!(target: "hw", "Trezor event handler error: {}", e)); - if exiting.load(atomic::Ordering::Acquire) { - break; - } - } - }) - .ok(); - - Ok(manager) + }) } pub fn pin_matrix_ack(&self, device_path: &str, pin: &str) -> Result { @@ -153,7 +136,7 @@ impl Manager { let t = MessageType::MessageType_PinMatrixAck; let mut m = PinMatrixAck::new(); m.set_pin(pin.to_string()); - self.send_device_message(&device, &t, &m)?; + self.send_device_message(&device, t, &m)?; let (resp_type, _) = self.read_device_response(&device)?; match resp_type { // Getting an Address back means it's unlocked, this is undocumented behavior @@ -178,7 +161,7 @@ impl Manager { match resp_type { MessageType::MessageType_Cancel => Err(Error::UserCancel), MessageType::MessageType_ButtonRequest => { - self.send_device_message(handle, &MessageType::MessageType_ButtonAck, &ButtonAck::new())?; + self.send_device_message(handle, MessageType::MessageType_ButtonAck, &ButtonAck::new())?; // Signing loop goes back to the top and reading blocks // for up to 5 minutes waiting for response from the device // if the user doesn't click any button within 5 minutes you @@ -191,7 +174,7 @@ impl Manager { let mut msg = EthereumTxAck::new(); let len = resp.get_data_length() as usize; msg.set_data_chunk(data[..len].to_vec()); - self.send_device_message(handle, &MessageType::MessageType_EthereumTxAck, &msg)?; + self.send_device_message(handle, MessageType::MessageType_EthereumTxAck, &msg)?; self.signing_loop(handle, chain_id, &data[len..]) } else { let v = resp.get_signature_v(); @@ -216,8 +199,8 @@ impl Manager { } } - fn send_device_message(&self, device: &hidapi::HidDevice, msg_type: &MessageType, msg: &Message) -> Result { - let msg_id = *msg_type as u16; + fn send_device_message(&self, device: &hidapi::HidDevice, msg_type: MessageType, msg: &Message) -> Result { + let msg_id = msg_type as u16; let mut message = msg.write_to_bytes()?; let msg_size = message.len(); let mut data = Vec::new(); @@ -284,7 +267,7 @@ impl Manager { } } -impl <'a>Wallet<'a> for Manager { +impl<'a> Wallet<'a> for Manager { type Error = Error; type Transaction = &'a TransactionInfo; @@ -316,7 +299,7 @@ impl <'a>Wallet<'a> for Manager { message.set_chain_id(c_id as u32); } - self.send_device_message(&handle, &msg_type, &message)?; + self.send_device_message(&handle, msg_type, &message)?; self.signing_loop(&handle, &t_info.chain_id, &t_info.data[first_chunk_length..]) } @@ -332,13 +315,9 @@ impl <'a>Wallet<'a> for Manager { let num_prev_devices = self.devices.read().len(); let detected_devices = devices.iter() - .filter(|&d| { - let is_trezor = d.vendor_id == TREZOR_VID; - let is_supported_product = TREZOR_PIDS.contains(&d.product_id); - let is_valid = d.usage_page == 0xFF00 || d.interface_number == 0; - - is_trezor && is_supported_product && is_valid - }) + .filter(|&d| is_valid_trezor(d.vendor_id, d.product_id) && + is_valid_hid_device(d.usage_page, d.interface_number) + ) .fold(Vec::new(), |mut v, d| { match self.read_device(&usb, &d) { Ok(info) => { @@ -349,7 +328,7 @@ impl <'a>Wallet<'a> for Manager { }; v }); - + let num_curr_devices = detected_devices.len(); *self.devices.write() = detected_devices; @@ -363,7 +342,7 @@ impl <'a>Wallet<'a> for Manager { } DeviceDirection::Left => { if num_prev_devices > num_curr_devices { - Ok(num_prev_devices- num_curr_devices) + Ok(num_prev_devices - num_curr_devices) } else { Err(Error::NoDeviceLeft) } @@ -413,7 +392,7 @@ impl <'a>Wallet<'a> for Manager { KeyPath::EthereumClassic => message.set_address_n(ETC_DERIVATION_PATH.to_vec()), } message.set_show_display(false); - self.send_device_message(&device, &typ, &message)?; + self.send_device_message(&device, typ, &message)?; let (resp_type, bytes) = self.read_device_response(&device)?; match resp_type { @@ -432,8 +411,8 @@ impl <'a>Wallet<'a> for Manager { } } -// Try to connect to the device using polling in at most the time specified by the `timeout` -fn try_connect_polling(trezor: &Manager, duration: &Duration, dir: DeviceDirection) -> bool { +/// Poll the device in maximum `max_polling_duration` if it doesn't succeed +pub fn try_connect_polling(trezor: &Manager, duration: &Duration, dir: DeviceDirection) -> bool { let start_time = Instant::now(); while start_time.elapsed() <= *duration { if let Ok(num_devices) = trezor.update_devices(dir) { @@ -444,40 +423,9 @@ fn try_connect_polling(trezor: &Manager, duration: &Duration, dir: DeviceDirecti false } -/// Trezor event handler -/// A separate thread is handling incoming events -/// -/// Note, that this run to completion and race-conditions can't occur but this can -/// therefore starve other events for being process with a spinlock or similar -struct EventHandler { - trezor: Weak, -} - -impl EventHandler { - /// Trezor event handler constructor - pub fn new(trezor: Weak) -> Self { - Self { trezor } - } -} - -impl libusb::Hotplug for EventHandler { - fn device_arrived(&mut self, _device: libusb::Device) { - debug!(target: "hw", "Trezor V1 arrived"); - if let Some(trezor) = self.trezor.upgrade() { - if try_connect_polling(&trezor, &POLLING_DURATION, DeviceDirection::Arrived) != true { - trace!(target: "hw", "No Trezor connected"); - } - } - } - - fn device_left(&mut self, _device: libusb::Device) { - debug!(target: "hw", "Trezor V1 left"); - if let Some(trezor) = self.trezor.upgrade() { - if try_connect_polling(&trezor, &POLLING_DURATION, DeviceDirection::Left) != true { - trace!(target: "hw", "No Trezor disconnected"); - } - } - } +/// Check if the detected device is a Trezor device by checking both the product ID and the vendor ID +pub fn is_valid_trezor(vid: u16, pid: u16) -> bool { + vid == TREZOR_VID && TREZOR_PIDS.contains(&pid) } #[test] @@ -485,32 +433,31 @@ impl libusb::Hotplug for EventHandler { /// This test can't be run without an actual trezor device connected /// (and unlocked) attached to the machine that's running the test fn test_signature() { - use ethereum_types::{H160, H256, U256}; + use ethereum_types::Address; + use MAX_POLLING_DURATION; + use super::HardwareWalletManager; - let manager = Manager::new( - Arc::new(Mutex::new(hidapi::HidApi::new().expect("HidApi"))), - Arc::new(AtomicBool::new(false)) - ).expect("HardwareWalletManager"); - - let addr: Address = H160::from("some_addr"); + let manager = HardwareWalletManager::new().unwrap(); - assert_eq!(try_connect_polling(&manager.clone(), &POLLING_DURATION, DeviceDirection::Arrived), true); + assert_eq!(try_connect_polling(&manager.trezor, &MAX_POLLING_DURATION, DeviceDirection::Arrived), true); + + let addr: Address = manager.list_wallets() + .iter() + .filter(|d| d.name == "TREZOR".to_string() && d.manufacturer == "SatoshiLabs".to_string()) + .nth(0) + .map(|d| d.address) + .unwrap(); let t_info = TransactionInfo { nonce: U256::from(1), gas_price: U256::from(100), gas_limit: U256::from(21_000), - to: Some(H160::from("some_other_addr")), - chain_id: Some(17), + to: Some(Address::from(1337)), + chain_id: Some(1), value: U256::from(1_000_000), data: (&[1u8; 3000]).to_vec(), }; - let signature = manager.sign_transaction(&addr, &t_info).unwrap(); - let expected = Signature::from_rsv( - &H256::from("device_specific_r"), - &H256::from("device_specific_s"), - 0x01 - ); - - assert_eq!(signature, expected) + + let signature = manager.trezor.sign_transaction(&addr, &t_info); + assert!(signature.is_ok()); } diff --git a/accounts/src/account_data.rs b/accounts/src/account_data.rs new file mode 100644 index 00000000000..a36d38740e4 --- /dev/null +++ b/accounts/src/account_data.rs @@ -0,0 +1,73 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +//! Account Metadata + +use std::{ + collections::HashMap, + time::Instant, +}; + +use ethkey::{Address, Password}; +use serde_derive::{Serialize, Deserialize}; +use serde_json; + +/// Type of unlock. +#[derive(Clone, PartialEq)] +pub enum Unlock { + /// If account is unlocked temporarily, it should be locked after first usage. + OneTime, + /// Account unlocked permanently can always sign message. + /// Use with caution. + Perm, + /// Account unlocked with a timeout + Timed(Instant), +} + +/// Data associated with account. +#[derive(Clone)] +pub struct AccountData { + pub unlock: Unlock, + pub password: Password, +} + +/// Collected account metadata +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct AccountMeta { + /// The name of the account. + pub name: String, + /// The rest of the metadata of the account. + pub meta: String, + /// The 128-bit Uuid of the account, if it has one (brain-wallets don't). + pub uuid: Option, +} + +impl AccountMeta { + /// Read a hash map of Address -> AccountMeta + pub fn read(reader: R) -> Result, serde_json::Error> where + R: ::std::io::Read, + { + serde_json::from_reader(reader) + } + + /// Write a hash map of Address -> AccountMeta + pub fn write(m: &HashMap, writer: &mut W) -> Result<(), serde_json::Error> where + W: ::std::io::Write, + { + serde_json::to_writer(writer, m) + } +} + diff --git a/accounts/src/error.rs b/accounts/src/error.rs new file mode 100644 index 00000000000..2aa3564efd5 --- /dev/null +++ b/accounts/src/error.rs @@ -0,0 +1,56 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::fmt; + +use ethstore::{Error as SSError}; +use hardware_wallet::{Error as HardwareError}; + +/// Signing error +#[derive(Debug)] +pub enum SignError { + /// Account is not unlocked + NotUnlocked, + /// Account does not exist. + NotFound, + /// Low-level hardware device error. + Hardware(HardwareError), + /// Low-level error from store + SStore(SSError), +} + +impl fmt::Display for SignError { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + match *self { + SignError::NotUnlocked => write!(f, "Account is locked"), + SignError::NotFound => write!(f, "Account does not exist"), + SignError::Hardware(ref e) => write!(f, "{}", e), + SignError::SStore(ref e) => write!(f, "{}", e), + } + } +} + +impl From for SignError { + fn from(e: HardwareError) -> Self { + SignError::Hardware(e) + } +} + +impl From for SignError { + fn from(e: SSError) -> Self { + SignError::SStore(e) + } +} diff --git a/ethcore/src/account_provider/mod.rs b/accounts/src/lib.rs similarity index 91% rename from ethcore/src/account_provider/mod.rs rename to accounts/src/lib.rs index 04bc4f4099d..0107eadad0d 100644 --- a/ethcore/src/account_provider/mod.rs +++ b/accounts/src/lib.rs @@ -1,107 +1,68 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . + +#![warn(missing_docs)] //! Account management. +mod account_data; +mod error; mod stores; +#[cfg(not(any(target_os = "linux", target_os = "macos", target_os = "windows")))] +extern crate fake_hardware_wallet as hardware_wallet; + +use self::account_data::{Unlock, AccountData}; use self::stores::AddressBook; use std::collections::HashMap; -use std::fmt; use std::time::{Instant, Duration}; +use common_types::transaction::{Action, Transaction}; +use ethkey::{Address, Message, Public, Secret, Password, Random, Generator}; use ethstore::accounts_dir::MemoryDirectory; -use ethstore::ethkey::{Address, Message, Public, Secret, Password, Random, Generator}; -use ethjson::misc::AccountMeta; use ethstore::{ - SimpleSecretStore, SecretStore, Error as SSError, EthStore, EthMultiStore, + SimpleSecretStore, SecretStore, EthStore, EthMultiStore, random_string, SecretVaultRef, StoreAccountRef, OpaqueSecret, }; +use log::{warn, debug}; use parking_lot::RwLock; -pub use ethstore::ethkey::Signature; -pub use ethstore::{Derivation, IndexDerivation, KeyFile}; +pub use ethkey::Signature; +pub use ethstore::{Derivation, IndexDerivation, KeyFile, Error}; pub use hardware_wallet::{Error as HardwareError, HardwareWalletManager, KeyPath, TransactionInfo}; -pub use super::transaction::{Action, Transaction}; - -/// Type of unlock. -#[derive(Clone, PartialEq)] -enum Unlock { - /// If account is unlocked temporarily, it should be locked after first usage. - OneTime, - /// Account unlocked permanently can always sign message. - /// Use with caution. - Perm, - /// Account unlocked with a timeout - Timed(Instant), -} - -/// Data associated with account. -#[derive(Clone)] -struct AccountData { - unlock: Unlock, - password: Password, -} - -/// Signing error -#[derive(Debug)] -pub enum SignError { - /// Account is not unlocked - NotUnlocked, - /// Account does not exist. - NotFound, - /// Low-level hardware device error. - Hardware(HardwareError), - /// Low-level error from store - SStore(SSError), -} -impl fmt::Display for SignError { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - match *self { - SignError::NotUnlocked => write!(f, "Account is locked"), - SignError::NotFound => write!(f, "Account does not exist"), - SignError::Hardware(ref e) => write!(f, "{}", e), - SignError::SStore(ref e) => write!(f, "{}", e), - } - } -} - -impl From for SignError { - fn from(e: HardwareError) -> Self { - SignError::Hardware(e) - } -} +pub use self::account_data::AccountMeta; +pub use self::error::SignError; -impl From for SignError { - fn from(e: SSError) -> Self { - SignError::SStore(e) - } -} - -/// `AccountProvider` errors. -pub type Error = SSError; +type AccountToken = Password; -fn transient_sstore() -> EthMultiStore { - EthMultiStore::open(Box::new(MemoryDirectory::default())).expect("MemoryDirectory load always succeeds; qed") +/// Account management settings. +#[derive(Debug, Default)] +pub struct AccountProviderSettings { + /// Enable hardware wallet support. + pub enable_hardware_wallets: bool, + /// Use the classic chain key on the hardware wallet. + pub hardware_wallet_classic_key: bool, + /// Store raw account secret when unlocking the account permanently. + pub unlock_keep_secret: bool, + /// Disallowed accounts. + pub blacklisted_accounts: Vec

, } -type AccountToken = Password; - /// Account management. /// Responsible for unlocking accounts. pub struct AccountProvider { @@ -124,27 +85,8 @@ pub struct AccountProvider { blacklisted_accounts: Vec
, } -/// Account management settings. -pub struct AccountProviderSettings { - /// Enable hardware wallet support. - pub enable_hardware_wallets: bool, - /// Use the classic chain key on the hardware wallet. - pub hardware_wallet_classic_key: bool, - /// Store raw account secret when unlocking the account permanently. - pub unlock_keep_secret: bool, - /// Disallowed accounts. - pub blacklisted_accounts: Vec
, -} - -impl Default for AccountProviderSettings { - fn default() -> Self { - AccountProviderSettings { - enable_hardware_wallets: false, - hardware_wallet_classic_key: false, - unlock_keep_secret: false, - blacklisted_accounts: vec![], - } - } +fn transient_sstore() -> EthMultiStore { + EthMultiStore::open(Box::new(MemoryDirectory::default())).expect("MemoryDirectory load always succeeds; qed") } impl AccountProvider { @@ -221,7 +163,7 @@ impl AccountProvider { let account = self.sstore.insert_account(SecretVaultRef::Root, secret, password)?; if self.blacklisted_accounts.contains(&account.address) { self.sstore.remove_account(&account, password)?; - return Err(SSError::InvalidAccount.into()); + return Err(Error::InvalidAccount.into()); } Ok(account.address) } @@ -251,7 +193,7 @@ impl AccountProvider { let account = self.sstore.import_wallet(SecretVaultRef::Root, json, password, gen_id)?; if self.blacklisted_accounts.contains(&account.address) { self.sstore.remove_account(&account, password)?; - return Err(SSError::InvalidAccount.into()); + return Err(Error::InvalidAccount.into()); } Ok(Address::from(account.address).into()) } @@ -284,7 +226,7 @@ impl AccountProvider { return Ok(accounts.into_iter().map(|a| a.address).collect()); } } - Err(SSError::Custom("No hardware wallet accounts were found".into())) + Err(Error::Custom("No hardware wallet accounts were found".into())) } /// Get a list of paths to locked hardware wallets @@ -669,7 +611,7 @@ impl AccountProvider { mod tests { use super::{AccountProvider, Unlock}; use std::time::{Duration, Instant}; - use ethstore::ethkey::{Generator, Random, Address}; + use ethkey::{Generator, Random, Address}; use ethstore::{StoreAccountRef, Derivation}; use ethereum_types::H256; diff --git a/ethcore/src/account_provider/stores.rs b/accounts/src/stores.rs similarity index 83% rename from ethcore/src/account_provider/stores.rs rename to accounts/src/stores.rs index 7124e91e23a..baa26cc48bb 100644 --- a/ethcore/src/account_provider/stores.rs +++ b/accounts/src/stores.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Address Book Store @@ -20,8 +20,10 @@ use std::{fs, fmt, hash, ops}; use std::collections::HashMap; use std::path::{Path, PathBuf}; -use ethstore::ethkey::Address; -use ethjson::misc::AccountMeta; +use ethkey::Address; +use log::{trace, warn}; + +use crate::AccountMeta; /// Disk-backed map from Address to String. Uses JSON. pub struct AddressBook { @@ -153,8 +155,8 @@ impl DiskMap { mod tests { use super::AddressBook; use std::collections::HashMap; - use ethjson::misc::AccountMeta; use tempdir::TempDir; + use crate::account_data::AccountMeta; #[test] fn should_save_and_reload_address_book() { @@ -163,7 +165,9 @@ mod tests { b.set_name(1.into(), "One".to_owned()); b.set_meta(1.into(), "{1:1}".to_owned()); let b = AddressBook::new(tempdir.path()); - assert_eq!(b.get(), hash_map![1.into() => AccountMeta{name: "One".to_owned(), meta: "{1:1}".to_owned(), uuid: None}]); + assert_eq!(b.get(), vec![ + (1, AccountMeta {name: "One".to_owned(), meta: "{1:1}".to_owned(), uuid: None}) + ].into_iter().map(|(a, b)| (a.into(), b)).collect::>()); } #[test] @@ -177,9 +181,9 @@ mod tests { b.remove(2.into()); let b = AddressBook::new(tempdir.path()); - assert_eq!(b.get(), hash_map![ - 1.into() => AccountMeta{name: "One".to_owned(), meta: "{}".to_owned(), uuid: None}, - 3.into() => AccountMeta{name: "Three".to_owned(), meta: "{}".to_owned(), uuid: None} - ]); + assert_eq!(b.get(), vec![ + (1, AccountMeta{name: "One".to_owned(), meta: "{}".to_owned(), uuid: None}), + (3, AccountMeta{name: "Three".to_owned(), meta: "{}".to_owned(), uuid: None}), + ].into_iter().map(|(a, b)| (a.into(), b)).collect::>()); } } diff --git a/chainspec/src/main.rs b/chainspec/src/main.rs index 43f9c805754..45490fe7f6a 100644 --- a/chainspec/src/main.rs +++ b/chainspec/src/main.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate serde_json; extern crate ethjson; diff --git a/rpc_cli/Cargo.toml b/cli-signer/Cargo.toml similarity index 72% rename from rpc_cli/Cargo.toml rename to cli-signer/Cargo.toml index 7d4652c38cb..11dd06107e2 100644 --- a/rpc_cli/Cargo.toml +++ b/cli-signer/Cargo.toml @@ -3,11 +3,12 @@ authors = ["Parity "] description = "Parity Cli Tool" homepage = "http://parity.io" license = "GPL-3.0" -name = "rpc-cli" +name = "cli-signer" version = "1.4.0" [dependencies] +ethereum-types = "0.4" futures = "0.1" rpassword = "1.0" parity-rpc = { path = "../rpc" } -parity-rpc-client = { path = "../rpc_client" } +parity-rpc-client = { path = "rpc-client" } diff --git a/rpc_client/Cargo.toml b/cli-signer/rpc-client/Cargo.toml similarity index 59% rename from rpc_client/Cargo.toml rename to cli-signer/rpc-client/Cargo.toml index d105f72f91d..53ec983391e 100644 --- a/rpc_client/Cargo.toml +++ b/cli-signer/rpc-client/Cargo.toml @@ -7,6 +7,7 @@ name = "parity-rpc-client" version = "1.4.0" [dependencies] +ethereum-types = "0.4" futures = "0.1" log = "0.4" serde = "1.0" @@ -14,7 +15,7 @@ serde_json = "1.0" url = "1.2.0" matches = "0.1" parking_lot = "0.7" -jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -jsonrpc-ws-server = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -parity-rpc = { path = "../rpc" } +jsonrpc-core = "10.0.1" +jsonrpc-ws-server = "10.0.1" +parity-rpc = { path = "../../rpc" } keccak-hash = "0.1" diff --git a/rpc_client/src/client.rs b/cli-signer/rpc-client/src/client.rs similarity index 96% rename from rpc_client/src/client.rs rename to cli-signer/rpc-client/src/client.rs index f44556337bc..a9ca5e68a0a 100644 --- a/rpc_client/src/client.rs +++ b/cli-signer/rpc-client/src/client.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt::{Debug, Formatter, Error as FmtError}; use std::io::{BufReader, BufRead}; diff --git a/rpc_client/src/lib.rs b/cli-signer/rpc-client/src/lib.rs similarity index 85% rename from rpc_client/src/lib.rs rename to cli-signer/rpc-client/src/lib.rs index 98614bd7634..d0e087e59d9 100644 --- a/rpc_client/src/lib.rs +++ b/cli-signer/rpc-client/src/lib.rs @@ -1,22 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . pub mod client; pub mod signer_client; +extern crate ethereum_types; extern crate futures; extern crate jsonrpc_core; extern crate jsonrpc_ws_server as ws; diff --git a/rpc_client/src/signer_client.rs b/cli-signer/rpc-client/src/signer_client.rs similarity index 83% rename from rpc_client/src/signer_client.rs rename to cli-signer/rpc-client/src/signer_client.rs index e7a241137f6..997841936d1 100644 --- a/rpc_client/src/signer_client.rs +++ b/cli-signer/rpc-client/src/signer_client.rs @@ -1,21 +1,22 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use client::{Rpc, RpcError}; -use rpc::signer::{ConfirmationRequest, TransactionModification, U256, TransactionCondition}; +use ethereum_types::U256; +use rpc::signer::{ConfirmationRequest, TransactionModification, TransactionCondition}; use serde; use serde_json::{Value as JsonValue, to_value}; use std::path::PathBuf; diff --git a/rpc_cli/src/lib.rs b/cli-signer/src/lib.rs similarity index 91% rename from rpc_cli/src/lib.rs rename to cli-signer/src/lib.rs index e4554d6ed51..3ef6e70549b 100644 --- a/rpc_cli/src/lib.rs +++ b/cli-signer/src/lib.rs @@ -1,26 +1,28 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . +extern crate ethereum_types; extern crate futures; extern crate rpassword; extern crate parity_rpc as rpc; extern crate parity_rpc_client as client; -use rpc::signer::{U256, ConfirmationRequest}; +use ethereum_types::U256; +use rpc::signer::ConfirmationRequest; use client::signer_client::SignerRpc; use std::io::{Write, BufRead, BufReader, stdout, stdin}; use std::path::PathBuf; diff --git a/devtools/Cargo.toml b/devtools/Cargo.toml deleted file mode 100644 index 71eeaa2ddd0..00000000000 --- a/devtools/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -description = "Ethcore development/test/build tools" -homepage = "http://parity.io" -license = "GPL-3.0" -name = "ethcore-devtools" -version = "1.12.0" -authors = ["Parity Technologies "] diff --git a/docs/CHANGELOG-2.0.md b/docs/CHANGELOG-2.0.md index e0e6b0c380f..ef57dc2fbba 100644 --- a/docs/CHANGELOG-2.0.md +++ b/docs/CHANGELOG-2.0.md @@ -1,4 +1,4 @@ -Note: Parity 2.0 reached End-of-Life on 2018-11-15 (EOL). +Note: Parity Ethereum 2.0 reached End-of-Life on 2018-11-15 (EOL). ## Parity-Ethereum [v2.0.9](https://github.com/paritytech/parity-ethereum/releases/tag/v2.0.9) (2018-10-29) diff --git a/docs/CHANGELOG-2.1.md b/docs/CHANGELOG-2.1.md index 3f3b2298094..212370a2704 100644 --- a/docs/CHANGELOG-2.1.md +++ b/docs/CHANGELOG-2.1.md @@ -1,13 +1,31 @@ +Note: Parity Ethereum 2.1 reached End-of-Life on 2019-01-16 (EOL). + +## Parity-Ethereum [v2.1.11](https://github.com/paritytech/parity-ethereum/releases/tag/v2.1.11) (2019-01-09) + +Parity-Ethereum 2.1.11-stable is a bugfix release that improves performance and stability. + +The full list of included changes: + +- Stable backports v2.1.11 ([#10112](https://github.com/paritytech/parity-ethereum/pull/10112)) + - Version: bump stable to v2.1.11 + - HF in POA Sokol (2019-01-04) ([#10077](https://github.com/paritytech/parity-ethereum/pull/10077)) + - Add --locked when running cargo ([#10107](https://github.com/paritytech/parity-ethereum/pull/10107)) + - Ethcore: update hardcoded headers ([#10123](https://github.com/paritytech/parity-ethereum/pull/10123)) + - Identity fix ([#10128](https://github.com/paritytech/parity-ethereum/pull/10128)) + - Update pwasm-utils to 0.6.1 ([#10134](https://github.com/paritytech/parity-ethereum/pull/10134)) + - Version: mark upgrade critical on kovan + ## Parity-Ethereum [v2.1.10](https://github.com/paritytech/parity-ethereum/releases/tag/v2.1.10) (2018-12-14) -Parity-Ethereum 2.1.10-stable is an important release that introduces Constantinople fork at block 7080000 on Mainnet. -This release also contains a fix for chains using AuRa + EmptySteps. Read carefully if this applies to you. + +Parity-Ethereum 2.1.10-stable is an important release that introduces Constantinople fork at block 7080000 on Mainnet. +This release also contains a fix for chains using AuRa + EmptySteps. Read carefully if this applies to you. If you have a chain with`empty_steps` already running, some blocks most likely contain non-strict entries (unordered or duplicated empty steps). In this release`strict_empty_steps_transition` **is enabled by default at block 0** for any chain with `empty_steps`. If your network uses `empty_steps` you **must**: - plan a hard fork and change `strict_empty_steps_transition` to the desire fork block - update the clients of the whole network to 2.2.5-beta / 2.1.10-stable. If for some reason you don't want to do this please set`strict_empty_steps_transition` to `0xfffffffff` to disable it. -The full list of included changes: +The full list of included changes: - Backports for stable 2.1.10 ([#10046](https://github.com/paritytech/parity-ethereum/pull/10046)) - Bump stable to 2.1.10 ([#10046](https://github.com/paritytech/parity-ethereum/pull/10046)) diff --git a/docs/CHANGELOG-2.2.md b/docs/CHANGELOG-2.2.md new file mode 100644 index 00000000000..b9fce500075 --- /dev/null +++ b/docs/CHANGELOG-2.2.md @@ -0,0 +1,317 @@ +## Parity-Ethereum [v2.2.7](https://github.com/paritytech/parity-ethereum/releases/tag/v2.2.7) (2019-01-15) + +Parity-Ethereum 2.2.7-stable is a consensus-relevant security release that reverts Constantinople on the Ethereum network. Upgrading is mandatory for Ethereum, and strongly recommended for other networks. + +- **Consensus** - Ethereum Network: Pull Constantinople protocol upgrade on Ethereum ([#10189](https://github.com/paritytech/parity-ethereum/pull/10189)) + - Read more: [Security Alert: Ethereum Constantinople Postponement](https://blog.ethereum.org/2019/01/15/security-alert-ethereum-constantinople-postponement/) +- **Networking** - All networks: Ping nodes from discovery ([#10167](https://github.com/paritytech/parity-ethereum/pull/10167)) +- **Wasm** - Kovan Network: Update pwasm-utils to 0.6.1 ([#10134](https://github.com/paritytech/parity-ethereum/pull/10134)) + +_Note:_ This release marks Parity 2.2 as _stable_. All versions of Parity 2.1 now reached _end of life_. + +The full list of included changes: + +- Backports for stable 2.2.7 ([#10163](https://github.com/paritytech/parity-ethereum/pull/10163)) + - Version: bump stable to 2.2.7 + - Version: mark 2.2 track stable + - Version: mark update critical on all networks + - Handle the case for contract creation on an empty but exist account with storage items ([#10065](https://github.com/paritytech/parity-ethereum/pull/10065)) + - Fix _cannot recursively call into `Core`_ issue ([#10144](https://github.com/paritytech/parity-ethereum/pull/10144)) + - Snap: fix path in script ([#10157](https://github.com/paritytech/parity-ethereum/pull/10157)) + - Ping nodes from discovery ([#10167](https://github.com/paritytech/parity-ethereum/pull/10167)) + - Version: bump fork blocks for kovan and foundation, mark releases non critical + - Pull constantinople on ethereum network ([#10189](https://github.com/paritytech/parity-ethereum/pull/10189)) + +## Parity-Ethereum [v2.2.6](https://github.com/paritytech/parity-ethereum/releases/tag/v2.2.6) (2019-01-10) + +Parity-Ethereum 2.2.6-beta is a bugfix release that improves performance and stability. + +The full list of included changes: + +- Beta backports v2.2.6 ([#10113](https://github.com/paritytech/parity-ethereum/pull/10113)) + - Version: bump beta to v2.2.6 + - Fill transaction hash on ethGetLog of light client. ([#9938](https://github.com/paritytech/parity-ethereum/pull/9938)) + - Fix pubsub new_blocks notifications to include all blocks ([#9987](https://github.com/paritytech/parity-ethereum/pull/9987)) + - Finality: dont require chain head to be in the chain ([#10054](https://github.com/paritytech/parity-ethereum/pull/10054)) + - Handle the case for contract creation on an empty but exist account with storage items ([#10065](https://github.com/paritytech/parity-ethereum/pull/10065)) + - Autogen docs for the "Configuring Parity Ethereum" wiki page. ([#10067](https://github.com/paritytech/parity-ethereum/pull/10067)) + - HF in POA Sokol (2019-01-04) ([#10077](https://github.com/paritytech/parity-ethereum/pull/10077)) + - Add --locked when running cargo ([#10107](https://github.com/paritytech/parity-ethereum/pull/10107)) + - Ethcore: update hardcoded headers ([#10123](https://github.com/paritytech/parity-ethereum/pull/10123)) + - Identity fix ([#10128](https://github.com/paritytech/parity-ethereum/pull/10128)) + - Update pwasm-utils to 0.6.1 ([#10134](https://github.com/paritytech/parity-ethereum/pull/10134)) + - Make sure parent block is not in importing queue when importing ancient blocks ([#10138](https://github.com/paritytech/parity-ethereum/pull/10138)) + - CI: re-enable snap publishing ([#10142](https://github.com/paritytech/parity-ethereum/pull/10142)) + - HF in POA Core (2019-01-18) - Constantinople ([#10155](https://github.com/paritytech/parity-ethereum/pull/10155)) + - Version: mark upgrade critical on kovan + +## Parity-Ethereum [v2.2.5](https://github.com/paritytech/parity-ethereum/releases/tag/v2.2.5) (2018-12-14) + +Parity-Ethereum 2.2.5-beta is an important release that introduces Constantinople fork at block 7080000 on Mainnet. +This release also contains a fix for chains using AuRa + EmptySteps. Read carefully if this applies to you. +If you have a chain with`empty_steps` already running, some blocks most likely contain non-strict entries (unordered or duplicated empty steps). In this release`strict_empty_steps_transition` **is enabled by default at block 0** for any chain with `empty_steps`. +If your network uses `empty_steps` you **must**: +- plan a hard fork and change `strict_empty_steps_transition` to the desire fork block +- update the clients of the whole network to 2.2.5-beta / 2.1.10-stable. +If for some reason you don't want to do this please set`strict_empty_steps_transition` to `0xfffffffff` to disable it. + +The full list of included changes: +- Backports for beta 2.2.5 ([#10047](https://github.com/paritytech/parity-ethereum/pull/10047)) + - Bump beta to 2.2.5 ([#10047](https://github.com/paritytech/parity-ethereum/pull/10047)) + - Fix empty steps ([#9939](https://github.com/paritytech/parity-ethereum/pull/9939)) + - Prevent sending empty step message twice + - Prevent sending empty step and then block in the same step + - Don't accept double empty steps + - Do basic validation of self-sealed blocks + - Strict empty steps validation ([#10041](https://github.com/paritytech/parity-ethereum/pull/10041)) + - Enables strict verification of empty steps - there can be no duplicates and empty steps should be ordered inside the seal. + - Note that authorities won't produce invalid seals after [#9939](https://github.com/paritytech/parity-ethereum/pull/9939), this PR just adds verification to the seal to prevent forging incorrect blocks and potentially causing consensus issues. + - This features is enabled by default so any AuRa + EmptySteps chain should set strict_empty_steps_transition fork block number in their spec and upgrade to v2.2.5-beta or v2.1.10-stable. + - ethcore: enable constantinople on ethereum ([#10031](https://github.com/paritytech/parity-ethereum/pull/10031)) + - ethcore: change blockreward to 2e18 for foundation after constantinople + - ethcore: delay diff bomb by 2e6 blocks for foundation after constantinople + - ethcore: enable eip-{145,1014,1052,1283} for foundation after constantinople + - Change test miner max memory to malloc reports. ([#10024](https://github.com/paritytech/parity-ethereum/pull/10024)) + - Fix: test corpus_inaccessible panic ([#10019](https://github.com/paritytech/parity-ethereum/pull/10019)) + +## Parity-Ethereum [v2.2.2](https://github.com/paritytech/parity-ethereum/releases/tag/v2.2.2) (2018-11-29) + +Parity-Ethereum 2.2.2-beta is an exciting release. Among others, it improves sync performance, peering stability, block propagation, and transaction propagation times. Also, a warp-sync no longer removes existing blocks from the database, but rather reuses locally available information to decrease sync times and reduces required bandwidth. + +Before upgrading to 2.2.2, please also verify the validity of your chain specs. Parity Ethereum now denies unknown fields in the specification. To do this, use the chainspec tool: + +``` +cargo build --release -p chainspec +./target/release/chainspec /path/to/spec.json +``` + +Last but not least, JSONRPC APIs which are not yet accepted as an EIP in the `eth`, `personal`, or `web3` namespace, are now considere experimental as their final specification might change in future. These APIs have to be manually enabled by explicitly running `--jsonrpc-experimental`. + +The full list of included changes: + +- Backports For beta 2.2.2 ([#9976](https://github.com/paritytech/parity-ethereum/pull/9976)) + - Version: bump beta to 2.2.2 + - Add experimental RPCs flag ([#9928](https://github.com/paritytech/parity-ethereum/pull/9928)) + - Keep existing blocks when restoring a Snapshot ([#8643](https://github.com/paritytech/parity-ethereum/pull/8643)) + - Rename db_restore => client + - First step: make it compile! + - Second step: working implementation! + - Refactoring + - Fix tests + - Migrate ancient blocks interacting backward + - Early return in block migration if snapshot is aborted + - Remove RwLock getter (PR Grumble I) + - Remove dependency on `Client`: only used Traits + - Add test for recovering aborted snapshot recovery + - Add test for migrating old blocks + - Release RwLock earlier + - Revert Cargo.lock + - Update _update ancient block_ logic: set local in `commit` + - Update typo in ethcore/src/snapshot/service.rs + - Adjust requests costs for light client ([#9925](https://github.com/paritytech/parity-ethereum/pull/9925)) + - Pip Table Cost relative to average peers instead of max peers + - Add tracing in PIP new_cost_table + - Update stat peer_count + - Use number of leeching peers for Light serve costs + - Fix test::light_params_load_share_depends_on_max_peers (wrong type) + - Remove (now) useless test + - Remove `load_share` from LightParams.Config + - Add LEECHER_COUNT_FACTOR + - Pr Grumble: u64 to u32 for f64 casting + - Prevent u32 overflow for avg_peer_count + - Add tests for LightSync::Statistics + - Fix empty steps ([#9939](https://github.com/paritytech/parity-ethereum/pull/9939)) + - Don't send empty step twice or empty step then block. + - Perform basic validation of locally sealed blocks. + - Don't include empty step twice. + - Prevent silent errors in daemon mode, closes [#9367](https://github.com/paritytech/parity-ethereum/issues/9367) ([#9946](https://github.com/paritytech/parity-ethereum/pull/9946)) + - Fix a deadlock ([#9952](https://github.com/paritytech/parity-ethereum/pull/9952)) + - Update informant: + - Decimal in Mgas/s + - Print every 5s (not randomly between 5s and 10s) + - Fix dead-lock in `blockchain.rs` + - Update locks ordering + - Fix light client informant while syncing ([#9932](https://github.com/paritytech/parity-ethereum/pull/9932)) + - Add `is_idle` to LightSync to check importing status + - Use SyncStateWrapper to make sure is_idle gets updates + - Update is_major_import to use verified queue size as well + - Add comment for `is_idle` + - Add Debug to `SyncStateWrapper` + - `fn get` -> `fn into_inner` + - Ci: rearrange pipeline by logic ([#9970](https://github.com/paritytech/parity-ethereum/pull/9970)) + - Ci: rearrange pipeline by logic + - Ci: rename docs script + - Fix docker build ([#9971](https://github.com/paritytech/parity-ethereum/pull/9971)) + - Deny unknown fields for chainspec ([#9972](https://github.com/paritytech/parity-ethereum/pull/9972)) + - Add deny_unknown_fields to chainspec + - Add tests and fix existing one + - Remove serde_ignored dependency for chainspec + - Fix rpc test eth chain spec + - Fix starting_nonce_test spec + - Improve block and transaction propagation ([#9954](https://github.com/paritytech/parity-ethereum/pull/9954)) + - Refactor sync to add priority tasks. + - Send priority tasks notifications. + - Propagate blocks, optimize transactions. + - Implement transaction propagation. Use sync_channel. + - Tone down info. + - Prevent deadlock by not waiting forever for sync lock. + - Fix lock order. + - Don't use sync_channel to prevent deadlocks. + - Fix tests. + - Fix unstable peers and slowness in sync ([#9967](https://github.com/paritytech/parity-ethereum/pull/9967)) + - Don't sync all peers after each response + - Update formating + - Fix tests: add `continue_sync` to `Sync_step` + - Update ethcore/sync/src/chain/mod.rs + - Fix rpc middlewares + - Fix Cargo.lock + - Json: resolve merge in spec + - Rpc: fix starting_nonce_test + - Ci: allow nightl job to fail + +## Parity-Ethereum [v2.2.1](https://github.com/paritytech/parity-ethereum/releases/tag/v2.2.1) (2018-11-15) + +Parity-Ethereum 2.2.1-beta is the first v2.2 release, and might introduce features that break previous work flows, among others: + +- Prevent zero network ID ([#9763](https://github.com/paritytech/parity-ethereum/pull/9763)) and drop support for Olympic testnet ([#9801](https://github.com/paritytech/parity-ethereum/pull/9801)): The Olympic test net is dead for years and never used a chain ID but network ID zero. Parity Ethereum is now preventing the network ID to be zero, thus Olympic support is dropped. Make sure to chose positive non-zero network IDs in future. +- Multithreaded snapshot creation ([#9239](https://github.com/paritytech/parity-ethereum/pull/9239)): adds a CLI argument `--snapshot-threads` which specifies the number of threads. This helps improving the performance of full nodes that wish to provide warp-snapshots for the network. The gain in performance comes with a slight drawback in increased snapshot size. +- Expose config max-round-blocks-to-import ([#9439](https://github.com/paritytech/parity-ethereum/pull/9439)): Parity Ethereum imports blocks in rounds. If at the end of any round, the queue is not empty, we consider it to be _importing_ and won't notify pubsub. On large re-orgs (10+ blocks), this is possible. The default `max_round_blocks_to_import` is increased to 12 and configurable via the `--max-round-blocks-to-import` CLI flag. With unstable network conditions, it is advised to increase the number. This shouldn't have any noticeable performance impact unless the number is set to really large. +- Increase Gas-floor-target and Gas Cap ([#9564](https://github.com/paritytech/parity-ethereum/pull/9564)): the default values for gas floor target are `8_000_000` and gas cap `10_000_000`, similar to Geth 1.8.15+. +- Produce portable binaries ([#9725](https://github.com/paritytech/parity-ethereum/pull/9725)): we now produce portable binaries, but it may incur some performance degradation. For ultimate performance it's now better to compile Parity Ethereum from source with `PORTABLE=OFF` environment variable. +- RPC: `parity_allTransactionHashes` ([#9745](https://github.com/paritytech/parity-ethereum/pull/9745)): Get all pending transactions from the queue with the high performant `parity_allTransactionHashes` RPC method. +- Support `eth_chainId` RPC method ([#9783](https://github.com/paritytech/parity-ethereum/pull/9783)): implements EIP-695 to get the chainID via RPC. +- AuRa: finalize blocks ([#9692](https://github.com/paritytech/parity-ethereum/pull/9692)): The AuRa engine was updated to emit ancestry actions to finalize blocks. The full client stores block finality in the database, the engine builds finality from an ancestry of `ExtendedHeader`; `is_epoch_end` was updated to take a vec of recently finalized headers; `is_epoch_end_light` was added which maintains the previous interface and is used by the light client since the client itself doesn't track finality. + +The full list of included changes: + +- Backport to parity 2.2.1 beta ([#9905](https://github.com/paritytech/parity-ethereum/pull/9905)) + - Bump version to 2.2.1 + - Fix: Intermittent failing CI due to addr in use ([#9885](https://github.com/paritytech/parity-ethereum/pull/9885)) + - Fix Parity not closing on Ctrl-C ([#9886](https://github.com/paritytech/parity-ethereum/pull/9886)) + - Fix json tracer overflow ([#9873](https://github.com/paritytech/parity-ethereum/pull/9873)) + - Fix docker script ([#9854](https://github.com/paritytech/parity-ethereum/pull/9854)) + - Add hardcoded headers for light client ([#9907](https://github.com/paritytech/parity-ethereum/pull/9907)) + - Gitlab-ci: make android release build succeed ([#9743](https://github.com/paritytech/parity-ethereum/pull/9743)) + - Allow to seal work on latest block ([#9876](https://github.com/paritytech/parity-ethereum/pull/9876)) + - Remove rust-toolchain file ([#9906](https://github.com/paritytech/parity-ethereum/pull/9906)) + - Light-fetch: Differentiate between out-of-gas/manual throw and use required gas from response on failure ([#9824](https://github.com/paritytech/parity-ethereum/pull/9824)) + - Eip-712 implementation ([#9631](https://github.com/paritytech/parity-ethereum/pull/9631)) + - Eip-191 implementation ([#9701](https://github.com/paritytech/parity-ethereum/pull/9701)) + - Simplify cargo audit ([#9918](https://github.com/paritytech/parity-ethereum/pull/9918)) + - Fix performance issue importing Kovan blocks ([#9914](https://github.com/paritytech/parity-ethereum/pull/9914)) + - Ci: nuke the gitlab caches ([#9855](https://github.com/paritytech/parity-ethereum/pull/9855)) +- Backports to parity beta 2.2.0 ([#9820](https://github.com/paritytech/parity-ethereum/pull/9820)) + - Ci: remove failing tests for android, windows, and macos ([#9788](https://github.com/paritytech/parity-ethereum/pull/9788)) + - Implement NoProof for json tests and update tests reference ([#9814](https://github.com/paritytech/parity-ethereum/pull/9814)) + - Move state root verification before gas used ([#9841](https://github.com/paritytech/parity-ethereum/pull/9841)) + - Classic.json Bootnode Update ([#9828](https://github.com/paritytech/parity-ethereum/pull/9828)) +- Rpc: parity_allTransactionHashes ([#9745](https://github.com/paritytech/parity-ethereum/pull/9745)) +- Revert "prevent zero networkID ([#9763](https://github.com/paritytech/parity-ethereum/pull/9763))" ([#9815](https://github.com/paritytech/parity-ethereum/pull/9815)) +- Allow zero chain id in EIP155 signing process ([#9792](https://github.com/paritytech/parity-ethereum/pull/9792)) +- Add readiness check for docker container ([#9804](https://github.com/paritytech/parity-ethereum/pull/9804)) +- Insert dev account before unlocking ([#9813](https://github.com/paritytech/parity-ethereum/pull/9813)) +- Removed "rustup" & added new runner tag ([#9731](https://github.com/paritytech/parity-ethereum/pull/9731)) +- Expose config max-round-blocks-to-import ([#9439](https://github.com/paritytech/parity-ethereum/pull/9439)) +- Aura: finalize blocks ([#9692](https://github.com/paritytech/parity-ethereum/pull/9692)) +- Sync: retry different peer after empty subchain heads response ([#9753](https://github.com/paritytech/parity-ethereum/pull/9753)) +- Fix(light-rpc/parity) : Remove unused client ([#9802](https://github.com/paritytech/parity-ethereum/pull/9802)) +- Drops support for olympic testnet, closes [#9800](https://github.com/paritytech/parity-ethereum/issues/9800) ([#9801](https://github.com/paritytech/parity-ethereum/pull/9801)) +- Replace `tokio_core` with `tokio` (`ring` -> 0.13) ([#9657](https://github.com/paritytech/parity-ethereum/pull/9657)) +- Support eth_chainId RPC method ([#9783](https://github.com/paritytech/parity-ethereum/pull/9783)) +- Ethcore: bump ropsten forkblock checkpoint ([#9775](https://github.com/paritytech/parity-ethereum/pull/9775)) +- Docs: changelogs for 2.0.8 and 2.1.3 ([#9758](https://github.com/paritytech/parity-ethereum/pull/9758)) +- Prevent zero networkID ([#9763](https://github.com/paritytech/parity-ethereum/pull/9763)) +- Skip seal fields count check when --no-seal-check is used ([#9757](https://github.com/paritytech/parity-ethereum/pull/9757)) +- Aura: fix panic on extra_info with unsealed block ([#9755](https://github.com/paritytech/parity-ethereum/pull/9755)) +- Docs: update changelogs ([#9742](https://github.com/paritytech/parity-ethereum/pull/9742)) +- Removed extra assert in generation_session_is_removed_when_succeeded ([#9738](https://github.com/paritytech/parity-ethereum/pull/9738)) +- Make checkpoint_storage_at use plain loop instead of recursion ([#9734](https://github.com/paritytech/parity-ethereum/pull/9734)) +- Use signed 256-bit integer for sstore gas refund substate ([#9746](https://github.com/paritytech/parity-ethereum/pull/9746)) +- Heads ref not present for branches beta and stable ([#9741](https://github.com/paritytech/parity-ethereum/pull/9741)) +- Add Callisto support ([#9534](https://github.com/paritytech/parity-ethereum/pull/9534)) +- Add --force to cargo audit install script ([#9735](https://github.com/paritytech/parity-ethereum/pull/9735)) +- Remove unused expired value from Handshake ([#9732](https://github.com/paritytech/parity-ethereum/pull/9732)) +- Add hardcoded headers ([#9730](https://github.com/paritytech/parity-ethereum/pull/9730)) +- Produce portable binaries ([#9725](https://github.com/paritytech/parity-ethereum/pull/9725)) +- Gitlab ci: releasable_branches: change variables condition to schedule ([#9729](https://github.com/paritytech/parity-ethereum/pull/9729)) +- Update a few parity-common dependencies ([#9663](https://github.com/paritytech/parity-ethereum/pull/9663)) +- Hf in POA Core (2018-10-22) ([#9724](https://github.com/paritytech/parity-ethereum/pull/9724)) +- Schedule nightly builds ([#9717](https://github.com/paritytech/parity-ethereum/pull/9717)) +- Fix ancient blocks sync ([#9531](https://github.com/paritytech/parity-ethereum/pull/9531)) +- Ci: Skip docs job for nightly ([#9693](https://github.com/paritytech/parity-ethereum/pull/9693)) +- Fix (light/provider) : Make `read_only executions` read-only ([#9591](https://github.com/paritytech/parity-ethereum/pull/9591)) +- Ethcore: fix detection of major import ([#9552](https://github.com/paritytech/parity-ethereum/pull/9552)) +- Return 0 on error ([#9705](https://github.com/paritytech/parity-ethereum/pull/9705)) +- Ethcore: delay ropsten hardfork ([#9704](https://github.com/paritytech/parity-ethereum/pull/9704)) +- Make instantSeal engine backwards compatible, closes [#9696](https://github.com/paritytech/parity-ethereum/issues/9696) ([#9700](https://github.com/paritytech/parity-ethereum/pull/9700)) +- Implement CREATE2 gas changes and fix some potential overflowing ([#9694](https://github.com/paritytech/parity-ethereum/pull/9694)) +- Don't hash the init_code of CREATE. ([#9688](https://github.com/paritytech/parity-ethereum/pull/9688)) +- Ethcore: minor optimization of modexp by using LR exponentiation ([#9697](https://github.com/paritytech/parity-ethereum/pull/9697)) +- Removed redundant clone before each block import ([#9683](https://github.com/paritytech/parity-ethereum/pull/9683)) +- Add Foundation Bootnodes ([#9666](https://github.com/paritytech/parity-ethereum/pull/9666)) +- Docker: run as parity user ([#9689](https://github.com/paritytech/parity-ethereum/pull/9689)) +- Ethcore: mcip3 block reward contract ([#9605](https://github.com/paritytech/parity-ethereum/pull/9605)) +- Verify block syncing responses against requests ([#9670](https://github.com/paritytech/parity-ethereum/pull/9670)) +- Add a new RPC `parity_submitWorkDetail` similar `eth_submitWork` but return block hash ([#9404](https://github.com/paritytech/parity-ethereum/pull/9404)) +- Resumable EVM and heap-allocated callstack ([#9360](https://github.com/paritytech/parity-ethereum/pull/9360)) +- Update parity-wordlist library ([#9682](https://github.com/paritytech/parity-ethereum/pull/9682)) +- Ci: Remove unnecessary pipes ([#9681](https://github.com/paritytech/parity-ethereum/pull/9681)) +- Test.sh: use cargo --target for platforms other than linux, win or mac ([#9650](https://github.com/paritytech/parity-ethereum/pull/9650)) +- Ci: fix push script ([#9679](https://github.com/paritytech/parity-ethereum/pull/9679)) +- Hardfork the testnets ([#9562](https://github.com/paritytech/parity-ethereum/pull/9562)) +- Calculate sha3 instead of sha256 for push-release. ([#9673](https://github.com/paritytech/parity-ethereum/pull/9673)) +- Ethcore-io retries failed work steal ([#9651](https://github.com/paritytech/parity-ethereum/pull/9651)) +- Fix(light_fetch): avoid race with BlockNumber::Latest ([#9665](https://github.com/paritytech/parity-ethereum/pull/9665)) +- Test fix for windows cache name... ([#9658](https://github.com/paritytech/parity-ethereum/pull/9658)) +- Refactor(fetch) : light use only one `DNS` thread ([#9647](https://github.com/paritytech/parity-ethereum/pull/9647)) +- Ethereum libfuzzer integration small change ([#9547](https://github.com/paritytech/parity-ethereum/pull/9547)) +- Cli: remove reference to --no-ui in --unlock flag help ([#9616](https://github.com/paritytech/parity-ethereum/pull/9616)) +- Remove master from releasable branches ([#9655](https://github.com/paritytech/parity-ethereum/pull/9655)) +- Ethcore/VerificationQueue don't spawn up extra `worker-threads` when explictly specified not to ([#9620](https://github.com/paritytech/parity-ethereum/pull/9620)) +- Rpc: parity_getBlockReceipts ([#9527](https://github.com/paritytech/parity-ethereum/pull/9527)) +- Remove unused dependencies ([#9589](https://github.com/paritytech/parity-ethereum/pull/9589)) +- Ignore key_server_cluster randomly failing tests ([#9639](https://github.com/paritytech/parity-ethereum/pull/9639)) +- Ethcore: handle vm exception when estimating gas ([#9615](https://github.com/paritytech/parity-ethereum/pull/9615)) +- Fix bad-block reporting no reason ([#9638](https://github.com/paritytech/parity-ethereum/pull/9638)) +- Use static call and apparent value transfer for block reward contract code ([#9603](https://github.com/paritytech/parity-ethereum/pull/9603)) +- Hf in POA Sokol (2018-09-19) ([#9607](https://github.com/paritytech/parity-ethereum/pull/9607)) +- Bump smallvec to 0.6 in ethcore-light, ethstore and whisper ([#9588](https://github.com/paritytech/parity-ethereum/pull/9588)) +- Add constantinople conf to EvmTestClient. ([#9570](https://github.com/paritytech/parity-ethereum/pull/9570)) +- Fix(network): don't disconnect reserved peers ([#9608](https://github.com/paritytech/parity-ethereum/pull/9608)) +- Fix failing node-table tests on mac os, closes [#9632](https://github.com/paritytech/parity-ethereum/issues/9632) ([#9633](https://github.com/paritytech/parity-ethereum/pull/9633)) +- Update ropsten.json ([#9602](https://github.com/paritytech/parity-ethereum/pull/9602)) +- Simplify ethcore errors by removing BlockImportError ([#9593](https://github.com/paritytech/parity-ethereum/pull/9593)) +- Fix windows compilation, replaces [#9561](https://github.com/paritytech/parity-ethereum/issues/9561) ([#9621](https://github.com/paritytech/parity-ethereum/pull/9621)) +- Master: rpc-docs set github token ([#9610](https://github.com/paritytech/parity-ethereum/pull/9610)) +- Docs: add changelogs for 1.11.10, 1.11.11, 2.0.3, 2.0.4, 2.0.5, 2.0.6, 2.1.0, and 2.1.1 ([#9554](https://github.com/paritytech/parity-ethereum/pull/9554)) +- Docs(rpc): annotate tag with the provided message ([#9601](https://github.com/paritytech/parity-ethereum/pull/9601)) +- Ci: fix regex roll_eyes ([#9597](https://github.com/paritytech/parity-ethereum/pull/9597)) +- Remove snapcraft clean ([#9585](https://github.com/paritytech/parity-ethereum/pull/9585)) +- Add snapcraft package image (master) ([#9584](https://github.com/paritytech/parity-ethereum/pull/9584)) +- Docs(rpc): push the branch along with tags ([#9578](https://github.com/paritytech/parity-ethereum/pull/9578)) +- Fix typo for jsonrpc-threads flag ([#9574](https://github.com/paritytech/parity-ethereum/pull/9574)) +- Fix informant compile ([#9571](https://github.com/paritytech/parity-ethereum/pull/9571)) +- Added ropsten bootnodes ([#9569](https://github.com/paritytech/parity-ethereum/pull/9569)) +- Increase Gas-floor-target and Gas Cap ([#9564](https://github.com/paritytech/parity-ethereum/pull/9564)) +- While working on the platform tests make them non-breaking ([#9563](https://github.com/paritytech/parity-ethereum/pull/9563)) +- Improve P2P discovery ([#9526](https://github.com/paritytech/parity-ethereum/pull/9526)) +- Move dockerfile for android build container to scripts repo ([#9560](https://github.com/paritytech/parity-ethereum/pull/9560)) +- Simultaneous platform tests WIP ([#9557](https://github.com/paritytech/parity-ethereum/pull/9557)) +- Update ethabi-derive, serde, serde_json, serde_derive, syn && quote ([#9553](https://github.com/paritytech/parity-ethereum/pull/9553)) +- Ci: fix rpc docs generation 2 ([#9550](https://github.com/paritytech/parity-ethereum/pull/9550)) +- Ci: always run build pipelines for win, mac, linux, and android ([#9537](https://github.com/paritytech/parity-ethereum/pull/9537)) +- Multithreaded snapshot creation ([#9239](https://github.com/paritytech/parity-ethereum/pull/9239)) +- New ethabi ([#9511](https://github.com/paritytech/parity-ethereum/pull/9511)) +- Remove initial token for WS. ([#9545](https://github.com/paritytech/parity-ethereum/pull/9545)) +- Net_version caches network_id to avoid redundant aquire of sync readlock ([#9544](https://github.com/paritytech/parity-ethereum/pull/9544)) +- Correct before_script for nightly build versions ([#9543](https://github.com/paritytech/parity-ethereum/pull/9543)) +- Deps: bump kvdb-rocksdb to 0.1.4 ([#9539](https://github.com/paritytech/parity-ethereum/pull/9539)) +- State: test when contract creation fails, old storage values should re-appear ([#9532](https://github.com/paritytech/parity-ethereum/pull/9532)) +- Allow dropping light client RPC query with no results ([#9318](https://github.com/paritytech/parity-ethereum/pull/9318)) +- Bump master to 2.2.0 ([#9517](https://github.com/paritytech/parity-ethereum/pull/9517)) +- Enable all Constantinople hard fork changes in constantinople_test.json ([#9505](https://github.com/paritytech/parity-ethereum/pull/9505)) +- [Light] Validate `account balance` before importing transactions ([#9417](https://github.com/paritytech/parity-ethereum/pull/9417)) +- In create memory calculation is the same for create2 because the additional parameter was popped before. ([#9522](https://github.com/paritytech/parity-ethereum/pull/9522)) +- Update patricia trie to 0.2.2 ([#9525](https://github.com/paritytech/parity-ethereum/pull/9525)) +- Replace hardcoded JSON with serde json! macro ([#9489](https://github.com/paritytech/parity-ethereum/pull/9489)) +- Fix typo in version string ([#9516](https://github.com/paritytech/parity-ethereum/pull/9516)) diff --git a/ethash/Cargo.toml b/ethash/Cargo.toml index 5ebafb45374..929895aca78 100644 --- a/ethash/Cargo.toml +++ b/ethash/Cargo.toml @@ -14,9 +14,19 @@ parking_lot = "0.7" primal = "0.2.3" [dev-dependencies] -tempdir = "0.3" criterion = "0.2" +rustc-hex = "1.0" +serde_json = "1.0" +tempdir = "0.3" + +[features] +default = [] +bench = [] [[bench]] name = "basic" harness = false + +[[bench]] +name = "progpow" +harness = false diff --git a/ethash/benches/basic.rs b/ethash/benches/basic.rs index 9ecb1bd7dd7..5bc10e948e0 100644 --- a/ethash/benches/basic.rs +++ b/ethash/benches/basic.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . #[macro_use] extern crate criterion; @@ -37,68 +37,62 @@ criterion_group!( ); criterion_main!(basic); - fn bench_light_compute_memmap(b: &mut Criterion) { use std::env; - let builder = NodeCacheBuilder::new(OptimizeFor::Memory); + let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value()); let light = builder.light(&env::temp_dir(), 486382); - b.bench_function("bench_light_compute_memmap", move |b| b.iter(|| light.compute(&HASH, NONCE))); + b.bench_function("bench_light_compute_memmap", move |b| b.iter(|| light.compute(&HASH, NONCE, u64::max_value()))); } - fn bench_light_compute_memory(b: &mut Criterion) { use std::env; - let builder = NodeCacheBuilder::new(OptimizeFor::Cpu); + let builder = NodeCacheBuilder::new(OptimizeFor::Cpu, u64::max_value()); let light = builder.light(&env::temp_dir(), 486382); - b.bench_function("bench_light_compute_memmap", move |b| b.iter(|| light.compute(&HASH, NONCE))); + b.bench_function("bench_light_compute_memmap", move |b| b.iter(|| light.compute(&HASH, NONCE, u64::max_value()))); } - fn bench_light_new_round_trip_memmap(b: &mut Criterion) { use std::env; b.bench_function("bench_light_compute_memmap", move |b| b.iter(|| { - let builder = NodeCacheBuilder::new(OptimizeFor::Memory); + let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value()); let light = builder.light(&env::temp_dir(), 486382); - light.compute(&HASH, NONCE); + light.compute(&HASH, NONCE, u64::max_value()); })); } - fn bench_light_new_round_trip_memory(b: &mut Criterion) { use std::env; b.bench_function("bench_light_compute_memmap", move |b| b.iter(|| { - let builder = NodeCacheBuilder::new(OptimizeFor::Cpu); + let builder = NodeCacheBuilder::new(OptimizeFor::Cpu, u64::max_value()); let light = builder.light(&env::temp_dir(), 486382); - light.compute(&HASH, NONCE); + light.compute(&HASH, NONCE, u64::max_value()); })); } - fn bench_light_from_file_round_trip_memory(b: &mut Criterion) { use std::env; let dir = env::temp_dir(); let height = 486382; { - let builder = NodeCacheBuilder::new(OptimizeFor::Cpu); + let builder = NodeCacheBuilder::new(OptimizeFor::Cpu, u64::max_value()); let mut dummy = builder.light(&dir, height); dummy.to_file().unwrap(); } b.bench_function("bench_light_compute_memmap", move |b| b.iter(|| { - let builder = NodeCacheBuilder::new(OptimizeFor::Cpu); + let builder = NodeCacheBuilder::new(OptimizeFor::Cpu, u64::max_value()); let light = builder.light_from_file(&dir, 486382).unwrap(); - light.compute(&HASH, NONCE); + light.compute(&HASH, NONCE, u64::max_value()); })); } - fn bench_light_from_file_round_trip_memmap(b: &mut Criterion) { use std::env; @@ -106,14 +100,14 @@ fn bench_light_from_file_round_trip_memmap(b: &mut Criterion) { let height = 486382; { - let builder = NodeCacheBuilder::new(OptimizeFor::Memory); + let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value()); let mut dummy = builder.light(&dir, height); dummy.to_file().unwrap(); } b.bench_function("bench_light_compute_memmap", move |b| b.iter(|| { - let builder = NodeCacheBuilder::new(OptimizeFor::Memory); + let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value()); let light = builder.light_from_file(&dir, 486382).unwrap(); - light.compute(&HASH, NONCE); + light.compute(&HASH, NONCE, u64::max_value()); })); } diff --git a/ethash/benches/progpow.rs b/ethash/benches/progpow.rs new file mode 100644 index 00000000000..e086a14b42f --- /dev/null +++ b/ethash/benches/progpow.rs @@ -0,0 +1,86 @@ +#[macro_use] +extern crate criterion; +extern crate ethash; +extern crate rustc_hex; +extern crate tempdir; + +use criterion::Criterion; +use ethash::progpow; + +use tempdir::TempDir; +use rustc_hex::FromHex; +use ethash::{NodeCacheBuilder, OptimizeFor}; +use ethash::compute::light_compute; + +fn bench_hashimoto_light(c: &mut Criterion) { + let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value()); + let tempdir = TempDir::new("").unwrap(); + let light = builder.light(&tempdir.path(), 1); + let h = FromHex::from_hex("c9149cc0386e689d789a1c2f3d5d169a61a6218ed30e74414dc736e442ef3d1f").unwrap(); + let mut hash = [0; 32]; + hash.copy_from_slice(&h); + + c.bench_function("hashimoto_light", move |b| { + b.iter(|| light_compute(&light, &hash, 0)) + }); +} + +fn bench_progpow_light(c: &mut Criterion) { + let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value()); + let tempdir = TempDir::new("").unwrap(); + let cache = builder.new_cache(tempdir.into_path(), 0); + + let h = FromHex::from_hex("c9149cc0386e689d789a1c2f3d5d169a61a6218ed30e74414dc736e442ef3d1f").unwrap(); + let mut hash = [0; 32]; + hash.copy_from_slice(&h); + + c.bench_function("progpow_light", move |b| { + b.iter(|| { + let c_dag = progpow::generate_cdag(cache.as_ref()); + progpow::progpow( + hash, + 0, + 0, + cache.as_ref(), + &c_dag, + ); + }) + }); +} + +fn bench_progpow_optimal_light(c: &mut Criterion) { + let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value()); + let tempdir = TempDir::new("").unwrap(); + let cache = builder.new_cache(tempdir.into_path(), 0); + let c_dag = progpow::generate_cdag(cache.as_ref()); + + let h = FromHex::from_hex("c9149cc0386e689d789a1c2f3d5d169a61a6218ed30e74414dc736e442ef3d1f").unwrap(); + let mut hash = [0; 32]; + hash.copy_from_slice(&h); + + c.bench_function("progpow_optimal_light", move |b| { + b.iter(|| { + progpow::progpow( + hash, + 0, + 0, + cache.as_ref(), + &c_dag, + ); + }) + }); +} + +fn bench_keccak_f800_long(c: &mut Criterion) { + c.bench_function("keccak_f800_long(0, 0, 0)", |b| { + b.iter(|| progpow::keccak_f800_long([0; 32], 0, [0; 8])) + }); +} + +criterion_group!(benches, + bench_hashimoto_light, + bench_progpow_light, + bench_progpow_optimal_light, + bench_keccak_f800_long, +); +criterion_main!(benches); diff --git a/ethash/res/progpow_testvectors.json b/ethash/res/progpow_testvectors.json new file mode 100644 index 00000000000..2939f7106c0 --- /dev/null +++ b/ethash/res/progpow_testvectors.json @@ -0,0 +1,86 @@ +[ + [ + 0, + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000", + "faeb1be51075b03a4ff44b335067951ead07a3b078539ace76fd56fc410557a3", + "63155f732f2bf556967f906155b510c917e48e99685ead76ea83f4eca03ab12b" + ], + [ + 49, + "63155f732f2bf556967f906155b510c917e48e99685ead76ea83f4eca03ab12b", + "0000000006ff2c47", + "c789c1180f890ec555ff42042913465481e8e6bc512cb981e1c1108dc3f2227d", + "9e7248f20914913a73d80a70174c331b1d34f260535ac3631d770e656b5dd922" + ], + [ + 50, + "9e7248f20914913a73d80a70174c331b1d34f260535ac3631d770e656b5dd922", + "00000000076e482e", + "c7340542c2a06b3a7dc7222635f7cd402abf8b528ae971ddac6bbe2b0c7cb518", + "de37e1824c86d35d154cf65a88de6d9286aec4f7f10c3fc9f0fa1bcc2687188d" + ], + [ + 99, + "de37e1824c86d35d154cf65a88de6d9286aec4f7f10c3fc9f0fa1bcc2687188d", + "000000003917afab", + "f5e60b2c5bfddd136167a30cbc3c8dbdbd15a512257dee7964e0bc6daa9f8ba7", + "ac7b55e801511b77e11d52e9599206101550144525b5679f2dab19386f23dcce" + ], + [ + 29950, + "ac7b55e801511b77e11d52e9599206101550144525b5679f2dab19386f23dcce", + "005d409dbc23a62a", + "07393d15805eb08ee6fc6cb3ad4ad1010533bd0ff92d6006850246829f18fd6e", + "e43d7e0bdc8a4a3f6e291a5ed790b9fa1a0948a2b9e33c844888690847de19f5" + ], + [ + 29999, + "e43d7e0bdc8a4a3f6e291a5ed790b9fa1a0948a2b9e33c844888690847de19f5", + "005db5fa4c2a3d03", + "7551bddf977491da2f6cfc1679299544b23483e8f8ee0931c4c16a796558a0b8", + "d34519f72c97cae8892c277776259db3320820cb5279a299d0ef1e155e5c6454" + ], + [ + 30000, + "d34519f72c97cae8892c277776259db3320820cb5279a299d0ef1e155e5c6454", + "005db8607994ff30", + "f1c2c7c32266af9635462e6ce1c98ebe4e7e3ecab7a38aaabfbf2e731e0fbff4", + "8b6ce5da0b06d18db7bd8492d9e5717f8b53e7e098d9fef7886d58a6e913ef64" + ], + [ + 30049, + "8b6ce5da0b06d18db7bd8492d9e5717f8b53e7e098d9fef7886d58a6e913ef64", + "005e2e215a8ca2e7", + "57fe6a9fbf920b4e91deeb66cb0efa971e08229d1a160330e08da54af0689add", + "c2c46173481b9ced61123d2e293b42ede5a1b323210eb2a684df0874ffe09047" + ], + [ + 30050, + "c2c46173481b9ced61123d2e293b42ede5a1b323210eb2a684df0874ffe09047", + "005e30899481055e", + "ba30c61cc5a2c74a5ecaf505965140a08f24a296d687e78720f0b48baf712f2d", + "ea42197eb2ba79c63cb5e655b8b1f612c5f08aae1a49ff236795a3516d87bc71" + ], + [ + 30099, + "ea42197eb2ba79c63cb5e655b8b1f612c5f08aae1a49ff236795a3516d87bc71", + "005ea6aef136f88b", + "cfd5e46048cd133d40f261fe8704e51d3f497fc14203ac6a9ef6a0841780b1cd", + "49e15ba4bf501ce8fe8876101c808e24c69a859be15de554bf85dbc095491bd6" + ], + [ + 59950, + "49e15ba4bf501ce8fe8876101c808e24c69a859be15de554bf85dbc095491bd6", + "02ebe0503bd7b1da", + "21511fbaa31fb9f5fc4998a754e97b3083a866f4de86fa7500a633346f56d773", + "f5c50ba5c0d6210ddb16250ec3efda178de857b2b1703d8d5403bd0f848e19cf" + ], + [ + 59999, + "f5c50ba5c0d6210ddb16250ec3efda178de857b2b1703d8d5403bd0f848e19cf", + "02edb6275bd221e3", + "653eda37d337e39d311d22be9bbd3458d3abee4e643bee4a7280a6d08106ef98", + "341562d10d4afb706ec2c8d5537cb0c810de02b4ebb0a0eea5ae335af6fb2e88" + ] +] diff --git a/ethash/src/cache.rs b/ethash/src/cache.rs index 023e4bb468f..b16d2731457 100644 --- a/ethash/src/cache.rs +++ b/ethash/src/cache.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use compute::Light; use either::Either; @@ -69,6 +69,7 @@ pub struct NodeCacheBuilder { // TODO: Remove this locking and just use an `Rc`? seedhash: Arc>, optimize_for: OptimizeFor, + progpow_transition: u64, } // TODO: Abstract the "optimize for" logic @@ -82,17 +83,18 @@ pub struct NodeCache { impl NodeCacheBuilder { pub fn light(&self, cache_dir: &Path, block_number: u64) -> Light { - Light::new_with_builder(self, cache_dir, block_number) + Light::new_with_builder(self, cache_dir, block_number, self.progpow_transition) } pub fn light_from_file(&self, cache_dir: &Path, block_number: u64) -> io::Result { - Light::from_file_with_builder(self, cache_dir, block_number) + Light::from_file_with_builder(self, cache_dir, block_number, self.progpow_transition) } - pub fn new>>(optimize_for: T) -> Self { + pub fn new>>(optimize_for: T, progpow_transition: u64) -> Self { NodeCacheBuilder { seedhash: Arc::new(Mutex::new(SeedHashCompute::default())), optimize_for: optimize_for.into().unwrap_or_default(), + progpow_transition } } diff --git a/ethash/src/compute.rs b/ethash/src/compute.rs index 69211f24487..36826121db9 100644 --- a/ethash/src/compute.rs +++ b/ethash/src/compute.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Ethash implementation //! See https://github.com/ethereum/wiki/wiki/Ethash @@ -21,6 +21,7 @@ use keccak::{keccak_512, keccak_256, H256}; use cache::{NodeCache, NodeCacheBuilder}; +use progpow::{CDag, generate_cdag, progpow, keccak_f800_short, keccak_f800_long}; use seed_compute::SeedHashCompute; use shared::*; use std::io; @@ -30,7 +31,7 @@ use std::path::Path; const MIX_WORDS: usize = ETHASH_MIX_BYTES / 4; const MIX_NODES: usize = MIX_WORDS / NODE_WORDS; -const FNV_PRIME: u32 = 0x01000193; +pub const FNV_PRIME: u32 = 0x01000193; /// Computation result pub struct ProofOfWork { @@ -40,9 +41,15 @@ pub struct ProofOfWork { pub mix_hash: H256, } +enum Algorithm { + Hashimoto, + Progpow(Box), +} + pub struct Light { block_number: u64, cache: NodeCache, + algorithm: Algorithm, } /// Light cache structure @@ -51,32 +58,55 @@ impl Light { builder: &NodeCacheBuilder, cache_dir: &Path, block_number: u64, + progpow_transition: u64, ) -> Self { let cache = builder.new_cache(cache_dir.to_path_buf(), block_number); - Light { - block_number: block_number, - cache: cache, - } + let algorithm = if block_number >= progpow_transition { + Algorithm::Progpow(Box::new(generate_cdag(cache.as_ref()))) + } else { + Algorithm::Hashimoto + }; + + Light { block_number, cache, algorithm } } /// Calculate the light boundary data /// `header_hash` - The header hash to pack into the mix /// `nonce` - The nonce to pack into the mix - pub fn compute(&self, header_hash: &H256, nonce: u64) -> ProofOfWork { - light_compute(self, header_hash, nonce) + pub fn compute(&self, header_hash: &H256, nonce: u64, block_number: u64) -> ProofOfWork { + match self.algorithm { + Algorithm::Progpow(ref c_dag) => { + let (value, mix_hash) = progpow( + *header_hash, + nonce, + block_number, + self.cache.as_ref(), + c_dag, + ); + + ProofOfWork { value, mix_hash } + }, + Algorithm::Hashimoto => light_compute(self, header_hash, nonce), + } + } pub fn from_file_with_builder( builder: &NodeCacheBuilder, cache_dir: &Path, block_number: u64, + progpow_transition: u64, ) -> io::Result { let cache = builder.from_file(cache_dir.to_path_buf(), block_number)?; - Ok(Light { - block_number: block_number, - cache: cache, - }) + + let algorithm = if block_number >= progpow_transition { + Algorithm::Progpow(Box::new(generate_cdag(cache.as_ref()))) + } else { + Algorithm::Hashimoto + }; + + Ok(Light { block_number, cache, algorithm }) } pub fn to_file(&mut self) -> io::Result<&Path> { @@ -99,27 +129,32 @@ fn fnv_hash(x: u32, y: u32) -> u32 { /// `nonce` The block's nonce /// `mix_hash` The mix digest hash /// Boundary recovered from mix hash -pub fn quick_get_difficulty(header_hash: &H256, nonce: u64, mix_hash: &H256) -> H256 { +pub fn quick_get_difficulty(header_hash: &H256, nonce: u64, mix_hash: &H256, progpow: bool) -> H256 { unsafe { - // This is safe - the `keccak_512` call below reads the first 40 bytes (which we explicitly set - // with two `copy_nonoverlapping` calls) but writes the first 64, and then we explicitly write - // the next 32 bytes before we read the whole thing with `keccak_256`. - // - // This cannot be elided by the compiler as it doesn't know the implementation of - // `keccak_512`. - let mut buf: [u8; 64 + 32] = mem::uninitialized(); - - ptr::copy_nonoverlapping(header_hash.as_ptr(), buf.as_mut_ptr(), 32); - ptr::copy_nonoverlapping(&nonce as *const u64 as *const u8, buf[32..].as_mut_ptr(), 8); - - keccak_512::unchecked(buf.as_mut_ptr(), 64, buf.as_ptr(), 40); - ptr::copy_nonoverlapping(mix_hash.as_ptr(), buf[64..].as_mut_ptr(), 32); - - // This is initialized in `keccak_256` - let mut hash: [u8; 32] = mem::uninitialized(); - keccak_256::unchecked(hash.as_mut_ptr(), hash.len(), buf.as_ptr(), buf.len()); - - hash + if progpow { + let seed = keccak_f800_short(*header_hash, nonce, [0u32; 8]); + keccak_f800_long(*header_hash, seed, mem::transmute(*mix_hash)) + } else { + // This is safe - the `keccak_512` call below reads the first 40 bytes (which we explicitly set + // with two `copy_nonoverlapping` calls) but writes the first 64, and then we explicitly write + // the next 32 bytes before we read the whole thing with `keccak_256`. + // + // This cannot be elided by the compiler as it doesn't know the implementation of + // `keccak_512`. + let mut buf: [u8; 64 + 32] = mem::uninitialized(); + + ptr::copy_nonoverlapping(header_hash.as_ptr(), buf.as_mut_ptr(), 32); + ptr::copy_nonoverlapping(&nonce as *const u64 as *const u8, buf[32..].as_mut_ptr(), 8); + + keccak_512::unchecked(buf.as_mut_ptr(), 64, buf.as_ptr(), 40); + ptr::copy_nonoverlapping(mix_hash.as_ptr(), buf[64..].as_mut_ptr(), 32); + + // This is initialized in `keccak_256` + let mut hash: [u8; 32] = mem::uninitialized(); + keccak_256::unchecked(hash.as_mut_ptr(), hash.len(), buf.as_ptr(), buf.len()); + + hash + } } } @@ -272,7 +307,7 @@ fn hash_compute(light: &Light, full_size: usize, header_hash: &H256, nonce: u64) // We overwrite the second half since `keccak_256` has an internal buffer and so allows // overlapping arrays as input. let write_ptr: *mut u8 = &mut buf.compress_bytes as *mut [u8; 32] as *mut u8; - unsafe { + unsafe { keccak_256::unchecked( write_ptr, buf.compress_bytes.len(), @@ -287,7 +322,7 @@ fn hash_compute(light: &Light, full_size: usize, header_hash: &H256, nonce: u64) } // TODO: Use the `simd` crate -fn calculate_dag_item(node_index: u32, cache: &[Node]) -> Node { +pub fn calculate_dag_item(node_index: u32, cache: &[Node]) -> Node { let num_parent_nodes = cache.len(); let mut ret = cache[node_index as usize % num_parent_nodes].clone(); ret.as_words_mut()[0] ^= node_index; @@ -361,13 +396,13 @@ mod test { 0x4a, 0x8e, 0x95, 0x69, 0xef, 0xc7, 0xd7, 0x1b, 0x33, 0x35, 0xdf, 0x36, 0x8c, 0x9a, 0xe9, 0x7e, 0x53, 0x84, ]; - assert_eq!(quick_get_difficulty(&hash, nonce, &mix_hash)[..], boundary_good[..]); + assert_eq!(quick_get_difficulty(&hash, nonce, &mix_hash, false)[..], boundary_good[..]); let boundary_bad = [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3a, 0x9b, 0x6c, 0x69, 0xbc, 0x2c, 0xe2, 0xa2, 0x4a, 0x8e, 0x95, 0x69, 0xef, 0xc7, 0xd7, 0x1b, 0x33, 0x35, 0xdf, 0x36, 0x8c, 0x9a, 0xe9, 0x7e, 0x53, 0x84, ]; - assert!(quick_get_difficulty(&hash, nonce, &mix_hash)[..] != boundary_bad[..]); + assert!(quick_get_difficulty(&hash, nonce, &mix_hash, false)[..] != boundary_bad[..]); } #[test] @@ -391,7 +426,7 @@ mod test { let tempdir = TempDir::new("").unwrap(); // difficulty = 0x085657254bd9u64; - let light = NodeCacheBuilder::new(None).light(tempdir.path(), 486382); + let light = NodeCacheBuilder::new(None, u64::max_value()).light(tempdir.path(), 486382); let result = light_compute(&light, &hash, nonce); assert_eq!(result.mix_hash[..], mix_hash[..]); assert_eq!(result.value[..], boundary[..]); @@ -400,7 +435,7 @@ mod test { #[test] fn test_drop_old_data() { let tempdir = TempDir::new("").unwrap(); - let builder = NodeCacheBuilder::new(None); + let builder = NodeCacheBuilder::new(None, u64::max_value()); let first = builder.light(tempdir.path(), 0).to_file().unwrap().to_owned(); let second = builder.light(tempdir.path(), ETHASH_EPOCH_LENGTH).to_file().unwrap().to_owned(); diff --git a/ethash/src/keccak.rs b/ethash/src/keccak.rs index ab6be94dcaa..3f7576c7bb8 100644 --- a/ethash/src/keccak.rs +++ b/ethash/src/keccak.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate keccak_hash as hash; diff --git a/ethash/src/lib.rs b/ethash/src/lib.rs index dc815b07fdc..e40c08920cf 100644 --- a/ethash/src/lib.rs +++ b/ethash/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate either; extern crate ethereum_types; @@ -25,15 +25,30 @@ extern crate crunchy; #[macro_use] extern crate log; +#[cfg(test)] +extern crate rustc_hex; + +#[cfg(test)] +extern crate serde_json; + #[cfg(test)] extern crate tempdir; +#[cfg(feature = "bench")] +pub mod compute; +#[cfg(not(feature = "bench"))] mod compute; + mod seed_compute; mod cache; mod keccak; mod shared; +#[cfg(feature = "bench")] +pub mod progpow; +#[cfg(not(feature = "bench"))] +mod progpow; + pub use cache::{NodeCacheBuilder, OptimizeFor}; pub use compute::{ProofOfWork, quick_get_difficulty, slow_hash_block_number}; use compute::Light; @@ -59,14 +74,16 @@ pub struct EthashManager { nodecache_builder: NodeCacheBuilder, cache: Mutex, cache_dir: PathBuf, + progpow_transition: u64, } impl EthashManager { /// Create a new new instance of ethash manager - pub fn new>>(cache_dir: &Path, optimize_for: T) -> EthashManager { + pub fn new>>(cache_dir: &Path, optimize_for: T, progpow_transition: u64) -> EthashManager { EthashManager { cache_dir: cache_dir.to_path_buf(), - nodecache_builder: NodeCacheBuilder::new(optimize_for.into().unwrap_or_default()), + nodecache_builder: NodeCacheBuilder::new(optimize_for.into().unwrap_or_default(), progpow_transition), + progpow_transition: progpow_transition, cache: Mutex::new(LightCache { recent_epoch: None, recent: None, @@ -85,27 +102,33 @@ impl EthashManager { let epoch = block_number / ETHASH_EPOCH_LENGTH; let light = { let mut lights = self.cache.lock(); - let light = match lights.recent_epoch.clone() { - Some(ref e) if *e == epoch => lights.recent.clone(), - _ => match lights.prev_epoch.clone() { - Some(e) if e == epoch => { - // don't swap if recent is newer. - if lights.recent_epoch > lights.prev_epoch { - None - } else { - // swap - let t = lights.prev_epoch; - lights.prev_epoch = lights.recent_epoch; - lights.recent_epoch = t; - let t = lights.prev.clone(); - lights.prev = lights.recent.clone(); - lights.recent = t; - lights.recent.clone() + let light = if block_number == self.progpow_transition { + // we need to regenerate the cache to trigger algorithm change to progpow inside `Light` + None + } else { + match lights.recent_epoch.clone() { + Some(ref e) if *e == epoch => lights.recent.clone(), + _ => match lights.prev_epoch.clone() { + Some(e) if e == epoch => { + // don't swap if recent is newer. + if lights.recent_epoch > lights.prev_epoch { + None + } else { + // swap + let t = lights.prev_epoch; + lights.prev_epoch = lights.recent_epoch; + lights.recent_epoch = t; + let t = lights.prev.clone(); + lights.prev = lights.recent.clone(); + lights.recent = t; + lights.recent.clone() + } } - } - _ => None, - }, + _ => None, + }, + } }; + match light { None => { let light = match self.nodecache_builder.light_from_file( @@ -132,7 +155,7 @@ impl EthashManager { Some(light) => light, } }; - light.compute(header_hash, nonce) + light.compute(header_hash, nonce, block_number) } } @@ -164,7 +187,7 @@ fn test_lru() { use tempdir::TempDir; let tempdir = TempDir::new("").unwrap(); - let ethash = EthashManager::new(tempdir.path(), None); + let ethash = EthashManager::new(tempdir.path(), None, u64::max_value()); let hash = [0u8; 32]; ethash.compute_light(1, &hash, 1); ethash.compute_light(50000, &hash, 1); diff --git a/ethash/src/progpow.rs b/ethash/src/progpow.rs new file mode 100644 index 00000000000..038f38c2259 --- /dev/null +++ b/ethash/src/progpow.rs @@ -0,0 +1,595 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use compute::{FNV_PRIME, calculate_dag_item}; +use keccak::H256; +use shared::{ETHASH_ACCESSES, ETHASH_MIX_BYTES, Node, get_data_size}; + +const PROGPOW_CACHE_BYTES: usize = 16 * 1024; +const PROGPOW_CACHE_WORDS: usize = PROGPOW_CACHE_BYTES / 4; +const PROGPOW_CNT_CACHE: usize = 12; +const PROGPOW_CNT_MATH: usize = 20; +const PROGPOW_CNT_DAG: usize = ETHASH_ACCESSES; +const PROGPOW_DAG_LOADS: usize = 4; +const PROGPOW_MIX_BYTES: usize = 2 * ETHASH_MIX_BYTES; +const PROGPOW_PERIOD_LENGTH: usize = 50; // blocks per progpow epoch (N) +const PROGPOW_LANES: usize = 16; +const PROGPOW_REGS: usize = 32; + +const FNV_HASH: u32 = 0x811c9dc5; + +const KECCAKF_RNDC: [u32; 24] = [ + 0x00000001, 0x00008082, 0x0000808a, 0x80008000, 0x0000808b, 0x80000001, + 0x80008081, 0x00008009, 0x0000008a, 0x00000088, 0x80008009, 0x8000000a, + 0x8000808b, 0x0000008b, 0x00008089, 0x00008003, 0x00008002, 0x00000080, + 0x0000800a, 0x8000000a, 0x80008081, 0x00008080, 0x80000001, 0x80008008 +]; + +const KECCAKF_ROTC: [u32; 24] = [ + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44 +]; + +const KECCAKF_PILN: [usize; 24] = [ + 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1 +]; + +fn keccak_f800_round(st: &mut [u32; 25], r: usize) { + // Theta + let mut bc = [0u32; 5]; + for i in 0..bc.len() { + bc[i] = st[i] ^ st[i + 5] ^ st[i + 10] ^ st[i + 15] ^ st[i + 20]; + } + + for i in 0..bc.len() { + let t = bc[(i + 4) % 5] ^ bc[(i + 1) % 5].rotate_left(1); + for j in (0..st.len()).step_by(5) { + st[j + i] ^= t; + } + } + + // Rho Pi + let mut t = st[1]; + + debug_assert_eq!(KECCAKF_ROTC.len(), 24); + for i in 0..24 { + let j = KECCAKF_PILN[i]; + bc[0] = st[j]; + st[j] = t.rotate_left(KECCAKF_ROTC[i]); + t = bc[0]; + } + + // Chi + for j in (0..st.len()).step_by(5) { + for i in 0..bc.len() { + bc[i] = st[j + i]; + } + for i in 0..bc.len() { + st[j + i] ^= (!bc[(i + 1) % 5]) & bc[(i + 2) % 5]; + } + } + + // Iota + debug_assert!(r < KECCAKF_RNDC.len()); + st[0] ^= KECCAKF_RNDC[r]; +} + +fn keccak_f800(header_hash: H256, nonce: u64, result: [u32; 8], st: &mut [u32; 25]) { + for i in 0..8 { + st[i] = (header_hash[4 * i] as u32) + + ((header_hash[4 * i + 1] as u32) << 8) + + ((header_hash[4 * i + 2] as u32) << 16) + + ((header_hash[4 * i + 3] as u32) << 24); + } + + st[8] = nonce as u32; + st[9] = (nonce >> 32) as u32; + + for i in 0..8 { + st[10 + i] = result[i]; + } + + for r in 0..22 { + keccak_f800_round(st, r); + } +} + +pub fn keccak_f800_short(header_hash: H256, nonce: u64, result: [u32; 8]) -> u64 { + let mut st = [0u32; 25]; + keccak_f800(header_hash, nonce, result, &mut st); + (st[0].swap_bytes() as u64) << 32 | st[1].swap_bytes() as u64 +} + +pub fn keccak_f800_long(header_hash: H256, nonce: u64, result: [u32; 8]) -> H256 { + let mut st = [0u32; 25]; + keccak_f800(header_hash, nonce, result, &mut st); + + // NOTE: transmute from `[u32; 8]` to `[u8; 32]` + unsafe { + std::mem::transmute( + [st[0], st[1], st[2], st[3], st[4], st[5], st[6], st[7]] + ) + } +} + +#[inline] +fn fnv1a_hash(h: u32, d: u32) -> u32 { + (h ^ d).wrapping_mul(FNV_PRIME) +} + +#[derive(Clone)] +struct Kiss99 { + z: u32, + w: u32, + jsr: u32, + jcong: u32, +} + +impl Kiss99 { + fn new(z: u32, w: u32, jsr: u32, jcong: u32) -> Kiss99 { + Kiss99 { z, w, jsr, jcong } + } + + #[inline] + fn next_u32(&mut self) -> u32 { + self.z = 36969u32.wrapping_mul(self.z & 65535).wrapping_add(self.z >> 16); + self.w = 18000u32.wrapping_mul(self.w & 65535).wrapping_add(self.w >> 16); + let mwc = (self.z << 16).wrapping_add(self.w); + self.jsr ^= self.jsr << 17; + self.jsr ^= self.jsr >> 13; + self.jsr ^= self.jsr << 5; + self.jcong = 69069u32.wrapping_mul(self.jcong).wrapping_add(1234567); + + (mwc ^ self.jcong).wrapping_add(self.jsr) + } +} + +fn fill_mix(seed: u64, lane_id: u32) -> [u32; PROGPOW_REGS] { + // Use FNV to expand the per-warp seed to per-lane + // Use KISS to expand the per-lane seed to fill mix + let z = fnv1a_hash(FNV_HASH, seed as u32); + let w = fnv1a_hash(z, (seed >> 32) as u32); + let jsr = fnv1a_hash(w, lane_id); + let jcong = fnv1a_hash(jsr, lane_id); + + let mut rnd = Kiss99::new(z, w, jsr, jcong); + + let mut mix = [0; PROGPOW_REGS]; + + debug_assert_eq!(PROGPOW_REGS, 32); + for i in 0..32 { + mix[i] = rnd.next_u32(); + } + + mix +} + +// Merge new data from b into the value in a. Assuming A has high entropy only +// do ops that retain entropy even if B is low entropy (IE don't do A&B) +fn merge(a: u32, b: u32, r: u32) -> u32 { + match r % 4 { + 0 => a.wrapping_mul(33).wrapping_add(b), + 1 => (a ^ b).wrapping_mul(33), + 2 => a.rotate_left(((r >> 16) % 31) + 1) ^ b, + _ => a.rotate_right(((r >> 16) % 31) + 1) ^ b, + } +} + +fn math(a: u32, b: u32, r: u32) -> u32 { + match r % 11 { + 0 => a.wrapping_add(b), + 1 => a.wrapping_mul(b), + 2 => ((a as u64).wrapping_mul(b as u64) >> 32) as u32, + 3 => a.min(b), + 4 => a.rotate_left(b), + 5 => a.rotate_right(b), + 6 => a & b, + 7 => a | b, + 8 => a ^ b, + 9 => a.leading_zeros() + b.leading_zeros(), + _ => a.count_ones() + b.count_ones(), + } +} + +fn progpow_init(seed: u64) -> (Kiss99, [u32; PROGPOW_REGS], [u32; PROGPOW_REGS]) { + let z = fnv1a_hash(FNV_HASH, seed as u32); + let w = fnv1a_hash(z, (seed >> 32) as u32); + let jsr = fnv1a_hash(w, seed as u32); + let jcong = fnv1a_hash(jsr, (seed >> 32) as u32); + + let mut rnd = Kiss99::new(z, w, jsr, jcong); + + // Create a random sequence of mix destinations for merge() and mix sources + // for cache reads guarantees every destination merged once and guarantees + // no duplicate cache reads, which could be optimized away. Uses + // Fisher-Yates shuffle. + let mut mix_seq_dst = [0u32; PROGPOW_REGS]; + let mut mix_seq_cache = [0u32; PROGPOW_REGS]; + for i in 0..mix_seq_dst.len() { + mix_seq_dst[i] = i as u32; + mix_seq_cache[i] = i as u32; + } + + for i in (1..mix_seq_dst.len()).rev() { + let j = rnd.next_u32() as usize % (i + 1); + mix_seq_dst.swap(i, j); + + let j = rnd.next_u32() as usize % (i + 1); + mix_seq_cache.swap(i, j); + } + + (rnd, mix_seq_dst, mix_seq_cache) +} + +pub type CDag = [u32; PROGPOW_CACHE_WORDS]; + +fn progpow_loop( + seed: u64, + loop_: usize, + mix: &mut [[u32; PROGPOW_REGS]; PROGPOW_LANES], + cache: &[Node], + c_dag: &CDag, + data_size: usize, +) { + // All lanes share a base address for the global load. Global offset uses + // mix[0] to guarantee it depends on the load result. + let g_offset = mix[loop_ % PROGPOW_LANES][0] as usize % + (64 * data_size / (PROGPOW_LANES * PROGPOW_DAG_LOADS)); + + // 256 bytes of dag data + let mut dag_item = [0u32; 64]; + + // Fetch DAG nodes (64 bytes each) + for l in 0..PROGPOW_DAG_LOADS { + let index = g_offset * PROGPOW_LANES * PROGPOW_DAG_LOADS + l * 16; + let node = calculate_dag_item(index as u32 / 16, cache); + dag_item[l * 16..(l + 1) * 16].clone_from_slice(node.as_words()); + } + + let (rnd, mix_seq_dst, mix_seq_cache) = progpow_init(seed); + + // Lanes can execute in parallel and will be convergent + for l in 0..mix.len() { + let mut rnd = rnd.clone(); + + // Initialize the seed and mix destination sequence + let mut mix_seq_dst_cnt = 0; + let mut mix_seq_cache_cnt = 0; + + let mut mix_dst = || { + let res = mix_seq_dst[mix_seq_dst_cnt % PROGPOW_REGS] as usize; + mix_seq_dst_cnt += 1; + res + }; + let mut mix_cache = || { + let res = mix_seq_cache[mix_seq_cache_cnt % PROGPOW_REGS] as usize; + mix_seq_cache_cnt += 1; + res + }; + + for i in 0..PROGPOW_CNT_CACHE.max(PROGPOW_CNT_MATH) { + if i < PROGPOW_CNT_CACHE { + // Cached memory access, lanes access random 32-bit locations + // within the first portion of the DAG + let offset = mix[l][mix_cache()] as usize % PROGPOW_CACHE_WORDS; + let data = c_dag[offset]; + let dst = mix_dst(); + + mix[l][dst] = merge(mix[l][dst], data, rnd.next_u32()); + } + + if i < PROGPOW_CNT_MATH { + // Random math + // Generate 2 unique sources + let src_rnd = rnd.next_u32() % (PROGPOW_REGS * (PROGPOW_REGS - 1)) as u32; + let src1 = src_rnd % PROGPOW_REGS as u32; // 0 <= src1 < PROGPOW_REGS + let mut src2 = src_rnd / PROGPOW_REGS as u32; // 0 <= src2 < PROGPOW_REGS - 1 + if src2 >= src1 { + src2 += 1; // src2 is now any reg other than src1 + } + + let data = math(mix[l][src1 as usize], mix[l][src2 as usize], rnd.next_u32()); + let dst = mix_dst(); + + mix[l][dst] = merge(mix[l][dst], data, rnd.next_u32()); + } + } + + // Global load to sequential locations + let mut data_g = [0u32; PROGPOW_DAG_LOADS]; + let index = ((l ^ loop_) % PROGPOW_LANES) * PROGPOW_DAG_LOADS; + for i in 0..PROGPOW_DAG_LOADS { + data_g[i] = dag_item[index + i]; + } + + // Consume the global load data at the very end of the loop to allow + // full latency hiding. Always merge into `mix[0]` to feed the offset + // calculation. + mix[l][0] = merge(mix[l][0], data_g[0], rnd.next_u32()); + for i in 1..PROGPOW_DAG_LOADS { + let dst = mix_dst(); + mix[l][dst] = merge(mix[l][dst], data_g[i], rnd.next_u32()); + } + } +} + +pub fn progpow( + header_hash: H256, + nonce: u64, + block_number: u64, + cache: &[Node], + c_dag: &CDag, +) -> (H256, H256) { + let mut mix = [[0u32; PROGPOW_REGS]; PROGPOW_LANES]; + let mut lane_results = [0u32; PROGPOW_LANES]; + let mut result = [0u32; 8]; + + let data_size = get_data_size(block_number) / PROGPOW_MIX_BYTES; + + // NOTE: This assert is required to aid the optimizer elide the non-zero + // remainder check in `progpow_loop`. + assert!(data_size > 0); + + // Initialize mix for all lanes + let seed = keccak_f800_short(header_hash, nonce, result); + + for l in 0..mix.len() { + mix[l] = fill_mix(seed, l as u32); + } + + // Execute the randomly generated inner loop + let period = block_number / PROGPOW_PERIOD_LENGTH as u64; + for i in 0..PROGPOW_CNT_DAG { + progpow_loop( + period, + i, + &mut mix, + cache, + c_dag, + data_size, + ); + } + + // Reduce mix data to a single per-lane result + for l in 0..lane_results.len() { + lane_results[l] = FNV_HASH; + for i in 0..PROGPOW_REGS { + lane_results[l] = fnv1a_hash(lane_results[l], mix[l][i]); + } + } + + // Reduce all lanes to a single 128-bit result + result = [FNV_HASH; 8]; + for l in 0..PROGPOW_LANES { + result[l % 8] = fnv1a_hash(result[l % 8], lane_results[l]); + } + + let digest = keccak_f800_long(header_hash, seed, result); + + // NOTE: transmute from `[u32; 8]` to `[u8; 32]` + let result = unsafe { ::std::mem::transmute(result) }; + + (digest, result) +} + +pub fn generate_cdag(cache: &[Node]) -> CDag { + let mut c_dag = [0u32; PROGPOW_CACHE_WORDS]; + + for i in 0..PROGPOW_CACHE_WORDS / 16 { + let node = calculate_dag_item(i as u32, cache); + for j in 0..16 { + c_dag[i * 16 + j] = node.as_words()[j]; + } + } + + c_dag +} + +#[cfg(test)] +mod test { + use tempdir::TempDir; + + use cache::{NodeCacheBuilder, OptimizeFor}; + use keccak::H256; + use rustc_hex::FromHex; + use serde_json::{self, Value}; + use std::collections::VecDeque; + use super::*; + + fn h256(hex: &str) -> H256 { + let bytes = FromHex::from_hex(hex).unwrap(); + let mut res = [0; 32]; + res.copy_from_slice(&bytes); + res + } + + #[test] + fn test_cdag() { + let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value()); + let tempdir = TempDir::new("").unwrap(); + let cache = builder.new_cache(tempdir.into_path(), 0); + + let c_dag = generate_cdag(cache.as_ref()); + + let expected = vec![ + 690150178u32, 1181503948, 2248155602, 2118233073, 2193871115, + 1791778428, 1067701239, 724807309, 530799275, 3480325829, 3899029234, + 1998124059, 2541974622, 1100859971, 1297211151, 3268320000, 2217813733, + 2690422980, 3172863319, 2651064309 + ]; + + assert_eq!( + c_dag.iter().take(20).cloned().collect::>(), + expected, + ); + } + + #[test] + fn test_random_merge() { + let tests = [ + (1000000u32, 101u32, 33000101u32), + (2000000, 102, 66003366), + (3000000, 103, 6000103), + (4000000, 104, 2000104), + (1000000, 0, 33000000), + (2000000, 0, 66000000), + (3000000, 0, 6000000), + (4000000, 0, 2000000), + ]; + + for (i, &(a, b, expected)) in tests.iter().enumerate() { + assert_eq!( + merge(a, b, i as u32), + expected, + ); + } + } + + #[test] + fn test_random_math() { + let tests = [ + (20u32, 22u32, 42u32), + (70000, 80000, 1305032704), + (70000, 80000, 1), + (1, 2, 1), + (3, 10000, 196608), + (3, 0, 3), + (3, 6, 2), + (3, 6, 7), + (3, 6, 5), + (0, 0xffffffff, 32), + (3 << 13, 1 << 5, 3), + (22, 20, 42), + (80000, 70000, 1305032704), + (80000, 70000, 1), + (2, 1, 1), + (10000, 3, 80000), + (0, 3, 0), + (6, 3, 2), + (6, 3, 7), + (6, 3, 5), + (0, 0xffffffff, 32), + (3 << 13, 1 << 5, 3), + ]; + + for (i, &(a, b, expected)) in tests.iter().enumerate() { + assert_eq!( + math(a, b, i as u32), + expected, + ); + } + } + + #[test] + fn test_keccak_256() { + let expected = "5dd431e5fbc604f499bfa0232f45f8f142d0ff5178f539e5a7800bf0643697af"; + assert_eq!( + keccak_f800_long([0; 32], 0, [0; 8]), + h256(expected), + ); + } + + #[test] + fn test_keccak_64() { + let expected: u64 = 0x5dd431e5fbc604f4; + assert_eq!( + keccak_f800_short([0; 32], 0, [0; 8]), + expected, + ); + } + + #[test] + fn test_progpow_hash() { + let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value()); + let tempdir = TempDir::new("").unwrap(); + let cache = builder.new_cache(tempdir.into_path(), 0); + let c_dag = generate_cdag(cache.as_ref()); + + let header_hash = [0; 32]; + + let (digest, result) = progpow( + header_hash, + 0, + 0, + cache.as_ref(), + &c_dag, + ); + + let expected_digest = FromHex::from_hex("63155f732f2bf556967f906155b510c917e48e99685ead76ea83f4eca03ab12b").unwrap(); + let expected_result = FromHex::from_hex("faeb1be51075b03a4ff44b335067951ead07a3b078539ace76fd56fc410557a3").unwrap(); + + assert_eq!( + digest.to_vec(), + expected_digest, + ); + + assert_eq!( + result.to_vec(), + expected_result, + ); + } + + #[test] + fn test_progpow_testvectors() { + struct ProgpowTest { + block_number: u64, + header_hash: H256, + nonce: u64, + mix_hash: H256, + final_hash: H256, + } + + let tests: Vec> = + serde_json::from_slice(include_bytes!("../res/progpow_testvectors.json")).unwrap(); + + let tests: Vec = tests.into_iter().map(|mut test: VecDeque| { + assert!(test.len() == 5); + + let block_number: u64 = serde_json::from_value(test.pop_front().unwrap()).unwrap(); + let header_hash: String = serde_json::from_value(test.pop_front().unwrap()).unwrap(); + let nonce: String = serde_json::from_value(test.pop_front().unwrap()).unwrap(); + let mix_hash: String = serde_json::from_value(test.pop_front().unwrap()).unwrap(); + let final_hash: String = serde_json::from_value(test.pop_front().unwrap()).unwrap(); + + ProgpowTest { + block_number, + header_hash: h256(&header_hash), + nonce: u64::from_str_radix(&nonce, 16).unwrap(), + mix_hash: h256(&mix_hash), + final_hash: h256(&final_hash), + } + }).collect(); + + for test in tests { + let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value()); + let tempdir = TempDir::new("").unwrap(); + let cache = builder.new_cache(tempdir.path().to_owned(), test.block_number); + let c_dag = generate_cdag(cache.as_ref()); + + let (digest, result) = progpow( + test.header_hash, + test.nonce, + test.block_number, + cache.as_ref(), + &c_dag, + ); + + assert_eq!(digest, test.final_hash); + assert_eq!(result, test.mix_hash); + } + } +} diff --git a/ethash/src/seed_compute.rs b/ethash/src/seed_compute.rs index 7a3f89b9b5d..51782803285 100644 --- a/ethash/src/seed_compute.rs +++ b/ethash/src/seed_compute.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use shared; use keccak::{keccak_256, H256}; diff --git a/ethash/src/shared.rs b/ethash/src/shared.rs index 90969c52225..2c9a9fa9d0e 100644 --- a/ethash/src/shared.rs +++ b/ethash/src/shared.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use primal::is_prime; diff --git a/ethcore/Cargo.toml b/ethcore/Cargo.toml index 308769cf58b..0e3cea0fc6d 100644 --- a/ethcore/Cargo.toml +++ b/ethcore/Cargo.toml @@ -8,81 +8,80 @@ authors = ["Parity Technologies "] [dependencies] ansi_term = "0.10" -blooms-db = { path = "../util/blooms-db" } +blooms-db = { path = "../util/blooms-db", optional = true } bn = { git = "https://github.com/paritytech/bn", default-features = false } byteorder = "1.0" common-types = { path = "types" } crossbeam = "0.4" +env_logger = { version = "0.5", optional = true } +error-chain = { version = "0.12", default-features = false } +ethabi = "6.0" +ethabi-contract = "6.0" +ethabi-derive = "6.0" ethash = { path = "../ethash" } +ethcore-blockchain = { path = "./blockchain" } ethcore-bloom-journal = { path = "../util/bloom" } -parity-bytes = "0.1" -hashdb = "0.3.0" -memorydb = "0.3.0" -patricia-trie = "0.3.0" -patricia-trie-ethereum = { path = "../util/patricia-trie-ethereum" } -parity-crypto = "0.2" -error-chain = { version = "0.12", default-features = false } +ethcore-call-contract = { path = "./call-contract" } +ethcore-db = { path = "./db" } ethcore-io = { path = "../util/io" } -ethcore-logger = { path = "../logger" } ethcore-miner = { path = "../miner" } -ethcore-stratum = { path = "./stratum", optional = true } -ethcore-transaction = { path = "./transaction" } +ethcore-stratum = { path = "../miner/stratum", optional = true } ethereum-types = "0.4" -memory-cache = { path = "../util/memory_cache" } -ethabi = "6.0" -ethabi-derive = "6.0" -ethabi-contract = "6.0" ethjson = { path = "../json" } -ethkey = { path = "../ethkey" } -ethstore = { path = "../ethstore" } +ethkey = { path = "../accounts/ethkey" } evm = { path = "evm" } +hash-db = "0.11.0" heapsize = "0.4" itertools = "0.5" +journaldb = { path = "../util/journaldb" } +keccak-hash = "0.1" +keccak-hasher = { path = "../util/keccak-hasher" } +kvdb = "0.1" +kvdb-memorydb = "0.1" +kvdb-rocksdb = { version = "0.1.3", optional = true } lazy_static = "1.0" +len-caching-lock = { path = "../util/len-caching-lock" } log = "0.4" lru-cache = "0.1" +macros = { path = "../util/macros" } +memory-cache = { path = "../util/memory-cache" } +memory-db = "0.11.0" num = { version = "0.1", default-features = false, features = ["bigint"] } num_cpus = "1.2" +parity-bytes = "0.1" +parity-crypto = "0.3.0" parity-machine = { path = "../machine" } +parity-snappy = "0.1" parking_lot = "0.7" -rayon = "1.0" +trie-db = "0.11.0" +patricia-trie-ethereum = { path = "../util/patricia-trie-ethereum" } rand = "0.4" +rayon = "1.0" rlp = { version = "0.3.0", features = ["ethereum"] } -rlp_compress = { path = "../util/rlp_compress" } -rlp_derive = { path = "../util/rlp_derive" } -kvdb = "0.1" -kvdb-memorydb = "0.1" -parity-snappy = "0.1" -stop-guard = { path = "../util/stop-guard" } -macros = { path = "../util/macros" } +rlp_derive = { path = "../util/rlp-derive" } rustc-hex = "1.0" +serde = "1.0" +serde_derive = "1.0" stats = { path = "../util/stats" } +tempdir = {version="0.3", optional = true} trace-time = "0.1" -using_queue = { path = "../util/using_queue" } -vm = { path = "vm" } -wasm = { path = "wasm" } -keccak-hash = "0.1" triehash-ethereum = { version = "0.2", path = "../util/triehash-ethereum" } unexpected = { path = "../util/unexpected" } -journaldb = { path = "../util/journaldb" } -keccak-hasher = { path = "../util/keccak-hasher" } -kvdb-rocksdb = "0.1.3" -serde = "1.0" -serde_derive = "1.0" -tempdir = {version="0.3", optional = true} -len-caching-lock = { path = "../util/len-caching-lock" } - -[target.'cfg(any(target_os = "linux", target_os = "macos", target_os = "windows", target_os = "android"))'.dependencies] -hardware-wallet = { path = "../hw" } - -[target.'cfg(not(any(target_os = "linux", target_os = "macos", target_os = "windows", target_os = "android")))'.dependencies] -fake-hardware-wallet = { path = "../util/fake-hardware-wallet" } +using_queue = { path = "../miner/using-queue" } +vm = { path = "vm" } +wasm = { path = "wasm" } [dev-dependencies] -env_logger = "0.4" +blooms-db = { path = "../util/blooms-db" } +criterion = "0.2" +env_logger = "0.5" +ethcore-accounts = { path = "../accounts" } +fetch = { path = "../util/fetch" } +kvdb-rocksdb = "0.1.3" +parity-runtime = { path = "../util/runtime" } +rlp_compress = { path = "../util/rlp-compress" } tempdir = "0.3" trie-standardmap = "0.1" -criterion = "0.2" [features] parity = ["work-notify", "price-info", "stratum"] @@ -106,13 +105,13 @@ evm-debug-tests = ["evm-debug", "evm/evm-debug-tests"] # EVM debug traces are printed. slow-blocks = [] # Run JSON consensus tests. -json-tests = ["ethcore-transaction/json-tests", "test-helpers", "tempdir", "to-pod-full"] +json-tests = ["env_logger", "test-helpers", "to-pod-full"] # Skip JSON consensus tests with pending issues. -ci-skip-issue = [] +ci-skip-tests = [] # Run memory/cpu heavy tests. test-heavy = [] # Compile test helpers -test-helpers = ["tempdir"] +test-helpers = ["tempdir", "kvdb-rocksdb", "blooms-db"] # Enables slow 'to-pod-full' method for use in tests and evmbin. to-pod-full = [] diff --git a/ethcore/benches/builtin.rs b/ethcore/benches/builtin.rs index cd99be6a3a6..d7ed483dd03 100644 --- a/ethcore/benches/builtin.rs +++ b/ethcore/benches/builtin.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . #[macro_use] extern crate criterion; @@ -154,7 +154,6 @@ fn ecrecover(b: &mut Criterion) { ); } - fn sha256(b: &mut Criterion) { bench( "sha256", @@ -165,7 +164,6 @@ fn sha256(b: &mut Criterion) { ); } - fn ripemd(b: &mut Criterion) { bench( "ripemd", @@ -176,7 +174,6 @@ fn ripemd(b: &mut Criterion) { ); } - fn identity(b: &mut Criterion) { bench( "identity", @@ -187,7 +184,6 @@ fn identity(b: &mut Criterion) { ); } - fn modexp_eip_example1(b: &mut Criterion) { bench( "modexp_eip_example1", @@ -198,7 +194,6 @@ fn modexp_eip_example1(b: &mut Criterion) { ); } - fn modexp_eip_example2(b: &mut Criterion) { bench( "modexp_eip_example2", @@ -209,7 +204,6 @@ fn modexp_eip_example2(b: &mut Criterion) { ); } - fn modexp_nagydani_1_square(b: &mut Criterion) { bench( "modexp_nagydani_1_square", @@ -220,7 +214,6 @@ fn modexp_nagydani_1_square(b: &mut Criterion) { ); } - fn modexp_nagydani_1_qube(b: &mut Criterion) { bench( "modexp_nagydani_1_qube", @@ -231,7 +224,6 @@ fn modexp_nagydani_1_qube(b: &mut Criterion) { ); } - fn modexp_nagydani_1_pow0x10001(b: &mut Criterion) { bench( "modexp_nagydani_1_pow0x10001", @@ -242,7 +234,6 @@ fn modexp_nagydani_1_pow0x10001(b: &mut Criterion) { ); } - fn modexp_nagydani_2_square(b: &mut Criterion) { bench( "modexp_nagydani_2_square", @@ -253,8 +244,6 @@ fn modexp_nagydani_2_square(b: &mut Criterion) { ); } - - fn modexp_nagydani_2_qube(b: &mut Criterion) { bench( "modexp_nagydani_2_qube", @@ -265,7 +254,6 @@ fn modexp_nagydani_2_qube(b: &mut Criterion) { ); } - fn modexp_nagydani_2_pow0x10001(b: &mut Criterion) { bench( "modexp_nagydani_2_pow0x10001", @@ -276,7 +264,6 @@ fn modexp_nagydani_2_pow0x10001(b: &mut Criterion) { ); } - fn modexp_nagydani_3_square(b: &mut Criterion) { bench( "modexp_nagydani_3_square", @@ -287,7 +274,6 @@ fn modexp_nagydani_3_square(b: &mut Criterion) { ); } - fn modexp_nagydani_3_qube(b: &mut Criterion) { bench( "modexp_nagydani_3_qube", @@ -298,7 +284,6 @@ fn modexp_nagydani_3_qube(b: &mut Criterion) { ); } - fn modexp_nagydani_3_pow0x10001(b: &mut Criterion) { bench( "modexp_nagydani_3_pow0x10001", @@ -309,7 +294,6 @@ fn modexp_nagydani_3_pow0x10001(b: &mut Criterion) { ); } - fn modexp_nagydani_4_square(b: &mut Criterion) { bench( "modexp_nagydani_4_square", @@ -320,7 +304,6 @@ fn modexp_nagydani_4_square(b: &mut Criterion) { ); } - fn modexp_nagydani_4_qube(b: &mut Criterion) { bench( "modexp_nagydani_4_qube", @@ -331,7 +314,6 @@ fn modexp_nagydani_4_qube(b: &mut Criterion) { ); } - fn modexp_nagydani_4_pow0x10001(b: &mut Criterion) { bench( "modexp_nagydani_4_pow0x10001", @@ -342,7 +324,6 @@ fn modexp_nagydani_4_pow0x10001(b: &mut Criterion) { ); } - fn modexp_nagydani_5_square(b: &mut Criterion) { bench( "modexp_nagydani_5_square", @@ -353,7 +334,6 @@ fn modexp_nagydani_5_square(b: &mut Criterion) { ); } - fn modexp_nagydani_5_qube(b: &mut Criterion) { bench( "modexp_nagydani_5_qube", @@ -364,8 +344,6 @@ fn modexp_nagydani_5_qube(b: &mut Criterion) { ); } - - fn modexp_nagydani_5_pow0x10001(b: &mut Criterion) { bench( "modexp_nagydani_5_pow0x10001", @@ -376,7 +354,6 @@ fn modexp_nagydani_5_pow0x10001(b: &mut Criterion) { ); } - fn alt_bn128_add_chfast1(b: &mut Criterion) { bench( "alt_bn128_add_chfast1", @@ -387,7 +364,6 @@ fn alt_bn128_add_chfast1(b: &mut Criterion) { ); } - fn alt_bn128_add_chfast2(b: &mut Criterion) { bench( "alt_bn128_add_chfast2", @@ -398,7 +374,6 @@ fn alt_bn128_add_chfast2(b: &mut Criterion) { ); } - fn alt_bn128_add_cdetrio1(b: &mut Criterion) { bench( "alt_bn128_add_cdetrio1", @@ -409,7 +384,6 @@ fn alt_bn128_add_cdetrio1(b: &mut Criterion) { ); } - fn alt_bn128_add_cdetrio2(b: &mut Criterion) { bench( "alt_bn128_add_cdetrio2", @@ -420,7 +394,6 @@ fn alt_bn128_add_cdetrio2(b: &mut Criterion) { ); } - fn alt_bn128_add_cdetrio3(b: &mut Criterion) { bench( "alt_bn128_add_cdetrio3", @@ -431,7 +404,6 @@ fn alt_bn128_add_cdetrio3(b: &mut Criterion) { ); } - fn alt_bn128_add_cdetrio4(b: &mut Criterion) { bench( "alt_bn128_add_cdetrio4", @@ -442,7 +414,6 @@ fn alt_bn128_add_cdetrio4(b: &mut Criterion) { ); } - fn alt_bn128_add_cdetrio5(b: &mut Criterion) { bench( "alt_bn128_add_cdetrio5", @@ -453,7 +424,6 @@ fn alt_bn128_add_cdetrio5(b: &mut Criterion) { ); } - fn alt_bn128_add_cdetrio6(b: &mut Criterion) { bench( "alt_bn128_add_cdetrio6", @@ -464,7 +434,6 @@ fn alt_bn128_add_cdetrio6(b: &mut Criterion) { ); } - fn alt_bn128_add_cdetrio7(b: &mut Criterion) { bench( "alt_bn128_add_cdetrio7", @@ -475,7 +444,6 @@ fn alt_bn128_add_cdetrio7(b: &mut Criterion) { ); } - fn alt_bn128_add_cdetrio8(b: &mut Criterion) { bench( "alt_bn128_add_cdetrio8", @@ -486,7 +454,6 @@ fn alt_bn128_add_cdetrio8(b: &mut Criterion) { ); } - fn alt_bn128_add_cdetrio9(b: &mut Criterion) { bench( "alt_bn128_add_cdetrio9", @@ -497,7 +464,6 @@ fn alt_bn128_add_cdetrio9(b: &mut Criterion) { ); } - fn alt_bn128_add_cdetrio10(b: &mut Criterion) { bench( "alt_bn128_add_cdetrio10", @@ -508,7 +474,6 @@ fn alt_bn128_add_cdetrio10(b: &mut Criterion) { ); } - fn alt_bn128_add_cdetrio11(b: &mut Criterion) { bench( "alt_bn128_add_cdetrio11", @@ -519,7 +484,6 @@ fn alt_bn128_add_cdetrio11(b: &mut Criterion) { ); } - fn alt_bn128_add_cdetrio12(b: &mut Criterion) { bench( "alt_bn128_add_cdetrio12", @@ -530,7 +494,6 @@ fn alt_bn128_add_cdetrio12(b: &mut Criterion) { ); } - fn alt_bn128_add_cdetrio13(b: &mut Criterion) { bench( "alt_bn128_add_cdetrio13", @@ -541,7 +504,6 @@ fn alt_bn128_add_cdetrio13(b: &mut Criterion) { ); } - fn alt_bn128_add_cdetrio14(b: &mut Criterion) { bench( "alt_bn128_add_cdetrio14", @@ -552,7 +514,6 @@ fn alt_bn128_add_cdetrio14(b: &mut Criterion) { ); } - fn alt_bn128_mul_chfast1(b: &mut Criterion) { bench( "alt_bn128_mul_chfast1", @@ -563,7 +524,6 @@ fn alt_bn128_mul_chfast1(b: &mut Criterion) { ); } - fn alt_bn128_mul_chfast2(b: &mut Criterion) { bench( "alt_bn128_mul_chfast2", @@ -574,7 +534,6 @@ fn alt_bn128_mul_chfast2(b: &mut Criterion) { ); } - fn alt_bn128_mul_chfast3(b: &mut Criterion) { bench( "alt_bn128_mul_chfast3", @@ -585,7 +544,6 @@ fn alt_bn128_mul_chfast3(b: &mut Criterion) { ); } - fn alt_bn128_mul_cdetrio1(b: &mut Criterion) { bench( "alt_bn128_mul_cdetrio1", @@ -596,7 +554,6 @@ fn alt_bn128_mul_cdetrio1(b: &mut Criterion) { ); } - fn alt_bn128_mul_cdetrio6(b: &mut Criterion) { bench( "alt_bn128_mul_cdetrio6", @@ -607,7 +564,6 @@ fn alt_bn128_mul_cdetrio6(b: &mut Criterion) { ); } - fn alt_bn128_mul_cdetrio11(b: &mut Criterion) { bench( "alt_bn128_mul_cdetrio11", @@ -618,7 +574,6 @@ fn alt_bn128_mul_cdetrio11(b: &mut Criterion) { ); } - fn alt_bn128_pairing_jeff1(b: &mut Criterion) { bench( "alt_bn128_pairing_jeff1", @@ -629,7 +584,6 @@ fn alt_bn128_pairing_jeff1(b: &mut Criterion) { ); } - fn alt_bn128_pairing_jeff2(b: &mut Criterion) { bench( "alt_bn128_pairing_jeff2", @@ -640,7 +594,6 @@ fn alt_bn128_pairing_jeff2(b: &mut Criterion) { ); } - fn alt_bn128_pairing_jeff3(b: &mut Criterion) { bench( "alt_bn128_pairing_jeff3", @@ -651,7 +604,6 @@ fn alt_bn128_pairing_jeff3(b: &mut Criterion) { ); } - fn alt_bn128_pairing_jeff4(b: &mut Criterion) { bench( "alt_bn128_pairing_jeff4", @@ -662,7 +614,6 @@ fn alt_bn128_pairing_jeff4(b: &mut Criterion) { ); } - fn alt_bn128_pairing_jeff5(b: &mut Criterion) { bench( "alt_bn128_pairing_jeff5", @@ -673,7 +624,6 @@ fn alt_bn128_pairing_jeff5(b: &mut Criterion) { ); } - fn alt_bn128_pairing_jeff6(b: &mut Criterion) { bench( "alt_bn128_pairing_jeff6", @@ -684,7 +634,6 @@ fn alt_bn128_pairing_jeff6(b: &mut Criterion) { ); } - fn alt_bn128_pairing_empty_data(b: &mut Criterion) { bench( "alt_bn128_pairing_empty_data", @@ -695,7 +644,6 @@ fn alt_bn128_pairing_empty_data(b: &mut Criterion) { ); } - fn alt_bn128_pairing_one_point(b: &mut Criterion) { bench( "alt_bn128_pairing_one_point", @@ -706,7 +654,6 @@ fn alt_bn128_pairing_one_point(b: &mut Criterion) { ); } - fn alt_bn128_pairing_two_point_match_2(b: &mut Criterion) { bench( "alt_bn128_pairing_two_point_match_2", @@ -717,7 +664,6 @@ fn alt_bn128_pairing_two_point_match_2(b: &mut Criterion) { ); } - fn alt_bn128_pairing_two_point_match_3(b: &mut Criterion) { bench( "alt_bn128_pairing_two_point_match_3", @@ -728,7 +674,6 @@ fn alt_bn128_pairing_two_point_match_3(b: &mut Criterion) { ); } - fn alt_bn128_pairing_two_point_match_4(b: &mut Criterion) { bench( "alt_bn128_pairing_two_point_match_4", @@ -739,7 +684,6 @@ fn alt_bn128_pairing_two_point_match_4(b: &mut Criterion) { ); } - fn alt_bn128_pairing_ten_point_match_1(b: &mut Criterion) { bench( "alt_bn128_pairing_ten_point_match_1", @@ -750,7 +694,6 @@ fn alt_bn128_pairing_ten_point_match_1(b: &mut Criterion) { ); } - fn alt_bn128_pairing_ten_point_match_2(b: &mut Criterion) { bench( "alt_bn128_pairing_ten_point_match_2", @@ -761,7 +704,6 @@ fn alt_bn128_pairing_ten_point_match_2(b: &mut Criterion) { ); } - fn alt_bn128_pairing_ten_point_match_3(b: &mut Criterion) { bench( "alt_bn128_pairing_ten_point_match_3", diff --git a/ethcore/blockchain/Cargo.toml b/ethcore/blockchain/Cargo.toml new file mode 100644 index 00000000000..a2636975705 --- /dev/null +++ b/ethcore/blockchain/Cargo.toml @@ -0,0 +1,33 @@ +[package] +description = "Ethcore blockchain database" +homepage = "http://parity.io" +license = "GPL-3.0" +name = "ethcore-blockchain" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +ansi_term = "0.10" +blooms-db = { path = "../../util/blooms-db" } +common-types = { path = "../types" } +ethcore-db = { path = "../db" } +ethereum-types = "0.4" +heapsize = "0.4" +itertools = "0.5" +kvdb = "0.1" +log = "0.4" +parity-bytes = "0.1" +parking_lot = "0.7" +rayon = "1.0" +rlp = { version = "0.3.0", features = ["ethereum"] } +rlp_compress = { path = "../../util/rlp-compress" } +rlp_derive = { path = "../../util/rlp-derive" } + +[dev-dependencies] +env_logger = "0.5" +ethkey = { path = "../../accounts/ethkey" } +keccak-hash = "0.1" +rustc-hex = "1.0" +tempdir = "0.3" +kvdb-memorydb = "0.1" diff --git a/ethcore/src/blockchain/best_block.rs b/ethcore/blockchain/src/best_block.rs similarity index 75% rename from ethcore/src/blockchain/best_block.rs rename to ethcore/blockchain/src/best_block.rs index adfaf68aadd..20f247391dc 100644 --- a/ethcore/src/blockchain/best_block.rs +++ b/ethcore/blockchain/src/best_block.rs @@ -1,23 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethereum_types::{H256, U256}; -use encoded; -use header::{Header, BlockNumber}; +use common_types::{encoded, BlockNumber}; +use common_types::header::Header; /// Contains information on a best block that is specific to the consensus engine. /// diff --git a/ethcore/src/blockchain/block_info.rs b/ethcore/blockchain/src/block_info.rs similarity index 81% rename from ethcore/src/blockchain/block_info.rs rename to ethcore/blockchain/src/block_info.rs index 6a48e924473..15f71ecb855 100644 --- a/ethcore/src/blockchain/block_info.rs +++ b/ethcore/blockchain/src/block_info.rs @@ -1,21 +1,21 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethereum_types::{H256, U256}; -use header::BlockNumber; +use common_types::BlockNumber; /// Brief info about inserted block. #[derive(Clone)] diff --git a/ethcore/src/blockchain/blockchain.rs b/ethcore/blockchain/src/blockchain.rs similarity index 96% rename from ethcore/src/blockchain/blockchain.rs rename to ethcore/blockchain/src/blockchain.rs index 4286dc41482..de6e8c134a6 100644 --- a/ethcore/src/blockchain/blockchain.rs +++ b/ethcore/blockchain/src/blockchain.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain database. @@ -22,34 +22,37 @@ use std::path::Path; use std::sync::Arc; use ansi_term::Colour; -use blockchain::{CacheSize, ImportRoute, Config}; -use blockchain::best_block::{BestBlock, BestAncientBlock}; -use blockchain::block_info::{BlockInfo, BlockLocation, BranchBecomingCanonChainData}; -use blockchain::extras::{BlockReceipts, BlockDetails, TransactionAddress, EPOCH_KEY_PREFIX, EpochTransitions}; -use blockchain::update::{ExtrasUpdate, ExtrasInsert}; use blooms_db; -use bytes::Bytes; -use cache_manager::CacheManager; -use db::{self, Writable, Readable, CacheUpdatePolicy}; -use encoded; -use engines::epoch::{Transition as EpochTransition, PendingTransition as PendingEpochTransition}; -use engines::ForkChoice; +use common_types::BlockNumber; +use common_types::blockchain_info::BlockChainInfo; +use common_types::encoded; +use common_types::engines::ForkChoice; +use common_types::engines::epoch::{Transition as EpochTransition, PendingTransition as PendingEpochTransition}; +use common_types::header::{Header, ExtendedHeader}; +use common_types::log_entry::{LogEntry, LocalizedLogEntry}; +use common_types::receipt::Receipt; +use common_types::transaction::LocalizedTransaction; +use common_types::tree_route::TreeRoute; +use common_types::view; +use common_types::views::{BlockView, HeaderView}; +use ethcore_db::cache_manager::CacheManager; +use ethcore_db::keys::{BlockReceipts, BlockDetails, TransactionAddress, EPOCH_KEY_PREFIX, EpochTransitions}; +use ethcore_db::{self as db, Writable, Readable, CacheUpdatePolicy}; use ethereum_types::{H256, Bloom, BloomRef, U256}; -use error::Error as EthcoreError; -use header::*; use heapsize::HeapSizeOf; use itertools::Itertools; use kvdb::{DBTransaction, KeyValueDB}; -use log_entry::{LogEntry, LocalizedLogEntry}; +use log::{trace, warn, info}; +use parity_bytes::Bytes; use parking_lot::{Mutex, RwLock}; use rayon::prelude::*; -use receipt::Receipt; -use rlp_compress::{compress, decompress, blocks_swapper}; use rlp::RlpStream; -use transaction::*; -use types::blockchain_info::BlockChainInfo; -use types::tree_route::TreeRoute; -use views::{BlockView, HeaderView}; +use rlp_compress::{compress, decompress, blocks_swapper}; + +use crate::best_block::{BestBlock, BestAncientBlock}; +use crate::block_info::{BlockInfo, BlockLocation, BranchBecomingCanonChainData}; +use crate::update::{ExtrasUpdate, ExtrasInsert}; +use crate::{CacheSize, ImportRoute, Config}; /// Database backing `BlockChain`. pub trait BlockChainDB: Send + Sync { @@ -63,7 +66,7 @@ pub trait BlockChainDB: Send + Sync { fn trace_blooms(&self) -> &blooms_db::Database; /// Restore the DB from the given path - fn restore(&self, new_db: &str) -> Result<(), EthcoreError> { + fn restore(&self, new_db: &str) -> Result<(), io::Error> { // First, close the Blooms databases self.blooms().close()?; self.trace_blooms().close()?; @@ -665,6 +668,21 @@ impl BlockChain { self.db.key_value().read_with_cache(db::COL_EXTRA, &self.block_details, parent).map_or(false, |d| d.children.contains(hash)) } + /// fetches the list of blocks from best block to n, and n's parent hash + /// where n > 0 + pub fn block_headers_from_best_block(&self, n: u32) -> Option<(Vec, H256)> { + let mut blocks = Vec::with_capacity(n as usize); + let mut hash = self.best_block_hash(); + + for _ in 0..n { + let current_hash = self.block_header_data(&hash)?; + hash = current_hash.parent_hash(); + blocks.push(current_hash); + } + + Some((blocks, hash)) + } + /// Returns a tree route between `from` and `to`, which is a tuple of: /// /// - a vector of hashes of all blocks, ordered from `from` to `to`. @@ -1549,25 +1567,55 @@ impl BlockChain { #[cfg(test)] mod tests { + use super::*; + use std::iter; - use std::sync::Arc; - use rustc_hex::FromHex; - use hash::keccak; - use kvdb::DBTransaction; - use ethereum_types::*; - use receipt::{Receipt, TransactionOutcome}; - use blockchain::{BlockProvider, BlockChain, BlockChainDB, Config, ImportRoute}; - use test_helpers::{ - generate_dummy_blockchain, generate_dummy_blockchain_with_extra, - generate_dummy_empty_blockchain - }; - use blockchain::generator::{BlockGenerator, BlockBuilder, BlockOptions}; - use blockchain::extras::TransactionAddress; - use transaction::{Transaction, Action}; - use log_entry::{LogEntry, LocalizedLogEntry}; + + use common_types::receipt::{Receipt, TransactionOutcome}; + use common_types::transaction::{Transaction, Action}; + use crate::generator::{BlockGenerator, BlockBuilder, BlockOptions}; use ethkey::Secret; - use test_helpers::new_db; - use encoded; + use keccak_hash::keccak; + use rustc_hex::FromHex; + use tempdir::TempDir; + + struct TestBlockChainDB { + _blooms_dir: TempDir, + _trace_blooms_dir: TempDir, + blooms: blooms_db::Database, + trace_blooms: blooms_db::Database, + key_value: Arc, + } + + impl BlockChainDB for TestBlockChainDB { + fn key_value(&self) -> &Arc { + &self.key_value + } + + fn blooms(&self) -> &blooms_db::Database { + &self.blooms + } + + fn trace_blooms(&self) -> &blooms_db::Database { + &self.trace_blooms + } + } + + /// Creates new test instance of `BlockChainDB` + pub fn new_db() -> Arc { + let blooms_dir = TempDir::new("").unwrap(); + let trace_blooms_dir = TempDir::new("").unwrap(); + + let db = TestBlockChainDB { + blooms: blooms_db::Database::open(blooms_dir.path()).unwrap(), + trace_blooms: blooms_db::Database::open(trace_blooms_dir.path()).unwrap(), + _blooms_dir: blooms_dir, + _trace_blooms_dir: trace_blooms_dir, + key_value: Arc::new(kvdb_memorydb::create(ethcore_db::NUM_COLUMNS.unwrap())) + }; + + Arc::new(db) + } fn new_chain(genesis: encoded::Block, db: Arc) -> BlockChain { BlockChain::new(Config::default(), genesis.raw(), db) @@ -1588,7 +1636,7 @@ mod tests { } fn insert_block_batch(batch: &mut DBTransaction, bc: &BlockChain, block: encoded::Block, receipts: Vec) -> ImportRoute { - use blockchain::ExtrasInsert; + use crate::ExtrasInsert; let fork_choice = { let header = block.header_view(); @@ -1596,9 +1644,9 @@ mod tests { let parent_details = bc.block_details(&parent_hash).unwrap_or_else(|| panic!("Invalid parent hash: {:?}", parent_hash)); let block_total_difficulty = parent_details.total_difficulty + header.difficulty(); if block_total_difficulty > bc.best_block_total_difficulty() { - ::engines::ForkChoice::New + common_types::engines::ForkChoice::New } else { - ::engines::ForkChoice::Old + common_types::engines::ForkChoice::Old } }; @@ -2012,43 +2060,6 @@ mod tests { } } - #[test] - fn can_contain_arbitrary_block_sequence() { - let bc = generate_dummy_blockchain(50); - assert_eq!(bc.best_block_number(), 49); - } - - #[test] - fn can_collect_garbage() { - let bc = generate_dummy_blockchain(3000); - - assert_eq!(bc.best_block_number(), 2999); - let best_hash = bc.best_block_hash(); - let mut block_header = bc.block_header_data(&best_hash); - - while !block_header.is_none() { - block_header = bc.block_header_data(&block_header.unwrap().parent_hash()); - } - assert!(bc.cache_size().blocks > 1024 * 1024); - - for _ in 0..2 { - bc.collect_garbage(); - } - assert!(bc.cache_size().blocks < 1024 * 1024); - } - - #[test] - fn can_contain_arbitrary_block_sequence_with_extra() { - let bc = generate_dummy_blockchain_with_extra(25); - assert_eq!(bc.best_block_number(), 24); - } - - #[test] - fn can_contain_only_genesis_block() { - let bc = generate_dummy_empty_blockchain(); - assert_eq!(bc.best_block_number(), 0); - } - #[test] fn find_transaction_by_hash() { let genesis = "f901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0af81e09f8c46ca322193edfda764fa7e88e81923f802f1d325ec0b0308ac2cd0a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830200008083023e38808454c98c8142a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421880102030405060708c0c0".from_hex().unwrap(); @@ -2369,7 +2380,7 @@ mod tests { #[test] fn epoch_transitions_iter() { - use ::engines::EpochTransition; + use common_types::engines::epoch::Transition as EpochTransition; let genesis = BlockBuilder::genesis(); let next_5 = genesis.add_blocks(5); @@ -2418,7 +2429,7 @@ mod tests { #[test] fn epoch_transition_for() { - use ::engines::EpochTransition; + use common_types::engines::epoch::Transition as EpochTransition; let genesis = BlockBuilder::genesis(); let fork_7 = genesis.add_blocks_with(7, || BlockOptions { diff --git a/ethcore/src/blockchain/cache.rs b/ethcore/blockchain/src/cache.rs similarity index 74% rename from ethcore/src/blockchain/cache.rs rename to ethcore/blockchain/src/cache.rs index a924f2ad084..f17afbb2789 100644 --- a/ethcore/src/blockchain/cache.rs +++ b/ethcore/blockchain/src/cache.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . /// Represents blockchain's in-memory cache size in bytes. #[derive(Debug)] diff --git a/ethcore/src/blockchain/config.rs b/ethcore/blockchain/src/config.rs similarity index 71% rename from ethcore/src/blockchain/config.rs rename to ethcore/blockchain/src/config.rs index 632f978ac53..8cd84b59376 100644 --- a/ethcore/src/blockchain/config.rs +++ b/ethcore/blockchain/src/config.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain configuration. diff --git a/ethcore/src/blockchain/generator.rs b/ethcore/blockchain/src/generator.rs similarity index 78% rename from ethcore/src/blockchain/generator.rs rename to ethcore/blockchain/src/generator.rs index 213b394fc9d..32ec2802dfb 100644 --- a/ethcore/src/blockchain/generator.rs +++ b/ethcore/blockchain/src/generator.rs @@ -1,69 +1,83 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain generator for tests. use std::collections::VecDeque; use ethereum_types::{U256, H256, Bloom}; -use header::Header; +use common_types::encoded; +use common_types::header::Header; +use common_types::transaction::SignedTransaction; +use common_types::view; +use common_types::views::BlockView; use rlp::encode; -use transaction::SignedTransaction; -use views::BlockView; -use encoded; +use rlp_derive::RlpEncodable; /// Helper structure, used for encoding blocks. #[derive(Default, Clone, RlpEncodable)] pub struct Block { + /// Block header pub header: Header, + /// Block transactions pub transactions: Vec, + /// Block uncles pub uncles: Vec
} impl Block { + /// Get a copy of the header #[inline] pub fn header(&self) -> Header { self.header.clone() } + /// Get block hash #[inline] pub fn hash(&self) -> H256 { view!(BlockView, &self.encoded().raw()).header_view().hash() } + /// Get block number #[inline] pub fn number(&self) -> u64 { self.header.number() } + /// Get RLP encoding of this block #[inline] pub fn encoded(&self) -> encoded::Block { encoded::Block::new(encode(self)) } + /// Get block difficulty #[inline] pub fn difficulty(&self) -> U256 { *self.header.difficulty() } } +/// Specify block options for generator #[derive(Debug)] pub struct BlockOptions { + /// Difficulty pub difficulty: U256, + /// Set bloom filter pub bloom: Bloom, + /// Transactions included in blocks pub transactions: Vec, } @@ -77,12 +91,14 @@ impl Default for BlockOptions { } } +/// Utility to create blocks #[derive(Clone)] pub struct BlockBuilder { blocks: VecDeque, } impl BlockBuilder { + /// Create new BlockBuilder starting at genesis. pub fn genesis() -> Self { let mut blocks = VecDeque::with_capacity(1); blocks.push_back(Block::default()); @@ -92,21 +108,25 @@ impl BlockBuilder { } } + /// Add new block with default options. #[inline] pub fn add_block(&self) -> Self { self.add_block_with(|| BlockOptions::default()) } + /// Add `count` number of blocks with default options. #[inline] pub fn add_blocks(&self, count: usize) -> Self { self.add_blocks_with(count, || BlockOptions::default()) } + /// Add block with specified options. #[inline] pub fn add_block_with(&self, get_metadata: T) -> Self where T: Fn() -> BlockOptions { self.add_blocks_with(1, get_metadata) } + /// Add a block with given difficulty #[inline] pub fn add_block_with_difficulty(&self, difficulty: T) -> Self where T: Into { let difficulty = difficulty.into(); @@ -116,6 +136,7 @@ impl BlockBuilder { }) } + /// Add a block with given transactions. #[inline] pub fn add_block_with_transactions(&self, transactions: T) -> Self where T: IntoIterator { @@ -126,6 +147,7 @@ impl BlockBuilder { }) } + /// Add a block with given bloom filter. #[inline] pub fn add_block_with_bloom(&self, bloom: Bloom) -> Self { self.add_blocks_with(1, move || BlockOptions { @@ -134,6 +156,7 @@ impl BlockBuilder { }) } + /// Add a bunch of blocks with given metadata. pub fn add_blocks_with(&self, count: usize, get_metadata: T) -> Self where T: Fn() -> BlockOptions { assert!(count > 0, "There must be at least 1 block"); let mut parent_hash = self.last().hash(); @@ -160,18 +183,21 @@ impl BlockBuilder { } } + /// Get a reference to the last generated block. #[inline] pub fn last(&self) -> &Block { self.blocks.back().expect("There is always at least 1 block") } } +/// Generates a blockchain from given block builders (blocks will be concatenated). #[derive(Clone)] pub struct BlockGenerator { builders: VecDeque, } impl BlockGenerator { + /// Create new block generator. pub fn new(builders: T) -> Self where T: IntoIterator { BlockGenerator { builders: builders.into_iter().collect(), diff --git a/ethcore/src/blockchain/import_route.rs b/ethcore/blockchain/src/import_route.rs similarity index 86% rename from ethcore/src/blockchain/import_route.rs rename to ethcore/blockchain/src/import_route.rs index d8b38e6335e..8c635b4e5ab 100644 --- a/ethcore/src/blockchain/import_route.rs +++ b/ethcore/blockchain/src/import_route.rs @@ -1,23 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Import route. use ethereum_types::H256; -use blockchain::block_info::{BlockInfo, BlockLocation}; +use crate::block_info::{BlockInfo, BlockLocation}; /// Import route for newly inserted block. #[derive(Debug, PartialEq, Clone)] @@ -31,6 +31,7 @@ pub struct ImportRoute { } impl ImportRoute { + /// Empty import route. pub fn none() -> Self { ImportRoute { retracted: vec![], @@ -68,8 +69,8 @@ impl From for ImportRoute { #[cfg(test)] mod tests { use ethereum_types::{H256, U256}; - use blockchain::block_info::{BlockInfo, BlockLocation, BranchBecomingCanonChainData}; - use blockchain::ImportRoute; + use crate::block_info::{BlockInfo, BlockLocation, BranchBecomingCanonChainData}; + use super::ImportRoute; #[test] fn import_route_none() { diff --git a/ethcore/src/blockchain/mod.rs b/ethcore/blockchain/src/lib.rs similarity index 62% rename from ethcore/src/blockchain/mod.rs rename to ethcore/blockchain/src/lib.rs index 3a4504051e3..3f07a6d8070 100644 --- a/ethcore/src/blockchain/mod.rs +++ b/ethcore/blockchain/src/lib.rs @@ -1,37 +1,37 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain database. +#![warn(missing_docs)] + mod best_block; mod block_info; mod blockchain; mod cache; mod config; -mod extras; mod import_route; mod update; -#[cfg(test)] pub mod generator; pub use self::blockchain::{BlockProvider, BlockChain, BlockChainDB, BlockChainDBHandler}; pub use self::cache::CacheSize; pub use self::config::Config; -pub use self::extras::{BlockReceipts, BlockDetails, TransactionAddress}; pub use self::import_route::ImportRoute; pub use self::update::ExtrasInsert; -pub use types::tree_route::TreeRoute; +pub use ethcore_db::keys::{BlockReceipts, BlockDetails, TransactionAddress, BlockNumberKey}; +pub use common_types::tree_route::TreeRoute; diff --git a/ethcore/src/blockchain/update.rs b/ethcore/blockchain/src/update.rs similarity index 70% rename from ethcore/src/blockchain/update.rs rename to ethcore/blockchain/src/update.rs index 897abb59bc3..959f55fdff5 100644 --- a/ethcore/src/blockchain/update.rs +++ b/ethcore/blockchain/src/update.rs @@ -1,25 +1,28 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::HashMap; + +use common_types::BlockNumber; +use common_types::encoded::Block; +use common_types::engines::ForkChoice; +use ethcore_db::keys::{BlockDetails, BlockReceipts, TransactionAddress}; use ethereum_types::{H256, Bloom}; -use header::BlockNumber; -use blockchain::block_info::BlockInfo; -use blockchain::extras::{BlockDetails, BlockReceipts, TransactionAddress}; -use encoded::Block; + +use crate::block_info::BlockInfo; /// Block extras update info. pub struct ExtrasUpdate { @@ -42,7 +45,7 @@ pub struct ExtrasUpdate { /// Extra information in block insertion. pub struct ExtrasInsert { /// The primitive fork choice before applying finalization rules. - pub fork_choice: ::engines::ForkChoice, + pub fork_choice: ForkChoice, /// Is the inserted block considered finalized. pub is_finalized: bool, } diff --git a/ethcore/call-contract/Cargo.toml b/ethcore/call-contract/Cargo.toml new file mode 100644 index 00000000000..068434a1dec --- /dev/null +++ b/ethcore/call-contract/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "ethcore-call-contract" +version = "0.1.0" +license = "GPL-3.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +types = { path = "../types", package = "common-types" } +ethereum-types = "0.4" +bytes = { version = "0.1", package = "parity-bytes" } diff --git a/ethcore/call-contract/src/call_contract.rs b/ethcore/call-contract/src/call_contract.rs new file mode 100644 index 00000000000..8b042f0833c --- /dev/null +++ b/ethcore/call-contract/src/call_contract.rs @@ -0,0 +1,33 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +//! Provides CallContract and RegistryInfo traits + +use bytes::Bytes; +use ethereum_types::Address; +use types::ids::BlockId; + +/// Provides `call_contract` method +pub trait CallContract { + /// Like `call`, but with various defaults. Designed to be used for calling contracts. + fn call_contract(&self, id: BlockId, address: Address, data: Bytes) -> Result; +} + +/// Provides information on a blockchain service and it's registry +pub trait RegistryInfo { + /// Get the address of a particular blockchain service, if available. + fn registry_address(&self, name: String, block: BlockId) -> Option
; +} diff --git a/ethcore/call-contract/src/lib.rs b/ethcore/call-contract/src/lib.rs new file mode 100644 index 00000000000..1cbfb11378e --- /dev/null +++ b/ethcore/call-contract/src/lib.rs @@ -0,0 +1,27 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +#![warn(missing_docs)] + +//! Call Contract module +//! +//! This crate exposes traits required to call contracts at particular block. +//! All utilities that depend on on-chain data should use those traits to access it. + +pub mod call_contract; + +// Re-export +pub use self::call_contract::*; diff --git a/ethcore/db/Cargo.toml b/ethcore/db/Cargo.toml new file mode 100644 index 00000000000..53ec9f7b881 --- /dev/null +++ b/ethcore/db/Cargo.toml @@ -0,0 +1,17 @@ +[package] +description = "Ethcore DB access utilities" +homepage = "http://parity.io" +license = "GPL-3.0" +name = "ethcore-db" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +common-types = { path = "../types" } +ethereum-types = "0.4" +heapsize = "0.4" +kvdb = "0.1" +parking_lot = "0.7" +rlp = { version = "0.3.0", features = ["ethereum"] } +rlp_derive = { path = "../../util/rlp-derive" } diff --git a/ethcore/src/cache_manager.rs b/ethcore/db/src/cache_manager.rs similarity index 84% rename from ethcore/src/cache_manager.rs rename to ethcore/db/src/cache_manager.rs index 07a9750a0ee..34a02d72137 100644 --- a/ethcore/src/cache_manager.rs +++ b/ethcore/db/src/cache_manager.rs @@ -1,24 +1,27 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . + +//! Database cache manager use std::collections::{VecDeque, HashSet}; use std::hash::Hash; const COLLECTION_QUEUE_SIZE: usize = 8; +/// DB cache manager pub struct CacheManager { pref_cache_size: usize, max_cache_size: usize, @@ -27,6 +30,7 @@ pub struct CacheManager { } impl CacheManager where T: Eq + Hash { + /// Create new cache manager with preferred (heap) sizes. pub fn new(pref_cache_size: usize, max_cache_size: usize, bytes_per_cache_entry: usize) -> Self { CacheManager { pref_cache_size: pref_cache_size, @@ -36,6 +40,7 @@ impl CacheManager where T: Eq + Hash { } } + /// Mark element as used. pub fn note_used(&mut self, id: T) { if !self.cache_usage[0].contains(&id) { if let Some(c) = self.cache_usage.iter_mut().skip(1).find(|e| e.contains(&id)) { diff --git a/ethcore/src/db.rs b/ethcore/db/src/db.rs similarity index 95% rename from ethcore/src/db.rs rename to ethcore/db/src/db.rs index 39c30e96376..c00f63eac23 100644 --- a/ethcore/src/db.rs +++ b/ethcore/db/src/db.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Database utilities and definitions. diff --git a/ethcore/src/blockchain/extras.rs b/ethcore/db/src/keys.rs similarity index 87% rename from ethcore/src/blockchain/extras.rs rename to ethcore/db/src/keys.rs index 1dd51b7c753..96ecde85fb5 100644 --- a/ethcore/src/blockchain/extras.rs +++ b/ethcore/db/src/keys.rs @@ -1,32 +1,34 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain DB extras. use std::io::Write; use std::ops; -use db::Key; -use engines::epoch::{Transition as EpochTransition}; +use common_types::BlockNumber; +use common_types::engines::epoch::Transition as EpochTransition; +use common_types::receipt::Receipt; use ethereum_types::{H256, H264, U256}; -use header::BlockNumber; use heapsize::HeapSizeOf; use kvdb::PREFIX_LEN as DB_PREFIX_LEN; -use receipt::Receipt; use rlp; +use rlp_derive::{RlpEncodableWrapper, RlpDecodableWrapper, RlpEncodable, RlpDecodable}; + +use crate::db::Key; /// Represents index of extra data in database #[derive(Copy, Debug, Hash, Eq, PartialEq, Clone)] @@ -52,6 +54,7 @@ fn with_index(hash: &H256, i: ExtrasIndex) -> H264 { result } +/// Wrapper for block number used as a DB key. pub struct BlockNumberKey([u8; 5]); impl ops::Deref for BlockNumberKey { @@ -100,7 +103,7 @@ impl Key for H256 { } } -impl Key<::engines::epoch::PendingTransition> for H256 { +impl Key for H256 { type Target = H264; fn key(&self) -> H264 { @@ -117,6 +120,7 @@ pub const EPOCH_KEY_PREFIX: &'static [u8; DB_PREFIX_LEN] = &[ ExtrasIndex::EpochTransitions as u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; +/// Epoch transitions key pub struct EpochTransitionsKey([u8; EPOCH_KEY_LEN]); impl ops::Deref for EpochTransitionsKey { @@ -217,10 +221,12 @@ impl HeapSizeOf for TransactionAddress { /// Contains all block receipts. #[derive(Clone, RlpEncodableWrapper, RlpDecodableWrapper)] pub struct BlockReceipts { + /// Block receipts pub receipts: Vec, } impl BlockReceipts { + /// Create new block receipts wrapper. pub fn new(receipts: Vec) -> Self { BlockReceipts { receipts: receipts @@ -237,7 +243,9 @@ impl HeapSizeOf for BlockReceipts { /// Candidate transitions to an epoch with specific number. #[derive(Clone, RlpEncodable, RlpDecodable)] pub struct EpochTransitions { + /// Epoch number pub number: u64, + /// List of candidate transitions pub candidates: Vec, } diff --git a/ethcore/db/src/lib.rs b/ethcore/db/src/lib.rs new file mode 100644 index 00000000000..3fdb368a1aa --- /dev/null +++ b/ethcore/db/src/lib.rs @@ -0,0 +1,26 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +//! Parity Ethereum database access utilities. + +#![warn(missing_docs)] + +mod db; + +pub mod keys; +pub mod cache_manager; + +pub use self::db::*; diff --git a/ethcore/evm/Cargo.toml b/ethcore/evm/Cargo.toml index 830134dceae..cb70c42e425 100644 --- a/ethcore/evm/Cargo.toml +++ b/ethcore/evm/Cargo.toml @@ -13,7 +13,7 @@ log = "0.4" vm = { path = "../vm" } keccak-hash = "0.1" parking_lot = "0.7" -memory-cache = { path = "../../util/memory_cache" } +memory-cache = { path = "../../util/memory-cache" } [dev-dependencies] rustc-hex = "1.0" diff --git a/ethcore/evm/benches/basic.rs b/ethcore/evm/benches/basic.rs index c254abe298e..f17ba363a58 100644 --- a/ethcore/evm/benches/basic.rs +++ b/ethcore/evm/benches/basic.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! benchmarking for EVM diff --git a/ethcore/evm/src/evm.rs b/ethcore/evm/src/evm.rs index ce2263e8fd5..f8a08b2b2e3 100644 --- a/ethcore/evm/src/evm.rs +++ b/ethcore/evm/src/evm.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Evm interface. diff --git a/ethcore/evm/src/factory.rs b/ethcore/evm/src/factory.rs index 8189c3a297f..484b2852fec 100644 --- a/ethcore/evm/src/factory.rs +++ b/ethcore/evm/src/factory.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Evm factory. //! diff --git a/ethcore/evm/src/instructions.rs b/ethcore/evm/src/instructions.rs index c1879cbabda..0cdbb5687da 100644 --- a/ethcore/evm/src/instructions.rs +++ b/ethcore/evm/src/instructions.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! VM Instructions list and utility functions @@ -354,7 +354,6 @@ impl Instruction { } } - /// Returns stack position of item to duplicate /// DUP1 -> 0 pub fn dup_position(&self) -> Option { @@ -365,7 +364,6 @@ impl Instruction { } } - /// Returns stack position of item to SWAP top with /// SWAP1 -> 1 pub fn swap_position(&self) -> Option { diff --git a/ethcore/evm/src/interpreter/gasometer.rs b/ethcore/evm/src/interpreter/gasometer.rs index 60ea30da042..26fec2d9376 100644 --- a/ethcore/evm/src/interpreter/gasometer.rs +++ b/ethcore/evm/src/interpreter/gasometer.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::cmp; use ethereum_types::{U256, H256}; diff --git a/ethcore/evm/src/interpreter/informant.rs b/ethcore/evm/src/interpreter/informant.rs index 27e4fbfa4f6..93d459f4177 100644 --- a/ethcore/evm/src/interpreter/informant.rs +++ b/ethcore/evm/src/interpreter/informant.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . pub use self::inner::*; diff --git a/ethcore/evm/src/interpreter/memory.rs b/ethcore/evm/src/interpreter/memory.rs index a118ea41699..16c575d5e5c 100644 --- a/ethcore/evm/src/interpreter/memory.rs +++ b/ethcore/evm/src/interpreter/memory.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethereum_types::U256; use vm::ReturnData; diff --git a/ethcore/evm/src/interpreter/mod.rs b/ethcore/evm/src/interpreter/mod.rs index 87f6aac815d..d699e61cbec 100644 --- a/ethcore/evm/src/interpreter/mod.rs +++ b/ethcore/evm/src/interpreter/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Rust VM implementation @@ -571,10 +571,10 @@ impl Interpreter { let out_size = self.stack.pop_back(); // Add stipend (only CALL|CALLCODE when value > 0) - let call_gas = call_gas + value.map_or_else(|| Cost::from(0), |val| match val.is_zero() { + let call_gas = call_gas.overflow_add(value.map_or_else(|| Cost::from(0), |val| match val.is_zero() { false => Cost::from(ext.schedule().call_stipend), true => Cost::from(0), - }); + })).0; // Get sender & receive addresses, check if we have balance let (sender_address, receive_address, has_balance, call_type) = match instruction { diff --git a/ethcore/evm/src/interpreter/shared_cache.rs b/ethcore/evm/src/interpreter/shared_cache.rs index 63c4f507d82..da7c03efa01 100644 --- a/ethcore/evm/src/interpreter/shared_cache.rs +++ b/ethcore/evm/src/interpreter/shared_cache.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use hash::KECCAK_EMPTY; diff --git a/ethcore/evm/src/interpreter/stack.rs b/ethcore/evm/src/interpreter/stack.rs index cf8104fa2e1..87e14bdadbd 100644 --- a/ethcore/evm/src/interpreter/stack.rs +++ b/ethcore/evm/src/interpreter/stack.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use instructions; diff --git a/ethcore/evm/src/lib.rs b/ethcore/evm/src/lib.rs index 6b1b1d3bf86..3548a1fe5e5 100644 --- a/ethcore/evm/src/lib.rs +++ b/ethcore/evm/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Ethereum virtual machine. diff --git a/ethcore/evm/src/tests.rs b/ethcore/evm/src/tests.rs index af16ab1e542..dd039311ebd 100644 --- a/ethcore/evm/src/tests.rs +++ b/ethcore/evm/src/tests.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt::Debug; use std::str::FromStr; diff --git a/ethcore/evm/src/vmtype.rs b/ethcore/evm/src/vmtype.rs index feb567b73d9..2ae40e2c110 100644 --- a/ethcore/evm/src/vmtype.rs +++ b/ethcore/evm/src/vmtype.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; diff --git a/ethcore/light/Cargo.toml b/ethcore/light/Cargo.toml index a0b0afa0bd8..756b76f1f5d 100644 --- a/ethcore/light/Cargo.toml +++ b/ethcore/light/Cargo.toml @@ -8,22 +8,24 @@ authors = ["Parity Technologies "] [dependencies] log = "0.4" -ethcore = { path = ".."} parity-bytes = "0.1" -ethcore-transaction = { path = "../transaction" } +common-types = { path = "../types" } +ethcore = { path = ".."} +ethcore-db = { path = "../db" } +ethcore-blockchain = { path = "../blockchain" } ethereum-types = "0.4" -memorydb = "0.3.0" -patricia-trie = "0.3.0" +memory-db = "0.11.0" +trie-db = "0.11.0" patricia-trie-ethereum = { path = "../../util/patricia-trie-ethereum" } ethcore-network = { path = "../../util/network" } ethcore-io = { path = "../../util/io" } -hashdb = "0.3.0" +hash-db = "0.11.0" heapsize = "0.4" vm = { path = "../vm" } fastmap = { path = "../../util/fastmap" } failsafe = { version = "0.3.0", default-features = false, features = ["parking_lot_mutex"] } rlp = { version = "0.3.0", features = ["ethereum"] } -rlp_derive = { path = "../../util/rlp_derive" } +rlp_derive = { path = "../../util/rlp-derive" } smallvec = "0.6" futures = "0.1" rand = "0.4" @@ -37,8 +39,9 @@ keccak-hash = "0.1" keccak-hasher = { path = "../../util/keccak-hasher" } triehash-ethereum = { version = "0.2", path = "../../util/triehash-ethereum" } kvdb = "0.1" -memory-cache = { path = "../../util/memory_cache" } +memory-cache = { path = "../../util/memory-cache" } error-chain = { version = "0.12", default-features = false } +journaldb = { path = "../../util/journaldb" } [dev-dependencies] ethcore = { path = "..", features = ["test-helpers"] } diff --git a/ethcore/light/src/cache.rs b/ethcore/light/src/cache.rs index d720626ab60..d75e0ff7d31 100644 --- a/ethcore/light/src/cache.rs +++ b/ethcore/light/src/cache.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Cache for data fetched from the network. //! @@ -20,15 +20,15 @@ //! Furthermore, stores a "gas price corpus" of relative recency, which is a sorted //! vector of all gas prices from a recent range of blocks. -use ethcore::encoded; -use ethcore::header::BlockNumber; -use ethcore::receipt::Receipt; - -use stats::Corpus; use std::time::{Instant, Duration}; -use heapsize::HeapSizeOf; + +use common_types::encoded; +use common_types::BlockNumber; +use common_types::receipt::Receipt; use ethereum_types::{H256, U256}; +use heapsize::HeapSizeOf; use memory_cache::MemoryLruCache; +use stats::Corpus; /// Configuration for how much data to cache. #[derive(Copy, Clone, Debug, PartialEq, Eq)] diff --git a/ethcore/light/src/cht.rs b/ethcore/light/src/cht.rs index c6665f85759..a9bc5d7f260 100644 --- a/ethcore/light/src/cht.rs +++ b/ethcore/light/src/cht.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Canonical hash trie definitions and helper functions. //! @@ -23,12 +23,13 @@ //! root has. A correct proof implies that the claimed block is identical to the one //! we discarded. -use ethcore::ids::BlockId; +use common_types::ids::BlockId; use ethereum_types::{H256, U256}; -use hashdb::HashDB; +use hash_db::HashDB; use keccak_hasher::KeccakHasher; use kvdb::DBValue; -use memorydb::MemoryDB; +use memory_db::MemoryDB; +use journaldb::new_memory_db; use bytes::Bytes; use trie::{TrieMut, Trie, Recorder}; use ethtrie::{self, TrieDB, TrieDBMut}; @@ -73,7 +74,8 @@ impl> CHT { if block_to_cht_number(num) != Some(self.number) { return Ok(None) } let mut recorder = Recorder::with_depth(from_level); - let t = TrieDB::new(&self.db, &self.root)?; + let db: &HashDB<_,_> = &self.db; + let t = TrieDB::new(&db, &self.root)?; t.get_with(&key!(num), &mut recorder)?; Ok(Some(recorder.drain().into_iter().map(|x| x.data).collect())) @@ -96,7 +98,7 @@ pub struct BlockInfo { pub fn build(cht_num: u64, mut fetcher: F) -> Option>> where F: FnMut(BlockId) -> Option { - let mut db = MemoryDB::::new(); + let mut db = new_memory_db(); // start from the last block by number and work backwards. let last_num = start_number(cht_num + 1) - 1; @@ -150,7 +152,7 @@ pub fn compute_root(cht_num: u64, iterable: I) -> Option /// verify the given trie branch and extract the canonical hash and total difficulty. // TODO: better support for partially-checked queries. pub fn check_proof(proof: &[Bytes], num: u64, root: H256) -> Option<(H256, U256)> { - let mut db = MemoryDB::::new(); + let mut db = new_memory_db(); for node in proof { db.insert(&node[..]); } let res = match TrieDB::new(&db, &root) { diff --git a/ethcore/light/src/client/fetch.rs b/ethcore/light/src/client/fetch.rs index b0f73534962..86a3770bf8a 100644 --- a/ethcore/light/src/client/fetch.rs +++ b/ethcore/light/src/client/fetch.rs @@ -1,30 +1,30 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Trait for fetching chain data. use std::sync::Arc; -use ethcore::encoded; +use common_types::encoded; +use common_types::header::Header; +use common_types::receipt::Receipt; use ethcore::engines::{EthEngine, StateDependentProof}; use ethcore::machine::EthereumMachine; -use ethcore::header::Header; -use ethcore::receipt::Receipt; -use futures::future::IntoFuture; use ethereum_types::H256; +use futures::future::IntoFuture; /// Provides full chain data. pub trait ChainDataFetcher: Send + Sync + 'static { diff --git a/ethcore/light/src/client/header_chain.rs b/ethcore/light/src/client/header_chain.rs index f6d903176c9..b72a099d08d 100644 --- a/ethcore/light/src/client/header_chain.rs +++ b/ethcore/light/src/client/header_chain.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Light client header chain. //! @@ -30,12 +30,12 @@ use std::sync::Arc; use cache::Cache; use cht; -use ethcore::block_status::BlockStatus; -use ethcore::encoded; +use common_types::block_status::BlockStatus; +use common_types::encoded; +use common_types::header::Header; +use common_types::ids::BlockId; use ethcore::engines::epoch::{Transition as EpochTransition, PendingTransition as PendingEpochTransition}; use ethcore::error::{Error, EthcoreResult, ErrorKind as EthcoreErrorKind, BlockError}; -use ethcore::header::Header; -use ethcore::ids::BlockId; use ethcore::spec::{Spec, SpecHardcodedSync}; use ethereum_types::{H256, H264, U256}; use heapsize::HeapSizeOf; @@ -862,11 +862,11 @@ mod tests { use super::{HeaderChain, HardcodedSync}; use std::sync::Arc; - use ethereum_types::U256; - use ethcore::ids::BlockId; - use ethcore::header::Header; - use ethcore::spec::Spec; use cache::Cache; + use common_types::header::Header; + use common_types::ids::BlockId; + use ethcore::spec::Spec; + use ethereum_types::U256; use kvdb::KeyValueDB; use kvdb_memorydb; diff --git a/ethcore/light/src/client/mod.rs b/ethcore/light/src/client/mod.rs index e1c823ee2da..90ebba39aa2 100644 --- a/ethcore/light/src/client/mod.rs +++ b/ethcore/light/src/client/mod.rs @@ -1,38 +1,39 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Light client implementation. Stores data from light sync use std::sync::{Weak, Arc}; -use ethcore::block_status::BlockStatus; use ethcore::client::{ClientReport, EnvInfo, ClientIoMessage}; use ethcore::engines::{epoch, EthEngine, EpochChange, EpochTransition, Proof}; use ethcore::machine::EthereumMachine; use ethcore::error::{Error, EthcoreResult}; -use ethcore::ids::BlockId; -use ethcore::header::{BlockNumber, Header}; use ethcore::verification::queue::{self, HeaderQueue}; -use ethcore::blockchain_info::BlockChainInfo; use ethcore::spec::{Spec, SpecHardcodedSync}; -use ethcore::encoded; use io::IoChannel; use parking_lot::{Mutex, RwLock}; use ethereum_types::{H256, U256}; use futures::{IntoFuture, Future}; +use common_types::BlockNumber; +use common_types::block_status::BlockStatus; +use common_types::blockchain_info::BlockChainInfo; +use common_types::encoded; +use common_types::header::Header; +use common_types::ids::BlockId; use kvdb::KeyValueDB; diff --git a/ethcore/light/src/client/service.rs b/ethcore/light/src/client/service.rs index 4b199d6baab..9672974fc25 100644 --- a/ethcore/light/src/client/service.rs +++ b/ethcore/light/src/client/service.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Minimal IO service for light client. //! Just handles block import messages and passes them to the client. @@ -20,8 +20,9 @@ use std::fmt; use std::sync::Arc; +use ethcore_db as db; +use ethcore_blockchain::BlockChainDB; use ethcore::client::ClientIoMessage; -use ethcore::{db, BlockChainDB}; use ethcore::error::Error as CoreError; use ethcore::spec::Spec; use io::{IoContext, IoError, IoHandler, IoService}; diff --git a/ethcore/light/src/lib.rs b/ethcore/light/src/lib.rs index 1102f58bc05..93e912e1d62 100644 --- a/ethcore/light/src/lib.rs +++ b/ethcore/light/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Light client logic and implementation. //! @@ -54,20 +54,22 @@ extern crate serde_derive; extern crate log; extern crate bincode; +extern crate common_types; +extern crate ethcore_blockchain; +extern crate ethcore_db; extern crate ethcore_io as io; extern crate ethcore_network as network; extern crate parity_bytes as bytes; -extern crate ethcore_transaction as transaction; extern crate ethereum_types; extern crate ethcore; -extern crate hashdb; +extern crate hash_db; extern crate heapsize; extern crate failsafe; extern crate futures; extern crate itertools; extern crate keccak_hasher; -extern crate memorydb; -extern crate patricia_trie as trie; +extern crate memory_db; +extern crate trie_db as trie; extern crate patricia_trie_ethereum as ethtrie; extern crate fastmap; extern crate rand; @@ -90,3 +92,4 @@ extern crate error_chain; extern crate kvdb_memorydb; #[cfg(test)] extern crate tempdir; +extern crate journaldb; diff --git a/ethcore/light/src/net/context.rs b/ethcore/light/src/net/context.rs index 083bb49cffe..6e38959cc00 100644 --- a/ethcore/light/src/net/context.rs +++ b/ethcore/light/src/net/context.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! I/O and event context generalizations. diff --git a/ethcore/light/src/net/error.rs b/ethcore/light/src/net/error.rs index ec2a7f91c59..b29327c600a 100644 --- a/ethcore/light/src/net/error.rs +++ b/ethcore/light/src/net/error.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Defines error types and levels of punishment to use upon //! encountering. diff --git a/ethcore/light/src/net/load_timer.rs b/ethcore/light/src/net/load_timer.rs index bd701ed6a88..9dc033c47a6 100644 --- a/ethcore/light/src/net/load_timer.rs +++ b/ethcore/light/src/net/load_timer.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Request load timer and distribution manager. //! diff --git a/ethcore/light/src/net/mod.rs b/ethcore/light/src/net/mod.rs index cec2c699474..2fd6c340e03 100644 --- a/ethcore/light/src/net/mod.rs +++ b/ethcore/light/src/net/mod.rs @@ -1,25 +1,24 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! PLP Protocol Version 1 implementation. //! //! This uses a "Provider" to answer requests. -use transaction::UnverifiedTransaction; - +use common_types::transaction::UnverifiedTransaction; use ethereum_types::{H256, U256}; use io::TimerToken; use kvdb::DBValue; @@ -534,6 +533,9 @@ impl LightProtocol { // the timer approach will skip 1 (possibly 2) in rare occasions. if peer_info.sent_head == announcement.head_hash || peer_info.status.head_num >= announcement.head_num || + // fix for underflow reported in + // https://github.com/paritytech/parity-ethereum/issues/10419 + now < peer_info.last_update || now - peer_info.last_update < UPDATE_INTERVAL { continue } diff --git a/ethcore/light/src/net/request_credits.rs b/ethcore/light/src/net/request_credits.rs index 20046af18a6..c3fc139f4f2 100644 --- a/ethcore/light/src/net/request_credits.rs +++ b/ethcore/light/src/net/request_credits.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Request credit management. //! diff --git a/ethcore/light/src/net/request_set.rs b/ethcore/light/src/net/request_set.rs index 3c342c8f63c..f3ec635472e 100644 --- a/ethcore/light/src/net/request_set.rs +++ b/ethcore/light/src/net/request_set.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Pending request set. //! diff --git a/ethcore/light/src/net/status.rs b/ethcore/light/src/net/status.rs index 794fb73af95..ecbe1d3cca2 100644 --- a/ethcore/light/src/net/status.rs +++ b/ethcore/light/src/net/status.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Peer status and capabilities. diff --git a/ethcore/light/src/net/tests/mod.rs b/ethcore/light/src/net/tests/mod.rs index 791315f5f20..2ca7477f2b7 100644 --- a/ethcore/light/src/net/tests/mod.rs +++ b/ethcore/light/src/net/tests/mod.rs @@ -1,37 +1,37 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Tests for the `LightProtocol` implementation. //! These don't test of the higher level logic on top of -use ethcore::blockchain_info::BlockChainInfo; +use common_types::blockchain_info::BlockChainInfo; +use common_types::encoded; +use common_types::ids::BlockId; +use common_types::transaction::{Action, PendingTransaction}; use ethcore::client::{EachBlockWith, TestBlockChainClient}; -use ethcore::encoded; -use ethcore::ids::BlockId; use ethereum_types::{H256, U256, Address}; -use net::{LightProtocol, Params, packet, Peer, Statistics}; use net::context::IoContext; -use net::status::{Capabilities, Status}; use net::load_timer::MOVING_SAMPLE_SIZE; +use net::status::{Capabilities, Status}; +use net::{LightProtocol, Params, packet, Peer, Statistics}; use network::{PeerId, NodeId}; use provider::Provider; -use request; use request::*; +use request; use rlp::{Rlp, RlpStream}; -use transaction::{Action, PendingTransaction}; use std::sync::Arc; use std::time::Instant; diff --git a/ethcore/light/src/on_demand/mod.rs b/ethcore/light/src/on_demand/mod.rs index 01be013ea5a..609868ecb45 100644 --- a/ethcore/light/src/on_demand/mod.rs +++ b/ethcore/light/src/on_demand/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! On-demand chain requests over LES. This is a major building block for RPCs. //! The request service is implemented using Futures. Higher level request handlers @@ -70,6 +70,10 @@ pub const DEFAULT_NUM_CONSECUTIVE_FAILED_REQUESTS: usize = 1; /// OnDemand related errors pub mod error { + // Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` + // https://github.com/paritytech/parity-ethereum/issues/10302 + #![allow(deprecated)] + use futures::sync::oneshot::Canceled; error_chain! { diff --git a/ethcore/light/src/on_demand/request.rs b/ethcore/light/src/on_demand/request.rs index a0adc508136..a183dcbcabc 100644 --- a/ethcore/light/src/on_demand/request.rs +++ b/ethcore/light/src/on_demand/request.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Request types, verification, and verification errors. @@ -20,22 +20,21 @@ use std::cmp; use std::sync::Arc; use bytes::Bytes; -use ethcore::basic_account::BasicAccount; -use ethcore::encoded; +use common_types::basic_account::BasicAccount; +use common_types::encoded; +use common_types::receipt::Receipt; +use common_types::transaction::SignedTransaction; use ethcore::engines::{EthEngine, StateDependentProof}; use ethcore::machine::EthereumMachine; -use ethcore::receipt::Receipt; use ethcore::state::{self, ProvedExecution}; use ethereum_types::{H256, U256, Address}; use ethtrie::{TrieError, TrieDB}; use hash::{KECCAK_NULL_RLP, KECCAK_EMPTY, KECCAK_EMPTY_LIST_RLP, keccak}; -use hashdb::HashDB; +use hash_db::HashDB; use kvdb::DBValue; -use memorydb::MemoryDB; use parking_lot::Mutex; use request::{self as net_request, IncompleteRequest, CompleteRequest, Output, OutputKind, Field}; use rlp::{RlpStream, Rlp}; -use transaction::SignedTransaction; use trie::Trie; use vm::EnvInfo; @@ -981,7 +980,7 @@ impl Account { let header = self.header.as_ref()?; let state_root = header.state_root(); - let mut db = MemoryDB::new(); + let mut db = journaldb::new_memory_db(); for node in proof { db.insert(&node[..]); } match TrieDB::new(&db, &state_root).and_then(|t| t.get(&keccak(&self.address)))? { @@ -1101,17 +1100,16 @@ mod tests { use super::*; use std::time::Duration; use ethereum_types::{H256, Address}; - use memorydb::MemoryDB; use parking_lot::Mutex; use trie::{Trie, TrieMut}; use ethtrie::{SecTrieDB, SecTrieDBMut}; use trie::Recorder; use hash::keccak; - use ::ethcore::client::{BlockChainClient, BlockInfo, TestBlockChainClient, EachBlockWith}; - use ethcore::header::Header; - use ethcore::encoded; - use ethcore::receipt::{Receipt, TransactionOutcome}; + use ethcore::client::{BlockChainClient, BlockInfo, TestBlockChainClient, EachBlockWith}; + use common_types::header::Header; + use common_types::encoded; + use common_types::receipt::{Receipt, TransactionOutcome}; fn make_cache() -> ::cache::Cache { ::cache::Cache::new(Default::default(), Duration::from_secs(1)) @@ -1281,7 +1279,7 @@ mod tests { use rlp::RlpStream; let mut root = H256::default(); - let mut db = MemoryDB::new(); + let mut db = journaldb::new_memory_db(); let mut header = Header::new(); header.set_number(123_456); header.set_extra_data(b"test_header".to_vec()); diff --git a/ethcore/light/src/on_demand/request_guard.rs b/ethcore/light/src/on_demand/request_guard.rs index 7ba2fa3d891..1c67ab0c87f 100644 --- a/ethcore/light/src/on_demand/request_guard.rs +++ b/ethcore/light/src/on_demand/request_guard.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use failsafe; use std::time::Duration; diff --git a/ethcore/light/src/on_demand/response_guard.rs b/ethcore/light/src/on_demand/response_guard.rs index 3ef55dafd17..c4c2ac23aec 100644 --- a/ethcore/light/src/on_demand/response_guard.rs +++ b/ethcore/light/src/on_demand/response_guard.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! ResponseGuard implementation. //! It is responsible for the receiving end of `Pending Request` (see `OnDemand` module docs for more information) @@ -49,7 +49,6 @@ impl fmt::Display for Error { } } - /// Dummy type to convert a generic type with no trait bounds #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq, PartialOrd, Ord)] pub enum Inner { diff --git a/ethcore/light/src/on_demand/tests.rs b/ethcore/light/src/on_demand/tests.rs index 5ae798b33c5..fd0e8b0f973 100644 --- a/ethcore/light/src/on_demand/tests.rs +++ b/ethcore/light/src/on_demand/tests.rs @@ -1,29 +1,29 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Tests for the on-demand service. use cache::Cache; -use ethcore::header::Header; use futures::Future; use network::{PeerId, NodeId}; use net::*; +use common_types::header::Header; use ethereum_types::H256; use parking_lot::Mutex; -use ::request::{self as basic_request, Response}; +use request::{self as basic_request, Response}; use std::sync::Arc; use std::time::{Duration, Instant}; diff --git a/ethcore/light/src/provider.rs b/ethcore/light/src/provider.rs index bfd15dadc28..309ff6ec115 100644 --- a/ethcore/light/src/provider.rs +++ b/ethcore/light/src/provider.rs @@ -1,31 +1,31 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! A provider for the PIP protocol. This is typically a full node, who can //! give as much data as necessary to its peers. use std::sync::Arc; -use ethcore::blockchain_info::BlockChainInfo; +use common_types::blockchain_info::BlockChainInfo; +use common_types::encoded; +use common_types::ids::BlockId; +use common_types::transaction::PendingTransaction; use ethcore::client::{BlockChainClient, ProvingBlockChainClient, ChainInfo, BlockInfo as ClientBlockInfo}; -use ethcore::ids::BlockId; -use ethcore::encoded; use ethereum_types::H256; use parking_lot::RwLock; -use transaction::PendingTransaction; use cht::{self, BlockInfo}; use client::{LightChainClient, AsLightClient}; @@ -161,7 +161,7 @@ impl Provider for T { fn transaction_index(&self, req: request::CompleteTransactionIndexRequest) -> Option { - use ethcore::ids::TransactionId; + use common_types::ids::TransactionId; self.transaction_receipt(TransactionId::Hash(req.hash)).map(|receipt| request::TransactionIndexResponse { num: receipt.block_number, @@ -265,7 +265,7 @@ impl Provider for T { } fn transaction_proof(&self, req: request::CompleteExecutionRequest) -> Option { - use transaction::Transaction; + use common_types::transaction::Transaction; let id = BlockId::Hash(req.block_hash); let nonce = match self.nonce(&req.from, id) { diff --git a/ethcore/light/src/transaction_queue.rs b/ethcore/light/src/transaction_queue.rs index 912e561b9aa..65e646d8466 100644 --- a/ethcore/light/src/transaction_queue.rs +++ b/ethcore/light/src/transaction_queue.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Light Transaction Queue. //! @@ -27,7 +27,7 @@ use std::fmt; use std::collections::{BTreeMap, HashMap}; use std::collections::hash_map::Entry; -use transaction::{self, Condition, PendingTransaction, SignedTransaction}; +use common_types::transaction::{self, Condition, PendingTransaction, SignedTransaction}; use ethereum_types::{H256, U256, Address}; use fastmap::H256FastMap; @@ -95,7 +95,7 @@ impl AccountTransactions { } fn next_nonce(&self) -> U256 { - self.current.last().map(|last| last.nonce + 1) + self.current.last().map(|last| last.nonce.saturating_add(1.into())) .unwrap_or_else(|| *self.cur_nonce.value()) } @@ -107,7 +107,7 @@ impl AccountTransactions { while let Some(tx) = self.future.remove(&next_nonce) { promoted.push(tx.hash); self.current.push(tx); - next_nonce = next_nonce + 1; + next_nonce = next_nonce.saturating_add(1.into()); } promoted @@ -370,7 +370,7 @@ impl TransactionQueue { mod tests { use super::TransactionQueue; use ethereum_types::Address; - use transaction::{Transaction, PendingTransaction, Condition}; + use common_types::transaction::{Transaction, PendingTransaction, Condition}; #[test] fn queued_senders() { diff --git a/ethcore/light/src/types/mod.rs b/ethcore/light/src/types/mod.rs index 67e54141b27..702654b7fd2 100644 --- a/ethcore/light/src/types/mod.rs +++ b/ethcore/light/src/types/mod.rs @@ -1,17 +1,17 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . pub mod request; diff --git a/ethcore/light/src/types/request/batch.rs b/ethcore/light/src/types/request/batch.rs index 16843ae02c5..6dc75c24976 100644 --- a/ethcore/light/src/types/request/batch.rs +++ b/ethcore/light/src/types/request/batch.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Request chain builder utility. //! Push requests with `push`. Back-references and data required to verify responses must be diff --git a/ethcore/light/src/types/request/mod.rs b/ethcore/light/src/types/request/mod.rs index c57e8383ed4..d43aa726369 100644 --- a/ethcore/light/src/types/request/mod.rs +++ b/ethcore/light/src/types/request/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Light protocol request types. @@ -670,7 +670,7 @@ pub trait ResponseLike { /// Header request. pub mod header { use super::{Field, HashOrNumber, NoSuchOutput, OutputKind, Output}; - use ethcore::encoded; + use common_types::encoded; use rlp::{Encodable, Decodable, DecoderError, RlpStream, Rlp}; /// Potentially incomplete headers request. @@ -753,7 +753,7 @@ pub mod header { impl Decodable for Response { fn decode(rlp: &Rlp) -> Result { - use ethcore::header::Header as FullHeader; + use common_types::header::Header as FullHeader; let mut headers = Vec::new(); @@ -954,7 +954,7 @@ pub mod transaction_index { /// Request and response for block receipts pub mod block_receipts { use super::{Field, NoSuchOutput, OutputKind, Output}; - use ethcore::receipt::Receipt; + use common_types::receipt::Receipt; use ethereum_types::H256; /// Potentially incomplete block receipts request. @@ -1022,7 +1022,7 @@ pub mod block_receipts { /// Request and response for a block body pub mod block_body { use super::{Field, NoSuchOutput, OutputKind, Output}; - use ethcore::encoded; + use common_types::encoded; use rlp::{Encodable, Decodable, DecoderError, RlpStream, Rlp}; use ethereum_types::H256; @@ -1089,8 +1089,8 @@ pub mod block_body { impl Decodable for Response { fn decode(rlp: &Rlp) -> Result { - use ethcore::header::Header as FullHeader; - use transaction::UnverifiedTransaction; + use common_types::header::Header as FullHeader; + use common_types::transaction::UnverifiedTransaction; // check body validity. let _: Vec = rlp.list_at(0)?; @@ -1406,7 +1406,7 @@ pub mod contract_code { /// A request for proof of execution. pub mod execution { use super::{Field, NoSuchOutput, OutputKind, Output}; - use transaction::Action; + use common_types::transaction::Action; use rlp::{Encodable, Decodable, DecoderError, RlpStream, Rlp}; use ethereum_types::{H256, U256, Address}; use kvdb::DBValue; @@ -1629,7 +1629,7 @@ pub mod epoch_signal { #[cfg(test)] mod tests { use super::*; - use ethcore::header::Header; + use common_types::header::Header; fn check_roundtrip(val: T) where T: ::rlp::Encodable + ::rlp::Decodable + PartialEq + ::std::fmt::Debug @@ -1676,7 +1676,7 @@ mod tests { let full_req = Request::Headers(req.clone()); let res = HeadersResponse { headers: vec![ - ::ethcore::encoded::Header::new(::rlp::encode(&Header::default())) + ::common_types::encoded::Header::new(::rlp::encode(&Header::default())) ] }; let full_res = Response::Headers(res.clone()); @@ -1729,7 +1729,7 @@ mod tests { #[test] fn receipts_roundtrip() { - use ethcore::receipt::{Receipt, TransactionOutcome}; + use common_types::receipt::{Receipt, TransactionOutcome}; let req = IncompleteReceiptsRequest { hash: Field::Scalar(Default::default()), }; @@ -1749,7 +1749,7 @@ mod tests { #[test] fn body_roundtrip() { - use transaction::{Transaction, UnverifiedTransaction}; + use common_types::transaction::{Transaction, UnverifiedTransaction}; let req = IncompleteBodyRequest { hash: Field::Scalar(Default::default()), }; @@ -1757,13 +1757,13 @@ mod tests { let full_req = Request::Body(req.clone()); let res = BodyResponse { body: { - let header = ::ethcore::header::Header::default(); + let header = ::common_types::header::Header::default(); let tx = UnverifiedTransaction::from(Transaction::default().fake_sign(Default::default())); let mut stream = RlpStream::new_list(2); stream.begin_list(2).append(&tx).append(&tx) .begin_list(1).append(&header); - ::ethcore::encoded::Body::new(stream.out()) + ::common_types::encoded::Body::new(stream.out()) }, }; let full_res = Response::Body(res.clone()); @@ -1844,7 +1844,7 @@ mod tests { let req = IncompleteExecutionRequest { block_hash: Field::Scalar(Default::default()), from: Default::default(), - action: ::transaction::Action::Create, + action: ::common_types::transaction::Action::Create, gas: 100_000.into(), gas_price: 0.into(), value: 100_000_001.into(), @@ -1874,7 +1874,7 @@ mod tests { let reqs: Vec<_> = (0..10).map(|_| IncompleteExecutionRequest { block_hash: Field::Scalar(Default::default()), from: Default::default(), - action: ::transaction::Action::Create, + action: ::common_types::transaction::Action::Create, gas: 100_000.into(), gas_price: 0.into(), value: 100_000_001.into(), @@ -1892,11 +1892,11 @@ mod tests { #[test] fn responses_vec() { - use ethcore::receipt::{Receipt, TransactionOutcome}; + use common_types::receipt::{Receipt, TransactionOutcome}; let mut stream = RlpStream::new_list(2); stream.begin_list(0).begin_list(0); - let body = ::ethcore::encoded::Body::new(stream.out()); + let body = ::common_types::encoded::Body::new(stream.out()); let reqs = vec![ Response::Headers(HeadersResponse { headers: vec![] }), Response::HeaderProof(HeaderProofResponse { proof: vec![], hash: Default::default(), td: 100.into()}), diff --git a/ethcore/node_filter/Cargo.toml b/ethcore/node-filter/Cargo.toml similarity index 100% rename from ethcore/node_filter/Cargo.toml rename to ethcore/node-filter/Cargo.toml diff --git a/ethcore/node_filter/res/node_filter.json b/ethcore/node-filter/res/node_filter.json similarity index 100% rename from ethcore/node_filter/res/node_filter.json rename to ethcore/node-filter/res/node_filter.json diff --git a/ethcore/node_filter/res/peer_set.json b/ethcore/node-filter/res/peer_set.json similarity index 100% rename from ethcore/node_filter/res/peer_set.json rename to ethcore/node-filter/res/peer_set.json diff --git a/ethcore/node_filter/src/lib.rs b/ethcore/node-filter/src/lib.rs similarity index 85% rename from ethcore/node_filter/src/lib.rs rename to ethcore/node-filter/src/lib.rs index ec314f1916b..816bb84a838 100644 --- a/ethcore/node_filter/src/lib.rs +++ b/ethcore/node-filter/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Smart contract based node filter. @@ -39,9 +39,6 @@ extern crate log; use std::sync::Weak; -use lru_cache::LruCache; -use parking_lot::Mutex; - use ethcore::client::{BlockChainClient, BlockId}; use ethereum_types::{H256, Address}; use ethabi::FunctionOutputDecoder; @@ -50,13 +47,10 @@ use devp2p::NodeId; use_contract!(peer_set, "res/peer_set.json"); -const MAX_CACHE_SIZE: usize = 4096; - /// Connection filter that uses a contract to manage permissions. pub struct NodeFilter { client: Weak, contract_address: Address, - permission_cache: Mutex>, } impl NodeFilter { @@ -65,7 +59,6 @@ impl NodeFilter { NodeFilter { client, contract_address, - permission_cache: Mutex::new(LruCache::new(MAX_CACHE_SIZE)), } } } @@ -77,18 +70,6 @@ impl ConnectionFilter for NodeFilter { None => return false, }; - let block_hash = match client.block_hash(BlockId::Latest) { - Some(block_hash) => block_hash, - None => return false, - }; - - let key = (block_hash, *connecting_id); - - let mut cache = self.permission_cache.lock(); - if let Some(res) = cache.get_mut(&key) { - return *res; - } - let address = self.contract_address; let own_low = H256::from_slice(&own_id[0..32]); let own_high = H256::from_slice(&own_id[32..64]); @@ -103,7 +84,6 @@ impl ConnectionFilter for NodeFilter { false }); - cache.insert(key, allowed); allowed } } diff --git a/ethcore/private-tx/Cargo.toml b/ethcore/private-tx/Cargo.toml index 61abb39fc2c..fdf6e52baab 100644 --- a/ethcore/private-tx/Cargo.toml +++ b/ethcore/private-tx/Cargo.toml @@ -6,31 +6,31 @@ license = "GPL-3.0" authors = ["Parity Technologies "] [dependencies] +common-types = { path = "../types" } error-chain = { version = "0.12", default-features = false } ethabi = "6.0" -ethabi-derive = "6.0" ethabi-contract = "6.0" +ethabi-derive = "6.0" ethcore = { path = ".." } -parity-bytes = "0.1" -parity-crypto = "0.2" +ethcore-call-contract = { path = "../call-contract" } ethcore-io = { path = "../../util/io" } -ethcore-logger = { path = "../../logger" } ethcore-miner = { path = "../../miner" } -ethcore-transaction = { path = "../transaction" } ethereum-types = "0.4" ethjson = { path = "../../json" } -ethkey = { path = "../../ethkey" } +ethkey = { path = "../../accounts/ethkey" } fetch = { path = "../../util/fetch" } futures = "0.1" heapsize = "0.4" keccak-hash = "0.1.2" log = "0.4" +parity-bytes = "0.1" +parity-crypto = "0.3.0" parking_lot = "0.7" -patricia-trie = "0.3.0" +trie-db = "0.11.0" patricia-trie-ethereum = { path = "../../util/patricia-trie-ethereum" } rand = "0.3" rlp = { version = "0.3.0", features = ["ethereum"] } -rlp_derive = { path = "../../util/rlp_derive" } +rlp_derive = { path = "../../util/rlp-derive" } rustc-hex = "1.0" serde = "1.0" serde_derive = "1.0" @@ -40,4 +40,5 @@ transaction-pool = "1.13.2" url = "1" [dev-dependencies] +env_logger = "0.5" ethcore = { path = "..", features = ["test-helpers"] } diff --git a/ethcore/private-tx/res/keys_acl.json b/ethcore/private-tx/res/keys_acl.json new file mode 100644 index 00000000000..3ec2daf9e9a --- /dev/null +++ b/ethcore/private-tx/res/keys_acl.json @@ -0,0 +1,43 @@ +[ + { + "constant": true, + "inputs": [ + { + "name":"user", + "type":"address" + } + ], + "name": "availableKeys", + "outputs": [ + { + "name": "", + "type": "bytes32[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant":true, + "inputs": [ + { + "name":"user", + "type":"address" + }, + { + "name":"document", + "type":"bytes32" + } + ], + "name":"checkPermissions", + "outputs": [ + { + "name":"", + "type":"bool" + } + ], + "payable":false, + "type":"function" + } +] diff --git a/ethcore/private-tx/src/encryptor.rs b/ethcore/private-tx/src/encryptor.rs index e0beb0e65c8..2d284dd38ab 100644 --- a/ethcore/private-tx/src/encryptor.rs +++ b/ethcore/private-tx/src/encryptor.rs @@ -1,39 +1,40 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Encryption providers. use std::io::Read; use std::str::FromStr; +use std::sync::Arc; use std::iter::repeat; use std::time::{Instant, Duration}; use std::collections::HashMap; use std::collections::hash_map::Entry; use parking_lot::Mutex; -use ethcore::account_provider::AccountProvider; use ethereum_types::{H128, H256, Address}; use ethjson; -use ethkey::{Signature, Password, Public}; +use ethkey::{Signature, Public}; use crypto; use futures::Future; use fetch::{Fetch, Client as FetchClient, Method, BodyReader, Request}; use bytes::{Bytes, ToPretty}; use error::{Error, ErrorKind}; use url::Url; -use super::find_account_password; +use super::Signer; +use super::key_server_keys::address_to_key; /// Initialization vector length. const INIT_VEC_LEN: usize = 16; @@ -47,7 +48,6 @@ pub trait Encryptor: Send + Sync + 'static { fn encrypt( &self, contract_address: &Address, - accounts: &AccountProvider, initialisation_vector: &H128, plain_data: &[u8], ) -> Result; @@ -56,7 +56,6 @@ pub trait Encryptor: Send + Sync + 'static { fn decrypt( &self, contract_address: &Address, - accounts: &AccountProvider, cypher: &[u8], ) -> Result; } @@ -70,8 +69,6 @@ pub struct EncryptorConfig { pub threshold: u32, /// Account used for signing requests to key server pub key_server_account: Option
, - /// Passwords used to unlock accounts - pub passwords: Vec, } struct EncryptionSession { @@ -84,14 +81,20 @@ pub struct SecretStoreEncryptor { config: EncryptorConfig, client: FetchClient, sessions: Mutex>, + signer: Arc, } impl SecretStoreEncryptor { /// Create new encryptor - pub fn new(config: EncryptorConfig, client: FetchClient) -> Result { + pub fn new( + config: EncryptorConfig, + client: FetchClient, + signer: Arc, + ) -> Result { Ok(SecretStoreEncryptor { config, client, + signer, sessions: Mutex::default(), }) } @@ -102,13 +105,12 @@ impl SecretStoreEncryptor { url_suffix: &str, use_post: bool, contract_address: &Address, - accounts: &AccountProvider, ) -> Result { // check if the key was already cached if let Some(key) = self.obtained_key(contract_address) { return Ok(key); } - let contract_address_signature = self.sign_contract_address(contract_address, accounts)?; + let contract_address_signature = self.sign_contract_address(contract_address)?; let requester = self.config.key_server_account.ok_or_else(|| ErrorKind::KeyServerAccountNotSet)?; // key id in SS is H256 && we have H160 here => expand with assitional zeros @@ -148,10 +150,9 @@ impl SecretStoreEncryptor { // response is JSON string (which is, in turn, hex-encoded, encrypted Public) let encrypted_bytes: ethjson::bytes::Bytes = result.trim_matches('\"').parse().map_err(|e| ErrorKind::Encrypt(e))?; - let password = find_account_password(&self.config.passwords, &*accounts, &requester); // decrypt Public - let decrypted_bytes = accounts.decrypt(requester, password, &crypto::DEFAULT_MAC, &encrypted_bytes)?; + let decrypted_bytes = self.signer.decrypt(requester, &crypto::DEFAULT_MAC, &encrypted_bytes)?; let decrypted_key = Public::from_slice(&decrypted_bytes); // and now take x coordinate of Public as a key @@ -187,12 +188,9 @@ impl SecretStoreEncryptor { } } - fn sign_contract_address(&self, contract_address: &Address, accounts: &AccountProvider) -> Result { - // key id in SS is H256 && we have H160 here => expand with assitional zeros - let contract_address_extended: H256 = contract_address.into(); + fn sign_contract_address(&self, contract_address: &Address) -> Result { let key_server_account = self.config.key_server_account.ok_or_else(|| ErrorKind::KeyServerAccountNotSet)?; - let password = find_account_password(&self.config.passwords, accounts, &key_server_account); - Ok(accounts.sign(key_server_account, password, H256::from_slice(&contract_address_extended))?) + Ok(self.signer.sign(key_server_account, address_to_key(contract_address))?) } } @@ -200,16 +198,15 @@ impl Encryptor for SecretStoreEncryptor { fn encrypt( &self, contract_address: &Address, - accounts: &AccountProvider, initialisation_vector: &H128, plain_data: &[u8], ) -> Result { // retrieve the key, try to generate it if it doesn't exist yet - let key = match self.retrieve_key("", false, contract_address, &*accounts) { + let key = match self.retrieve_key("", false, contract_address) { Ok(key) => Ok(key), Err(Error(ErrorKind::EncryptionKeyNotFound(_), _)) => { trace!(target: "privatetx", "Key for account wasnt found in sstore. Creating. Address: {:?}", contract_address); - self.retrieve_key(&format!("/{}", self.config.threshold), true, contract_address, &*accounts) + self.retrieve_key(&format!("/{}", self.config.threshold), true, contract_address) } Err(err) => Err(err), }?; @@ -228,7 +225,6 @@ impl Encryptor for SecretStoreEncryptor { fn decrypt( &self, contract_address: &Address, - accounts: &AccountProvider, cypher: &[u8], ) -> Result { // initialization vector takes INIT_VEC_LEN bytes @@ -238,7 +234,7 @@ impl Encryptor for SecretStoreEncryptor { } // retrieve existing key - let key = self.retrieve_key("", false, contract_address, accounts)?; + let key = self.retrieve_key("", false, contract_address)?; // use symmetric decryption to decrypt document let (cypher, iv) = cypher.split_at(cypher_len - INIT_VEC_LEN); @@ -258,7 +254,6 @@ impl Encryptor for NoopEncryptor { fn encrypt( &self, _contract_address: &Address, - _accounts: &AccountProvider, _initialisation_vector: &H128, data: &[u8], ) -> Result { @@ -268,7 +263,6 @@ impl Encryptor for NoopEncryptor { fn decrypt( &self, _contract_address: &Address, - _accounts: &AccountProvider, data: &[u8], ) -> Result { Ok(data.to_vec()) diff --git a/ethcore/private-tx/src/error.rs b/ethcore/private-tx/src/error.rs index 99da149e4aa..60eb17987ab 100644 --- a/ethcore/private-tx/src/error.rs +++ b/ethcore/private-tx/src/error.rs @@ -1,26 +1,30 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . + +// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` +// https://github.com/paritytech/parity-ethereum/issues/10302 +#![allow(deprecated)] use ethereum_types::Address; use rlp::DecoderError; use ethtrie::TrieError; -use ethcore::account_provider::SignError; use ethcore::error::{Error as EthcoreError, ExecutionError}; -use transaction::Error as TransactionError; +use types::transaction::Error as TransactionError; use ethkey::Error as KeyError; +use ethkey::crypto::Error as CryptoError; use txpool::Error as TxPoolError; error_chain! { @@ -29,6 +33,7 @@ error_chain! { Decoder(DecoderError) #[doc = "RLP decoding error."]; Trie(TrieError) #[doc = "Error concerning TrieDBs."]; Txpool(TxPoolError) #[doc = "Tx pool error."]; + Crypto(CryptoError) #[doc = "Crypto error."]; } errors { @@ -75,7 +80,7 @@ error_chain! { } #[doc = "Wrong private transaction type."] - BadTransactonType { + BadTransactionType { description("Wrong private transaction type."), display("Wrong private transaction type"), } @@ -152,12 +157,6 @@ error_chain! { display("General signing error {}", err), } - #[doc = "Account provider signing error."] - Sign(err: SignError) { - description("Account provider signing error."), - display("Account provider signing error {}", err), - } - #[doc = "Error of transactions processing."] Transaction(err: TransactionError) { description("Error of transactions processing."), @@ -172,12 +171,6 @@ error_chain! { } } -impl From for Error { - fn from(err: SignError) -> Self { - ErrorKind::Sign(err).into() - } -} - impl From for Error { fn from(err: KeyError) -> Self { ErrorKind::Key(err).into() diff --git a/ethcore/private-tx/src/key_server_keys.rs b/ethcore/private-tx/src/key_server_keys.rs new file mode 100644 index 00000000000..28d9b3cb91d --- /dev/null +++ b/ethcore/private-tx/src/key_server_keys.rs @@ -0,0 +1,173 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Wrapper around key server responsible for access keys processing. + +use std::sync::Arc; +use parking_lot::RwLock; +use ethereum_types::{H256, Address}; +use call_contract::{CallContract, RegistryInfo}; +use ethcore::client::BlockId; +use ethabi::FunctionOutputDecoder; + +const ACL_CHECKER_CONTRACT_REGISTRY_NAME: &'static str = "secretstore_acl_checker"; + +use_contract!(keys_acl_contract, "res/keys_acl.json"); + +/// Returns the address (of the contract), that corresponds to the key +pub fn key_to_address(key: &H256) -> Address { + Address::from_slice(&key.to_vec()[..10]) +} + +/// Returns the key from the key server associated with the contract +pub fn address_to_key(contract_address: &Address) -> H256 { + // Current solution uses contract address extended with 0 as id + let contract_address_extended: H256 = contract_address.into(); + + H256::from_slice(&contract_address_extended) +} + +/// Trait for keys server keys provider. +pub trait KeyProvider: Send + Sync + 'static { + /// Account, that is used for communication with key server + fn key_server_account(&self) -> Option
; + + /// List of keys available for the account + fn available_keys(&self, block: BlockId, account: &Address) -> Option>; + + /// Update permissioning contract + fn update_acl_contract(&self); +} + +/// Secret Store keys provider +pub struct SecretStoreKeys where C: CallContract + RegistryInfo + Send + Sync + 'static { + client: Arc, + key_server_account: Option
, + keys_acl_contract: RwLock>, +} + +impl SecretStoreKeys where C: CallContract + RegistryInfo + Send + Sync + 'static { + /// Create provider + pub fn new(client: Arc, key_server_account: Option
) -> Self { + SecretStoreKeys { + client, + key_server_account, + keys_acl_contract: RwLock::new(None), + } + } +} + +impl KeyProvider for SecretStoreKeys where C: CallContract + RegistryInfo + Send + Sync + 'static { + fn key_server_account(&self) -> Option
{ + self.key_server_account + } + + fn available_keys(&self, block: BlockId, account: &Address) -> Option> { + match *self.keys_acl_contract.read() { + Some(acl_contract_address) => { + let (data, decoder) = keys_acl_contract::functions::available_keys::call(*account); + if let Ok(value) = self.client.call_contract(block, acl_contract_address, data) { + decoder.decode(&value).ok().map(|key_values| { + key_values.iter().map(key_to_address).collect() + }) + } else { + None + } + } + None => None, + } + } + + fn update_acl_contract(&self) { + let contract_address = self.client.registry_address(ACL_CHECKER_CONTRACT_REGISTRY_NAME.into(), BlockId::Latest); + if *self.keys_acl_contract.read() != contract_address { + trace!(target: "privatetx", "Configuring for ACL checker contract from address {:?}", + contract_address); + *self.keys_acl_contract.write() = contract_address; + } + } +} + +/// Dummy keys provider. +pub struct StoringKeyProvider { + available_keys: RwLock>>, + key_server_account: Option
, +} + +impl StoringKeyProvider { + /// Store available keys + pub fn set_available_keys(&self, keys: &Vec
) { + *self.available_keys.write() = Some(keys.clone()) + } +} + +impl Default for StoringKeyProvider { + fn default() -> Self { + StoringKeyProvider { + available_keys: RwLock::new(None), + key_server_account: Some(Address::default()), + } + } +} + +impl KeyProvider for StoringKeyProvider { + fn key_server_account(&self) -> Option
{ + self.key_server_account + } + + fn available_keys(&self, _block: BlockId, _account: &Address) -> Option> { + self.available_keys.read().clone() + } + + fn update_acl_contract(&self) {} +} + +#[cfg(test)] +mod tests { + use std::sync::Arc; + use ethkey::{Secret, KeyPair}; + use bytes::Bytes; + use super::*; + + struct DummyRegistryClient { + registry_address: Option
, + } + + impl DummyRegistryClient { + pub fn new(registry_address: Option
) -> Self { + DummyRegistryClient { + registry_address + } + } + } + + impl RegistryInfo for DummyRegistryClient { + fn registry_address(&self, _name: String, _block: BlockId) -> Option
{ self.registry_address } + } + + impl CallContract for DummyRegistryClient { + fn call_contract(&self, _id: BlockId, _address: Address, _data: Bytes) -> Result { Ok(vec![]) } + } + + #[test] + fn should_update_acl_contract() { + let key = KeyPair::from_secret(Secret::from("0000000000000000000000000000000000000000000000000000000000000011")).unwrap(); + let client = DummyRegistryClient::new(Some(key.address())); + let keys_data = SecretStoreKeys::new(Arc::new(client), None); + keys_data.update_acl_contract(); + assert_eq!(keys_data.keys_acl_contract.read().unwrap(), key.address()); + } +} \ No newline at end of file diff --git a/ethcore/private-tx/src/lib.rs b/ethcore/private-tx/src/lib.rs index 4b9f6d33e2c..8d2a087da58 100644 --- a/ethcore/private-tx/src/lib.rs +++ b/ethcore/private-tx/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Private transactions module. @@ -21,31 +21,33 @@ #![recursion_limit="256"] mod encryptor; +mod key_server_keys; mod private_transactions; mod messages; mod error; +extern crate common_types as types; +extern crate ethabi; extern crate ethcore; -extern crate parity_bytes as bytes; -extern crate parity_crypto as crypto; +extern crate ethcore_call_contract as call_contract; extern crate ethcore_io as io; extern crate ethcore_miner; -extern crate ethcore_transaction as transaction; -extern crate ethabi; extern crate ethereum_types; -extern crate ethkey; extern crate ethjson; +extern crate ethkey; extern crate fetch; extern crate futures; extern crate heapsize; extern crate keccak_hash as hash; +extern crate parity_bytes as bytes; +extern crate parity_crypto as crypto; extern crate parking_lot; -extern crate patricia_trie as trie; -extern crate transaction_pool as txpool; +extern crate trie_db as trie; extern crate patricia_trie_ethereum as ethtrie; extern crate rlp; -extern crate url; extern crate rustc_hex; +extern crate transaction_pool as txpool; +extern crate url; #[macro_use] extern crate log; #[macro_use] @@ -60,9 +62,10 @@ extern crate rlp_derive; #[cfg(test)] extern crate rand; #[cfg(test)] -extern crate ethcore_logger; +extern crate env_logger; pub use encryptor::{Encryptor, SecretStoreEncryptor, EncryptorConfig, NoopEncryptor}; +pub use key_server_keys::{KeyProvider, SecretStoreKeys, StoringKeyProvider}; pub use private_transactions::{VerifiedPrivateTransaction, VerificationStore, PrivateTransactionSigningDesc, SigningStore}; pub use messages::{PrivateTransaction, SignedPrivateTransaction}; pub use error::{Error, ErrorKind}; @@ -78,17 +81,17 @@ use ethkey::{Signature, recover, public_to_address}; use io::IoChannel; use ethcore::executive::{Executive, TransactOptions}; use ethcore::executed::{Executed}; -use transaction::{SignedTransaction, Transaction, Action, UnverifiedTransaction}; +use types::transaction::{SignedTransaction, Transaction, Action, UnverifiedTransaction}; use ethcore::{contract_address as ethcore_contract_address}; use ethcore::client::{ Client, ChainNotify, NewBlocks, ChainMessageType, ClientIoMessage, BlockId, - CallContract, Call, BlockInfo + Call, BlockInfo }; -use ethcore::account_provider::AccountProvider; use ethcore::miner::{self, Miner, MinerService, pool_client::NonceCache}; +use ethcore::{state, state_db}; use ethcore::trace::{Tracer, VMTracer}; +use call_contract::CallContract; use rustc_hex::FromHex; -use ethkey::Password; use ethabi::FunctionOutputDecoder; // Source avaiable at https://github.com/parity-contracts/private-tx/blob/master/contracts/PrivateContract.sol @@ -115,8 +118,6 @@ pub struct ProviderConfig { pub validator_accounts: Vec
, /// Account used for signing public transactions created from private transactions pub signer_account: Option
, - /// Passwords used to unlock accounts - pub passwords: Vec, } #[derive(Debug)] @@ -124,50 +125,85 @@ pub struct ProviderConfig { pub struct Receipt { /// Private transaction hash. pub hash: H256, - /// Created contract address if any. - pub contract_address: Option
, + /// Contract address. + pub contract_address: Address, /// Execution status. pub status_code: u8, } +/// Payload signing and decrypting capabilities. +pub trait Signer: Send + Sync { + /// Decrypt payload using private key of given address. + fn decrypt(&self, account: Address, shared_mac: &[u8], payload: &[u8]) -> Result, Error>; + /// Sign given hash using provided account. + fn sign(&self, account: Address, hash: ethkey::Message) -> Result; +} + +/// Signer implementation that errors on any request. +pub struct DummySigner; +impl Signer for DummySigner { + fn decrypt(&self, _account: Address, _shared_mac: &[u8], _payload: &[u8]) -> Result, Error> { + Err("Decrypting is not supported.".to_owned())? + } + + fn sign(&self, _account: Address, _hash: ethkey::Message) -> Result { + Err("Signing is not supported.".to_owned())? + } +} + +/// Signer implementation using multiple keypairs +pub struct KeyPairSigner(pub Vec); +impl Signer for KeyPairSigner { + fn decrypt(&self, account: Address, shared_mac: &[u8], payload: &[u8]) -> Result, Error> { + let kp = self.0.iter().find(|k| k.address() == account).ok_or(ethkey::Error::InvalidAddress)?; + Ok(ethkey::crypto::ecies::decrypt(kp.secret(), shared_mac, payload)?) + } + + fn sign(&self, account: Address, hash: ethkey::Message) -> Result { + let kp = self.0.iter().find(|k| k.address() == account).ok_or(ethkey::Error::InvalidAddress)?; + Ok(ethkey::sign(kp.secret(), &hash)?) + } +} + /// Manager of private transactions pub struct Provider { encryptor: Box, validator_accounts: HashSet
, signer_account: Option
, - passwords: Vec, notify: RwLock>>, transactions_for_signing: RwLock, transactions_for_verification: VerificationStore, client: Arc, miner: Arc, - accounts: Arc, + accounts: Arc, channel: IoChannel, + keys_provider: Arc, } #[derive(Debug)] pub struct PrivateExecutionResult where T: Tracer, V: VMTracer { code: Option, state: Bytes, - contract_address: Option
, + contract_address: Address, result: Executed, } -impl Provider where { +impl Provider { /// Create a new provider. pub fn new( client: Arc, miner: Arc, - accounts: Arc, + accounts: Arc, encryptor: Box, config: ProviderConfig, channel: IoChannel, + keys_provider: Arc, ) -> Self { + keys_provider.update_acl_contract(); Provider { encryptor, validator_accounts: config.validator_accounts.into_iter().collect(), signer_account: config.signer_account, - passwords: config.passwords, notify: RwLock::default(), transactions_for_signing: RwLock::default(), transactions_for_verification: VerificationStore::default(), @@ -175,6 +211,7 @@ impl Provider where { miner, accounts, channel, + keys_provider, } } @@ -204,7 +241,7 @@ impl Provider where { bail!(ErrorKind::SignerAccountNotSet); } let tx_hash = signed_transaction.hash(); - let contract = Self::contract_address_from_transaction(&signed_transaction).map_err(|_| ErrorKind::BadTransactonType)?; + let contract = Self::contract_address_from_transaction(&signed_transaction).map_err(|_| ErrorKind::BadTransactionType)?; let data = signed_transaction.rlp_bytes(); let encrypted_transaction = self.encrypt(&contract, &Self::iv_from_transaction(&signed_transaction), &data)?; let private = PrivateTransaction::new(encrypted_transaction, contract); @@ -225,7 +262,7 @@ impl Provider where { self.broadcast_private_transaction(private.hash(), private.rlp_bytes()); Ok(Receipt { hash: tx_hash, - contract_address: Some(contract), + contract_address: contract, status_code: 0, }) } @@ -239,21 +276,20 @@ impl Provider where { keccak(&state_buf.as_ref()) } - fn pool_client<'a>(&'a self, nonce_cache: &'a NonceCache) -> miner::pool_client::PoolClient<'a, Client> { + fn pool_client<'a>(&'a self, nonce_cache: &'a NonceCache, local_accounts: &'a HashSet
) -> miner::pool_client::PoolClient<'a, Client> { let engine = self.client.engine(); let refuse_service_transactions = true; miner::pool_client::PoolClient::new( &*self.client, nonce_cache, engine, - Some(&*self.accounts), + local_accounts, refuse_service_transactions, ) } /// Retrieve and verify the first available private transaction for every sender fn process_verification_queue(&self) -> Result<(), Error> { - let nonce_cache = NonceCache::new(NONCE_CACHE_SIZE); let process_transaction = |transaction: &VerifiedPrivateTransaction| -> Result<_, String> { let private_hash = transaction.private_transaction.hash(); match transaction.validator_account { @@ -283,8 +319,7 @@ impl Provider where { let private_state = private_state.expect("Error was checked before"); let private_state_hash = self.calculate_state_hash(&private_state, contract_nonce); trace!(target: "privatetx", "Hashed effective private state for validator: {:?}", private_state_hash); - let password = find_account_password(&self.passwords, &*self.accounts, &validator_account); - let signed_state = self.accounts.sign(validator_account, password, private_state_hash); + let signed_state = self.accounts.sign(validator_account, private_state_hash); if let Err(e) = signed_state { bail!("Cannot sign the state: {:?}", e); } @@ -296,7 +331,9 @@ impl Provider where { } Ok(()) }; - let ready_transactions = self.transactions_for_verification.drain(self.pool_client(&nonce_cache)); + let nonce_cache = NonceCache::new(NONCE_CACHE_SIZE); + let local_accounts = HashSet::new(); + let ready_transactions = self.transactions_for_verification.drain(self.pool_client(&nonce_cache, &local_accounts)); for transaction in ready_transactions { if let Err(e) = process_transaction(&transaction) { warn!(target: "privatetx", "Error: {:?}", e); @@ -325,20 +362,21 @@ impl Provider where { signatures.push(signed_tx.signature()); let rsv: Vec = signatures.into_iter().map(|sign| sign.into_electrum().into()).collect(); // Create public transaction + let signer_account = self.signer_account.ok_or_else(|| ErrorKind::SignerAccountNotSet)?; + let state = self.client.state_at(BlockId::Latest).ok_or(ErrorKind::StatePruned)?; + let nonce = state.nonce(&signer_account)?; let public_tx = self.public_transaction( desc.state.clone(), &desc.original_transaction, &rsv, - desc.original_transaction.nonce, + nonce, desc.original_transaction.gas_price )?; trace!(target: "privatetx", "Last required signature received, public transaction created: {:?}", public_tx); // Sign and add it to the queue let chain_id = desc.original_transaction.chain_id(); let hash = public_tx.hash(chain_id); - let signer_account = self.signer_account.ok_or_else(|| ErrorKind::SignerAccountNotSet)?; - let password = find_account_password(&self.passwords, &*self.accounts, &signer_account); - let signature = self.accounts.sign(signer_account, password, hash)?; + let signature = self.accounts.sign(signer_account, hash)?; let signed = SignedTransaction::new(public_tx.with_signature(signature, chain_id))?; match self.miner.import_own_transaction(&*self.client, signed.into()) { Ok(_) => trace!(target: "privatetx", "Public transaction added to queue"), @@ -379,7 +417,7 @@ impl Provider where { Action::Call(contract) => Ok(contract), _ => { warn!(target: "privatetx", "Incorrect type of action for the transaction"); - bail!(ErrorKind::BadTransactonType); + bail!(ErrorKind::BadTransactionType); } } } @@ -433,12 +471,12 @@ impl Provider where { fn encrypt(&self, contract_address: &Address, initialisation_vector: &H128, data: &[u8]) -> Result { trace!(target: "privatetx", "Encrypt data using key(address): {:?}", contract_address); - Ok(self.encryptor.encrypt(contract_address, &*self.accounts, initialisation_vector, data)?) + Ok(self.encryptor.encrypt(contract_address, initialisation_vector, data)?) } fn decrypt(&self, contract_address: &Address, data: &[u8]) -> Result { trace!(target: "privatetx", "Decrypt data using key(address): {:?}", contract_address); - Ok(self.encryptor.decrypt(contract_address, &*self.accounts, data)?) + Ok(self.encryptor.decrypt(contract_address, data)?) } fn get_decrypted_state(&self, address: &Address, block: BlockId) -> Result { @@ -482,6 +520,14 @@ impl Provider where { raw } + fn patch_account_state(&self, contract_address: &Address, block: BlockId, state: &mut state::State) -> Result<(), Error> { + let contract_code = Arc::new(self.get_decrypted_code(contract_address, block)?); + let contract_state = self.get_decrypted_state(contract_address, block)?; + trace!(target: "privatetx", "Patching contract at {:?}, code: {:?}, state: {:?}", contract_address, contract_code, contract_state); + state.patch_account(contract_address, contract_code, Self::snapshot_to_storage(contract_state))?; + Ok(()) + } + pub fn execute_private(&self, transaction: &SignedTransaction, options: TransactOptions, block: BlockId) -> Result, Error> where T: Tracer, @@ -494,41 +540,48 @@ impl Provider where { // TODO #9825 in case of BlockId::Latest these need to operate on the same state let contract_address = match transaction.action { Action::Call(ref contract_address) => { - let contract_code = Arc::new(self.get_decrypted_code(contract_address, block)?); - let contract_state = self.get_decrypted_state(contract_address, block)?; - trace!(target: "privatetx", "Patching contract at {:?}, code: {:?}, state: {:?}", contract_address, contract_code, contract_state); - state.patch_account(contract_address, contract_code, Self::snapshot_to_storage(contract_state))?; + // Patch current contract state + self.patch_account_state(contract_address, block, &mut state)?; Some(*contract_address) }, Action::Create => None, }; let engine = self.client.engine(); - let contract_address = contract_address.or({ - let sender = transaction.sender(); - let nonce = state.nonce(&sender)?; + let sender = transaction.sender(); + let nonce = state.nonce(&sender)?; + let contract_address = contract_address.unwrap_or_else(|| { let (new_address, _) = ethcore_contract_address(engine.create_address_scheme(env_info.number), &sender, &nonce, &transaction.data); - Some(new_address) + new_address }); + // Patch other available private contracts' states as well + // TODO: #10133 patch only required for the contract states + if let Some(key_server_account) = self.keys_provider.key_server_account() { + if let Some(available_contracts) = self.keys_provider.available_keys(block, &key_server_account) { + for private_contract in available_contracts { + if private_contract == contract_address { + continue; + } + self.patch_account_state(&private_contract, block, &mut state)?; + } + } + } let machine = engine.machine(); let schedule = machine.schedule(env_info.number); let result = Executive::new(&mut state, &env_info, &machine, &schedule).transact_virtual(transaction, options)?; - let (encrypted_code, encrypted_storage) = match contract_address { - None => bail!(ErrorKind::ContractDoesNotExist), - Some(address) => { - let (code, storage) = state.into_account(&address)?; - trace!(target: "privatetx", "Private contract executed. code: {:?}, state: {:?}, result: {:?}", code, storage, result.output); - let enc_code = match code { - Some(c) => Some(self.encrypt(&address, &Self::iv_from_address(&address), &c)?), - None => None, - }; - (enc_code, self.encrypt(&address, &Self::iv_from_transaction(transaction), &Self::snapshot_from_storage(&storage))?) - }, + let (encrypted_code, encrypted_storage) = { + let (code, storage) = state.into_account(&contract_address)?; + trace!(target: "privatetx", "Private contract executed. code: {:?}, state: {:?}, result: {:?}", code, storage, result.output); + let enc_code = match code { + Some(c) => Some(self.encrypt(&contract_address, &Self::iv_from_address(&contract_address), &c)?), + None => None, + }; + (enc_code, self.encrypt(&contract_address, &Self::iv_from_transaction(transaction), &Self::snapshot_from_storage(&storage))?) }; Ok(PrivateExecutionResult { code: encrypted_code, state: encrypted_storage, - contract_address, + contract_address: contract_address, result, }) } @@ -553,16 +606,13 @@ impl Provider where { /// Returns the key from the key server associated with the contract pub fn contract_key_id(&self, contract_address: &Address) -> Result { - // Current solution uses contract address extended with 0 as id - let contract_address_extended: H256 = contract_address.into(); - - Ok(H256::from_slice(&contract_address_extended)) + Ok(key_server_keys::address_to_key(contract_address)) } /// Create encrypted public contract deployment transaction. - pub fn public_creation_transaction(&self, block: BlockId, source: &SignedTransaction, validators: &[Address], gas_price: U256) -> Result<(Transaction, Option
), Error> { + pub fn public_creation_transaction(&self, block: BlockId, source: &SignedTransaction, validators: &[Address], gas_price: U256) -> Result<(Transaction, Address), Error> { if let Action::Call(_) = source.action { - bail!(ErrorKind::BadTransactonType); + bail!(ErrorKind::BadTransactionType); } let sender = source.sender(); let state = self.client.state_at(block).ok_or(ErrorKind::StatePruned)?; @@ -601,7 +651,7 @@ impl Provider where { /// Create encrypted public contract deployment transaction. Returns updated encrypted state. pub fn execute_private_transaction(&self, block: BlockId, source: &SignedTransaction) -> Result { if let Action::Create = source.action { - bail!(ErrorKind::BadTransactonType); + bail!(ErrorKind::BadTransactionType); } let result = self.execute_private(source, TransactOptions::with_no_tracing(), block)?; Ok(result.state) @@ -681,12 +731,13 @@ impl Importer for Arc { let transaction_bytes = self.decrypt(&contract, &encrypted_data)?; let original_tx: UnverifiedTransaction = Rlp::new(&transaction_bytes).as_val()?; let nonce_cache = NonceCache::new(NONCE_CACHE_SIZE); + let local_accounts = HashSet::new(); // Add to the queue for further verification self.transactions_for_verification.add_transaction( original_tx, validation_account.map(|&account| account), private_tx, - self.pool_client(&nonce_cache), + self.pool_client(&nonce_cache, &local_accounts), )?; let provider = Arc::downgrade(self); let result = self.channel.send(ClientIoMessage::execute(move |_| { @@ -721,16 +772,6 @@ impl Importer for Arc { } } -/// Try to unlock account using stored password, return found password if any -fn find_account_password(passwords: &Vec, account_provider: &AccountProvider, account: &Address) -> Option { - for password in passwords { - if let Ok(true) = account_provider.test_password(account, password) { - return Some(password.clone()); - } - } - None -} - impl ChainNotify for Provider { fn new_blocks(&self, new_blocks: NewBlocks) { if new_blocks.imported.is_empty() || new_blocks.has_more_blocks_to_import { return } @@ -738,5 +779,6 @@ impl ChainNotify for Provider { if let Err(err) = self.process_verification_queue() { warn!(target: "privatetx", "Cannot prune private transactions queue. error: {:?}", err); } + self.keys_provider.update_acl_contract(); } } diff --git a/ethcore/private-tx/src/messages.rs b/ethcore/private-tx/src/messages.rs index c0825fb59b6..2990fb9b09f 100644 --- a/ethcore/private-tx/src/messages.rs +++ b/ethcore/private-tx/src/messages.rs @@ -1,25 +1,25 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethereum_types::{H256, U256, Address}; use bytes::Bytes; use hash::keccak; use rlp::Encodable; use ethkey::Signature; -use transaction::signature::{add_chain_replay_protection, check_replay_protection}; +use types::transaction::signature::{add_chain_replay_protection, check_replay_protection}; /// Message with private transaction encrypted #[derive(Default, Debug, Clone, PartialEq, RlpEncodable, RlpDecodable, Eq)] diff --git a/ethcore/private-tx/src/private_transactions.rs b/ethcore/private-tx/src/private_transactions.rs index a0f58f9cabc..21989025b15 100644 --- a/ethcore/private-tx/src/private_transactions.rs +++ b/ethcore/private-tx/src/private_transactions.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::cmp; @@ -25,7 +25,7 @@ use heapsize::HeapSizeOf; use ethkey::Signature; use messages::PrivateTransaction; use parking_lot::RwLock; -use transaction::{UnverifiedTransaction, SignedTransaction}; +use types::transaction::{UnverifiedTransaction, SignedTransaction}; use txpool; use txpool::{VerifiedTransaction, Verifier}; use error::{Error, ErrorKind}; diff --git a/ethcore/private-tx/tests/private_contract.rs b/ethcore/private-tx/tests/private_contract.rs index 4ec1e18c15d..6365b10eecd 100644 --- a/ethcore/private-tx/tests/private_contract.rs +++ b/ethcore/private-tx/tests/private_contract.rs @@ -1,79 +1,77 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Contract for private transactions tests. -extern crate rustc_hex; +extern crate common_types as types; +extern crate env_logger; extern crate ethcore; -extern crate ethkey; -extern crate keccak_hash as hash; extern crate ethcore_io; -extern crate ethcore_logger; extern crate ethcore_private_tx; -extern crate ethcore_transaction; +extern crate ethkey; +extern crate keccak_hash as hash; +extern crate rustc_hex; #[macro_use] extern crate log; use std::sync::Arc; -use rustc_hex::FromHex; +use rustc_hex::{FromHex, ToHex}; +use types::ids::BlockId; +use types::transaction::{Transaction, Action}; use ethcore::CreateContractAddress; -use ethcore::account_provider::AccountProvider; use ethcore::client::BlockChainClient; -use ethcore::client::BlockId; use ethcore::executive::{contract_address}; use ethcore::miner::Miner; use ethcore::test_helpers::{generate_dummy_client, push_block_with_transactions}; -use ethcore_transaction::{Transaction, Action}; use ethkey::{Secret, KeyPair, Signature}; use hash::keccak; -use ethcore_private_tx::{NoopEncryptor, Provider, ProviderConfig}; +use ethcore_private_tx::{NoopEncryptor, Provider, ProviderConfig, StoringKeyProvider}; #[test] fn private_contract() { // This uses a simple private contract: contract Test1 { bytes32 public x; function setX(bytes32 _x) { x = _x; } } - ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let client = generate_dummy_client(0); let chain_id = client.signing_chain_id(); let key1 = KeyPair::from_secret(Secret::from("0000000000000000000000000000000000000000000000000000000000000011")).unwrap(); let _key2 = KeyPair::from_secret(Secret::from("0000000000000000000000000000000000000000000000000000000000000012")).unwrap(); let key3 = KeyPair::from_secret(Secret::from("0000000000000000000000000000000000000000000000000000000000000013")).unwrap(); let key4 = KeyPair::from_secret(Secret::from("0000000000000000000000000000000000000000000000000000000000000014")).unwrap(); - let ap = Arc::new(AccountProvider::transient_provider()); - ap.insert_account(key1.secret().clone(), &"".into()).unwrap(); - ap.insert_account(key3.secret().clone(), &"".into()).unwrap(); - ap.insert_account(key4.secret().clone(), &"".into()).unwrap(); + + let signer = Arc::new(ethcore_private_tx::KeyPairSigner(vec![key1.clone(), key3.clone(), key4.clone()])); let config = ProviderConfig{ validator_accounts: vec![key3.address(), key4.address()], signer_account: None, - passwords: vec!["".into()], }; let io = ethcore_io::IoChannel::disconnected(); let miner = Arc::new(Miner::new_for_tests(&::ethcore::spec::Spec::new_test(), None)); + let private_keys = Arc::new(StoringKeyProvider::default()); let pm = Arc::new(Provider::new( client.clone(), miner, - ap.clone(), + signer.clone(), Box::new(NoopEncryptor::default()), config, io, + private_keys, )); let (address, _) = contract_address(CreateContractAddress::FromSenderAndNonce, &key1.address(), &0.into(), &[]); @@ -155,3 +153,123 @@ fn private_contract() { let result = pm.private_call(BlockId::Latest, &query_tx).unwrap(); assert_eq!(result.output, "2a00000000000000000000000000000000000000000000000000000000000000".from_hex().unwrap()); } + +#[test] +fn call_other_private_contract() { + // This test verifies calls private contract methods from another one + // Two contract will be deployed + // The same contract A: + // contract Test1 { + // bytes32 public x; + // function setX(bytes32 _x) { + // x = _x; + // } + // } + // And the following contract B: + // contract Deployed { + // function setX(uint) {} + // function x() returns (uint) {} + //} + // contract Existing { + // Deployed dc; + // function Existing(address t) { + // dc = Deployed(t); + // } + // function getX() returns (uint) { + // return dc.x(); + // } + // } + //ethcore_logger::init_log(); + + // Create client and provider + let client = generate_dummy_client(0); + let chain_id = client.signing_chain_id(); + let key1 = KeyPair::from_secret(Secret::from("0000000000000000000000000000000000000000000000000000000000000011")).unwrap(); + let _key2 = KeyPair::from_secret(Secret::from("0000000000000000000000000000000000000000000000000000000000000012")).unwrap(); + let key3 = KeyPair::from_secret(Secret::from("0000000000000000000000000000000000000000000000000000000000000013")).unwrap(); + let key4 = KeyPair::from_secret(Secret::from("0000000000000000000000000000000000000000000000000000000000000014")).unwrap(); + let signer = Arc::new(ethcore_private_tx::KeyPairSigner(vec![key1.clone(), key3.clone(), key4.clone()])); + + let config = ProviderConfig{ + validator_accounts: vec![key3.address(), key4.address()], + signer_account: None, + }; + + let io = ethcore_io::IoChannel::disconnected(); + let miner = Arc::new(Miner::new_for_tests(&::ethcore::spec::Spec::new_test(), None)); + let private_keys = Arc::new(StoringKeyProvider::default()); + let pm = Arc::new(Provider::new( + client.clone(), + miner, + signer.clone(), + Box::new(NoopEncryptor::default()), + config, + io, + private_keys.clone(), + )); + + // Deploy contract A + let (address_a, _) = contract_address(CreateContractAddress::FromSenderAndNonce, &key1.address(), &0.into(), &[]); + trace!("Creating private contract A"); + let private_contract_a_test = "6060604052341561000f57600080fd5b60d88061001d6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630c55699c146046578063bc64b76d14607457600080fd5b3415605057600080fd5b60566098565b60405180826000191660001916815260200191505060405180910390f35b3415607e57600080fd5b6096600480803560001916906020019091905050609e565b005b60005481565b8060008160001916905550505600a165627a7a723058206acbdf4b15ca4c2d43e1b1879b830451a34f1e9d02ff1f2f394d8d857e79d2080029".from_hex().unwrap(); + let mut private_create_tx1 = Transaction::default(); + private_create_tx1.action = Action::Create; + private_create_tx1.data = private_contract_a_test; + private_create_tx1.gas = 200000.into(); + private_create_tx1.nonce = 0.into(); + let private_create_tx_signed = private_create_tx1.sign(&key1.secret(), None); + let validators = vec![key3.address(), key4.address()]; + let (public_tx1, _) = pm.public_creation_transaction(BlockId::Latest, &private_create_tx_signed, &validators, 0.into()).unwrap(); + let public_tx1 = public_tx1.sign(&key1.secret(), chain_id); + trace!("Transaction created. Pushing block"); + push_block_with_transactions(&client, &[public_tx1]); + + // Deploy contract B + let (address_b, _) = contract_address(CreateContractAddress::FromSenderAndNonce, &key1.address(), &1.into(), &[]); + trace!("Creating private contract B"); + // Build constructor data + let mut deploy_data = "6060604052341561000f57600080fd5b6040516020806101c583398101604052808051906020019091905050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505061014a8061007b6000396000f300606060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680635197c7aa14610046575b600080fd5b341561005157600080fd5b61005961006f565b6040518082815260200191505060405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c55699c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156100fe57600080fd5b6102c65a03f1151561010f57600080fd5b505050604051805190509050905600a165627a7a723058207f8994e02725b47d76ec73e5c54a338d27b306dd1c830276bff2d75fcd1a5c920029000000000000000000000000".to_string(); + deploy_data.push_str(&address_a.to_vec().to_hex()); + let private_contract_b_test = deploy_data.from_hex().unwrap(); + let mut private_create_tx2 = Transaction::default(); + private_create_tx2.action = Action::Create; + private_create_tx2.data = private_contract_b_test; + private_create_tx2.gas = 200000.into(); + private_create_tx2.nonce = 1.into(); + let private_create_tx_signed = private_create_tx2.sign(&key1.secret(), None); + let (public_tx2, _) = pm.public_creation_transaction(BlockId::Latest, &private_create_tx_signed, &validators, 0.into()).unwrap(); + let public_tx2 = public_tx2.sign(&key1.secret(), chain_id); + trace!("Transaction created. Pushing block"); + push_block_with_transactions(&client, &[public_tx2]); + + // Let provider know, that it has access to both keys for A and B + private_keys.set_available_keys(&vec![address_a, address_b]); + + // Call A.setx(42) + trace!("Modifying private state"); + let mut private_tx = Transaction::default(); + private_tx.action = Action::Call(address_a.clone()); + private_tx.data = "bc64b76d2a00000000000000000000000000000000000000000000000000000000000000".from_hex().unwrap(); //setX(42) + private_tx.gas = 120000.into(); + private_tx.nonce = 2.into(); + let private_tx = private_tx.sign(&key1.secret(), None); + let private_contract_nonce = pm.get_contract_nonce(&address_b, BlockId::Latest).unwrap(); + let private_state = pm.execute_private_transaction(BlockId::Latest, &private_tx).unwrap(); + let nonced_state_hash = pm.calculate_state_hash(&private_state, private_contract_nonce); + let signatures: Vec<_> = [&key3, &key4].iter().map(|k| + Signature::from(::ethkey::sign(&k.secret(), &nonced_state_hash).unwrap().into_electrum())).collect(); + let public_tx = pm.public_transaction(private_state, &private_tx, &signatures, 2.into(), 0.into()).unwrap(); + let public_tx = public_tx.sign(&key1.secret(), chain_id); + push_block_with_transactions(&client, &[public_tx]); + + // Call B.getX() + trace!("Querying private state"); + let mut query_tx = Transaction::default(); + query_tx.action = Action::Call(address_b.clone()); + query_tx.data = "5197c7aa".from_hex().unwrap(); // getX + query_tx.gas = 50000.into(); + query_tx.nonce = 3.into(); + let query_tx = query_tx.sign(&key1.secret(), chain_id); + let result = pm.private_call(BlockId::Latest, &query_tx).unwrap(); + assert_eq!(&result.output[..], &("2a00000000000000000000000000000000000000000000000000000000000000".from_hex().unwrap()[..])); +} diff --git a/ethcore/res/ethereum/classic.json b/ethcore/res/ethereum/classic.json index 203b9b101e6..898268901f5 100644 --- a/ethcore/res/ethereum/classic.json +++ b/ethcore/res/ethereum/classic.json @@ -48,3022 +48,3698 @@ "stateRoot": "0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544" }, "hardcodedSync": { - "header": "f9020ca0bfe78565c7685098b017e32399104274843eeed1fb1cd427c84bbefaf6f1c60ba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347949eab4b0fc468a7f5d46228bf5a76cb52370d068da0499004e0e047f7c34e1e6b8e873c1829be5047433cc4429935346e43bdbbfc30a06566f1411ae4d7cefdb81be14d36baf1436c2a1bd344507f8d956c94655d27a3a0a916ae91053573cb022d0d78848920ec6429dfe57e4c00c46a442d53b301a8fab9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000869f7836fd69e7835e28018348048d83070cb0845b4823668c6e616e6f706f6f6c2e6f7267a01c3256996334e58c301283bfaf600d82e608ea584f451a65486c01ba4b22e104881716cd90004293eb", - "totalDifficulty": "343601966742385746996", + "header": "f90210a08eb792fdb134b57fffbdf19bd61d4c1cc351fc38a7fcf6609c82b35ea364208fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794df7d7e053933b5cc24372f878c90e62dadad5d42a0e29a2e741354b453139d244920f7d552f90a579f1dcb99ef6b470bcffc713ebaa04bb64c992b8cf56259177a192d6f0a1eddf192b8daa7dbf1ec8313428cccde20a0ee22efe3b124a0297503fd26e6f7b33c7a88aa75825259297f8e30bee3632a68b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000866a396ffc14908373480183797a1182f618845c7395609165746865726d696e652d6574632d757331a087f3616cc0ba3704e23702bf7461f8f7716f1f1ad3ac4c66391d45adc57d1dea886ecb8e800fe87049", + "totalDifficulty": "575603227549295900024", "CHTs": [ - "0x0eb474b7721727204978e92e27d31cddff56471911e424a4c8271c35f9c982cc", - "0xe10e94515fb5ffb7ffa9bf50db4a959b3f50c2ff75e0b8bd5f5e038749e52a11", - "0x816e7463af7b5d2fcb804ba55f09e8452182b0ba6c995a34e144245d76333d55", - "0x3793af64c1ddc07ab61b2ba120034d91c02183ff788f07d3120fd4e6a48305b5", - "0x14c6106a17e041032210bfa0ca80d11860a1c6d95175d55eff39f97b8d8acded", - "0x396f832bfa3a9c494e9245471f0e65552613d87b6fe62128103590d95de72c2d", - "0xb060979f095c170a776b2b50a1e2ab0ffea80f6e522753fa36ad6f106ee32e9f", - "0x8f452e7cbd8a333ed04d819a143a8d3a75fe8c58418e7fc420bb2a717c0d4d2f", - "0x37fe1b0cf156bfc07571569af210540be753777903a308d5707538fffed75b59", - "0x6f0561d017cfc123b3f0d37b044e4f7231516b8731a1cab89afb569238643c33", - "0x3c1740c410a88c60fe8ccdc44e0ef2cf7f7314818dbf1648c01d0d94fbffc211", - "0xfb98115a7d6df8aaa40115f883014fe97300869bc016648e918fbf2df9608d41", - "0xef1099ab5ca4b79369048678d3ba78122fc081b00b6fd0f6907302a260d58266", - "0x969575f411dd78fdc5b4def0331fc93702029cc3c78851331a0f47dd0faae70b", - "0x9e53053e362be51c0fd25eaafd9e7c5c969d9f2ce8db4b3d4d830cbff347b0c8", - "0xf9de29944954d2b71a93532fc26916ae12fee72d42a79adaf940b0bf75d0ef89", - "0x28b2ce6635e60e06d643750798779023b2a807d9d089ae9ef7f223eebc15a71e", - "0x5295c06cbaff06f42bd8f5d9cbe94a840885caed02f9c9ba6da44a888ef796de", - "0x576eae673a4cbba4c7c7a56b47835ea64ae5989d67d119ebc8e568df40d908a9", - "0x891c0d38bc5e55620615da42ed77ab33806a042512034bcee134279dde1054be", - "0xbab05999d657426a11a902eb4c85ac52e2b72dd1cf38584cf2baeb2c3727bb44", - "0x3bd7e5a966f6dd2dc456948a8efca5584f5a4e0033f3037843a42073dda1f71b", - "0xc4f773ab1e34290f9a3d9ac6ede4749c5dec547353dddea494169d86f71107a3", - "0x993bf037ea9dd58b52027fb6f39332dab867c1e72af34a49d58a5a12f26bcca3", - "0x48b2d8d506eb8fc9dc0402fef26952111449aca0f90d0079f0526435d4e3183b", - "0xfef8f61df240e956f43759d2f481938421e064a9bd6a3be7a53b1213cc9588bb", - "0x5abf01f5066cf1091acdd1f99fbd5fd963633feafc42f9047534a3c1522004a5", - "0xa0f6205842260988161183b51bc36fae458fa184dd61844617d5c5d26fa78346", - "0x77309182fdc26d15dd8d9dd05040d7dc623412785708d8aac39eedee63931944", - "0x661c93311b94b7d4cdcbc0973225c794e71898a2b906922a6c1e8f7e9e289dc3", - "0x9d5d329ee8d9fffaee0111688d31a308dfaac922dcd61f818edd5303d0955be0", - "0x716ca25b184b64ba273b978de098f9946413f6fcc95bfba5cf1169e7e03dd611", - "0xa2e8d5cefa5804894fb42a106340b00de3286fee0992b5887b2cf471539d74a9", - "0xf846e05c9e9e9cb4cd2b7cbae7ae183a43a59ab02251954db632e538adacc357", - "0xbc01b4e23ea082a193e4c1012b1da91f3b4cb762009ca320bc8ed294af874e79", - "0x9218114a32da3ecf660d4d51b101bb51bb17c771561c1946c099be082f0a96b3", - "0x3b4edf03dfd53081cf40c0b90b35c1ccf7c7fe96cf131172eef5eec62f620ea8", - "0xb15758944263c67bdf528d4d7fe05737fbdbf7ffedce5f891a4ddf76177d2609", - "0x1f119374c385240f7b4ba1ec3d502be2c12c159411d5393ff2bd38cf87033625", - "0x8a8d5a93f3475813926b13a4d53f21b28dc79ade2b50830c0b9043e9fcd81576", - "0xcc22f7e2bb9c06c15ca3d82df852ed9097a2ddc687ee389e662de000db0c84fc", - "0xc2047e0dab711db791aadb642f8102abaacf7231b8dbdbe1f60573b0be015a31", - "0x1b4088ceee7783e4563945f162bd5da67020ca377a18d615923e8564d6709f85", - "0xd73450686e33bbda9eef53a95a86e5a0514156b98a5b7dfc6fdc0adb0b83cbcf", - "0xb374076ec961360e38d3486a31c3f72225440984c4c47ca790b4961d94152159", - "0x4f723f4fbd31d63a5421390e68aba0aff97249875688a7d9ab9a339d9aac7bc1", - "0x5fe51ff982edcad6c0052fcdf9a70e8f325c8140ab75848c5d7b0d670bd7edc2", - "0xc3ad483c7cc23bf8d6ae3e3e829bf126d5eeea9c53b566a6da95bef573b9c779", - "0x3c9e50ed9eb57cc055fd9a65a6cdaba2030d8b41f81348f296d7410c1d24ced0", - "0x0c6dfc1f626ff9e85ff072c154152bb3f122a2c1a45bc2d9e7da9b2d5278149a", - "0x92f4452dbdb4fe70e84ecd47af4b1af90975219797cebd451beceb6997ab024d", - "0x9a3d00686736b5b838308da4b8f0aa9edccfaba64621ce2988cea6ea2a267efd", - "0x8d602d0bef069177102726d5ccd93d19805fb5771a350a41e32755ce740b9047", - "0x6681e4097667a22ad3713acc27b6f87abd54583230581933bed9245c2c457ac3", - "0x53077caeabcd926466319a3ee5c51c32e01e1812a65313f113f814d53e9f1dd9", - "0x4dd4c33e99d86ba84f976c639333fc072e262c0b76dfdf2f589300af54048c0a", - "0xbc3b9837a6fa54616dcdb8088080e276e2e99a23c8e7de4109504293703d524e", - "0x24316b344cecd5e601cc0acc91ff94f481ca3fa26d8478644a9d8bcaeb0359b3", - "0xa7bafd3c5f4e3f6b5c078d50eb318d91e867b0e1c966027e3e7458eb104ccd63", - "0xc8da46b7d778980d120357c8de2bba336f5a2ac7a9f4183a0ee1f7597ed47d25", - "0x7469fc5d8c9c648cd10e538710e0f126542e59a82484e7fe56b73f4ec52c36c7", - "0x993bb7c0487ff61c97e4f1533446ae35b6346642e1230f2441da8b354111d597", - "0x90e3944732f86a2254dc4f30650f8438dfd0b777561fb02a8ab1c60438569c24", - "0x4e8472483679b54bdc600010fdd164f54771d7a99fa9272c683b610fff72507b", - "0xf72a861a2ebc232c25529c0f94c59996e64c59c36a1326a183cf171bddf2a75c", - "0x7f222999ba9113e2a64fd026a8f7244e6d2ae8f2a7e7d8d2d6fbde6fdf0b629f", - "0x3304e769f730522c1c5aa745c448075df026b8f82a4dece84fd70d0457050985", - "0x9ee5e3ccaaf94461dff9df8c4805ca831f58a1586af4ece3cab14a45f3b784db", - "0x21e4364859063e20153d2d06eae4d2c9e99354bf97fbff68406d8825d18dbce3", - "0x4805355b72b1b61b07814059f80b4da0351291cc932292f23069197a74127726", - "0x14474f45f38d7ea51418e5f03751c8bfbfb9b3e2957d3051e862aa3c57a63c43", - "0x69372cee3e2807d10ecb72d404a033568a159a5b15d2007537ed9a758164b29f", - "0x147223b51001166a4e65372c9c706f011f1ae94f4bdc9ba6e8960017e8898703", - "0x11a1e48a5c1d7088c0ccb8177d54db9e9f91a99aa7c24f702cd93f4646f181ee", - "0x809c902b2f4b8760c3d2e820c93d6df69a5d184a43a6c654ebe7067e7212137d", - "0x749367027756c27215b2f57168ef15d3b39062c9f79b3777f7fa19e8073de775", - "0x6a9fae37364f97e36e56df97acb1b7d066a608d8366d7e008854756dd28fe748", - "0xdc2f1b7a8aeda15e6bf4f5f424bc54828cc8520e2e7ba27bd8e28ba2b543aae7", - "0xe0fabc892d5c8b4342ff488b76a0400425ea70774f207c546fbf2f9f5b105dcb", - "0x151fb5e02d8eb3c3192cb8c039bcb4c121c4ebeea5e7f98927b85a730a24bbf9", - "0xfeb2f2ea368d0bd4c0b0bd97b444c365bdc0ac9ce2862b0d0162387727edd236", - "0x1eaf828231ebbae54737111bf3c7181fe3d7e9070def1313470d3f81c89f01c7", - "0x8a1b0565013cff488bbe3f35df86fb41c7aedf4d911130802c473f4ddb74d6d6", - "0xce9158b5c903312fa636e074e3efe413184652581a4877d40a0085965dc0bf9a", - "0x1cf602c6306affe2916fa09d3c8c018f23fc44dec8af8e83fa0008c98b4dda72", - "0x189dc4569e96cab937265ecaea76a0880ec97d5b84ac1fbd0cd2d2b36a8c34c3", - "0xd698bd07e485767c1da30bb218265e1304f6eaf426749ccba67478817af84bd4", - "0x47d7e101de73bb0ca97a0bb70094e81b82c63e519a6b2aa5fe10ca7351232870", - "0xb0d441b6c41072889c4a982306c9a40dff77b43425ecc4d771c22f3199eb7708", - "0x7893071deba67f2fc8e1b18bedcac4dbc05a020f37c764c555eadc42dd9d29d3", - "0x3c6d636db3621757d60b2d0e1804e19528ce60c9feed1ead93731820ff19b11c", - "0xde87aaa462b461c4a33e0739ef4cf56d442b7967ac7c5280816a959046b128b6", - "0xb237b17650adcbcf580b64b500ecaa7ca36921a11ad92c1e8992c57cc1a7f618", - "0xec379725db43fefe61f2495f7f7e0531d852e21f896ae806144c4d9b4b986e96", - "0x65ac5548988825831f0887b9ff0f2c13b7f3b49e4a67c39b1694e76414249f6d", - "0x76053b72ec9e6fcf0a28ef273d3e1b0842c3c2c0e905f5b5a3535ffab216c8db", - "0x2ab1e87489eb1daeaf8882c6baa0a8726aeac522e9c4eb4df71e35af2d22cc10", - "0x8c9c6adcabe253b311f6a9b8165ff9c5e26e4cf41f1acd80837e77fc15526a86", - "0xf143155230223a3f126c757b85e193a9129f1bdf97c0ce1f2785f14d40911f30", - "0x8c510d9dca593534f3ed316f240ffb9343d1e3cd6d005df6a75a1b354da0b36e", - "0x3440975cf818a718beff35a85d19bcbbd67e1b16ca9d78af34dcde31a28b3288", - "0xf56ef9c57109f9cb7a925bbb6d453efc19e8a45b331f76153d20a87d86a8b0d8", - "0x19a360772872003f08508a28a362c6e05650b385c24a928ddad4d562bfccf412", - "0x643720694b3773ecf20437d54a6be701810feff233f435dc701dbe88c9a6a13c", - "0xf8c0babe99aa26ecbfc91b304d9cd54ccfb37354c4fdbeb3207bb6d4647fabd6", - "0x481ccc7213d0188e817c071c4cc3a71c96befb9aa98cab964012fd7a8267834a", - "0x02d83ca8d92e0fe6ce7643ae93af60e38ab5659a84c04beba678ceef654aec12", - "0x24e6b4bcd0d97df196f2371532771593fe17be8fcb89f1e1164bcce8616088b9", - "0x3dc91775c50c04812f755f3b48d3d6a0cc599c586ce9d105e2cf4f3e4527b515", - "0xcdc215f05398ea3942d3a38078a3602cbe8ac549d4bf0e4a54191ceb2aff8f76", - "0xee02874e444b784f4265cc60b86a17382d277d03c8bce8a33241460ea8950699", - "0x35c34bc84736fdcbc4d4e2e089f30bcd186a052b2f6dcb639fc45a0aeb6969f8", - "0xbbb3ff849c36659bf2c00feaad9f7b3a342b5cfcf3555b7c2e467a0dc84e90e8", - "0x0584bc60fbe3fae9088c214fb519030646c3240f77180a0bedecd3e9c9f47f89", - "0x9d18a665d89439ad2c97427bdab3e598f5bc0da6a0ede2378f95c5bc31f10d12", - "0xe8a5bdd0ffd33a6fd03cf003c6d2afbe8493e0f0cb69e6366e22b4d1ff985101", - "0x7ca955f4e01eef756b680d09c25626cf50013faa20a12b0a334fd048a04e7b91", - "0x064254551457bd5e7a260a41ed3643746202d503813ceaf42660f9bd1983be34", - "0x1191044e354ea1e3daa25ed2175a6517659e96733d9065d81492ffe4472fb96f", - "0xc823514cf3566b1bb2e19a35e0ef0980bc483fa820d13ae2cfdbf15fd426c272", - "0x413f941f192d0ab77bac68268f45e2c9adbee23a3324d4ae8748d09735355a2d", - "0xa66c94b9603b3058b730baeba1b79d52f548ceeb5bac487903f92481060f6804", - "0xa84d4a8860bdff1fdae6bcefcdcf700fab7857444ef1e76d8259b005872a4636", - "0x9fa64d44edd9c097458d3901612a4b6f655a1421ebb68541cb1a4bdbbe24911e", - "0x402027770edb387510241a68a235723c6c5c95aed54dab058c43d21a6bb48c41", - "0x776281b7e341a66491603b7ae8ed7cc82b99febac43f94cb1c4dda73b17aab63", - "0xfecbaf0fc5a02dcf49095514ce26df927def3cf51f37e04471545aae2364f936", - "0xc477d9293f0ace7243f8b9c89f01210b8f96b4affc9d3332147ea2e2b693c99e", - "0x4a8b9afb9d9097831b2497296b0fd0fae76ab8a596213daed35cf87e6bbefaed", - "0x594c4e9851eddbb4a6c2ac72aaa244ff35d67262efb20935360360d39f7c7ecc", - "0x14b7ef22c46ba8400979b6c06f3b3023607145a5cc6b5b793daae758cb655245", - "0x3a9d233553d1ca4d9862a70ef133a5fb2df75276fb24297b0bd2927a39459450", - "0x22c5e227d5fa7616603bbf36c5e4ee7dbf285fb0cf403a3ae982da70c825cad0", - "0xc2c8d439c7bd884665da56e3b680a5e58ad1e98627fdbec6fa67d7bbfad33a9b", - "0x7d5682cd9f28493ba4b87be141ec99701bbcd1aaadf9840b81de1fc07d4ffb18", - "0x8845f626c5f78d1bea281f892727437f9de8f976e4c4fec6060b2115f1862db5", - "0x769fdf0bcdbaec1ffe98cd3500ce8341b4d7ea2dad5fadb0258212306ccc75f9", - "0x185569d1980147fcdfcd0e0068ab380f0cfa58a690334a558bc1fd0d07897e96", - "0x0ed70ccff752df46f981043c5279ac3f13e7f62c2bdb9a0a9817a1c119ef6402", - "0xbe121e28349e80d601ab997af844aa03ea6492e88d75d3d46517d8f835e3c3fd", - "0xa7aa5f0bb95566292d22891faa75b7ff2020b69fecc8a22d796cc3a60953d98f", - "0xa2611b092b00f78fe639c4fba0274ae474fa448b3f2e4b8aa4d06c654720d478", - "0x8e425115b98f5e41c8b5d03a9e17d56d30050d85dd06cfff12f002c546a256ba", - "0x988b449fbd8c35855154fb4eb22ba6b7b7095be26203d137f484c67facd40dc5", - "0x567c43ac5dabeff01d6997543ec7abf7998088a355a6ba8e70f41a243dd1343a", - "0x6f560cb650142aed532f17de763d61d021cdec2716b0d2cb27b3a64052abb874", - "0x7e4ce5fab8f4f1fd41f9e5f10204032ae7e0e38093b1d07699318975b33910ec", - "0x91a0820eec5390916bf464b1d16c00b5d94386c4c9f4cdf7e0b3cbe40747fbc9", - "0x9c59451a9a242123efa72c5fbd1564b7bcc0067ea9d025336d228ed26b9ba6c0", - "0x1043a5ab3f5a3bced84faaae0e783abb3b81c2b967bbd976042cb5d897d28146", - "0xfc37b3b3c0be392ad2a5e36c120eace1d14e637ac806e79a750b9a6be3c742a7", - "0xce2ccbada44a8db5144073e69914b322dc015273a75b85ea43fd9e21037c760c", - "0x6cf8336b5a410e10604f93351242cb3a6929968212abdf85b4ca9321115b8fdf", - "0xabbe9781950362be1e206d91ea1bdd6f32ea2c6df65b277cb89050ca1deb9296", - "0x922a6b85add6839494c3edff389aa1b054409c330b4a4e2a6c0e4f9bc85b36a9", - "0xc26dcdfa135a09b7eef1e99b445fb66aefb8bceb6ea715b81d78ba87cd56ed8d", - "0x87d647fa7dcde81a0e133aa949d574befefbceab24a42ae4f3809d2bb52a2d9b", - "0x85ee37fa7154568b9dee8a539340f99c7f1bbc7b9be1f2055636ed9dfc074e4d", - "0x8b0114dc9e249f1de4bb3d055790e4bf18aa28a938f39e8a457ab4a43b0dd613", - "0x3be36db134f4c00fc9e1bc376213c7073389c993b0b0744cba619688d6c037d1", - "0xfaf987eb2e066ad8871c489c23102ec5c58add2d13e62d56f2821cc1f4d66d84", - "0x678478da2955e6876ac49c5146e9f7c376dbf2f170f6404054ae4385e72f3f19", - "0x85d8d9dd6c2a8f6b6a1c0fc0cb55ca870d9a7aae1621c143c3176a3a81fcc29c", - "0x76f4dfa4c3387408c823a75aeb872ff39af3820375ff52f7aecb41c96e4faf2a", - "0x6e530647f2e4232063de2fa8f673989d7834d8cdf529791032888f2833880b80", - "0x64422b4dfff6cba0eb6deaeb4593eefc40a357469a7f7c3be078f80c66161333", - "0x5c7ab740510a4183832bd78e6d6105b0f9f928611f7d62ef96aa8dd8da48a72d", - "0x0bbf405e29f015d24e64f063d50ec6c616af64622b1a4132cde86f926e93850f", - "0xd9ba81ea0790f1f8adccd0bd203c7adeec2b490381b822d6b15293cac2f26206", - "0x4f78619baa34f2278022c509671a38d29366936d6860e79ab540ea46b66ba782", - "0x00c1f10211d7604e59a327239f00dc6d036a93416b7871cb214e8eaa52571834", - "0x1b6636708f97485675c0e5b21eb749ee4a5fd0dd886e6690090856bcc5178ec0", - "0x71366e853968c1bbbbf8e3d6e13100dd589521f8db9e561dd20ff8709b5c1a96", - "0x0d2c35a01646cb09e2b56b5792ac03047848bef7415ae26f787cd54ef8f327da", - "0x1c5b71047f99db30453e502c9acdf422d3bf97b0d42b9223ea1b8b9924bb0cb1", - "0x9988eb36e4a669638e3242e5ada3e6596c5e4ef36a83ed2d3348d35fbed4d3d0", - "0x8f00020f98f02af0749df39fb2f534d356e3dbe809bdb3f435c4a575d661d6db", - "0xf70a509c0d1c60afcafc7cc492c5ad575fdcadf6ca8e0e5f184c62dd52021129", - "0x72cdb6544dd469ab42e270e51d136b314c27ed0d6682f914cf3e0398399d2d5d", - "0xd5584896e649b618ab8257859e42ef7798c37cc85103a8019cec10b1524519f3", - "0xd70636cf5cbe78ba86b8de902f83f9c550a8ee31a019da6fcb0b1ab0a02bd31f", - "0x79a506d61c89cb7b1aef845484956389d5f6077fd10f8d1ede1e92474eac15cf", - "0xa66c0575cfea08bc6abbba03b0d10be7bdcfe6c5da9058cb34c22af2c8f3f1d9", - "0xfde316523b6b41fedcf11d776a53bd27fe3058c3912059197cda083a14410689", - "0x6774beba5e02630a7e4379fed7175f0f3d9f8fb5333451f25d5b044521ed38ed", - "0xb513ee7cf03529c88633176792a6b08585ff6163fe174f68e285d6315ffe33aa", - "0x4482f3d82f65f0fdf71fdf669403e0b835b5458e567dbd295b4f51d22f01650c", - "0x1cf0c0859b1839ebfb872a570e0c17886d8d7f26067bcd16af7f9f0415001aa0", - "0x231be14cb1cec949a4e806a7b3aebdb074d58e5a1c48b85c35138d5d3e967e0b", - "0xe8f0a0ef68efb2ea1bfb5d47e3c9446900329ff89a3ab7eccde41e09ec3e79b9", - "0x16348cb5e49e61010da09a5ad3cef83ab369ee3d0f28079584c23749cfa30238", - "0x6d33bc7f502436bfd0d574c3f6b1155c69f8a80e55c42c353e9e68abb46d932e", - "0x0e5d40ed7351b59846ca3dd8cc9c0eb71d4659e0add0dbfb0bb7f518bf45c821", - "0xb1ba4509de4c0f1212b2b07d949740f15ef8df9af8e7e9d765e6b407a0c5d717", - "0xa99615bb15371a15b92c119f8632f1ad7c29d6eb9a69e0ccf33a9dd268cffd54", - "0xfc3601e7f85e4b8e996bddcf1b34cb6c20462e21c715782da12d8e08a01cd21b", - "0x872b0f4f3ef00cc5cc6fdd71091de96c02f5898826fda4f837832f302497b51a", - "0xb34656439e4474e075d8ef523f6f74ef292a22281e6dc0b8fabdfd2339389919", - "0x048d4dc500031aa56d89e799499a86d6dacddea795ddc4571669fa55d694345f", - "0x684b8762b97a9d650f0f0e5edee73b60a29f6e75573bd6244518b11c4a571533", - "0x5d20bbacb93f7b03d92ae0ce8296bfd113a808ab3a8bd7703838d7e8356b6714", - "0x25efac3c3bc3d4f10ed9918fd9581d68eaa18fb72d3ce7ca8e36525d8cdcae73", - "0x48b593a335aa2699a5bb5a60394845c7e4c78046e050aee1c7f8831249f75b26", - "0x6db7243073caa6e5c0442f2f3926885fae0385e0238a69784ea8a00c854ef8c0", - "0x3a104e4932193c644e2135008d78c5153a9331e6d9dde878357c250a3b42b5e7", - "0x74b3b4666fa9811702d4eebf9680053043160be3a6c31a0105c703e07d530710", - "0x179f67ff0710067d3180ec03d664fb3d9936e8777603b051ebad4cbd0aad7763", - "0x38d5fd43ca73f66127a0166ae074324471b1a92e6f4bf99fde235ac408b35562", - "0x1f43748a027e7731c2fe5343ba7b61d7c6c6933ea45466b439a43eee1a3ad398", - "0x6b130b75bc42dbbf76ad97287a3a130ea29122ce7e48c5a8bd1e80a5f3121364", - "0xcd17f77d87174ab6ad6f2dc60d37144aed40b3620a9e6c9ac3e328aeae3097de", - "0x3b7fe9ef499348315c1a2877bd7fa44b622fcabc588687a6de4d2f75aad3f642", - "0x6c73525865791a7ca8410363d634f6babfaba581d7a0252c7f57dc8c8cec583d", - "0xdb16b0220e129be4c929888a8a46d21d422a352ac7b0360711d786eacb56598e", - "0x44fb22efd89e585079bca47bde1073dc052f8ddbad2c27cd8e2839bd4350b18a", - "0x1e6f1395d417a94162117b9371abf3f781a4b05d787f6a38fb0101bc36e548da", - "0x3eddd0764196fe15d7ac7069c04c4bf23070e57931493e9a0127fc521187b698", - "0xec104582dffc06da3cc1af1c8dc7522d26ab2408dc0f62051da2ebae1ec1cbf3", - "0x3616cc0faf8a5f5c19cbeb482be2ea8de01b2a3e81f067366c715607cf29078c", - "0xd37ca9cd5dc7c3c4e2d2f1b3c8db2a016b52444f1c088680c8544b6cea30cfe3", - "0xc3d85c7899da428a305d941e3637e33eb4981f071ee07c1ee1c82aba7c248167", - "0x62975f10a20de37466b1822859f11774efa4f37fb701f6cc0695d206bbb51582", - "0xd940124857e67e220e3d4dc27eb75ff048aadd9b7fb29b680cc3743b3ab6365b", - "0xc89ac3aa4725191e56fbc87d41caac2c692dd5adae638bf741f0ded040ca66e4", - "0x97454878805915bcb60c9915af0fe0558987dabe5d506e03898dede96544dec1", - "0x6ce55ffc54eec31d980ece5204876a3f366f3148a4b8c10cd190153cfc96defd", - "0xa4e923671f4ff6dfde2f11cca452ed4208808e93e1131de4ce0804cbe2e0d3ad", - "0x772d1c2a0e70fe37ac0ea8d7b4a789f92997bd654809f20f0ff7ad76a6d975c3", - "0x8d5de87bc2484465a4876b462ebc1339bc13b8229e6df4f1a9e9b458f5e9adcd", - "0xdb33cbb2dad0eb38613d69392951c6062eb669035691882fdafc526133d15d21", - "0xb22b8c0887f71de2da3d81a5fec2213ccb8a32060211077e2ed1613cf7962e94", - "0xffbc5a82fe0c2b3f3f34343ba6823f35884c8b1dd80fbaa68fd5f33a960034ce", - "0x9640ded5be08a8a7a2e6291a91bdd58bd108205f4cef5209ddd338ad764fa9b9", - "0xaea7f934206d00a592502b8b85159e64b56def4c72db3a790ab46ca81c75d672", - "0xb99ace258fe4e6be541c6e3468913f4f32ef9e9d1375c889e17ceea0c606e729", - "0xc54ae75381803d00b52ea6fa620766662e6f7946d550208743fa64d3aaf22c54", - "0x4e773cd4fb2347b796595cc67eb2b5c7be6409bd8b1944f4cafecb6fc5a60a0b", - "0x263f3826196c238c24d4c792c3c45fc913d4cb94c2d3871827ba43faecbf4d94", - "0x7ae1714256e21b9b45778795cdedfad1160d571004f5ea6debc16406bc2161f6", - "0x0c271dc055d8fb1ba9bf133f3c85628ac3c2b588091768380a881a6183514b51", - "0xa5f41cb430b02fb1027d8e99cd94dd6666516c785d7f618a0894f38f811bdeed", - "0xbf6665cbf1037e0085808897d8b04932a6ced6755fa52555ac00737e8029c7b5", - "0xaaca2ffc61693a6f379e54af473802770b3971f6accef49e5a2e8fc122e0a490", - "0x7a3eb7782e2c02776aa29964689cb1b880201e1b81c8cef39738d7f7235fb022", - "0x7bf417dda75c46efba6a8344775915d2b69f954afd66d8f52576e106d7a7eee2", - "0x3a324507874480d0f4e8466ed6602c99fcaa7907b61e9f2b3f100740f7866fe0", - "0x3589941fb7bfda9bf50ad93cfed18cfdf199a6468074416aa513cf83cc00dd2a", - "0x66b0965611bba105667a3990de5acdbd398d8d6e2cd0276b83814c4647bfe461", - "0x703258ca6154ec4cb1b9162678e3bb546ca6f9e626702f5f62dda98fdc0fcf26", - "0x2a9a8e3537b714cb3e158f7ecc816239786ea3787b1a3bd40482f02eb0b21595", - "0x46104b558f57296b0775d63ee4da42a716c234f3dbd7479204f35b31f4b3d55c", - "0xe7d9d0a86cc8b76526acb8e260de17508874d1db6ad19a4a84210a010212d43b", - "0x04af6e8bd51cf4c4307b2381b2e0c54cd991ca3c7f49b8cdcaff3aead70efe48", - "0xab8fe05db68e486bf2be0c507b834b6e496c1d1fe560cd3210ed7fbf0e9b867a", - "0x0e6b5f226d0bcfbd1f0a2f61189592d8974b16376fef3d0a67f757b796ad6854", - "0xaab68c29b061f8f72d9f3c6f2e318a7125a01010fb0c547835fa31e72d8eeabe", - "0x0446f90437150e4ec6246be5c718e5054d62cbf5878479457d522948c6e87f83", - "0xd1b4669e21c0b175589c0942d4423cd2b438de6665f0bca10818eb6246a07749", - "0xc20d1a68c015d886ef8fc3dede0d116199480164238617667280f833a4dcbb3c", - "0xe67504ba38aee984e9118960827ddce0eaae3d8797bfc87afd4638cb1867e41c", - "0xd3e985af3bf3e3ad0dbcdbed9ff1b04037bd1ff2e71886db3842a29f0ee8c4b6", - "0x8b809d1ae7a835f318f471ce227f7e7ff563a15d1e2463e8fce5852c9a3f9ce4", - "0xc232b56170a5796aa4333d29ad8ba43dab2233e0cf7b48d100aeaa4b2491d6da", - "0x9c338ecb25290e91a83978df4f5b7076b299ba5d87074c36ec96da0b3aa9351d", - "0x616a6134eee1221e531fc6d6b5861f5ced64e9b56505b169da67ca3c47cb54ad", - "0x4afd1e60cbeb40301c2ccc7129042f9a944f4a383a4f34b8acd7aa454fcd0e7e", - "0xd52d1be650ed156ba12b0d6be4b7fda1fe89927bd7626ec0ae45663848144e7d", - "0xa212644d968f7d3d89c6f12c3c3077184943d986dd9cd391d48f8f98eb1bc6a2", - "0x8e3374acfb9d1724fd7f84c22fda25f91737efde3d667f607b364e51beabecee", - "0xd77eb30cd87046093b27be1a09d93cfa5261b780b99116a79d6c16be7db838ec", - "0x05093b9e39e2d9f4fa95ff386cb2af67861359ea6228242be6b323c1eed5c7c3", - "0x8bb25606225d3451a981af24506a549e2bf62a362149e4c77ac72eef6316e691", - "0xd2749fc4a37792b3716634e3dfb8a80ba3e30fd73bc119069d507bfe7efd8a1a", - "0x3b58bef2d77a04b3281e6cf80f984b9067290bfe02a596b2295ccad38e887a33", - "0x2f69797f1800e5da4a4086909058ec857695a220644e61788b24ccfaf7e77137", - "0xd81872c67fbbd1a69d4805cce578b9f36bfd768d3fcbc2fd610182a7696e23b2", - "0x2d3bc9fd303c12ed1ca7efe27d85c7b5ffb8e079e59c86977a113bbbf863549a", - "0xbaef802512a7ea5006cf816c51c35fdae44a86daaeb6e9dd8fd0c37b4f744875", - "0x2e7fb70924e6f0b74541f2f4cb13f49bb3bd577f5bfe1bc29d805b0e7e1a3df1", - "0xe3918602d83478eb416dcf80103b09a051d5cffc71b0cb21461c5031d38befb7", - "0x87dae7dbb38501d6e84f738c11615dd9eda5f7b77e096a765caebea6a8c691c2", - "0xa19f74ad3f4e218fcfb15e4af95713cfff4f5f58169b789167e2b62617023697", - "0x744930fd0046b3f7de0ecf721e3b36e4b36c0f49eb98bb0c9ed33d40e76a2017", - "0x5bc7194687200989382831785b43f7f5efb23105ee2dd7a620a61622a2afec44", - "0x3672af2176d897cb8f64f2decfd924d74581bd85916be85e53f2542a54a24b94", - "0xe2e2dd1875e9265072d96bda4640ec6beefdfa9a91241ae078cec4c2a1c9b8b3", - "0x5866de65d88610e6123b7a57e28e196afac484045261d1a16b83fa232ba267bf", - "0x7224db0ae652be5fe9017454dd40c744c75e513841b5cd11d5fcaff598265c7d", - "0x04438fdfb56d125bb13f6b8bdaced6946299f8a32610205fabf4a8db9c06af60", - "0x9e9af6a569b87a4717b94d8253a0078409bbce7bc08874e091163b621a75b999", - "0xc8a39c68a74f23d615ad49d9d175086bf4e1047a750165bb071e3cdb70e1d639", - "0x10515734fb6d38cbb9a7ef33ec7831646636f845ac40cb24b08c432422763466", - "0x1604dce1fd615791c66246a7cd82edbfe860a5ac48d000cac1984faebc00cafe", - "0x56311f68cc563946e251d8c0ea74adeee6ed8dd7aba8f6ea85367defd5dbdc41", - "0x3fc81adf318fa6db1c4e7ff5424b235943667f2f3dce5119618e0273eb23c93b", - "0x38576704f6ca62083130dca418a9b68e374944d63521fc3f4b7039754d62f63f", - "0x56e2a402baabf470d0f9c3496d75e2c26c26ac159b996c370b118a313a9e9464", - "0x501af705914bfccf4ad29c38eee21641590cd8d334dce9055d90bff57b8fa556", - "0xa734b7f045d2a23ce602b032357a66763714c6e4785768f07d55c22d2f1de372", - "0xc80e2c739a3d142a4018bfe2074da8da33c471b93f5e7b44bb150b9eb63e956b", - "0x7a0b1355d05b1bf4c634651bbb2b6d65cb0a9772c30e4024f5e781e5d404376c", - "0x73827f7c7a15db5c17a986f31dd92de05579b0bb8def065e5f1cee472d00281d", - "0xcd64ee4b2a912d48e6beb06e7d6c9c236b5815434c0ee21cca0a13ff23dfb85f", - "0x768d2fa63c53689ed899f47c6f78844ace885fa18a36da427428f4af46a9e1d9", - "0x643c26723d5a4831d3d07f8692a6dc4456bb6190ce2abf1abf69159942d5d548", - "0x03e20a75c4546d5f54bbd7fd3e54c795c180b880563bf78ec55530a89188a9a6", - "0xa0ea4095dd9fc6f817c656913f8cde4044e2806488be48770de5574c0b5d5f8a", - "0xeead5fac8f3c83c5a10df161d95bcf1d27184c9fb9fbd813ec5f61347c11280e", - "0x5afba4426fcae0f1769e581fa6af97b5ef8fd417771f10405e1c9d09a74357d6", - "0x087f65be7fc2a14f216d7ce418a03fcf1e6169e8620db65c11d1ed6c0afed240", - "0xf9a7e93c40788db39b241e03afe329b6336187fbafa40c97ac405fefc1eccfc1", - "0xb02450b58c5afdd0907ee745263aa6beef662646b96b9ed28b0dbcea4f358667", - "0x5029f1169c92671ecaad7239f40fd93adf3ec07ce2ed0c4cac38b0cc8034def7", - "0xc8465a93a1ba7ec3296d98e0b01ad27bdbf16a347c5517b450905d3c3668d505", - "0xb85cd82c551bcb30a747b2258327dccb04094f918e36c3f120f55fc35abf59d9", - "0x1721b2fb8963696cdf32385fe87e8ec2c2d7fa34e099bb65498e4a030e20a1c3", - "0x6b6dab262c1a32a67353409d2f8b791b1799ee6a8e3c880877af0bc5cc5b812a", - "0xa634110e4766d3451718061efb890238796370da3c4a53a91faa96c8944d2423", - "0x91ec6c6f807285599e0a179d0d246caf10152e733acf3bb967bae35fb36561ec", - "0xc3b2012d5cc8d796d1890d39e2b1730dd53df0b98274bbfef8c93bd969912852", - "0xd036b9b29589cc551bf27ab95b6366d772e7d692d8fba48f473a2fc2d023dbe2", - "0xc51229a0306e56a53bdab1fda497281e23aba6ab17301c2eef3ce3d01f56989a", - "0x2652cb79e0c18dfdf545562b8569cc2775a1b0b1b465cbdc5880b40ffff22676", - "0xf24e0d6c03961043cb41638596c4ca02e2a2522a3e828dc4613a72ce5a535a67", - "0x01725e03a7cbfe2d6c5623829e4d419bbeecd1c7f925dbf1667979bb4da6650a", - "0x3b0c9824b726b2b556c6c46af48b84f856154490a51d775ba06aad48055bcbd7", - "0x2be2f1cb826d7575e53bc5e14f1882d73bfe145ed91b2ff56a885f66e136db46", - "0xd16752cc862f33b14f5976049dadc4f15f147f2fa76c50bafb38a7cb25c8f881", - "0x66b3ba188143bd421009c082031696bfd6d29fe7b9c3345e7e70bf6a470a05ec", - "0x83e017e8701b533c9fd22e30d63c3781b0ac9ec1dff4433fe7fb5c8f6f4e67ba", - "0xe4782b025953c5980653abd26eb95de1bee0524c14a74b970ec5615f98ed6768", - "0xeda29e9b36262e7c79ef9c0b60fddc66bae542b19caeddcdedf439573f773cf9", - "0xbc02ac1f023993253394ca965f4394bb40f9c7822ed6b2cbdd249e4b72f9b637", - "0x8e1bde0f2541d20b7f7e8179014e0f6b98eee5c1e0278ff1de38f4c13fdb4161", - "0x7b762d3d64aded9ff99e3423d7e676dd307b765ca6f1295e079ac53d5a4788b1", - "0x1027bb44ade6a1f82f11e9f298fd3957a9636bfbb97457c319e3d57ce72146b3", - "0x963864b3164578d4a7e58de16593273067a641de752b6df2c9b8bfaf970392f1", - "0x16bdf92929fe3629a57f737d83328d034c36bbdcd006301f28dcf52e1d1cb542", - "0x69952e47225f1aa86d952afb0fa8c668ae710a10cb6a94477d518c8f771f5c30", - "0xe68895f4ae2e4a35fb7e0730a5ef9c3e3030f6351ff6381f77e6311912ced98b", - "0xf28d799eeec538dcb2f371cfc6aa16f4a6808ddef0e6fd0cf72fde291d94f8ad", - "0x5a404922a9bfe57eb85deb66d8d83c869ddf96eae17e7fdfafef19c19efa1eec", - "0x96b735672e85aa95c2f8b4bd5ac80942923cff64a24991b3103e4ee39fb9a8d1", - "0x83d922f50174810fc45daa5a607a9b4fce69d8ab86f428ac57ffdcd9c2ff2908", - "0x3b0ce5a62116eafbf445afff0674112f01e1dca0e2af2b72d0cbbdc452177d65", - "0xe86cc93417c7dbcd4b5f051f4dca1394d272dcc2101a9e94a140b20f5e4c8b59", - "0x99b3e1d593b682e1b6454675593ed6828f8f4c5888b965981e3a7c602d89d031", - "0x81e0eafc2a2adf3d94938c413cd9f588e7525b91f39a689dfc3d0ce6aeb812a0", - "0x699e692ff89a918eee6d19a63caeb07832dabf1eb28d04ec97150c87045d9129", - "0x90ff00b66a14d821b05f692ee6d100dd61abef3234fd29e94bc84574439ed2e0", - "0x2de5779a122ccd84a88c3adc4edf7c1c03dd1d3e89ab45657885aadaa087e833", - "0x775a5587a907aa5ff13bafed032dd96c312b19dcda1b0e74e8a4bd327fe90e50", - "0x4fa48215f975442e6b9ea0629d308667242a7fe89f0cd0eae55ef1d35a3d6ab6", - "0x2e24c24731902f1b9e4042eae9e946b9d884dfa9f733ea5d4f7e778b68daed9b", - "0xf23a4a6061f45b1ff2095adf02ded238b37a0ffa9653fa9c1b0069e37e8552be", - "0x62b94eeb74bca8d9ea91aaeec5c13a05dae022806df28b92ecee99b47de999c7", - "0xbe6c1797cad2d5d9ddac3b3adcbf1622241e2560e3407139e24dde3fd8d3e435", - "0x7df0788058bea0911f2e30133c835515bd777f7aa9cab6bcd27eb3c0a6e360ea", - "0xd87066a4721ce567f44abf179184381d81c1c487158a6c57b5f2455472209a5e", - "0x0aec7d3081c3ee7d61f36e8c7e62ab74e41f00b664b690a341b9ff7feb5adce6", - "0x16345b31779e80499dc01f9ccaa0e9981b2b336500f33cb1f2943b66ccbf74d9", - "0x9ed6c6685dfa2b65903db0b234f4539906121330c5d55e6b2a2fd30549b2dc23", - "0x6539602958d9166335a7a0396ad72be611661bdd40c786cf9b0f382039c6b46a", - "0x72bbb4a201de75b9a4b5cf7381308953234c62f295df08b919c12535febf6fea", - "0x2d37293863f6b90f43979ba5944bec302008957e07b7c7f2292074a0a3934674", - "0x22677859ad20cf8b924d516b9f979652ac91a27459a4eba5455beac7f5f23128", - "0x704c898c04ead58c2fdb2c753359d10934e66b326f104be28ca7a32ef05a2bc1", - "0xca2b1ac29937067b761b57b58ae4069eecc799dbe089342bea274e56fde3d1bf", - "0x4a9773e6a2e75dcf1ff46c8f9931b8170a3609023f47c0ea9c4af000798bbc22", - "0x7e4dcb6c256eca2cbe9d168cc78c2702c373fd6e69c210d0713e2766baba148a", - "0x399ea7dbb66b95bae693402eec304f9cb6f4c6ab729d90ca569fcc2bb24d6442", - "0x49d0e561773458f834c96e8fb9496d4cdf83f2cfab75824cb1eabf8e8962c18d", - "0x80a0a209e41d0c3ff07ffe6a7f1af67997662494a327fa7f3bcb7209340974ed", - "0x2bdd6d6e7ae3f4386fc655817e92563e80f46e1b277be22f81a689de7637ea1f", - "0xb77f32374161e54c50dbc38822760874d966f9e098a2ea7aedf650adf25cc0ad", - "0xb49b1decd65a998a3dae2e4725eaff56276af3f0c50b2a3a35b6e94738d32808", - "0x319f78ae885011458f47ff1a110881cb4ac6a78c7d4d7a2656ddca73a88b58e2", - "0xd9fa2f47bedc0b405df34c98582b553dde76a46d38ac86d9d357ea0aca60ec2b", - "0x4283ac57e82bd08970ada71f4617728bcc467eeebb19c3aa20208a82b18fb508", - "0xf2ea3a5ac3bc77ff64f7c686305044cfe539856fb2833cbefcb283317012062c", - "0x840a9b8c756c3c3de7170c3597bbd085747b97419c01bbe484fc4cc7924736ce", - "0xa88682b957deb995307ed875c4044246d779e3f8c584cad75162fee119613806", - "0x7b9195c23833f65832a44d097290d8573b43e6f3e47dcb8c3826ef9a52fb4ff7", - "0x57bb0076c87f2e7187ea92f9f7643eb5b4b823b8eae9f6e74c8b676dd86b81a2", - "0x68593a8268b245a5c7506a05860755cce1be795994a7d736aba41ead4c025a68", - "0x90e21d5927d39329874688312eeb5296677ecccbbb9c6bdd4400c50c9bda09c4", - "0x773c0cde2d1f44575c89106a01881eb5d9593bc762a40be03ba979496ad7d229", - "0xc1dd843534e9844bcf406cc03b277e71d4e73026635412e25f3555d099f26a55", - "0xdf3f794bbd98096cbfa17e168c0de845383abf52fea618937ed81d31cfdd88db", - "0x1b05b1f316013609fbf813cae674f193a9bd8a75631b55278bbd37513b85641b", - "0x429321ddb251fadec6b6f794acdd8cc9d93512b98af23d20749d93c3c9fdbc36", - "0x6cac90b28ed13c907d094bad45574aabe2355e13e6a9504b6001e5fbb9c25235", - "0x89b43a3f63a2ce4f67071a121f447d7e843948395616116ddeb57a8714becd3e", - "0x6de560c95a0483d51410f66f38884947dfc787e1c61d14421129773010b46e0d", - "0xa0ba45049971dd4b906e73f917fd16312646d53c0cdfdc3eefe53628a58973e8", - "0x3d4a4f7155eac18fb5a126dcae2035155a140a84718f33bb20d2f1461e8cedb7", - "0x1cc19669bd91087d2046770cdc34e8f995cbdf2a0cc62bda70d6074ed58acefb", - "0x7c1c4aa1817de27c62f35d66927d924376798c954d65ba3ba02c0528d11d748d", - "0xf0d67a8f3c5306165cffd44476249c254898bcb26c937f10e8ae244edab1b972", - "0xcc20c5ecb1d3e83bd56e9213761f8320bd40982ab5fb669bed774b4490637932", - "0x7935073eb3e5c37ed1135cb22bfeb0e21727d170d106465fc35de75e8d56cf41", - "0x7d968e74212c501d0bc26ebb816b57a37a8cd2720caddb5bf66f489e13a61bc7", - "0x2c134dcc35d50c63a13bd8868137e0240280f049d7e392b97ff5f76d00aa1296", - "0xfd046f06c1d46d9125a119f786acdd76a85fc596f21cb15f367933b717ba7d83", - "0x9f5f067e4af3c8e92d2d54dd061620f0a13a66006b162a1eab4b1707499597df", - "0x8a6e1fb6205a423ec2920d448a376b95cac7233d5312287bd850471fb49e4f8b", - "0x2a6ea987659383f9885d24c935fe56de39d45caa89e60ba1768189318974ed7e", - "0xc2df6c8a4eae77eeaf11d7e5e2198ec4a33f19f5995caab4db6577fc1ce7b957", - "0x1e2ae8a42eb937749284820e50f11dfbfb606ddac3efb201e0b2664dd0196d63", - "0x4d63bb91f9f8a9965c460326f0604a27ecb0fc56f2126c6b3519b08a895747b7", - "0x9a46c2ec5dcef6f5c5b76d4b08b9d5085709182243cb8308a2863cca8cba13dd", - "0xea57019cc85f7cece4cea7eadda96dc9e464df2689957ebfe8d817b6996b2e43", - "0xb40e930b31dc1508480ffba351b102c8cab53c6603a0dd88bfed1b0da5347153", - "0xf51ceb070d8e7cb998cf4979ac985b4850949b4456980f523d8b9d72604a43da", - "0xddd28627f5c7bd213149bc4886bf4bcb8304f86068694fc743ac81ed749aec3c", - "0x9ef2b3df587caf086f4a9838a829491d1ef45db132ea71c6bc96a4a40d833e92", - "0xc9f7d4e19501c48dda5b0012cd93564898ad080a653e29f3563ecd40d36de84b", - "0x0565db36e6fb7b881eae309fef6fcdcace7c92a7ff148476b627c012aaefe4b9", - "0x08912abab10f16b92ddaa3663375f6e2b656e4ed89f2285aab6e410fc59e650a", - "0xefe9e68ca3bea929722bcccb5150884eb23c32153b14644b1c7f4e033dc3f718", - "0x4b33e0e078056d9efd857f909d1e409516f23da68105463167e23d71c90f6366", - "0x63cd4d1c69c4168798a3d9f15388207ea10ee4dc6be3681b0c7dbce5649d8f90", - "0xc8e7c25854d49022e9a0ae2eda8e7835a6db9ef7d612312e9deae23621ba240f", - "0x22c05e50f27e8bdaf4abb0a045d0639bd7f80057dfea638df6a7184ac49b738b", - "0x4a34356b5a447591ac66c51370fb6539bdf50fda9600082dadd91d33713a74e1", - "0x7147d53533ae40e886f6bc1c3b65c51570d72398f46e3266f2eba7b707b46b3b", - "0x1e49f75a30695e9bef14b036bd1c0f2b322042b2a02ca56604484e913b284c1b", - "0xf2445d48e823bfa77776234356ae0d3c1a850db236b3d2a95e5b00c4d7e687af", - "0x7034246c6342c26f5ae974576358f993d0e5e3c577e6aecdcc182c78082ab181", - "0x965067896ebcb2628ff10127508df1c811087f45ae258a0d8179d576c21e4891", - "0x384ebc34021ebdaf95e1bf0d8d61777b96a1ae65163cd3bd9b4311970a7918b7", - "0x1ca6e203cf1e058f20f5a8b1e33464801bcbbe04c79a7201ad6036bb8aa54101", - "0xf5aaa21a85fa9d502ef278262acf71789a3755d36dd8b3794becab7fb2d338e7", - "0xdeb7dec7ec133b6ac05c3bc0fea3b0002c8ffe58b135f4ae85b71fe0350dc7ce", - "0xd5773586ddb40d4c772541f743f7a4b08e9b419fe5b5b3536afa0b3b888725bc", - "0xeaff5bc016770c7cce7be21952cd8759a8d0eeb1bd849732c15dbbb82c613a74", - "0xb1a6a6acd39b4428accf9120a46d74cca6451ea4a182206425a8a64c6d6be5b2", - "0xfff27e5023fa1fc365db1e79cf3283bee2f51333059bfff47df39f12875e5fc0", - "0xadf1ce203b0acd4cdaf1d9a91cc158a21c823dcfb0740f089ce0830102b1cdef", - "0xcf20c92fcfa22d6fe7a60d1aab2d5a942db39d447d4ba1e9e76888a64694f1e7", - "0x210a684182ea379b50d641aed1baae3bf3752fd84feac4b3dd4e110c5cfc4ce7", - "0x220c5460803cc8db7a2b645dd5a4525b0703182cce173324d20e1c865a157811", - "0xba87b487bfae148239b44f3ad7663fd66cde8e21aac9e1a50bbca7bb7334aeff", - "0x2728161f9f040b4d92ba838d841404604d4d838157fc66f20d6c4c61034fdbda", - "0x3f8a6c7198528e5084b3e8d52d3101c27c5bed8721beb831ff921eaaca4c4282", - "0x2cc2574320b3c7252404db7c67b462fbc8d87bdbeb782ab1bbd257ee634a35c2", - "0x13aae0ecdc6a70d85412178ec12e971b2c4476d5e624938ca0284ccfa611d11f", - "0x6af7161831c3442db94cbe28ee9385fe79339d533b9c0fd3266213c2a5024a14", - "0x06185136927e5bc26ecfbf2299a0fc13cb447df6ca4a60e968be8c2b7ba1c2e3", - "0x70ccc84931d910a2489d50becf82383a836309bb90dddb21026d9e4e4368c85a", - "0x400ae9e4da0f847dcd4bb65e8f9f661a3b0deb78346b4f1f84fc712fd34410f0", - "0x57aacedf503300888fcd8db2138badbfcd663c63c3cf5b3e35979dad635c24d9", - "0x8fea6cc2da76b7cc7062af870cfacf4952b81f09c3c15d31145fbbfe1c0806c1", - "0x5125434cc5d4137ee31b51ed8306b4d665b8dc66504661b46c227e62a9ef1abf", - "0x254bc0b61211e0a57755d73ac618012938472912f855972b7ce62677f5d0e64d", - "0x2d231389c849ea459a7530ac1bdffa4d84908e2c61125a70bfcda932cc8e5efd", - "0x671ae73d4739bcd4841fdff266803117c5684c61031fff16e831a3bffb4bae4e", - "0x64c4db66cae82a96f29296b481619d79a739e2dfce0ac1f659d45f526ae58ee5", - "0x3f2f08ce2f21253f8c9a3fd650a885ca0e77f720a21ad5b4c0867150a0274efe", - "0x98c48268710592ee4c26620375968f2b8730a1bd1777239e6ffb9f116c6e1284", - "0xdc7a5c095c255e1984b4a5fa75c7a1d95d98097fc4eba898e644ff66951d8dcb", - "0xeee7579812ef09ae31068e8087536362a967b2893b709a458822449ea89a48fa", - "0x296e707796c0b9f9a2f55ad06c42d03625dab94af71c2e1c7016a7ef6645bf5a", - "0xd9a3eb363d4a36300dc4d1903a83447c89ec286f8d219f1156335da283992d60", - "0x039adf5a0cfbc394847d8014d64700ac4b6e78b531a1e0328bab256f7c407116", - "0xf9a92c6b1f0b0b3d7ae33cf5ddfddad516bfd7b21842d76098737533efd4f7a8", - "0x5a5d1fa3b8e05a81173e627f14e689c166776b93df401593db8035a65fba58f5", - "0x34f7fda3053b9d06e217223ee06fd194e2962c4a381482429e596df1fe319686", - "0xb4cfd9a71a98ad52c7705d55e96f04cb9064b1c32d3c346be51370b56ebb0f8e", - "0xd46a93765af68d238b776b240afd464a24d8c8bc869280ad618fd0fb6360e878", - "0xf3c622a4ee05d1ce27d59e7b9b3748547f4efdb1d6ff72a58fa93dccb7b76de1", - "0x6cb017c4bd8bb5186590cc4559fd9600399485ca917b10556b98cd7fb61441dd", - "0x7188f59c892b8754845d73f534587f27b7da67f42dcc1c73390fe2970bf0ad28", - "0xb4b17c93af08b9f587963e42703379c5e4f760502870b8096917b09b3950ee35", - "0x03165bf9bc20c87412a41209901d2bf3c8bc03a8586a1706fe1499641cbc4775", - "0x9ef57b2126a38c2dc456c13c272de53366dd1bf1fe768185a93f3562d064fa8d", - "0xbc3660089065220589409f7063dde34aa080179b3f22464fd9df9eed98d88b0f", - "0xbf1cf6eed0e0270d6be602040a97600ca7e1279db4279a9fb7ee643345a264b3", - "0x4cc471987bfae3b32179aac7018ba574c0315b9832915b5d0b804b38e9def6c8", - "0x51351557582b1d821adfdad36536b59b28f9a1f1243115486ce44d4b22d3952e", - "0x66d6b02183b9def37dce37b66ba4e9939241732b49dbc8addd147a89dd9e0517", - "0x47261859ce169e56d4e7dd75c5e2648597c7906f9264710c7e4dff74f353f739", - "0x38edbf1db358c82d0c945a7fc024f7fdc1165331cc19caf6b8943d3ce76b721a", - "0x5231560201678a39175187469f7e36c1c729ae060225012ff4f679f3fabb8237", - "0x763bfbeeab624de07a6e758368f8f61c0fcfc8cda088d2dfcbeb47a5eea9648a", - "0xce910446cce07477d424f791a71a375830ac26a2543b8bd1343e0d775d161e5f", - "0x950ba34133aea3c2947a5e5fc1836375e81c042ee999b60dd4a27e6492fb41fe", - "0xdc24f20fda563bf74ff7540a06f3631af8ab3b3722874a6b383714f463f5fb43", - "0xf2250ef512d3a11144370747f2c86efc73abaa81152bc6083f87aa217d16ee67", - "0x8760d0bc8f28eb2504f3bde3e429a47f0aed1dc2c7abbaf01c68033c07ad368e", - "0x7ef1c11b1f025f7e2aca2624aa9a11781cd860f24ce3fb525e7196e590fc5ff0", - "0x7c4e717fe77c8f9e742e312081d51418614031745b182746c7ceb4ff54deab6e", - "0x56c82f80b8d52128275529fffb3ccf7376f411d7cf9464a15fdecf617b4e7571", - "0x46f7d3ecd09c29d36a62a1a65bd3c59a14c82687b5466c9c130df14c286c2a95", - "0x1d04deaadcfdc7a1e5e612df6eb836f55caafb4f9bf4f1200fdfef4f14229f26", - "0xa0f5e65e99a22e14ebafc71f093dadc96c68883609a7460f904eb15360e3dd6d", - "0x8ea6c444466d4b6916a1b6dadafb87d75e2fa1ddd1836425dbaaad6e99f4d68a", - "0xd53d052bb709813e6dfe218dc4bd99c5ae83b6f5993b182c36a386502713c7b6", - "0x2e0cc1dfae87825d1a1d8946e021dc514dea384241e0a6cb66d5daee570c72fc", - "0xa419612e2bca19a3a8dc7fac4da86c2df4edcc2989e10d3e9050323011676b1d", - "0xe41649d9af504bd273b9da0fde578dc126afb55feb8b3c31a0d4eeaa9c7b83f9", - "0x0121be707b5666d5a78949b2ee263bbfbd013b69caa9566864711bda4c7ed0f5", - "0x788538d654618bcef0a63e31576e19a0872a92733ef7930ef50f8afd6caf110e", - "0x7777a3a4930828cc158f696e6ddcb87696115f473f219ac5582d8a38e0645430", - "0xe15a9f42ce5964358f862fa7a40bff0c8e8d7429a5ca923c9f0d4d0d574378a5", - "0x187bd59945e1cc6a877fb324b1d7ebdf661383ae7e22c56913f2e920de73dd68", - "0x938f100308d20611bd14372b16da0dcbc888868f8bd183d667064dfa8e67a161", - "0x5e61540787c83bfacbb58967280163f55f5ed00e733d6295099588557ef2dcec", - "0xe6625082f4039ef9dccdbeb9488baedf75fcec616ed9d5009deb4eba95cc680f", - "0xd01542aefe234567f106a4f057173b4f6eb5733e0ab9537af2db309edf38763c", - "0xee0174f3f9218a3418b8dd2bcd4132821eb91b31391b7c2c6e5a84d067d21497", - "0xbe26c679aafdea135aa493bab8ee348b255f50bc69592bbe017dd96b0da58b1c", - "0x297e6634c06193ed4725942cec32ccc9b4e77b5d02fce2ec9fbf580e3dfce248", - "0x820d98bcfbc008480ea32b162d15701357f094b1d7c99a1ff92fc0afd9708a06", - "0x82bce2be0a2d468b2fe0d3ba4ec1e5e8eac2d83f8b2e402b3043119a59cafd51", - "0x63ff3569d9a5661b6773a1a5fc10a522ea12a22399cd337ffef75a0d36735ab1", - "0x8431746d8239126bedde7d5c58aaf7f733dd1542c942d415d876ebf8a062f032", - "0x6bfdf119b93ef4da6f48265f4c526f0837a10c8db9c518d0dfe1edf40ae5fcdc", - "0x55aaba1f40c9089c65623f67eef8cdb827282a39cd0778f26e2f73106d3eee3e", - "0x0022a0b29d8188251bf5c6f37c76368dc9c7ed9e00376901162d1fff111273b6", - "0xf4bda8d3cb5b7ad50dfcf2668253e44b98e87d563ce17720dd1eb1a4e1c32628", - "0x994315a889329452a3e08ef029e7d902308022b74aa5a4eb2178929425c90a84", - "0x86a962d1d436f43f6fcad5b61b615f2bd32f10fe8c62428854ce98f4289707b6", - "0x3ce476498f26fd1d0b276ea639d438d7efd3c10451949efee1c91f279ef15ed9", - "0x199b2fef89c1edbe547e8c0b666b7b138d6f94fcfb2f09f26edc429ac163b127", - "0xdf3fd62e7dd0133ffa23a0da13d720373b57e85c28ee97890c355c44323ad592", - "0x92e0cc3bc262330ed8a1f42ad40a2db6c4e75e2d39e24a6ed5eac0855c12dd05", - "0x5b46f058c21b9447f8faaf78b2549f7f1459fa5ddb4211150bc26dd718f8361d", - "0x316b4f0e5b50cea376307236de36f3a1ebad3c59ae28dcf7838339d8711047e6", - "0x2b72ece0cbeaf94140b99cd9312eb891a1264a4d31fd839017e22cd4cdef058a", - "0x0c86b9b2da38f00150d49ac53ccb43a88a44181c90b492e886c54b0d6a93de22", - "0xba5a671174dfd7f877bffd7fb3179b1f3f8444ab14eaa9a0488207141bda26e8", - "0xecf73cee14b1a8fa5c2de5d78c058bd04772666ff455ca4225ac419606041f2c", - "0x1947b6adf9abeeeb55a66cad4afd016f6522faa641c4e14af94cf6e610959ad0", - "0x5467aaeb96dbe111a0d36fa66a71f489fb33ab8d95692695c09f4680086daff2", - "0xa21fd9195eaf856bd048bdb258507351e9a2c168920fd0c550a2340b5176ba26", - "0x9b0cf5690d3c3764f5c102fe1d5139202a1f982bd5afc8967eddaa6bcfb3af42", - "0x32bb410896733f9f6080a5b574b07c0af3e5ecaf69e995751e392c3905c11d20", - "0x5e98b3dbf58bf5adc0ccc9269aa10f9921afd44283837e7cb419ac4fb89f6164", - "0x051cd6e01ef3ebac9f27e1d473b0abc00d870a78cf894cfa8222d00976948b39", - "0x500edc8298fb83a103f5bf779d1df507644e054ef27ae61ccf31d883d85c2a0c", - "0x80c8fd7e50aaa14da3af3ec622adcf89eea9760ddbd5232a49ba55837be5805a", - "0xbb828dd031299bfd428c22110ff5d9f5612447e346e98401ab4a01278834e476", - "0xe2c5f408029af25cb9c130fc8fb5118660d08da399dbec0fa1709d1c0583de57", - "0x1be80d06b4ec5ef612e16bd8d842484039ca5663234174441f0722ca521958ee", - "0x21d755042a542493e44e92b4355af2f06f161c0e2583aaf6862730be7e9976b2", - "0x49b993b77606eb939ae485e82243e530e392af6d68be4ece5ace66a675a7a70e", - "0x954823b80bea8f2007503ebda5a6ae4610f94cc2c9a6ca22088a52468a960524", - "0x2693662c6c0961a92566deaa4a59204a0c436aadc0581b799e6255fe97d26331", - "0x4e80abe082c0b8ae0602c232ab0f766aefa702e744ff142cb9e101a6050acfbd", - "0x9c47c762c73836210a6bd78e5ddf9f2e817951d52b9fea0c823596c3df2a1fc0", - "0xe86094c8da0212cb0cd96f54c9f1b22c11feadc5599f6aa63285971651f11278", - "0x3031451f37f3e0288d61580e5b20e008a2ef5975e5d12345056949dca2c1d421", - "0xbdf90347d794ab3b41da6fb75b5d8d1f426ca2c4923216393e055dcbc89f3cba", - "0x4f7a0c9ebaa4833e7fd0ae0f3ac8dbecf3d97d0036a41ef30230e634142247e0", - "0xd1cdfbbf34bfcabe4a0eb90fb4d8592738203d245d68b753d418c4bfab8ae4e4", - "0xaa56db3fe5b2edc2ed277656deb51e15f86182de49836b4dfe2636de5488a86f", - "0xf67b05c233797d61eaff641e5bd35ee830bc1a8440e06f85e034902bd1023ede", - "0x49bb9be0064ff46c4b7820e7dd08002f3914fbf9250c96873bb3dcc7bddbe3de", - "0x594efbc23c0a371e3e5478c599466ff3a8d985444583b70f275afda13cc05c9b", - "0xd1dc59771492ee0881398f87a7c90db42874d720812c1e105b1512531d9fb1f3", - "0x7462bfbf8457d1df1288cbaf339861dc91c02d772f3c1ff8c215965e555d6905", - "0xee62a752465879dd62d08d7a15a54af1e813a1bbf2035384289bd634e2e99524", - "0xc7c66334011807d017e0df794df5f2f36c4cf496ce0a3589465662f8aa5433c7", - "0x839af48e65e3e1fd3d177d90f1dafcbb0209b107bf882cfe2fd514be625c1396", - "0xfb4eeb8514ede5bc952beee0e7e78c6d7ae544e6c4d935a6c92375b224e40c3d", - "0x38576e990356b7c44eb1dd531fe28420d01d80130e0ef0a42b9a8b01d2687822", - "0x434bb4312789b8cd93c5f930f4305760f86c54ab225b35bec70954aaf2fb4c2d", - "0x19ae08dadbf2f7da90ce777913d59e74592cacf6f385600f7d50cbbf7c4137a9", - "0xfc9a8ba8d7eff3a582725f8fd1539c4f77a87ecf23505de8a321ec6d568cab5f", - "0x20fb269b1a7908ccae92532424cc94604ca9a0908bd7c5e446a687cb3be9e0d1", - "0x9fe0a0e3511056762698573eee8ee2b0b87a8b6daad2141a9ad00c5b159521f4", - "0x3630751af37fd3ae22e78198868341e86735b03432879fb159628937c6bc28da", - "0x427789cffa2250d89b99d50969d8dd9917b5f4c721ed9de79cf81dc59f94d81f", - "0x5ad7e16bd42e35671230458f8f97c18baa5a1f81b675df259c9d2d7cbb09fb77", - "0x3d58c8ee704a934f6de776ef8373c653140e089b85aedd53219dc0b46ff03b58", - "0xa5a0719b16d8771b34e050660ba965b0ebfaa06bad1973033cbe2fd69fac5886", - "0xcd66e1ce23416fb4662d2b29dd72d9f8f981c66098820058451441213f2947aa", - "0xc7eb6f1df45136c9adeacb03eada4557326aa0a22f9ac0d73df25e21beb6bc0e", - "0x890eb4c610c7036e1494514e1f7ff72f414c51143fbf13cf2cd03d8d37a03662", - "0xa54328a1d2ffd9aa3f38a9e6a0539ad2517c4f6129f01768891acc0a2b2a721f", - "0x147644decd98b450b284d05d7332629e3c6444846f7c71dbcc892d3191f2efdb", - "0x1a19c1a8fc7f9d838cbd736243e66b1f637f49b1d8734c2af417227a11623b30", - "0xa8c14722a6f7e7efe695be4e6a21f2d1c8b8d71e2cf69e7645ecc5cdc7b6355a", - "0x8eb33cc1490499aba376f581b68766c4fd40e7d6027f223eb46e27199acc8d67", - "0x1b6a906a5321b057f453624693d4ae6abe79a5b8fcd63a777dffb8b2ea4184ab", - "0x7185ec1f19e7a84c9f914dd223b382ff56464b01a1b88dabda415a01e1d0a1c8", - "0xa172df0cb06617eeb95d362bb36d5e5ac52cbdb2e5f3c2cf3d9b78ef28fad82b", - "0xa11941ce1c866d077fdc995acf3ff2ee0ea0481eddd142f9b343c8403ed606a2", - "0x1958ac9a77c5b9825c401b204001dea8ee2520983fb3e738a467980a7bf9defb", - "0x6b24d043eab24359787ed7e93543967c9f9b7ccf99894c1ee7768f6235cb0cfe", - "0x6ab8c28ddda71b937d1a6feaa67b071f78ff7ead3a192ae63dac34ff24b8d929", - "0xf101e3da7546249b5b6d4dbe960c713cf152627a7482fc3377aa31f430c54530", - "0x22628e903ea9eb3eda9c93ac92d77b1b8a5ee62706dc5ddbcd079c57d5b721eb", - "0x0050467a543fbf0a232c8ce9f66eaec6c38c3c31b8ce3d590d1b07586374c1ed", - "0x4235a1330a45838b2d2aa9873dfbd59cfc0f0cd16e13ca9292f8342eec255fa3", - "0x2049ff9cebd379b51308220449b3568c6d7843f5b49f61b85808287f3d60441c", - "0x50c2ef0e832df29297dc524fcf3af4cd0988fbfea71987f3ac5cba8d4ec34102", - "0xe7260880b2d822d18c9ac2224d09fa18f5c324fb421470aad5af6c2605b40985", - "0xdf51e1b441b9809b26cd7cbdc4df27eb9c7fbb3bf764971684aab6c63e282a75", - "0x597b5c48840a25294feb135e0318ba6d6ca09aac476b1041748738963136a0a4", - "0xc710bd4b45a991f7f1387c25db70a1964ca4fbab32b738424d35a6e06e2483b3", - "0xd67460a50ec79c90a97e25d4cebdeafed6c897593fe8b24afe47a71c818a55b5", - "0x0ac1f2282e4491fdc8d28f1697026b7fa88f46204610cbaf8811d38dc84539f2", - "0xc3352ebc532273e4224dc0e94ec4cbb83afc2b5c364d71534344793032441006", - "0x42f3d39c81e118a7d515d82b6880104909a7915aeaca8ad64fe74d9fe88a7f45", - "0xac6fa42771e9cd6ba31dcff2455d2234c53c282251ca2399c727fd5521eeff0a", - "0x83ae44822213f59d34543a6d4fcf76b4e22cbe5a90674755072613550d348551", - "0x99cdb65200f9d1c602c5c2ded67a8cf2722cd7c1ae3f11d29a2c1b702923df93", - "0x2adda7cfa12bf5ecbc74ed4f4ea419ad7cd3e7cd03a0e2b32e924aa2ab98ec42", - "0x3da7434a58c60b7fc7fee8e30b3073ff4d3c381288fe6ba791f68d74d24ed19a", - "0x9dbe78f9121e6c0d99fa6d441f6aedf54be14fb39a277cbb5f19fd0b846305c3", - "0x2ded5acc49e2e1fcb57a66a81f59405febb50edb6b41d0fa8e445477028f422c", - "0xa46310f11937ce81ebe8d4c60de1a5c8787a1aac35ff3b6e2f0cc793112b7df2", - "0xfa693856fd1867458c335c6e903e5745a950ddf8a43cd9ee76ce8d0b3070bcbd", - "0xb374a194d9edb55d2946d40a16ac4617e4d0674630c6a970f58db17f21d22c12", - "0x651032646288a0b6fb5322626bbbc5b6b87dc5a5d59f5f39073f2f9574646c41", - "0x7f4346336c95c7fcfc1f849cfa63afd46dde8e346ae0801aaaffa9069f989e99", - "0x8bedf8e9f5095b4275635525fea6169c5afedff2ae434e42c5cde973de77ae3f", - "0xf92ac4f6fdd7801f15c8e0ee163241542d1359372d2189d8cd2a33f925933cd5", - "0x806d437ddf966fc6631a8f81a54eb82080fb2ade64a2b715872d8f648d23b57d", - "0x2151451d68f912b58bb510002407943ef6f2cc87a992e6df0765a4c239e63779", - "0x6a02bab7734d8549be10373e6395c368492b8518df793821962a940d5cf93654", - "0x4de627f1d096c86c1c1dcde2a314ba65700b1ac47b9db95e9ae68f8d28f52b16", - "0xeae202c747b699171115bb56652ed534d9ca6de0e8c3d947d63c6d60b5d658de", - "0x7bddba4a7c160445653f62d27c1622323c784461d52aba5a6f19964194a063c5", - "0xddfcf0c5ff899f19c4ed0604e7b4cc645ce5bdb7b7c7d6bcecfe7f2cfa3bdc0b", - "0x7d27d279f52b83afc9a115c71910d06a054fdc2e20625cd05fe35ecb03734f5b", - "0x415f6bcb216ad524eebd7bf177bce80cc3d5fb3e920ed65a8ba6c02f59fa88ba", - "0x570daa81ed1b593529a07396784c2996d5703f4124f941e99e8f9cf6b608b1f5", - "0xb9da28526fe8300989e16c83c4bfe418c74878be1bf3af12ff3b9a098a4c92b0", - "0x691938f83dd63e39be2fb03422682ee8dae8e0a95bf4d09b4727f8162b2da11a", - "0xde168c58358db826c9c953895b7a0419066e65eec0b7fa479c328719cf70df6b", - "0x65a7b2207932e96c427a6c01efd0c3f01a37e02e7dd98b18ea559c2a6c83c8d2", - "0xfe54ee65b1b8e21292fde2eed9ddda163036cd6745254bc7cb9f3dea737832fd", - "0x543d64c2a6b763cabbdc1a9316f37115fd572d96b5c75184c155e68532fdc8a2", - "0x31b41a4f481a786bcf4029b19e84729c699a8d742fef50040221ddf6785d7335", - "0xa383494d908727fc6198035c24afb3f352a16b29b0c1639062e7169618bcb38e", - "0x3da745966ebad677a703f5db94777fdc307f6e3e66a7c3c5ca24f35cff3f43bd", - "0x32fbcb24d42beb2128d95055706b767f7df7ce16c1613e3195342db84dc9955e", - "0x1723ae6147425f5b01b68de9847d79b918ca0f85a800d981029dcb5e3c62eb8d", - "0x997f18b9977469cbeeddaa1bb31472be3806c03ae77973c857e32d6fe2c4d740", - "0x6c27575f33b1d85fdf9643c9ddd27085f4241518cbd5b776e0d2bce19b152ef0", - "0xacb86fb3209fbf57c42eb86d2617eb631e0ba36da7de5b2c7ed63f168a7b112b", - "0xae02559f4868fbe4f114eb320ff0f3a38086f364a2ee537e6051cedfcee76d6a", - "0xc96e439aaa996d4ea4c276d1592fcc06e829d5f3cebf163aeb75f590896a2648", - "0x87debf5b6912717ec3c0846fcfb5b459a15254660cd5064180c0c514b4b15f59", - "0x37587d340df2b40b3f14746b72c5a72c5f51963d208b02c9671d6c623079b584", - "0xdff2805c029c4e3c249de3aa9f5cb3b48daae4f4496deefc91ebe3251c18629d", - "0xa84f66a457869dfc95d625d40496250ff33894be23a43e53ec892481f1eb4fa5", - "0xf8fb34bf78ad6d52be6fbb5472f13322b506f594ad3b585c04f56ed8d0d9afa1", - "0x546937b89a4d3b59817377b9c2ffe9579d4650cce71aa26bf2c76c571ec495b3", - "0x5ac921894e98005d03aa42e8fbde7ad0af0401e350c8ba98c01543a93b37dda9", - "0x3cc76dc057c73f0e0fdff28d484a092747ca42bc10989c599d0f597ead6024d9", - "0x1992cd7e94e9ecfaaebbd08d91519d6b67857db87e2e67c546371738ae0d2d0a", - "0x3604be694574c05c63d69cbfbbddbafe3cb425d75a13e69d61b50fd8d9c947a7", - "0xd1c82e40206d2a89e3a1a40c4a1b63c62ea6fa0847ddc2b25f63cb9bbb4a55b5", - "0x66ba114d5bf45d50e9ab9beaa879ce18d02a8b4f989c29ea7e9ae604593e860a", - "0x94f74c09ce5fd1c8fcb9cbbcc476af20fcfd9cf01c7ea65c14917da7b9560ffb", - "0xa4e154ebf83215c3843ecbff1dc8f646f221505c21d2a76f47d55466d895f1a9", - "0x28c20a0e95e23a023678443d7bf5b2421975b827dbd617239dcf26bf6db9b255", - "0x55d8ddf586d61e137482e3f4bfc1904ce4e04d21c6e7ac4d8c7d29b1483c8c0a", - "0xa9e1aed191a7a1a92bc99604e3b24c02356ea378b16de109362aefa2fa978451", - "0xd543ad635db78b2518681654f98a32d227fa6a1fa9b7043ad12cf58c91e8f729", - "0x102fb87da8b57948fcb763d7b797233f21523545f78388d8d05c6d7f2a4b388d", - "0x4e7273e2a92e897590988f38f8b899879aa1aea754fd5165364e8b98a66e0d62", - "0x5a06544527f88d9fbbc5905742863d873367d99e574d75496c59caa041e2b612", - "0x6a8957954db14594746daa61f907e4694e2a749ff53ea6b1dbe77d7d1f378d22", - "0x0debcd48486aa0d33a783caec0d6fb1256ffcca39071041fed7f047eecde8640", - "0x9d0a9b13dab1888bf0eedda217c501d76f587ee9a8765bb455cebcca0b705599", - "0x30693bf8c9bcb6bb4187606f98e138700e999d8824cada72d3d07f8c104fd263", - "0x494ef870dff64d1d65b4ae4b49ff13c145a6058876eb657751d58c06f62b5032", - "0xee4150e64f9ead8124d50d56fa4b6e6d185fe8ac385bd2a9db7ee991f6e34c02", - "0xb859d7db7abe48cbb9420d008d94e8d47753cc78962e5dabdded9438bed56b1b", - "0xf8b1fb734c345111704d73fe6944d0a274964a347d7dc5c7cb8677104829f5ce", - "0x5dc002623d9b3b872900b0b313ae8520009de730577b6eb2e2de18ae5cd4ac94", - "0x4d63e346ce7e654db6f067e8348c539ccf622d84020812724b936c19ff4f86af", - "0x2ed43f4e5d6889f5379e42d4a06de7c343080da74ff353960e4cf980f750fb90", - "0xfc61d0c90ecb073c022c87098045b6ca3f2b66c94f3723c679d81ac652b16f72", - "0x7e69914b56984b8c7cc9db1732c3d2d32969a58d6662509846e6faeb1305586c", - "0x0ec9b1b68efc96fc7d831ac7316e0ac0d908bac31be330d905f87b136556c241", - "0x32fdf6c25f6c741dfe468289cd7f019ec3a40c5d8fe882ef662b798491c0dc34", - "0x1ffbc6b29826aa58595d1a412fb90050f2bc3cf0ebc5462f308d4c8d85a1eb59", - "0xf0fc93cc2868cb9828ce16463e4cbd59637672d5815dff03aec7f3e1424eb204", - "0xe404321694894ab375f5a65c339f2cd2a53fb5a10f312082ce019681f6ed64e5", - "0x81ab1f93747c4804a85f56b0c6eb61491b958504ef7b898fb1362eda9b394e1e", - "0x1535d439d0043d1436de963e3eba47335bd7afcabeac4d3fc3f342396d3538be", - "0x42da1b95481bfab6cfec59884bb1ac7572636c8f489df2768fe2140cd2702766", - "0xbc3fd861f6e09efac1782d9d383c4ddb9b4268216fbdf3c25689162628e36cec", - "0xcc74c3d8b44a8cd23676babb4efb0e67871582cd5686fde9de6a052c5bf91ad2", - "0xbcd7fe80e95bbbb5ac93b1df5ff0b8e921e7ebc4960877acc1a95c478c65d64c", - "0x045e5918fa69606b9546f5fe83cd9212000828c54f9cab856f85d3a22536a751", - "0xc0f74dbb5a42bf1656698c37aeb904a33e969099f215a7efeeae0024c3a409d4", - "0x36d537998634f2dcab43b387edb63119c0f4cc68b1979a2ceb373089c531ecf9", - "0x87c20426fccdd225bd3b961c7adc1de3f9ac9640f6d26bd183f6e528089922fa", - "0x195ee1daad5c3d0052d6d633eda1c9f7160d488d4bc54f4ac3babdbb678eeec9", - "0xf9a5e6735f9c5577283e8cd717b56f69dc8306b23781755f2e513d15e6738cea", - "0x3e5bc3e78ae33367ce7450c5da7436f1faf3b1a62d238208df207307762688be", - "0x123e7b4f7e6b9338df2827a238a266376a20a1fd065e9f8a4446fcac4c6c92fa", - "0xf4eb14bfd197d49c42daa919322f18228d2d9ae2dac6dd7113c5e7d12d2ef866", - "0x78836678c20a40fbe09849fe190a9e74ee070f2056d7bef85d0f124676a93130", - "0x7986f7321971519933aa5dd507074c7b007328a7dadb8734eb4aecf732703fed", - "0x14485d24b7e90fc39d91ad6051b7f596d320b1f88f54fee132e032753e59a766", - "0xa80a9a5db758bfacf831a54022c85a838e30c8611ab4b17bda0641994302b59f", - "0xedf1814fb78abf675f3c5671c3618e5e51105647997d6dea6a0cfd1f0330bf6d", - "0xa91e9fcdc4f2b5e029abdc6b2523079bb4a2f5346d8a5a674e3d5582b8871d1e", - "0x3dbe468159a8c068285c92360cab488a4c1ec37487dd54cdc0b70e6d7cf074dd", - "0x69877439effb3388639ef6e1cfa132bc605bd8a0da053bcca23d82aa453d0040", - "0x6751d32ee3a1244532e6698ce57cdd0a59f99130e1e7e004c2751bc49d10b355", - "0xd1760a4f6e5a7967985125d2deae8bc783e47b1b85e19fc273e33eb2ef88d271", - "0xfa934c087923cc16f636615657477c48c082623d7cdd35508571655dc14efe57", - "0xb6b1e4387e04c4ddf88ada0aaa162345cd43e54482fddb4297e1eb6f8ba1ce74", - "0x3988089edd46b57c0bc83b1bfeb0050b503cbefdca83e96f1c12e7ea80688a79", - "0xedcb1bd8b522ba5155965cf18c25a090be2f8d7871ce60f0f371cd033d5a31d2", - "0x2f887b56b317e9896698ec9059d36aad63d54d95a01d389aa196ae12e562ca2e", - "0xe6d6b89e1d851fd24cf54f6b60c6c93a8b014ae30906c156374d73605aab3028", - "0x177928968fef8c6da017b177f6be85851616775be043b64f72925e6b8a4eeab2", - "0x71a3de323d9a600e15c25a5a6e05089d849defc3830fd69738f548fa4c57aff2", - "0x8e7d92f316f96b491e4831f52a799846810dd032bd720dc891195739192f3955", - "0x12a3433e8cadc005ac35da334d557c8cdad63576613f07df8c3ec9f528e846d9", - "0x1406da1f5efe9d3de6a829f1219f731f3ac875c7795f72b5a9ad25a57970b9d8", - "0x15a849a0ea56a777e00325b4af4d9996747486cc9893c08b0773210306193521", - "0x6178e69be88e7e93878b731d062b29a34bf2951082b947f35f60fba2c8de62b7", - "0xc4142d4fe01091e82626178b66c13243c9b35de0f07a49e3c5f2ddc15b39feb6", - "0x8abda6239557236af27a2cdfbb4fb91a6b136931c53067739578ed13e1b0a2ff", - "0xf85615d9337092e25080430cfa0b7a24c97effd422a1947a4c07239d5221418c", - "0xf9534d7db3b5fc1bcd7033ade59fd66bbb94a5bae91c4acebbb1540fc8bd3b67", - "0x5ed0f8035d3920d6e94b881cafac324ce5688f8c97668715733e0d00733b0fe7", - "0xeb6c474a0adfd84c79b86090c793697c0bb39d6cb007c725c2ae7afdc98df5a6", - "0xfbfce3e019b0b29ad03fd9146fa368f9965050b40733ce297bce6acefc4668fe", - "0xeda9ed65fbb1c7fcccc91de519f69933ae66c8ed59fb65f64751ca8aa06030c8", - "0x359ea9df33d466b5dc210ef0e99f3b4416ce03a5439f49b4cc4c1b98b22a21b8", - "0x14b2e8729b70abac62120541229182264b78c7ba1a1a379ac8a582aa0bb0d739", - "0xcec0dbdb55f92191974c2c8ed716578c5ba04c4584a0770fc0d7d5cfbdcb2717", - "0x07334b05a08cab079354cc1f7a945caa3c633de89a89c18244de81ed56da850b", - "0xc58e0bb71287fe92564d00b5094ce36b7899c346679011e52b73eae45bace19a", - "0x9dbef45ce9abb762bb9b30b61456a90b74b0b6f5b41af9500699542d933f9535", - "0x3cf848f770e15e7f682075c77f7e980da6750d3d4cb038479983e341eea3c354", - "0x608a4c5958ef3b0a324a7cdeebcc3abae89c1371c949d6b269b2d3936d9fbdb2", - "0x66422fbb9044305317d900702c2f99702317a8a83ccae0911a2832f623356c8f", - "0xe977f86ae4c5b350b350a3d6af7fffdc9baa96d9a7cb24834e5dc4797fe39fa8", - "0x6f56fc66544e099797cc3b0879dd20b21796ace01a0029e0d8464a3764d1e858", - "0xcaef7878c703facf29fde1467dcd08b03761872f598f42f5c56b4cb367b97255", - "0x9055cc0c11cbbe8477c7dd35b37a57e7994248c6bde9ac05e85717cebd2b970d", - "0xd7b08c0ca8abb9f07e3df1c4ebdcb03b0ac2018a905d1c78e6825d2bb5ea1ffc", - "0x0184cb109267e58d5bc0193a04548f0c2b87286ab6b03a1ff7b6d88a725662ef", - "0x3005e0af1ac0c5fd6d58328c06cc7f5d89c8c4ad173106fee1a7e37c9f2dcb95", - "0x8f7f8800d29c66b4fb12334b622fabe1cc4ef06e4ded44e4315efc381987cd56", - "0xdf74e3be6d22159e0e02ce3b8f0b405e6469557ecbd12e4432d52f4ae4637bfe", - "0x2fa9a889f958ddc41bae5916657f946273447add502464674658bcc257f1af15", - "0xbfbdf04ab62a35b2f7b038b02d8c37ee946cfee18e10ef8a4cd5409a5fe81d19", - "0xc4e834510182950161a75a843352b5b46e246a05b7c7e47240b6cdf7e18b4de7", - "0x2534be362fcc238c530f2ce8f64a3366d4003a21e6f32493a082b7efa1d413d3", - "0x628e5f76af96e64ff34c52cc5d07562e72c53e7bd4b7585cbc83b7c9951d0d2f", - "0x41687c81b22f67e4ab6ba0163da6d58c81d94c5db20569b4a42fb58b7321a442", - "0x50f55f58cd9768b611fce3ff13e8da9195b1eef5d0a618fd27f7052f88c8fd84", - "0x1b64cdcbfc12c42e9dbc7a62a1f8eeb0baaab8ccc867f7a7308c88e4968eb9a9", - "0x77e9fd9a5d64b66cb901c5795b9f66424638b24e457024b5e71ffbb79ed8a863", - "0x35644de61c2108bf9d49efef164414cd2594ad4cca6bc421699458c9bace5491", - "0x172ded87912492ee521f79c1ef22e42b1d22f17c3286575a5d419fc00d928199", - "0x3c8fdc337338b107ff5879b3e95cf285b5128ae395c4b89ccfd05a3d942887d3", - "0xf4b22643ebb6d46cf292531792543f9699a99674978045b0c911818211be6017", - "0x783fdc538e4505d4187a0f341b066007caff8030c3bcc4bf49ebd31a8f6b4794", - "0x38e11f176844f680e75b65d5225533639eb522f39495b9ee426135097e5e8fab", - "0xc5e0da94d4dd6e29c8bf3684177a62051e7555ee87007fb07581c885be598edd", - "0x317dc456dd095f9eef53781c214806beb31351cf78cb1854be257b4039324b8c", - "0x5bbf954741e453e3157dada0a69bafb9ebc63c3dbfc0cf6e3fc937a1b14b7356", - "0x56a5354de5acff2b904c5b6b976c473277ac2364571c54583bd682e76bb3f43d", - "0xc37f17385f4e6015cdc8083fc750499ec8c9063544102eb0e3e3b7e0b5046946", - "0xd616c205adf0ecf00c7563fda837e94a4f48be8560ddd15d93988cfd3242b40f", - "0x1ecefd5cb0c61b120c227274dd60b42e6d25229517b20dc3e37a7c3b436f0e92", - "0xcd447982c518db12b8aeba63b68d8caf1eda6bcc44400c9d83c4e4d64b4e949a", - "0x3763ef2d96a89a302260ea66e22e3255001ba2f003770c03905d4f39d8ef6501", - "0x2fcc41e9b574af5402cdce8dc66d79488cbd5cf960209918863ac9526bcb6a70", - "0x17b71848876a6e0a8857f1e5d04762734678ed1a8addb7e378915a7c3f37c981", - "0xcac9e4641f50d52d77e0e77b1a1b5fdd25cae239864367b3d99026d3fb973610", - "0x55eabf50cf101f65e51dd3a54321c1897a67c50512c534ee9398a716a790ffba", - "0x49101d5719e4de5e4e88645de3c22cb3ab794df815555d4f22d54ac6a59f73f5", - "0x509cd8530c28cc098b0aa80d3006a8f71ac7ad56101b880288658917173b8c8d", - "0xdc0e15e6d321519f34d40c6b2cf5f6955c15af815dbe02d84606ed76a01fdbb8", - "0x0b8e107e7abcf80e85b3288786dd79f949449225315c9125730d7d42f0ab9cb6", - "0x07ba997ea28711f221ba26d724a09a52b2737b8aa8532e890490ad811ffa792c", - "0x713775500194ec8691fb540d63e99a70cd443e5539b5f8e2a993266bb58266ef", - "0x3b2ccbf35ac833e845f00329c1f8d130a3f804c55aa83c35421adb83749213bc", - "0xee82c15eb18a075b00de8fd610621683dcad88a19c1c507351b5be0de0c6c4bb", - "0xf874298782be23045971092d8305c469a309a1a33f6cfde7604e6499d2384cdc", - "0x1a9d88cd641f6468fceb32eced3710569d511848f393c2114ae33d7f36c12f3d", - "0x5b2b8c2ba5d3aa8a0503d14e759154d1f2f46d819b363025a77d4cf5e3d83586", - "0x0082bad01acd43bc2c504f66ae28056ce352257b7ba7e2c27dd36d256c079561", - "0x9c6e4e01a831348ce64da4e4bf04cad5f58749573e54f1062b0e2921bacafe74", - "0x600e1b0101161721066952d71401f8fe6e689b66b26e2e74cc924f5e914e8eec", - "0x8720d215255e4d5e2a688096506d5b25c3a79c511d8c0b3dd7ad3ccf542e9abb", - "0x48baaec9724cadc4f7cb8f10549b8daf87b2572151cdf9308b3e96f02b048f23", - "0x2adf0f56fb9bcdbae394025ae949e694e01599887e50c355c90c3ee5ff32eac2", - "0xcf78410476d781bae1567f3d763af732d2ecf56e741cffd1bd3906af83de1f2f", - "0x4e7e223f6881065ee722d6ff9603f1786e4e99292e9caaa75b7b1fe9aef00109", - "0xfdf0b390b0395f007b1b342065096e0a8da957b26ed4cdcaba432a202ec12b65", - "0xcd40d2df140abc1228b2e1f45b5d65a0f3e2ab8b7e740dfb5376b036f63c1c2c", - "0xa491347f128d31f68cd1ae536d8f982fbfa5b58d855a95219f104db741d3d2ad", - "0xaa91fef9cecb842de4df61fd1650267420c8336758fa450f87ee867ff1520905", - "0x75d1574bf7b23319a7c8ff6a0a7cae649313aca8893ccd223f1f77fd71c9b8e1", - "0xc72491916b25756e3f505081b7f63e32f3289b86cbe0181ac9d33d29f666b9e4", - "0xd446465131b34f091673736f70fa0508ee7065c4011359c302a603b6159cb52d", - "0x1380689a50696e1cf0c19869b9773528f01cdf20b8f8a6c6a7165fda31ea49af", - "0x01cac6d9deb56473681c02dc753351feda402a1a1cc2b4cc8beeb23884f40760", - "0x3f622e134dc529c5cfbf58a3ce91d57850578f45b77c4683b2dfe4530ba0826c", - "0x016c95fc875baa0a5d1ae22c8772eaf574a6c918510875f1000d65f3a779dd04", - "0x86e5f579f42ea54a96e622f4a6becdc5ae85e0d0af87997fae87b6707abc8d28", - "0x53d403f0d0f1f30d919ad7212cc5e2e73cb4870c4fb4e6d260d2573e9bc5575e", - "0x961cad0d17fbec30a8f614ff3565d12698af096e61836cbf1f0ea125ae3ed72d", - "0xc9dcfe7844bb4ea845125bc3674f326c0f178c5cba4349b9461e40bd6ec68c3d", - "0x894243ff80e90c4c4676583b4e428f13e077008d225790a234ae215dc53d33a4", - "0xe5fddd80d3cdbafb53e0cf3c095d33904ac8db83bdeef9816111d20384aed444", - "0x5c7ce294d82fe6502045664f7d13d02063ef24f0f4960e4fb62bb6abf08c63eb", - "0xb33a5699ac121a51c0074b4783545a86a428fb239b4307f1e45108c85af88617", - "0x37168f3f0220f50ba3cad0a558cd8b01a7a435b6c3c5cde98b420ba3b54a1cbb", - "0xd50928e60d00c23adfc916e7f9a5363fc8c94c8edb3aef41ac1dc719041f92be", - "0xa08b27f437ade4d527d883194f79927053ac55a3293487a65060aeaf4c4e5147", - "0x326e2d1f45438741b63d346f0da55066dfe0284382f1b4ee54b1d5552c4f7d83", - "0xbd96baee5835d9d6007b0b5957e452d71d1ee31aa6fde99796cce59b17dab703", - "0x1cbe90df49f8929ce1052049bde7d6169efe0b289ad4e05414a8e7bd61788900", - "0xa0b914df37895be6f5341f3f4013ce5c61f108203dbac4ff205d5f1a581712cc", - "0x1582e61974c0bb5f9f2622d70e772f3e9ce145be97eaf5a87ad794268cf352ab", - "0xe946dda774c96c7878a0daa686e4a22e0d9d36a88dd9c93b1776432adbfd68a1", - "0xf88a07db8c0fd2a1354c38617c16b4d2e4f8bb43d9049321ce47a8c03c8430d9", - "0x2adb489b34c480267927daf3ba3ca7567d542edb83fa82e8040ec57e25e3e6d7", - "0xf1c28c6daa3e97466d50d9780bd3335f3dd096c3389b906bcc12426ae4862a99", - "0x4457a8686a3839b7d3b592a1751c25b216bc64e9d0b8a81eec55601ab8d8a98d", - "0x0ea5d5606c5e81f92d31b49b2e54ce6c6314b13ac223c83094280d0196e003b1", - "0x33a91da49deed50914d998615077c5192be56e482ab230bdb3d480d283502e2b", - "0x5385496abf2e351c0cbd7f6fcb5bf5b5345783b4e512bdfa23b9736e77ea43f7", - "0x98f808b18e5778a1bbdefa3f19991a3d008c27e9976db0ce77ddf9e4e21a0feb", - "0x5381dab139fbb0ad6b61afa35c541aba559e2ac25c4ab1cf8a756c2f27c6bba8", - "0xf4bea5f3ab0bc9ba3ad00ad79402d1d62da125d311884f225ad8abe9fc36d56c", - "0x6018a9f7edb5ee7ada70c3e85f22ac88924d06031cff3f61104ef52bf0baa2f1", - "0x01cc4300f1cd2bb4948329d42e17a277c7da52696d46a60442b6f5600d869faf", - "0x330240c95bec1ac1a476cd202aa74e85db562750f860a9fbd76e813f16cbb639", - "0x0809c487d45161c3b85cda014603ba7efd6b67a8c7aaf314cf20c880ec623a7f", - "0x653f53065726f9a7c1b96ce7d836acca515f563a47c9d7d47aa8c5c030a9fe6f", - "0x37b8dd7b2a844e519f9eadab305efa5d112266cbbc76bcd5afc119e0dd337ae5", - "0x385b7031eafc345ed353d9b35dc53010496db172cd906f8e0b7b891b84a65e4b", - "0x38259038fbf1ab3f0ffac98e6b312457f6b2631f68ae477b9302fe740cfb8e50", - "0x5a963aaeadd708291b41bd419cf2ce0585e162e0d46635902b58ee85e317adc3", - "0x881004f4fabe3e7642c8cb5e99dc3909da28451ec442a299f331790c8065e049", - "0x3c721f828959782052312d30d8256c9351a141923a9c2e2ca5b605f3a92cb27a", - "0x3429b149f860e963ed3819ddf19164977d637489eae313331c71165c7eb8f824", - "0x44e291345b79ff4116797899da20baf28fb9d4d2a5d6b1661a0c83b8952e481c", - "0x00078c007b6c0b3b6603b0838b03ee9e8944fe16f99f0a35eda286a288594806", - "0xbcd3506338253f0df5abf0c2866cdd319fe75bad7ac6f18d1f8201164e0b9986", - "0xc047f5f06cc54e4bb54c8e3bf22245d68c18b4787a01d324deb2139d7405814a", - "0x77ec49a04762af36eb63e2bb5c5cbbf15b580020117639ed5546749e34285195", - "0xfce516ae95eaee4067e95a5752494974ebdd182fa47deab70fadc5afb5ea8648", - "0x2ee54548e56d2cecc3e6cff4e60a7664e55d9b1c1c9a61be74bfff7635078cb3", - "0xa79dce8f10567e060638cb2f09ead0b191e59d972c532a7e91b33d27151cc23e", - "0x436b4cf10f5cdbde72be02ca16602190a56c77f1686533e643c885351d4657e1", - "0x9070c78384138f5e17cc9e6148c7cb7591eb9864f042b82ad38ee263383496c6", - "0x12a8d5285c871a0b05e370a337834458ae2159b5d8cb4bc93b6cc83bf7351b68", - "0x3c07d35ea209492f4aa811c51202f081a3bfd6e31705ffec497d70bd59b7a6f2", - "0xc0a99b851e0fc4655cb3cb43547f4ae6c36c350aa71626b61ed3ad3492f04600", - "0x064404380c5969d8e43d759ef990658d7cf5bcb7b4f8512fe58a7e994e199707", - "0x3d3a61c95ffdd3c7f05b3574370bf4cf0eec605ca27cde051b5d77e062315f36", - "0x9259e0113f1e009fad7454eebb238e0c7f4b7aee8118b63b6c05aaa2f0bc39df", - "0x76ff9818e62b25fbd698ea021e200ac9314090b801e000ecddb71bf4829aec8a", - "0xdf0031d6e1c55717102ca1b3a0bd389cc0d227f0f804396d4b84b5dd26abb1ea", - "0xd0220e77632c2353d51b92b1638e909c1f41a7ab0e6801b65e344ab594f48881", - "0xb15fccf30f298101d5ca0034cb8585cf14ddd76d58f3a8ca71a60aff0d0438f8", - "0x5dcb3817ae05b8c8490e197cfdd3f0b701e61d83b8f6423b3f24f27ba0f4c668", - "0xf3bbdc6651a4ba011443f6c6542b3f45b8aa2ba8bc719e7220578d6362cc441d", - "0x1edc95bab3c88a66246393058ad1a9557b371e726adaf261a5faa535cb8fab76", - "0xe02975b5ecb9fb8abecab35298704ecc476d2e6205c2df900312359d5aebdf9d", - "0x2a5c9b033738fe9e7ba6949df526b5a735753464b746e7d1faa29491a8e5f57b", - "0x46ac373df276af8af25aa1407659a8e85ae12b51ea6ae0150ee2b80a76ea6d9a", - "0xe85513a38b54114f4b6cda2bc81a4dcedbec22749cab6676c061d95c7f38258d", - "0xacfba9967af17aa94f0bf73c3b1cfff113e14625742a7398a25a01aa29bf02e3", - "0xd589df920ebfb3c3c1660a16f74213dd6d487ee577bdaf18f6279eefb9252c57", - "0xb2b66c26bd139976ffc2471f8ec71e353108828bad5094a324d1e4762f5547e5", - "0xeac126eb94bb1ba443373fb2556753d95804891d4763a2cdd1d297f1eba0fe6b", - "0xfcb52c727793003a70941fb01bf6c184890a691b70c0aac3b11feb3987de8628", - "0x1c1b6aeaea826ed0cc776a322454663ef555adb0d3c6f50480957ac4ab7f0672", - "0x187affcea64fb6195ee27cdca1096142898be0fb8f216f10913a744f2005f7ab", - "0xb4e42e3a4c94477a6d5d7f3de429edee7d92cff93b647c71d7a20c1e07a35117", - "0xf960751197118967fcea65f10b51d9568c184a8bc968c609d093a0f6c15a71b5", - "0x0bb9ca3521abf8fe971d371749e5c2258b1fd4c681ded047d6dc7820d303fa9b", - "0x52354e8e99ecb5c2dcc1214c08901d715ba62a7463d56c76a6bd1287a74f5c38", - "0x8768dc0cb22a0ea9fde00170783fe3741501d958c186e2c636d03fdf8a995129", - "0xb4204eddcc9c75372de503645bddaffd3f71e8554c3bca09ec700d928a9664aa", - "0x97c94c63bd30754d51abf48aa830bac3724cf77e366965e9f61a100cd0136714", - "0x60dff72f08506ac9ddabe3f957f88a1ef4935f187b6c536643500d65512fd393", - "0xa94f4c353581e474a091655c78c491c38315e93e287f848c17843d807aae3527", - "0x09d90469c97087fd45cf1a2c5471c6e81e0ec1e7850dd76b0d0cfa9fd49aa13b", - "0x298d03c60b8dfca9ecac182b5c0f6818a4c3d84e55314c083f8913a8746fe335", - "0xbfa7ba8daa97bc681bc6ce413494b85ccfbc10e2bc96e148713e0325e21b3b60", - "0xe61dde9cf0c1c6fb0a37993df24dec2f221f97bdd34f607de13fb1f947e7f284", - "0x91e9a9e65d5076819146b246647b9698954bcf55e7f059db32854f93b325d35a", - "0x7bb2fb25b881772f318a10b6ce8896712c93cc85ce9c7c371337020e86817a3f", - "0xbfdda2258ccd28dfc81f83ad7cba81967120257392279c7412f0bb116605a21e", - "0x0a626f29328872380ebf6a10468307abda5a02c3a7b9e04763c0c8c83f903df7", - "0xaa8ee86e9446a125356a96f8ed47c3821da54b003558f68c823c4ac1ab966c81", - "0xe26f3cbd95e0a26683c26adfb71b6d4fc82b034171f29836cb9bf391cf172376", - "0x7cb80eb383da7d8c1120fbe79cf3bff3e5bf19b9f57aebe11f79ee23dd82e611", - "0xc9b85149830b7a2dcc1f613f40ae232bf5cce7770780bfa7c77ecd25ae0bca6e", - "0x859dc28f93d2f3b17e176aa8248d6720be498fc85017491c68d6af5f4798b437", - "0xdcc4dc79cf88601caf6e038bea275a98208d221ac8d3efdd5db3d2181c14c947", - "0xe1bd63a920d45b05efe5d2fb99437a26bb7049ea5b183e99866d6dae947ff724", - "0x4aa94bfe1501f4d37b0c55d77add7bee9bc7f24d444a3ed1c6cf27d67026bb62", - "0x10931498b823a9784c4aa3ece5e88b477050927fe4016e4b10de7e2e0eadbdb9", - "0x7f30cca2119b5a4107cddca59a88f10ad95cfaa879d97bd1e50ae6a347e71b1d", - "0xcd8a0dd7a4fa9b97641d5288375105273c9025a2c9f3d7d9d04179fe3f55143b", - "0x6c8ec850db640544b7e5b22c19253dd1595899a7663d40c4fe13de4258cd60ca", - "0x06ec895b6dd7f299edab3e2e3a65322fb7f8fa8c9a6182b7af4f0fa25acdc45f", - "0x45f6d74f05f7b366770428b49630e836c2fbcc72133ef03a1bcf9953209e693f", - "0x3d868a3921aede543f2bd8ccbe3b51468e7a87f8278e4601c4a8e740e8c339cb", - "0xc808c8fa7b02023e5c64999a141edf6e0ce0239e37656e0fa7c5156443f555c0", - "0x82c273cc2afd955663515932357f19d657eaaed2824551814706ae3843fa1739", - "0x5785f16929a6a73b4621e75d31958e2e9b00dcbf3a6b38bf3ed59672918b68b7", - "0xc8f84b888e55070682103999cfc315ea3d157d0771f0f035cf2ba03f6fe1b1f1", - "0x343a05e1a5e75e09528f194394caf6ca8caf94904d54d89c9d22abd5cae0d83e", - "0xddca7f95c2d9cfdc9efd9158d29045ba92a71d45488c40d28b257425c1c56bfa", - "0x008a2b681c4691d7e0de476180c969aa511467f27755d0d498eb22c9b5333835", - "0xe33fb40ffd6253b5701d24c59a4e217197f9eb7caf7c2223722734f4c74fca4b", - "0x650e8f1c6c4dbc76ace7d6c29b9a659d520af9b291b389bfe3812c1ccbd07c58", - "0xf88c36b8042df77734f99395eb68aa9f4b67a21891c42350e4d5e3e6d8fdf168", - "0x882c68aaa8d1f6acf005ce2ad3a6fef7ec1212ce610dfb8a7bea9417d87431fb", - "0xda73d75513895d5bd5174814da25cddac9a633507960e78ae6884b92e48ee699", - "0xf07d98594c0ecb16cfed18adb9f7b5b1055630b43444c70e6357cd18ebc09392", - "0xd70c5886426c55dda997d615d325b5cb5b652f5673601a045a113d94a17715c1", - "0x3e8dbda1f53c55fa4de65efc7d294a02d78c69a98d59049dcfcdfff6b7eaa521", - "0x67b14249f9c987298fb00e0bf560a976dcaa7fc0d02e816f84c3bf7a4e7c6901", - "0x4f8affa83492afa72e95a36f23356b46e58a0a19ecfff6960d4d6e5b9877b1d9", - "0x09cd2a17655988d2d8cd5fbe44965a6c15c3f123b75e1229621b9ab74d030e53", - "0x30693dcabd19e89bdefff4753cbc64d00c65a4af98f782e6e67b4e84f6b015a9", - "0xf67db822aaef8bdf7967c0dbe25015ff6cf88ce21e8bdd25feb764828ee64951", - "0x9a587510721ee914cf8b9c863859629ca0c8ed22b0aa023e9efb0756d3f9ee5a", - "0x5d00c0a840b96a19679736a7ba555f3e9bc5263b4b8437d6c3779191eda0a7c4", - "0x3e01cf22757510938a5aeb2ec6cf5046b7d3c186bafad7d57b81c7d2a99415db", - "0x0ff2d3ed3c5acfa5db9f9820a1a314865e266a823ab42f40bef6b0276af0a108", - "0xd3207e322207667c614e50be784f6b4d9c3f48362dbb65b17c62f5f33e631ce8", - "0x2c3330fc9f6394c0b8eaea0d156f2b9e2d2da0ddc8837e0a28d373aa779df9d8", - "0x56c8542686730adabbae6717ed8cc8f0b974037842ea5d1c80901f7c85eef3fa", - "0xc51d8a382df91e9f1fb0dd72d416a7d094aa3b8ca4f90561e82fdbb9b78c28c4", - "0x6507fec75b170f930df2e28dc75ef3dd7313834c8a8a2ec837d4ac27fdc906d6", - "0xea23428fd27ff3e5c6681b0640264ff22964c49ab0aa41f592280ae25d380c83", - "0x8e2a629fee2ba03e333bcf7fa0261dadff518dfb0e386b21cac0cdb2c7c514cb", - "0x4b00742b5349bc9892f2d36abe2c723a30c4a20ea5b899a7fee8fd759f066fbf", - "0x5b8d880357c44a79c0d04b5d347dc7c012f2f5cd7679c4d4131e5c481b45f1af", - "0x65d2859128eac961e29c063fd918c7a2b485bf72743cabb0fae8bb288f155dfc", - "0x3db9720d20d90d7d1ea448488d02015f4b1c36f556d704749723ae1c3a35aab5", - "0xd9676bad19db9f6896b2170e6cba496f5714ff9a70252fa1d4c82029435871a7", - "0xa36e49e6be40418bef884caac3b30e63fdaa1b8f622c70ede69e6d7c9c6f4539", - "0xefb40f7d197a63927f761d99596439b7b69cb7a39214258b372450fd471ebd88", - "0x7420e77f7230c7458f728f7ae5f63f0bb9182fd11ccb9a82bfcad17a8d1b4f76", - "0x7ce9551cd4cc5009d28a6048701049a5decbcf7e11904c588107da90f57149ed", - "0xafdbfc0bd5252cec1654dd24c375bf9f4af647cadad403923d6aa525fa44aa85", - "0xef0a4ef158ab6b06863969c24dc7ce5fabbd36181e9eb6d1662ce227b38f8e61", - "0x4e6d1c00feeb4218a0590fe046705fa35929767430f2c33b2176afb45f26a71a", - "0x604a1bef767235afcb7f84a20ef59d39618593def34034c67cdabec8f9436ea1", - "0x5c91553855f3a32f708dfd76c83a7d7f23aa80e5a6d2a7e9d83e82a333c9e267", - "0x48e35d198e8194ef83496392e05e3e14cc9c7ea1f324fb259c08a0f8385b422b", - "0x9df1a27224c2a20b229cc8686d95efb1570e822402c9df4db0b47f190c33dbee", - "0x020eb0cf345413cf0324f7561031eef27f188de5dc41bf38471547aec4e716ed", - "0xe9f7708c2cc8ee4785ed54a0c153730103fd92c42bb71eb4f86a93111ae11018", - "0xe7b3a27e3f5ff6fcf2925db134ee5db522a008db4d54627b729d5502f3968d08", - "0xc9c4b33c131365224675a89e4e6833181ae50661b114da50b14b0669d6ab7155", - "0x8986fba93ce8e336542d3a640d156029ea1cd99c2cc4e946de6d46e040e52bed", - "0x53b6ba779e5b91b5abe44eacd354f6f9b5b2343e66d60bcf5083ddd1a5147d21", - "0x854e090d7d5cacd3e52fed513055b51ae884965bf1146a629825269506f97371", - "0xcaae36c05b0992f80bfcc8f1c5d3a771feb88aa67f2c87b770637fa24000d84e", - "0x6992bffeb071ba81b30b8a6b19e9335f8eaa2da4361844bfd57f08488dab5975", - "0xdb63608d8eefa64871fa9fba1da1776a67d0c0495502c8eb4005eea4a0089563", - "0x57071fc1829365707d66abfb8e388478cf61a14f34af2c864b7299f6bfc2322c", - "0xe077cb6b750e158f666ea79aebd5e19e25b9d3694ac7a44efee1fe58f2bff202", - "0xc8180f9a9292284d2ba09dc40f89595ae6b554e6eb0c96aff578725076881102", - "0x89eb01b1cfe4089ded962a36ddfce84eb0c4337780446cdd88738e7241257c30", - "0xd1bfe1dbb1c9b6a06a1c18472ed66a82ca5c7ea1fdb5dcb9af1347e6ed97697b", - "0x33695a8c53e9e16e1a2255055eb069d9fc59436ce0ed698aa7323cd7e078cd96", - "0xa1c746d3df0eb28100b84c6c91da402c5c0d6a8aaee66bc05095820764cbdefb", - "0x3dd355f33c841eab61323ebfbe4a608b3dc9779a291651b885383ff70b8418dc", - "0x206c8095f502a995777d4756949d8fa7deeac36a106721d6bd1c536994fc8adb", - "0x95a9ffc34a966a157c5e797e3a1d0029bbb86999f1716cbdcca9bdcc5e77a5d5", - "0xb2c4e8a21c25d7cdaeed3a42b8670602580bc99ae5e85d4e36771e5cc2b7e0ff", - "0xc34e130d5fa9ae3df02c54a5eecf210d8420db5342af4041d77b8ade44d2c67d", - "0x5d733448fdde29b3f3749e70addbf4fcde659aeea24f90dab23997a696db5daf", - "0x8d63fe21beb60523466595253d20fe518dda259cb44fab5945943550b4e960ad", - "0x98e584f6dc76ddf7ab116d2e9244d0a0ecd99d180b1916957054f8440623f727", - "0xeb66965a23c4413fc5adbf4925ec5d133d2579c1f7764d6199eb4f7a5548aacc", - "0xc95df33729fa401a40bb0ca23731b61d5225f3ac6d159f243e1585440e16d529", - "0x2052d0e9ec0a62dcc0d0c892e7e704ed0ce03ef8a8e9c898a3691a571abc5c30", - "0x1f8567628ffc96390df8b7b32ce8ca70f6d8bf57b2ea0bd9e724c521ecd4747e", - "0xf2b48a4fef4c6c6127f7194ac76c57167cbbd65b9cff702daae1ae21dbc2896b", - "0x38dcef1bcf7600494424ae0b24956deaf664b92f3dd60b7a941ea144d789dd99", - "0x267d1afa22f77c5fb78434d822ee1c3fd24740d6a30f3ee4fdac95949ba8c044", - "0x0c01005442f62fd12a49115bfee0faf89d2da7572dca5b0e8eee445a0de8ddf7", - "0xa8d05f61408ed491620865b2cef9548d88182f37784e190b46c36bb09dd2d7e3", - "0x655eba047145af7d76cedf34e144040619d2d416367b57c7b7d9362a9375889a", - "0x5233ac6cb0ff6a892fa475b0074f4b6abd8e244f2a665e6649232e528bfa17f7", - "0xea8b2976e790ed22d708bca311a5b26c113e8c0ea4cae30607d94eb232ccb0f9", - "0x159dafbf20b2e624d22018f214cbbfbbd83de406e9bbaaf53ba46041fc3968c9", - "0x4d34b229e010a2ef72dec76c1449cce6f61d9cb17701803560af6b2072850ef9", - "0x32e7064197d2f739695788a00113452e03306a4f73f80ca62fc5e3ec223aa176", - "0xd1604bdf1cf9253b7b0ae8c92d09a2edec43221394c258d29707ba850004615d", - "0x07e0048d3913db33c6a9b45a1b232a2088341441d398b09319b455f57c18628f", - "0xf6492cd50378901ae238c91685319405d9779a1b78f22bf36129fd31fe709cbb", - "0xecaad91132667d0b1a283da22cdac651a4036224bd0efc79bb747d0c5e64b1d7", - "0x20565b022a8a8429a79a56aadbe2e32db24748238fab33eb2b0be5d83d1343bc", - "0x25e6d936a7b526d45ce1430744f5f4b41cf694d2cc50753cc88330e3e2a0bff2", - "0x7130e4b84c6efae0653dad6e16ec677bee7060a8da8ac607bde7a2b01b7511f0", - "0x93a8bf0a86793725e09b480d9098a43fc30a8420c5c2c2bd01ba8afa837c2371", - "0x2690922d4bf86c9a35e982b10f723edae97bb2a842f362036337396c7d9f9d16", - "0xd26efd262c6605d3be1ccdb03b96318613cf2d5b80350eea826758b9fd8bc28c", - "0xd3b2c89961d6cce736a9994f8707f78068a9806044cc2c96004d659f82753690", - "0x0fecacd3eb8c415a8db644b4dfc0ebf04a27f9b5e53bdac80fb927f40da4a8e5", - "0xd5600a3afd0eaedc221893214d629260cea97d7d5335e361d43183b4dc678360", - "0x340558e8951e1af701e95a963221109154f12c5870e9c9b9c4d7f9975d18ff89", - "0xb2ec154d6a59610822ee2318e3f279e249067893f806b129f4f0497b42aecff8", - "0xcf13e6343d50af1b2ff792e5a694531077e67858d76b39262ad19d6194e62df1", - "0x39db02f0b3f062645478457da8145fec8fbbc8a0981be9183365fbdc11a622a9", - "0xade17860c7f456c0b8014490f3cd15cb5f080e7112b789028f1e86ef428c06ca", - "0x1ab544445bb5d499c541c4fa02c5f850b9d18988e94ac6992525e2ad372d4936", - "0x2c3b4b33a865fce54d1ba1909924b0c6cf9a14a8cc4e3a42e1b4eeaaf86fc50d", - "0x857bb3e657f86c864407a7caf0c6b71e42427302adb85c853f330d00433ba077", - "0x79e42bfeb2cd1191783b7b2bea5e0e2693d9d15ce8d230e03dfbeac2c90451f2", - "0x5ec96430d6d1c1e9395a214e1a685e92c3780a78ca94a173d0e38fa6bca96461", - "0x544858c87e845b1f80043fb44f54a2449d31a0018025f1b41309a745415b1e7b", - "0xa26f04bcd6a580b99e9b81ed739ece117ad357facf1ecea246f891ce740029d8", - "0x857eb2767e67873c3f1ee4659c778feebb69b248950068a828d65750002cec36", - "0x7d6ad830b628a38b1753a33e5df98269d351b42d5bd60329e4c205ee5f30584e", - "0x6cbbf7d83f87bba0d4b4997bf336ac52934866cdd77e7dead51de84bfb717fa2", - "0xea77b839435e70cac6a89e891b8d1c495b39d8d6db38c352e10931e70502ec20", - "0x4d6a29a4487600b0e05ebfca7418dd6b43746ce96a41d4f17e25cd6aa1a2b733", - "0x3e8223ea6ca4ff147b59b025237a2a477495e746e7a551045374b27798ece58a", - "0xbf880aea05a3e440f31777f109995f2a1967272eebd9ff0fac241bee8747a8da", - "0x028cbf04056dc0f407496cfa901a4491c659173083ad73f84d457f016e0431f6", - "0x68548e63888fe0f203a333f5a5c950b36aa35e083a0161304a2b80aa626358b9", - "0x385546df2f083f4781a8b9d5b645516f5a77883eb7dc8d5e399f4f563e8956f6", - "0x358a0c7c14057fef517c38de9e2af33ab44f68c5c99157f9429db596e822c842", - "0x5f89b867c11d5258618595e2afd3f783e8db81dad073d8871a33d179f537cfb8", - "0xfd7328d25120390f5982919333df927ba3c63331321678906256c1ac02af9a45", - "0x406a9797947503dc57776a5c2ed6cad71ed975c05e15ef191b310088049c11d4", - "0x6e719945fb48d4db24d57a92e4d6da5cebc1a3db4a64792dad68b06f92c69c87", - "0xe2e7b80879a7ffc1e4e3f901ac99d252c1625b6824000ffd468b2d09d2cffa25", - "0x179979b54792b23d1f1940550d7c961a1373f6dda048817d087ed6d731af73eb", - "0x10b1ca5637aee0b063bf3a2fe5cc1729929b9932cecad392d7da6d567ca82d65", - "0x89edc6ecf4b7f292dc26c29515ffc3367850e5a8dcd95979244f5c57f81003d7", - "0x2cbdbde44b43c5dc078433925dd423ea51886e880b04e90b156957dd6a057d1f", - "0x6953ef4d3aa2abeac14fa44a0be4979bde0e579cc591370b08774f4e65f95d05", - "0x0735cc7c85194d5abf6ca0dec712db94b6b009c9ed74ff6781b7940064cd4626", - "0xc3f9b62bea678c0683ed688b77767b3fe3e4fc86456bbaa8c0172240321242a5", - "0x3640c7a7a1c2b62492098e0b5b9f4c482add16a86c0f88f8a60eafbf28347ccc", - "0x73820554bf239c8e1b92304f3df8290d18aaf765b45c8820f618d05eeb80fd66", - "0x8b948d61bbdf95e634d5c3827c66266e3ee42b49dc0a29100efe0f7028d100d8", - "0x8c422f252ce4e7c981b93c24db0984962019394f50ef5b62cd34e32ba7602026", - "0xd250921e7c17e016360e0b79d61d6c19ca40ca2d84c9a7c8d9da04ae4676c29f", - "0x4e71a2075113014494b5cf8504d48cefcacf14ca6be5d99f945ddafed4b58079", - "0x40d0dd35a9c91dbb1de1df4202a50df1745b2a5e80b256c3542bc0cdd5a2c524", - "0xf77e21f9edcadcf7753c1daa00720e024f56250766ac6c31a89e8afde10c9056", - "0xc70a38751d11c4240f2e94698c0a13a62d0b3cd825527c1dcc5e653186034f07", - "0x0f4f7881dcee934f71ab555428e89e26112ef6e99935761f3d4f314bb5504a20", - "0x82febe35f996dc229d6f6e89ab4c15f5659860505d64d454f625c95284a307b1", - "0xc557d10c1d19c90ccb9a504d31b0d91bedfe9a82388824fe901e8325a9996dd6", - "0xa241dbe076d02feb2b67d606b8592c970d193b84309196191b19087dd74b5eb1", - "0x4f687e1fdd09e68deac949de2738583e0dc2bf245790b5185e2f4e00f5e8da67", - "0x076b44af8dbdd16f859d9604f91e8809f929024eeaa6eb457c30db2657c03430", - "0x1bf2736aed60997b49084afc7a3d2b429d8b8836183c9ba71fd61afbcd1b5f0f", - "0x18ef59174edf670a07ed5eeae04eaaa08345d384d33cba45abf2a08af2415a5b", - "0x30f123870658c6cb69ad9314e6260a5ece2d5eeb4964601d4243aa1b56f4e021", - "0x36ac3e3193b6fa52a7134b9e4c7db6ce746619bd7f4d07201362062a3f98be0d", - "0x6a9250440bff309071b1493b2db2b4134c725ae364fc8a8add7e108f7434de4e", - "0x557876702f5bc2bbe17f13c76d0cdecfa68b0fe281f084b2f343d130405bb80e", - "0x5bb14f5bb4abe8e79909035a11109385ea2fa77c4208946841b61f1dc8a5366d", - "0xe7602f83ef13f3755b1f99c740fc46211f7ade9088a1942b8ecbd5a33482c093", - "0x30b8ee6c04d787ab137e7bd6cad1073e4e77a74db657798cc74c79676de337f3", - "0x01067e41f6b5fe5a26009378b7ea4b0515aac9449eef2730de5efc22554ed10d", - "0x73dc8e186c096c752f8dc2a69805e1b24eb5edc7553be26d36698b25829ebfb6", - "0x23eb0c950ea1467134caced1d86eb89d4addda6f8ebdbcb85d9127a5ce0427eb", - "0xbd0f1080cc7c2adc0874fc6d89207221155bf414e1cfa3f9360fdc98c820627c", - "0x0bdad5419ef94ee6aa76e4971981e54f7d6560f3faa3531f5fede35cb2e211bd", - "0x8a339a58e2ffda5cc2ef1e18a078fa09c3aec4b2a8cf9b6094ff620fb88860dd", - "0xc9a633a65b909af3133befda06a57b3058d625d816ac978f01894fdd7b3295e0", - "0x6dea631bfde98ab2b7db165e29ea75316ea50137d15a30a9a3b444d50d419e10", - "0x0a74031d338957b9564500f28f0e45aa571f48e4c85cdc52d6ac8d472fb66661", - "0x5f9e646f342e665b2fe387bdcabbb381a71e54f766afe9a5ca6c2cf999b50e4c", - "0xa8691691561a9e3236c0a26593f1c49b42f03c94ac3124b16b4aaf07fffb14f5", - "0xe806b7ac21b2e7d80f0e4583dec620b2b3399f4c1adc82a246bc77c847024310", - "0xd588437c72ddaff5ad3a154915700ade8da4023421008956b1b3d1bf164705e4", - "0x2f12257a5c3c0097b274697e648df08c31a3f8cf0833e45e45fe76091c7e22da", - "0x88eb766b8fc471e455e50a183b728e6e7fd3b5a152440bad5d1c7f49e173dafb", - "0xeee35cb04632e48f5b4c94aae1a40c372eacf5ca773c9dfc2fb3378803a6fd2c", - "0xcf9d9bbdb883ac7d171f808738dc5ad4e632d91f45737be4de2f9a2605141f81", - "0x94ace01f0f2f127e2cb47dc05a491df26fff49f68cd4f382c12e7f332032bc09", - "0x8f261b4ff772d1c675fe16f0764ae644d198231daf66a600d56526c1288144bb", - "0x95062df2fc6e23916b7ec403eb5dfdfd8f0aff49ca15e0b743e5a3294552d619", - "0x9626d392247cabfdf89c0254dee12f5d82118b5449059b78b4fdf7ed62ffd688", - "0xc7b341b1a1464207bc1996364debec53e55a3212a2e18211a994d2c8e864e234", - "0xa5d247c7e7511015cf63aee2909dc9ea7bf56b9c2e15f1603b229dc7ed11a6b3", - "0x551f57a199b684836b3b5d6e6cea2c7cd58f830e870d1689936ceb93c652ad8b", - "0x0f0a17a40f9cafa38559a7b8a1b3848514f4b5dad4c4565f8915d04163f1b51a", - "0xd4ffba1b3fbb46554137cb0114feb898c9a1a689c0fcb4dbdea49a313c593aef", - "0xe72848f46d7f041226ed0cb38549fad946e14ca379fbba4cd52a3bc3d6b94c55", - "0xe34036fa757a07055a5ba89f39f90066237152468c6c3fd8e60484000dee38d7", - "0x0984ba7640b44fefc22e2b53463b91b6686b909d038a29039a6e5f84e25e1257", - "0x2fd4072edee29b9b611c38972835d3cc985befaeea149311fad80dd0a8bab088", - "0xc64954228a4067748447b768bdb34d5a434cfdfe01acf86a11d8a278ee7d7433", - "0x7b10e8fb7d81fe90362c7d3af0c153460ed3df92c1c50b6f9a993fc81e0f29a0", - "0x0c33f7aefb88bb9f6cb9061adcb5fc535b2a3841a6ad94b8a4adce1954bc6f25", - "0x21460cc4c2bd2d828027b9c04b047c06b1eaa83f47640639463cbcf603e4b7d9", - "0x9ea560bd5c0c6a0fa9cf2e0e14ddde39cca6c24b11e02b635bfd4ba7ec826e0f", - "0x47c9dc525e0e1f71e159ac75943a32d541596c9b479639e0e8f00a171a29057e", - "0x6f32319d8d958c89295e38c41c2a6106d9f6bd86ea19ee6cd3df34931a2701a6", - "0xf90b80919f035eaa3cd56d1c54f9c69e60ab2445a4995c7969a4826a28220398", - "0xb9ba6d207d1d7866e6205d540abc36bc3198b072aa5d52378a1148f6a61210c5", - "0x2f494b0db620ec08b2961a12d79585de2f6939bbe679a8ae1a580535437bb0e0", - "0x65ecc619942b4fc71b4477dc5929244161cffe2933c84ef8e2d5eb443394e0dd", - "0x12f573e148bbef501d4325a52b737580d413c8f999cc86cd0e497d9201a006e9", - "0x709c2a2f2276d712070a10d20baeb7d1acc602e6cd0d27438950707175f68faf", - "0x472db00ea142b38a076569205123d2ae53f42c1ff86d38100742039440fef89f", - "0x536a68e966effeda6883266a1f6f00b42dbd874d83956a3312ac30e430607bbf", - "0xfda5031fc6bef618ec55de146ed9834dac41afcb0d0521b34e141cbc0617d14f", - "0xae912c6ae86e69a59c61a3fb95c9a60b37c17c3ce2b6e9ae4930dea5fb5454a9", - "0x426c6889a4d6f3896c5209b662d9caa421adfa1f1770f33262807a3c89983364", - "0x6e72f8cb2b6cd35fb0c090f8be71b1ba790cf2163d0cc18dc0bf62fcb0658fdc", - "0x7259d06d38028ec544eeab2e264f2d4ff975f245c3697ea8e141ebd59733a2db", - "0x37729ab26688e0399334fa3cd2748818425b3fc41304fca56881658dee0b90c6", - "0xcbb02add11c0edd8105b440cd44a041b6f55a94712ed12ffeffd1817ae8a8044", - "0x156e069b3b63fb302693018293bcc0ab60b2ee2cc8aab43e1cca3774e0b743b4", - "0xb3a7a06a4f2c1034ef5a2fa5fde7554f239b0193093c74db11ebb5d9b1a18f03", - "0x323b6d191477aac18e4761baf8ff9ce70b1274a995aad02fd582f87285f8a0fe", - "0x7e4d202c5dc858e3a3c45a5f43b0804a4ff5ed53bce625ced7eb65db74e908fb", - "0x75446e5cc0142cf4b0f26f560995f257f87023312697b3574fe0e1f558bcda05", - "0xf53cfce4dcf415ea49360d84188b33a1b6e3c686c6e59f1a7385f68f3e160a7e", - "0x43ee5e27e64e778f31d641050b5c975fdd9788f2d5821bc8e3c188a91a86ba9d", - "0x6a3a73772d1ed7ebeb82eff2419e05583049939493e4ff396fbbce7e2012ef05", - "0xf976ee31f6b27e1e0f359e1f96b5900f34c49c89e81bc753456599d2e5f4a097", - "0x00ec8886d567bd489582441964bda82f3e297801ab0c5d3e58a3df29f9004a4d", - "0x9bd7ecb0d91d576640cdd3022ff0bfa64838f057e55cf35ca945d47f98d8d107", - "0x1868b1c9dcce55407f81879269ef1296c5eeff32ef4f7770bcddca4bf972df14", - "0x24856220dafd06f20fd0914d4468713654f6d9a8a8472a3cba537c6db45c1981", - "0xa05130241c7260630ce231a427081969d4428d33dcaeec08287e7aa80541384f", - "0x4812c23621b2399a68e81d9dd6fe59b0f0953b279104a69047d0df3678c8b628", - "0x4c00bb65a14a1b995a38afe285ff4594c51c8b10c137e73376da3f2660f00044", - "0x3cb2cc9dc9b1c997b8e73ee151de0cc23f5bc0d7dd27d0402b6d79e1b50ef441", - "0x25c0bda0d092dff16a5cb70ac082a0e3c17a42d74191c9c90d46deaf34c85ad5", - "0x8a75c8a0ff4aa70a0f1389f5ddeb0a1b7aca04b94af03e7c2f3986a6a9e8f8b4", - "0x9d9c63e3b449623e45de0542b1ee4d102204137a2ac36a25442f3797668058df", - "0x932b4ab5c339c9654cc1c5e343aef426dbfee3a98b7835efdba1bb583238aaec", - "0x8001e5592beaa70277723223f033b9f830a23d4dbc64fc42efbb80bfbd7e2a22", - "0x1b84fbbecdf3add7f514e0cda2b1c88b21a65d82da4264d06b332ab216179230", - "0x79cb6fe9cd675e096bc92d449093e78e59c6c4c813b550c25a76c2cdf125e582", - "0x4fad1261fa7d06941dc436c1d38188e3660b300dff7f2001a7efa7b8678bdaea", - "0xbf81d3c1b1e781a706c6acdaa23c12f5e900fc3f191d6edcd1636beb3d29a6b7", - "0x36cc017579e8daaefb5592bb0c5b2d2fb7df5afba9fbf02d0c750287c2353b78", - "0x0cf0b82b4a102f35a06f590481b72f93d570e929bc43fc188e829e01fdf0bf9c", - "0xc0b67d7c6100b042bd39d0b4747e854a0672fa2769dff0dfaea01e05621a368b", - "0xb8c49cfa2147f651bbd73f97f02b694a5cc3cf9fd79d47bf34857804206296f9", - "0xd3836371f2d0071e45176aa82ecb05b5185e06e79043f69fff184121380e1093", - "0xaf9e77ff0a9c1bdb16afd7c1d725263ad04394e4b73f013829e63da9600bb35b", - "0x43082e5b9b11362b6b5cef0c5614848ff4c8cc9dbbc7e2b179330b46e7b3652e", - "0x6cb6fd2e7bd5550dbe63b9875814764e64036a921be1e5413ab1355d771cffd1", - "0x1631a928685b0fe688899b105aefa54fe61e564a4c9d8dec99a34f5140e6655f", - "0x095addeb9c0d14bc7e18f547259a68ea3dc982e5256f4a97e3f627c3b2140be2", - "0x520f53d82a67e09c157f3480b4f504dde53d947b9e2238f814f5832f84b8eedf", - "0x433777fbf6cded05adad6e5877ce0ea3e34342af6f65042c6141b4f4201103ba", - "0x077878ad6fd501074b5c713905aa3caeda3237a1b58087e6275328d9482b0577", - "0x6037000d2014c601b14bab5bbf758098b300e68fd3d6f2a0d5e6ced1657cd6d0", - "0x481b8e11fe6ca5cdc881bb6c3d7a0d96e8cd2aca705f950ac542c089d7ca0cc8", - "0x2b070c54b2af6cea0e0ee76d37a92ab3f4e9e04f3b581f41ef2bd5d2631b8b87", - "0x01ead0aee81e4611b5ff7cd64037ec0039a05bf0d02b18b92da6acbf45d4e6b1", - "0xfdcd33327deab31927db501945c15a82f278f34a09112b2d7f74219e9a364555", - "0x0fbf377a65289b1decfc2fef4614b1e5b3404e0a0c9c7d0d147cd86bed55f23d", - "0x8cef4b3d09f838d4acb5e21f777fbd906358a2759d24b055756e9d154b177ab5", - "0xcced9e5d45e86423eddcdcae5fb2080622279ff6f08a0ee47012b33af58f820f", - "0xb1e6b5dceef79d8ebd0b84a8990f724fd645be2434a0a8339e78fe61c2ad3186", - "0x24a11c3547f5fd5e5eabda12369f90b8f5c8ddb82568631b6e704c2ab5c94ec4", - "0xd6cc197005e41f553308ebed885a4df650a2022d0d40d25f37bfc74a94e5b04f", - "0xcac28ad9ef5e3f9b0d2184fb3427dad0838122a44538bb1e0ad15baf08ed7312", - "0x8070860a9337d8e6e016e0ba5953968bf410100bcfe5e567d7562e74b95b5d0d", - "0x8ab5cf8538537e591e95fb1dcb9522067ab5ac783bfd622e6c9bb131d3288ea0", - "0x345a12de03af922ae9e6651cdd4c4249f75bc2aef1f1651692dee6d27a490813", - "0xe9cbfb97fea7afed66cb3551d9b5f6ba697a4476a5dcb3ecf25bf9a41e54bd85", - "0x4028a3855c3b656c1de109e250412d9596cb6fc4aed22b8bfca6d2a60b1454c3", - "0x85591c0037f549f6d807c91b929fb0290c1b53f23e9305bbf4feed86d5483cf7", - "0xe3178cd8d8b7d9c71d9614744a937add2ae6c21f6eddf508fdec243c6408b647", - "0xcf40b5e2f93922022aaba8558b17b193c50f6440359826dc78b58e9b9e34074f", - "0xaa30846598de0f132d8c18084859e6c67189f9489a2b8019936a151e7d0812d5", - "0xb908ee8113c1e60abe60fcd0d7fedfef07ff0efa562673d0ab86f6399812a8cb", - "0x8f9d9102f709fc1b4308b677e515173a1db857b4989b1de2961b801aa8b39db2", - "0xd74e36d71447b437a4a4405dda388a9779347fe41152b7c5515e02edb567b5ae", - "0x5aca44d35187500d73b544e71ea8a12100cf011c219fd8b83e44b4792204edd8", - "0x7196cd91ee48f598c11527924c83431dec39ed7cd67a225b64a9d04ad23211b0", - "0x52584327a0b33be95ebc7040c0dd9b60d2bd0d42d1247b8d2ee06b0d6aae9f58", - "0xe2517f4a4218e9741b501cd6fdbc7e2080cc8827bea231d829d1717d24ce4e3c", - "0xc94771be6c7b5e858823a03e620670cc604cdba8092da13e429c76c2077eb2af", - "0x3f7f556817b418fccb808f7ede824ff17b119e7fb02ec1a4239a71835af5ac5b", - "0xd611cd2fcdea70eafce698fe405f361ca95b67d5631a9930d858f4a7cca46358", - "0x5f2aa6ad1fed0ce4db64bff6de7bfa68e060d357ddf20414fe5f10b4211bcf7c", - "0xe8b5d5fae7903602ab3699ff27f159367e2fbd8fbdb4f45e7b1628b563081940", - "0x31cef735663de763db98bbb0846d5a1127adf45ce41837aa77dd5e4008718711", - "0x58f0b43df5b6c2527dc3e22f2f76cdf7817e23d7c3b9a9732fb91e6da9a537bc", - "0xd13734d21521985e4c6c14bcdc34139efccf1f0a9ab92a72e0b9e639321dce70", - "0x99b982d744b14279defa1771bb358ab55f4f3730a8feed9e14023b39c44f2777", - "0x827078f5ddff2088e6d16039c439492140337ea661cb361fe87e0bb7fc785bc2", - "0xb1f7f5fcb807c343ebc587314a28ac008f849c24753383c3e40c9a12826c9f5c", - "0xd60f786c664eadca5ba1af303f8d8e88d781ec3611b9f781cffd5b17610c19b0", - "0xc514f1487e061262e2be76dd593300b8402df6812700c41a2611ff5aeeddfe45", - "0xac6350441c04277a76c019215cbec0fdab8f6e46087704ef0b75cad0356dfc32", - "0x724a5ff7c13fe6d21249b47f47082797b2470159b298ea281f9616d6b5c5269e", - "0x70dba710ff65ecb7c9fef28b366f5b175e12a63bd1f7530ec18da36027033497", - "0x014f4aad56ae3ececae45610e6d28475e588fd39897127d20675c1ce18479939", - "0xdeffd38ba5e4e685603ea1da27571d48830018be17755ef7c08db7f6dae63647", - "0x1e6e324967609029e28e768443d11cd5d99ca713a88c9ff47144d0b16b9cefc1", - "0xb2a2a5d5583ba070ab2b8adc6f5eca48b621b5244433a5e491784ccdac2e64c8", - "0xdbb937edd70b36b566e397fa369a5a3a0b45e606ed012277c64234eff00f2157", - "0xf043662cdf2a84618401c619fd8aea26a54519add9f72e43a520fc8129c02000", - "0x9b84dae2d1a0d7e23073c558e13e16ddf3a28daab3569c89271e0f780f134be2", - "0x93c7258e9e78238eec47497c842a643b339ef9ce4f236ac2c0541872a427a1be", - "0x8a8fea29216df1683fedc14a7a066226f9299d1be50021d3d2aa4c0585b29f47", - "0x85bde8bc039cd1820bc1b1262545bbefc07b03de47090008becd1417ad3b997c", - "0xa7758356e4555d213a19f5c343de9cbb986509aade6d8237baf1fc6e07084b9c", - "0x546bb118d2a1176ffc967f90bc342edbab4350f28294ad6aa29eec2b0c9159ef", - "0xcb50bf5a5a25b95962b6caf51b5e23fe60f6449f69b4df5d6b6d7fda2463d5bc", - "0x1730541314d8595b13f01281189321299fc3d2e9d0b9aa354099d6d83538570a", - "0x5b57218719bb9816f4341ee1938263fe92cb95e798193cc2b24fdc3836abac02", - "0xe0860d86c780d3bd7375ef6a0d75eaced9fbd90283f8ca8335205ac3d3a3dbfc", - "0xcd65eab452ceadb388b945eab3342dee7542c76bc912dd738e86bfeea1588f96", - "0xc15efc0c25c4c019937ad27026225024ee6992780b9ba02d3c70101a73b354a1", - "0x30e8665a5ac3f3eb1b9c2e67d61dc2dce761e4123ed801c1a6f207aa3828804f", - "0x6c3b5d4f836b7d349a089280c1f4488de60461c7c1a7a5fb3ddcc69c1366195a", - "0xdca4d348f2b9806cef16e320e0b21a539769746679c1a45a6145f2298db496df", - "0xe8fcbceae567fde12d871fe54233ece0d74ba8508fbfbafac0f154806a9462aa", - "0xd79328e9ca262b6a91652efb67dac1fa5e8c3282dbcda58d4b93b8874d226966", - "0xe0fd3af4b67510c68e8968a5e25e741e1ef71c9347e18b8de6139f918a62f6c4", - "0x70731ec895bdb4914a76b97ddda78a8805a39a56987aefe32556b93e2c085d97", - "0xb387f307e22829ce20c5d7906037a5bc202950197bdd75ba59999c2a09778864", - "0xde1ec63948e3c4aaa005630545cf73bf9d20722a1c35b8176cf44d80f4cb7f0f", - "0xf9156bb506ad9a12b3b2357450c443572a3e3399e97f68cc0166ea22155c9277", - "0x3d5c1ac62e043661edf67446ac9f96b1c887d07ebcffc2faeb317b5c3ab596e8", - "0x70e9f96a6d21fa71ec310b99db848e5dde82ac9410ce8c6d24af115421527223", - "0x366fa3d63bfdfd2fc10ce44522f36ca6b8f815629bd36a26c0a5fcd6f95fc5f1", - "0x34b6b13187d684972edbc097949de7ed4f7ad2658f9889e1798e955845f0de36", - "0x1ebf9da97a23393f6dc5cda5c54718f273eda8ac6d1977981a0e1570863d9833", - "0xcf8888cc905df1ee1127f59c8ea7f9243c4688daba7890908949b027f4af92e1", - "0xea4ba26d5fdff1daaa42625fd88aabf7f91cd400829268b9beee5fc09875c630", - "0x639faea36eb1a652b024df696454c856be53c3667e88c7af5299c050c1092bf2", - "0x1e67283656def3ee933332600071fde44127ea3caa9c42f992ed16e33d1122c3", - "0xa4f53ce6159cae14ebc60a69e9c446a2abdb4f4f5cded75b1c5814a84c487528", - "0xf2840725ecbeb6e7396551fe034d21e75a5d34b4cbf8b3b18dc5ffa06a3e2d85", - "0xed7396b51a1b0d93b2288a4bf60ad49d236bc14b0cfeb40dbbdb6e9682d3fcff", - "0x9de490ca8067c84f922547ab496e57b3e1fc4685b744de22f1cac7dff687b930", - "0x3c3f7c57fa9ef833accca168540766407bbdd2c418f13adac42838f205199462", - "0x14257d1a35fa99b3cdab74c8445bed9bbfd25d1604e1b9123fb5c5bf88cb3a29", - "0xac74953d33cdefa9037a415336672144c53310ff50f75d865272ead5e0460799", - "0xa94b857f4dab303c1d4a5213c7bb8b91a441ee8279e69fa92057718f3aa40a4a", - "0xe7c67bb2e440f1062f95e28f0924d0b29bd789103521cc13d13a95673cc49179", - "0xe90ea613252541d3c5237a27d4d23780b579cfda48c057b7304ac14751166031", - "0xd85a4fd06114870b3fe19cba9924405de1e14e026372e84b24b4ab39e7879545", - "0x7d65651c6e789a3b6113f589f696ac6595f279bddba74a17e955ae6ff93a1846", - "0x5e44df731c9b0905ccc33ed49669b78834d065fe3fedcbd0fbb7df95f706c51c", - "0xc90d3dc4bff702b9f17930d27b039bfcb1b7879076bd82a5650177252a526dd0", - "0xb5d0f4ea7136a5f10e47f6a802b46ba0c7dbcd4ee10b4be65ccd55fd4c940bdf", - "0x4f7647e2529b477aded041ed2f4c8e01d5219839950aca43723993c2432105de", - "0xddf89de514a09c21918af718834060348ad0bfd3b86e0953c247834634eb841b", - "0x325b15b05b3c863822647b25ddb970cf9cb52ecd32cf58e6c5e8cecb1beb9c89", - "0x3cae2ef569b1e74770ed80bc31da2addeeadd59d8605eac8edf3dad0fa9b0c37", - "0xd7409a715ae5f091fad14187121bad8263caa2f60ea0d0bd7c524065defb564b", - "0x5cefbb199b507e3b64008e5d639cac8f623e9ace1292fca190bed4b7aa214899", - "0x2c2919f07eecf553b473f98d06171449838bb03c0a468d8a7cfd8062a574df1a", - "0x5c122d8416b78e0e7328881efaa7fcf61be6851a5b7572ec5c341693fcb9c734", - "0xbb81898e64769f0a6f1c20a2472a5128e969f737d1cba5be885372453ec18d1d", - "0xbe203e6f7c0c86ba994fde55d0daae0f066814938debc3b5a44884dda70e3ac3", - "0x73c7842f2480e3d742aed1a1b7682ca1f322d4d2555cb7fa402313024c2a13f9", - "0x5b95cde26a2c2be298a03252ce36514dfd3c9e84f5c5ffb75a050bb5752b6247", - "0x9c7cfa9294869c1c42db3cab3bfb737696b8f81500742bfeeaf29145e2b5c79c", - "0x6cffe595d85a32ad1656c81c87d476e6e7f602609fac052a0a3e3a951d11eafc", - "0xe2ab30bf8127106a4507034cf6b3589ea3dd19bb10c765434fd3f3f7d75c1a4f", - "0x01d7bfcc2d4c6fccf5e0599f9985af838cdc0281c9c8cdd7006b3b0abc775cbe", - "0x004114dfe63995fd66e6932c62cd7b3f40108e5e2f6916d19dc436cf016392d5", - "0x068c036ea74e85ae8d8897589a8dc775c8516e38bd619ed584ffd51021393fbf", - "0x682f4444c85c46d28f5858a91874e0c903e97def4e2a4302ca90ab69b54b4f49", - "0x3fda79ec159c2878e9ce65c575157daaa9561f17a14a0003d95c0c4264985707", - "0xb41874256b5cd3ef80af1536a45a8016cbade06b4a06b1dc0942c27124d934b2", - "0x0eac150f30020a7651a006324da1ae240d4fe623f077c061a954122b0e17b0a9", - "0x0b174907572651a2453a14e0326e7ba836781dbd939c2d75db84d9b481391824", - "0x082beb1974f7201be32469b9df42d9c30a520f4dfa696fcd991ef20367cb6eb3", - "0xf3c3ebe6040e1ce5c5ad1f6e08965ef387adb6633581ce3fdd1858f1da4547c9", - "0x6ba341211e75ea7346853a3f63ad5502f83aeefeac98a479aae546a70141af99", - "0x3962cc5bb73ab7f48d98bf65f3f7f41a8f3c52b4d7d2f12a0a89cd876f875bcf", - "0x5b49809641f72f5c96bba6b27e0331ce7fc7dd3ef18a4463c93d1f685b7a29b9", - "0xd2b2e8eec102c4b68d94d8bacf71755386bc3008d15d6090772a4739eb763300", - "0x704bf1701cee4f631f4de0e330873b1621490faad46203fab288cbd0892da567", - "0x2f7d29943c2b3ed9f59a66ad175d298f1e4761218e3fc52b9a67b4ca7107e93e", - "0x2b370002b007d4df272104b77c1224c24eae67de3e12aa599968b190e8d58c19", - "0x1f25435148cd815f4549de1f21ec227d42f360d207aa2f7de5466c4d28afdd0f", - "0x86d745be32470f409b5d77f92f2412aee084fc523a7ff7e57b53f39b11cba2b6", - "0x86d57512687518e3db56834f819bed57ca4f2e3845ef6affb15f29d1e166c333", - "0x9ec0e54aa6361293f68c14b7ee9dd32abc52d9649522b0d62637ac25d3a978f5", - "0xc2dcddcdd616160a196f1336e9f11c7685c5eaa4d3f5ca7c35d7eb14199d21c4", - "0x03a14db3cd22bffc91ce24e510421d60431db71bd68b8b040c89f85f7664967f", - "0x3cfa17c8017ee8692c5f440e6ff825b2bbfbf18d01466234bf69ec85c3c793e4", - "0xeb12362e925a0b082268e0e006165720dfa72ec2628dcddb6cbee4a4a0ab7bcd", - "0xb8c68067329a16ccc14fa3a5bb373d8281c79a20e1a15f74dab053efb881d13b", - "0x282be7cff399ee51b3b8ba7d9ce73daf0427cb11151b9a81ee0f6efd837c6f6a", - "0x357989e62c038a11c75120f990adee58fcba6e7fd49cde265296b2ee0c7f6db4", - "0x3ca8e01da313e17c3a089b8b99ee118d10140a497aca58d62c25452f1361f0c0", - "0x9778186733b0e642156d6af17ffd8161608a2ad791cef0dc5d6f31e5ed4ccee1", - "0xc309f7651776d4510a9696c89aa82e8720ebb2c41c208e7ba8ccdf1d26dcfea6", - "0xbe30023b89befe4495b15daf4578f415e8cf25087428bb25b1af06b43b04b114", - "0xe7246483ab7e0afa2a6ebe69819744cbdbc588a5294c1c59cf04232782d89c1f", - "0x54e18aa712987567ad36173ccaf070b127277ad6e9db2bfd1831b7868f56c660", - "0xe5c6a4c0f07bcf3dab39def282e3af9f7dce84a7b2bc71c9bc3bcaf35bc6bdea", - "0x5d78d891bdbb232e7d90370b5108ee03ceb0c5abbd5bc1c49c53431a94fa2309", - "0x91f3efceb05e5c6114ce0fa2477d8e2a6d9979ab1d3cef4d964d7d804399ac50", - "0x29830ce8ede37d875e7203bfca97b104b002aa474fa9aa9fccc11b2baf665f83", - "0x93a0646400cf92d5e7490638b12408ee9fd7696f15005287d23238ee5fdba9bd", - "0x47273e8e24cd886a25e278d327bc0b07e4c3a6b27634fc17705f46a019ec042e", - "0x3469aeb8bb2312fba8a530a002d75b75bce0a4b0e7f48d3e92d595dbec818594", - "0xfa8abfdb2535d9f04933e924e967d97c248b62900ee645fc991a47d5ecde87d0", - "0xe9fc29b24fa7b2a6cff23170d96faa84aba582f68792dba4962e7fb53922c568", - "0x506d80c18b5cd845e0277be32d0553130549a976f781c315c674545b1087516e", - "0x676bec126c59b4f69ddb2ac8141d9e90b78a2aa1b5e55e6458cd479fc7f98a10", - "0x4a99d2f7be333ced3b6faa2aaf15f792e00717da5cf15ba2e9b5b7dc02bb1bc9", - "0x776f5be74f05d1200273ea3c9b1919637fc911c76d1a9c3e1e3accbb9ffe6e37", - "0x09b9f219a053c0c3c56581e32ac15fc6bfb4fe69208a5291dd4860cfee263d19", - "0x65c9e06136563c4648b76cb1e7c5d46bb7501773825a10c610f2b63bfd5ddbdc", - "0x2e31a4c4d6670c2155b3ba877cbc6f086c18059b2903ebfcf2cbeb6f73e67bd9", - "0xdeeccdd2dbb206be5fe2bd4e122d6cfa556d00ca0021384138dd914fa3aa2413", - "0x0c24527744343d79639a382412ad22e5ef2e610151e1a19f09f725dfce287ed4", - "0x4fdcebad349c83d27457ec443a5103b375f26b6da958227ff00916cb900643b0", - "0x4b06063a48575a6f89ae7fb8deeb316c30e6ecd080898c47f24d9e7d4f6db960", - "0x463b0fa1bb74f1473673a2760a7e447def169426f9f7cb57ae4c6d417f58d829", - "0x01050ce1aeb140cc812f24c6629f9a171ddf4891b9150b43312fb052ecb29de1", - "0xa9e4bffd5ca3834b5a80dd84bad6ba4dd71138f02cd386668aa8b73f437f3e0d", - "0x379e501e6acdd0f94195bc851c50e7674e103ce8563bc61d7b0e6ccdadc18def", - "0x8d93115aaaa77767f70287e025a445cf6a4c7f455a67615f38c42e827c95912b", - "0xde2d4d8337849ad10a32b1731a0c281eedad191a09b26764568e7cd9769200df", - "0x575de523f7dde0e52b68c15646d22a31e245a037d1218edf86e295fba9b201bc", - "0xa545dd5a5e5dca568a5a28bd387417bf3743e184189106670b03b423b9e5bb08", - "0x044d13ecdf9cd6989d3e5a1d8354d4f5a7d29439a5da0c57505496fee7b6d054", - "0x4d99efa30d95ba2f0002565ccdc0ade2bc3f21d3153c638fe8ad9977f1da8360", - "0xc72982c95de4754f8b0ac62113a71af4c760c3c63f18d230f1fdbbe3c0b379c9", - "0x7a2dc8e509b0901646afbc1a6f9b5b27ff69f2fdaf4377ba027be555acd128ea", - "0xa3656ace4d66ddbf55477ce61954f2e1f165f570b5c7d028d1653e9f879cd080", - "0x47e4e4bbbc704f65e3979494487b0dd51cc56a928f26f97d6e29d76db80ac14c", - "0x5cec964b6d806da75f96c67c1db66d7c539593c476c69a2207be25934443c82f", - "0x685e812268ffe51415ef5e540bd4d2d65c2f34977ffbd54be14c895e4f004abe", - "0x991b2344ae224901f5ef89be9ed8313ad2c217e3727ed8d24f3a35fb71df3982", - "0x1293f5ce59c36d3189ac40e05bd8c0fb4b69008d8d457b224df1ef1e0285b553", - "0x3d41f27e644e2f7de5173dfe7004e32d6dbc8cb56871f578c3b2b943210a4c47", - "0x2decc2a4e91de0ae9a5584cfb03f6a7a4e0a867e397dc74df8f185bf241cbd96", - "0x0aab7f05bcd3b3633184b45c81dffd70b3f1b1b23f28d46747ecaf54fde443b4", - "0x8bbf3aa92fb9ebba36c5a2756dd394adf505cb753f8d3809393e1d967f78e075", - "0x13544a2979e57f73bebdc7cd1b2a1c9cf8911b8f24868aa1e775c8c53d0e2572", - "0xa7497c9f04590c706fe0a3909bd4af5bccc7ac31d7162b2b856d3a36bccfcef8", - "0xb80de8392864c859aa8e9ca078c258a6992bd848de129350ba29548db6aa4afb", - "0xf334d02277f55288c189e6ce79942ced25ffb9ea7bd5aa5ae562a985eca6e57c", - "0x83a563681180ecc7a1fbc6e47e0ba03f5004a87167fdd451d559a573df30533e", - "0xa648f1462985ba8ff73c7aa4d19153843e6a9a454d976533b08f7a14d2fa8902", - "0xede4ba72831451bfc8651419aedc62e221bd8acfd8d4ebe426d5b84d862d3b71", - "0x2ab8f2dc9b620b637aa27f9303068abfba56bb3438905d29c9a6faba4ad014c2", - "0x225e5b7232c6edb127a71ea313501e49dd86f4df0a037b9c97dd5fffa8c08cd7", - "0x85606456efed98380428d075ac4791140c9595b83707a397b274805c8fdac4ba", - "0xe298a5939a283d03311d1a19f83805f63c83efd2d7affa7586be8868284be900", - "0xfedc0db97df763328cd9a8c8bf1de73c420ca33dc3391acd6e4e847eda793d7f", - "0xbefdc3c7e7ad41deb07ec2821d0b84893440f797fb1603863e274368008b8e74", - "0xba3b21ae193db8215fa341504fc5ca46b58df994c473340bbee3f3fe90d72497", - "0xc45fc6625b0f784ae2039747aa93495b05243c00dc5c2bf46dc372c62beccf4d", - "0x32d182e51018fd1e19b576670ec68d59810c4bbfd406e2bd162e1f17a0555f67", - "0xa8886b1a9d7bba27219fe7f563ac0b592b82a1411392ea71a4a5bb288a98d6a8", - "0x396bac50aadd2dfc853c144091324a12ab8661590fbc738d3cab77910aa2d2a2", - "0x50e35af52bf6eac228c5fbf6fe5dec85989b76f44811099f2e8f4950e4ab86e2", - "0x9ba2aebd73945b6dcb9f5171155c0fff29db8cf40baf83b1689a7ad1004912f4", - "0xfb1cb1ff78859e3d5f0db0656821e12b8d247ab3896e6670426dce2055f1ff8b", - "0x230a6f6567f066e76413b72e7650f7cba9315090abc1bc7f93b861d85aaf0c68", - "0x4dbcac91377ca858927a01f5a5e8659b4e718ceca20d4962c43fc1688c4d7574", - "0xb13061dfac0e8f22dba518fd46ea95024cb97ef825c970cd5e452ccb3d7fc6df", - "0xc5af27a85235fd0e1da29b5afe6955d72fc2245c5709a0f29bebcc7c49eb4a0f", - "0x7937707d20bed2c7b68dcae39ebcd93b84bca9f471250e20f86f8ba58bb10fcd", - "0xe1398b71406488244a0c205db9c793be090349bafd87fb147c1aafb9d7d7deaf", - "0xb383706e1aaf7149b1ac3d258f6628e8e6d40be0dc096647b4bb82a08585b707", - "0x2c07639c073fd57cd719e5c67371e5c8db30f34855ffe0d985070b4b36e27cdd", - "0x7b264ea13f78fdba57d1097be39b6b2dbc614ae36cfea1f99d44b9966b3db035", - "0x04d942f60d32a80d93d12fb7c8ef95439e0da5c8358df2c01e7547596461ad79", - "0x71c93b0ec1e403906ce7e5a38d168b72b14cbb7cd0e832c2a7e73f485c7d6567", - "0xf7060c7f697a68824bbc178e02dcd6b12ca204da9bbf2a17b69ca858e2ea9574", - "0xb3b616f183145bbc77d8e3610504189e00c0aac3e15975e4e01f1b2b25c5b5b8", - "0x137f77c2fa4e911b6915c5a84588bfe78bf54ce39d09ab07e495da9283966d19", - "0x5949274e5465952855c28d70a4089644200927b54faa67d5aebbc4eb2b891aa8", - "0x1c695bcec5602b15de8099c550a3b738aba98acc46377cff7a5e58bd7f402ce1", - "0x8d1ffe39767f285d7f164018cf2fa4ec6509194c086c33af7ec8132e3572fc9a", - "0x31331d50f79ace5444f242b279be905e076d675fe4d4e1d32de728e2654a08a3", - "0xce9c3e8fb9a75e284c81925c6ef742c4f34e6f0bef11578a61be5325692a3a60", - "0xa4cac76b0729c42927d1ffb0c870983830ea66636e9abc6138b943301c59b96e", - "0xbcc505e608198cc3546899012cb59a3da60839c9060d2952f8ecc178be4bfd82", - "0x1b5ab87cc34a38f4be26c5e3e05903538e8e3af350f6e2e1258b0cf344ad9f39", - "0x85849c1cadc5d3bb555b88b1e5720110a1d4f7b79f634427a1f8d7e88c2e043c", - "0xee63ee939a6dbc6678415a1af9969526083bbb754a8c55e97cdefbd2f02900dd", - "0x50c63ebc1248164b057854b8ab8bdee0510a97f75e864e1d83feaf59541a64bd", - "0x58daea24885faf1556b3111c06351fa506b40b9f1ed365633a2246165abf3819", - "0x0357ff6bf4ef1b1bab206c3c3efe770c6493cd85d0540fa29492428d0a878c6d", - "0x52963cc6bf51a64c1f8ccc21c520ed95d5ecd0e43a86b85defd7b0113082e9d5", - "0x5cb8353b62e27e59824ee43a4bbdd384a2af41b52f9ea5444a1a180482ae7856", - "0x2815152239935641536e549578cd0d33c74a377ba350a36ef04b038e5fc49142", - "0xe6df1f1b9949e17e0a683b6fb7ec9ede2b49ca3d479202226ab4180445f86d51", - "0x3af2498e3ae79447c4b6b3f025a37c790622e2979462dee5913fda778882e5dd", - "0xd498a21e50c930d1f0fe0afa65c6f977ab8da037175f34f4478e52f4c1631d01", - "0x12478043148cd0413f56918565cc2fb0fb9802dab776f0a055093ee8ac131da3", - "0x9acd35608a37ac8e309e884b88609957ed24ffcb5816477788e08a874e6c5a61", - "0x53ecc517c7158fb6e99863c54795107258b61399279ecf74f443d49533a104b5", - "0xc74f9359d1b15de475fdeb56497a5745a93c741e5f2c370656b2e7c269c06511", - "0x8afdda4ce115a19309597eee883cfd257182db46070c7cb1f24955d9c872c8f7", - "0xc4036bef9a9e692ebe72c946161b3ce5c588f4421b7d6555b5d65f3311a5b0fb", - "0x4b64a608ae22b5a655cba7ef78624eb69f9f8e2b2f7aad8c04cc6ee95386e9ec", - "0x4b5506aa505815e519b5008fa8d23488b642a1f347f6cdbf53975636a677a6df", - "0xc251b21563070f1b3895bb4512bdac4395440217c5ce01fd85e89399dad72b53", - "0x07a7bc11d48537654d24eddee78d35e4510f22b755f1f36c3b81e98087a1ce68", - "0x66a0e9bf542363d8660cf7817ccfa3f4262e4817fba45d2871d0154b6fa7e969", - "0xb2493d6e033e1c29f62a409342beb82f692e565638736fd088d80acf7666b9ca", - "0x4c55f2a4ceb60544682cded4ae8b23bf217ce7d87ae90abeba156d9b1005f397", - "0x32b3cd5438edac8902527ac353356e99effb1dde5209fbe1015673778f7c5685", - "0x4066c6ad2c7170b434bbf3e7ca0fd678803351c3dcf1c56e84bd6c14ac2f7712", - "0xe74fa1fa353cfe643ad94f6a609726fd3c4b06f9dd7503431f84b13bfd87b06a", - "0xc46c3e5bc3c3cbc604513909999f1523d704578cf5f025a33f1a5273ff6cb81b", - "0x261b489751092cbd70d6d3010b5c5dd68c9041063c3f998b742e81060107e17e", - "0x37992c7e208c0b09309ece681e02e957f6310c6f42401702b31f752646fe738b", - "0x2b09e6bae0a34cc6c8c83e97c3369bc847ef6410551494af91a3a39929e7d949", - "0xebc85167d3a2fb3ecdc5b07d78b6ba3a0d8294901f75d687087449ed78b305a1", - "0x8fc0dda2085f4e515491cf0d5a525f10d50c58a0a86a58954b07264425bf1e16", - "0x5acaad0dd003649ef9705e73232b4f9598c3fa14cbfafa1691d0f987639b914d", - "0x41cb16b9f5120095aacbde94f52b635a1ea9f347af8f4092660e84a1b87f8535", - "0xa5f2fb17e7fb322069fe66bf093b99f54ffd9949fa4cc983d2266013d2dac2ec", - "0x014582ecf0cc003d21b02662531b8c0422d499d8b74069533ee24b9774c1b7ff", - "0xda9554b8c2b3fde14390f91282a91a9eded5473cf58dd2f5a6e6168cb4d24d3e", - "0x55fb7a99e9e6e3d9fafd8c9f65dbfe821598f2b5a63435204c063cb4477b1d2e", - "0xe54e3c51b6eea19c23875beccb7e18094e4db26f3c94431df1dec26e6db98773", - "0xa7c04b495735a1a829c64f06b94c486c0880a7c54461defb31a420fe0104e1fd", - "0xc7299bcf0202163a946ddd5d8ceaa209a1d81e28a27e5f8fc660c00505df769c", - "0x2526f9fcfb45966a26370e08b26cbe29fd5aeb568b0f945399a6ace1778ebb57", - "0x59b3d302dbf5e3919550c0c1b75bf111d513f2d0d948ca8cab6c44fc38459b3a", - "0xa73fc3b85209e722b88374b2ef3fa3df240ef81c9f9e0d4e7e422ddd124a5ae5", - "0x0dfe2812db18ec7836f8d2227e35263eb98fd2046f597c203f2b499b538a308b", - "0x1f7c6caf872ae90f4cbd92c7adc49ee2ddce61baaff37186111ba7d5347bb4bf", - "0xd67aa89ad3f03b9d801d3f1cb1ef58a5d9f6b8e4cd9d6fe9b862b697f60951d5", - "0x9d760e7ea703028be2d197a0ce28d4057bd8fd7638781e9846cf5d5886ef6611", - "0xe9bfd8ff1dfb81f4f5e5c3a3f821384f98d7c6b753ad356952fd10527e08ced6", - "0x95b6333df70dee92ff0d880239c2ec7a4016c6192391c08e797fe24e06bfcd0a", - "0x56651120494e23767700b82c6718a9c1abe469da49c38937582d08220330cee2", - "0x70d3bae96dfe1a093bf9233d9f8f4c149fe4079c5f40087dd49c6e524cdd96d5", - "0xd29445a1ef099b0ce227c88efef59677abe47763149e034c3dc96d999b66cad1", - "0x7e2fc31ca7a02f965757f118797ae5093cc95a89fabac7e25a22193f2346ca57", - "0x3b7ceebb659eacad955fe0e95a6f141eb4f59f4fa70e52da5c85d7a9467b9298", - "0xdabfe5efdd2d7a44022fac35b13c8acc8c3c1d69ff360d45d997887feedffa93", - "0xc883f0d5c38f40861f9466fdc84170f7605e9af5ea4d6f9aa5088c6c9e482b7e", - "0xd5b14197d738e2635f7294eb8993b01db1ec02de38a545fae881a3f11f3917a6", - "0x5d2b9e3f7a490660bc2592cdd4e04fc9f5e32de1de4c9a8c223b177627708bf6", - "0x2e94c911c88a1cd80e94acfc9f27bb5675a6ca79dab6f70f38a4df99f84f7bbe", - "0x23fbe80ce230e0cbf881279ff259642d6ddb579f0711c5f66e93db3896ebd835", - "0xf1eab3ddc0e2c231cc78d123e20f4195808a88f79c21b9ec2149e3ffb9b1d5cc", - "0x5156b02d5fb9cc38a14e3b4cef86fd99d01db773f681404889e6f7b76a6b2d51", - "0x4bef16dfae5442b8d2451abc13f610acb565fde8400ab2ce52c44f54f68308ad", - "0xa726272620270e5649309798d90fc52ab80b779fa03fe639fc8ef14256d5b1ee", - "0x7f327dd9c23774439a2c080274d3111e0487e1e9c848a9e11c14b2e5a9b307ed", - "0x711fde0a0f1474e0ababf802d8cc8da401d1bc4f836868f117f8ad3756179296", - "0xedb4b7af3699fa441ab53a6afaf380b5760fb86c6b5a0f2d73075fd9da23c8ae", - "0xd7062907f805b2b54e9573104b7248cda283ff1af3d86b7d77b4f9a94d420200", - "0x540b2ade8a4d3571094a14e7e337cb4ff66a86e3cc9fa5da85e93c21edfb69bc", - "0x3c06c59332db001ac1cc72e9b07adfe31155df74c920d7a897592fba0d265a48", - "0xe24179dbc1457c23d05b307e0b42c1ab276db666e49b48cd3e1b3dc82e285de3", - "0x70675363d1a4a6db8b803e3876b171c4ad70b25a56790ac7e4cf011ded4c9c9d", - "0x80dc30723f933aee8e126815fbc226186c07d724cb13c60bdd55cb470f159c4c", - "0x9be135832d600074ed784053d80ad3fdefde87db55088a545a1f8403429d86f0", - "0xac742c9ddd3e59c3467473ede8a794a8b5d1c8299a471c7510cca0b11259ffec", - "0x3089d8ef215e1cf33020d6f2dd005c96d9e7c8bacd2e272c788b79e3fe016caf", - "0x7b22b3b82634041abaa917ce6ac8738e1ad5ada1038bd1a583c84f2765640e0b", - "0x5812d6270239d7566288bdf58df80a2f692731062d3a0aca56d3df972616b553", - "0x0cbac8f96a15a1f57b3ea657e5888598f7350466f40fd46735f7a8229ae7c528", - "0xac6d9f1c216f28da4b97cf2f78f4a7d6ab38636e57fd9a4db71bff191a8007e4", - "0x8dace71e1c1a12a57dbb4794cc92d3e6641201ee75a8304b28b670719cd9a179", - "0x03d497bdc46d7189b30bdcea32a7d93ae17aba1851da4b5b7baa241f0348649c", - "0x9b2316358a104fd1a93cbc388c1419b1db9043aff711d20510f012bd135a1309", - "0x88d613d910c664cee5d50fe1733340853900df4000225698ce32816f457c30b6", - "0xcd9d22a2cb07552bf921cddcb89d879e49ac840a5cbca91da3324427d7d2b80d", - "0xe7d213479605f340cf3714234eeebbcdb63805c5e9479dc56d4a4b2733997bfa", - "0xd899fb4bf3a918a9cfd46d23152fb1d5e54f97b86bf270ffe28e6e55e924e391", - "0x14a971dc6aed1e7dfd4dc3ba613548b8966495628182ce99c4fde9124ccd04af", - "0x89800cc5cfd0ecfb45bbd253dad288617123b3690098e41b38c0d51cfc10234c", - "0xedfe6f669b7b9dce540683400260000ee191c3481577aac6efc163afd7af6154", - "0x70b50725e51c7a5fd4818be7286bd1cc9b15ec2ed4ab6c1bf7e7203c4fa8f25e", - "0x22d02fe95c6f959f72ef4c96329dfb31be8ddce701e0c3ecfc8398119bedf656", - "0xd7877a10f7f883975c5498cfcb07f044400a09d906cb94c8cd29f7a4b93e4b5d", - "0x2e47d9590efa111e19419df7cec6b157f4e06dbea4e64108b7101017bd0cbec0", - "0xbbaf38881063dfcece265083468830bebdbdbb833a57bd7844044ea0c57d1e44", - "0x9269c959dfb4540e3d6c815aa0135b945acb7f50b38fff49f6e34425477ef553", - "0xab47e57f72ee8c8d8857247f84d3419edf43fdf6470c9ab070d8733cd8ad617a", - "0x2be450e3b77d2d3377218412be18390e984fefa2df07d02edc07ebb2d64a9312", - "0x6cc64bc8709eb51b5321b25453e77f871f364a8b277ffe51afde4b8c7a181338", - "0xda70fdeebaa9502e8d0af2350824ee0807e31cdd55ce4195f32a639f47f399cc", - "0x2dac4b30d219640aa01a2d7c69528c8d31636711c915827a64a9219524f2885d", - "0x50932f0dbacb5af5785065dae19245148270f1d0d3515b8d7e191c5702047b6a", - "0xd919cd9f3f6bf7ff66340bab7c562bf53eb969b3e00fc950d1d3b0d9d815e351", - "0x76a276f09fc452ac94cac15d5226ccf3110080d2bdbcb01e8ad86597a03f21bf", - "0x83bd36f26e7d087ca641848f5bda2313903ca64f8b61cdac127ec56efbfc6ccb", - "0x6a65903a006c6759aba3191ce06fd45b0702f127d822d9c889df12b2d52c7bdd", - "0x8e440f04254f81737b00d3857d1a95bf8709f1475bc0ed15d7347c94e57cc7df", - "0x20929894b05fe04fe12b11d336bbdf33ef983eaf6c501846d48813a97ee4b5f3", - "0xfc727f2888aa9f47d486f93b266c6d09b09b949821b63bf86aaea830c16388f4", - "0xb9035314e27d890b6362db7cbb0953e953b57163be0d80e5ed36759500f3160a", - "0x6d2ba56b3c06326a0fae498467f439b47bce1174862817b5c703019e8d448c4a", - "0x6b92e2415eb7349014bdc3e705a2170a5cc09796930d94e861868f77c45d5802", - "0x83a57de8623aa9742b33b3c8b3737bfb198f738111e437d9bab12baa0660cecb", - "0x979d381266e5105773f922d3172dd020a6010b9e435f3bad16ce6065b537f384", - "0x3fdaa18e7a2ab12c5705b17ae33e96d8df9ab3be631bb9c46d31052ad423a4be", - "0x439e461837340e67edf1c7b7fcf633d5c3d8636174335dd80023dfd61f66c67e", - "0x3ba40c7198d6c75a1ecd79218edb9608b7cecae9f779b37d26873d040d29b308", - "0x66ca7e3c8f892bea4be87afee3db3c9352641139ea4b8d459417180c2df8ac5f", - "0xd55c6d521f3a145379a1daeadfede8f837928315c9c2f1c2642ed0e1a7e87674", - "0xb848560abba9f0e19af44219c2c1a5011ca43eff4ff6471555b3c1c235c40119", - "0x1fa19a85d008e7af8585eb7cbbcc8d61ed6248708429d0f458f1b497ebb190a6", - "0x72a4e2f8b7fe422eeec318f1127b4b4e4fb03e40a028d45f5444c9b287a4a764", - "0xed88ca02a5918d6f621fa1e945bb1533e33ea5c1d41f7915672e3c4e4dce78de", - "0x60ef0df2f7f5c6de3dd7c02fb202c9b3a13f48102f317b54b25b2f0f1f49b6e1", - "0xc49153808e765883dd21e1b58b5725aa1d242f920ff0ffe0c6089a5e00719c82", - "0x0c8581a354376bbb53379f45c92e914e46676b68305e8fcf16eb069c65e87cd1", - "0xb562721b9433cb712b3969d193e132132786434bde1d45916bd7423194c84678", - "0x060cfe84bbb7842e0a49bcf9f8753635d9fcd694de3b8d5827239606269f0cd1", - "0x84306039a875a723780ec685c34474d35ac3431d6ac8d43b2b6d1bba8572eb9b", - "0xfeaec570403a0190c889e5d2ecf96a9a6c720b3944e4b703049c81a35b56d820", - "0xae002e7d8e1279513b037ad09695e93f80868c60d2d8b0ffe6efc8e0ca8a51fe", - "0x20e1f3248ebde32f2fca51a576abfd0db3fcfe359df399f1c3102ed2183b027c", - "0xdf77e0510d24818676727c9d56b58b2495ad63902cedb04e2f3729b58374c942", - "0xc33b4b53e7eac8725f5b3c27a9431dd6e4f966b1289e3b2a1e158474f4a47f4a", - "0x6466f3aecc922abbe6f995a3ede8ae650be7f1c08679c5f6355e32ae95a4412c", - "0x56322467df2291a50bea2baf66169caf34eddd525655cecf6d14fd2295b2a438", - "0xbd81e7bf5e30f4bc1b87c57a4eda09293cf6be979bd2bb02650ce5bcab8da996", - "0x3d611638ca06abfde10ce7f02152069aa30d97949dabe3dafe8980699d49ca0b", - "0x12723caf905e0c044344c83d085f3d89c2eaa695c9d70c0a831d487b050ed453", - "0x473f61c421d202e15d4a62d4513bd48313d253004feb09d9b6e0502c6ba276b1", - "0x9583746c372cd042a46ada64048ac44b30d3b055b6e22ca3cef5404e57a99f0d", - "0x8decffeda7b7de072da8268776c4b9969cbf3e7ae9433334aa7e1e7c93567f55", - "0x543f5b6b686035462d17ef969fa09e0af3e7cd24d13650c2d3597516e62f9909", - "0x5381b2412f6383d057bab3fefd23d08384f345960cc2fb80d7311a63be5080a0", - "0xd96b7933fd9308f7aac9fc42e8feb9f2f4b586400fdee23798cad69611320461", - "0x0982300c344d44c2f63e1c1fb5fffdb44c23749204a0e012733317cde6efaa83", - "0x6048706531d18c5f9a257448b2826fbcf7a72bd08d5d4feb2928acdaeee61768", - "0x2bb89086896edfbe79407ea2bc8535c6be143be6c64ddb1190e626e091c7e802", - "0xd1d6697db021746970393fc0151bef8aca67d202b0e54f4f2702a5f86c2fbe2c", - "0x5c1e1a43ba2578bf4a302e18f37bbc4f1a67441fe6a71ee856662739a5821db3", - "0x1ed663708c0709027c702ad5ce0eca6d3e0f22d6a01d4517adab0a3d25f5eb26", - "0x6ca247d5ec5ae33cbecf8fe88c1aa64745f7a8d299bfd356bacf764141d410be", - "0xfc020b5ae74507a1475ef8e2c0bb516b67bf79aaa2b61bdbc472ba2d75ef5db3", - "0x1ef0990b9051937ff1fa02880131aed9787e6d7d41a598ce7b5094eea1daea80", - "0x9e9e9a83fd6907dc5407c49ea34bd1745919d9ddced756433f374440fa8c704f", - "0xbb3687f8723712f39a8e9f8865543100e048acdcbe2045803ad5a40b61c4a36b", - "0xe60d8a60edc3d7e31ceb356e493a28fbc845f302ae2a8d1e7cb80f53112900b0", - "0x294039b994a3ff53cbba7718280dc827fd582ae789736a026eee1d39284b35e7", - "0xcf87c0d2ee79a0d2506a3d557880f3ee9a20ff51bb44c20caae0849a85055408", - "0x0d6bb688dcf3430e46de1512ebc9e411db3380590bc72dbaaabc52a5320216ad", - "0x9f2cd8a43695c78c7a8fb1352d581c82dd9dd0ff04e3485d5bbdd5e3942f9c4c", - "0xcb32930f407012e479eaa7b4844107167f519deea6c7fc0351cecb93c500d63e", - "0x17e759d815596e0b89a3dc4ba12b9d10ec59988fb0550e1518a8b1cc4f331190", - "0xfb3b36940c6675249451c4c857f6742bb0e1fd3eb126e370eb4deefe238d7d75", - "0x47d619d7d8a9510290dc0b8b2518af2862ff6f761ff09786dced91e39d8afeb7", - "0xe8f40bd7a7bb8f7dffbc63addf31a27e0a987a27c00525c833f6ea8f508537e5", - "0xca372409bc160e5eb7fa70e2bbfe8daac9763b374c7bdea0cadcc933450443e8", - "0x6e234961784273f80136dbdfe0f5618fce6c0d63c2fbbb5d7fd6823632c0ab6c", - "0x2a6cb327e669de9f9783300ef6b2cdba5585236e286ba94dca114de92728ebc7", - "0x0e91e6a11ea59f840d9bc47f251043e10159880276bf69beb075557e38715fbf", - "0xd452ed733b985db558b960ed14310215abce589d4149952a3ebfc7604082079b", - "0x7fc984fb9d191984b5141a9dc7ed1c9657742c63e7958c7652bd896bc6c9f985", - "0x2ce2f74343ae9e37153b5c071c4ba13adcf67676ed7789379c364107d76e32cf", - "0x0bb95a7856e5f61bbe47d56aae9d7f42b994fc4640b50ae80200ed8a678dfd51", - "0x2ab80f2546564ff01e812a39341ae227b69ccc1b38c7f28e61c31925cf622811", - "0x1b24ab582f306305400947e9e7e43a49de6cfd62819517a8ddd904972bd8eee7", - "0x852b65355f93035fdf4358ffc3566d57dd97c9d59a1e545706bc6a13690025a6", - "0x6a44f88a6097b5e3c822abcf1823c98362b26b0bf3753b6fafaafabe9591a07a", - "0x4e7c0a92561e904eed52f2a2b906293411b97795bb194d9c92e335cf9e4ab200", - "0x6ac01d96e58002f8881cea4e177ec7606c69e21d252d863787e5cca65a839792", - "0x4d95bfeb96b7a7978c890842544e8e780f531512c182cf22a73a71b55f1679db", - "0x84de4313a7d87fd748e9872db1164ad3ff9d48993ba429b74dad497dcda5a3b1", - "0xb5ba8e71bc844413cc3eee7325a949af1e0ea81405a3371512fddbef87e4e9f8", - "0x2378cad3d3f0558c0df47cd179791604af7df805f805f7d1ec67b52b2c330d6a", - "0x260d00d98b976fe3aaed233aa9e1b8fddec1092595c91336a5b884fc07e51a30", - "0x7e3e9859270e3a7bb7c5f6d7170e98a8a0a681216e21567c303fbc9e755a4739", - "0xf9aa5450b6036bc61ea2113fb163997ede1bb212f343ae5df0b55561ff32797b", - "0x465cbec75cc303fed26bed3e2701372f9bfefabfcd54096a9189d73994e7aa17", - "0xa86195c2696fa647cd5971d47587212d48957f3faf69721683c158a1372eccfb", - "0xdd104c0ccaebf94bc3c0a6abae1852a71f9b1eee974d5e622f5386ffe0949b7e", - "0x005f5108714efe19e512aa83608e9cac46976b0afcc7a010bfd682965af39d43", - "0x60289c653af2f12a58b10c0f81ed6072b3112eb270b350facd79d0363be2bc8f", - "0x8e22bcefff3aea2767ad9b118be1253d1aedf1e1da502a4855f6ae7eee54c335", - "0x3ec7f166314a0c594eb8138b75a050082884556f7664702333c096bc93b67820", - "0x605398473b453589bc31312579ef3b5ce0b74e3ccb95b680f8beb30d2fba34f6", - "0x51dfca1880e15660901b5f755530c3fa4d652050c134a769b6ab2e1645755cc5", - "0xb24e9463fccdeb2178e520fec46eaa8f2d1da5380d48815a2fe1816f71b79b8d", - "0x97bd624937de7bb8915d7e396c31cdb4afb739bfd4eb6d96f8773ddd0e4f4933", - "0xbe17101284e09bcaa9eb5cd150983b05248b620465244b603b598bbaf9bf312d", - "0xd3c2ce415ee6bc3908cdfada4fcc76b5e0e9fa4f1c6ab43a3710b2ce81f150b8", - "0x8d4918cfe78489e146c071c149a7271ea81dee2ab0615394ecc35827193e737d", - "0x6a7e51675ea6214d36acc7fb193911d2608e41a2df747e328afc6f5a465261c0", - "0xf012c5f418c7e265bce72f9f4e2900084216c9187900927d9aafc899616ea9e6", - "0x934c51d4f2051bb7aa555b3f44bef81ff782b690e29f7cc0a9411ad03ac74a3e", - "0x9ebbecb11efe195d2ef7681c8f1f8af3b501f7c65a0f9ea916f7ffc9a6bafd74", - "0xe28247949b99de84e721641d5e3b638dde927478df0ed0f53b8970b4febbfeaa", - "0x6491ca6bae8781055660837b72622f19daecc7407aa58d24088b45f5725691f2", - "0x3a56f6fdf34d6a4d742451c1f5b6e575685f9a6703541315df1cb8aafe531f7e", - "0xc204b9d22b7cbdcc9132539ea475792f4ea231cb246747c485632be8df4ff5c2", - "0x6188cd2938f72d2dd5e16525574f240b458316d42daafed892faee9189caeba7", - "0xa272f3ccaa93e016333dbc904183db6309e31d06720da1d18addb7560b9bb427", - "0xdce0b5f11909a90c1c6b8fd2bdb3113a035e7784103e05ffc972364530ac36ed", - "0x6bcf3461ce1447e80bd3da2d91dc4530bb649b98333304fe3e0045743c0b96ff", - "0x523496ab97b10356b5bfa8e17b4927b8f0f507368391e24250f218cc00be4bda", - "0x6dfa5889c65ed8413d6633bffc9c3e648621d38eb70e57ada781b3f4dd62374c", - "0xaf1a300f73429dec7f12d0ebe9706cd113e15e1dee6cab37ff11503a836cb3ff", - "0xbb8aa95b40671760e1d131cb269c2d156f29d89911604db04ee7f87511283b56", - "0x93ca5bec69be4ef613260e2dc850668d5a1c839e511322d95ec25203d74673ff", - "0xd7cd3a14db02b6c705bb6cdb03140b50b6b989ab82d733df84f990a9c4d6b292", - "0x9136b9484831f1417ecc2d5ec93fe31b25e79b35513cf5187e50e3b95f862269", - "0x1519b8a6581123491bd0df07cfa3a40b0d098e5cc6ea981368fd073f7c927ff5", - "0x08ad5c68577e9e09e5b00035c65835b404437b792ff327950d07ef227aed6a84", - "0x4e989dc2f09df3e9fef7e50e7b7a9da85c091c11796665602a0f8294dcfcb2d6", - "0xe4a311a951e3743c0d3d05db87cc5d62ab0ebbe6b2e85e035c6452b0803c4be5", - "0x4a64e0fd19dd4b2dd7be3810f870cfca0cb4303d44204ae329f3ef1cd0a78420", - "0xd13981c9f5bfc2efe70eba25bb4f3d3f7bf13d454527df015e951bd79c649c50", - "0x57af6009a040d74b628416de645cb13a58e16fbd63035c6a6d8c8a0bed102ccf", - "0xfbb76c69f42039da5d672776f9e67fe1fd3d7eb0d7f5353852fa64558a91cf88", - "0x07808058eb2b620907baae2b053ef2c5786deb73df750a1b715bb1e0dbc0e14c", - "0x24f1e75fb9fd88b2628285f3e49233ea6f59b474ca05f5823810a8b49ae4cde8", - "0x5cc1e13c706a5c18aa40d8e5db49bcc87c38a07655a814b2179a35b1a8ca79bd", - "0x8ce52067eb546774ae3796de7cbb58f33395438a7976eef1f191cca9c6f59f76", - "0x094311f783939ded904c263a92d5db558e60352a392d3ba77045ff82114978e0", - "0x399ecdbb06d1421fd3651cd625376cea22cce333c6dc200b9e572a001b794a3d", - "0x6a94f126de560108bdb47dcfa8eaa5e9895b3bb9bdf7e7e3078fb725a1ca18a3", - "0xc0c7a71a8e3547cb067a73a984cdf283f6480524578ff611902eb9ef947c4c80", - "0x8593b4417b4d497d0f1d68c21b5f27433be956b6e8f94d0e6efe983492647fa6", - "0x616dacbbf17052280e093ece29a151df4c78027d652ff2ec3887a48daa916d31", - "0xbf17d700c78628de624a49125b764c1240f3d59b85fe376a64cc02f44fd3f46b", - "0x89f0b2b0b4b0eff45499231c9c5fdb53e95f72c589e7ed04c734b4d07df32a69", - "0xd4399b262ddaeec84cb56417cb84d2065664d79a51750ee566217487f420d8d5", - "0x89874f2ef4e0b53e96afe703f4f9e5d5c7da81a621acf00df29f821098142898", - "0x84a9a966381053a4e933c1ebae4fec74d3452ae5feb2b1c90ed59c92fa0f5250", - "0x748adbe8f803c86ef6f20ef7f178123f46d6c45dcfa332827918f4cfa9417663", - "0x0c78bcfbe149b1b2de2253d443011aefb4e5ea0c7a48e2e13156cd5276437557", - "0xa8d86c719b15c328e5117fcc0f4b381df4b8bab346d522df49aae19820ee128a", - "0x3bce6f3055593daacc3ae11b67d5dcc20475e8eaa91eb3153f83bfca6f2e7c8c", - "0x8af84754ff63a68b7b8ba3948e255fc172c53610aa90fc2f5f633bd8ce1ef7c5", - "0xcacfe2b9181c60d0c3d7b48403b18ee184e7c7032f81eebded3f19078c01d7d7", - "0xde4bc2b17855522804fdd6352f36eec477baafd69823908506b949c017aaf4ee", - "0xcbc7689bc06c9f4f04414835a89650a845884a2d102b6900f3abd4d4c8f8dc3b", - "0xb9779ac13bc739d5bc40bdb927c3543310ff114a83bbe35192c250a5f772d441", - "0x1239fa2d0cbb2255d32b82177a976ed5c9f70f0661a5d5267c60f456b9a7f44c", - "0x3e81ff86adae141c75c8b1a91d47db7c6b196ab00cc883fb2fba7655fdd6dca3", - "0x551e92e6d774825a2a48555268c86ee52e1b613e63c8a6e14275ae877dfa80f9", - "0x27a7d2faa486508c7fa20b818d6aa130a914da688d5bc8c60a3547c241937aa0", - "0xd10995979320d9d9d64051e4f721644579b4984a4337de86901b03fc2c042e21", - "0x6f9308ec6c4eb211b8c2323b68c4670db6a8116ac4a370801ddab1da0066df58", - "0x17d3526dec54f66815d8e4358028b0aa91d3a134d843d2945a47dd5aa56ba788", - "0x3a673e5904cc61906f6806b634ae6375de45f4f0d63713555d13a1e274e1bbf8", - "0x39dc807657774ec32abcf299b9c7f03371bfb51a864d11800199ccc7eaafbb4b", - "0xe2bcb8da657b830794b6d9f1e7471663e31996c1bb08456f4d8802448deb8565", - "0x38c7998e73b21038659140e5ae8539cd8cf993686c90148b38d6308a3e3b92cf", - "0x4b6d2986964aac5d5101ded91aaa4ff78a319dc04ab18e550589ef09b638495c", - "0xd8c4da66b5525427cafd152c365f99a255ce2e78af3e3f3dc408de0dd16fee99", - "0x444dbcafda5c0c74092577141df9fc8fb1822ef3375ef0d43eb876fe29c262f3", - "0xc030bec71e90264bacb7c09f9de3a5e282684f9f1d45a2b177c8f19f9c7180d4", - "0xd529e4c2687c7b40d1bda81201770838320b1183da1e18c59c83cc4772296921", - "0xa1ca4f57cfc4ec4522a42cda37df9aa74406d8aa8dc4b56aa62fc78c70d02379", - "0xdd30dc03a60b0fc21dc4b75629124e8190daff2e3504222fd6fb772531bdda85", - "0x2d9d4a9b9b2a27cf863a292a7fd112c81b0deae05457073fa0d5bf7e0dd755d4", - "0x19815e0f25090a9494cf5bea69edb70e7a56e6bf56bd19ddb1856198f54399e0", - "0xa7fa776c8227838d27496a3c659f3da3f5acce22da70701dfd62953edfa2bb09", - "0xe55efa9386b2e0fbd38af545106f197868361f2dc44051cb4a1ad540396283a8", - "0xc6c313738c3c75d434da4083962f8e8355bb8832e17c7104d037b131682b28d3", - "0x756a6309e8c0a374b99b2b2534a851496bc74db36e5bf1c950c0549914f0d0a4", - "0x36f64ed32258a3d2dc849f4abe98db30d8b04df28420c56215e29190e8a447bd", - "0x5273c4accf93338826feb5bd75117a7a0ab5a01225972532ff4ac1d29b289d8c", - "0x6146cf6b830f0222a8bf9353ea26deb973a85c5c4a005136061ab0fb48fe56a8", - "0x97b07c22662079a3a448b373fcb73320fed4a0877125228b4e9a5b74c0bbf703", - "0x68d28adf72884756b688377fac36d371325a01c65f5b70fcd7ac16a2dcd21444", - "0x2c27150b4cd8aea85723c4d264b8799c2e92bd4430719da6bdd3a0290c024a21", - "0x6b553b884acac18804cd52c7139e4a245f2d263b6d014fb6c28e31d7ea08e63b", - "0x64bc2ff8936395f794702b110041a88c1acc9cba50e12c2c5c9730976e667ae9", - "0xc45b2a7e308777811b6c099ffa3287970e003001dfbfe448a2600edf995513b8", - "0xa89c093a0b77cf4ad1ad7ffee799872a66ee38c3989ad39fb90069ab70b1fb4c", - "0xe8d0823460eba540c0c86016014127c7b77b0afdd199fc7bf8145a556a7c523e", - "0xcb2ce7a29b4c67956c439195a84b53f5c54e273c20b6cada43aa68ca7b1b59d1", - "0xcee4cb506d3b0cd84b763f405cd68e2bdf9ec1741778a004eaac9910d17cb67f", - "0x357376e9a49b6c7dab7c5cc95d4a90cc27516f1b7f56c33c4c0125516153819e", - "0x77090e31db86c2f2b031cec1a6dbfa3c3b2f464db7e8444b5def6468c03f5308", - "0xf2b0dee21d7b016c0c9e1a02a970835f934f66c552d653c9d5fcfd20aaf397f6", - "0xfd662e1a27c14d5e8b1e9bf6fca699a3ed7c5bb883cc626d54f53a721c570557", - "0x86194d492a5adc474f114f9cb7b0f6f6795d7680614b29bdbf25e969513a3276", - "0x2bf3ae6993adb5d85fe62bce02a836beb598779ddd37cc2db1f44b1cbea616ab", - "0x4321e3a94d12161ebdbc1b5c0f9223a7f1dc9050792589ce95771c7951b2f176", - "0x79154a76904f2a3c59e7151fff7cd448a3f74c003b866b9faba330481c6895c5", - "0x9c9e7e1d3753804e3644da89248505116009585c6e6d42071cbc532de20749b9", - "0x4dc1441b23210778e4df8417be9f654619527b5b42247bd7a8490a4a5f50dc49", - "0x79fd11e85b307098e827168a157ef45b0af5f4bc073a2920f42c6ff332392a58", - "0x446e8650a156bbb1b96d22e0d09619f90b8baeed34f8b63ba7bf3da3b764e219", - "0xa86cdf11cf5586d8b0449085e7c153a0dd55aaaf930960f3f31f80d099011d70", - "0x4d30e55035eec495badfd3cb8a2174295b2d2cfbee4e669e61bc148d09ff2342", - "0x2f8f3bc3c59975caf160d4a5581cab3499b84a524cb7977e4977de10a74ab875", - "0xe08b4473276f706c7399f584797cf07d33a91c91272ad79e0a5004c00a0d3cbc", - "0x1e27eb957ea54f1806115824c61d78e265cb75807f68d508da5ace6c7dbcd9f2", - "0x8304bbb4592daf4cc754c67dd78a2e2008b1abd8d966521a2291d170c9551e9b", - "0x8298d1605af17c8f47afe0b34b84bba22441a064a3d5311a2ea7e45f76565c8f", - "0xdc8014aead4dcb61449918deef31c64ad8555939347bf04f543d6a1158eb1771", - "0xca91e9581535b11cef0ebcd2e68dc00c3a18844fb4d6f05acf26eb3cd15f1047", - "0x2b26282d94df586bc7d4bc0cfab8ffe1844800c7045621527b9f9f0d5004949c", - "0x9a92f43c5a697a097e39ad12fcd9279b8fb3c3076ea1d910ff871c5ab3342a47", - "0xe33707e3e852b3b6a5cd375d981810399de6a3f96015bff7a4e5065f9c8713db", - "0x132ddae1f0244abf072e6d8115470ad4afb24748169891be0a4b952271599333", - "0x2c1236a98f16a294a9de1c24ea59739fcd6b5932b3f2535c8d131bb2f92c1dd5", - "0x989b0a915bb07ef5e3673a99ee796639722b9e4cf5086433cf8072fa3264f4e0", - "0xbd871c039e619de1514cb6f9223299c44d0555b5eb88570f79fd0d593953c197", - "0x7fcb1ab57bca2410a274f6339927bc12ea6843c106816fe10fc9576b6c7f7cea", - "0x5692b49ef3c3ffab97ab9ab1bcc10017e6d0527e1fab5b257210633dc4d2658c", - "0xe105a92cb6817fe6fdd585068363e0ffd45686fb6dc3658504c70e2057b165c5", - "0x97e65f3bb842f242f51e9ce978320a90720858dc9c535c1d66bd1c269dda0286", - "0xe5ba47b574c389d060e0c5f99f69829d7b6dd8b3bf6e64c315c28521a329c392", - "0xe971dd283f7ed3ca0e28a73d614c490a959c36f44bc30dc7fd79bda064f23aa0", - "0x0c786961cb4df57adc1011891b90813943a13a06032dcb2b7f9ac38dc8b3458a", - "0x3736f1ec97fdfecd7c2e6139fc7ef236586bd9507f65a99913a23bafdd5f069d", - "0x5c6cefd0c6c9c825668f99d1d595f6fa55a45e6a43e23323e901900e02a32f40", - "0x00373765ace6950b4728871a0165aeff55ea61fa8ee07d51d7b8bb8114c20380", - "0x49abb5d78311bf743008c2401f074e4b190d9b29c59cf6328831decd83068172", - "0x0bc28d7480d5a56588b937a530d026a94becf9ced1fe71c6dd1ae0d2922bde50", - "0x45e4ffdd3b6d480ee76f0ee7f6acd7c039ef564d77e5a91546e8269d5468ff99", - "0x09600f167ac2e81cb9164e048908a5b410cef5b48f92eb9a801cf84104430172", - "0x00ddfefc3d36282e9aa8e163d54df86f10737416d9dcf33e786d1713ab54052f", - "0x5b9e3159e4394f03d05ed8b8127ceed638ebe147beda7b7097b6dfbd8342df53", - "0x85d2ae2bfa381b7f5c1b0305f8e252f703d295edbd7c05908e6ae564d05443fb", - "0x5d93339013a78b3344b994bb474fd714bf5495dbcee84346a30219b214f1ed27", - "0x509921ed07765eff19b5c5b7885c4eeb30a8329417d1d819f3428e278364a192", - "0xe004d5f07b3986916f8cca4ba84f9357d4550c26d408f79fb49dee47c5afc100", - "0xcd0f7446313d80026c33427aad00e4689ef0c9966dc5faff93dd1ad258a032be", - "0x0bf64f9c84ef26104cc0d0bc61594bdc0d22f9bf25b436170df1c47351fc8746", - "0xb2e605741fe4b42abeea0ad054727950485ac432754ac2f98db695988c515d1b", - "0x9b6ef4b72c4c5b8159c308fe0395c8f74119bfc495a64e0529209967a1efab7b", - "0xf682c4da2d193bdc8e23cbd2a35d2d2eefff9281bb053f86c84841a3c88e4517", - "0x19cda96cd533527a9a93fe8c38184778cc79ee8ce389c181e67d79971c82fa6e", - "0xddcf6596740ea21e3c5135e32166e5e7944ab1a37ca60c57d9d005f83015865d", - "0x4932d76141f9f33ea5193e58e1767f67b5017ffc277c41fb8b9cb020304b923e", - "0xcab96730ff161fdecb5c0118b34b2a8c6ca2e53cc38ef76b8702284fd64d862f", - "0xe042dd86029d97b89ed789847c9651d49b2790d68b475f194c63c89974704b95", - "0x548200b226d36c3092fb9d721b74b829564bae7f39a63c2be0a78ecac5c69694", - "0x26a162476b85f3f6e366b3b767eb39227ce358a4c78dcbe6c8e3710c6ae05c1d", - "0x6f388c498dcc8b1e986c17332c8df84af7e8af9fca5c5a59600dda14f74e125f", - "0xa342f25dc1194e225f4c8b4d89b8992bf59517cffee52a1f2c2a0cc4727f909e", - "0x5e0d21aaffd603c4f5d73e5eae97e14988b03e45beb15bc44776e2db9ce20fb4", - "0xebbbed03150c85b1a7c7e7e6a6a67fe0483fc7176bdfe4f94bdb094ffce5bb2b", - "0x40e530eaa7fc24685d8cd9cd94a3f4b01aff4cbea49aafd448cd1f7ab4b0c186", - "0xecb1cc861f12d2be9b1f39bf56363937e6bdd5eee6d7e5e90426e7d29bd75e65", - "0xc0bc404c877856648f5793792aba95c9fcf2768eac65028e0a930c57ff9d158d", - "0x3e50fea97445730cf5c3fe8f05c1d03c2298fcd52a7d9be911d1c989f29fe204", - "0xb512ff3c024347545bc2843bc84f6006c0b1a91f49a7549558ac5d8d331c1fce", - "0xc0fd2941f49fe9ec9ca375d0745803539dd3a9750f1bc46380cad3ce29c76264", - "0x7f37105755852886e86d113ada4b4f1f68ebf0aa36dfa36291584dfe28e773eb", - "0xf0942db3af7cd949ae31d1f690f832c6e4f8a3b9744ef9bbf8e7a90b04a0ebff", - "0x6a9cee1f0f3ae40d63dab9547ea6bf342efb99176fd30d0ed2d8de02f1be6c31", - "0x2c2092ec0adfe352c46ade57b3c115783b7d4a92fb63bd1effef32e162d4b34a", - "0x4aae695ff67508f2d03f8674282d58e4f1038cd0d4c2a6a841ce425433e305a5", - "0x543665bfaeb5c10c0dd4d180475c9aa18a9edc313e52405f1c5fdc151538744f", - "0x7473934014d90b821ca0076d132c716728c19927f5680482b69163e8ca5d79a1", - "0xf3f4efa6bc4e493b5e09f32cab59a9cfc28b5a180a59640270a79927058a4f43", - "0xbfea0aeb82cd88ffa0269c56eedfebe83759a4af9345ebcd2156ec234d99633a", - "0x827eef18a3c2e24021dacda3c00187b8cc87e071ed1e2e9246be0066135fc284", - "0xd567403ba1bcccad81978857599647c0a7008cd3ab1a3bbbffec1217da92b060", - "0x74c8805b9b589e9493ee02bc73131431256d18b79de4fc3820ae5220bb5498b3", - "0x32afddf7ebc9d7efe51e045446a61fef4b156a3379212517b0971a91252e1b2c", - "0x4d050a932e5f971f33353a23c5b3382d163319321f55368598bcc3cd8c67f91b", - "0x9c01431659ec8c4db0cffc566ed9da3d04d5db610c6d6fbae260ce3011fb68fd", - "0x0814da2cbf76f83196ccd5342638df799d881eab6a526eab325c06d75b7f8e01", - "0xe669b4a2569397b901dad843884668d52ce85919ac6703671963d55c0923df5f", - "0x44762f71591afce826580a50fb4af763d7ceddc75d6e74d4f40deb3ec4c6ad13", - "0xd3231536bc6b897a24e7925909da660e7bc2c5154e529be0dc590770b5573023", - "0x8934b9858529b0bfa879142e0242f1dbe68143ac2ab347517be826e2cd8ab087", - "0xe833f8513f4e71ec56adc114106d5a8ae19b1aaf95d91a5ce18398f316253102", - "0x0a5d3578d418e0eacc2be66f8eb365a7cff71e6b287459e25a921befc7c55e79", - "0xc11db91e90bca5f39221330704193e670815920a5319eb06676b5d74e1d7d776", - "0x04f1e0808c62821a8f088ca0172820f469d327dd336db66d9595932826fb73dc", - "0x1861241e353c68afcba164f24f650eb3892f219d984e376336f401902b4038fa", - "0x142c7d1eb631e40562c24d2a271f0fa21be1ae76d6c7d98491599dc0d0580d27", - "0x203231cb071fccadc815f222900beca55777075f7d42563529682e6449138a17", - "0x304bcbcc7b6dfee9437b8f6b255accfd789ed115461b41e933140730a46675e7", - "0xc9f2359de838acb06278d7967f2ffdfd3bda5f46300b21939a760914a7e00568", - "0x1b470dceebbda583263a9373a4ddde80e2523b3837ed3c20b111e6fb9aa99a60", - "0x765ebffc2d48b2fe92c3fb14b301cb2338984f7760d514373b01fb34de466b33", - "0xbe814242513e1ef6903600ffd517b8f678cf306e057e01f3971eac7514b72ba1", - "0xf313f2b3c05a1dac53de10ddcbc4cc38b38be85f89640aafa4502631c0e3511e", - "0xdfb72e306c68cf4b22f62e9bca906ef3ac627b2286d2a261489e2c922d700dae", - "0x0783bc2129066d953ef7aca86ecf53ec3ff2bfcf8920f6079ad0a4dd703fe331", - "0x71f1fbfc2a9a232e2674e3e36547ee874806ab37b22728d8c30ecdb7ed2ad539", - "0xbb098368fb1529222eb83277af668535a1173a78825c7e3ef86f4f45429cb838", - "0xc49eea0b1171263bd8df058e6279092d59d1e8a4f108d1b4004333733bc6e7a3", - "0x6f95c83060775d579005c4731e05eda62753bcd0f95295b395b1de22b21f3b0a", - "0x9869e93ab6e4ea9da4cd12c279580e211b4c870a7e7dca098058897795804e76", - "0x816a76e3c912b639ae1e4b5eecadbb8cc173c3aadd796815a9ccdbf9226d58ee", - "0x29f33d9d30c64af6b372e922414c85004655782d024916909834b95643fd6096", - "0x30a9763617e8337203196a11f3e4b81b82d9642f0cf26b2c654c8504d289a17d", - "0x21eb2108b1ad465397ed3aa8016c09a52000c60aaaf42e13d95c271cf394c074", - "0x59d8b8fe9dd951d5ec540bf46808f01c9ec2a5e9dd0247b34b2622c48bfa498d", - "0x71b8061902f451c6fbd95c29ff960353afaea2b0410ee11cb993ce0ccb8af446", - "0xe69938e7da23b9d7ca611326dacaff95009cb5898abf1858593060ccb5aff4f9", - "0x0aacb29673ba3a0dce850ac772455c2b092b1a0fe61ed34965e4cdf723d659d1", - "0x18bf2fb69dc62ea39c195a702b8e9514be4b9d5eba18af13974a63f74febccc6", - "0x560b7fa0d15ec6bc0add83b6125133b97672b39477092cddcd5e2936f49c51d6", - "0xc8b0d3b55acae88939bc9426181dcc7d965bb5f85cc506d26f966c60a66e4ac6", - "0xaa9c3dea2f0184de1774c47923fb7f6ead25bcdea96c70b30127ad61a6bf67ca", - "0xfa90b6e07511736519ec741ca85d23d2912b509ec608a5d319c2369aa358a82e", - "0x0ab8709a1c9ac4e9e516736b4836febf938a0055d5b4cde960ba651e986f2caf", - "0x03e28cb08abb6912d3a25cb45868d699b89bdbc180eba67590b2cf13718c967d", - "0x1617f5fb8c39fac172251ac4bb1a9b8e20f9c36cc6a47e7e0545ee38fa55a6f6", - "0xf8cbfbad5d5e66d95dbd5e83b2968d08b6eb41d28efed0f1d9205b2297168dbb", - "0x4adf7de19d0498164921d4aa39bb070c6183e8511c9f987bc91d89cb54d8affd", - "0x7b5b34085f3267297b40770c0f27095735fa286ade7521e81f500005ab63d253", - "0xc2943d2b12e44ff193ad957440620e43fd9e8da22d74bd7e4b18846eb93fe67e", - "0xa461d24d7d4cc4fdb8016476b3d5e44017bc27609b7fd09136c3a884915c9761", - "0xdcbd32d171d8cd8702ec3093dc2f149c31542a7a35a01fa63043facfbf7ddea4", - "0xe7c4e881bd4df86737497ae6e3fd65fe9d953b8e1c45ef1cbba2d291be860dec", - "0x1fc56bf433f10fe704662c0f9e69a878f243d8832fe723852215f4d2ce51f9d5", - "0x5d22da26a003567829f9e2fcf0c2be4d0f791d44400936ff1132a0dc367c316e", - "0x985c40c0bda98d02e3bbf9e33d13be1ab4b1b917c94e06255a0d60de8a547513", - "0x5aacaa6e4aa6ec649fa272c1ae2cd0376270a0252c39d1bfdd973f03cacecef0", - "0xf2992b858c902441bd44cfe0e2b3057615b7ef6a7d129bf8402e4270b711b126", - "0x690eccebda6832cdab7adc9a56b5d8ad7842aba0d7dfa0aa073347d835e72703", - "0x41f48f7975d1aff8070e4d787b3bc127613fe74cc0207e6355d80c930577348a", - "0x42286416ff16e06c1b8088e484e1687ccb93c134a880e06ebc621cfd1fecfbd4", - "0x241f3e48bbd35c8743856e8020a2def871ffef7ba897c72464286419a8e67e28", - "0x3ba5d479584f036f4b4f99942a5bc2f51cc9c4af24527dc9ced5c66178fbec00", - "0xecef4c63d3679889106352d9e56b56b7aff5e1f1408e3dbe86e35dfe6ea6c97b", - "0x2a55f99801b5437fa85f91046e933d5cb898ee3150c6a068f658e0091a303576", - "0x0103857974871ee986d9d5d430b5c3533c0b1187353300d25dbecc2aef14cfac", - "0xe2721431cf8bcc77d5652b519e879d0cde2524972d74b6ce3e6a78eb0bdc5c80", - "0xb577b9c2b3348feb5bd8e283940c524d940268a3f90c11e35dc9de3438ff038f", - "0x5bf29a628a6ae340206e02f33eab362240f99ce0e3cd8d440d002ed4495252f4", - "0x5b087ac28a0e6555830f6510fd275bf464ee4d50e6848b251dac4b823de6b995", - "0xd6ca4c3a14090c0204fe4b9ac487debafbf0f984c289cded1de950f2e655abd5", - "0x61e776419693248d8a6b8bb2ef9b9663882b57e60650ea7fa22f1251e201befd", - "0x84d0ee42adb4c9b0e127535cf76a00a0d8129396f861d5d41dea599dbbff3d0b", - "0x509683f63b390fdfcbb699a8a30340abfb5425b257e86015170d7b7296b33548", - "0xe18de77507e00ff5a9097ae81007e793ca9abf2c11f65172c1cb54a189032d3c", - "0x38a8a3c1c0c110f674a7e69039258593e15a9194b1e77ebe6176ef5caf09c6f4", - "0x7e55232c46a25bc79bf9390c2b105d0fb342015cb526cf0decdb9db23d1be43a", - "0xb745498c642fb70abdc71c707bb1e4baabd534c5bc503e35545a6395cdb48918", - "0xa4b968ff3f3760b1fa4b352ca6eb8cc883f4c902f8e7baa2644d5a7726694031", - "0xee106b785aa0d24e57532819d4cb34b5795ab0af3080b38c73168ad565103b2c", - "0x1535e68531fad8e1edcfc2621747620ab962ad38a033ba25d1d6f5947381d03d", - "0x98c83d74aa9e52a7eae636a0fb54475173fddddbb56ca42dc314998c5099c649", - "0xdae0dbf33fc395f96a4dc1a8da5af3285b8dbabe5b34639e47c70b0938a9f64d", - "0x91348b33bec70e0e68756023f1432346ca2aebbb6a43df28b7388f6f9f19bc7e", - "0x575859a6c8463bacb07ff4902b06fe1c31ceb9552bd781003d4ea2e15dc81e4c", - "0xef1a187b7033a67ff5dc0cdfe353f81d8286c533669ed4b0c0ed5168f018cb19", - "0xc671086723929e889340d42392545c10126be24c357d509ff1c6c1a5f9a57d4d", - "0xf4f1fdaf74870f153ea8375391b3c446bc3cb9b428a3426164320c720d755daf", - "0x32caf4a46065b4094869812b25138ebed9b9fe17e27bed2f1e1f18485e29a5e4", - "0xb62d0e1a873015ebd2696616378f4f3f39c5e9396ddeb750110b7ef04f189222", - "0x410c675d1f6583e8364939108dc46223cd9835623473ca18dc333a4b86e69390", - "0xffd66aabe2768327036556eee6fde0c9bcfda2b13280decc37d82798075a0b75", - "0x3acda6ba4917e64e977f4135e8c74e9091499c212e6345c58c399b4dd31d6fd3", - "0xacccfad59b3f59f16431348a3078c1dc0b662876754c1f373351d0725dc1df84", - "0x3a74d9e98aff2b6445b9776cdc21c0dafba808326d917f47d57250f150891bc2", - "0xdd4e0bb3b84db7b6e16783870f7c9bc563cb1576834eb9175721eb9cf75f748d", - "0x35e9a92581c9d402a83a7baa67bb72fcd0d9b3f3d7b1b7a143234fdadd2e67d6", - "0x64ead38ff01f1fb408829012a033eb847aa6ce3e9b99dc5e866338aa9c355b4f", - "0x78607406421e95ff55b3b952d2b4846c8b2224b2a6b46d231482ccec5de407e0", - "0x04fb332ad235e8ec13b07cf30b1c1cb6ba8aba4031f932868fc1da5d82c03dfe", - "0x4fcbf75d2beff58cf1645f74c2ea804c29e1abb6ed8d33eb6da0f2f7939b3cc7", - "0xf58b87be3dde47b6a9615315d2eeda6771fa3b31bdc369ea706f7769bd857af8", - "0x7aa5b0a30ab24a79a54080b1b56befc3c88719219ca5cb004cd45d4ca1334dc4", - "0xd2f1129f7a6a0743995aea48e9c3cfdc5efde47398e6a67a634c1c9865b15366", - "0xca65cece85c379cfdd49b9ffc5ed7e9b8a623e06f99bbec608fc3725e4a1429e", - "0x2e6942d93dc94555d948f3358d7ffef3774889455de4da3565ff883a96a590ea", - "0x063dc2dab7f0c558eda8bf9baf3901e1626416f517352760180557bd45014f06", - "0xc633fc9bad22bf62c85d4ce1c064f3ec161014456c4eff5ee9ee197230aea32e", - "0xabab885f2c04a640062289106e7bef857389db6db0a499468b45f5e8147c5f14", - "0x96eb606a5d165dc66e5c293fa139a9e8e28fb1ddc8515279705afe7a57e318e9", - "0xacb239d8e12502e378326dad3b338700d359095129411ace179e5b921c07e731", - "0x8cf7148ce70d71a754bc04049ae797e930a9b16bf4962dd3eea2f13ac6f75776", - "0xf39d2ae39131332c16508e09eb9d507f4c6bdaa284d1f4a9315af8f6122186d0", - "0xcce4df2d5f9484177965c2440bc54d1fbd0429060e82bb76c3b90f444b5246c6", - "0xbe77cc749e5f436a3b76360998ba7e6e263d39fcf792a6dcd7cc4ea18c836990", - "0xcde5a6e02589515ebcc307e20dcbf163ec85e5692ad9542bab23b43de55c487a", - "0xe7977eaf5cd7cb8c7f4e86a2c3813d52943a12baecc76f2b9d1eeda569c29d85", - "0x1011e0ba87c36df65ecf37d2360f98e0d7351f27ed9199fd7df166806332c139", - "0x9e481944f0e07b91eefc66693b69ea71c852552cf8cdafb1bc93336b971d6989", - "0x2b4d369db84d19be84a7af630b0c8a4ce0974418f407463cad8a8223b208a82b", - "0x7cf34185f5e8229b657c57c3c775987128434e909d72d06956515440678e6a25", - "0x5956c7ee723b161a0e7d74c69e57c96ad28261e9d7358bf25bbc16560a8292a5", - "0xd9a932e6f59d547de8699965c4e5964e0f663b9fd5bb9f6dedb4417d356f234c", - "0x59f2fae38f9ae4b74ba9abc5f06d4354fb9eef65983b1c8b1b025720d1b47d51", - "0x1c418c58dd888b1a546a1245021b52e83b1bd3fcbdcd0fe9bd643fe05fde502b", - "0x0db806610e23383046de4a35f8098597f1889e4dde4bf40a244e4995324b29d7", - "0xed51baa16beffad522b677c19935f07d7182b0a4bdb04330146bba3d8e8f80c4", - "0x2ecce838cf6ac5d0589fea00bab4dc9c7b107ed7c70886ea6519807785096f23", - "0x8df70aa241b84fd616047258f87b04249fe23219808a6e14f3d9fd0181c2f352", - "0xddb9d88567f42cea65b5913369c9791522b4dc4a23b0afab2003dcba337a5595", - "0x2e276865fbc34e7035cd50dab4b9b72c980abf8f7dec50988b86995ec57ae497", - "0xe82487c950c00a1e4a9ac6d2c3d0b80584b44dc27d28d6352dcef8786da3a7b4", - "0x724b23460aeb403ae7f9b3512a1e222a63fe721a2ffa4e2f4f3062da8bb5c224", - "0xe27ede30590638e194e91a392993fd9a9a1f168e32e3b9144d71d46e507d716c", - "0xd29403c683d5b1ff60839587e60eea5a6054588903e7c2c0b6f9bf030bd0d659", - "0x4e9464c5a51b3f2c6a829137b67e266ea6381c069e1701f0bce7ae7742e9e49a", - "0x0b107abcfda0ec094a6946c6057564f60eea9e6a55b2c762d4af5a7ab7899c65", - "0x5f908c956864addc2b57f01074c567155bee41412da6d63ba72971ff2eb8114e", - "0x9c00e148df00d9fb2d5847bef0726a48507871baf12be51373a7bed2a0c43f70", - "0x63a2fc58db6de3a2de3bac57255503791c4204941fcf15549a7839ca8ce26efb", - "0xefd321eb79658c3706f6f2a18663361b3adda792fe9064de3785acd101535223", - "0xa73176de8f5b3a5bfe87273711cc35a042c191aa998dc5a67498b0287e54be82", - "0xb8e2f03d134651957c31c47fff8cee2998738a603267a12f665f577a450746f1", - "0x3276e6d7618e898d6a8e1f014ccf9e06000f7cbb279dc9d078dee38f93231d3a", - "0xd23b5d1399be075454bc8f3613377113a7b65b29c1bc1a515f9bbfcc30b88174", - "0xa577feae921d39efcafe8102252452202fca0532681c2967c06eb63d00d83294", - "0xbb2231f4d795b6ea3894d802ad5f303c19edd2a25dde9c3a21ed1b578726b51b", - "0x81700c9bee6a014df24ac76eeaa2a378ce7febde11903e62a3d223ef1eec39fb", - "0xa1e05fe31cd3a58a3c11cbe47fed738e0add5039a8f97275572c7f66431f3d6f", - "0x8b5d0ea77b923d4faca65b07c9621467f2c891a925ef07009353b9e7ed854760", - "0x3566b43040f753d8a18edf7b3c89d44a2a3565aa0280ec673718ee81b82df24e", - "0xdf0672dd1e1bdaba83c0abd1d7c41d420ecdcab0019cb89b3dc310bab32bc8b6", - "0x2ef7e245c518654108cbea643f8b050257b9d3c4927493671a3a094b1dd0674e", - "0x993a3c5fe23e9636f525a4e5ee514949c5113f3b4db21ffc993a8b6bc3a55332", - "0xa023919b4e8c34cd2a1c7dd1768eb8e856ad2a1f5b101c8fed88257fdede3804", - "0x247fa5256cd95b9cc4431fe13466483f0db6707bd2453b6374934e1edd034b18", - "0xe63370f2acf5893c39f3728b66907ddc78d9dc9947db14ed6a7b5a6a876c69d6", - "0x397eb84160515d8b2beb3d37d7dfe167fb907f8a1a6cfd7457b646b95a18e9df", - "0xd236e18de82fddf7cb7f6df91a4d08fc98d9aba622e50cda7499261d01d9bb9a", - "0x76a526408c824b6c9e8afc5a0d5e5492a71f30cee5d70b4306c2298d348f0caa", - "0x00525d5481988d4c4836dadc936aff84036d99aa42722057b35ebd933c61ef3c", - "0x94e54fe2e05dd7d7e4026c0048d5e64e5314f235607e568cea8c26bd31dc3f51", - "0xab1e0c92b35d49b687188518a7af63584cfb13a74c3a9ad800fd8e1a4541faa7", - "0x5e65f148c1a914b300aea241f07de5c43709c38d279ed118bcb40ab9a3a09226", - "0x9fc8a8843a0eef62d8c16d49c70cbf2f3fe84cc155cb741d647f17e2a664e7d1", - "0x8257ba8acf906e46b7cd0de0d7463ee96c62ccb7dcdbe0fff5fbb6bc0da28d74", - "0x2a57b487f4281cc28a5b107a643944796ef2416d7989ce879d06bfd6d4caffa9", - "0x0bdf8efb30c449b26d5c574000646ac316aff27fa49d6e20420a08e441ed5f96", - "0x5d3b67c6a6324936305f405067ae70a35146759278f77793e3f7c4b90ac0c7fc", - "0x156f094425a09a09f394075d02f5b5d5aa6794bb5cf62d824ece1c57d58ea993", - "0xe31782172a116b92ac0ea9de1cadb81c1586e05d5b3993f10f8f695469ff9e81", - "0xd8f85113147a72b1950948000d75d6005ae183997c798fbbf2dadc5c439be9aa", - "0x9bed32bbf1f626012985392906016db1c993fd8ef351f8c72e2ae832a2efdd66", - "0x1c6f7b17c8bd64e03d21ca9b6dc2df278cf0b8c8f6f60c60741659fe5b34af81", - "0xe41e4494cdfc0e92f16fe6ec78e19b9d8cc3db73700a1bb02fc7670c92e4df2e", - "0xca1032438230b4faea930fc0689dd966604487a8d3abbaf21554b3e078547fe2", - "0x2bb999d1acc6cc7449dc0cb965c3bdff42e49b8ddb09cde885174c45730bc2b6", - "0x4601be8295359bb23f6f09d7f053c637ab2ce7942b762ac55b1da6d312a765c9", - "0x13fcff0af19f7f11af35b360a0199bfe610a09864dd1d42b0a6570bac17803d1", - "0x31b567fe7d9e6a9a3c15c449e9aa0ab8f83a453beb2784132f25b0919abfb428", - "0xbd4af1360219156ba336fba9cababad31ee78e1393061e3ff62f7ac785c41f19", - "0x2e15f44010ce7a966dfd3fea57c5124c120cb60d80a635910c0b2feec59fa977", - "0x68ed80af93e72f7fd9198d036d8b995e5baeb0f97c6f2734379116a5814b601f", - "0x6aeaf5d0decd1a5c8eef52435bdad2a60cf1cc5f79e23b90b7afc0110d830a3d", - "0x349b95da9a3c65e1d34533bd08f8c95c934c49b7c20e6c7e38ce4db60239c94b", - "0x2a0053d5a61602e26d932534d5e9a753f75642edf1410b3ffd61076d27d5ec97", - "0xca53c9d106169cd3a7a870efd2c2c7118ff953b8aea5c5b9896dc2ff9b2c5d59", - "0xd227181ff80d67f95f4fa11f86b1bb5dfcf37385262d82d6025bdeecc6bf00bd", - "0xefa99cf897198be702eda71b3fecf4cc12a27e7c90a258c4230aa847b03e16a6", - "0x0788c17ea693a049784eec30b17c49e66e7a71175893a064db7bc6e85a0b536e", - "0xcf2bdf91c2f44cae1148ae027688f70ae27ee65b8c1159cbca3e41ab7755e5c0", - "0x32882f2cf31033d40d5069e68c799f3e3297a9915287fb317bcf657e078fe6d3", - "0x3401436cb69ba8552d4731fb2f734a9a659cb10ac666f374318420d3e299b98a", - "0x988943c9b35e50f6ab03dc275de1dc770aa32574cf9a90dd0c13e7263b46c129", - "0xc282d894a7e4346a492fe495319c5cc9abf0c7f95e28bdf985710f692c770520", - "0xd7f8e14bbf8c6061a0927e107f53123f78448b878b9562cb8113b5d93d2d9142", - "0xe2c995419467eb379ee043399d89bb13a7d316b9a680f9667dc9defc7fcab80b", - "0x567357333aa3c5cf6b1ba20a3514ad0e21eef11f5a5c4ec999048abb78c5ab7f", - "0xb9f31c6c771e610048dcb0f4553629481b6d243980e1ca9ec3d1400a56ef452e", - "0x924533f9da72137f96ba97b39a95c2c369dba0bb09658aea3a387f3141b5a34d", - "0x2f17e624e0f3213c2d953107e72aca40b5f764f4b31278c8ee32a000119aa3ed", - "0x8d301cf22181c65bd6db20ca01df6e3bf13864f88958fc04861c295a31b9a86f", - "0x3bdb760c302d348d16e634c07f437f793b888bc15fcae52c371675b7eec2e241", - "0xaa20ff689413c62b1d9854ed1c59b1629e9fcd9f99512bee40933e722e4d143f", - "0xd9d0f8cb5b86492abc172c0460cbd819d13c05f055cc1306af6285459223373b", - "0xe0ec50a77f89631ac2a1c38448a3e5d8ee739f1cbcb542b23116005ff0726679", - "0x90238eec2af4ab1e1445ab94f422f90c862afbfa8cd6bec154d2f6f40721a615", - "0x5c2350ae9bd5f2e2355c97b0340e96621bccd43e9a7e4e867ba1523f5a5178dc", - "0x896a7844bc430b330fc094554ef21c162e2c5c890b4525720a612c9f16bd80ac", - "0xc2aac353dfdf9d7ce52240f6b84e8fec9e66d4acbd77402fe7218f55fb76e834", - "0x840ca0ec7af88f0e26d3b9e54473fdfd038d5395165b22a935e941187d529136", - "0x5e1274869d1d7f072dcf83d631844ea7e750f90a6183262622f2db72eefbebc9", - "0xc217f1324e0ba4e36cbc896c2dd4418ca5bfa880cc64bfa913d6212cbcfe8a95", - "0xbd7893a4798b0838629ecbf21a8cea963df8920a792f5282604b59c536ca91bc", - "0x85b22d6088f30f1b262369f869a72e1354036363f70c8778b1560658abf75902", - "0x829935ff52d7148a3c5548bcfc72b736b184e4f4661b251e660313895432d66d", - "0x4b0d3238882111cc0065b1e2c9a71eeccb34876b4ddbcba989a47faff0f505f0", - "0xa619fdf363c41d69d2cd4c8063e3abedb18066b8cb6ed4fcddd99686d684f450", - "0x2dad790e3f5f6be580f97dd37b22a1e80a6555f41726bff0639aef54f0bc47e8", - "0xfe2064175fd61af4c646ff0745a79ad689d9be2969bcca0939393603865ccaa5", - "0x8a18e5e22dd996798181fdf8ae77cbc7929e5bffa0145996b00d83c5e7829c6f", - "0xa7adb5fc7ccbb132a8e22a861cb5e3e1940a4ec7c5add1bc767ecc668d1a84fc", - "0x7ea8e25d742691f53294dbfdac087b07d688cc40a4a2de28fb398b2516de4bfd", - "0xc162edab705ae176b26b495f7ef7205552319a72d56c5ded30be9770860d6530", - "0x5406de06f5e2e819ec8a7efda23e19cde88bf8ea9969e3e3393f1235c4be67ee", - "0xe5a6b4f946655b32549531601ba3571fbcc45bf58a7b18ea24b5f4677fd58815", - "0x5bf157c76ea5a10ca8240c44a72450537678bc949f57cb9a748b445907180d8f", - "0x4f2f7c966d440ab36a1ebf61ecb1a9b1ea4ea6227c29e4fc1214a8c63cee7d05", - "0x81dc3a0dcd5ae99dc7bcda8b30cfe89aee00094258891d445425e8e304a71f08", - "0x915c3f6e8b37680ccfa5dfa941ad2147fce2f99842646a7835e2d45e50e4d991", - "0xe616568cf1a281f42a32686b65dd712e2fd003a84dccbaec32b890440dd206ba", - "0x70526aaeb8a25dbdf93b3a7cf9cc638292f2502b7bf78125e88df90335e594a8", - "0x6b3e974c6a004beea5b38dea401870dd2a68c2902ea8b3ad5a8358e10f04eaf9", - "0x99b17fa583f9f80f81edae98fc54bd5552ad44aeeb6123e99670696541cd0442", - "0xcb13a1b63fb6f0b511876a699ac017aade97d8dec84249680e7e36b3729d9744", - "0x2bc84717485fb9eedb00647c8da26e201fcf05a0b5c42e2e03072ca130d1e3c5", - "0x7bd8ffc908159c25a28a3dd97064ee7a76bfa40628ac54066f83e904596562e5", - "0xb9d16b733cdefe95eed9fb024d5737f90723bdc46260f0aebe2adf23712ebb05", - "0x0d6a943a7bbad9fdbd107c4a1df726f7aa61de4bcf1e1c50c8a32d56828e8c72", - "0x7a264f356294d00e55ef0dd56e8ba793550c4366347d60c7cd31176d79dc8486", - "0xf52baa383738251b1085fd6aebdd0da48414bb993fd3bc427b2a07a6ace8d39f", - "0xe2958f9d5bc0f1b23b5a3923d87567a58dfa31cbc0a63715b76c501bcd022f65", - "0xa760fb572f3a44ac43c0cfb75becf5bec1d7dab5e33222050b95a6cb8938b146", - "0x004437e7463a43de8edcd074a4c2f03ce72e4716f88f03567a50b6440b69ef2f", - "0xd7268e9610100bddb2188bdb0f80ffbc479b67bda2ecbc5aaf18f947667f3ecb", - "0x176ac5d88148cdfd9049d3eca742750edf975c32e649be8372b15e43ce162d77", - "0x118df9c7631bfd903fb46cfa867c8ef861d9e828e6f57de585f17ad351819e25", - "0xea084c972d69e9ffb61665a27fa4f2d0006f0e220007c0b2e4760a95d68c6c01", - "0xd6e2a8f3df290a204efcadd3a34bf57eea6a3980fbb68749029660e661282f2b", - "0xc538e4c7b704fa8c1c123f8baca05bca5fda28df7ad7fec099638a4a7dd4fd18", - "0x419823e612d6a0055fe460ec9593b4fc0298ea94e0ce838fb302ff1ae033bf40", - "0x304e214664a6703ad14fa493ed333cd12f6db8f4f6af1223bf00a348fa3223e0", - "0x4de744c5af198cf5a0048c4a3c9ba578ea3478deae31531b87eba2a0e65b6fe6", - "0x523694986a7277170342c7a53bb710b86a432b0a7a3d96e141fbbbc113ac2e88", - "0xb81dcd531f4ea6eca82860d7f45063ca7de742a2fb41d7b6c1d62202fc1af17c", - "0x205a95c1d7e7d2cd684bb666dbaebd2533f4af28837a6fd2f6a7d4aa68816dbc", - "0x7c48dd0273a7207ceb5a8a1e3b33352f6d438e2a7b45d4c082dd85135e21e5e3", - "0x0e3edf65e5a7502793a8f139a69f3946d567a959ec411088af96da979047675c", - "0xa0b8886550aad717f1b5d57519a4bd82bdfa30e3c8ba4ff81a64be341d828aee", - "0x399f2cd7012257b4991343f191aa688915b4375899ca9519630b5ec6c62a8b49", - "0x56068dc17a965fad007ec7f23dec7d396dff33b0a60c4e9b8d0f75fb26178f05", - "0xbb62f47822b394fa87d70cce239c9e57464157fe2012c2c37e8f6b69515d6112", - "0xd6a068fdc6d4cd90203209a07363ee1eba047703e50ce9b06dab471e0dd1a037", - "0xe5a62c74d81ad110ea0ec13847fe64e4c3e8e48b1eb053f1e381abc0caff7bad", - "0x8ca95a015ea27a649b0bee134eb170f01b5c03cc45a8bb2c40557c1598c3892a", - "0xb124e101738d541ac61b5666c0fa19375417d946a2344ca40baf308fe8449a98", - "0x1b9543937289ca48720675ffd354464fecacd8b251a3f267f42906b7188f184d", - "0x0b48dd3eec04741e0f78cf61937b2f263446d4ba269e8c7d4aff9c00a2fafced", - "0xf72ffe4699fea49e7e67f96fb5688247746c9bf25fb58e41f02b0dde4a8003f9", - "0x08328b322ac26a02e89401565b91a3dd9abee62fe991744e2ecb2458c6c26460", - "0xe9dc223fdf695c9b5480de56cc91fa640a4b73a8cfeff30ecf4db4d36727fe21", - "0xa83123655348b15b947d83c14a241d8e303242614b25c45044fd1a1ee28d928e", - "0x14ac46b1f556ab33fd4199e5a46e0584d00bbcb2592ebfd4d4f66efffe31bfa3", - "0x71ad4b7b5605aebe1059ee484b5ec791e9018b50f92ad2f8d4f3c1548a99411b", - "0xcdde5fea3fec154058e16f7ef877c70404b577cd74f98f7dc45600cb7b598b04", - "0x330f9d20ddac508dcf0e08a4c1eddb55cb5d7f645c13f50b3683a41bced9e244", - "0x76de024aee0b03e96765dc6d7c71acbf253e962b4f3892b94196487821381ade", - "0x1c37a50f5e3c774d9ea4438a629d497705c3bae728e8e89608ee68d7cd2b53b5", - "0xe16a37be64f82bfe54595c9c51625ce3b69413b70e0b119a04e79c5b8d593c22", - "0x525afdc902879df4c23b996f34a5387fac6e41300e1a7cc9e24c630a1a140653", - "0x845164906086e678bfdafbf4719cf8f80d988bca007aece4b031c3ca5df08db6", - "0xa4d4bca2c51e8118d16a4b8ed33d41a73c275bef73072a6674005b9ee7bbb793", - "0xd0759f637aab37f4981b927e688f3e51f17cf90660931ab8bdfa40363a6931df", - "0xf54986144fa83bc3953c4a1c91eebd6a4abb185ab7b188cf7492a7ca430b9130", - "0xa31de426ecf5f98c1381c844e2fb7c959ad8adac39484d71e3bd07d3b1094118", - "0xf64fb1f4de6f01317e242b1198802191a6cdd39e1580d356b9e5442adb69c8ab", - "0xb97a74c8e47d37b3ce7c12ba09b53811f23dcaf4a8d260dd370f45e9ccbacc3a", - "0xf118ce791474d987b9a8d3290be077e8316a6fa3bfcda3600e6c2698264db37b", - "0x547fe45b0ca517f898e6a5fd22929cf533911f505e15de083a5685c8eb1ccd0b", - "0xd74d307e3b5a166a64056f07eb85f60fda1d9c17368a96afc6f8141141f85c86", - "0xa315936672e2737800c6d51fc22b56d918126ec329fa7e1ba5e31af36ea4f87f", - "0xe928505d97d673588a68a08ba6e2a4bc25843592598988c1d168d5c938e230cd", - "0xa6bbd3b96bd66597eb68c4059203275421a529c61471a69cdc1d2d9211aee400", - "0xa46efc7ab47e7a0f57a54203a039a4339d992207b31bc707eac98ade8e8f6fab", - "0x46e903455140f009d1f7e9d224ede2e29d1fb3f72cebeb60dfa64ff059b7ff40", - "0x1eeba50e5530be85464456af3ea0ee38855276ba79bebfe305e49fdebd0dc97c", - "0x30e149bba2c3c0db9038c39871325392bcb41169106131469b6ea7994c5d8d03", - "0x9503edfe4cfb20c38ba2efef043ad824f2b17f39e2ace445fd9ce73caec93c75", - "0x608f294da5e0df707b97c4949b775f64ef76c055459c26b651010888cb888037", - "0x8eb5960dc8e49951c41505ce34160bbd588bceb74468a7dc0898c6744d75138a", - "0xb020dd8cccb6beff1e7d996a740b876609a55ce2041ec0e9f09f683bfb22466c", - "0x9e8333dc01746341ff7181ae95ddb75748cf3efbbed24f3b16885efd0aa19da3", - "0x2a97bcddd5f0a7245c520bbabd77e48432c39f3cb17a0241be9c62ab5d185a1a", - "0xa81cdce57af311f79ae16dfad6808b40e8ece16115978131dde0f3edb29aabfa", - "0x8f321249562fcb94c94a80679adf69aa701f0719515753932548a89a28cdc7da", - "0xda37eaec19bd44bb1892d12d842a77ab7dc5ea43ca0a1a92aaa3ffed0ba9d90a", - "0xab8c920add1f9e922890da5d92ff199b384a5f042f5eb4e3fbe565f5ca50ffa8", - "0x9f52ff4d39142c046effbe6e552500886200c9c3154dc68abe0f9e4bdfa9078d", - "0x1eebaf84ba1e6667e825716be63ddc71a963688f47227e0d17d78144c820e17d", - "0xd2c2c19eacb26695c89b51b75fd616de5c769d0c7169794057575e1dff3800f8", - "0xc5ad683c4beaeb409a68cbaf81532e4edce6f64b60853725e493ffdd93e69f7d", - "0x768303ceca362b8a3996a4823c4d64ea4a4ca5892e91ab0433f2917b96486806", - "0x88e25c3ba8ac976c0382344f4a8fa310bcfc7f51e09efab4faaf222cf6dc5d67", - "0xe05f9dc2db75ce9b0fb59cf1ce12581cd10910dc5b91d744791f564bbb87e176", - "0xd75fad017be9f908c431987b10f25526a9c9d346118901d7e0b84e74a44724ff", - "0x83cd50c6634e2edf21044fe789e82850667862be407faeaa90f9bc3b0c60f9ed", - "0xdf6b6b1134dbe14a48678610c630ba5927f3d75d45d01e56534204b87ed575e5", - "0x3e486fed8ba04ace837ba81d61086b3443ec22a803cffaca18e10e0e0f1cf679", - "0x6b7c8f5e560ce6b6eb94ff8e4f811b06f2ba91048ebc2440e25f2c44eff4e637", - "0xa7a92f9396380b5ce01e3666acf035dc80a297448e1b95530b9a8bd9eb19496b", - "0x7df4150c891991e89a5938c12bcb4e4ca1a3bb3ed17e1d14930e78a3b7287cd6", - "0x9cff0374f59c5c0a8b6b8db636387e0d032922e34049356ab00ffa3f2cac8f23", - "0x85a5ca8ea29b19babb6aa45861de2cd9e44e31ff13f7161ead44139e6b2de019", - "0xe418e0eba34f07d10ba270bf4316b78b15c49d2a920f3370b403dc584cf2bccf", - "0x8500b89c737ce038eb99a443d4ed6dd02e00ab06c836b8f03de3e713e485e99e", - "0x0f324429900c3bb11cf6a0c4099148af93d8953b748fa8974c7cc5d942f6f36d", - "0xaffe95fb50dab84128becf268413fbf2c8ccbc2fde2b6f6d8bdad23cc4ed9312", - "0xcb93bb3ee92074161da7d6345022f415accea11b20c412cbac48247c64d099ae", - "0xb5044dbe63680e5fb8479f899caf746b778524a6c6ef3f56614d3b9832cf0006", - "0x1d9eb2e2fd6d8c78a5a4125733cbe69ff25b95cba736f63627bfab166f736c18", - "0x4bcdb35310f9e23c6b952933f3adb4adcf6b43dd88dcbf80dc2d9ed4f8cea505", - "0xf934917c926b2c975bb0cf0ee0eec66727da942e06c65ecb1e168c015f957a65", - "0x7375ee9c763fddfbbf6fe47b1db34faded65f5123dd92ff469d03a41f1fc47d4", - "0x6b4e2a1c3ad70f07688662e228faa861496294b068e21f040edf90cf9d0230bf", - "0xa64458a7d295ff66658de59d0f166a55dec1f9e9e2be6fc2a8ecdcb77b72509f", - "0x4e50f8712edd21e913834cbf4f8d6baf9b371f0d4592a0c6a11f70a8e95ccd26", - "0xa132bb777e81aa07f8d5a6696e3ec6c800a1c0743a946618d04df4b0668f1c8f", - "0xa552543fb7ce61cdaba1d077338aa31a6b69cbc7e6af69cb5443e2d4e1393cf8", - "0x05c451fa47938025e4fb6835d09e9a92f2db33cc99e21b44b98a1f3b0c6071c5", - "0xac9628c769038d220a38801a43aa1449c24b2277df287b04ebbb4082d1763f7b", - "0x6d188b8c97ecb2e45ff51e573fedeb95083b40c8ae15042289753ae65caeb681", - "0x0de60d18d4f052a11a584be1c4595430ea8f5c943dea397da9af2d27518e2646", - "0x02c7e9849aeadc3011c2d36d4f645aa0d3f23a27d19a8b7eec61e2ee723dc675", - "0x2c974900dc848a8a0eea1e248aa0e2469037038bf9c0768e6e46d2781530ac4a", - "0xbb4b7b7d9ae81c7784f6a8e7c309f30a9794f0240562ab889d4113bb1e775697", - "0x463ece715ed0458cdd0f12cec6ab023fb3a3cbf6eda4b55f3b4115921d20df52", - "0xd535c260190be6f755d84d8812697c8ad8801533b939dc95e2072e2f39066564", - "0x7f3a0e061e646047bab6b8dfa88b092ab003c0e84240dd82f6e7d407bd5a3bd8", - "0xaf4803ac72aa8419999b383e5765544cd61b5ca0071f7dce952d7c24d89ff8af", - "0x1c53d5aa090bb88a8302fefb12080eba29c2f9f198b08b073587049159cf4245", - "0xf71ee084795fb52661d5cb7957c7e710e6171683aa691412d5c816a764f61f64", - "0x9eb207ab5d1bc7d1a44afcb2790f32d7c41f1c54a17b277dedcd8ba1e63eaac5", - "0x2ba6c0454e857b17903fbe79d6396a472216ddd825b81d70c696074291e71b1f", - "0x899f295af86c53f6c27e75e6cb98cf428a5da102be6dd8a8e2e59b446a086a18", - "0xcda6ada90684f614c967b6fa4c37e6159522e2dee2fc8663b6a8478be5238165", - "0xa59f5518f36b97d9fd077f736de67de7856d515f5146d5b1ab1b2a36112c6400", - "0xe7265df96658699ef8781fba631750ab18dc9d62c0b24820e0538809d046a2f9", - "0x4d9fe46ea3b33b6e73cddbadbf8bee4aa31aa830c4a1abbba4567f21f78a014f", - "0xf5d3147fbe7420f7c55f6b06e045ee7d2b2e0ac7f2040ebc8183ef24108ad70e", - "0xc8dfe6d026040fedb27da79dcf77aaf83fdb008792c6366256d5988e356eeb94", - "0xeca183cd9a46eddf04e02e0a82fa295b1f56322e5552a7c7f0aad090d209b9d5", - "0x8e26a0ad84d0c8b5e64b8a57eebf3bb86bdd02e24f24ac95c6222959638a3037", - "0x5b1cdf956d672b244ecc6bd5a828cec7b80867a4ea2a547cf7240e39793cb5c1", - "0x48c8d0fa40f9f6a49fc6378152972b85cb984ec221384484148231ef88cc3a97", - "0xccf14e2b03037c17bd6d47ba41460aa54c826e945c0132692d08140f156fd115", - "0x331791c82f8717e22f27aa77b7530acc83beaaf9536cc74ddb90533327c5072e", - "0x6c621acf6c972322182e5431049874a5e78bbaaf1a3f49219fae2c8425d6b5b1", - "0x5bd86b4984df838b2ced1dd0f3e37ae19d52ab1002a8bea859065f8cdaf6bc38", - "0x3143ad07e92a4b2a24b6482b5502ce98d50df46923ace4845ca35e0948090363", - "0x66e2d61040285db2e895e1aac42b69b41f556e6fa82116c1e84b49e67478abbe", - "0xe4f3a6c6761a3e17a5a978c69d0a6688439d4d6de3bbafd2b830b5066d809e0b", - "0x034280d368d7bcbe1f1cc63bd551c3ac2406f612f8f04801d24f98d89e75c444", - "0x2b9ed64e419ea19e5dea807dbfc08b8d21bc13903e8888aaa15741c6c0481440", - "0x72630a380871aa5ec67bd06bd672fb0128b95499582be5d34a4073645d15eb6f", - "0x9ee6618d35b3fffd4abeee984f1e9f3fbd200e5f60c562cb0ae3200b8963f522", - "0xbb40172754ef37505f4ce8077382eed0c45b0f96c882ac26b7d209b951d7cfd1", - "0x76e973e45252e97e2cb31bb8b79424e5391c3e76893cc7be0c1c1101bbafb57b", - "0xa4218614e301d35b94bc536160007b9b88acb5c9987a44a27c514f6456b28be6", - "0x0227fa09131444917185f2cc802ed389687a4f968f99bb221148ab7effd5fd5e", - "0x0a93fa4f9590996785fd599bf2669b290e8eca7f02ca06aee9582357293a8493", - "0xe1a277823bc99e602027fd18db67550f0d5e60045b94bd2655e49531bb152f0c", - "0xfe8ac01e4e478b4019dad76813449f8155de23b4ba2a6e2091f4c8ba82508bba", - "0xb194b4f530b832a2ecdc88c1bf40580474847b91c300751c810bc5cc408095fc", - "0xf1de598992e61dcc7bc9e1f1490d80d10024c6319954aadae6a4df4ac54ea564", - "0x38138e224065ad8ed4af813bcbb35535bea444f99613d686f0ef4ff00c5a3fe8", - "0x13e6a7016f28c856d777e1a7f54bce788a3e21b129cc1b57d8e5ec21e6522d3c", - "0x1c5d57d845f18557e61b1b3761d9452eb26aed8041a4a3073097259546e2045b", - "0x536848934654d65ec83f7cf9a0f69adec6ae974b8e5944127ca819a30a20b012", - "0x1653d5a4610454d67236e8049dcee0b1a531e25d5c7f0bbce913a6a524a60db6", - "0x7bb7bd63c5985b492c4897d59223335537ed0f8928c5c7383b5ca7a6fa3c3cb2", - "0xe4b8e08d3444b8e14e390e219684a6085fa335d11c1c77c530582e2c3c4c8e55", - "0x5fb6b09c1ac68c1ad0fd2041c27f1fad5a83906d4aea5af0f965cf36bc3cca3b", - "0x40034a02507258439d490a5a282956f9ae304b4ea4730ad6386005c767eab5cf", - "0xec6ae08d9c0033901514ef409a7cf68e1a682a202dc97c5c467259c7b6022e2b", - "0x9082855abacd99a2b634ad1f50d8517b0f1b091cf5c649ba377aa3ad2eccb65e", - "0xf76c0b9744305baeee70b1e274f7eaaf3670b2217fff6655bf69968b5acac517", - "0x917198a97cb8f704471f6500aef3e6f014b09e8da719ee03e87f45c95605f2ae", - "0xfe1a48d29d6ddaec284dc0bca96cc874ecefbbb91b74c8ea6030a9bf80470c73", - "0x9ba5c60cee1a7d901f9832e3024ceb9db24460c6636b98df81d008d1678073c7", - "0x7cba18b1ee4fb25f1536708ad3f4c95c43d60930f67dc2cfaaffaee2f91fe1d8", - "0xbd2b278edd0e75c6a39aa2f43b334d8cbb52900c152b2b8e3ccf7f27221c0643", - "0x65c3a4efdb5a189b46db8b8ab60968f6c16c1b56f9f2311b3380c275b7914383", - "0x45de07d3860d9be6f7b90dfa928cdf0da9592c2054b00b774ba7608f3d99324f", - "0x91a4389a9bd65f3dbaf092a5a49f0dc2333bc5ec7b59c3a48cffe97ba52213c0", - "0xff9342e526815c132251c3202d20acaf0012be44ac7c47f7640f27fb6f2d249a", - "0x48854fe3580cd19aee63f0eda576f1af518f3ebfa9f87d24da87a89ba227acad", - "0x8d292c2072d5ef4f3ab12cefaa60e9b54433a0eb7303ee253408c19394345a4f", - "0x48007c06be01f79cda41ea5791e3ef4bb4e946d7af262b52cc74eb3e20e98a1a", - "0x36a39e5a3035ed57c8227571b2d57317ace61cb9c66dddde57a566d34eb7d894", - "0xca4446f6cfc51f82ded4f4c798da29fde3a3bfa1f30de6cd721ab459e570dcb2", - "0x82812417102865e04fcad17c1682c7608cfcb855267b4ecb8c1e0666537e6a9f", - "0x81ef7d9794f8bec6b04ab899cdfbf3ff735eaad06610258ef7f90c77c83d5387", - "0x4810726311224ee42f1969465daac6f12516fcbbfb26e9febf221fd8d1cfb41d", - "0xb39a309cdf26f5f2011a83a0c1840b61cc5bebfda385a479a6a20d872bd082bc", - "0xe5002eba07d8b69ba9470514d286ab800d28b443531349d641d9df57c3cc1399", - "0x662dc062bcbcf4f45759c85e8a0ff833564beea1ff3894d7c5286133b3615a9a", - "0xb2cca2f7a62870673c70313efe23bfdb57ff9e6bfbb9e73948288fa15a8a2f49", - "0xd9e38758784261f67700452e23a59ab25cf22dcead205a50685d5cb03442c81b", - "0x039acba436cc8d99337c16969a076577a50d609cb2986f42702199e3c2dfd8e1", - "0x7141bec6010aa3d5ad1d543f91a8b10ba3bdab7625fec8a7d404238c09893e48", - "0xe0a2f776956dd92600ed94088b7da0aa416ee83cef35d37063d3df2d3442173c", - "0x7e099f882fa8909a3f67cd5950346a00a20bd0678e7ccfaa03395bbe1a7bdb6b", - "0xb52e8fb670f5386581c89d4b01b0bec691b9e828c9fd8916708287b6c1d49f26", - "0x16b599c31ea0a2c2c23e2845cea74c73fc892f16a2b34091ad9ffc5d03e7f609", - "0x4c04bcbce2e30cb9fa64e6c776c8be2a4cea04512c9d70e2a5d8a377aa77ba76", - "0xad1f20b7e161337e3d7aba00d9dc3585569cd8ca932329b3df13fe5f23574f70", - "0x2961a4a19bee2dee47d9eef2f875e03fb75bbfc30473604c902e76c76620507d", - "0x666c0d915622aba83912b23cf5e48ac57219a8e592f09f9e224af94ed35cac7a", - "0xfa6e99ccb3460635ebbb7ba53b332825f9d5185dd10bc1e2eff5fb6de4fba746", - "0xd3bc3b194941ea52e2b31ac5ea1c789233dea804e24c15000332d41f8bb4a8c6", - "0x07281b9f1ab9e962d46f05c76f29b4f4ff3db35baa777c37c5dac6cd33d49a90", - "0x5bf61ee56f75630605881d34c11fc029f7c2eb96dae86c7dde18af8e34aa6c77", - "0x972d651e4903b97eabbe5a58440bd248eb2ab16a536da686a707770b88612d00", - "0xc953d9cf8cd4a68d7a2d9dfdc3bdad8bd0d511f63cbb2144af7227ba49084a71", - "0x9a90ca2c4dad5386cd71110de906f6d96f80934661afba440ce194e44e5a6036", - "0x8dd2c27d9b327b1a6e2216f561c09c276c9db44c3a87e6f8fe381d7a906c9769", - "0x17362077544107f34233c1fad77f12c9140d0f0f0a5206dd887bb9cf627a20dd", - "0x52afd7ffe299cbfe5f418612ecf625ab1c6debcfebc6bad2569c3b83aa1f9f55", - "0x6597cfda3deb8371e447690b5f90df042b72095551d347eb77b2ee55868634bd", - "0x97a7278a76d38714f16a5b3bae0910b18d2851b2519ef5dff0a791f471cff90e", - "0x0f4124bc20c9553612a8e78b90c80c1341a3a290054c75326753be6a103dae22", - "0xa42039e0a42da736e91ffbea82e58beaef7fa7d88263764611b73ed4775e222f", - "0x13f6c5b099ba6a2ed4701a8b3edd76c2645b68d9c2cf9af924da39bbaa2c18c1", - "0x939ddea54fc48f8c8dcc1ca6c04ff2cd70fd8da9e93abd3ed062da56b75a1110", - "0x3e66eecafa70c79675f26d259fa6718c646ce3828e80652134b792f0366f0c68", - "0xcf507596184c9c4a14286412216f771f0495ea5780bc372d12ba6e8445c67d69", - "0xee64dc03e5fa815ea5e9e3e4d2c87126c8e4c0ff56f1152c349e3f9327fbd5f7", - "0x3b6ba90d23473ab15afa76d95b23b2a86309b0d6e2edd3492c374020e544c820", - "0x51ffa382078573a9bb41ad67b775074ae41f9968e2b38341ae9a64a9f1f74815", - "0x6c3a7ec03f93b7d4b73d8b194ab38a23b512a236731b5e54b8b5bcf44aa05608", - "0x0082c925bab49c6ab52f9b996986123039fec2cd6641dcae3e3ea7d60bd7a2e6", - "0x85185f7d346260f24bad3c767a04bfdfb3356f61138b9fbafd7af0f813e1ddc1", - "0xeb5a6ef56f2926a533d3858eee37cbfb5b37e8fb5bd181cf61448e36d8b48dce", - "0x700da1f1e9339d6d55c54c62cc5523c30901162216c2f182f5f2ea66dcaf9620", - "0x84161dc26196b99ceeea8d64f6ef3d127982b934f49678f6a512c07534e8ab54", - "0xca3f434ced785e9b5922b625e1d2457b156372e4917b9d6c8f4f6a995182a176", - "0xaf62ff81c29e9102077eae515015286765592d454c8e15b0a302adefe22e998b", - "0xafa0ed60bf7417e6f74fa7a9c10ab7c7b0b1e94b699569b0e3f70ab01b234ebe", - "0xd2cdc3211869e030c3e291f4fe2f163ef54b24d7ff0bb4489d73a5159ceb461c", - "0xd74c2a92d3c506bcbc11c1bec086cc419fec1d0bca34d50b74b28f89e86cf864", - "0xcc25ec627504ed9f00af661c72990a36a2f9ee4c4507e5fa4def89303456d7eb", - "0x8edd1c1dcd064b7c693c978152209761cd6c92e449e9444e9dee807fd9f9f420", - "0x660e691453e374d0a584b184a5fdb85894290e1ccc68964a8292db53ca096505", - "0x9cc340e9d997cc319fdf2e00c75d80b80953a90049af766b1a499846c5e08bc4", - "0x58e650852eda00e55bc2d9e024a49b3b7a5d6d5092d837407114120ff143b75f", - "0x5426eb6b6b8965e80dab787befc815c6c430e80231e91fee5511062bb21c3e4f", - "0x4bb9b4512664884f7b63bf27ecc75e0a69e32cf2b980a8b9135e410871ce45ae", - "0x22438f10926c874196f8c65e274d018960cedb55ca43787e18adcb54631df7ce", - "0x68aca6a2e6a51c8543939fd10be02784b1149923652da3f07f91999b75be995a", - "0x12a77edd8cc051f6f991cd3912f5f4afa1e797f5daf010ab17b3925220b12e88", - "0x0d3b929dc2733de2865dab86cf42684e8430c2ed47d19606637f932caf8d2d13", - "0x69f8d5c233a251c35851354b8546d89c7c54012736440c8965c256cc9db7dce7", - "0x6757e97aa449d7878cbbddeec490fd0636b2c51d5b00bb61eb4836685d005d2e", - "0xe1029b22f6ded11ab5ce46aa2594ca90006a04e8848f4152fc40c27735217ac3", - "0xadc4af259ba86cfc93384f3c0eea61a4b661f015209064254bc6ecbcfdb74f5e", - "0x02ff4bd0ca8008db90a121deab0c36e45bfc7acdaccaeae04acf3aaf51716607", - "0x9df6ebb38ba3e1d0a3a82f871bacaf81152bce32265c0eaebd9d9e6026665b43", - "0xc25503a6058ef394c48d1153ee2e70a3d8e86e0a46b29ddd0217906d694a71d8", - "0x83698b68d762e75476caa87411797ebc0050f9296ec35664bcfd3aeffd01d8c6", - "0xb185832a5b8fb209b9a6772673cebb3dcdf3d915886282d6adc47376a48fb578", - "0x32ec2d0710f9681d75819f1e2c28e135b3272dbf1da08e4d64ab2e6ae1064cbc", - "0x13c8aa9abf04b6ec2553b171b58356a1c256563406ced1ff3c84a3ffdfb5c1d9", - "0x80aaed5609e1b594b3c54403ce9977dc558ad292ec472ac73c8d7f39243e116b", - "0x8cbee772d46586087fbbc9b4fe2f54ce2405d2483572bda3c2314e79ca0d8deb", - "0xfbfe6a938e7bb9b05d889f8182e8963344df0ac7b9022302b451b036da261f9b", - "0x39131379b64eb550fa0a2574d504bf7de0219d50e6d55cc82998ac8d2684df84", - "0x5fefe2fe1d509eae61cab218f1bd03196b1e631f5c416e5f2c0e9e54a3d44d98", - "0x5839c1c6580a4c04aa09dfde45ce4616b6f30d1ee794dd12fc745b96b2d48c84", - "0xa75d2328c4e63acdda579000e6df9be72d9348c2001e1927264b1a8c303fd292", - "0x7331a0cbfdfdc200cbbd1723bcad1f1ca6e0591c1ee025bf1842d91e4625c8c8", - "0xe9153c020aedc51102bb9b22a2493db4616364fce9b61681287dabeee881130a", - "0x53b7aad781bea92a14b670dfbf5acd8a55d2721a6146f099b904bbc176771b91", - "0x0de55190007ddb76fcb57cebee9b1ec60d52d150ac83beb66b088a86a234f9d9", - "0xc703435d06a2e1c5e52789daa3587b920cc2aeed658907bb7d6442693c65902d", - "0x6d21f9a28fd36d865af468e2c06ef5f41167f3014251a53aa1d2ea55896ca1e5", - "0x6b24cd5b8a48fd9dbe7e8ea6c492b57f3146009daaa108ae5d1199261cfc3914", - "0x40e49643d669f497785df1e601cb1bedc24ca348f86354d4032b1d4a4c6776b1", - "0xc56f0ff0aa22fa1e19d8785aac33805f7a7a01b48e953ebb126a4728cf502518", - "0xdce90cab31ee9f5a345d03464c69cc5dba71ee601bc22ccc8aae1eb442f3b29d", - "0xa551b514490e45b6669024b539f7bb37e6883ec97ff79744cf1f1c2ba1d21ec7", - "0xbadc6d33cd58aaeabb8b62396e102cdcb6b1ce9dbbf7051f937a890a3f69c2c6", - "0xe544b08143014287bb8d917f66e8f22f2a6deaf6ad4a3996426e2186b8bb56e0", - "0x6ed9b64beac26a5fbbd15c09c7eff96652b710670c2ce52a6856cd998521a27c", - "0x48c14f31b1fcbe0deb7816771f962cacbb7c2c219518f3ce52661a89e9928228", - "0x425fc1308118e8ade59df07136948a210786f8b2b6b0e51ea01ab06653822693", - "0xee9b2ef0dc1dd873a3ccdd77046969a4ae938e5ff39695b891c85921883c3277", - "0x25066a1abffdd64dab20529436c3d9a44e6e837d70b19847e355f63b5140c5c1", - "0x7441baf6efba832751b31b93c9b000d8bf552d0328415937d0a3c78595961ee0", - "0xd9219e7f07c0808d2596cb57e26793c1162ea9efe58305e3a26da6fdd57091cf", - "0x1b42d745a54c5e3c48a4911a27c263bbe42c8f038c826975749c1619c2e21cc9", - "0xc5abf3dcbcee854b06836237de3a461d86a8b76e8081926ca3078531e25556f4", - "0x7eafa90a352f95c8eaa914cfba0aa90db5ab1275d966da5fa445d9dd6ac6e0e3", - "0x4230ac1a58e4d9903022416041d5119991f911b41702d43c1caf0723cccb1d05", - "0xd50f2cae10a5cb3084c9f5ed1f9acfce8fdf3d920d89ef41165aa2522b97582a", - "0x6eabcebb9040f7d6791a0a560b987288d8246db9140b5f188c34a6be7fa17552", - "0xbbcb3c36f228d2589cd7097111ecd708e419bbe034ee6d9aa691d483590750d3", - "0x72eded80c21baaefddc61ecb70ab76cfc68ec8509b4f8786fcf25d037d75385f", - "0x2a01f9310e3116bf3527cf90de19bdc78d9cc677ef5c9bba94f3ec321d700a7f", - "0xfa401d300fed7092c91232a2bd8b0173ddb62b12e8e96a5076172abcd44ef858", - "0x984001b77e32ee2ac8d5678f77e6c425e6ab9fb2ea3f4978b6594b4499f893aa", - "0xfce80ebf8039984ced85b45b5ee5c240df0a6aab809d6bc0974a5b1007c77d4f", - "0x0a964a69795de761278c68843100ee547edea07d790d2efe64d975b65d415159", - "0x5ab1dee36283fc991e00fb52079c232f2d9bfa97377addd05c50fb06a09c11ab", - "0x47676449956192bbed4235f3162d06ba3095aecb9f57d9c8a273052278582fc2", - "0x4e43d79f07711fd4d4a8dfc576f08d954b5d6829dbbb59ae4386b34221472966", - "0x8f5cce2a573190694302db226a2b22a89f4487a4f509ec1a759646d0d5face7b", - "0xe10a0419bb270359d2c190014afc1fe52f8df9454f7a8e0fe205309e5a3b33e7", - "0x4626c976a572110230c540dcedce33a5bbb97919867aaf0520128ceec2e9d8f3", - "0x057b497c49e4b2ba614280de64dd91118172ae4b4646c3031a93fce200c8a234", - "0x8350ba4e211602c38812276000b1caec40dc4376176afcac43eaa96d7af30d1f", - "0x9e93fd7b9b9ca98f26945dd5716ee2a6274f8586d14f05854a0f7f25c80541ce", - "0x9f11403407548c359164f3f93265f12ee390ff3b3631ec7b90b98922dfda2343", - "0x714cca7ddeaeaf302fc0ebf50fd072c89f063061ea329e67c809d62ea9f5fed2", - "0x9c088fa9b25f7a5ca635db39b3c95da6859a5941eb1ae3e4f4717013fe740cba", - "0x634542af50119e4adb4d72bec5d0e3b095df21e76865f683346e1bd544922f69", - "0x2a1fdccea29581063da7db3f2aeca7087ec646b11f1d47e6d48d1dea0122fdb6", - "0x156e283ab987a5da12710b459097b5fe3d79db296551fa289632c0d3f9b33ba8", - "0x3eaa070ffd835043d4b2b25d5e7280f030c615b2bbdcaf3ee12a2b2b4c620747", - "0x863d5bddbffaa9f0ef9f696ac5a7f91191b5cb52383e1d0c0e0d5a60332c8728", - "0x4e29095ca17d15099abb1c6c1eb43cdd6dfed160a7d11731f4d1115beaacc7b1", - "0xa46f6ce03354ca96ddfbfa9e1406dc7ab99b0b4ff1ca5e0346f3ce91338bafa7", - "0x9f19f494df488b250ba31e243c9098fbb7db5801a3f76b219d866bec32d009d5", - "0x763dfe2f87eb816d1bad1ba95448619041cdb3cfb1171063c043d1e02d9f6ca6", - "0xf8ed4dc0fc0c03b964eede54ede5e96a940cc85e1ef2191c11465f2f1e3f6f0d", - "0x04f0d8ff18d26b490f137f23144c1ca0e475e74a7f1599fd2f6a4972a3d1c215", - "0x012ead673926ef6b3d2cbc5332a7bbe5dac977ada6065313e90975360dfaff3e", - "0x773ccf0a297a22c43b29f1bad214ac9e3685a5d0bf1df7d49fd4b92065ee7b04", - "0x10b7f56b8cc84f4be7533ec00ae46c7ba852f8d093c889b7edd46d36c819abae", - "0xd70605a437bfc6a4cc3468f0eb6d59b293d4ebbcd7979eda36f02baa48e68d25", - "0x68a93b7685277a1ca51a341517d10ec1f03c3018dc4d99da00624d4eeb3db229", - "0xef8aef04d3b7771e8519952b4e067503abe6b2698411299edbe7dc22a79c39b7", - "0x8e72feb3f31eb9f13645a089efd4eaf6871bec26a9ee91452db0464a7e6bc5e6", - "0x3189fb0be615c0f2e2758400050e2657e3197546a15039e595b091cefc9e0d7b", - "0xfe444b821fdfb12248cbf371192783e4e0ea0a938f5ac7b205e15cac991b6c98", - "0x0329c441b6c6c56d76de552ad43596760d37262011d97bd91e595dd559e53de2", - "0xbecff3658ca19ed610e826a68621e7b5cf2ece293ff13fe3f0c57c3390954af8", - "0x695b87703e7299f3e862740bbf47ebf026e5330171509fa0927c361935ff612b", - "0xf90373fabdb83b403f67cc50d79aa37fc26d73ce8fda798e96c4a4b17440e2cc", - "0x536eee69a1cf54af816f4eb5d08ccaacfbbaaa165451d0a5e8b93b2e872c59ec", - "0x17b56635255ddc2278cbb7e7139cf7a8f6e2e55581c451cf53b5b53aa89f985b", - "0xb4a14da295a0cc51076c48032fc1cdbaefff2380a428eb03f6b068aee99a8fcf", - "0xd3cb3797197a398711299f816f34b7c98aafc8a845298287b4522cb0fd645b01", - "0x55aea7b1fd7bf0864b577e38a89c153ae8653da26c72f53a05d164b9da327a67", - "0xd4eb63ebc06549dd7419012d4bae13890716430efb843175a9270a6c517ea612", - "0x6958093bd81e477479a53443b0c95c11d8791b282d028bd9a6204af0c1f738f4", - "0x505f55a445b93a2ba8d5ac5531370e2bf760db44509f15d2f243175b12a7016c", - "0x4608a060b7bf832310eb73a157d285ad824b07d78bb471ea89ebf421d735d566", - "0x68c88d220d8ac23e19459d650594dde939aedcd75325ca2314b7a9419b938c37", - "0x891a1154ddc1e3239b1100840e1303e0627a53ad501996e56891839b54becc93", - "0x8b943abf7a572dd64da3c4e58c1f34f6f7a905fe7ce652a044ab8983ac45fced", - "0x06b07efee0be55002f485ec0526336fec4a7f825ff7eda3f954e8cc7068207f8", - "0xcafe52ca4b5198fb4e4e24f4c04ad12eb8c9f3ebf9a35ebc0014e25dd7bf5970", - "0xe0ed792746b780ba8e19ebedfd3922ca937fd5b8c28b03e0fb91789cedc0fafa", - "0xfd7ea98fb764223ca3c587820eda0a0d68301979313ea9cf0113508a05fba7d6", - "0xa874e6edabaf6da36996b6387bda14d12c3eafa026b1ca6ad5f1f4cae67855ac", - "0x29d7c85005517eaf1165be4921deea5afdae1f66b670d7de0981c4e502acbf1d", - "0x949318f8059937f207ea564672c86943c2c9bb86ca81a3b0a9523e7bee00a5b5", - "0x200dc199c37d16b25e207165c5576596266ce8b62aa8a9c6cd66d69d52c1a67d", - "0xd29108a106a8a5a87b5282467a0e8d37f74c2ae53e6dc11ad63005f3f3f878c4", - "0x44ebfaad5b4ce81fda3d4194c87b46e9e31fbdbf0ad28fe00cffa73f78d3957b", - "0x6843e2f6d3d56b55251ef7ceeb635226940dfdd698215f5d5a4c3e88ede5c0a4", - "0xb84d57422889adc19626aad033b38b6968aafbf4c6d0881a0ef5fb5932c6ab44", - "0x842626b82b93a54a3a1765ef6257a0c74e1ad2981d8da41fd8305adbac99bc76", - "0xeb347385fa0bb37b8d5d17ab60e6c2ed4bfd19210503d61beb88b71d8bf9adda", - "0x509a54bd689b7011504e835081bb9d3cbddd8592ad80da399689bc9172b48a27", - "0xafc5c51176c7222097b12310a3ee5513a7660491682ff1fcae5d168d2c19c3aa", - "0x406e9fa3f6687fa6519067e213377a5ff7875f6f0a3080880536ed395555ad30", - "0x2624c181d4ee1775bf687b522a36a7b9bb754ff6e40ef12363c7d675b60f3d04", - "0xd5c32eb980158772133a99d0af96e056726ed89be84289cb5fc1d083d48cc407", - "0x7b1c5cfee09aba12ae0742d9bc1cc2630bf8c1e141033b18724a524c2c1b7c2c", - "0x77b4b55b236cb7d27c77063a280eabbeba0d7171759fbf851f40b6ddbf7171df", - "0xa04791b79cad41718cd8a0bf604b0e956aa85230381070f842667d88760c0de7", - "0xb1558e574944d9e8910da9c34ed51d89caabbf6541f077a55ef2ae3c513a1e02", - "0x3ef8620edf05514c4e90c1eeb0a896ef30573f963a7507ee90eb76e4334412b3", - "0xfff99365402379af3e56fc9b999d316cea7a1f388623433cbcfef0ddcb6f9d4a", - "0x99fca466439472d08ea602bafc67d1d097e486b5e41b5a059818021f612e889e", - "0x094436d10026f1c57f04846690a0444646b762eef1fc0420c6e3f5cf5b845e14", - "0xc57923978a9dffe0812618f2f6420f30ee927658f9f1615ef7cad4519b90eda1", - "0x3a20d5e138cac29e3fa031847086bc62e5f90a5e363a70fd52e2602545faf9ec", - "0xf3b0bd1d597eb2b6ad98fbdcec7dec2639b92bc83c33db4fced5d23e6ddb64a2", - "0x0d5bbdf1dc7d52fddbb3e81e2d757b848f9e79b6847ee8d30352d4b01ba927f2", - "0xf8f51ff9cfdf6b2ad5609a68433c012c92cabeb3053335d784b1baac087516b8", - "0x5777236f251506c22a92f371e4ad3c78bedae22c4527ed5e796727512bc2b8e6", - "0x228bea6da7246c2dc862d9de97bbf824df6396cec583a4db71667306c5f6a02b", - "0x67ccfda86cfccbb139d77d8d2acf0d4bd980b507acd9bfdda6b5af6e10493df7", - "0xfd8f9ab200dd111c04803f62145fd82e6a79221776904be20a90c1c6328cfdaf", - "0xcd8ce973cbfa8a91a55ec09ac9acad4cfdd050b598349b996d252ecb3935d277", - "0xfe8067acaad74db589275d3122d84f04f717cfda870d444872824300ea10f969", - "0x4112ee457d4108c37121ef4ff0ceb1a4c7db3a9e3776d647225bf0838153356a", - "0xadb045193cb85002f2868c1ffd672bb93e60ed2841ad368bc8399e92c996229e", - "0x4243b3645b99ab1468bc421309220529d8ab204542c6901ce618ceb32b93becc", - "0x434e3c4da46b052402d465220e27d0e243bb5b116967d4baffc9325e326c9900", - "0xceeadbd91caca5832cace1624baa5f67b0d18f725627702cbd7e19ae3c691712", - "0xac54af2cdd95c862b3d9115c9550231f75ca8d6f6e607038850892daf1dd6643", - "0xc4ff21314ba2cac393c67982362a39b7ec96192fe37c316bdd4cbc692f729ffd", - "0xc84746b891e6dd8aac32b2ed0b373172df4ef375afe7e4ab826532b6b3fa9680", - "0x0b0e01ec97c12e488829d13dc1fd420c08475dc95d1fcd72c066d76220af055f", - "0xf0b54fcb4a3e075f391bfe937dd6b4f7481877182ddd4413e8b70efc63aa7f40", - "0x1a78c5cca33184c9e404a05f61cc56968b924d9d34b7ca6d573563eb250fc691", - "0x37ca206f795c02f45abc34380d67b15aa48122444fc444d4b307ab2f7f30a9e1", - "0xe03c444efd29f8d7c89b480ffbcb996a642ac6205ae43bdbb815ba1968051e36", - "0x2fcaf6ef7c22cebd36ccfdb037e66d9113d0965f3b5b89d597d91b490019471f", - "0x11a06d63b3395d09a048aee4d4291c0a6ab2d5f07a7667362890ce647153c2d2", - "0xc33a74c178ef5460b53a9a81aee02d3b42612acea7adb853ef74cd6b65f36efe", - "0xcce38b309fd919a930d38c7c7a7bc828e5039c22a7f3f858fd99c5d44b8cdb2d", - "0xc470e1078c305a5eaf7311d7ff652e24c9dbed83c3572a1c2ec7f6fce5788b0b", - "0xa29b6d0bf49a64182aebecc190a9a0b06931096d9984e7e6da9800ce17f7cea9", - "0xab0821217488504e1c255343939d109353c79298b04c69ff65152dd0e934022f", - "0x40c7bf4dd5a2d39c0dff9fb3bec5c8247093cc1bd55a8087d83f5fa7c8a35b31", - "0x3387ef8b199a2656c39407d503b9bd1571714e178d1dc7b1a74bc43cf88ca201", - "0xa5b2b8b2d708d97666281684641b611efc792f7c0cb27e053eb06752661b35f3", - "0xb604a4b7c3661098d4644239295cb9f6e456854651a5b289a2f4b65e33964232", - "0x4bf93500c257f054e6a6f993f344917215c9c943589644474f5cf98950b8fa46", - "0xa9ae0b7679a65498eeb2b460fe678c3452043bafc344eeb393ff1d930dd8751c", - "0xf21e50f55d7be256d14dba4f8909879cdaa3926b03da9ffa0c63ec3c9df34c48", - "0x88e1e824c968441ebf88b31f7a24fa5cd4e8985ec82fce5eeb13b3a30845e146", - "0x85d5206b3136bee840dbbf8d3d2302694dca2d5397aadcc34e1c1d6accac0354", - "0x00f68e845a2331a0704037d75361831d5a0079af3c6186ecaf256bf1da923c27", - "0x64c594c02b35bd5f69beb236ccc08140838c30b67a1576d2780123e29e073849", - "0x93f6540af637f1a630a8aaeaa86d046e09348320ca5103ebe2222f747a5acfc6", - "0xf9b4b9461b765b449191c7ee1acaad88d4dd7260e2b826c75d506a908fe71e6b", - "0x86aff1c986fbad8da2ca9de6315222459e9c47c58fd7f1a543e6719c566af5e3", - "0x68629388371ceb2a08bf7e335cde88a1bad7127990b44135058d62dfac258107", - "0x9b81d6745d5ab0a3459d26b97ab8f19fb38bd38c758a0ef106a025d091f6f9ba", - "0x2b42455bb30c387315cdf205a8a178ae4bd2d2e221fbfe4be55f5b364fe9a7bb", - "0x555e4dafa7d5d3f209d70a5c954da144ef231638f4a63715152bbfa4fbf82b4c", - "0x5d779a8f08d68794723fb5e95bafd7004685ec21d2cbae0e5ea728b36418dc36", - "0x7e5163ea9b1c0494aa997997422b02404a13b690257757f87f69bb42f81ba28e", - "0x3814efbbbfd4001641da7d5c93483f96467d55aa8b5b2aa6f980bb12a0dab6cc", - "0x431b7452a8157e3a6cf89a5a85d22127a1282877750519a8cf95e172c654c3cc", - "0x77ad2749e61c96fa868c7764ea626baef8a1bba56d3a3106e981869f9736ca76", - "0x7c069d14a86017ac36cb9007fc9bfe75ca92cd2522dcfd7bbf9d85c5133ed8c4", - "0x21dd48139667872fa67c98430f68e8d38c2948f19fff534ab2a5b8e0b92a4d51", - "0xcbc2dad5151367e6533963061712ee325f08e7df3cc7fa73eb5220cb32a2ec4b", - "0x398fa6f8d2b76d482a0c312bbf48ba8dbe9fb8ae06245da60ac68ce50f42638c", - "0x4ca92096314fe1d2d8e07aae3df39a6237e718c1396e88f3c0b73fb3124c89b6", - "0x3ae030ef952e2da7b29aacb08fc41776a44fa5a6c42e745d8b7991ff82566730", - "0xb4ef4b02dc130cea24a71a6053639238db2db30d4752dd3fcab1d98442fc3f94", - "0xa6256dc24acc6de428f47aab0b65a1f36855c7f0834a3e730d10a3c0c8d2bc49", - "0x9d8c8bfedbcf9552ba9eaa08a61846c52e240ceff531e7b19415ca148781ebcf", - "0xc6737357b53db7d2a14d7e7d4130fe6a516fce1dd0c7716be6137d93e21ceae3", - "0xafa9d3182fe6246f6c8d7b96852bc5dc200e8c3a97ce7d262a18c2fdaf5bf2b7", - "0x8064a1ee1eb4ddbf301fc983a03fa2983bc3743602bbb96d7fa6ef85780ba79b", - "0xc4616fb2fd5381efb37719cd9998c5051966b254abbdbe12228b2210c6f79116", - "0x05c30fff77a3d751853e3ae4c11678755c0afea16480a94bd99d61ac894300e6", - "0x47757d0104771c7e288f383bbbab1eeca2fc752d11989674305898e047a71bae", - "0xcc0f857a7617c16da7d35363cfc0af0ecccd9b1870ffdf1a2b2e2224ef81f876", - "0xab3a1b65f93df60eaff5df9e0bc1d91152d34d3428961c207f36ac3a94f61257", - "0xd0cd178507f1c3bdcfb7b528933f2d6227933bee2614636f3add19a66cc089e0", - "0x6379b65e140eed64020f496a95c36b3c27ea10387f78e0faccc5b4018f8f73fe", - "0x3b6977a571ac8d59bde2e851fec4384fea35a8d3905735fc8b8f2a8cfa6adcbe", - "0x2f193712529ecc908ee0a61172ec7839a9168cb424d8f108e7d7cc356bf20cf6", - "0xfa3e48832d13748aba9128bf6bfc76652cac371e49945fc33c941a9b294f7033", - "0x7086c7711a91271d7e38998715b4a142d7ec107accecf29f4518efe9f3333c4e", - "0x05c126586f4a2c1dc5814d07f158513d42282726918f71bcd1b4e0b67ee944b6", - "0xb7cc1efbf6880a60abe6b20f80bfe2ff3aa59de805ad964f8a7c5ed3bcefdcc9", - "0x64189964cba347ac35018ed9169ae64b78c3d0430145017cce83d78667b648d6", - "0xf6b1d09181b9fd18a0efa47c15631a6aa0eb01613a5fd1068834c4079e1a95e3", - "0xe760b5c16aaf587bee263f348f9adff4e04628b94ef27c828cc7155ebd3ac902", - "0x523a2c0fae8b2408ffe1c3b43e0aa7991b82336ed136e84c3f7d458d31143fe3", - "0xcc6d742b22b4fe3f41cf783a2f6f8dfc97a4b33866cd4bdfb27b05bc2ed39162", - "0x4d4ae86d282ec414a574370458c99e189062a3a48dc59a8e8e2a44790ce9b841", - "0x6fcba6a9469de1db92468f2b58b3b82c5080698aca4403ba8ecd1cfebd12b657", - "0xe7b584b0bcca0a5a119c8b2cddcc7a73c94f6f6a58503ddba7b0335815302f11", - "0xb1edda9625ea65b96a4485e10c798c707f6926e4ac2b51340a6f9d212a71a737", - "0xd8e2a94d4c0937a2033dc3b70b50934cb5b2ab54f57336cd6a8882af9f14b8cd", - "0x93ec08aaf09bd453c2b53cc7d9aff059681e0c23044f99569d0ea649cc7b885c", - "0x8ea82c1ca6be16616b62a8dbd88c75217470092063e0494419a6a926279230c1", - "0x175d030004e718f39b3986daa3beaf2e1a523583e529d6e90d117cbc844c647c", - "0x34cfcabda8b4f51cce74befb08f6a2e9ce884175f33fab59f26c60085ea73a92", - "0xd0570fbc17dc030bf6e7e3619d56ad2e866868939e4e5b23258adb191997b4f1", - "0x83245688ccb6e6f1b541930a3134d3141ef01a5f9b3f55f0321039b9d4a3cc1a", - "0xd782158768560d84ebc21d8e4f270f30055203b2d83c46ccf53ff8890e833fad", - "0xdaf31d5afb20a502b28329ecf1aadfdd16b4fd9118b10f9bebfe6f986a902dc1", - "0x0e24b26cdfc345d98a6d6dc3f4e3aa2629aab6fb2ca3820a78d58b10b09deb72", - "0x895f7a9b16ef1d1933c009b38a35a41632d00735a906b035f7fbdcaff1665295", - "0x70ee8681968778cb7da20dd794b75f08eda6b4b6e4aa653464436ff3685c6186", - "0x569f51cf2b92bde98085c2c167b773fbb9917a35844059696a1a97e378b5b577", - "0x4ee20277fbe5d2e616dc0b170e40d5b62cd8dd9f058c648e8e0d636316be7e00", - "0x1224d7eb3ae847458af472b19d3b0ddb90ce822f3389619487e68f3ce08cf6d7", - "0x57fb6d2ad5a75648449c99a46d92570b1dd74757dc1c0c11fe4923748eeb1711", - "0xa4ebbd26ed7dce135ce61bea0da82b8262d4a5319a7ab9c94527a7c670752b67", - "0x1533f0c29bd8a7b8d90c4c0755fc0b018439291566dc33bc816c8ca21269c63c", - "0x9cb5a5d41061a2168c0a8175d2712cd82d27cc777a015158c2fab0751e192d25", - "0x479f0a41aa04509beacb2eace213d9375393f583d384dd4e69b5b921c681c845", - "0x5791638640c821778349fc3064f6c5215f973f2b4f098ab38fc2138f6a8700b4", - "0xaeb1dc9ba82aa0c9ef266d1beaeeb5c756fb497607ee680c0a161b89cec21d26", - "0xb13f56956bc48a6b0760639488463cf403ed47f6d94c7b6e5a6de1d3d35800c8", - "0xfeccfb58d300594be16cbc9b5502ce851de36e15d62164317ef6e3dd9d72015f", - "0x3b218812b3219e243f99c6d23f24ba2b70e91b6a1e9bd27a5d3c83622c176b2e", - "0xfc8f86579345c5fba8e86d1263b3e9d01dafacd0c7347fff348c9a661925180d", - "0x50c6d100a8c0977d24c78bb58021df17c880a36f1ed118a0806d1aab347e3b42", - "0xd18166f82e90410a556744042badaebf3282c65d3c1fd81cf7e599695436b2d6", - "0x8f47f418fa13eee50b9a97781a02cc6a8b6818389f1b1f9b94aac17897ef1bb4", - "0xa4b3f32d84a547f66ca91ec35deacb2d5cb4da741059c01419b60b8d526d8a15", - "0x3187128246074cff2e8c0928dfc6b29294b0ad3f2ab839e7ba6d0b72f4f078ea", - "0x213988ced1828cfe0021da680b166b7d830b66a795613953589604d09b58bd5e", - "0x343c1581b9d75f1f72a787a29dba31a73384364672f0a06ec6d675bbc5b81beb", - "0x59a9da5a92994baba7e27688505df673c7131f4de43e6d174389124463eaa0b9", - "0x15c6b483253806002ed293f89d86d66314e55fdc32633f3e15dbd73dacdbde1b", - "0x01c22d029f765b941eb772991d3ef50458319d49ecd1e237ae0d61a05b7ff0cc", - "0x62f5ede9e4ac720b4fb34c239953b3289cb77e4e7bfb5268925727f5d21f0c75", - "0xe330297f6aceac790b3f4741efcaa4e58fbe1c61dd52c1d9bf99220803132553", - "0x47073de2812458f45fb789cb1a6d57f9ae772a38deb7dfd4c8c21c383cae3cb4", - "0x9e5dfc6bfe32b5f56c9799aad47fe1a01746fc9edc5d8583dbd1c0a1f7f81246", - "0x1d9a6fd76fc6a6f359fd917582f6a1af617b0b21984fe7038c323802660fe1fd", - "0x6f50b828af00200b81d65e14f07f8c34a5d485056b017146699fb8ac4ebc39ea", - "0xa8b15957d1dea63b64c56d3e40dffcbeacc5c9b8e35d27cd66f61f5c293def93", - "0x0ec32ee93cc52258a0de9eb53f48132b7101abd3de242b9319e791bc4205f57d", - "0x4405dae679f464fda0959884464e47f7d21e21d69288b66c35878560deefd6b6", - "0x1e490b1858da4d82632f376234e04ef4cae529c3307f3dcc5f5b893e38a418b6", - "0x4683e9dde5e2d66da4c288452eb653e2e6ee3a611f36cf2c80e5870c187c28e4", - "0xa657cd63ffa0cc282221e70ee3dc8a7f2e9eed9b8544f25467208b1954bc1f4b", - "0xd8ce555f85b979a26f207bc1e86d1463ab77f8c7e5f5b3c7db6d79785e388662", - "0xf604274a19dbc99c4c079ac4caed9fafd49c123226c3c223a53aff7f7b253b9c", - "0x4edf0d0aa873fedea6dbe3ad1dfa8a2b5e312e2c2b51c464c9af60a5a5c588c3", - "0x5ee990ce5c4e5eda4d80885409624af7b8075bf7349f386a40e03ae64b578707", - "0x3d34e4bb3284428153db9216319a83c3940ee95d0a47d963dd079a46d14ca105", - "0x7503687ea102d05d92bbcd2397eaa1edb42f757a0ceffd3abc871d2d895214db", - "0x7e7201b9fc6176b6ef993dea53732f335efb98abfa3d92462231bb6a5186bf16", - "0x1ab3a0afd0338ee34e047c60cb2c766521b3085658ae2e019c0688c2397bcfc8", - "0x68b5df43d045043400e3583c4ed125ef0df6f1617e30693525f68fede915349b", - "0x201fe9c6fe4cefb948972c644fb9d67634e30529589b4de597f9335bbd6dc8ba", - "0xdc09d73232f082162df780069a77f180bb30d8b736457b0c746c3e0a29d7dbf6", - "0x7c33f90910049812c0a87aa8321c97320ca8953f654f8ff7b6e3982b13e2cc32", - "0x5658b211c7a5a9d8d66be179b8d6039c6fcb5b5c9d232d4655e536e21fade31e", - "0xebfa63617d9055c50466157b9d8d0c16ae58f02df12f4e23f4bc09304701391e", - "0xb29f737d036e5d7164786e62b14d1f9c427792fc4faba265efc59360129aeba9", - "0xa1271a340258127b442c103959fd8d5f6369487c16575d90f9f1267fc3f78456", - "0x1d5e62fc56da958eaced4c2e6a58ad4acd3e978eeeb0f417e4a4078c6014a8de", - "0x4357d167c61da7d4d0b3f1646508a859d8270842cbf1f1f9f082d8f713da3904", - "0xd9556c35934ffc3ad2970a448d8caacc43e452b509f2cce4cf755b19d888b674", - "0x248efe4782d57127bdeb94420062b742031a4bd51c41d36375a9671b279b1e09", - "0x94d06fff869c9923ce5f524c3ccff9d9609b0b36562f47c65c7f8568d3f9207f", - "0xdea7e81ac2b15c4b145dfe132a1dd41300fae3a86eee16f936f46df16f33c686", - "0x733fb7f221502d0f10a13a5ab0473d50746afc5ed442dd69b4f9378abd304e87", - "0xc680bee47e540c3d706cf461399fcc1d7a6749b4b9f6808afa099c52d28cc6b1", - "0xadf685a187510063c7cf4b3ef6ae478705af7b4dd6c3c4080239ddcb6b069b3c", - "0x4ec68b78bfaa971ad03296b71dca45e36852f04f0cf6d0e8ea681c4d32ef6d64", - "0x407017242e04da4a1d4b16d59c59526a172e18d1d7abd4a343ac28ac883298b1", - "0xc92af4b5d045a6b02f2df7cf5a23173d969c447d7c006457a5be7f0251446488", - "0xfb8367fe9396d369332684b2fa3fad1603c7b572dbc00377bfcef0021192a52f", - "0x1d73c88199bc153c932ba313175344b436b28e5e0b39c3353d076c7e26fe843d", - "0x253fc1aca7544fb93d493684be03d3667628b5a0f3f516d7981e3a01e6656440", - "0xb8fb006c1de093ae15658b7be4b6625d5c6d14a5c4dd2623ac9a31e2479d32dc", - "0xb46abb8860cdd8ae411231d897af8269057060cb43880e52e63254f698af82e2", - "0xefb736142ceab502aeccd9df17018719d1004b554154edc5ac62ec45830a0d30", - "0xd9ce776c58f4e1eaf1ca20f61232d3063e98fee3ba0b078e5ba34736a16a7e35", - "0xb63a06ab391813bcf830a53febcf9553f292e097f127ab610745742f12ff7a02", - "0x225004609e0edef06ede2d08f490ef3616b1c5976027dd03f329605bfbf8a916", - "0x748f462a0fceb4743d8b03de6ecad430fbf35d957483b04e04609e9527fa37bf", - "0xf13227684614cb92591a4c0381ebb87b0e52bd21cfa265b501e231d8c3a0e504", - "0xdb56e9aa8ede4b7b042f32190ea90757dd9268457d43231d1a384bc6da5d6396", - "0xb4880cd0f5e5ef6e30e5c015fad427e418ae0efc70d084b7b6d342e1cb71ed2b", - "0x8a59bdfc0413acf03c39f473bd09b34223b109556c4e0fe976a30bdb1b944c52", - "0xfc2f062e32c3fce97a5f3922d3bb5c0842ea02a71775d6852e256ed0143ccb51", - "0xdc3ba03348f62599f9928101c65a8f13e2eabc09a377ed461636e48cc9e0a5a7", - "0xc5b2ac69eb80b3f2ee751ad4aa8e2eb2cc939e81586088986cf9d6e420330de4", - "0xd6d389727a18def7ce0bcaf65417e3d7543b1381b1b49c6f128f3e13f7d3eb74", - "0x02f48b5d43397b1f22bc7617ffd4d93254744b7fb872c051ef8a02698ebddc5e", - "0x90f674e478cf1dd60cccaa750363efe18cb4ed54415db0ea917a09d3d78a1778", - "0x98bc38a5b90450f89255564e3fb825c53d5fcb5eb9dfd9c07485ed6c42aa3f87", - "0x5b70c7cd74a8a92567686c5785657688f3f864b10d2ed8d9f21f004af2d0a3c5", - "0xb153280a3c86e119b7a03dfc4c8cedf79bdd41ee6128b3f5fda20cc83daa39a6", - "0xea4c28d38762dafc3c6716a760883e33666560cd05173d3844e7e280a6d8188a", - "0x8b498049e107092deee810a68bf8914e00d6759a7e62c8d6fda1c5b1531ff72d", - "0xcbcba70e0a5bb3ddb84e1b115432f025a71f2824061cceba494cb917c689f452", - "0x5906b23bc6b56c4e91706c5204d8873d17252c0291585fe4cad030ab6171e710", - "0xce634ca362c4acf53cf9fc68f0e7c8b199b7f3a1f5a2f9cc1c58a31f9650bea8", - "0x840f429289a783b9b4f8e0f575d1bbf0d2f4b00e09ca6dc83abd17d9718ad688", - "0xace326fc69d8ff3746bfede0d167206d3df6093315f3e3cfca8d41a857c20b52", - "0x905d81ceddb8f4301e62a871e29f1f08769336d7c0b94821b12668354af31fa9", - "0x8decc0ea30a4102baac7ccb3e50e15d50102f05f4a3102ee01a0a275d2c51ccd", - "0x56b67da5e38cfc995831754a64f0ce636f060d51c11b746aefac13638bafddb4", - "0x6672660064846341aa343879a40c5b29f10ebd8120c59bc76af66bd86b96cdf1", - "0x3600a734f1b1df6fe6dfd1cf49d8072bab86717bc5f2d276668c1a482e62acce", - "0x28e4ff2dbfe40b374a103ef1bb9e577c0f2cf1186ba3db324286ec490fd02fab", - "0xcc814edcf5ea3fa138fa7d5e387747334c3ad2095ff08465d7e533250430e25a", - "0x1aa1447a8db11875dc7ff7aa49d6927bc31f3b63cd88d2d937f53b1d85e448ac", - "0xa78c6871cc93ff6db876cff3755a59f8fac71e06c89ffc1200de6da08f56dfb5", - "0xf3c259454de9dd21788084bcbcf1cf0953bf7710bd797295fdfecfebd584d4bb", - "0xf86c0f1dbfb94dbce7368211fd3b19875fc831a422989340bce63102a2af3ac6", - "0xbd192dc3426a9b2fa33e2808a258e9bc27e1f14906b9ba9ec973ce604d9ea8ff", - "0xabd37b505d353f7042ef2ea28168f9d6be1a229bcd5ecdd4d69a96663a169446", - "0xf0f05dba6971b57e32e017285fecd48094e6044584889690dd6e0d70c62c3f67", - "0x15a8053e0694262c4954d8110c505ca101898fb5a5814ae8bcd35b8f24d6f90c", - "0x3f8c3d5b5a03f514d0b2f79fcdf7ea58eca2f85651932220362ec9ab50448aac", - "0xdadb41f6e17beff092dbb9a6dd57d3d0951a188fd041f60e455d63755134fc48", - "0x4017f006a6eec8c71840f7051e91dbcb6b18e52fa43529df1121980670f77350", - "0x358dee5f49761fbfe7e6694144a2de8e33614669da6b773fbfa2e330668f4e90", - "0x080216884b389a463ab63c12640f82f442fca56803b2bd7be45ed789db6c7371", - "0x5eb35f253d864713fbe058df986d8af27badce432ebfda59810f096b4e5126d2", - "0xa18c044fdebbe991e181140df95076de9cc5a70c2656ae99ef68e3c1532d7a14", - "0x69af193591c3eb53b00e9fadb149172df458a9e99f403352fcf866bf1456c6b7", - "0xf3a769187ea83cb9d2a96293ec8c9f2074e8231356d3cabe7669aba13f9509f9", - "0x5f26f2aab6b2a0b0f64312d243b7e3dc80621e134fe08f8189b135cfe7d9b2bc", - "0xd3edb5f8556c1a4983450a7d5ecc26a3dbdd332882dd63822e7c8cfb3712b828", - "0x6fd2e87efa3e7d4fb943852a358a515037af5c5eb9da73c3e3dbceb63106d2db", - "0xe574ee1110f966de904fb61d82995be95f3092511eee8195150099cf69fc7129", - "0x6d9c9b7b400d1f5c07aab8f4d23233d26e19feca2279f814729f122c01189c03", - "0xf0756f64317e10b276c71a678b5b62ca94e354c9b8d1ed7019a022be23fa6645", - "0x106402792c6b9f57f4b471736376a153d12ebab21e4bf034b6732324a1fa4561", - "0x33f10f38b702a617e0598cb20bd5df0067ac5ff155cd6b445f1abe46ee3d625f", - "0xffbfbf3aba272f7b978c9815e9e17972786c24fdee8f9167a47e85e9be60a613", - "0x9ed9567c8720d1450b2b0e45195c5a836484a18746e5d5a0bcbffe0b511ad075", - "0xa6ca434a876c017f522aa24937cd4dc1534da3fab47ec57e22ea7d2ad555fb60", - "0x2aec2650b00fa5886b61b1d7c4390dd4e5fd39097e9ed5b1714b741c7b0d4cff", - "0x0cab7259658221598aa39b98d9bd40e18c777ac3b11f6bc7799615c99858efd1", - "0xd76a13ba9212ef2ba4374b265d0405e41ef7016cd14197a2f7a9071e6d4e0a5c", - "0x2802a2d30f42fcb2c953ac6a83212c23711988998eb7f537f9807751b42652bd", - "0xb971ad9aee88adae769dad238a7044c996ee35596cc1b2a7f6e876eaeb4aa80c", - "0x524520c4c947c57827359ffc5a23c4926262c002e6c92d024ea7926a7e0a8fd6", - "0x0de58ec745307c9a36d5f3e97108f666ac58d86b85ce31e73b69579e913d300c", - "0xc0cd603660568434bfa04f6a06342e5fd78c6d916fb8dd77dbfe060cbaf02aef", - "0xde928fdfb8515d944a26630fdafeaf4b3a17dc40b08418097a465fc2009c2938", - "0x11dcbdd72f1b46be2a24dfa6a3cbd8024b6e05f8fe5cacb35618429d9918dec6", - "0xbac41ac48726fc1708a5fff1a06e674a64b8c3a906ec9beb7ff9a444903798c6", - "0x16142a81797daae5fa1914a473f0b89465b0078c5c042f6e1accab6d3ea77376", - "0x6535db5ab7dadf1187ab7c6f0e0a56fdb47a6e6c8f45627ab993b88eb09e7d1d", - "0xa476955c4d2810e17add2ac9604869e9067998fdce26685fd6cf422f861687dd", - "0x4b2ad0b366c96bdba812d3dad76f432dce8f0e8be1943ed92ee4478e9496d8a3", - "0x74bf0384fd4b8afa1bbc0fb0cb6543442a6bb041911a817b55bfa60fb9039733", - "0x5c3da2ac9d4284456d13270fe7d160178cdf61be8bbcbe8a8536da815ee70107", - "0x62da3f7efe7d1de45be7d134d290f9b3dd50e45e751290d870a4b232496ee71d", - "0xd130203c98355022ffd5389a6e84cdd8fa0c570ac887d80ccff892c168a49c4b", - "0xfe129ea286e85269736b508aca4471e643c4d84864809d031dffd660243e2f4d", - "0x69a60dbee253142008ed0cbde35b425e4a2d07545571d2646a5d2a03f36cbf51", - "0x1e2355fe638bd71688579e07145f147384ae18220c8324f95c54ba994b033cde", - "0x391020697dd4cf20f8afb4b76b25f2e08b5f77be696c2406ee45d0d8499adcfd", - "0xbac11283e3e355ef3466ca3dc7d604ca002e26a98b76caf134ea86efb1523eeb", - "0x328b03bf254908db475888105015b638e7b16a4743bb235b85b160e430feee28", - "0xe9450fb3b361bac3eefe1cbe97a096218c40ccf4530a669ff9e10207c69b26ff", - "0xa574c9dc2d563152d012a1931352ec3b9116f949197efad0868a53fe79a2afc9", - "0x629d3aa0c10926f4bf5d250b44fa6959e534444d9f0e8fcf5b206a78ab5974db", - "0xe1e7bfc1e38f36cc8a094038ffa44ad0ff7432c508516e7a8b3520d71714c608", - "0x13ac2b375558ac0582ec61c4edfbdaebb268efb3dd736b6483530db77b266c2a", - "0xa2ec61b999d453a53aa33105a90d310a5afd6f9df76966c53fe524100515da05", - "0xac58616f19436e53d5eed7b50162713711a3f9a76266ede35da4411008de1b4b", - "0xbe8d7a38169e1a92a1ffa712af5173d5cc18948a477a4db917a7f8cd7013d6de", - "0xfc6997785c292450bdc3dfcf9d0609efaa2eb780a6cb33fbc911efc18325c1bc", - "0xb0d71a0c1c3b2f1a746f8cb70fcb99695950ea488216f83854cb267f88c993bc", - "0xa41cb69cbb562b104aefb77c9f0b0b2a7b43b92c7e1bb40c6e781f3667e78c3a", - "0xc3dbaa1d46c2bfadf7b69d5930e00b3d2ee2f0e459310eb9414be6e7d8fdfbf2", - "0xabf64b834999a679f71fa66acc622afa69a45bdf0befe5c8e0224ee12cd3214d", - "0xf788f916838793b4efc5cc80d9f29f717b9a84e877773dd4791fd6a0c1cdfc56", - "0x289de39a57b30662c600ef8056dd354c67722e1fe198ec2bb749c2af77a27643", - "0x580829bdf1584a58d7da444d360dd552818dd1cfd5f7ff4323d21a0c13506b5f", - "0xba51c5ed86b5303e52a3b618f78614bc1640b1b145e87fe625b51ed80d31017a", - "0xeef60ce9f49954e62854e938873e556386b5045a57980bab45e6fbe6a6e9c657", - "0x655bfa2d02761722b8792ee69367dbf3103d16ed0d07f7f8ff6725dcb8f2d955", - "0xc7a54faf2898c69f76123fe1910bef9be9ecd77509ac74714218c9bb8b4204f0", - "0xf59ca122bb48dc6c0c577b04449bb64d7a1ff5661a016bf50e32005f3295b223", - "0xd96401f3f5031c1aceb13d9a3a0525b5bcb7afe47424a5b76e8381732e789a4d", - "0xc74fb4d8533d438c78710932c95500923716fdfa6625154320625465ee32f07d", - "0x63ba1efd6ee8de3b07dd2863eda5d46070f7eb02d35cf670f7b132e16a958bcb", - "0x61eea2352d91b206a674c4c2af59d8a2a0fa70479d77447e3ee9b7db85d353a8", - "0x04b60e8ed3b12a7fab29bb6a74ab7c9a33d403662c47e72227e7eab515f33618", - "0x9c229a533ba459b852dbce6d96bb72c03f9829b9a984119cc4e1c852992bd2f9", - "0x54695b023a34947fae5230256ba2b0905d3e28a28f02c2764f70495d71441a63", - "0x2c47d3759d9df5b9330e6836835939107269d70a7d465be651a3845e4a1903e1", - "0x5fb3708137f2cd39aefe87c67a6c4f9cb60a9945cfb769ea71d0dbb7f3ee8cba", - "0xacba51629f86d56e806aac1561bec11a697a05f6dd182ebdaa906ff77aee7abc", - "0x30ef858593f9a35889c8c036eda78d012e298cde4a3e7e603282b7f8130a4595", - "0x1c11971b18e9c870e513d099e5a49615e409a255725a61083001313a1d929658", - "0x9c6e3731ca9cee43af8c299c02eb49760141e74e1f781d1ba49b6815565f3ce4", - "0xb59c0d2e7c5ca751b9abf8b7740d8d5c8a6fb1799dd1d5a5e9f0ba75769fb2a0", - "0xafbe8a18d07a30f3ecdb907eb4cc05fdd8df2f9e4e91e61f88ab87dbcca25249", - "0x5233d2380755af7c385b5b50d79c5cd9b1255f0145a36245cc6dab7a86c0cbce", - "0x54520d2d08116f06e38d1a316e7e4080f3bd8c4e52b06f3ec20c3a5327f88adc", - "0xd36158eb493e04911fe79cdf4c48dd43a42aa3a23568c7a6b06afafd3ceb51fa", - "0x88a509ee3b2bcebe15ede2063f8fc9a04fe103a84551f279b6ce8d4d36d3b259", - "0xb1b80927c19a8cd540d126e07c52aec2206eaa37a13f2ab4726649d34357879e", - "0x83b1534ad48437dfc54412e49357b13528f0f80dcc32555a2b6f2391cedecbd9", - "0x13d00415b9888e8f64bd3110b04bd47125a96abfe52e0b6ec004c96e142eca1c", - "0x9e3b31cc2715b383eac51b52a3d912e22d3c1f23fa883028ace6a1e80b1c02c1", - "0xcbd325f1c10db1289d1c46feadabc59b24ffbeefbc4f242cecc3dc0dbe5c2e8d", - "0x7627582f663394f8284a6636bf024683547863409f38cb6ec4f67224eaeaa2b4", - "0xa4a44ba1e2badbb513cdd55fafbe2f5741caf2132dd46c602172711c110e41bd", - "0xc7612fd67e5d4bfcd14eb631181977f5b6737855721aa42bf4e9252dec190a53", - "0xbe3030a24be5db7244f04c43dbf419db3c7fde7e7a2f87951cc74df9b88a4071", - "0xab77045cc03cfb77d55f118f15b3416f8f118327e78ae4cc8a074b3c8550f992", - "0x0fccd266f83598b42b88c40c54670e3f2ab3a4c8bbcc0b4effec5ba92e0f26e1", - "0x5285dfd8a25356ebc198835359f53cb86608d1058a90b20980748eaf5efa2ac7", - "0x182bd336222d0cfa5fa9a0d8f4ca769e2d45829af50bc3a454193628e073b44c", - "0xf1a20eabf959a3c1135943378f31a69c049529785e0556a45450174237d8a2ff", - "0x69387452eb76800b6cb66231cf58dc180bae7aed04ab182dcc3845cb1abfee73", - "0x5136ee55850f0aacbc26fe7bcb58a74ea738ae6edc56bdced078297e8ae44087", - "0x37eb930540d64aaf250e003ad0c2274cd047eae6c28bb861bd880cb53aa972e1", - "0x82d64719d65ec1c1dcb0d269222b1acfe77326ee7d901c8bbc542b7696d98de0", - "0xfbbef382c42f25021b7b5787fe6ee0feb1e589310c615cf26642ae507f2e8e07", - "0xa2da021c8e8ac265fd7c181ca94b372375b3c297aab51811494c07a96536d4e1", - "0x7ca0d6023b41793f7a4dad7aa65428e43332f9fe40efb62c1e74253bf64a28f2", - "0xfbe923af0120629c5dc3c118350d1ae310844e0df4cb8ed48decd520fa7b38bc", - "0x3c7efb35e8c27c90cfc06a18160b34b772a5818cb79a1bf62b107ce93cdee33c", - "0xf59c8f80367b98738620c50a44cad556d73ce17a5cc1f403528d72a52fde5375", - "0x7173aafc1f35fc4eaaabb61d26f908a8d0d834252b951f5607a8cda0c97cd79d", - "0x7ccf293b0d2ab799ce9fc487187d61eef099801d8731fa21300bc1b166c11788", - "0x6ed0dde1a0e7bb58435bb525d897d1a9abaf03f235cceee32f3987e1863d94a5", - "0x5a5d21f5ae95355ccf41cbaad953150d3f1231de6df6650cc712cc57f77fb7d5", - "0x7731f59f98388e028b194d16478c9315050555889c30242a836e84e5f27aff60", - "0xfa682bb7f35f7a75c9490c074b1ef4c99afc50f1e32d829c057c765deb899638", - "0x10403d6937901a289c468f7eedfd69d38fea6c6b468f63bd7cb17cd8db4a22d6", - "0xc5ede1b02d3841558bd8ab6f51e14f5a4e6b00daa31f982874f0bad7132465a6", - "0xbf01b8033add1db5cd02633cf114492800816bf01ad4c7e060ae4c9ffe92c13c", - "0x72d22a8029386eb9c26dc3277e08676609385cc2f9addd4095fc1de0ca6bbb17", - "0xbb77dd7851cc4cc50551914a62c71f8b8e2ad7fcb700469a6b893810b7d71a69", - "0x6ffbe73f30d4dc914a859911afea236c9540920e5fc6ea35a5b15baced0c8d7b", - "0x2d06f3ac10ce2d780f52e9f8dcfeed80bed8c4fb628e8169290bf35b59fce156", - "0x1f6c2f6010356f6a37b0217433d7a1f5a2e0cf51c41b6ae6de4afb236fe4b5eb", - "0x011c13ffb7e71e32bbd4517b994856f6d21b7ecf43d117b8642cfaac37b9a8d7", - "0xe2613913bc4cd8dc69550d32163b251cb1e6ab37d65eb71b3aacd05713158157", - "0x54247c638b2b1fe4efaeb4eb101d5177c84c975c759ddb1ac20207341818c6f1", - "0x34fa5ed94aec05a24c812403ad050ccc96d7a052b0d9509cbbdf83503589e3f1", - "0xd4c86048683eecb1e595cf76988e76be819488421c56b96a6dd4641efddf4de3", - "0x541b476f9a0273fba6340f7185c2ce43333de04bdf3c1a7ed022edf4372b2d0d", - "0x65319f2394a1b531beb788f72246a6035539816c618867b0e1d0fa3baf318d38", - "0xcc6b6ebd1eb606210f5d03e191f303c1c4a438b9fd7b81f61c38da76a6bf9fe2", - "0x66c0dd3e062f95edbf9b26189a302e46ceb5cfedbbd50e43139bdbcfe9fa2b54", - "0x728f5ccd05bef6a64b639ff86642f71078719f442915496c430dcd17b437139e", - "0x85a856f40e911384e7a7a42fc5d9197e063bbb890a81382b4ca6ce2e78af2c77", - "0xc80aed20cda1826d775271f2160b6040682095e51d7deaad7405a2f1c801f980", - "0x95576e4497c07a1738d07bd468e65d251f9876c957d7efab7ab7ed0a6eb2c9b4", - "0xc30785c899138565d799884aa7bc486f1a803901b6b8b8b66eb6d97ca597d8bf", - "0x3990fd6682fee93631fa80ce6cfc68fa57e25850860d4d982d0945f72ad37f38", - "0xa136539e69b53ffb451c817c40776af735c95f3392d24d906b22c0e6c6114be5", - "0x8fdb4d50398d776ef876ce77547d4d9e1a4609be5432121ca1dba983ba07a28c", - "0xc7a547ac0db666820263a76b9f9adac876b972b22d6c8bac407ad6fa5c839987", - "0x87aa61ed60484044960beec4d9c45c9112e6e4a70cfec894d5a9f93f94060acb", - "0x50b05f8c5a72944787041204b8a8acb39faf179838116e04ee7bad4d6f21d4c6", - "0x8b90f04539dfb2aec48e0f7a47a1ec601af5414f3284074911eca3a3afc36e3b", - "0x3f9b8f28853028fbd3cb0bebf22a723907600bc2c616ac5251fff33b2df5e9b9", - "0xcd7153ad8c35638d23fb26282ab9361361fd23385ebb9693d8d628a75aec6c07", - "0x370788f25ab289cbd7f9a4b238bd35efb41917b771d8d59493a05aa7bcb3fa4d", - "0x942223044ff0bb9ae56f259006787e5ae6f21f46a3a2bf11c0e977fa60b50b7e", - "0x7dc0e910fa0a6d722dc78f17644842792e619d7e7c044ad47a5fa32583686e9a", - "0x669d80d664251cffc5c7289ae2195a0cbc6fcc732c2af1bf429a4aa98c889520", - "0xd6d24bd4d8a639ac36b14c6d8599ee8ef5d84ab71dd7e6ab829b730d930ce924", - "0xba692b11b9febad8099415d1c0761f2a339328e598d9e04533103afac8c04dbe", - "0x8e9f7d1c6c2674b3139ff88faffe8339e45d72212234b4531654accd66ee3d4e", - "0x2589b94b36fec67b5862871758f86c2773a963197b0d7ba9984427da3b4d6042", - "0xb7d1c1c35718c23dd4498571bb0f4727f3ebb0e1cd02d8094f4713fc0e858894", - "0xe222068e575041014f38e20a85ef1e989e9bb05279281c59569a627769b9d7f8", - "0xb0746c8dbf22e4fcf025fe5383fba7865fd02f79a4403d89753052bb9118e3ed", - "0xbccfcf626a8e36b6eecbadad1870358088b3e584ce79741bf5167380e97f5e9c", - "0x6215dd20373041734291e4dcac34b207235a5d19c3bd24359168d75778b6dd5d", - "0x025f64d258d97752e9b648e956d114c8defccb80c8810113a3522a77ef3f7d35", - "0xc00ffb03dc524d1ea1984eecfb8d26d860791cdde35c8b262faab927891e3fef", - "0x4ec39fa070e38fb24c41af52ae2ac640a859c61c96661d24e53c817228863abb", - "0x7d943dbec346b6bf55c226cae23ee23086185d9377fad511103bfdda3d677ddb", - "0xbfb16c7a87172cc804008bced344dd6c1105a7f0e925f3b7335b6b4d7c8def25", - "0x359acc4a540fb3b54fe22d81f1e3c1b969a99129e130e9e4e24481d024cc81fd", - "0x33091ed3e9f0e50c8c9aa100d9615e8523d594a99095e83863a58cf54332edc6", - "0x5eeb88207a02fe01699c8796b66ad3a0827432559690bf42e76ce1c7f23c0b30", - "0xf5a521239d0f969c8b5c372b84f739af314645de36efd1190f92973c0a2f9098", - "0x1a634f2d829a24589a25a01a22b139b8342c7aad990a14b5e30715d2a83074ce", - "0xc5f62552f5e25ce475af7eea51eba85991c59b73da75eaaccc3e5571b58a6372", - "0x9fb29bce2aff82c7d3eceb134cb1d5c6e6b309b8a9be5d239e6c6dbe231fca32", - "0xac3e3a2edae826437228f39859aea596a84253070a5e442e04adfd5504b9a108", - "0x717d4b6b147ee5eb42baed2a926241dbaed7e6426aae40972488c08430659d20", - "0xe18c4e7cec87f2e53f1e10683835563bb05e182596fd5252017efdf7d29411cd", - "0x6ddc0db9f04fe0b7f8417507afe16b59479303b5473563723b390149a5f09b2c", - "0xfbb88e97efd86e451817b13e55fe3d310edcb302607127808ffb350799631ccf", - "0x5f61ece4f330c3eb3647d2cf9ceb4f3cf238a324bfff628257ac4aa1de7f1663", - "0xa2a3bd77e36c3ede311ef3fe330e4a2b22dd41313ff4ff6347f629777a88377e", - "0xbed3c97e0d2dc6e56006bcbdeb007c8b63e060d80f46b691d38485b03c17c791", - "0xa4e4b8d8922741c5a767d9c4dd71f9d850231d298a5b5ae741397fd065600a52", - "0x0f49e95e5812f573c00dcab19683c391996beacf61442e52a9c240f08f8ab92c", - "0x3701c4ca890dba3cd43fa3b506cb3d9ce540e87c493c6cb9e80bfe05ec5cd255", - "0x785e2c2e4652a9dbc413c4b7bd54dc8c103f6c933eb9ec41ca44e609cf7e0bd5", - "0x7859e4bfa55b11274bb0e91f608c6d840b7de4385ce8158cc08b38449a61213f", - "0x64221410a8e57fa61ee9d1ea1b5ac161face63a493dc7b0da0f398c0d18b6174", - "0xabeeb213fab38140a8e66b41664626f3ffd831b91e83f3cb7d4f2f09a0b73e5a", - "0x8bc1b2eebc3481e54df34a5f0229a54264ac518dd36f994bbd162442fe1190c4", - "0xeb0753b5fe8706efe7224f354cd92381960212ce4d448d3ba554450a66bb5e7c", - "0x30f73d3082f6ce7f9ece8dc9d6c78610babeb05854415279d615eb24d0d10962", - "0x4bdbb7c38040b9f623b67409d8890070fd5d6f89f023556f2bbee1f40f55056c", - "0x18ff647cfbae0ee093bf85bbbe218802afecd7f45bde5dc29c0c76420311f5de", - "0xdf91143a55752eec775c6c02464a781e16c8e93a4270ebe1bf2127658adeb5a4", - "0x64ba37e403fe57a42440bd2fddc1e301297846f69df5990c2d664d3734f902c2", - "0x2f70192df5b8359e851856351ebe2b0888b1c51ce802766f16ea2cf8b723004d", - "0xa5ebf72bbf06ea040306715900f6bd06564887b52e4692333f880e38acc40b0e", - "0x3b86d989319b0c910e74a79b2177efa068d8601b9889b5e3d17d57c59c6a2238", - "0x1e416fb3c47d77206efcabafdfd3fbd0919e7e6d158ccfddf1d0a2a7cff6a37c", - "0x3db2b1eb730ce08d44e27585207b39d5f8dffe7425949fce9e6e1a4f296c6e75", - "0xf703aca3c59fb4e102018a6b156a83af6c93baaa96c54d9a44485a5b90ff6679", - "0xa103f504db51472ce4d6735684bbf46259e04224d42fbbb87548eeb01aabcaec", - "0x282e099b561c70a9a1a3ff6a4518970deac9a096563e15c01151c0c37f78f737", - "0x87bf6fc28f774c2f6bc83f32751e0d509a2e009e2e3dcbce44db2697dab33520", - "0x97d109285466d0d40ed47f6e1c8e11259e69b90b02731a4c25efff829e9c7e71", - "0x18232c1bca21707fe7b74896e3b1568f88094adcc51b4ad9a29a4c76ca33063f", - "0xc230723357dbd10e7e57ab187d1a1f72a27a53c45b650020cffe672fa8e156ca", - "0x6984c028091bbcf3e40bdb8da39d81d2c9f8a73801276ce3644fcf57cfd3e8d0", - "0x8b66e1d6d3d60f03098f29d9f9857a29ae48a5a34d43786a8fe64e6227ee2da6", - "0x353c9a58633a1fc28b5acf9a0f40e69fdd48252c689a9b8db7610c3d003d5441", - "0x1e020c7d1997e15baddb02742e8846228e4eecb6bb1beafc81a759b95783e238", - "0x50e9738978bafa44eff6b9ad9d344efdf40f7ace0dcb146e2c758cb7b3ca05e7", - "0xec6ca85b0c27f1735eb0822dfe5a0d4e642776e2945a9a22e104b9caed098f11", - "0x94f749840d03dfc1d1cc7f31070a1019cceb1eb36a09f520129457057885fb48", - "0xd29d8d19a1dceb08208369498527ccb0fd4aae41077d4c01c715e6989d5f828e", - "0x40b5cc4710284f1175ce67c1a0f134288428d8ea28f64f41fd061a3a4b139242", - "0x7ea68209ad947c37eb3ff8c779ba7f5f3efaad2d61edca2ae5efef666d7c1f5c", - "0x0af74db9e9195f27f1a04acc3150d6d6200a5f50be63a6dc2fa9acb953759517", - "0xd7a6b221519266e935b12a864c84c6d7daf4e4c8c812a93515ea8325e94f2644", - "0x041fd7dff3672a07a2922226bb0526daf0817fcc61cbde7fd3e1f8efa8dd6c76", - "0x79fe74fe4e56514072881413ba7157cc125051476d42fc9361a58021268ff0d0", - "0x01cfb41ca5887931cb98c347c25d6c03eb5e992fd661085307245dc77cfccc42", - "0xa1e93426afb5ef56a564ebfacfc52149e293c25dd36dcc2319d1ee50057eba41", - "0x6a8e8e62cd387ea56c621a5e085daaeb51003e86fc3c252d115ad417e2e79242", - "0x18e5d5dad6f00c36be4ea9c7898645611887a3c3310b97363699178136989527", - "0x6701bc914e70bced06487f22a16792fe3dff4f1fd15ab87ad42dc91de3cc951e", - "0x75161e0ea68a78e4377837bab6162f1b6d53cc5dd76c423acba9bde4f3ff356e", - "0x9d9ea2b7caf0b67dd97b62f0e25d172f78c984baf97ae3851e52e26c5af87770", - "0x4257fe5a910db425844b2edc8badb4977c819a3c40e356d260b93fd2f9170bc3", - "0xf2c878a894811bd844c30441bf38cfe79f3ede5b0574721f32a24755c40aeaaf", - "0xd45e12f2f3a025090fa81bd95e555c8787c26849410f96aa172d3dd153b40a67", - "0x6204243276bb752e5e2d77fc43cf7c5cc92078c283c4d489b7310ea2753ed71e", - "0x806a0a9e0f4e744b02b5091f72f57377a4d7bbbb27829789070967d35fbee325", - "0x13489b922a69fe05869130674253f90b4f883b199f01cd03c85df0a000e1717f", - "0x4fa87d7ead2b1789c72908523c5aa6ef83b7d9559f5c5edb506b4c2f681b617c", - "0x4bad3e31f50fd2dc570c31bd547d278b92e5c93a7d971c38035c09ec5a1dad84", - "0xa0f547806d376b76b33266d94e7d2ef86584a234b540e74f79756e0331405c61", - "0x4bab9342aed359dbce241e580b46043b160a01e44eb62bc29ee5ac413b8a7ad8", - "0xc7ff1b8f8557acccfaf4dd37d13a12e3f9d0e3612398c3d8b1d675467fca56de", - "0xb412685d085b0d52c72ca3d9987cc188f930f759022f060d5f2f368e77a7767e", - "0x0775a447ddac0050f5cb29e08fca1e7d016b42c882ee15bfbae3de5dd99b6705", - "0x1d33342e6115ca2919ad6d31fcea9f4a9fda5dfadfdb4e206e464ac44e59e178", - "0x26dd97156aa189d9f3c799e943f50ad13c2d0cc8018b054af65eb37f5caa76c1", - "0xc4daf50db81c04055bfeba3534a48af718695e2789aead7c3fea58b064bc86d7", - "0x87e2b037cdf4370ece9a2e4a54329d3e1be0b910af6da8c3850ac75d6ba34920", - "0x1b8fd79a76b40690a3bd1bde5cd3b68b36148eb951f45b798958777527a876d4", - "0x63ef67d88acd91fa005706dc9912991ecaa81cc7334ec367340a2c12147cbfad", - "0xe20cf7a6540722b3062b9f49dde601f210aa8cddb5b5ea65eb7bf44f53ce9d5c", - "0x05b5daade0670fddf401298414b70656294b8c5d3203ef7e21536ab2696195c0", - "0x678791e0898a0fd0dff39cdf16d298162200ab1d93beb96ecbf9e9a664362b9c", - "0x77698208c576cf9f2696280872c6f2938595ae522b37c2b8dc5b60b83ce7a9cc", - "0xe9453e5ae3e39110b65b03dca160f930f39e933ecca604f7b1d9db0f3d4e3915", - "0xf3d84caea9ee5dffd395c7da7131456174cba99f905eb734c0df1e070c16d359", - "0x3b56c6cb8308bfe1d9339e14c713eebd5830cd0c538b196d18743bfb729878d2", - "0xd0a1ed8e3bba6cd1ab36ae3e60952e6ae56cf2157039ef2f7136e09999393650", - "0x206a0bc96ac96836c5230d024aab5c7733e4c769b7cfa9fe4c52ec9ccc2c9ecc", - "0x322a0aae92f406bc6c08dfda0b60f625716af5dadfec8d014c6f863eb33c2edc", - "0x701f25bc99f297ac9e8a8e5d8c376f9a363ba277ec87d2eefe30833035657e23", - "0x98ee55ecb672b58e5d02ac83f716013b2e5ad57894383e792cf1bd82cb47b20f", - "0xd7c63ead8a31b5b188fbf0663e4bca087035291834ee1380da270bc26bd19186", - "0xce3824ed345e2101fe30f43287f428c2cdab4a9ee2b4a047d4c6ba1b46a05c98", - "0x853eb9e976bc0fb95caf99b60c978056b0423f2455e5433f3b9d6d28e8ddaec9", - "0x2fefc2d9f5d26e0e9893b98d6546f593dec46105109fbec9c0efb298dd18e534", - "0x255bfda7bb1a2df1a36e7ebc4414338928d59474d9b33f478dab6066275896bc", - "0x678516c205b1f93ddc8d3558e86ccc9ed5dc317387f4a7849ef158e7759234e5", - "0x58d0e9d13bb841286dc4c579c11cfd659b70e84aab4550a75d1d8f01d31c0b64", - "0xb132975005aac90edeba73c75a8533cb9099a5a7f6e9e31755a22b44289bd950", - "0x77ba37c64ec1db20a6dfad1462bc4cb5d49cae6e3c801a99e223e6062dda2598", - "0xe3a4d6edfccad2c55d2a729e6531cc9c20d668dd057c3a8bce78dc7789384d9f", - "0xf419bd76337344144a1e3f1e7a8d3f768fa97f4f1be87757e3f2e50c78c7ab14", - "0xac248be7b1b0f85f35415e09025f379bfbb02776e854d682bfc93caba3a0cbb3", - "0xd853df355a1b6f7b6921870bc5a00a615d5fbdbd9c5214e57e0461a00af92711", - "0x3696d847c84ecdbe2902eb3200013d332d364c0be47f67cc122bd7d4d644f08b", - "0x843a93026d2075704e731fec65fbef6a234eb6d2368f7da29e8e2d3cae45fc3a", - "0x923e0d97b13c9ff4e051cc43daa92960ec646236d1b02faf28902c5067cf83ef", - "0x4a700c31d34448662af972353f9cb471fd155b6c7b5c0afec7acc09e58ee85f6", - "0x2cf612c948d6d8a6ea9886270d5de1e131c2dfd4012f1811849c332716ca650a", - "0xd9acf143ada3cb5e1eb8c3d14b4c188bfce9efc13d317822dc406e08cb5ad9de", - "0x55b3ab14f3d1c8c7b8660a136c98cb4dbd90f8ee329c1fd08edd612a5b866428", - "0xd07432a9b77607da1fe30c98226a224c171cfabf96a1510849255a58f7040595", - "0xe12a4928faffabff9d4835598e103b6079f359061175ccd18159a6dfa7ece183", - "0xa223cb9afb71fbe269c1f721c22fcb13addb8ec06286f9d5b7e337a262c99104", - "0xc133b48eb3f4946ffec9fa143a85d2e009a3b8a99a68ed1d0121c7e9fa616fb9", - "0xcd63f76df5da2994fd87c43f743cd7d35d94cb8dc973cb7a120cb677db9cd5b0", - "0xde86817e4351951cf1b6402036bea2c75901b6aa7a6dff62b9862fe4783e801a", - "0x2872145a9ea250731bbfdbda0b66367300d88f2d9934c6b1d12960067d717bd3", - "0x86e0674ddc6c584cec7931847ec5283675445d337a89d19047817e46e9047d22", - "0x4aac4bdc309bbbcd210b87b0f50d55fe86f5db69b83e201f156bc9ad25347966", - "0x1c0e32260f903386af7e4cf14ef819fb1245d269d2713faa729f05b019445243", - "0x919711d6689630bb81d59ad2c75ace09b462625180ee8fb8fa2d3ac5aa15540b", - "0x231f8566ebd8ac13f2d6cd5a91566aba9074ffd235c762c26280e52feb5ee4c3", - "0xd5df310c108bbf4dcd5f876e0290c5d9c9c2cf20f4f979bc74d962d7da99a777", - "0x45e6ea115a13d30d8dec6f480a9d0b17cb9288f3d2590af02a40bf3dedf3f1ae", - "0xd9930c2a8d4dfd36b70207175e3ec5386fe91371e4b7fb484022e64b5aa8388b", - "0x529278e0e137a319d3a7516b41bcf4be1390e5646fd74fa8c6ece03b9e734deb", - "0x471c07b4e2c5760ad10759fc0889fafda85c2367f2a9147667ad61b687a52fe9", - "0x39332fd9e3c9c89f6b51e4a5fc43d8da10191d07e71c35383e5bafb997c651fe", - "0x72b4753dfe94ecc08b1ca90329dae352e677b64d3e28281b88765cb2e7e3e428", - "0x9a3d06d9134005224fd1f71f14bdda085f18824b9c86b3ec6254b213d8e349fe", - "0x9e8a68163e7e0d096cb822d73c420324ac7416731b27407d74059903c05f2862", - "0x292c607845fdbec84efa2321bdbda9864c3e7e543890fbedf1b85fa4b7ea6b7e", - "0x31be5706424ae91ed9695b2f8f7cb0a81b7623e02da8595f0affd2411170ea11", - "0x9331ce0a7339609a1a4ab7d82e41f432c430685dc6aae81c50ce18aa0592b465", - "0x37dfd9817be661b6f7310ae6c90b3b97fb5f63e0e622618ecedca0d609c39e35", - "0xa350f656a9cf101ba47b0fa109409f1113ae33405ed766d0308740d5497237cf", - "0x272d62080e7b1c27f7134c60ac9f0dd9c903528b1a32338ddc8fc199d9ff2bd6", - "0x8903ab21a203161e433cbfaf719a95b1fae95e029ee19f0c94fa7f1a68f3a1fc", - "0xd3ba92c896627745c0afbbbc9e3d8b5a1511057b24817d7070e08308812f7ce3", - "0x703ec0121dc8e020de0dce30459da694fb8b7ead68bf5b052320c97b0edff1dc", - "0x0491cb350e466467a1078436a1100a70ed6198122f299b4bcbcf8dbac4b1cbe3", - "0x826cc32fd3097689638c8701164358719b6c8645270b70abfc0b07e103d5403d", - "0x351679f35e52895312c8524262a6e420544b443ca3eee81cc11a11c4e40b195d", - "0x0fb18a66d08f29e90c1a71a648d1b36c2dd3fb84bd2e4b8ac24959233cb7a244", - "0xec7fad9848cdb994996bb9fb63cae6e913fe90c9727ba49ab8c9d293b692237b", - "0xd76f7d686c80c1ef3387ff50925bcb540084d3e8d750a862e76e9dce7a443d40", - "0xfa237f1a2b3dd6e4c646d7c77982558af1633cb8662e1d107d5ad5140ec86024", - "0xe7b5e487328a3398b8716043d3e6bcfb39a996405daa98be49493e46e9a46555", - "0x306c41368e9d1a13d4d20256602c4d4182e45b2b69549be7c7133e01dc930057", - "0x9551a36f384e66ad7c5a7d43f510480448f59fc2b3414cb2dafa8d71314ea4fb", - "0x72c3b4a7c21c0ead562b66abb8e6ac42ab96fc5d01c8a5f934df2393b03b738c", - "0x849f7030b271894fd605067a59e373d903a6a52e9fded2357c05340138d3de1b", - "0x5be66687e522cce14e119c9d4b3b3853fef6cadaff6f6c5c2eaef9b6769b1fef", - "0xe063a6dcd767abe2a9e37d3f18b67e2a2efd68ad4d96b4215eb75e4b23295afc", - "0xa8f6fbac9f159d5a5db1e8d614dbd3302bd5737eeae692ae44155d26637ceb4e", - "0xed37085b1ea6b01638a3a145297f390b63b307479e88c55908fcb46afa1e5960", - "0xd963204f34b83d30e97b458148d7e3cd0143495ff67d893b512d7beb7b225035", - "0xdcf4fdc30c4e90b82c2894b12cf27c2c9ca9e4e5ee88d6052d3526a96b93c55c", - "0x48ae98a481df3d2ec8a9c90d0a838125a5237d5716617d4be50d09b2f1f2f592", - "0xf85cea1c73ca422200a9b41a19fec626d13d70e0ae20dbf8c5db66977091e2f8", - "0xbaa3273782c55be478f5e44af8d6d32771bf837002231621eb82fd5b8c07b519", - "0x1dc0a7713568a6fcad865704e07a405a44c2b0096354115f07af09b760eb9a09", - "0xfa70563c38634999282cde0e088e97953e2d8a81180f5c9b2e99ad74493cebf8", - "0x58c7a37a105fe671a833f01f6c189c6f3204d462a0e119b494b6b0c8bd97501d", - "0x9ad437c83bbe3a45191b5c9fca239d1993960a8316e3c52978c266cbfb4d0ed8", - "0x0e8ce8c69bda4ff65d9bd614bb827def7d0f6bce5d550ed72bd5d91c8c1e33ce", - "0x74e04e71ea4c189be803be1116781a66cdfcc50a067387af6d1d468733185b14", - "0x9d1eeeaa2b39e1e0cc9717e921507d34f35faea1450727825d147ecefcf70464", - "0x6758482ad61721f92137d015d4d07bb238b0976bf14a3c548adbbdbba6b73f00", - "0x794c1b2f6ae68389c51761edde1c96b8bd44904769e85a8d7d0035e76be9f13d", - "0xaafd63d0587a40d5b73ba230c976ca80c46a09e3b7f7df136f8eb0b04b60f5de", - "0x67d184707f6e0b9af49aedbfca464946b4f54321c4eaf3263d4ce52de31f8767", - "0xd2af9a84d73ef353c42517a6c5c0667b1f811ce2bb327e3702b49a178fb94179", - "0x2832ef9283d9ffedb03743b454894472eb31740487ce89ef016a00819ff30c2a", - "0x82ea0cb0f3eb68ead50a1d8106278f464e0126c0d7589e6d4c16142d80989194", - "0xfbdc8b5fbb0109cfb3a3b03e01c90c37cb4ee7781563026c338f455ea708058f", - "0xcc34701c30d0ced752f863fbe56d47abfec0c9f8012d1fccacf3814e5bb824af", - "0xb0cdfcf55823aa634004387d1dbc34246921ca0459cf4b9f751377e3a78ee041", - "0x313e6f0cc985a8a0eb2fcb8d3901fcfecbb7d29e98ef8145996e4cea804420c1", - "0xa64f1d4794cd286788c281b14adaa6c0890f9782ec0d80448b8fef906ed7bbc9", - "0x619d70b2e48cc3b295add6bfbb8fc60f38a01e61f4dfb4872b58c1ce7046efb0", - "0xdb35cea33ddc36b0b91b0dcd84155e214a738cc81c8805127c47fb7312257299", - "0xe101f36ff5b89d028618d46138aed3d6b3269605cbf4f83d68c9bbf233f63d81", - "0xe5925c839b60da70be28b38b2081701e3bb0be98cf763539114609b309c5f97f", - "0xb594135c1794da9f7b7af1366d56b4527223c0471ee3780d65cc03cd70fe2391", - "0xd6a8a3b4c6d33bca9b02b8207aa680835266d9c9d4808e2d57f28f92936b7d01", - "0x640a50f666edfa0c4cc55b6c945a09108fdd53af5ca55ae92de4245d56d5e436", - "0x8dc9acbbf2b71953327924fc2cc711574fb1e82a6746a3606a71071369e77601", - "0xd764b84ee9d6a552e34252322f7a939ae546281136a217f5f7f34e41997e677f", - "0x3ec87053d8ec66bf2449a17989721644050b2341adf9036df6843a414a9a1de0", - "0xdca7784726ae438b274f4a3c5892da0bc69ea694791c1ffb5398683952bdea75", - "0x29114fc2dc70ec997d34e3937c2e54136fd1de4ba7fce8353e19af65aef490b1", - "0xf1407df809e1bb932c725821347954eecc9e5e226cd37b6058b45ef9f4fbd377", - "0x873826f03bea4b73698a17d2b0044f1c689daa17925302edb0f815dbf50c7fec", - "0x3e98eaefd07ff2f1f4d6c67aa7ee3cabffd701aa0150f572521a17772bfd8d01", - "0xf44be55471f0b66b065a2465a04f6f47efb35a9ede93a9d8b22aa26d3c6637e0", - "0xb114c762f1f60a913fa570cdb207c279d20abdfd789d7fa62de06e38c44d650e", - "0x6f300baf19fff0f5af714e63ec81314d7de839d4f5900979cc9761e0ac325956", - "0x94d99e9025cec968ce5a80d82965bf72db62250c49131b14c0329b0aaa462b79", - "0xf1ad3dc366363b5a7c2a238e693600ced352984673cc4d0a07ba0ddc2b25c815", - "0xa48dc388a5dcbbd81e38b3e77178a4248232ffeb23acd7869375323f1aba0529", - "0xe995c7008184fe2d5b39eb0b1229caceccc8e86ef5caaa720f15e133e79a2efa", - "0x8bc6d112254905a89fdc319bc231f4d2c52a22d60baea4a499da91119a6872d4", - "0x16cceba4d6c7ccffe424c9331a78bc3748aa7b629f0fefe88c43dad9324a1fc4", - "0x564aceef2d2c0d4b8d6f73c10c234dd82570a9caeb572dfdf023024b61365f4c", - "0x5630bfb3fbd9625f2204846fc81b98774e95191dc8f7995ef33df915f77ce2d5", - "0x23d02e3cb1729ee715fe84775b969989d11c4ccd470910921b75c63c4e9e24b1", - "0x5984c5d4ed0af67154b12c73e38909b45e46e161d85d66e286d33b5ced150a75", - "0xddfc15bdbbd16b80d442f9a0587da4e304d3d7951ada0dc3d041f5a1df85a9ae", - "0x924c83566150cfdd60410c400078830bb4742b7286a6f8badd3e848a5afd0220", - "0x82847029234edd5c2f1538a71ff2eccf1de43e94f651557ba73caab59ef9faf3", - "0x15949ae538f10280406ebf73fd79fe0e77e937f82cd9d0c623e700ff04fa0a7e", - "0xd93edfcb2fb0c16e18b5c42acb751ff197ebee6ef13e01690b08f8e38e777e08", - "0xcb33ce0679bc3b417095cdecd66cbdd4cf5bfd288037d57e93cb6a542613c06b", - "0xa678db01074492af055c36dcee385b37166ad08a4481309945d227640ece520b", - "0x30b123bd31dab5f0dc65766e2b6067e5caee8a53af647b0c7d35d16ab85b2ee3", - "0xfc3faacebfc2c0ed22820eb332bb2f3d9634abc98d26fd42438276541f2beb86", - "0xa0d90324e7577ab7ab5f9667f9d7a0731d223f8edae77dcc9e38225b0206ba29", - "0x75e3bd20d6378133c8a4f9d0ad1121c485130d65340b0596258466fbc733d61b", - "0xbaef6a6c8b335cd317631b907f692cccdd730c82213755988ff7fb78d08fa754", - "0x03c32b933280b801ee17ade93600bed888caf283e0a058bfc0c73f47072f2459", - "0xabc98360fccd9567e9d555924bd815557cd5612836de1b38b63828db742ac297", - "0xdc6770ceead9f41fe0fabf046cfaf0be83f6c27bf28616a97d58c43e3f591ea3", - "0x4f9a91b13c9af1523071f1d4741ead5b6c7a9e72bc2881ede8309040b8ab686c", - "0x175c7e494c7f0347ffed5ce74eafcede61403cd0829d71a9df99e914774ff33d", - "0xe408f526449bec877c0d5ed25e677e8623ea68b797818b93e443179c9ed4d334", - "0x8f3346b57ad4a5de31df1b0b5fb5cac40ef0152fb5360d50ddc84752beae5965", - "0x4b2398450d192781d3ad48ed398fe7cf9e5e8a417b29661894c6dd43e83e2248", - "0xe94177ce0fc04293688209ff52cf53c548ac5b7022e7e60ee739f5c1711099a0", - "0xee6e5c8a30380746df8d9d3f3de53439fe0d864dab6ab5c349012d384284fac5", - "0x9fc9e919898303f537988a6695329143a77e965802be3566396f7a581962c3de", - "0x5277cff2542cb90c1698c7e673b7ceafd16cf4d0750272ebb51e3aa3fb02f3f4", - "0xea07718095d00493c662b21d0dff8bf747783c93897f6f2421571e2c7e3e8955", - "0xa8bfbfcb73a903d2937025226b38aefcfccbb3f9d3fcb0563ede2d9f1cd8ed84", - "0x795af85d146f9e00cfc5d12c97efa5073f19977afeae31c636cb3a6c9771ba14", - "0x60d169884296b60a45cc87beb366a513a6bb7ac34e6acf6066d9abbb1bb3844e", - "0xd256c59553a03c8069aa3dab431c2868c6dee246fcdaa9683b0284d462ad3fb0", - "0x1a399a1ffe8e7f5eb5fa69e70a620e1b15087988934a754a468ff47a7c2f8add", - "0x25cfa588df60eb1127c4057ba949004ef8f7f2681e435fba925f4bf8ce0eb54a", - "0x282d5589c98668c7a9baf871dbd48a3a8c263ea55452086ebdb3b4db440fb9fc", - "0xdd3cfdffe34633d189d9bea7513b890b6d54c2c0d12067d8f45ae72c258c77b4", - "0xc81f96420ae777252b04116d14bb80762c5169b73abad2e1fb23e8bb9334c2bf", - "0x88bf1fb814490289ecdd3d411134d42155a483b7225a496f24ef29d84df164ea", - "0xc6f0b78237824d0b240b8dcf1e31e75e93b4608a495fb7d47ed47ac70caa5aa3", - "0x10f4272adf03ae39311b049b460dce8579b424d3c169101a80aff74efc018846", - "0x52a6ed4acdf0766fc0a63b221d113e3dc7f9e22435d734972e3facdfb3447a8e", - "0xeb75f393b00cbceeace53bff0725e0fa3382e367450fc1c7f0005bb859467d62", - "0xd58b7c94861e7822f924356cf808c0b6ba19c100e49cd8a1fe2ca8a537bb20b5", - "0xd355030bcb4e35157543fafe7f204040ef0e0ecbd60bfbdb897add425112be2f", - "0xbe3ca964fb22fdb9c6c74f07381dabca0e932310cb88676144cd78cb374416c6", - "0x6417c82c4fa9ec681e767a8b3a26640d72c61ea72b1857bd61930187a54f08c5", - "0x0501ac461bf7f2e813ff8b58fb9ba936abe7eb0dc6ef0072f98c52f83458765b", - "0x6ed677008e96476990029e1ac8a86e4d9af83f812dc73d9b876c772c2beb5a77", - "0x9c35dd84c1d73d78dd3277d96ce4c76beac8c6bab498a8a5853970a03026b2c6", - "0xbb0b70d3be3239ac17b3689d67571c12318b51bc6811dea5e8908393d9a567e8", - "0xbfcc8fb9be4c41f8b26214e8462320e79c2fc126abd6e129f701b27b9ac96711", - "0x18bbf70cfc61152ffc64fa6bd21011e446f9d8d1798076e8841cecdbb2e25ccd", - "0x6ec57e3b3b13f8e3fc9298760ea47907c9e08b89bb7599c5cc50c83157a5b12d", - "0x1e681fa5a5d2d63ac23f45cc30720c5b33a3417ef0adccb10b9d9299f5dfdd15", - "0x63397c3ea42e3ea7dabaec5f3aa3cf7e15a4ff94ec745228c0b099928c2a5f1f", - "0xc8d14199fa6b134b84c48a44b9ef1962a9d08b34dbe78713f84ebc0d307c38fe", - "0x4dc0102f265b0e29cb403b258cfee5c73afb843b0805c9218bea86cc12a08503", - "0x4acb64d573cef699cb2d9036488a28bdb3d68a0d294d04c92cd198d42bb48098", - "0x872df3af6d40c5beadf565ea8f6cc502edcde941c43cd3024c812b2cbc33eaf0", - "0xaa24ebf00a407b1ee7e126cb5f396a1b4489577f160a7ec735e0e47fbf077abf", - "0x15e6c3ebacccecb59426bcab8f5845a60a584a18d5f6875431181a816d5dc0e1", - "0x3ae0bd8b42433be46a280335444e8e2d35c1afec926cd2c1d5ea537992c506f1", - "0x1e423a88a245221c826586cc67ea45dfea247c3e9a36c81ae9f0c0b5d5d3e5d8", - "0x5401f93723132c737589b457216dbf231a753c4c4619444af4eae9bc6153ee40", - "0x70d9a2787990c3dd8166357ab21985abc81a55eb0d50af7e19ec20454b314d4d", - "0x4ab7adbe2f74ac269840ae607a17824e8ec74054fae9d9b3998dfb162962e1a0", - "0x91fabfea828408eb161ac781a0896155ccf7d9cbefc3483cde52b35ec67883e9", - "0xaff4547e50acac2e3851620e541e96d7645682f225400793ebc0b959c6a09a01", - "0x0937506d4c9e37d57560bac5851795d6559e51df255ea2c64f2e119b88cc7511", - "0x88d66c613582fcf6df46773a1456304c4c0eddc212612b2dddab065b6051c8cf", - "0x2d6315542c9b30c8984ca951ab488906c78e6c84aec2090397d4a61ef26375b9", - "0x8ca8d613a382711420966787bf7bd541f517733d21ac4f893c282dd930f69b5e" + "0x0eb474b7721727204978e92e27d31cddff56471911e424a4c8271c35f9c982cc", + "0xe10e94515fb5ffb7ffa9bf50db4a959b3f50c2ff75e0b8bd5f5e038749e52a11", + "0x816e7463af7b5d2fcb804ba55f09e8452182b0ba6c995a34e144245d76333d55", + "0x3793af64c1ddc07ab61b2ba120034d91c02183ff788f07d3120fd4e6a48305b5", + "0x14c6106a17e041032210bfa0ca80d11860a1c6d95175d55eff39f97b8d8acded", + "0x396f832bfa3a9c494e9245471f0e65552613d87b6fe62128103590d95de72c2d", + "0xb060979f095c170a776b2b50a1e2ab0ffea80f6e522753fa36ad6f106ee32e9f", + "0x8f452e7cbd8a333ed04d819a143a8d3a75fe8c58418e7fc420bb2a717c0d4d2f", + "0x37fe1b0cf156bfc07571569af210540be753777903a308d5707538fffed75b59", + "0x6f0561d017cfc123b3f0d37b044e4f7231516b8731a1cab89afb569238643c33", + "0x3c1740c410a88c60fe8ccdc44e0ef2cf7f7314818dbf1648c01d0d94fbffc211", + "0xfb98115a7d6df8aaa40115f883014fe97300869bc016648e918fbf2df9608d41", + "0xef1099ab5ca4b79369048678d3ba78122fc081b00b6fd0f6907302a260d58266", + "0x969575f411dd78fdc5b4def0331fc93702029cc3c78851331a0f47dd0faae70b", + "0x9e53053e362be51c0fd25eaafd9e7c5c969d9f2ce8db4b3d4d830cbff347b0c8", + "0xf9de29944954d2b71a93532fc26916ae12fee72d42a79adaf940b0bf75d0ef89", + "0x28b2ce6635e60e06d643750798779023b2a807d9d089ae9ef7f223eebc15a71e", + "0x5295c06cbaff06f42bd8f5d9cbe94a840885caed02f9c9ba6da44a888ef796de", + "0x576eae673a4cbba4c7c7a56b47835ea64ae5989d67d119ebc8e568df40d908a9", + "0x891c0d38bc5e55620615da42ed77ab33806a042512034bcee134279dde1054be", + "0xbab05999d657426a11a902eb4c85ac52e2b72dd1cf38584cf2baeb2c3727bb44", + "0x3bd7e5a966f6dd2dc456948a8efca5584f5a4e0033f3037843a42073dda1f71b", + "0xc4f773ab1e34290f9a3d9ac6ede4749c5dec547353dddea494169d86f71107a3", + "0x993bf037ea9dd58b52027fb6f39332dab867c1e72af34a49d58a5a12f26bcca3", + "0x48b2d8d506eb8fc9dc0402fef26952111449aca0f90d0079f0526435d4e3183b", + "0xfef8f61df240e956f43759d2f481938421e064a9bd6a3be7a53b1213cc9588bb", + "0x5abf01f5066cf1091acdd1f99fbd5fd963633feafc42f9047534a3c1522004a5", + "0xa0f6205842260988161183b51bc36fae458fa184dd61844617d5c5d26fa78346", + "0x77309182fdc26d15dd8d9dd05040d7dc623412785708d8aac39eedee63931944", + "0x661c93311b94b7d4cdcbc0973225c794e71898a2b906922a6c1e8f7e9e289dc3", + "0x9d5d329ee8d9fffaee0111688d31a308dfaac922dcd61f818edd5303d0955be0", + "0x716ca25b184b64ba273b978de098f9946413f6fcc95bfba5cf1169e7e03dd611", + "0xa2e8d5cefa5804894fb42a106340b00de3286fee0992b5887b2cf471539d74a9", + "0xf846e05c9e9e9cb4cd2b7cbae7ae183a43a59ab02251954db632e538adacc357", + "0xbc01b4e23ea082a193e4c1012b1da91f3b4cb762009ca320bc8ed294af874e79", + "0x9218114a32da3ecf660d4d51b101bb51bb17c771561c1946c099be082f0a96b3", + "0x3b4edf03dfd53081cf40c0b90b35c1ccf7c7fe96cf131172eef5eec62f620ea8", + "0xb15758944263c67bdf528d4d7fe05737fbdbf7ffedce5f891a4ddf76177d2609", + "0x1f119374c385240f7b4ba1ec3d502be2c12c159411d5393ff2bd38cf87033625", + "0x8a8d5a93f3475813926b13a4d53f21b28dc79ade2b50830c0b9043e9fcd81576", + "0xcc22f7e2bb9c06c15ca3d82df852ed9097a2ddc687ee389e662de000db0c84fc", + "0xc2047e0dab711db791aadb642f8102abaacf7231b8dbdbe1f60573b0be015a31", + "0x1b4088ceee7783e4563945f162bd5da67020ca377a18d615923e8564d6709f85", + "0xd73450686e33bbda9eef53a95a86e5a0514156b98a5b7dfc6fdc0adb0b83cbcf", + "0xb374076ec961360e38d3486a31c3f72225440984c4c47ca790b4961d94152159", + "0x4f723f4fbd31d63a5421390e68aba0aff97249875688a7d9ab9a339d9aac7bc1", + "0x5fe51ff982edcad6c0052fcdf9a70e8f325c8140ab75848c5d7b0d670bd7edc2", + "0xc3ad483c7cc23bf8d6ae3e3e829bf126d5eeea9c53b566a6da95bef573b9c779", + "0x3c9e50ed9eb57cc055fd9a65a6cdaba2030d8b41f81348f296d7410c1d24ced0", + "0x0c6dfc1f626ff9e85ff072c154152bb3f122a2c1a45bc2d9e7da9b2d5278149a", + "0x92f4452dbdb4fe70e84ecd47af4b1af90975219797cebd451beceb6997ab024d", + "0x9a3d00686736b5b838308da4b8f0aa9edccfaba64621ce2988cea6ea2a267efd", + "0x8d602d0bef069177102726d5ccd93d19805fb5771a350a41e32755ce740b9047", + "0x6681e4097667a22ad3713acc27b6f87abd54583230581933bed9245c2c457ac3", + "0x53077caeabcd926466319a3ee5c51c32e01e1812a65313f113f814d53e9f1dd9", + "0x4dd4c33e99d86ba84f976c639333fc072e262c0b76dfdf2f589300af54048c0a", + "0xbc3b9837a6fa54616dcdb8088080e276e2e99a23c8e7de4109504293703d524e", + "0x24316b344cecd5e601cc0acc91ff94f481ca3fa26d8478644a9d8bcaeb0359b3", + "0xa7bafd3c5f4e3f6b5c078d50eb318d91e867b0e1c966027e3e7458eb104ccd63", + "0xc8da46b7d778980d120357c8de2bba336f5a2ac7a9f4183a0ee1f7597ed47d25", + "0x7469fc5d8c9c648cd10e538710e0f126542e59a82484e7fe56b73f4ec52c36c7", + "0x993bb7c0487ff61c97e4f1533446ae35b6346642e1230f2441da8b354111d597", + "0x90e3944732f86a2254dc4f30650f8438dfd0b777561fb02a8ab1c60438569c24", + "0x4e8472483679b54bdc600010fdd164f54771d7a99fa9272c683b610fff72507b", + "0xf72a861a2ebc232c25529c0f94c59996e64c59c36a1326a183cf171bddf2a75c", + "0x7f222999ba9113e2a64fd026a8f7244e6d2ae8f2a7e7d8d2d6fbde6fdf0b629f", + "0x3304e769f730522c1c5aa745c448075df026b8f82a4dece84fd70d0457050985", + "0x9ee5e3ccaaf94461dff9df8c4805ca831f58a1586af4ece3cab14a45f3b784db", + "0x21e4364859063e20153d2d06eae4d2c9e99354bf97fbff68406d8825d18dbce3", + "0x4805355b72b1b61b07814059f80b4da0351291cc932292f23069197a74127726", + "0x14474f45f38d7ea51418e5f03751c8bfbfb9b3e2957d3051e862aa3c57a63c43", + "0x69372cee3e2807d10ecb72d404a033568a159a5b15d2007537ed9a758164b29f", + "0x147223b51001166a4e65372c9c706f011f1ae94f4bdc9ba6e8960017e8898703", + "0x11a1e48a5c1d7088c0ccb8177d54db9e9f91a99aa7c24f702cd93f4646f181ee", + "0x809c902b2f4b8760c3d2e820c93d6df69a5d184a43a6c654ebe7067e7212137d", + "0x749367027756c27215b2f57168ef15d3b39062c9f79b3777f7fa19e8073de775", + "0x6a9fae37364f97e36e56df97acb1b7d066a608d8366d7e008854756dd28fe748", + "0xdc2f1b7a8aeda15e6bf4f5f424bc54828cc8520e2e7ba27bd8e28ba2b543aae7", + "0xe0fabc892d5c8b4342ff488b76a0400425ea70774f207c546fbf2f9f5b105dcb", + "0x151fb5e02d8eb3c3192cb8c039bcb4c121c4ebeea5e7f98927b85a730a24bbf9", + "0xfeb2f2ea368d0bd4c0b0bd97b444c365bdc0ac9ce2862b0d0162387727edd236", + "0x1eaf828231ebbae54737111bf3c7181fe3d7e9070def1313470d3f81c89f01c7", + "0x8a1b0565013cff488bbe3f35df86fb41c7aedf4d911130802c473f4ddb74d6d6", + "0xce9158b5c903312fa636e074e3efe413184652581a4877d40a0085965dc0bf9a", + "0x1cf602c6306affe2916fa09d3c8c018f23fc44dec8af8e83fa0008c98b4dda72", + "0x189dc4569e96cab937265ecaea76a0880ec97d5b84ac1fbd0cd2d2b36a8c34c3", + "0xd698bd07e485767c1da30bb218265e1304f6eaf426749ccba67478817af84bd4", + "0x47d7e101de73bb0ca97a0bb70094e81b82c63e519a6b2aa5fe10ca7351232870", + "0xb0d441b6c41072889c4a982306c9a40dff77b43425ecc4d771c22f3199eb7708", + "0x7893071deba67f2fc8e1b18bedcac4dbc05a020f37c764c555eadc42dd9d29d3", + "0x3c6d636db3621757d60b2d0e1804e19528ce60c9feed1ead93731820ff19b11c", + "0xde87aaa462b461c4a33e0739ef4cf56d442b7967ac7c5280816a959046b128b6", + "0xb237b17650adcbcf580b64b500ecaa7ca36921a11ad92c1e8992c57cc1a7f618", + "0xec379725db43fefe61f2495f7f7e0531d852e21f896ae806144c4d9b4b986e96", + "0x65ac5548988825831f0887b9ff0f2c13b7f3b49e4a67c39b1694e76414249f6d", + "0x76053b72ec9e6fcf0a28ef273d3e1b0842c3c2c0e905f5b5a3535ffab216c8db", + "0x2ab1e87489eb1daeaf8882c6baa0a8726aeac522e9c4eb4df71e35af2d22cc10", + "0x8c9c6adcabe253b311f6a9b8165ff9c5e26e4cf41f1acd80837e77fc15526a86", + "0xf143155230223a3f126c757b85e193a9129f1bdf97c0ce1f2785f14d40911f30", + "0x8c510d9dca593534f3ed316f240ffb9343d1e3cd6d005df6a75a1b354da0b36e", + "0x3440975cf818a718beff35a85d19bcbbd67e1b16ca9d78af34dcde31a28b3288", + "0xf56ef9c57109f9cb7a925bbb6d453efc19e8a45b331f76153d20a87d86a8b0d8", + "0x19a360772872003f08508a28a362c6e05650b385c24a928ddad4d562bfccf412", + "0x643720694b3773ecf20437d54a6be701810feff233f435dc701dbe88c9a6a13c", + "0xf8c0babe99aa26ecbfc91b304d9cd54ccfb37354c4fdbeb3207bb6d4647fabd6", + "0x481ccc7213d0188e817c071c4cc3a71c96befb9aa98cab964012fd7a8267834a", + "0x02d83ca8d92e0fe6ce7643ae93af60e38ab5659a84c04beba678ceef654aec12", + "0x24e6b4bcd0d97df196f2371532771593fe17be8fcb89f1e1164bcce8616088b9", + "0x3dc91775c50c04812f755f3b48d3d6a0cc599c586ce9d105e2cf4f3e4527b515", + "0xcdc215f05398ea3942d3a38078a3602cbe8ac549d4bf0e4a54191ceb2aff8f76", + "0xee02874e444b784f4265cc60b86a17382d277d03c8bce8a33241460ea8950699", + "0x35c34bc84736fdcbc4d4e2e089f30bcd186a052b2f6dcb639fc45a0aeb6969f8", + "0xbbb3ff849c36659bf2c00feaad9f7b3a342b5cfcf3555b7c2e467a0dc84e90e8", + "0x0584bc60fbe3fae9088c214fb519030646c3240f77180a0bedecd3e9c9f47f89", + "0x9d18a665d89439ad2c97427bdab3e598f5bc0da6a0ede2378f95c5bc31f10d12", + "0xe8a5bdd0ffd33a6fd03cf003c6d2afbe8493e0f0cb69e6366e22b4d1ff985101", + "0x7ca955f4e01eef756b680d09c25626cf50013faa20a12b0a334fd048a04e7b91", + "0x064254551457bd5e7a260a41ed3643746202d503813ceaf42660f9bd1983be34", + "0x1191044e354ea1e3daa25ed2175a6517659e96733d9065d81492ffe4472fb96f", + "0xc823514cf3566b1bb2e19a35e0ef0980bc483fa820d13ae2cfdbf15fd426c272", + "0x413f941f192d0ab77bac68268f45e2c9adbee23a3324d4ae8748d09735355a2d", + "0xa66c94b9603b3058b730baeba1b79d52f548ceeb5bac487903f92481060f6804", + "0xa84d4a8860bdff1fdae6bcefcdcf700fab7857444ef1e76d8259b005872a4636", + "0x9fa64d44edd9c097458d3901612a4b6f655a1421ebb68541cb1a4bdbbe24911e", + "0x402027770edb387510241a68a235723c6c5c95aed54dab058c43d21a6bb48c41", + "0x776281b7e341a66491603b7ae8ed7cc82b99febac43f94cb1c4dda73b17aab63", + "0xfecbaf0fc5a02dcf49095514ce26df927def3cf51f37e04471545aae2364f936", + "0xc477d9293f0ace7243f8b9c89f01210b8f96b4affc9d3332147ea2e2b693c99e", + "0x4a8b9afb9d9097831b2497296b0fd0fae76ab8a596213daed35cf87e6bbefaed", + "0x594c4e9851eddbb4a6c2ac72aaa244ff35d67262efb20935360360d39f7c7ecc", + "0x14b7ef22c46ba8400979b6c06f3b3023607145a5cc6b5b793daae758cb655245", + "0x3a9d233553d1ca4d9862a70ef133a5fb2df75276fb24297b0bd2927a39459450", + "0x22c5e227d5fa7616603bbf36c5e4ee7dbf285fb0cf403a3ae982da70c825cad0", + "0xc2c8d439c7bd884665da56e3b680a5e58ad1e98627fdbec6fa67d7bbfad33a9b", + "0x7d5682cd9f28493ba4b87be141ec99701bbcd1aaadf9840b81de1fc07d4ffb18", + "0x8845f626c5f78d1bea281f892727437f9de8f976e4c4fec6060b2115f1862db5", + "0x769fdf0bcdbaec1ffe98cd3500ce8341b4d7ea2dad5fadb0258212306ccc75f9", + "0x185569d1980147fcdfcd0e0068ab380f0cfa58a690334a558bc1fd0d07897e96", + "0x0ed70ccff752df46f981043c5279ac3f13e7f62c2bdb9a0a9817a1c119ef6402", + "0xbe121e28349e80d601ab997af844aa03ea6492e88d75d3d46517d8f835e3c3fd", + "0xa7aa5f0bb95566292d22891faa75b7ff2020b69fecc8a22d796cc3a60953d98f", + "0xa2611b092b00f78fe639c4fba0274ae474fa448b3f2e4b8aa4d06c654720d478", + "0x8e425115b98f5e41c8b5d03a9e17d56d30050d85dd06cfff12f002c546a256ba", + "0x988b449fbd8c35855154fb4eb22ba6b7b7095be26203d137f484c67facd40dc5", + "0x567c43ac5dabeff01d6997543ec7abf7998088a355a6ba8e70f41a243dd1343a", + "0x6f560cb650142aed532f17de763d61d021cdec2716b0d2cb27b3a64052abb874", + "0x7e4ce5fab8f4f1fd41f9e5f10204032ae7e0e38093b1d07699318975b33910ec", + "0x91a0820eec5390916bf464b1d16c00b5d94386c4c9f4cdf7e0b3cbe40747fbc9", + "0x9c59451a9a242123efa72c5fbd1564b7bcc0067ea9d025336d228ed26b9ba6c0", + "0x1043a5ab3f5a3bced84faaae0e783abb3b81c2b967bbd976042cb5d897d28146", + "0xfc37b3b3c0be392ad2a5e36c120eace1d14e637ac806e79a750b9a6be3c742a7", + "0xce2ccbada44a8db5144073e69914b322dc015273a75b85ea43fd9e21037c760c", + "0x6cf8336b5a410e10604f93351242cb3a6929968212abdf85b4ca9321115b8fdf", + "0xabbe9781950362be1e206d91ea1bdd6f32ea2c6df65b277cb89050ca1deb9296", + "0x922a6b85add6839494c3edff389aa1b054409c330b4a4e2a6c0e4f9bc85b36a9", + "0xc26dcdfa135a09b7eef1e99b445fb66aefb8bceb6ea715b81d78ba87cd56ed8d", + "0x87d647fa7dcde81a0e133aa949d574befefbceab24a42ae4f3809d2bb52a2d9b", + "0x85ee37fa7154568b9dee8a539340f99c7f1bbc7b9be1f2055636ed9dfc074e4d", + "0x8b0114dc9e249f1de4bb3d055790e4bf18aa28a938f39e8a457ab4a43b0dd613", + "0x3be36db134f4c00fc9e1bc376213c7073389c993b0b0744cba619688d6c037d1", + "0xfaf987eb2e066ad8871c489c23102ec5c58add2d13e62d56f2821cc1f4d66d84", + "0x678478da2955e6876ac49c5146e9f7c376dbf2f170f6404054ae4385e72f3f19", + "0x85d8d9dd6c2a8f6b6a1c0fc0cb55ca870d9a7aae1621c143c3176a3a81fcc29c", + "0x76f4dfa4c3387408c823a75aeb872ff39af3820375ff52f7aecb41c96e4faf2a", + "0x6e530647f2e4232063de2fa8f673989d7834d8cdf529791032888f2833880b80", + "0x64422b4dfff6cba0eb6deaeb4593eefc40a357469a7f7c3be078f80c66161333", + "0x5c7ab740510a4183832bd78e6d6105b0f9f928611f7d62ef96aa8dd8da48a72d", + "0x0bbf405e29f015d24e64f063d50ec6c616af64622b1a4132cde86f926e93850f", + "0xd9ba81ea0790f1f8adccd0bd203c7adeec2b490381b822d6b15293cac2f26206", + "0x4f78619baa34f2278022c509671a38d29366936d6860e79ab540ea46b66ba782", + "0x00c1f10211d7604e59a327239f00dc6d036a93416b7871cb214e8eaa52571834", + "0x1b6636708f97485675c0e5b21eb749ee4a5fd0dd886e6690090856bcc5178ec0", + "0x71366e853968c1bbbbf8e3d6e13100dd589521f8db9e561dd20ff8709b5c1a96", + "0x0d2c35a01646cb09e2b56b5792ac03047848bef7415ae26f787cd54ef8f327da", + "0x1c5b71047f99db30453e502c9acdf422d3bf97b0d42b9223ea1b8b9924bb0cb1", + "0x9988eb36e4a669638e3242e5ada3e6596c5e4ef36a83ed2d3348d35fbed4d3d0", + "0x8f00020f98f02af0749df39fb2f534d356e3dbe809bdb3f435c4a575d661d6db", + "0xf70a509c0d1c60afcafc7cc492c5ad575fdcadf6ca8e0e5f184c62dd52021129", + "0x72cdb6544dd469ab42e270e51d136b314c27ed0d6682f914cf3e0398399d2d5d", + "0xd5584896e649b618ab8257859e42ef7798c37cc85103a8019cec10b1524519f3", + "0xd70636cf5cbe78ba86b8de902f83f9c550a8ee31a019da6fcb0b1ab0a02bd31f", + "0x79a506d61c89cb7b1aef845484956389d5f6077fd10f8d1ede1e92474eac15cf", + "0xa66c0575cfea08bc6abbba03b0d10be7bdcfe6c5da9058cb34c22af2c8f3f1d9", + "0xfde316523b6b41fedcf11d776a53bd27fe3058c3912059197cda083a14410689", + "0x6774beba5e02630a7e4379fed7175f0f3d9f8fb5333451f25d5b044521ed38ed", + "0xb513ee7cf03529c88633176792a6b08585ff6163fe174f68e285d6315ffe33aa", + "0x4482f3d82f65f0fdf71fdf669403e0b835b5458e567dbd295b4f51d22f01650c", + "0x1cf0c0859b1839ebfb872a570e0c17886d8d7f26067bcd16af7f9f0415001aa0", + "0x231be14cb1cec949a4e806a7b3aebdb074d58e5a1c48b85c35138d5d3e967e0b", + "0xe8f0a0ef68efb2ea1bfb5d47e3c9446900329ff89a3ab7eccde41e09ec3e79b9", + "0x16348cb5e49e61010da09a5ad3cef83ab369ee3d0f28079584c23749cfa30238", + "0x6d33bc7f502436bfd0d574c3f6b1155c69f8a80e55c42c353e9e68abb46d932e", + "0x0e5d40ed7351b59846ca3dd8cc9c0eb71d4659e0add0dbfb0bb7f518bf45c821", + "0xb1ba4509de4c0f1212b2b07d949740f15ef8df9af8e7e9d765e6b407a0c5d717", + "0xa99615bb15371a15b92c119f8632f1ad7c29d6eb9a69e0ccf33a9dd268cffd54", + "0xfc3601e7f85e4b8e996bddcf1b34cb6c20462e21c715782da12d8e08a01cd21b", + "0x872b0f4f3ef00cc5cc6fdd71091de96c02f5898826fda4f837832f302497b51a", + "0xb34656439e4474e075d8ef523f6f74ef292a22281e6dc0b8fabdfd2339389919", + "0x048d4dc500031aa56d89e799499a86d6dacddea795ddc4571669fa55d694345f", + "0x684b8762b97a9d650f0f0e5edee73b60a29f6e75573bd6244518b11c4a571533", + "0x5d20bbacb93f7b03d92ae0ce8296bfd113a808ab3a8bd7703838d7e8356b6714", + "0x25efac3c3bc3d4f10ed9918fd9581d68eaa18fb72d3ce7ca8e36525d8cdcae73", + "0x48b593a335aa2699a5bb5a60394845c7e4c78046e050aee1c7f8831249f75b26", + "0x6db7243073caa6e5c0442f2f3926885fae0385e0238a69784ea8a00c854ef8c0", + "0x3a104e4932193c644e2135008d78c5153a9331e6d9dde878357c250a3b42b5e7", + "0x74b3b4666fa9811702d4eebf9680053043160be3a6c31a0105c703e07d530710", + "0x179f67ff0710067d3180ec03d664fb3d9936e8777603b051ebad4cbd0aad7763", + "0x38d5fd43ca73f66127a0166ae074324471b1a92e6f4bf99fde235ac408b35562", + "0x1f43748a027e7731c2fe5343ba7b61d7c6c6933ea45466b439a43eee1a3ad398", + "0x6b130b75bc42dbbf76ad97287a3a130ea29122ce7e48c5a8bd1e80a5f3121364", + "0xcd17f77d87174ab6ad6f2dc60d37144aed40b3620a9e6c9ac3e328aeae3097de", + "0x3b7fe9ef499348315c1a2877bd7fa44b622fcabc588687a6de4d2f75aad3f642", + "0x6c73525865791a7ca8410363d634f6babfaba581d7a0252c7f57dc8c8cec583d", + "0xdb16b0220e129be4c929888a8a46d21d422a352ac7b0360711d786eacb56598e", + "0x44fb22efd89e585079bca47bde1073dc052f8ddbad2c27cd8e2839bd4350b18a", + "0x1e6f1395d417a94162117b9371abf3f781a4b05d787f6a38fb0101bc36e548da", + "0x3eddd0764196fe15d7ac7069c04c4bf23070e57931493e9a0127fc521187b698", + "0xec104582dffc06da3cc1af1c8dc7522d26ab2408dc0f62051da2ebae1ec1cbf3", + "0x3616cc0faf8a5f5c19cbeb482be2ea8de01b2a3e81f067366c715607cf29078c", + "0xd37ca9cd5dc7c3c4e2d2f1b3c8db2a016b52444f1c088680c8544b6cea30cfe3", + "0xc3d85c7899da428a305d941e3637e33eb4981f071ee07c1ee1c82aba7c248167", + "0x62975f10a20de37466b1822859f11774efa4f37fb701f6cc0695d206bbb51582", + "0xd940124857e67e220e3d4dc27eb75ff048aadd9b7fb29b680cc3743b3ab6365b", + "0xc89ac3aa4725191e56fbc87d41caac2c692dd5adae638bf741f0ded040ca66e4", + "0x97454878805915bcb60c9915af0fe0558987dabe5d506e03898dede96544dec1", + "0x6ce55ffc54eec31d980ece5204876a3f366f3148a4b8c10cd190153cfc96defd", + "0xa4e923671f4ff6dfde2f11cca452ed4208808e93e1131de4ce0804cbe2e0d3ad", + "0x772d1c2a0e70fe37ac0ea8d7b4a789f92997bd654809f20f0ff7ad76a6d975c3", + "0x8d5de87bc2484465a4876b462ebc1339bc13b8229e6df4f1a9e9b458f5e9adcd", + "0xdb33cbb2dad0eb38613d69392951c6062eb669035691882fdafc526133d15d21", + "0xb22b8c0887f71de2da3d81a5fec2213ccb8a32060211077e2ed1613cf7962e94", + "0xffbc5a82fe0c2b3f3f34343ba6823f35884c8b1dd80fbaa68fd5f33a960034ce", + "0x9640ded5be08a8a7a2e6291a91bdd58bd108205f4cef5209ddd338ad764fa9b9", + "0xaea7f934206d00a592502b8b85159e64b56def4c72db3a790ab46ca81c75d672", + "0xb99ace258fe4e6be541c6e3468913f4f32ef9e9d1375c889e17ceea0c606e729", + "0xc54ae75381803d00b52ea6fa620766662e6f7946d550208743fa64d3aaf22c54", + "0x4e773cd4fb2347b796595cc67eb2b5c7be6409bd8b1944f4cafecb6fc5a60a0b", + "0x263f3826196c238c24d4c792c3c45fc913d4cb94c2d3871827ba43faecbf4d94", + "0x7ae1714256e21b9b45778795cdedfad1160d571004f5ea6debc16406bc2161f6", + "0x0c271dc055d8fb1ba9bf133f3c85628ac3c2b588091768380a881a6183514b51", + "0xa5f41cb430b02fb1027d8e99cd94dd6666516c785d7f618a0894f38f811bdeed", + "0xbf6665cbf1037e0085808897d8b04932a6ced6755fa52555ac00737e8029c7b5", + "0xaaca2ffc61693a6f379e54af473802770b3971f6accef49e5a2e8fc122e0a490", + "0x7a3eb7782e2c02776aa29964689cb1b880201e1b81c8cef39738d7f7235fb022", + "0x7bf417dda75c46efba6a8344775915d2b69f954afd66d8f52576e106d7a7eee2", + "0x3a324507874480d0f4e8466ed6602c99fcaa7907b61e9f2b3f100740f7866fe0", + "0x3589941fb7bfda9bf50ad93cfed18cfdf199a6468074416aa513cf83cc00dd2a", + "0x66b0965611bba105667a3990de5acdbd398d8d6e2cd0276b83814c4647bfe461", + "0x703258ca6154ec4cb1b9162678e3bb546ca6f9e626702f5f62dda98fdc0fcf26", + "0x2a9a8e3537b714cb3e158f7ecc816239786ea3787b1a3bd40482f02eb0b21595", + "0x46104b558f57296b0775d63ee4da42a716c234f3dbd7479204f35b31f4b3d55c", + "0xe7d9d0a86cc8b76526acb8e260de17508874d1db6ad19a4a84210a010212d43b", + "0x04af6e8bd51cf4c4307b2381b2e0c54cd991ca3c7f49b8cdcaff3aead70efe48", + "0xab8fe05db68e486bf2be0c507b834b6e496c1d1fe560cd3210ed7fbf0e9b867a", + "0x0e6b5f226d0bcfbd1f0a2f61189592d8974b16376fef3d0a67f757b796ad6854", + "0xaab68c29b061f8f72d9f3c6f2e318a7125a01010fb0c547835fa31e72d8eeabe", + "0x0446f90437150e4ec6246be5c718e5054d62cbf5878479457d522948c6e87f83", + "0xd1b4669e21c0b175589c0942d4423cd2b438de6665f0bca10818eb6246a07749", + "0xc20d1a68c015d886ef8fc3dede0d116199480164238617667280f833a4dcbb3c", + "0xe67504ba38aee984e9118960827ddce0eaae3d8797bfc87afd4638cb1867e41c", + "0xd3e985af3bf3e3ad0dbcdbed9ff1b04037bd1ff2e71886db3842a29f0ee8c4b6", + "0x8b809d1ae7a835f318f471ce227f7e7ff563a15d1e2463e8fce5852c9a3f9ce4", + "0xc232b56170a5796aa4333d29ad8ba43dab2233e0cf7b48d100aeaa4b2491d6da", + "0x9c338ecb25290e91a83978df4f5b7076b299ba5d87074c36ec96da0b3aa9351d", + "0x616a6134eee1221e531fc6d6b5861f5ced64e9b56505b169da67ca3c47cb54ad", + "0x4afd1e60cbeb40301c2ccc7129042f9a944f4a383a4f34b8acd7aa454fcd0e7e", + "0xd52d1be650ed156ba12b0d6be4b7fda1fe89927bd7626ec0ae45663848144e7d", + "0xa212644d968f7d3d89c6f12c3c3077184943d986dd9cd391d48f8f98eb1bc6a2", + "0x8e3374acfb9d1724fd7f84c22fda25f91737efde3d667f607b364e51beabecee", + "0xd77eb30cd87046093b27be1a09d93cfa5261b780b99116a79d6c16be7db838ec", + "0x05093b9e39e2d9f4fa95ff386cb2af67861359ea6228242be6b323c1eed5c7c3", + "0x8bb25606225d3451a981af24506a549e2bf62a362149e4c77ac72eef6316e691", + "0xd2749fc4a37792b3716634e3dfb8a80ba3e30fd73bc119069d507bfe7efd8a1a", + "0x3b58bef2d77a04b3281e6cf80f984b9067290bfe02a596b2295ccad38e887a33", + "0x2f69797f1800e5da4a4086909058ec857695a220644e61788b24ccfaf7e77137", + "0xd81872c67fbbd1a69d4805cce578b9f36bfd768d3fcbc2fd610182a7696e23b2", + "0x2d3bc9fd303c12ed1ca7efe27d85c7b5ffb8e079e59c86977a113bbbf863549a", + "0xbaef802512a7ea5006cf816c51c35fdae44a86daaeb6e9dd8fd0c37b4f744875", + "0x2e7fb70924e6f0b74541f2f4cb13f49bb3bd577f5bfe1bc29d805b0e7e1a3df1", + "0xe3918602d83478eb416dcf80103b09a051d5cffc71b0cb21461c5031d38befb7", + "0x87dae7dbb38501d6e84f738c11615dd9eda5f7b77e096a765caebea6a8c691c2", + "0xa19f74ad3f4e218fcfb15e4af95713cfff4f5f58169b789167e2b62617023697", + "0x744930fd0046b3f7de0ecf721e3b36e4b36c0f49eb98bb0c9ed33d40e76a2017", + "0x5bc7194687200989382831785b43f7f5efb23105ee2dd7a620a61622a2afec44", + "0x3672af2176d897cb8f64f2decfd924d74581bd85916be85e53f2542a54a24b94", + "0xe2e2dd1875e9265072d96bda4640ec6beefdfa9a91241ae078cec4c2a1c9b8b3", + "0x5866de65d88610e6123b7a57e28e196afac484045261d1a16b83fa232ba267bf", + "0x7224db0ae652be5fe9017454dd40c744c75e513841b5cd11d5fcaff598265c7d", + "0x04438fdfb56d125bb13f6b8bdaced6946299f8a32610205fabf4a8db9c06af60", + "0x9e9af6a569b87a4717b94d8253a0078409bbce7bc08874e091163b621a75b999", + "0xc8a39c68a74f23d615ad49d9d175086bf4e1047a750165bb071e3cdb70e1d639", + "0x10515734fb6d38cbb9a7ef33ec7831646636f845ac40cb24b08c432422763466", + "0x1604dce1fd615791c66246a7cd82edbfe860a5ac48d000cac1984faebc00cafe", + "0x56311f68cc563946e251d8c0ea74adeee6ed8dd7aba8f6ea85367defd5dbdc41", + "0x3fc81adf318fa6db1c4e7ff5424b235943667f2f3dce5119618e0273eb23c93b", + "0x38576704f6ca62083130dca418a9b68e374944d63521fc3f4b7039754d62f63f", + "0x56e2a402baabf470d0f9c3496d75e2c26c26ac159b996c370b118a313a9e9464", + "0x501af705914bfccf4ad29c38eee21641590cd8d334dce9055d90bff57b8fa556", + "0xa734b7f045d2a23ce602b032357a66763714c6e4785768f07d55c22d2f1de372", + "0xc80e2c739a3d142a4018bfe2074da8da33c471b93f5e7b44bb150b9eb63e956b", + "0x7a0b1355d05b1bf4c634651bbb2b6d65cb0a9772c30e4024f5e781e5d404376c", + "0x73827f7c7a15db5c17a986f31dd92de05579b0bb8def065e5f1cee472d00281d", + "0xcd64ee4b2a912d48e6beb06e7d6c9c236b5815434c0ee21cca0a13ff23dfb85f", + "0x768d2fa63c53689ed899f47c6f78844ace885fa18a36da427428f4af46a9e1d9", + "0x643c26723d5a4831d3d07f8692a6dc4456bb6190ce2abf1abf69159942d5d548", + "0x03e20a75c4546d5f54bbd7fd3e54c795c180b880563bf78ec55530a89188a9a6", + "0xa0ea4095dd9fc6f817c656913f8cde4044e2806488be48770de5574c0b5d5f8a", + "0xeead5fac8f3c83c5a10df161d95bcf1d27184c9fb9fbd813ec5f61347c11280e", + "0x5afba4426fcae0f1769e581fa6af97b5ef8fd417771f10405e1c9d09a74357d6", + "0x087f65be7fc2a14f216d7ce418a03fcf1e6169e8620db65c11d1ed6c0afed240", + "0xf9a7e93c40788db39b241e03afe329b6336187fbafa40c97ac405fefc1eccfc1", + "0xb02450b58c5afdd0907ee745263aa6beef662646b96b9ed28b0dbcea4f358667", + "0x5029f1169c92671ecaad7239f40fd93adf3ec07ce2ed0c4cac38b0cc8034def7", + "0xc8465a93a1ba7ec3296d98e0b01ad27bdbf16a347c5517b450905d3c3668d505", + "0xb85cd82c551bcb30a747b2258327dccb04094f918e36c3f120f55fc35abf59d9", + "0x1721b2fb8963696cdf32385fe87e8ec2c2d7fa34e099bb65498e4a030e20a1c3", + "0x6b6dab262c1a32a67353409d2f8b791b1799ee6a8e3c880877af0bc5cc5b812a", + "0xa634110e4766d3451718061efb890238796370da3c4a53a91faa96c8944d2423", + "0x91ec6c6f807285599e0a179d0d246caf10152e733acf3bb967bae35fb36561ec", + "0xc3b2012d5cc8d796d1890d39e2b1730dd53df0b98274bbfef8c93bd969912852", + "0xd036b9b29589cc551bf27ab95b6366d772e7d692d8fba48f473a2fc2d023dbe2", + "0xc51229a0306e56a53bdab1fda497281e23aba6ab17301c2eef3ce3d01f56989a", + "0x2652cb79e0c18dfdf545562b8569cc2775a1b0b1b465cbdc5880b40ffff22676", + "0xf24e0d6c03961043cb41638596c4ca02e2a2522a3e828dc4613a72ce5a535a67", + "0x01725e03a7cbfe2d6c5623829e4d419bbeecd1c7f925dbf1667979bb4da6650a", + "0x3b0c9824b726b2b556c6c46af48b84f856154490a51d775ba06aad48055bcbd7", + "0x2be2f1cb826d7575e53bc5e14f1882d73bfe145ed91b2ff56a885f66e136db46", + "0xd16752cc862f33b14f5976049dadc4f15f147f2fa76c50bafb38a7cb25c8f881", + "0x66b3ba188143bd421009c082031696bfd6d29fe7b9c3345e7e70bf6a470a05ec", + "0x83e017e8701b533c9fd22e30d63c3781b0ac9ec1dff4433fe7fb5c8f6f4e67ba", + "0xe4782b025953c5980653abd26eb95de1bee0524c14a74b970ec5615f98ed6768", + "0xeda29e9b36262e7c79ef9c0b60fddc66bae542b19caeddcdedf439573f773cf9", + "0xbc02ac1f023993253394ca965f4394bb40f9c7822ed6b2cbdd249e4b72f9b637", + "0x8e1bde0f2541d20b7f7e8179014e0f6b98eee5c1e0278ff1de38f4c13fdb4161", + "0x7b762d3d64aded9ff99e3423d7e676dd307b765ca6f1295e079ac53d5a4788b1", + "0x1027bb44ade6a1f82f11e9f298fd3957a9636bfbb97457c319e3d57ce72146b3", + "0x963864b3164578d4a7e58de16593273067a641de752b6df2c9b8bfaf970392f1", + "0x16bdf92929fe3629a57f737d83328d034c36bbdcd006301f28dcf52e1d1cb542", + "0x69952e47225f1aa86d952afb0fa8c668ae710a10cb6a94477d518c8f771f5c30", + "0xe68895f4ae2e4a35fb7e0730a5ef9c3e3030f6351ff6381f77e6311912ced98b", + "0xf28d799eeec538dcb2f371cfc6aa16f4a6808ddef0e6fd0cf72fde291d94f8ad", + "0x5a404922a9bfe57eb85deb66d8d83c869ddf96eae17e7fdfafef19c19efa1eec", + "0x96b735672e85aa95c2f8b4bd5ac80942923cff64a24991b3103e4ee39fb9a8d1", + "0x83d922f50174810fc45daa5a607a9b4fce69d8ab86f428ac57ffdcd9c2ff2908", + "0x3b0ce5a62116eafbf445afff0674112f01e1dca0e2af2b72d0cbbdc452177d65", + "0xe86cc93417c7dbcd4b5f051f4dca1394d272dcc2101a9e94a140b20f5e4c8b59", + "0x99b3e1d593b682e1b6454675593ed6828f8f4c5888b965981e3a7c602d89d031", + "0x81e0eafc2a2adf3d94938c413cd9f588e7525b91f39a689dfc3d0ce6aeb812a0", + "0x699e692ff89a918eee6d19a63caeb07832dabf1eb28d04ec97150c87045d9129", + "0x90ff00b66a14d821b05f692ee6d100dd61abef3234fd29e94bc84574439ed2e0", + "0x2de5779a122ccd84a88c3adc4edf7c1c03dd1d3e89ab45657885aadaa087e833", + "0x775a5587a907aa5ff13bafed032dd96c312b19dcda1b0e74e8a4bd327fe90e50", + "0x4fa48215f975442e6b9ea0629d308667242a7fe89f0cd0eae55ef1d35a3d6ab6", + "0x2e24c24731902f1b9e4042eae9e946b9d884dfa9f733ea5d4f7e778b68daed9b", + "0xf23a4a6061f45b1ff2095adf02ded238b37a0ffa9653fa9c1b0069e37e8552be", + "0x62b94eeb74bca8d9ea91aaeec5c13a05dae022806df28b92ecee99b47de999c7", + "0xbe6c1797cad2d5d9ddac3b3adcbf1622241e2560e3407139e24dde3fd8d3e435", + "0x7df0788058bea0911f2e30133c835515bd777f7aa9cab6bcd27eb3c0a6e360ea", + "0xd87066a4721ce567f44abf179184381d81c1c487158a6c57b5f2455472209a5e", + "0x0aec7d3081c3ee7d61f36e8c7e62ab74e41f00b664b690a341b9ff7feb5adce6", + "0x16345b31779e80499dc01f9ccaa0e9981b2b336500f33cb1f2943b66ccbf74d9", + "0x9ed6c6685dfa2b65903db0b234f4539906121330c5d55e6b2a2fd30549b2dc23", + "0x6539602958d9166335a7a0396ad72be611661bdd40c786cf9b0f382039c6b46a", + "0x72bbb4a201de75b9a4b5cf7381308953234c62f295df08b919c12535febf6fea", + "0x2d37293863f6b90f43979ba5944bec302008957e07b7c7f2292074a0a3934674", + "0x22677859ad20cf8b924d516b9f979652ac91a27459a4eba5455beac7f5f23128", + "0x704c898c04ead58c2fdb2c753359d10934e66b326f104be28ca7a32ef05a2bc1", + "0xca2b1ac29937067b761b57b58ae4069eecc799dbe089342bea274e56fde3d1bf", + "0x4a9773e6a2e75dcf1ff46c8f9931b8170a3609023f47c0ea9c4af000798bbc22", + "0x7e4dcb6c256eca2cbe9d168cc78c2702c373fd6e69c210d0713e2766baba148a", + "0x399ea7dbb66b95bae693402eec304f9cb6f4c6ab729d90ca569fcc2bb24d6442", + "0x49d0e561773458f834c96e8fb9496d4cdf83f2cfab75824cb1eabf8e8962c18d", + "0x80a0a209e41d0c3ff07ffe6a7f1af67997662494a327fa7f3bcb7209340974ed", + "0x2bdd6d6e7ae3f4386fc655817e92563e80f46e1b277be22f81a689de7637ea1f", + "0xb77f32374161e54c50dbc38822760874d966f9e098a2ea7aedf650adf25cc0ad", + "0xb49b1decd65a998a3dae2e4725eaff56276af3f0c50b2a3a35b6e94738d32808", + "0x319f78ae885011458f47ff1a110881cb4ac6a78c7d4d7a2656ddca73a88b58e2", + "0xd9fa2f47bedc0b405df34c98582b553dde76a46d38ac86d9d357ea0aca60ec2b", + "0x4283ac57e82bd08970ada71f4617728bcc467eeebb19c3aa20208a82b18fb508", + "0xf2ea3a5ac3bc77ff64f7c686305044cfe539856fb2833cbefcb283317012062c", + "0x840a9b8c756c3c3de7170c3597bbd085747b97419c01bbe484fc4cc7924736ce", + "0xa88682b957deb995307ed875c4044246d779e3f8c584cad75162fee119613806", + "0x7b9195c23833f65832a44d097290d8573b43e6f3e47dcb8c3826ef9a52fb4ff7", + "0x57bb0076c87f2e7187ea92f9f7643eb5b4b823b8eae9f6e74c8b676dd86b81a2", + "0x68593a8268b245a5c7506a05860755cce1be795994a7d736aba41ead4c025a68", + "0x90e21d5927d39329874688312eeb5296677ecccbbb9c6bdd4400c50c9bda09c4", + "0x773c0cde2d1f44575c89106a01881eb5d9593bc762a40be03ba979496ad7d229", + "0xc1dd843534e9844bcf406cc03b277e71d4e73026635412e25f3555d099f26a55", + "0xdf3f794bbd98096cbfa17e168c0de845383abf52fea618937ed81d31cfdd88db", + "0x1b05b1f316013609fbf813cae674f193a9bd8a75631b55278bbd37513b85641b", + "0x429321ddb251fadec6b6f794acdd8cc9d93512b98af23d20749d93c3c9fdbc36", + "0x6cac90b28ed13c907d094bad45574aabe2355e13e6a9504b6001e5fbb9c25235", + "0x89b43a3f63a2ce4f67071a121f447d7e843948395616116ddeb57a8714becd3e", + "0x6de560c95a0483d51410f66f38884947dfc787e1c61d14421129773010b46e0d", + "0xa0ba45049971dd4b906e73f917fd16312646d53c0cdfdc3eefe53628a58973e8", + "0x3d4a4f7155eac18fb5a126dcae2035155a140a84718f33bb20d2f1461e8cedb7", + "0x1cc19669bd91087d2046770cdc34e8f995cbdf2a0cc62bda70d6074ed58acefb", + "0x7c1c4aa1817de27c62f35d66927d924376798c954d65ba3ba02c0528d11d748d", + "0xf0d67a8f3c5306165cffd44476249c254898bcb26c937f10e8ae244edab1b972", + "0xcc20c5ecb1d3e83bd56e9213761f8320bd40982ab5fb669bed774b4490637932", + "0x7935073eb3e5c37ed1135cb22bfeb0e21727d170d106465fc35de75e8d56cf41", + "0x7d968e74212c501d0bc26ebb816b57a37a8cd2720caddb5bf66f489e13a61bc7", + "0x2c134dcc35d50c63a13bd8868137e0240280f049d7e392b97ff5f76d00aa1296", + "0xfd046f06c1d46d9125a119f786acdd76a85fc596f21cb15f367933b717ba7d83", + "0x9f5f067e4af3c8e92d2d54dd061620f0a13a66006b162a1eab4b1707499597df", + "0x8a6e1fb6205a423ec2920d448a376b95cac7233d5312287bd850471fb49e4f8b", + "0x2a6ea987659383f9885d24c935fe56de39d45caa89e60ba1768189318974ed7e", + "0xc2df6c8a4eae77eeaf11d7e5e2198ec4a33f19f5995caab4db6577fc1ce7b957", + "0x1e2ae8a42eb937749284820e50f11dfbfb606ddac3efb201e0b2664dd0196d63", + "0x4d63bb91f9f8a9965c460326f0604a27ecb0fc56f2126c6b3519b08a895747b7", + "0x9a46c2ec5dcef6f5c5b76d4b08b9d5085709182243cb8308a2863cca8cba13dd", + "0xea57019cc85f7cece4cea7eadda96dc9e464df2689957ebfe8d817b6996b2e43", + "0xb40e930b31dc1508480ffba351b102c8cab53c6603a0dd88bfed1b0da5347153", + "0xf51ceb070d8e7cb998cf4979ac985b4850949b4456980f523d8b9d72604a43da", + "0xddd28627f5c7bd213149bc4886bf4bcb8304f86068694fc743ac81ed749aec3c", + "0x9ef2b3df587caf086f4a9838a829491d1ef45db132ea71c6bc96a4a40d833e92", + "0xc9f7d4e19501c48dda5b0012cd93564898ad080a653e29f3563ecd40d36de84b", + "0x0565db36e6fb7b881eae309fef6fcdcace7c92a7ff148476b627c012aaefe4b9", + "0x08912abab10f16b92ddaa3663375f6e2b656e4ed89f2285aab6e410fc59e650a", + "0xefe9e68ca3bea929722bcccb5150884eb23c32153b14644b1c7f4e033dc3f718", + "0x4b33e0e078056d9efd857f909d1e409516f23da68105463167e23d71c90f6366", + "0x63cd4d1c69c4168798a3d9f15388207ea10ee4dc6be3681b0c7dbce5649d8f90", + "0xc8e7c25854d49022e9a0ae2eda8e7835a6db9ef7d612312e9deae23621ba240f", + "0x22c05e50f27e8bdaf4abb0a045d0639bd7f80057dfea638df6a7184ac49b738b", + "0x4a34356b5a447591ac66c51370fb6539bdf50fda9600082dadd91d33713a74e1", + "0x7147d53533ae40e886f6bc1c3b65c51570d72398f46e3266f2eba7b707b46b3b", + "0x1e49f75a30695e9bef14b036bd1c0f2b322042b2a02ca56604484e913b284c1b", + "0xf2445d48e823bfa77776234356ae0d3c1a850db236b3d2a95e5b00c4d7e687af", + "0x7034246c6342c26f5ae974576358f993d0e5e3c577e6aecdcc182c78082ab181", + "0x965067896ebcb2628ff10127508df1c811087f45ae258a0d8179d576c21e4891", + "0x384ebc34021ebdaf95e1bf0d8d61777b96a1ae65163cd3bd9b4311970a7918b7", + "0x1ca6e203cf1e058f20f5a8b1e33464801bcbbe04c79a7201ad6036bb8aa54101", + "0xf5aaa21a85fa9d502ef278262acf71789a3755d36dd8b3794becab7fb2d338e7", + "0xdeb7dec7ec133b6ac05c3bc0fea3b0002c8ffe58b135f4ae85b71fe0350dc7ce", + "0xd5773586ddb40d4c772541f743f7a4b08e9b419fe5b5b3536afa0b3b888725bc", + "0xeaff5bc016770c7cce7be21952cd8759a8d0eeb1bd849732c15dbbb82c613a74", + "0xb1a6a6acd39b4428accf9120a46d74cca6451ea4a182206425a8a64c6d6be5b2", + "0xfff27e5023fa1fc365db1e79cf3283bee2f51333059bfff47df39f12875e5fc0", + "0xadf1ce203b0acd4cdaf1d9a91cc158a21c823dcfb0740f089ce0830102b1cdef", + "0xcf20c92fcfa22d6fe7a60d1aab2d5a942db39d447d4ba1e9e76888a64694f1e7", + "0x210a684182ea379b50d641aed1baae3bf3752fd84feac4b3dd4e110c5cfc4ce7", + "0x220c5460803cc8db7a2b645dd5a4525b0703182cce173324d20e1c865a157811", + "0xba87b487bfae148239b44f3ad7663fd66cde8e21aac9e1a50bbca7bb7334aeff", + "0x2728161f9f040b4d92ba838d841404604d4d838157fc66f20d6c4c61034fdbda", + "0x3f8a6c7198528e5084b3e8d52d3101c27c5bed8721beb831ff921eaaca4c4282", + "0x2cc2574320b3c7252404db7c67b462fbc8d87bdbeb782ab1bbd257ee634a35c2", + "0x13aae0ecdc6a70d85412178ec12e971b2c4476d5e624938ca0284ccfa611d11f", + "0x6af7161831c3442db94cbe28ee9385fe79339d533b9c0fd3266213c2a5024a14", + "0x06185136927e5bc26ecfbf2299a0fc13cb447df6ca4a60e968be8c2b7ba1c2e3", + "0x70ccc84931d910a2489d50becf82383a836309bb90dddb21026d9e4e4368c85a", + "0x400ae9e4da0f847dcd4bb65e8f9f661a3b0deb78346b4f1f84fc712fd34410f0", + "0x57aacedf503300888fcd8db2138badbfcd663c63c3cf5b3e35979dad635c24d9", + "0x8fea6cc2da76b7cc7062af870cfacf4952b81f09c3c15d31145fbbfe1c0806c1", + "0x5125434cc5d4137ee31b51ed8306b4d665b8dc66504661b46c227e62a9ef1abf", + "0x254bc0b61211e0a57755d73ac618012938472912f855972b7ce62677f5d0e64d", + "0x2d231389c849ea459a7530ac1bdffa4d84908e2c61125a70bfcda932cc8e5efd", + "0x671ae73d4739bcd4841fdff266803117c5684c61031fff16e831a3bffb4bae4e", + "0x64c4db66cae82a96f29296b481619d79a739e2dfce0ac1f659d45f526ae58ee5", + "0x3f2f08ce2f21253f8c9a3fd650a885ca0e77f720a21ad5b4c0867150a0274efe", + "0x98c48268710592ee4c26620375968f2b8730a1bd1777239e6ffb9f116c6e1284", + "0xdc7a5c095c255e1984b4a5fa75c7a1d95d98097fc4eba898e644ff66951d8dcb", + "0xeee7579812ef09ae31068e8087536362a967b2893b709a458822449ea89a48fa", + "0x296e707796c0b9f9a2f55ad06c42d03625dab94af71c2e1c7016a7ef6645bf5a", + "0xd9a3eb363d4a36300dc4d1903a83447c89ec286f8d219f1156335da283992d60", + "0x039adf5a0cfbc394847d8014d64700ac4b6e78b531a1e0328bab256f7c407116", + "0xf9a92c6b1f0b0b3d7ae33cf5ddfddad516bfd7b21842d76098737533efd4f7a8", + "0x5a5d1fa3b8e05a81173e627f14e689c166776b93df401593db8035a65fba58f5", + "0x34f7fda3053b9d06e217223ee06fd194e2962c4a381482429e596df1fe319686", + "0xb4cfd9a71a98ad52c7705d55e96f04cb9064b1c32d3c346be51370b56ebb0f8e", + "0xd46a93765af68d238b776b240afd464a24d8c8bc869280ad618fd0fb6360e878", + "0xf3c622a4ee05d1ce27d59e7b9b3748547f4efdb1d6ff72a58fa93dccb7b76de1", + "0x6cb017c4bd8bb5186590cc4559fd9600399485ca917b10556b98cd7fb61441dd", + "0x7188f59c892b8754845d73f534587f27b7da67f42dcc1c73390fe2970bf0ad28", + "0xb4b17c93af08b9f587963e42703379c5e4f760502870b8096917b09b3950ee35", + "0x03165bf9bc20c87412a41209901d2bf3c8bc03a8586a1706fe1499641cbc4775", + "0x9ef57b2126a38c2dc456c13c272de53366dd1bf1fe768185a93f3562d064fa8d", + "0xbc3660089065220589409f7063dde34aa080179b3f22464fd9df9eed98d88b0f", + "0xbf1cf6eed0e0270d6be602040a97600ca7e1279db4279a9fb7ee643345a264b3", + "0x4cc471987bfae3b32179aac7018ba574c0315b9832915b5d0b804b38e9def6c8", + "0x51351557582b1d821adfdad36536b59b28f9a1f1243115486ce44d4b22d3952e", + "0x66d6b02183b9def37dce37b66ba4e9939241732b49dbc8addd147a89dd9e0517", + "0x47261859ce169e56d4e7dd75c5e2648597c7906f9264710c7e4dff74f353f739", + "0x38edbf1db358c82d0c945a7fc024f7fdc1165331cc19caf6b8943d3ce76b721a", + "0x5231560201678a39175187469f7e36c1c729ae060225012ff4f679f3fabb8237", + "0x763bfbeeab624de07a6e758368f8f61c0fcfc8cda088d2dfcbeb47a5eea9648a", + "0xce910446cce07477d424f791a71a375830ac26a2543b8bd1343e0d775d161e5f", + "0x950ba34133aea3c2947a5e5fc1836375e81c042ee999b60dd4a27e6492fb41fe", + "0xdc24f20fda563bf74ff7540a06f3631af8ab3b3722874a6b383714f463f5fb43", + "0xf2250ef512d3a11144370747f2c86efc73abaa81152bc6083f87aa217d16ee67", + "0x8760d0bc8f28eb2504f3bde3e429a47f0aed1dc2c7abbaf01c68033c07ad368e", + "0x7ef1c11b1f025f7e2aca2624aa9a11781cd860f24ce3fb525e7196e590fc5ff0", + "0x7c4e717fe77c8f9e742e312081d51418614031745b182746c7ceb4ff54deab6e", + "0x56c82f80b8d52128275529fffb3ccf7376f411d7cf9464a15fdecf617b4e7571", + "0x46f7d3ecd09c29d36a62a1a65bd3c59a14c82687b5466c9c130df14c286c2a95", + "0x1d04deaadcfdc7a1e5e612df6eb836f55caafb4f9bf4f1200fdfef4f14229f26", + "0xa0f5e65e99a22e14ebafc71f093dadc96c68883609a7460f904eb15360e3dd6d", + "0x8ea6c444466d4b6916a1b6dadafb87d75e2fa1ddd1836425dbaaad6e99f4d68a", + "0xd53d052bb709813e6dfe218dc4bd99c5ae83b6f5993b182c36a386502713c7b6", + "0x2e0cc1dfae87825d1a1d8946e021dc514dea384241e0a6cb66d5daee570c72fc", + "0xa419612e2bca19a3a8dc7fac4da86c2df4edcc2989e10d3e9050323011676b1d", + "0xe41649d9af504bd273b9da0fde578dc126afb55feb8b3c31a0d4eeaa9c7b83f9", + "0x0121be707b5666d5a78949b2ee263bbfbd013b69caa9566864711bda4c7ed0f5", + "0x788538d654618bcef0a63e31576e19a0872a92733ef7930ef50f8afd6caf110e", + "0x7777a3a4930828cc158f696e6ddcb87696115f473f219ac5582d8a38e0645430", + "0xe15a9f42ce5964358f862fa7a40bff0c8e8d7429a5ca923c9f0d4d0d574378a5", + "0x187bd59945e1cc6a877fb324b1d7ebdf661383ae7e22c56913f2e920de73dd68", + "0x938f100308d20611bd14372b16da0dcbc888868f8bd183d667064dfa8e67a161", + "0x5e61540787c83bfacbb58967280163f55f5ed00e733d6295099588557ef2dcec", + "0xe6625082f4039ef9dccdbeb9488baedf75fcec616ed9d5009deb4eba95cc680f", + "0xd01542aefe234567f106a4f057173b4f6eb5733e0ab9537af2db309edf38763c", + "0xee0174f3f9218a3418b8dd2bcd4132821eb91b31391b7c2c6e5a84d067d21497", + "0xbe26c679aafdea135aa493bab8ee348b255f50bc69592bbe017dd96b0da58b1c", + "0x297e6634c06193ed4725942cec32ccc9b4e77b5d02fce2ec9fbf580e3dfce248", + "0x820d98bcfbc008480ea32b162d15701357f094b1d7c99a1ff92fc0afd9708a06", + "0x82bce2be0a2d468b2fe0d3ba4ec1e5e8eac2d83f8b2e402b3043119a59cafd51", + "0x63ff3569d9a5661b6773a1a5fc10a522ea12a22399cd337ffef75a0d36735ab1", + "0x8431746d8239126bedde7d5c58aaf7f733dd1542c942d415d876ebf8a062f032", + "0x6bfdf119b93ef4da6f48265f4c526f0837a10c8db9c518d0dfe1edf40ae5fcdc", + "0x55aaba1f40c9089c65623f67eef8cdb827282a39cd0778f26e2f73106d3eee3e", + "0x0022a0b29d8188251bf5c6f37c76368dc9c7ed9e00376901162d1fff111273b6", + "0xf4bda8d3cb5b7ad50dfcf2668253e44b98e87d563ce17720dd1eb1a4e1c32628", + "0x994315a889329452a3e08ef029e7d902308022b74aa5a4eb2178929425c90a84", + "0x86a962d1d436f43f6fcad5b61b615f2bd32f10fe8c62428854ce98f4289707b6", + "0x3ce476498f26fd1d0b276ea639d438d7efd3c10451949efee1c91f279ef15ed9", + "0x199b2fef89c1edbe547e8c0b666b7b138d6f94fcfb2f09f26edc429ac163b127", + "0xdf3fd62e7dd0133ffa23a0da13d720373b57e85c28ee97890c355c44323ad592", + "0x92e0cc3bc262330ed8a1f42ad40a2db6c4e75e2d39e24a6ed5eac0855c12dd05", + "0x5b46f058c21b9447f8faaf78b2549f7f1459fa5ddb4211150bc26dd718f8361d", + "0x316b4f0e5b50cea376307236de36f3a1ebad3c59ae28dcf7838339d8711047e6", + "0x2b72ece0cbeaf94140b99cd9312eb891a1264a4d31fd839017e22cd4cdef058a", + "0x0c86b9b2da38f00150d49ac53ccb43a88a44181c90b492e886c54b0d6a93de22", + "0xba5a671174dfd7f877bffd7fb3179b1f3f8444ab14eaa9a0488207141bda26e8", + "0xecf73cee14b1a8fa5c2de5d78c058bd04772666ff455ca4225ac419606041f2c", + "0x1947b6adf9abeeeb55a66cad4afd016f6522faa641c4e14af94cf6e610959ad0", + "0x5467aaeb96dbe111a0d36fa66a71f489fb33ab8d95692695c09f4680086daff2", + "0xa21fd9195eaf856bd048bdb258507351e9a2c168920fd0c550a2340b5176ba26", + "0x9b0cf5690d3c3764f5c102fe1d5139202a1f982bd5afc8967eddaa6bcfb3af42", + "0x32bb410896733f9f6080a5b574b07c0af3e5ecaf69e995751e392c3905c11d20", + "0x5e98b3dbf58bf5adc0ccc9269aa10f9921afd44283837e7cb419ac4fb89f6164", + "0x051cd6e01ef3ebac9f27e1d473b0abc00d870a78cf894cfa8222d00976948b39", + "0x500edc8298fb83a103f5bf779d1df507644e054ef27ae61ccf31d883d85c2a0c", + "0x80c8fd7e50aaa14da3af3ec622adcf89eea9760ddbd5232a49ba55837be5805a", + "0xbb828dd031299bfd428c22110ff5d9f5612447e346e98401ab4a01278834e476", + "0xe2c5f408029af25cb9c130fc8fb5118660d08da399dbec0fa1709d1c0583de57", + "0x1be80d06b4ec5ef612e16bd8d842484039ca5663234174441f0722ca521958ee", + "0x21d755042a542493e44e92b4355af2f06f161c0e2583aaf6862730be7e9976b2", + "0x49b993b77606eb939ae485e82243e530e392af6d68be4ece5ace66a675a7a70e", + "0x954823b80bea8f2007503ebda5a6ae4610f94cc2c9a6ca22088a52468a960524", + "0x2693662c6c0961a92566deaa4a59204a0c436aadc0581b799e6255fe97d26331", + "0x4e80abe082c0b8ae0602c232ab0f766aefa702e744ff142cb9e101a6050acfbd", + "0x9c47c762c73836210a6bd78e5ddf9f2e817951d52b9fea0c823596c3df2a1fc0", + "0xe86094c8da0212cb0cd96f54c9f1b22c11feadc5599f6aa63285971651f11278", + "0x3031451f37f3e0288d61580e5b20e008a2ef5975e5d12345056949dca2c1d421", + "0xbdf90347d794ab3b41da6fb75b5d8d1f426ca2c4923216393e055dcbc89f3cba", + "0x4f7a0c9ebaa4833e7fd0ae0f3ac8dbecf3d97d0036a41ef30230e634142247e0", + "0xd1cdfbbf34bfcabe4a0eb90fb4d8592738203d245d68b753d418c4bfab8ae4e4", + "0xaa56db3fe5b2edc2ed277656deb51e15f86182de49836b4dfe2636de5488a86f", + "0xf67b05c233797d61eaff641e5bd35ee830bc1a8440e06f85e034902bd1023ede", + "0x49bb9be0064ff46c4b7820e7dd08002f3914fbf9250c96873bb3dcc7bddbe3de", + "0x594efbc23c0a371e3e5478c599466ff3a8d985444583b70f275afda13cc05c9b", + "0xd1dc59771492ee0881398f87a7c90db42874d720812c1e105b1512531d9fb1f3", + "0x7462bfbf8457d1df1288cbaf339861dc91c02d772f3c1ff8c215965e555d6905", + "0xee62a752465879dd62d08d7a15a54af1e813a1bbf2035384289bd634e2e99524", + "0xc7c66334011807d017e0df794df5f2f36c4cf496ce0a3589465662f8aa5433c7", + "0x839af48e65e3e1fd3d177d90f1dafcbb0209b107bf882cfe2fd514be625c1396", + "0xfb4eeb8514ede5bc952beee0e7e78c6d7ae544e6c4d935a6c92375b224e40c3d", + "0x38576e990356b7c44eb1dd531fe28420d01d80130e0ef0a42b9a8b01d2687822", + "0x434bb4312789b8cd93c5f930f4305760f86c54ab225b35bec70954aaf2fb4c2d", + "0x19ae08dadbf2f7da90ce777913d59e74592cacf6f385600f7d50cbbf7c4137a9", + "0xfc9a8ba8d7eff3a582725f8fd1539c4f77a87ecf23505de8a321ec6d568cab5f", + "0x20fb269b1a7908ccae92532424cc94604ca9a0908bd7c5e446a687cb3be9e0d1", + "0x9fe0a0e3511056762698573eee8ee2b0b87a8b6daad2141a9ad00c5b159521f4", + "0x3630751af37fd3ae22e78198868341e86735b03432879fb159628937c6bc28da", + "0x427789cffa2250d89b99d50969d8dd9917b5f4c721ed9de79cf81dc59f94d81f", + "0x5ad7e16bd42e35671230458f8f97c18baa5a1f81b675df259c9d2d7cbb09fb77", + "0x3d58c8ee704a934f6de776ef8373c653140e089b85aedd53219dc0b46ff03b58", + "0xa5a0719b16d8771b34e050660ba965b0ebfaa06bad1973033cbe2fd69fac5886", + "0xcd66e1ce23416fb4662d2b29dd72d9f8f981c66098820058451441213f2947aa", + "0xc7eb6f1df45136c9adeacb03eada4557326aa0a22f9ac0d73df25e21beb6bc0e", + "0x890eb4c610c7036e1494514e1f7ff72f414c51143fbf13cf2cd03d8d37a03662", + "0xa54328a1d2ffd9aa3f38a9e6a0539ad2517c4f6129f01768891acc0a2b2a721f", + "0x147644decd98b450b284d05d7332629e3c6444846f7c71dbcc892d3191f2efdb", + "0x1a19c1a8fc7f9d838cbd736243e66b1f637f49b1d8734c2af417227a11623b30", + "0xa8c14722a6f7e7efe695be4e6a21f2d1c8b8d71e2cf69e7645ecc5cdc7b6355a", + "0x8eb33cc1490499aba376f581b68766c4fd40e7d6027f223eb46e27199acc8d67", + "0x1b6a906a5321b057f453624693d4ae6abe79a5b8fcd63a777dffb8b2ea4184ab", + "0x7185ec1f19e7a84c9f914dd223b382ff56464b01a1b88dabda415a01e1d0a1c8", + "0xa172df0cb06617eeb95d362bb36d5e5ac52cbdb2e5f3c2cf3d9b78ef28fad82b", + "0xa11941ce1c866d077fdc995acf3ff2ee0ea0481eddd142f9b343c8403ed606a2", + "0x1958ac9a77c5b9825c401b204001dea8ee2520983fb3e738a467980a7bf9defb", + "0x6b24d043eab24359787ed7e93543967c9f9b7ccf99894c1ee7768f6235cb0cfe", + "0x6ab8c28ddda71b937d1a6feaa67b071f78ff7ead3a192ae63dac34ff24b8d929", + "0xf101e3da7546249b5b6d4dbe960c713cf152627a7482fc3377aa31f430c54530", + "0x22628e903ea9eb3eda9c93ac92d77b1b8a5ee62706dc5ddbcd079c57d5b721eb", + "0x0050467a543fbf0a232c8ce9f66eaec6c38c3c31b8ce3d590d1b07586374c1ed", + "0x4235a1330a45838b2d2aa9873dfbd59cfc0f0cd16e13ca9292f8342eec255fa3", + "0x2049ff9cebd379b51308220449b3568c6d7843f5b49f61b85808287f3d60441c", + "0x50c2ef0e832df29297dc524fcf3af4cd0988fbfea71987f3ac5cba8d4ec34102", + "0xe7260880b2d822d18c9ac2224d09fa18f5c324fb421470aad5af6c2605b40985", + "0xdf51e1b441b9809b26cd7cbdc4df27eb9c7fbb3bf764971684aab6c63e282a75", + "0x597b5c48840a25294feb135e0318ba6d6ca09aac476b1041748738963136a0a4", + "0xc710bd4b45a991f7f1387c25db70a1964ca4fbab32b738424d35a6e06e2483b3", + "0xd67460a50ec79c90a97e25d4cebdeafed6c897593fe8b24afe47a71c818a55b5", + "0x0ac1f2282e4491fdc8d28f1697026b7fa88f46204610cbaf8811d38dc84539f2", + "0xc3352ebc532273e4224dc0e94ec4cbb83afc2b5c364d71534344793032441006", + "0x42f3d39c81e118a7d515d82b6880104909a7915aeaca8ad64fe74d9fe88a7f45", + "0xac6fa42771e9cd6ba31dcff2455d2234c53c282251ca2399c727fd5521eeff0a", + "0x83ae44822213f59d34543a6d4fcf76b4e22cbe5a90674755072613550d348551", + "0x99cdb65200f9d1c602c5c2ded67a8cf2722cd7c1ae3f11d29a2c1b702923df93", + "0x2adda7cfa12bf5ecbc74ed4f4ea419ad7cd3e7cd03a0e2b32e924aa2ab98ec42", + "0x3da7434a58c60b7fc7fee8e30b3073ff4d3c381288fe6ba791f68d74d24ed19a", + "0x9dbe78f9121e6c0d99fa6d441f6aedf54be14fb39a277cbb5f19fd0b846305c3", + "0x2ded5acc49e2e1fcb57a66a81f59405febb50edb6b41d0fa8e445477028f422c", + "0xa46310f11937ce81ebe8d4c60de1a5c8787a1aac35ff3b6e2f0cc793112b7df2", + "0xfa693856fd1867458c335c6e903e5745a950ddf8a43cd9ee76ce8d0b3070bcbd", + "0xb374a194d9edb55d2946d40a16ac4617e4d0674630c6a970f58db17f21d22c12", + "0x651032646288a0b6fb5322626bbbc5b6b87dc5a5d59f5f39073f2f9574646c41", + "0x7f4346336c95c7fcfc1f849cfa63afd46dde8e346ae0801aaaffa9069f989e99", + "0x8bedf8e9f5095b4275635525fea6169c5afedff2ae434e42c5cde973de77ae3f", + "0xf92ac4f6fdd7801f15c8e0ee163241542d1359372d2189d8cd2a33f925933cd5", + "0x806d437ddf966fc6631a8f81a54eb82080fb2ade64a2b715872d8f648d23b57d", + "0x2151451d68f912b58bb510002407943ef6f2cc87a992e6df0765a4c239e63779", + "0x6a02bab7734d8549be10373e6395c368492b8518df793821962a940d5cf93654", + "0x4de627f1d096c86c1c1dcde2a314ba65700b1ac47b9db95e9ae68f8d28f52b16", + "0xeae202c747b699171115bb56652ed534d9ca6de0e8c3d947d63c6d60b5d658de", + "0x7bddba4a7c160445653f62d27c1622323c784461d52aba5a6f19964194a063c5", + "0xddfcf0c5ff899f19c4ed0604e7b4cc645ce5bdb7b7c7d6bcecfe7f2cfa3bdc0b", + "0x7d27d279f52b83afc9a115c71910d06a054fdc2e20625cd05fe35ecb03734f5b", + "0x415f6bcb216ad524eebd7bf177bce80cc3d5fb3e920ed65a8ba6c02f59fa88ba", + "0x570daa81ed1b593529a07396784c2996d5703f4124f941e99e8f9cf6b608b1f5", + "0xb9da28526fe8300989e16c83c4bfe418c74878be1bf3af12ff3b9a098a4c92b0", + "0x691938f83dd63e39be2fb03422682ee8dae8e0a95bf4d09b4727f8162b2da11a", + "0xde168c58358db826c9c953895b7a0419066e65eec0b7fa479c328719cf70df6b", + "0x65a7b2207932e96c427a6c01efd0c3f01a37e02e7dd98b18ea559c2a6c83c8d2", + "0xfe54ee65b1b8e21292fde2eed9ddda163036cd6745254bc7cb9f3dea737832fd", + "0x543d64c2a6b763cabbdc1a9316f37115fd572d96b5c75184c155e68532fdc8a2", + "0x31b41a4f481a786bcf4029b19e84729c699a8d742fef50040221ddf6785d7335", + "0xa383494d908727fc6198035c24afb3f352a16b29b0c1639062e7169618bcb38e", + "0x3da745966ebad677a703f5db94777fdc307f6e3e66a7c3c5ca24f35cff3f43bd", + "0x32fbcb24d42beb2128d95055706b767f7df7ce16c1613e3195342db84dc9955e", + "0x1723ae6147425f5b01b68de9847d79b918ca0f85a800d981029dcb5e3c62eb8d", + "0x997f18b9977469cbeeddaa1bb31472be3806c03ae77973c857e32d6fe2c4d740", + "0x6c27575f33b1d85fdf9643c9ddd27085f4241518cbd5b776e0d2bce19b152ef0", + "0xacb86fb3209fbf57c42eb86d2617eb631e0ba36da7de5b2c7ed63f168a7b112b", + "0xae02559f4868fbe4f114eb320ff0f3a38086f364a2ee537e6051cedfcee76d6a", + "0xc96e439aaa996d4ea4c276d1592fcc06e829d5f3cebf163aeb75f590896a2648", + "0x87debf5b6912717ec3c0846fcfb5b459a15254660cd5064180c0c514b4b15f59", + "0x37587d340df2b40b3f14746b72c5a72c5f51963d208b02c9671d6c623079b584", + "0xdff2805c029c4e3c249de3aa9f5cb3b48daae4f4496deefc91ebe3251c18629d", + "0xa84f66a457869dfc95d625d40496250ff33894be23a43e53ec892481f1eb4fa5", + "0xf8fb34bf78ad6d52be6fbb5472f13322b506f594ad3b585c04f56ed8d0d9afa1", + "0x546937b89a4d3b59817377b9c2ffe9579d4650cce71aa26bf2c76c571ec495b3", + "0x5ac921894e98005d03aa42e8fbde7ad0af0401e350c8ba98c01543a93b37dda9", + "0x3cc76dc057c73f0e0fdff28d484a092747ca42bc10989c599d0f597ead6024d9", + "0x1992cd7e94e9ecfaaebbd08d91519d6b67857db87e2e67c546371738ae0d2d0a", + "0x3604be694574c05c63d69cbfbbddbafe3cb425d75a13e69d61b50fd8d9c947a7", + "0xd1c82e40206d2a89e3a1a40c4a1b63c62ea6fa0847ddc2b25f63cb9bbb4a55b5", + "0x66ba114d5bf45d50e9ab9beaa879ce18d02a8b4f989c29ea7e9ae604593e860a", + "0x94f74c09ce5fd1c8fcb9cbbcc476af20fcfd9cf01c7ea65c14917da7b9560ffb", + "0xa4e154ebf83215c3843ecbff1dc8f646f221505c21d2a76f47d55466d895f1a9", + "0x28c20a0e95e23a023678443d7bf5b2421975b827dbd617239dcf26bf6db9b255", + "0x55d8ddf586d61e137482e3f4bfc1904ce4e04d21c6e7ac4d8c7d29b1483c8c0a", + "0xa9e1aed191a7a1a92bc99604e3b24c02356ea378b16de109362aefa2fa978451", + "0xd543ad635db78b2518681654f98a32d227fa6a1fa9b7043ad12cf58c91e8f729", + "0x102fb87da8b57948fcb763d7b797233f21523545f78388d8d05c6d7f2a4b388d", + "0x4e7273e2a92e897590988f38f8b899879aa1aea754fd5165364e8b98a66e0d62", + "0x5a06544527f88d9fbbc5905742863d873367d99e574d75496c59caa041e2b612", + "0x6a8957954db14594746daa61f907e4694e2a749ff53ea6b1dbe77d7d1f378d22", + "0x0debcd48486aa0d33a783caec0d6fb1256ffcca39071041fed7f047eecde8640", + "0x9d0a9b13dab1888bf0eedda217c501d76f587ee9a8765bb455cebcca0b705599", + "0x30693bf8c9bcb6bb4187606f98e138700e999d8824cada72d3d07f8c104fd263", + "0x494ef870dff64d1d65b4ae4b49ff13c145a6058876eb657751d58c06f62b5032", + "0xee4150e64f9ead8124d50d56fa4b6e6d185fe8ac385bd2a9db7ee991f6e34c02", + "0xb859d7db7abe48cbb9420d008d94e8d47753cc78962e5dabdded9438bed56b1b", + "0xf8b1fb734c345111704d73fe6944d0a274964a347d7dc5c7cb8677104829f5ce", + "0x5dc002623d9b3b872900b0b313ae8520009de730577b6eb2e2de18ae5cd4ac94", + "0x4d63e346ce7e654db6f067e8348c539ccf622d84020812724b936c19ff4f86af", + "0x2ed43f4e5d6889f5379e42d4a06de7c343080da74ff353960e4cf980f750fb90", + "0xfc61d0c90ecb073c022c87098045b6ca3f2b66c94f3723c679d81ac652b16f72", + "0x7e69914b56984b8c7cc9db1732c3d2d32969a58d6662509846e6faeb1305586c", + "0x0ec9b1b68efc96fc7d831ac7316e0ac0d908bac31be330d905f87b136556c241", + "0x32fdf6c25f6c741dfe468289cd7f019ec3a40c5d8fe882ef662b798491c0dc34", + "0x1ffbc6b29826aa58595d1a412fb90050f2bc3cf0ebc5462f308d4c8d85a1eb59", + "0xf0fc93cc2868cb9828ce16463e4cbd59637672d5815dff03aec7f3e1424eb204", + "0xe404321694894ab375f5a65c339f2cd2a53fb5a10f312082ce019681f6ed64e5", + "0x81ab1f93747c4804a85f56b0c6eb61491b958504ef7b898fb1362eda9b394e1e", + "0x1535d439d0043d1436de963e3eba47335bd7afcabeac4d3fc3f342396d3538be", + "0x42da1b95481bfab6cfec59884bb1ac7572636c8f489df2768fe2140cd2702766", + "0xbc3fd861f6e09efac1782d9d383c4ddb9b4268216fbdf3c25689162628e36cec", + "0xcc74c3d8b44a8cd23676babb4efb0e67871582cd5686fde9de6a052c5bf91ad2", + "0xbcd7fe80e95bbbb5ac93b1df5ff0b8e921e7ebc4960877acc1a95c478c65d64c", + "0x045e5918fa69606b9546f5fe83cd9212000828c54f9cab856f85d3a22536a751", + "0xc0f74dbb5a42bf1656698c37aeb904a33e969099f215a7efeeae0024c3a409d4", + "0x36d537998634f2dcab43b387edb63119c0f4cc68b1979a2ceb373089c531ecf9", + "0x87c20426fccdd225bd3b961c7adc1de3f9ac9640f6d26bd183f6e528089922fa", + "0x195ee1daad5c3d0052d6d633eda1c9f7160d488d4bc54f4ac3babdbb678eeec9", + "0xf9a5e6735f9c5577283e8cd717b56f69dc8306b23781755f2e513d15e6738cea", + "0x3e5bc3e78ae33367ce7450c5da7436f1faf3b1a62d238208df207307762688be", + "0x123e7b4f7e6b9338df2827a238a266376a20a1fd065e9f8a4446fcac4c6c92fa", + "0xf4eb14bfd197d49c42daa919322f18228d2d9ae2dac6dd7113c5e7d12d2ef866", + "0x78836678c20a40fbe09849fe190a9e74ee070f2056d7bef85d0f124676a93130", + "0x7986f7321971519933aa5dd507074c7b007328a7dadb8734eb4aecf732703fed", + "0x14485d24b7e90fc39d91ad6051b7f596d320b1f88f54fee132e032753e59a766", + "0xa80a9a5db758bfacf831a54022c85a838e30c8611ab4b17bda0641994302b59f", + "0xedf1814fb78abf675f3c5671c3618e5e51105647997d6dea6a0cfd1f0330bf6d", + "0xa91e9fcdc4f2b5e029abdc6b2523079bb4a2f5346d8a5a674e3d5582b8871d1e", + "0x3dbe468159a8c068285c92360cab488a4c1ec37487dd54cdc0b70e6d7cf074dd", + "0x69877439effb3388639ef6e1cfa132bc605bd8a0da053bcca23d82aa453d0040", + "0x6751d32ee3a1244532e6698ce57cdd0a59f99130e1e7e004c2751bc49d10b355", + "0xd1760a4f6e5a7967985125d2deae8bc783e47b1b85e19fc273e33eb2ef88d271", + "0xfa934c087923cc16f636615657477c48c082623d7cdd35508571655dc14efe57", + "0xb6b1e4387e04c4ddf88ada0aaa162345cd43e54482fddb4297e1eb6f8ba1ce74", + "0x3988089edd46b57c0bc83b1bfeb0050b503cbefdca83e96f1c12e7ea80688a79", + "0xedcb1bd8b522ba5155965cf18c25a090be2f8d7871ce60f0f371cd033d5a31d2", + "0x2f887b56b317e9896698ec9059d36aad63d54d95a01d389aa196ae12e562ca2e", + "0xe6d6b89e1d851fd24cf54f6b60c6c93a8b014ae30906c156374d73605aab3028", + "0x177928968fef8c6da017b177f6be85851616775be043b64f72925e6b8a4eeab2", + "0x71a3de323d9a600e15c25a5a6e05089d849defc3830fd69738f548fa4c57aff2", + "0x8e7d92f316f96b491e4831f52a799846810dd032bd720dc891195739192f3955", + "0x12a3433e8cadc005ac35da334d557c8cdad63576613f07df8c3ec9f528e846d9", + "0x1406da1f5efe9d3de6a829f1219f731f3ac875c7795f72b5a9ad25a57970b9d8", + "0x15a849a0ea56a777e00325b4af4d9996747486cc9893c08b0773210306193521", + "0x6178e69be88e7e93878b731d062b29a34bf2951082b947f35f60fba2c8de62b7", + "0xc4142d4fe01091e82626178b66c13243c9b35de0f07a49e3c5f2ddc15b39feb6", + "0x8abda6239557236af27a2cdfbb4fb91a6b136931c53067739578ed13e1b0a2ff", + "0xf85615d9337092e25080430cfa0b7a24c97effd422a1947a4c07239d5221418c", + "0xf9534d7db3b5fc1bcd7033ade59fd66bbb94a5bae91c4acebbb1540fc8bd3b67", + "0x5ed0f8035d3920d6e94b881cafac324ce5688f8c97668715733e0d00733b0fe7", + "0xeb6c474a0adfd84c79b86090c793697c0bb39d6cb007c725c2ae7afdc98df5a6", + "0xfbfce3e019b0b29ad03fd9146fa368f9965050b40733ce297bce6acefc4668fe", + "0xeda9ed65fbb1c7fcccc91de519f69933ae66c8ed59fb65f64751ca8aa06030c8", + "0x359ea9df33d466b5dc210ef0e99f3b4416ce03a5439f49b4cc4c1b98b22a21b8", + "0x14b2e8729b70abac62120541229182264b78c7ba1a1a379ac8a582aa0bb0d739", + "0xcec0dbdb55f92191974c2c8ed716578c5ba04c4584a0770fc0d7d5cfbdcb2717", + "0x07334b05a08cab079354cc1f7a945caa3c633de89a89c18244de81ed56da850b", + "0xc58e0bb71287fe92564d00b5094ce36b7899c346679011e52b73eae45bace19a", + "0x9dbef45ce9abb762bb9b30b61456a90b74b0b6f5b41af9500699542d933f9535", + "0x3cf848f770e15e7f682075c77f7e980da6750d3d4cb038479983e341eea3c354", + "0x608a4c5958ef3b0a324a7cdeebcc3abae89c1371c949d6b269b2d3936d9fbdb2", + "0x66422fbb9044305317d900702c2f99702317a8a83ccae0911a2832f623356c8f", + "0xe977f86ae4c5b350b350a3d6af7fffdc9baa96d9a7cb24834e5dc4797fe39fa8", + "0x6f56fc66544e099797cc3b0879dd20b21796ace01a0029e0d8464a3764d1e858", + "0xcaef7878c703facf29fde1467dcd08b03761872f598f42f5c56b4cb367b97255", + "0x9055cc0c11cbbe8477c7dd35b37a57e7994248c6bde9ac05e85717cebd2b970d", + "0xd7b08c0ca8abb9f07e3df1c4ebdcb03b0ac2018a905d1c78e6825d2bb5ea1ffc", + "0x0184cb109267e58d5bc0193a04548f0c2b87286ab6b03a1ff7b6d88a725662ef", + "0x3005e0af1ac0c5fd6d58328c06cc7f5d89c8c4ad173106fee1a7e37c9f2dcb95", + "0x8f7f8800d29c66b4fb12334b622fabe1cc4ef06e4ded44e4315efc381987cd56", + "0xdf74e3be6d22159e0e02ce3b8f0b405e6469557ecbd12e4432d52f4ae4637bfe", + "0x2fa9a889f958ddc41bae5916657f946273447add502464674658bcc257f1af15", + "0xbfbdf04ab62a35b2f7b038b02d8c37ee946cfee18e10ef8a4cd5409a5fe81d19", + "0xc4e834510182950161a75a843352b5b46e246a05b7c7e47240b6cdf7e18b4de7", + "0x2534be362fcc238c530f2ce8f64a3366d4003a21e6f32493a082b7efa1d413d3", + "0x628e5f76af96e64ff34c52cc5d07562e72c53e7bd4b7585cbc83b7c9951d0d2f", + "0x41687c81b22f67e4ab6ba0163da6d58c81d94c5db20569b4a42fb58b7321a442", + "0x50f55f58cd9768b611fce3ff13e8da9195b1eef5d0a618fd27f7052f88c8fd84", + "0x1b64cdcbfc12c42e9dbc7a62a1f8eeb0baaab8ccc867f7a7308c88e4968eb9a9", + "0x77e9fd9a5d64b66cb901c5795b9f66424638b24e457024b5e71ffbb79ed8a863", + "0x35644de61c2108bf9d49efef164414cd2594ad4cca6bc421699458c9bace5491", + "0x172ded87912492ee521f79c1ef22e42b1d22f17c3286575a5d419fc00d928199", + "0x3c8fdc337338b107ff5879b3e95cf285b5128ae395c4b89ccfd05a3d942887d3", + "0xf4b22643ebb6d46cf292531792543f9699a99674978045b0c911818211be6017", + "0x783fdc538e4505d4187a0f341b066007caff8030c3bcc4bf49ebd31a8f6b4794", + "0x38e11f176844f680e75b65d5225533639eb522f39495b9ee426135097e5e8fab", + "0xc5e0da94d4dd6e29c8bf3684177a62051e7555ee87007fb07581c885be598edd", + "0x317dc456dd095f9eef53781c214806beb31351cf78cb1854be257b4039324b8c", + "0x5bbf954741e453e3157dada0a69bafb9ebc63c3dbfc0cf6e3fc937a1b14b7356", + "0x56a5354de5acff2b904c5b6b976c473277ac2364571c54583bd682e76bb3f43d", + "0xc37f17385f4e6015cdc8083fc750499ec8c9063544102eb0e3e3b7e0b5046946", + "0xd616c205adf0ecf00c7563fda837e94a4f48be8560ddd15d93988cfd3242b40f", + "0x1ecefd5cb0c61b120c227274dd60b42e6d25229517b20dc3e37a7c3b436f0e92", + "0xcd447982c518db12b8aeba63b68d8caf1eda6bcc44400c9d83c4e4d64b4e949a", + "0x3763ef2d96a89a302260ea66e22e3255001ba2f003770c03905d4f39d8ef6501", + "0x2fcc41e9b574af5402cdce8dc66d79488cbd5cf960209918863ac9526bcb6a70", + "0x17b71848876a6e0a8857f1e5d04762734678ed1a8addb7e378915a7c3f37c981", + "0xcac9e4641f50d52d77e0e77b1a1b5fdd25cae239864367b3d99026d3fb973610", + "0x55eabf50cf101f65e51dd3a54321c1897a67c50512c534ee9398a716a790ffba", + "0x49101d5719e4de5e4e88645de3c22cb3ab794df815555d4f22d54ac6a59f73f5", + "0x509cd8530c28cc098b0aa80d3006a8f71ac7ad56101b880288658917173b8c8d", + "0xdc0e15e6d321519f34d40c6b2cf5f6955c15af815dbe02d84606ed76a01fdbb8", + "0x0b8e107e7abcf80e85b3288786dd79f949449225315c9125730d7d42f0ab9cb6", + "0x07ba997ea28711f221ba26d724a09a52b2737b8aa8532e890490ad811ffa792c", + "0x713775500194ec8691fb540d63e99a70cd443e5539b5f8e2a993266bb58266ef", + "0x3b2ccbf35ac833e845f00329c1f8d130a3f804c55aa83c35421adb83749213bc", + "0xee82c15eb18a075b00de8fd610621683dcad88a19c1c507351b5be0de0c6c4bb", + "0xf874298782be23045971092d8305c469a309a1a33f6cfde7604e6499d2384cdc", + "0x1a9d88cd641f6468fceb32eced3710569d511848f393c2114ae33d7f36c12f3d", + "0x5b2b8c2ba5d3aa8a0503d14e759154d1f2f46d819b363025a77d4cf5e3d83586", + "0x0082bad01acd43bc2c504f66ae28056ce352257b7ba7e2c27dd36d256c079561", + "0x9c6e4e01a831348ce64da4e4bf04cad5f58749573e54f1062b0e2921bacafe74", + "0x600e1b0101161721066952d71401f8fe6e689b66b26e2e74cc924f5e914e8eec", + "0x8720d215255e4d5e2a688096506d5b25c3a79c511d8c0b3dd7ad3ccf542e9abb", + "0x48baaec9724cadc4f7cb8f10549b8daf87b2572151cdf9308b3e96f02b048f23", + "0x2adf0f56fb9bcdbae394025ae949e694e01599887e50c355c90c3ee5ff32eac2", + "0xcf78410476d781bae1567f3d763af732d2ecf56e741cffd1bd3906af83de1f2f", + "0x4e7e223f6881065ee722d6ff9603f1786e4e99292e9caaa75b7b1fe9aef00109", + "0xfdf0b390b0395f007b1b342065096e0a8da957b26ed4cdcaba432a202ec12b65", + "0xcd40d2df140abc1228b2e1f45b5d65a0f3e2ab8b7e740dfb5376b036f63c1c2c", + "0xa491347f128d31f68cd1ae536d8f982fbfa5b58d855a95219f104db741d3d2ad", + "0xaa91fef9cecb842de4df61fd1650267420c8336758fa450f87ee867ff1520905", + "0x75d1574bf7b23319a7c8ff6a0a7cae649313aca8893ccd223f1f77fd71c9b8e1", + "0xc72491916b25756e3f505081b7f63e32f3289b86cbe0181ac9d33d29f666b9e4", + "0xd446465131b34f091673736f70fa0508ee7065c4011359c302a603b6159cb52d", + "0x1380689a50696e1cf0c19869b9773528f01cdf20b8f8a6c6a7165fda31ea49af", + "0x01cac6d9deb56473681c02dc753351feda402a1a1cc2b4cc8beeb23884f40760", + "0x3f622e134dc529c5cfbf58a3ce91d57850578f45b77c4683b2dfe4530ba0826c", + "0x016c95fc875baa0a5d1ae22c8772eaf574a6c918510875f1000d65f3a779dd04", + "0x86e5f579f42ea54a96e622f4a6becdc5ae85e0d0af87997fae87b6707abc8d28", + "0x53d403f0d0f1f30d919ad7212cc5e2e73cb4870c4fb4e6d260d2573e9bc5575e", + "0x961cad0d17fbec30a8f614ff3565d12698af096e61836cbf1f0ea125ae3ed72d", + "0xc9dcfe7844bb4ea845125bc3674f326c0f178c5cba4349b9461e40bd6ec68c3d", + "0x894243ff80e90c4c4676583b4e428f13e077008d225790a234ae215dc53d33a4", + "0xe5fddd80d3cdbafb53e0cf3c095d33904ac8db83bdeef9816111d20384aed444", + "0x5c7ce294d82fe6502045664f7d13d02063ef24f0f4960e4fb62bb6abf08c63eb", + "0xb33a5699ac121a51c0074b4783545a86a428fb239b4307f1e45108c85af88617", + "0x37168f3f0220f50ba3cad0a558cd8b01a7a435b6c3c5cde98b420ba3b54a1cbb", + "0xd50928e60d00c23adfc916e7f9a5363fc8c94c8edb3aef41ac1dc719041f92be", + "0xa08b27f437ade4d527d883194f79927053ac55a3293487a65060aeaf4c4e5147", + "0x326e2d1f45438741b63d346f0da55066dfe0284382f1b4ee54b1d5552c4f7d83", + "0xbd96baee5835d9d6007b0b5957e452d71d1ee31aa6fde99796cce59b17dab703", + "0x1cbe90df49f8929ce1052049bde7d6169efe0b289ad4e05414a8e7bd61788900", + "0xa0b914df37895be6f5341f3f4013ce5c61f108203dbac4ff205d5f1a581712cc", + "0x1582e61974c0bb5f9f2622d70e772f3e9ce145be97eaf5a87ad794268cf352ab", + "0xe946dda774c96c7878a0daa686e4a22e0d9d36a88dd9c93b1776432adbfd68a1", + "0xf88a07db8c0fd2a1354c38617c16b4d2e4f8bb43d9049321ce47a8c03c8430d9", + "0x2adb489b34c480267927daf3ba3ca7567d542edb83fa82e8040ec57e25e3e6d7", + "0xf1c28c6daa3e97466d50d9780bd3335f3dd096c3389b906bcc12426ae4862a99", + "0x4457a8686a3839b7d3b592a1751c25b216bc64e9d0b8a81eec55601ab8d8a98d", + "0x0ea5d5606c5e81f92d31b49b2e54ce6c6314b13ac223c83094280d0196e003b1", + "0x33a91da49deed50914d998615077c5192be56e482ab230bdb3d480d283502e2b", + "0x5385496abf2e351c0cbd7f6fcb5bf5b5345783b4e512bdfa23b9736e77ea43f7", + "0x98f808b18e5778a1bbdefa3f19991a3d008c27e9976db0ce77ddf9e4e21a0feb", + "0x5381dab139fbb0ad6b61afa35c541aba559e2ac25c4ab1cf8a756c2f27c6bba8", + "0xf4bea5f3ab0bc9ba3ad00ad79402d1d62da125d311884f225ad8abe9fc36d56c", + "0x6018a9f7edb5ee7ada70c3e85f22ac88924d06031cff3f61104ef52bf0baa2f1", + "0x01cc4300f1cd2bb4948329d42e17a277c7da52696d46a60442b6f5600d869faf", + "0x330240c95bec1ac1a476cd202aa74e85db562750f860a9fbd76e813f16cbb639", + "0x0809c487d45161c3b85cda014603ba7efd6b67a8c7aaf314cf20c880ec623a7f", + "0x653f53065726f9a7c1b96ce7d836acca515f563a47c9d7d47aa8c5c030a9fe6f", + "0x37b8dd7b2a844e519f9eadab305efa5d112266cbbc76bcd5afc119e0dd337ae5", + "0x385b7031eafc345ed353d9b35dc53010496db172cd906f8e0b7b891b84a65e4b", + "0x38259038fbf1ab3f0ffac98e6b312457f6b2631f68ae477b9302fe740cfb8e50", + "0x5a963aaeadd708291b41bd419cf2ce0585e162e0d46635902b58ee85e317adc3", + "0x881004f4fabe3e7642c8cb5e99dc3909da28451ec442a299f331790c8065e049", + "0x3c721f828959782052312d30d8256c9351a141923a9c2e2ca5b605f3a92cb27a", + "0x3429b149f860e963ed3819ddf19164977d637489eae313331c71165c7eb8f824", + "0x44e291345b79ff4116797899da20baf28fb9d4d2a5d6b1661a0c83b8952e481c", + "0x00078c007b6c0b3b6603b0838b03ee9e8944fe16f99f0a35eda286a288594806", + "0xbcd3506338253f0df5abf0c2866cdd319fe75bad7ac6f18d1f8201164e0b9986", + "0xc047f5f06cc54e4bb54c8e3bf22245d68c18b4787a01d324deb2139d7405814a", + "0x77ec49a04762af36eb63e2bb5c5cbbf15b580020117639ed5546749e34285195", + "0xfce516ae95eaee4067e95a5752494974ebdd182fa47deab70fadc5afb5ea8648", + "0x2ee54548e56d2cecc3e6cff4e60a7664e55d9b1c1c9a61be74bfff7635078cb3", + "0xa79dce8f10567e060638cb2f09ead0b191e59d972c532a7e91b33d27151cc23e", + "0x436b4cf10f5cdbde72be02ca16602190a56c77f1686533e643c885351d4657e1", + "0x9070c78384138f5e17cc9e6148c7cb7591eb9864f042b82ad38ee263383496c6", + "0x12a8d5285c871a0b05e370a337834458ae2159b5d8cb4bc93b6cc83bf7351b68", + "0x3c07d35ea209492f4aa811c51202f081a3bfd6e31705ffec497d70bd59b7a6f2", + "0xc0a99b851e0fc4655cb3cb43547f4ae6c36c350aa71626b61ed3ad3492f04600", + "0x064404380c5969d8e43d759ef990658d7cf5bcb7b4f8512fe58a7e994e199707", + "0x3d3a61c95ffdd3c7f05b3574370bf4cf0eec605ca27cde051b5d77e062315f36", + "0x9259e0113f1e009fad7454eebb238e0c7f4b7aee8118b63b6c05aaa2f0bc39df", + "0x76ff9818e62b25fbd698ea021e200ac9314090b801e000ecddb71bf4829aec8a", + "0xdf0031d6e1c55717102ca1b3a0bd389cc0d227f0f804396d4b84b5dd26abb1ea", + "0xd0220e77632c2353d51b92b1638e909c1f41a7ab0e6801b65e344ab594f48881", + "0xb15fccf30f298101d5ca0034cb8585cf14ddd76d58f3a8ca71a60aff0d0438f8", + "0x5dcb3817ae05b8c8490e197cfdd3f0b701e61d83b8f6423b3f24f27ba0f4c668", + "0xf3bbdc6651a4ba011443f6c6542b3f45b8aa2ba8bc719e7220578d6362cc441d", + "0x1edc95bab3c88a66246393058ad1a9557b371e726adaf261a5faa535cb8fab76", + "0xe02975b5ecb9fb8abecab35298704ecc476d2e6205c2df900312359d5aebdf9d", + "0x2a5c9b033738fe9e7ba6949df526b5a735753464b746e7d1faa29491a8e5f57b", + "0x46ac373df276af8af25aa1407659a8e85ae12b51ea6ae0150ee2b80a76ea6d9a", + "0xe85513a38b54114f4b6cda2bc81a4dcedbec22749cab6676c061d95c7f38258d", + "0xacfba9967af17aa94f0bf73c3b1cfff113e14625742a7398a25a01aa29bf02e3", + "0xd589df920ebfb3c3c1660a16f74213dd6d487ee577bdaf18f6279eefb9252c57", + "0xb2b66c26bd139976ffc2471f8ec71e353108828bad5094a324d1e4762f5547e5", + "0xeac126eb94bb1ba443373fb2556753d95804891d4763a2cdd1d297f1eba0fe6b", + "0xfcb52c727793003a70941fb01bf6c184890a691b70c0aac3b11feb3987de8628", + "0x1c1b6aeaea826ed0cc776a322454663ef555adb0d3c6f50480957ac4ab7f0672", + "0x187affcea64fb6195ee27cdca1096142898be0fb8f216f10913a744f2005f7ab", + "0xb4e42e3a4c94477a6d5d7f3de429edee7d92cff93b647c71d7a20c1e07a35117", + "0xf960751197118967fcea65f10b51d9568c184a8bc968c609d093a0f6c15a71b5", + "0x0bb9ca3521abf8fe971d371749e5c2258b1fd4c681ded047d6dc7820d303fa9b", + "0x52354e8e99ecb5c2dcc1214c08901d715ba62a7463d56c76a6bd1287a74f5c38", + "0x8768dc0cb22a0ea9fde00170783fe3741501d958c186e2c636d03fdf8a995129", + "0xb4204eddcc9c75372de503645bddaffd3f71e8554c3bca09ec700d928a9664aa", + "0x97c94c63bd30754d51abf48aa830bac3724cf77e366965e9f61a100cd0136714", + "0x60dff72f08506ac9ddabe3f957f88a1ef4935f187b6c536643500d65512fd393", + "0xa94f4c353581e474a091655c78c491c38315e93e287f848c17843d807aae3527", + "0x09d90469c97087fd45cf1a2c5471c6e81e0ec1e7850dd76b0d0cfa9fd49aa13b", + "0x298d03c60b8dfca9ecac182b5c0f6818a4c3d84e55314c083f8913a8746fe335", + "0xbfa7ba8daa97bc681bc6ce413494b85ccfbc10e2bc96e148713e0325e21b3b60", + "0xe61dde9cf0c1c6fb0a37993df24dec2f221f97bdd34f607de13fb1f947e7f284", + "0x91e9a9e65d5076819146b246647b9698954bcf55e7f059db32854f93b325d35a", + "0x7bb2fb25b881772f318a10b6ce8896712c93cc85ce9c7c371337020e86817a3f", + "0xbfdda2258ccd28dfc81f83ad7cba81967120257392279c7412f0bb116605a21e", + "0x0a626f29328872380ebf6a10468307abda5a02c3a7b9e04763c0c8c83f903df7", + "0xaa8ee86e9446a125356a96f8ed47c3821da54b003558f68c823c4ac1ab966c81", + "0xe26f3cbd95e0a26683c26adfb71b6d4fc82b034171f29836cb9bf391cf172376", + "0x7cb80eb383da7d8c1120fbe79cf3bff3e5bf19b9f57aebe11f79ee23dd82e611", + "0xc9b85149830b7a2dcc1f613f40ae232bf5cce7770780bfa7c77ecd25ae0bca6e", + "0x859dc28f93d2f3b17e176aa8248d6720be498fc85017491c68d6af5f4798b437", + "0xdcc4dc79cf88601caf6e038bea275a98208d221ac8d3efdd5db3d2181c14c947", + "0xe1bd63a920d45b05efe5d2fb99437a26bb7049ea5b183e99866d6dae947ff724", + "0x4aa94bfe1501f4d37b0c55d77add7bee9bc7f24d444a3ed1c6cf27d67026bb62", + "0x10931498b823a9784c4aa3ece5e88b477050927fe4016e4b10de7e2e0eadbdb9", + "0x7f30cca2119b5a4107cddca59a88f10ad95cfaa879d97bd1e50ae6a347e71b1d", + "0xcd8a0dd7a4fa9b97641d5288375105273c9025a2c9f3d7d9d04179fe3f55143b", + "0x6c8ec850db640544b7e5b22c19253dd1595899a7663d40c4fe13de4258cd60ca", + "0x06ec895b6dd7f299edab3e2e3a65322fb7f8fa8c9a6182b7af4f0fa25acdc45f", + "0x45f6d74f05f7b366770428b49630e836c2fbcc72133ef03a1bcf9953209e693f", + "0x3d868a3921aede543f2bd8ccbe3b51468e7a87f8278e4601c4a8e740e8c339cb", + "0xc808c8fa7b02023e5c64999a141edf6e0ce0239e37656e0fa7c5156443f555c0", + "0x82c273cc2afd955663515932357f19d657eaaed2824551814706ae3843fa1739", + "0x5785f16929a6a73b4621e75d31958e2e9b00dcbf3a6b38bf3ed59672918b68b7", + "0xc8f84b888e55070682103999cfc315ea3d157d0771f0f035cf2ba03f6fe1b1f1", + "0x343a05e1a5e75e09528f194394caf6ca8caf94904d54d89c9d22abd5cae0d83e", + "0xddca7f95c2d9cfdc9efd9158d29045ba92a71d45488c40d28b257425c1c56bfa", + "0x008a2b681c4691d7e0de476180c969aa511467f27755d0d498eb22c9b5333835", + "0xe33fb40ffd6253b5701d24c59a4e217197f9eb7caf7c2223722734f4c74fca4b", + "0x650e8f1c6c4dbc76ace7d6c29b9a659d520af9b291b389bfe3812c1ccbd07c58", + "0xf88c36b8042df77734f99395eb68aa9f4b67a21891c42350e4d5e3e6d8fdf168", + "0x882c68aaa8d1f6acf005ce2ad3a6fef7ec1212ce610dfb8a7bea9417d87431fb", + "0xda73d75513895d5bd5174814da25cddac9a633507960e78ae6884b92e48ee699", + "0xf07d98594c0ecb16cfed18adb9f7b5b1055630b43444c70e6357cd18ebc09392", + "0xd70c5886426c55dda997d615d325b5cb5b652f5673601a045a113d94a17715c1", + "0x3e8dbda1f53c55fa4de65efc7d294a02d78c69a98d59049dcfcdfff6b7eaa521", + "0x67b14249f9c987298fb00e0bf560a976dcaa7fc0d02e816f84c3bf7a4e7c6901", + "0x4f8affa83492afa72e95a36f23356b46e58a0a19ecfff6960d4d6e5b9877b1d9", + "0x09cd2a17655988d2d8cd5fbe44965a6c15c3f123b75e1229621b9ab74d030e53", + "0x30693dcabd19e89bdefff4753cbc64d00c65a4af98f782e6e67b4e84f6b015a9", + "0xf67db822aaef8bdf7967c0dbe25015ff6cf88ce21e8bdd25feb764828ee64951", + "0x9a587510721ee914cf8b9c863859629ca0c8ed22b0aa023e9efb0756d3f9ee5a", + "0x5d00c0a840b96a19679736a7ba555f3e9bc5263b4b8437d6c3779191eda0a7c4", + "0x3e01cf22757510938a5aeb2ec6cf5046b7d3c186bafad7d57b81c7d2a99415db", + "0x0ff2d3ed3c5acfa5db9f9820a1a314865e266a823ab42f40bef6b0276af0a108", + "0xd3207e322207667c614e50be784f6b4d9c3f48362dbb65b17c62f5f33e631ce8", + "0x2c3330fc9f6394c0b8eaea0d156f2b9e2d2da0ddc8837e0a28d373aa779df9d8", + "0x56c8542686730adabbae6717ed8cc8f0b974037842ea5d1c80901f7c85eef3fa", + "0xc51d8a382df91e9f1fb0dd72d416a7d094aa3b8ca4f90561e82fdbb9b78c28c4", + "0x6507fec75b170f930df2e28dc75ef3dd7313834c8a8a2ec837d4ac27fdc906d6", + "0xea23428fd27ff3e5c6681b0640264ff22964c49ab0aa41f592280ae25d380c83", + "0x8e2a629fee2ba03e333bcf7fa0261dadff518dfb0e386b21cac0cdb2c7c514cb", + "0x4b00742b5349bc9892f2d36abe2c723a30c4a20ea5b899a7fee8fd759f066fbf", + "0x5b8d880357c44a79c0d04b5d347dc7c012f2f5cd7679c4d4131e5c481b45f1af", + "0x65d2859128eac961e29c063fd918c7a2b485bf72743cabb0fae8bb288f155dfc", + "0x3db9720d20d90d7d1ea448488d02015f4b1c36f556d704749723ae1c3a35aab5", + "0xd9676bad19db9f6896b2170e6cba496f5714ff9a70252fa1d4c82029435871a7", + "0xa36e49e6be40418bef884caac3b30e63fdaa1b8f622c70ede69e6d7c9c6f4539", + "0xefb40f7d197a63927f761d99596439b7b69cb7a39214258b372450fd471ebd88", + "0x7420e77f7230c7458f728f7ae5f63f0bb9182fd11ccb9a82bfcad17a8d1b4f76", + "0x7ce9551cd4cc5009d28a6048701049a5decbcf7e11904c588107da90f57149ed", + "0xafdbfc0bd5252cec1654dd24c375bf9f4af647cadad403923d6aa525fa44aa85", + "0xef0a4ef158ab6b06863969c24dc7ce5fabbd36181e9eb6d1662ce227b38f8e61", + "0x4e6d1c00feeb4218a0590fe046705fa35929767430f2c33b2176afb45f26a71a", + "0x604a1bef767235afcb7f84a20ef59d39618593def34034c67cdabec8f9436ea1", + "0x5c91553855f3a32f708dfd76c83a7d7f23aa80e5a6d2a7e9d83e82a333c9e267", + "0x48e35d198e8194ef83496392e05e3e14cc9c7ea1f324fb259c08a0f8385b422b", + "0x9df1a27224c2a20b229cc8686d95efb1570e822402c9df4db0b47f190c33dbee", + "0x020eb0cf345413cf0324f7561031eef27f188de5dc41bf38471547aec4e716ed", + "0xe9f7708c2cc8ee4785ed54a0c153730103fd92c42bb71eb4f86a93111ae11018", + "0xe7b3a27e3f5ff6fcf2925db134ee5db522a008db4d54627b729d5502f3968d08", + "0xc9c4b33c131365224675a89e4e6833181ae50661b114da50b14b0669d6ab7155", + "0x8986fba93ce8e336542d3a640d156029ea1cd99c2cc4e946de6d46e040e52bed", + "0x53b6ba779e5b91b5abe44eacd354f6f9b5b2343e66d60bcf5083ddd1a5147d21", + "0x854e090d7d5cacd3e52fed513055b51ae884965bf1146a629825269506f97371", + "0xcaae36c05b0992f80bfcc8f1c5d3a771feb88aa67f2c87b770637fa24000d84e", + "0x6992bffeb071ba81b30b8a6b19e9335f8eaa2da4361844bfd57f08488dab5975", + "0xdb63608d8eefa64871fa9fba1da1776a67d0c0495502c8eb4005eea4a0089563", + "0x57071fc1829365707d66abfb8e388478cf61a14f34af2c864b7299f6bfc2322c", + "0xe077cb6b750e158f666ea79aebd5e19e25b9d3694ac7a44efee1fe58f2bff202", + "0xc8180f9a9292284d2ba09dc40f89595ae6b554e6eb0c96aff578725076881102", + "0x89eb01b1cfe4089ded962a36ddfce84eb0c4337780446cdd88738e7241257c30", + "0xd1bfe1dbb1c9b6a06a1c18472ed66a82ca5c7ea1fdb5dcb9af1347e6ed97697b", + "0x33695a8c53e9e16e1a2255055eb069d9fc59436ce0ed698aa7323cd7e078cd96", + "0xa1c746d3df0eb28100b84c6c91da402c5c0d6a8aaee66bc05095820764cbdefb", + "0x3dd355f33c841eab61323ebfbe4a608b3dc9779a291651b885383ff70b8418dc", + "0x206c8095f502a995777d4756949d8fa7deeac36a106721d6bd1c536994fc8adb", + "0x95a9ffc34a966a157c5e797e3a1d0029bbb86999f1716cbdcca9bdcc5e77a5d5", + "0xb2c4e8a21c25d7cdaeed3a42b8670602580bc99ae5e85d4e36771e5cc2b7e0ff", + "0xc34e130d5fa9ae3df02c54a5eecf210d8420db5342af4041d77b8ade44d2c67d", + "0x5d733448fdde29b3f3749e70addbf4fcde659aeea24f90dab23997a696db5daf", + "0x8d63fe21beb60523466595253d20fe518dda259cb44fab5945943550b4e960ad", + "0x98e584f6dc76ddf7ab116d2e9244d0a0ecd99d180b1916957054f8440623f727", + "0xeb66965a23c4413fc5adbf4925ec5d133d2579c1f7764d6199eb4f7a5548aacc", + "0xc95df33729fa401a40bb0ca23731b61d5225f3ac6d159f243e1585440e16d529", + "0x2052d0e9ec0a62dcc0d0c892e7e704ed0ce03ef8a8e9c898a3691a571abc5c30", + "0x1f8567628ffc96390df8b7b32ce8ca70f6d8bf57b2ea0bd9e724c521ecd4747e", + "0xf2b48a4fef4c6c6127f7194ac76c57167cbbd65b9cff702daae1ae21dbc2896b", + "0x38dcef1bcf7600494424ae0b24956deaf664b92f3dd60b7a941ea144d789dd99", + "0x267d1afa22f77c5fb78434d822ee1c3fd24740d6a30f3ee4fdac95949ba8c044", + "0x0c01005442f62fd12a49115bfee0faf89d2da7572dca5b0e8eee445a0de8ddf7", + "0xa8d05f61408ed491620865b2cef9548d88182f37784e190b46c36bb09dd2d7e3", + "0x655eba047145af7d76cedf34e144040619d2d416367b57c7b7d9362a9375889a", + "0x5233ac6cb0ff6a892fa475b0074f4b6abd8e244f2a665e6649232e528bfa17f7", + "0xea8b2976e790ed22d708bca311a5b26c113e8c0ea4cae30607d94eb232ccb0f9", + "0x159dafbf20b2e624d22018f214cbbfbbd83de406e9bbaaf53ba46041fc3968c9", + "0x4d34b229e010a2ef72dec76c1449cce6f61d9cb17701803560af6b2072850ef9", + "0x32e7064197d2f739695788a00113452e03306a4f73f80ca62fc5e3ec223aa176", + "0xd1604bdf1cf9253b7b0ae8c92d09a2edec43221394c258d29707ba850004615d", + "0x07e0048d3913db33c6a9b45a1b232a2088341441d398b09319b455f57c18628f", + "0xf6492cd50378901ae238c91685319405d9779a1b78f22bf36129fd31fe709cbb", + "0xecaad91132667d0b1a283da22cdac651a4036224bd0efc79bb747d0c5e64b1d7", + "0x20565b022a8a8429a79a56aadbe2e32db24748238fab33eb2b0be5d83d1343bc", + "0x25e6d936a7b526d45ce1430744f5f4b41cf694d2cc50753cc88330e3e2a0bff2", + "0x7130e4b84c6efae0653dad6e16ec677bee7060a8da8ac607bde7a2b01b7511f0", + "0x93a8bf0a86793725e09b480d9098a43fc30a8420c5c2c2bd01ba8afa837c2371", + "0x2690922d4bf86c9a35e982b10f723edae97bb2a842f362036337396c7d9f9d16", + "0xd26efd262c6605d3be1ccdb03b96318613cf2d5b80350eea826758b9fd8bc28c", + "0xd3b2c89961d6cce736a9994f8707f78068a9806044cc2c96004d659f82753690", + "0x0fecacd3eb8c415a8db644b4dfc0ebf04a27f9b5e53bdac80fb927f40da4a8e5", + "0xd5600a3afd0eaedc221893214d629260cea97d7d5335e361d43183b4dc678360", + "0x340558e8951e1af701e95a963221109154f12c5870e9c9b9c4d7f9975d18ff89", + "0xb2ec154d6a59610822ee2318e3f279e249067893f806b129f4f0497b42aecff8", + "0xcf13e6343d50af1b2ff792e5a694531077e67858d76b39262ad19d6194e62df1", + "0x39db02f0b3f062645478457da8145fec8fbbc8a0981be9183365fbdc11a622a9", + "0xade17860c7f456c0b8014490f3cd15cb5f080e7112b789028f1e86ef428c06ca", + "0x1ab544445bb5d499c541c4fa02c5f850b9d18988e94ac6992525e2ad372d4936", + "0x2c3b4b33a865fce54d1ba1909924b0c6cf9a14a8cc4e3a42e1b4eeaaf86fc50d", + "0x857bb3e657f86c864407a7caf0c6b71e42427302adb85c853f330d00433ba077", + "0x79e42bfeb2cd1191783b7b2bea5e0e2693d9d15ce8d230e03dfbeac2c90451f2", + "0x5ec96430d6d1c1e9395a214e1a685e92c3780a78ca94a173d0e38fa6bca96461", + "0x544858c87e845b1f80043fb44f54a2449d31a0018025f1b41309a745415b1e7b", + "0xa26f04bcd6a580b99e9b81ed739ece117ad357facf1ecea246f891ce740029d8", + "0x857eb2767e67873c3f1ee4659c778feebb69b248950068a828d65750002cec36", + "0x7d6ad830b628a38b1753a33e5df98269d351b42d5bd60329e4c205ee5f30584e", + "0x6cbbf7d83f87bba0d4b4997bf336ac52934866cdd77e7dead51de84bfb717fa2", + "0xea77b839435e70cac6a89e891b8d1c495b39d8d6db38c352e10931e70502ec20", + "0x4d6a29a4487600b0e05ebfca7418dd6b43746ce96a41d4f17e25cd6aa1a2b733", + "0x3e8223ea6ca4ff147b59b025237a2a477495e746e7a551045374b27798ece58a", + "0xbf880aea05a3e440f31777f109995f2a1967272eebd9ff0fac241bee8747a8da", + "0x028cbf04056dc0f407496cfa901a4491c659173083ad73f84d457f016e0431f6", + "0x68548e63888fe0f203a333f5a5c950b36aa35e083a0161304a2b80aa626358b9", + "0x385546df2f083f4781a8b9d5b645516f5a77883eb7dc8d5e399f4f563e8956f6", + "0x358a0c7c14057fef517c38de9e2af33ab44f68c5c99157f9429db596e822c842", + "0x5f89b867c11d5258618595e2afd3f783e8db81dad073d8871a33d179f537cfb8", + "0xfd7328d25120390f5982919333df927ba3c63331321678906256c1ac02af9a45", + "0x406a9797947503dc57776a5c2ed6cad71ed975c05e15ef191b310088049c11d4", + "0x6e719945fb48d4db24d57a92e4d6da5cebc1a3db4a64792dad68b06f92c69c87", + "0xe2e7b80879a7ffc1e4e3f901ac99d252c1625b6824000ffd468b2d09d2cffa25", + "0x179979b54792b23d1f1940550d7c961a1373f6dda048817d087ed6d731af73eb", + "0x10b1ca5637aee0b063bf3a2fe5cc1729929b9932cecad392d7da6d567ca82d65", + "0x89edc6ecf4b7f292dc26c29515ffc3367850e5a8dcd95979244f5c57f81003d7", + "0x2cbdbde44b43c5dc078433925dd423ea51886e880b04e90b156957dd6a057d1f", + "0x6953ef4d3aa2abeac14fa44a0be4979bde0e579cc591370b08774f4e65f95d05", + "0x0735cc7c85194d5abf6ca0dec712db94b6b009c9ed74ff6781b7940064cd4626", + "0xc3f9b62bea678c0683ed688b77767b3fe3e4fc86456bbaa8c0172240321242a5", + "0x3640c7a7a1c2b62492098e0b5b9f4c482add16a86c0f88f8a60eafbf28347ccc", + "0x73820554bf239c8e1b92304f3df8290d18aaf765b45c8820f618d05eeb80fd66", + "0x8b948d61bbdf95e634d5c3827c66266e3ee42b49dc0a29100efe0f7028d100d8", + "0x8c422f252ce4e7c981b93c24db0984962019394f50ef5b62cd34e32ba7602026", + "0xd250921e7c17e016360e0b79d61d6c19ca40ca2d84c9a7c8d9da04ae4676c29f", + "0x4e71a2075113014494b5cf8504d48cefcacf14ca6be5d99f945ddafed4b58079", + "0x40d0dd35a9c91dbb1de1df4202a50df1745b2a5e80b256c3542bc0cdd5a2c524", + "0xf77e21f9edcadcf7753c1daa00720e024f56250766ac6c31a89e8afde10c9056", + "0xc70a38751d11c4240f2e94698c0a13a62d0b3cd825527c1dcc5e653186034f07", + "0x0f4f7881dcee934f71ab555428e89e26112ef6e99935761f3d4f314bb5504a20", + "0x82febe35f996dc229d6f6e89ab4c15f5659860505d64d454f625c95284a307b1", + "0xc557d10c1d19c90ccb9a504d31b0d91bedfe9a82388824fe901e8325a9996dd6", + "0xa241dbe076d02feb2b67d606b8592c970d193b84309196191b19087dd74b5eb1", + "0x4f687e1fdd09e68deac949de2738583e0dc2bf245790b5185e2f4e00f5e8da67", + "0x076b44af8dbdd16f859d9604f91e8809f929024eeaa6eb457c30db2657c03430", + "0x1bf2736aed60997b49084afc7a3d2b429d8b8836183c9ba71fd61afbcd1b5f0f", + "0x18ef59174edf670a07ed5eeae04eaaa08345d384d33cba45abf2a08af2415a5b", + "0x30f123870658c6cb69ad9314e6260a5ece2d5eeb4964601d4243aa1b56f4e021", + "0x36ac3e3193b6fa52a7134b9e4c7db6ce746619bd7f4d07201362062a3f98be0d", + "0x6a9250440bff309071b1493b2db2b4134c725ae364fc8a8add7e108f7434de4e", + "0x557876702f5bc2bbe17f13c76d0cdecfa68b0fe281f084b2f343d130405bb80e", + "0x5bb14f5bb4abe8e79909035a11109385ea2fa77c4208946841b61f1dc8a5366d", + "0xe7602f83ef13f3755b1f99c740fc46211f7ade9088a1942b8ecbd5a33482c093", + "0x30b8ee6c04d787ab137e7bd6cad1073e4e77a74db657798cc74c79676de337f3", + "0x01067e41f6b5fe5a26009378b7ea4b0515aac9449eef2730de5efc22554ed10d", + "0x73dc8e186c096c752f8dc2a69805e1b24eb5edc7553be26d36698b25829ebfb6", + "0x23eb0c950ea1467134caced1d86eb89d4addda6f8ebdbcb85d9127a5ce0427eb", + "0xbd0f1080cc7c2adc0874fc6d89207221155bf414e1cfa3f9360fdc98c820627c", + "0x0bdad5419ef94ee6aa76e4971981e54f7d6560f3faa3531f5fede35cb2e211bd", + "0x8a339a58e2ffda5cc2ef1e18a078fa09c3aec4b2a8cf9b6094ff620fb88860dd", + "0xc9a633a65b909af3133befda06a57b3058d625d816ac978f01894fdd7b3295e0", + "0x6dea631bfde98ab2b7db165e29ea75316ea50137d15a30a9a3b444d50d419e10", + "0x0a74031d338957b9564500f28f0e45aa571f48e4c85cdc52d6ac8d472fb66661", + "0x5f9e646f342e665b2fe387bdcabbb381a71e54f766afe9a5ca6c2cf999b50e4c", + "0xa8691691561a9e3236c0a26593f1c49b42f03c94ac3124b16b4aaf07fffb14f5", + "0xe806b7ac21b2e7d80f0e4583dec620b2b3399f4c1adc82a246bc77c847024310", + "0xd588437c72ddaff5ad3a154915700ade8da4023421008956b1b3d1bf164705e4", + "0x2f12257a5c3c0097b274697e648df08c31a3f8cf0833e45e45fe76091c7e22da", + "0x88eb766b8fc471e455e50a183b728e6e7fd3b5a152440bad5d1c7f49e173dafb", + "0xeee35cb04632e48f5b4c94aae1a40c372eacf5ca773c9dfc2fb3378803a6fd2c", + "0xcf9d9bbdb883ac7d171f808738dc5ad4e632d91f45737be4de2f9a2605141f81", + "0x94ace01f0f2f127e2cb47dc05a491df26fff49f68cd4f382c12e7f332032bc09", + "0x8f261b4ff772d1c675fe16f0764ae644d198231daf66a600d56526c1288144bb", + "0x95062df2fc6e23916b7ec403eb5dfdfd8f0aff49ca15e0b743e5a3294552d619", + "0x9626d392247cabfdf89c0254dee12f5d82118b5449059b78b4fdf7ed62ffd688", + "0xc7b341b1a1464207bc1996364debec53e55a3212a2e18211a994d2c8e864e234", + "0xa5d247c7e7511015cf63aee2909dc9ea7bf56b9c2e15f1603b229dc7ed11a6b3", + "0x551f57a199b684836b3b5d6e6cea2c7cd58f830e870d1689936ceb93c652ad8b", + "0x0f0a17a40f9cafa38559a7b8a1b3848514f4b5dad4c4565f8915d04163f1b51a", + "0xd4ffba1b3fbb46554137cb0114feb898c9a1a689c0fcb4dbdea49a313c593aef", + "0xe72848f46d7f041226ed0cb38549fad946e14ca379fbba4cd52a3bc3d6b94c55", + "0xe34036fa757a07055a5ba89f39f90066237152468c6c3fd8e60484000dee38d7", + "0x0984ba7640b44fefc22e2b53463b91b6686b909d038a29039a6e5f84e25e1257", + "0x2fd4072edee29b9b611c38972835d3cc985befaeea149311fad80dd0a8bab088", + "0xc64954228a4067748447b768bdb34d5a434cfdfe01acf86a11d8a278ee7d7433", + "0x7b10e8fb7d81fe90362c7d3af0c153460ed3df92c1c50b6f9a993fc81e0f29a0", + "0x0c33f7aefb88bb9f6cb9061adcb5fc535b2a3841a6ad94b8a4adce1954bc6f25", + "0x21460cc4c2bd2d828027b9c04b047c06b1eaa83f47640639463cbcf603e4b7d9", + "0x9ea560bd5c0c6a0fa9cf2e0e14ddde39cca6c24b11e02b635bfd4ba7ec826e0f", + "0x47c9dc525e0e1f71e159ac75943a32d541596c9b479639e0e8f00a171a29057e", + "0x6f32319d8d958c89295e38c41c2a6106d9f6bd86ea19ee6cd3df34931a2701a6", + "0xf90b80919f035eaa3cd56d1c54f9c69e60ab2445a4995c7969a4826a28220398", + "0xb9ba6d207d1d7866e6205d540abc36bc3198b072aa5d52378a1148f6a61210c5", + "0x2f494b0db620ec08b2961a12d79585de2f6939bbe679a8ae1a580535437bb0e0", + "0x65ecc619942b4fc71b4477dc5929244161cffe2933c84ef8e2d5eb443394e0dd", + "0x12f573e148bbef501d4325a52b737580d413c8f999cc86cd0e497d9201a006e9", + "0x709c2a2f2276d712070a10d20baeb7d1acc602e6cd0d27438950707175f68faf", + "0x472db00ea142b38a076569205123d2ae53f42c1ff86d38100742039440fef89f", + "0x536a68e966effeda6883266a1f6f00b42dbd874d83956a3312ac30e430607bbf", + "0xfda5031fc6bef618ec55de146ed9834dac41afcb0d0521b34e141cbc0617d14f", + "0xae912c6ae86e69a59c61a3fb95c9a60b37c17c3ce2b6e9ae4930dea5fb5454a9", + "0x426c6889a4d6f3896c5209b662d9caa421adfa1f1770f33262807a3c89983364", + "0x6e72f8cb2b6cd35fb0c090f8be71b1ba790cf2163d0cc18dc0bf62fcb0658fdc", + "0x7259d06d38028ec544eeab2e264f2d4ff975f245c3697ea8e141ebd59733a2db", + "0x37729ab26688e0399334fa3cd2748818425b3fc41304fca56881658dee0b90c6", + "0xcbb02add11c0edd8105b440cd44a041b6f55a94712ed12ffeffd1817ae8a8044", + "0x156e069b3b63fb302693018293bcc0ab60b2ee2cc8aab43e1cca3774e0b743b4", + "0xb3a7a06a4f2c1034ef5a2fa5fde7554f239b0193093c74db11ebb5d9b1a18f03", + "0x323b6d191477aac18e4761baf8ff9ce70b1274a995aad02fd582f87285f8a0fe", + "0x7e4d202c5dc858e3a3c45a5f43b0804a4ff5ed53bce625ced7eb65db74e908fb", + "0x75446e5cc0142cf4b0f26f560995f257f87023312697b3574fe0e1f558bcda05", + "0xf53cfce4dcf415ea49360d84188b33a1b6e3c686c6e59f1a7385f68f3e160a7e", + "0x43ee5e27e64e778f31d641050b5c975fdd9788f2d5821bc8e3c188a91a86ba9d", + "0x6a3a73772d1ed7ebeb82eff2419e05583049939493e4ff396fbbce7e2012ef05", + "0xf976ee31f6b27e1e0f359e1f96b5900f34c49c89e81bc753456599d2e5f4a097", + "0x00ec8886d567bd489582441964bda82f3e297801ab0c5d3e58a3df29f9004a4d", + "0x9bd7ecb0d91d576640cdd3022ff0bfa64838f057e55cf35ca945d47f98d8d107", + "0x1868b1c9dcce55407f81879269ef1296c5eeff32ef4f7770bcddca4bf972df14", + "0x24856220dafd06f20fd0914d4468713654f6d9a8a8472a3cba537c6db45c1981", + "0xa05130241c7260630ce231a427081969d4428d33dcaeec08287e7aa80541384f", + "0x4812c23621b2399a68e81d9dd6fe59b0f0953b279104a69047d0df3678c8b628", + "0x4c00bb65a14a1b995a38afe285ff4594c51c8b10c137e73376da3f2660f00044", + "0x3cb2cc9dc9b1c997b8e73ee151de0cc23f5bc0d7dd27d0402b6d79e1b50ef441", + "0x25c0bda0d092dff16a5cb70ac082a0e3c17a42d74191c9c90d46deaf34c85ad5", + "0x8a75c8a0ff4aa70a0f1389f5ddeb0a1b7aca04b94af03e7c2f3986a6a9e8f8b4", + "0x9d9c63e3b449623e45de0542b1ee4d102204137a2ac36a25442f3797668058df", + "0x932b4ab5c339c9654cc1c5e343aef426dbfee3a98b7835efdba1bb583238aaec", + "0x8001e5592beaa70277723223f033b9f830a23d4dbc64fc42efbb80bfbd7e2a22", + "0x1b84fbbecdf3add7f514e0cda2b1c88b21a65d82da4264d06b332ab216179230", + "0x79cb6fe9cd675e096bc92d449093e78e59c6c4c813b550c25a76c2cdf125e582", + "0x4fad1261fa7d06941dc436c1d38188e3660b300dff7f2001a7efa7b8678bdaea", + "0xbf81d3c1b1e781a706c6acdaa23c12f5e900fc3f191d6edcd1636beb3d29a6b7", + "0x36cc017579e8daaefb5592bb0c5b2d2fb7df5afba9fbf02d0c750287c2353b78", + "0x0cf0b82b4a102f35a06f590481b72f93d570e929bc43fc188e829e01fdf0bf9c", + "0xc0b67d7c6100b042bd39d0b4747e854a0672fa2769dff0dfaea01e05621a368b", + "0xb8c49cfa2147f651bbd73f97f02b694a5cc3cf9fd79d47bf34857804206296f9", + "0xd3836371f2d0071e45176aa82ecb05b5185e06e79043f69fff184121380e1093", + "0xaf9e77ff0a9c1bdb16afd7c1d725263ad04394e4b73f013829e63da9600bb35b", + "0x43082e5b9b11362b6b5cef0c5614848ff4c8cc9dbbc7e2b179330b46e7b3652e", + "0x6cb6fd2e7bd5550dbe63b9875814764e64036a921be1e5413ab1355d771cffd1", + "0x1631a928685b0fe688899b105aefa54fe61e564a4c9d8dec99a34f5140e6655f", + "0x095addeb9c0d14bc7e18f547259a68ea3dc982e5256f4a97e3f627c3b2140be2", + "0x520f53d82a67e09c157f3480b4f504dde53d947b9e2238f814f5832f84b8eedf", + "0x433777fbf6cded05adad6e5877ce0ea3e34342af6f65042c6141b4f4201103ba", + "0x077878ad6fd501074b5c713905aa3caeda3237a1b58087e6275328d9482b0577", + "0x6037000d2014c601b14bab5bbf758098b300e68fd3d6f2a0d5e6ced1657cd6d0", + "0x481b8e11fe6ca5cdc881bb6c3d7a0d96e8cd2aca705f950ac542c089d7ca0cc8", + "0x2b070c54b2af6cea0e0ee76d37a92ab3f4e9e04f3b581f41ef2bd5d2631b8b87", + "0x01ead0aee81e4611b5ff7cd64037ec0039a05bf0d02b18b92da6acbf45d4e6b1", + "0xfdcd33327deab31927db501945c15a82f278f34a09112b2d7f74219e9a364555", + "0x0fbf377a65289b1decfc2fef4614b1e5b3404e0a0c9c7d0d147cd86bed55f23d", + "0x8cef4b3d09f838d4acb5e21f777fbd906358a2759d24b055756e9d154b177ab5", + "0xcced9e5d45e86423eddcdcae5fb2080622279ff6f08a0ee47012b33af58f820f", + "0xb1e6b5dceef79d8ebd0b84a8990f724fd645be2434a0a8339e78fe61c2ad3186", + "0x24a11c3547f5fd5e5eabda12369f90b8f5c8ddb82568631b6e704c2ab5c94ec4", + "0xd6cc197005e41f553308ebed885a4df650a2022d0d40d25f37bfc74a94e5b04f", + "0xcac28ad9ef5e3f9b0d2184fb3427dad0838122a44538bb1e0ad15baf08ed7312", + "0x8070860a9337d8e6e016e0ba5953968bf410100bcfe5e567d7562e74b95b5d0d", + "0x8ab5cf8538537e591e95fb1dcb9522067ab5ac783bfd622e6c9bb131d3288ea0", + "0x345a12de03af922ae9e6651cdd4c4249f75bc2aef1f1651692dee6d27a490813", + "0xe9cbfb97fea7afed66cb3551d9b5f6ba697a4476a5dcb3ecf25bf9a41e54bd85", + "0x4028a3855c3b656c1de109e250412d9596cb6fc4aed22b8bfca6d2a60b1454c3", + "0x85591c0037f549f6d807c91b929fb0290c1b53f23e9305bbf4feed86d5483cf7", + "0xe3178cd8d8b7d9c71d9614744a937add2ae6c21f6eddf508fdec243c6408b647", + "0xcf40b5e2f93922022aaba8558b17b193c50f6440359826dc78b58e9b9e34074f", + "0xaa30846598de0f132d8c18084859e6c67189f9489a2b8019936a151e7d0812d5", + "0xb908ee8113c1e60abe60fcd0d7fedfef07ff0efa562673d0ab86f6399812a8cb", + "0x8f9d9102f709fc1b4308b677e515173a1db857b4989b1de2961b801aa8b39db2", + "0xd74e36d71447b437a4a4405dda388a9779347fe41152b7c5515e02edb567b5ae", + "0x5aca44d35187500d73b544e71ea8a12100cf011c219fd8b83e44b4792204edd8", + "0x7196cd91ee48f598c11527924c83431dec39ed7cd67a225b64a9d04ad23211b0", + "0x52584327a0b33be95ebc7040c0dd9b60d2bd0d42d1247b8d2ee06b0d6aae9f58", + "0xe2517f4a4218e9741b501cd6fdbc7e2080cc8827bea231d829d1717d24ce4e3c", + "0xc94771be6c7b5e858823a03e620670cc604cdba8092da13e429c76c2077eb2af", + "0x3f7f556817b418fccb808f7ede824ff17b119e7fb02ec1a4239a71835af5ac5b", + "0xd611cd2fcdea70eafce698fe405f361ca95b67d5631a9930d858f4a7cca46358", + "0x5f2aa6ad1fed0ce4db64bff6de7bfa68e060d357ddf20414fe5f10b4211bcf7c", + "0xe8b5d5fae7903602ab3699ff27f159367e2fbd8fbdb4f45e7b1628b563081940", + "0x31cef735663de763db98bbb0846d5a1127adf45ce41837aa77dd5e4008718711", + "0x58f0b43df5b6c2527dc3e22f2f76cdf7817e23d7c3b9a9732fb91e6da9a537bc", + "0xd13734d21521985e4c6c14bcdc34139efccf1f0a9ab92a72e0b9e639321dce70", + "0x99b982d744b14279defa1771bb358ab55f4f3730a8feed9e14023b39c44f2777", + "0x827078f5ddff2088e6d16039c439492140337ea661cb361fe87e0bb7fc785bc2", + "0xb1f7f5fcb807c343ebc587314a28ac008f849c24753383c3e40c9a12826c9f5c", + "0xd60f786c664eadca5ba1af303f8d8e88d781ec3611b9f781cffd5b17610c19b0", + "0xc514f1487e061262e2be76dd593300b8402df6812700c41a2611ff5aeeddfe45", + "0xac6350441c04277a76c019215cbec0fdab8f6e46087704ef0b75cad0356dfc32", + "0x724a5ff7c13fe6d21249b47f47082797b2470159b298ea281f9616d6b5c5269e", + "0x70dba710ff65ecb7c9fef28b366f5b175e12a63bd1f7530ec18da36027033497", + "0x014f4aad56ae3ececae45610e6d28475e588fd39897127d20675c1ce18479939", + "0xdeffd38ba5e4e685603ea1da27571d48830018be17755ef7c08db7f6dae63647", + "0x1e6e324967609029e28e768443d11cd5d99ca713a88c9ff47144d0b16b9cefc1", + "0xb2a2a5d5583ba070ab2b8adc6f5eca48b621b5244433a5e491784ccdac2e64c8", + "0xdbb937edd70b36b566e397fa369a5a3a0b45e606ed012277c64234eff00f2157", + "0xf043662cdf2a84618401c619fd8aea26a54519add9f72e43a520fc8129c02000", + "0x9b84dae2d1a0d7e23073c558e13e16ddf3a28daab3569c89271e0f780f134be2", + "0x93c7258e9e78238eec47497c842a643b339ef9ce4f236ac2c0541872a427a1be", + "0x8a8fea29216df1683fedc14a7a066226f9299d1be50021d3d2aa4c0585b29f47", + "0x85bde8bc039cd1820bc1b1262545bbefc07b03de47090008becd1417ad3b997c", + "0xa7758356e4555d213a19f5c343de9cbb986509aade6d8237baf1fc6e07084b9c", + "0x546bb118d2a1176ffc967f90bc342edbab4350f28294ad6aa29eec2b0c9159ef", + "0xcb50bf5a5a25b95962b6caf51b5e23fe60f6449f69b4df5d6b6d7fda2463d5bc", + "0x1730541314d8595b13f01281189321299fc3d2e9d0b9aa354099d6d83538570a", + "0x5b57218719bb9816f4341ee1938263fe92cb95e798193cc2b24fdc3836abac02", + "0xe0860d86c780d3bd7375ef6a0d75eaced9fbd90283f8ca8335205ac3d3a3dbfc", + "0xcd65eab452ceadb388b945eab3342dee7542c76bc912dd738e86bfeea1588f96", + "0xc15efc0c25c4c019937ad27026225024ee6992780b9ba02d3c70101a73b354a1", + "0x30e8665a5ac3f3eb1b9c2e67d61dc2dce761e4123ed801c1a6f207aa3828804f", + "0x6c3b5d4f836b7d349a089280c1f4488de60461c7c1a7a5fb3ddcc69c1366195a", + "0xdca4d348f2b9806cef16e320e0b21a539769746679c1a45a6145f2298db496df", + "0xe8fcbceae567fde12d871fe54233ece0d74ba8508fbfbafac0f154806a9462aa", + "0xd79328e9ca262b6a91652efb67dac1fa5e8c3282dbcda58d4b93b8874d226966", + "0xe0fd3af4b67510c68e8968a5e25e741e1ef71c9347e18b8de6139f918a62f6c4", + "0x70731ec895bdb4914a76b97ddda78a8805a39a56987aefe32556b93e2c085d97", + "0xb387f307e22829ce20c5d7906037a5bc202950197bdd75ba59999c2a09778864", + "0xde1ec63948e3c4aaa005630545cf73bf9d20722a1c35b8176cf44d80f4cb7f0f", + "0xf9156bb506ad9a12b3b2357450c443572a3e3399e97f68cc0166ea22155c9277", + "0x3d5c1ac62e043661edf67446ac9f96b1c887d07ebcffc2faeb317b5c3ab596e8", + "0x70e9f96a6d21fa71ec310b99db848e5dde82ac9410ce8c6d24af115421527223", + "0x366fa3d63bfdfd2fc10ce44522f36ca6b8f815629bd36a26c0a5fcd6f95fc5f1", + "0x34b6b13187d684972edbc097949de7ed4f7ad2658f9889e1798e955845f0de36", + "0x1ebf9da97a23393f6dc5cda5c54718f273eda8ac6d1977981a0e1570863d9833", + "0xcf8888cc905df1ee1127f59c8ea7f9243c4688daba7890908949b027f4af92e1", + "0xea4ba26d5fdff1daaa42625fd88aabf7f91cd400829268b9beee5fc09875c630", + "0x639faea36eb1a652b024df696454c856be53c3667e88c7af5299c050c1092bf2", + "0x1e67283656def3ee933332600071fde44127ea3caa9c42f992ed16e33d1122c3", + "0xa4f53ce6159cae14ebc60a69e9c446a2abdb4f4f5cded75b1c5814a84c487528", + "0xf2840725ecbeb6e7396551fe034d21e75a5d34b4cbf8b3b18dc5ffa06a3e2d85", + "0xed7396b51a1b0d93b2288a4bf60ad49d236bc14b0cfeb40dbbdb6e9682d3fcff", + "0x9de490ca8067c84f922547ab496e57b3e1fc4685b744de22f1cac7dff687b930", + "0x3c3f7c57fa9ef833accca168540766407bbdd2c418f13adac42838f205199462", + "0x14257d1a35fa99b3cdab74c8445bed9bbfd25d1604e1b9123fb5c5bf88cb3a29", + "0xac74953d33cdefa9037a415336672144c53310ff50f75d865272ead5e0460799", + "0xa94b857f4dab303c1d4a5213c7bb8b91a441ee8279e69fa92057718f3aa40a4a", + "0xe7c67bb2e440f1062f95e28f0924d0b29bd789103521cc13d13a95673cc49179", + "0xe90ea613252541d3c5237a27d4d23780b579cfda48c057b7304ac14751166031", + "0xd85a4fd06114870b3fe19cba9924405de1e14e026372e84b24b4ab39e7879545", + "0x7d65651c6e789a3b6113f589f696ac6595f279bddba74a17e955ae6ff93a1846", + "0x5e44df731c9b0905ccc33ed49669b78834d065fe3fedcbd0fbb7df95f706c51c", + "0xc90d3dc4bff702b9f17930d27b039bfcb1b7879076bd82a5650177252a526dd0", + "0xb5d0f4ea7136a5f10e47f6a802b46ba0c7dbcd4ee10b4be65ccd55fd4c940bdf", + "0x4f7647e2529b477aded041ed2f4c8e01d5219839950aca43723993c2432105de", + "0xddf89de514a09c21918af718834060348ad0bfd3b86e0953c247834634eb841b", + "0x325b15b05b3c863822647b25ddb970cf9cb52ecd32cf58e6c5e8cecb1beb9c89", + "0x3cae2ef569b1e74770ed80bc31da2addeeadd59d8605eac8edf3dad0fa9b0c37", + "0xd7409a715ae5f091fad14187121bad8263caa2f60ea0d0bd7c524065defb564b", + "0x5cefbb199b507e3b64008e5d639cac8f623e9ace1292fca190bed4b7aa214899", + "0x2c2919f07eecf553b473f98d06171449838bb03c0a468d8a7cfd8062a574df1a", + "0x5c122d8416b78e0e7328881efaa7fcf61be6851a5b7572ec5c341693fcb9c734", + "0xbb81898e64769f0a6f1c20a2472a5128e969f737d1cba5be885372453ec18d1d", + "0xbe203e6f7c0c86ba994fde55d0daae0f066814938debc3b5a44884dda70e3ac3", + "0x73c7842f2480e3d742aed1a1b7682ca1f322d4d2555cb7fa402313024c2a13f9", + "0x5b95cde26a2c2be298a03252ce36514dfd3c9e84f5c5ffb75a050bb5752b6247", + "0x9c7cfa9294869c1c42db3cab3bfb737696b8f81500742bfeeaf29145e2b5c79c", + "0x6cffe595d85a32ad1656c81c87d476e6e7f602609fac052a0a3e3a951d11eafc", + "0xe2ab30bf8127106a4507034cf6b3589ea3dd19bb10c765434fd3f3f7d75c1a4f", + "0x01d7bfcc2d4c6fccf5e0599f9985af838cdc0281c9c8cdd7006b3b0abc775cbe", + "0x004114dfe63995fd66e6932c62cd7b3f40108e5e2f6916d19dc436cf016392d5", + "0x068c036ea74e85ae8d8897589a8dc775c8516e38bd619ed584ffd51021393fbf", + "0x682f4444c85c46d28f5858a91874e0c903e97def4e2a4302ca90ab69b54b4f49", + "0x3fda79ec159c2878e9ce65c575157daaa9561f17a14a0003d95c0c4264985707", + "0xb41874256b5cd3ef80af1536a45a8016cbade06b4a06b1dc0942c27124d934b2", + "0x0eac150f30020a7651a006324da1ae240d4fe623f077c061a954122b0e17b0a9", + "0x0b174907572651a2453a14e0326e7ba836781dbd939c2d75db84d9b481391824", + "0x082beb1974f7201be32469b9df42d9c30a520f4dfa696fcd991ef20367cb6eb3", + "0xf3c3ebe6040e1ce5c5ad1f6e08965ef387adb6633581ce3fdd1858f1da4547c9", + "0x6ba341211e75ea7346853a3f63ad5502f83aeefeac98a479aae546a70141af99", + "0x3962cc5bb73ab7f48d98bf65f3f7f41a8f3c52b4d7d2f12a0a89cd876f875bcf", + "0x5b49809641f72f5c96bba6b27e0331ce7fc7dd3ef18a4463c93d1f685b7a29b9", + "0xd2b2e8eec102c4b68d94d8bacf71755386bc3008d15d6090772a4739eb763300", + "0x704bf1701cee4f631f4de0e330873b1621490faad46203fab288cbd0892da567", + "0x2f7d29943c2b3ed9f59a66ad175d298f1e4761218e3fc52b9a67b4ca7107e93e", + "0x2b370002b007d4df272104b77c1224c24eae67de3e12aa599968b190e8d58c19", + "0x1f25435148cd815f4549de1f21ec227d42f360d207aa2f7de5466c4d28afdd0f", + "0x86d745be32470f409b5d77f92f2412aee084fc523a7ff7e57b53f39b11cba2b6", + "0x86d57512687518e3db56834f819bed57ca4f2e3845ef6affb15f29d1e166c333", + "0x9ec0e54aa6361293f68c14b7ee9dd32abc52d9649522b0d62637ac25d3a978f5", + "0xc2dcddcdd616160a196f1336e9f11c7685c5eaa4d3f5ca7c35d7eb14199d21c4", + "0x03a14db3cd22bffc91ce24e510421d60431db71bd68b8b040c89f85f7664967f", + "0x3cfa17c8017ee8692c5f440e6ff825b2bbfbf18d01466234bf69ec85c3c793e4", + "0xeb12362e925a0b082268e0e006165720dfa72ec2628dcddb6cbee4a4a0ab7bcd", + "0xb8c68067329a16ccc14fa3a5bb373d8281c79a20e1a15f74dab053efb881d13b", + "0x282be7cff399ee51b3b8ba7d9ce73daf0427cb11151b9a81ee0f6efd837c6f6a", + "0x357989e62c038a11c75120f990adee58fcba6e7fd49cde265296b2ee0c7f6db4", + "0x3ca8e01da313e17c3a089b8b99ee118d10140a497aca58d62c25452f1361f0c0", + "0x9778186733b0e642156d6af17ffd8161608a2ad791cef0dc5d6f31e5ed4ccee1", + "0xc309f7651776d4510a9696c89aa82e8720ebb2c41c208e7ba8ccdf1d26dcfea6", + "0xbe30023b89befe4495b15daf4578f415e8cf25087428bb25b1af06b43b04b114", + "0xe7246483ab7e0afa2a6ebe69819744cbdbc588a5294c1c59cf04232782d89c1f", + "0x54e18aa712987567ad36173ccaf070b127277ad6e9db2bfd1831b7868f56c660", + "0xe5c6a4c0f07bcf3dab39def282e3af9f7dce84a7b2bc71c9bc3bcaf35bc6bdea", + "0x5d78d891bdbb232e7d90370b5108ee03ceb0c5abbd5bc1c49c53431a94fa2309", + "0x91f3efceb05e5c6114ce0fa2477d8e2a6d9979ab1d3cef4d964d7d804399ac50", + "0x29830ce8ede37d875e7203bfca97b104b002aa474fa9aa9fccc11b2baf665f83", + "0x93a0646400cf92d5e7490638b12408ee9fd7696f15005287d23238ee5fdba9bd", + "0x47273e8e24cd886a25e278d327bc0b07e4c3a6b27634fc17705f46a019ec042e", + "0x3469aeb8bb2312fba8a530a002d75b75bce0a4b0e7f48d3e92d595dbec818594", + "0xfa8abfdb2535d9f04933e924e967d97c248b62900ee645fc991a47d5ecde87d0", + "0xe9fc29b24fa7b2a6cff23170d96faa84aba582f68792dba4962e7fb53922c568", + "0x506d80c18b5cd845e0277be32d0553130549a976f781c315c674545b1087516e", + "0x676bec126c59b4f69ddb2ac8141d9e90b78a2aa1b5e55e6458cd479fc7f98a10", + "0x4a99d2f7be333ced3b6faa2aaf15f792e00717da5cf15ba2e9b5b7dc02bb1bc9", + "0x776f5be74f05d1200273ea3c9b1919637fc911c76d1a9c3e1e3accbb9ffe6e37", + "0x09b9f219a053c0c3c56581e32ac15fc6bfb4fe69208a5291dd4860cfee263d19", + "0x65c9e06136563c4648b76cb1e7c5d46bb7501773825a10c610f2b63bfd5ddbdc", + "0x2e31a4c4d6670c2155b3ba877cbc6f086c18059b2903ebfcf2cbeb6f73e67bd9", + "0xdeeccdd2dbb206be5fe2bd4e122d6cfa556d00ca0021384138dd914fa3aa2413", + "0x0c24527744343d79639a382412ad22e5ef2e610151e1a19f09f725dfce287ed4", + "0x4fdcebad349c83d27457ec443a5103b375f26b6da958227ff00916cb900643b0", + "0x4b06063a48575a6f89ae7fb8deeb316c30e6ecd080898c47f24d9e7d4f6db960", + "0x463b0fa1bb74f1473673a2760a7e447def169426f9f7cb57ae4c6d417f58d829", + "0x01050ce1aeb140cc812f24c6629f9a171ddf4891b9150b43312fb052ecb29de1", + "0xa9e4bffd5ca3834b5a80dd84bad6ba4dd71138f02cd386668aa8b73f437f3e0d", + "0x379e501e6acdd0f94195bc851c50e7674e103ce8563bc61d7b0e6ccdadc18def", + "0x8d93115aaaa77767f70287e025a445cf6a4c7f455a67615f38c42e827c95912b", + "0xde2d4d8337849ad10a32b1731a0c281eedad191a09b26764568e7cd9769200df", + "0x575de523f7dde0e52b68c15646d22a31e245a037d1218edf86e295fba9b201bc", + "0xa545dd5a5e5dca568a5a28bd387417bf3743e184189106670b03b423b9e5bb08", + "0x044d13ecdf9cd6989d3e5a1d8354d4f5a7d29439a5da0c57505496fee7b6d054", + "0x4d99efa30d95ba2f0002565ccdc0ade2bc3f21d3153c638fe8ad9977f1da8360", + "0xc72982c95de4754f8b0ac62113a71af4c760c3c63f18d230f1fdbbe3c0b379c9", + "0x7a2dc8e509b0901646afbc1a6f9b5b27ff69f2fdaf4377ba027be555acd128ea", + "0xa3656ace4d66ddbf55477ce61954f2e1f165f570b5c7d028d1653e9f879cd080", + "0x47e4e4bbbc704f65e3979494487b0dd51cc56a928f26f97d6e29d76db80ac14c", + "0x5cec964b6d806da75f96c67c1db66d7c539593c476c69a2207be25934443c82f", + "0x685e812268ffe51415ef5e540bd4d2d65c2f34977ffbd54be14c895e4f004abe", + "0x991b2344ae224901f5ef89be9ed8313ad2c217e3727ed8d24f3a35fb71df3982", + "0x1293f5ce59c36d3189ac40e05bd8c0fb4b69008d8d457b224df1ef1e0285b553", + "0x3d41f27e644e2f7de5173dfe7004e32d6dbc8cb56871f578c3b2b943210a4c47", + "0x2decc2a4e91de0ae9a5584cfb03f6a7a4e0a867e397dc74df8f185bf241cbd96", + "0x0aab7f05bcd3b3633184b45c81dffd70b3f1b1b23f28d46747ecaf54fde443b4", + "0x8bbf3aa92fb9ebba36c5a2756dd394adf505cb753f8d3809393e1d967f78e075", + "0x13544a2979e57f73bebdc7cd1b2a1c9cf8911b8f24868aa1e775c8c53d0e2572", + "0xa7497c9f04590c706fe0a3909bd4af5bccc7ac31d7162b2b856d3a36bccfcef8", + "0xb80de8392864c859aa8e9ca078c258a6992bd848de129350ba29548db6aa4afb", + "0xf334d02277f55288c189e6ce79942ced25ffb9ea7bd5aa5ae562a985eca6e57c", + "0x83a563681180ecc7a1fbc6e47e0ba03f5004a87167fdd451d559a573df30533e", + "0xa648f1462985ba8ff73c7aa4d19153843e6a9a454d976533b08f7a14d2fa8902", + "0xede4ba72831451bfc8651419aedc62e221bd8acfd8d4ebe426d5b84d862d3b71", + "0x2ab8f2dc9b620b637aa27f9303068abfba56bb3438905d29c9a6faba4ad014c2", + "0x225e5b7232c6edb127a71ea313501e49dd86f4df0a037b9c97dd5fffa8c08cd7", + "0x85606456efed98380428d075ac4791140c9595b83707a397b274805c8fdac4ba", + "0xe298a5939a283d03311d1a19f83805f63c83efd2d7affa7586be8868284be900", + "0xfedc0db97df763328cd9a8c8bf1de73c420ca33dc3391acd6e4e847eda793d7f", + "0xbefdc3c7e7ad41deb07ec2821d0b84893440f797fb1603863e274368008b8e74", + "0xba3b21ae193db8215fa341504fc5ca46b58df994c473340bbee3f3fe90d72497", + "0xc45fc6625b0f784ae2039747aa93495b05243c00dc5c2bf46dc372c62beccf4d", + "0x32d182e51018fd1e19b576670ec68d59810c4bbfd406e2bd162e1f17a0555f67", + "0xa8886b1a9d7bba27219fe7f563ac0b592b82a1411392ea71a4a5bb288a98d6a8", + "0x396bac50aadd2dfc853c144091324a12ab8661590fbc738d3cab77910aa2d2a2", + "0x50e35af52bf6eac228c5fbf6fe5dec85989b76f44811099f2e8f4950e4ab86e2", + "0x9ba2aebd73945b6dcb9f5171155c0fff29db8cf40baf83b1689a7ad1004912f4", + "0xfb1cb1ff78859e3d5f0db0656821e12b8d247ab3896e6670426dce2055f1ff8b", + "0x230a6f6567f066e76413b72e7650f7cba9315090abc1bc7f93b861d85aaf0c68", + "0x4dbcac91377ca858927a01f5a5e8659b4e718ceca20d4962c43fc1688c4d7574", + "0xb13061dfac0e8f22dba518fd46ea95024cb97ef825c970cd5e452ccb3d7fc6df", + "0xc5af27a85235fd0e1da29b5afe6955d72fc2245c5709a0f29bebcc7c49eb4a0f", + "0x7937707d20bed2c7b68dcae39ebcd93b84bca9f471250e20f86f8ba58bb10fcd", + "0xe1398b71406488244a0c205db9c793be090349bafd87fb147c1aafb9d7d7deaf", + "0xb383706e1aaf7149b1ac3d258f6628e8e6d40be0dc096647b4bb82a08585b707", + "0x2c07639c073fd57cd719e5c67371e5c8db30f34855ffe0d985070b4b36e27cdd", + "0x7b264ea13f78fdba57d1097be39b6b2dbc614ae36cfea1f99d44b9966b3db035", + "0x04d942f60d32a80d93d12fb7c8ef95439e0da5c8358df2c01e7547596461ad79", + "0x71c93b0ec1e403906ce7e5a38d168b72b14cbb7cd0e832c2a7e73f485c7d6567", + "0xf7060c7f697a68824bbc178e02dcd6b12ca204da9bbf2a17b69ca858e2ea9574", + "0xb3b616f183145bbc77d8e3610504189e00c0aac3e15975e4e01f1b2b25c5b5b8", + "0x137f77c2fa4e911b6915c5a84588bfe78bf54ce39d09ab07e495da9283966d19", + "0x5949274e5465952855c28d70a4089644200927b54faa67d5aebbc4eb2b891aa8", + "0x1c695bcec5602b15de8099c550a3b738aba98acc46377cff7a5e58bd7f402ce1", + "0x8d1ffe39767f285d7f164018cf2fa4ec6509194c086c33af7ec8132e3572fc9a", + "0x31331d50f79ace5444f242b279be905e076d675fe4d4e1d32de728e2654a08a3", + "0xce9c3e8fb9a75e284c81925c6ef742c4f34e6f0bef11578a61be5325692a3a60", + "0xa4cac76b0729c42927d1ffb0c870983830ea66636e9abc6138b943301c59b96e", + "0xbcc505e608198cc3546899012cb59a3da60839c9060d2952f8ecc178be4bfd82", + "0x1b5ab87cc34a38f4be26c5e3e05903538e8e3af350f6e2e1258b0cf344ad9f39", + "0x85849c1cadc5d3bb555b88b1e5720110a1d4f7b79f634427a1f8d7e88c2e043c", + "0xee63ee939a6dbc6678415a1af9969526083bbb754a8c55e97cdefbd2f02900dd", + "0x50c63ebc1248164b057854b8ab8bdee0510a97f75e864e1d83feaf59541a64bd", + "0x58daea24885faf1556b3111c06351fa506b40b9f1ed365633a2246165abf3819", + "0x0357ff6bf4ef1b1bab206c3c3efe770c6493cd85d0540fa29492428d0a878c6d", + "0x52963cc6bf51a64c1f8ccc21c520ed95d5ecd0e43a86b85defd7b0113082e9d5", + "0x5cb8353b62e27e59824ee43a4bbdd384a2af41b52f9ea5444a1a180482ae7856", + "0x2815152239935641536e549578cd0d33c74a377ba350a36ef04b038e5fc49142", + "0xe6df1f1b9949e17e0a683b6fb7ec9ede2b49ca3d479202226ab4180445f86d51", + "0x3af2498e3ae79447c4b6b3f025a37c790622e2979462dee5913fda778882e5dd", + "0xd498a21e50c930d1f0fe0afa65c6f977ab8da037175f34f4478e52f4c1631d01", + "0x12478043148cd0413f56918565cc2fb0fb9802dab776f0a055093ee8ac131da3", + "0x9acd35608a37ac8e309e884b88609957ed24ffcb5816477788e08a874e6c5a61", + "0x53ecc517c7158fb6e99863c54795107258b61399279ecf74f443d49533a104b5", + "0xc74f9359d1b15de475fdeb56497a5745a93c741e5f2c370656b2e7c269c06511", + "0x8afdda4ce115a19309597eee883cfd257182db46070c7cb1f24955d9c872c8f7", + "0xc4036bef9a9e692ebe72c946161b3ce5c588f4421b7d6555b5d65f3311a5b0fb", + "0x4b64a608ae22b5a655cba7ef78624eb69f9f8e2b2f7aad8c04cc6ee95386e9ec", + "0x4b5506aa505815e519b5008fa8d23488b642a1f347f6cdbf53975636a677a6df", + "0xc251b21563070f1b3895bb4512bdac4395440217c5ce01fd85e89399dad72b53", + "0x07a7bc11d48537654d24eddee78d35e4510f22b755f1f36c3b81e98087a1ce68", + "0x66a0e9bf542363d8660cf7817ccfa3f4262e4817fba45d2871d0154b6fa7e969", + "0xb2493d6e033e1c29f62a409342beb82f692e565638736fd088d80acf7666b9ca", + "0x4c55f2a4ceb60544682cded4ae8b23bf217ce7d87ae90abeba156d9b1005f397", + "0x32b3cd5438edac8902527ac353356e99effb1dde5209fbe1015673778f7c5685", + "0x4066c6ad2c7170b434bbf3e7ca0fd678803351c3dcf1c56e84bd6c14ac2f7712", + "0xe74fa1fa353cfe643ad94f6a609726fd3c4b06f9dd7503431f84b13bfd87b06a", + "0xc46c3e5bc3c3cbc604513909999f1523d704578cf5f025a33f1a5273ff6cb81b", + "0x261b489751092cbd70d6d3010b5c5dd68c9041063c3f998b742e81060107e17e", + "0x37992c7e208c0b09309ece681e02e957f6310c6f42401702b31f752646fe738b", + "0x2b09e6bae0a34cc6c8c83e97c3369bc847ef6410551494af91a3a39929e7d949", + "0xebc85167d3a2fb3ecdc5b07d78b6ba3a0d8294901f75d687087449ed78b305a1", + "0x8fc0dda2085f4e515491cf0d5a525f10d50c58a0a86a58954b07264425bf1e16", + "0x5acaad0dd003649ef9705e73232b4f9598c3fa14cbfafa1691d0f987639b914d", + "0x41cb16b9f5120095aacbde94f52b635a1ea9f347af8f4092660e84a1b87f8535", + "0xa5f2fb17e7fb322069fe66bf093b99f54ffd9949fa4cc983d2266013d2dac2ec", + "0x014582ecf0cc003d21b02662531b8c0422d499d8b74069533ee24b9774c1b7ff", + "0xda9554b8c2b3fde14390f91282a91a9eded5473cf58dd2f5a6e6168cb4d24d3e", + "0x55fb7a99e9e6e3d9fafd8c9f65dbfe821598f2b5a63435204c063cb4477b1d2e", + "0xe54e3c51b6eea19c23875beccb7e18094e4db26f3c94431df1dec26e6db98773", + "0xa7c04b495735a1a829c64f06b94c486c0880a7c54461defb31a420fe0104e1fd", + "0xc7299bcf0202163a946ddd5d8ceaa209a1d81e28a27e5f8fc660c00505df769c", + "0x2526f9fcfb45966a26370e08b26cbe29fd5aeb568b0f945399a6ace1778ebb57", + "0x59b3d302dbf5e3919550c0c1b75bf111d513f2d0d948ca8cab6c44fc38459b3a", + "0xa73fc3b85209e722b88374b2ef3fa3df240ef81c9f9e0d4e7e422ddd124a5ae5", + "0x0dfe2812db18ec7836f8d2227e35263eb98fd2046f597c203f2b499b538a308b", + "0x1f7c6caf872ae90f4cbd92c7adc49ee2ddce61baaff37186111ba7d5347bb4bf", + "0xd67aa89ad3f03b9d801d3f1cb1ef58a5d9f6b8e4cd9d6fe9b862b697f60951d5", + "0x9d760e7ea703028be2d197a0ce28d4057bd8fd7638781e9846cf5d5886ef6611", + "0xe9bfd8ff1dfb81f4f5e5c3a3f821384f98d7c6b753ad356952fd10527e08ced6", + "0x95b6333df70dee92ff0d880239c2ec7a4016c6192391c08e797fe24e06bfcd0a", + "0x56651120494e23767700b82c6718a9c1abe469da49c38937582d08220330cee2", + "0x70d3bae96dfe1a093bf9233d9f8f4c149fe4079c5f40087dd49c6e524cdd96d5", + "0xd29445a1ef099b0ce227c88efef59677abe47763149e034c3dc96d999b66cad1", + "0x7e2fc31ca7a02f965757f118797ae5093cc95a89fabac7e25a22193f2346ca57", + "0x3b7ceebb659eacad955fe0e95a6f141eb4f59f4fa70e52da5c85d7a9467b9298", + "0xdabfe5efdd2d7a44022fac35b13c8acc8c3c1d69ff360d45d997887feedffa93", + "0xc883f0d5c38f40861f9466fdc84170f7605e9af5ea4d6f9aa5088c6c9e482b7e", + "0xd5b14197d738e2635f7294eb8993b01db1ec02de38a545fae881a3f11f3917a6", + "0x5d2b9e3f7a490660bc2592cdd4e04fc9f5e32de1de4c9a8c223b177627708bf6", + "0x2e94c911c88a1cd80e94acfc9f27bb5675a6ca79dab6f70f38a4df99f84f7bbe", + "0x23fbe80ce230e0cbf881279ff259642d6ddb579f0711c5f66e93db3896ebd835", + "0xf1eab3ddc0e2c231cc78d123e20f4195808a88f79c21b9ec2149e3ffb9b1d5cc", + "0x5156b02d5fb9cc38a14e3b4cef86fd99d01db773f681404889e6f7b76a6b2d51", + "0x4bef16dfae5442b8d2451abc13f610acb565fde8400ab2ce52c44f54f68308ad", + "0xa726272620270e5649309798d90fc52ab80b779fa03fe639fc8ef14256d5b1ee", + "0x7f327dd9c23774439a2c080274d3111e0487e1e9c848a9e11c14b2e5a9b307ed", + "0x711fde0a0f1474e0ababf802d8cc8da401d1bc4f836868f117f8ad3756179296", + "0xedb4b7af3699fa441ab53a6afaf380b5760fb86c6b5a0f2d73075fd9da23c8ae", + "0xd7062907f805b2b54e9573104b7248cda283ff1af3d86b7d77b4f9a94d420200", + "0x540b2ade8a4d3571094a14e7e337cb4ff66a86e3cc9fa5da85e93c21edfb69bc", + "0x3c06c59332db001ac1cc72e9b07adfe31155df74c920d7a897592fba0d265a48", + "0xe24179dbc1457c23d05b307e0b42c1ab276db666e49b48cd3e1b3dc82e285de3", + "0x70675363d1a4a6db8b803e3876b171c4ad70b25a56790ac7e4cf011ded4c9c9d", + "0x80dc30723f933aee8e126815fbc226186c07d724cb13c60bdd55cb470f159c4c", + "0x9be135832d600074ed784053d80ad3fdefde87db55088a545a1f8403429d86f0", + "0xac742c9ddd3e59c3467473ede8a794a8b5d1c8299a471c7510cca0b11259ffec", + "0x3089d8ef215e1cf33020d6f2dd005c96d9e7c8bacd2e272c788b79e3fe016caf", + "0x7b22b3b82634041abaa917ce6ac8738e1ad5ada1038bd1a583c84f2765640e0b", + "0x5812d6270239d7566288bdf58df80a2f692731062d3a0aca56d3df972616b553", + "0x0cbac8f96a15a1f57b3ea657e5888598f7350466f40fd46735f7a8229ae7c528", + "0xac6d9f1c216f28da4b97cf2f78f4a7d6ab38636e57fd9a4db71bff191a8007e4", + "0x8dace71e1c1a12a57dbb4794cc92d3e6641201ee75a8304b28b670719cd9a179", + "0x03d497bdc46d7189b30bdcea32a7d93ae17aba1851da4b5b7baa241f0348649c", + "0x9b2316358a104fd1a93cbc388c1419b1db9043aff711d20510f012bd135a1309", + "0x88d613d910c664cee5d50fe1733340853900df4000225698ce32816f457c30b6", + "0xcd9d22a2cb07552bf921cddcb89d879e49ac840a5cbca91da3324427d7d2b80d", + "0xe7d213479605f340cf3714234eeebbcdb63805c5e9479dc56d4a4b2733997bfa", + "0xd899fb4bf3a918a9cfd46d23152fb1d5e54f97b86bf270ffe28e6e55e924e391", + "0x14a971dc6aed1e7dfd4dc3ba613548b8966495628182ce99c4fde9124ccd04af", + "0x89800cc5cfd0ecfb45bbd253dad288617123b3690098e41b38c0d51cfc10234c", + "0xedfe6f669b7b9dce540683400260000ee191c3481577aac6efc163afd7af6154", + "0x70b50725e51c7a5fd4818be7286bd1cc9b15ec2ed4ab6c1bf7e7203c4fa8f25e", + "0x22d02fe95c6f959f72ef4c96329dfb31be8ddce701e0c3ecfc8398119bedf656", + "0xd7877a10f7f883975c5498cfcb07f044400a09d906cb94c8cd29f7a4b93e4b5d", + "0x2e47d9590efa111e19419df7cec6b157f4e06dbea4e64108b7101017bd0cbec0", + "0xbbaf38881063dfcece265083468830bebdbdbb833a57bd7844044ea0c57d1e44", + "0x9269c959dfb4540e3d6c815aa0135b945acb7f50b38fff49f6e34425477ef553", + "0xab47e57f72ee8c8d8857247f84d3419edf43fdf6470c9ab070d8733cd8ad617a", + "0x2be450e3b77d2d3377218412be18390e984fefa2df07d02edc07ebb2d64a9312", + "0x6cc64bc8709eb51b5321b25453e77f871f364a8b277ffe51afde4b8c7a181338", + "0xda70fdeebaa9502e8d0af2350824ee0807e31cdd55ce4195f32a639f47f399cc", + "0x2dac4b30d219640aa01a2d7c69528c8d31636711c915827a64a9219524f2885d", + "0x50932f0dbacb5af5785065dae19245148270f1d0d3515b8d7e191c5702047b6a", + "0xd919cd9f3f6bf7ff66340bab7c562bf53eb969b3e00fc950d1d3b0d9d815e351", + "0x76a276f09fc452ac94cac15d5226ccf3110080d2bdbcb01e8ad86597a03f21bf", + "0x83bd36f26e7d087ca641848f5bda2313903ca64f8b61cdac127ec56efbfc6ccb", + "0x6a65903a006c6759aba3191ce06fd45b0702f127d822d9c889df12b2d52c7bdd", + "0x8e440f04254f81737b00d3857d1a95bf8709f1475bc0ed15d7347c94e57cc7df", + "0x20929894b05fe04fe12b11d336bbdf33ef983eaf6c501846d48813a97ee4b5f3", + "0xfc727f2888aa9f47d486f93b266c6d09b09b949821b63bf86aaea830c16388f4", + "0xb9035314e27d890b6362db7cbb0953e953b57163be0d80e5ed36759500f3160a", + "0x6d2ba56b3c06326a0fae498467f439b47bce1174862817b5c703019e8d448c4a", + "0x6b92e2415eb7349014bdc3e705a2170a5cc09796930d94e861868f77c45d5802", + "0x83a57de8623aa9742b33b3c8b3737bfb198f738111e437d9bab12baa0660cecb", + "0x979d381266e5105773f922d3172dd020a6010b9e435f3bad16ce6065b537f384", + "0x3fdaa18e7a2ab12c5705b17ae33e96d8df9ab3be631bb9c46d31052ad423a4be", + "0x439e461837340e67edf1c7b7fcf633d5c3d8636174335dd80023dfd61f66c67e", + "0x3ba40c7198d6c75a1ecd79218edb9608b7cecae9f779b37d26873d040d29b308", + "0x66ca7e3c8f892bea4be87afee3db3c9352641139ea4b8d459417180c2df8ac5f", + "0xd55c6d521f3a145379a1daeadfede8f837928315c9c2f1c2642ed0e1a7e87674", + "0xb848560abba9f0e19af44219c2c1a5011ca43eff4ff6471555b3c1c235c40119", + "0x1fa19a85d008e7af8585eb7cbbcc8d61ed6248708429d0f458f1b497ebb190a6", + "0x72a4e2f8b7fe422eeec318f1127b4b4e4fb03e40a028d45f5444c9b287a4a764", + "0xed88ca02a5918d6f621fa1e945bb1533e33ea5c1d41f7915672e3c4e4dce78de", + "0x60ef0df2f7f5c6de3dd7c02fb202c9b3a13f48102f317b54b25b2f0f1f49b6e1", + "0xc49153808e765883dd21e1b58b5725aa1d242f920ff0ffe0c6089a5e00719c82", + "0x0c8581a354376bbb53379f45c92e914e46676b68305e8fcf16eb069c65e87cd1", + "0xb562721b9433cb712b3969d193e132132786434bde1d45916bd7423194c84678", + "0x060cfe84bbb7842e0a49bcf9f8753635d9fcd694de3b8d5827239606269f0cd1", + "0x84306039a875a723780ec685c34474d35ac3431d6ac8d43b2b6d1bba8572eb9b", + "0xfeaec570403a0190c889e5d2ecf96a9a6c720b3944e4b703049c81a35b56d820", + "0xae002e7d8e1279513b037ad09695e93f80868c60d2d8b0ffe6efc8e0ca8a51fe", + "0x20e1f3248ebde32f2fca51a576abfd0db3fcfe359df399f1c3102ed2183b027c", + "0xdf77e0510d24818676727c9d56b58b2495ad63902cedb04e2f3729b58374c942", + "0xc33b4b53e7eac8725f5b3c27a9431dd6e4f966b1289e3b2a1e158474f4a47f4a", + "0x6466f3aecc922abbe6f995a3ede8ae650be7f1c08679c5f6355e32ae95a4412c", + "0x56322467df2291a50bea2baf66169caf34eddd525655cecf6d14fd2295b2a438", + "0xbd81e7bf5e30f4bc1b87c57a4eda09293cf6be979bd2bb02650ce5bcab8da996", + "0x3d611638ca06abfde10ce7f02152069aa30d97949dabe3dafe8980699d49ca0b", + "0x12723caf905e0c044344c83d085f3d89c2eaa695c9d70c0a831d487b050ed453", + "0x473f61c421d202e15d4a62d4513bd48313d253004feb09d9b6e0502c6ba276b1", + "0x9583746c372cd042a46ada64048ac44b30d3b055b6e22ca3cef5404e57a99f0d", + "0x8decffeda7b7de072da8268776c4b9969cbf3e7ae9433334aa7e1e7c93567f55", + "0x543f5b6b686035462d17ef969fa09e0af3e7cd24d13650c2d3597516e62f9909", + "0x5381b2412f6383d057bab3fefd23d08384f345960cc2fb80d7311a63be5080a0", + "0xd96b7933fd9308f7aac9fc42e8feb9f2f4b586400fdee23798cad69611320461", + "0x0982300c344d44c2f63e1c1fb5fffdb44c23749204a0e012733317cde6efaa83", + "0x6048706531d18c5f9a257448b2826fbcf7a72bd08d5d4feb2928acdaeee61768", + "0x2bb89086896edfbe79407ea2bc8535c6be143be6c64ddb1190e626e091c7e802", + "0xd1d6697db021746970393fc0151bef8aca67d202b0e54f4f2702a5f86c2fbe2c", + "0x5c1e1a43ba2578bf4a302e18f37bbc4f1a67441fe6a71ee856662739a5821db3", + "0x1ed663708c0709027c702ad5ce0eca6d3e0f22d6a01d4517adab0a3d25f5eb26", + "0x6ca247d5ec5ae33cbecf8fe88c1aa64745f7a8d299bfd356bacf764141d410be", + "0xfc020b5ae74507a1475ef8e2c0bb516b67bf79aaa2b61bdbc472ba2d75ef5db3", + "0x1ef0990b9051937ff1fa02880131aed9787e6d7d41a598ce7b5094eea1daea80", + "0x9e9e9a83fd6907dc5407c49ea34bd1745919d9ddced756433f374440fa8c704f", + "0xbb3687f8723712f39a8e9f8865543100e048acdcbe2045803ad5a40b61c4a36b", + "0xe60d8a60edc3d7e31ceb356e493a28fbc845f302ae2a8d1e7cb80f53112900b0", + "0x294039b994a3ff53cbba7718280dc827fd582ae789736a026eee1d39284b35e7", + "0xcf87c0d2ee79a0d2506a3d557880f3ee9a20ff51bb44c20caae0849a85055408", + "0x0d6bb688dcf3430e46de1512ebc9e411db3380590bc72dbaaabc52a5320216ad", + "0x9f2cd8a43695c78c7a8fb1352d581c82dd9dd0ff04e3485d5bbdd5e3942f9c4c", + "0xcb32930f407012e479eaa7b4844107167f519deea6c7fc0351cecb93c500d63e", + "0x17e759d815596e0b89a3dc4ba12b9d10ec59988fb0550e1518a8b1cc4f331190", + "0xfb3b36940c6675249451c4c857f6742bb0e1fd3eb126e370eb4deefe238d7d75", + "0x47d619d7d8a9510290dc0b8b2518af2862ff6f761ff09786dced91e39d8afeb7", + "0xe8f40bd7a7bb8f7dffbc63addf31a27e0a987a27c00525c833f6ea8f508537e5", + "0xca372409bc160e5eb7fa70e2bbfe8daac9763b374c7bdea0cadcc933450443e8", + "0x6e234961784273f80136dbdfe0f5618fce6c0d63c2fbbb5d7fd6823632c0ab6c", + "0x2a6cb327e669de9f9783300ef6b2cdba5585236e286ba94dca114de92728ebc7", + "0x0e91e6a11ea59f840d9bc47f251043e10159880276bf69beb075557e38715fbf", + "0xd452ed733b985db558b960ed14310215abce589d4149952a3ebfc7604082079b", + "0x7fc984fb9d191984b5141a9dc7ed1c9657742c63e7958c7652bd896bc6c9f985", + "0x2ce2f74343ae9e37153b5c071c4ba13adcf67676ed7789379c364107d76e32cf", + "0x0bb95a7856e5f61bbe47d56aae9d7f42b994fc4640b50ae80200ed8a678dfd51", + "0x2ab80f2546564ff01e812a39341ae227b69ccc1b38c7f28e61c31925cf622811", + "0x1b24ab582f306305400947e9e7e43a49de6cfd62819517a8ddd904972bd8eee7", + "0x852b65355f93035fdf4358ffc3566d57dd97c9d59a1e545706bc6a13690025a6", + "0x6a44f88a6097b5e3c822abcf1823c98362b26b0bf3753b6fafaafabe9591a07a", + "0x4e7c0a92561e904eed52f2a2b906293411b97795bb194d9c92e335cf9e4ab200", + "0x6ac01d96e58002f8881cea4e177ec7606c69e21d252d863787e5cca65a839792", + "0x4d95bfeb96b7a7978c890842544e8e780f531512c182cf22a73a71b55f1679db", + "0x84de4313a7d87fd748e9872db1164ad3ff9d48993ba429b74dad497dcda5a3b1", + "0xb5ba8e71bc844413cc3eee7325a949af1e0ea81405a3371512fddbef87e4e9f8", + "0x2378cad3d3f0558c0df47cd179791604af7df805f805f7d1ec67b52b2c330d6a", + "0x260d00d98b976fe3aaed233aa9e1b8fddec1092595c91336a5b884fc07e51a30", + "0x7e3e9859270e3a7bb7c5f6d7170e98a8a0a681216e21567c303fbc9e755a4739", + "0xf9aa5450b6036bc61ea2113fb163997ede1bb212f343ae5df0b55561ff32797b", + "0x465cbec75cc303fed26bed3e2701372f9bfefabfcd54096a9189d73994e7aa17", + "0xa86195c2696fa647cd5971d47587212d48957f3faf69721683c158a1372eccfb", + "0xdd104c0ccaebf94bc3c0a6abae1852a71f9b1eee974d5e622f5386ffe0949b7e", + "0x005f5108714efe19e512aa83608e9cac46976b0afcc7a010bfd682965af39d43", + "0x60289c653af2f12a58b10c0f81ed6072b3112eb270b350facd79d0363be2bc8f", + "0x8e22bcefff3aea2767ad9b118be1253d1aedf1e1da502a4855f6ae7eee54c335", + "0x3ec7f166314a0c594eb8138b75a050082884556f7664702333c096bc93b67820", + "0x605398473b453589bc31312579ef3b5ce0b74e3ccb95b680f8beb30d2fba34f6", + "0x51dfca1880e15660901b5f755530c3fa4d652050c134a769b6ab2e1645755cc5", + "0xb24e9463fccdeb2178e520fec46eaa8f2d1da5380d48815a2fe1816f71b79b8d", + "0x97bd624937de7bb8915d7e396c31cdb4afb739bfd4eb6d96f8773ddd0e4f4933", + "0xbe17101284e09bcaa9eb5cd150983b05248b620465244b603b598bbaf9bf312d", + "0xd3c2ce415ee6bc3908cdfada4fcc76b5e0e9fa4f1c6ab43a3710b2ce81f150b8", + "0x8d4918cfe78489e146c071c149a7271ea81dee2ab0615394ecc35827193e737d", + "0x6a7e51675ea6214d36acc7fb193911d2608e41a2df747e328afc6f5a465261c0", + "0xf012c5f418c7e265bce72f9f4e2900084216c9187900927d9aafc899616ea9e6", + "0x934c51d4f2051bb7aa555b3f44bef81ff782b690e29f7cc0a9411ad03ac74a3e", + "0x9ebbecb11efe195d2ef7681c8f1f8af3b501f7c65a0f9ea916f7ffc9a6bafd74", + "0xe28247949b99de84e721641d5e3b638dde927478df0ed0f53b8970b4febbfeaa", + "0x6491ca6bae8781055660837b72622f19daecc7407aa58d24088b45f5725691f2", + "0x3a56f6fdf34d6a4d742451c1f5b6e575685f9a6703541315df1cb8aafe531f7e", + "0xc204b9d22b7cbdcc9132539ea475792f4ea231cb246747c485632be8df4ff5c2", + "0x6188cd2938f72d2dd5e16525574f240b458316d42daafed892faee9189caeba7", + "0xa272f3ccaa93e016333dbc904183db6309e31d06720da1d18addb7560b9bb427", + "0xdce0b5f11909a90c1c6b8fd2bdb3113a035e7784103e05ffc972364530ac36ed", + "0x6bcf3461ce1447e80bd3da2d91dc4530bb649b98333304fe3e0045743c0b96ff", + "0x523496ab97b10356b5bfa8e17b4927b8f0f507368391e24250f218cc00be4bda", + "0x6dfa5889c65ed8413d6633bffc9c3e648621d38eb70e57ada781b3f4dd62374c", + "0xaf1a300f73429dec7f12d0ebe9706cd113e15e1dee6cab37ff11503a836cb3ff", + "0xbb8aa95b40671760e1d131cb269c2d156f29d89911604db04ee7f87511283b56", + "0x93ca5bec69be4ef613260e2dc850668d5a1c839e511322d95ec25203d74673ff", + "0xd7cd3a14db02b6c705bb6cdb03140b50b6b989ab82d733df84f990a9c4d6b292", + "0x9136b9484831f1417ecc2d5ec93fe31b25e79b35513cf5187e50e3b95f862269", + "0x1519b8a6581123491bd0df07cfa3a40b0d098e5cc6ea981368fd073f7c927ff5", + "0x08ad5c68577e9e09e5b00035c65835b404437b792ff327950d07ef227aed6a84", + "0x4e989dc2f09df3e9fef7e50e7b7a9da85c091c11796665602a0f8294dcfcb2d6", + "0xe4a311a951e3743c0d3d05db87cc5d62ab0ebbe6b2e85e035c6452b0803c4be5", + "0x4a64e0fd19dd4b2dd7be3810f870cfca0cb4303d44204ae329f3ef1cd0a78420", + "0xd13981c9f5bfc2efe70eba25bb4f3d3f7bf13d454527df015e951bd79c649c50", + "0x57af6009a040d74b628416de645cb13a58e16fbd63035c6a6d8c8a0bed102ccf", + "0xfbb76c69f42039da5d672776f9e67fe1fd3d7eb0d7f5353852fa64558a91cf88", + "0x07808058eb2b620907baae2b053ef2c5786deb73df750a1b715bb1e0dbc0e14c", + "0x24f1e75fb9fd88b2628285f3e49233ea6f59b474ca05f5823810a8b49ae4cde8", + "0x5cc1e13c706a5c18aa40d8e5db49bcc87c38a07655a814b2179a35b1a8ca79bd", + "0x8ce52067eb546774ae3796de7cbb58f33395438a7976eef1f191cca9c6f59f76", + "0x094311f783939ded904c263a92d5db558e60352a392d3ba77045ff82114978e0", + "0x399ecdbb06d1421fd3651cd625376cea22cce333c6dc200b9e572a001b794a3d", + "0x6a94f126de560108bdb47dcfa8eaa5e9895b3bb9bdf7e7e3078fb725a1ca18a3", + "0xc0c7a71a8e3547cb067a73a984cdf283f6480524578ff611902eb9ef947c4c80", + "0x8593b4417b4d497d0f1d68c21b5f27433be956b6e8f94d0e6efe983492647fa6", + "0x616dacbbf17052280e093ece29a151df4c78027d652ff2ec3887a48daa916d31", + "0xbf17d700c78628de624a49125b764c1240f3d59b85fe376a64cc02f44fd3f46b", + "0x89f0b2b0b4b0eff45499231c9c5fdb53e95f72c589e7ed04c734b4d07df32a69", + "0xd4399b262ddaeec84cb56417cb84d2065664d79a51750ee566217487f420d8d5", + "0x89874f2ef4e0b53e96afe703f4f9e5d5c7da81a621acf00df29f821098142898", + "0x84a9a966381053a4e933c1ebae4fec74d3452ae5feb2b1c90ed59c92fa0f5250", + "0x748adbe8f803c86ef6f20ef7f178123f46d6c45dcfa332827918f4cfa9417663", + "0x0c78bcfbe149b1b2de2253d443011aefb4e5ea0c7a48e2e13156cd5276437557", + "0xa8d86c719b15c328e5117fcc0f4b381df4b8bab346d522df49aae19820ee128a", + "0x3bce6f3055593daacc3ae11b67d5dcc20475e8eaa91eb3153f83bfca6f2e7c8c", + "0x8af84754ff63a68b7b8ba3948e255fc172c53610aa90fc2f5f633bd8ce1ef7c5", + "0xcacfe2b9181c60d0c3d7b48403b18ee184e7c7032f81eebded3f19078c01d7d7", + "0xde4bc2b17855522804fdd6352f36eec477baafd69823908506b949c017aaf4ee", + "0xcbc7689bc06c9f4f04414835a89650a845884a2d102b6900f3abd4d4c8f8dc3b", + "0xb9779ac13bc739d5bc40bdb927c3543310ff114a83bbe35192c250a5f772d441", + "0x1239fa2d0cbb2255d32b82177a976ed5c9f70f0661a5d5267c60f456b9a7f44c", + "0x3e81ff86adae141c75c8b1a91d47db7c6b196ab00cc883fb2fba7655fdd6dca3", + "0x551e92e6d774825a2a48555268c86ee52e1b613e63c8a6e14275ae877dfa80f9", + "0x27a7d2faa486508c7fa20b818d6aa130a914da688d5bc8c60a3547c241937aa0", + "0xd10995979320d9d9d64051e4f721644579b4984a4337de86901b03fc2c042e21", + "0x6f9308ec6c4eb211b8c2323b68c4670db6a8116ac4a370801ddab1da0066df58", + "0x17d3526dec54f66815d8e4358028b0aa91d3a134d843d2945a47dd5aa56ba788", + "0x3a673e5904cc61906f6806b634ae6375de45f4f0d63713555d13a1e274e1bbf8", + "0x39dc807657774ec32abcf299b9c7f03371bfb51a864d11800199ccc7eaafbb4b", + "0xe2bcb8da657b830794b6d9f1e7471663e31996c1bb08456f4d8802448deb8565", + "0x38c7998e73b21038659140e5ae8539cd8cf993686c90148b38d6308a3e3b92cf", + "0x4b6d2986964aac5d5101ded91aaa4ff78a319dc04ab18e550589ef09b638495c", + "0xd8c4da66b5525427cafd152c365f99a255ce2e78af3e3f3dc408de0dd16fee99", + "0x444dbcafda5c0c74092577141df9fc8fb1822ef3375ef0d43eb876fe29c262f3", + "0xc030bec71e90264bacb7c09f9de3a5e282684f9f1d45a2b177c8f19f9c7180d4", + "0xd529e4c2687c7b40d1bda81201770838320b1183da1e18c59c83cc4772296921", + "0xa1ca4f57cfc4ec4522a42cda37df9aa74406d8aa8dc4b56aa62fc78c70d02379", + "0xdd30dc03a60b0fc21dc4b75629124e8190daff2e3504222fd6fb772531bdda85", + "0x2d9d4a9b9b2a27cf863a292a7fd112c81b0deae05457073fa0d5bf7e0dd755d4", + "0x19815e0f25090a9494cf5bea69edb70e7a56e6bf56bd19ddb1856198f54399e0", + "0xa7fa776c8227838d27496a3c659f3da3f5acce22da70701dfd62953edfa2bb09", + "0xe55efa9386b2e0fbd38af545106f197868361f2dc44051cb4a1ad540396283a8", + "0xc6c313738c3c75d434da4083962f8e8355bb8832e17c7104d037b131682b28d3", + "0x756a6309e8c0a374b99b2b2534a851496bc74db36e5bf1c950c0549914f0d0a4", + "0x36f64ed32258a3d2dc849f4abe98db30d8b04df28420c56215e29190e8a447bd", + "0x5273c4accf93338826feb5bd75117a7a0ab5a01225972532ff4ac1d29b289d8c", + "0x6146cf6b830f0222a8bf9353ea26deb973a85c5c4a005136061ab0fb48fe56a8", + "0x97b07c22662079a3a448b373fcb73320fed4a0877125228b4e9a5b74c0bbf703", + "0x68d28adf72884756b688377fac36d371325a01c65f5b70fcd7ac16a2dcd21444", + "0x2c27150b4cd8aea85723c4d264b8799c2e92bd4430719da6bdd3a0290c024a21", + "0x6b553b884acac18804cd52c7139e4a245f2d263b6d014fb6c28e31d7ea08e63b", + "0x64bc2ff8936395f794702b110041a88c1acc9cba50e12c2c5c9730976e667ae9", + "0xc45b2a7e308777811b6c099ffa3287970e003001dfbfe448a2600edf995513b8", + "0xa89c093a0b77cf4ad1ad7ffee799872a66ee38c3989ad39fb90069ab70b1fb4c", + "0xe8d0823460eba540c0c86016014127c7b77b0afdd199fc7bf8145a556a7c523e", + "0xcb2ce7a29b4c67956c439195a84b53f5c54e273c20b6cada43aa68ca7b1b59d1", + "0xcee4cb506d3b0cd84b763f405cd68e2bdf9ec1741778a004eaac9910d17cb67f", + "0x357376e9a49b6c7dab7c5cc95d4a90cc27516f1b7f56c33c4c0125516153819e", + "0x77090e31db86c2f2b031cec1a6dbfa3c3b2f464db7e8444b5def6468c03f5308", + "0xf2b0dee21d7b016c0c9e1a02a970835f934f66c552d653c9d5fcfd20aaf397f6", + "0xfd662e1a27c14d5e8b1e9bf6fca699a3ed7c5bb883cc626d54f53a721c570557", + "0x86194d492a5adc474f114f9cb7b0f6f6795d7680614b29bdbf25e969513a3276", + "0x2bf3ae6993adb5d85fe62bce02a836beb598779ddd37cc2db1f44b1cbea616ab", + "0x4321e3a94d12161ebdbc1b5c0f9223a7f1dc9050792589ce95771c7951b2f176", + "0x79154a76904f2a3c59e7151fff7cd448a3f74c003b866b9faba330481c6895c5", + "0x9c9e7e1d3753804e3644da89248505116009585c6e6d42071cbc532de20749b9", + "0x4dc1441b23210778e4df8417be9f654619527b5b42247bd7a8490a4a5f50dc49", + "0x79fd11e85b307098e827168a157ef45b0af5f4bc073a2920f42c6ff332392a58", + "0x446e8650a156bbb1b96d22e0d09619f90b8baeed34f8b63ba7bf3da3b764e219", + "0xa86cdf11cf5586d8b0449085e7c153a0dd55aaaf930960f3f31f80d099011d70", + "0x4d30e55035eec495badfd3cb8a2174295b2d2cfbee4e669e61bc148d09ff2342", + "0x2f8f3bc3c59975caf160d4a5581cab3499b84a524cb7977e4977de10a74ab875", + "0xe08b4473276f706c7399f584797cf07d33a91c91272ad79e0a5004c00a0d3cbc", + "0x1e27eb957ea54f1806115824c61d78e265cb75807f68d508da5ace6c7dbcd9f2", + "0x8304bbb4592daf4cc754c67dd78a2e2008b1abd8d966521a2291d170c9551e9b", + "0x8298d1605af17c8f47afe0b34b84bba22441a064a3d5311a2ea7e45f76565c8f", + "0xdc8014aead4dcb61449918deef31c64ad8555939347bf04f543d6a1158eb1771", + "0xca91e9581535b11cef0ebcd2e68dc00c3a18844fb4d6f05acf26eb3cd15f1047", + "0x2b26282d94df586bc7d4bc0cfab8ffe1844800c7045621527b9f9f0d5004949c", + "0x9a92f43c5a697a097e39ad12fcd9279b8fb3c3076ea1d910ff871c5ab3342a47", + "0xe33707e3e852b3b6a5cd375d981810399de6a3f96015bff7a4e5065f9c8713db", + "0x132ddae1f0244abf072e6d8115470ad4afb24748169891be0a4b952271599333", + "0x2c1236a98f16a294a9de1c24ea59739fcd6b5932b3f2535c8d131bb2f92c1dd5", + "0x989b0a915bb07ef5e3673a99ee796639722b9e4cf5086433cf8072fa3264f4e0", + "0xbd871c039e619de1514cb6f9223299c44d0555b5eb88570f79fd0d593953c197", + "0x7fcb1ab57bca2410a274f6339927bc12ea6843c106816fe10fc9576b6c7f7cea", + "0x5692b49ef3c3ffab97ab9ab1bcc10017e6d0527e1fab5b257210633dc4d2658c", + "0xe105a92cb6817fe6fdd585068363e0ffd45686fb6dc3658504c70e2057b165c5", + "0x97e65f3bb842f242f51e9ce978320a90720858dc9c535c1d66bd1c269dda0286", + "0xe5ba47b574c389d060e0c5f99f69829d7b6dd8b3bf6e64c315c28521a329c392", + "0xe971dd283f7ed3ca0e28a73d614c490a959c36f44bc30dc7fd79bda064f23aa0", + "0x0c786961cb4df57adc1011891b90813943a13a06032dcb2b7f9ac38dc8b3458a", + "0x3736f1ec97fdfecd7c2e6139fc7ef236586bd9507f65a99913a23bafdd5f069d", + "0x5c6cefd0c6c9c825668f99d1d595f6fa55a45e6a43e23323e901900e02a32f40", + "0x00373765ace6950b4728871a0165aeff55ea61fa8ee07d51d7b8bb8114c20380", + "0x49abb5d78311bf743008c2401f074e4b190d9b29c59cf6328831decd83068172", + "0x0bc28d7480d5a56588b937a530d026a94becf9ced1fe71c6dd1ae0d2922bde50", + "0x45e4ffdd3b6d480ee76f0ee7f6acd7c039ef564d77e5a91546e8269d5468ff99", + "0x09600f167ac2e81cb9164e048908a5b410cef5b48f92eb9a801cf84104430172", + "0x00ddfefc3d36282e9aa8e163d54df86f10737416d9dcf33e786d1713ab54052f", + "0x5b9e3159e4394f03d05ed8b8127ceed638ebe147beda7b7097b6dfbd8342df53", + "0x85d2ae2bfa381b7f5c1b0305f8e252f703d295edbd7c05908e6ae564d05443fb", + "0x5d93339013a78b3344b994bb474fd714bf5495dbcee84346a30219b214f1ed27", + "0x509921ed07765eff19b5c5b7885c4eeb30a8329417d1d819f3428e278364a192", + "0xe004d5f07b3986916f8cca4ba84f9357d4550c26d408f79fb49dee47c5afc100", + "0xcd0f7446313d80026c33427aad00e4689ef0c9966dc5faff93dd1ad258a032be", + "0x0bf64f9c84ef26104cc0d0bc61594bdc0d22f9bf25b436170df1c47351fc8746", + "0xb2e605741fe4b42abeea0ad054727950485ac432754ac2f98db695988c515d1b", + "0x9b6ef4b72c4c5b8159c308fe0395c8f74119bfc495a64e0529209967a1efab7b", + "0xf682c4da2d193bdc8e23cbd2a35d2d2eefff9281bb053f86c84841a3c88e4517", + "0x19cda96cd533527a9a93fe8c38184778cc79ee8ce389c181e67d79971c82fa6e", + "0xddcf6596740ea21e3c5135e32166e5e7944ab1a37ca60c57d9d005f83015865d", + "0x4932d76141f9f33ea5193e58e1767f67b5017ffc277c41fb8b9cb020304b923e", + "0xcab96730ff161fdecb5c0118b34b2a8c6ca2e53cc38ef76b8702284fd64d862f", + "0xe042dd86029d97b89ed789847c9651d49b2790d68b475f194c63c89974704b95", + "0x548200b226d36c3092fb9d721b74b829564bae7f39a63c2be0a78ecac5c69694", + "0x26a162476b85f3f6e366b3b767eb39227ce358a4c78dcbe6c8e3710c6ae05c1d", + "0x6f388c498dcc8b1e986c17332c8df84af7e8af9fca5c5a59600dda14f74e125f", + "0xa342f25dc1194e225f4c8b4d89b8992bf59517cffee52a1f2c2a0cc4727f909e", + "0x5e0d21aaffd603c4f5d73e5eae97e14988b03e45beb15bc44776e2db9ce20fb4", + "0xebbbed03150c85b1a7c7e7e6a6a67fe0483fc7176bdfe4f94bdb094ffce5bb2b", + "0x40e530eaa7fc24685d8cd9cd94a3f4b01aff4cbea49aafd448cd1f7ab4b0c186", + "0xecb1cc861f12d2be9b1f39bf56363937e6bdd5eee6d7e5e90426e7d29bd75e65", + "0xc0bc404c877856648f5793792aba95c9fcf2768eac65028e0a930c57ff9d158d", + "0x3e50fea97445730cf5c3fe8f05c1d03c2298fcd52a7d9be911d1c989f29fe204", + "0xb512ff3c024347545bc2843bc84f6006c0b1a91f49a7549558ac5d8d331c1fce", + "0xc0fd2941f49fe9ec9ca375d0745803539dd3a9750f1bc46380cad3ce29c76264", + "0x7f37105755852886e86d113ada4b4f1f68ebf0aa36dfa36291584dfe28e773eb", + "0xf0942db3af7cd949ae31d1f690f832c6e4f8a3b9744ef9bbf8e7a90b04a0ebff", + "0x6a9cee1f0f3ae40d63dab9547ea6bf342efb99176fd30d0ed2d8de02f1be6c31", + "0x2c2092ec0adfe352c46ade57b3c115783b7d4a92fb63bd1effef32e162d4b34a", + "0x4aae695ff67508f2d03f8674282d58e4f1038cd0d4c2a6a841ce425433e305a5", + "0x543665bfaeb5c10c0dd4d180475c9aa18a9edc313e52405f1c5fdc151538744f", + "0x7473934014d90b821ca0076d132c716728c19927f5680482b69163e8ca5d79a1", + "0xf3f4efa6bc4e493b5e09f32cab59a9cfc28b5a180a59640270a79927058a4f43", + "0xbfea0aeb82cd88ffa0269c56eedfebe83759a4af9345ebcd2156ec234d99633a", + "0x827eef18a3c2e24021dacda3c00187b8cc87e071ed1e2e9246be0066135fc284", + "0xd567403ba1bcccad81978857599647c0a7008cd3ab1a3bbbffec1217da92b060", + "0x74c8805b9b589e9493ee02bc73131431256d18b79de4fc3820ae5220bb5498b3", + "0x32afddf7ebc9d7efe51e045446a61fef4b156a3379212517b0971a91252e1b2c", + "0x4d050a932e5f971f33353a23c5b3382d163319321f55368598bcc3cd8c67f91b", + "0x9c01431659ec8c4db0cffc566ed9da3d04d5db610c6d6fbae260ce3011fb68fd", + "0x0814da2cbf76f83196ccd5342638df799d881eab6a526eab325c06d75b7f8e01", + "0xe669b4a2569397b901dad843884668d52ce85919ac6703671963d55c0923df5f", + "0x44762f71591afce826580a50fb4af763d7ceddc75d6e74d4f40deb3ec4c6ad13", + "0xd3231536bc6b897a24e7925909da660e7bc2c5154e529be0dc590770b5573023", + "0x8934b9858529b0bfa879142e0242f1dbe68143ac2ab347517be826e2cd8ab087", + "0xe833f8513f4e71ec56adc114106d5a8ae19b1aaf95d91a5ce18398f316253102", + "0x0a5d3578d418e0eacc2be66f8eb365a7cff71e6b287459e25a921befc7c55e79", + "0xc11db91e90bca5f39221330704193e670815920a5319eb06676b5d74e1d7d776", + "0x04f1e0808c62821a8f088ca0172820f469d327dd336db66d9595932826fb73dc", + "0x1861241e353c68afcba164f24f650eb3892f219d984e376336f401902b4038fa", + "0x142c7d1eb631e40562c24d2a271f0fa21be1ae76d6c7d98491599dc0d0580d27", + "0x203231cb071fccadc815f222900beca55777075f7d42563529682e6449138a17", + "0x304bcbcc7b6dfee9437b8f6b255accfd789ed115461b41e933140730a46675e7", + "0xc9f2359de838acb06278d7967f2ffdfd3bda5f46300b21939a760914a7e00568", + "0x1b470dceebbda583263a9373a4ddde80e2523b3837ed3c20b111e6fb9aa99a60", + "0x765ebffc2d48b2fe92c3fb14b301cb2338984f7760d514373b01fb34de466b33", + "0xbe814242513e1ef6903600ffd517b8f678cf306e057e01f3971eac7514b72ba1", + "0xf313f2b3c05a1dac53de10ddcbc4cc38b38be85f89640aafa4502631c0e3511e", + "0xdfb72e306c68cf4b22f62e9bca906ef3ac627b2286d2a261489e2c922d700dae", + "0x0783bc2129066d953ef7aca86ecf53ec3ff2bfcf8920f6079ad0a4dd703fe331", + "0x71f1fbfc2a9a232e2674e3e36547ee874806ab37b22728d8c30ecdb7ed2ad539", + "0xbb098368fb1529222eb83277af668535a1173a78825c7e3ef86f4f45429cb838", + "0xc49eea0b1171263bd8df058e6279092d59d1e8a4f108d1b4004333733bc6e7a3", + "0x6f95c83060775d579005c4731e05eda62753bcd0f95295b395b1de22b21f3b0a", + "0x9869e93ab6e4ea9da4cd12c279580e211b4c870a7e7dca098058897795804e76", + "0x816a76e3c912b639ae1e4b5eecadbb8cc173c3aadd796815a9ccdbf9226d58ee", + "0x29f33d9d30c64af6b372e922414c85004655782d024916909834b95643fd6096", + "0x30a9763617e8337203196a11f3e4b81b82d9642f0cf26b2c654c8504d289a17d", + "0x21eb2108b1ad465397ed3aa8016c09a52000c60aaaf42e13d95c271cf394c074", + "0x59d8b8fe9dd951d5ec540bf46808f01c9ec2a5e9dd0247b34b2622c48bfa498d", + "0x71b8061902f451c6fbd95c29ff960353afaea2b0410ee11cb993ce0ccb8af446", + "0xe69938e7da23b9d7ca611326dacaff95009cb5898abf1858593060ccb5aff4f9", + "0x0aacb29673ba3a0dce850ac772455c2b092b1a0fe61ed34965e4cdf723d659d1", + "0x18bf2fb69dc62ea39c195a702b8e9514be4b9d5eba18af13974a63f74febccc6", + "0x560b7fa0d15ec6bc0add83b6125133b97672b39477092cddcd5e2936f49c51d6", + "0xc8b0d3b55acae88939bc9426181dcc7d965bb5f85cc506d26f966c60a66e4ac6", + "0xaa9c3dea2f0184de1774c47923fb7f6ead25bcdea96c70b30127ad61a6bf67ca", + "0xfa90b6e07511736519ec741ca85d23d2912b509ec608a5d319c2369aa358a82e", + "0x0ab8709a1c9ac4e9e516736b4836febf938a0055d5b4cde960ba651e986f2caf", + "0x03e28cb08abb6912d3a25cb45868d699b89bdbc180eba67590b2cf13718c967d", + "0x1617f5fb8c39fac172251ac4bb1a9b8e20f9c36cc6a47e7e0545ee38fa55a6f6", + "0xf8cbfbad5d5e66d95dbd5e83b2968d08b6eb41d28efed0f1d9205b2297168dbb", + "0x4adf7de19d0498164921d4aa39bb070c6183e8511c9f987bc91d89cb54d8affd", + "0x7b5b34085f3267297b40770c0f27095735fa286ade7521e81f500005ab63d253", + "0xc2943d2b12e44ff193ad957440620e43fd9e8da22d74bd7e4b18846eb93fe67e", + "0xa461d24d7d4cc4fdb8016476b3d5e44017bc27609b7fd09136c3a884915c9761", + "0xdcbd32d171d8cd8702ec3093dc2f149c31542a7a35a01fa63043facfbf7ddea4", + "0xe7c4e881bd4df86737497ae6e3fd65fe9d953b8e1c45ef1cbba2d291be860dec", + "0x1fc56bf433f10fe704662c0f9e69a878f243d8832fe723852215f4d2ce51f9d5", + "0x5d22da26a003567829f9e2fcf0c2be4d0f791d44400936ff1132a0dc367c316e", + "0x985c40c0bda98d02e3bbf9e33d13be1ab4b1b917c94e06255a0d60de8a547513", + "0x5aacaa6e4aa6ec649fa272c1ae2cd0376270a0252c39d1bfdd973f03cacecef0", + "0xf2992b858c902441bd44cfe0e2b3057615b7ef6a7d129bf8402e4270b711b126", + "0x690eccebda6832cdab7adc9a56b5d8ad7842aba0d7dfa0aa073347d835e72703", + "0x41f48f7975d1aff8070e4d787b3bc127613fe74cc0207e6355d80c930577348a", + "0x42286416ff16e06c1b8088e484e1687ccb93c134a880e06ebc621cfd1fecfbd4", + "0x241f3e48bbd35c8743856e8020a2def871ffef7ba897c72464286419a8e67e28", + "0x3ba5d479584f036f4b4f99942a5bc2f51cc9c4af24527dc9ced5c66178fbec00", + "0xecef4c63d3679889106352d9e56b56b7aff5e1f1408e3dbe86e35dfe6ea6c97b", + "0x2a55f99801b5437fa85f91046e933d5cb898ee3150c6a068f658e0091a303576", + "0x0103857974871ee986d9d5d430b5c3533c0b1187353300d25dbecc2aef14cfac", + "0xe2721431cf8bcc77d5652b519e879d0cde2524972d74b6ce3e6a78eb0bdc5c80", + "0xb577b9c2b3348feb5bd8e283940c524d940268a3f90c11e35dc9de3438ff038f", + "0x5bf29a628a6ae340206e02f33eab362240f99ce0e3cd8d440d002ed4495252f4", + "0x5b087ac28a0e6555830f6510fd275bf464ee4d50e6848b251dac4b823de6b995", + "0xd6ca4c3a14090c0204fe4b9ac487debafbf0f984c289cded1de950f2e655abd5", + "0x61e776419693248d8a6b8bb2ef9b9663882b57e60650ea7fa22f1251e201befd", + "0x84d0ee42adb4c9b0e127535cf76a00a0d8129396f861d5d41dea599dbbff3d0b", + "0x509683f63b390fdfcbb699a8a30340abfb5425b257e86015170d7b7296b33548", + "0xe18de77507e00ff5a9097ae81007e793ca9abf2c11f65172c1cb54a189032d3c", + "0x38a8a3c1c0c110f674a7e69039258593e15a9194b1e77ebe6176ef5caf09c6f4", + "0x7e55232c46a25bc79bf9390c2b105d0fb342015cb526cf0decdb9db23d1be43a", + "0xb745498c642fb70abdc71c707bb1e4baabd534c5bc503e35545a6395cdb48918", + "0xa4b968ff3f3760b1fa4b352ca6eb8cc883f4c902f8e7baa2644d5a7726694031", + "0xee106b785aa0d24e57532819d4cb34b5795ab0af3080b38c73168ad565103b2c", + "0x1535e68531fad8e1edcfc2621747620ab962ad38a033ba25d1d6f5947381d03d", + "0x98c83d74aa9e52a7eae636a0fb54475173fddddbb56ca42dc314998c5099c649", + "0xdae0dbf33fc395f96a4dc1a8da5af3285b8dbabe5b34639e47c70b0938a9f64d", + "0x91348b33bec70e0e68756023f1432346ca2aebbb6a43df28b7388f6f9f19bc7e", + "0x575859a6c8463bacb07ff4902b06fe1c31ceb9552bd781003d4ea2e15dc81e4c", + "0xef1a187b7033a67ff5dc0cdfe353f81d8286c533669ed4b0c0ed5168f018cb19", + "0xc671086723929e889340d42392545c10126be24c357d509ff1c6c1a5f9a57d4d", + "0xf4f1fdaf74870f153ea8375391b3c446bc3cb9b428a3426164320c720d755daf", + "0x32caf4a46065b4094869812b25138ebed9b9fe17e27bed2f1e1f18485e29a5e4", + "0xb62d0e1a873015ebd2696616378f4f3f39c5e9396ddeb750110b7ef04f189222", + "0x410c675d1f6583e8364939108dc46223cd9835623473ca18dc333a4b86e69390", + "0xffd66aabe2768327036556eee6fde0c9bcfda2b13280decc37d82798075a0b75", + "0x3acda6ba4917e64e977f4135e8c74e9091499c212e6345c58c399b4dd31d6fd3", + "0xacccfad59b3f59f16431348a3078c1dc0b662876754c1f373351d0725dc1df84", + "0x3a74d9e98aff2b6445b9776cdc21c0dafba808326d917f47d57250f150891bc2", + "0xdd4e0bb3b84db7b6e16783870f7c9bc563cb1576834eb9175721eb9cf75f748d", + "0x35e9a92581c9d402a83a7baa67bb72fcd0d9b3f3d7b1b7a143234fdadd2e67d6", + "0x64ead38ff01f1fb408829012a033eb847aa6ce3e9b99dc5e866338aa9c355b4f", + "0x78607406421e95ff55b3b952d2b4846c8b2224b2a6b46d231482ccec5de407e0", + "0x04fb332ad235e8ec13b07cf30b1c1cb6ba8aba4031f932868fc1da5d82c03dfe", + "0x4fcbf75d2beff58cf1645f74c2ea804c29e1abb6ed8d33eb6da0f2f7939b3cc7", + "0xf58b87be3dde47b6a9615315d2eeda6771fa3b31bdc369ea706f7769bd857af8", + "0x7aa5b0a30ab24a79a54080b1b56befc3c88719219ca5cb004cd45d4ca1334dc4", + "0xd2f1129f7a6a0743995aea48e9c3cfdc5efde47398e6a67a634c1c9865b15366", + "0xca65cece85c379cfdd49b9ffc5ed7e9b8a623e06f99bbec608fc3725e4a1429e", + "0x2e6942d93dc94555d948f3358d7ffef3774889455de4da3565ff883a96a590ea", + "0x063dc2dab7f0c558eda8bf9baf3901e1626416f517352760180557bd45014f06", + "0xc633fc9bad22bf62c85d4ce1c064f3ec161014456c4eff5ee9ee197230aea32e", + "0xabab885f2c04a640062289106e7bef857389db6db0a499468b45f5e8147c5f14", + "0x96eb606a5d165dc66e5c293fa139a9e8e28fb1ddc8515279705afe7a57e318e9", + "0xacb239d8e12502e378326dad3b338700d359095129411ace179e5b921c07e731", + "0x8cf7148ce70d71a754bc04049ae797e930a9b16bf4962dd3eea2f13ac6f75776", + "0xf39d2ae39131332c16508e09eb9d507f4c6bdaa284d1f4a9315af8f6122186d0", + "0xcce4df2d5f9484177965c2440bc54d1fbd0429060e82bb76c3b90f444b5246c6", + "0xbe77cc749e5f436a3b76360998ba7e6e263d39fcf792a6dcd7cc4ea18c836990", + "0xcde5a6e02589515ebcc307e20dcbf163ec85e5692ad9542bab23b43de55c487a", + "0xe7977eaf5cd7cb8c7f4e86a2c3813d52943a12baecc76f2b9d1eeda569c29d85", + "0x1011e0ba87c36df65ecf37d2360f98e0d7351f27ed9199fd7df166806332c139", + "0x9e481944f0e07b91eefc66693b69ea71c852552cf8cdafb1bc93336b971d6989", + "0x2b4d369db84d19be84a7af630b0c8a4ce0974418f407463cad8a8223b208a82b", + "0x7cf34185f5e8229b657c57c3c775987128434e909d72d06956515440678e6a25", + "0x5956c7ee723b161a0e7d74c69e57c96ad28261e9d7358bf25bbc16560a8292a5", + "0xd9a932e6f59d547de8699965c4e5964e0f663b9fd5bb9f6dedb4417d356f234c", + "0x59f2fae38f9ae4b74ba9abc5f06d4354fb9eef65983b1c8b1b025720d1b47d51", + "0x1c418c58dd888b1a546a1245021b52e83b1bd3fcbdcd0fe9bd643fe05fde502b", + "0x0db806610e23383046de4a35f8098597f1889e4dde4bf40a244e4995324b29d7", + "0xed51baa16beffad522b677c19935f07d7182b0a4bdb04330146bba3d8e8f80c4", + "0x2ecce838cf6ac5d0589fea00bab4dc9c7b107ed7c70886ea6519807785096f23", + "0x8df70aa241b84fd616047258f87b04249fe23219808a6e14f3d9fd0181c2f352", + "0xddb9d88567f42cea65b5913369c9791522b4dc4a23b0afab2003dcba337a5595", + "0x2e276865fbc34e7035cd50dab4b9b72c980abf8f7dec50988b86995ec57ae497", + "0xe82487c950c00a1e4a9ac6d2c3d0b80584b44dc27d28d6352dcef8786da3a7b4", + "0x724b23460aeb403ae7f9b3512a1e222a63fe721a2ffa4e2f4f3062da8bb5c224", + "0xe27ede30590638e194e91a392993fd9a9a1f168e32e3b9144d71d46e507d716c", + "0xd29403c683d5b1ff60839587e60eea5a6054588903e7c2c0b6f9bf030bd0d659", + "0x4e9464c5a51b3f2c6a829137b67e266ea6381c069e1701f0bce7ae7742e9e49a", + "0x0b107abcfda0ec094a6946c6057564f60eea9e6a55b2c762d4af5a7ab7899c65", + "0x5f908c956864addc2b57f01074c567155bee41412da6d63ba72971ff2eb8114e", + "0x9c00e148df00d9fb2d5847bef0726a48507871baf12be51373a7bed2a0c43f70", + "0x63a2fc58db6de3a2de3bac57255503791c4204941fcf15549a7839ca8ce26efb", + "0xefd321eb79658c3706f6f2a18663361b3adda792fe9064de3785acd101535223", + "0xa73176de8f5b3a5bfe87273711cc35a042c191aa998dc5a67498b0287e54be82", + "0xb8e2f03d134651957c31c47fff8cee2998738a603267a12f665f577a450746f1", + "0x3276e6d7618e898d6a8e1f014ccf9e06000f7cbb279dc9d078dee38f93231d3a", + "0xd23b5d1399be075454bc8f3613377113a7b65b29c1bc1a515f9bbfcc30b88174", + "0xa577feae921d39efcafe8102252452202fca0532681c2967c06eb63d00d83294", + "0xbb2231f4d795b6ea3894d802ad5f303c19edd2a25dde9c3a21ed1b578726b51b", + "0x81700c9bee6a014df24ac76eeaa2a378ce7febde11903e62a3d223ef1eec39fb", + "0xa1e05fe31cd3a58a3c11cbe47fed738e0add5039a8f97275572c7f66431f3d6f", + "0x8b5d0ea77b923d4faca65b07c9621467f2c891a925ef07009353b9e7ed854760", + "0x3566b43040f753d8a18edf7b3c89d44a2a3565aa0280ec673718ee81b82df24e", + "0xdf0672dd1e1bdaba83c0abd1d7c41d420ecdcab0019cb89b3dc310bab32bc8b6", + "0x2ef7e245c518654108cbea643f8b050257b9d3c4927493671a3a094b1dd0674e", + "0x993a3c5fe23e9636f525a4e5ee514949c5113f3b4db21ffc993a8b6bc3a55332", + "0xa023919b4e8c34cd2a1c7dd1768eb8e856ad2a1f5b101c8fed88257fdede3804", + "0x247fa5256cd95b9cc4431fe13466483f0db6707bd2453b6374934e1edd034b18", + "0xe63370f2acf5893c39f3728b66907ddc78d9dc9947db14ed6a7b5a6a876c69d6", + "0x397eb84160515d8b2beb3d37d7dfe167fb907f8a1a6cfd7457b646b95a18e9df", + "0xd236e18de82fddf7cb7f6df91a4d08fc98d9aba622e50cda7499261d01d9bb9a", + "0x76a526408c824b6c9e8afc5a0d5e5492a71f30cee5d70b4306c2298d348f0caa", + "0x00525d5481988d4c4836dadc936aff84036d99aa42722057b35ebd933c61ef3c", + "0x94e54fe2e05dd7d7e4026c0048d5e64e5314f235607e568cea8c26bd31dc3f51", + "0xab1e0c92b35d49b687188518a7af63584cfb13a74c3a9ad800fd8e1a4541faa7", + "0x5e65f148c1a914b300aea241f07de5c43709c38d279ed118bcb40ab9a3a09226", + "0x9fc8a8843a0eef62d8c16d49c70cbf2f3fe84cc155cb741d647f17e2a664e7d1", + "0x8257ba8acf906e46b7cd0de0d7463ee96c62ccb7dcdbe0fff5fbb6bc0da28d74", + "0x2a57b487f4281cc28a5b107a643944796ef2416d7989ce879d06bfd6d4caffa9", + "0x0bdf8efb30c449b26d5c574000646ac316aff27fa49d6e20420a08e441ed5f96", + "0x5d3b67c6a6324936305f405067ae70a35146759278f77793e3f7c4b90ac0c7fc", + "0x156f094425a09a09f394075d02f5b5d5aa6794bb5cf62d824ece1c57d58ea993", + "0xe31782172a116b92ac0ea9de1cadb81c1586e05d5b3993f10f8f695469ff9e81", + "0xd8f85113147a72b1950948000d75d6005ae183997c798fbbf2dadc5c439be9aa", + "0x9bed32bbf1f626012985392906016db1c993fd8ef351f8c72e2ae832a2efdd66", + "0x1c6f7b17c8bd64e03d21ca9b6dc2df278cf0b8c8f6f60c60741659fe5b34af81", + "0xe41e4494cdfc0e92f16fe6ec78e19b9d8cc3db73700a1bb02fc7670c92e4df2e", + "0xca1032438230b4faea930fc0689dd966604487a8d3abbaf21554b3e078547fe2", + "0x2bb999d1acc6cc7449dc0cb965c3bdff42e49b8ddb09cde885174c45730bc2b6", + "0x4601be8295359bb23f6f09d7f053c637ab2ce7942b762ac55b1da6d312a765c9", + "0x13fcff0af19f7f11af35b360a0199bfe610a09864dd1d42b0a6570bac17803d1", + "0x31b567fe7d9e6a9a3c15c449e9aa0ab8f83a453beb2784132f25b0919abfb428", + "0xbd4af1360219156ba336fba9cababad31ee78e1393061e3ff62f7ac785c41f19", + "0x2e15f44010ce7a966dfd3fea57c5124c120cb60d80a635910c0b2feec59fa977", + "0x68ed80af93e72f7fd9198d036d8b995e5baeb0f97c6f2734379116a5814b601f", + "0x6aeaf5d0decd1a5c8eef52435bdad2a60cf1cc5f79e23b90b7afc0110d830a3d", + "0x349b95da9a3c65e1d34533bd08f8c95c934c49b7c20e6c7e38ce4db60239c94b", + "0x2a0053d5a61602e26d932534d5e9a753f75642edf1410b3ffd61076d27d5ec97", + "0xca53c9d106169cd3a7a870efd2c2c7118ff953b8aea5c5b9896dc2ff9b2c5d59", + "0xd227181ff80d67f95f4fa11f86b1bb5dfcf37385262d82d6025bdeecc6bf00bd", + "0xefa99cf897198be702eda71b3fecf4cc12a27e7c90a258c4230aa847b03e16a6", + "0x0788c17ea693a049784eec30b17c49e66e7a71175893a064db7bc6e85a0b536e", + "0xcf2bdf91c2f44cae1148ae027688f70ae27ee65b8c1159cbca3e41ab7755e5c0", + "0x32882f2cf31033d40d5069e68c799f3e3297a9915287fb317bcf657e078fe6d3", + "0x3401436cb69ba8552d4731fb2f734a9a659cb10ac666f374318420d3e299b98a", + "0x988943c9b35e50f6ab03dc275de1dc770aa32574cf9a90dd0c13e7263b46c129", + "0xc282d894a7e4346a492fe495319c5cc9abf0c7f95e28bdf985710f692c770520", + "0xd7f8e14bbf8c6061a0927e107f53123f78448b878b9562cb8113b5d93d2d9142", + "0xe2c995419467eb379ee043399d89bb13a7d316b9a680f9667dc9defc7fcab80b", + "0x567357333aa3c5cf6b1ba20a3514ad0e21eef11f5a5c4ec999048abb78c5ab7f", + "0xb9f31c6c771e610048dcb0f4553629481b6d243980e1ca9ec3d1400a56ef452e", + "0x924533f9da72137f96ba97b39a95c2c369dba0bb09658aea3a387f3141b5a34d", + "0x2f17e624e0f3213c2d953107e72aca40b5f764f4b31278c8ee32a000119aa3ed", + "0x8d301cf22181c65bd6db20ca01df6e3bf13864f88958fc04861c295a31b9a86f", + "0x3bdb760c302d348d16e634c07f437f793b888bc15fcae52c371675b7eec2e241", + "0xaa20ff689413c62b1d9854ed1c59b1629e9fcd9f99512bee40933e722e4d143f", + "0xd9d0f8cb5b86492abc172c0460cbd819d13c05f055cc1306af6285459223373b", + "0xe0ec50a77f89631ac2a1c38448a3e5d8ee739f1cbcb542b23116005ff0726679", + "0x90238eec2af4ab1e1445ab94f422f90c862afbfa8cd6bec154d2f6f40721a615", + "0x5c2350ae9bd5f2e2355c97b0340e96621bccd43e9a7e4e867ba1523f5a5178dc", + "0x896a7844bc430b330fc094554ef21c162e2c5c890b4525720a612c9f16bd80ac", + "0xc2aac353dfdf9d7ce52240f6b84e8fec9e66d4acbd77402fe7218f55fb76e834", + "0x840ca0ec7af88f0e26d3b9e54473fdfd038d5395165b22a935e941187d529136", + "0x5e1274869d1d7f072dcf83d631844ea7e750f90a6183262622f2db72eefbebc9", + "0xc217f1324e0ba4e36cbc896c2dd4418ca5bfa880cc64bfa913d6212cbcfe8a95", + "0xbd7893a4798b0838629ecbf21a8cea963df8920a792f5282604b59c536ca91bc", + "0x85b22d6088f30f1b262369f869a72e1354036363f70c8778b1560658abf75902", + "0x829935ff52d7148a3c5548bcfc72b736b184e4f4661b251e660313895432d66d", + "0x4b0d3238882111cc0065b1e2c9a71eeccb34876b4ddbcba989a47faff0f505f0", + "0xa619fdf363c41d69d2cd4c8063e3abedb18066b8cb6ed4fcddd99686d684f450", + "0x2dad790e3f5f6be580f97dd37b22a1e80a6555f41726bff0639aef54f0bc47e8", + "0xfe2064175fd61af4c646ff0745a79ad689d9be2969bcca0939393603865ccaa5", + "0x8a18e5e22dd996798181fdf8ae77cbc7929e5bffa0145996b00d83c5e7829c6f", + "0xa7adb5fc7ccbb132a8e22a861cb5e3e1940a4ec7c5add1bc767ecc668d1a84fc", + "0x7ea8e25d742691f53294dbfdac087b07d688cc40a4a2de28fb398b2516de4bfd", + "0xc162edab705ae176b26b495f7ef7205552319a72d56c5ded30be9770860d6530", + "0x5406de06f5e2e819ec8a7efda23e19cde88bf8ea9969e3e3393f1235c4be67ee", + "0xe5a6b4f946655b32549531601ba3571fbcc45bf58a7b18ea24b5f4677fd58815", + "0x5bf157c76ea5a10ca8240c44a72450537678bc949f57cb9a748b445907180d8f", + "0x4f2f7c966d440ab36a1ebf61ecb1a9b1ea4ea6227c29e4fc1214a8c63cee7d05", + "0x81dc3a0dcd5ae99dc7bcda8b30cfe89aee00094258891d445425e8e304a71f08", + "0x915c3f6e8b37680ccfa5dfa941ad2147fce2f99842646a7835e2d45e50e4d991", + "0xe616568cf1a281f42a32686b65dd712e2fd003a84dccbaec32b890440dd206ba", + "0x70526aaeb8a25dbdf93b3a7cf9cc638292f2502b7bf78125e88df90335e594a8", + "0x6b3e974c6a004beea5b38dea401870dd2a68c2902ea8b3ad5a8358e10f04eaf9", + "0x99b17fa583f9f80f81edae98fc54bd5552ad44aeeb6123e99670696541cd0442", + "0xcb13a1b63fb6f0b511876a699ac017aade97d8dec84249680e7e36b3729d9744", + "0x2bc84717485fb9eedb00647c8da26e201fcf05a0b5c42e2e03072ca130d1e3c5", + "0x7bd8ffc908159c25a28a3dd97064ee7a76bfa40628ac54066f83e904596562e5", + "0xb9d16b733cdefe95eed9fb024d5737f90723bdc46260f0aebe2adf23712ebb05", + "0x0d6a943a7bbad9fdbd107c4a1df726f7aa61de4bcf1e1c50c8a32d56828e8c72", + "0x7a264f356294d00e55ef0dd56e8ba793550c4366347d60c7cd31176d79dc8486", + "0xf52baa383738251b1085fd6aebdd0da48414bb993fd3bc427b2a07a6ace8d39f", + "0xe2958f9d5bc0f1b23b5a3923d87567a58dfa31cbc0a63715b76c501bcd022f65", + "0xa760fb572f3a44ac43c0cfb75becf5bec1d7dab5e33222050b95a6cb8938b146", + "0x004437e7463a43de8edcd074a4c2f03ce72e4716f88f03567a50b6440b69ef2f", + "0xd7268e9610100bddb2188bdb0f80ffbc479b67bda2ecbc5aaf18f947667f3ecb", + "0x176ac5d88148cdfd9049d3eca742750edf975c32e649be8372b15e43ce162d77", + "0x118df9c7631bfd903fb46cfa867c8ef861d9e828e6f57de585f17ad351819e25", + "0xea084c972d69e9ffb61665a27fa4f2d0006f0e220007c0b2e4760a95d68c6c01", + "0xd6e2a8f3df290a204efcadd3a34bf57eea6a3980fbb68749029660e661282f2b", + "0xc538e4c7b704fa8c1c123f8baca05bca5fda28df7ad7fec099638a4a7dd4fd18", + "0x419823e612d6a0055fe460ec9593b4fc0298ea94e0ce838fb302ff1ae033bf40", + "0x304e214664a6703ad14fa493ed333cd12f6db8f4f6af1223bf00a348fa3223e0", + "0x4de744c5af198cf5a0048c4a3c9ba578ea3478deae31531b87eba2a0e65b6fe6", + "0x523694986a7277170342c7a53bb710b86a432b0a7a3d96e141fbbbc113ac2e88", + "0xb81dcd531f4ea6eca82860d7f45063ca7de742a2fb41d7b6c1d62202fc1af17c", + "0x205a95c1d7e7d2cd684bb666dbaebd2533f4af28837a6fd2f6a7d4aa68816dbc", + "0x7c48dd0273a7207ceb5a8a1e3b33352f6d438e2a7b45d4c082dd85135e21e5e3", + "0x0e3edf65e5a7502793a8f139a69f3946d567a959ec411088af96da979047675c", + "0xa0b8886550aad717f1b5d57519a4bd82bdfa30e3c8ba4ff81a64be341d828aee", + "0x399f2cd7012257b4991343f191aa688915b4375899ca9519630b5ec6c62a8b49", + "0x56068dc17a965fad007ec7f23dec7d396dff33b0a60c4e9b8d0f75fb26178f05", + "0xbb62f47822b394fa87d70cce239c9e57464157fe2012c2c37e8f6b69515d6112", + "0xd6a068fdc6d4cd90203209a07363ee1eba047703e50ce9b06dab471e0dd1a037", + "0xe5a62c74d81ad110ea0ec13847fe64e4c3e8e48b1eb053f1e381abc0caff7bad", + "0x8ca95a015ea27a649b0bee134eb170f01b5c03cc45a8bb2c40557c1598c3892a", + "0xb124e101738d541ac61b5666c0fa19375417d946a2344ca40baf308fe8449a98", + "0x1b9543937289ca48720675ffd354464fecacd8b251a3f267f42906b7188f184d", + "0x0b48dd3eec04741e0f78cf61937b2f263446d4ba269e8c7d4aff9c00a2fafced", + "0xf72ffe4699fea49e7e67f96fb5688247746c9bf25fb58e41f02b0dde4a8003f9", + "0x08328b322ac26a02e89401565b91a3dd9abee62fe991744e2ecb2458c6c26460", + "0xe9dc223fdf695c9b5480de56cc91fa640a4b73a8cfeff30ecf4db4d36727fe21", + "0xa83123655348b15b947d83c14a241d8e303242614b25c45044fd1a1ee28d928e", + "0x14ac46b1f556ab33fd4199e5a46e0584d00bbcb2592ebfd4d4f66efffe31bfa3", + "0x71ad4b7b5605aebe1059ee484b5ec791e9018b50f92ad2f8d4f3c1548a99411b", + "0xcdde5fea3fec154058e16f7ef877c70404b577cd74f98f7dc45600cb7b598b04", + "0x330f9d20ddac508dcf0e08a4c1eddb55cb5d7f645c13f50b3683a41bced9e244", + "0x76de024aee0b03e96765dc6d7c71acbf253e962b4f3892b94196487821381ade", + "0x1c37a50f5e3c774d9ea4438a629d497705c3bae728e8e89608ee68d7cd2b53b5", + "0xe16a37be64f82bfe54595c9c51625ce3b69413b70e0b119a04e79c5b8d593c22", + "0x525afdc902879df4c23b996f34a5387fac6e41300e1a7cc9e24c630a1a140653", + "0x845164906086e678bfdafbf4719cf8f80d988bca007aece4b031c3ca5df08db6", + "0xa4d4bca2c51e8118d16a4b8ed33d41a73c275bef73072a6674005b9ee7bbb793", + "0xd0759f637aab37f4981b927e688f3e51f17cf90660931ab8bdfa40363a6931df", + "0xf54986144fa83bc3953c4a1c91eebd6a4abb185ab7b188cf7492a7ca430b9130", + "0xa31de426ecf5f98c1381c844e2fb7c959ad8adac39484d71e3bd07d3b1094118", + "0xf64fb1f4de6f01317e242b1198802191a6cdd39e1580d356b9e5442adb69c8ab", + "0xb97a74c8e47d37b3ce7c12ba09b53811f23dcaf4a8d260dd370f45e9ccbacc3a", + "0xf118ce791474d987b9a8d3290be077e8316a6fa3bfcda3600e6c2698264db37b", + "0x547fe45b0ca517f898e6a5fd22929cf533911f505e15de083a5685c8eb1ccd0b", + "0xd74d307e3b5a166a64056f07eb85f60fda1d9c17368a96afc6f8141141f85c86", + "0xa315936672e2737800c6d51fc22b56d918126ec329fa7e1ba5e31af36ea4f87f", + "0xe928505d97d673588a68a08ba6e2a4bc25843592598988c1d168d5c938e230cd", + "0xa6bbd3b96bd66597eb68c4059203275421a529c61471a69cdc1d2d9211aee400", + "0xa46efc7ab47e7a0f57a54203a039a4339d992207b31bc707eac98ade8e8f6fab", + "0x46e903455140f009d1f7e9d224ede2e29d1fb3f72cebeb60dfa64ff059b7ff40", + "0x1eeba50e5530be85464456af3ea0ee38855276ba79bebfe305e49fdebd0dc97c", + "0x30e149bba2c3c0db9038c39871325392bcb41169106131469b6ea7994c5d8d03", + "0x9503edfe4cfb20c38ba2efef043ad824f2b17f39e2ace445fd9ce73caec93c75", + "0x608f294da5e0df707b97c4949b775f64ef76c055459c26b651010888cb888037", + "0x8eb5960dc8e49951c41505ce34160bbd588bceb74468a7dc0898c6744d75138a", + "0xb020dd8cccb6beff1e7d996a740b876609a55ce2041ec0e9f09f683bfb22466c", + "0x9e8333dc01746341ff7181ae95ddb75748cf3efbbed24f3b16885efd0aa19da3", + "0x2a97bcddd5f0a7245c520bbabd77e48432c39f3cb17a0241be9c62ab5d185a1a", + "0xa81cdce57af311f79ae16dfad6808b40e8ece16115978131dde0f3edb29aabfa", + "0x8f321249562fcb94c94a80679adf69aa701f0719515753932548a89a28cdc7da", + "0xda37eaec19bd44bb1892d12d842a77ab7dc5ea43ca0a1a92aaa3ffed0ba9d90a", + "0xab8c920add1f9e922890da5d92ff199b384a5f042f5eb4e3fbe565f5ca50ffa8", + "0x9f52ff4d39142c046effbe6e552500886200c9c3154dc68abe0f9e4bdfa9078d", + "0x1eebaf84ba1e6667e825716be63ddc71a963688f47227e0d17d78144c820e17d", + "0xd2c2c19eacb26695c89b51b75fd616de5c769d0c7169794057575e1dff3800f8", + "0xc5ad683c4beaeb409a68cbaf81532e4edce6f64b60853725e493ffdd93e69f7d", + "0x768303ceca362b8a3996a4823c4d64ea4a4ca5892e91ab0433f2917b96486806", + "0x88e25c3ba8ac976c0382344f4a8fa310bcfc7f51e09efab4faaf222cf6dc5d67", + "0xe05f9dc2db75ce9b0fb59cf1ce12581cd10910dc5b91d744791f564bbb87e176", + "0xd75fad017be9f908c431987b10f25526a9c9d346118901d7e0b84e74a44724ff", + "0x83cd50c6634e2edf21044fe789e82850667862be407faeaa90f9bc3b0c60f9ed", + "0xdf6b6b1134dbe14a48678610c630ba5927f3d75d45d01e56534204b87ed575e5", + "0x3e486fed8ba04ace837ba81d61086b3443ec22a803cffaca18e10e0e0f1cf679", + "0x6b7c8f5e560ce6b6eb94ff8e4f811b06f2ba91048ebc2440e25f2c44eff4e637", + "0xa7a92f9396380b5ce01e3666acf035dc80a297448e1b95530b9a8bd9eb19496b", + "0x7df4150c891991e89a5938c12bcb4e4ca1a3bb3ed17e1d14930e78a3b7287cd6", + "0x9cff0374f59c5c0a8b6b8db636387e0d032922e34049356ab00ffa3f2cac8f23", + "0x85a5ca8ea29b19babb6aa45861de2cd9e44e31ff13f7161ead44139e6b2de019", + "0xe418e0eba34f07d10ba270bf4316b78b15c49d2a920f3370b403dc584cf2bccf", + "0x8500b89c737ce038eb99a443d4ed6dd02e00ab06c836b8f03de3e713e485e99e", + "0x0f324429900c3bb11cf6a0c4099148af93d8953b748fa8974c7cc5d942f6f36d", + "0xaffe95fb50dab84128becf268413fbf2c8ccbc2fde2b6f6d8bdad23cc4ed9312", + "0xcb93bb3ee92074161da7d6345022f415accea11b20c412cbac48247c64d099ae", + "0xb5044dbe63680e5fb8479f899caf746b778524a6c6ef3f56614d3b9832cf0006", + "0x1d9eb2e2fd6d8c78a5a4125733cbe69ff25b95cba736f63627bfab166f736c18", + "0x4bcdb35310f9e23c6b952933f3adb4adcf6b43dd88dcbf80dc2d9ed4f8cea505", + "0xf934917c926b2c975bb0cf0ee0eec66727da942e06c65ecb1e168c015f957a65", + "0x7375ee9c763fddfbbf6fe47b1db34faded65f5123dd92ff469d03a41f1fc47d4", + "0x6b4e2a1c3ad70f07688662e228faa861496294b068e21f040edf90cf9d0230bf", + "0xa64458a7d295ff66658de59d0f166a55dec1f9e9e2be6fc2a8ecdcb77b72509f", + "0x4e50f8712edd21e913834cbf4f8d6baf9b371f0d4592a0c6a11f70a8e95ccd26", + "0xa132bb777e81aa07f8d5a6696e3ec6c800a1c0743a946618d04df4b0668f1c8f", + "0xa552543fb7ce61cdaba1d077338aa31a6b69cbc7e6af69cb5443e2d4e1393cf8", + "0x05c451fa47938025e4fb6835d09e9a92f2db33cc99e21b44b98a1f3b0c6071c5", + "0xac9628c769038d220a38801a43aa1449c24b2277df287b04ebbb4082d1763f7b", + "0x6d188b8c97ecb2e45ff51e573fedeb95083b40c8ae15042289753ae65caeb681", + "0x0de60d18d4f052a11a584be1c4595430ea8f5c943dea397da9af2d27518e2646", + "0x02c7e9849aeadc3011c2d36d4f645aa0d3f23a27d19a8b7eec61e2ee723dc675", + "0x2c974900dc848a8a0eea1e248aa0e2469037038bf9c0768e6e46d2781530ac4a", + "0xbb4b7b7d9ae81c7784f6a8e7c309f30a9794f0240562ab889d4113bb1e775697", + "0x463ece715ed0458cdd0f12cec6ab023fb3a3cbf6eda4b55f3b4115921d20df52", + "0xd535c260190be6f755d84d8812697c8ad8801533b939dc95e2072e2f39066564", + "0x7f3a0e061e646047bab6b8dfa88b092ab003c0e84240dd82f6e7d407bd5a3bd8", + "0xaf4803ac72aa8419999b383e5765544cd61b5ca0071f7dce952d7c24d89ff8af", + "0x1c53d5aa090bb88a8302fefb12080eba29c2f9f198b08b073587049159cf4245", + "0xf71ee084795fb52661d5cb7957c7e710e6171683aa691412d5c816a764f61f64", + "0x9eb207ab5d1bc7d1a44afcb2790f32d7c41f1c54a17b277dedcd8ba1e63eaac5", + "0x2ba6c0454e857b17903fbe79d6396a472216ddd825b81d70c696074291e71b1f", + "0x899f295af86c53f6c27e75e6cb98cf428a5da102be6dd8a8e2e59b446a086a18", + "0xcda6ada90684f614c967b6fa4c37e6159522e2dee2fc8663b6a8478be5238165", + "0xa59f5518f36b97d9fd077f736de67de7856d515f5146d5b1ab1b2a36112c6400", + "0xe7265df96658699ef8781fba631750ab18dc9d62c0b24820e0538809d046a2f9", + "0x4d9fe46ea3b33b6e73cddbadbf8bee4aa31aa830c4a1abbba4567f21f78a014f", + "0xf5d3147fbe7420f7c55f6b06e045ee7d2b2e0ac7f2040ebc8183ef24108ad70e", + "0xc8dfe6d026040fedb27da79dcf77aaf83fdb008792c6366256d5988e356eeb94", + "0xeca183cd9a46eddf04e02e0a82fa295b1f56322e5552a7c7f0aad090d209b9d5", + "0x8e26a0ad84d0c8b5e64b8a57eebf3bb86bdd02e24f24ac95c6222959638a3037", + "0x5b1cdf956d672b244ecc6bd5a828cec7b80867a4ea2a547cf7240e39793cb5c1", + "0x48c8d0fa40f9f6a49fc6378152972b85cb984ec221384484148231ef88cc3a97", + "0xccf14e2b03037c17bd6d47ba41460aa54c826e945c0132692d08140f156fd115", + "0x331791c82f8717e22f27aa77b7530acc83beaaf9536cc74ddb90533327c5072e", + "0x6c621acf6c972322182e5431049874a5e78bbaaf1a3f49219fae2c8425d6b5b1", + "0x5bd86b4984df838b2ced1dd0f3e37ae19d52ab1002a8bea859065f8cdaf6bc38", + "0x3143ad07e92a4b2a24b6482b5502ce98d50df46923ace4845ca35e0948090363", + "0x66e2d61040285db2e895e1aac42b69b41f556e6fa82116c1e84b49e67478abbe", + "0xe4f3a6c6761a3e17a5a978c69d0a6688439d4d6de3bbafd2b830b5066d809e0b", + "0x034280d368d7bcbe1f1cc63bd551c3ac2406f612f8f04801d24f98d89e75c444", + "0x2b9ed64e419ea19e5dea807dbfc08b8d21bc13903e8888aaa15741c6c0481440", + "0x72630a380871aa5ec67bd06bd672fb0128b95499582be5d34a4073645d15eb6f", + "0x9ee6618d35b3fffd4abeee984f1e9f3fbd200e5f60c562cb0ae3200b8963f522", + "0xbb40172754ef37505f4ce8077382eed0c45b0f96c882ac26b7d209b951d7cfd1", + "0x76e973e45252e97e2cb31bb8b79424e5391c3e76893cc7be0c1c1101bbafb57b", + "0xa4218614e301d35b94bc536160007b9b88acb5c9987a44a27c514f6456b28be6", + "0x0227fa09131444917185f2cc802ed389687a4f968f99bb221148ab7effd5fd5e", + "0x0a93fa4f9590996785fd599bf2669b290e8eca7f02ca06aee9582357293a8493", + "0xe1a277823bc99e602027fd18db67550f0d5e60045b94bd2655e49531bb152f0c", + "0xfe8ac01e4e478b4019dad76813449f8155de23b4ba2a6e2091f4c8ba82508bba", + "0xb194b4f530b832a2ecdc88c1bf40580474847b91c300751c810bc5cc408095fc", + "0xf1de598992e61dcc7bc9e1f1490d80d10024c6319954aadae6a4df4ac54ea564", + "0x38138e224065ad8ed4af813bcbb35535bea444f99613d686f0ef4ff00c5a3fe8", + "0x13e6a7016f28c856d777e1a7f54bce788a3e21b129cc1b57d8e5ec21e6522d3c", + "0x1c5d57d845f18557e61b1b3761d9452eb26aed8041a4a3073097259546e2045b", + "0x536848934654d65ec83f7cf9a0f69adec6ae974b8e5944127ca819a30a20b012", + "0x1653d5a4610454d67236e8049dcee0b1a531e25d5c7f0bbce913a6a524a60db6", + "0x7bb7bd63c5985b492c4897d59223335537ed0f8928c5c7383b5ca7a6fa3c3cb2", + "0xe4b8e08d3444b8e14e390e219684a6085fa335d11c1c77c530582e2c3c4c8e55", + "0x5fb6b09c1ac68c1ad0fd2041c27f1fad5a83906d4aea5af0f965cf36bc3cca3b", + "0x40034a02507258439d490a5a282956f9ae304b4ea4730ad6386005c767eab5cf", + "0xec6ae08d9c0033901514ef409a7cf68e1a682a202dc97c5c467259c7b6022e2b", + "0x9082855abacd99a2b634ad1f50d8517b0f1b091cf5c649ba377aa3ad2eccb65e", + "0xf76c0b9744305baeee70b1e274f7eaaf3670b2217fff6655bf69968b5acac517", + "0x917198a97cb8f704471f6500aef3e6f014b09e8da719ee03e87f45c95605f2ae", + "0xfe1a48d29d6ddaec284dc0bca96cc874ecefbbb91b74c8ea6030a9bf80470c73", + "0x9ba5c60cee1a7d901f9832e3024ceb9db24460c6636b98df81d008d1678073c7", + "0x7cba18b1ee4fb25f1536708ad3f4c95c43d60930f67dc2cfaaffaee2f91fe1d8", + "0xbd2b278edd0e75c6a39aa2f43b334d8cbb52900c152b2b8e3ccf7f27221c0643", + "0x65c3a4efdb5a189b46db8b8ab60968f6c16c1b56f9f2311b3380c275b7914383", + "0x45de07d3860d9be6f7b90dfa928cdf0da9592c2054b00b774ba7608f3d99324f", + "0x91a4389a9bd65f3dbaf092a5a49f0dc2333bc5ec7b59c3a48cffe97ba52213c0", + "0xff9342e526815c132251c3202d20acaf0012be44ac7c47f7640f27fb6f2d249a", + "0x48854fe3580cd19aee63f0eda576f1af518f3ebfa9f87d24da87a89ba227acad", + "0x8d292c2072d5ef4f3ab12cefaa60e9b54433a0eb7303ee253408c19394345a4f", + "0x48007c06be01f79cda41ea5791e3ef4bb4e946d7af262b52cc74eb3e20e98a1a", + "0x36a39e5a3035ed57c8227571b2d57317ace61cb9c66dddde57a566d34eb7d894", + "0xca4446f6cfc51f82ded4f4c798da29fde3a3bfa1f30de6cd721ab459e570dcb2", + "0x82812417102865e04fcad17c1682c7608cfcb855267b4ecb8c1e0666537e6a9f", + "0x81ef7d9794f8bec6b04ab899cdfbf3ff735eaad06610258ef7f90c77c83d5387", + "0x4810726311224ee42f1969465daac6f12516fcbbfb26e9febf221fd8d1cfb41d", + "0xb39a309cdf26f5f2011a83a0c1840b61cc5bebfda385a479a6a20d872bd082bc", + "0xe5002eba07d8b69ba9470514d286ab800d28b443531349d641d9df57c3cc1399", + "0x662dc062bcbcf4f45759c85e8a0ff833564beea1ff3894d7c5286133b3615a9a", + "0xb2cca2f7a62870673c70313efe23bfdb57ff9e6bfbb9e73948288fa15a8a2f49", + "0xd9e38758784261f67700452e23a59ab25cf22dcead205a50685d5cb03442c81b", + "0x039acba436cc8d99337c16969a076577a50d609cb2986f42702199e3c2dfd8e1", + "0x7141bec6010aa3d5ad1d543f91a8b10ba3bdab7625fec8a7d404238c09893e48", + "0xe0a2f776956dd92600ed94088b7da0aa416ee83cef35d37063d3df2d3442173c", + "0x7e099f882fa8909a3f67cd5950346a00a20bd0678e7ccfaa03395bbe1a7bdb6b", + "0xb52e8fb670f5386581c89d4b01b0bec691b9e828c9fd8916708287b6c1d49f26", + "0x16b599c31ea0a2c2c23e2845cea74c73fc892f16a2b34091ad9ffc5d03e7f609", + "0x4c04bcbce2e30cb9fa64e6c776c8be2a4cea04512c9d70e2a5d8a377aa77ba76", + "0xad1f20b7e161337e3d7aba00d9dc3585569cd8ca932329b3df13fe5f23574f70", + "0x2961a4a19bee2dee47d9eef2f875e03fb75bbfc30473604c902e76c76620507d", + "0x666c0d915622aba83912b23cf5e48ac57219a8e592f09f9e224af94ed35cac7a", + "0xfa6e99ccb3460635ebbb7ba53b332825f9d5185dd10bc1e2eff5fb6de4fba746", + "0xd3bc3b194941ea52e2b31ac5ea1c789233dea804e24c15000332d41f8bb4a8c6", + "0x07281b9f1ab9e962d46f05c76f29b4f4ff3db35baa777c37c5dac6cd33d49a90", + "0x5bf61ee56f75630605881d34c11fc029f7c2eb96dae86c7dde18af8e34aa6c77", + "0x972d651e4903b97eabbe5a58440bd248eb2ab16a536da686a707770b88612d00", + "0xc953d9cf8cd4a68d7a2d9dfdc3bdad8bd0d511f63cbb2144af7227ba49084a71", + "0x9a90ca2c4dad5386cd71110de906f6d96f80934661afba440ce194e44e5a6036", + "0x8dd2c27d9b327b1a6e2216f561c09c276c9db44c3a87e6f8fe381d7a906c9769", + "0x17362077544107f34233c1fad77f12c9140d0f0f0a5206dd887bb9cf627a20dd", + "0x52afd7ffe299cbfe5f418612ecf625ab1c6debcfebc6bad2569c3b83aa1f9f55", + "0x6597cfda3deb8371e447690b5f90df042b72095551d347eb77b2ee55868634bd", + "0x97a7278a76d38714f16a5b3bae0910b18d2851b2519ef5dff0a791f471cff90e", + "0x0f4124bc20c9553612a8e78b90c80c1341a3a290054c75326753be6a103dae22", + "0xa42039e0a42da736e91ffbea82e58beaef7fa7d88263764611b73ed4775e222f", + "0x13f6c5b099ba6a2ed4701a8b3edd76c2645b68d9c2cf9af924da39bbaa2c18c1", + "0x939ddea54fc48f8c8dcc1ca6c04ff2cd70fd8da9e93abd3ed062da56b75a1110", + "0x3e66eecafa70c79675f26d259fa6718c646ce3828e80652134b792f0366f0c68", + "0xcf507596184c9c4a14286412216f771f0495ea5780bc372d12ba6e8445c67d69", + "0xee64dc03e5fa815ea5e9e3e4d2c87126c8e4c0ff56f1152c349e3f9327fbd5f7", + "0x3b6ba90d23473ab15afa76d95b23b2a86309b0d6e2edd3492c374020e544c820", + "0x51ffa382078573a9bb41ad67b775074ae41f9968e2b38341ae9a64a9f1f74815", + "0x6c3a7ec03f93b7d4b73d8b194ab38a23b512a236731b5e54b8b5bcf44aa05608", + "0x0082c925bab49c6ab52f9b996986123039fec2cd6641dcae3e3ea7d60bd7a2e6", + "0x85185f7d346260f24bad3c767a04bfdfb3356f61138b9fbafd7af0f813e1ddc1", + "0xeb5a6ef56f2926a533d3858eee37cbfb5b37e8fb5bd181cf61448e36d8b48dce", + "0x700da1f1e9339d6d55c54c62cc5523c30901162216c2f182f5f2ea66dcaf9620", + "0x84161dc26196b99ceeea8d64f6ef3d127982b934f49678f6a512c07534e8ab54", + "0xca3f434ced785e9b5922b625e1d2457b156372e4917b9d6c8f4f6a995182a176", + "0xaf62ff81c29e9102077eae515015286765592d454c8e15b0a302adefe22e998b", + "0xafa0ed60bf7417e6f74fa7a9c10ab7c7b0b1e94b699569b0e3f70ab01b234ebe", + "0xd2cdc3211869e030c3e291f4fe2f163ef54b24d7ff0bb4489d73a5159ceb461c", + "0xd74c2a92d3c506bcbc11c1bec086cc419fec1d0bca34d50b74b28f89e86cf864", + "0xcc25ec627504ed9f00af661c72990a36a2f9ee4c4507e5fa4def89303456d7eb", + "0x8edd1c1dcd064b7c693c978152209761cd6c92e449e9444e9dee807fd9f9f420", + "0x660e691453e374d0a584b184a5fdb85894290e1ccc68964a8292db53ca096505", + "0x9cc340e9d997cc319fdf2e00c75d80b80953a90049af766b1a499846c5e08bc4", + "0x58e650852eda00e55bc2d9e024a49b3b7a5d6d5092d837407114120ff143b75f", + "0x5426eb6b6b8965e80dab787befc815c6c430e80231e91fee5511062bb21c3e4f", + "0x4bb9b4512664884f7b63bf27ecc75e0a69e32cf2b980a8b9135e410871ce45ae", + "0x22438f10926c874196f8c65e274d018960cedb55ca43787e18adcb54631df7ce", + "0x68aca6a2e6a51c8543939fd10be02784b1149923652da3f07f91999b75be995a", + "0x12a77edd8cc051f6f991cd3912f5f4afa1e797f5daf010ab17b3925220b12e88", + "0x0d3b929dc2733de2865dab86cf42684e8430c2ed47d19606637f932caf8d2d13", + "0x69f8d5c233a251c35851354b8546d89c7c54012736440c8965c256cc9db7dce7", + "0x6757e97aa449d7878cbbddeec490fd0636b2c51d5b00bb61eb4836685d005d2e", + "0xe1029b22f6ded11ab5ce46aa2594ca90006a04e8848f4152fc40c27735217ac3", + "0xadc4af259ba86cfc93384f3c0eea61a4b661f015209064254bc6ecbcfdb74f5e", + "0x02ff4bd0ca8008db90a121deab0c36e45bfc7acdaccaeae04acf3aaf51716607", + "0x9df6ebb38ba3e1d0a3a82f871bacaf81152bce32265c0eaebd9d9e6026665b43", + "0xc25503a6058ef394c48d1153ee2e70a3d8e86e0a46b29ddd0217906d694a71d8", + "0x83698b68d762e75476caa87411797ebc0050f9296ec35664bcfd3aeffd01d8c6", + "0xb185832a5b8fb209b9a6772673cebb3dcdf3d915886282d6adc47376a48fb578", + "0x32ec2d0710f9681d75819f1e2c28e135b3272dbf1da08e4d64ab2e6ae1064cbc", + "0x13c8aa9abf04b6ec2553b171b58356a1c256563406ced1ff3c84a3ffdfb5c1d9", + "0x80aaed5609e1b594b3c54403ce9977dc558ad292ec472ac73c8d7f39243e116b", + "0x8cbee772d46586087fbbc9b4fe2f54ce2405d2483572bda3c2314e79ca0d8deb", + "0xfbfe6a938e7bb9b05d889f8182e8963344df0ac7b9022302b451b036da261f9b", + "0x39131379b64eb550fa0a2574d504bf7de0219d50e6d55cc82998ac8d2684df84", + "0x5fefe2fe1d509eae61cab218f1bd03196b1e631f5c416e5f2c0e9e54a3d44d98", + "0x5839c1c6580a4c04aa09dfde45ce4616b6f30d1ee794dd12fc745b96b2d48c84", + "0xa75d2328c4e63acdda579000e6df9be72d9348c2001e1927264b1a8c303fd292", + "0x7331a0cbfdfdc200cbbd1723bcad1f1ca6e0591c1ee025bf1842d91e4625c8c8", + "0xe9153c020aedc51102bb9b22a2493db4616364fce9b61681287dabeee881130a", + "0x53b7aad781bea92a14b670dfbf5acd8a55d2721a6146f099b904bbc176771b91", + "0x0de55190007ddb76fcb57cebee9b1ec60d52d150ac83beb66b088a86a234f9d9", + "0xc703435d06a2e1c5e52789daa3587b920cc2aeed658907bb7d6442693c65902d", + "0x6d21f9a28fd36d865af468e2c06ef5f41167f3014251a53aa1d2ea55896ca1e5", + "0x6b24cd5b8a48fd9dbe7e8ea6c492b57f3146009daaa108ae5d1199261cfc3914", + "0x40e49643d669f497785df1e601cb1bedc24ca348f86354d4032b1d4a4c6776b1", + "0xc56f0ff0aa22fa1e19d8785aac33805f7a7a01b48e953ebb126a4728cf502518", + "0xdce90cab31ee9f5a345d03464c69cc5dba71ee601bc22ccc8aae1eb442f3b29d", + "0xa551b514490e45b6669024b539f7bb37e6883ec97ff79744cf1f1c2ba1d21ec7", + "0xbadc6d33cd58aaeabb8b62396e102cdcb6b1ce9dbbf7051f937a890a3f69c2c6", + "0xe544b08143014287bb8d917f66e8f22f2a6deaf6ad4a3996426e2186b8bb56e0", + "0x6ed9b64beac26a5fbbd15c09c7eff96652b710670c2ce52a6856cd998521a27c", + "0x48c14f31b1fcbe0deb7816771f962cacbb7c2c219518f3ce52661a89e9928228", + "0x425fc1308118e8ade59df07136948a210786f8b2b6b0e51ea01ab06653822693", + "0xee9b2ef0dc1dd873a3ccdd77046969a4ae938e5ff39695b891c85921883c3277", + "0x25066a1abffdd64dab20529436c3d9a44e6e837d70b19847e355f63b5140c5c1", + "0x7441baf6efba832751b31b93c9b000d8bf552d0328415937d0a3c78595961ee0", + "0xd9219e7f07c0808d2596cb57e26793c1162ea9efe58305e3a26da6fdd57091cf", + "0x1b42d745a54c5e3c48a4911a27c263bbe42c8f038c826975749c1619c2e21cc9", + "0xc5abf3dcbcee854b06836237de3a461d86a8b76e8081926ca3078531e25556f4", + "0x7eafa90a352f95c8eaa914cfba0aa90db5ab1275d966da5fa445d9dd6ac6e0e3", + "0x4230ac1a58e4d9903022416041d5119991f911b41702d43c1caf0723cccb1d05", + "0xd50f2cae10a5cb3084c9f5ed1f9acfce8fdf3d920d89ef41165aa2522b97582a", + "0x6eabcebb9040f7d6791a0a560b987288d8246db9140b5f188c34a6be7fa17552", + "0xbbcb3c36f228d2589cd7097111ecd708e419bbe034ee6d9aa691d483590750d3", + "0x72eded80c21baaefddc61ecb70ab76cfc68ec8509b4f8786fcf25d037d75385f", + "0x2a01f9310e3116bf3527cf90de19bdc78d9cc677ef5c9bba94f3ec321d700a7f", + "0xfa401d300fed7092c91232a2bd8b0173ddb62b12e8e96a5076172abcd44ef858", + "0x984001b77e32ee2ac8d5678f77e6c425e6ab9fb2ea3f4978b6594b4499f893aa", + "0xfce80ebf8039984ced85b45b5ee5c240df0a6aab809d6bc0974a5b1007c77d4f", + "0x0a964a69795de761278c68843100ee547edea07d790d2efe64d975b65d415159", + "0x5ab1dee36283fc991e00fb52079c232f2d9bfa97377addd05c50fb06a09c11ab", + "0x47676449956192bbed4235f3162d06ba3095aecb9f57d9c8a273052278582fc2", + "0x4e43d79f07711fd4d4a8dfc576f08d954b5d6829dbbb59ae4386b34221472966", + "0x8f5cce2a573190694302db226a2b22a89f4487a4f509ec1a759646d0d5face7b", + "0xe10a0419bb270359d2c190014afc1fe52f8df9454f7a8e0fe205309e5a3b33e7", + "0x4626c976a572110230c540dcedce33a5bbb97919867aaf0520128ceec2e9d8f3", + "0x057b497c49e4b2ba614280de64dd91118172ae4b4646c3031a93fce200c8a234", + "0x8350ba4e211602c38812276000b1caec40dc4376176afcac43eaa96d7af30d1f", + "0x9e93fd7b9b9ca98f26945dd5716ee2a6274f8586d14f05854a0f7f25c80541ce", + "0x9f11403407548c359164f3f93265f12ee390ff3b3631ec7b90b98922dfda2343", + "0x714cca7ddeaeaf302fc0ebf50fd072c89f063061ea329e67c809d62ea9f5fed2", + "0x9c088fa9b25f7a5ca635db39b3c95da6859a5941eb1ae3e4f4717013fe740cba", + "0x634542af50119e4adb4d72bec5d0e3b095df21e76865f683346e1bd544922f69", + "0x2a1fdccea29581063da7db3f2aeca7087ec646b11f1d47e6d48d1dea0122fdb6", + "0x156e283ab987a5da12710b459097b5fe3d79db296551fa289632c0d3f9b33ba8", + "0x3eaa070ffd835043d4b2b25d5e7280f030c615b2bbdcaf3ee12a2b2b4c620747", + "0x863d5bddbffaa9f0ef9f696ac5a7f91191b5cb52383e1d0c0e0d5a60332c8728", + "0x4e29095ca17d15099abb1c6c1eb43cdd6dfed160a7d11731f4d1115beaacc7b1", + "0xa46f6ce03354ca96ddfbfa9e1406dc7ab99b0b4ff1ca5e0346f3ce91338bafa7", + "0x9f19f494df488b250ba31e243c9098fbb7db5801a3f76b219d866bec32d009d5", + "0x763dfe2f87eb816d1bad1ba95448619041cdb3cfb1171063c043d1e02d9f6ca6", + "0xf8ed4dc0fc0c03b964eede54ede5e96a940cc85e1ef2191c11465f2f1e3f6f0d", + "0x04f0d8ff18d26b490f137f23144c1ca0e475e74a7f1599fd2f6a4972a3d1c215", + "0x012ead673926ef6b3d2cbc5332a7bbe5dac977ada6065313e90975360dfaff3e", + "0x773ccf0a297a22c43b29f1bad214ac9e3685a5d0bf1df7d49fd4b92065ee7b04", + "0x10b7f56b8cc84f4be7533ec00ae46c7ba852f8d093c889b7edd46d36c819abae", + "0xd70605a437bfc6a4cc3468f0eb6d59b293d4ebbcd7979eda36f02baa48e68d25", + "0x68a93b7685277a1ca51a341517d10ec1f03c3018dc4d99da00624d4eeb3db229", + "0xef8aef04d3b7771e8519952b4e067503abe6b2698411299edbe7dc22a79c39b7", + "0x8e72feb3f31eb9f13645a089efd4eaf6871bec26a9ee91452db0464a7e6bc5e6", + "0x3189fb0be615c0f2e2758400050e2657e3197546a15039e595b091cefc9e0d7b", + "0xfe444b821fdfb12248cbf371192783e4e0ea0a938f5ac7b205e15cac991b6c98", + "0x0329c441b6c6c56d76de552ad43596760d37262011d97bd91e595dd559e53de2", + "0xbecff3658ca19ed610e826a68621e7b5cf2ece293ff13fe3f0c57c3390954af8", + "0x695b87703e7299f3e862740bbf47ebf026e5330171509fa0927c361935ff612b", + "0xf90373fabdb83b403f67cc50d79aa37fc26d73ce8fda798e96c4a4b17440e2cc", + "0x536eee69a1cf54af816f4eb5d08ccaacfbbaaa165451d0a5e8b93b2e872c59ec", + "0x17b56635255ddc2278cbb7e7139cf7a8f6e2e55581c451cf53b5b53aa89f985b", + "0xb4a14da295a0cc51076c48032fc1cdbaefff2380a428eb03f6b068aee99a8fcf", + "0xd3cb3797197a398711299f816f34b7c98aafc8a845298287b4522cb0fd645b01", + "0x55aea7b1fd7bf0864b577e38a89c153ae8653da26c72f53a05d164b9da327a67", + "0xd4eb63ebc06549dd7419012d4bae13890716430efb843175a9270a6c517ea612", + "0x6958093bd81e477479a53443b0c95c11d8791b282d028bd9a6204af0c1f738f4", + "0x505f55a445b93a2ba8d5ac5531370e2bf760db44509f15d2f243175b12a7016c", + "0x4608a060b7bf832310eb73a157d285ad824b07d78bb471ea89ebf421d735d566", + "0x68c88d220d8ac23e19459d650594dde939aedcd75325ca2314b7a9419b938c37", + "0x891a1154ddc1e3239b1100840e1303e0627a53ad501996e56891839b54becc93", + "0x8b943abf7a572dd64da3c4e58c1f34f6f7a905fe7ce652a044ab8983ac45fced", + "0x06b07efee0be55002f485ec0526336fec4a7f825ff7eda3f954e8cc7068207f8", + "0xcafe52ca4b5198fb4e4e24f4c04ad12eb8c9f3ebf9a35ebc0014e25dd7bf5970", + "0xe0ed792746b780ba8e19ebedfd3922ca937fd5b8c28b03e0fb91789cedc0fafa", + "0xfd7ea98fb764223ca3c587820eda0a0d68301979313ea9cf0113508a05fba7d6", + "0xa874e6edabaf6da36996b6387bda14d12c3eafa026b1ca6ad5f1f4cae67855ac", + "0x29d7c85005517eaf1165be4921deea5afdae1f66b670d7de0981c4e502acbf1d", + "0x949318f8059937f207ea564672c86943c2c9bb86ca81a3b0a9523e7bee00a5b5", + "0x200dc199c37d16b25e207165c5576596266ce8b62aa8a9c6cd66d69d52c1a67d", + "0xd29108a106a8a5a87b5282467a0e8d37f74c2ae53e6dc11ad63005f3f3f878c4", + "0x44ebfaad5b4ce81fda3d4194c87b46e9e31fbdbf0ad28fe00cffa73f78d3957b", + "0x6843e2f6d3d56b55251ef7ceeb635226940dfdd698215f5d5a4c3e88ede5c0a4", + "0xb84d57422889adc19626aad033b38b6968aafbf4c6d0881a0ef5fb5932c6ab44", + "0x842626b82b93a54a3a1765ef6257a0c74e1ad2981d8da41fd8305adbac99bc76", + "0xeb347385fa0bb37b8d5d17ab60e6c2ed4bfd19210503d61beb88b71d8bf9adda", + "0x509a54bd689b7011504e835081bb9d3cbddd8592ad80da399689bc9172b48a27", + "0xafc5c51176c7222097b12310a3ee5513a7660491682ff1fcae5d168d2c19c3aa", + "0x406e9fa3f6687fa6519067e213377a5ff7875f6f0a3080880536ed395555ad30", + "0x2624c181d4ee1775bf687b522a36a7b9bb754ff6e40ef12363c7d675b60f3d04", + "0xd5c32eb980158772133a99d0af96e056726ed89be84289cb5fc1d083d48cc407", + "0x7b1c5cfee09aba12ae0742d9bc1cc2630bf8c1e141033b18724a524c2c1b7c2c", + "0x77b4b55b236cb7d27c77063a280eabbeba0d7171759fbf851f40b6ddbf7171df", + "0xa04791b79cad41718cd8a0bf604b0e956aa85230381070f842667d88760c0de7", + "0xb1558e574944d9e8910da9c34ed51d89caabbf6541f077a55ef2ae3c513a1e02", + "0x3ef8620edf05514c4e90c1eeb0a896ef30573f963a7507ee90eb76e4334412b3", + "0xfff99365402379af3e56fc9b999d316cea7a1f388623433cbcfef0ddcb6f9d4a", + "0x99fca466439472d08ea602bafc67d1d097e486b5e41b5a059818021f612e889e", + "0x094436d10026f1c57f04846690a0444646b762eef1fc0420c6e3f5cf5b845e14", + "0xc57923978a9dffe0812618f2f6420f30ee927658f9f1615ef7cad4519b90eda1", + "0x3a20d5e138cac29e3fa031847086bc62e5f90a5e363a70fd52e2602545faf9ec", + "0xf3b0bd1d597eb2b6ad98fbdcec7dec2639b92bc83c33db4fced5d23e6ddb64a2", + "0x0d5bbdf1dc7d52fddbb3e81e2d757b848f9e79b6847ee8d30352d4b01ba927f2", + "0xf8f51ff9cfdf6b2ad5609a68433c012c92cabeb3053335d784b1baac087516b8", + "0x5777236f251506c22a92f371e4ad3c78bedae22c4527ed5e796727512bc2b8e6", + "0x228bea6da7246c2dc862d9de97bbf824df6396cec583a4db71667306c5f6a02b", + "0x67ccfda86cfccbb139d77d8d2acf0d4bd980b507acd9bfdda6b5af6e10493df7", + "0xfd8f9ab200dd111c04803f62145fd82e6a79221776904be20a90c1c6328cfdaf", + "0xcd8ce973cbfa8a91a55ec09ac9acad4cfdd050b598349b996d252ecb3935d277", + "0xfe8067acaad74db589275d3122d84f04f717cfda870d444872824300ea10f969", + "0x4112ee457d4108c37121ef4ff0ceb1a4c7db3a9e3776d647225bf0838153356a", + "0xadb045193cb85002f2868c1ffd672bb93e60ed2841ad368bc8399e92c996229e", + "0x4243b3645b99ab1468bc421309220529d8ab204542c6901ce618ceb32b93becc", + "0x434e3c4da46b052402d465220e27d0e243bb5b116967d4baffc9325e326c9900", + "0xceeadbd91caca5832cace1624baa5f67b0d18f725627702cbd7e19ae3c691712", + "0xac54af2cdd95c862b3d9115c9550231f75ca8d6f6e607038850892daf1dd6643", + "0xc4ff21314ba2cac393c67982362a39b7ec96192fe37c316bdd4cbc692f729ffd", + "0xc84746b891e6dd8aac32b2ed0b373172df4ef375afe7e4ab826532b6b3fa9680", + "0x0b0e01ec97c12e488829d13dc1fd420c08475dc95d1fcd72c066d76220af055f", + "0xf0b54fcb4a3e075f391bfe937dd6b4f7481877182ddd4413e8b70efc63aa7f40", + "0x1a78c5cca33184c9e404a05f61cc56968b924d9d34b7ca6d573563eb250fc691", + "0x37ca206f795c02f45abc34380d67b15aa48122444fc444d4b307ab2f7f30a9e1", + "0xe03c444efd29f8d7c89b480ffbcb996a642ac6205ae43bdbb815ba1968051e36", + "0x2fcaf6ef7c22cebd36ccfdb037e66d9113d0965f3b5b89d597d91b490019471f", + "0x11a06d63b3395d09a048aee4d4291c0a6ab2d5f07a7667362890ce647153c2d2", + "0xc33a74c178ef5460b53a9a81aee02d3b42612acea7adb853ef74cd6b65f36efe", + "0xcce38b309fd919a930d38c7c7a7bc828e5039c22a7f3f858fd99c5d44b8cdb2d", + "0xc470e1078c305a5eaf7311d7ff652e24c9dbed83c3572a1c2ec7f6fce5788b0b", + "0xa29b6d0bf49a64182aebecc190a9a0b06931096d9984e7e6da9800ce17f7cea9", + "0xab0821217488504e1c255343939d109353c79298b04c69ff65152dd0e934022f", + "0x40c7bf4dd5a2d39c0dff9fb3bec5c8247093cc1bd55a8087d83f5fa7c8a35b31", + "0x3387ef8b199a2656c39407d503b9bd1571714e178d1dc7b1a74bc43cf88ca201", + "0xa5b2b8b2d708d97666281684641b611efc792f7c0cb27e053eb06752661b35f3", + "0xb604a4b7c3661098d4644239295cb9f6e456854651a5b289a2f4b65e33964232", + "0x4bf93500c257f054e6a6f993f344917215c9c943589644474f5cf98950b8fa46", + "0xa9ae0b7679a65498eeb2b460fe678c3452043bafc344eeb393ff1d930dd8751c", + "0xf21e50f55d7be256d14dba4f8909879cdaa3926b03da9ffa0c63ec3c9df34c48", + "0x88e1e824c968441ebf88b31f7a24fa5cd4e8985ec82fce5eeb13b3a30845e146", + "0x85d5206b3136bee840dbbf8d3d2302694dca2d5397aadcc34e1c1d6accac0354", + "0x00f68e845a2331a0704037d75361831d5a0079af3c6186ecaf256bf1da923c27", + "0x64c594c02b35bd5f69beb236ccc08140838c30b67a1576d2780123e29e073849", + "0x93f6540af637f1a630a8aaeaa86d046e09348320ca5103ebe2222f747a5acfc6", + "0xf9b4b9461b765b449191c7ee1acaad88d4dd7260e2b826c75d506a908fe71e6b", + "0x86aff1c986fbad8da2ca9de6315222459e9c47c58fd7f1a543e6719c566af5e3", + "0x68629388371ceb2a08bf7e335cde88a1bad7127990b44135058d62dfac258107", + "0x9b81d6745d5ab0a3459d26b97ab8f19fb38bd38c758a0ef106a025d091f6f9ba", + "0x2b42455bb30c387315cdf205a8a178ae4bd2d2e221fbfe4be55f5b364fe9a7bb", + "0x555e4dafa7d5d3f209d70a5c954da144ef231638f4a63715152bbfa4fbf82b4c", + "0x5d779a8f08d68794723fb5e95bafd7004685ec21d2cbae0e5ea728b36418dc36", + "0x7e5163ea9b1c0494aa997997422b02404a13b690257757f87f69bb42f81ba28e", + "0x3814efbbbfd4001641da7d5c93483f96467d55aa8b5b2aa6f980bb12a0dab6cc", + "0x431b7452a8157e3a6cf89a5a85d22127a1282877750519a8cf95e172c654c3cc", + "0x77ad2749e61c96fa868c7764ea626baef8a1bba56d3a3106e981869f9736ca76", + "0x7c069d14a86017ac36cb9007fc9bfe75ca92cd2522dcfd7bbf9d85c5133ed8c4", + "0x21dd48139667872fa67c98430f68e8d38c2948f19fff534ab2a5b8e0b92a4d51", + "0xcbc2dad5151367e6533963061712ee325f08e7df3cc7fa73eb5220cb32a2ec4b", + "0x398fa6f8d2b76d482a0c312bbf48ba8dbe9fb8ae06245da60ac68ce50f42638c", + "0x4ca92096314fe1d2d8e07aae3df39a6237e718c1396e88f3c0b73fb3124c89b6", + "0x3ae030ef952e2da7b29aacb08fc41776a44fa5a6c42e745d8b7991ff82566730", + "0xb4ef4b02dc130cea24a71a6053639238db2db30d4752dd3fcab1d98442fc3f94", + "0xa6256dc24acc6de428f47aab0b65a1f36855c7f0834a3e730d10a3c0c8d2bc49", + "0x9d8c8bfedbcf9552ba9eaa08a61846c52e240ceff531e7b19415ca148781ebcf", + "0xc6737357b53db7d2a14d7e7d4130fe6a516fce1dd0c7716be6137d93e21ceae3", + "0xafa9d3182fe6246f6c8d7b96852bc5dc200e8c3a97ce7d262a18c2fdaf5bf2b7", + "0x8064a1ee1eb4ddbf301fc983a03fa2983bc3743602bbb96d7fa6ef85780ba79b", + "0xc4616fb2fd5381efb37719cd9998c5051966b254abbdbe12228b2210c6f79116", + "0x05c30fff77a3d751853e3ae4c11678755c0afea16480a94bd99d61ac894300e6", + "0x47757d0104771c7e288f383bbbab1eeca2fc752d11989674305898e047a71bae", + "0xcc0f857a7617c16da7d35363cfc0af0ecccd9b1870ffdf1a2b2e2224ef81f876", + "0xab3a1b65f93df60eaff5df9e0bc1d91152d34d3428961c207f36ac3a94f61257", + "0xd0cd178507f1c3bdcfb7b528933f2d6227933bee2614636f3add19a66cc089e0", + "0x6379b65e140eed64020f496a95c36b3c27ea10387f78e0faccc5b4018f8f73fe", + "0x3b6977a571ac8d59bde2e851fec4384fea35a8d3905735fc8b8f2a8cfa6adcbe", + "0x2f193712529ecc908ee0a61172ec7839a9168cb424d8f108e7d7cc356bf20cf6", + "0xfa3e48832d13748aba9128bf6bfc76652cac371e49945fc33c941a9b294f7033", + "0x7086c7711a91271d7e38998715b4a142d7ec107accecf29f4518efe9f3333c4e", + "0x05c126586f4a2c1dc5814d07f158513d42282726918f71bcd1b4e0b67ee944b6", + "0xb7cc1efbf6880a60abe6b20f80bfe2ff3aa59de805ad964f8a7c5ed3bcefdcc9", + "0x64189964cba347ac35018ed9169ae64b78c3d0430145017cce83d78667b648d6", + "0xf6b1d09181b9fd18a0efa47c15631a6aa0eb01613a5fd1068834c4079e1a95e3", + "0xe760b5c16aaf587bee263f348f9adff4e04628b94ef27c828cc7155ebd3ac902", + "0x523a2c0fae8b2408ffe1c3b43e0aa7991b82336ed136e84c3f7d458d31143fe3", + "0xcc6d742b22b4fe3f41cf783a2f6f8dfc97a4b33866cd4bdfb27b05bc2ed39162", + "0x4d4ae86d282ec414a574370458c99e189062a3a48dc59a8e8e2a44790ce9b841", + "0x6fcba6a9469de1db92468f2b58b3b82c5080698aca4403ba8ecd1cfebd12b657", + "0xe7b584b0bcca0a5a119c8b2cddcc7a73c94f6f6a58503ddba7b0335815302f11", + "0xb1edda9625ea65b96a4485e10c798c707f6926e4ac2b51340a6f9d212a71a737", + "0xd8e2a94d4c0937a2033dc3b70b50934cb5b2ab54f57336cd6a8882af9f14b8cd", + "0x93ec08aaf09bd453c2b53cc7d9aff059681e0c23044f99569d0ea649cc7b885c", + "0x8ea82c1ca6be16616b62a8dbd88c75217470092063e0494419a6a926279230c1", + "0x175d030004e718f39b3986daa3beaf2e1a523583e529d6e90d117cbc844c647c", + "0x34cfcabda8b4f51cce74befb08f6a2e9ce884175f33fab59f26c60085ea73a92", + "0xd0570fbc17dc030bf6e7e3619d56ad2e866868939e4e5b23258adb191997b4f1", + "0x83245688ccb6e6f1b541930a3134d3141ef01a5f9b3f55f0321039b9d4a3cc1a", + "0xd782158768560d84ebc21d8e4f270f30055203b2d83c46ccf53ff8890e833fad", + "0xdaf31d5afb20a502b28329ecf1aadfdd16b4fd9118b10f9bebfe6f986a902dc1", + "0x0e24b26cdfc345d98a6d6dc3f4e3aa2629aab6fb2ca3820a78d58b10b09deb72", + "0x895f7a9b16ef1d1933c009b38a35a41632d00735a906b035f7fbdcaff1665295", + "0x70ee8681968778cb7da20dd794b75f08eda6b4b6e4aa653464436ff3685c6186", + "0x569f51cf2b92bde98085c2c167b773fbb9917a35844059696a1a97e378b5b577", + "0x4ee20277fbe5d2e616dc0b170e40d5b62cd8dd9f058c648e8e0d636316be7e00", + "0x1224d7eb3ae847458af472b19d3b0ddb90ce822f3389619487e68f3ce08cf6d7", + "0x57fb6d2ad5a75648449c99a46d92570b1dd74757dc1c0c11fe4923748eeb1711", + "0xa4ebbd26ed7dce135ce61bea0da82b8262d4a5319a7ab9c94527a7c670752b67", + "0x1533f0c29bd8a7b8d90c4c0755fc0b018439291566dc33bc816c8ca21269c63c", + "0x9cb5a5d41061a2168c0a8175d2712cd82d27cc777a015158c2fab0751e192d25", + "0x479f0a41aa04509beacb2eace213d9375393f583d384dd4e69b5b921c681c845", + "0x5791638640c821778349fc3064f6c5215f973f2b4f098ab38fc2138f6a8700b4", + "0xaeb1dc9ba82aa0c9ef266d1beaeeb5c756fb497607ee680c0a161b89cec21d26", + "0xb13f56956bc48a6b0760639488463cf403ed47f6d94c7b6e5a6de1d3d35800c8", + "0xfeccfb58d300594be16cbc9b5502ce851de36e15d62164317ef6e3dd9d72015f", + "0x3b218812b3219e243f99c6d23f24ba2b70e91b6a1e9bd27a5d3c83622c176b2e", + "0xfc8f86579345c5fba8e86d1263b3e9d01dafacd0c7347fff348c9a661925180d", + "0x50c6d100a8c0977d24c78bb58021df17c880a36f1ed118a0806d1aab347e3b42", + "0xd18166f82e90410a556744042badaebf3282c65d3c1fd81cf7e599695436b2d6", + "0x8f47f418fa13eee50b9a97781a02cc6a8b6818389f1b1f9b94aac17897ef1bb4", + "0xa4b3f32d84a547f66ca91ec35deacb2d5cb4da741059c01419b60b8d526d8a15", + "0x3187128246074cff2e8c0928dfc6b29294b0ad3f2ab839e7ba6d0b72f4f078ea", + "0x213988ced1828cfe0021da680b166b7d830b66a795613953589604d09b58bd5e", + "0x343c1581b9d75f1f72a787a29dba31a73384364672f0a06ec6d675bbc5b81beb", + "0x59a9da5a92994baba7e27688505df673c7131f4de43e6d174389124463eaa0b9", + "0x15c6b483253806002ed293f89d86d66314e55fdc32633f3e15dbd73dacdbde1b", + "0x01c22d029f765b941eb772991d3ef50458319d49ecd1e237ae0d61a05b7ff0cc", + "0x62f5ede9e4ac720b4fb34c239953b3289cb77e4e7bfb5268925727f5d21f0c75", + "0xe330297f6aceac790b3f4741efcaa4e58fbe1c61dd52c1d9bf99220803132553", + "0x47073de2812458f45fb789cb1a6d57f9ae772a38deb7dfd4c8c21c383cae3cb4", + "0x9e5dfc6bfe32b5f56c9799aad47fe1a01746fc9edc5d8583dbd1c0a1f7f81246", + "0x1d9a6fd76fc6a6f359fd917582f6a1af617b0b21984fe7038c323802660fe1fd", + "0x6f50b828af00200b81d65e14f07f8c34a5d485056b017146699fb8ac4ebc39ea", + "0xa8b15957d1dea63b64c56d3e40dffcbeacc5c9b8e35d27cd66f61f5c293def93", + "0x0ec32ee93cc52258a0de9eb53f48132b7101abd3de242b9319e791bc4205f57d", + "0x4405dae679f464fda0959884464e47f7d21e21d69288b66c35878560deefd6b6", + "0x1e490b1858da4d82632f376234e04ef4cae529c3307f3dcc5f5b893e38a418b6", + "0x4683e9dde5e2d66da4c288452eb653e2e6ee3a611f36cf2c80e5870c187c28e4", + "0xa657cd63ffa0cc282221e70ee3dc8a7f2e9eed9b8544f25467208b1954bc1f4b", + "0xd8ce555f85b979a26f207bc1e86d1463ab77f8c7e5f5b3c7db6d79785e388662", + "0xf604274a19dbc99c4c079ac4caed9fafd49c123226c3c223a53aff7f7b253b9c", + "0x4edf0d0aa873fedea6dbe3ad1dfa8a2b5e312e2c2b51c464c9af60a5a5c588c3", + "0x5ee990ce5c4e5eda4d80885409624af7b8075bf7349f386a40e03ae64b578707", + "0x3d34e4bb3284428153db9216319a83c3940ee95d0a47d963dd079a46d14ca105", + "0x7503687ea102d05d92bbcd2397eaa1edb42f757a0ceffd3abc871d2d895214db", + "0x7e7201b9fc6176b6ef993dea53732f335efb98abfa3d92462231bb6a5186bf16", + "0x1ab3a0afd0338ee34e047c60cb2c766521b3085658ae2e019c0688c2397bcfc8", + "0x68b5df43d045043400e3583c4ed125ef0df6f1617e30693525f68fede915349b", + "0x201fe9c6fe4cefb948972c644fb9d67634e30529589b4de597f9335bbd6dc8ba", + "0xdc09d73232f082162df780069a77f180bb30d8b736457b0c746c3e0a29d7dbf6", + "0x7c33f90910049812c0a87aa8321c97320ca8953f654f8ff7b6e3982b13e2cc32", + "0x5658b211c7a5a9d8d66be179b8d6039c6fcb5b5c9d232d4655e536e21fade31e", + "0xebfa63617d9055c50466157b9d8d0c16ae58f02df12f4e23f4bc09304701391e", + "0xb29f737d036e5d7164786e62b14d1f9c427792fc4faba265efc59360129aeba9", + "0xa1271a340258127b442c103959fd8d5f6369487c16575d90f9f1267fc3f78456", + "0x1d5e62fc56da958eaced4c2e6a58ad4acd3e978eeeb0f417e4a4078c6014a8de", + "0x4357d167c61da7d4d0b3f1646508a859d8270842cbf1f1f9f082d8f713da3904", + "0xd9556c35934ffc3ad2970a448d8caacc43e452b509f2cce4cf755b19d888b674", + "0x248efe4782d57127bdeb94420062b742031a4bd51c41d36375a9671b279b1e09", + "0x94d06fff869c9923ce5f524c3ccff9d9609b0b36562f47c65c7f8568d3f9207f", + "0xdea7e81ac2b15c4b145dfe132a1dd41300fae3a86eee16f936f46df16f33c686", + "0x733fb7f221502d0f10a13a5ab0473d50746afc5ed442dd69b4f9378abd304e87", + "0xc680bee47e540c3d706cf461399fcc1d7a6749b4b9f6808afa099c52d28cc6b1", + "0xadf685a187510063c7cf4b3ef6ae478705af7b4dd6c3c4080239ddcb6b069b3c", + "0x4ec68b78bfaa971ad03296b71dca45e36852f04f0cf6d0e8ea681c4d32ef6d64", + "0x407017242e04da4a1d4b16d59c59526a172e18d1d7abd4a343ac28ac883298b1", + "0xc92af4b5d045a6b02f2df7cf5a23173d969c447d7c006457a5be7f0251446488", + "0xfb8367fe9396d369332684b2fa3fad1603c7b572dbc00377bfcef0021192a52f", + "0x1d73c88199bc153c932ba313175344b436b28e5e0b39c3353d076c7e26fe843d", + "0x253fc1aca7544fb93d493684be03d3667628b5a0f3f516d7981e3a01e6656440", + "0xb8fb006c1de093ae15658b7be4b6625d5c6d14a5c4dd2623ac9a31e2479d32dc", + "0xb46abb8860cdd8ae411231d897af8269057060cb43880e52e63254f698af82e2", + "0xefb736142ceab502aeccd9df17018719d1004b554154edc5ac62ec45830a0d30", + "0xd9ce776c58f4e1eaf1ca20f61232d3063e98fee3ba0b078e5ba34736a16a7e35", + "0xb63a06ab391813bcf830a53febcf9553f292e097f127ab610745742f12ff7a02", + "0x225004609e0edef06ede2d08f490ef3616b1c5976027dd03f329605bfbf8a916", + "0x748f462a0fceb4743d8b03de6ecad430fbf35d957483b04e04609e9527fa37bf", + "0xf13227684614cb92591a4c0381ebb87b0e52bd21cfa265b501e231d8c3a0e504", + "0xdb56e9aa8ede4b7b042f32190ea90757dd9268457d43231d1a384bc6da5d6396", + "0xb4880cd0f5e5ef6e30e5c015fad427e418ae0efc70d084b7b6d342e1cb71ed2b", + "0x8a59bdfc0413acf03c39f473bd09b34223b109556c4e0fe976a30bdb1b944c52", + "0xfc2f062e32c3fce97a5f3922d3bb5c0842ea02a71775d6852e256ed0143ccb51", + "0xdc3ba03348f62599f9928101c65a8f13e2eabc09a377ed461636e48cc9e0a5a7", + "0xc5b2ac69eb80b3f2ee751ad4aa8e2eb2cc939e81586088986cf9d6e420330de4", + "0xd6d389727a18def7ce0bcaf65417e3d7543b1381b1b49c6f128f3e13f7d3eb74", + "0x02f48b5d43397b1f22bc7617ffd4d93254744b7fb872c051ef8a02698ebddc5e", + "0x90f674e478cf1dd60cccaa750363efe18cb4ed54415db0ea917a09d3d78a1778", + "0x98bc38a5b90450f89255564e3fb825c53d5fcb5eb9dfd9c07485ed6c42aa3f87", + "0x5b70c7cd74a8a92567686c5785657688f3f864b10d2ed8d9f21f004af2d0a3c5", + "0xb153280a3c86e119b7a03dfc4c8cedf79bdd41ee6128b3f5fda20cc83daa39a6", + "0xea4c28d38762dafc3c6716a760883e33666560cd05173d3844e7e280a6d8188a", + "0x8b498049e107092deee810a68bf8914e00d6759a7e62c8d6fda1c5b1531ff72d", + "0xcbcba70e0a5bb3ddb84e1b115432f025a71f2824061cceba494cb917c689f452", + "0x5906b23bc6b56c4e91706c5204d8873d17252c0291585fe4cad030ab6171e710", + "0xce634ca362c4acf53cf9fc68f0e7c8b199b7f3a1f5a2f9cc1c58a31f9650bea8", + "0x840f429289a783b9b4f8e0f575d1bbf0d2f4b00e09ca6dc83abd17d9718ad688", + "0xace326fc69d8ff3746bfede0d167206d3df6093315f3e3cfca8d41a857c20b52", + "0x905d81ceddb8f4301e62a871e29f1f08769336d7c0b94821b12668354af31fa9", + "0x8decc0ea30a4102baac7ccb3e50e15d50102f05f4a3102ee01a0a275d2c51ccd", + "0x56b67da5e38cfc995831754a64f0ce636f060d51c11b746aefac13638bafddb4", + "0x6672660064846341aa343879a40c5b29f10ebd8120c59bc76af66bd86b96cdf1", + "0x3600a734f1b1df6fe6dfd1cf49d8072bab86717bc5f2d276668c1a482e62acce", + "0x28e4ff2dbfe40b374a103ef1bb9e577c0f2cf1186ba3db324286ec490fd02fab", + "0xcc814edcf5ea3fa138fa7d5e387747334c3ad2095ff08465d7e533250430e25a", + "0x1aa1447a8db11875dc7ff7aa49d6927bc31f3b63cd88d2d937f53b1d85e448ac", + "0xa78c6871cc93ff6db876cff3755a59f8fac71e06c89ffc1200de6da08f56dfb5", + "0xf3c259454de9dd21788084bcbcf1cf0953bf7710bd797295fdfecfebd584d4bb", + "0xf86c0f1dbfb94dbce7368211fd3b19875fc831a422989340bce63102a2af3ac6", + "0xbd192dc3426a9b2fa33e2808a258e9bc27e1f14906b9ba9ec973ce604d9ea8ff", + "0xabd37b505d353f7042ef2ea28168f9d6be1a229bcd5ecdd4d69a96663a169446", + "0xf0f05dba6971b57e32e017285fecd48094e6044584889690dd6e0d70c62c3f67", + "0x15a8053e0694262c4954d8110c505ca101898fb5a5814ae8bcd35b8f24d6f90c", + "0x3f8c3d5b5a03f514d0b2f79fcdf7ea58eca2f85651932220362ec9ab50448aac", + "0xdadb41f6e17beff092dbb9a6dd57d3d0951a188fd041f60e455d63755134fc48", + "0x4017f006a6eec8c71840f7051e91dbcb6b18e52fa43529df1121980670f77350", + "0x358dee5f49761fbfe7e6694144a2de8e33614669da6b773fbfa2e330668f4e90", + "0x080216884b389a463ab63c12640f82f442fca56803b2bd7be45ed789db6c7371", + "0x5eb35f253d864713fbe058df986d8af27badce432ebfda59810f096b4e5126d2", + "0xa18c044fdebbe991e181140df95076de9cc5a70c2656ae99ef68e3c1532d7a14", + "0x69af193591c3eb53b00e9fadb149172df458a9e99f403352fcf866bf1456c6b7", + "0xf3a769187ea83cb9d2a96293ec8c9f2074e8231356d3cabe7669aba13f9509f9", + "0x5f26f2aab6b2a0b0f64312d243b7e3dc80621e134fe08f8189b135cfe7d9b2bc", + "0xd3edb5f8556c1a4983450a7d5ecc26a3dbdd332882dd63822e7c8cfb3712b828", + "0x6fd2e87efa3e7d4fb943852a358a515037af5c5eb9da73c3e3dbceb63106d2db", + "0xe574ee1110f966de904fb61d82995be95f3092511eee8195150099cf69fc7129", + "0x6d9c9b7b400d1f5c07aab8f4d23233d26e19feca2279f814729f122c01189c03", + "0xf0756f64317e10b276c71a678b5b62ca94e354c9b8d1ed7019a022be23fa6645", + "0x106402792c6b9f57f4b471736376a153d12ebab21e4bf034b6732324a1fa4561", + "0x33f10f38b702a617e0598cb20bd5df0067ac5ff155cd6b445f1abe46ee3d625f", + "0xffbfbf3aba272f7b978c9815e9e17972786c24fdee8f9167a47e85e9be60a613", + "0x9ed9567c8720d1450b2b0e45195c5a836484a18746e5d5a0bcbffe0b511ad075", + "0xa6ca434a876c017f522aa24937cd4dc1534da3fab47ec57e22ea7d2ad555fb60", + "0x2aec2650b00fa5886b61b1d7c4390dd4e5fd39097e9ed5b1714b741c7b0d4cff", + "0x0cab7259658221598aa39b98d9bd40e18c777ac3b11f6bc7799615c99858efd1", + "0xd76a13ba9212ef2ba4374b265d0405e41ef7016cd14197a2f7a9071e6d4e0a5c", + "0x2802a2d30f42fcb2c953ac6a83212c23711988998eb7f537f9807751b42652bd", + "0xb971ad9aee88adae769dad238a7044c996ee35596cc1b2a7f6e876eaeb4aa80c", + "0x524520c4c947c57827359ffc5a23c4926262c002e6c92d024ea7926a7e0a8fd6", + "0x0de58ec745307c9a36d5f3e97108f666ac58d86b85ce31e73b69579e913d300c", + "0xc0cd603660568434bfa04f6a06342e5fd78c6d916fb8dd77dbfe060cbaf02aef", + "0xde928fdfb8515d944a26630fdafeaf4b3a17dc40b08418097a465fc2009c2938", + "0x11dcbdd72f1b46be2a24dfa6a3cbd8024b6e05f8fe5cacb35618429d9918dec6", + "0xbac41ac48726fc1708a5fff1a06e674a64b8c3a906ec9beb7ff9a444903798c6", + "0x16142a81797daae5fa1914a473f0b89465b0078c5c042f6e1accab6d3ea77376", + "0x6535db5ab7dadf1187ab7c6f0e0a56fdb47a6e6c8f45627ab993b88eb09e7d1d", + "0xa476955c4d2810e17add2ac9604869e9067998fdce26685fd6cf422f861687dd", + "0x4b2ad0b366c96bdba812d3dad76f432dce8f0e8be1943ed92ee4478e9496d8a3", + "0x74bf0384fd4b8afa1bbc0fb0cb6543442a6bb041911a817b55bfa60fb9039733", + "0x5c3da2ac9d4284456d13270fe7d160178cdf61be8bbcbe8a8536da815ee70107", + "0x62da3f7efe7d1de45be7d134d290f9b3dd50e45e751290d870a4b232496ee71d", + "0xd130203c98355022ffd5389a6e84cdd8fa0c570ac887d80ccff892c168a49c4b", + "0xfe129ea286e85269736b508aca4471e643c4d84864809d031dffd660243e2f4d", + "0x69a60dbee253142008ed0cbde35b425e4a2d07545571d2646a5d2a03f36cbf51", + "0x1e2355fe638bd71688579e07145f147384ae18220c8324f95c54ba994b033cde", + "0x391020697dd4cf20f8afb4b76b25f2e08b5f77be696c2406ee45d0d8499adcfd", + "0xbac11283e3e355ef3466ca3dc7d604ca002e26a98b76caf134ea86efb1523eeb", + "0x328b03bf254908db475888105015b638e7b16a4743bb235b85b160e430feee28", + "0xe9450fb3b361bac3eefe1cbe97a096218c40ccf4530a669ff9e10207c69b26ff", + "0xa574c9dc2d563152d012a1931352ec3b9116f949197efad0868a53fe79a2afc9", + "0x629d3aa0c10926f4bf5d250b44fa6959e534444d9f0e8fcf5b206a78ab5974db", + "0xe1e7bfc1e38f36cc8a094038ffa44ad0ff7432c508516e7a8b3520d71714c608", + "0x13ac2b375558ac0582ec61c4edfbdaebb268efb3dd736b6483530db77b266c2a", + "0xa2ec61b999d453a53aa33105a90d310a5afd6f9df76966c53fe524100515da05", + "0xac58616f19436e53d5eed7b50162713711a3f9a76266ede35da4411008de1b4b", + "0xbe8d7a38169e1a92a1ffa712af5173d5cc18948a477a4db917a7f8cd7013d6de", + "0xfc6997785c292450bdc3dfcf9d0609efaa2eb780a6cb33fbc911efc18325c1bc", + "0xb0d71a0c1c3b2f1a746f8cb70fcb99695950ea488216f83854cb267f88c993bc", + "0xa41cb69cbb562b104aefb77c9f0b0b2a7b43b92c7e1bb40c6e781f3667e78c3a", + "0xc3dbaa1d46c2bfadf7b69d5930e00b3d2ee2f0e459310eb9414be6e7d8fdfbf2", + "0xabf64b834999a679f71fa66acc622afa69a45bdf0befe5c8e0224ee12cd3214d", + "0xf788f916838793b4efc5cc80d9f29f717b9a84e877773dd4791fd6a0c1cdfc56", + "0x289de39a57b30662c600ef8056dd354c67722e1fe198ec2bb749c2af77a27643", + "0x580829bdf1584a58d7da444d360dd552818dd1cfd5f7ff4323d21a0c13506b5f", + "0xba51c5ed86b5303e52a3b618f78614bc1640b1b145e87fe625b51ed80d31017a", + "0xeef60ce9f49954e62854e938873e556386b5045a57980bab45e6fbe6a6e9c657", + "0x655bfa2d02761722b8792ee69367dbf3103d16ed0d07f7f8ff6725dcb8f2d955", + "0xc7a54faf2898c69f76123fe1910bef9be9ecd77509ac74714218c9bb8b4204f0", + "0xf59ca122bb48dc6c0c577b04449bb64d7a1ff5661a016bf50e32005f3295b223", + "0xd96401f3f5031c1aceb13d9a3a0525b5bcb7afe47424a5b76e8381732e789a4d", + "0xc74fb4d8533d438c78710932c95500923716fdfa6625154320625465ee32f07d", + "0x63ba1efd6ee8de3b07dd2863eda5d46070f7eb02d35cf670f7b132e16a958bcb", + "0x61eea2352d91b206a674c4c2af59d8a2a0fa70479d77447e3ee9b7db85d353a8", + "0x04b60e8ed3b12a7fab29bb6a74ab7c9a33d403662c47e72227e7eab515f33618", + "0x9c229a533ba459b852dbce6d96bb72c03f9829b9a984119cc4e1c852992bd2f9", + "0x54695b023a34947fae5230256ba2b0905d3e28a28f02c2764f70495d71441a63", + "0x2c47d3759d9df5b9330e6836835939107269d70a7d465be651a3845e4a1903e1", + "0x5fb3708137f2cd39aefe87c67a6c4f9cb60a9945cfb769ea71d0dbb7f3ee8cba", + "0xacba51629f86d56e806aac1561bec11a697a05f6dd182ebdaa906ff77aee7abc", + "0x30ef858593f9a35889c8c036eda78d012e298cde4a3e7e603282b7f8130a4595", + "0x1c11971b18e9c870e513d099e5a49615e409a255725a61083001313a1d929658", + "0x9c6e3731ca9cee43af8c299c02eb49760141e74e1f781d1ba49b6815565f3ce4", + "0xb59c0d2e7c5ca751b9abf8b7740d8d5c8a6fb1799dd1d5a5e9f0ba75769fb2a0", + "0xafbe8a18d07a30f3ecdb907eb4cc05fdd8df2f9e4e91e61f88ab87dbcca25249", + "0x5233d2380755af7c385b5b50d79c5cd9b1255f0145a36245cc6dab7a86c0cbce", + "0x54520d2d08116f06e38d1a316e7e4080f3bd8c4e52b06f3ec20c3a5327f88adc", + "0xd36158eb493e04911fe79cdf4c48dd43a42aa3a23568c7a6b06afafd3ceb51fa", + "0x88a509ee3b2bcebe15ede2063f8fc9a04fe103a84551f279b6ce8d4d36d3b259", + "0xb1b80927c19a8cd540d126e07c52aec2206eaa37a13f2ab4726649d34357879e", + "0x83b1534ad48437dfc54412e49357b13528f0f80dcc32555a2b6f2391cedecbd9", + "0x13d00415b9888e8f64bd3110b04bd47125a96abfe52e0b6ec004c96e142eca1c", + "0x9e3b31cc2715b383eac51b52a3d912e22d3c1f23fa883028ace6a1e80b1c02c1", + "0xcbd325f1c10db1289d1c46feadabc59b24ffbeefbc4f242cecc3dc0dbe5c2e8d", + "0x7627582f663394f8284a6636bf024683547863409f38cb6ec4f67224eaeaa2b4", + "0xa4a44ba1e2badbb513cdd55fafbe2f5741caf2132dd46c602172711c110e41bd", + "0xc7612fd67e5d4bfcd14eb631181977f5b6737855721aa42bf4e9252dec190a53", + "0xbe3030a24be5db7244f04c43dbf419db3c7fde7e7a2f87951cc74df9b88a4071", + "0xab77045cc03cfb77d55f118f15b3416f8f118327e78ae4cc8a074b3c8550f992", + "0x0fccd266f83598b42b88c40c54670e3f2ab3a4c8bbcc0b4effec5ba92e0f26e1", + "0x5285dfd8a25356ebc198835359f53cb86608d1058a90b20980748eaf5efa2ac7", + "0x182bd336222d0cfa5fa9a0d8f4ca769e2d45829af50bc3a454193628e073b44c", + "0xf1a20eabf959a3c1135943378f31a69c049529785e0556a45450174237d8a2ff", + "0x69387452eb76800b6cb66231cf58dc180bae7aed04ab182dcc3845cb1abfee73", + "0x5136ee55850f0aacbc26fe7bcb58a74ea738ae6edc56bdced078297e8ae44087", + "0x37eb930540d64aaf250e003ad0c2274cd047eae6c28bb861bd880cb53aa972e1", + "0x82d64719d65ec1c1dcb0d269222b1acfe77326ee7d901c8bbc542b7696d98de0", + "0xfbbef382c42f25021b7b5787fe6ee0feb1e589310c615cf26642ae507f2e8e07", + "0xa2da021c8e8ac265fd7c181ca94b372375b3c297aab51811494c07a96536d4e1", + "0x7ca0d6023b41793f7a4dad7aa65428e43332f9fe40efb62c1e74253bf64a28f2", + "0xfbe923af0120629c5dc3c118350d1ae310844e0df4cb8ed48decd520fa7b38bc", + "0x3c7efb35e8c27c90cfc06a18160b34b772a5818cb79a1bf62b107ce93cdee33c", + "0xf59c8f80367b98738620c50a44cad556d73ce17a5cc1f403528d72a52fde5375", + "0x7173aafc1f35fc4eaaabb61d26f908a8d0d834252b951f5607a8cda0c97cd79d", + "0x7ccf293b0d2ab799ce9fc487187d61eef099801d8731fa21300bc1b166c11788", + "0x6ed0dde1a0e7bb58435bb525d897d1a9abaf03f235cceee32f3987e1863d94a5", + "0x5a5d21f5ae95355ccf41cbaad953150d3f1231de6df6650cc712cc57f77fb7d5", + "0x7731f59f98388e028b194d16478c9315050555889c30242a836e84e5f27aff60", + "0xfa682bb7f35f7a75c9490c074b1ef4c99afc50f1e32d829c057c765deb899638", + "0x10403d6937901a289c468f7eedfd69d38fea6c6b468f63bd7cb17cd8db4a22d6", + "0xc5ede1b02d3841558bd8ab6f51e14f5a4e6b00daa31f982874f0bad7132465a6", + "0xbf01b8033add1db5cd02633cf114492800816bf01ad4c7e060ae4c9ffe92c13c", + "0x72d22a8029386eb9c26dc3277e08676609385cc2f9addd4095fc1de0ca6bbb17", + "0xbb77dd7851cc4cc50551914a62c71f8b8e2ad7fcb700469a6b893810b7d71a69", + "0x6ffbe73f30d4dc914a859911afea236c9540920e5fc6ea35a5b15baced0c8d7b", + "0x2d06f3ac10ce2d780f52e9f8dcfeed80bed8c4fb628e8169290bf35b59fce156", + "0x1f6c2f6010356f6a37b0217433d7a1f5a2e0cf51c41b6ae6de4afb236fe4b5eb", + "0x011c13ffb7e71e32bbd4517b994856f6d21b7ecf43d117b8642cfaac37b9a8d7", + "0xe2613913bc4cd8dc69550d32163b251cb1e6ab37d65eb71b3aacd05713158157", + "0x54247c638b2b1fe4efaeb4eb101d5177c84c975c759ddb1ac20207341818c6f1", + "0x34fa5ed94aec05a24c812403ad050ccc96d7a052b0d9509cbbdf83503589e3f1", + "0xd4c86048683eecb1e595cf76988e76be819488421c56b96a6dd4641efddf4de3", + "0x541b476f9a0273fba6340f7185c2ce43333de04bdf3c1a7ed022edf4372b2d0d", + "0x65319f2394a1b531beb788f72246a6035539816c618867b0e1d0fa3baf318d38", + "0xcc6b6ebd1eb606210f5d03e191f303c1c4a438b9fd7b81f61c38da76a6bf9fe2", + "0x66c0dd3e062f95edbf9b26189a302e46ceb5cfedbbd50e43139bdbcfe9fa2b54", + "0x728f5ccd05bef6a64b639ff86642f71078719f442915496c430dcd17b437139e", + "0x85a856f40e911384e7a7a42fc5d9197e063bbb890a81382b4ca6ce2e78af2c77", + "0xc80aed20cda1826d775271f2160b6040682095e51d7deaad7405a2f1c801f980", + "0x95576e4497c07a1738d07bd468e65d251f9876c957d7efab7ab7ed0a6eb2c9b4", + "0xc30785c899138565d799884aa7bc486f1a803901b6b8b8b66eb6d97ca597d8bf", + "0x3990fd6682fee93631fa80ce6cfc68fa57e25850860d4d982d0945f72ad37f38", + "0xa136539e69b53ffb451c817c40776af735c95f3392d24d906b22c0e6c6114be5", + "0x8fdb4d50398d776ef876ce77547d4d9e1a4609be5432121ca1dba983ba07a28c", + "0xc7a547ac0db666820263a76b9f9adac876b972b22d6c8bac407ad6fa5c839987", + "0x87aa61ed60484044960beec4d9c45c9112e6e4a70cfec894d5a9f93f94060acb", + "0x50b05f8c5a72944787041204b8a8acb39faf179838116e04ee7bad4d6f21d4c6", + "0x8b90f04539dfb2aec48e0f7a47a1ec601af5414f3284074911eca3a3afc36e3b", + "0x3f9b8f28853028fbd3cb0bebf22a723907600bc2c616ac5251fff33b2df5e9b9", + "0xcd7153ad8c35638d23fb26282ab9361361fd23385ebb9693d8d628a75aec6c07", + "0x370788f25ab289cbd7f9a4b238bd35efb41917b771d8d59493a05aa7bcb3fa4d", + "0x942223044ff0bb9ae56f259006787e5ae6f21f46a3a2bf11c0e977fa60b50b7e", + "0x7dc0e910fa0a6d722dc78f17644842792e619d7e7c044ad47a5fa32583686e9a", + "0x669d80d664251cffc5c7289ae2195a0cbc6fcc732c2af1bf429a4aa98c889520", + "0xd6d24bd4d8a639ac36b14c6d8599ee8ef5d84ab71dd7e6ab829b730d930ce924", + "0xba692b11b9febad8099415d1c0761f2a339328e598d9e04533103afac8c04dbe", + "0x8e9f7d1c6c2674b3139ff88faffe8339e45d72212234b4531654accd66ee3d4e", + "0x2589b94b36fec67b5862871758f86c2773a963197b0d7ba9984427da3b4d6042", + "0xb7d1c1c35718c23dd4498571bb0f4727f3ebb0e1cd02d8094f4713fc0e858894", + "0xe222068e575041014f38e20a85ef1e989e9bb05279281c59569a627769b9d7f8", + "0xb0746c8dbf22e4fcf025fe5383fba7865fd02f79a4403d89753052bb9118e3ed", + "0xbccfcf626a8e36b6eecbadad1870358088b3e584ce79741bf5167380e97f5e9c", + "0x6215dd20373041734291e4dcac34b207235a5d19c3bd24359168d75778b6dd5d", + "0x025f64d258d97752e9b648e956d114c8defccb80c8810113a3522a77ef3f7d35", + "0xc00ffb03dc524d1ea1984eecfb8d26d860791cdde35c8b262faab927891e3fef", + "0x4ec39fa070e38fb24c41af52ae2ac640a859c61c96661d24e53c817228863abb", + "0x7d943dbec346b6bf55c226cae23ee23086185d9377fad511103bfdda3d677ddb", + "0xbfb16c7a87172cc804008bced344dd6c1105a7f0e925f3b7335b6b4d7c8def25", + "0x359acc4a540fb3b54fe22d81f1e3c1b969a99129e130e9e4e24481d024cc81fd", + "0x33091ed3e9f0e50c8c9aa100d9615e8523d594a99095e83863a58cf54332edc6", + "0x5eeb88207a02fe01699c8796b66ad3a0827432559690bf42e76ce1c7f23c0b30", + "0xf5a521239d0f969c8b5c372b84f739af314645de36efd1190f92973c0a2f9098", + "0x1a634f2d829a24589a25a01a22b139b8342c7aad990a14b5e30715d2a83074ce", + "0xc5f62552f5e25ce475af7eea51eba85991c59b73da75eaaccc3e5571b58a6372", + "0x9fb29bce2aff82c7d3eceb134cb1d5c6e6b309b8a9be5d239e6c6dbe231fca32", + "0xac3e3a2edae826437228f39859aea596a84253070a5e442e04adfd5504b9a108", + "0x717d4b6b147ee5eb42baed2a926241dbaed7e6426aae40972488c08430659d20", + "0xe18c4e7cec87f2e53f1e10683835563bb05e182596fd5252017efdf7d29411cd", + "0x6ddc0db9f04fe0b7f8417507afe16b59479303b5473563723b390149a5f09b2c", + "0xfbb88e97efd86e451817b13e55fe3d310edcb302607127808ffb350799631ccf", + "0x5f61ece4f330c3eb3647d2cf9ceb4f3cf238a324bfff628257ac4aa1de7f1663", + "0xa2a3bd77e36c3ede311ef3fe330e4a2b22dd41313ff4ff6347f629777a88377e", + "0xbed3c97e0d2dc6e56006bcbdeb007c8b63e060d80f46b691d38485b03c17c791", + "0xa4e4b8d8922741c5a767d9c4dd71f9d850231d298a5b5ae741397fd065600a52", + "0x0f49e95e5812f573c00dcab19683c391996beacf61442e52a9c240f08f8ab92c", + "0x3701c4ca890dba3cd43fa3b506cb3d9ce540e87c493c6cb9e80bfe05ec5cd255", + "0x785e2c2e4652a9dbc413c4b7bd54dc8c103f6c933eb9ec41ca44e609cf7e0bd5", + "0x7859e4bfa55b11274bb0e91f608c6d840b7de4385ce8158cc08b38449a61213f", + "0x64221410a8e57fa61ee9d1ea1b5ac161face63a493dc7b0da0f398c0d18b6174", + "0xabeeb213fab38140a8e66b41664626f3ffd831b91e83f3cb7d4f2f09a0b73e5a", + "0x8bc1b2eebc3481e54df34a5f0229a54264ac518dd36f994bbd162442fe1190c4", + "0xeb0753b5fe8706efe7224f354cd92381960212ce4d448d3ba554450a66bb5e7c", + "0x30f73d3082f6ce7f9ece8dc9d6c78610babeb05854415279d615eb24d0d10962", + "0x4bdbb7c38040b9f623b67409d8890070fd5d6f89f023556f2bbee1f40f55056c", + "0x18ff647cfbae0ee093bf85bbbe218802afecd7f45bde5dc29c0c76420311f5de", + "0xdf91143a55752eec775c6c02464a781e16c8e93a4270ebe1bf2127658adeb5a4", + "0x64ba37e403fe57a42440bd2fddc1e301297846f69df5990c2d664d3734f902c2", + "0x2f70192df5b8359e851856351ebe2b0888b1c51ce802766f16ea2cf8b723004d", + "0xa5ebf72bbf06ea040306715900f6bd06564887b52e4692333f880e38acc40b0e", + "0x3b86d989319b0c910e74a79b2177efa068d8601b9889b5e3d17d57c59c6a2238", + "0x1e416fb3c47d77206efcabafdfd3fbd0919e7e6d158ccfddf1d0a2a7cff6a37c", + "0x3db2b1eb730ce08d44e27585207b39d5f8dffe7425949fce9e6e1a4f296c6e75", + "0xf703aca3c59fb4e102018a6b156a83af6c93baaa96c54d9a44485a5b90ff6679", + "0xa103f504db51472ce4d6735684bbf46259e04224d42fbbb87548eeb01aabcaec", + "0x282e099b561c70a9a1a3ff6a4518970deac9a096563e15c01151c0c37f78f737", + "0x87bf6fc28f774c2f6bc83f32751e0d509a2e009e2e3dcbce44db2697dab33520", + "0x97d109285466d0d40ed47f6e1c8e11259e69b90b02731a4c25efff829e9c7e71", + "0x18232c1bca21707fe7b74896e3b1568f88094adcc51b4ad9a29a4c76ca33063f", + "0xc230723357dbd10e7e57ab187d1a1f72a27a53c45b650020cffe672fa8e156ca", + "0x6984c028091bbcf3e40bdb8da39d81d2c9f8a73801276ce3644fcf57cfd3e8d0", + "0x8b66e1d6d3d60f03098f29d9f9857a29ae48a5a34d43786a8fe64e6227ee2da6", + "0x353c9a58633a1fc28b5acf9a0f40e69fdd48252c689a9b8db7610c3d003d5441", + "0x1e020c7d1997e15baddb02742e8846228e4eecb6bb1beafc81a759b95783e238", + "0x50e9738978bafa44eff6b9ad9d344efdf40f7ace0dcb146e2c758cb7b3ca05e7", + "0xec6ca85b0c27f1735eb0822dfe5a0d4e642776e2945a9a22e104b9caed098f11", + "0x94f749840d03dfc1d1cc7f31070a1019cceb1eb36a09f520129457057885fb48", + "0xd29d8d19a1dceb08208369498527ccb0fd4aae41077d4c01c715e6989d5f828e", + "0x40b5cc4710284f1175ce67c1a0f134288428d8ea28f64f41fd061a3a4b139242", + "0x7ea68209ad947c37eb3ff8c779ba7f5f3efaad2d61edca2ae5efef666d7c1f5c", + "0x0af74db9e9195f27f1a04acc3150d6d6200a5f50be63a6dc2fa9acb953759517", + "0xd7a6b221519266e935b12a864c84c6d7daf4e4c8c812a93515ea8325e94f2644", + "0x041fd7dff3672a07a2922226bb0526daf0817fcc61cbde7fd3e1f8efa8dd6c76", + "0x79fe74fe4e56514072881413ba7157cc125051476d42fc9361a58021268ff0d0", + "0x01cfb41ca5887931cb98c347c25d6c03eb5e992fd661085307245dc77cfccc42", + "0xa1e93426afb5ef56a564ebfacfc52149e293c25dd36dcc2319d1ee50057eba41", + "0x6a8e8e62cd387ea56c621a5e085daaeb51003e86fc3c252d115ad417e2e79242", + "0x18e5d5dad6f00c36be4ea9c7898645611887a3c3310b97363699178136989527", + "0x6701bc914e70bced06487f22a16792fe3dff4f1fd15ab87ad42dc91de3cc951e", + "0x75161e0ea68a78e4377837bab6162f1b6d53cc5dd76c423acba9bde4f3ff356e", + "0x9d9ea2b7caf0b67dd97b62f0e25d172f78c984baf97ae3851e52e26c5af87770", + "0x4257fe5a910db425844b2edc8badb4977c819a3c40e356d260b93fd2f9170bc3", + "0xf2c878a894811bd844c30441bf38cfe79f3ede5b0574721f32a24755c40aeaaf", + "0xd45e12f2f3a025090fa81bd95e555c8787c26849410f96aa172d3dd153b40a67", + "0x6204243276bb752e5e2d77fc43cf7c5cc92078c283c4d489b7310ea2753ed71e", + "0x806a0a9e0f4e744b02b5091f72f57377a4d7bbbb27829789070967d35fbee325", + "0x13489b922a69fe05869130674253f90b4f883b199f01cd03c85df0a000e1717f", + "0x4fa87d7ead2b1789c72908523c5aa6ef83b7d9559f5c5edb506b4c2f681b617c", + "0x4bad3e31f50fd2dc570c31bd547d278b92e5c93a7d971c38035c09ec5a1dad84", + "0xa0f547806d376b76b33266d94e7d2ef86584a234b540e74f79756e0331405c61", + "0x4bab9342aed359dbce241e580b46043b160a01e44eb62bc29ee5ac413b8a7ad8", + "0xc7ff1b8f8557acccfaf4dd37d13a12e3f9d0e3612398c3d8b1d675467fca56de", + "0xb412685d085b0d52c72ca3d9987cc188f930f759022f060d5f2f368e77a7767e", + "0x0775a447ddac0050f5cb29e08fca1e7d016b42c882ee15bfbae3de5dd99b6705", + "0x1d33342e6115ca2919ad6d31fcea9f4a9fda5dfadfdb4e206e464ac44e59e178", + "0x26dd97156aa189d9f3c799e943f50ad13c2d0cc8018b054af65eb37f5caa76c1", + "0xc4daf50db81c04055bfeba3534a48af718695e2789aead7c3fea58b064bc86d7", + "0x87e2b037cdf4370ece9a2e4a54329d3e1be0b910af6da8c3850ac75d6ba34920", + "0x1b8fd79a76b40690a3bd1bde5cd3b68b36148eb951f45b798958777527a876d4", + "0x63ef67d88acd91fa005706dc9912991ecaa81cc7334ec367340a2c12147cbfad", + "0xe20cf7a6540722b3062b9f49dde601f210aa8cddb5b5ea65eb7bf44f53ce9d5c", + "0x05b5daade0670fddf401298414b70656294b8c5d3203ef7e21536ab2696195c0", + "0x678791e0898a0fd0dff39cdf16d298162200ab1d93beb96ecbf9e9a664362b9c", + "0x77698208c576cf9f2696280872c6f2938595ae522b37c2b8dc5b60b83ce7a9cc", + "0xe9453e5ae3e39110b65b03dca160f930f39e933ecca604f7b1d9db0f3d4e3915", + "0xf3d84caea9ee5dffd395c7da7131456174cba99f905eb734c0df1e070c16d359", + "0x3b56c6cb8308bfe1d9339e14c713eebd5830cd0c538b196d18743bfb729878d2", + "0xd0a1ed8e3bba6cd1ab36ae3e60952e6ae56cf2157039ef2f7136e09999393650", + "0x206a0bc96ac96836c5230d024aab5c7733e4c769b7cfa9fe4c52ec9ccc2c9ecc", + "0x322a0aae92f406bc6c08dfda0b60f625716af5dadfec8d014c6f863eb33c2edc", + "0x701f25bc99f297ac9e8a8e5d8c376f9a363ba277ec87d2eefe30833035657e23", + "0x98ee55ecb672b58e5d02ac83f716013b2e5ad57894383e792cf1bd82cb47b20f", + "0xd7c63ead8a31b5b188fbf0663e4bca087035291834ee1380da270bc26bd19186", + "0xce3824ed345e2101fe30f43287f428c2cdab4a9ee2b4a047d4c6ba1b46a05c98", + "0x853eb9e976bc0fb95caf99b60c978056b0423f2455e5433f3b9d6d28e8ddaec9", + "0x2fefc2d9f5d26e0e9893b98d6546f593dec46105109fbec9c0efb298dd18e534", + "0x255bfda7bb1a2df1a36e7ebc4414338928d59474d9b33f478dab6066275896bc", + "0x678516c205b1f93ddc8d3558e86ccc9ed5dc317387f4a7849ef158e7759234e5", + "0x58d0e9d13bb841286dc4c579c11cfd659b70e84aab4550a75d1d8f01d31c0b64", + "0xb132975005aac90edeba73c75a8533cb9099a5a7f6e9e31755a22b44289bd950", + "0x77ba37c64ec1db20a6dfad1462bc4cb5d49cae6e3c801a99e223e6062dda2598", + "0xe3a4d6edfccad2c55d2a729e6531cc9c20d668dd057c3a8bce78dc7789384d9f", + "0xf419bd76337344144a1e3f1e7a8d3f768fa97f4f1be87757e3f2e50c78c7ab14", + "0xac248be7b1b0f85f35415e09025f379bfbb02776e854d682bfc93caba3a0cbb3", + "0xd853df355a1b6f7b6921870bc5a00a615d5fbdbd9c5214e57e0461a00af92711", + "0x3696d847c84ecdbe2902eb3200013d332d364c0be47f67cc122bd7d4d644f08b", + "0x843a93026d2075704e731fec65fbef6a234eb6d2368f7da29e8e2d3cae45fc3a", + "0x923e0d97b13c9ff4e051cc43daa92960ec646236d1b02faf28902c5067cf83ef", + "0x4a700c31d34448662af972353f9cb471fd155b6c7b5c0afec7acc09e58ee85f6", + "0x2cf612c948d6d8a6ea9886270d5de1e131c2dfd4012f1811849c332716ca650a", + "0xd9acf143ada3cb5e1eb8c3d14b4c188bfce9efc13d317822dc406e08cb5ad9de", + "0x55b3ab14f3d1c8c7b8660a136c98cb4dbd90f8ee329c1fd08edd612a5b866428", + "0xd07432a9b77607da1fe30c98226a224c171cfabf96a1510849255a58f7040595", + "0xe12a4928faffabff9d4835598e103b6079f359061175ccd18159a6dfa7ece183", + "0xa223cb9afb71fbe269c1f721c22fcb13addb8ec06286f9d5b7e337a262c99104", + "0xc133b48eb3f4946ffec9fa143a85d2e009a3b8a99a68ed1d0121c7e9fa616fb9", + "0xcd63f76df5da2994fd87c43f743cd7d35d94cb8dc973cb7a120cb677db9cd5b0", + "0xde86817e4351951cf1b6402036bea2c75901b6aa7a6dff62b9862fe4783e801a", + "0x2872145a9ea250731bbfdbda0b66367300d88f2d9934c6b1d12960067d717bd3", + "0x86e0674ddc6c584cec7931847ec5283675445d337a89d19047817e46e9047d22", + "0x4aac4bdc309bbbcd210b87b0f50d55fe86f5db69b83e201f156bc9ad25347966", + "0x1c0e32260f903386af7e4cf14ef819fb1245d269d2713faa729f05b019445243", + "0x919711d6689630bb81d59ad2c75ace09b462625180ee8fb8fa2d3ac5aa15540b", + "0x231f8566ebd8ac13f2d6cd5a91566aba9074ffd235c762c26280e52feb5ee4c3", + "0xd5df310c108bbf4dcd5f876e0290c5d9c9c2cf20f4f979bc74d962d7da99a777", + "0x45e6ea115a13d30d8dec6f480a9d0b17cb9288f3d2590af02a40bf3dedf3f1ae", + "0xd9930c2a8d4dfd36b70207175e3ec5386fe91371e4b7fb484022e64b5aa8388b", + "0x529278e0e137a319d3a7516b41bcf4be1390e5646fd74fa8c6ece03b9e734deb", + "0x471c07b4e2c5760ad10759fc0889fafda85c2367f2a9147667ad61b687a52fe9", + "0x39332fd9e3c9c89f6b51e4a5fc43d8da10191d07e71c35383e5bafb997c651fe", + "0x72b4753dfe94ecc08b1ca90329dae352e677b64d3e28281b88765cb2e7e3e428", + "0x9a3d06d9134005224fd1f71f14bdda085f18824b9c86b3ec6254b213d8e349fe", + "0x9e8a68163e7e0d096cb822d73c420324ac7416731b27407d74059903c05f2862", + "0x292c607845fdbec84efa2321bdbda9864c3e7e543890fbedf1b85fa4b7ea6b7e", + "0x31be5706424ae91ed9695b2f8f7cb0a81b7623e02da8595f0affd2411170ea11", + "0x9331ce0a7339609a1a4ab7d82e41f432c430685dc6aae81c50ce18aa0592b465", + "0x37dfd9817be661b6f7310ae6c90b3b97fb5f63e0e622618ecedca0d609c39e35", + "0xa350f656a9cf101ba47b0fa109409f1113ae33405ed766d0308740d5497237cf", + "0x272d62080e7b1c27f7134c60ac9f0dd9c903528b1a32338ddc8fc199d9ff2bd6", + "0x8903ab21a203161e433cbfaf719a95b1fae95e029ee19f0c94fa7f1a68f3a1fc", + "0xd3ba92c896627745c0afbbbc9e3d8b5a1511057b24817d7070e08308812f7ce3", + "0x703ec0121dc8e020de0dce30459da694fb8b7ead68bf5b052320c97b0edff1dc", + "0x0491cb350e466467a1078436a1100a70ed6198122f299b4bcbcf8dbac4b1cbe3", + "0x826cc32fd3097689638c8701164358719b6c8645270b70abfc0b07e103d5403d", + "0x351679f35e52895312c8524262a6e420544b443ca3eee81cc11a11c4e40b195d", + "0x0fb18a66d08f29e90c1a71a648d1b36c2dd3fb84bd2e4b8ac24959233cb7a244", + "0xec7fad9848cdb994996bb9fb63cae6e913fe90c9727ba49ab8c9d293b692237b", + "0xd76f7d686c80c1ef3387ff50925bcb540084d3e8d750a862e76e9dce7a443d40", + "0xfa237f1a2b3dd6e4c646d7c77982558af1633cb8662e1d107d5ad5140ec86024", + "0xe7b5e487328a3398b8716043d3e6bcfb39a996405daa98be49493e46e9a46555", + "0x306c41368e9d1a13d4d20256602c4d4182e45b2b69549be7c7133e01dc930057", + "0x9551a36f384e66ad7c5a7d43f510480448f59fc2b3414cb2dafa8d71314ea4fb", + "0x72c3b4a7c21c0ead562b66abb8e6ac42ab96fc5d01c8a5f934df2393b03b738c", + "0x849f7030b271894fd605067a59e373d903a6a52e9fded2357c05340138d3de1b", + "0x5be66687e522cce14e119c9d4b3b3853fef6cadaff6f6c5c2eaef9b6769b1fef", + "0xe063a6dcd767abe2a9e37d3f18b67e2a2efd68ad4d96b4215eb75e4b23295afc", + "0xa8f6fbac9f159d5a5db1e8d614dbd3302bd5737eeae692ae44155d26637ceb4e", + "0xed37085b1ea6b01638a3a145297f390b63b307479e88c55908fcb46afa1e5960", + "0xd963204f34b83d30e97b458148d7e3cd0143495ff67d893b512d7beb7b225035", + "0xdcf4fdc30c4e90b82c2894b12cf27c2c9ca9e4e5ee88d6052d3526a96b93c55c", + "0x48ae98a481df3d2ec8a9c90d0a838125a5237d5716617d4be50d09b2f1f2f592", + "0xf85cea1c73ca422200a9b41a19fec626d13d70e0ae20dbf8c5db66977091e2f8", + "0xbaa3273782c55be478f5e44af8d6d32771bf837002231621eb82fd5b8c07b519", + "0x1dc0a7713568a6fcad865704e07a405a44c2b0096354115f07af09b760eb9a09", + "0xfa70563c38634999282cde0e088e97953e2d8a81180f5c9b2e99ad74493cebf8", + "0x58c7a37a105fe671a833f01f6c189c6f3204d462a0e119b494b6b0c8bd97501d", + "0x9ad437c83bbe3a45191b5c9fca239d1993960a8316e3c52978c266cbfb4d0ed8", + "0x0e8ce8c69bda4ff65d9bd614bb827def7d0f6bce5d550ed72bd5d91c8c1e33ce", + "0x74e04e71ea4c189be803be1116781a66cdfcc50a067387af6d1d468733185b14", + "0x9d1eeeaa2b39e1e0cc9717e921507d34f35faea1450727825d147ecefcf70464", + "0x6758482ad61721f92137d015d4d07bb238b0976bf14a3c548adbbdbba6b73f00", + "0x794c1b2f6ae68389c51761edde1c96b8bd44904769e85a8d7d0035e76be9f13d", + "0xaafd63d0587a40d5b73ba230c976ca80c46a09e3b7f7df136f8eb0b04b60f5de", + "0x67d184707f6e0b9af49aedbfca464946b4f54321c4eaf3263d4ce52de31f8767", + "0xd2af9a84d73ef353c42517a6c5c0667b1f811ce2bb327e3702b49a178fb94179", + "0x2832ef9283d9ffedb03743b454894472eb31740487ce89ef016a00819ff30c2a", + "0x82ea0cb0f3eb68ead50a1d8106278f464e0126c0d7589e6d4c16142d80989194", + "0xfbdc8b5fbb0109cfb3a3b03e01c90c37cb4ee7781563026c338f455ea708058f", + "0xcc34701c30d0ced752f863fbe56d47abfec0c9f8012d1fccacf3814e5bb824af", + "0xb0cdfcf55823aa634004387d1dbc34246921ca0459cf4b9f751377e3a78ee041", + "0x313e6f0cc985a8a0eb2fcb8d3901fcfecbb7d29e98ef8145996e4cea804420c1", + "0xa64f1d4794cd286788c281b14adaa6c0890f9782ec0d80448b8fef906ed7bbc9", + "0x619d70b2e48cc3b295add6bfbb8fc60f38a01e61f4dfb4872b58c1ce7046efb0", + "0xdb35cea33ddc36b0b91b0dcd84155e214a738cc81c8805127c47fb7312257299", + "0xe101f36ff5b89d028618d46138aed3d6b3269605cbf4f83d68c9bbf233f63d81", + "0xe5925c839b60da70be28b38b2081701e3bb0be98cf763539114609b309c5f97f", + "0xb594135c1794da9f7b7af1366d56b4527223c0471ee3780d65cc03cd70fe2391", + "0xd6a8a3b4c6d33bca9b02b8207aa680835266d9c9d4808e2d57f28f92936b7d01", + "0x640a50f666edfa0c4cc55b6c945a09108fdd53af5ca55ae92de4245d56d5e436", + "0x8dc9acbbf2b71953327924fc2cc711574fb1e82a6746a3606a71071369e77601", + "0xd764b84ee9d6a552e34252322f7a939ae546281136a217f5f7f34e41997e677f", + "0x3ec87053d8ec66bf2449a17989721644050b2341adf9036df6843a414a9a1de0", + "0xdca7784726ae438b274f4a3c5892da0bc69ea694791c1ffb5398683952bdea75", + "0x29114fc2dc70ec997d34e3937c2e54136fd1de4ba7fce8353e19af65aef490b1", + "0xf1407df809e1bb932c725821347954eecc9e5e226cd37b6058b45ef9f4fbd377", + "0x873826f03bea4b73698a17d2b0044f1c689daa17925302edb0f815dbf50c7fec", + "0x3e98eaefd07ff2f1f4d6c67aa7ee3cabffd701aa0150f572521a17772bfd8d01", + "0xf44be55471f0b66b065a2465a04f6f47efb35a9ede93a9d8b22aa26d3c6637e0", + "0xb114c762f1f60a913fa570cdb207c279d20abdfd789d7fa62de06e38c44d650e", + "0x6f300baf19fff0f5af714e63ec81314d7de839d4f5900979cc9761e0ac325956", + "0x94d99e9025cec968ce5a80d82965bf72db62250c49131b14c0329b0aaa462b79", + "0xf1ad3dc366363b5a7c2a238e693600ced352984673cc4d0a07ba0ddc2b25c815", + "0xa48dc388a5dcbbd81e38b3e77178a4248232ffeb23acd7869375323f1aba0529", + "0xe995c7008184fe2d5b39eb0b1229caceccc8e86ef5caaa720f15e133e79a2efa", + "0x8bc6d112254905a89fdc319bc231f4d2c52a22d60baea4a499da91119a6872d4", + "0x16cceba4d6c7ccffe424c9331a78bc3748aa7b629f0fefe88c43dad9324a1fc4", + "0x564aceef2d2c0d4b8d6f73c10c234dd82570a9caeb572dfdf023024b61365f4c", + "0x5630bfb3fbd9625f2204846fc81b98774e95191dc8f7995ef33df915f77ce2d5", + "0x23d02e3cb1729ee715fe84775b969989d11c4ccd470910921b75c63c4e9e24b1", + "0x5984c5d4ed0af67154b12c73e38909b45e46e161d85d66e286d33b5ced150a75", + "0xddfc15bdbbd16b80d442f9a0587da4e304d3d7951ada0dc3d041f5a1df85a9ae", + "0x924c83566150cfdd60410c400078830bb4742b7286a6f8badd3e848a5afd0220", + "0x82847029234edd5c2f1538a71ff2eccf1de43e94f651557ba73caab59ef9faf3", + "0x15949ae538f10280406ebf73fd79fe0e77e937f82cd9d0c623e700ff04fa0a7e", + "0xd93edfcb2fb0c16e18b5c42acb751ff197ebee6ef13e01690b08f8e38e777e08", + "0xcb33ce0679bc3b417095cdecd66cbdd4cf5bfd288037d57e93cb6a542613c06b", + "0xa678db01074492af055c36dcee385b37166ad08a4481309945d227640ece520b", + "0x30b123bd31dab5f0dc65766e2b6067e5caee8a53af647b0c7d35d16ab85b2ee3", + "0xfc3faacebfc2c0ed22820eb332bb2f3d9634abc98d26fd42438276541f2beb86", + "0xa0d90324e7577ab7ab5f9667f9d7a0731d223f8edae77dcc9e38225b0206ba29", + "0x75e3bd20d6378133c8a4f9d0ad1121c485130d65340b0596258466fbc733d61b", + "0xbaef6a6c8b335cd317631b907f692cccdd730c82213755988ff7fb78d08fa754", + "0x03c32b933280b801ee17ade93600bed888caf283e0a058bfc0c73f47072f2459", + "0xabc98360fccd9567e9d555924bd815557cd5612836de1b38b63828db742ac297", + "0xdc6770ceead9f41fe0fabf046cfaf0be83f6c27bf28616a97d58c43e3f591ea3", + "0x4f9a91b13c9af1523071f1d4741ead5b6c7a9e72bc2881ede8309040b8ab686c", + "0x175c7e494c7f0347ffed5ce74eafcede61403cd0829d71a9df99e914774ff33d", + "0xe408f526449bec877c0d5ed25e677e8623ea68b797818b93e443179c9ed4d334", + "0x8f3346b57ad4a5de31df1b0b5fb5cac40ef0152fb5360d50ddc84752beae5965", + "0x4b2398450d192781d3ad48ed398fe7cf9e5e8a417b29661894c6dd43e83e2248", + "0xe94177ce0fc04293688209ff52cf53c548ac5b7022e7e60ee739f5c1711099a0", + "0xee6e5c8a30380746df8d9d3f3de53439fe0d864dab6ab5c349012d384284fac5", + "0x9fc9e919898303f537988a6695329143a77e965802be3566396f7a581962c3de", + "0x5277cff2542cb90c1698c7e673b7ceafd16cf4d0750272ebb51e3aa3fb02f3f4", + "0xea07718095d00493c662b21d0dff8bf747783c93897f6f2421571e2c7e3e8955", + "0xa8bfbfcb73a903d2937025226b38aefcfccbb3f9d3fcb0563ede2d9f1cd8ed84", + "0x795af85d146f9e00cfc5d12c97efa5073f19977afeae31c636cb3a6c9771ba14", + "0x60d169884296b60a45cc87beb366a513a6bb7ac34e6acf6066d9abbb1bb3844e", + "0xd256c59553a03c8069aa3dab431c2868c6dee246fcdaa9683b0284d462ad3fb0", + "0x1a399a1ffe8e7f5eb5fa69e70a620e1b15087988934a754a468ff47a7c2f8add", + "0x25cfa588df60eb1127c4057ba949004ef8f7f2681e435fba925f4bf8ce0eb54a", + "0x282d5589c98668c7a9baf871dbd48a3a8c263ea55452086ebdb3b4db440fb9fc", + "0xdd3cfdffe34633d189d9bea7513b890b6d54c2c0d12067d8f45ae72c258c77b4", + "0xc81f96420ae777252b04116d14bb80762c5169b73abad2e1fb23e8bb9334c2bf", + "0x88bf1fb814490289ecdd3d411134d42155a483b7225a496f24ef29d84df164ea", + "0xc6f0b78237824d0b240b8dcf1e31e75e93b4608a495fb7d47ed47ac70caa5aa3", + "0x10f4272adf03ae39311b049b460dce8579b424d3c169101a80aff74efc018846", + "0x52a6ed4acdf0766fc0a63b221d113e3dc7f9e22435d734972e3facdfb3447a8e", + "0xeb75f393b00cbceeace53bff0725e0fa3382e367450fc1c7f0005bb859467d62", + "0xd58b7c94861e7822f924356cf808c0b6ba19c100e49cd8a1fe2ca8a537bb20b5", + "0xd355030bcb4e35157543fafe7f204040ef0e0ecbd60bfbdb897add425112be2f", + "0xbe3ca964fb22fdb9c6c74f07381dabca0e932310cb88676144cd78cb374416c6", + "0x6417c82c4fa9ec681e767a8b3a26640d72c61ea72b1857bd61930187a54f08c5", + "0x0501ac461bf7f2e813ff8b58fb9ba936abe7eb0dc6ef0072f98c52f83458765b", + "0x6ed677008e96476990029e1ac8a86e4d9af83f812dc73d9b876c772c2beb5a77", + "0x9c35dd84c1d73d78dd3277d96ce4c76beac8c6bab498a8a5853970a03026b2c6", + "0xbb0b70d3be3239ac17b3689d67571c12318b51bc6811dea5e8908393d9a567e8", + "0xbfcc8fb9be4c41f8b26214e8462320e79c2fc126abd6e129f701b27b9ac96711", + "0x18bbf70cfc61152ffc64fa6bd21011e446f9d8d1798076e8841cecdbb2e25ccd", + "0x6ec57e3b3b13f8e3fc9298760ea47907c9e08b89bb7599c5cc50c83157a5b12d", + "0x1e681fa5a5d2d63ac23f45cc30720c5b33a3417ef0adccb10b9d9299f5dfdd15", + "0x63397c3ea42e3ea7dabaec5f3aa3cf7e15a4ff94ec745228c0b099928c2a5f1f", + "0xc8d14199fa6b134b84c48a44b9ef1962a9d08b34dbe78713f84ebc0d307c38fe", + "0x4dc0102f265b0e29cb403b258cfee5c73afb843b0805c9218bea86cc12a08503", + "0x4acb64d573cef699cb2d9036488a28bdb3d68a0d294d04c92cd198d42bb48098", + "0x872df3af6d40c5beadf565ea8f6cc502edcde941c43cd3024c812b2cbc33eaf0", + "0xaa24ebf00a407b1ee7e126cb5f396a1b4489577f160a7ec735e0e47fbf077abf", + "0x15e6c3ebacccecb59426bcab8f5845a60a584a18d5f6875431181a816d5dc0e1", + "0x3ae0bd8b42433be46a280335444e8e2d35c1afec926cd2c1d5ea537992c506f1", + "0x1e423a88a245221c826586cc67ea45dfea247c3e9a36c81ae9f0c0b5d5d3e5d8", + "0x5401f93723132c737589b457216dbf231a753c4c4619444af4eae9bc6153ee40", + "0x70d9a2787990c3dd8166357ab21985abc81a55eb0d50af7e19ec20454b314d4d", + "0x4ab7adbe2f74ac269840ae607a17824e8ec74054fae9d9b3998dfb162962e1a0", + "0x91fabfea828408eb161ac781a0896155ccf7d9cbefc3483cde52b35ec67883e9", + "0xaff4547e50acac2e3851620e541e96d7645682f225400793ebc0b959c6a09a01", + "0x0937506d4c9e37d57560bac5851795d6559e51df255ea2c64f2e119b88cc7511", + "0x88d66c613582fcf6df46773a1456304c4c0eddc212612b2dddab065b6051c8cf", + "0x2d6315542c9b30c8984ca951ab488906c78e6c84aec2090397d4a61ef26375b9", + "0x8ca8d613a382711420966787bf7bd541f517733d21ac4f893c282dd930f69b5e", + "0x1751120f6735feecee772482da8121e9e57d930d23e69cdd5bc039f43520b9b7", + "0xe161051a099cf4b605fc773734e68f46253efcd52fc9c7d7a207f956c407c606", + "0x3742dfd43498b7159cef3dfdb520d34583ac955cf8abb3a453835f3132877d76", + "0x1cb6bf586b0d422a986d235cd2cfccab6aae1ff580434bc9d1eed944d0c54d0a", + "0x3028e937857f2ac53e1d988fe8aac0f18616fb221560c69530c4399bc49db96c", + "0xf5ba682318437ed7770cab6098d356ee63c41cbb8d7a114ae094aba333f78416", + "0x9ff54c1d56a1977d406ef680e80850a4eae13e2f5b0012c0961a87426881088c", + "0xed99d4a9efedd66d3902ea4bf332bbc3649eb84e6a32a239c6fa712019f4158f", + "0xf9fb0e5082e82b4e3fde779d9f42870319e30e01b43f88a89f651c6994f1c513", + "0x69467611b658799b1ed8369ce39b66b5479f9601ee796a93bf57e94c4a840db5", + "0x8e1d27af1e1eef4038af7c34a142ebefc75269fe0991575f06f658afd96b293e", + "0x3a03db5ce3be82a8b47d34e271a7f126509d0f0402ee067395b4a6d7963d178a", + "0x641e2f3a93b6867ff70d8acf1dfe8a82e151c84d7561341107528f58e69df814", + "0x8b33c66fdefed9127a548e2ea61a30188d7a2b16b6bbf5c52d5bccdf860a47a2", + "0xd62cef231735d396b265e3241d51d08a90f6ec82267442ed151fe6484fd2f2b6", + "0xf52f27645bee7eb4c8f9c11e61aa11658240bcec7b6bef9c56149a3dae1d9374", + "0xbe6de14b25ace5ce862be24755393abdd07b3f4c50985062815139073e4c39bb", + "0x60e06bca41e0d1b136a7ef2476c0b495dd3443089f19f2e8c306611e40d5caae", + "0xa9c739fd18f5962d8b71215ca05f129153968e12634ddc7a19d54136de335247", + "0xecb51e8baa0e733048627977d8ec736cea38e501cb9256d7b5b4f264c4851055", + "0x634a99ea3bd706001327f1eb6fb79a9c0aa49a6517e78c1135095160152e3273", + "0xb9846ba9630ef1607061ca5cd2c70c48b632f285bd18fa2db6b4ade2720538d8", + "0x8ca68b47412dc13adfc72489a0371f5f2f0cfd5942d5ffae08a57a79b9c70ec9", + "0x13c9d7b77677291c415253af2508e66ae8fc09b547e66bd0372bfc7371b3379e", + "0xcf3d8c54e42a98852364dfc2a22a9029b944bea2361208262c149dca5fe1717e", + "0x752a1d54477a8120a7df54691c70c21dd399e9d84a576717cfcdbe9320a10686", + "0xfaa8c3a9658b4f096aa4c89aed1fd305062608aa73fb9d734c9d9205d2055760", + "0x96839db4f4ebcbff566b96dcec7c57de674b8075c07e6a17a4120b225618f6eb", + "0xd7accc2bae2cccacfb7b7bca6fa9659bac4bcc7f47fd05b459f8eb271725e676", + "0x37cd77dbc69588fc060a696827004b1d1f48e46b317cb82dc8329b65c4f2ea5b", + "0x83682e40a4dc120e5019eddcf84be4e42563904d1f06bae96cc5c513790762f0", + "0x4c519f5d6664f4441baa7cb15053d7a385c7c31ffaa52044fb48195d9edce9e4", + "0x28e1f389b7b0338f7ae494af7b4f239fe703ac53cb8648c24ed201eb3d0fa366", + "0x65d0b0371e3ab2d49d30ec178921d8410de8223ef4fdc4721d0a3aa1d1fd2676", + "0xe7779ddea50b161ecf429a3d382b7eb564306ad7c050da244a6ea2ec4336a85e", + "0x42ed7b3277a97be9aff896f3bcbb1a3ca9a1abcda194185f40aecff40dd05c9f", + "0x16151d4334d8e9555e2df32d6a58ba3caedc4cee88906391fead30cf7b6c1492", + "0x22454deb333cf072d9a19f52c64c232f4e232100e4097dcefc552c66cd037174", + "0xc77ea7b5df0d670d6828243b057169f25c1dd3a55ee23706aa16859254119d74", + "0x297b0d48dd676057449e91ec41a35ff23ca7101062c92c0dfb10f989be59b5f6", + "0x74b963f879f86a4bfe0233082129bc19095888f0d9ff99e09d835d8214de6e31", + "0x09b537b0d42a9c3a1a191c9295611c1ad9fa5f8002a2ffb990131ef3afdf2cc4", + "0x71b3dd8b8b917826609084149140de5e0b34f71e2baae4685d8be00784231499", + "0xa2666cdcd63be625dd08c7298d6bc06dce126e6a294240a4db43aa3aa0b3428c", + "0x3860cc7900f214952e4b797bc5ae198d59385d8fa747076b497a5b4a2c51df66", + "0xa53b70488cc1e45c1e11460c66ee94c46dae564c5a1cb7e3eb6796796943d880", + "0x06c7f6905ed8d559f757a6d823b876850002ea38697373a77bd9447ac9d34f60", + "0xeca8100c89ce9478abf32238bdad1505f3e1299915b6b67d1f5260ee3d494c09", + "0x06187fc14bd288ff503e878d0300b088dd2f9fa7c4da3193f321fceb4702a841", + "0x4b8d46ce312100e848366f8283558873f17fae5719f7f33f9a73df885fa12828", + "0x1d68bc807568d3d971d36d08f06c2e6d70cfd02ba03d322d7cf144dfc53c3044", + "0x0635b0924e22d1b03d1ae8bf9cd51a6b3479cf9e15e9c341ab97c9578ecfbebb", + "0xd181293e935a777d4b4905e7eda21cf0a6d48842b28228a9ab4e480cee7abfe9", + "0xcd1e363a1e2bf26e5f3c98a7a426e7528e4a24155bfa2a1a968a971d129af069", + "0x32ba79240b478b0b82d06adabfff6caa596987c07d73fec3907f4bb21aab169d", + "0xc4c7b178c63ef2f10860a346acd8d43be342ad103c41cafacff07bf748b6c262", + "0xf7c42fe2f081334fd729629f766de6919c41084dc143999abd637dde580895b0", + "0x2b3c788d5492557137bcbde36a3c77bcad3fbf46e93dc83c43801c13debe4a3c", + "0xfb2fd5480e25e6d50f22bf422edb888194e510ee40d112d21210958bc47d919b", + "0xfbc6dbeb8b5687e5360da7e241bdac501a6ed768e6c9694dab686adde5776cb9", + "0xac01b85031a280013440e18402e378d16e8b8cf582923597d4937bd9502a7951", + "0x6de81b17804834c0390ca350d4027b7a0824ddfb38bdb01f2922e240594a26b8", + "0x18ba82983465250c42294ad5c3fb634d372df537b67c1bd735aef7b3d045a9bd", + "0xdaf21a1151c73bedabb678497324ab939a9ab1dc3ac506e395b164a2daede36a", + "0xda42e99c8b304a39bf2ed10d88bcbf9ff527c1e3b9a5932400f331e9bc51a88c", + "0x563e2b38354aa19dd91ec0914f95852810f3f605e828a727ec0a69f54278be61", + "0xc64bc37db96aeaef1d1b9f5da5b50964690022e0c78015811a8034f2e10be4a8", + "0x96958617222852f4f6dad6bc4cbc79657170d2f9c4ea0a5cdbaf3ae723460a0b", + "0x0abac5a8433b40108cfbd385a3bb0298c069ea4660349927c64945eb409da78b", + "0xe5d5f48418141703f119222ec582abae55448128570da3ddacd758f112e67472", + "0x2491021cbfeee20e3a578b9f0508c85eaed8232d3ae1e6f074f43410ee373a57", + "0x353a4b80cc69d701510ba8711543f1b5677916ecad829c76740f21bbf7b1658a", + "0x74397d86b849a792c4ae5e8e65750a932310d1496a0ccd3f5f4170dccd707d3a", + "0xef520df7a1258440507525a8b1be9e60016a95a7da4eab82dc85d8aeeea3a929", + "0x0182f92a90d14a09e6ad6595d86dae389d297766dcb8d1d7a685bdaad733d2d5", + "0xe2b947deda76a4cc65948c3a40dc7ae7bfecc285f8881856bc55d4d8834f5ec8", + "0xb56dd5d67c8d49b5220cb8901a67525e00cde18ca52a5b26d09974c430b1c304", + "0xd5aaccc68b4fe4694c9cf7bde2d3c27a4c8c5df40232df1b875195404a762977", + "0xba7681f4f365a69625ec74bb1d114124bdb156767992c778ae5b49c4390438d4", + "0x838d298d84516b49a77b86ae27e300b1ad52beef517df8dd4b87d43960e51839", + "0x931e8b07cc0df6eb35d54d24d180e2b98e0ad3bec2525793511bbbb218063853", + "0x94db666ca733d8fa4954091dcc53e24fd1fc7e6135479b803ba45fde46753b74", + "0x4e311786ff11cb12e929f2509b5c7e94a87739f4475a213adf546dfe288966da", + "0x5a7be45e660da5079427166c854a81f2d4bbe2e326d0ae1f1d0ad067120c6c73", + "0xdb863b5b5109bd3f6fb7af19bd608c5a8836e2c0d8512cc438aee184ba97708c", + "0x8e21743089dd75ae94a2970874ccf87d8c57f2bd90c701d9c30fa922ab600f67", + "0xde96e7f8eb356b706754151805417b690e9ea613cb0886df7424f07f90b9f35e", + "0xd9af1f5dfa685f1b0e0b4bacdee2e24cb2448b9c990a21cd32ea85628bf00553", + "0xe61ae40a63d3cc113a9df987512cc6f94cb69caf36ddf68baf7b77089fd8842e", + "0xd32d2de4b6de7d3b9a8b75fe004b1829006473daa4507ad3c2bd74bb5473f2f5", + "0x5032a547596c291d8e0f20797dbe1b52896deb1b13a930b9ead43ca93ffab7f7", + "0xdf75524819354c93547474a730c86e285852736e3aa6a93a1397cbeb8574be5b", + "0x2ad84a52217a7b78ef30fe6ce5b36fac975f8eb996d89423e35d4de57dda944f", + "0x24273629f43c888b4ae4ce0e98babbb86aebdc304ecf7565e8f5cee13713e109", + "0xe340a7207222fbcd3a18df2e95aba462efff7806fd0ab5c79f163a9ad277239f", + "0x14b19088ed16354ec0d508d91100fa39f1c50c5b153edde1c7fe12b6325c3269", + "0x8ad8cf08a5d25b9798457a32ad4b559ceefd8086aa662e210abef814d8dc5c84", + "0x002ca4fd98f15c2f1c8eb360e3cd38eb102d6f93082e3f1bd43220309d53bca7", + "0x5c3df07ac15d8f1e16662b5ed8821e43f45b8adeff87282ba92b1a53434bfa83", + "0x75d277049869aeb977bbd1d7c371b6a9d84c3714834d1a16a32af5286acfed23", + "0x0bad0d61579e2555d6fe7f4cc514b674c67b589ebe5e7c5cc451bacbdd5c1318", + "0x92f15acffbdc999e32e763c32ae7a6f373f4864b2807de08e7af49c70f64c659", + "0x9443fe858cda8b2788eae50b66fd1d44280c58f022471d8c6696716f0322d8cd", + "0x9c3bfc75fbe747bf2c0f1015472e67fcb8ec91f40e9b509429ebd91954b32d25", + "0xd112736eda168795236314f0de72558fcfb104e2f692d952b16533446ba75ed8", + "0xf0671d0460f40c687b9d7d7a5a46812897f3e8289aa7913b3eeeddcf902ad907", + "0xbd8dff979715487464394682bece79900bce98196542df4479086aa7a28d00f0", + "0x615d56554914d61bc4da030292a1056d18f71728de4941d0bcfe8dd123253f84", + "0x826a5d357b7f2a007804bbe75fb89ac6f7ef3011f408a07470b031e476d49758", + "0xceebf085d7d36747965b6a2ea80d1a1e47c71a27f28584ac89e35535d2da35ec", + "0xd4fa150d101967f3d7eb60c23b9993bf9a93ef36bda6bb75e17c3f8e992a7620", + "0x8672059e26d3c2605d82c219d2ead47d94446c8dc1351b109149a0514d618f64", + "0x38064f1f84a646320bcbc7778596c25e9aae2e356548b4559aa447b6bb8d79ac", + "0x6f195e60a921fc96202810a55c4ba9a042685f20761fedf15a22b28198fb0497", + "0x8dc83f591d7eaecdf50fe1e92e0480d1f174007f5b7a351f377ea651ecfe76ab", + "0x6bd195f328b200ec4ebc57f94ddb36be5b77aa16e633b9ea8aea5c8a3f1f1b1a", + "0xdc1f7643b1ac9c9703e5caa148001f2e2cb7168775ad3c6c95c675d6adf85e6d", + "0xdb2aab4822e191e5fbab62ccf4d8b8e548f62d50fd2b0e1008e834edb91762d5", + "0x7100363198ee3bfa9317ef4e8455bcac54276b3a55b8c01873a54f1604e7b24f", + "0x9de02048489d873a3b3c22cf74d275696aa699ec103b4aff251a2f22ebe20b80", + "0x2a3cc09ec20941ee8b04bd89e38b7cdd9e9f0dea006111d0b1a61a47f77e45d9", + "0x082317557cce01fb189870585aaf7e9af411e7c8cf38b4ef7f101c96b0549b50", + "0x64f53c41e32b0b9b2fb925222bec9676a21ea39b558e2bec0132fd045aca03b4", + "0xe407abd21dc0cb6a76932ac56f7b018bb3a1e9aedbc38d59aca4c8776260cacf", + "0xa6686c4193a6b61439b55658605f9429082ead789e70629860260706a62151c2", + "0x190dad8ee494cd10a5fc87d5b33cad2b401fa8e9e60ddc3152182cb15dc4bf37", + "0xbd81f8a9a639cf29aae2534b2e7e9de0ca54329360fd6b5263b27d8c9c3320c8", + "0x60923c3f36a0cdd88877ab46cbfc471eb43313059ec3fc814bfc40710efe24b4", + "0x7bed716f7a843c885688ed7af46771588f563b63507f0862e822ebd8077978f1", + "0xdd4a6184be0103d67fcab1ed07b91257b7c337ccf5dfd651967a9bf51de0ad7a", + "0xb675cafb5bedda4ebd58031ea37b88d6a5cdc6c70d2302ef2c8bbca1a941a434", + "0x1e84b7b0320b305d21864238c1d5309029d6f236705e86ba557ac4ab3286306c", + "0x07fb4aee552ed17b6633df226091a7440c6e8fcef8defba0b74dc26e3f63bd70", + "0xaa2af0c4c0e3b5e10c6bd02f9834ea38650d21ee6267f31f59a94b65211ce71c", + "0x0ffd43f9155d4d98d28bc491a351e354a1597aa54180f5a7525800f366205d0a", + "0x47a3c45224065eebf34ac0c544487b07bc81e977380845ca3599af1c9ad1fbde", + "0x582a6e56abeb12b0904f5e72f292ec8eb7087a9ec904f704bbf4fb4b626c761a", + "0x961aa84e2f69cf7cc86af84bc5eebfa47f16f69f31eab4ddbb6e34b4ad78f368", + "0x2fcc76736c384389f7bcf80af928b1b2d5f2a666ca7c7233855a38e2f5fa7a16", + "0xa5f51bfee955689e2cfefec36f6fa11c8c39191a93d55003414649089dafedc0", + "0xc33e8750e8c0c9be14b844b61a6c1c6a05c762935a28811a1fb61b9ce613b8bb", + "0x75db0ee106632fdce0d6dbb847f756344f044ef0783563c41c2212a47e140d1e", + "0xfd48e7fd4bb7e075dec1c506cf23ce165151bdaf95902a4d33e174658c5fa872", + "0xc06795ff7239caed1d216e9c715b56b180c131cd8e7303518c8bdffda6a9a293", + "0x6aa82ce836cf55ca0180fefb94631376ca40e8d0b8929a75a011de0b617ae2f2", + "0xb9b8a68c9c52fee3911f56dcc301138864c45af8157568df0a25f1c4bbdd3985", + "0x6bf761d69df953d56be46933bc155b6d5cef72fb502470a02dd4f376f6642152", + "0x5a1282a8d75bdd8bfe98800b202b31eb8d00e05a7233bd3b94ebb724ccc78902", + "0xf7ba12d853026203a0ffdeea4b2a7f2c765552bc218006802f2fc3fae24718fc", + "0x20cc11d68ba309de6ddcfebf6af9f3dabc109e4f80b37a553652e3860e4e718c", + "0x1a348abe945c24781cc3130841d9bd7cd3f65a4ded62f03ca43e1edf0a3d5d3e", + "0xe49ee1bc38403dbd29dd9f1d9a0c30658766d190a99d88055beb8ebb3bf68255", + "0x8d11133a1e20b7c98a820626c3c7165b99290814807450582a75fb66cbdcc4a8", + "0x82de0eb96093abd04ea54056408859c5df792f9b9fae157912bc1612e946cbc0", + "0x09a05827e3d8ba4ef391d3a59499d3f4f0368725fdfe606b2037c0da1fddd04f", + "0x27afaeb9233d09de28c35d425a826c1f8ed5d9aeaff974e30bc8267119f181da", + "0x8c20e9a837f4ff4791d535285e97e0db6fbbb6f90650ad599ee8cb539fbc6fdc", + "0x145c283aa63d68999c2cf54b3a1db63e7e1c5cdc513f151620b7601af93c43a4", + "0x33a610d432ac33a5afd2d4f45cbc7d2d38c3b2306cf951354e8caaa6c80078d0", + "0x26b9f9916168a3a3824ec188e9fbb4740e38f2f01571cf6f5c5f797515420a6a", + "0x02b0b674e9b1bee1606e1b04d74cb568d257eae593e53291e02e3c63a5a50a62", + "0xad6a8970d964768a29ae2c0a69870ebb86257043282e901a08c83347f2f576d5", + "0xb3432872f6e00304d0c7f697e4d5bc84fbcb0db519b0b2d10bfc59fb7a66d0dd", + "0x801b0b76518a3871d99475a87ffa410966ba140ab06ba70bf1e0f986a75ea99d", + "0xe30da2b86208f67afe68b136fbad8baa2dc2085798178be34793e4fd28276ed7", + "0x56d15e4935bcd3441337544b0dfb1be964594dd15ede8920c8aea890c0f5f3d3", + "0xf2cd6dd6bde075ed422413aa2a4dcf7ea831e9c0b05e72a11284702ff4648695", + "0x8d0d6a0e37eea6274b66eda85cb955a480744eaa0ccbbf6c53a2138c2ee7f6f3", + "0xde0e7560fafd1f6145705ce76500d117e916a549c331466eefb672d5d1bb683c", + "0x378f9c77586f4204fb0eb4dbde4c1cd5212dff3dd00f78ffe4d0a7fa993b4420", + "0x38d96f59c01f5677a8f0ae74c85ab92f403d3e0d458dff74bbe30cf0bba9bb82", + "0xa167bb791f78123df4933c7ce81adead29863c93383fad587e0736eb9f62f96c", + "0x1e2eee0b810ff2e3647d4241f0ae3c10de6ab1a81783b141929ce29f50f1b611", + "0xb3da422014ba7a2b692577d4831ee8a2fa0e93075c6e3022b9fe87e589b03ab3", + "0x36bc055c7f7b0082ed73b69ddcfee537ad59dcb2f79f11f32302c781a44c1138", + "0x7824e636dc9b3c3082dc8d7dbf90b75a6694a149d1451070cee9234d3d1442c3", + "0x3a7cdb84f95330c17cefdc3618f67d67930923ccbc1a9233a303aeb06c900908", + "0xfd200a9779e710a0474fdaa7c2bf426748bc17fe8da08699c0fa863d0dde4252", + "0x0bb5f63f4fa916b3aa8e92537a98a9741dbd0191e8ebfdd1bdedefee6a03ed27", + "0x58d261dd02d2d38c4d9d64834659bd223a694780f8b0cd287694299099f0bb9a", + "0x246c86e5fcb56893162362ac404d498193ffe74b43516848c73e3d2d2f1ec680", + "0xe5094d30072956be53f7be3d77e4bac8ddcd8a73781cefd6731af1ebdcc3b9f2", + "0xfb3c6d47d72af2421fcabc66965595841a373214d33e5ae4decca29928f9b8eb", + "0x8c88883b7846c76de5512b190be454046d88c529ba80800db53fb6bdc9f5c480", + "0xe3d7ba4090d3273ae1d0a79a999b256d888d1893cdaf0f9bd046b01a2d35149f", + "0xd832fbf93a01f4f99da4c824161dac8fb5ba379d7a62bbb11630fa059eba4bc5", + "0x2743d2076ecb58f172ee8f2a7c1dcd3284a86f4b38346898c9a0e30cd1c016fc", + "0x375ba23cdd92078d0c1eb959a84e83f973821b7c5148c78c2b5c911ed89d4a33", + "0x22037d3589911f11598fbee2ceea39758667a6316b6a05dbe016c8f27c0ef556", + "0x077901299ce69ce115289009bbd864d5bc412b227c9d45b0a258b1249d1aec64", + "0x0f3356271576310287a00a52bddc9da2865ee028b30319aa238018d1dacac7cb", + "0x4a3d3a133af48e90299cdc0ce8360a1374c3ba7697def7d71ee7113172244351", + "0x32734db80d04af59061f913484a2fc22f0b13778ef049e02e8f9fb30e1da9d39", + "0xa3a472ea8349299a3378e0ff14369ee28337f73a475ddbf508e74259b998067d", + "0xbf358991d9c5ec46243f526f8c322c70f8eb6e5fd99954cb8dda31406cf492fc", + "0xcdd3269fc0abeebb8e44e74b5990413755665b3f7ea6ec763dc19091eae902d9", + "0xb2347bc4742f37f82069ad24608916ccb17e0b23097b6f50c6ffa672f9d7798f", + "0xc950786f85a20e53d496a7f6f539dc93ed4db152ff3fa07ec9ff545f93b98a2b", + "0x5524afc5be48482b279a86994b227152a9070e998c7a8beb8164024213cbe865", + "0xabc025567a68660848fd0063a75564b9fb1483d038cd5a191fc9bbde69c91374", + "0xec61a7238f379549a2b267fce0884513fcae479bce9aef046298cfd35225301c", + "0x0646761899d9bd075b892cb4b8ba2444fa83a8674013022b784e91808241624d", + "0xbbda1dec49e56ce2d3554dcad78a37693eb6437a5e21cbf05a357c2663f6e144", + "0xe218e9d37ba3f4544dfdc31e3332eff0c8a9b6d3bb10188531d4e2de4eacc3bc", + "0xf708a6e77a00c47a72d9f019165044d827a26d9adf51ea53cccb6693063313e7", + "0x3c9f9d34166dc61e2e7c0e15f0e61b0ca46462f7e136f0705c49524019cee3e4", + "0x0c4616a6f0f847fee88f1b914118c3acd207f7e2d84260db50137d1daa6e891d", + "0x5e34ae26c1072f07b7815190fdd67f5cb2605c849300bf28e9ea6c3eee400f77", + "0x15ae51496b44825cd74fc5d34c964b9e2764115d287e47bac9744eda09f6204a", + "0xcd6a8ea1da8d5eeba387281ae5e3cc2edb14b8c8ebdd87ee604bc09befd0fd6e", + "0xea39450403c2fefde5f54cba19b8fb2845c282d9076bbddcd89c4d030a7d786b", + "0x51a9808cfb305f3d1d2dcb5cd8355ad295ffd193f503313d0c23b631d70c85fd", + "0x94473e8d272904770c25c158fbb2ff05d41de0a1cfd1f0780b99e0c70e6da313", + "0x3b78c5f500f3723cdcd7225a83749aa6a1e1d6678162ea667df496a9a59fe822", + "0x3c02d338e7ab6b10a91e311dd0d7fe83bc62f4fb90559535e15f01a6a94f8908", + "0x254613902cb39d43f8fd4efdbee4ae29ee1f73df829239eca702c4c6b76a8056", + "0xf5a59c3ee350c1b5360a790f713b054bf34370f18e7fb3e68d5d1544dc142b9a", + "0x7d8c61e608461215a5190422cb8cda548f67de7d396c610a7043a12c38797f26", + "0x21f61007950ed1ff63140a6533b5caa66d6afeb768190870a0bfa56bff4ba249", + "0x35221c26f511f1d356dbc6cd33354ab04270417796b29c26cfc208fcc22a1926", + "0x7493f5f0d913201df01cf514d9209fc689be68f3759cf7487a0d9c942a4f0eb9", + "0xa28f9fd0a06f07196bc4cd235f86781811d26ce87ba510e9d089ff0ac48dfa09", + "0x296f7a79477fc94384c240d103d3899a0979bc7680ae6b0c77dba5b40236c5f6", + "0x4f610acedd15c3df59a079a3edf02ba8c3cb1375cb54a86f9b8b7aadd3bacd4a", + "0x78e6df69fbd9a8a51dcc14a9faa99e591f6b65cd7aecdced5e898c3207c88433", + "0xb1c4470ea0cae862dd84e77be0aea69d045149193ee2ede2280aec5fe2bf9290", + "0x2906203e1e907396b983b5ddc8f53c026fd8d278a7d580d770edacd560abf9f4", + "0x172486825d1472fb99a53996de84a6e58e9d1c25ccc9eff81ff660728fd35200", + "0x0d85f1ac03ed46541c171dc9e521d58e50c1059ed14591f3ac01870b0ce6f4fe", + "0xa327265260bf6252279cb97e7dbf25a423cf979d347251e2cd548f902aaa5333", + "0xd2465f53b0d477871e9979b56e1c4de2fb81f5ea6657d26d9142ba450f60f9d8", + "0x11c5da85c8ef6bc2afb51fb8c85d3e15e4dded355a55bcca7ab03fb9addfd9bc", + "0x8ae739acf676fefc410ffacb01d9e588fd94df577eb88c86b29bc9b97fd0b39f", + "0x9b626245152f0c1fe45650dbea9edf10cd7a4f4a9b9f472a4f5f58365b736b7b", + "0x2ad3f303486ec33231a94fe6899f8a6881c6273556afb9d43df10557ecaa2625", + "0x815535b3b87aa7cdb45dfb6e08248f73d50d2e97b3919b7c6d4be0db82ba736c", + "0xc5b2ee3ef00a78ddd19411529d9df0415b598d8bf8b0e9be14e0db3abf75b538", + "0x4a43c2151e9bc477dcd23bb690f59f764d1b4f40b434d0bbd229c2fa33187793", + "0xc98e003d7f67589e42dde11b6e5c4337e56ba5379ed36ba64e328140b66809b3", + "0x548d00d6d57076dad3ba99c12446fd704459ae26efb2f32f31ed8cc002d70472", + "0x220074ab3e4ab2b1478ea4e671da8f4a29cb63820cf444b8b8c80dbf55dc7ef7", + "0xa605579bdd11648f0569166a6b6b9fff1c5f5314e4a4443fb45e779b6ea67f23", + "0xbbd91c03ba7a25c5ed6d2c3efaadb9beac37bc41371d1627061bbd1b07bba2cf", + "0xe5a0b22f3733c62c253ec1d438a162bb523d600078b137ab64a68acbabbfd591", + "0xd62697c4e5a86182930e5f03370ee5ae429897299b0a089942d0affad839c396", + "0x441bd17de05582bccadff86e92e1093066042c74ee6dcd2a3d372fef2464a25f", + "0xa1c7340ef8700794a780d623c61611ec782a28e89744f2b438cccd582111ad84", + "0x8325267cbc3f24ec1ca175420d0a1efe55f32bba8856cd5649a06c1c2dda7d6b", + "0xa10890568036a3d81ead9346e8b5d272ea5e30425351baf87fbc87c85caf12ed", + "0xf99feda98b47b71aa95ee45df084689e805639fa816c19726e8a3a7bd4fa714e", + "0xafde69e66a08f8d67df3328ffa50bbff36e596342becb1b30de9d63c7ddbe779", + "0xe6b92570ceedb890e38cc820fde3a63f08ad816fe36690a8e0e3d590d2fd767d", + "0x8d8127ae7b04e1c40e690b67e6b0ec7f84ca3048579826f66e6c2f931d0e158c", + "0xbcc4f1260c39444a096c6ad54fdf3b83ace0c5b88d1ed08a2fc36539b50ee6e0", + "0x186074682f41df28b76a245dc37378308fe996b6b1c033daf582bdfdf6a99593", + "0x62d93c7126ac1ae0d815460a87ce1b7a2bacabdd7ce02fe34d4d8c1a62960a9a", + "0x5b6a7a8fce8f9f7181806ab5a3c84a5f60a7bc4ead1247735a43b08d225195fe", + "0xc848fb9925e445d3595c338197ac7d31296d9247f43f2a604494bd63e3ce78df", + "0xf40966a6c7666339a4c136186fd753079739732c2bb724cdcb6047a5e5d2ef1b", + "0x6d8c1765efdff94ab61b3b4872c1acae846e8a98c763fc7924cbb27865295deb", + "0xdda74969fd0e49dc1e9bbc04f8e3dd952ce0e9a98041c7599058bf481b57da8a", + "0x72ff550e2a8f2bc45918e8fc1deb14e4309eb8cf03629ec83217f06e457dabb0", + "0xe03fa58b28a8e1b601846bfccfdec6a290accdc467898caf0be38acf0cbe8e30", + "0x75c3bfbfe321a63b96c376fd1cd3dff0d06308c1749c5544ea7bc36b0dd223f5", + "0x75880a9c922a15652b74b9114bba464ac49626fe1df76d3aff3e6def1f8a9ff4", + "0xec8655c4f3280725ef24930f547a23988f57b407ca7962477921c65aa8d582d4", + "0xaf3830d825b5ba849d7a7fd8de3d74683191ca71eee0c5dc13fcd45892ae739c", + "0xacc6f31736270b88b54c0b51afc6c3d4388769a9a76befc1fe2f8c72e4e62c56", + "0xa534247fc228dab8d5d42a2d8aae86d854deb257a81c7ff19131656a3f1aceee", + "0xe2895527939deb6f2e6367642c0b6b13caa8a9888338ede14c60bf12bb5a54da", + "0xe59ac0c8184eb0936d6f5eaab44aefb441e5e2d1fe69e290868245b04935d924", + "0x48d2dd98705594a63855f3c4ebe02695f6f67b89703c3abeabdc11691d6aa10d", + "0x7e58bdf9588e2449e7ea947d05ea19c698450df9cd188882a23f5007aaca9e7d", + "0xa0974b5f82e5c03e874a4edb97557450a5280904c35d863b5f14eb1860caa681", + "0x4ddd9abaa7c78129efcbd0a47611b735c69d876626e7b13a5c6b6cde4ef6b744", + "0x065e3d364e47bd0f98ba30a89411954ea051e38b487d4344beb6fe59f5bb191d", + "0x4732727e9fd520893173d2a334a0fe55ac63dd9b49956eb13b2fd89a6e686f82", + "0xceb1f7c0b101f66014a7bb3483828026af59328c0a192eaf6e7c04eec97c4077", + "0x87d17806635d4f607567d24f1267b4a55156b92d4021d22dcc312af69a9f4e4f", + "0x1a865d70134d23472644fc40d4ba988f5e9ce3d24c43c39eff3fbdf80ad6a2e4", + "0x757160e251b8c79293c218ea60e6d3b453bcfe8176993a35ab69b067c5e9e2f2", + "0x1590a6f60eb7ade8bf7ff3d1f00bde5e06e1333b1c9c7ab3aacfb7b0d2ccb535", + "0x4262d42ffe1b9b0036b63a4c70df1d9bf0dad17cc646cab635757e9bb97804f8", + "0xdd1e6c9526efe954559d889158c5a0acc6ec7b9184b4323bfdd3205a25863424", + "0x3d713007089684f50ac3bbd9bb4b88dc17652ba2ad0e1e4e980e25ecaee6c63e", + "0xe031bc30250931e60bd8a220659fc868c8b966c34c94c65d981ea99867baf8ce", + "0x646d9776e8465e4cbad03ec86c25704d39f2dee031dff68d8fe4675da0f3a3c3", + "0x73130be5f9c034f7cef8e297497e6d3905ad9ca28ddc6ae4606b2900269204bd", + "0x76e319544cf0c7c037d7e7dfc5a22cbe8e0f08390f93b985942953c1c695ad4d", + "0xf5e6b2572536543da031afe3d1a085191cb363405b2290c95ea2b58a2777502e", + "0x07c89313a0f9582709438509df2eff3dd71d063cbd7465e5e704915583b105af", + "0x4bb2017c31178ebf59a614f3fabf7c3c4a0b52fc560be65a9ca018dd10fafd20", + "0x1aa73d4ca741cbee068e178e9457806cee040aeac414f407ec03be19c57d1427", + "0xc6f1b04e3b6d58a01a3f08a5adbbc29d531301e152b9e952268624472c4e53bd", + "0x99fc97c755b1307b937fec8fe4a90f874f62a734a19761976ed178dd1f66a6b7", + "0x1f60601cfebff679cd55ea8d164984a902aee16f9409916e30f12b83d9d8ddb9", + "0x2777d5ed02d18c45209d28adde18152b50565fccffcbf792fa9ad08092ba4f5f", + "0x081ad560b5fe6c1102d728e35b89294da36e6f2abfa7487b069824ce07e31067", + "0x4348d38b71aac331b929c1db4e33a7e3ee650dc7d7c7944b24b9c815709864f0", + "0x6522d302c92d109bb7a481ff1ecc01b9f9415ea1e447e91721959f5cfc64b6d2", + "0xe6e8719ed1687434dc226626d83e6a8cd317418e3b8feb41b677087e9c848658", + "0xe05f788540f52a58df08bb86344e1a0b8bff2c29cb4cca07b277e729ae20be35", + "0xc939ff4b5cae98c9b65bae38a2a9f0ecf7fab9dffd9d89f4c3c43a645b6b0ef9", + "0x3da552ed48e9cdf2325e58320e79083cd45c6c891e1ca95f30bd9a6cd74dca79", + "0x46543e616a4fecf94cd4d92ec83a836e072d6e075272ab3626927f661647bb42", + "0x10fb4585c8ac92719b0dcf6d735fcf3cfdd3fbd5a56acd53be227a3f96df61a0", + "0xeb58e384a7f55adcc5269da55ef4bde232dd9b4179757619f75a8bdba729877b", + "0x1bc53b776541a38ddf5aa1e21137a94fdba7a76f76b511b767474bcc8d6ede98", + "0x8d7b8db0737d9ee9612f232bdcd1c35be0a8536dd2bea3b4cdf79813391903e7", + "0x36a2279bdc7e5d17c8ba0479b563a5d3304f6e2ff472d534ee698315706cd4e5", + "0x49c45d4b2e3d01230ce8072d8b55f25b715b87a0f8b6c82cf420429435e98133", + "0xa62973c2b8c9e0bbfd28137a2622256e5094dd6b69003a84cb13ec22c57cd41c", + "0x0c9552fc3306720151bef2a6b13a24560b932e0d3db36b1b167d1afd8aa7e341", + "0xd40c221db7809051f8204e132793a7998f7c1b285c3a2f52a1de9d0a0262b703", + "0x77bd0c7abfb7ba1178d75537eef04a618a61e0285a1f4913d414dc1191fec41f", + "0x6d865ddc6512a32b54671ff7c9732326e967aa0deea9ecfbe811be8a66247c6b", + "0x64e4787de14840b123064911dcf83727683f4b59a1a60b2dbd2301aa50e150b1", + "0x1726f22f71e69d3e919702809f5be7b4a855f127427164211bbb83712899bb60", + "0x7a0ce836320b43e8fdb8b1789af8a856f97ed401167309c8b0eb7a99f73bf41b", + "0xcff5ec573970e3984409dd50d911dae041fc3a51d2035c481985f2d36a40a018", + "0xe308ccfd734d243298f65be9dedcf0320e5fc6ffe28bc18a4abf7cf30869fbb9", + "0x6465d11dfd96a8c36c86265748197b9ed81056189467520d048e320da8addedb", + "0x6da91a602c5b73550abac25299b46a2f8727c5f156c1a7ef6912cc30ac60247f", + "0xdf85ef603adbe64ad1d06d903bec6d0a136ec88bf4788acb4b1d6ef256c4f342", + "0xfbf21ccc3a80affb14aa36fc08caf0cc6babb271becbf5d7f8778fc2e8e2cac1", + "0xc9f2bcb111dcbc477ae94b7ad5cdb7747aed186c8336dac2f04c41efb8d9bc68", + "0x54eeadf4dc7b7d9aca271a0e1b86b1a2cec0edb59da9a267d2254a635bb888b4", + "0xcab9c1cb0ed4ee12496d612fede759e40ca4937d21a370cddfca557933795f5e", + "0xaa53a4d43024db7d7d55581b7c690d2894661b137dec89a667ee60a0066df278", + "0xe947f3e7cb27ee9acb3e21771fee420b1b8d95e8deead159fae0cf3d3bceaafe", + "0x9111f637e6470bc6b200fa0af8314fbc2a649432f665fe505ed6c35782941cc7", + "0xe07f2cddcc582df384760910f1e3b01d25c4fb76110dfdcc565e89c179317484", + "0xfe9f06aea3dddcdf1baab052506a89a671354e36ad00b0838414927e2cf7fcc3", + "0x84c6fe378564403f23d29c3d15dd1b15e6d376fcb9a95dcf6bbddbb32e18f154", + "0xd31439e688f850e75895edcd6af76c55a2d9288bca689c6955e3f83e621ab750", + "0xdcc931be9f3ceeb04edb4052abe56b79fbddd84eca955392801c527923178d6e", + "0x72c462d90b888f78410307496dd042aa6aada8de17e2b112bb10f245adb89f88", + "0x3bb25b18d8fcba475e66562b6a685a18b1ddfde6c8bd16bce45e0dfbc3a54467", + "0xe4678a3925c238589fbc5dd61fa3b22f8b6893b206291c5982ac9ad395f45724", + "0x1d493abec856ba109aa3e21afb621510c1abd38875ef1decb5d790f303d8322d", + "0xc8b1820789f1aadc67b6cc5f7f9a0b9018bb4aa274708621c036cf670db899a6", + "0x116d77b470c6d37dafbe4d2dc110d2dd92420891f18c2f5b8f43ed9341304502", + "0xa9b47217de308165e87d8a2df2778469b4304c39cd1d743bebdefc7eae435832", + "0xbb1e6776f78c94e0c37119952ab925acfd70cd9c9b5ec8d2286cceaad547d537", + "0xfbcaac553ac391cfc5578cfde41837465a132606fdde27e93706c64e4024b4bf", + "0xb39f16fc4baf58a30a6cc625bba7a6ef7427541fd3f44ec158463bd74494f8cf", + "0xf4a3704d5217afba230999e16a8af8c0df77a236eae8fc250aae3b0ef10c704b", + "0xb1a8cdad34ec1ef934bdf49dbc910b4f23346fd6fec4ab15617c77b539b9dfec", + "0xe773a6a957a4594421c4b682748df2ce0924c8299caf31e821d7f2da89ef1b0d", + "0x80703bf02ae8c47b20cdf35017460945d31d43c9004307a0f68fe15a79ff4422", + "0x000aac49cfcf7479f54da63f6cfb15c358e58cc50dcd4f178c1d48c7cfc70ac6", + "0x37359a207f2d1a5d483485e175a25ef1dbd1597593489e03da0855d5b73978f7", + "0x36649fa2d11c71a4e009fb10e118d00e6bcfb4947c7da998042766aa65509e2e", + "0xdd367d7be52578d809f2117f011bbfab36e9f10025248764f65b49c3e4c6f2e2", + "0x1100529aba908d0134d124c320ecc5ae5f68e55e2c83d81e153b9b84730e0348", + "0x12b9176f9dfacc4c0e07b233a0eeac51661c9ca7bd8534bb324c72dae99b8869", + "0x141374e0e24f1d70dfb9fcd8f49f42de1208cb7268d18bf11dbdf60047a4373d", + "0x5bc84c71853b2f6ec0e7733d7b12cdf644af07746881174157d25046a3cb0c15", + "0xc0b190e2f49eb4a8496985ac98feeecb61f8f103110cbf4b0f404f086eb90dc3", + "0x1baed721a6b29aaf434b0de72486e92c5dac340f846d0db2533aa74ab58c2fe6", + "0x7bf7d41ee40b8a20bf80ab71b9674ff474a9c0b2b0b3b768f4d177b118f55021", + "0x461bbf7146e4e95ea95add280d7b7199a5dabe4bf369dd0bbb6d74eb363eb399", + "0x38728b104efd235331b7e0e2cd519adcb8333682fd48e404dab19b5a0fdc1eba", + "0x841b6488a00830c28b4b1517134f01a071015124a6202abd48d7440b5f6464ce", + "0x00b07f0c3e6fe366d115950cace606137c284c418e6353adca18df07b4224183", + "0x09bf2e8d2d2ba69603ee2aadc58f87dee12a0a07e091c7cb98e18c00242bfe98", + "0xa94a6b1b9cfc8c6efd37e74635630eb2a5f4dbe1a6cea2d2f0b9ada691f49534", + "0x995162698367b47f8eafb9f2de2e8261ef17ebd9ff4565d6578dd32021b4b49c", + "0x51728725af93c6fab7f955cae9158aa0cae132b7977efb080320bd5540d4a246", + "0x7a901c710bb225aeb851f1f5b92fcf3dd1526018f34bf94cfbf0081b9e2bc252", + "0xff8057f4427717a343ac8a056043fc6f80ace0a9166d263a8d12c52c7d985148", + "0x3f2a6a04434fa68093777e69a0648da8ba8ae27b6264ae26f91a0322ae6b4273", + "0x875175a87bddd42be4f2115630976f143b7804da25737dde75f373a9da7db767", + "0x0ef0d47ca0cb90186b0db9b7f69438dd7d416414833b993d1facea8c190a2cfe", + "0xe70920e1e8f41cc04d34b2381747674d64dd87c892dca35cce6be3c21c5ff74c", + "0xf6bf1b5438ad9b45d88310b11340fd5f961e0c3f97d25cdab298466485ff70af", + "0xa86b8867cca790d03b4508e46425705b5755071f6b196a484edb26eb77d669a2", + "0xb2462de4b1149fe1c462cd4a944c5800209426be3196d28432d22d928a6e3b56", + "0xdde87562cd130db3a4cbdeb300e7eef5ecd884751b9692b3530253da3b426d3a", + "0xef6f3bcf6cd610dce1327131251c1febcfb2c8be013a2cdeeeea1d7ed2145279", + "0x49c449580aebe61fdbbe7b659956cdff5d34a3d7078f2d531e1dbf9e78fc707f", + "0xa7d87aa0df5d0f8c84f0a11ee2c5d00acf63cdbf98be9244ab37ee5c705c1991", + "0xa8ebb8e6ad2015dace964ede93c8014d4fa3439aab2cdca09100c337be0c87f7", + "0xa5e855d01efd43ce43dbf196eb94199ca4206ae95fa293d2d43dc58ab69eb5dc", + "0xde56b2630dd3988a67d4c1a8bbfcbbcd90c99f0162ce697df8ba5a2fafb38681", + "0xd1d6195544c51fb80f41bc2ee4ee73e44536d8b2d2f478d719d72f0b7880c09e", + "0x2691de4f1ef0d2451f07454d5419abeb80502f4460bf365984d46a7343d47239", + "0x3eed848da0595777b65d377857ef1097d7c0e9d812bc0b1c334e94a3cddcadf2", + "0x82b5df95601fcd73e1aca3706974e9aa9f704d02715ebd750fd0603522850e72", + "0xd4597a1d9e91391da18fa148006db4f439ed269360a8415b35ef74eb3e767f5a", + "0x3fa8dfbe6d64ba346d07559d4698263e63d8bd456f114eae1416bb993d99e64f", + "0x4336ba517815c335dec9a08e7d1857fd3e668a12dc8abb0085193cc6dfb60463", + "0x10939a82565c112b767fa5d4c5628a670c5623f1c417a175d09becb077aba66a", + "0xf3211211715089b537ae8c270d7bc0952bc26994d070ae4692f1aa4c850f1747", + "0x719010b1fea904cb96f56b5a16c730839f030fe8f967595a2647b57b67a7ffb5", + "0xf6c883fc56e57a70259f1c1b56e94581efbc18115a13e7a83560e32458a78c6d", + "0xaea535f44b812fae7f3a7e216d695c4b709cfce4869ee4b0470c6df99a6abb06", + "0x9e659a2d3d72b13a65fea0396623edd3c2491d309ab195ddfde6e83832bf6764", + "0x35047f5b4aa180f07d47273ab0d9ea3dac5bcaf5ff3a80ae713427a3aaba2f1e", + "0xbb35cec8f1b8fc9707994df6b93dba18342156add6290dc6f906c8c06988b080", + "0xce5aae3a026f15cddd8bcb904ae984b27364c85a1db01669eb437a1d2ec116db", + "0x5b80480132259b9f159917b9af112113ff6ab2c9cd3587080c4b45118c9f5912", + "0x20ee0b82e04f86a6936971893aae1dd6c9f4a03b78d0ca6e5af1d195d8779b7c", + "0xa4a90b7855d6fe80b403c5cdc32405ef1156ab83015d8a1634560b4046aae931", + "0x32e97984751c36a6ab0f651b4675d70c8b4ee461afa7daae6bbc65760ec7029d", + "0xc1c17b3f900bbbaf392ba82c480c90b706079ae1c559f5edbe9e8cd56b0f41f2", + "0x4314478c7404a573d1e17600f07209b331917459c6756de910a81071f4e468b6", + "0x6256928f29827180db86269ec33ca31e510b8c2bc287aec00281bb4599cffda1", + "0x91ce6107d89e783bfd9887e9f2cf180e029c86886287357cc36cfc29fdfad94c", + "0xd5937778af97763ed36c35a9955b1f840c5bab2032b3418c11537f896596af75", + "0xbc3580fb9dccc7f6a214e4bd3c0c09e2e9a8b8a8e2de20c841082465e9fd64a5", + "0x3a1936cb41e17890be0e162ea95ab908f0612c20fec62c22c2bd7ff1947d0482", + "0xfc4c9e86ee1f824fb446a966073bff965fd116b1618904e9a8397cd586bc7107", + "0x6c66246c94ad6c8e2b8b7bc90690775338c238cdf431e53f4382244256a5bb8e", + "0x3e56991487b66b41f209ee749d817dfcdc1aea634ffb0b2125d4a086053f9a5d", + "0x6bcfbd7381295875e2d7a2f1d35a96320b0d222ce8187987b9ce693d1ce0a5e2", + "0x4580fecc6d2f4f9e68053b3067b931b252e5140598120fc3d593ae2add79da85", + "0x69afbc59d9d5f2aea003558cfc32bc0f59fbb28bcbf048e83e67dacb2f051a9e", + "0x6f20a07738f02c250baf47779acab06b31ed2713891621cbdbc3a33cb1a0f1bb", + "0xec3ae039172c3f35b12d185048c7ae3e9ebaa9afe3b01fbe9af9eaa8d132ab41", + "0xf8953caf4a7078796d54a797424db24f42e22a1257110f429de39365f87eb167", + "0xf83d0408a57377c2ef00481c15f0fa35ff5bbc53913456f2ffdd074614b728d2", + "0x120474940e643c946c9b1d0411ebe85441681cf7674dafc7f437085b78a26fae", + "0x7639039a138a51df89c0c06c08353ff3baa86bb5f4846860b62727ac9e98b75a", + "0x0c334c25b7bc1d64748cf6b1a21b64ca859762c239b2bb63aa66f0192bbe9e82", + "0x91bc6284b38b103e31cf20d99b8f94a5f2a8714e05ac021b8139e51ed97034f7", + "0xa119da5d5daf11ec238315f7eb7153c980b7df420896759b05d6e0cb9c15b099", + "0x478774c200ade9d6bcd6ee55006191dcd262829396f5d1a33c5104838fe6a998", + "0x72fdd84d4358dfb09c172e0e91f57ef0706337e9e9e6de1faf28a5ad1993cbaa", + "0x40d5695aa29352d0b03f4e367f03d50996a7091f5210774bea024421b4ea2efc", + "0x5ad627cc00bc5fca0ad8ddf5a09d4e310948c41c54d8650da28817efa05fd8d3", + "0x090a72d69f2255810ac423e447d0118afe8fd4d656d198f9af6fcf16725c2cb6", + "0x16ab98a77e42ca0084d5b6f0962c8d9729569a3ee5468f404b31046d710be31f", + "0x40f3eed9711a132dc483b6a1f911d386228e67b12d23d9b30c4f476bc7869290", + "0xa92722e58027878eec3a115f41467b420af8c4ec901f8fd8b2cda0208e526deb", + "0x1f341f622cba201761ace6fc164b5ffa90c32cca3379a9bcdb0b215d347b2c1e", + "0xff49ac00c27cbbf5da17956b19371e5ae8a288fd6ff7562b7f8f55d6bb356bdb", + "0x6a856bf3855f801748f3c259465a30574eb720db4e4547feaf9a6a3c8fba9b66", + "0x4367b7f1597bfac50a191888271edb84e9ccbe98340a3e896abc1410f6c2fd49", + "0x3a5dffd2b7db4b4437983e21126581c6f0e5b2b2fd7a62e3b51caaf415a7488b", + "0xb96ba50acd12ffd0e253514b8a9d9f8a2387a35f6eda3a63666e7a0bb5a74536", + "0xedc56a3af991603540ab6d8ac47c383e5429213abe2bcfa6e48ff9b7ac4df978", + "0xd9248991faddf6a9e2939921f8129a2b88ed785c0f0e41a11c16ff2ecc76945e", + "0x788ffda4f94d6cd932b41956dc6d48c04b17e75a019ddc66a452ee0be582d324", + "0xf755360190f6621f8d319a0a3169b62d0ad47561474b705cda88ba44b4ff7f22", + "0x412e8de38edabd1156e6c9f948c9f9aa0c896499f77aa5332b000cc70053d868", + "0x8ed82eae843f37e7b41dad6a309b6e2deb3e7ba09ecda1083e3896e593bf38ac", + "0x450ee983d78f5da457d1d44e83c2994194bf0f88d16365385da07a6475dc278a", + "0x068f39349ae7b94ba18f55e5c56a4d0f4fee5f3d6506c91dfa486956b886cef3", + "0x1e0ba420bf0a554523d73b0d7dde4ce1fe813feb445dad74913fc0d60a2fcdde", + "0x51dc8f1fe4e01e1ab6577a8e82506dad9f0269dcb4fd3f355edcea3565c2759c", + "0xb1dab28ba4711c54adf76b9606b6d7dcf2b9c6e2b5957e9e97350e5ba703a3b4", + "0x51234eb88a707e5d6844d09c1549a2381335d49cdd03dfa92506713724c25591", + "0xfdae48e9ed96dcb8eb3ccc35c84a342e9e5314a8bb04e5e9dde16e9281cb918a", + "0xf9bc67cfc4401b08c467a61590909fff1442eca8f0be2780f28a5a9116a08655", + "0x53212f1b630a1e52f27d7698ba7bc9af6b94178a7e57ff8861a8c9d0ca9924aa", + "0xad4b53eac401436504a3768f2784fb72ad48ec2ae1fd6f80e842a3fe26836be3", + "0x11eca84857ac81b5085dd50a4a10c8f032150c215ab8229ef4335fa8c6340465", + "0x41c288fdc4d9a9406e987d90b11a3728ed3c9a77e20bb7e5ce34d62ca5166b7f", + "0xa73bd71d818dafe4633209ef735c6d58b086b8c805442bb57fc46ceba9a7517d", + "0x80cf0b2ca45900bd5705c14c025c53e1cd4f180130060e8fa8f7112074300c1f", + "0x5795c53dbb9fe7e3a9b3998fc213a4961d6716d58e2c9727d3aa2d5ff7758cc6", + "0x18d7ea60dfd5e763aeddd204fd2654b52cce96a4737e665e67a952d7f9d40a32", + "0x88955311540d5b5333c728f976f4bfce14a07839fd3c4d9d8488a12cf99c38d0", + "0xf818504defde32f54d398b607eceaa073e33f161eb48f606cdcc203c38490577", + "0x845a911cadbadd8800dad80b820fe953953df4d0e2d5cae24bcc2027a6ddc08a", + "0x35a1001cda605ea277494b223a6835667b8ecfe4b5f733444bfafc760efc2d12", + "0xbdfed38c959847df8ac6f43a301355fc1ee46ce0906da434a4db7d05ecf1688b", + "0x5f1d4b9dd2efbb6bd0649c23f214b055a14f02643bb75b14754cc2af4901825a", + "0x6a8d121588d21dfe2e94a38bf6aae3de47e513917a61f5b2d75fb5ffd391610a", + "0x0dc0cfebad3445a400760669f16d711dad869a4e87bf579d0745e6307b1203c4", + "0xee23bf9111193c3cfa4173a224752c6e8c52e2b87327d6aa6164cea231d29b6e", + "0x37a2e1540239c7ccfa424d72f2092601873e8d0ade78e4c5b422a7a3e5ad3bb9", + "0xcd9b85e253cf016c1e1d8a6479387c1d6e460bed771e6283462064c377aade65", + "0xa1e924b638bd740dc0a8710c188d3b266e3e40fd1b1711dc3f30234051d1c552", + "0x6cf65402fc320eb643b795fcf3878732799389d54f59ca521c9d265f93b5ca9d", + "0x88c6a984e2d74c2d6ed90de3e7341764e2c03e640226c36d895254458f18799c", + "0xb8947441ed6817ddb0206da8ce4eedfaa41adcc461f13dd260559f92cac0507f", + "0x92f4e68423c159cee14f2feaeff830ffd973c386bb9e09a8620024a36814d858", + "0x673d7a32c6c60c83431915bb032bb0e41f26bb0175ecae230041070c62a09042", + "0x7229d4e3eae51188ccd8cd1c65dcef8cfcfd42ecf39edbaafdc6ec49b43a8afe", + "0xc1087cfd4fcf9f1447f22ccaff5acf35148162f06957002f0a49e85cb703c1bb", + "0x08c0e8cefeec470ed1c4de8117a55c9ba975e3ea485a284b4944adde16a69c5f", + "0x3c3311722c540c28ff86b1ba17c830c537b5eb8fb60f3957404c3da7746768d4", + "0x2db506655cdd06836d09a478ca79cee997f3dbc58bffd49d89b91f449b7b04a1", + "0x9b648bebb498ff6c37d4101cd78f1b3982c54dbcf9fe2c29ebfd2f9b7e04f099", + "0x82c680a2a3eac1238adddb76f6f18bd28bb4818fb30cde24863dc197dc8ec13e", + "0xcc8ed40abb13449df851c4694088283228a9eebc5d3e30bfb251abc02076bc9b", + "0x6b7b737c5a012fcebc781999145113a89e44f1275938201ebbaaed865b78fbac", + "0x795483f3990d7056e6557356e0ebcd0c1a305534b9ad22c40977a471ff765008", + "0xd50325af06de4c2dd53c51a1b68a57b23a1dc9ba1a1ab01299bf3da48e0263c7", + "0x481ddc79fd4eafaa1405c85748602a4012a3ce668021399a309ad7530f17d1df", + "0x776e02940d65eda493f5925362bbecb2e19b088fd51a044c5b5091bc0908edd5", + "0x89dcec4b0df855daa6ee38c26228d1f0f83e3efbcdb8c9f743ee544559f880ed", + "0xd888802df592a2c8779432354f50abbfd89e826795bc3ad204a8329031e0f612", + "0xf148daf80df025a45bd6767db4f260685ea2c8efca1f4f2e1f07a1b46eaaebb2", + "0x42f87796c2eae0d78af26581f92960e76582636705fa747d52f94b5ff9dd672c", + "0x5a7c25f42a4821d4c2a8621c8fddbb0818df1507fceb2f9bce29b737864e69e5", + "0x7f339843b3a45076d4bbac3edce392ce978318ce4fe363a1a5e8a851229fea4c", + "0x66d1bfef48f6b3c695bcce0e1c406bfb413cec8358c62e718880e9531a2e1188", + "0x1672dc0afd5f480fafa3d5d76632e9fd24bcf2f791c03d4b79ce26f2a6b43c40", + "0xc00de487ae1557f6dec118421611a654c3b6e9315f807e18e9285ab698d62de4", + "0x3fd80e20d89463b793ee947515aaf2478bfaf3b76c476b57c80f594b3601a4c3", + "0xeb5dc70e6d66098fe7f431ec8438c3c0ef664fc449d228fb3717cd643b0662ea", + "0xc95e9fc217820b220a1dfc8d80555f3abde3f7811f7719084d5d1439a65b8cb1", + "0xe80d667231fec8e334dd88133150bc6e5aef23d4dee2b15ff9815c191ce30b5c", + "0xb35c99fbd6e410abd0496238bf7e66d68b2c452848d852a46ebbfece862c6f46", + "0xd434d46f3e94dad8a411881bcae2db9cb99506ac8a0354c50586cc81c1867f66", + "0x360bb1940475abbe7168c9de22e43e1e711883e9fb614419dfc23ee3b301c1d1", + "0x8cbea95b1ddf914937d23916db6083e6044b8c52617a71ed140cbf884dca696a", + "0x3cfc521239386fdb6c7c02dbf20960672c5118b5273bf51890df9ad31a388c99", + "0x6e73b52562133ec4a8cd389a352af64705c2a1318ae99b2dfc78dcff1d72319d", + "0x86e6f9bd9edcca335b9169738198aef3a541a6b41bf58274429a29cd0b3924a8", + "0x9668e3aa0d09467be183c811485203df5e10f4e332b2f033f4cda7369d90aa3f", + "0x4b5e3df053f882204387151c1e7120c0f7086a9edba0d3c2c3a505c0d61802c5", + "0x634c9245fe89685be14edb30de2543a878c97fd7506a9b186df5e064b286165c", + "0x10719cf7fb4a7eb4b70192a8494dc071ffec3fd37a17b7ceb10bbacc4cd3c132", + "0x36766864b6d50c50ac2b75e2b335a2b143a1954d61f57e7827cc205c33dacb8b", + "0x4160390fedc6faa039c11711fc2b9fddb40968b534b370ceed6e37e37a0fa437", + "0xe1a28cfb5ae74d7adc0e0e0dacf0f0e197af1ab27626de8b5a56f4dae938a8e6", + "0xc2251525dcd1a93c21f4911f525f8ccfc36a6e4f90b4e275c8bb788522607618", + "0xad403b7913b7d705db6628354f8621dacdd4c91b6bb60b747e6ba6080e37e7e8", + "0x2f67cb9ecf5c4678d1d27779730833825f0bba23ddb3b3c2090e22ad7deef26d", + "0x07df980ce9fb75bf368e179a5cb7b4af1c695aebb0342f25d00e421016281687", + "0x8a56b31e9b9d3c6b2b153a32c99ef4ef65ac34911da645a4556d5813d6505283", + "0xc49d0910f95d400041dcbc98d8e2d95261c2cc9054c8c36a94cd18042794268b", + "0x2030bbd6de4e34c41df9a5471601df5980773ffd594fb8a80c2619aa20a7d427", + "0xfb1ef5d538b7db8c1b712fbd6002357fe95aa9009ddde8df604eccbd66b57a0d", + "0x7a623749e4bc69d3c1ab3670dfc992e263278714c8876515a99a06ffd91f63a0", + "0xceb9b81c22f6808affbfd3a9e049d7e3890f2b54da827d91a1de11e790272c3b", + "0xd68fc65ea61dcf560631c3ef0f5c078086fd6c7b6b4c0d0ebb231e2a07a4a230", + "0x36dc7267df912c83c92ed9f53ead40bc2ef241bdfc62f0d7a4c24e9aa8568c2a", + "0x3abd8e1e1950b65ca1198bef4bd671546ba59600f017a63ecc656070f77624e9", + "0xcf65057e90df4030c8d37724fe2a81f00728774c9965302aa90f8cea36cfabc6", + "0x7c96f5fee074c4cccb1db5b3b396623a28e41a430ed4c5aa51175f274e65d1ce", + "0xde71773646c63b3a68ed6d6ff26f1760b68e497d1579d0de51e372ce74d6db98", + "0xf0fc0c493d23d02a7822ca306c739608929b4be780125f8be038b3314f57de3e", + "0x6230ecdc6b41bb4e2cdceb84f474c0845a1762aa5a3bbaa6ee11813be6f1c9f0", + "0xb201eb0d085a065c6371973c2c9b13bb783bff3fa888f7f06e7760f8ea31e4c2", + "0x1b2055c094924aa007c23f8970029dd6a4e4042efbd1cb5876092de0abae3af8", + "0xf4adf2731dd675c33673e0a2a0e964f14fc9c26081e7a3d9dc9567b61f194a9a", + "0xa1b61107f1a84d5c629a6126eda275fbc2eb34ed171129d432654345cc5a368a", + "0xbaaab04bce4baa421f76a029729617d0ad72de8926632aeb5e8050deb16c3cb7", + "0xf2555f067f8855d2381b298fd78a308262fe8bfc0fe6807a5cb923dab9a0f519", + "0x86dd603d29b186cbdef1cf6958e9d37ad8f8092aeef7f19f5539853fa26b58d3", + "0xa23cb2599d49f0e93608835c375386936678ac58ae14d87c112b86f0694b5596", + "0xd358582a0445ad0cf49dcf89e5945fba4f62aa42311b2a31eaac068817f555ce", + "0x860ecd3efc5d8dbc40e5cc6786859ca07c85fe40ca959523739b62b0e4e0fee1", + "0xc772b9adacbaaefecdf5ae2ecddcb9a6c2cdc141a211875465d3bd29b00e14fb", + "0xafb210d709cb8b0ba068a9f8fccc5d138e1f84d03d26a6b3d854addab236ec95", + "0xbdc3cb79641e51c9f707d159c9d88c2026258b6f73e65471c0c25527969035bc", + "0x5c13fae2b3043759ccaf48d9f12545ea32c27bf7bb66e6f619eae2f417bf821b", + "0x68a007f921b6e70f29a1d6d16f9656f07476f371fbf9a1c1a7acb5c2b609bb30", + "0x183850e4f92d307db4ae75ba4695f24bef26eba825b4a51575f51fab0e1a6f27", + "0xfff3b9a3742d7ef534f50a079cbcc55833faef098818277d6ca6371ca3d753a9", + "0x78ef8ce32497df07a7bec9add4b07eb81b42590f02597249538075e41ab6dd2c", + "0xe58fa1651c0f44e0926bed37c52a60665d732128a34db9703830cf95df0e7e67", + "0x6b7b688c0b98a58621392de01a9bff28e86115cb9a4f884326d29a2d21667bd1", + "0xb5df489fba833ac4828f5b3283289eb327feb115de64e7b71b9d3128762be589", + "0xd12a2a88f3b740960fc2155dcd81bea7e8ed81a4d02a78ba18e98aec67161783", + "0x0b22142f3c76af00919230cbc5b00d7d263c5e85647d2de8a3e6352ba02cad64", + "0x6b4e299b6771ffa71a09f9b43bb7d573b3b76df27abbb167f3e5ac711ffa751e", + "0x19a3415b944a837037f7efa5fbba4b005b9d4b91b9d8b6365da23e54cb8140a8", + "0x0255c4c289bb1520a8f771e95d3863d9e3542eb626d8448391cd8e9aa2823855", + "0xe304bf675403603fc39c4160e20b47624cfccbea2a371d7613e36e47c8251038", + "0xc2c138a736de8ef11dcc3317ddd89dfeefddbb20f8cbe9b26e6d58f0fa0fbb3b", + "0x00c0f43ab18e8ae57cd4cb88ca1074ba08dfc3e7a493caff5d02321f17d3f96c", + "0x3840eb9a35e137d7104c7bc4e62a2d1445021aa136363e0fb463d0a8ccc24cbb", + "0x6bdcec67ee09dd0cba8a0fb3eee93bbb18f947607b8a0b9c8553ebcd6d63eb16", + "0xf63940a931f3171b375c2f55d0ddfeb17f34e4b37e671591748326e72a5d39b2", + "0x45e659968306110b827b48998208ba102a8c28ccf08da317e34c8951eeb18f8a", + "0x2f6ca4bee975b058f62fc48bc7b17eb8631c4ce36b3f7f1f6f7958811b7a34c0", + "0xc1daa62e5add1fe79f3883cd53f3cfd53ee29d8934a0d49f8c339347cd276739", + "0x90b542089fed6c8240d9367e60357bf7c685775744c57b079867e0a724644184", + "0x62e290067d8abb0e1fe21a488cf54471d6421cda07c80b01ab750d3d352186c8", + "0x3d42eb2d8d2639fd63038f69895b00ab04d92b1ab0a0b7772775615fe2a8424f", + "0x4caec53a8c0977a0f38813cd37458c783709da6d386dbe0a0358be87482aad15", + "0xbd8f3c60b0b998d72cdfdbad6fefd2ab3762583f4efc8606f62657d9c05cabe1", + "0xb6ec64aa2f81f1d5cefef4e819dbf54e8ed9f018faeb99e16c2560ceb3d82533", + "0x0acab9585bf5d17fffb1c0e479646c8a138670f181a1bc9b5fee71a396b24564", + "0xd9ea8713827ed39e9d0a8c308f20c567cda99c591b9777ed40a5b878e2454451", + "0xe7991c113e4fe09610a4061dff84bda3205bdcb49ec137340f596e03c4a961d1", + "0x4e19826671fdd3c0028c4820776eeae96ef435ed23f07c54b2393a517caa968d", + "0x4ff24d17dd4b18d0ca4167c6769d20aac8285779da23cf8f56a12cdd9806933f", + "0x6a2431fc40b88341209023b8898c7e8e8f28b6c0d83225d597bd445382b6fd55", + "0xd8be9caf486a1b8f3ed5b637882d2449a9e89dffd582a5fd55bffc4fb4f85418", + "0x54d6060edbbb771b06997b4dfc6fadac4b76fab74908a169b06201a13a0a22ca", + "0x8b461cd45b90b3c062c801349d4f723274cce36ec256c44e2d749897da891627", + "0x46fa69a77abdce3a0298effcc823f9e69dd22869ba26b4c1d01541bf2de7937b", + "0x13279e1b1ff0c1527e09aa8cd610c1aa54328f88c4dffcebfe41281c53a10aa9", + "0xd1ad1dece0824c9bb0b7e09269f813a1a75e4efa1eb6cb93ab1dd42119223f06", + "0x46243b104f4399a3404db73fecc1767b3308f4d51df8e10c306c648901a064b3", + "0xfce2eb01ca4594199347b46eab5c889371e7d3add681da4d36595976c5f7fc58", + "0x8af66d1c12db728f09018d3839a320f82c7b27b97000f9212989699c78e6c26c", + "0x545d857048fedaa6de9e10d59aea4f3369ae1ea2cfd4d990292c15bd7f37e182", + "0x63c4467f63fdf41ba4bdce830189c6421d6c67f3db531ce357e317123412245d", + "0x6f4305c01be3eae45809e6caf06360fd9690cc39c305ba5a64dd47811882a16a", + "0x751d6be0d942d718f44cd70f10d1611db0c4c89124b76b732b7decc1218959a4", + "0x7db5bfdec57bdc3b74e47bdcb41cfcaa642927e5eb436c0c76e36a43a02b62b2", + "0xa75bbf12e95613fdf3cdaa4badf1d340af7c6251fa2f649737fb19399720e7ab", + "0xb6cdaa8b0737001af40740abe099a51857a35aef0f209e859db01480a2f23816", + "0x1b8f7551cee4eb0e92ce6a9f0b1a4e4d943acef65e2ac65f2466e4fc2272aca6", + "0x164c76393945a764479fede040f13455768aa3ac44071acfff7f96b59f8332d1", + "0x561400d0ca3d1f322296b635e7b58d7266d65739e0d4fdfae898a9c49ce364b3", + "0x56892960f0c37d7513b88b7f99540aa49bc92e8bc7256bc1c2fc990a6c84344c", + "0x493500d343bbc38b73f289a74204d9186b34f477705f9ab32dd92892209f011b", + "0xbb713e726c6c4b3a8206a5a05e3c4b8b2f27aad052fbfaf385f16ae562573309", + "0x5eb20169a44963f8c1011a5940cefaff81139426fa200e6427bc028d8cbbbcdd", + "0xcead0359164f39fd00200de825cecc63bccc8cb76bca930262f5ee625efd234b", + "0x4aea59dbe3908afc1ec06f6d891236e906f135efcd28347c766a2315ee662640", + "0x0fd5dcb637ea55c9ed20147153e7ff1bb578832452c3b56e661c7594f141f712", + "0x3904bbb37b1f292628ca91fcb546e947f7cc52e827487819116449b739aee8df", + "0xbfe3767fca8cabd6d18d4d3c4aff79174a373082d6b6d4a63f2d03d0a64126d3", + "0x3793ae1a9b7887b8cb1f2ca995098b73bed8865c47f02d5ddd4e5b968a404ae8", + "0xfbcccfc208701b5ef22e6390f91b37e1f3d8f7a8ffe47951e5ae9cfcb4f28e5f", + "0xc5bdca16693d60334353a58233521bb12bf80e4312e63618f08400bd51be7876", + "0xd6896c40cb689153480778c4a46edffa531739573f08e3f3d0c9013e9f4532fb", + "0xe4c31595f204a44aeafe75779dca0ca894185b3e2627cc4e932e432054e58057", + "0x1ab27949919c75168ec496faca66141917449e1cc292702b52f165f3c224f5b2", + "0xdcd8131d8a1e98342029c3ae4fd1045d0a3b3a038e7dbd8e13fe3ecab30d13f1", + "0x373636000f911dd05c0c412ef69fd5c71888aced86d721ca6f6d3a097fb6243a", + "0xfbfa33ec677bcf4ad9b9f9404cf6945a2f2d0cb4544436d97b0615dee48e9ad0", + "0x4cee41306c387e673b6ae31295a331ec122ac2dcbc1664fbf4634c55c8f3df19", + "0x0df90b24ac4280df5a90a40bf1e1f6b895d790d7ad36ab863e80ee1923d71c81", + "0xce57e7edcdcfaa1d4d020f955e3c7c84746ba8a77a2dca69914331ae6a588c93", + "0x2857b09b2507973040e63fe5147f8c0722bb31b494f122187bd9ec3a119868b2", + "0x5edd2c25d12dbcb1b0083ee471f3c8d3562f8e812c7368afd39bccc5a8a475a8", + "0x0eb3fc45bed06182648ebc82fce9c599973616c2dff37791c014d81b72bf7ebc", + "0xf0daf44cc73cc1875444b8f97cbf96923ecb1d2406e6afdf30be1ebd67170a8b", + "0xe6cf543cebd12913b99e51f454690b2e6fb54d885e06269c7dd1dc940fae79f9", + "0x9b46655d15c4c8e06d28f97f8655a1211c97b32cbe932a1167040168ed757017", + "0xb48a7111ee89b664c7b3fc3552fa3ce288598880e3c63c86ba2b40d0f1de47be", + "0x733d13d1ecf3101ff428d49e3cd50ec300ada80429f46ec9621d308920e313f8", + "0x02bc80564388ece34922f531ace4b429925990d68c42226303ec2393ac4c8d72", + "0xabb2831b72888718eddc4575d79c31d5075f7687c9e6f7df9c5b1e3f672735bb", + "0x017650f52c51f3cf2e7d82ed8b757206873eb71508161210b4f7320089875b16", + "0x97d26f102797f52ab80bcc786c683b3768f54dad05b0cf5d2f7c69f7c5e4b477", + "0x8e01eb81eadd76e276e853bfd3f052d9a9d05de552985a74f4c51ca7c702cd32", + "0xaa9dc013b931a332f294dc074707216440270a27774c7928882cec0124a84f45", + "0x4d49d26f98115d18353e7c15cfbeda5cbb0dc3757a152fc486079565ec05f744", + "0x6dd93f797d1983445c06e551ab46dde6096110dc602aabf520959cbddaa98e0d", + "0x5af113b1aed1076edb16781bc9116dc2d347a178ed6c1ccab4d89d66a2801dbd", + "0x193c02baefae0ffd3e3a7afea1e7e1ddebd7799eb511fc7c62628fc31866c6bc", + "0xf4b7f803d7e61cbe2a08a4ec9b814fc3d70fa9da89a8eb58e93868ba95fd4f71", + "0x99a2cde1e1b08a6559bd4679df647911294be7a73cec0f8c6bdeb0adbd914073", + "0x3ef3b1292bba31f20b5759d0ae2aedd24facd710f837d5373460ce1be08249f9", + "0xe158ef6d40a5b798a181d561f8494c83157478b09eab7c08b438c55498297d76", + "0x466b6c92326aa974a81f77b3b365d590f5ff3387cf6946d9b26a97e8c6c07599", + "0x71144f5a9b95b05102d1ac52c332de9f3ee054937a0fb6cacec61c230818abe2", + "0x43857db3249a1efb81a8aaa934631ffaf6087d7d95e99b8b7e3a307088babdf2", + "0xd76ab08fcae444fef658d002d0ba8f0fb10ca37e2190aa848fa765db9bf938c6", + "0xbc372c482f74e1c5d04a565ee4ffbb470c376da174ea317d7abd6de7f24cf9c5", + "0x9033c56c26ccb9a08332d0a89eb22560607964e29aff9161f6736f12f7473d3d", + "0x082d2acfa4df63deb929cb4514cde04faa0d4a06d53fdb1a58de3ec3fdf4fe15", + "0x2ea6011771c74d920c395caf9c70650afb4deeacf9d496007d03baff837a689e", + "0xdac8c9829f362a81e7a88306123986375d2c83b4cba0dcf1998e44e4692c256f", + "0x1d3fc9c51b3ccf0ec3620736d22ba7123441a2dc334bf925c75ac395cce6d74c", + "0x4881784250b53fa771634929fc34fa26bff9666701bfea61dcfc1a8b6ad012c8", + "0x8a33423f7fc2f11af8ee8beedc8b7e21cc2cd515a6c5ac1a55918dd5e2b16e99", + "0x3fc7e4707e24b5af35c4659da17186f4ce36d526fa91a121f4b9c2f3084263b9", + "0xe104a42b2766455416e0ee8736c1b3191822bed35fe36c01b5e3436f83157ee5", + "0xb9f270344e24eada673b5edff6f07e6fdcab6dfa89ff5f9197115cfca40428f9", + "0xe10df92ac34ed8b77c25d1f5c3f7e4dfb9785464e80b5752d641d986d86ec718", + "0x5baf89908afca6661198fa8bd6af1a08ad0c055abbc724801deb2f5772532c70", + "0x234c4085cfd920d8a76610df100a57e2c798d7c28481e4ee0dea38429691b061", + "0xfbcd104ca8ab7ffaade1ac59a4d9f62969035ea2fb40b54a0207292eae753e89", + "0xfa617eee82fc7887f71bbe0d38ec6535f58c14194441680de7ed91e6156e338a", + "0xd1e2a7c1b81a765293272287e9cdffc50d36b01bf884b1912f4ef37cc08fd7fe", + "0xd9ff3c03d42cecc78087cde6c9b3c4f699c3f1691adf0d3bef421361cb47c794", + "0xc8dd84e4ddac7535547b103be4023f54f74ec0c24e6140314232e1a65d2b4b67", + "0x80e188b2d5f02e63498e455bcd45b00a97915971c7901f666428e8d17c5071aa", + "0xa3378ec252a08d59233803847d8bd8ad275b78bb64224998b4ae308559ca3937", + "0x362ca494021482f0d9dea4abd844ca11b71fbeb0a98e7db7bfb3bb6f864eb58c", + "0x09ec27c856f50888e4634ffaca66f8185fd13e0bb2bbf522ce6209886502c7a5", + "0x24996d2f96618887c1c5e61d5d7ce6948853ca35811d48f72155a4778308e255", + "0x4f199a8efc8615c623902b5c279dd995ac1df4654a07aab0423e070d14bd24d0" ] }, "nodes": [ diff --git a/ethcore/res/ethereum/foundation.json b/ethcore/res/ethereum/foundation.json index 1f3e4535a88..8f96a842a7b 100644 --- a/ethcore/res/ethereum/foundation.json +++ b/ethcore/res/ethereum/foundation.json @@ -1,16 +1,16 @@ { - "name": "Foundation", + "name": "Ethereum", "dataDir": "ethereum", "engine": { "Ethash": { "params": { - "minimumDifficulty": "0x020000", - "difficultyBoundDivisor": "0x0800", - "durationLimit": "0x0d", + "minimumDifficulty": "0x20000", + "difficultyBoundDivisor": "0x800", + "durationLimit": "0xd", "blockReward": { - "0": "0x4563918244F40000", - "4370000": "0x29A2241AF62C0000", - "7080000": "0x1BC16D674EC80000" + "0x0": "0x4563918244f40000", + "0x42ae50": "0x29a2241af62c0000", + "0x6f1580": "0x1bc16d674ec80000" }, "homesteadTransition": "0x118c30", "daoHardforkTransition": "0x1d4c00", @@ -133,38 +133,37 @@ "0xbb9bc244d798123fde783fcc1c72d3bb8c189413", "0x807640a13483f8ac783c557fcdf27be11ea4ac7a" ], - "eip100bTransition": 4370000, + "eip100bTransition": "0x42ae50", "difficultyBombDelays": { - "4370000": 3000000, - "7080000": 2000000 + "0x42ae50": "0x2dc6c0", + "0x6f1580": "0x1e8480" } } } }, "params": { - "gasLimitBoundDivisor": "0x0400", - "registrar" : "0xe3389675d0338462dC76C6f9A3e432550c36A142", - "accountStartNonce": "0x00", + "gasLimitBoundDivisor": "0x400", + "registrar": "0xe3389675d0338462dC76C6f9A3e432550c36A142", + "accountStartNonce": "0x0", "maximumExtraDataSize": "0x20", "minGasLimit": "0x1388", - "networkID" : "0x1", + "networkID": "0x1", "forkBlock": "0x1d4c00", "forkCanonHash": "0x4985f5ca3d2afbec36529aa96f74de3cc10a2a4a6c44f2157a57d2c6059a11bb", "eip150Transition": "0x259518", - "eip160Transition": 2675000, - "eip161abcTransition": 2675000, - "eip161dTransition": 2675000, - "eip155Transition": 2675000, - "maxCodeSize": 24576, - "maxCodeSizeTransition": 2675000, - "eip140Transition": 4370000, - "eip211Transition": 4370000, - "eip214Transition": 4370000, - "eip658Transition": 4370000, - "eip145Transition": 7080000, - "eip1014Transition": 7080000, - "eip1052Transition": 7080000, - "eip1283Transition": 7080000 + "eip160Transition": "0x28d138", + "eip161abcTransition": "0x28d138", + "eip161dTransition": "0x28d138", + "eip155Transition": "0x28d138", + "maxCodeSize": "0x6000", + "maxCodeSizeTransition": "0x28d138", + "eip140Transition": "0x42ae50", + "eip211Transition": "0x42ae50", + "eip214Transition": "0x42ae50", + "eip658Transition": "0x42ae50", + "eip145Transition": "0x6f1580", + "eip1014Transition": "0x6f1580", + "eip1052Transition": "0x6f1580" }, "genesis": { "seal": { @@ -175,15 +174,15 @@ }, "difficulty": "0x400000000", "author": "0x0000000000000000000000000000000000000000", - "timestamp": "0x00", + "timestamp": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0x1388", "stateRoot": "0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544" }, - "hardcodedSync": { - "header": "f90210a0b5950d9087e0e1d3dfc18cae9388fc798d9b3932a6efb4fc073081f5561adc8da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794829bd824b016326a401d083b33d092293333a830a00caa3307575bbbe59bb8f8a89f115ccb864866c2591d8d3ec3bffa6231532e52a024278597d4fddf58a4b55fe6a8bb7bf0e6cf1c6e75158b3d0d0b1bb9bb16647da01ba199a450390854e88ea5504144be61dd681e805aed7a1cc8bea61d5b61194bb901001902100820000000020110010418b02612064240040a4051001001a0024400e2484001141a422e56073887504031028220080010040501800000080080268040050018400100cc4710800419088000005a840a201c09011040086001260040000021004842021800024204400204a8a1180a8a0002164400202000115420602005512a20410088002248c000020e801803c051202030000420810912000401010604000801543084004414c051048082100000221684005c8015a40100040170025040132500014054900482500403088004000821194124a0b20000200229b9601c230180400802020800000408e49314200190121404002080218814a08085870ac84878814c3083662001837a2147837a050f845be9e82d8fe4b883e5bda9e7a59ee4bb99e9b1bca05714f772f5e2fa3a41a8c7435407b579b7c16397cf08eca605eadd9e63db7f6a88315d0b500d2cb0a8", - "totalDifficulty": "7772265011609637471285", + "hardcodedSync": { + "header": "f90215a0ea51746efaaede944c3397e41ae72b7908c8ce25967c1edcd02618b068486feba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794829bd824b016326a401d083b33d092293333a830a0aee38c1032f191c3d42cc581f53d31adb1f0d91f463e6a8c12fc35fd1db58d5aa0568149713d45e959d5d07624917617d0d7865124c25c28eb9b798013096ddeafa0847bb20a0b62d1d8e2b467c33b28ded6796c556cd2b2a169b640b40e58fd2340b9010048c03883204a1ef0204300012248c8841814900c04362858000450c8927a22a88d5b471c4869c00001d8641080695910c20801022c2910408829a8002620115dc8200ec2851300611284301c3243e091030706068c8160505403250d03f44437410080072a69048082b43070805d08424a021328221500101418463040904ca094a189c801e50000c41402603426c4701a6302e1023040080d8380e21d600a2083003a2604082001b183068d1470840a49008a514148800a08030a8002c821b24010f20ea31c55060582801c14483ec29d4081c7152d2244840016c123da6f42249b6002c8401618a0000a8c8df892954d8080800c160244453086480d8264b6870ae8321581e6cb836ed001837a30a08379e5a2845c72b9c0947070796520e4b883e5bda9e7a59ee4bb99e9b1bca06883c088b374f7c667ed0fda0f1ec7c18890c892b88f14b41f03e7d927bcca82880db92c004f0313a8", + "totalDifficulty": "9242028122621986440675", "CHTs": [ "0x0eb474b7721727204978e92e27d31cddff56471911e424a4c8271c35f9c982cc", "0xe10e94515fb5ffb7ffa9bf50db4a959b3f50c2ff75e0b8bd5f5e038749e52a11", @@ -3452,7 +3451,285 @@ "0x17e103cb26e7c5c7678a523f99f90387490bcca00916190e7e1b38274c52a375", "0x105b8126ef037364f46a44fdca4fea1ec4c099de5a05918688249fb8844dfea0", "0x7ca09f536bb9f0d7b3809c086918ba4750722edfd47153a8412fc761eb4783c8", - "0xc988cc2d92dcb85eaff8cf2f70ca49646cc5aff6c8e10b43a0581193137d3b92" + "0xc988cc2d92dcb85eaff8cf2f70ca49646cc5aff6c8e10b43a0581193137d3b92", + "0xfdd2130ac413b161515a29d01f0ea38bbe234e30f9753ad3eb122b0728d8e1bb", + "0xe8945552bc76c1db98d0d6453993472e75c489d696964a660d816a31d3f2c717", + "0x3c6130c0f35013d1d2992067488a8a7bf5a7b15d3ce00cb5708d79dcf8eb45aa", + "0x7be79941a43f391ea4366caeb6482bc5b4f7d85f55ce6cc91d6300822550417f", + "0x91ad8008733234c80946a16cf729423499a4b811d5b457f56268e0bb2825ad83", + "0xc3b17bec09d31d9a4a0902666e5278cc7458de8b663a564a53c7fa04948f18ec", + "0x7f527fa7d7332df12c625bb575d5a02e86b4a9188a9d75757b172d7a43595e9c", + "0xe3e2e24bb98bad170871a3803860b30cdd9e5bf05f4df69ffe859f0cad8999a9", + "0x395e940948704ccbafbc84b561d7e86f6c414b8fd34cf23692a0b1d2849b880e", + "0x0d90ba6d9cec7bfdcd8c089dfed671de95c7496c6b47953739e92a56b5236bc8", + "0x82132c33f678819d7da7c778e4884b0f7d10e1f0912885301277a2ab1db2a043", + "0x546f0ee2077c529d97ac29fc0a29e4162b6fe95bef2d0cc1a073a3c595185f5a", + "0xa08ad1abadbaf6ac33ed71893b2953c30c82b537f2b7efc4a823936f3ce407d9", + "0xb9a456deded38627d6e464e28c5c8e8c562b2f6aecbbb66e338184621aac5893", + "0xfd848c379f615abf2c6052f9f91c98e0ad6f45b5760f3b230bb10a02ca8aee01", + "0x49c99b4e21846ebafc7823adaa6e399a0ae22cdd67ce991ec58b958c871504b1", + "0xf5e1d32f10b281eccccc28b26254f032bec66a00620d46bb0dfa32fc14fc6d57", + "0xaea8fcc3dbc2f9af82c6eeccdea1030a74bb42dce190cf661471ae4fa052cc72", + "0xa30cd039fff05049b1ac82a3fce3aea92ab1ab058da97add8aa8fcb53b5fcc31", + "0xc8c87727a220a04b5cdc90093fff70aeab14edd25b90599caa559515e9f472f8", + "0x84f99e738a285033f43854e9b639691453d65171830dcf8c56cde6aa9a60100b", + "0xeaf3d87e7ecaf90c4a261df30540595c84f0fb43b9ac3b569120bf434b4fc521", + "0x8dfbe9deb689741bf6b8869b9b812a339bd70503474d75842ec4f721ba5e5aee", + "0x31e62e35c4c24954e6844dd9acc31cf21c44295d3744a76a5b264ed9ab19291a", + "0x764195f9c0d486dacca241ba5bb0b4d74d936080687243c9c6d2c0b608e684cf", + "0x45f0b003dc4dd663bc90b40be14a5d98be20f5d1041d2007210ddf257aacd866", + "0x1a2f1cd3cb0e86824ff55d52bff48d8627ba8407f5f8e3758f61edcb20084752", + "0x786f0ccd1548ff58c4ca0c3a5d648d3cf7bb6588acb6f1f84938d0fd7ae10b11", + "0x9e2d4bb1a3de0a602d1596cbbc712eb1259779cdc285ff8de412f0f53169a74a", + "0xbc3375f64ffccd58c1240d89f8cece571668280c567bd694607b10320e19d5ad", + "0x06b2e9aebfb6c5c7fcf3d1e33120c0f3ffd6a02b4ca1901dd2a7ae3b282fed24", + "0x54372b1e0f7456e69d4854937f5a3472d531e0e8be670fd1e744c1041025d2ab", + "0x70ea1c88193cb99b052c07319dcf3546e34559a28fba6542f8149e46d76a2836", + "0x36d80d0a12903b84079c4a3da17f44368db717512412f60e8394612d3d24edaa", + "0x64eb6681ee0a352b342b978bd937828dec322782927a63db587fb8c2fdacba0b", + "0x582bdc0da00c07fc327fb269a5990cb33e3b6bcd0e71d9193707fd7677935f45", + "0x43af6e0a2ccfe62ed7cfe8651e34a39ae114a1b08c15cfb7aa587f1639665008", + "0xe3e9cfaf0484e3d527009c370f9bf2f2ceb399bbfc9157033df34b1900598451", + "0x61d947ec543d5c700690aeb6f9f217a375a5ac1fc5e6899ab0a3ca3b2426a699", + "0xbcaba983f9d702008ce43e3f25f148596f128c436c35bbd05010c1153329121e", + "0x5305ada22ff089aeb56ea3bc61c4c67e4edaff1240a401f40d4cb15535825891", + "0x631e3fe402db919ad0b62228dde50a7703845d43fb86ba165ca3c36b88d35f07", + "0x87d89ac00db143c114f115942290ecf0284e62a3d0273c712015f6e391830714", + "0x74294af565afe5649315b50402ce0ee4ee93a0fec3de6a44a336b50dfbd33965", + "0xe13faed5afced183f1f468830b31e973d3b626b5d29102a6dd156ddad2b52a19", + "0x9fa97b97accf83a4d798da116d267eb6ee94e3e8a45ac96c15c6ef532ed583c9", + "0x13b60328e4fcb88f1bbe1a7dc31bf8035bea971f2a955adfafb1c80cb50540fc", + "0x4ef647f57565fe4010895ce9192b20f14ad1bfb229787d31360dc1fba528f097", + "0xe663f00eaf821cea5cbb669e700c6fe96b39633d58d0cadfcfa0c305566ddaf2", + "0x857b5e1cd8bdcdd477544ba847f2bb71a80839be83cd486c80f49ef5f03aa05b", + "0x04fa22e5b2e1295eae08c160d89aacf5988fcf234abcd6559d08ac0ec819b7b6", + "0x606b03cd72b48f84170541a8ba5e7473f7fb98663bd275767f4e8895dc5fbd77", + "0x8c1760c6e57e8fa0b34b521db41a91002398ae3e4b85b7cfaac447a4fd7b27bb", + "0x686f9726353dc21d8fd91a5bdb6720c815cc1b069e01a3baf51ebf21646ae27a", + "0x60b2747f88f74b6b8a5fb0bcf4f206806d9c69900f31f397145b1ce324bc4b0b", + "0x96bb8834eec4e8d652ab2d1e9904d4032707265d2531435305286ec7565ee333", + "0xae1372ae1fb3147d1e4f94a3b840b11df364781c60dcc2304aff67a1888b08d7", + "0x9bdf500fcdf7f47b16dad00f193de77d2feaeec4a3844c7a97d9d6fe754be73d", + "0xa3ae272c20bed715b96a6777f9927d654b1dfe285e3bf077a6c144118b3e689e", + "0x7b20afa1fcef7bb2c6196d8316210d7b9e8aeecab72093a2bb26779e440246f2", + "0xb6045904522cbe4e29efc67632ef662486ad4185e608b1a43abc276c869d3a44", + "0x99ca4bc614cd61d858cae5fd2c32e2fe8df6a713e5958b59eb5933146bb795c6", + "0xbcb2fbbdd294aefdc65c965cbce4f690cfd08a39fcb0fe4c4500efaa679fc5eb", + "0x5bb1c10c53c017dcd92a4fcb9ca99310062e8f2689d521afc4536777468a2c0c", + "0x8090b4334ccb0abca3e6ff662a6d6f296d162a38405600d0e229fe6622c06e5a", + "0xb148fe3d9929ef770c7760c5c2412622523727e59aa79f42d8e8f668112b1058", + "0xc452602f20af7e252a3d796dd685b6fd71140e522368f0fce78eddd3f310f696", + "0xb7da293297b71f6d82b4b56d4b02b20e795745d55933df8f32b3990723dd7200", + "0xaf1c9b7a8176f3696d8a5771f5a7d526fbe65c7ac17b6160cc0a7f492ad15522", + "0x675d783d4c5fc56106aff1de55c569fcc86d7ccc9ce18352c84e8d657942babb", + "0xa4cc61043fabb8a135225ee23b39639a21b75c225e716e78d19ab3eb5f39570a", + "0xc5967661349eeedd834aac16a2ceef215408baf032f410cae4cf7dd083448954", + "0x203aa3b0b91c11255c488e0685205222841d3547b0e8f6389fdbbd0ccdc5627a", + "0x707e3c95eab2259eb32d56153732d885d4685b9b4768e0c4493080c158942d10", + "0x56d6ba323b3e0aed6db776187e4a134c0329771891f0852218d7dacbc782786b", + "0x426e78c3799216353a6f1cbe4b821ded6c2ea2ac5abafba43ef59498f3d963b8", + "0x136a788a8f606960fdd307226f17208ed25ec11e20c8add70f4d7bf5a7094674", + "0x20f28a3ea3e2a1673ab9bcf21718ce65e9992542761df135db1516d70b7d1048", + "0xfc671303a07b11fb347a93ae05fb845c87497e8875dd52f6fcb208889c7a8ba2", + "0x7b1f68460d3722d0eabffaee4292cf3a8a2c2332bbf2b485ac29fb67e181d10f", + "0xea79ea4b46e60c2807a89a4e4495fcb27d1c0b232ab0dff897c1c29b04302c4a", + "0xc25e2f5b510d3948ebdad351b1010ecdb5eb9c15b2b635a2f319984d292b592c", + "0x9b798bbcbcd0b558ca5d0e99b1df69e717025712d3d0246277ae5f0f00a379f9", + "0x78cb4f6097f57d685707514f9923b440eb752c50e81e092e76568ce4071dc6f8", + "0x624c3d908482f6b307c41fd261ceb2e8e7705769a625a707581fba8f7cf6880f", + "0xc1096286b083b2b53df8ebc639ab336103e5071d5ccdccafbd51b2611e98263c", + "0x82e87c7e6dfee36822f908d9b83ca0ad01d8cb04b71076e7c095f277ba2f9721", + "0xc59deb5cab98581f72a30ea5b1d97d58d60090c3e4a38a80d5e95dee4d1beb49", + "0x46f6ad8a11ab6018449094c73fd6f12c2a02dd611817bc477e5896728a9ba20c", + "0x4fa31cbc172bce1b96902fb4668af7c5edb9ad0aa4aa88556bdc92133ac917ea", + "0xb1ce16f5fda7050f441a68ce38878f3b0f704cb9d07b09333223fd0db1e224eb", + "0xf9e6d6beb3d3cee105a56558c1c80109b7c3f640f92750d32a953490c8e49a03", + "0x1cc0660cbea7fb394122f05c509432939df206198be388f597a63ff345542371", + "0x8a990233ea772a8b1ae1a05067efde8e2bce4c0aa868010c9c930d9578a52b6e", + "0xa8898d9d95ee70ef7b7ffa5341ab778d66fca613a81c527668451dd2f0187be3", + "0x4976c79c14b4128a2dea82ecace675729d7197d06d512725595efb5d2aafe544", + "0x7459ad72c83d2250fc3056ce9a8619dfd4cb3f3b79530ec176fc1b65a88344e4", + "0x6d3cef3bd8181100de92a00157eb1d3452f74d5a650a3e5456e31c8fa64ccd18", + "0x8d1345230024f66514d00c72909572866ac422ade832ef17960de0172e288b7c", + "0xb31c61b316759513fb717ac7276813cf6e3fc6c8f69d745aa88131fa4e21e2ec", + "0x1fbac8f9060db69f1aa812bf2a5c051494aa65585835c0e04a14eec0c257a4ca", + "0x10970beda37aef785a26c1f67a6825f52315902c4acd0c28f17c28ba5228d56f", + "0xfd5355b1205e4f257c805a42b37b748e026f8a640667b58ef3f365d65b3ad7ab", + "0x289aaa44b27ebd9b581eec7fd02acb26f97bbec0941c0263bdbd52887cce6ad0", + "0xb12a4b6602795d577ef7e0c08d495efc81597a9720383cf5c62799c69dabfd33", + "0x4632d3a3a2017d16da2ece45589f41336a902fffccfd3916b62bf5c07e4566fc", + "0x848fbfa0ddcaeca6215ba16631e1a8e0481b5fa8d6c10bfae812b9db3db0314d", + "0x70c99cd948afce544597d8a24d4f8e836ce41a6dfba6ae92159070422a978fb9", + "0x2016276d24935e2fd488692618db088a6028456c30b97bf25bbc25d06620f2bd", + "0xb72f4cb68e8a5f7cf2095dcf5e7622a988ca2116a1f32c9e0b2f10d4a2f9c5c5", + "0x160d284bee200cfe4a094e7fba3d2e8aaf79eae7886f9455a72afe3a4d34c1c1", + "0x1d5a091116bf6097c870c4180074fe5370ccd190d8495fbaa6678843ddb568fd", + "0xf3cc06c8bdc245b17df05526873ea94b29016820bc7a207e84bcdcbff3d22bda", + "0x1ee426c0c1b7520ecdf50a1f15aa8d39849f4b61307bccdea0deeebd3a231eb6", + "0x018590cf655da681e4556da40944bc47a039356d0ce2bb677d00526c19fe7d56", + "0x2c58a5c7c224c771884d5252ab800b86b68934ed08ba39a13eb93bf2fe5bb4a7", + "0x36327e853671045ceee2390b141992d00f2e28fdee633d9638338830b638e5aa", + "0xbd197bdbc4720b20de016cb3e4ae5bf01c6982813e2b7c8ed68c76193070db49", + "0xd5f211f9b9671781c853dd50b4532ba7623611934410d71358b879ad13cb3def", + "0x18cefffcecc9763d7b8e7b5617e54286576ee981ea7ba886ab88435e321b8620", + "0x1ea84c5209f9a523416b82d780a08f7316c8355eb80d24dd84539dd33ae9cb3b", + "0x6cdad35eeb25f6b09c0a03fe367f859b66719463b63b280d8e15128fa598fa6f", + "0x6cfae8ad85b389eb5895f46c65b3d9277153177ad41ce7817bb8b9d2061a8149", + "0xc96a4f02330fa948bdefd1361b0be7cff9db6819007f624a1916fb234b60052b", + "0xf0020b10c9b330a73ae05d8bfe6defb738dba6e95571bd0897a7df2045df2bd3", + "0x8c31b99fdc9b619c1269c1724155b368586dd98a6324c2be78b1e96a265ab213", + "0x7f7beacc5e2eac7708d5df32d6a3c1d57d7133ab1f23f0c9de10482faf48ac76", + "0x72a18edb95e9c46bac4295caeaeabd0225dad790570496f32af12719eb201be1", + "0x84827cf9a51542f4b596ebde2e7a63620438e4404dc41e5b08533bb52bea883c", + "0x1bdaa51141889bf15e35bd1f7d7bf8e9bdb1e45993d80d131496aa552190cca2", + "0x999f63f4fd586baf6f00b56b8a60ba31d60353480c49a49f6196de0ff0bf3264", + "0x315474d3df7fac96bc940d288ce7286629b6f2d3a6d9375c1ecd8878079dbef5", + "0xff65bc9b2cfe0d26b16dd6d7f1ee247f7198d67b9075c7bfbfcf0af8e0fabd03", + "0xaf21db7dfa5c94b1d1276cb18af97dd57286fcff3395fe6897b2b4c21d3492a0", + "0x7bca2491e67626d968ed3c9eb953ef55005f6e92cd8d3879aa8d1c746091bc72", + "0x1ca1e8e053bd1ab7df8ee667e40eb672d1bfc6230f2f1f8cbb37a911dd154b9c", + "0xff0a0993dfe362458247b45863a45b53698d600798945d21a61185817195c473", + "0xf8ebd8060f16df4bc3688e1ae038205fd5b67079e2fc80251f6fb93f977dec8c", + "0x51602de9fa527f23030de58e60a7318ed5b6f13b16e74b549ed59936ba09510f", + "0x3eaab0754ddd2bc2be0c0e72974906d3b68dbeefb710735e22f15b5fbbcf102a", + "0x94f81d99473387ca87816038c2eb4ea655f66b64f22a4d0bb853989184362f88", + "0x81af931fe1599467aeaee038e1a78543f5df47f4244b1943edd5aacabe2f001d", + "0xc49179808d729115588351ab65972a7b2c2b18868c9a578dd512adfb4673c5a4", + "0x43b9d76f1c2bbab800dadc6ccb88b966ccda198e30068364cb9c0b9a346f5f03", + "0x1c9ae4b3977a1d4969ef3d950d2c74548c8b44bcee652a65f7df128511b84e48", + "0xa06a1a6ba91e429f805640faf789214f42be0d8d574065b7daea7daa37b05865", + "0xf53ed26aeec7ba846e10a84814e7264197a0b2bf485c74d98e8315f0ddfd4b3d", + "0x57fa0c3eee29055cf5232125619ff171a60d2e8f0246af1ea8120969e03dc3f7", + "0xeca0088d30058eac4ecb7ce8dfa454e46e642154b7851db0faa430a01bf33744", + "0x3f43e499ddd06a059b192a9cb9881d15078157508c1ac30d687951454a22441f", + "0xd99f60df5d3b55202089a3a69147e43a021c5760485e0899116f56060ba56a92", + "0xe662a0a21e688b7452d0d5b6372bc8aeb00c589849f63da9c3fb4c280e6236b8", + "0xcc83d5becb2f1580e7771c576b97709778a8502096948677f1274e9b0ff444de", + "0x17cfc1a415766b30cfd1ecdb2bc8bca535928e1048803b9820e81d7058aa3b68", + "0x8e1410621e8b0edbfd9c98cd1dac02e6b5dc8336da445cdb00c16c457ca27750", + "0x3d8bc5d8acf9ff44f9099594290a91d47040eba0f766609f1dc034d6bb127f4d", + "0xbc32d05ddd709d4f7ba929353a618d70b8eecbe1d3b06010cdc7dbf053569e25", + "0x818d10c0a40a9675a1d87673d9dc55895b8ee337a0cdd99dda88d6c1d506a301", + "0x633d32a1adbc08ab373324175e0205412bd17ed1be4ee5882d20944c3439f77d", + "0x8107273c0ecc4179096f1492d21de076f84d0c4529ff6d563acaf85a8f5db5c9", + "0x5d8c25ebc9468667d043926dc4a6d28caaa6be696ba3e4d248ab7150b20fd771", + "0x5a8cdc39a49bff71df23eb7fb01811ce114edf6829f946a6155113b39480d023", + "0x72f7ce230da5fe9ad521901d2e1f7c88a20c98ea82fc09c240501ba327ff3518", + "0xc9c91729c335752f0e04f091dc181ce8659dfc13a77034b319c47554a5ff0bee", + "0x3773c7671613b65b8c6fbedc97c96ba6e3b8a6cf64acf6d1947f2881dfec93b1", + "0xb378b0953123036f313210f7e020441f41c81344b0437e5c947aa3d2e76cc357", + "0xcf3b0163249f3b6d1c9b756eddcabc9fb9d11e121dd96499c750350dd56cfa3d", + "0x8baa2ead915e991532ce72a856a001f7cc493a58016d3a0255cd416108357396", + "0xf748b8ba84812b2f5ac3b91b51402194fe08c1d15382d10895fcc8d4622b58f7", + "0x7ec5d0b6b989137882c20bebe11d2facc3e68e9a93a9b2c793d804d9e973304a", + "0x4512ed8b4f3586a79c971cba695d727684c6485ccadfff6a3db45ff93fb1e1dd", + "0xe6edc389d0ade0c7e558ffd357a7557af9f2d38b0b20c84a67936914acf088de", + "0xf2947281385a9b2077e6e8657a6bdfb9c93f82311bd739d8e9b96bf97454ade3", + "0xc768e9216d0dfa3da3fd3727ac4a673897567570653a8517219c079edd191496", + "0x9bcb33bab81663ac501a5a4d2f3d739668b42a6bd2cf7645c3571d58b37c60a6", + "0x540fda7f30ecbf8a61855b9619a139e502d8b9e1a3e72179f2399efb3aafab0e", + "0xde605b760659834d38aa120d97d5b0721eddcdfeaa69a716e44b35ef721c85c7", + "0x8979afdd57a677913bfd414f3c7cf88c3c7144f5168476e7c08518396cf8134c", + "0x6826b8b3aae4d8f97707e9751a4313738ad42861bac31090afb77a34f7214b7e", + "0xade12591565e41be9e81ac8a673324a680b0a9e6d980ede210c966b1b9252938", + "0xb2f3710b4e6c805bd20ad93fa0f254bd645b5c9b5fa299f1f8f9bb57d299e21d", + "0xdb80cf61e5a9d6b6237855eb518851f474d12db1fde3c534762e1f7d9367763f", + "0xc40c3599108f6057fb67f09e7aee418490af2a887d59f428af222519a7c03a12", + "0x0916f11f929196f5834bad46ea7eaf55716ec2d269aef9f486cac38fa7734831", + "0xd5362e4d43e3da51e12debe7966c2a06ae0fdd327cff666aeb7185b5d6cc71e2", + "0xaed4937eb0e5c9a5e6803cff864691f7ac63fa9f82d3c2e1ec9a2777d4d3f263", + "0x49f63292bb091a6d6e6515e5f822903da4a9e652847a7de5b0fba5ca69336ae2", + "0x7347591d5dc652262db2e95f65a570ae894f28a631dace959f6264027ae5f3c3", + "0x300ebb8f363f2921f5baa4ad46332bd7d10eb113679afa0851ede28a33ce62b7", + "0xff1b93baa7285220352ab656d513ee19c12da79c0c87d2035c148744164cf32f", + "0xd1793b3309372878fea3c14f2e4dae39588ddaa2396fe246b3c4cdb534a167dd", + "0xe2c7d728bb7899ab8b0ae0d07d585cd380a38f63fb9079532419fb5cbeacbe01", + "0xc972d3a0a76889c41d1130c52bf175526a5560d2fab7b28bba7c914a9b9621cc", + "0xebd731a2040b488d736e846efdb41ac5a6020e7c2b287249c105c71bf59b9504", + "0x8745a726f0e971fbe22c9b28234c3d93333c0f8d5c126ff9ee5000e26da7031b", + "0x3033928e0f79cc47d31814e409312127ef73a15a6aa915786e4410677942dc6b", + "0xeb77e57fc7de01107d1adfbf479a4c3a6ab5ddd008dab67069c5fb488551634e", + "0x6eae31a9b04e7d30e7781e33323f52e9f411fc7143b8feeefeb71cf6b4e86081", + "0x39ac81712892e1ca0cec0b63cb7d526edb0a276e6ff41369288f788d4eeff7a3", + "0x9de1c4046104a2bfe58e94215f59e1ce5898e3efcaa2ac6a7916817648e3b304", + "0x3d6fa25cdb3aa2cda4bf65a85927fa5b5c79d3ca427b6b128d34dd24aa08b5aa", + "0x8f5d95fb92d3eedb02da88535e4d0c9ed713fb2a6ded42ad8d2036306abd3b31", + "0x36abaa49a58fd335ecfe8b0ec61a68da28af30833018788fb710c3847dc3e258", + "0xe0224a4df20ed2e5cd78db19cd906d29bcf3aeb6f79135aeb62be16f766572ab", + "0x7584341a036595e957e7f7c09a5932c1e75e5a5a73ccd31fc2806b134a899082", + "0x1dd6909a77af37732b2e59d4341047ad85b610f470684433f2929673399c2fb0", + "0x5d9bf04171804ff9f2927a14176988349c0d0a86654d8a5897ada06ca4a18d02", + "0xa1714a70cbbaffc82a9018ec48acd7aaa70a5b6ed00800249fdd76326c5eb32a", + "0xb8fe04ca47841ffa34b5f17ce8922c86a9b98bb6d7d13c4b0fd27df931200422", + "0x308d034f42f0beba3aedda196573bff7b9c9852888d6f9e3362b4259d2c1cbe0", + "0x05be7b2c1b9f84273af920a4af58b183619b016aa20199fd6845eeacc479c744", + "0x613880fff823c896127092c2c4e0319e6cca955b650829ffa053c4b228429d61", + "0xca039f943e38b017fafd119e870ee80bcd19e7994b15449a03b7bf35c1a69add", + "0xfe29c86d46c9db3f2332f2109a81199c5f48730826755b56715a98eae6e6bef9", + "0x6e95261130af62956647ad47ebf45dba97a9dd684940d5b241a6b0cc36fc0b45", + "0x113eff6173e9551800e70882942c37723aa83d573f2349ac614e6d245411af19", + "0x07e9fbe087e6b8f4a2cf41373b1977823875a9d3be56b937b977503a20996437", + "0xae0792daa47529f8690d30dddb9e0ccbdcd3e4a3b3f0386f098b147c4cb3dd58", + "0x6ad953988a96ea288c407afc70581289c4dd6b8ffceda65f6d4a51e8cb7228a8", + "0x949d0b15d25fb79f31900f0e48ac3fef50b3d1b69f24f505fad87ca56ad883ca", + "0xf0e01643fc4c21dc3adb6dc1a0bc9f601af1bd4b5ed50ba156a280996d521db9", + "0xcf396c2e2018e5dc71ce2e8d8d2716565fd9ef6ae097b871b4349a487e0a6727", + "0x5f22e44bdf7a346985839c4a395f66e2fbed238f0463ab2b02d7dd23c4e25748", + "0x8808ab6e652afa85738443a808d140c103757cd1a356bbe2b409e95cced6fa7c", + "0x9ab3eb50f50a357020c69c9501cb2864febf0be1c04edd20cb1fce3fc075b7db", + "0xc360f24716b701218d2c486938e17d7b56a85b818b4e808f7c12c85778914f68", + "0x0e8388813ad36963923d68e9a223087e2e29282dec830d13e04ca444a6e1ed6f", + "0xf77bc7d25e80792e69d8900f5e77a9eb276bc13d391720c8b8a1c608deaca05e", + "0x0979a99fa0f1a046c1da8204f2912b3c09c6dc7d37e0b6dba11935e5af8b1fb5", + "0xf9327d2fb74c22853685a3d41d6f63984a354115af69c7873650c9f8bc2d31ba", + "0x9fa02b5ef88c4496cd054f6dd26f292e389976b38a22760cbb505f068754a60f", + "0x1dff7dbca8c5d169d2ad52a4434a01ef647f29707e59d4543053a8bc7afc664c", + "0x051dc8f86a07ed084afe4d14f0b39268fc5858c908056401586acd0c9bd628d4", + "0xe6776e7bffe6398d66564b7e5993ef70c7347287842319e585c7f844002d9555", + "0xc5bc5e2c1e26900fe2492019e11bc4ec5595e1c8eb68bc1ddde65aed94ab83b1", + "0x6f868ac5f8f7071b3742573d8f4a3aea1bff632f6c5c15988572ea1983e9e535", + "0x086a27e853ff55ef97cf876e0d703898eaa0769ee4efadffacbb8c03de35657e", + "0x00aa9b9ffb2837aec2fd6444802437a5dcd4654ddc2df584e1ca351832a9e163", + "0xd395a77dd37f2e397456a5385e1fe4e781458db37d3a6d8da3b1d5fb7c5558fe", + "0x7567bd55454dc888c6aca9481ac1fd6641a93b3d2f5d1bc81bab97dd78f490ad", + "0xb7e980a03060221442dc0f9487a6f0614f5b83ea23350d2de3ff0ae4e93d02a6", + "0x1b43c09f68af74141ab23bcc3402932257deece48af74503e6ca452ecd59d9a3", + "0xfde1e03da25883b8eb78e3ac92914feab4e7294eb78a94e801876d59aa559f8b", + "0x807aca1ff5c2132a7c2b5d67de9c536968755dcfc32e8873fdd296f807148d56", + "0x8f3160048010ee14d59c26c0c2767b78350023327534ca27b086feea4cde5910", + "0xb26f5f50bdef8212578eb07f7afb52785944811975e1671a405013a0fcfb88cf", + "0x4e14680b46a09bdf8b9046f62ec5a28b8edd5704c3cc91fefb83646a5dd3eee9", + "0x792f84baa0644328b9cf5af899a154faae97fbbae7a1e7874e6219085b271265", + "0xc4d26ab903ed6478fd9a0fa80382f7b4eecd25125b623c6dcbc4ebaf0d8b3fc1", + "0x906b46aba1de6a6e3692bea009597d0a8dc40b76a1c5a4476a9daeeed65c2b25", + "0x167fb1cbf8026a1af6c16ff3b18285dd9d934158a9b9ae75b90ba7895ca2b7c9", + "0xaa659098a8ed4e33e511872bc82cf758eb6c2b47e318899b4e4385bd32fae051", + "0x757c86586e3307882c6d966c2a88745e4bc1a9002337a5d137d83ef3d4496768", + "0xf342de6ecb6bb5579cfca4e7dd4dedd2c1a685287dcbd891fb918226eb82cacd", + "0xb025cb5c7c1d64a8138ddd439aa95cd9a4c1162d628dae1f09bbf8a225a49f22", + "0x6ab070192b7919718111a5b1d74862c48a5705d4e9c6b47a3a81564180c3526f", + "0xf9a23794eddea371183902ae36ae4b54387b4b8b170bf848dc24a5ea39649545", + "0xfb9dfb946dd83814681f93091ceb299d417d8ec8d28e2ddb7843d913b699a6a3", + "0x44ea56c8eabaaef19c9fde38ad0f92c074039d93960b51238c1b11ed2315163a", + "0x66f8ce000b102ea085a18cfb17e99f242e0458d0b0d9d39b6a8653008fdaa98b", + "0xd573e736c4609d90ade296503843c9a12ad8f3795eefb32635dce70f2fb17381", + "0xa783abcf83917308a63bee26ef64b010e15b62014ed560881adc3ce78f80c3b3", + "0xf8406110d71475627fa02fe434b3270c353eca0ea700bd196a9c42dd2e6c472d", + "0x5e3350f159e6370a741af5879bdcc8b08c44538dabd162fef2b745e9ff2828c6", + "0x915c517a16a1dc3095bfb9550f24afc3a60f442c9205a7ebddc7eed37fb267e7", + "0x9ec7f72f0e8d5509e3ec337b0c879f730c16c55e4259526c0816d6891feb1dc6", + "0xc294284cac5de499512f9b12707b5f66dbb3b635c1cc6d4419b17f40e272e339", + "0xfbda44ddfe4b7c31b915fa94a27aa01fcfb22a9fcf0b557f9788bbf48b3f7f32", + "0x4418fe011a16af7da4645f300143a6cb005650ea96ce23c6adb4a82f60f72beb", + "0xfd3a00e52f4cc05610976b0def190199543ff3e423f09f8bbe5cef8315f36d7a", + "0x5c9fee100da6ec53ab1cf96ca9f369401853753eeaea30bef75f6989faddc504", + "0x713e2e28396b62bc63ab0a3dcfeabe977bceece4057a687d157320358f2dd08b", + "0x62ba90cbd06efea1d7bb7128e37e33d94a21b246b7eb7159d2708b5552247a75", + "0xe13d2697cfeea63e973c7493b4c54917a639fcf13eb1b327e02acee353bf84bb", + "0x8ed199e2fd654bfc9dfd5e7ea7dc82bea9f4535eb480c95984a5a6bc1533bf8e", + "0x4e5475dae57c548460d4ddd15583223bf2a4a2046c2ee56ca670892794a37d90", + "0x80409971b3e59ec71deb1a158a92ab6fe8318cb9adebcf583586e23e42d370c4", + "0xeb35d7c78965874110f67b77307deae4bb29dc98c01fbac3737409ede61df7c6" ] }, "nodes": [ @@ -3488,26692 +3765,26775 @@ "enode://140872ce4eee37177fbb7a3c3aa4aaebe3f30bdbf814dd112f6c364fc2e325ba2b6a942f7296677adcdf753c33170cb4999d2573b5ff7197b4c1868f25727e45@52.78.149.82:30303" ], "accounts": { - "0000000000000000000000000000000000000001": { "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } }, - "0000000000000000000000000000000000000002": { "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } }, - "0000000000000000000000000000000000000003": { "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } }, - "0000000000000000000000000000000000000004": { "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } }, - "0000000000000000000000000000000000000005": { "builtin": { "name": "modexp", "activate_at": 4370000, "pricing": { "modexp": { "divisor": 20 } } } }, - "0000000000000000000000000000000000000006": { "builtin": { "name": "alt_bn128_add", "activate_at": 4370000, "pricing": { "linear": { "base": 500, "word": 0 } } } }, - "0000000000000000000000000000000000000007": { "builtin": { "name": "alt_bn128_mul", "activate_at": 4370000, "pricing": { "linear": { "base": 40000, "word": 0 } } } }, - "0000000000000000000000000000000000000008": { "builtin": { "name": "alt_bn128_pairing", "activate_at": 4370000, "pricing": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 } } } }, - "3282791d6fd713f1e94f4bfd565eaa78b3a0599d": { - "balance": "1337000000000000000000" + "0x0000000000000000000000000000000000000001": { + "builtin": { + "name": "ecrecover", + "pricing": { + "linear": { + "base": 3000, + "word": 0 + } + } + } + }, + "0x0000000000000000000000000000000000000002": { + "builtin": { + "name": "sha256", + "pricing": { + "linear": { + "base": 60, + "word": 12 + } + } + } + }, + "0x0000000000000000000000000000000000000003": { + "builtin": { + "name": "ripemd160", + "pricing": { + "linear": { + "base": 600, + "word": 120 + } + } + } + }, + "0x0000000000000000000000000000000000000004": { + "builtin": { + "name": "identity", + "pricing": { + "linear": { + "base": 15, + "word": 3 + } + } + } + }, + "0x0000000000000000000000000000000000000005": { + "builtin": { + "name": "modexp", + "activate_at": "0x42ae50", + "pricing": { + "modexp": { + "divisor": 20 + } + } + } + }, + "0x0000000000000000000000000000000000000006": { + "builtin": { + "name": "alt_bn128_add", + "activate_at": "0x42ae50", + "pricing": { + "linear": { + "base": 500, + "word": 0 + } + } + } + }, + "0x0000000000000000000000000000000000000007": { + "builtin": { + "name": "alt_bn128_mul", + "activate_at": "0x42ae50", + "pricing": { + "linear": { + "base": 40000, + "word": 0 + } + } + } + }, + "0x0000000000000000000000000000000000000008": { + "builtin": { + "name": "alt_bn128_pairing", + "activate_at": "0x42ae50", + "pricing": { + "alt_bn128_pairing": { + "base": 100000, + "pair": 80000 + } + } + } + }, + "0x3282791d6fd713f1e94f4bfd565eaa78b3a0599d": { + "balance": "0x487a9a304539440000" }, - "17961d633bcf20a7b029a7d94b7df4da2ec5427f": { - "balance": "229427000000000000000" + "0x17961d633bcf20a7b029a7d94b7df4da2ec5427f": { + "balance": "0xc6ff070f1938b8000" }, - "493a67fe23decc63b10dda75f3287695a81bd5ab": { - "balance": "880000000000000000000" + "0x493a67fe23decc63b10dda75f3287695a81bd5ab": { + "balance": "0x2fb474098f67c00000" }, - "01fb8ec12425a04f813e46c54c05748ca6b29aa9": { - "balance": "259800000000000000000" + "0x01fb8ec12425a04f813e46c54c05748ca6b29aa9": { + "balance": "0xe15730385467c0000" }, - "d2a030ac8952325f9e1db378a71485a24e1b07b2": { - "balance": "2000000000000000000000" + "0xd2a030ac8952325f9e1db378a71485a24e1b07b2": { + "balance": "0x6c6b935b8bbd400000" }, - "77a34907f305a54c85db09c363fde3c47e6ae21f": { - "balance": "985000000000000000000" + "0x77a34907f305a54c85db09c363fde3c47e6ae21f": { + "balance": "0x35659ef93f0fc40000" }, - "391a77405c09a72b5e8436237aaaf95d68da1709": { - "balance": "49082000000000000000" + "0x391a77405c09a72b5e8436237aaaf95d68da1709": { + "balance": "0x2a9264af3d1b90000" }, - "00aada25ea2286709abb422d41923fd380cd04c7": { - "balance": "650100000000000000000" + "0x00aada25ea2286709abb422d41923fd380cd04c7": { + "balance": "0x233df3299f61720000" }, - "acc46a2a555c74ded4a2bd094e821b97843b40c0": { - "balance": "1940000000000000000000" + "0xacc46a2a555c74ded4a2bd094e821b97843b40c0": { + "balance": "0x692ae8897081d00000" }, - "de07fb5b7a464e3ba7fbe09e9acb271af5338c58": { - "balance": "50000000000000000000" + "0xde07fb5b7a464e3ba7fbe09e9acb271af5338c58": { + "balance": "0x2b5e3af16b1880000" }, - "4c696be99f3a690440c3436a59a7d7e937d6ba0d": { - "balance": "3460000000000000000000" + "0x4c696be99f3a690440c3436a59a7d7e937d6ba0d": { + "balance": "0xbb9125542263900000" }, - "fa33553285a973719a0d5f956ff861b2d89ed304": { - "balance": "20000000000000000000" + "0xfa33553285a973719a0d5f956ff861b2d89ed304": { + "balance": "0x1158e460913d00000" }, - "67cfda6e70bf7657d39059b59790e5145afdbe61": { - "balance": "646000000000000000000" + "0x67cfda6e70bf7657d39059b59790e5145afdbe61": { + "balance": "0x23050d095866580000" }, - "a321091d3018064279db399d2b2a88a6f440ae24": { - "balance": "3200000000000000000000" + "0xa321091d3018064279db399d2b2a88a6f440ae24": { + "balance": "0xad78ebc5ac62000000" }, - "fb3fa1ac08aba9cc3bf0fe9d483820688f65b410": { - "balance": "30000000000000000000000" + "0xfb3fa1ac08aba9cc3bf0fe9d483820688f65b410": { + "balance": "0x65a4da25d3016c00000" }, - "6715c14035fb57bb3d667f7b707498c41074b855": { - "balance": "700000000000000000000" + "0x6715c14035fb57bb3d667f7b707498c41074b855": { + "balance": "0x25f273933db5700000" }, - "d4344f7d5cad65d17e5c2d0e7323943d6f62fe92": { - "balance": "267400000000000000000" + "0xd4344f7d5cad65d17e5c2d0e7323943d6f62fe92": { + "balance": "0xe7eeba3410b740000" }, - "a3294626ec2984c43b43da4d5d8e4669b11d4b59": { - "balance": "1008000000000000000000" + "0xa3294626ec2984c43b43da4d5d8e4669b11d4b59": { + "balance": "0x36a4cf636319c00000" }, - "656018584130db83ab0591a8128d9381666a8d0e": { - "balance": "63960000000000000000" + "0x656018584130db83ab0591a8128d9381666a8d0e": { + "balance": "0x3779f912019fc0000" }, - "0fa010ce0c731d3b628e36b91f571300e49dbeab": { - "balance": "999800000000000000000" + "0x0fa010ce0c731d3b628e36b91f571300e49dbeab": { + "balance": "0x36330322d5238c0000" }, - "3098b65db93ecacaf7353c48808390a223d57684": { - "balance": "449965000000000000000" + "0x3098b65db93ecacaf7353c48808390a223d57684": { + "balance": "0x186484cf7bb6a48000" }, - "ae635bf73831119d2d29c0d04ff8f8d8d0a57a46": { - "balance": "1337000000000000000000" + "0xae635bf73831119d2d29c0d04ff8f8d8d0a57a46": { + "balance": "0x487a9a304539440000" }, - "0f7515ff0e808f695e0c20485ff96ed2f7b79310": { - "balance": "1000169000000000000000" + "0x0f7515ff0e808f695e0c20485ff96ed2f7b79310": { + "balance": "0x3638221660a5aa8000" }, - "8b30c04098d7a7e6420c357ea7bfa49bac9a8a18": { - "balance": "8000200000000000000000" + "0x8b30c04098d7a7e6420c357ea7bfa49bac9a8a18": { + "balance": "0x1b1b113f91fb0140000" }, - "64dba2d6615b8bd7571836dc75bc79d314f5ecee": { - "balance": "10000000000000000000000" + "0x64dba2d6615b8bd7571836dc75bc79d314f5ecee": { + "balance": "0x21e19e0c9bab2400000" }, - "e7912d4cf4562c573ddc5b71e37310e378ef86c9": { - "balance": "394000000000000000000" + "0xe7912d4cf4562c573ddc5b71e37310e378ef86c9": { + "balance": "0x155bd9307f9fe80000" }, - "a4da34450d22ec0ffcede0004b02f7872ee0b73a": { - "balance": "93342000000000000000" + "0xa4da34450d22ec0ffcede0004b02f7872ee0b73a": { + "balance": "0x50f616673f0830000" }, - "34437d1465640b136cb5841c3f934f9ba0b7097d": { - "balance": "173000000000000000000" + "0x34437d1465640b136cb5841c3f934f9ba0b7097d": { + "balance": "0x960db77681e940000" }, - "c652871d192422c6bc235fa063b44a7e1d43e385": { - "balance": "155000000000000000000" + "0xc652871d192422c6bc235fa063b44a7e1d43e385": { + "balance": "0x8670e9ec6598c0000" }, - "a8a708e84f82db86a35502193b4c6ee9a76ebe8f": { - "balance": "1015200000000000000000" + "0xa8a708e84f82db86a35502193b4c6ee9a76ebe8f": { + "balance": "0x3708baed3d68900000" }, - "5c3f567faff7bad1b5120022e8cbcaa82b4917b3": { - "balance": "2000000000000000000000" + "0x5c3f567faff7bad1b5120022e8cbcaa82b4917b3": { + "balance": "0x6c6b935b8bbd400000" }, - "dbc1d0ee2bab531140de137722cd36bdb4e47194": { - "balance": "200000000000000000000" + "0xdbc1d0ee2bab531140de137722cd36bdb4e47194": { + "balance": "0xad78ebc5ac6200000" }, - "f59dab1bf8df11327e61f9b7a14b563a96ec3554": { - "balance": "6000000000000000000000" + "0xf59dab1bf8df11327e61f9b7a14b563a96ec3554": { + "balance": "0x14542ba12a337c00000" }, - "456f8d746682b224679349064d1b368c7c05b176": { - "balance": "3700000000000000000000" + "0x456f8d746682b224679349064d1b368c7c05b176": { + "balance": "0xc893d09c8f51500000" }, - "5f13154631466dcb1353c890932a7c97e0878e90": { - "balance": "6000000000000000000000" + "0x5f13154631466dcb1353c890932a7c97e0878e90": { + "balance": "0x14542ba12a337c00000" }, - "f4b1626e24f30bcad9273c527fcc714b5d007b8f": { - "balance": "200000000000000000000" + "0xf4b1626e24f30bcad9273c527fcc714b5d007b8f": { + "balance": "0xad78ebc5ac6200000" }, - "a8db0b9b201453333c757f6ad9bcb555c02da93b": { - "balance": "2199970000000000000000" + "0xa8db0b9b201453333c757f6ad9bcb555c02da93b": { + "balance": "0x7742b7830f341d0000" }, - "a0fc7e53c5ebd27a2abdac45261f84ab3b51aefb": { - "balance": "3008250000000000000000" + "0xa0fc7e53c5ebd27a2abdac45261f84ab3b51aefb": { + "balance": "0xa313daec9bc0d90000" }, - "1b636b7a496f044d7359596e353a104616436f6b": { - "balance": "360354000000000000000" + "0x1b636b7a496f044d7359596e353a104616436f6b": { + "balance": "0x1388ea95c33f1d0000" }, - "74bce9ec38362d6c94ccac26d5c0e13a8b3b1d40": { - "balance": "999954000000000000000" + "0x74bce9ec38362d6c94ccac26d5c0e13a8b3b1d40": { + "balance": "0x363526410442f50000" }, - "9834682180b982d166badb9d9d1d9bbf016d87ee": { - "balance": "2000000000000000000000" + "0x9834682180b982d166badb9d9d1d9bbf016d87ee": { + "balance": "0x6c6b935b8bbd400000" }, - "1e6e0153fc161bc05e656bbb144c7187bf4fe84d": { - "balance": "2000000000000000000000" + "0x1e6e0153fc161bc05e656bbb144c7187bf4fe84d": { + "balance": "0x6c6b935b8bbd400000" }, - "989c0ccff654da03aeb11af701054561d6297e1d": { - "balance": "4000000000000000000000" + "0x989c0ccff654da03aeb11af701054561d6297e1d": { + "balance": "0xd8d726b7177a800000" }, - "78a1e254409fb1b55a7cb4dd8eba3b30c8bad9ef": { - "balance": "100000000000000000000" + "0x78a1e254409fb1b55a7cb4dd8eba3b30c8bad9ef": { + "balance": "0x56bc75e2d63100000" }, - "9ef1896b007c32a15114fb89d73dbd47f9122b69": { - "balance": "4000000000000000000000" + "0x9ef1896b007c32a15114fb89d73dbd47f9122b69": { + "balance": "0xd8d726b7177a800000" }, - "33320dd90f2baa110dd334872a998f148426453c": { - "balance": "999972000000000000000" + "0x33320dd90f2baa110dd334872a998f148426453c": { + "balance": "0x36356633ebd8ea0000" }, - "e72e1d335cc29a96b9b1c02f003a16d971e90b9d": { - "balance": "1580000000000000000000" + "0xe72e1d335cc29a96b9b1c02f003a16d971e90b9d": { + "balance": "0x55a6e79ccd1d300000" }, - "0921605f99164e3bcc28f31caece78973182561d": { - "balance": "793744000000000000000" + "0x0921605f99164e3bcc28f31caece78973182561d": { + "balance": "0x2b07692a9065a80000" }, - "fc00a420a36107dfd5f495128a5fe5abb2db0f34": { - "balance": "5960000000000000000000" + "0xfc00a420a36107dfd5f495128a5fe5abb2db0f34": { + "balance": "0x143179d869110200000" }, - "dfcbdf09454e1a5e4a40d3eef7c5cf1cd3de9486": { - "balance": "4000000000000000000000" + "0xdfcbdf09454e1a5e4a40d3eef7c5cf1cd3de9486": { + "balance": "0xd8d726b7177a800000" }, - "646e043d0597a664948fbb0dc15475a3a4f3a6ed": { - "balance": "20000000000000000000" + "0x646e043d0597a664948fbb0dc15475a3a4f3a6ed": { + "balance": "0x1158e460913d00000" }, - "79aeb34566b974c35a5881dec020927da7df5d25": { - "balance": "2000000000000000000000" + "0x79aeb34566b974c35a5881dec020927da7df5d25": { + "balance": "0x6c6b935b8bbd400000" }, - "dbadc61ed5f0460a7f18e51b2fb2614d9264a0e0": { - "balance": "40000000000000000000" + "0xdbadc61ed5f0460a7f18e51b2fb2614d9264a0e0": { + "balance": "0x22b1c8c1227a00000" }, - "97b91efe7350c2d57e7e406bab18f3617bcde14a": { - "balance": "9999980000000000000000" + "0x97b91efe7350c2d57e7e406bab18f3617bcde14a": { + "balance": "0x21e1999bbd5d2be0000" }, - "8398e07ebcb4f75ff2116de77c1c2a99f303a4cf": { - "balance": "500000000000000000000" + "0x8398e07ebcb4f75ff2116de77c1c2a99f303a4cf": { + "balance": "0x1b1ae4d6e2ef500000" }, - "f02796295101674288c1d93467053d042219b794": { - "balance": "740000000000000000000" + "0xf02796295101674288c1d93467053d042219b794": { + "balance": "0x281d901f4fdd100000" }, - "f4ed848ec961739c2c7e352f435ba70a7cd5db38": { - "balance": "1970000000000000000000" + "0xf4ed848ec961739c2c7e352f435ba70a7cd5db38": { + "balance": "0x6acb3df27e1f880000" }, - "82485728d0e281563758c75ab27ed9e882a0002d": { - "balance": "147000000000000000000" + "0x82485728d0e281563758c75ab27ed9e882a0002d": { + "balance": "0x7f808e9291e6c0000" }, - "427ec668ac9404e895cc861511d1620a4912be98": { - "balance": "40000000000000000000000" + "0x427ec668ac9404e895cc861511d1620a4912be98": { + "balance": "0x878678326eac9000000" }, - "1bbc199e586790be87afedc849c04726745c5d7b": { - "balance": "4000000000000000000000" + "0x1bbc199e586790be87afedc849c04726745c5d7b": { + "balance": "0xd8d726b7177a800000" }, - "10d945334ecde47beb9ca3816c173dfbbd0b5333": { - "balance": "1400000000000000000000" + "0x10d945334ecde47beb9ca3816c173dfbbd0b5333": { + "balance": "0x4be4e7267b6ae00000" }, - "1dcebcb7656df5dcaa3368a055d22f9ed6cdd940": { - "balance": "499800000000000000000" + "0x1dcebcb7656df5dcaa3368a055d22f9ed6cdd940": { + "balance": "0x1b181e4bf2343c0000" }, - "2ac1f8d7bf721f3cfe74d20fea9b87a28aaa982c": { - "balance": "161000000000000000000" + "0x2ac1f8d7bf721f3cfe74d20fea9b87a28aaa982c": { + "balance": "0x8ba52e6fc45e40000" }, - "0a47ad9059a249fc936b2662353da6905f75c2b9": { - "balance": "2000000000000000000000" + "0x0a47ad9059a249fc936b2662353da6905f75c2b9": { + "balance": "0x6c6b935b8bbd400000" }, - "768498934e37e905f1d0e77b44b574bcf3ec4ae8": { - "balance": "20000000000000000000000" + "0x768498934e37e905f1d0e77b44b574bcf3ec4ae8": { + "balance": "0x43c33c1937564800000" }, - "f46b6b9c7cb552829c1d3dfd8ffb11aabae782f6": { - "balance": "21000000000000000000" + "0xf46b6b9c7cb552829c1d3dfd8ffb11aabae782f6": { + "balance": "0x1236efcbcbb340000" }, - "7aea25d42b2612286e99c53697c6bc4100e2dbbf": { - "balance": "2000000000000000000000" + "0x7aea25d42b2612286e99c53697c6bc4100e2dbbf": { + "balance": "0x6c6b935b8bbd400000" }, - "af3615c789d0b1152ad4db25fe5dcf222804cf62": { - "balance": "1000000000000000000000" + "0xaf3615c789d0b1152ad4db25fe5dcf222804cf62": { + "balance": "0x3635c9adc5dea00000" }, - "92e6581e1da1f9b846e09347333dc818e2d2ac66": { - "balance": "3640000000000000000000" + "0x92e6581e1da1f9b846e09347333dc818e2d2ac66": { + "balance": "0xc55325ca7415e00000" }, - "240305727313d01e73542c775ff59d11cd35f819": { - "balance": "5931229000000000000000" + "0x240305727313d01e73542c775ff59d11cd35f819": { + "balance": "0x141885666807f5c8000" }, - "b95cfda8465ba9c2661b249fc3ab661bdfa35ff0": { - "balance": "318949000000000000000" + "0xb95cfda8465ba9c2661b249fc3ab661bdfa35ff0": { + "balance": "0x114a4e79a2c2108000" }, - "1b0d076817e8d68ee2df4e1da1c1142d198c4435": { - "balance": "1550000000000000000000" + "0x1b0d076817e8d68ee2df4e1da1c1142d198c4435": { + "balance": "0x54069233bf7f780000" }, - "93c2e64e5de5589ed25006e843196ee9b1cf0b3e": { - "balance": "1670000000000000000000" + "0x93c2e64e5de5589ed25006e843196ee9b1cf0b3e": { + "balance": "0x5a87e7d7f5f6580000" }, - "0e2e504a2d1122b5a9feee5cb1451bf4c2ace87b": { - "balance": "3940000000000000000000" + "0x0e2e504a2d1122b5a9feee5cb1451bf4c2ace87b": { + "balance": "0xd5967be4fc3f100000" }, - "22b96ab2cad55db100b53001f9e4db378104c807": { - "balance": "10000000000000000000000" + "0x22b96ab2cad55db100b53001f9e4db378104c807": { + "balance": "0x21e19e0c9bab2400000" }, - "a927d48bb6cb814bc609cbcaa9151f5d459a27e1": { - "balance": "271600000000000000000" + "0xa927d48bb6cb814bc609cbcaa9151f5d459a27e1": { + "balance": "0xeb935090064180000" }, - "5cbd8daf27ddf704cdd0d909a789ba36ed4f37b2": { - "balance": "13400000000000000000" + "0x5cbd8daf27ddf704cdd0d909a789ba36ed4f37b2": { + "balance": "0xb9f65d00f63c0000" }, - "9adbd3bc7b0afc05d1d2eda49ff863939c48db46": { - "balance": "199955000000000000000" + "0x9adbd3bc7b0afc05d1d2eda49ff863939c48db46": { + "balance": "0xad6eedd17cf3b8000" }, - "ac7e03702723cb16ee27e22dd0b815dc2d5cae9f": { - "balance": "16000000000000000000000" + "0xac7e03702723cb16ee27e22dd0b815dc2d5cae9f": { + "balance": "0x3635c9adc5dea000000" }, - "1e210e7047886daa52aaf70f4b991dac68e3025e": { - "balance": "200000000000000000000" + "0x1e210e7047886daa52aaf70f4b991dac68e3025e": { + "balance": "0xad78ebc5ac6200000" }, - "c98048687f2bfcc9bd90ed18736c57edd352b65d": { - "balance": "1000000000000000000000" + "0xc98048687f2bfcc9bd90ed18736c57edd352b65d": { + "balance": "0x3635c9adc5dea00000" }, - "81c18c2a238ddc4cba230a072dd7dc101e620273": { - "balance": "1337000000000000000000" + "0x81c18c2a238ddc4cba230a072dd7dc101e620273": { + "balance": "0x487a9a304539440000" }, - "cb3d766c983f192bcecac70f4ee03dd9ff714d51": { - "balance": "100000000000000000000" + "0xcb3d766c983f192bcecac70f4ee03dd9ff714d51": { + "balance": "0x56bc75e2d63100000" }, - "44a63d18424587b9b307bfc3c364ae10cd04c713": { - "balance": "20000000000000000000" + "0x44a63d18424587b9b307bfc3c364ae10cd04c713": { + "balance": "0x1158e460913d00000" }, - "4ab2d34f04834fbf7479649cab923d2c4725c553": { - "balance": "3520000000000000000000" + "0x4ab2d34f04834fbf7479649cab923d2c4725c553": { + "balance": "0xbed1d0263d9f000000" }, - "b834acf3015322c58382eeb2b79638906e88b6de": { - "balance": "24000000000000000000000" + "0xb834acf3015322c58382eeb2b79638906e88b6de": { + "balance": "0x5150ae84a8cdf000000" }, - "7d551397f79a2988b064afd0efebee802c7721bc": { - "balance": "39400000000000000000000" + "0x7d551397f79a2988b064afd0efebee802c7721bc": { + "balance": "0x857e0d6f1da76a00000" }, - "b537d36a70eeb8d3e5c80de815225c1158cb92c4": { - "balance": "1500000000000000000000" + "0xb537d36a70eeb8d3e5c80de815225c1158cb92c4": { + "balance": "0x5150ae84a8cdf00000" }, - "805ce51297a0793b812067f017b3e7b2df9bb1f9": { - "balance": "100000000000000000000" + "0x805ce51297a0793b812067f017b3e7b2df9bb1f9": { + "balance": "0x56bc75e2d63100000" }, - "085ba65febe23eefc2c802666ab1262382cfc494": { - "balance": "400000000000000000000" + "0x085ba65febe23eefc2c802666ab1262382cfc494": { + "balance": "0x15af1d78b58c400000" }, - "b1c0d08b36e184f9952a4037e3e53a667d070a4e": { - "balance": "1000000000000000000000" + "0xb1c0d08b36e184f9952a4037e3e53a667d070a4e": { + "balance": "0x3635c9adc5dea00000" }, - "83fe5a1b328bae440711beaf6aad6026eda6d220": { - "balance": "20000000000000000000000" + "0x83fe5a1b328bae440711beaf6aad6026eda6d220": { + "balance": "0x43c33c1937564800000" }, - "7fd679e5fb0da2a5d116194dcb508318edc580f3": { - "balance": "6560000000000000000000" + "0x7fd679e5fb0da2a5d116194dcb508318edc580f3": { + "balance": "0x1639e49bba162800000" }, - "41ad369f758fef38a19aa3149379832c818ef2a0": { - "balance": "1000060000000000000000" + "0x41ad369f758fef38a19aa3149379832c818ef2a0": { + "balance": "0x36369ed7747d260000" }, - "6d846dc12657e91af25008519c3e857f51707dd6": { - "balance": "4590000000000000000000" + "0x6d846dc12657e91af25008519c3e857f51707dd6": { + "balance": "0xf8d30bc92342f80000" }, - "c02d6eadeacf1b78b3ca85035c637bb1ce01f490": { - "balance": "4000000000000000000000" + "0xc02d6eadeacf1b78b3ca85035c637bb1ce01f490": { + "balance": "0xd8d726b7177a800000" }, - "826eb7cd7319b82dd07a1f3b409071d96e39677f": { - "balance": "1000000000000000000000" + "0x826eb7cd7319b82dd07a1f3b409071d96e39677f": { + "balance": "0x3635c9adc5dea00000" }, - "4ac9905a4cb6ab1cfd62546ee5917300b87c4fde": { - "balance": "1015200000000000000000" + "0x4ac9905a4cb6ab1cfd62546ee5917300b87c4fde": { + "balance": "0x3708baed3d68900000" }, - "cf6e52e6b77480b1867efec6446d9fc3cc3577e8": { - "balance": "222010000000000000000" + "0xcf6e52e6b77480b1867efec6446d9fc3cc3577e8": { + "balance": "0xc0901f6bd98790000" }, - "2476b2bb751ce748e1a4c4ff7b230be0c15d2245": { - "balance": "4000000000000000000000" + "0x2476b2bb751ce748e1a4c4ff7b230be0c15d2245": { + "balance": "0xd8d726b7177a800000" }, - "1a505e62a74e87e577473e4f3afa16bedd3cfa52": { - "balance": "500000000000000000000" + "0x1a505e62a74e87e577473e4f3afa16bedd3cfa52": { + "balance": "0x1b1ae4d6e2ef500000" }, - "21d02705f3f64905d80ed9147913ea8c7307d695": { - "balance": "1363740000000000000000" + "0x21d02705f3f64905d80ed9147913ea8c7307d695": { + "balance": "0x49edb1c09887360000" }, - "7b1daf14891b8a1e1bd429d8b36b9a4aa1d9afbf": { - "balance": "500000000000000000000" + "0x7b1daf14891b8a1e1bd429d8b36b9a4aa1d9afbf": { + "balance": "0x1b1ae4d6e2ef500000" }, - "5338ef70eac9dd9af5a0503b5efad1039e67e725": { - "balance": "2674000000000000000000" + "0x5338ef70eac9dd9af5a0503b5efad1039e67e725": { + "balance": "0x90f534608a72880000" }, - "50ca86b5eb1d01874df8e5f34945d49c6c1ab848": { - "balance": "1000000000000000000000" + "0x50ca86b5eb1d01874df8e5f34945d49c6c1ab848": { + "balance": "0x3635c9adc5dea00000" }, - "f3cc8bcb559465f81bfe583bd7ab0a2306453b9e": { - "balance": "20000000000000000000000" + "0xf3cc8bcb559465f81bfe583bd7ab0a2306453b9e": { + "balance": "0x43c33c1937564800000" }, - "5c323457e187761a8276e359b7b7af3f3b6e3df6": { - "balance": "10000000000000000000000" + "0x5c323457e187761a8276e359b7b7af3f3b6e3df6": { + "balance": "0x21e19e0c9bab2400000" }, - "4d82d7700c123bb919419bbaf046799c6b0e2c66": { - "balance": "20000000000000000000000" + "0x4d82d7700c123bb919419bbaf046799c6b0e2c66": { + "balance": "0x43c33c1937564800000" }, - "8a66abbc2d30ce21a833b0db8e561d5105e0a72c": { - "balance": "699958000000000000000" + "0x8a66abbc2d30ce21a833b0db8e561d5105e0a72c": { + "balance": "0x25f1de5c76acdf0000" }, - "2ae53866fc2d14d572ab73b4a065a1188267f527": { - "balance": "8000000000000000000000" + "0x2ae53866fc2d14d572ab73b4a065a1188267f527": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "9af5c9894c33e42c2c518e3ac670ea9505d1b53e": { - "balance": "18200000000000000000" + "0x9af5c9894c33e42c2c518e3ac670ea9505d1b53e": { + "balance": "0xfc936392801c0000" }, - "cba25c7a503cc8e0d04971ca05c762f9b762b48b": { - "balance": "500000000000000000000" + "0xcba25c7a503cc8e0d04971ca05c762f9b762b48b": { + "balance": "0x1b1ae4d6e2ef500000" }, - "fda3042819af3e662900e1b92b4358eda6e92590": { - "balance": "118200000000000000000000" + "0xfda3042819af3e662900e1b92b4358eda6e92590": { + "balance": "0x1907a284d58f63e00000" }, - "9bd7c38a4210304a4d653edeff1b3ce45fce7843": { - "balance": "282000000000000000000" + "0x9bd7c38a4210304a4d653edeff1b3ce45fce7843": { + "balance": "0xf498941e664280000" }, - "edc22fb92c638e1e21ff5cf039daa6e734dafb29": { - "balance": "298000000000000000000" + "0xedc22fb92c638e1e21ff5cf039daa6e734dafb29": { + "balance": "0x102794ad20da680000" }, - "a1f193a0592f1feb9fdfc90aa813784eb80471c9": { - "balance": "1400000000000000000000" + "0xa1f193a0592f1feb9fdfc90aa813784eb80471c9": { + "balance": "0x4be4e7267b6ae00000" }, - "e97fde0b67716325cf0ecce8a191a3761b2c791d": { - "balance": "1004700000000000000000" + "0xe97fde0b67716325cf0ecce8a191a3761b2c791d": { + "balance": "0x3677036edf0af60000" }, - "110237cf9117e767922fc4a1b78d7964da82df20": { - "balance": "3940000000000000000000" + "0x110237cf9117e767922fc4a1b78d7964da82df20": { + "balance": "0xd5967be4fc3f100000" }, - "e32f95766d57b5cd4b173289d6876f9e64558194": { - "balance": "100000000000000000000" + "0xe32f95766d57b5cd4b173289d6876f9e64558194": { + "balance": "0x56bc75e2d63100000" }, - "f2d59c8923759073d6f415aaf8eb065ff2f3b685": { - "balance": "7880000000000000000000" + "0xf2d59c8923759073d6f415aaf8eb065ff2f3b685": { + "balance": "0x1ab2cf7c9f87e200000" }, - "c53d79f7cb9b70952fd30fce58d54b9f0b59f647": { - "balance": "5089200000000000000000" + "0xc53d79f7cb9b70952fd30fce58d54b9f0b59f647": { + "balance": "0x113e2d6744345f80000" }, - "9eb281c32719c40fdb3e216db0f37fbc73a026b7": { - "balance": "20000000000000000000" + "0x9eb281c32719c40fdb3e216db0f37fbc73a026b7": { + "balance": "0x1158e460913d00000" }, - "2d6511fd7a3800b26854c7ec39c0dcb5f4c4e8e8": { - "balance": "399910000000000000000" + "0x2d6511fd7a3800b26854c7ec39c0dcb5f4c4e8e8": { + "balance": "0x15adddba2f9e770000" }, - "61ba87c77e9b596de7ba0e326fddfeec2163ef66": { - "balance": "200000000000000000000" + "0x61ba87c77e9b596de7ba0e326fddfeec2163ef66": { + "balance": "0xad78ebc5ac6200000" }, - "de1121829c9a08284087a43fbd2fc1142a3233b4": { - "balance": "1000000000000000000000" + "0xde1121829c9a08284087a43fbd2fc1142a3233b4": { + "balance": "0x3635c9adc5dea00000" }, - "22a25812ab56dcc423175ed1d8adacce33cd1810": { - "balance": "1850000000000000000000" + "0x22a25812ab56dcc423175ed1d8adacce33cd1810": { + "balance": "0x6449e84e47a8a80000" }, - "518cef27b10582b6d14f69483ddaa0dd3c87bb5c": { - "balance": "600000000000000000000" + "0x518cef27b10582b6d14f69483ddaa0dd3c87bb5c": { + "balance": "0x2086ac351052600000" }, - "59161749fedcf1c721f2202d13ade2abcf460b3d": { - "balance": "2000000000000000000000" + "0x59161749fedcf1c721f2202d13ade2abcf460b3d": { + "balance": "0x6c6b935b8bbd400000" }, - "3e36c17253c11cf38974ed0db1b759160da63783": { - "balance": "7000000000000000000000" + "0x3e36c17253c11cf38974ed0db1b759160da63783": { + "balance": "0x17b7883c06916600000" }, - "cbfa76db04ce38fb205d37b8d377cf1380da0317": { - "balance": "1430000000000000000000" + "0xcbfa76db04ce38fb205d37b8d377cf1380da0317": { + "balance": "0x4d853c8f8908980000" }, - "a7e83772bc200f9006aa2a260dbaa8483dc52b30": { - "balance": "207730000000000000000" + "0xa7e83772bc200f9006aa2a260dbaa8483dc52b30": { + "balance": "0xb42d5366637e50000" }, - "e87eac6d602b4109c9671bf57b950c2cfdb99d55": { - "balance": "49932000000000000000" + "0xe87eac6d602b4109c9671bf57b950c2cfdb99d55": { + "balance": "0x2b4f21972ecce0000" }, - "9b06ad841dffbe4ccf46f1039fc386f3c321446e": { - "balance": "2000000000000000000000" + "0x9b06ad841dffbe4ccf46f1039fc386f3c321446e": { + "balance": "0x6c6b935b8bbd400000" }, - "e0f903c1e48ac421ab48528f3d4a2648080fe043": { - "balance": "1015200000000000000000" + "0xe0f903c1e48ac421ab48528f3d4a2648080fe043": { + "balance": "0x3708baed3d68900000" }, - "5d872b122e994ef27c71d7deb457bf65429eca6c": { - "balance": "7999973000000000000000" + "0x5d872b122e994ef27c71d7deb457bf65429eca6c": { + "balance": "0x1b1aded81d394108000" }, - "f34083ecea385017aa40bdd35ef7effb4ce7762d": { - "balance": "400000000000000000000" + "0xf34083ecea385017aa40bdd35ef7effb4ce7762d": { + "balance": "0x15af1d78b58c400000" }, - "7f3709391f3fbeba3592d175c740e87a09541d02": { - "balance": "480000000000000000000" + "0x7f3709391f3fbeba3592d175c740e87a09541d02": { + "balance": "0x1a055690d9db800000" }, - "888e94917083d152202b53163939869d271175b4": { - "balance": "4000000000000000000000" + "0x888e94917083d152202b53163939869d271175b4": { + "balance": "0xd8d726b7177a800000" }, - "bed4c8f006a27c1e5f7ce205de75f516bfb9f764": { - "balance": "16000000000000000000000" + "0xbed4c8f006a27c1e5f7ce205de75f516bfb9f764": { + "balance": "0x3635c9adc5dea000000" }, - "b3a6bd41f9d9c3201e050b87198fbda399342210": { - "balance": "3622615000000000000000" + "0xb3a6bd41f9d9c3201e050b87198fbda399342210": { + "balance": "0xc461e1dd1029b58000" }, - "550aadae1221b07afea39fba2ed62e05e5b7b5f9": { - "balance": "20000000000000000000" + "0x550aadae1221b07afea39fba2ed62e05e5b7b5f9": { + "balance": "0x1158e460913d00000" }, - "bcedc4267ccb89b31bb764d7211171008d94d44d": { - "balance": "200000000000000000000" + "0xbcedc4267ccb89b31bb764d7211171008d94d44d": { + "balance": "0xad78ebc5ac6200000" }, - "6229dcc203b1edccfdf06e87910c452a1f4d7a72": { - "balance": "32500000000000000000000" + "0x6229dcc203b1edccfdf06e87910c452a1f4d7a72": { + "balance": "0x6e1d41a8f9ec3500000" }, - "94be3ae54f62d663b0d4cc9e1ea8fe9556ea9ebf": { - "balance": "23280000000000000000" + "0x94be3ae54f62d663b0d4cc9e1ea8fe9556ea9ebf": { + "balance": "0x143132ca843180000" }, - "0e0c9d005ea016c295cd795cc9213e87febc33eb": { - "balance": "198000000000000000000" + "0x0e0c9d005ea016c295cd795cc9213e87febc33eb": { + "balance": "0xabbcd4ef377580000" }, - "55d057bcc04bd0f4af9642513aa5090bb3ff93fe": { - "balance": "1106680000000000000000" + "0x55d057bcc04bd0f4af9642513aa5090bb3ff93fe": { + "balance": "0x3bfe452c8edd4c0000" }, - "ed9e030ca75cb1d29ea01d0d4cdfdccd3844b6e4": { - "balance": "30895000000000000000" + "0xed9e030ca75cb1d29ea01d0d4cdfdccd3844b6e4": { + "balance": "0x1acc116cfafb18000" }, - "86c4ce06d9ac185bb148d96f7b7abe73f441006d": { - "balance": "10000000000000000000000" + "0x86c4ce06d9ac185bb148d96f7b7abe73f441006d": { + "balance": "0x21e19e0c9bab2400000" }, - "2c04115c3e52961b0dc0b0bf31fba4546f5966fd": { - "balance": "200000000000000000000" + "0x2c04115c3e52961b0dc0b0bf31fba4546f5966fd": { + "balance": "0xad78ebc5ac6200000" }, - "b959dce02e91d9db02b1bd8b7d17a9c41a97af09": { - "balance": "8000000000000000000000" + "0xb959dce02e91d9db02b1bd8b7d17a9c41a97af09": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "e01547ba42fcafaf93938becf7699f74290af74f": { - "balance": "2000000000000000000000" + "0xe01547ba42fcafaf93938becf7699f74290af74f": { + "balance": "0x6c6b935b8bbd400000" }, - "c593d6e37d14b566643ac4135f243caa0787c182": { - "balance": "12000000000000000000000" + "0xc593d6e37d14b566643ac4135f243caa0787c182": { + "balance": "0x28a857425466f800000" }, - "2c0ee134d8b36145b47beee7af8d2738dbda08e8": { - "balance": "201000000000000000000" + "0x2c0ee134d8b36145b47beee7af8d2738dbda08e8": { + "balance": "0xae56f730e6d840000" }, - "0ef54ac7264d2254abbb5f8b41adde875157db7c": { - "balance": "40000000000000000000" + "0x0ef54ac7264d2254abbb5f8b41adde875157db7c": { + "balance": "0x22b1c8c1227a00000" }, - "0349634dc2a9e80c3f7721ee2b5046aeaaedfbb5": { - "balance": "4000000000000000000000" + "0x0349634dc2a9e80c3f7721ee2b5046aeaaedfbb5": { + "balance": "0xd8d726b7177a800000" }, - "873e49135c3391991060290aa7f6ccb8f85a78db": { - "balance": "20000000000000000000" + "0x873e49135c3391991060290aa7f6ccb8f85a78db": { + "balance": "0x1158e460913d00000" }, - "05236d4c90d065f9e3938358aaffd777b86aec49": { - "balance": "500000000000000000000" + "0x05236d4c90d065f9e3938358aaffd777b86aec49": { + "balance": "0x1b1ae4d6e2ef500000" }, - "d2abd84a181093e5e229136f42d835e8235de109": { - "balance": "100007000000000000000" + "0xd2abd84a181093e5e229136f42d835e8235de109": { + "balance": "0x56be03ca3e47d8000" }, - "b56a780028039c81caf37b6775c620e786954764": { - "balance": "2000000000000000000000" + "0xb56a780028039c81caf37b6775c620e786954764": { + "balance": "0x6c6b935b8bbd400000" }, - "86df73bd377f2c09de63c45d67f283eaefa0f4ab": { - "balance": "1000000000000000000000" + "0x86df73bd377f2c09de63c45d67f283eaefa0f4ab": { + "balance": "0x3635c9adc5dea00000" }, - "7670b02f2c3cf8fd4f4730f3381a71ea431c33c7": { - "balance": "267400000000000000000" + "0x7670b02f2c3cf8fd4f4730f3381a71ea431c33c7": { + "balance": "0xe7eeba3410b740000" }, - "24aa1151bb765fa3a89ca50eb6e1b1c706417fd4": { - "balance": "3100000000000000000000" + "0x24aa1151bb765fa3a89ca50eb6e1b1c706417fd4": { + "balance": "0xa80d24677efef00000" }, - "43227d65334e691cf231b4a4e1d339b95d598afb": { - "balance": "10000000000000000000000" + "0x43227d65334e691cf231b4a4e1d339b95d598afb": { + "balance": "0x21e19e0c9bab2400000" }, - "695550656cbf90b75d92ad9122d90d23ca68ca4d": { - "balance": "1000000000000000000000" + "0x695550656cbf90b75d92ad9122d90d23ca68ca4d": { + "balance": "0x3635c9adc5dea00000" }, - "5281733473e00d87f11e9955e589b59f4ac28e7a": { - "balance": "660360000000000000000000" + "0x5281733473e00d87f11e9955e589b59f4ac28e7a": { + "balance": "0x8bd62ff4eec559200000" }, - "99a96bf2242ea1b39ece6fcc0d18aed00c0179f3": { - "balance": "300000000000000000000" + "0x99a96bf2242ea1b39ece6fcc0d18aed00c0179f3": { + "balance": "0x1043561a8829300000" }, - "b1cf94f8091505055f010ab4bac696e0ca0f67a1": { - "balance": "1580000000000000000000" + "0xb1cf94f8091505055f010ab4bac696e0ca0f67a1": { + "balance": "0x55a6e79ccd1d300000" }, - "54391b4d176d476cea164e5fb535c69700cb2535": { - "balance": "100076000000000000000" + "0x54391b4d176d476cea164e5fb535c69700cb2535": { + "balance": "0x56cd55fc64dfe0000" }, - "152f2bd229ddf3cb0fdaf455c183209c0e1e39a2": { - "balance": "2000000000000000000000" + "0x152f2bd229ddf3cb0fdaf455c183209c0e1e39a2": { + "balance": "0x6c6b935b8bbd400000" }, - "affc99d5ebb4a84fe7788d97dce274b038240438": { - "balance": "5000000000000000000000" + "0xaffc99d5ebb4a84fe7788d97dce274b038240438": { + "balance": "0x10f0cf064dd59200000" }, - "23df8f48ee009256ea797e1fa369beebcf6bc663": { - "balance": "2302671000000000000000" + "0x23df8f48ee009256ea797e1fa369beebcf6bc663": { + "balance": "0x7cd3fac26d19818000" }, - "3a72d635aadeee4382349db98a1813a4cfeb3df1": { - "balance": "200000000000000000000000" + "0x3a72d635aadeee4382349db98a1813a4cfeb3df1": { + "balance": "0x2a5a058fc295ed000000" }, - "ce26f9a5305f8381094354dbfc92664e84f902b5": { - "balance": "230200000000000000000" + "0xce26f9a5305f8381094354dbfc92664e84f902b5": { + "balance": "0xc7aaab0591eec0000" }, - "d283b8edb10a25528a4404de1c65e7410dbcaa67": { - "balance": "12000000000000000000000" + "0xd283b8edb10a25528a4404de1c65e7410dbcaa67": { + "balance": "0x28a857425466f800000" }, - "a7859fc07f756ea7dcebbccd42f05817582d973f": { - "balance": "10000000000000000000000" + "0xa7859fc07f756ea7dcebbccd42f05817582d973f": { + "balance": "0x21e19e0c9bab2400000" }, - "b28181a458a440f1c6bb1de8400281a3148f4c35": { - "balance": "376000000000000000000" + "0xb28181a458a440f1c6bb1de8400281a3148f4c35": { + "balance": "0x14620c57dddae00000" }, - "27b1694eafa165ebd7cc7bc99e74814a951419dc": { - "balance": "800000000000000000000" + "0x27b1694eafa165ebd7cc7bc99e74814a951419dc": { + "balance": "0x2b5e3af16b18800000" }, - "66cc8ab23c00d1b82acd7d73f38c99e0d05a4fa6": { - "balance": "100000000000000000000" + "0x66cc8ab23c00d1b82acd7d73f38c99e0d05a4fa6": { + "balance": "0x56bc75e2d63100000" }, - "926082cb7eed4b1993ad245a477267e1c33cd568": { - "balance": "374300000000000000000" + "0x926082cb7eed4b1993ad245a477267e1c33cd568": { + "balance": "0x144a74badfa4b60000" }, - "4a47fc3e177f567a1e3893e000e36bba23520ab8": { - "balance": "2000000000000000000000" + "0x4a47fc3e177f567a1e3893e000e36bba23520ab8": { + "balance": "0x6c6b935b8bbd400000" }, - "594a76f06935388dde5e234696a0668bc20d2ddc": { - "balance": "2800000000000000000000" + "0x594a76f06935388dde5e234696a0668bc20d2ddc": { + "balance": "0x97c9ce4cf6d5c00000" }, - "e91fa0badaddb9a97e88d3f4db7c55d6bb7430fe": { - "balance": "376000000000000000000" + "0xe91fa0badaddb9a97e88d3f4db7c55d6bb7430fe": { + "balance": "0x14620c57dddae00000" }, - "574de1b3f38d915846ae3718564a5ada20c2f3ed": { - "balance": "4000000000000000000000" + "0x574de1b3f38d915846ae3718564a5ada20c2f3ed": { + "balance": "0xd8d726b7177a800000" }, - "5816c2687777b6d7d2a2432d59a41fa059e3a406": { - "balance": "133700000000000000000000" + "0x5816c2687777b6d7d2a2432d59a41fa059e3a406": { + "balance": "0x1c4fe43adb0a5e900000" }, - "b50955aa6e341571986608bdc891c2139f540cdf": { - "balance": "1970000000000000000000" + "0xb50955aa6e341571986608bdc891c2139f540cdf": { + "balance": "0x6acb3df27e1f880000" }, - "6d44974a31d187eda16ddd47b9c7ec5002d61fbe": { - "balance": "940000000000000000000" + "0x6d44974a31d187eda16ddd47b9c7ec5002d61fbe": { + "balance": "0x32f51edbaaa3300000" }, - "80abec5aa36e5c9d098f1b942881bd5acac6963d": { - "balance": "2000000000000000000000" + "0x80abec5aa36e5c9d098f1b942881bd5acac6963d": { + "balance": "0x6c6b935b8bbd400000" }, - "294f494b3f2e143c2ffc9738cbfd9501850b874e": { - "balance": "2240000000000000000000" + "0x294f494b3f2e143c2ffc9738cbfd9501850b874e": { + "balance": "0x796e3ea3f8ab000000" }, - "bca3ffd4683fba0ad3bbc90734b611da9cfb457e": { - "balance": "200000000000000000000" + "0xbca3ffd4683fba0ad3bbc90734b611da9cfb457e": { + "balance": "0xad78ebc5ac6200000" }, - "5992624c54cdec60a5ae938033af8be0c50cbb0a": { - "balance": "3621678000000000000000" + "0x5992624c54cdec60a5ae938033af8be0c50cbb0a": { + "balance": "0xc454e0f8870f2b0000" }, - "6560941328ff587cbc56c38c78238a7bb5f442f6": { - "balance": "744900000000000000000" + "0x6560941328ff587cbc56c38c78238a7bb5f442f6": { + "balance": "0x2861906b59c47a0000" }, - "74b7e0228baed65957aebb4d916d333aae164f0e": { - "balance": "2000000000000000000000" + "0x74b7e0228baed65957aebb4d916d333aae164f0e": { + "balance": "0x6c6b935b8bbd400000" }, - "8516fcaf77c893970fcd1a958ba9a00e49044019": { - "balance": "196279000000000000000" + "0x8516fcaf77c893970fcd1a958ba9a00e49044019": { + "balance": "0xaa3eb1691bce58000" }, - "b992a967308c02b98af91ee760fd3b6b4824ab0e": { - "balance": "2000000000000000000000" + "0xb992a967308c02b98af91ee760fd3b6b4824ab0e": { + "balance": "0x6c6b935b8bbd400000" }, - "30bb4357cd6910c86d2238bf727cbe8156680e62": { - "balance": "100014000000000000000" + "0x30bb4357cd6910c86d2238bf727cbe8156680e62": { + "balance": "0x56bf91b1a65eb0000" }, - "b8cc0f060aad92d4eb8b36b3b95ce9e90eb383d7": { - "balance": "150000000000000000000000" + "0xb8cc0f060aad92d4eb8b36b3b95ce9e90eb383d7": { + "balance": "0x1fc3842bd1f071c00000" }, - "28d4ebf41e3d3c451e943bdd7e1f175fae932a3d": { - "balance": "6000000000000000000000" + "0x28d4ebf41e3d3c451e943bdd7e1f175fae932a3d": { + "balance": "0x14542ba12a337c00000" }, - "8c83d424a3cf24d51f01923dd54a18d6b6fede7b": { - "balance": "4000000000000000000000" + "0x8c83d424a3cf24d51f01923dd54a18d6b6fede7b": { + "balance": "0xd8d726b7177a800000" }, - "7efc90766a00bc52372cac97fabd8a3c831f8ecd": { - "balance": "158000000000000000000" + "0x7efc90766a00bc52372cac97fabd8a3c831f8ecd": { + "balance": "0x890b0c2e14fb80000" }, - "7c2b9603884a4f2e464eceb97d17938d828bc02c": { - "balance": "3000000000000000000000" + "0x7c2b9603884a4f2e464eceb97d17938d828bc02c": { + "balance": "0xa2a15d09519be00000" }, - "9d250ae4f110d71cafc7b0adb52e8d9acb6679b8": { - "balance": "9840000000000000000000" + "0x9d250ae4f110d71cafc7b0adb52e8d9acb6679b8": { + "balance": "0x2156d6e997213c00000" }, - "61b3df2e9e9fd968131f1e88f0a0eb5bd765464d": { - "balance": "4000000000000000000000" + "0x61b3df2e9e9fd968131f1e88f0a0eb5bd765464d": { + "balance": "0xd8d726b7177a800000" }, - "9ae13bd882f2576575921a94974cbea861ba0d35": { - "balance": "3160000000000000000000" + "0x9ae13bd882f2576575921a94974cbea861ba0d35": { + "balance": "0xab4dcf399a3a600000" }, - "3d09688d93ad07f3abe68c722723cd680990435e": { - "balance": "29999948000000000000000" + "0x3d09688d93ad07f3abe68c722723cd680990435e": { + "balance": "0x65a4ce99f769e6e0000" }, - "5e58e255fc19870a04305ff2a04631f2ff294bb1": { - "balance": "17600000000000000000" + "0x5e58e255fc19870a04305ff2a04631f2ff294bb1": { + "balance": "0xf43fc2c04ee00000" }, - "bcaed0acb6a76f113f7c613555a2c3b0f5bf34a5": { - "balance": "193600000000000000000" + "0xbcaed0acb6a76f113f7c613555a2c3b0f5bf34a5": { + "balance": "0xa7ebd5e4363a00000" }, - "159adce27aa10b47236429a34a5ac42cad5b6416": { - "balance": "31867951000000000000000" + "0x159adce27aa10b47236429a34a5ac42cad5b6416": { + "balance": "0x6bf90a96edbfa718000" }, - "e834c64318205ca7dd4a21abcb08266cb21ff02c": { - "balance": "999999000000000000000" + "0xe834c64318205ca7dd4a21abcb08266cb21ff02c": { + "balance": "0x3635c6204739d98000" }, - "7b6a84718dd86e63338429ac811d7c8a860f21f1": { - "balance": "1790000000000000000000" + "0x7b6a84718dd86e63338429ac811d7c8a860f21f1": { + "balance": "0x61093d7c2c6d380000" }, - "2118c116ab0cdf6fd11d54a4309307b477c3fc0f": { - "balance": "10000000000000000000000" + "0x2118c116ab0cdf6fd11d54a4309307b477c3fc0f": { + "balance": "0x21e19e0c9bab2400000" }, - "34a901a69f036bcf9f7843c0ba01b426e8c3dc2b": { - "balance": "4000000000000000000000" + "0x34a901a69f036bcf9f7843c0ba01b426e8c3dc2b": { + "balance": "0xd8d726b7177a800000" }, - "c7d44fe32c7f8cd5f1a97427b6cd3afc9e45023e": { - "balance": "1580000000000000000000" + "0xc7d44fe32c7f8cd5f1a97427b6cd3afc9e45023e": { + "balance": "0x55a6e79ccd1d300000" }, - "c6045b3c350b4ce9ca0c6b754fb41a69b97e9900": { - "balance": "925000000000000000000" + "0xc6045b3c350b4ce9ca0c6b754fb41a69b97e9900": { + "balance": "0x3224f42723d4540000" }, - "cf5a6f9df75579c644f794711215b30d77a0ce40": { - "balance": "2000000000000000000000" + "0xcf5a6f9df75579c644f794711215b30d77a0ce40": { + "balance": "0x6c6b935b8bbd400000" }, - "e2904b1aefa056398b6234cb35811288d736db67": { - "balance": "40000000000000000000" + "0xe2904b1aefa056398b6234cb35811288d736db67": { + "balance": "0x22b1c8c1227a00000" }, - "7101bd799e411cde14bdfac25b067ac890eab8e8": { - "balance": "1450054000000000000000" + "0x7101bd799e411cde14bdfac25b067ac890eab8e8": { + "balance": "0x4e9b8aae48de470000" }, - "cc45fb3a555bad807b388a0357c855205f7c75e8": { - "balance": "865000000000000000000" + "0xcc45fb3a555bad807b388a0357c855205f7c75e8": { + "balance": "0x2ee449550898e40000" }, - "ff0c3c7798e8733dd2668152891bab80a8be955c": { - "balance": "80220000000000000000" + "0xff0c3c7798e8733dd2668152891bab80a8be955c": { + "balance": "0x45946b0f9e9d60000" }, - "3536453322c1466cb905af5c335ca8db74bff1e6": { - "balance": "447000000000000000000" + "0x3536453322c1466cb905af5c335ca8db74bff1e6": { + "balance": "0x183b5f03b1479c0000" }, - "08cac8952641d8fc526ec1ab4f2df826a5e7710f": { - "balance": "300000000000000000000" + "0x08cac8952641d8fc526ec1ab4f2df826a5e7710f": { + "balance": "0x1043561a8829300000" }, - "0d8aab8f74ea862cdf766805009d3f3e42d8d00b": { - "balance": "5820000000000000000000" + "0x0d8aab8f74ea862cdf766805009d3f3e42d8d00b": { + "balance": "0x13b80b99c5185700000" }, - "8908760cd39b9c1e8184e6a752ee888e3f0b7045": { - "balance": "6000000000000000000000" + "0x8908760cd39b9c1e8184e6a752ee888e3f0b7045": { + "balance": "0x14542ba12a337c00000" }, - "8156360bbd370961ceca6b6691d75006ad204cf2": { - "balance": "40000000000000000000000" + "0x8156360bbd370961ceca6b6691d75006ad204cf2": { + "balance": "0x878678326eac9000000" }, - "a304588f0d850cd8d38f76e9e83c1bf63e333ede": { - "balance": "39800000000000000000" + "0xa304588f0d850cd8d38f76e9e83c1bf63e333ede": { + "balance": "0x2285601216c8c0000" }, - "14c63ba2dcb1dd4df33ddab11c4f0007fa96a62d": { - "balance": "15500000000000000000000" + "0x14c63ba2dcb1dd4df33ddab11c4f0007fa96a62d": { + "balance": "0x34841b6057afab00000" }, - "a009bf076f1ba3fa57d2a7217218bed5565a7a7a": { - "balance": "1000000000000000000000" + "0xa009bf076f1ba3fa57d2a7217218bed5565a7a7a": { + "balance": "0x3635c9adc5dea00000" }, - "1c89060f987c518fa079ec2c0a5ebfa30f5d20f7": { - "balance": "38000000000000000000000" + "0x1c89060f987c518fa079ec2c0a5ebfa30f5d20f7": { + "balance": "0x80bfbefcb5f0bc00000" }, - "8895eb726226edc3f78cc6a515077b3296fdb95e": { - "balance": "3940000000000000000000" + "0x8895eb726226edc3f78cc6a515077b3296fdb95e": { + "balance": "0xd5967be4fc3f100000" }, - "7919e7627f9b7d54ea3b14bb4dd4649f4f39dee0": { - "balance": "1670000000000000000000" + "0x7919e7627f9b7d54ea3b14bb4dd4649f4f39dee0": { + "balance": "0x5a87e7d7f5f6580000" }, - "b3c65b845aba6cd816fbaae983e0e46c82aa8622": { - "balance": "1000000000000000000000" + "0xb3c65b845aba6cd816fbaae983e0e46c82aa8622": { + "balance": "0x3635c9adc5dea00000" }, - "eff51d72adfae143edf3a42b1aec55a2ccdd0b90": { - "balance": "300000000000000000000" + "0xeff51d72adfae143edf3a42b1aec55a2ccdd0b90": { + "balance": "0x1043561a8829300000" }, - "05bb64a916be66f460f5e3b64332110d209e19ae": { - "balance": "4200000000000000000000" + "0x05bb64a916be66f460f5e3b64332110d209e19ae": { + "balance": "0xe3aeb5737240a00000" }, - "d5b117ec116eb846418961eb7edb629cd0dd697f": { - "balance": "3000000000000000000000" + "0xd5b117ec116eb846418961eb7edb629cd0dd697f": { + "balance": "0xa2a15d09519be00000" }, - "05e97b09492cd68f63b12b892ed1d11d152c0eca": { - "balance": "1015200000000000000000" + "0x05e97b09492cd68f63b12b892ed1d11d152c0eca": { + "balance": "0x3708baed3d68900000" }, - "84cc7878da605fdb019fab9b4ccfc157709cdda5": { - "balance": "1336922000000000000000" + "0x84cc7878da605fdb019fab9b4ccfc157709cdda5": { + "balance": "0x48798513af04c90000" }, - "79cac6494f11ef2798748cb53285bd8e22f97cda": { - "balance": "2000000000000000000000" + "0x79cac6494f11ef2798748cb53285bd8e22f97cda": { + "balance": "0x6c6b935b8bbd400000" }, - "bd5a8c94bd8be6470644f70c8f8a33a8a55c6341": { - "balance": "200000000000000000000" + "0xbd5a8c94bd8be6470644f70c8f8a33a8a55c6341": { + "balance": "0xad78ebc5ac6200000" }, - "b119e79aa9b916526581cbf521ef474ae84dcff4": { - "balance": "1470700000000000000000" + "0xb119e79aa9b916526581cbf521ef474ae84dcff4": { + "balance": "0x4fba1001e5befe0000" }, - "aff1045adf27a1aa329461b24de1bae9948a698b": { - "balance": "33400000000000000000" + "0xaff1045adf27a1aa329461b24de1bae9948a698b": { + "balance": "0x1cf84a30a0a0c0000" }, - "4398628ea6632d393e929cbd928464c568aa4a0c": { - "balance": "1400000000000000000000" + "0x4398628ea6632d393e929cbd928464c568aa4a0c": { + "balance": "0x4be4e7267b6ae00000" }, - "99997668f7c1a4ff9e31f9977ae3224bcb887a85": { - "balance": "291200000000000000000" + "0x99997668f7c1a4ff9e31f9977ae3224bcb887a85": { + "balance": "0xfc936392801c00000" }, - "bc0e8745c3a549445c2be900f52300804ab56289": { - "balance": "33104697000000000000000" + "0xbc0e8745c3a549445c2be900f52300804ab56289": { + "balance": "0x7029bf5dd4c53b28000" }, - "e5bab4f0afd8a9d1a381b45761aa18f3d3cce105": { - "balance": "1508010000000000000000" + "0xe5bab4f0afd8a9d1a381b45761aa18f3d3cce105": { + "balance": "0x51bfd7c13878d10000" }, - "be60037e90714a4b917e61f193d834906703b13a": { - "balance": "1700000000000000000000" + "0xbe60037e90714a4b917e61f193d834906703b13a": { + "balance": "0x5c283d410394100000" }, - "8ed4284c0f47449c15b8d9b3245de8beb6ce80bf": { - "balance": "800000000000000000000" + "0x8ed4284c0f47449c15b8d9b3245de8beb6ce80bf": { + "balance": "0x2b5e3af16b18800000" }, - "333ad1596401e05aea2d36ca47318ef4cd2cb3df": { - "balance": "2910000000000000000000" + "0x333ad1596401e05aea2d36ca47318ef4cd2cb3df": { + "balance": "0x9dc05cce28c2b80000" }, - "22db559f2c3c1475a2e6ffe83a5979599196a7fa": { - "balance": "1000000000000000000000" + "0x22db559f2c3c1475a2e6ffe83a5979599196a7fa": { + "balance": "0x3635c9adc5dea00000" }, - "fdf449f108c6fb4f5a2b081eed7e45e6919e4d25": { - "balance": "2000000000000000000000" + "0xfdf449f108c6fb4f5a2b081eed7e45e6919e4d25": { + "balance": "0x6c6b935b8bbd400000" }, - "0be1bcb90343fae5303173f461bd914a4839056c": { - "balance": "6000000000000000000000" + "0x0be1bcb90343fae5303173f461bd914a4839056c": { + "balance": "0x14542ba12a337c00000" }, - "b981ad5e6b7793a23fc6c1e8692eb2965d18d0da": { - "balance": "9999924000000000000000" + "0xb981ad5e6b7793a23fc6c1e8692eb2965d18d0da": { + "balance": "0x21e18d2c821c7520000" }, - "c75d2259306aec7df022768c69899a652185dbc4": { - "balance": "4000000000000000000000" + "0xc75d2259306aec7df022768c69899a652185dbc4": { + "balance": "0xd8d726b7177a800000" }, - "6c2e9be6d4ab450fd12531f33f028c614674f197": { - "balance": "3580000000000000000000" + "0x6c2e9be6d4ab450fd12531f33f028c614674f197": { + "balance": "0xc2127af858da700000" }, - "6dcc7e64fcafcbc2dc6c0e5e662cb347bffcd702": { - "balance": "20000000000000000000000" + "0x6dcc7e64fcafcbc2dc6c0e5e662cb347bffcd702": { + "balance": "0x43c33c1937564800000" }, - "aabdb35c1514984a039213793f3345a168e81ff1": { - "balance": "309760000000000000000" + "0xaabdb35c1514984a039213793f3345a168e81ff1": { + "balance": "0x10cac896d239000000" }, - "d315deea1d8c1271f9d1311263ab47c007afb6f5": { - "balance": "69760000000000000000" + "0xd315deea1d8c1271f9d1311263ab47c007afb6f5": { + "balance": "0x3c81d4e654b400000" }, - "4faf90b76ecfb9631bf9022176032d8b2c207009": { - "balance": "1000032000000000000000" + "0x4faf90b76ecfb9631bf9022176032d8b2c207009": { + "balance": "0x36363b5d9a77700000" }, - "3e7a966b5dc357ffb07e9fe067c45791fd8e3049": { - "balance": "59100000000000000000" + "0x3e7a966b5dc357ffb07e9fe067c45791fd8e3049": { + "balance": "0x3342d60dff1960000" }, - "2e64a8d71111a22f4c5de1e039b336f68d398a7c": { - "balance": "2000000000000000000000" + "0x2e64a8d71111a22f4c5de1e039b336f68d398a7c": { + "balance": "0x6c6b935b8bbd400000" }, - "181fbba852a7f50178b1c7f03ed9e58d54162929": { - "balance": "666000000000000000000" + "0x181fbba852a7f50178b1c7f03ed9e58d54162929": { + "balance": "0x241a9b4f617a280000" }, - "4f7330096f79ed264ee0127f5d30d2f73c52b3d8": { - "balance": "499970000000000000000" + "0x4f7330096f79ed264ee0127f5d30d2f73c52b3d8": { + "balance": "0x1b1a7a420ba00d0000" }, - "a8a8dbdd1a85d1beee2569e91ccc4d09ae7f6ea1": { - "balance": "5800000000000000000000" + "0xa8a8dbdd1a85d1beee2569e91ccc4d09ae7f6ea1": { + "balance": "0x13a6b2b564871a00000" }, - "1f9c3268458da301a2be5ab08257f77bb5a98aa4": { - "balance": "200000000000000000000" + "0x1f9c3268458da301a2be5ab08257f77bb5a98aa4": { + "balance": "0xad78ebc5ac6200000" }, - "fc372ff6927cb396d9cf29803500110da632bc52": { - "balance": "2000000000000000000000" + "0xfc372ff6927cb396d9cf29803500110da632bc52": { + "balance": "0x6c6b935b8bbd400000" }, - "4fa554ab955c249217386a4d3263bbf72895434e": { - "balance": "19982000000000000000" + "0x4fa554ab955c249217386a4d3263bbf72895434e": { + "balance": "0x1154e53217ddb0000" }, - "2a59e47ea5d8f0e7c028a3e8e093a49c1b50b9a3": { - "balance": "2000000000000000000000" + "0x2a59e47ea5d8f0e7c028a3e8e093a49c1b50b9a3": { + "balance": "0x6c6b935b8bbd400000" }, - "5e32c72191b8392c55f510d8e3326e3a60501d62": { - "balance": "44000000000000000000000" + "0x5e32c72191b8392c55f510d8e3326e3a60501d62": { + "balance": "0x9513ea9de0243800000" }, - "1dfaee077212f1beaf0e6f2f1840537ae154ad86": { - "balance": "1000000000000000000000" + "0x1dfaee077212f1beaf0e6f2f1840537ae154ad86": { + "balance": "0x3635c9adc5dea00000" }, - "7eaba035e2af3793fd74674b102540cf190addb9": { - "balance": "1273000000000000000000" + "0x7eaba035e2af3793fd74674b102540cf190addb9": { + "balance": "0x45026c835b60440000" }, - "d62edb96fce2969aaf6c545e967cf1c0bc805205": { - "balance": "85705000000000000000" + "0xd62edb96fce2969aaf6c545e967cf1c0bc805205": { + "balance": "0x4a565536a5ada8000" }, - "220dc68df019b6b0ccbffb784b5a5ab4b15d4060": { - "balance": "3940000000000000000000" + "0x220dc68df019b6b0ccbffb784b5a5ab4b15d4060": { + "balance": "0xd5967be4fc3f100000" }, - "45bb829652d8bfb58b8527f0ecb621c29e212ec3": { - "balance": "2000000000000000000000" + "0x45bb829652d8bfb58b8527f0ecb621c29e212ec3": { + "balance": "0x6c6b935b8bbd400000" }, - "79b120eb8806732321288f675a27a9225f1cd2eb": { - "balance": "2465000000000000000000" + "0x79b120eb8806732321288f675a27a9225f1cd2eb": { + "balance": "0x85a0bf37dec9e40000" }, - "740af1eefd3365d78ba7b12cb1a673e06a077246": { - "balance": "19700000000000000000000" + "0x740af1eefd3365d78ba7b12cb1a673e06a077246": { + "balance": "0x42bf06b78ed3b500000" }, - "0f042c9c2fb18766f836bb59f735f27dc329fe3c": { - "balance": "10000000000000000000000" + "0x0f042c9c2fb18766f836bb59f735f27dc329fe3c": { + "balance": "0x21e19e0c9bab2400000" }, - "6dda5f788a6c688ddf921fa3852eb6d6c6c62966": { - "balance": "40000000000000000000" + "0x6dda5f788a6c688ddf921fa3852eb6d6c6c62966": { + "balance": "0x22b1c8c1227a00000" }, - "96ad579bbfa8db8ebec9d286a72e4661eed8e356": { - "balance": "1070750000000000000000" + "0x96ad579bbfa8db8ebec9d286a72e4661eed8e356": { + "balance": "0x3a0ba42bec61830000" }, - "0c2073ba44d3ddbdb639c04e191039a71716237f": { - "balance": "1430000000000000000000" + "0x0c2073ba44d3ddbdb639c04e191039a71716237f": { + "balance": "0x4d853c8f8908980000" }, - "1a3520453582c718a21c42375bc50773255253e1": { - "balance": "790000000000000000000" + "0x1a3520453582c718a21c42375bc50773255253e1": { + "balance": "0x2ad373ce668e980000" }, - "efcaae9ff64d2cd95b5249dcffe7faa0a0c0e44d": { - "balance": "401100000000000000000" + "0xefcaae9ff64d2cd95b5249dcffe7faa0a0c0e44d": { + "balance": "0x15be6174e1912e0000" }, - "0a3de155d5ecd8e81c1ff9bbf0378301f8d4c623": { - "balance": "4000000000000000000000" + "0x0a3de155d5ecd8e81c1ff9bbf0378301f8d4c623": { + "balance": "0xd8d726b7177a800000" }, - "80f07ac09e7b2c3c0a3d1e9413a544c73a41becb": { - "balance": "20000000000000000000" + "0x80f07ac09e7b2c3c0a3d1e9413a544c73a41becb": { + "balance": "0x1158e460913d00000" }, - "c3631c7698b6c5111989bf452727b3f9395a6dea": { - "balance": "10683500000000000000000" + "0xc3631c7698b6c5111989bf452727b3f9395a6dea": { + "balance": "0x243275896641dbe0000" }, - "4cc22c9bc9ad05d875a397dbe847ed221c920c67": { - "balance": "2000000000000000000000" + "0x4cc22c9bc9ad05d875a397dbe847ed221c920c67": { + "balance": "0x6c6b935b8bbd400000" }, - "1a987e3f83de75a42f1bde7c997c19217b4a5f24": { - "balance": "2000000000000000000000" + "0x1a987e3f83de75a42f1bde7c997c19217b4a5f24": { + "balance": "0x6c6b935b8bbd400000" }, - "5b2b64e9c058e382a8b299224eecaa16e09c8d92": { - "balance": "161000000000000000000" + "0x5b2b64e9c058e382a8b299224eecaa16e09c8d92": { + "balance": "0x8ba52e6fc45e40000" }, - "86caafacf32aa0317c032ac36babed974791dc03": { - "balance": "40000000000000000000000" + "0x86caafacf32aa0317c032ac36babed974791dc03": { + "balance": "0x878678326eac9000000" }, - "1cd1f0a314cbb200de0a0cb1ef97e920709d97c2": { - "balance": "2000000000000000000000" + "0x1cd1f0a314cbb200de0a0cb1ef97e920709d97c2": { + "balance": "0x6c6b935b8bbd400000" }, - "7d980f4b566bb045517e4c14c87750de9346744b": { - "balance": "1337000000000000000000" + "0x7d980f4b566bb045517e4c14c87750de9346744b": { + "balance": "0x487a9a304539440000" }, - "8b5f29cc2faa262cdef30ef554f50eb488146eac": { - "balance": "5818250000000000000000" + "0x8b5f29cc2faa262cdef30ef554f50eb488146eac": { + "balance": "0x13b68705c9720810000" }, - "5153a0c3c8912881bf1c3501bf64b45649e48222": { - "balance": "4000000000000000000000" + "0x5153a0c3c8912881bf1c3501bf64b45649e48222": { + "balance": "0xd8d726b7177a800000" }, - "d21a7341eb84fd151054e5e387bb25d36e499c09": { - "balance": "14000000000000000000000" + "0xd21a7341eb84fd151054e5e387bb25d36e499c09": { + "balance": "0x2f6f10780d22cc00000" }, - "9560e8ac6718a6a1cdcff189d603c9063e413da6": { - "balance": "4000000000000000000000" + "0x9560e8ac6718a6a1cdcff189d603c9063e413da6": { + "balance": "0xd8d726b7177a800000" }, - "e49ba0cd96816c4607773cf8a5970bb5bc16a1e6": { - "balance": "1670000000000000000000" + "0xe49ba0cd96816c4607773cf8a5970bb5bc16a1e6": { + "balance": "0x5a87e7d7f5f6580000" }, - "b8ac117d9f0dba80901445823c4c9d4fa3fedc6e": { - "balance": "15759015000000000000000" + "0xb8ac117d9f0dba80901445823c4c9d4fa3fedc6e": { + "balance": "0x3564c4427a8fc7d8000" }, - "af67fd3e127fd9dc36eb3fcd6a80c7be4f7532b2": { - "balance": "1670000000000000000000" + "0xaf67fd3e127fd9dc36eb3fcd6a80c7be4f7532b2": { + "balance": "0x5a87e7d7f5f6580000" }, - "b43c27f7a0a122084b98f483922541c8836cee2c": { - "balance": "715000000000000000000" + "0xb43c27f7a0a122084b98f483922541c8836cee2c": { + "balance": "0x26c29e47c4844c0000" }, - "4d9279962029a8bd45639737e98b511eff074c21": { - "balance": "1337000000000000000000" + "0x4d9279962029a8bd45639737e98b511eff074c21": { + "balance": "0x487a9a304539440000" }, - "c667441e7f29799aba616451d53b3f489f9e0f48": { - "balance": "13920000000000000000000" + "0xc667441e7f29799aba616451d53b3f489f9e0f48": { + "balance": "0x2f29ace68addd800000" }, - "275875ff4fbb0cf3a430213127487f7608d04cba": { - "balance": "500080000000000000000" + "0x275875ff4fbb0cf3a430213127487f7608d04cba": { + "balance": "0x1b1c010e766d580000" }, - "9a953b5bcc709379fcb559d7b916afdaa50cadcc": { - "balance": "100000000000000000000" + "0x9a953b5bcc709379fcb559d7b916afdaa50cadcc": { + "balance": "0x56bc75e2d63100000" }, - "7ea791ebab0445a00efdfc4e4a8e9a7e7565136d": { - "balance": "18200000000000000000" + "0x7ea791ebab0445a00efdfc4e4a8e9a7e7565136d": { + "balance": "0xfc936392801c0000" }, - "6ffe5cf82cc9ea5e36cad7c2974ce7249f3749e6": { - "balance": "1940000000000000000000" + "0x6ffe5cf82cc9ea5e36cad7c2974ce7249f3749e6": { + "balance": "0x692ae8897081d00000" }, - "f1b4ecc63525f7432c3d834ffe2b970fbeb87212": { - "balance": "3000064000000000000000" + "0xf1b4ecc63525f7432c3d834ffe2b970fbeb87212": { + "balance": "0xa2a24068facd800000" }, - "6b72a8f061cfe6996ad447d3c72c28c0c08ab3a7": { - "balance": "4271316000000000000000" + "0x6b72a8f061cfe6996ad447d3c72c28c0c08ab3a7": { + "balance": "0xe78c6ac79912620000" }, - "bba3c68004248e489573abb2743677066b24c8a7": { - "balance": "2000000000000000000000" + "0xbba3c68004248e489573abb2743677066b24c8a7": { + "balance": "0x6c6b935b8bbd400000" }, - "b7c0d0cc0b4d342d4062bac624ccc3c70cc6da3f": { - "balance": "4000000000000000000000" + "0xb7c0d0cc0b4d342d4062bac624ccc3c70cc6da3f": { + "balance": "0xd8d726b7177a800000" }, - "fe98c664c3e447a95e69bd582171b7176ea2a685": { - "balance": "4000000000000000000000" + "0xfe98c664c3e447a95e69bd582171b7176ea2a685": { + "balance": "0xd8d726b7177a800000" }, - "ce71086d4c602554b82dcbfce88d20634d53cc4d": { - "balance": "43250000000000000000000" + "0xce71086d4c602554b82dcbfce88d20634d53cc4d": { + "balance": "0x92896529baddc880000" }, - "1c601993789207f965bb865cbb4cd657cce76fc0": { - "balance": "98294000000000000000" + "0x1c601993789207f965bb865cbb4cd657cce76fc0": { + "balance": "0x5541a7037503f0000" }, - "476b5599089a3fb6f29c6c72e49b2e4740ea808d": { - "balance": "2800000000000000000000" + "0x476b5599089a3fb6f29c6c72e49b2e4740ea808d": { + "balance": "0x97c9ce4cf6d5c00000" }, - "3439998b247cb4bf8bc80a6d2b3527f1dfe9a6d2": { - "balance": "140000000000000000000" + "0x3439998b247cb4bf8bc80a6d2b3527f1dfe9a6d2": { + "balance": "0x796e3ea3f8ab00000" }, - "c4f7d2e2e22084c44f70feaab6c32105f3da376f": { - "balance": "1970000000000000000000" + "0xc4f7d2e2e22084c44f70feaab6c32105f3da376f": { + "balance": "0x6acb3df27e1f880000" }, - "c1eba5684aa1b24cba63150263b7a9131aeec28d": { - "balance": "20000000000000000000" + "0xc1eba5684aa1b24cba63150263b7a9131aeec28d": { + "balance": "0x1158e460913d00000" }, - "94ad4bad824bd0eb9ea49c58cebcc0ff5e08346b": { - "balance": "1940000000000000000000" + "0x94ad4bad824bd0eb9ea49c58cebcc0ff5e08346b": { + "balance": "0x692ae8897081d00000" }, - "ded877378407b94e781c4ef4af7cfc5bc220b516": { - "balance": "372500000000000000000" + "0xded877378407b94e781c4ef4af7cfc5bc220b516": { + "balance": "0x143179d86911020000" }, - "699c9ee47195511f35f862ca4c22fd35ae8ffbf4": { - "balance": "80000000000000000000" + "0x699c9ee47195511f35f862ca4c22fd35ae8ffbf4": { + "balance": "0x4563918244f400000" }, - "e3a89a1927cc4e2d43fbcda1e414d324a7d9e057": { - "balance": "205500000000000000000" + "0xe3a89a1927cc4e2d43fbcda1e414d324a7d9e057": { + "balance": "0xb23e2a936dec60000" }, - "4d93696fa24859f5d2939aebfa54b4b51ae1dccc": { - "balance": "19100000000000000000" + "0x4d93696fa24859f5d2939aebfa54b4b51ae1dccc": { + "balance": "0x10910d4cdc9f60000" }, - "0af65f14784e55a6f95667fd73252a1c94072d2a": { - "balance": "192987000000000000000" + "0x0af65f14784e55a6f95667fd73252a1c94072d2a": { + "balance": "0xa763b8e02d44f8000" }, - "5b70c49cc98b3df3fbe2b1597f5c1b6347a388b7": { - "balance": "970000000000000000000" + "0x5b70c49cc98b3df3fbe2b1597f5c1b6347a388b7": { + "balance": "0x34957444b840e80000" }, - "426f78f70db259ac8534145b2934f4ef1098b5d8": { - "balance": "360000000000000000000" + "0x426f78f70db259ac8534145b2934f4ef1098b5d8": { + "balance": "0x138400eca364a00000" }, - "58b8ae8f63ef35ed0762f0b6233d4ac14e64b64d": { - "balance": "2000000000000000000000" + "0x58b8ae8f63ef35ed0762f0b6233d4ac14e64b64d": { + "balance": "0x6c6b935b8bbd400000" }, - "8eae29435598ba8f1c93428cdb3e2b4d31078e00": { - "balance": "2000000000000000000000" + "0x8eae29435598ba8f1c93428cdb3e2b4d31078e00": { + "balance": "0x6c6b935b8bbd400000" }, - "17fd9b551a98cb61c2e07fbf41d3e8c9a530cba5": { - "balance": "26989000000000000000" + "0x17fd9b551a98cb61c2e07fbf41d3e8c9a530cba5": { + "balance": "0x1768c308193048000" }, - "ab3e78294ba886a0cfd5d3487fb3a3078d338d6e": { - "balance": "1970000000000000000000" + "0xab3e78294ba886a0cfd5d3487fb3a3078d338d6e": { + "balance": "0x6acb3df27e1f880000" }, - "bdf6e68c0cd7584080e847d72cbb23aad46aeb1d": { - "balance": "1970000000000000000000" + "0xbdf6e68c0cd7584080e847d72cbb23aad46aeb1d": { + "balance": "0x6acb3df27e1f880000" }, - "f989346772995ec1906faffeba2a7fe7de9c6bab": { - "balance": "6685000000000000000000" + "0xf989346772995ec1906faffeba2a7fe7de9c6bab": { + "balance": "0x16a6502f15a1e540000" }, - "dc5f5ad663a6f263327d64cac9cb133d2c960597": { - "balance": "2000000000000000000000" + "0xdc5f5ad663a6f263327d64cac9cb133d2c960597": { + "balance": "0x6c6b935b8bbd400000" }, - "68fe1357218d095849cd579842c4aa02ff888d93": { - "balance": "2000000000000000000000" + "0x68fe1357218d095849cd579842c4aa02ff888d93": { + "balance": "0x6c6b935b8bbd400000" }, - "e09c68e61998d9c81b14e4ee802ba7adf6d74cdb": { - "balance": "4000000000000000000000" + "0xe09c68e61998d9c81b14e4ee802ba7adf6d74cdb": { + "balance": "0xd8d726b7177a800000" }, - "890fe11f3c24db8732d6c2e772e2297c7e65f139": { - "balance": "62980000000000000000000" + "0x890fe11f3c24db8732d6c2e772e2297c7e65f139": { + "balance": "0xd5627137da8b5900000" }, - "a76929890a7b47fb859196016c6fdd8289ceb755": { - "balance": "5000000000000000000000" + "0xa76929890a7b47fb859196016c6fdd8289ceb755": { + "balance": "0x10f0cf064dd59200000" }, - "2dc79d6e7f55bce2e2d0c02ad07ceca8bb529354": { - "balance": "1580000000000000000000" + "0x2dc79d6e7f55bce2e2d0c02ad07ceca8bb529354": { + "balance": "0x55a6e79ccd1d300000" }, - "19687daa39c368139b6e7be60dc1753a9f0cbea3": { - "balance": "8000000000000000000000" + "0x19687daa39c368139b6e7be60dc1753a9f0cbea3": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "c69be440134d6280980144a9f64d84748a37f349": { - "balance": "715000000000000000000" + "0xc69be440134d6280980144a9f64d84748a37f349": { + "balance": "0x26c29e47c4844c0000" }, - "3d8d0723721e73a6c0d860aa0557abd14c1ee362": { - "balance": "5000000000000000000000" + "0x3d8d0723721e73a6c0d860aa0557abd14c1ee362": { + "balance": "0x10f0cf064dd59200000" }, - "2b241f037337eb4acc61849bd272ac133f7cdf4b": { - "balance": "378000000000000000000000" + "0x2b241f037337eb4acc61849bd272ac133f7cdf4b": { + "balance": "0x500b6bca962ab8400000" }, - "24b95ebef79500baa0eda72e77f877415df75c33": { - "balance": "910000000000000000000" + "0x24b95ebef79500baa0eda72e77f877415df75c33": { + "balance": "0x3154c9729d05780000" }, - "106ed5c719b5261477890425ae7551dc59bd255c": { - "balance": "11979600000000000000000" + "0x106ed5c719b5261477890425ae7551dc59bd255c": { + "balance": "0x2896a58c95be5880000" }, - "5b2e2f1618552eab0db98add55637c2951f1fb19": { - "balance": "12000000000000000000000" + "0x5b2e2f1618552eab0db98add55637c2951f1fb19": { + "balance": "0x28a857425466f800000" }, - "403145cb4ae7489fcc90cd985c6dc782b3cc4e44": { - "balance": "5999800000000000000000" + "0x403145cb4ae7489fcc90cd985c6dc782b3cc4e44": { + "balance": "0x1453ff387b27cac0000" }, - "e8be24f289443ee473bc76822f55098d89b91cc5": { - "balance": "2000000000000000000000" + "0xe8be24f289443ee473bc76822f55098d89b91cc5": { + "balance": "0x6c6b935b8bbd400000" }, - "f6bc37b1d2a3788d589b6de212dc1713b2f6e78e": { - "balance": "5000000000000000000000" + "0xf6bc37b1d2a3788d589b6de212dc1713b2f6e78e": { + "balance": "0x10f0cf064dd59200000" }, - "67fc527dce1785f0fb8bc7e518b1c669f7ecdfb5": { - "balance": "240000000000000000000" + "0x67fc527dce1785f0fb8bc7e518b1c669f7ecdfb5": { + "balance": "0xd02ab486cedc00000" }, - "6580b1bc94390f04b397bd73e95d96ef11eaf3a8": { - "balance": "20000000000000000000" + "0x6580b1bc94390f04b397bd73e95d96ef11eaf3a8": { + "balance": "0x1158e460913d00000" }, - "98bf4af3810b842387db70c14d46099626003d10": { - "balance": "4000000000000000000000" + "0x98bf4af3810b842387db70c14d46099626003d10": { + "balance": "0xd8d726b7177a800000" }, - "17993d312aa1106957868f6a55a5e8f12f77c843": { - "balance": "450065000000000000000" + "0x17993d312aa1106957868f6a55a5e8f12f77c843": { + "balance": "0x1865e814f4142e8000" }, - "0729b4b47c09eb16158464c8aa7fd9690b438839": { - "balance": "1999800000000000000000" + "0x0729b4b47c09eb16158464c8aa7fd9690b438839": { + "balance": "0x6c68ccd09b022c0000" }, - "ae70e69d2c4a0af818807b1a2705f79fd0b5dbc4": { - "balance": "985000000000000000000" + "0xae70e69d2c4a0af818807b1a2705f79fd0b5dbc4": { + "balance": "0x35659ef93f0fc40000" }, - "38b50146e71916a5448de12a4d742135dcf39833": { - "balance": "32200000000000000000000" + "0x38b50146e71916a5448de12a4d742135dcf39833": { + "balance": "0x6d190c475169a200000" }, - "38439aaa24e3636f3a18e020ea1da7e145160d86": { - "balance": "2600000000000000000000" + "0x38439aaa24e3636f3a18e020ea1da7e145160d86": { + "balance": "0x8cf23f909c0fa00000" }, - "54b4429b182f0377be7e626939c5db6440f75d7a": { - "balance": "1970000000000000000000" + "0x54b4429b182f0377be7e626939c5db6440f75d7a": { + "balance": "0x6acb3df27e1f880000" }, - "7179726f5c71ae1b6d16a68428174e6b34b23646": { - "balance": "7353500000000000000000" + "0x7179726f5c71ae1b6d16a68428174e6b34b23646": { + "balance": "0x18ea250097cbaf60000" }, - "c2ee91d3ef58c9d1a589844ea1ae3125d6c5ba69": { - "balance": "970000000000000000000" + "0xc2ee91d3ef58c9d1a589844ea1ae3125d6c5ba69": { + "balance": "0x34957444b840e80000" }, - "912304118b80473d9e9fe3ee458fbe610ffda2bb": { - "balance": "200000000000000000000" + "0x912304118b80473d9e9fe3ee458fbe610ffda2bb": { + "balance": "0xad78ebc5ac6200000" }, - "3308b03466c27a17dfe1aafceb81e16d2934566f": { - "balance": "17000000000000000000000" + "0x3308b03466c27a17dfe1aafceb81e16d2934566f": { + "balance": "0x39992648a23c8a00000" }, - "10346414bec6d3dcc44e50e54d54c2b8c3734e3e": { - "balance": "4000000000000000000000" + "0x10346414bec6d3dcc44e50e54d54c2b8c3734e3e": { + "balance": "0xd8d726b7177a800000" }, - "4fee50c5f988206b09a573469fb1d0b42ebb6dce": { - "balance": "2009400000000000000000" + "0x4fee50c5f988206b09a573469fb1d0b42ebb6dce": { + "balance": "0x6cee06ddbe15ec0000" }, - "9ece1400800936c7c6485fcdd3626017d09afbf6": { - "balance": "310000000000000000000" + "0x9ece1400800936c7c6485fcdd3626017d09afbf6": { + "balance": "0x10ce1d3d8cb3180000" }, - "ddf3ad76353810be6a89d731b787f6f17188612b": { - "balance": "20000000000000000000000" + "0xddf3ad76353810be6a89d731b787f6f17188612b": { + "balance": "0x43c33c1937564800000" }, - "72402300e81d146c2e644e2bbda1da163ca3fb56": { - "balance": "7000000000000000000000" + "0x72402300e81d146c2e644e2bbda1da163ca3fb56": { + "balance": "0x17b7883c06916600000" }, - "bb4b4a4b548070ff41432c9e08a0ca6fa7bc9f76": { - "balance": "850000000000000000000" + "0xbb4b4a4b548070ff41432c9e08a0ca6fa7bc9f76": { + "balance": "0x2e141ea081ca080000" }, - "c3dd58903886303b928625257ae1a013d71ae216": { - "balance": "2000000000000000000000" + "0xc3dd58903886303b928625257ae1a013d71ae216": { + "balance": "0x6c6b935b8bbd400000" }, - "ca6c818befd251361e02744068be99d8aa60b84a": { - "balance": "6000000000000000000000" + "0xca6c818befd251361e02744068be99d8aa60b84a": { + "balance": "0x14542ba12a337c00000" }, - "b8d2ddc66f308c0158ae3ccb7b869f7d199d7b32": { - "balance": "844800000000000000000" + "0xb8d2ddc66f308c0158ae3ccb7b869f7d199d7b32": { + "balance": "0x2dcbf4840eca000000" }, - "8e486a0442d171c8605be348fee57eb5085eff0d": { - "balance": "4000000000000000000000" + "0x8e486a0442d171c8605be348fee57eb5085eff0d": { + "balance": "0xd8d726b7177a800000" }, - "a807104f2703d679f8deafc442befe849e42950b": { - "balance": "2000000000000000000000" + "0xa807104f2703d679f8deafc442befe849e42950b": { + "balance": "0x6c6b935b8bbd400000" }, - "bb61a04bffd57c10470d45c39103f64650347616": { - "balance": "1000000000000000000000" + "0xbb61a04bffd57c10470d45c39103f64650347616": { + "balance": "0x3635c9adc5dea00000" }, - "d1c45954a62b911ad701ff2e90131e8ceb89c95c": { - "balance": "1394000000000000000000" + "0xd1c45954a62b911ad701ff2e90131e8ceb89c95c": { + "balance": "0x4b91a2de457e880000" }, - "5e65458be964ae449f71773704979766f8898761": { - "balance": "528600000000000000000" + "0x5e65458be964ae449f71773704979766f8898761": { + "balance": "0x1ca7cc735b6f7c0000" }, - "f9b37825f03073d31e249378c30c795c33f83af2": { - "balance": "200152000000000000000" + "0xf9b37825f03073d31e249378c30c795c33f83af2": { + "balance": "0xad9aabf8c9bfc0000" }, - "e309974ce39d60aadf2e69673251bf0e04760a10": { - "balance": "254030000000000000000" + "0xe309974ce39d60aadf2e69673251bf0e04760a10": { + "balance": "0xdc55fdb17647b0000" }, - "d541ac187ad7e090522de6da3213e9a7f4439673": { - "balance": "2000000000000000000000" + "0xd541ac187ad7e090522de6da3213e9a7f4439673": { + "balance": "0x6c6b935b8bbd400000" }, - "f33efc6397aa65fb53a8f07a0f893aae30e8bcee": { - "balance": "2304850000000000000000" + "0xf33efc6397aa65fb53a8f07a0f893aae30e8bcee": { + "balance": "0x7cf2381f619f150000" }, - "d2f1998e1cb1580cec4f6c047dcd3dcec54cf73c": { - "balance": "200000000000000000000" + "0xd2f1998e1cb1580cec4f6c047dcd3dcec54cf73c": { + "balance": "0xad78ebc5ac6200000" }, - "0ed76c2c3b5d50ff8fb50b3eeacd681590be1c2d": { - "balance": "100000000000000000000" + "0x0ed76c2c3b5d50ff8fb50b3eeacd681590be1c2d": { + "balance": "0x56bc75e2d63100000" }, - "637d67d87f586f0a5a479e20ee13ea310a10b647": { - "balance": "48300000000000000000000" + "0x637d67d87f586f0a5a479e20ee13ea310a10b647": { + "balance": "0xa3a5926afa1e7300000" }, - "1a5ee533acbfb3a2d76d5b685277b796c56a052b": { - "balance": "2000000000000000000000" + "0x1a5ee533acbfb3a2d76d5b685277b796c56a052b": { + "balance": "0x6c6b935b8bbd400000" }, - "323fca5ed77f699f9d9930f5ceeff8e56f59f03c": { - "balance": "1337000000000000000000" + "0x323fca5ed77f699f9d9930f5ceeff8e56f59f03c": { + "balance": "0x487a9a304539440000" }, - "a5fe2ce97f0e8c3856be0de5f4dcb2ce5d389a16": { - "balance": "22892000000000000000" + "0xa5fe2ce97f0e8c3856be0de5f4dcb2ce5d389a16": { + "balance": "0x13db0b8b6863e0000" }, - "93258255b37c7f58f4b10673a932dd3afd90f4f2": { - "balance": "1000000000000000000000" + "0x93258255b37c7f58f4b10673a932dd3afd90f4f2": { + "balance": "0x3635c9adc5dea00000" }, - "950fe9c6cad50c18f11a9ed9c45740a6180612d0": { - "balance": "8000000000000000000000" + "0x950fe9c6cad50c18f11a9ed9c45740a6180612d0": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "ee31167f9cc93b3c6465609d79db0cde90e8484c": { - "balance": "2000000000000000000000" + "0xee31167f9cc93b3c6465609d79db0cde90e8484c": { + "balance": "0x6c6b935b8bbd400000" }, - "6ebb5e6957aa821ef659b6018a393a504cae4450": { - "balance": "2000000000000000000000" + "0x6ebb5e6957aa821ef659b6018a393a504cae4450": { + "balance": "0x6c6b935b8bbd400000" }, - "be305a796e33bbf7f9aeae6512959066efda1010": { - "balance": "10880000000000000000000" + "0xbe305a796e33bbf7f9aeae6512959066efda1010": { + "balance": "0x24dce54d34a1a000000" }, - "537f9d4d31ef70839d84b0d9cdb72b9afedbdf35": { - "balance": "70000000000000000000000" + "0x537f9d4d31ef70839d84b0d9cdb72b9afedbdf35": { + "balance": "0xed2b525841adfc00000" }, - "fe9e1197d7974a7648dcc7a03112a88edbc9045d": { - "balance": "4925000000000000000000" + "0xfe9e1197d7974a7648dcc7a03112a88edbc9045d": { + "balance": "0x10afc1ade3b4ed40000" }, - "99f77f998b20e0bcdcd9fc838641526cf25918ef": { - "balance": "1790000000000000000000" + "0x99f77f998b20e0bcdcd9fc838641526cf25918ef": { + "balance": "0x61093d7c2c6d380000" }, - "76ffc157ad6bf8d56d9a1a7fddbc0fea010aabf4": { - "balance": "1000000000000000000000" + "0x76ffc157ad6bf8d56d9a1a7fddbc0fea010aabf4": { + "balance": "0x3635c9adc5dea00000" }, - "defe9141f4704599159d7b223de42bffd80496b3": { - "balance": "100000000000000000000" + "0xdefe9141f4704599159d7b223de42bffd80496b3": { + "balance": "0x56bc75e2d63100000" }, - "7b1bf53a9cbe83a7dea434579fe72aac8d2a0cd0": { - "balance": "199800000000000000000" + "0x7b1bf53a9cbe83a7dea434579fe72aac8d2a0cd0": { + "balance": "0xad4c8316a0b0c0000" }, - "23ccc3c6acd85c2e460c4ffdd82bc75dc849ea14": { - "balance": "4000000000000000000000" + "0x23ccc3c6acd85c2e460c4ffdd82bc75dc849ea14": { + "balance": "0xd8d726b7177a800000" }, - "9f86a066edb61fcb5856de93b75c8c791864b97b": { - "balance": "2000000000000000000000" + "0x9f86a066edb61fcb5856de93b75c8c791864b97b": { + "balance": "0x6c6b935b8bbd400000" }, - "871b8a8b51dea1989a5921f13ec1a955a515ad47": { - "balance": "8000000000000000000000" + "0x871b8a8b51dea1989a5921f13ec1a955a515ad47": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "4efcd9c79fb4334ca6247b0a33bd9cc33208e272": { - "balance": "1337000000000000000000" + "0x4efcd9c79fb4334ca6247b0a33bd9cc33208e272": { + "balance": "0x487a9a304539440000" }, - "35ac1d3ed7464fa3db14e7729213ceaa378c095e": { - "balance": "1520000000000000000000" + "0x35ac1d3ed7464fa3db14e7729213ceaa378c095e": { + "balance": "0x52663ccab1e1c00000" }, - "c69d663c8d60908391c8d236191533fdf7775613": { - "balance": "485000000000000000000" + "0xc69d663c8d60908391c8d236191533fdf7775613": { + "balance": "0x1a4aba225c20740000" }, - "c2ed5ffdd1add855a2692fe062b5d618742360d4": { - "balance": "1200000000000000000000" + "0xc2ed5ffdd1add855a2692fe062b5d618742360d4": { + "balance": "0x410d586a20a4c00000" }, - "454f0141d721d33cbdc41018bd01119aa4784818": { - "balance": "6000000000000000000000" + "0x454f0141d721d33cbdc41018bd01119aa4784818": { + "balance": "0x14542ba12a337c00000" }, - "6c8687e3417710bb8a93559021a1469e6a86bc77": { - "balance": "11126675000000000000000" + "0x6c8687e3417710bb8a93559021a1469e6a86bc77": { + "balance": "0x25b2da278d96b7b8000" }, - "ec5b198a00cfb55a97b5d53644cffa8a04d2ab45": { - "balance": "2000000000000000000000" + "0xec5b198a00cfb55a97b5d53644cffa8a04d2ab45": { + "balance": "0x6c6b935b8bbd400000" }, - "cd59f3dde77e09940befb6ee58031965cae7a336": { - "balance": "10000000000000000000000" + "0xcd59f3dde77e09940befb6ee58031965cae7a336": { + "balance": "0x21e19e0c9bab2400000" }, - "8eebec1a62c08b05a7d1d59180af9ff0d18e3f36": { - "balance": "500000000000000000000" + "0x8eebec1a62c08b05a7d1d59180af9ff0d18e3f36": { + "balance": "0x1b1ae4d6e2ef500000" }, - "92a971a739799f8cb48ea8475d72b2d2474172e6": { - "balance": "3940000000000000000000" + "0x92a971a739799f8cb48ea8475d72b2d2474172e6": { + "balance": "0xd5967be4fc3f100000" }, - "bed4649df646e2819229032d8868556fe1e053d3": { - "balance": "18200000000000000000" + "0xbed4649df646e2819229032d8868556fe1e053d3": { + "balance": "0xfc936392801c0000" }, - "c50fe415a641b0856c4e75bf960515441afa358d": { - "balance": "2000000000000000000000" + "0xc50fe415a641b0856c4e75bf960515441afa358d": { + "balance": "0x6c6b935b8bbd400000" }, - "91f516146cda20281719978060c6be4149067c88": { - "balance": "2000000000000000000000" + "0x91f516146cda20281719978060c6be4149067c88": { + "balance": "0x6c6b935b8bbd400000" }, - "54a1370116fe22099e015d07cd2669dd291cc9d1": { - "balance": "20000000000000000000" + "0x54a1370116fe22099e015d07cd2669dd291cc9d1": { + "balance": "0x1158e460913d00000" }, - "80c04efd310f440483c73f744b5b9e64599ce3ec": { - "balance": "1200000000000000000000" + "0x80c04efd310f440483c73f744b5b9e64599ce3ec": { + "balance": "0x410d586a20a4c00000" }, - "a8914c95b560ec13f140577338c32bcbb77d3a7a": { - "balance": "180000000000000000000" + "0xa8914c95b560ec13f140577338c32bcbb77d3a7a": { + "balance": "0x9c2007651b2500000" }, - "e3c812737ac606baf7522ad817428a36050e7a34": { - "balance": "1940000000000000000000" + "0xe3c812737ac606baf7522ad817428a36050e7a34": { + "balance": "0x692ae8897081d00000" }, - "6d1456fff0104ee844a3314737843338d24cd66c": { - "balance": "141840000000000000000" + "0x6d1456fff0104ee844a3314737843338d24cd66c": { + "balance": "0x7b06ce87fdd680000" }, - "0e6ece99111cad1961c748ed3df51edd69d2a3b1": { - "balance": "100000000000000000000000" + "0x0e6ece99111cad1961c748ed3df51edd69d2a3b1": { + "balance": "0x152d02c7e14af6800000" }, - "019d709579ff4bc09fdcdde431dc1447d2c260bc": { - "balance": "20000000000000000000" + "0x019d709579ff4bc09fdcdde431dc1447d2c260bc": { + "balance": "0x1158e460913d00000" }, - "ebff84bbef423071e604c361bba677f5593def4e": { - "balance": "10000000000000000000000" + "0xebff84bbef423071e604c361bba677f5593def4e": { + "balance": "0x21e19e0c9bab2400000" }, - "e10c540088113fa6ec00b4b2c8824f8796e96ec4": { - "balance": "236400000000000000000000" + "0xe10c540088113fa6ec00b4b2c8824f8796e96ec4": { + "balance": "0x320f4509ab1ec7c00000" }, - "e03220c697bcd28f26ef0b74404a8beb06b2ba7b": { - "balance": "8000000000000000000000" + "0xe03220c697bcd28f26ef0b74404a8beb06b2ba7b": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "e69a6cdb3a8a7db8e1f30c8b84cd73bae02bc0f8": { - "balance": "16915503000000000000000" + "0xe69a6cdb3a8a7db8e1f30c8b84cd73bae02bc0f8": { + "balance": "0x394fdc2e452f6718000" }, - "e5fb31a5caee6a96de393bdbf89fbe65fe125bb3": { - "balance": "1000000000000000000000" + "0xe5fb31a5caee6a96de393bdbf89fbe65fe125bb3": { + "balance": "0x3635c9adc5dea00000" }, - "030fb3401f72bd3418b7d1da75bf8c519dd707dc": { - "balance": "3000000000000000000000" + "0x030fb3401f72bd3418b7d1da75bf8c519dd707dc": { + "balance": "0xa2a15d09519be00000" }, - "1c751e7f24df9d94a637a5dedeffc58277b5db19": { - "balance": "3220000000000000000000" + "0x1c751e7f24df9d94a637a5dedeffc58277b5db19": { + "balance": "0xae8e7a0bb575d00000" }, - "bded7e07d0711e684de65ac8b2ab57c55c1a8645": { - "balance": "591000000000000000000" + "0xbded7e07d0711e684de65ac8b2ab57c55c1a8645": { + "balance": "0x2009c5c8bf6fdc0000" }, - "dd7ff441ba6ffe3671f3c0dabbff1823a5043370": { - "balance": "2000000000000000000000" + "0xdd7ff441ba6ffe3671f3c0dabbff1823a5043370": { + "balance": "0x6c6b935b8bbd400000" }, - "b55474ba58f0f2f40e6cbabed4ea176e011fcad6": { - "balance": "1970000000000000000000" + "0xb55474ba58f0f2f40e6cbabed4ea176e011fcad6": { + "balance": "0x6acb3df27e1f880000" }, - "b92427ad7578b4bfe20a9f63a7c5506d5ca12dc8": { - "balance": "2000000000000000000000" + "0xb92427ad7578b4bfe20a9f63a7c5506d5ca12dc8": { + "balance": "0x6c6b935b8bbd400000" }, - "91a8baaed012ea2e63803b593d0d0c2aab4c5b0a": { - "balance": "1500000000000000000000" + "0x91a8baaed012ea2e63803b593d0d0c2aab4c5b0a": { + "balance": "0x5150ae84a8cdf00000" }, - "a97e072144499fe5ebbd354acc7e7efb58985d08": { - "balance": "2674000000000000000000" + "0xa97e072144499fe5ebbd354acc7e7efb58985d08": { + "balance": "0x90f534608a72880000" }, - "75c2ffa1bef54919d2097f7a142d2e14f9b04a58": { - "balance": "2673866000000000000000" + "0x75c2ffa1bef54919d2097f7a142d2e14f9b04a58": { + "balance": "0x90f358504032a10000" }, - "53faf165be031ec18330d9fce5bd1281a1af08db": { - "balance": "140000000000000000000" + "0x53faf165be031ec18330d9fce5bd1281a1af08db": { + "balance": "0x796e3ea3f8ab00000" }, - "055ab658c6f0ed4f875ed6742e4bc7292d1abbf0": { - "balance": "83500000000000000000" + "0x055ab658c6f0ed4f875ed6742e4bc7292d1abbf0": { + "balance": "0x486cb9799191e0000" }, - "6f18ec767e320508195f1374500e3f2e125689ff": { - "balance": "1000000000000000000000" + "0x6f18ec767e320508195f1374500e3f2e125689ff": { + "balance": "0x3635c9adc5dea00000" }, - "90fc537b210658660a83baa9ac4a8402f65746a8": { - "balance": "1880000000000000000000" + "0x90fc537b210658660a83baa9ac4a8402f65746a8": { + "balance": "0x65ea3db75546600000" }, - "34664d220fa7f37958024a3332d684bcc6d4c8bd": { - "balance": "10000000000000000000000" + "0x34664d220fa7f37958024a3332d684bcc6d4c8bd": { + "balance": "0x21e19e0c9bab2400000" }, - "15acb61568ec4af7ea2819386181b116a6c5ee70": { - "balance": "31000000000000000000000" + "0x15acb61568ec4af7ea2819386181b116a6c5ee70": { + "balance": "0x690836c0af5f5600000" }, - "69d98f38a3ba3dbc01fa5c2c1427d862832f2f70": { - "balance": "100000000000000000000000" + "0x69d98f38a3ba3dbc01fa5c2c1427d862832f2f70": { + "balance": "0x152d02c7e14af6800000" }, - "ece1152682b7598fe2d1e21ec15533885435ac85": { - "balance": "4000000000000000000000" + "0xece1152682b7598fe2d1e21ec15533885435ac85": { + "balance": "0xd8d726b7177a800000" }, - "f618d9b104411480a863e623fc55232d1a4f48aa": { - "balance": "265793000000000000000" + "0xf618d9b104411480a863e623fc55232d1a4f48aa": { + "balance": "0xe689e6d44b1668000" }, - "f9debaecb5f339beea4894e5204bfa340d067f25": { - "balance": "1665000000000000000000" + "0xf9debaecb5f339beea4894e5204bfa340d067f25": { + "balance": "0x5a42844673b1640000" }, - "5e731b55ced452bb3f3fe871ddc3ed7ee6510a8f": { - "balance": "3000000000000000000000" + "0x5e731b55ced452bb3f3fe871ddc3ed7ee6510a8f": { + "balance": "0xa2a15d09519be00000" }, - "67df242d240dd4b8071d72f8fcf35bb3809d71e8": { - "balance": "4000000000000000000000" + "0x67df242d240dd4b8071d72f8fcf35bb3809d71e8": { + "balance": "0xd8d726b7177a800000" }, - "c4cf930e5d116ab8d13b9f9a7ec4ab5003a6abde": { - "balance": "320000000000000000000" + "0xc4cf930e5d116ab8d13b9f9a7ec4ab5003a6abde": { + "balance": "0x1158e460913d000000" }, - "01a25a5f5af0169b30864c3be4d7563ccd44f09e": { - "balance": "1430000000000000000000" + "0x01a25a5f5af0169b30864c3be4d7563ccd44f09e": { + "balance": "0x4d853c8f8908980000" }, - "7f6efb6f4318876d2ee624e27595f44446f68e93": { - "balance": "1550000000000000000000" + "0x7f6efb6f4318876d2ee624e27595f44446f68e93": { + "balance": "0x54069233bf7f780000" }, - "82249fe70f61c6b16f19a324840fdc020231bb02": { - "balance": "9504014000000000000000" + "0x82249fe70f61c6b16f19a324840fdc020231bb02": { + "balance": "0x20336b08a93635b0000" }, - "205237c4be146fba99478f3a7dad17b09138da95": { - "balance": "2000000000000000000000" + "0x205237c4be146fba99478f3a7dad17b09138da95": { + "balance": "0x6c6b935b8bbd400000" }, - "fd1fb5a89a89a721b8797068fbc47f3e9d52e149": { - "balance": "236400000000000000000" + "0xfd1fb5a89a89a721b8797068fbc47f3e9d52e149": { + "balance": "0xcd0b5837fc6580000" }, - "e47fbaed99fc209962604ebd20e240f74f4591f1": { - "balance": "2000000000000000000000" + "0xe47fbaed99fc209962604ebd20e240f74f4591f1": { + "balance": "0x6c6b935b8bbd400000" }, - "a24c3ab62181e9a15b78c4621e4c7c588127be26": { - "balance": "162410000000000000000" + "0xa24c3ab62181e9a15b78c4621e4c7c588127be26": { + "balance": "0x8cde43a83d3310000" }, - "b6cd7432d5161be79768ad45de3e447a07982063": { - "balance": "4000000000000000000000" + "0xb6cd7432d5161be79768ad45de3e447a07982063": { + "balance": "0xd8d726b7177a800000" }, - "32a70691255c9fc9791a4f75c8b81f388e0a2503": { - "balance": "985000000000000000000" + "0x32a70691255c9fc9791a4f75c8b81f388e0a2503": { + "balance": "0x35659ef93f0fc40000" }, - "562f16d79abfcec3943e34b20f05f97bdfcda605": { - "balance": "4000000000000000000000" + "0x562f16d79abfcec3943e34b20f05f97bdfcda605": { + "balance": "0xd8d726b7177a800000" }, - "dbc66965e426ff1ac87ad6eb78c1d95271158f9f": { - "balance": "18200000000000000000" + "0xdbc66965e426ff1ac87ad6eb78c1d95271158f9f": { + "balance": "0xfc936392801c0000" }, - "7e87863ec43a481df04d017762edcb5caa629b5a": { - "balance": "39400000000000000000" + "0x7e87863ec43a481df04d017762edcb5caa629b5a": { + "balance": "0x222c8eb3ff6640000" }, - "587d6849b168f6c3332b7abae7eb6c42c37f48bf": { - "balance": "880000000000000000000" + "0x587d6849b168f6c3332b7abae7eb6c42c37f48bf": { + "balance": "0x2fb474098f67c00000" }, - "721158be5762b119cc9b2035e88ee4ee78f29b82": { - "balance": "10000000000000000000000" + "0x721158be5762b119cc9b2035e88ee4ee78f29b82": { + "balance": "0x21e19e0c9bab2400000" }, - "84b91e2e2902d05e2b591b41083bd7beb2d52c74": { - "balance": "9848621000000000000000" + "0x84b91e2e2902d05e2b591b41083bd7beb2d52c74": { + "balance": "0x215e5128b4504648000" }, - "632cecb10cfcf38ec986b43b8770adece9200221": { - "balance": "20000000000000000000" + "0x632cecb10cfcf38ec986b43b8770adece9200221": { + "balance": "0x1158e460913d00000" }, - "c34e3ba1322ed0571183a24f94204ee49c186641": { - "balance": "58200000000000000000" + "0xc34e3ba1322ed0571183a24f94204ee49c186641": { + "balance": "0x327afefa4a7bc0000" }, - "ae78bb849139a6ba38ae92a09a69601cc4cb62d1": { - "balance": "500000000000000000000" + "0xae78bb849139a6ba38ae92a09a69601cc4cb62d1": { + "balance": "0x1b1ae4d6e2ef500000" }, - "5ce0b6862cce9162e87e0849e387cb5df4f9118c": { - "balance": "1670000000000000000000" + "0x5ce0b6862cce9162e87e0849e387cb5df4f9118c": { + "balance": "0x5a87e7d7f5f6580000" }, - "f52c0a7877345fe0c233bb0f04fd6ab18b6f14ba": { - "balance": "400440000000000000000000" + "0xf52c0a7877345fe0c233bb0f04fd6ab18b6f14ba": { + "balance": "0x54cbe55989f38de00000" }, - "e016dc138e25815b90be3fe9eee8ffb2e105624f": { - "balance": "500000000000000000000" + "0xe016dc138e25815b90be3fe9eee8ffb2e105624f": { + "balance": "0x1b1ae4d6e2ef500000" }, - "5789d01db12c816ac268e9af19dc0dd6d99f15df": { - "balance": "200000000000000000000" + "0x5789d01db12c816ac268e9af19dc0dd6d99f15df": { + "balance": "0xad78ebc5ac6200000" }, - "d8b77db9b81bbe90427b62f702b201ffc29ff618": { - "balance": "930200000000000000000" + "0xd8b77db9b81bbe90427b62f702b201ffc29ff618": { + "balance": "0x326d1e4396d45c0000" }, - "5dff811dad819ece3ba602c383fb5dc64c0a3a48": { - "balance": "186000000000000000000" + "0x5dff811dad819ece3ba602c383fb5dc64c0a3a48": { + "balance": "0xa1544be879ea80000" }, - "af3087e62e04bf900d5a54dc3e946274da92423b": { - "balance": "20000000000000000000" + "0xaf3087e62e04bf900d5a54dc3e946274da92423b": { + "balance": "0x1158e460913d00000" }, - "8c1023fde1574db8bb54f1739670157ca47da652": { - "balance": "6969382000000000000000" + "0x8c1023fde1574db8bb54f1739670157ca47da652": { + "balance": "0x179cf9ac3a1b1770000" }, - "bb3b010b18e6e2be1135871026b7ba15ea0fde24": { - "balance": "10044000000000000000000" + "0xbb3b010b18e6e2be1135871026b7ba15ea0fde24": { + "balance": "0x2207c80309b77700000" }, - "cabdaf354f4720a466a764a528d60e3a482a393c": { - "balance": "1000000000000000000000" + "0xcabdaf354f4720a466a764a528d60e3a482a393c": { + "balance": "0x3635c9adc5dea00000" }, - "94bbc67d13f89ebca594be94bc5170920c30d9f3": { - "balance": "80200000000000000000" + "0x94bbc67d13f89ebca594be94bc5170920c30d9f3": { + "balance": "0x458ffa3150a540000" }, - "3275496fd4dd8931fd69fb0a0b04c4d1ff879ef5": { - "balance": "446000000000000000000" + "0x3275496fd4dd8931fd69fb0a0b04c4d1ff879ef5": { + "balance": "0x182d7e4cfda0380000" }, - "281250a29121270a4ee5d78d24feafe82c70ba3a": { - "balance": "1000000000000000000000" + "0x281250a29121270a4ee5d78d24feafe82c70ba3a": { + "balance": "0x3635c9adc5dea00000" }, - "590ccb5911cf78f6f622f535c474375f4a12cfcf": { - "balance": "20000000000000000000000" + "0x590ccb5911cf78f6f622f535c474375f4a12cfcf": { + "balance": "0x43c33c1937564800000" }, - "542e8096bafb88162606002e8c8a3ed19814aeac": { - "balance": "2000000000000000000000" + "0x542e8096bafb88162606002e8c8a3ed19814aeac": { + "balance": "0x6c6b935b8bbd400000" }, - "a65426cff378ed23253513b19f496de45fa7e18f": { - "balance": "7200000000000000000000" + "0xa65426cff378ed23253513b19f496de45fa7e18f": { + "balance": "0x18650127cc3dc800000" }, - "4aa693b122f314482a47b11cc77c68a497876162": { - "balance": "1970000000000000000000" + "0x4aa693b122f314482a47b11cc77c68a497876162": { + "balance": "0x6acb3df27e1f880000" }, - "d9b783d31d32adc50fa3eacaa15d92b568eaeb47": { - "balance": "34010000000000000000000" + "0xd9b783d31d32adc50fa3eacaa15d92b568eaeb47": { + "balance": "0x733af90374c1b280000" }, - "068e655766b944fb263619658740b850c94afa31": { - "balance": "35200000000000000000" + "0x068e655766b944fb263619658740b850c94afa31": { + "balance": "0x1e87f85809dc00000" }, - "9e23c5e4b782b00a5fadf1aead87dacf5b0367a1": { - "balance": "20000000000000000000" + "0x9e23c5e4b782b00a5fadf1aead87dacf5b0367a1": { + "balance": "0x1158e460913d00000" }, - "bf17f397f8f46f1bae45d187148c06eeb959fa4d": { - "balance": "1001440000000000000000" + "0xbf17f397f8f46f1bae45d187148c06eeb959fa4d": { + "balance": "0x3649c59624bb300000" }, - "8578e10212ca14ff0732a8241e37467db85632a9": { - "balance": "6000000000000000000000" + "0x8578e10212ca14ff0732a8241e37467db85632a9": { + "balance": "0x14542ba12a337c00000" }, - "2cb5495a505336c2465410d1cae095b8e1ba5cdd": { - "balance": "20000000000000000000000" + "0x2cb5495a505336c2465410d1cae095b8e1ba5cdd": { + "balance": "0x43c33c1937564800000" }, - "695b0f5242753701b264a67071a2dc880836b8db": { - "balance": "16400000000000000000" + "0x695b0f5242753701b264a67071a2dc880836b8db": { + "balance": "0xe398811bec680000" }, - "f2edde37f9a8c39ddea24d79f4015757d06bf786": { - "balance": "100000000000000000000000" + "0xf2edde37f9a8c39ddea24d79f4015757d06bf786": { + "balance": "0x152d02c7e14af6800000" }, - "480f31b989311e4124c6a7465f5a44094d36f9d0": { - "balance": "1025000000000000000000" + "0x480f31b989311e4124c6a7465f5a44094d36f9d0": { + "balance": "0x3790bb855137640000" }, - "cf157612764e0fd696c8cb5fba85df4c0ddc3cb0": { - "balance": "30000000000000000000000" + "0xcf157612764e0fd696c8cb5fba85df4c0ddc3cb0": { + "balance": "0x65a4da25d3016c00000" }, - "27521deb3b6ef1416ea4c781a2e5d7b36ee81c61": { - "balance": "2000000000000000000000" + "0x27521deb3b6ef1416ea4c781a2e5d7b36ee81c61": { + "balance": "0x6c6b935b8bbd400000" }, - "6efd90b535e00bbd889fda7e9c3184f879a151db": { - "balance": "10100000000000000000000" + "0x6efd90b535e00bbd889fda7e9c3184f879a151db": { + "balance": "0x22385a827e815500000" }, - "b635a4bc71fb28fdd5d2c322983a56c284426e69": { - "balance": "170000000000000000000" + "0xb635a4bc71fb28fdd5d2c322983a56c284426e69": { + "balance": "0x93739534d28680000" }, - "a17c9e4323069518189d5207a0728dcb92306a3f": { - "balance": "1000000000000000000000" + "0xa17c9e4323069518189d5207a0728dcb92306a3f": { + "balance": "0x3635c9adc5dea00000" }, - "6af940f63ec9b8d876272aca96fef65cdacecdea": { - "balance": "3000000000000000000000" + "0x6af940f63ec9b8d876272aca96fef65cdacecdea": { + "balance": "0xa2a15d09519be00000" }, - "469358709332c82b887e20bcddd0220f8edba7d0": { - "balance": "17300000000000000000000" + "0x469358709332c82b887e20bcddd0220f8edba7d0": { + "balance": "0x3a9d5baa4abf1d00000" }, - "a257ad594bd88328a7d90fc0a907df95eecae316": { - "balance": "520510000000000000000" + "0xa257ad594bd88328a7d90fc0a907df95eecae316": { + "balance": "0x1c3786ff3846930000" }, - "6f051666cb4f7bd2b1907221b829b555d7a3db74": { - "balance": "1760000000000000000000" + "0x6f051666cb4f7bd2b1907221b829b555d7a3db74": { + "balance": "0x5f68e8131ecf800000" }, - "46bfc5b207eb2013e2e60f775fecd71810c5990c": { - "balance": "1550000000000000000000" + "0x46bfc5b207eb2013e2e60f775fecd71810c5990c": { + "balance": "0x54069233bf7f780000" }, - "62b9081e7710345e38e02e16449ace1b85bcfc4e": { - "balance": "910000000000000000000" + "0x62b9081e7710345e38e02e16449ace1b85bcfc4e": { + "balance": "0x3154c9729d05780000" }, - "bc73f7b1ca3b773b34249ada2e2c8a9274cc17c2": { - "balance": "2000000000000000000000" + "0xbc73f7b1ca3b773b34249ada2e2c8a9274cc17c2": { + "balance": "0x6c6b935b8bbd400000" }, - "1adaf4abfa867db17f99af6abebf707a3cf55df6": { - "balance": "6000000000000000000000" + "0x1adaf4abfa867db17f99af6abebf707a3cf55df6": { + "balance": "0x14542ba12a337c00000" }, - "8d629c20608135491b5013f1002586a0383130e5": { - "balance": "1370000000000000000000" + "0x8d629c20608135491b5013f1002586a0383130e5": { + "balance": "0x4a4491bd6dcd280000" }, - "38e46de4453c38e941e7930f43304f94bb7b2be8": { - "balance": "2005500000000000000000" + "0x38e46de4453c38e941e7930f43304f94bb7b2be8": { + "balance": "0x6cb7e74867d5e60000" }, - "3485f621256433b98a4200dad857efe55937ec98": { - "balance": "2000000000000000000000" + "0x3485f621256433b98a4200dad857efe55937ec98": { + "balance": "0x6c6b935b8bbd400000" }, - "775c10c93e0db7205b2643458233c64fc33fd75b": { - "balance": "2000000000000000000000" + "0x775c10c93e0db7205b2643458233c64fc33fd75b": { + "balance": "0x6c6b935b8bbd400000" }, - "7c4401ae98f12ef6de39ae24cf9fc51f80eba16b": { - "balance": "200000000000000000000" + "0x7c4401ae98f12ef6de39ae24cf9fc51f80eba16b": { + "balance": "0xad78ebc5ac6200000" }, - "17b807afa3ddd647e723542e7b52fee39527f306": { - "balance": "400010000000000000000" + "0x17b807afa3ddd647e723542e7b52fee39527f306": { + "balance": "0x15af40ffa7fc010000" }, - "0ab366e6e7d5abbce6b44a438d69a1cabb90d133": { - "balance": "320000000000000000000" + "0x0ab366e6e7d5abbce6b44a438d69a1cabb90d133": { + "balance": "0x1158e460913d000000" }, - "194ffe78bbf5d20dd18a1f01da552e00b7b11db1": { - "balance": "7000000000000000000000" + "0x194ffe78bbf5d20dd18a1f01da552e00b7b11db1": { + "balance": "0x17b7883c06916600000" }, - "c45d47ab0c9aa98a5bd62d16223ea2471b121ca4": { - "balance": "593640000000000000000" + "0xc45d47ab0c9aa98a5bd62d16223ea2471b121ca4": { + "balance": "0x202e68f2c2aee40000" }, - "2487c3c4be86a2723d917c06b458550170c3edba": { - "balance": "1000000000000000000000" + "0x2487c3c4be86a2723d917c06b458550170c3edba": { + "balance": "0x3635c9adc5dea00000" }, - "ec4d08aa2e47496dca87225de33f2b40a8a5b36f": { - "balance": "158000000000000000000" + "0xec4d08aa2e47496dca87225de33f2b40a8a5b36f": { + "balance": "0x890b0c2e14fb80000" }, - "aaa8defe11e3613f11067fb983625a08995a8dfc": { - "balance": "200000000000000000000" + "0xaaa8defe11e3613f11067fb983625a08995a8dfc": { + "balance": "0xad78ebc5ac6200000" }, - "50bb67c8b8d8bd0f63c4760904f2d333f400aace": { - "balance": "2000000000000000000000" + "0x50bb67c8b8d8bd0f63c4760904f2d333f400aace": { + "balance": "0x6c6b935b8bbd400000" }, - "1227e10a4dbf9caca31b1780239f557615fc35c1": { - "balance": "200000000000000000000" + "0x1227e10a4dbf9caca31b1780239f557615fc35c1": { + "balance": "0xad78ebc5ac6200000" }, - "44a8989e32308121f72466978db395d1f76c3a4b": { - "balance": "7236900000000000000000" + "0x44a8989e32308121f72466978db395d1f76c3a4b": { + "balance": "0x18850299f42b06a0000" }, - "59569a21d28fba4bda37753405a081f2063da150": { - "balance": "4000000000000000000000" + "0x59569a21d28fba4bda37753405a081f2063da150": { + "balance": "0xd8d726b7177a800000" }, - "c3756bcdcc7eec74ed896adfc335275930266e08": { - "balance": "6000000000000000000000" + "0xc3756bcdcc7eec74ed896adfc335275930266e08": { + "balance": "0x14542ba12a337c00000" }, - "ce3a61f0461b00935e85fa1ead82c45e5a64d488": { - "balance": "500000000000000000000" + "0xce3a61f0461b00935e85fa1ead82c45e5a64d488": { + "balance": "0x1b1ae4d6e2ef500000" }, - "012f396a2b5eb83559bac515e5210df2c8c362ba": { - "balance": "200000000000000000000" + "0x012f396a2b5eb83559bac515e5210df2c8c362ba": { + "balance": "0xad78ebc5ac6200000" }, - "93bc7d9a4abd44c8bbb8fe8ba804c61ad8d6576c": { - "balance": "3999922000000000000000" + "0x93bc7d9a4abd44c8bbb8fe8ba804c61ad8d6576c": { + "balance": "0xd8d6119a8146050000" }, - "e20bb9f3966419e14bbbaaaa6789e92496cfa479": { - "balance": "3465116000000000000000" + "0xe20bb9f3966419e14bbbaaaa6789e92496cfa479": { + "balance": "0xbbd825030752760000" }, - "9eef442d291a447d74c5d253c49ef324eac1d8f0": { - "balance": "3420000000000000000000" + "0x9eef442d291a447d74c5d253c49ef324eac1d8f0": { + "balance": "0xb96608c8103bf00000" }, - "db6c2a73dac7424ab0d031b66761122566c01043": { - "balance": "3000000000000000000000" + "0xdb6c2a73dac7424ab0d031b66761122566c01043": { + "balance": "0xa2a15d09519be00000" }, - "704d243c2978e46c2c86adbecd246e3b295ff633": { - "balance": "2012000000000000000000" + "0x704d243c2978e46c2c86adbecd246e3b295ff633": { + "balance": "0x6d121bebf795f00000" }, - "d2ff672016f63b2f85398f4a6fedbb60a50d3cce": { - "balance": "342500000000000000000" + "0xd2ff672016f63b2f85398f4a6fedbb60a50d3cce": { + "balance": "0x1291246f5b734a0000" }, - "d2051cb3cb6704f0548cc890ab0a19db3415b42a": { - "balance": "334000000000000000000" + "0xd2051cb3cb6704f0548cc890ab0a19db3415b42a": { + "balance": "0x121b2e5e6464780000" }, - "1111e5dbf45e6f906d62866f1708101788ddd571": { - "balance": "1300200000000000000000" + "0x1111e5dbf45e6f906d62866f1708101788ddd571": { + "balance": "0x467be6533ec2e40000" }, - "6a686bf220b593deb9b7324615fb9144ded3f39d": { - "balance": "1460000000000000000000" + "0x6a686bf220b593deb9b7324615fb9144ded3f39d": { + "balance": "0x4f2591f896a6500000" }, - "911feea61fe0ed50c5b9e5a0d66071399d28bdc6": { - "balance": "60000000000000000000" + "0x911feea61fe0ed50c5b9e5a0d66071399d28bdc6": { + "balance": "0x340aad21b3b700000" }, - "3881defae1c07b3ce04c78abe26b0cdc8d73f010": { - "balance": "200000000000000000000" + "0x3881defae1c07b3ce04c78abe26b0cdc8d73f010": { + "balance": "0xad78ebc5ac6200000" }, - "ea94f32808a2ef8a9bf0861d1d2404f7b7be258a": { - "balance": "20000000000000000000" + "0xea94f32808a2ef8a9bf0861d1d2404f7b7be258a": { + "balance": "0x1158e460913d00000" }, - "2eef6b1417d7b10ecfc19b123a8a89e73e526c58": { - "balance": "600000000000000000000" + "0x2eef6b1417d7b10ecfc19b123a8a89e73e526c58": { + "balance": "0x2086ac351052600000" }, - "dd8af9e7765223f4446f44d3d509819a3d3db411": { - "balance": "10000000000000000000000" + "0xdd8af9e7765223f4446f44d3d509819a3d3db411": { + "balance": "0x21e19e0c9bab2400000" }, - "2efc4c647dac6acac35577ad221758fef6616faa": { - "balance": "8000000000000000000000" + "0x2efc4c647dac6acac35577ad221758fef6616faa": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "1547b9bf7ad66274f3413827231ba405ee8c88c1": { - "balance": "17300000000000000000000" + "0x1547b9bf7ad66274f3413827231ba405ee8c88c1": { + "balance": "0x3a9d5baa4abf1d00000" }, - "250a40cef3202397f240469548beb5626af4f23c": { - "balance": "92500000000000000000" + "0x250a40cef3202397f240469548beb5626af4f23c": { + "balance": "0x503b203e9fba20000" }, - "c175be3194e669422d15fee81eb9f2c56c67d9c9": { - "balance": "200000000000000000000" + "0xc175be3194e669422d15fee81eb9f2c56c67d9c9": { + "balance": "0xad78ebc5ac6200000" }, - "c9e02608066828848aeb28c73672a12925181f4d": { - "balance": "500038000000000000000" + "0xc9e02608066828848aeb28c73672a12925181f4d": { + "balance": "0x1b1b6bd7af64c70000" }, - "8229ceb9f0d70839498d44e6abed93c5ca059f5d": { - "balance": "123300000000000000000000" + "0x8229ceb9f0d70839498d44e6abed93c5ca059f5d": { + "balance": "0x1a1c1b3c989a20100000" }, - "39f198331e4b21c1b760a3155f4ab2fe00a74619": { - "balance": "2000000000000000000000" + "0x39f198331e4b21c1b760a3155f4ab2fe00a74619": { + "balance": "0x6c6b935b8bbd400000" }, - "3ffcb870d4023d255d5167d8a507cefc366b68ba": { - "balance": "649400000000000000000" + "0x3ffcb870d4023d255d5167d8a507cefc366b68ba": { + "balance": "0x23343c4354d2ac0000" }, - "00dae27b350bae20c5652124af5d8b5cba001ec1": { - "balance": "40000000000000000000" + "0x00dae27b350bae20c5652124af5d8b5cba001ec1": { + "balance": "0x22b1c8c1227a00000" }, - "fc5500825105cf712a318a5e9c3bfc69c89d0c12": { - "balance": "4000000000000000000000" + "0xfc5500825105cf712a318a5e9c3bfc69c89d0c12": { + "balance": "0xd8d726b7177a800000" }, - "1ed8bb3f06778b039e9961d81cb71a73e6787c8e": { - "balance": "2000000000000000000000" + "0x1ed8bb3f06778b039e9961d81cb71a73e6787c8e": { + "balance": "0x6c6b935b8bbd400000" }, - "530ffac3bc3412e2ec0ea47b7981c770f5bb2f35": { - "balance": "133700000000000000000" + "0x530ffac3bc3412e2ec0ea47b7981c770f5bb2f35": { + "balance": "0x73f75d1a085ba0000" }, - "5f344b01c7191a32d0762ac188f0ec2dd460911d": { - "balance": "1000000000000000000000" + "0x5f344b01c7191a32d0762ac188f0ec2dd460911d": { + "balance": "0x3635c9adc5dea00000" }, - "5cfa9877f719c79d9e494a08d1e41cf103fc87c9": { - "balance": "200000000000000000000" + "0x5cfa9877f719c79d9e494a08d1e41cf103fc87c9": { + "balance": "0xad78ebc5ac6200000" }, - "f6eaac7032d492ef17fd6095afc11d634f56b382": { - "balance": "500038000000000000000" + "0xf6eaac7032d492ef17fd6095afc11d634f56b382": { + "balance": "0x1b1b6bd7af64c70000" }, - "962c0dec8a3d464bf39b1215eafd26480ae490cd": { - "balance": "2001680000000000000000" + "0x962c0dec8a3d464bf39b1215eafd26480ae490cd": { + "balance": "0x6c82e3eaa513e80000" }, - "262a8bfd7d9dc5dd3ad78161b6bb560824373655": { - "balance": "1169820000000000000000" + "0x262a8bfd7d9dc5dd3ad78161b6bb560824373655": { + "balance": "0x3f6a8384072b760000" }, - "9b4824ff9fb2abda554dee4fb8cf549165570631": { - "balance": "20000000000000000000" + "0x9b4824ff9fb2abda554dee4fb8cf549165570631": { + "balance": "0x1158e460913d00000" }, - "bb3b9005f46fd2ca3b30162599928c77d9f6b601": { - "balance": "8000014000000000000000" + "0xbb3b9005f46fd2ca3b30162599928c77d9f6b601": { + "balance": "0x1b1ae7f2b1bf7db0000" }, - "f7dc251196fbcbb77c947d7c1946b0ff65021cea": { - "balance": "1000000000000000000000" + "0xf7dc251196fbcbb77c947d7c1946b0ff65021cea": { + "balance": "0x3635c9adc5dea00000" }, - "af1148ef6c8e103d7530efc91679c9ac27000993": { - "balance": "200000000000000000000" + "0xaf1148ef6c8e103d7530efc91679c9ac27000993": { + "balance": "0xad78ebc5ac6200000" }, - "0bb2650ea01aca755bc0c017b64b1ab5a66d82e3": { - "balance": "1337000000000000000000" + "0x0bb2650ea01aca755bc0c017b64b1ab5a66d82e3": { + "balance": "0x487a9a304539440000" }, - "0cda12bf72d461bbc479eb92e6491d057e6b5ad1": { - "balance": "10000000000000000000000" + "0x0cda12bf72d461bbc479eb92e6491d057e6b5ad1": { + "balance": "0x21e19e0c9bab2400000" }, - "4e5b77f9066159e615933f2dda7477fa4e47d648": { - "balance": "200000000000000000000" + "0x4e5b77f9066159e615933f2dda7477fa4e47d648": { + "balance": "0xad78ebc5ac6200000" }, - "391161b0e43c302066e8a68d2ce7e199ecdb1d57": { - "balance": "4000000000000000000000" + "0x391161b0e43c302066e8a68d2ce7e199ecdb1d57": { + "balance": "0xd8d726b7177a800000" }, - "c7e330cd0c890ac99fe771fcc7e7b009b7413d8a": { - "balance": "4000000000000000000000" + "0xc7e330cd0c890ac99fe771fcc7e7b009b7413d8a": { + "balance": "0xd8d726b7177a800000" }, - "d4b38a5fdb63e01714e9801db47bc990bd509183": { - "balance": "5999000000000000000000" + "0xd4b38a5fdb63e01714e9801db47bc990bd509183": { + "balance": "0x14534d95bef905c0000" }, - "bc0f98598f88056a26339620923b8f1eb074a9fd": { - "balance": "200000000000000000000" + "0xbc0f98598f88056a26339620923b8f1eb074a9fd": { + "balance": "0xad78ebc5ac6200000" }, - "dbc59ed88973dead310884223af49763c05030f1": { - "balance": "20000000000000000000" + "0xdbc59ed88973dead310884223af49763c05030f1": { + "balance": "0x1158e460913d00000" }, - "0f85e42b1df321a4b3e835b50c00b06173968436": { - "balance": "985000000000000000000" + "0x0f85e42b1df321a4b3e835b50c00b06173968436": { + "balance": "0x35659ef93f0fc40000" }, - "d7788ef28658aa06cc53e1f3f0de58e5c371be78": { - "balance": "6685000000000000000000" + "0xd7788ef28658aa06cc53e1f3f0de58e5c371be78": { + "balance": "0x16a6502f15a1e540000" }, - "ecd276af64c79d1bd9a92b86b5e88d9a95eb88f8": { - "balance": "20000000000000000000" + "0xecd276af64c79d1bd9a92b86b5e88d9a95eb88f8": { + "balance": "0x1158e460913d00000" }, - "81c9e1aee2d3365d53bcfdcd96c7c538b0fd7eec": { - "balance": "1820000000000000000000" + "0x81c9e1aee2d3365d53bcfdcd96c7c538b0fd7eec": { + "balance": "0x62a992e53a0af00000" }, - "5d39ef9ea6bdfff15d11fe91f561a6f9e31f5da5": { - "balance": "2000000000000000000000" + "0x5d39ef9ea6bdfff15d11fe91f561a6f9e31f5da5": { + "balance": "0x6c6b935b8bbd400000" }, - "99878f9d6e0a7ed9aec78297b73879a80195afe0": { - "balance": "3980000000000000000000" + "0x99878f9d6e0a7ed9aec78297b73879a80195afe0": { + "balance": "0xd7c198710e66b00000" }, - "7294c918b1aefb4d25927ef9d799e71f93a28e85": { - "balance": "197000000000000000000" + "0x7294c918b1aefb4d25927ef9d799e71f93a28e85": { + "balance": "0xaadec983fcff40000" }, - "a33f70da7275ef057104dfa7db64f472e9f5d553": { - "balance": "80220000000000000000" + "0xa33f70da7275ef057104dfa7db64f472e9f5d553": { + "balance": "0x45946b0f9e9d60000" }, - "255bdd6474cc8262f26a22c38f45940e1ceea69b": { - "balance": "4000000000000000000000" + "0x255bdd6474cc8262f26a22c38f45940e1ceea69b": { + "balance": "0xd8d726b7177a800000" }, - "52f8b509fee1a874ab6f9d87367fbeaf15ac137f": { - "balance": "1000000000000000000000" + "0x52f8b509fee1a874ab6f9d87367fbeaf15ac137f": { + "balance": "0x3635c9adc5dea00000" }, - "e2728a3e8c2aaac983d05dc6877374a8f446eee9": { - "balance": "197600000000000000000" + "0xe2728a3e8c2aaac983d05dc6877374a8f446eee9": { + "balance": "0xab640391201300000" }, - "ed0206cb23315128f8caff26f6a30b985467d022": { - "balance": "40000000000000000000000" + "0xed0206cb23315128f8caff26f6a30b985467d022": { + "balance": "0x878678326eac9000000" }, - "87cf36ad03c9eae9053abb5242de9117bb0f2a0b": { - "balance": "500000000000000000000" + "0x87cf36ad03c9eae9053abb5242de9117bb0f2a0b": { + "balance": "0x1b1ae4d6e2ef500000" }, - "a929c8bd71db0c308dac06080a1747f21b1465aa": { - "balance": "500000000000000000000" + "0xa929c8bd71db0c308dac06080a1747f21b1465aa": { + "balance": "0x1b1ae4d6e2ef500000" }, - "9da6e075989c7419094cc9f6d2e49393bb199688": { - "balance": "11100000000000000000000" + "0x9da6e075989c7419094cc9f6d2e49393bb199688": { + "balance": "0x259bb71d5adf3f00000" }, - "763eece0b08ac89e32bfa4bece769514d8cb5b85": { - "balance": "4000000000000000000000" + "0x763eece0b08ac89e32bfa4bece769514d8cb5b85": { + "balance": "0xd8d726b7177a800000" }, - "5df3277ca85936c7a0d2c0795605ad25095e7159": { - "balance": "2000000000000000000000" + "0x5df3277ca85936c7a0d2c0795605ad25095e7159": { + "balance": "0x6c6b935b8bbd400000" }, - "7163758cbb6c4c525e0414a40a049dcccce919bb": { - "balance": "200000000000000000000" + "0x7163758cbb6c4c525e0414a40a049dcccce919bb": { + "balance": "0xad78ebc5ac6200000" }, - "14cdddbc8b09e6675a9e9e05091cb92238c39e1e": { - "balance": "5100000000000000000000" + "0x14cdddbc8b09e6675a9e9e05091cb92238c39e1e": { + "balance": "0x11478b7c30abc300000" }, - "b3b7f493b44a2c8d80ec78b1cdc75a652b73b06c": { - "balance": "2000000000000000000000" + "0xb3b7f493b44a2c8d80ec78b1cdc75a652b73b06c": { + "balance": "0x6c6b935b8bbd400000" }, - "c69b855539ce1b04714728eec25a37f367951de7": { - "balance": "2000000000000000000000" + "0xc69b855539ce1b04714728eec25a37f367951de7": { + "balance": "0x6c6b935b8bbd400000" }, - "052eab1f61b6d45517283f41d1441824878749d0": { - "balance": "4000000000000000000000" + "0x052eab1f61b6d45517283f41d1441824878749d0": { + "balance": "0xd8d726b7177a800000" }, - "515651d6db4faf9ecd103a921bbbbe6ae970fdd4": { - "balance": "20000000000000000000000" + "0x515651d6db4faf9ecd103a921bbbbe6ae970fdd4": { + "balance": "0x43c33c1937564800000" }, - "c7aff91929797489555a2ff1d14d5c695a108355": { - "balance": "1000000000000000000000" + "0xc7aff91929797489555a2ff1d14d5c695a108355": { + "balance": "0x3635c9adc5dea00000" }, - "d7ca7fdcfebe4588eff5421d1522b61328df7bf3": { - "balance": "4001070000000000000000" + "0xd7ca7fdcfebe4588eff5421d1522b61328df7bf3": { + "balance": "0xd8e6001e6c302b0000" }, - "eefba12dfc996742db790464ca7d273be6e81b3e": { - "balance": "1000000000000000000000" + "0xeefba12dfc996742db790464ca7d273be6e81b3e": { + "balance": "0x3635c9adc5dea00000" }, - "ebaa216de9cc5a43031707d36fe6d5bedc05bdf0": { - "balance": "1969606000000000000000" + "0xebaa216de9cc5a43031707d36fe6d5bedc05bdf0": { + "balance": "0x6ac5c62d9486070000" }, - "559194304f14b1b93afe444f0624e053c23a0009": { - "balance": "400000000000000000000" + "0x559194304f14b1b93afe444f0624e053c23a0009": { + "balance": "0x15af1d78b58c400000" }, - "4ecc19948dd9cd87b4c7201ab48e758f28e7cc76": { - "balance": "500200000000000000000" + "0x4ecc19948dd9cd87b4c7201ab48e758f28e7cc76": { + "balance": "0x1b1dab61d3aa640000" }, - "f224eb900b37b4490eee6a0b6420d85c947d8733": { - "balance": "970000000000000000000" + "0xf224eb900b37b4490eee6a0b6420d85c947d8733": { + "balance": "0x34957444b840e80000" }, - "97810bafc37e84306332aacb35e92ad911d23d24": { - "balance": "1000000000000000000000" + "0x97810bafc37e84306332aacb35e92ad911d23d24": { + "balance": "0x3635c9adc5dea00000" }, - "bd67d2e2f82da8861341bc96a2c0791fddf39e40": { - "balance": "200014000000000000000" + "0xbd67d2e2f82da8861341bc96a2c0791fddf39e40": { + "balance": "0xad7c07947c8fb0000" }, - "1b6495891240e64e594493c2662171db5e30ce13": { - "balance": "172400000000000000000" + "0x1b6495891240e64e594493c2662171db5e30ce13": { + "balance": "0x95887d695ed580000" }, - "00bdd4013aa31c04616c2bc9785f2788f915679b": { - "balance": "13400000000000000000" + "0x00bdd4013aa31c04616c2bc9785f2788f915679b": { + "balance": "0xb9f65d00f63c0000" }, - "c6ae287ddbe1149ba16ddcca4fe06aa2eaa988a9": { - "balance": "400000000000000000000" + "0xc6ae287ddbe1149ba16ddcca4fe06aa2eaa988a9": { + "balance": "0x15af1d78b58c400000" }, - "b7c9f12b038e73436d17e1c12ffe1aeccdb3f58c": { - "balance": "540000000000000000000" + "0xb7c9f12b038e73436d17e1c12ffe1aeccdb3f58c": { + "balance": "0x1d460162f516f00000" }, - "c1b500011cfba95d7cd636e95e6cbf6167464b25": { - "balance": "200000000000000000000" + "0xc1b500011cfba95d7cd636e95e6cbf6167464b25": { + "balance": "0xad78ebc5ac6200000" }, - "39e0db4d60568c800b8c5500026c2594f5768960": { - "balance": "1000000000000000000000" + "0x39e0db4d60568c800b8c5500026c2594f5768960": { + "balance": "0x3635c9adc5dea00000" }, - "40e3c283f7e24de0410c121bee60a5607f3e29a6": { - "balance": "1000000000000000000000" + "0x40e3c283f7e24de0410c121bee60a5607f3e29a6": { + "balance": "0x3635c9adc5dea00000" }, - "2f7d3290851be5c6b4b43f7d4574329f61a792c3": { - "balance": "100000000000000000000" + "0x2f7d3290851be5c6b4b43f7d4574329f61a792c3": { + "balance": "0x56bc75e2d63100000" }, - "c33ece935a8f4ef938ea7e1bac87cb925d8490ca": { - "balance": "33122000000000000000000" + "0xc33ece935a8f4ef938ea7e1bac87cb925d8490ca": { + "balance": "0x7038c16781f78480000" }, - "57bddf078834009c89d88e6282759dc45335b470": { - "balance": "2148000000000000000000" + "0x57bddf078834009c89d88e6282759dc45335b470": { + "balance": "0x74717cfb6883100000" }, - "50ad187ab21167c2b6e78be0153f44504a07945e": { - "balance": "100076000000000000000" + "0x50ad187ab21167c2b6e78be0153f44504a07945e": { + "balance": "0x56cd55fc64dfe0000" }, - "5bd24aac3612b20c609eb46779bf95698407c57c": { - "balance": "1970000000000000000000" + "0x5bd24aac3612b20c609eb46779bf95698407c57c": { + "balance": "0x6acb3df27e1f880000" }, - "16526c9edf943efa4f6d0f0bae81e18b31c54079": { - "balance": "985000000000000000000" + "0x16526c9edf943efa4f6d0f0bae81e18b31c54079": { + "balance": "0x35659ef93f0fc40000" }, - "4c6a9dc2cab10abb2e7c137006f08fecb5b779e1": { - "balance": "499000000000000000000" + "0x4c6a9dc2cab10abb2e7c137006f08fecb5b779e1": { + "balance": "0x1b0d04202f47ec0000" }, - "02c9f7940a7b8b7a410bf83dc9c22333d4275dd3": { - "balance": "5000000000000000000000" + "0x02c9f7940a7b8b7a410bf83dc9c22333d4275dd3": { + "balance": "0x10f0cf064dd59200000" }, - "b9fd3833e88e7cf1fa9879bdf55af4b99cd5ce3f": { - "balance": "1000000000000000000000" + "0xb9fd3833e88e7cf1fa9879bdf55af4b99cd5ce3f": { + "balance": "0x3635c9adc5dea00000" }, - "7e268f131ddf687cc325c412f78ba961205e9112": { - "balance": "16000600000000000000000" + "0x7e268f131ddf687cc325c412f78ba961205e9112": { + "balance": "0x36364ee7d301b3c0000" }, - "180478a655d78d0f3b0c4f202b61485bc4002fd5": { - "balance": "2000000000000000000000" + "0x180478a655d78d0f3b0c4f202b61485bc4002fd5": { + "balance": "0x6c6b935b8bbd400000" }, - "ed4014538cee664a2fbcb6dc669f7ab16d0ba57c": { - "balance": "200000000000000000000" + "0xed4014538cee664a2fbcb6dc669f7ab16d0ba57c": { + "balance": "0xad78ebc5ac6200000" }, - "f63a579bc3eac2a9490410128dbcebe6d9de8243": { - "balance": "1490000000000000000000" + "0xf63a579bc3eac2a9490410128dbcebe6d9de8243": { + "balance": "0x50c5e761a444080000" }, - "5d822d9b3ef4b502627407da272f67814a6becd4": { - "balance": "20000000000000000000" + "0x5d822d9b3ef4b502627407da272f67814a6becd4": { + "balance": "0x1158e460913d00000" }, - "eb52ab10553492329c1c54833ae610f398a65b9d": { - "balance": "152000000000000000000" + "0xeb52ab10553492329c1c54833ae610f398a65b9d": { + "balance": "0x83d6c7aab63600000" }, - "63340a57716bfa63eb6cd133721202575bf796f0": { - "balance": "209967000000000000000" + "0x63340a57716bfa63eb6cd133721202575bf796f0": { + "balance": "0xb61e0a20c12718000" }, - "933bf33f8299702b3a902642c33e0bfaea5c1ca3": { - "balance": "15200000000000000000" + "0x933bf33f8299702b3a902642c33e0bfaea5c1ca3": { + "balance": "0xd2f13f7789f00000" }, - "25bc49ef288cd165e525c661a812cf84fbec8f33": { - "balance": "338464000000000000000" + "0x25bc49ef288cd165e525c661a812cf84fbec8f33": { + "balance": "0x125921aebda9d00000" }, - "c8231ba5a411a13e222b29bfc1083f763158f226": { - "balance": "1000090000000000000000" + "0xc8231ba5a411a13e222b29bfc1083f763158f226": { + "balance": "0x3637096c4bcc690000" }, - "6c15ec3520bf8ebbc820bd0ff19778375494cf9d": { - "balance": "2005500000000000000000" + "0x6c15ec3520bf8ebbc820bd0ff19778375494cf9d": { + "balance": "0x6cb7e74867d5e60000" }, - "aaced8a9563b1bc311dbdffc1ae7f57519c4440c": { - "balance": "2000000000000000000000" + "0xaaced8a9563b1bc311dbdffc1ae7f57519c4440c": { + "balance": "0x6c6b935b8bbd400000" }, - "d90f3009db437e4e11c780bec8896f738d65ef0d": { - "balance": "4000000000000000000000" + "0xd90f3009db437e4e11c780bec8896f738d65ef0d": { + "balance": "0xd8d726b7177a800000" }, - "5603241eb8f08f721e348c9d9ad92f48e390aa24": { - "balance": "200000000000000000000" + "0x5603241eb8f08f721e348c9d9ad92f48e390aa24": { + "balance": "0xad78ebc5ac6200000" }, - "53cec6c88092f756efe56f7db11228a2db45b122": { - "balance": "4000000000000000000000" + "0x53cec6c88092f756efe56f7db11228a2db45b122": { + "balance": "0xd8d726b7177a800000" }, - "194cebb4929882bf3b4bf9864c2b1b0f62c283f9": { - "balance": "571300000000000000000" + "0x194cebb4929882bf3b4bf9864c2b1b0f62c283f9": { + "balance": "0x1ef861531f74aa0000" }, - "4be8628a8154874e048d80c142181022b180bcc1": { - "balance": "60000000000000000000" + "0x4be8628a8154874e048d80c142181022b180bcc1": { + "balance": "0x340aad21b3b700000" }, - "5fd973af366aa5157c54659bcfb27cbfa5ac15d6": { - "balance": "4000000000000000000000" + "0x5fd973af366aa5157c54659bcfb27cbfa5ac15d6": { + "balance": "0xd8d726b7177a800000" }, - "303139bc596403d5d3931f774c66c4ba467454db": { - "balance": "1699830000000000000000" + "0x303139bc596403d5d3931f774c66c4ba467454db": { + "balance": "0x5c25e14aea283f0000" }, - "87584a3f613bd4fac74c1e780b86d6caeb890cb2": { - "balance": "1700000000000000000000" + "0x87584a3f613bd4fac74c1e780b86d6caeb890cb2": { + "balance": "0x5c283d410394100000" }, - "77f4e3bdf056883cc87280dbe640a18a0d02a207": { - "balance": "193806000000000000000" + "0x77f4e3bdf056883cc87280dbe640a18a0d02a207": { + "balance": "0xa81993a2bfb5b0000" }, - "4de3fe34a6fbf634c051997f47cc7f48791f5824": { - "balance": "1999000000000000000000" + "0x4de3fe34a6fbf634c051997f47cc7f48791f5824": { + "balance": "0x6c5db2a4d815dc0000" }, - "c45a1ca1036b95004187cdac44a36e33a94ab5c3": { - "balance": "254800000000000000000" + "0xc45a1ca1036b95004187cdac44a36e33a94ab5c3": { + "balance": "0xdd00f720301880000" }, - "65d33eb39cda6453b19e61c1fe4db93170ef9d34": { - "balance": "13370000000000000000" + "0x65d33eb39cda6453b19e61c1fe4db93170ef9d34": { + "balance": "0xb98bc829a6f90000" }, - "f65616be9c8b797e7415227c9138faa0891742d7": { - "balance": "790000000000000000000" + "0xf65616be9c8b797e7415227c9138faa0891742d7": { + "balance": "0x2ad373ce668e980000" }, - "e17812f66c5e65941e186c46922b6e7b2f0eeb46": { - "balance": "1820000000000000000000" + "0xe17812f66c5e65941e186c46922b6e7b2f0eeb46": { + "balance": "0x62a992e53a0af00000" }, - "d47f50df89a1cff96513bef1b2ae3a2971accf2c": { - "balance": "840000000000000000000" + "0xd47f50df89a1cff96513bef1b2ae3a2971accf2c": { + "balance": "0x2d89577d7d40200000" }, - "8ed1528b447ed4297902f639c514d0944a88f8c8": { - "balance": "198800000000000000000" + "0x8ed1528b447ed4297902f639c514d0944a88f8c8": { + "balance": "0xac6e77ab663a80000" }, - "a4fb14409a67b45688a8593e5cc2cf596ced6f11": { - "balance": "1790000000000000000000" + "0xa4fb14409a67b45688a8593e5cc2cf596ced6f11": { + "balance": "0x61093d7c2c6d380000" }, - "855d9aef2c39c6230d09c99ef6494989abe68785": { - "balance": "161000000000000000000" + "0x855d9aef2c39c6230d09c99ef6494989abe68785": { + "balance": "0x8ba52e6fc45e40000" }, - "778c43d11afe3b586ff374192d96a7f23d2b9b7f": { - "balance": "2577139000000000000000" + "0x778c43d11afe3b586ff374192d96a7f23d2b9b7f": { + "balance": "0x8bb4fcfa3b7d6b8000" }, - "e3ece1f632711d13bfffa1f8f6840871ee58fb27": { - "balance": "4000000000000000000000" + "0xe3ece1f632711d13bfffa1f8f6840871ee58fb27": { + "balance": "0xd8d726b7177a800000" }, - "beb3358c50cf9f75ffc76d443c2c7f55075a0589": { - "balance": "2674000000000000000000" + "0xbeb3358c50cf9f75ffc76d443c2c7f55075a0589": { + "balance": "0x90f534608a72880000" }, - "f156dc0b2a981e5b55d3f2f03b8134e331dbadb7": { - "balance": "100000000000000000000" + "0xf156dc0b2a981e5b55d3f2f03b8134e331dbadb7": { + "balance": "0x56bc75e2d63100000" }, - "eb9cc9fe0869d2dab52cc7aae8fd57adb35f9feb": { - "balance": "1966000000000000000000" + "0xeb9cc9fe0869d2dab52cc7aae8fd57adb35f9feb": { + "balance": "0x6a93bb17af81f80000" }, - "2467c6a5c696ede9a1e542bf1ad06bcc4b06aca0": { - "balance": "18500000000000000000" + "0x2467c6a5c696ede9a1e542bf1ad06bcc4b06aca0": { + "balance": "0x100bd33fb98ba0000" }, - "ec75b4a47513120ba5f86039814f1998e3817ac3": { - "balance": "178756000000000000000" + "0xec75b4a47513120ba5f86039814f1998e3817ac3": { + "balance": "0x9b0bce2e8fdba0000" }, - "9c3d0692ceeef80aa4965ceed262ffc7f069f2dc": { - "balance": "200000000000000000000" + "0x9c3d0692ceeef80aa4965ceed262ffc7f069f2dc": { + "balance": "0xad78ebc5ac6200000" }, - "e05029aceb0778675bef1741ab2cd2931ef7c84b": { - "balance": "5000057000000000000000" + "0xe05029aceb0778675bef1741ab2cd2931ef7c84b": { + "balance": "0x10f0dbae61009528000" }, - "41d3b731a326e76858baa5f4bd89b57b36932343": { - "balance": "394000000000000000000" + "0x41d3b731a326e76858baa5f4bd89b57b36932343": { + "balance": "0x155bd9307f9fe80000" }, - "c346cb1fbce2ab285d8e5401f42dd7234d37e86d": { - "balance": "83500000000000000000" + "0xc346cb1fbce2ab285d8e5401f42dd7234d37e86d": { + "balance": "0x486cb9799191e0000" }, - "45f4fc60f08eaca10598f0336329801e3c92cb46": { - "balance": "200000000000000000000" + "0x45f4fc60f08eaca10598f0336329801e3c92cb46": { + "balance": "0xad78ebc5ac6200000" }, - "f04a6a379708b9428d722aa2b06b77e88935cf89": { - "balance": "300000000000000000000" + "0xf04a6a379708b9428d722aa2b06b77e88935cf89": { + "balance": "0x1043561a8829300000" }, - "232832cd5977e00a4c30d0163f2e24f088a6cb09": { - "balance": "3000000000000000000000" + "0x232832cd5977e00a4c30d0163f2e24f088a6cb09": { + "balance": "0xa2a15d09519be00000" }, - "d2ac0d3a58605e1d0f0eb3de25b2cad129ed6058": { - "balance": "4000000000000000000000" + "0xd2ac0d3a58605e1d0f0eb3de25b2cad129ed6058": { + "balance": "0xd8d726b7177a800000" }, - "a356551bb77d4f45a6d7e09f0a089e79cca249cb": { - "balance": "340000000000000000000" + "0xa356551bb77d4f45a6d7e09f0a089e79cca249cb": { + "balance": "0x126e72a69a50d00000" }, - "b50c9f5789ae44e2dce017c714caf00c830084c2": { - "balance": "394000000000000000000" + "0xb50c9f5789ae44e2dce017c714caf00c830084c2": { + "balance": "0x155bd9307f9fe80000" }, - "21fd6c5d97f9c600b76821ddd4e776350fce2be0": { - "balance": "1999946000000000000000" + "0x21fd6c5d97f9c600b76821ddd4e776350fce2be0": { + "balance": "0x6c6ad382d4fb610000" }, - "f0d5c31ccb6cbe30c7c9ea19f268d159851f8c9c": { - "balance": "16700000000000000000000" + "0xf0d5c31ccb6cbe30c7c9ea19f268d159851f8c9c": { + "balance": "0x3894f0e6f9b9f700000" }, - "ab7091932e4bc39dbb552380ca934fd7166d1e6e": { - "balance": "3340000000000000000000" + "0xab7091932e4bc39dbb552380ca934fd7166d1e6e": { + "balance": "0xb50fcfafebecb00000" }, - "acd8dd91f714764c45677c63d852e56eb9eece2e": { - "balance": "2000000000000000000000" + "0xacd8dd91f714764c45677c63d852e56eb9eece2e": { + "balance": "0x6c6b935b8bbd400000" }, - "57d032a43d164e71aa2ef3ffd8491b0a4ef1ea5b": { - "balance": "2000000000000000000000" + "0x57d032a43d164e71aa2ef3ffd8491b0a4ef1ea5b": { + "balance": "0x6c6b935b8bbd400000" }, - "5af46a25ac09cb73616b53b14fb42ff0a51cddb2": { - "balance": "4000000000000000000000" + "0x5af46a25ac09cb73616b53b14fb42ff0a51cddb2": { + "balance": "0xd8d726b7177a800000" }, - "1ea6bf2f15ae9c1dbc64daa7f8ea4d0d81aad3eb": { - "balance": "4200000000000000000000" + "0x1ea6bf2f15ae9c1dbc64daa7f8ea4d0d81aad3eb": { + "balance": "0xe3aeb5737240a00000" }, - "03337012ae1d7ff3ee7f697c403e7780188bf0ef": { - "balance": "200000000000000000000" + "0x03337012ae1d7ff3ee7f697c403e7780188bf0ef": { + "balance": "0xad78ebc5ac6200000" }, - "32eb64be1b5dede408c6bdefbe6e405c16b7ed02": { - "balance": "1970000000000000000000" + "0x32eb64be1b5dede408c6bdefbe6e405c16b7ed02": { + "balance": "0x6acb3df27e1f880000" }, - "22e2488e2da26a49ae84c01bd54b21f2947891c6": { - "balance": "1730000000000000000000" + "0x22e2488e2da26a49ae84c01bd54b21f2947891c6": { + "balance": "0x5dc892aa1131c80000" }, - "be98a77fd41097b34f59d7589baad021659ff712": { - "balance": "900000000000000000000" + "0xbe98a77fd41097b34f59d7589baad021659ff712": { + "balance": "0x30ca024f987b900000" }, - "dda4ed2a58a8dd20a73275347b580d71b95bf99a": { - "balance": "399000000000000000000" + "0xdda4ed2a58a8dd20a73275347b580d71b95bf99a": { + "balance": "0x15a13cc201e4dc0000" }, - "671110d96aaff11523cc546bf9940eedffb2faf7": { - "balance": "4000000000000000000000" + "0x671110d96aaff11523cc546bf9940eedffb2faf7": { + "balance": "0xd8d726b7177a800000" }, - "5d71799c8df3bccb7ee446df50b8312bc4eb71c5": { - "balance": "200000000000000000000" + "0x5d71799c8df3bccb7ee446df50b8312bc4eb71c5": { + "balance": "0xad78ebc5ac6200000" }, - "ae179a460db66326743d24e67523a57b246daf7f": { - "balance": "4722920000000000000000" + "0xae179a460db66326743d24e67523a57b246daf7f": { + "balance": "0x10007ae7ce5bbe40000" }, - "198bfcf1b07ae308fa2c02069ac9dafe7135fb47": { - "balance": "20000000000000000000" + "0x198bfcf1b07ae308fa2c02069ac9dafe7135fb47": { + "balance": "0x1158e460913d00000" }, - "4662a1765ee921842ddc88898d1dc8627597bd7e": { - "balance": "10000000000000000000000" + "0x4662a1765ee921842ddc88898d1dc8627597bd7e": { + "balance": "0x21e19e0c9bab2400000" }, - "783eec8aa5dac77b2e6623ed5198a431abbaee07": { - "balance": "440000000000000000000" + "0x783eec8aa5dac77b2e6623ed5198a431abbaee07": { + "balance": "0x17da3a04c7b3e00000" }, - "ed6643c0e8884b2d3211853785a08bf8f33ed29f": { - "balance": "1337000000000000000000" + "0xed6643c0e8884b2d3211853785a08bf8f33ed29f": { + "balance": "0x487a9a304539440000" }, - "5cc7d3066d45d27621f78bb4b339473e442a860f": { - "balance": "9999908000000000000000" + "0x5cc7d3066d45d27621f78bb4b339473e442a860f": { + "balance": "0x21e1899f0377aea0000" }, - "94ef8be45077c7d4c5652740de946a62624f713f": { - "balance": "100085000000000000000" + "0x94ef8be45077c7d4c5652740de946a62624f713f": { + "balance": "0x56cf5593a18f88000" }, - "2f853817afd3b8f3b86e9f60ee77b5d97773c0e3": { - "balance": "1451450000000000000000" + "0x2f853817afd3b8f3b86e9f60ee77b5d97773c0e3": { + "balance": "0x4eaeea44e368b90000" }, - "3e0b8ed86ed669e12723af7572fbacfe829b1e16": { - "balance": "1499800000000000000000" + "0x3e0b8ed86ed669e12723af7572fbacfe829b1e16": { + "balance": "0x514de7f9b812dc0000" }, - "fa68e0cb3edf51f0a6f211c9b2cb5e073c9bffe6": { - "balance": "291200000000000000000" + "0xfa68e0cb3edf51f0a6f211c9b2cb5e073c9bffe6": { + "balance": "0xfc936392801c00000" }, - "2c234f505ca8dcc77d9b7e01d257c318cc19396d": { - "balance": "100000000000000000000" + "0x2c234f505ca8dcc77d9b7e01d257c318cc19396d": { + "balance": "0x56bc75e2d63100000" }, - "f3f24fc29e20403fc0e8f5ebbb553426f78270a2": { - "balance": "100000000000000000000" + "0xf3f24fc29e20403fc0e8f5ebbb553426f78270a2": { + "balance": "0x56bc75e2d63100000" }, - "91546b79ecf69f936b5a561508b0d7e50cc5992f": { - "balance": "267400000000000000000" + "0x91546b79ecf69f936b5a561508b0d7e50cc5992f": { + "balance": "0xe7eeba3410b740000" }, - "435443b81dfdb9bd8c6787bc2518e2d47e57c15f": { - "balance": "5968500000000000000000" + "0x435443b81dfdb9bd8c6787bc2518e2d47e57c15f": { + "balance": "0x1438d9397881ef20000" }, - "3a06e3bb1edcfd0c44c3074de0bb606b049894a2": { - "balance": "10000000000000000000000" + "0x3a06e3bb1edcfd0c44c3074de0bb606b049894a2": { + "balance": "0x21e19e0c9bab2400000" }, - "3a3108c1e680a33b336c21131334409d97e5adec": { - "balance": "20000000000000000000" + "0x3a3108c1e680a33b336c21131334409d97e5adec": { + "balance": "0x1158e460913d00000" }, - "2caf6bf4ec7d5a19c5e0897a5eeb011dcece4210": { - "balance": "139740000000000000000" + "0x2caf6bf4ec7d5a19c5e0897a5eeb011dcece4210": { + "balance": "0x7934835a031160000" }, - "f44f8551ace933720712c5c491cdb6f2f951736c": { - "balance": "4000000000000000000000" + "0xf44f8551ace933720712c5c491cdb6f2f951736c": { + "balance": "0xd8d726b7177a800000" }, - "5bc1f95507b1018642e45cd9c0e22733b9b1a326": { - "balance": "100000000000000000000" + "0x5bc1f95507b1018642e45cd9c0e22733b9b1a326": { + "balance": "0x56bc75e2d63100000" }, - "94ca56de777fd453177f5e0694c478e66aff8a84": { - "balance": "500000000000000000000" + "0x94ca56de777fd453177f5e0694c478e66aff8a84": { + "balance": "0x1b1ae4d6e2ef500000" }, - "afdd1b786162b8317e20f0e979f4b2ce486d765d": { - "balance": "20000000000000000000" + "0xafdd1b786162b8317e20f0e979f4b2ce486d765d": { + "balance": "0x1158e460913d00000" }, - "3a805fa0f7387f73055b7858ca8519edd93d634f": { - "balance": "1850000000000000000000" + "0x3a805fa0f7387f73055b7858ca8519edd93d634f": { + "balance": "0x6449e84e47a8a80000" }, - "8b36224c7356e751f0c066c35e3b44860364bfc2": { - "balance": "998987000000000000000" + "0x8b36224c7356e751f0c066c35e3b44860364bfc2": { + "balance": "0x3627bac7a3d9278000" }, - "cfecbea07c27002f65fe534bb8842d0925c78402": { - "balance": "4000000000000000000000" + "0xcfecbea07c27002f65fe534bb8842d0925c78402": { + "balance": "0xd8d726b7177a800000" }, - "482982ac1f1c6d1721feecd9b9c96cd949805055": { - "balance": "10000000000000000000000" + "0x482982ac1f1c6d1721feecd9b9c96cd949805055": { + "balance": "0x21e19e0c9bab2400000" }, - "af880fc7567d5595cacce15c3fc14c8742c26c9e": { - "balance": "133700000000000000000" + "0xaf880fc7567d5595cacce15c3fc14c8742c26c9e": { + "balance": "0x73f75d1a085ba0000" }, - "acc1c78786ab4d2b3b277135b5ba123e0400486b": { - "balance": "78800000000000000000" + "0xacc1c78786ab4d2b3b277135b5ba123e0400486b": { + "balance": "0x44591d67fecc80000" }, - "41f27e744bd29de2b0598f02a0bb9f98e681eaa4": { - "balance": "7760000000000000000000" + "0x41f27e744bd29de2b0598f02a0bb9f98e681eaa4": { + "balance": "0x1a4aba225c207400000" }, - "09a025316f967fa8b9a1d60700063f5a68001caa": { - "balance": "38200000000000000000" + "0x09a025316f967fa8b9a1d60700063f5a68001caa": { + "balance": "0x21221a99b93ec0000" }, - "391f20176d12360d724d51470a90703675594a4d": { - "balance": "1600000000000000000000" + "0x391f20176d12360d724d51470a90703675594a4d": { + "balance": "0x56bc75e2d631000000" }, - "fe4d8403216fd571572bf1bdb01d00578978d688": { - "balance": "9850000000000000000000" + "0xfe4d8403216fd571572bf1bdb01d00578978d688": { + "balance": "0x215f835bc769da80000" }, - "900f0b8e35b668f81ef252b13855aa5007d012e7": { - "balance": "425000000000000000000" + "0x900f0b8e35b668f81ef252b13855aa5007d012e7": { + "balance": "0x170a0f5040e5040000" }, - "c35b95a2a3737cb8f0f596b34524872bd30da234": { - "balance": "7540000000000000000000" + "0xc35b95a2a3737cb8f0f596b34524872bd30da234": { + "balance": "0x198be85235e2d500000" }, - "412a68f6c645559cc977fc4964047a201d1bb0e2": { - "balance": "50000000000000000000000" + "0x412a68f6c645559cc977fc4964047a201d1bb0e2": { + "balance": "0xa968163f0a57b400000" }, - "d3dad1b6d08d4581ccae65a8732db6ac69f0c69e": { - "balance": "6000000000000000000000" + "0xd3dad1b6d08d4581ccae65a8732db6ac69f0c69e": { + "balance": "0x14542ba12a337c00000" }, - "35855ec641ab9e081ed0c2a6dcd81354d0244a87": { - "balance": "1201897000000000000000" + "0x35855ec641ab9e081ed0c2a6dcd81354d0244a87": { + "balance": "0x4127abe993a7aa8000" }, - "88015d7203c5e0224aeda286ed12f1a51b789333": { - "balance": "4999711000000000000000" + "0x88015d7203c5e0224aeda286ed12f1a51b789333": { + "balance": "0x10f08eda8e555098000" }, - "251c12722c6879227992a304eb3576cd18434ea5": { - "balance": "2000000000000000000000" + "0x251c12722c6879227992a304eb3576cd18434ea5": { + "balance": "0x6c6b935b8bbd400000" }, - "1f6f0030349752061c96072bc3d6eb3549208d6b": { - "balance": "23891000000000000000" + "0x1f6f0030349752061c96072bc3d6eb3549208d6b": { + "balance": "0x14b8de1eb88db8000" }, - "86153063a1ae7f02f1a88136d4d69c7c5e3e4327": { - "balance": "1000000000000000000000" + "0x86153063a1ae7f02f1a88136d4d69c7c5e3e4327": { + "balance": "0x3635c9adc5dea00000" }, - "78355df0a230f83d032c703154414de3eedab557": { - "balance": "2000000000000000000000" + "0x78355df0a230f83d032c703154414de3eedab557": { + "balance": "0x6c6b935b8bbd400000" }, - "c5b56cd234267c28e89c6f6b2266b086a12f970c": { - "balance": "4000000000000000000000" + "0xc5b56cd234267c28e89c6f6b2266b086a12f970c": { + "balance": "0xd8d726b7177a800000" }, - "3e3cd3bec06591d6346f254b621eb41c89008d31": { - "balance": "993800000000000000000" + "0x3e3cd3bec06591d6346f254b621eb41c89008d31": { + "balance": "0x35dfbeda9f37340000" }, - "378ea1dc8edc19bae82638029ea8752ce98bcfcd": { - "balance": "2000000000000000000000" + "0x378ea1dc8edc19bae82638029ea8752ce98bcfcd": { + "balance": "0x6c6b935b8bbd400000" }, - "67632046dcb25a54936928a96f423f3320cbed92": { - "balance": "2000000000000000000000" + "0x67632046dcb25a54936928a96f423f3320cbed92": { + "balance": "0x6c6b935b8bbd400000" }, - "ddbee6f094eae63420b003fb4757142aea6cd0fd": { - "balance": "2000000000000000000000" + "0xddbee6f094eae63420b003fb4757142aea6cd0fd": { + "balance": "0x6c6b935b8bbd400000" }, - "b555d00f9190cc3677aef314acd73fdc39399259": { - "balance": "2000000000000000000000" + "0xb555d00f9190cc3677aef314acd73fdc39399259": { + "balance": "0x6c6b935b8bbd400000" }, - "e230fe1bff03186d0219f15d4c481b7d59be286a": { - "balance": "36710000000000000000" + "0xe230fe1bff03186d0219f15d4c481b7d59be286a": { + "balance": "0x1fd741e8088970000" }, - "3e4e9265223c9738324cf20bd06006d0073edb8c": { - "balance": "133700000000000000000" + "0x3e4e9265223c9738324cf20bd06006d0073edb8c": { + "balance": "0x73f75d1a085ba0000" }, - "7450ff7f99eaa9116275deac68e428df5bbcd8b9": { - "balance": "2000000000000000000000" + "0x7450ff7f99eaa9116275deac68e428df5bbcd8b9": { + "balance": "0x6c6b935b8bbd400000" }, - "021f69043de88c4917ca10f1842897eec0589c7c": { - "balance": "1978760000000000000000" + "0x021f69043de88c4917ca10f1842897eec0589c7c": { + "balance": "0x6b44cfb81487f40000" }, - "351787843505f8e4eff46566cce6a59f4d1c5fe7": { - "balance": "9250000000000000000000" + "0x351787843505f8e4eff46566cce6a59f4d1c5fe7": { + "balance": "0x1f5718987664b480000" }, - "ebd37b256563e30c6f9289a8e2702f0852880833": { - "balance": "1999944000000000000000" + "0xebd37b256563e30c6f9289a8e2702f0852880833": { + "balance": "0x6c6acc67d7b1d40000" }, - "ed41e1a28f5caa843880ef4e8b08bd6c33141edf": { - "balance": "790174000000000000000" + "0xed41e1a28f5caa843880ef4e8b08bd6c33141edf": { + "balance": "0x2ad5ddfa7a8d830000" }, - "8d238e036596987643d73173c37b0ad06055b96c": { - "balance": "2089724000000000000000" + "0x8d238e036596987643d73173c37b0ad06055b96c": { + "balance": "0x7148bf0a2af0660000" }, - "478e524ef2a381d70c82588a93ca7a5fa9d51cbf": { - "balance": "254908000000000000000000" + "0x478e524ef2a381d70c82588a93ca7a5fa9d51cbf": { + "balance": "0x35fa97226f8899700000" }, - "4419ac618d5dea7cdc6077206fb07dbdd71c1702": { - "balance": "4000000000000000000000" + "0x4419ac618d5dea7cdc6077206fb07dbdd71c1702": { + "balance": "0xd8d726b7177a800000" }, - "ca25ff34934c1942e22a4e7bd56f14021a1af088": { - "balance": "197000000000000000000" + "0xca25ff34934c1942e22a4e7bd56f14021a1af088": { + "balance": "0xaadec983fcff40000" }, - "5552f4b3ed3e1da79a2f78bb13e8ae5a68a9df3b": { - "balance": "1000000000000000000000" + "0x5552f4b3ed3e1da79a2f78bb13e8ae5a68a9df3b": { + "balance": "0x3635c9adc5dea00000" }, - "4354221e62dc09e6406436163a185ef06d114a81": { - "balance": "2000000000000000000000" + "0x4354221e62dc09e6406436163a185ef06d114a81": { + "balance": "0x6c6b935b8bbd400000" }, - "ca0432cb157b5179f02ebba5c9d1b54fec4d88ca": { - "balance": "1000000000000000000000" + "0xca0432cb157b5179f02ebba5c9d1b54fec4d88ca": { + "balance": "0x3635c9adc5dea00000" }, - "8a780ab87a9145fe10ed60fa476a740af4cab1d2": { - "balance": "334000000000000000000" + "0x8a780ab87a9145fe10ed60fa476a740af4cab1d2": { + "balance": "0x121b2e5e6464780000" }, - "4ff676e27f681a982d8fd9d20e648b3dce05e945": { - "balance": "2800000000000000000000" + "0x4ff676e27f681a982d8fd9d20e648b3dce05e945": { + "balance": "0x97c9ce4cf6d5c00000" }, - "6c63fc85029a2654d79b2bea4de349e4524577c5": { - "balance": "660000000000000000000" + "0x6c63fc85029a2654d79b2bea4de349e4524577c5": { + "balance": "0x23c757072b8dd00000" }, - "1ac089c3bc4d82f06a20051a9d732dc0e734cb61": { - "balance": "700300000000000000000" + "0x1ac089c3bc4d82f06a20051a9d732dc0e734cb61": { + "balance": "0x25f69d63a6ce0e0000" }, - "4bf4479799ef82eea20943374f56a1bf54001e5e": { - "balance": "3940000000000000000000" + "0x4bf4479799ef82eea20943374f56a1bf54001e5e": { + "balance": "0xd5967be4fc3f100000" }, - "08411652c871713609af0062a8a1281bf1bbcfd9": { - "balance": "1400000000000000000000" + "0x08411652c871713609af0062a8a1281bf1bbcfd9": { + "balance": "0x4be4e7267b6ae00000" }, - "e1bfaa5a45c504428923c4a61192a55b1400b45d": { - "balance": "2674000000000000000000" + "0xe1bfaa5a45c504428923c4a61192a55b1400b45d": { + "balance": "0x90f534608a72880000" }, - "5e1fbd4e58e2312b3c78d7aaaafa10bf9c3189e3": { - "balance": "40000000000000000000000" + "0x5e1fbd4e58e2312b3c78d7aaaafa10bf9c3189e3": { + "balance": "0x878678326eac9000000" }, - "bb27c6a7f91075475ab229619040f804c8ec7a6a": { - "balance": "10000000000000000000000" + "0xbb27c6a7f91075475ab229619040f804c8ec7a6a": { + "balance": "0x21e19e0c9bab2400000" }, - "5d8d31faa864e22159cd6f5175ccecc53fa54d72": { - "balance": "26980000000000000000000" + "0x5d8d31faa864e22159cd6f5175ccecc53fa54d72": { + "balance": "0x5b696b70dd567100000" }, - "2dd8eeef87194abc2ce7585da1e35b7cea780cb7": { - "balance": "999999000000000000000" + "0x2dd8eeef87194abc2ce7585da1e35b7cea780cb7": { + "balance": "0x3635c6204739d98000" }, - "0e1801e70b6262861b1134ccbc391f568afc92f7": { - "balance": "4000000000000000000000" + "0x0e1801e70b6262861b1134ccbc391f568afc92f7": { + "balance": "0xd8d726b7177a800000" }, - "61042b80fd6095d1b87be2f00f109fabafd157a6": { - "balance": "100000000000000000000" + "0x61042b80fd6095d1b87be2f00f109fabafd157a6": { + "balance": "0x56bc75e2d63100000" }, - "fb5518714cefc36d04865de5915ef0ff47dfe743": { - "balance": "2000000000000000000000" + "0xfb5518714cefc36d04865de5915ef0ff47dfe743": { + "balance": "0x6c6b935b8bbd400000" }, - "b5add1e7809f7d03069bfe883b0a932210be8712": { - "balance": "1000000000000000000000" + "0xb5add1e7809f7d03069bfe883b0a932210be8712": { + "balance": "0x3635c9adc5dea00000" }, - "c2e2d498f70dcd0859e50b023a710a6d4b2133bd": { - "balance": "1037130000000000000000" + "0xc2e2d498f70dcd0859e50b023a710a6d4b2133bd": { + "balance": "0x383911f00cbce10000" }, - "4ad047fae67ef162fe68fedbc27d3b65caf10c36": { - "balance": "1970000000000000000000" + "0x4ad047fae67ef162fe68fedbc27d3b65caf10c36": { + "balance": "0x6acb3df27e1f880000" }, - "69cb3e2153998d86e5ee20c1fcd1a6baeeb2863f": { - "balance": "4000000000000000000000" + "0x69cb3e2153998d86e5ee20c1fcd1a6baeeb2863f": { + "balance": "0xd8d726b7177a800000" }, - "683633010a88686bea5a98ea53e87997cbf73e69": { - "balance": "99960000000000000000" + "0x683633010a88686bea5a98ea53e87997cbf73e69": { + "balance": "0x56b394263a40c0000" }, - "6cb11ecb32d3ce829601310636f5a10cf7cf9b5f": { - "balance": "20068370000000000000000" + "0x6cb11ecb32d3ce829601310636f5a10cf7cf9b5f": { + "balance": "0x43fe8949c3801f50000" }, - "a613456996408af1c2e93e177788ab55895e2b32": { - "balance": "6366000000000000000000" + "0xa613456996408af1c2e93e177788ab55895e2b32": { + "balance": "0x15919ff477c88b80000" }, - "8308ed0af7f8a3c1751fafc877b5a42af7d35882": { - "balance": "1000000000000000000000" + "0x8308ed0af7f8a3c1751fafc877b5a42af7d35882": { + "balance": "0x3635c9adc5dea00000" }, - "e5edf8123f2403ce1a0299becf7aac744d075f23": { - "balance": "200200000000000000000" + "0xe5edf8123f2403ce1a0299becf7aac744d075f23": { + "balance": "0xada55474b81340000" }, - "05665155cc49cbf6aabdd5ae92cbfaad82b8c0c1": { - "balance": "400000000000000000000" + "0x05665155cc49cbf6aabdd5ae92cbfaad82b8c0c1": { + "balance": "0x15af1d78b58c400000" }, - "00b277b099a8e866ca0ec65bcb87284fd142a582": { - "balance": "1970000000000000000000" + "0x00b277b099a8e866ca0ec65bcb87284fd142a582": { + "balance": "0x6acb3df27e1f880000" }, - "4b9e068fc4680976e61504912985fd5ce94bab0d": { - "balance": "668500000000000000000" + "0x4b9e068fc4680976e61504912985fd5ce94bab0d": { + "balance": "0x243d4d18229ca20000" }, - "12134e7f6b017bf48e855a399ca58e2e892fa5c8": { - "balance": "1000000000000000000000" + "0x12134e7f6b017bf48e855a399ca58e2e892fa5c8": { + "balance": "0x3635c9adc5dea00000" }, - "dffcea5421ec15900c6ecfc777184e140e209e24": { - "balance": "19980000000000000000" + "0xdffcea5421ec15900c6ecfc777184e140e209e24": { + "balance": "0x115473824344e0000" }, - "2132c0516a2e17174ac547c43b7b0020d1eb4c59": { - "balance": "985000000000000000000" + "0x2132c0516a2e17174ac547c43b7b0020d1eb4c59": { + "balance": "0x35659ef93f0fc40000" }, - "d39a5da460392b940b3c69bc03757bf3f2e82489": { - "balance": "7019250000000000000000" + "0xd39a5da460392b940b3c69bc03757bf3f2e82489": { + "balance": "0x17c83a97d6b6ca50000" }, - "66c8331efe7198e98b2d32b938688e3241d0e24f": { - "balance": "9620000000000000000000" + "0x66c8331efe7198e98b2d32b938688e3241d0e24f": { + "balance": "0x2098051970e39d00000" }, - "bdca2a0ff34588af625fa8e28fc3015ab5a3aa00": { - "balance": "2339800000000000000000" + "0xbdca2a0ff34588af625fa8e28fc3015ab5a3aa00": { + "balance": "0x7ed73f773552fc0000" }, - "7dfc342dffcf45dfee74f84c0995397bd1a63172": { - "balance": "250000000000000000000" + "0x7dfc342dffcf45dfee74f84c0995397bd1a63172": { + "balance": "0xd8d726b7177a80000" }, - "a202547242806f6e70e74058d6e5292defc8c8d4": { - "balance": "2002000000000000000000" + "0xa202547242806f6e70e74058d6e5292defc8c8d4": { + "balance": "0x6c8754c8f30c080000" }, - "3bbc13d04accc0707aebdcaef087d0b87e0b5ee3": { - "balance": "3520000000000000000000" + "0x3bbc13d04accc0707aebdcaef087d0b87e0b5ee3": { + "balance": "0xbed1d0263d9f000000" }, - "be5cba8d37427986e8ca2600e858bb03c359520f": { - "balance": "2955000000000000000000" + "0xbe5cba8d37427986e8ca2600e858bb03c359520f": { + "balance": "0xa030dcebbd2f4c0000" }, - "4174fa1bc12a3b7183cbabb77a0b59557ba5f1db": { - "balance": "2000000000000000000000" + "0x4174fa1bc12a3b7183cbabb77a0b59557ba5f1db": { + "balance": "0x6c6b935b8bbd400000" }, - "9eb3a7cb5e6726427a3a361cfa8d6164dbd0ba16": { - "balance": "804000000000000000000" + "0x9eb3a7cb5e6726427a3a361cfa8d6164dbd0ba16": { + "balance": "0x2b95bdcc39b6100000" }, - "25e661c939863acc044e6f17b5698cce379ec3cc": { - "balance": "1370000000000000000000" + "0x25e661c939863acc044e6f17b5698cce379ec3cc": { + "balance": "0x4a4491bd6dcd280000" }, - "24bd5904059091d2f9e12d6a26a010ca22ab14e8": { - "balance": "1880000000000000000000" + "0x24bd5904059091d2f9e12d6a26a010ca22ab14e8": { + "balance": "0x65ea3db75546600000" }, - "c96626728aaa4c4fb3d31c26df3af310081710d1": { - "balance": "3340000000000000000000" + "0xc96626728aaa4c4fb3d31c26df3af310081710d1": { + "balance": "0xb50fcfafebecb00000" }, - "0fb5d2c673bfb1ddca141b9894fd6d3f05da6720": { - "balance": "100000000000000000000" + "0x0fb5d2c673bfb1ddca141b9894fd6d3f05da6720": { + "balance": "0x56bc75e2d63100000" }, - "2de31afd189a13a76ff6fe73ead9f74bb5c4a629": { - "balance": "6000000000000000000000" + "0x2de31afd189a13a76ff6fe73ead9f74bb5c4a629": { + "balance": "0x14542ba12a337c00000" }, - "bd09126c891c4a83068059fe0e15796c4661a9f4": { - "balance": "800000000000000000000" + "0xbd09126c891c4a83068059fe0e15796c4661a9f4": { + "balance": "0x2b5e3af16b18800000" }, - "496f5843f6d24cd98d255e4c23d1e1f023227545": { - "balance": "1754143000000000000000" + "0x496f5843f6d24cd98d255e4c23d1e1f023227545": { + "balance": "0x5f179fd4a6ee098000" }, - "540cf23dd95c4d558a279d778d2b3735b3164191": { - "balance": "10000000000000000000000" + "0x540cf23dd95c4d558a279d778d2b3735b3164191": { + "balance": "0x21e19e0c9bab2400000" }, - "9b5ec18e8313887df461d2902e81e67a8f113bb1": { - "balance": "100000000000000000000" + "0x9b5ec18e8313887df461d2902e81e67a8f113bb1": { + "balance": "0x56bc75e2d63100000" }, - "b7a7f77c348f92a9f1100c6bd829a8ac6d7fcf91": { - "balance": "1820000000000000000000" + "0xb7a7f77c348f92a9f1100c6bd829a8ac6d7fcf91": { + "balance": "0x62a992e53a0af00000" }, - "2590126870e0bde8a663ab040a72a5573d8d41c2": { - "balance": "5000000000000000000000" + "0x2590126870e0bde8a663ab040a72a5573d8d41c2": { + "balance": "0x10f0cf064dd59200000" }, - "090fa9367bda57d0d3253a0a8ff76ce0b8e19a73": { - "balance": "1000000000000000000000" + "0x090fa9367bda57d0d3253a0a8ff76ce0b8e19a73": { + "balance": "0x3635c9adc5dea00000" }, - "2a5ba9e34cd58da54c9a2712663a3be274c8e47b": { - "balance": "197000000000000000000" + "0x2a5ba9e34cd58da54c9a2712663a3be274c8e47b": { + "balance": "0xaadec983fcff40000" }, - "3e8641d43c42003f0a33c929f711079deb2b9e46": { - "balance": "500000000000000000000" + "0x3e8641d43c42003f0a33c929f711079deb2b9e46": { + "balance": "0x1b1ae4d6e2ef500000" }, - "f4d97664cc4eec9edbe7fa09f4750a663b507d79": { - "balance": "4000000000000000000000" + "0xf4d97664cc4eec9edbe7fa09f4750a663b507d79": { + "balance": "0xd8d726b7177a800000" }, - "b1540e94cff3465cc3d187e7c8e3bdaf984659e2": { - "balance": "2989950000000000000000" + "0xb1540e94cff3465cc3d187e7c8e3bdaf984659e2": { + "balance": "0xa215e44390e3330000" }, - "f96883582459908c827627e86f28e646f9c7fc7a": { - "balance": "8350000000000000000000" + "0xf96883582459908c827627e86f28e646f9c7fc7a": { + "balance": "0x1c4a78737cdcfb80000" }, - "d4feed99e8917c5c5458635f3603ecb7e817a7d0": { - "balance": "300031000000000000000" + "0xd4feed99e8917c5c5458635f3603ecb7e817a7d0": { + "balance": "0x1043c43cde1d398000" }, - "14b1603ec62b20022033eec4d6d6655ac24a015a": { - "balance": "50000000000000000000" + "0x14b1603ec62b20022033eec4d6d6655ac24a015a": { + "balance": "0x2b5e3af16b1880000" }, - "af8e1dcb314c950d3687434d309858e1a8739cd4": { - "balance": "267400000000000000000" + "0xaf8e1dcb314c950d3687434d309858e1a8739cd4": { + "balance": "0xe7eeba3410b740000" }, - "4b9206ba6b549a1a7f969e1d5dba867539d1fa67": { - "balance": "7880000000000000000000" + "0x4b9206ba6b549a1a7f969e1d5dba867539d1fa67": { + "balance": "0x1ab2cf7c9f87e200000" }, - "471010da492f4018833b088d9872901e06129174": { - "balance": "500000000000000000000" + "0x471010da492f4018833b088d9872901e06129174": { + "balance": "0x1b1ae4d6e2ef500000" }, - "d243184c801e5d79d2063f3578dbae81e7b3a9cb": { - "balance": "1989700000000000000000" + "0xd243184c801e5d79d2063f3578dbae81e7b3a9cb": { + "balance": "0x6bdca2681e1aba0000" }, - "3eada8c92f56067e1bb73ce378da56dc2cdfd365": { - "balance": "2210000000000000000000" + "0x3eada8c92f56067e1bb73ce378da56dc2cdfd365": { + "balance": "0x77cde93aeb0d480000" }, - "33ea6b7855e05b07ab80dab1e14de9b649e99b6c": { - "balance": "532000000000000000000" + "0x33ea6b7855e05b07ab80dab1e14de9b649e99b6c": { + "balance": "0x1cd6fbad57dbd00000" }, - "700711e311bb947355f755b579250ca7fd765a3e": { - "balance": "1790000000000000000000" + "0x700711e311bb947355f755b579250ca7fd765a3e": { + "balance": "0x61093d7c2c6d380000" }, - "87fb26c31e48644d693134205cae43b21f18614b": { - "balance": "1370000000000000000000" + "0x87fb26c31e48644d693134205cae43b21f18614b": { + "balance": "0x4a4491bd6dcd280000" }, - "001d14804b399c6ef80e64576f657660804fec0b": { - "balance": "4200000000000000000000" + "0x001d14804b399c6ef80e64576f657660804fec0b": { + "balance": "0xe3aeb5737240a00000" }, - "f9642086b1fbae61a6804dbe5fb15ec2d2b537f4": { - "balance": "2000000000000000000000" + "0xf9642086b1fbae61a6804dbe5fb15ec2d2b537f4": { + "balance": "0x6c6b935b8bbd400000" }, - "6919dd5e5dfb1afa404703b9faea8cee35d00d70": { - "balance": "5910000000000000000000" + "0x6919dd5e5dfb1afa404703b9faea8cee35d00d70": { + "balance": "0x14061b9d77a5e980000" }, - "9ac4da51d27822d1e208c96ea64a1e5b55299723": { - "balance": "100040000000000000000" + "0x9ac4da51d27822d1e208c96ea64a1e5b55299723": { + "balance": "0x56c5579f722140000" }, - "1bd8ebaa7674bb18e19198db244f570313075f43": { - "balance": "150000000000000000000" + "0x1bd8ebaa7674bb18e19198db244f570313075f43": { + "balance": "0x821ab0d4414980000" }, - "e64ef012658d54f8e8609c4e9023c09fe865c83b": { - "balance": "28000000000000000000" + "0xe64ef012658d54f8e8609c4e9023c09fe865c83b": { + "balance": "0x18493fba64ef00000" }, - "43b079baf0727999e66bf743d5bcbf776c3b0922": { - "balance": "2000000000000000000000" + "0x43b079baf0727999e66bf743d5bcbf776c3b0922": { + "balance": "0x6c6b935b8bbd400000" }, - "06ac26ad92cb859bd5905ddce4266aa0ec50a9c5": { - "balance": "775000000000000000000" + "0x06ac26ad92cb859bd5905ddce4266aa0ec50a9c5": { + "balance": "0x2a034919dfbfbc0000" }, - "99c1d9f40c6ab7f8a92fce2fdce47a54a586c53f": { - "balance": "985000000000000000000" + "0x99c1d9f40c6ab7f8a92fce2fdce47a54a586c53f": { + "balance": "0x35659ef93f0fc40000" }, - "4ae93082e45187c26160e66792f57fad3551c73a": { - "balance": "21658000000000000000000" + "0x4ae93082e45187c26160e66792f57fad3551c73a": { + "balance": "0x4961520daff82280000" }, - "7da7613445a21299aa74f0ad71431ec43fbb1be9": { - "balance": "68000000000000000000" + "0x7da7613445a21299aa74f0ad71431ec43fbb1be9": { + "balance": "0x3afb087b876900000" }, - "4a9a26fd0a8ba10f977da4f77c31908dab4a8016": { - "balance": "1790000000000000000000" + "0x4a9a26fd0a8ba10f977da4f77c31908dab4a8016": { + "balance": "0x61093d7c2c6d380000" }, - "972c2f96aa00cf8a2f205abcf8937c0c75f5d8d9": { - "balance": "200000000000000000000" + "0x972c2f96aa00cf8a2f205abcf8937c0c75f5d8d9": { + "balance": "0xad78ebc5ac6200000" }, - "b5046cb3dc1dedbd364514a2848e44c1de4ed147": { - "balance": "16445100000000000000000" + "0xb5046cb3dc1dedbd364514a2848e44c1de4ed147": { + "balance": "0x37b7d9bb820405e0000" }, - "48c2ee91a50756d8ce9abeeb7589d22c6fee5dfb": { - "balance": "3220000000000000000000" + "0x48c2ee91a50756d8ce9abeeb7589d22c6fee5dfb": { + "balance": "0xae8e7a0bb575d00000" }, - "46c1aa2244b9c8a957ca8fac431b0595a3b86824": { - "balance": "4000000000000000000000" + "0x46c1aa2244b9c8a957ca8fac431b0595a3b86824": { + "balance": "0xd8d726b7177a800000" }, - "21fd0bade5f4ef7474d058b7f3d854cb1300524e": { - "balance": "20000000000000000000" + "0x21fd0bade5f4ef7474d058b7f3d854cb1300524e": { + "balance": "0x1158e460913d00000" }, - "1864a3c7b48155448c54c88c708f166709736d31": { - "balance": "133700000000000000000" + "0x1864a3c7b48155448c54c88c708f166709736d31": { + "balance": "0x73f75d1a085ba0000" }, - "5dd53ae897526b167d39f1744ef7c3da5b37a293": { - "balance": "8000000000000000000000" + "0x5dd53ae897526b167d39f1744ef7c3da5b37a293": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "ece111670b563ccdbebca52384290ecd68fe5c92": { - "balance": "20000000000000000000" + "0xece111670b563ccdbebca52384290ecd68fe5c92": { + "balance": "0x1158e460913d00000" }, - "74d671d99cbea1ab57906375b63ff42b50451d17": { - "balance": "1000000000000000000000" + "0x74d671d99cbea1ab57906375b63ff42b50451d17": { + "balance": "0x3635c9adc5dea00000" }, - "5717cc9301511d4a81b9f583148beed3d3cc8309": { - "balance": "2600000000000000000000" + "0x5717cc9301511d4a81b9f583148beed3d3cc8309": { + "balance": "0x8cf23f909c0fa00000" }, - "8f92844f282a92999ee5b4a8d773d06b694dbd9f": { - "balance": "1940000000000000000000" + "0x8f92844f282a92999ee5b4a8d773d06b694dbd9f": { + "balance": "0x692ae8897081d00000" }, - "b5a606f4ddcbb9471ec67f658caf2b00ee73025e": { - "balance": "4325000000000000000000" + "0xb5a606f4ddcbb9471ec67f658caf2b00ee73025e": { + "balance": "0xea756ea92afc740000" }, - "bdb60b823a1173d45a0792245fb496f1fd3301cf": { - "balance": "2000000000000000000000" + "0xbdb60b823a1173d45a0792245fb496f1fd3301cf": { + "balance": "0x6c6b935b8bbd400000" }, - "1d2615f8b6ca5012b663bdd094b0c5137c778ddf": { - "balance": "10000000000000000000000" + "0x1d2615f8b6ca5012b663bdd094b0c5137c778ddf": { + "balance": "0x21e19e0c9bab2400000" }, - "82ff716fdf033ec7e942c909d9831867b8b6e2ef": { - "balance": "1790000000000000000000" + "0x82ff716fdf033ec7e942c909d9831867b8b6e2ef": { + "balance": "0x61093d7c2c6d380000" }, - "44c14765127cde11fab46c5d2cf4d4b2890023fd": { - "balance": "2000000000000000000000" + "0x44c14765127cde11fab46c5d2cf4d4b2890023fd": { + "balance": "0x6c6b935b8bbd400000" }, - "c72cb301258e91bc08998a805dd192f25c2f9a35": { - "balance": "591000000000000000000" + "0xc72cb301258e91bc08998a805dd192f25c2f9a35": { + "balance": "0x2009c5c8bf6fdc0000" }, - "ad732c976593eec4783b4e2ecd793979780bfedb": { - "balance": "2000000000000000000000" + "0xad732c976593eec4783b4e2ecd793979780bfedb": { + "balance": "0x6c6b935b8bbd400000" }, - "d8f62036f03b7635b858f1103f8a1d9019a892b6": { - "balance": "50000000000000000000" + "0xd8f62036f03b7635b858f1103f8a1d9019a892b6": { + "balance": "0x2b5e3af16b1880000" }, - "0a06fad7dcd7a492cbc053eeabde6934b39d8637": { - "balance": "20000000000000000000" + "0x0a06fad7dcd7a492cbc053eeabde6934b39d8637": { + "balance": "0x1158e460913d00000" }, - "67f2bb78b8d3e11f7c458a10b5c8e0a1d374467d": { - "balance": "1790000000000000000000" + "0x67f2bb78b8d3e11f7c458a10b5c8e0a1d374467d": { + "balance": "0x61093d7c2c6d380000" }, - "4b5cdb1e428c91dd7cb54a6aed4571da054bfe52": { - "balance": "88000000000000000000" + "0x4b5cdb1e428c91dd7cb54a6aed4571da054bfe52": { + "balance": "0x4c53ecdc18a600000" }, - "b3557d39b5411b84445f5f54f38f62d2714d0087": { - "balance": "600000000000000000000" + "0xb3557d39b5411b84445f5f54f38f62d2714d0087": { + "balance": "0x2086ac351052600000" }, - "0b0e055b28cbd03dc5ff44aa64f3dce04f5e63fb": { - "balance": "2000000000000000000000" + "0x0b0e055b28cbd03dc5ff44aa64f3dce04f5e63fb": { + "balance": "0x6c6b935b8bbd400000" }, - "9b2be7f56754f505e3441a10f7f0e20fd3ddf849": { - "balance": "340000000000000000000" + "0x9b2be7f56754f505e3441a10f7f0e20fd3ddf849": { + "balance": "0x126e72a69a50d00000" }, - "0b93fca4a4f09cac20db60e065edcccc11e0a5b6": { - "balance": "200000000000000000000" + "0x0b93fca4a4f09cac20db60e065edcccc11e0a5b6": { + "balance": "0xad78ebc5ac6200000" }, - "3bc85d6c735b9cda4bba5f48b24b13e70630307b": { - "balance": "1970000000000000000000" + "0x3bc85d6c735b9cda4bba5f48b24b13e70630307b": { + "balance": "0x6acb3df27e1f880000" }, - "52102354a6aca95d8a2e86d5debda6de69346076": { - "balance": "2000000000000000000000" + "0x52102354a6aca95d8a2e86d5debda6de69346076": { + "balance": "0x6c6b935b8bbd400000" }, - "cda4530f4b9bc50905b79d17c28fc46f95349bdf": { - "balance": "942000000000000000000" + "0xcda4530f4b9bc50905b79d17c28fc46f95349bdf": { + "balance": "0x3310e04911f1f80000" }, - "ff545bbb66fbd00eb5e6373ff4e326f5feb5fe12": { - "balance": "20000000000000000000" + "0xff545bbb66fbd00eb5e6373ff4e326f5feb5fe12": { + "balance": "0x1158e460913d00000" }, - "4030a925706b2c101c8c5cb9bd05fbb4f6759b18": { - "balance": "4000000000000000000000" + "0x4030a925706b2c101c8c5cb9bd05fbb4f6759b18": { + "balance": "0xd8d726b7177a800000" }, - "f11e01c7a9d12499005f4dae7716095a34176277": { - "balance": "400000000000000000000" + "0xf11e01c7a9d12499005f4dae7716095a34176277": { + "balance": "0x15af1d78b58c400000" }, - "a4826b6c3882fad0ed5c8fbb25cc40cc4f33759f": { - "balance": "2068000000000000000000" + "0xa4826b6c3882fad0ed5c8fbb25cc40cc4f33759f": { + "balance": "0x701b43e34433d00000" }, - "28510e6eff1fc829b6576f4328bc3938ec7a6580": { - "balance": "10000000000000000000000" + "0x28510e6eff1fc829b6576f4328bc3938ec7a6580": { + "balance": "0x21e19e0c9bab2400000" }, - "9ce5363b13e8238aa4dd15acd0b2e8afe0873247": { - "balance": "200000000000000000000" + "0x9ce5363b13e8238aa4dd15acd0b2e8afe0873247": { + "balance": "0xad78ebc5ac6200000" }, - "d97bc84abd47c05bbf457b2ef659d61ca5e5e48f": { - "balance": "122000000000000000000" + "0xd97bc84abd47c05bbf457b2ef659d61ca5e5e48f": { + "balance": "0x69d17119dc5a80000" }, - "4a719061f5285495b37b9d7ef8a51b07d6e6acac": { - "balance": "199800000000000000000" + "0x4a719061f5285495b37b9d7ef8a51b07d6e6acac": { + "balance": "0xad4c8316a0b0c0000" }, - "8b714522fa2839620470edcf0c4401b713663df1": { - "balance": "200000000000000000000" + "0x8b714522fa2839620470edcf0c4401b713663df1": { + "balance": "0xad78ebc5ac6200000" }, - "b6decf82969819ba02de29b9b593f21b64eeda0f": { - "balance": "740000000000000000000" + "0xb6decf82969819ba02de29b9b593f21b64eeda0f": { + "balance": "0x281d901f4fdd100000" }, - "c87d3ae3d88704d9ab0009dcc1a0067131f8ba3c": { - "balance": "1969606000000000000000" + "0xc87d3ae3d88704d9ab0009dcc1a0067131f8ba3c": { + "balance": "0x6ac5c62d9486070000" }, - "dccb370ed68aa922283043ef7cad1b9d403fc34a": { - "balance": "4000000000000000000000" + "0xdccb370ed68aa922283043ef7cad1b9d403fc34a": { + "balance": "0xd8d726b7177a800000" }, - "2d532df4c63911d1ce91f6d1fcbff7960f78a885": { - "balance": "1669833000000000000000" + "0x2d532df4c63911d1ce91f6d1fcbff7960f78a885": { + "balance": "0x5a85968a5878da8000" }, - "1fcfd1d57f872290560cb62d600e1defbefccc1c": { - "balance": "1490000000000000000000" + "0x1fcfd1d57f872290560cb62d600e1defbefccc1c": { + "balance": "0x50c5e761a444080000" }, - "d9e27eb07dfc71a706060c7f079238ca93e88539": { - "balance": "1000000000000000000000" + "0xd9e27eb07dfc71a706060c7f079238ca93e88539": { + "balance": "0x3635c9adc5dea00000" }, - "da7732f02f2e272eaf28df972ecc0ddeed9cf498": { - "balance": "205274000000000000000" + "0xda7732f02f2e272eaf28df972ecc0ddeed9cf498": { + "balance": "0xb20bfbf6967890000" }, - "bf09d77048e270b662330e9486b38b43cd781495": { - "balance": "436000000000000000000000" + "0xbf09d77048e270b662330e9486b38b43cd781495": { + "balance": "0x5c539b7bf4ff28800000" }, - "619f171445d42b02e2e07004ad8afe694fa53d6a": { - "balance": "20000000000000000000" + "0x619f171445d42b02e2e07004ad8afe694fa53d6a": { + "balance": "0x1158e460913d00000" }, - "2bdd03bebbee273b6ca1059b34999a5bbd61bb79": { - "balance": "20000000000000000000" + "0x2bdd03bebbee273b6ca1059b34999a5bbd61bb79": { + "balance": "0x1158e460913d00000" }, - "8da1d359ba6cb4bcc57d7a437720d55db2f01c72": { - "balance": "80000000000000000000" + "0x8da1d359ba6cb4bcc57d7a437720d55db2f01c72": { + "balance": "0x4563918244f400000" }, - "be935793f45b70d8045d2654d8dd3ad24b5b6137": { - "balance": "880000000000000000000" + "0xbe935793f45b70d8045d2654d8dd3ad24b5b6137": { + "balance": "0x2fb474098f67c00000" }, - "ee71793e3acf12a7274f563961f537529d89c7de": { - "balance": "2000000000000000000000" + "0xee71793e3acf12a7274f563961f537529d89c7de": { + "balance": "0x6c6b935b8bbd400000" }, - "86f05d19063e9369c6004eb3f123943a7cff4eab": { - "balance": "1999944000000000000000" + "0x86f05d19063e9369c6004eb3f123943a7cff4eab": { + "balance": "0x6c6acc67d7b1d40000" }, - "87b10f9c280098179a2b76e9ce90be61fc844d0d": { - "balance": "1337000000000000000000" + "0x87b10f9c280098179a2b76e9ce90be61fc844d0d": { + "balance": "0x487a9a304539440000" }, - "243c84d12420570cc4ef3baba1c959c283249520": { - "balance": "2345000000000000000000" + "0x243c84d12420570cc4ef3baba1c959c283249520": { + "balance": "0x7f1f6993a853040000" }, - "6bc85acd5928722ef5095331ee88f484b8cf8357": { - "balance": "180000000000000000000" + "0x6bc85acd5928722ef5095331ee88f484b8cf8357": { + "balance": "0x9c2007651b2500000" }, - "2561a138dcf83bd813e0e7f108642be3de3d6f05": { - "balance": "999940000000000000000" + "0x2561a138dcf83bd813e0e7f108642be3de3d6f05": { + "balance": "0x3634f48417401a0000" }, - "7d0350e40b338dda736661872be33f1f9752d755": { - "balance": "49933000000000000000" + "0x7d0350e40b338dda736661872be33f1f9752d755": { + "balance": "0x2b4f5a6f191948000" }, - "e5dc9349cb52e161196122cf87a38936e2c57f34": { - "balance": "2000000000000000000000" + "0xe5dc9349cb52e161196122cf87a38936e2c57f34": { + "balance": "0x6c6b935b8bbd400000" }, - "543a8c0efb8bcd15c543e2a6a4f807597631adef": { - "balance": "5893800000000000000000" + "0x543a8c0efb8bcd15c543e2a6a4f807597631adef": { + "balance": "0x13f80e7e14f2d440000" }, - "0413d0cf78c001898a378b918cd6e498ea773c4d": { - "balance": "280000000000000000000" + "0x0413d0cf78c001898a378b918cd6e498ea773c4d": { + "balance": "0xf2dc7d47f15600000" }, - "3708e59de6b4055088782902e0579c7201a8bf50": { - "balance": "200000000000000000000000" + "0x3708e59de6b4055088782902e0579c7201a8bf50": { + "balance": "0x2a5a058fc295ed000000" }, - "699fc6d68a4775573c1dcdaec830fefd50397c4e": { - "balance": "60000000000000000000" + "0x699fc6d68a4775573c1dcdaec830fefd50397c4e": { + "balance": "0x340aad21b3b700000" }, - "379a7f755a81a17edb7daaa28afc665dfa6be63a": { - "balance": "25000000000000000000" + "0x379a7f755a81a17edb7daaa28afc665dfa6be63a": { + "balance": "0x15af1d78b58c40000" }, - "260a230e4465077e0b14ee4442a482d5b0c914bf": { - "balance": "1677935000000000000000" + "0x260a230e4465077e0b14ee4442a482d5b0c914bf": { + "balance": "0x5af606a06b5b118000" }, - "3daa01ceb70eaf9591fa521ba4a27ea9fb8ede4a": { - "balance": "1667400000000000000000" + "0x3daa01ceb70eaf9591fa521ba4a27ea9fb8ede4a": { + "balance": "0x5a63d2c9bc76540000" }, - "7f3a1e45f67e92c880e573b43379d71ee089db54": { - "balance": "100000000000000000000000" + "0x7f3a1e45f67e92c880e573b43379d71ee089db54": { + "balance": "0x152d02c7e14af6800000" }, - "38643babea6011316cc797d9b093c897a17bdae7": { - "balance": "334400000000000000000" + "0x38643babea6011316cc797d9b093c897a17bdae7": { + "balance": "0x1220bb7445daa00000" }, - "84675e9177726d45eaa46b3992a340ba7f710c95": { - "balance": "1000000000000000000000" + "0x84675e9177726d45eaa46b3992a340ba7f710c95": { + "balance": "0x3635c9adc5dea00000" }, - "0f83461ba224bb1e8fdd9dae535172b735acb4e0": { - "balance": "200000000000000000000" + "0x0f83461ba224bb1e8fdd9dae535172b735acb4e0": { + "balance": "0xad78ebc5ac6200000" }, - "31aa3b1ebe8c4dbcb6a708b1d74831e60e497660": { - "balance": "400000000000000000000" + "0x31aa3b1ebe8c4dbcb6a708b1d74831e60e497660": { + "balance": "0x15af1d78b58c400000" }, - "a32cf7dde20c3dd5679ff5e325845c70c5962662": { - "balance": "20000000000000000000" + "0xa32cf7dde20c3dd5679ff5e325845c70c5962662": { + "balance": "0x1158e460913d00000" }, - "c007f0bdb6e7009202b7af3ea90902697c721413": { - "balance": "2999966000000000000000" + "0xc007f0bdb6e7009202b7af3ea90902697c721413": { + "balance": "0xa2a0e43e7fb9830000" }, - "05c64004a9a826e94e5e4ee267fa2a7632dd4e6f": { - "balance": "16191931000000000000000" + "0x05c64004a9a826e94e5e4ee267fa2a7632dd4e6f": { + "balance": "0x36dc42ebff90b7f8000" }, - "f622e584a6623eaaf99f2be49e5380c5cbcf5cd8": { - "balance": "200000000000000000000" + "0xf622e584a6623eaaf99f2be49e5380c5cbcf5cd8": { + "balance": "0xad78ebc5ac6200000" }, - "9dc10fa38f9fb06810e11f60173ec3d2fd6a751e": { - "balance": "1970000000000000000000" + "0x9dc10fa38f9fb06810e11f60173ec3d2fd6a751e": { + "balance": "0x6acb3df27e1f880000" }, - "423c3107f4bace414e499c64390a51f74615ca5e": { - "balance": "2000000000000000000000" + "0x423c3107f4bace414e499c64390a51f74615ca5e": { + "balance": "0x6c6b935b8bbd400000" }, - "92438e5203b6346ff886d7c36288aacccc78ceca": { - "balance": "1000000000000000000000" + "0x92438e5203b6346ff886d7c36288aacccc78ceca": { + "balance": "0x3635c9adc5dea00000" }, - "bef07d97c3481f9d6aee1c98f9d91a180a32442b": { - "balance": "100000000000000000000000" + "0xbef07d97c3481f9d6aee1c98f9d91a180a32442b": { + "balance": "0x152d02c7e14af6800000" }, - "55aa5d313ebb084da0e7801091e29e92c5dec3aa": { - "balance": "2000000000000000000000" + "0x55aa5d313ebb084da0e7801091e29e92c5dec3aa": { + "balance": "0x6c6b935b8bbd400000" }, - "89c433d601fad714da6369308fd26c1dc9942bbf": { - "balance": "2000000000000000000000" + "0x89c433d601fad714da6369308fd26c1dc9942bbf": { + "balance": "0x6c6b935b8bbd400000" }, - "25106ab6755df86d6b63a187703b0cfea0e594a0": { - "balance": "27400000000000000000" + "0x25106ab6755df86d6b63a187703b0cfea0e594a0": { + "balance": "0x17c405ad41db40000" }, - "494256e99b0f9cd6e5ebca3899863252900165c8": { - "balance": "14000000000000000000000" + "0x494256e99b0f9cd6e5ebca3899863252900165c8": { + "balance": "0x2f6f10780d22cc00000" }, - "5f4ace4c1cc13391e01f00b198e1f20b5f91cbf5": { - "balance": "5000196000000000000000" + "0x5f4ace4c1cc13391e01f00b198e1f20b5f91cbf5": { + "balance": "0x10f0fa8b9d3811a0000" }, - "135cecd955e5798370769230159303d9b1839f66": { - "balance": "5000000000000000000000" + "0x135cecd955e5798370769230159303d9b1839f66": { + "balance": "0x10f0cf064dd59200000" }, - "ced81ec3533ff1bfebf3e3843ee740ad11758d3e": { - "balance": "1970000000000000000000" + "0xced81ec3533ff1bfebf3e3843ee740ad11758d3e": { + "balance": "0x6acb3df27e1f880000" }, - "688eb3853bbcc50ecfee0fa87f0ab693cabdef02": { - "balance": "31600000000000000000000" + "0x688eb3853bbcc50ecfee0fa87f0ab693cabdef02": { + "balance": "0x6b10a18400647c00000" }, - "2159240813a73095a7ebf7c3b3743e8028ae5f09": { - "balance": "2000000000000000000000" + "0x2159240813a73095a7ebf7c3b3743e8028ae5f09": { + "balance": "0x6c6b935b8bbd400000" }, - "99d1579cd42682b7644e1d4f7128441eeffe339d": { - "balance": "20000000000000000000000" + "0x99d1579cd42682b7644e1d4f7128441eeffe339d": { + "balance": "0x43c33c1937564800000" }, - "8a243a0a9fea49b839547745ff2d11af3f4b0522": { - "balance": "985000000000000000000" + "0x8a243a0a9fea49b839547745ff2d11af3f4b0522": { + "balance": "0x35659ef93f0fc40000" }, - "c1a41a5a27199226e4c7eb198b031b59196f9842": { - "balance": "191000000000000000000" + "0xc1a41a5a27199226e4c7eb198b031b59196f9842": { + "balance": "0xa5aa85009e39c0000" }, - "7514adbdc63f483f304d8e94b67ff3309f180b82": { - "balance": "622911000000000000000" + "0x7514adbdc63f483f304d8e94b67ff3309f180b82": { + "balance": "0x21c4a06e2d13598000" }, - "74aeec915de01cc69b2cb5a6356feea14658c6c5": { - "balance": "232500000000000000000" + "0x74aeec915de01cc69b2cb5a6356feea14658c6c5": { + "balance": "0xc9a95ee2986520000" }, - "76f9ad3d9bbd04ae055c1477c0c35e7592cb2a20": { - "balance": "40200000000000000000000" + "0x76f9ad3d9bbd04ae055c1477c0c35e7592cb2a20": { + "balance": "0x8833f11e3458f200000" }, - "a8a7b68adab4e3eadff19ffa58e34a3fcec0d96a": { - "balance": "6000000000000000000000" + "0xa8a7b68adab4e3eadff19ffa58e34a3fcec0d96a": { + "balance": "0x14542ba12a337c00000" }, - "60de22a1507432a47b01cc68c52a0bf8a2e0d098": { - "balance": "19100000000000000000" + "0x60de22a1507432a47b01cc68c52a0bf8a2e0d098": { + "balance": "0x10910d4cdc9f60000" }, - "ceb33d78e7547a9da2e87d51aec5f3441c87923a": { - "balance": "20000000000000000000" + "0xceb33d78e7547a9da2e87d51aec5f3441c87923a": { + "balance": "0x1158e460913d00000" }, - "432809a2390f07c665921ff37d547d12f1c9966a": { - "balance": "30000000000000000000000" + "0x432809a2390f07c665921ff37d547d12f1c9966a": { + "balance": "0x65a4da25d3016c00000" }, - "d5e656a1b916f9bf45afb07dd8afaf73b4c56f41": { - "balance": "97000000000000000000" + "0xd5e656a1b916f9bf45afb07dd8afaf73b4c56f41": { + "balance": "0x542253a126ce40000" }, - "e3410bb7557cf91d79fa69d0dfea0aa075402651": { - "balance": "2000000000000000000000" + "0xe3410bb7557cf91d79fa69d0dfea0aa075402651": { + "balance": "0x6c6b935b8bbd400000" }, - "dee942d5caf5fac11421d86b010b458e5c392990": { - "balance": "4000000000000000000000" + "0xdee942d5caf5fac11421d86b010b458e5c392990": { + "balance": "0xd8d726b7177a800000" }, - "a98f109835f5eacd0543647c34a6b269e3802fac": { - "balance": "400000000000000000000" + "0xa98f109835f5eacd0543647c34a6b269e3802fac": { + "balance": "0x15af1d78b58c400000" }, - "932b9c04d40d2ac83083d94298169dae81ab2ed0": { - "balance": "2000000000000000000000" + "0x932b9c04d40d2ac83083d94298169dae81ab2ed0": { + "balance": "0x6c6b935b8bbd400000" }, - "ba10f2764290f875434372f79dbf713801caac01": { - "balance": "955000000000000000000" + "0xba10f2764290f875434372f79dbf713801caac01": { + "balance": "0x33c5499031720c0000" }, - "a2c7eaffdc2c9d937345206c909a52dfb14c478f": { - "balance": "143000000000000000000" + "0xa2c7eaffdc2c9d937345206c909a52dfb14c478f": { + "balance": "0x7c0860e5a80dc0000" }, - "6c67e0d7b62e2a08506945a5dfe38263339f1f22": { - "balance": "1970000000000000000000" + "0x6c67e0d7b62e2a08506945a5dfe38263339f1f22": { + "balance": "0x6acb3df27e1f880000" }, - "60c3714fdddb634659e4a2b1ea42c4728cc7b8ba": { - "balance": "13370000000000000000" + "0x60c3714fdddb634659e4a2b1ea42c4728cc7b8ba": { + "balance": "0xb98bc829a6f90000" }, - "73b4d499de3f38bf35aaf769a6e318bc6d123692": { - "balance": "2000000000000000000000" + "0x73b4d499de3f38bf35aaf769a6e318bc6d123692": { + "balance": "0x6c6b935b8bbd400000" }, - "3b22dea3c25f1b59c7bd27bb91d3a3eaecef3984": { - "balance": "100000000000000000000" + "0x3b22dea3c25f1b59c7bd27bb91d3a3eaecef3984": { + "balance": "0x56bc75e2d63100000" }, - "1e3badb1b6e1380e27039c576ae6222e963a5b53": { - "balance": "20000000000000000000000" + "0x1e3badb1b6e1380e27039c576ae6222e963a5b53": { + "balance": "0x43c33c1937564800000" }, - "abd4d6c1666358c0406fdf3af248f78ece830104": { - "balance": "2112000000000000000000" + "0xabd4d6c1666358c0406fdf3af248f78ece830104": { + "balance": "0x727de34a24f9000000" }, - "0c925ad5eb352c8ef76d0c222d115b0791b962a1": { - "balance": "3180000000000000000000" + "0x0c925ad5eb352c8ef76d0c222d115b0791b962a1": { + "balance": "0xac635d7fa34e300000" }, - "be9186c34a52514abb9107860f674f97b821bd5b": { - "balance": "509600000000000000000" + "0xbe9186c34a52514abb9107860f674f97b821bd5b": { + "balance": "0x1ba01ee40603100000" }, - "b7f67314cb832e32e63b15a40ce0d7ffbdb26985": { - "balance": "1060866000000000000000" + "0xb7f67314cb832e32e63b15a40ce0d7ffbdb26985": { + "balance": "0x398279264a818d0000" }, - "3f30d3bc9f602232bc724288ca46cd0b0788f715": { - "balance": "4000000000000000000000" + "0x3f30d3bc9f602232bc724288ca46cd0b0788f715": { + "balance": "0xd8d726b7177a800000" }, - "970abd53a54fca4a6429207c182d4d57bb39d4a0": { - "balance": "2000000000000000000000" + "0x970abd53a54fca4a6429207c182d4d57bb39d4a0": { + "balance": "0x6c6b935b8bbd400000" }, - "36d85dc3683156e63bf880a9fab7788cf8143a27": { - "balance": "20000000000000000000000" + "0x36d85dc3683156e63bf880a9fab7788cf8143a27": { + "balance": "0x43c33c1937564800000" }, - "2836123046b284e5ef102bfd22b1765e508116ad": { - "balance": "411880000000000000000" + "0x2836123046b284e5ef102bfd22b1765e508116ad": { + "balance": "0x1653fbb5c427e40000" }, - "de06d5ea777a4eb1475e605dbcbf43444e8037ea": { - "balance": "50000000000000000000000" + "0xde06d5ea777a4eb1475e605dbcbf43444e8037ea": { + "balance": "0xa968163f0a57b400000" }, - "9af11399511c213181bfda3a8b264c05fc81b3ce": { - "balance": "14000000000000000000000" + "0x9af11399511c213181bfda3a8b264c05fc81b3ce": { + "balance": "0x2f6f10780d22cc00000" }, - "e2191215983f33fd33e22cd4a2490054da53fddc": { - "balance": "15800000000000000000" + "0xe2191215983f33fd33e22cd4a2490054da53fddc": { + "balance": "0xdb44e049bb2c0000" }, - "2eebf59432b52892f9380bd140aa99dcf8ad0c0f": { - "balance": "152000000000000000000" + "0x2eebf59432b52892f9380bd140aa99dcf8ad0c0f": { + "balance": "0x83d6c7aab63600000" }, - "dc087f9390fb9e976ac23ab689544a0942ec2021": { - "balance": "1820000000000000000000" + "0xdc087f9390fb9e976ac23ab689544a0942ec2021": { + "balance": "0x62a992e53a0af00000" }, - "fd4b989558ae11be0c3b36e2d6f2a54a9343ca2e": { - "balance": "2000000000000000000000" + "0xfd4b989558ae11be0c3b36e2d6f2a54a9343ca2e": { + "balance": "0x6c6b935b8bbd400000" }, - "770c2fb2c4a81753ac0182ea460ec09c90a516f8": { - "balance": "20000000000000000000" + "0x770c2fb2c4a81753ac0182ea460ec09c90a516f8": { + "balance": "0x1158e460913d00000" }, - "b28dbfc6499894f73a71faa00abe0f4bc9d19f2a": { - "balance": "100000000000000000000" + "0xb28dbfc6499894f73a71faa00abe0f4bc9d19f2a": { + "balance": "0x56bc75e2d63100000" }, - "b0cef8e8fb8984a6019f01c679f272bbe68f5c77": { - "balance": "152000000000000000000" + "0xb0cef8e8fb8984a6019f01c679f272bbe68f5c77": { + "balance": "0x83d6c7aab63600000" }, - "f400f93d5f5c7e3fc303129ac8fb0c2f786407fa": { - "balance": "2000000000000000000000" + "0xf400f93d5f5c7e3fc303129ac8fb0c2f786407fa": { + "balance": "0x6c6b935b8bbd400000" }, - "f2133431d1d9a37ba2f0762bc40c5acc8aa6978e": { - "balance": "2000000000000000000000" + "0xf2133431d1d9a37ba2f0762bc40c5acc8aa6978e": { + "balance": "0x6c6b935b8bbd400000" }, - "9003d270891ba2df643da8341583193545e3e000": { - "balance": "4000000000000000000000" + "0x9003d270891ba2df643da8341583193545e3e000": { + "balance": "0xd8d726b7177a800000" }, - "8938d1b4daee55a54d738cf17e4477f6794e46f7": { - "balance": "18200000000000000000" + "0x8938d1b4daee55a54d738cf17e4477f6794e46f7": { + "balance": "0xfc936392801c0000" }, - "98e6f547db88e75f1f9c8ac2c5cf1627ba580b3e": { - "balance": "1000000000000000000000" + "0x98e6f547db88e75f1f9c8ac2c5cf1627ba580b3e": { + "balance": "0x3635c9adc5dea00000" }, - "009fdbf44e1f4a6362b769c39a475f95a96c2bc7": { - "balance": "564000000000000000000" + "0x009fdbf44e1f4a6362b769c39a475f95a96c2bc7": { + "balance": "0x1e931283ccc8500000" }, - "d0f9597811b0b992bb7d3757aa25b4c2561d32e2": { - "balance": "500000000000000000000" + "0xd0f9597811b0b992bb7d3757aa25b4c2561d32e2": { + "balance": "0x1b1ae4d6e2ef500000" }, - "dcd10c55bb854f754434f1219c2c9a98ace79f03": { - "balance": "4000086000000000000000" + "0xdcd10c55bb854f754434f1219c2c9a98ace79f03": { + "balance": "0xd8d8583fa2d52f0000" }, - "67048f3a12a4dd1f626c64264cb1d7971de2ca38": { - "balance": "180000000000000000000" + "0x67048f3a12a4dd1f626c64264cb1d7971de2ca38": { + "balance": "0x9c2007651b2500000" }, - "d33cf82bf14c592640a08608914c237079d5be34": { - "balance": "2000000000000000000000" + "0xd33cf82bf14c592640a08608914c237079d5be34": { + "balance": "0x6c6b935b8bbd400000" }, - "f5b068989df29c253577d0405ade6e0e7528f89e": { - "balance": "1610000000000000000000" + "0xf5b068989df29c253577d0405ade6e0e7528f89e": { + "balance": "0x57473d05dabae80000" }, - "a9a8eca11a23d64689a2aa3e417dbb3d336bb59a": { - "balance": "262025000000000000000" + "0xa9a8eca11a23d64689a2aa3e417dbb3d336bb59a": { + "balance": "0xe3453cd3b67ba8000" }, - "99413704b1a32e70f3bc0d69dd881c38566b54cb": { - "balance": "27382708000000000000000" + "0x99413704b1a32e70f3bc0d69dd881c38566b54cb": { + "balance": "0x5cc6b694631f7120000" }, - "2a085e25b64862f5e68d768e2b0f7a8529858eee": { - "balance": "1983618000000000000000" + "0x2a085e25b64862f5e68d768e2b0f7a8529858eee": { + "balance": "0x6b883acd5766cd0000" }, - "833d3fae542ad5f8b50ce19bde2bec579180c88c": { - "balance": "346000000000000000000" + "0x833d3fae542ad5f8b50ce19bde2bec579180c88c": { + "balance": "0x12c1b6eed03d280000" }, - "c3483d6e88ac1f4ae73cc4408d6c03abe0e49dca": { - "balance": "17000000000000000000000" + "0xc3483d6e88ac1f4ae73cc4408d6c03abe0e49dca": { + "balance": "0x39992648a23c8a00000" }, - "fde395bc0b6d5cbb4c1d8fea3e0b4bff635e9db7": { - "balance": "2000000000000000000000" + "0xfde395bc0b6d5cbb4c1d8fea3e0b4bff635e9db7": { + "balance": "0x6c6b935b8bbd400000" }, - "eddacd94ec89a2ef968fcf977a08f1fae2757869": { - "balance": "8000000000000000000000" + "0xeddacd94ec89a2ef968fcf977a08f1fae2757869": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "dc29119745d2337320da51e19100c948d980b915": { - "balance": "160000000000000000000" + "0xdc29119745d2337320da51e19100c948d980b915": { + "balance": "0x8ac7230489e800000" }, - "640bf87415e0cf407301e5599a68366da09bbac8": { - "balance": "493207000000000000000" + "0x640bf87415e0cf407301e5599a68366da09bbac8": { + "balance": "0x1abc9f416098158000" }, - "afcc7dbb8356d842d43ae7e23c8422b022a30803": { - "balance": "30400000000000000000000" + "0xafcc7dbb8356d842d43ae7e23c8422b022a30803": { + "balance": "0x66ffcbfd5e5a3000000" }, - "9120e71173e1ba19ba8f9f4fdbdcaa34e1d6bb78": { - "balance": "2000000000000000000000" + "0x9120e71173e1ba19ba8f9f4fdbdcaa34e1d6bb78": { + "balance": "0x6c6b935b8bbd400000" }, - "9092918707c621fdbd1d90fb80eb787fd26f7350": { - "balance": "2460000000000000000000" + "0x9092918707c621fdbd1d90fb80eb787fd26f7350": { + "balance": "0x855b5ba65c84f00000" }, - "263e57dacbe0149f82fe65a2664898866ff5b463": { - "balance": "38000000000000000000000" + "0x263e57dacbe0149f82fe65a2664898866ff5b463": { + "balance": "0x80bfbefcb5f0bc00000" }, - "315db7439fa1d5b423afa7dd7198c1cf74c918bc": { - "balance": "600000000000000000000" + "0x315db7439fa1d5b423afa7dd7198c1cf74c918bc": { + "balance": "0x2086ac351052600000" }, - "09b4668696f86a080f8bebb91db8e6f87015915a": { - "balance": "656010000000000000000" + "0x09b4668696f86a080f8bebb91db8e6f87015915a": { + "balance": "0x238ff7b34f60010000" }, - "5c31996dcac015f9be985b611f468730ef244d90": { - "balance": "200000000000000000000" + "0x5c31996dcac015f9be985b611f468730ef244d90": { + "balance": "0xad78ebc5ac6200000" }, - "b1179589e19db9d41557bbec1cb24ccc2dec1c7f": { - "balance": "100000000000000000000000" + "0xb1179589e19db9d41557bbec1cb24ccc2dec1c7f": { + "balance": "0x152d02c7e14af6800000" }, - "3b1937d5e793b89b63fb8eb5f1b1c9ca6ba0fa8e": { - "balance": "2000000000000000000000" + "0x3b1937d5e793b89b63fb8eb5f1b1c9ca6ba0fa8e": { + "balance": "0x6c6b935b8bbd400000" }, - "c9127b7f6629ee13fc3f60bc2f4467a20745a762": { - "balance": "16465639000000000000000" + "0xc9127b7f6629ee13fc3f60bc2f4467a20745a762": { + "balance": "0x37c9aa4e7ce421d8000" }, - "7306de0e288b56cfdf987ef0d3cc29660793f6dd": { - "balance": "508060000000000000000" + "0x7306de0e288b56cfdf987ef0d3cc29660793f6dd": { + "balance": "0x1b8abfb62ec8f60000" }, - "2aa192777ca5b978b6b2c2ff800ac1860f753f47": { - "balance": "335000000000000000000" + "0x2aa192777ca5b978b6b2c2ff800ac1860f753f47": { + "balance": "0x12290f15180bdc0000" }, - "55da9dcdca61cbfe1f133c7bcefc867b9c8122f9": { - "balance": "880000000000000000000" + "0x55da9dcdca61cbfe1f133c7bcefc867b9c8122f9": { + "balance": "0x2fb474098f67c00000" }, - "cdd9efac4d6d60bd71d95585dce5d59705c13564": { - "balance": "100000000000000000000" + "0xcdd9efac4d6d60bd71d95585dce5d59705c13564": { + "balance": "0x56bc75e2d63100000" }, - "ad8e48a377695de014363a523a28b1a40c78f208": { - "balance": "1000000000000000000000" + "0xad8e48a377695de014363a523a28b1a40c78f208": { + "balance": "0x3635c9adc5dea00000" }, - "252b6555afdc80f2d96d972d17db84ea5ad521ac": { - "balance": "7880000000000000000000" + "0x252b6555afdc80f2d96d972d17db84ea5ad521ac": { + "balance": "0x1ab2cf7c9f87e200000" }, - "60ab71cd26ea6d6e59a7a0f627ee079c885ebbf6": { - "balance": "26740000000000000000" + "0x60ab71cd26ea6d6e59a7a0f627ee079c885ebbf6": { + "balance": "0x1731790534df20000" }, - "f40b134fea22c6b29c8457f49f000f9cda789adb": { - "balance": "600000000000000000000" + "0xf40b134fea22c6b29c8457f49f000f9cda789adb": { + "balance": "0x2086ac351052600000" }, - "85a2f6ea94d05e8c1d9ae2f4910338a358e98ded": { - "balance": "2000000000000000000000" + "0x85a2f6ea94d05e8c1d9ae2f4910338a358e98ded": { + "balance": "0x6c6b935b8bbd400000" }, - "ae13a08511110f32e53be4127845c843a1a57c7b": { - "balance": "500000000000000000000" + "0xae13a08511110f32e53be4127845c843a1a57c7b": { + "balance": "0x1b1ae4d6e2ef500000" }, - "40db1ba585ce34531edec5494849391381e6ccd3": { - "balance": "1790000000000000000000" + "0x40db1ba585ce34531edec5494849391381e6ccd3": { + "balance": "0x61093d7c2c6d380000" }, - "0c5589a7a89b9ad15b02751930415948a875fbef": { - "balance": "126000000000000000000" + "0x0c5589a7a89b9ad15b02751930415948a875fbef": { + "balance": "0x6d499ec6c63380000" }, - "89054430dcdc28ac15fa635ef87c105e602bf70c": { - "balance": "108000000000000000000" + "0x89054430dcdc28ac15fa635ef87c105e602bf70c": { + "balance": "0x5dacd13ca9e300000" }, - "6c882c27732cef5c7c13a686f0a2ea77555ac289": { - "balance": "100000000000000000000000" + "0x6c882c27732cef5c7c13a686f0a2ea77555ac289": { + "balance": "0x152d02c7e14af6800000" }, - "de374299c1d07d79537385190f442ef9ca24061f": { - "balance": "133700000000000000000" + "0xde374299c1d07d79537385190f442ef9ca24061f": { + "balance": "0x73f75d1a085ba0000" }, - "b146a0b925553cf06fcaf54a1b4dfea621290757": { - "balance": "2000200000000000000000" + "0xb146a0b925553cf06fcaf54a1b4dfea621290757": { + "balance": "0x6c6e59e67c78540000" }, - "09ae49e37f121df5dc158cfde806f173a06b0c7f": { - "balance": "3988000000000000000000" + "0x09ae49e37f121df5dc158cfde806f173a06b0c7f": { + "balance": "0xd8309e26aba1d00000" }, - "b758896f1baa864f17ebed16d953886fee68aae6": { - "balance": "1000000000000000000000" + "0xb758896f1baa864f17ebed16d953886fee68aae6": { + "balance": "0x3635c9adc5dea00000" }, - "30730466b8eb6dc90d5496aa76a3472d7dbe0bbe": { - "balance": "1999800000000000000000" + "0x30730466b8eb6dc90d5496aa76a3472d7dbe0bbe": { + "balance": "0x6c68ccd09b022c0000" }, - "fc02734033e57f70517e0afc7ee62461f06fad8e": { - "balance": "394000000000000000000" + "0xfc02734033e57f70517e0afc7ee62461f06fad8e": { + "balance": "0x155bd9307f9fe80000" }, - "a9b2d2e0494eab18e07d37bbb856d80e80f84cd3": { - "balance": "10000000000000000000000" + "0xa9b2d2e0494eab18e07d37bbb856d80e80f84cd3": { + "balance": "0x21e19e0c9bab2400000" }, - "95278b08dee7c0f2c8c0f722f9fcbbb9a5241fda": { - "balance": "2408672000000000000000" + "0x95278b08dee7c0f2c8c0f722f9fcbbb9a5241fda": { + "balance": "0x829309f64f0db00000" }, - "dab6bcdb83cf24a0ae1cb21b3b5b83c2f3824927": { - "balance": "50000000000000000000000" + "0xdab6bcdb83cf24a0ae1cb21b3b5b83c2f3824927": { + "balance": "0xa968163f0a57b400000" }, - "94439ca9cc169a79d4a09cae5e67764a6f871a21": { - "balance": "240000000000000000000" + "0x94439ca9cc169a79d4a09cae5e67764a6f871a21": { + "balance": "0xd02ab486cedc00000" }, - "e06c29a81517e0d487b67fb0b6aabc4f57368388": { - "balance": "401100000000000000000" + "0xe06c29a81517e0d487b67fb0b6aabc4f57368388": { + "balance": "0x15be6174e1912e0000" }, - "458e3cc99e947844a18e6a42918fef7e7f5f5eb3": { - "balance": "36400000000000000000000" + "0x458e3cc99e947844a18e6a42918fef7e7f5f5eb3": { + "balance": "0x7b53f79e888dac00000" }, - "0a9804137803ba6868d93a55f9985fcd540451e4": { - "balance": "13370000000000000000" + "0x0a9804137803ba6868d93a55f9985fcd540451e4": { + "balance": "0xb98bc829a6f90000" }, - "40630024bd2c58d248edd8465617b2bf1647da0e": { - "balance": "1000000000000000000000" + "0x40630024bd2c58d248edd8465617b2bf1647da0e": { + "balance": "0x3635c9adc5dea00000" }, - "15224ad1c0face46f9f556e4774a3025ad06bd52": { - "balance": "13370000000000000000" + "0x15224ad1c0face46f9f556e4774a3025ad06bd52": { + "balance": "0xb98bc829a6f90000" }, - "2e2810dee44ae4dff3d86342ab126657d653c336": { - "balance": "200000000000000000000" + "0x2e2810dee44ae4dff3d86342ab126657d653c336": { + "balance": "0xad78ebc5ac6200000" }, - "48a30de1c919d3fd3180e97d5f2b2a9dbd964d2d": { - "balance": "44000000000000000000" + "0x48a30de1c919d3fd3180e97d5f2b2a9dbd964d2d": { + "balance": "0x2629f66e0c5300000" }, - "46a30b8a808931217445c3f5a93e882c0345b426": { - "balance": "250019000000000000000" + "0x46a30b8a808931217445c3f5a93e882c0345b426": { + "balance": "0xd8db5ebd7b2638000" }, - "455396a4bbd9bae8af9fb7c4d64d471db9c24505": { - "balance": "161000000000000000000" + "0x455396a4bbd9bae8af9fb7c4d64d471db9c24505": { + "balance": "0x8ba52e6fc45e40000" }, - "edfda2d5db98f9380714664d54b4ee971a1cae03": { - "balance": "40044000000000000000" + "0xedfda2d5db98f9380714664d54b4ee971a1cae03": { + "balance": "0x22bb8ddd679be0000" }, - "f5eadcd2d1b8657a121f33c458a8b13e76b65526": { - "balance": "249828000000000000000" + "0xf5eadcd2d1b8657a121f33c458a8b13e76b65526": { + "balance": "0xd8b0f5a5ac24a0000" }, - "90e7070f4d033fe6910c9efe5a278e1fc6234def": { - "balance": "100392000000000000000" + "0x90e7070f4d033fe6910c9efe5a278e1fc6234def": { + "balance": "0x571380819b3040000" }, - "d55508adbbbe9be81b80f97a6ea89add68da674f": { - "balance": "2000000000000000000000" + "0xd55508adbbbe9be81b80f97a6ea89add68da674f": { + "balance": "0x6c6b935b8bbd400000" }, - "66925de3e43f4b41bf9dadde27d5488ef569ea0d": { - "balance": "39400000000000000000" + "0x66925de3e43f4b41bf9dadde27d5488ef569ea0d": { + "balance": "0x222c8eb3ff6640000" }, - "b7c077946674ba9341fb4c747a5d50f5d2da6415": { - "balance": "1000000000000000000000" + "0xb7c077946674ba9341fb4c747a5d50f5d2da6415": { + "balance": "0x3635c9adc5dea00000" }, - "c52d1a0c73c2a1be84915185f8b34faa0adf1de3": { - "balance": "1400001000000000000000" + "0xc52d1a0c73c2a1be84915185f8b34faa0adf1de3": { + "balance": "0x4be4eab3fa0fa68000" }, - "79b8aad879dd30567e8778d2d231c8f37ab8734e": { - "balance": "2000000000000000000000" + "0x79b8aad879dd30567e8778d2d231c8f37ab8734e": { + "balance": "0x6c6b935b8bbd400000" }, - "3aae4872fd9093cbcad1406f1e8078bab50359e2": { - "balance": "39400000000000000000" + "0x3aae4872fd9093cbcad1406f1e8078bab50359e2": { + "balance": "0x222c8eb3ff6640000" }, - "b2e9d76bf50fc36bf7d3944b63e9ca889b699968": { - "balance": "2660000000000000000000" + "0xb2e9d76bf50fc36bf7d3944b63e9ca889b699968": { + "balance": "0x9032ea62b74b100000" }, - "405f596b94b947344c033ce2dcbff12e25b79784": { - "balance": "2000000000000000000000" + "0x405f596b94b947344c033ce2dcbff12e25b79784": { + "balance": "0x6c6b935b8bbd400000" }, - "232cb1cd49993c144a3f88b3611e233569a86bd6": { - "balance": "15576000000000000000000" + "0x232cb1cd49993c144a3f88b3611e233569a86bd6": { + "balance": "0x34c606c42d0ac600000" }, - "9e232c08c14dc1a6ed0b8a3b2868977ba5c17d10": { - "balance": "20000000000000000000" + "0x9e232c08c14dc1a6ed0b8a3b2868977ba5c17d10": { + "balance": "0x1158e460913d00000" }, - "095270cc42141dd998ad2862dbd1fe9b44e7e650": { - "balance": "1200000000000000000000" + "0x095270cc42141dd998ad2862dbd1fe9b44e7e650": { + "balance": "0x410d586a20a4c00000" }, - "15d99468507aa0413fb60dca2adc7f569cb36b54": { - "balance": "2000000000000000000000" + "0x15d99468507aa0413fb60dca2adc7f569cb36b54": { + "balance": "0x6c6b935b8bbd400000" }, - "04852732b4c652f6c2e58eb36587e60a62da14db": { - "balance": "20000000000000000000000" + "0x04852732b4c652f6c2e58eb36587e60a62da14db": { + "balance": "0x43c33c1937564800000" }, - "ecf24cdd7c22928c441e694de4aa31b0fab59778": { - "balance": "600000000000000000000" + "0xecf24cdd7c22928c441e694de4aa31b0fab59778": { + "balance": "0x2086ac351052600000" }, - "512b91bbfaa9e581ef683fc90d9db22a8f49f48b": { - "balance": "310000000000000000000000" + "0x512b91bbfaa9e581ef683fc90d9db22a8f49f48b": { + "balance": "0x41a522386d9b95c00000" }, - "a88577a073fbaf33c4cd202e00ea70ef711b4006": { - "balance": "2000000000000000000000" + "0xa88577a073fbaf33c4cd202e00ea70ef711b4006": { + "balance": "0x6c6b935b8bbd400000" }, - "00acc6f082a442828764d11f58d6894ae408f073": { - "balance": "60000000000000000000000" + "0x00acc6f082a442828764d11f58d6894ae408f073": { + "balance": "0xcb49b44ba602d800000" }, - "0355bcacbd21441e95adeedc30c17218c8a408ce": { - "balance": "400000000000000000000" + "0x0355bcacbd21441e95adeedc30c17218c8a408ce": { + "balance": "0x15af1d78b58c400000" }, - "4e73cf2379f124860f73d6d91bf59acc5cfc845b": { - "balance": "40110000000000000000" + "0x4e73cf2379f124860f73d6d91bf59acc5cfc845b": { + "balance": "0x22ca3587cf4eb0000" }, - "2a742b8910941e0932830a1d9692cfd28494cf40": { - "balance": "499986000000000000000" + "0x2a742b8910941e0932830a1d9692cfd28494cf40": { + "balance": "0x1b1ab319f5ec750000" }, - "41a8c2830081b102df6e0131657c07ab635b54ce": { - "balance": "1999944000000000000000" + "0x41a8c2830081b102df6e0131657c07ab635b54ce": { + "balance": "0x6c6acc67d7b1d40000" }, - "b63064bd3355e6e07e2d377024125a33776c4afa": { - "balance": "38800000000000000000000" + "0xb63064bd3355e6e07e2d377024125a33776c4afa": { + "balance": "0x8375a2abcca24400000" }, - "1a25e1c5bc7e5f50ec16f8885f210ea1b938800e": { - "balance": "4000000000000000000000" + "0x1a25e1c5bc7e5f50ec16f8885f210ea1b938800e": { + "balance": "0xd8d726b7177a800000" }, - "09b59b8698a7fbd3d2f8c73a008988de3e406b2b": { - "balance": "40000000000000000000000" + "0x09b59b8698a7fbd3d2f8c73a008988de3e406b2b": { + "balance": "0x878678326eac9000000" }, - "c555b93156f09101233c6f7cf6eb3c4f196d3346": { - "balance": "3000000000000000000000" + "0xc555b93156f09101233c6f7cf6eb3c4f196d3346": { + "balance": "0xa2a15d09519be00000" }, - "12f32c0a1f2daab676fe69abd9e018352d4ccd45": { - "balance": "50000000000000000000" + "0x12f32c0a1f2daab676fe69abd9e018352d4ccd45": { + "balance": "0x2b5e3af16b1880000" }, - "5956b28ec7890b76fc061a1feb52d82ae81fb635": { - "balance": "2000000000000000000000" + "0x5956b28ec7890b76fc061a1feb52d82ae81fb635": { + "balance": "0x6c6b935b8bbd400000" }, - "c739259e7f85f2659bef5f609ed86b3d596c201e": { - "balance": "200000000000000000000" + "0xc739259e7f85f2659bef5f609ed86b3d596c201e": { + "balance": "0xad78ebc5ac6200000" }, - "fae92c1370e9e1859a5df83b56d0f586aa3b404c": { - "balance": "106480000000000000000" + "0xfae92c1370e9e1859a5df83b56d0f586aa3b404c": { + "balance": "0x5c5b4f3d843980000" }, - "d5a7bec332adde18b3104b5792546aa59b879b52": { - "balance": "2000000000000000000000" + "0xd5a7bec332adde18b3104b5792546aa59b879b52": { + "balance": "0x6c6b935b8bbd400000" }, - "4f88dfd01091a45a9e2676021e64286cd36b8d34": { - "balance": "1000000000000000000000" + "0x4f88dfd01091a45a9e2676021e64286cd36b8d34": { + "balance": "0x3635c9adc5dea00000" }, - "102c477d69aadba9a0b0f62b7459e17fbb1c1561": { - "balance": "2000000000000000000000" + "0x102c477d69aadba9a0b0f62b7459e17fbb1c1561": { + "balance": "0x6c6b935b8bbd400000" }, - "34272d5e7574315dcae9abbd317bac90289d4765": { - "balance": "1820000000000000000000" + "0x34272d5e7574315dcae9abbd317bac90289d4765": { + "balance": "0x62a992e53a0af00000" }, - "fe615d975c0887e0c9113ec7298420a793af8b96": { - "balance": "8000000000000000000000" + "0xfe615d975c0887e0c9113ec7298420a793af8b96": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "487adf7d70a6740f8d51cbdd68bb3f91c4a5ce68": { - "balance": "66850000000000000000" + "0x487adf7d70a6740f8d51cbdd68bb3f91c4a5ce68": { + "balance": "0x39fbae8d042dd0000" }, - "7e5d9993104e4cb545e179a2a3f971f744f98482": { - "balance": "2000000000000000000000" + "0x7e5d9993104e4cb545e179a2a3f971f744f98482": { + "balance": "0x6c6b935b8bbd400000" }, - "5529830a61c1f13c197e550beddfd6bd195c9d02": { - "balance": "10000000000000000000000" + "0x5529830a61c1f13c197e550beddfd6bd195c9d02": { + "balance": "0x21e19e0c9bab2400000" }, - "2f282abbb6d4a3c3cd3b5ca812f7643e80305f06": { - "balance": "1850000000000000000000" + "0x2f282abbb6d4a3c3cd3b5ca812f7643e80305f06": { + "balance": "0x6449e84e47a8a80000" }, - "7352586d021ad0cf77e0e928404a59f374ff4582": { - "balance": "3400000000000000000000" + "0x7352586d021ad0cf77e0e928404a59f374ff4582": { + "balance": "0xb8507a820728200000" }, - "03f7b92008813ae0a676eb212814afab35221069": { - "balance": "2000000000000000000000" + "0x03f7b92008813ae0a676eb212814afab35221069": { + "balance": "0x6c6b935b8bbd400000" }, - "056686078fb6bcf9ba0a8a8dc63a906f5feac0ea": { - "balance": "499800000000000000000" + "0x056686078fb6bcf9ba0a8a8dc63a906f5feac0ea": { + "balance": "0x1b181e4bf2343c0000" }, - "8063379a7bf2cb923a84c5093e68dac7f75481c5": { - "balance": "322102000000000000000" + "0x8063379a7bf2cb923a84c5093e68dac7f75481c5": { + "balance": "0x1176102e6e32df0000" }, - "200264a09f8c68e3e6629795280f56254f8640d0": { - "balance": "20000000000000000000" + "0x200264a09f8c68e3e6629795280f56254f8640d0": { + "balance": "0x1158e460913d00000" }, - "5a891155f50e42074374c739baadf7df2651153a": { - "balance": "4775000000000000000000" + "0x5a891155f50e42074374c739baadf7df2651153a": { + "balance": "0x102da6fd0f73a3c0000" }, - "80022a1207e910911fc92849b069ab0cdad043d3": { - "balance": "13370000000000000000" + "0x80022a1207e910911fc92849b069ab0cdad043d3": { + "balance": "0xb98bc829a6f90000" }, - "e781ec732d401202bb9bd13860910dd6c29ac0b6": { - "balance": "1240000000000000000000" + "0xe781ec732d401202bb9bd13860910dd6c29ac0b6": { + "balance": "0x433874f632cc600000" }, - "4c2f1afef7c5868c44832fc77cb03b55f89e6d6e": { - "balance": "20000000000000000000000" + "0x4c2f1afef7c5868c44832fc77cb03b55f89e6d6e": { + "balance": "0x43c33c1937564800000" }, - "34ff582952ff24458f7b13d51f0b4f987022c1fe": { - "balance": "2804400000000000000000" + "0x34ff582952ff24458f7b13d51f0b4f987022c1fe": { + "balance": "0x9806de3da6e9780000" }, - "73914b22fc2f131584247d82be4fecbf978ad4ba": { - "balance": "2000000000000000000000" + "0x73914b22fc2f131584247d82be4fecbf978ad4ba": { + "balance": "0x6c6b935b8bbd400000" }, - "562be95aba17c5371fe2ba828799b1f55d2177d6": { - "balance": "38200000000000000000000" + "0x562be95aba17c5371fe2ba828799b1f55d2177d6": { + "balance": "0x816d37e87b9d1e00000" }, - "648f5bd2a2ae8902db37847d1cb0db9390b06248": { - "balance": "7769965000000000000000" + "0x648f5bd2a2ae8902db37847d1cb0db9390b06248": { + "balance": "0x1a535ecf0760a048000" }, - "6a9758743b603eea3aa0524b42889723c4153948": { - "balance": "10100000000000000000000" + "0x6a9758743b603eea3aa0524b42889723c4153948": { + "balance": "0x22385a827e815500000" }, - "5985c59a449dfc5da787d8244e746c6d70caa55f": { - "balance": "100000000000000000000" + "0x5985c59a449dfc5da787d8244e746c6d70caa55f": { + "balance": "0x56bc75e2d63100000" }, - "56ee197f4bbf9f1b0662e41c2bbd9aa1f799e846": { - "balance": "1000000000000000000000" + "0x56ee197f4bbf9f1b0662e41c2bbd9aa1f799e846": { + "balance": "0x3635c9adc5dea00000" }, - "d47c242edffea091bc54d57df5d1fdb93101476c": { - "balance": "2914000000000000000000" + "0xd47c242edffea091bc54d57df5d1fdb93101476c": { + "balance": "0x9df7dfa8f760480000" }, - "d482e7f68e41f238fe517829de15477fe0f6dd1d": { - "balance": "500000000000000000000" + "0xd482e7f68e41f238fe517829de15477fe0f6dd1d": { + "balance": "0x1b1ae4d6e2ef500000" }, - "05bf4fcfe772e45b826443852e6c351350ce72a2": { - "balance": "8000000000000000000000" + "0x05bf4fcfe772e45b826443852e6c351350ce72a2": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "f10462e58fcc07f39584a187639451167e859201": { - "balance": "169830000000000000000" + "0xf10462e58fcc07f39584a187639451167e859201": { + "balance": "0x934dd5d33bc970000" }, - "1aa27699cada8dc3a76f7933aa66c71919040e88": { - "balance": "400000000000000000000" + "0x1aa27699cada8dc3a76f7933aa66c71919040e88": { + "balance": "0x15af1d78b58c400000" }, - "24046b91da9b61b629cb8b8ec0c351a07e0703e4": { - "balance": "2000000000000000000000" + "0x24046b91da9b61b629cb8b8ec0c351a07e0703e4": { + "balance": "0x6c6b935b8bbd400000" }, - "41033c1b6d05e1ca89b0948fc64453fbe87ab25e": { - "balance": "1337000000000000000000" + "0x41033c1b6d05e1ca89b0948fc64453fbe87ab25e": { + "balance": "0x487a9a304539440000" }, - "369822f5578b40dd1f4471706b22cd971352da6b": { - "balance": "346000000000000000000" + "0x369822f5578b40dd1f4471706b22cd971352da6b": { + "balance": "0x12c1b6eed03d280000" }, - "044e853144e3364495e7a69fa1d46abea3ac0964": { - "balance": "49225000000000000000" + "0x044e853144e3364495e7a69fa1d46abea3ac0964": { + "balance": "0x2ab2254b1dc9a8000" }, - "abf728cf9312f22128024e7046c251f5dc5901ed": { - "balance": "29550000000000000000000" + "0xabf728cf9312f22128024e7046c251f5dc5901ed": { + "balance": "0x641e8a13563d8f80000" }, - "d781f7fc09184611568570b4986e2c72872b7ed0": { - "balance": "20002000000000000000" + "0xd781f7fc09184611568570b4986e2c72872b7ed0": { + "balance": "0x1159561065d5d0000" }, - "6bb4a661a33a71d424d49bb5df28622ed4dffcf4": { - "balance": "630400000000000000000" + "0x6bb4a661a33a71d424d49bb5df28622ed4dffcf4": { + "balance": "0x222c8eb3ff66400000" }, - "fef3b3dead1a6926d49aa32b12c22af54d9ff985": { - "balance": "1000000000000000000000" + "0xfef3b3dead1a6926d49aa32b12c22af54d9ff985": { + "balance": "0x3635c9adc5dea00000" }, - "fa410971ad229c3036f41acf852f2ac999281950": { - "balance": "3997400000000000000000" + "0xfa410971ad229c3036f41acf852f2ac999281950": { + "balance": "0xd8b311a8ddfa7c0000" }, - "de176b5284bcee3a838ba24f67fc7cbf67d78ef6": { - "balance": "37600000000000000000" + "0xde176b5284bcee3a838ba24f67fc7cbf67d78ef6": { + "balance": "0x209ce08c962b00000" }, - "23120046f6832102a752a76656691c863e17e59c": { - "balance": "329800000000000000000" + "0x23120046f6832102a752a76656691c863e17e59c": { + "balance": "0x11e0e4f8a50bd40000" }, - "a2f472fe4f22b77db489219ea4023d11582a9329": { - "balance": "40000000000000000000000" + "0xa2f472fe4f22b77db489219ea4023d11582a9329": { + "balance": "0x878678326eac9000000" }, - "f0d64cf9df09741133d170485fd24b005011d520": { - "balance": "498680000000000000000" + "0xf0d64cf9df09741133d170485fd24b005011d520": { + "balance": "0x1b089341e14fcc0000" }, - "8b505e2871f7deb7a63895208e8227dcaa1bff05": { - "balance": "61216600000000000000000" + "0x8b505e2871f7deb7a63895208e8227dcaa1bff05": { + "balance": "0xcf68efc308d79bc0000" }, - "481e3a91bfdc2f1c8428a0119d03a41601417e1c": { - "balance": "1000000000000000000000" + "0x481e3a91bfdc2f1c8428a0119d03a41601417e1c": { + "balance": "0x3635c9adc5dea00000" }, - "bc69a0d2a31c3dbf7a9122116901b2bdfe9802a0": { - "balance": "3000000000000000000000" + "0xbc69a0d2a31c3dbf7a9122116901b2bdfe9802a0": { + "balance": "0xa2a15d09519be00000" }, - "20a81680e465f88790f0074f60b4f35f5d1e6aa5": { - "balance": "1279851000000000000000" + "0x20a81680e465f88790f0074f60b4f35f5d1e6aa5": { + "balance": "0x456180278f0c778000" }, - "194a6bb302b8aba7a5b579df93e0df1574967625": { - "balance": "500000000000000000000" + "0x194a6bb302b8aba7a5b579df93e0df1574967625": { + "balance": "0x1b1ae4d6e2ef500000" }, - "264cc8086a8710f91b21720905912cd7964ae868": { - "balance": "26740000000000000000" + "0x264cc8086a8710f91b21720905912cd7964ae868": { + "balance": "0x1731790534df20000" }, - "24aca08d5be85ebb9f3132dfc1b620824edfedf9": { - "balance": "18200000000000000000" + "0x24aca08d5be85ebb9f3132dfc1b620824edfedf9": { + "balance": "0xfc936392801c0000" }, - "1851a063ccdb30549077f1d139e72de7971197d5": { - "balance": "2000000000000000000000" + "0x1851a063ccdb30549077f1d139e72de7971197d5": { + "balance": "0x6c6b935b8bbd400000" }, - "f64a4ac8d540a9289c68d960d5fb7cc45a77831c": { - "balance": "2000000000000000000000" + "0xf64a4ac8d540a9289c68d960d5fb7cc45a77831c": { + "balance": "0x6c6b935b8bbd400000" }, - "c3db5657bb72f10d58f231fddf11980aff678693": { - "balance": "5910000000000000000000" + "0xc3db5657bb72f10d58f231fddf11980aff678693": { + "balance": "0x14061b9d77a5e980000" }, - "b46ace865e2c50ea4698d216ab455dff5a11cd72": { - "balance": "1000000000000000000000" + "0xb46ace865e2c50ea4698d216ab455dff5a11cd72": { + "balance": "0x3635c9adc5dea00000" }, - "9faea13c733412dc4b490402bfef27a0397a9bc3": { - "balance": "310000000000000000000" + "0x9faea13c733412dc4b490402bfef27a0397a9bc3": { + "balance": "0x10ce1d3d8cb3180000" }, - "b40594c4f3664ef849cca6227b8a25aa690925ee": { - "balance": "4000000000000000000000" + "0xb40594c4f3664ef849cca6227b8a25aa690925ee": { + "balance": "0xd8d726b7177a800000" }, - "672fa0a019088db3166f6119438d07a99f8ba224": { - "balance": "13370000000000000000000" + "0x672fa0a019088db3166f6119438d07a99f8ba224": { + "balance": "0x2d4ca05e2b43ca80000" }, - "c1ffad07db96138c4b2a530ec1c7de29b8a0592c": { - "balance": "17600000000000000000" + "0xc1ffad07db96138c4b2a530ec1c7de29b8a0592c": { + "balance": "0xf43fc2c04ee00000" }, - "87af25d3f6f8eea15313d5fe4557e810c524c083": { - "balance": "19700000000000000000000" + "0x87af25d3f6f8eea15313d5fe4557e810c524c083": { + "balance": "0x42bf06b78ed3b500000" }, - "d6a22e598dabd38ea6e958bd79d48ddd9604f4df": { - "balance": "1000000000000000000000" + "0xd6a22e598dabd38ea6e958bd79d48ddd9604f4df": { + "balance": "0x3635c9adc5dea00000" }, - "a2a435de44a01bd0ecb29e44e47644e46a0cdffb": { - "balance": "500171000000000000000" + "0xa2a435de44a01bd0ecb29e44e47644e46a0cdffb": { + "balance": "0x1b1d445a7affe78000" }, - "549b47649cfad993e4064d2636a4baa0623305cc": { - "balance": "601650000000000000000" + "0x549b47649cfad993e4064d2636a4baa0623305cc": { + "balance": "0x209d922f5259c50000" }, - "1321b605026f4ffb296a3e0edcb390c9c85608b7": { - "balance": "2000000000000000000000" + "0x1321b605026f4ffb296a3e0edcb390c9c85608b7": { + "balance": "0x6c6b935b8bbd400000" }, - "b4bf24cb83686bc469869fefb044b909716993e2": { - "balance": "2000000000000000000000" + "0xb4bf24cb83686bc469869fefb044b909716993e2": { + "balance": "0x6c6b935b8bbd400000" }, - "12d91a92d74fc861a729646db192a125b79f5374": { - "balance": "18200000000000000000" + "0x12d91a92d74fc861a729646db192a125b79f5374": { + "balance": "0xfc936392801c0000" }, - "7f0662b410298c99f311d3a1454a1eedba2fea76": { - "balance": "200000000000000000000" + "0x7f0662b410298c99f311d3a1454a1eedba2fea76": { + "balance": "0xad78ebc5ac6200000" }, - "83908aa7478a6d1c9b9b0281148f8f9f242b9fdc": { - "balance": "2000000000000000000000" + "0x83908aa7478a6d1c9b9b0281148f8f9f242b9fdc": { + "balance": "0x6c6b935b8bbd400000" }, - "c1438c99dd51ef1ca8386af0a317e9b041457888": { - "balance": "223500000000000000000" + "0xc1438c99dd51ef1ca8386af0a317e9b041457888": { + "balance": "0xc1daf81d8a3ce0000" }, - "545bb070e781172eb1608af7fc2895d6cb87197e": { - "balance": "2244000000000000000000" + "0x545bb070e781172eb1608af7fc2895d6cb87197e": { + "balance": "0x79a5c17ec748900000" }, - "161d26ef6759ba5b9f20fdcd66f16132c352415e": { - "balance": "2000000000000000000000" + "0x161d26ef6759ba5b9f20fdcd66f16132c352415e": { + "balance": "0x6c6b935b8bbd400000" }, - "d7f370d4bed9d57c6f49c999de729ee569d3f4e4": { - "balance": "200000000000000000000" + "0xd7f370d4bed9d57c6f49c999de729ee569d3f4e4": { + "balance": "0xad78ebc5ac6200000" }, - "90e35aabb2deef408bb9b5acef714457dfde6272": { - "balance": "100076000000000000000" + "0x90e35aabb2deef408bb9b5acef714457dfde6272": { + "balance": "0x56cd55fc64dfe0000" }, - "0fcfc4065008cfd323305f6286b57a4dd7eee23b": { - "balance": "20000000000000000000000" + "0x0fcfc4065008cfd323305f6286b57a4dd7eee23b": { + "balance": "0x43c33c1937564800000" }, - "cd725d70be97e677e3c8e85c0b26ef31e9955045": { - "balance": "1337000000000000000000" + "0xcd725d70be97e677e3c8e85c0b26ef31e9955045": { + "balance": "0x487a9a304539440000" }, - "dcf6b657266e91a4dae6033ddac15332dd8d2b34": { - "balance": "1760000000000000000000" + "0xdcf6b657266e91a4dae6033ddac15332dd8d2b34": { + "balance": "0x5f68e8131ecf800000" }, - "31f006f3494ed6c16eb92aaf9044fa8abb5fd5a3": { - "balance": "500000000000000000000" + "0x31f006f3494ed6c16eb92aaf9044fa8abb5fd5a3": { + "balance": "0x1b1ae4d6e2ef500000" }, - "cdea386f9d0fd804d02818f237b7d9fa7646d35e": { - "balance": "3012139000000000000000" + "0xcdea386f9d0fd804d02818f237b7d9fa7646d35e": { + "balance": "0xa349d36d80ec578000" }, - "d45b3341e8f15c80329320c3977e3b90e7826a7e": { - "balance": "500000000000000000000" + "0xd45b3341e8f15c80329320c3977e3b90e7826a7e": { + "balance": "0x1b1ae4d6e2ef500000" }, - "0b649da3b96a102cdc6db652a0c07d65b1e443e6": { - "balance": "2000000000000000000000" + "0x0b649da3b96a102cdc6db652a0c07d65b1e443e6": { + "balance": "0x6c6b935b8bbd400000" }, - "0a58fddd71898de773a74fdae45e7bd84ef43646": { - "balance": "20000000000000000000" + "0x0a58fddd71898de773a74fdae45e7bd84ef43646": { + "balance": "0x1158e460913d00000" }, - "0256149f5b5063bea14e15661ffb58f9b459a957": { - "balance": "704000000000000000000" + "0x0256149f5b5063bea14e15661ffb58f9b459a957": { + "balance": "0x2629f66e0c53000000" }, - "4438e880cb2766b0c1ceaec9d2418fceb952a044": { - "balance": "133712000000000000000" + "0x4438e880cb2766b0c1ceaec9d2418fceb952a044": { + "balance": "0x73fa073903f080000" }, - "9ed80eda7f55054db9fb5282451688f26bb374c1": { - "balance": "300000000000000000000" + "0x9ed80eda7f55054db9fb5282451688f26bb374c1": { + "balance": "0x1043561a8829300000" }, - "8dab948ae81da301d972e3f617a912e5a753712e": { - "balance": "400000000000000000000" + "0x8dab948ae81da301d972e3f617a912e5a753712e": { + "balance": "0x15af1d78b58c400000" }, - "5b5d8c8eed6c85ac215661de026676823faa0a0c": { - "balance": "20000000000000000000000" + "0x5b5d8c8eed6c85ac215661de026676823faa0a0c": { + "balance": "0x43c33c1937564800000" }, - "46722a36a01e841d03f780935e917d85d5a67abd": { - "balance": "14900000000000000000" + "0x46722a36a01e841d03f780935e917d85d5a67abd": { + "balance": "0xcec76f0e71520000" }, - "d4b8bdf3df9a51b0b91d16abbea05bb4783c8661": { - "balance": "1000000000000000000000" + "0xd4b8bdf3df9a51b0b91d16abbea05bb4783c8661": { + "balance": "0x3635c9adc5dea00000" }, - "98f6b8e6213dbc9a5581f4cce6655f95252bdb07": { - "balance": "319968000000000000000" + "0x98f6b8e6213dbc9a5581f4cce6655f95252bdb07": { + "balance": "0x115872b0bca4300000" }, - "3599493ce65772cf93e98af1195ec0955dc98002": { - "balance": "1500048000000000000000" + "0x3599493ce65772cf93e98af1195ec0955dc98002": { + "balance": "0x5151590c67b3280000" }, - "ecab5aba5b828de1705381f38bc744b32ba1b437": { - "balance": "940000000000000000000" + "0xecab5aba5b828de1705381f38bc744b32ba1b437": { + "balance": "0x32f51edbaaa3300000" }, - "9a82826d3c29481dcc2bd2950047e8b60486c338": { - "balance": "20000000000000000000000" + "0x9a82826d3c29481dcc2bd2950047e8b60486c338": { + "balance": "0x43c33c1937564800000" }, - "6c474bc66a54780066aa4f512eefa773abf919c7": { - "balance": "94000000000000000000" + "0x6c474bc66a54780066aa4f512eefa773abf919c7": { + "balance": "0x5188315f776b80000" }, - "d5903e9978ee20a38c3f498d63d57f31a39f6a06": { - "balance": "10380000000000000000000" + "0xd5903e9978ee20a38c3f498d63d57f31a39f6a06": { + "balance": "0x232b36ffc672ab00000" }, - "341480cc8cb476f8d01ff30812e7c70e05afaf5d": { - "balance": "2000000000000000000000" + "0x341480cc8cb476f8d01ff30812e7c70e05afaf5d": { + "balance": "0x6c6b935b8bbd400000" }, - "af771039345a343001bc0f8a5923b126b60d509c": { - "balance": "985000000000000000000" + "0xaf771039345a343001bc0f8a5923b126b60d509c": { + "balance": "0x35659ef93f0fc40000" }, - "b5a4679685fa14196c2e9230c8c4e33bffbc10e2": { - "balance": "1400000000000000000000" + "0xb5a4679685fa14196c2e9230c8c4e33bffbc10e2": { + "balance": "0x4be4e7267b6ae00000" }, - "2a400dff8594de7228b4fd15c32322b75bb87da8": { - "balance": "95810000000000000000" + "0x2a400dff8594de7228b4fd15c32322b75bb87da8": { + "balance": "0x531a17f607a2d0000" }, - "a1336dfb96b6bcbe4b3edf3205be5723c90fad52": { - "balance": "5000000000000000000000" + "0xa1336dfb96b6bcbe4b3edf3205be5723c90fad52": { + "balance": "0x10f0cf064dd59200000" }, - "e9b1f1fca3fa47269f21b061c353b7f5e96d905a": { - "balance": "500000000000000000000" + "0xe9b1f1fca3fa47269f21b061c353b7f5e96d905a": { + "balance": "0x1b1ae4d6e2ef500000" }, - "0ee414940487fd24e390378285c5d7b9334d8b65": { - "balance": "2680000000000000000000" + "0x0ee414940487fd24e390378285c5d7b9334d8b65": { + "balance": "0x914878a8c05ee00000" }, - "6ab5b4c41cddb829690c2fda7f20c85e629dd5d5": { - "balance": "1860000000000000000000" + "0x6ab5b4c41cddb829690c2fda7f20c85e629dd5d5": { + "balance": "0x64d4af714c32900000" }, - "dd63042f25ed32884ad26e3ad959eb94ea36bf67": { - "balance": "21340000000000000000000" + "0xdd63042f25ed32884ad26e3ad959eb94ea36bf67": { + "balance": "0x484d7fde7d593f00000" }, - "c0b3f244bca7b7de5b48a53edb9cbeab0b6d88c0": { - "balance": "5820000000000000000000" + "0xc0b3f244bca7b7de5b48a53edb9cbeab0b6d88c0": { + "balance": "0x13b80b99c5185700000" }, - "ed1a5c43c574d4e934299b24f1472cdc9fd6f010": { - "balance": "200000000000000000000" + "0xed1a5c43c574d4e934299b24f1472cdc9fd6f010": { + "balance": "0xad78ebc5ac6200000" }, - "b2d9ab9664bcf6df203c346fc692fd9cbab9205e": { - "balance": "438000000000000000000" + "0xb2d9ab9664bcf6df203c346fc692fd9cbab9205e": { + "balance": "0x17be78976065180000" }, - "ede8c2cb876fbe8a4cca8290361a7ea01a69fdf8": { - "balance": "7813091000000000000000" + "0xede8c2cb876fbe8a4cca8290361a7ea01a69fdf8": { + "balance": "0x1a78c6b44f841838000" }, - "6a7c252042e7468a3ff773d6450bba85efa26391": { - "balance": "500000000000000000000" + "0x6a7c252042e7468a3ff773d6450bba85efa26391": { + "balance": "0x1b1ae4d6e2ef500000" }, - "a106e6923edd53ca8ed650968a9108d6ccfd9670": { - "balance": "9499935000000000000000" + "0xa106e6923edd53ca8ed650968a9108d6ccfd9670": { + "balance": "0x202fe1505afec898000" }, - "031e25db516b0f099faebfd94f890cf96660836b": { - "balance": "2000000000000000000000" + "0x031e25db516b0f099faebfd94f890cf96660836b": { + "balance": "0x6c6b935b8bbd400000" }, - "7fdbc3a844e40d96b2f3a635322e6065f4ca0e84": { - "balance": "2000000000000000000000" + "0x7fdbc3a844e40d96b2f3a635322e6065f4ca0e84": { + "balance": "0x6c6b935b8bbd400000" }, - "df47a61b72535193c561cccc75c3f3ce0804a20e": { - "balance": "398000000000000000000" + "0xdf47a61b72535193c561cccc75c3f3ce0804a20e": { + "balance": "0x15935c0b4e3d780000" }, - "ed31305c319f9273d3936d8f5b2f71e9b1b22963": { - "balance": "100000000000000000000" + "0xed31305c319f9273d3936d8f5b2f71e9b1b22963": { + "balance": "0x56bc75e2d63100000" }, - "a6b2d573297360102c07a18fc21df2e7499ff4eb": { - "balance": "4011000000000000000000" + "0xa6b2d573297360102c07a18fc21df2e7499ff4eb": { + "balance": "0xd96fce90cfabcc0000" }, - "f68464bf64f2411356e4d3250efefe5c50a5f65b": { - "balance": "20000000000000000000" + "0xf68464bf64f2411356e4d3250efefe5c50a5f65b": { + "balance": "0x1158e460913d00000" }, - "927cc2bfda0e088d02eff70b38b08aa53cc30941": { - "balance": "1852700000000000000000" + "0x927cc2bfda0e088d02eff70b38b08aa53cc30941": { + "balance": "0x646f60a1f986360000" }, - "41cb9896445f70a10a14215296daf614e32cf4d5": { - "balance": "1910000000000000000000" + "0x41cb9896445f70a10a14215296daf614e32cf4d5": { + "balance": "0x678a932062e4180000" }, - "3ad70243d88bf0400f57c8c1fd57811848af162a": { - "balance": "860000000000000000000" + "0x3ad70243d88bf0400f57c8c1fd57811848af162a": { + "balance": "0x2e9ee5c38653f00000" }, - "63b9754d75d12d384039ec69063c0be210d5e0e3": { - "balance": "2694055000000000000000" + "0x63b9754d75d12d384039ec69063c0be210d5e0e3": { + "balance": "0x920b860cc8ecfd8000" }, - "ad1799aad7602b4540cd832f9db5f11150f1687a": { - "balance": "2000000000000000000000" + "0xad1799aad7602b4540cd832f9db5f11150f1687a": { + "balance": "0x6c6b935b8bbd400000" }, - "a8b65ba3171a3f77a6350b9daf1f8d55b4d201eb": { - "balance": "745000000000000000000" + "0xa8b65ba3171a3f77a6350b9daf1f8d55b4d201eb": { + "balance": "0x2862f3b0d222040000" }, - "ad0a4ae478e9636e88c604f242cf5439c6d45639": { - "balance": "3520000000000000000000" + "0xad0a4ae478e9636e88c604f242cf5439c6d45639": { + "balance": "0xbed1d0263d9f000000" }, - "4cd0b0a6436362595ceade052ebc9b929fb6c6c0": { - "balance": "2000000000000000000000" + "0x4cd0b0a6436362595ceade052ebc9b929fb6c6c0": { + "balance": "0x6c6b935b8bbd400000" }, - "c1d4af38e9ba799040894849b8a8219375f1ac78": { - "balance": "20000000000000000000000" + "0xc1d4af38e9ba799040894849b8a8219375f1ac78": { + "balance": "0x43c33c1937564800000" }, - "49ddee902e1d0c99d1b11af3cc8a96f78e4dcf1a": { - "balance": "199358000000000000000" + "0x49ddee902e1d0c99d1b11af3cc8a96f78e4dcf1a": { + "balance": "0xacea5e4c18c530000" }, - "ae842210f44d14c4a4db91fc9d3b3b50014f7bf7": { - "balance": "4000000000000000000000" + "0xae842210f44d14c4a4db91fc9d3b3b50014f7bf7": { + "balance": "0xd8d726b7177a800000" }, - "10a1c42dc1ba746986b985a522a73c93eae64c63": { - "balance": "1000000000000000000000" + "0x10a1c42dc1ba746986b985a522a73c93eae64c63": { + "balance": "0x3635c9adc5dea00000" }, - "5103bc09933e9921fd53dc536f11f05d0d47107d": { - "balance": "4000000000000000000000" + "0x5103bc09933e9921fd53dc536f11f05d0d47107d": { + "balance": "0xd8d726b7177a800000" }, - "c88eec54d305c928cc2848c2fee23531acb96d49": { - "balance": "1999946000000000000000" + "0xc88eec54d305c928cc2848c2fee23531acb96d49": { + "balance": "0x6c6ad382d4fb610000" }, - "9a2ce43b5d89d6936b8e8c354791b8afff962425": { - "balance": "2000000000000000000000" + "0x9a2ce43b5d89d6936b8e8c354791b8afff962425": { + "balance": "0x6c6b935b8bbd400000" }, - "562020e3ed792d2f1835fe5f55417d5111460c6a": { - "balance": "20000000000000000000000" + "0x562020e3ed792d2f1835fe5f55417d5111460c6a": { + "balance": "0x43c33c1937564800000" }, - "ed16ce39feef3bd7f5d162045e0f67c0f00046bb": { - "balance": "20000000000000000000" + "0xed16ce39feef3bd7f5d162045e0f67c0f00046bb": { + "balance": "0x1158e460913d00000" }, - "ab948a4ae3795cbca13126e19253bdc21d3a8514": { - "balance": "200000000000000000000" + "0xab948a4ae3795cbca13126e19253bdc21d3a8514": { + "balance": "0xad78ebc5ac6200000" }, - "c12b7f40df9a2f7bf983661422ab84c9c1f50858": { - "balance": "8000000000000000000000" + "0xc12b7f40df9a2f7bf983661422ab84c9c1f50858": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "62e6b2f5eb94fa7a43831fc87e254a3fe3bf8f89": { - "balance": "250000000000000000000" + "0x62e6b2f5eb94fa7a43831fc87e254a3fe3bf8f89": { + "balance": "0xd8d726b7177a80000" }, - "423bca47abc00c7057e3ad34fca63e375fbd8b4a": { - "balance": "18000000000000000000000" + "0x423bca47abc00c7057e3ad34fca63e375fbd8b4a": { + "balance": "0x3cfc82e37e9a7400000" }, - "5ff326cd60fd136b245e29e9087a6ad3a6527f0d": { - "balance": "1880000000000000000000" + "0x5ff326cd60fd136b245e29e9087a6ad3a6527f0d": { + "balance": "0x65ea3db75546600000" }, - "79ffb4ac13812a0b78c4a37b8275223e176bfda5": { - "balance": "17300000000000000000" + "0x79ffb4ac13812a0b78c4a37b8275223e176bfda5": { + "balance": "0xf015f25736420000" }, - "f757fc8720d3c4fa5277075e60bd5c411aebd977": { - "balance": "2000000000000000000000" + "0xf757fc8720d3c4fa5277075e60bd5c411aebd977": { + "balance": "0x6c6b935b8bbd400000" }, - "0bdbc54cc8bdbbb402a08911e2232a5460ce866b": { - "balance": "3000000000000000000000" + "0x0bdbc54cc8bdbbb402a08911e2232a5460ce866b": { + "balance": "0xa2a15d09519be00000" }, - "9ee9760cc273d4706aa08375c3e46fa230aff3d5": { - "balance": "8950000000000000000000" + "0x9ee9760cc273d4706aa08375c3e46fa230aff3d5": { + "balance": "0x1e52e336cde22180000" }, - "d23a24d7f9468343c143a41d73b88f7cbe63be5e": { - "balance": "200000000000000000000" + "0xd23a24d7f9468343c143a41d73b88f7cbe63be5e": { + "balance": "0xad78ebc5ac6200000" }, - "46d80631284203f6288ecd4e5758bb9d41d05dbe": { - "balance": "2000000000000000000000" + "0x46d80631284203f6288ecd4e5758bb9d41d05dbe": { + "balance": "0x6c6b935b8bbd400000" }, - "3f4cd1399f8a34eddb9a17a471fc922b5870aafc": { - "balance": "200000000000000000000" + "0x3f4cd1399f8a34eddb9a17a471fc922b5870aafc": { + "balance": "0xad78ebc5ac6200000" }, - "44c54eaa8ac940f9e80f1e74e82fc14f1676856a": { - "balance": "7880000000000000000000" + "0x44c54eaa8ac940f9e80f1e74e82fc14f1676856a": { + "balance": "0x1ab2cf7c9f87e200000" }, - "aec27ff5d7f9ddda91183f46f9d52543b6cd2b2f": { - "balance": "450000000000000000000" + "0xaec27ff5d7f9ddda91183f46f9d52543b6cd2b2f": { + "balance": "0x18650127cc3dc80000" }, - "203c6283f20df7bc86542fdfb4e763ecdbbbeef5": { - "balance": "25000000000000000000000" + "0x203c6283f20df7bc86542fdfb4e763ecdbbbeef5": { + "balance": "0x54b40b1f852bda00000" }, - "bcaf347918efb2d63dde03e39275bbe97d26df50": { - "balance": "100000000000000000000" + "0xbcaf347918efb2d63dde03e39275bbe97d26df50": { + "balance": "0x56bc75e2d63100000" }, - "974d0541ab4a47ec7f75369c0069b64a1b817710": { - "balance": "400000000000000000000" + "0x974d0541ab4a47ec7f75369c0069b64a1b817710": { + "balance": "0x15af1d78b58c400000" }, - "5da54785c9bd30575c89deb59d2041d20a39e17b": { - "balance": "1967031000000000000000" + "0x5da54785c9bd30575c89deb59d2041d20a39e17b": { + "balance": "0x6aa209f0b91d658000" }, - "1fb463a0389983df7d593f7bdd6d78497fed8879": { - "balance": "20000000000000000000" + "0x1fb463a0389983df7d593f7bdd6d78497fed8879": { + "balance": "0x1158e460913d00000" }, - "6e1ea4b183e252c9bb7767a006d4b43696cb8ae9": { - "balance": "294245000000000000000" + "0x6e1ea4b183e252c9bb7767a006d4b43696cb8ae9": { + "balance": "0xff3783c85eed08000" }, - "c2aa74847e86edfdd3f3db22f8a2152feee5b7f7": { - "balance": "2048852000000000000000" + "0xc2aa74847e86edfdd3f3db22f8a2152feee5b7f7": { + "balance": "0x6f118886b784a20000" }, - "a13b9d82a99b3c9bba5ae72ef2199edc7d3bb36c": { - "balance": "1999944000000000000000" + "0xa13b9d82a99b3c9bba5ae72ef2199edc7d3bb36c": { + "balance": "0x6c6acc67d7b1d40000" }, - "5135fb8757600cf474546252f74dc0746d06262c": { - "balance": "2000000000000000000000" + "0x5135fb8757600cf474546252f74dc0746d06262c": { + "balance": "0x6c6b935b8bbd400000" }, - "43e7ec846358d7d0f937ad1c350ba069d7bf72bf": { - "balance": "118800000000000000000" + "0x43e7ec846358d7d0f937ad1c350ba069d7bf72bf": { + "balance": "0x670ae629214680000" }, - "f2ed3e77254acb83231dc0860e1a11242ba627db": { - "balance": "1980000000000000000000" + "0xf2ed3e77254acb83231dc0860e1a11242ba627db": { + "balance": "0x6b56051582a9700000" }, - "c0a02ab94ebe56d045b41b629b98462e3a024a93": { - "balance": "100000000000000000000" + "0xc0a02ab94ebe56d045b41b629b98462e3a024a93": { + "balance": "0x56bc75e2d63100000" }, - "f21549bdd1487912f900a7523db5f7626121bba3": { - "balance": "10000000000000000000000" + "0xf21549bdd1487912f900a7523db5f7626121bba3": { + "balance": "0x21e19e0c9bab2400000" }, - "886d0a9e17c9c095af2ea2358b89ec705212ee94": { - "balance": "28000000000000000000" + "0x886d0a9e17c9c095af2ea2358b89ec705212ee94": { + "balance": "0x18493fba64ef00000" }, - "211b29cefc79ae976744fdebcebd3cbb32c51303": { - "balance": "14000000000000000000000" + "0x211b29cefc79ae976744fdebcebd3cbb32c51303": { + "balance": "0x2f6f10780d22cc00000" }, - "b8c2703d8c3f2f44c584bc10e7c0a6b64c1c097e": { - "balance": "5550000000000000000000" + "0xb8c2703d8c3f2f44c584bc10e7c0a6b64c1c097e": { + "balance": "0x12cddb8ead6f9f80000" }, - "ec30addd895b82ee319e54fb04cb2bb03971f36b": { - "balance": "2000000000000000000000" + "0xec30addd895b82ee319e54fb04cb2bb03971f36b": { + "balance": "0x6c6b935b8bbd400000" }, - "b71b62f4b448c02b1201cb5e394ae627b0a560ee": { - "balance": "500000000000000000000" + "0xb71b62f4b448c02b1201cb5e394ae627b0a560ee": { + "balance": "0x1b1ae4d6e2ef500000" }, - "e1334e998379dfe983177062791b90f80ee22d8d": { - "balance": "500000000000000000000" + "0xe1334e998379dfe983177062791b90f80ee22d8d": { + "balance": "0x1b1ae4d6e2ef500000" }, - "1d633097a85225a1ff4321b12988fdd55c2b3844": { - "balance": "4000000000000000000000" + "0x1d633097a85225a1ff4321b12988fdd55c2b3844": { + "balance": "0xd8d726b7177a800000" }, - "8bd8d4c4e943f6c8073921dc17e3e8d7a0761627": { - "balance": "2933330000000000000000" + "0x8bd8d4c4e943f6c8073921dc17e3e8d7a0761627": { + "balance": "0x9f04219d8d34950000" }, - "a5d96e697d46358d119af7819dc7087f6ae47fef": { - "balance": "14605131000000000000000" + "0xa5d96e697d46358d119af7819dc7087f6ae47fef": { + "balance": "0x317bee8af3315a78000" }, - "d0809498c548047a1e2a2aa6a29cd61a0ee268bd": { - "balance": "2000000000000000000000" + "0xd0809498c548047a1e2a2aa6a29cd61a0ee268bd": { + "balance": "0x6c6b935b8bbd400000" }, - "3cd6b7593cbee77830a8b19d0801958fcd4bc57a": { - "balance": "500000000000000000000" + "0x3cd6b7593cbee77830a8b19d0801958fcd4bc57a": { + "balance": "0x1b1ae4d6e2ef500000" }, - "ead4d2eefb76abae5533961edd11400406b298fc": { - "balance": "3880000000000000000000" + "0xead4d2eefb76abae5533961edd11400406b298fc": { + "balance": "0xd255d112e103a00000" }, - "6331028cbb5a21485bc51b565142993bdb2582a9": { - "balance": "534800000000000000000" + "0x6331028cbb5a21485bc51b565142993bdb2582a9": { + "balance": "0x1cfdd7468216e80000" }, - "163bad4a122b457d64e8150a413eae4d07023e6b": { - "balance": "18800000000000000000" + "0x163bad4a122b457d64e8150a413eae4d07023e6b": { + "balance": "0x104e70464b1580000" }, - "c522e20fbf04ed7f6b05a37b4718d6fce0142e1a": { - "balance": "4000000000000000000000" + "0xc522e20fbf04ed7f6b05a37b4718d6fce0142e1a": { + "balance": "0xd8d726b7177a800000" }, - "2d9bad6f1ee02a70f1f13def5cccb27a9a274031": { - "balance": "1790000000000000000000" + "0x2d9bad6f1ee02a70f1f13def5cccb27a9a274031": { + "balance": "0x61093d7c2c6d380000" }, - "5ed0d6338559ef44dc7a61edeb893fa5d83fa1b5": { - "balance": "220000000000000000000" + "0x5ed0d6338559ef44dc7a61edeb893fa5d83fa1b5": { + "balance": "0xbed1d0263d9f00000" }, - "ec8c1d7b6aaccd429db3a91ee4c9eb1ca4f6f73c": { - "balance": "4250000000000000000000" + "0xec8c1d7b6aaccd429db3a91ee4c9eb1ca4f6f73c": { + "balance": "0xe664992288f2280000" }, - "3896ad743579d38e2302454d1fb6e2ab69e01bfd": { - "balance": "1880000000000000000000" + "0x3896ad743579d38e2302454d1fb6e2ab69e01bfd": { + "balance": "0x65ea3db75546600000" }, - "e73ccf436725c151e255ccf5210cfce5a43f13e3": { - "balance": "19982000000000000000" + "0xe73ccf436725c151e255ccf5210cfce5a43f13e3": { + "balance": "0x1154e53217ddb0000" }, - "9483d98f14a33fdc118d403955c29935edfc5f70": { - "balance": "459600000000000000000" + "0x9483d98f14a33fdc118d403955c29935edfc5f70": { + "balance": "0x18ea3b34ef51880000" }, - "1cfcf7517f0c08459720942b647ad192aa9c8828": { - "balance": "800000000000000000000" + "0x1cfcf7517f0c08459720942b647ad192aa9c8828": { + "balance": "0x2b5e3af16b18800000" }, - "8d378f0edc0bb0f0686d6a20be6a7692c4fa24b8": { - "balance": "100000000000000000000" + "0x8d378f0edc0bb0f0686d6a20be6a7692c4fa24b8": { + "balance": "0x56bc75e2d63100000" }, - "06f68de3d739db41121eacf779aada3de8762107": { - "balance": "28000000000000000000" + "0x06f68de3d739db41121eacf779aada3de8762107": { + "balance": "0x18493fba64ef00000" }, - "9909650dd5b1397b8b8b0eb69499b291b0ad1213": { - "balance": "200000000000000000000" + "0x9909650dd5b1397b8b8b0eb69499b291b0ad1213": { + "balance": "0xad78ebc5ac6200000" }, - "b66675142e3111a1c2ea1eb2419cfa42aaf7a234": { - "balance": "1000000000000000000000" + "0xb66675142e3111a1c2ea1eb2419cfa42aaf7a234": { + "balance": "0x3635c9adc5dea00000" }, - "7836f7ef6bc7bd0ff3acaf449c84dd6b1e2c939f": { - "balance": "4142296000000000000000" + "0x7836f7ef6bc7bd0ff3acaf449c84dd6b1e2c939f": { + "balance": "0xe08de7a92cd97c0000" }, - "3ddedbe48923fbf9e536bf9ffb0747c9cdd39eef": { - "balance": "16100000000000000000000" + "0x3ddedbe48923fbf9e536bf9ffb0747c9cdd39eef": { + "balance": "0x368c8623a8b4d100000" }, - "c47d610b399250f70ecf1389bab6292c91264f23": { - "balance": "288800000000000000000" + "0xc47d610b399250f70ecf1389bab6292c91264f23": { + "balance": "0xfa7e7b5df3cd00000" }, - "51a6d627f66a8923d88d6094c4715380d3057cb6": { - "balance": "1152044000000000000000" + "0x51a6d627f66a8923d88d6094c4715380d3057cb6": { + "balance": "0x3e73d27a35941e0000" }, - "6c0cc917cbee7d7c099763f14e64df7d34e2bf09": { - "balance": "250000000000000000000" + "0x6c0cc917cbee7d7c099763f14e64df7d34e2bf09": { + "balance": "0xd8d726b7177a80000" }, - "aaaae68b321402c8ebc13468f341c63c0cf03fce": { - "balance": "1520000000000000000000" + "0xaaaae68b321402c8ebc13468f341c63c0cf03fce": { + "balance": "0x52663ccab1e1c00000" }, - "819cdaa5303678ef7cec59d48c82163acc60b952": { - "balance": "14523448000000000000000" + "0x819cdaa5303678ef7cec59d48c82163acc60b952": { + "balance": "0x31351545f79816c0000" }, - "d071192966eb69c3520fca3aa4dd04297ea04b4e": { - "balance": "110000000000000000000" + "0xd071192966eb69c3520fca3aa4dd04297ea04b4e": { + "balance": "0x5f68e8131ecf80000" }, - "e53425d8df1f11c341ff58ae5f1438abf1ca53cf": { - "balance": "322000000000000000000" + "0xe53425d8df1f11c341ff58ae5f1438abf1ca53cf": { + "balance": "0x1174a5cdf88bc80000" }, - "8ffe322997b8e404422d19c54aadb18f5bc8e9b7": { - "balance": "3940000000000000000000" + "0x8ffe322997b8e404422d19c54aadb18f5bc8e9b7": { + "balance": "0xd5967be4fc3f100000" }, - "305f78d618b990b4295bac8a2dfa262884f804ea": { - "balance": "4000000000000000000000" + "0x305f78d618b990b4295bac8a2dfa262884f804ea": { + "balance": "0xd8d726b7177a800000" }, - "274d69170fe7141401882b886ac4618c6ae40edb": { - "balance": "955000000000000000000" + "0x274d69170fe7141401882b886ac4618c6ae40edb": { + "balance": "0x33c5499031720c0000" }, - "69c94e07c4a9be3384d95dfa3cb9290051873b7b": { - "balance": "70000000000000000000" + "0x69c94e07c4a9be3384d95dfa3cb9290051873b7b": { + "balance": "0x3cb71f51fc5580000" }, - "859c600cf13d1d0273d5d1da3cd789e495899f27": { - "balance": "2674000000000000000000" + "0x859c600cf13d1d0273d5d1da3cd789e495899f27": { + "balance": "0x90f534608a72880000" }, - "c06cebbbf7f5149a66f7eb976b3e47d56516da2f": { - "balance": "2000000000000000000000" + "0xc06cebbbf7f5149a66f7eb976b3e47d56516da2f": { + "balance": "0x6c6b935b8bbd400000" }, - "37bbc47212d82fcb5ee08f5225ecc2041ad2da7d": { - "balance": "3280000000000000000000" + "0x37bbc47212d82fcb5ee08f5225ecc2041ad2da7d": { + "balance": "0xb1cf24ddd0b1400000" }, - "11e7997edd904503d77da6038ab0a4c834bbd563": { - "balance": "388000000000000000000" + "0x11e7997edd904503d77da6038ab0a4c834bbd563": { + "balance": "0x150894e849b3900000" }, - "d333627445f2d787901ef33bb2a8a3675e27ffec": { - "balance": "400000000000000000000" + "0xd333627445f2d787901ef33bb2a8a3675e27ffec": { + "balance": "0x15af1d78b58c400000" }, - "16a58e985dccd707a594d193e7cca78b5d027849": { - "balance": "1360000000000000000000" + "0x16a58e985dccd707a594d193e7cca78b5d027849": { + "balance": "0x49b9ca9a6943400000" }, - "f8ae857b67a4a2893a3fbe7c7a87ff1c01c6a6e7": { - "balance": "4000000000000000000000" + "0xf8ae857b67a4a2893a3fbe7c7a87ff1c01c6a6e7": { + "balance": "0xd8d726b7177a800000" }, - "491561db8b6fafb9007e62d050c282e92c4b6bc8": { - "balance": "30000000000000000000000" + "0x491561db8b6fafb9007e62d050c282e92c4b6bc8": { + "balance": "0x65a4da25d3016c00000" }, - "21df1ec24b4e4bfe79b0c095cebae198f291fbd1": { - "balance": "20000000000000000000000" + "0x21df1ec24b4e4bfe79b0c095cebae198f291fbd1": { + "balance": "0x43c33c1937564800000" }, - "e208812a684098f3da4efe6aba256256adfe3fe6": { - "balance": "2000000000000000000000" + "0xe208812a684098f3da4efe6aba256256adfe3fe6": { + "balance": "0x6c6b935b8bbd400000" }, - "f4ec8e97a20aa5f8dd206f55207e06b813df2cc0": { - "balance": "200000000000000000000" + "0xf4ec8e97a20aa5f8dd206f55207e06b813df2cc0": { + "balance": "0xad78ebc5ac6200000" }, - "29eb7eefdae9feb449c63ff5f279d67510eb1422": { - "balance": "19400000000000000000" + "0x29eb7eefdae9feb449c63ff5f279d67510eb1422": { + "balance": "0x10d3aa536e2940000" }, - "0d678706d037187f3e22e6f69b99a592d11ebc59": { - "balance": "1580000000000000000000" + "0x0d678706d037187f3e22e6f69b99a592d11ebc59": { + "balance": "0x55a6e79ccd1d300000" }, - "de6d363106cc6238d2f092f0f0372136d1cd50c6": { - "balance": "5348000000000000000000" + "0xde6d363106cc6238d2f092f0f0372136d1cd50c6": { + "balance": "0x121ea68c114e5100000" }, - "c8710d7e8b5a3bd69a42fe0fa8b87c357fddcdc8": { - "balance": "4000000000000000000000" + "0xc8710d7e8b5a3bd69a42fe0fa8b87c357fddcdc8": { + "balance": "0xd8d726b7177a800000" }, - "5267f4d41292f370863c90d793296903843625c7": { - "balance": "1400000000000000000000" + "0x5267f4d41292f370863c90d793296903843625c7": { + "balance": "0x4be4e7267b6ae00000" }, - "4cda41dd533991290794e22ae324143e309b3d3d": { - "balance": "2400000000000000000000" + "0x4cda41dd533991290794e22ae324143e309b3d3d": { + "balance": "0x821ab0d44149800000" }, - "f8a50cee2e688ceee3aca4d4a29725d4072cc483": { - "balance": "2000000000000000000000" + "0xf8a50cee2e688ceee3aca4d4a29725d4072cc483": { + "balance": "0x6c6b935b8bbd400000" }, - "5ed3bbc05240e0d399eb6ddfe60f62de4d9509af": { - "balance": "193999806000000000000000" + "0x5ed3bbc05240e0d399eb6ddfe60f62de4d9509af": { + "balance": "0x2914c02475f9d6d30000" }, - "0befb54707f61b2c9fb04715ab026e1bb72042bd": { - "balance": "4000000000000000000000" + "0x0befb54707f61b2c9fb04715ab026e1bb72042bd": { + "balance": "0xd8d726b7177a800000" }, - "cab9a301e6bd46e940355028eccd40ce4d5a1ac3": { - "balance": "400000000000000000000" + "0xcab9a301e6bd46e940355028eccd40ce4d5a1ac3": { + "balance": "0x15af1d78b58c400000" }, - "64672da3ab052821a0243d1ce4b6e0a36517b8eb": { - "balance": "200000000000000000000" + "0x64672da3ab052821a0243d1ce4b6e0a36517b8eb": { + "balance": "0xad78ebc5ac6200000" }, - "eac0827eff0c6e3ff28a7d4a54f65cb7689d7b99": { - "balance": "2856500000000000000000" + "0xeac0827eff0c6e3ff28a7d4a54f65cb7689d7b99": { + "balance": "0x9ad9e69f9d47520000" }, - "f4b6cdcfcb24230b337d770df6034dfbd4e1503f": { - "balance": "19000000000000000000000" + "0xf4b6cdcfcb24230b337d770df6034dfbd4e1503f": { + "balance": "0x405fdf7e5af85e00000" }, - "7be2f7680c802da6154c92c0194ae732517a7169": { - "balance": "18200000000000000000" + "0x7be2f7680c802da6154c92c0194ae732517a7169": { + "balance": "0xfc936392801c0000" }, - "869f1aa30e4455beb1822091de5cadec79a8f946": { - "balance": "8000000000000000000000" + "0x869f1aa30e4455beb1822091de5cadec79a8f946": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "c4681e73bb0e32f6b726204831ff69baa4877e32": { - "balance": "1820000000000000000000" + "0xc4681e73bb0e32f6b726204831ff69baa4877e32": { + "balance": "0x62a992e53a0af00000" }, - "962cd22a8edf1e4f4e55b4b15ddbfb5d9d541971": { - "balance": "2000000000000000000000" + "0x962cd22a8edf1e4f4e55b4b15ddbfb5d9d541971": { + "balance": "0x6c6b935b8bbd400000" }, - "131df8d330eb7cc7147d0a55576f05de8d26a8b7": { - "balance": "188000000000000000000" + "0x131df8d330eb7cc7147d0a55576f05de8d26a8b7": { + "balance": "0xa31062beeed700000" }, - "19f99f2c0b46ce8906875dc9f90ae104dae35594": { - "balance": "4507300000000000000000" + "0x19f99f2c0b46ce8906875dc9f90ae104dae35594": { + "balance": "0xf4575a5d4d162a0000" }, - "91bb3f79022bf3c453f4ff256e269b15cf2c9cbd": { - "balance": "1519000000000000000000" + "0x91bb3f79022bf3c453f4ff256e269b15cf2c9cbd": { + "balance": "0x52585c13fe3a5c0000" }, - "7301dc4cf26d7186f2a11bf8b08bf229463f64a3": { - "balance": "2000000000000000000000" + "0x7301dc4cf26d7186f2a11bf8b08bf229463f64a3": { + "balance": "0x6c6b935b8bbd400000" }, - "7cbca88fca6a0060b960985c9aa1b02534dc2208": { - "balance": "462500000000000000000" + "0x7cbca88fca6a0060b960985c9aa1b02534dc2208": { + "balance": "0x19127a1391ea2a0000" }, - "f3c1abd29dc57b41dc192d0e384d021df0b4f6d4": { - "balance": "2798000000000000000000" + "0xf3c1abd29dc57b41dc192d0e384d021df0b4f6d4": { + "balance": "0x97ae0cdf8f86f80000" }, - "5d32f6f86e787ff78e63d78b0ef95fe6071852b8": { - "balance": "401100000000000000000" + "0x5d32f6f86e787ff78e63d78b0ef95fe6071852b8": { + "balance": "0x15be6174e1912e0000" }, - "1678c5f2a522393225196361894f53cc752fe2f3": { - "balance": "1936000000000000000000" + "0x1678c5f2a522393225196361894f53cc752fe2f3": { + "balance": "0x68f365aea1e4400000" }, - "1cf04cb14380059efd3f238b65d5beb86afa14d8": { - "balance": "20000000000000000000" + "0x1cf04cb14380059efd3f238b65d5beb86afa14d8": { + "balance": "0x1158e460913d00000" }, - "52e1731350f983cc2c4189842fde0613fad50ce1": { - "balance": "11640000000000000000000" + "0x52e1731350f983cc2c4189842fde0613fad50ce1": { + "balance": "0x277017338a30ae00000" }, - "d0b11d6f2bce945e0c6a5020c3b52753f803f9d1": { - "balance": "200000000000000000000" + "0xd0b11d6f2bce945e0c6a5020c3b52753f803f9d1": { + "balance": "0xad78ebc5ac6200000" }, - "409bd75085821c1de70cdc3b11ffc3d923c74010": { - "balance": "4000000000000000000000" + "0x409bd75085821c1de70cdc3b11ffc3d923c74010": { + "balance": "0xd8d726b7177a800000" }, - "0bb7160aba293762f8734f3e0326ffc9a4cac190": { - "balance": "1000000000000000000000" + "0x0bb7160aba293762f8734f3e0326ffc9a4cac190": { + "balance": "0x3635c9adc5dea00000" }, - "7aad4dbcd3acf997df93586956f72b64d8ad94ee": { - "balance": "4000000000000000000000" + "0x7aad4dbcd3acf997df93586956f72b64d8ad94ee": { + "balance": "0xd8d726b7177a800000" }, - "2dec98329d1f96c3a59caa7981755452d4da49d5": { - "balance": "200000000000000000000" + "0x2dec98329d1f96c3a59caa7981755452d4da49d5": { + "balance": "0xad78ebc5ac6200000" }, - "c18ab467feb5a0aadfff91230ff056464d78d800": { - "balance": "2000000000000000000000" + "0xc18ab467feb5a0aadfff91230ff056464d78d800": { + "balance": "0x6c6b935b8bbd400000" }, - "c90c3765156bca8e4897ab802419153cbe5225a9": { - "balance": "200000000000000000000" + "0xc90c3765156bca8e4897ab802419153cbe5225a9": { + "balance": "0xad78ebc5ac6200000" }, - "85c8f3cc7a354feac99a5e7bfe7cdfa351cfe355": { - "balance": "400000000000000000000" + "0x85c8f3cc7a354feac99a5e7bfe7cdfa351cfe355": { + "balance": "0x15af1d78b58c400000" }, - "f4fc4d39bc0c2c4068a36de50e4ab4d4db7e340a": { - "balance": "25380000000000000000" + "0xf4fc4d39bc0c2c4068a36de50e4ab4d4db7e340a": { + "balance": "0x16037df87ef6a0000" }, - "f50abbd4aa45d3eb88515465a8ba0b310fd9b521": { - "balance": "6685000000000000000000" + "0xf50abbd4aa45d3eb88515465a8ba0b310fd9b521": { + "balance": "0x16a6502f15a1e540000" }, - "4d200110124008d56f76981256420c946a6ff45c": { - "balance": "199955000000000000000" + "0x4d200110124008d56f76981256420c946a6ff45c": { + "balance": "0xad6eedd17cf3b8000" }, - "f4ba6a46d55140c439cbcf076cc657136262f4f8": { - "balance": "2000000000000000000000" + "0xf4ba6a46d55140c439cbcf076cc657136262f4f8": { + "balance": "0x6c6b935b8bbd400000" }, - "fa7adf660b8d99ce15933d7c5f072f3cbeb99d33": { - "balance": "5910000000000000000000" + "0xfa7adf660b8d99ce15933d7c5f072f3cbeb99d33": { + "balance": "0x14061b9d77a5e980000" }, - "84503334630d77f74147f68b2e086613c8f1ade9": { - "balance": "1600000000000000000000" + "0x84503334630d77f74147f68b2e086613c8f1ade9": { + "balance": "0x56bc75e2d631000000" }, - "31ed858788bda4d5270992221cc04206ec62610d": { - "balance": "1176000000000000000000" + "0x31ed858788bda4d5270992221cc04206ec62610d": { + "balance": "0x3fc0474948f3600000" }, - "bfbca418d3529cb393081062032a6e1183c6b2dc": { - "balance": "8000000000000000000000" + "0xbfbca418d3529cb393081062032a6e1183c6b2dc": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "8263ece5d709e0d7ae71cca868ed37cd2fef807b": { - "balance": "990000000000000000000" + "0x8263ece5d709e0d7ae71cca868ed37cd2fef807b": { + "balance": "0x35ab028ac154b80000" }, - "23ba3864da583dab56f420873c37679690e02f00": { - "balance": "9800000000000000000000" + "0x23ba3864da583dab56f420873c37679690e02f00": { + "balance": "0x21342520d5fec200000" }, - "cedcb3a1d6843fb6bef643617deaf38f8e98dd5f": { - "balance": "477500000000000000000" + "0xcedcb3a1d6843fb6bef643617deaf38f8e98dd5f": { + "balance": "0x19e2a4c818b9060000" }, - "8fac748f784a0fed68dba43319b42a75b4649c6e": { - "balance": "910000000000000000000" + "0x8fac748f784a0fed68dba43319b42a75b4649c6e": { + "balance": "0x3154c9729d05780000" }, - "18b8bcf98321da61fb4e3eacc1ec5417272dc27e": { - "balance": "880000000000000000000" + "0x18b8bcf98321da61fb4e3eacc1ec5417272dc27e": { + "balance": "0x2fb474098f67c00000" }, - "776943ffb2ef5cdd35b83c28bc046bd4f4677098": { - "balance": "3000000000000000000000" + "0x776943ffb2ef5cdd35b83c28bc046bd4f4677098": { + "balance": "0xa2a15d09519be00000" }, - "fb8113f94d9173eefd5a3073f516803a10b286ae": { - "balance": "80000000000000000000" + "0xfb8113f94d9173eefd5a3073f516803a10b286ae": { + "balance": "0x4563918244f400000" }, - "3e8349b67f5745449f659367d9ad4712db5b895a": { - "balance": "1820000000000000000000" + "0x3e8349b67f5745449f659367d9ad4712db5b895a": { + "balance": "0x62a992e53a0af00000" }, - "79cfa9780ae6d87b2c31883f09276986c89a6735": { - "balance": "1000000000000000000000" + "0x79cfa9780ae6d87b2c31883f09276986c89a6735": { + "balance": "0x3635c9adc5dea00000" }, - "5006fe4c22173980f00c74342b39cd231c653129": { - "balance": "2000000000000000000000" + "0x5006fe4c22173980f00c74342b39cd231c653129": { + "balance": "0x6c6b935b8bbd400000" }, - "13848b46ea75beb7eaa85f59d866d77fd24cf21a": { - "balance": "50000000000000000000000" + "0x13848b46ea75beb7eaa85f59d866d77fd24cf21a": { + "balance": "0xa968163f0a57b400000" }, - "d64a2d50f8858537188a24e0f50df1681ab07ed7": { - "balance": "38800000000000000000000" + "0xd64a2d50f8858537188a24e0f50df1681ab07ed7": { + "balance": "0x8375a2abcca24400000" }, - "4f9ce2af9b8c5e42c6808a3870ec576f313545d1": { - "balance": "10000000000000000000000" + "0x4f9ce2af9b8c5e42c6808a3870ec576f313545d1": { + "balance": "0x21e19e0c9bab2400000" }, - "8764d02722000996ecd475b433298e9f540b05bf": { - "balance": "200000000000000000000" + "0x8764d02722000996ecd475b433298e9f540b05bf": { + "balance": "0xad78ebc5ac6200000" }, - "3b7c77dbe95dc2602ce3269a9545d04965fefdbd": { - "balance": "2000000000000000000000" + "0x3b7c77dbe95dc2602ce3269a9545d04965fefdbd": { + "balance": "0x6c6b935b8bbd400000" }, - "c9dcbb056f4db7d9da39936202c5bd8230b3b477": { - "balance": "20000000000000000000000" + "0xc9dcbb056f4db7d9da39936202c5bd8230b3b477": { + "balance": "0x43c33c1937564800000" }, - "9ecbabb0b22782b3754429e1757aaba04b81189f": { - "balance": "823743000000000000000" + "0x9ecbabb0b22782b3754429e1757aaba04b81189f": { + "balance": "0x2ca7bb061f5e998000" }, - "831c44b3084047184b2ad218680640903750c45d": { - "balance": "1970000000000000000000" + "0x831c44b3084047184b2ad218680640903750c45d": { + "balance": "0x6acb3df27e1f880000" }, - "ff8eb07de3d49d9d52bbe8e5b26dbe1d160fa834": { - "balance": "3986000000000000000000" + "0xff8eb07de3d49d9d52bbe8e5b26dbe1d160fa834": { + "balance": "0xd814dcb94453080000" }, - "8ccf3aa21ab742576ad8c422f71bb188591dea8a": { - "balance": "1000000000000000000000" + "0x8ccf3aa21ab742576ad8c422f71bb188591dea8a": { + "balance": "0x3635c9adc5dea00000" }, - "ddac312a9655426a9c0c9efa3fd82559ef4505bf": { - "balance": "401100000000000000000" + "0xddac312a9655426a9c0c9efa3fd82559ef4505bf": { + "balance": "0x15be6174e1912e0000" }, - "9a3e2b1bf346dd070b027357feac44a4b2c97db8": { - "balance": "10000000000000000000000" + "0x9a3e2b1bf346dd070b027357feac44a4b2c97db8": { + "balance": "0x21e19e0c9bab2400000" }, - "69d39d510889e552a396135bfcdb06e37e387633": { - "balance": "4000000000000000000000" + "0x69d39d510889e552a396135bfcdb06e37e387633": { + "balance": "0xd8d726b7177a800000" }, - "83a3148833d9644984f7c475a7850716efb480ff": { - "balance": "3400000000000000000000" + "0x83a3148833d9644984f7c475a7850716efb480ff": { + "balance": "0xb8507a820728200000" }, - "62b4a9226e61683c72c183254690daf511b4117a": { - "balance": "260000000000000000000" + "0x62b4a9226e61683c72c183254690daf511b4117a": { + "balance": "0xe18398e7601900000" }, - "50763add868fd7361178342fc055eaa2b95f6846": { - "balance": "66838000000000000000" + "0x50763add868fd7361178342fc055eaa2b95f6846": { + "balance": "0x39f9046e0898f0000" }, - "91898eab8c05c0222883cd4db23b7795e1a24ad7": { - "balance": "2000000000000000000000" + "0x91898eab8c05c0222883cd4db23b7795e1a24ad7": { + "balance": "0x6c6b935b8bbd400000" }, - "066647cfc85d23d37605573d208ca154b244d76c": { - "balance": "10000000000000000000000" + "0x066647cfc85d23d37605573d208ca154b244d76c": { + "balance": "0x21e19e0c9bab2400000" }, - "aaf9ee4b886c6d1e95496fd274235bf4ecfcb07d": { - "balance": "1400000000000000000000" + "0xaaf9ee4b886c6d1e95496fd274235bf4ecfcb07d": { + "balance": "0x4be4e7267b6ae00000" }, - "06860a93525955ff624940fadcffb8e149fd599c": { - "balance": "1999800000000000000000" + "0x06860a93525955ff624940fadcffb8e149fd599c": { + "balance": "0x6c68ccd09b022c0000" }, - "e81c2d346c0adf4cc56708f6394ba6c8c8a64a1e": { - "balance": "2000000000000000000000" + "0xe81c2d346c0adf4cc56708f6394ba6c8c8a64a1e": { + "balance": "0x6c6b935b8bbd400000" }, - "41a8e236a30e6d63c1ff644d132aa25c89537e01": { - "balance": "20000000000000000000" + "0x41a8e236a30e6d63c1ff644d132aa25c89537e01": { + "balance": "0x1158e460913d00000" }, - "6a679e378fdce6bfd97fe62f043c6f6405d79e99": { - "balance": "4000000000000000000000" + "0x6a679e378fdce6bfd97fe62f043c6f6405d79e99": { + "balance": "0xd8d726b7177a800000" }, - "933436c8472655f64c3afaaf7c4c621c83a62b38": { - "balance": "1000000000000000000000" + "0x933436c8472655f64c3afaaf7c4c621c83a62b38": { + "balance": "0x3635c9adc5dea00000" }, - "abe07ced6ac5ddf991eff6c3da226a741bd243fe": { - "balance": "10000000000000000000000" + "0xabe07ced6ac5ddf991eff6c3da226a741bd243fe": { + "balance": "0x21e19e0c9bab2400000" }, - "bb56a404723cff20d0685488b05a02cdc35aacaa": { - "balance": "20000000000000000000" + "0xbb56a404723cff20d0685488b05a02cdc35aacaa": { + "balance": "0x1158e460913d00000" }, - "0d551ec1a2133c981d5fc6a8c8173f9e7c4f47af": { - "balance": "2000000000000000000000" + "0x0d551ec1a2133c981d5fc6a8c8173f9e7c4f47af": { + "balance": "0x6c6b935b8bbd400000" }, - "23376ecabf746ce53321cf42c86649b92b67b2ff": { - "balance": "2000000000000000000000" + "0x23376ecabf746ce53321cf42c86649b92b67b2ff": { + "balance": "0x6c6b935b8bbd400000" }, - "644ba6c61082e989109f5c11d4b40e991660d403": { - "balance": "4000000000000000000000" + "0x644ba6c61082e989109f5c11d4b40e991660d403": { + "balance": "0xd8d726b7177a800000" }, - "680d5911ed8dd9eec45c060c223f89a7f620bbd5": { - "balance": "20000000000000000000000" + "0x680d5911ed8dd9eec45c060c223f89a7f620bbd5": { + "balance": "0x43c33c1937564800000" }, - "cb1bb6f1da5eb10d4899f7e61d06c1b00fdfb52d": { - "balance": "1038000000000000000000" + "0xcb1bb6f1da5eb10d4899f7e61d06c1b00fdfb52d": { + "balance": "0x384524cc70b7780000" }, - "303a30ac4286ae17cf483dad7b870c6bd64d7b4a": { - "balance": "500000000000000000000" + "0x303a30ac4286ae17cf483dad7b870c6bd64d7b4a": { + "balance": "0x1b1ae4d6e2ef500000" }, - "7b0b31ff6e24745ead8ed9bb85fc0bf2fe1d55d4": { - "balance": "800000000000000000000" + "0x7b0b31ff6e24745ead8ed9bb85fc0bf2fe1d55d4": { + "balance": "0x2b5e3af16b18800000" }, - "854691ce714f325ced55ce5928ce9ba12facd1b8": { - "balance": "4380000000000000000000" + "0x854691ce714f325ced55ce5928ce9ba12facd1b8": { + "balance": "0xed70b5e9c3f2f00000" }, - "a13cfe826d6d1841dcae443be8c387518136b5e8": { - "balance": "140000000000000000000000" + "0xa13cfe826d6d1841dcae443be8c387518136b5e8": { + "balance": "0x1da56a4b0835bf800000" }, - "5fcd84546896dd081db1a320bd4d8c1dd1528c4c": { - "balance": "20000000000000000000" + "0x5fcd84546896dd081db1a320bd4d8c1dd1528c4c": { + "balance": "0x1158e460913d00000" }, - "3db5fe6a68bd3612ac15a99a61e555928eeceaf3": { - "balance": "1580000000000000000000" + "0x3db5fe6a68bd3612ac15a99a61e555928eeceaf3": { + "balance": "0x55a6e79ccd1d300000" }, - "7a79e30ff057f70a3d0191f7f53f761537af7dff": { - "balance": "400000000000000000000" + "0x7a79e30ff057f70a3d0191f7f53f761537af7dff": { + "balance": "0x15af1d78b58c400000" }, - "3d3fad49c9e5d2759c8e8e5a7a4d60a0dd135692": { - "balance": "20000000000000000000" + "0x3d3fad49c9e5d2759c8e8e5a7a4d60a0dd135692": { + "balance": "0x1158e460913d00000" }, - "05a830724302bc0f6ebdaa1ebeeeb46e6ce00b39": { - "balance": "98500000000000000000" + "0x05a830724302bc0f6ebdaa1ebeeeb46e6ce00b39": { + "balance": "0x556f64c1fe7fa0000" }, - "e4b6ae22c7735f5b89f34dd77ad0975f0acc9181": { - "balance": "1000000000000000000000" + "0xe4b6ae22c7735f5b89f34dd77ad0975f0acc9181": { + "balance": "0x3635c9adc5dea00000" }, - "3f2dd55db7eab0ebee65b33ed8202c1e992e958b": { - "balance": "820000000000000000000" + "0x3f2dd55db7eab0ebee65b33ed8202c1e992e958b": { + "balance": "0x2c73c937742c500000" }, - "395d6d255520a8db29abc47d83a5db8a1a7df087": { - "balance": "100000000000000000000" + "0x395d6d255520a8db29abc47d83a5db8a1a7df087": { + "balance": "0x56bc75e2d63100000" }, - "1cc90876004109cd79a3dea866cb840ac364ba1b": { - "balance": "2000000000000000000000" + "0x1cc90876004109cd79a3dea866cb840ac364ba1b": { + "balance": "0x6c6b935b8bbd400000" }, - "c83e9d6a58253beebeb793e6f28b054a58491b74": { - "balance": "281800000000000000000" + "0xc83e9d6a58253beebeb793e6f28b054a58491b74": { + "balance": "0xf46c2b6f5a9140000" }, - "901d99b699e5c6911519cb2076b4c76330c54d22": { - "balance": "2000000000000000000000" + "0x901d99b699e5c6911519cb2076b4c76330c54d22": { + "balance": "0x6c6b935b8bbd400000" }, - "3a9132b7093d3ec42e1e4fb8cb31ecdd43ae773c": { - "balance": "2000000000000000000000" + "0x3a9132b7093d3ec42e1e4fb8cb31ecdd43ae773c": { + "balance": "0x6c6b935b8bbd400000" }, - "b41eaf5d51a5ba1ba39bb418dbb54fab750efb1f": { - "balance": "1000000000000000000000" + "0xb41eaf5d51a5ba1ba39bb418dbb54fab750efb1f": { + "balance": "0x3635c9adc5dea00000" }, - "aa493d3f4fb866491cf8f800efb7e2324ed7cfe5": { - "balance": "1700000000000000000000" + "0xaa493d3f4fb866491cf8f800efb7e2324ed7cfe5": { + "balance": "0x5c283d410394100000" }, - "509982f56237ee458951047e0a2230f804e2e895": { - "balance": "17500000000000000000000" + "0x509982f56237ee458951047e0a2230f804e2e895": { + "balance": "0x3b4ad496106b7f00000" }, - "316e92a91bbda68b9e2f98b3c048934e3cc0b416": { - "balance": "2000000000000000000000" + "0x316e92a91bbda68b9e2f98b3c048934e3cc0b416": { + "balance": "0x6c6b935b8bbd400000" }, - "a3430e1f647f321ed34739562323c7d623410b56": { - "balance": "999942000000000000000" + "0xa3430e1f647f321ed34739562323c7d623410b56": { + "balance": "0x3634fb9f1489a70000" }, - "fca43bbc23a0d321ba9e46b929735ce7d8ef0c18": { - "balance": "20000000000000000000" + "0xfca43bbc23a0d321ba9e46b929735ce7d8ef0c18": { + "balance": "0x1158e460913d00000" }, - "ff45cb34c928364d9cc9d8bb00373474618f06f3": { - "balance": "100000000000000000000" + "0xff45cb34c928364d9cc9d8bb00373474618f06f3": { + "balance": "0x56bc75e2d63100000" }, - "8c999591fd72ef7111efca7a9e97a2356b3b000a": { - "balance": "4084000000000000000000" + "0x8c999591fd72ef7111efca7a9e97a2356b3b000a": { + "balance": "0xdd64e2aa0a67500000" }, - "8579dadf1a395a3471e20b6f763d9a0ff19a3f6f": { - "balance": "4000000000000000000000" + "0x8579dadf1a395a3471e20b6f763d9a0ff19a3f6f": { + "balance": "0xd8d726b7177a800000" }, - "c8d4e1599d03b79809e0130a8dc38408f05e8cd3": { - "balance": "2945500000000000000000" + "0xc8d4e1599d03b79809e0130a8dc38408f05e8cd3": { + "balance": "0x9fad06241279160000" }, - "2abce1808940cd4ef5b5e05285f82df7a9ab5e03": { - "balance": "9800000000000000000000" + "0x2abce1808940cd4ef5b5e05285f82df7a9ab5e03": { + "balance": "0x21342520d5fec200000" }, - "0bb0c12682a2f15c9b5741b2385cbe41f034068e": { - "balance": "1500000000000000000000" + "0x0bb0c12682a2f15c9b5741b2385cbe41f034068e": { + "balance": "0x5150ae84a8cdf00000" }, - "08b7bdcf944d5570838be70460243a8694485858": { - "balance": "2000000000000000000000" + "0x08b7bdcf944d5570838be70460243a8694485858": { + "balance": "0x6c6b935b8bbd400000" }, - "c452e0e4b3d6ae06b836f032ca09db409ddfe0fb": { - "balance": "800000000000000000000" + "0xc452e0e4b3d6ae06b836f032ca09db409ddfe0fb": { + "balance": "0x2b5e3af16b18800000" }, - "48d4f2468f963fd79a006198bb67895d2d5aa4d3": { - "balance": "1400000000000000000000" + "0x48d4f2468f963fd79a006198bb67895d2d5aa4d3": { + "balance": "0x4be4e7267b6ae00000" }, - "f9e7222faaf0f4da40c1c4a40630373a09bed7b6": { - "balance": "2865000000000000000000" + "0xf9e7222faaf0f4da40c1c4a40630373a09bed7b6": { + "balance": "0x9b4fdcb09456240000" }, - "bf59aee281fa43fe97194351a9857e01a3b897b2": { - "balance": "600000000000000000000" + "0xbf59aee281fa43fe97194351a9857e01a3b897b2": { + "balance": "0x2086ac351052600000" }, - "da0d4b7ef91fb55ad265f251142067f10376ced6": { - "balance": "20000000000000000000000" + "0xda0d4b7ef91fb55ad265f251142067f10376ced6": { + "balance": "0x43c33c1937564800000" }, - "2c6f5c124cc789f8bb398e3f889751bc4b602d9e": { - "balance": "24928000000000000000" + "0x2c6f5c124cc789f8bb398e3f889751bc4b602d9e": { + "balance": "0x159f20bed00f00000" }, - "c85ef27d820403805fc9ed259fff64acb8d6346a": { - "balance": "2000000000000000000000" + "0xc85ef27d820403805fc9ed259fff64acb8d6346a": { + "balance": "0x6c6b935b8bbd400000" }, - "9aa8308f42910e5ade09c1a5e282d6d91710bdbf": { - "balance": "200000000000000000000" + "0x9aa8308f42910e5ade09c1a5e282d6d91710bdbf": { + "balance": "0xad78ebc5ac6200000" }, - "9e4cec353ac3e381835e3c0991f8faa5b7d0a8e6": { - "balance": "9999917000000000000000" + "0x9e4cec353ac3e381835e3c0991f8faa5b7d0a8e6": { + "balance": "0x21e18b9e9ab45e48000" }, - "137cf341e8516c815814ebcd73e6569af14cf7bc": { - "balance": "1000000000000000000000" + "0x137cf341e8516c815814ebcd73e6569af14cf7bc": { + "balance": "0x3635c9adc5dea00000" }, - "889da662eb4a0a2a069d2bc24b05b4ee2e92c41b": { - "balance": "1663417000000000000000" + "0x889da662eb4a0a2a069d2bc24b05b4ee2e92c41b": { + "balance": "0x5a2c8c5456c9f28000" }, - "0998d8273115b56af43c505e087aff0676ed3659": { - "balance": "3999984000000000000000" + "0x0998d8273115b56af43c505e087aff0676ed3659": { + "balance": "0xd8d6eddf2d2e180000" }, - "3e4d13c55a84e46ed7e9cb90fd355e8ad991e38f": { - "balance": "1000000000000000000000" + "0x3e4d13c55a84e46ed7e9cb90fd355e8ad991e38f": { + "balance": "0x3635c9adc5dea00000" }, - "abc068b4979b0ea64a62d3b7aa897d73810dc533": { - "balance": "1970000000000000000000" + "0xabc068b4979b0ea64a62d3b7aa897d73810dc533": { + "balance": "0x6acb3df27e1f880000" }, - "d8fdf546674738c984d8fab857880b3e4280c09e": { - "balance": "20000000000000000000" + "0xd8fdf546674738c984d8fab857880b3e4280c09e": { + "balance": "0x1158e460913d00000" }, - "aff161740a6d909fe99c59a9b77945c91cc91448": { - "balance": "60000000000000000000" + "0xaff161740a6d909fe99c59a9b77945c91cc91448": { + "balance": "0x340aad21b3b700000" }, - "92ad1b3d75fba67d54663da9fc848a8ade10fa67": { - "balance": "2000000000000000000000" + "0x92ad1b3d75fba67d54663da9fc848a8ade10fa67": { + "balance": "0x6c6b935b8bbd400000" }, - "819eb4990b5aba5547093da12b6b3c1093df6d46": { - "balance": "1000000000000000000000" + "0x819eb4990b5aba5547093da12b6b3c1093df6d46": { + "balance": "0x3635c9adc5dea00000" }, - "643d9aeed4b180947ed2b9207cce4c3ddc55e1f7": { - "balance": "200000000000000000000" + "0x643d9aeed4b180947ed2b9207cce4c3ddc55e1f7": { + "balance": "0xad78ebc5ac6200000" }, - "ab3e62e77a8b225e411592b1af300752fe412463": { - "balance": "9850000000000000000000" + "0xab3e62e77a8b225e411592b1af300752fe412463": { + "balance": "0x215f835bc769da80000" }, - "650b425555e4e4c51718146836a2c1ee77a5b421": { - "balance": "20000000000000000000000" + "0x650b425555e4e4c51718146836a2c1ee77a5b421": { + "balance": "0x43c33c1937564800000" }, - "ba8e46d69d2e2343d86c60d82cf42c2041a0c1c2": { - "balance": "100000000000000000000" + "0xba8e46d69d2e2343d86c60d82cf42c2041a0c1c2": { + "balance": "0x56bc75e2d63100000" }, - "f9570e924c95debb7061369792cf2efec2a82d5e": { - "balance": "20000000000000000000" + "0xf9570e924c95debb7061369792cf2efec2a82d5e": { + "balance": "0x1158e460913d00000" }, - "4dc4bf5e7589c47b28378d7503cf96488061dbbd": { - "balance": "1760000000000000000000" + "0x4dc4bf5e7589c47b28378d7503cf96488061dbbd": { + "balance": "0x5f68e8131ecf800000" }, - "3d7ea5bf03528100ed8af8aed2653e921b6e6725": { - "balance": "1000000000000000000000" + "0x3d7ea5bf03528100ed8af8aed2653e921b6e6725": { + "balance": "0x3635c9adc5dea00000" }, - "a02bde6461686e19ac650c970d0672e76dcb4fc2": { - "balance": "8865000000000000000000" + "0xa02bde6461686e19ac650c970d0672e76dcb4fc2": { + "balance": "0x1e09296c3378de40000" }, - "b0e760bb07c081777345e0578e8bc898226d4e3b": { - "balance": "2000000000000000000000" + "0xb0e760bb07c081777345e0578e8bc898226d4e3b": { + "balance": "0x6c6b935b8bbd400000" }, - "979cbf21dfec8ace3f1c196d82df962534df394f": { - "balance": "2832860000000000000000" + "0x979cbf21dfec8ace3f1c196d82df962534df394f": { + "balance": "0x9991d478dd4d160000" }, - "9f8245c3ab7d173164861cd3991b94f1ba40a93a": { - "balance": "2860000000000000000000" + "0x9f8245c3ab7d173164861cd3991b94f1ba40a93a": { + "balance": "0x9b0a791f1211300000" }, - "c25cf826550c8eaf10af2234fef904ddb95213be": { - "balance": "1000000000000000000000" + "0xc25cf826550c8eaf10af2234fef904ddb95213be": { + "balance": "0x3635c9adc5dea00000" }, - "967bfaf76243cdb9403c67d2ceefdee90a3feb73": { - "balance": "970582000000000000000" + "0x967bfaf76243cdb9403c67d2ceefdee90a3feb73": { + "balance": "0x349d87f2a2dc2f0000" }, - "0b2113504534642a1daf102eee10b9ebde76e261": { - "balance": "2733351000000000000000" + "0x0b2113504534642a1daf102eee10b9ebde76e261": { + "balance": "0x942cdd7c95f2bd8000" }, - "74bc4a5e2045f4ff8db184cf3a9b0c065ad807d2": { - "balance": "2000000000000000000000" + "0x74bc4a5e2045f4ff8db184cf3a9b0c065ad807d2": { + "balance": "0x6c6b935b8bbd400000" }, - "f1da40736f99d5df3b068a5d745fafc6463fc9b1": { - "balance": "121546000000000000000" + "0xf1da40736f99d5df3b068a5d745fafc6463fc9b1": { + "balance": "0x696ca23058da10000" }, - "0fa6c7b0973d0bae2940540e247d3627e37ca347": { - "balance": "1000000000000000000000" + "0x0fa6c7b0973d0bae2940540e247d3627e37ca347": { + "balance": "0x3635c9adc5dea00000" }, - "72b05962fb2ad589d65ad16a22559eba1458f387": { - "balance": "133700000000000000000" + "0x72b05962fb2ad589d65ad16a22559eba1458f387": { + "balance": "0x73f75d1a085ba0000" }, - "6ceae3733d8fa43d6cd80c1a96e8eb93109c83b7": { - "balance": "298000000000000000000" + "0x6ceae3733d8fa43d6cd80c1a96e8eb93109c83b7": { + "balance": "0x102794ad20da680000" }, - "28eaea78cd4d95faecfb68836eafe83520f3bbb7": { - "balance": "200000000000000000000" + "0x28eaea78cd4d95faecfb68836eafe83520f3bbb7": { + "balance": "0xad78ebc5ac6200000" }, - "f49f6f9baabc018c8f8e119e0115f491fc92a8a4": { - "balance": "10000000000000000000000" + "0xf49f6f9baabc018c8f8e119e0115f491fc92a8a4": { + "balance": "0x21e19e0c9bab2400000" }, - "833316985d47742bfed410604a91953c05fb12b0": { - "balance": "2000000000000000000000" + "0x833316985d47742bfed410604a91953c05fb12b0": { + "balance": "0x6c6b935b8bbd400000" }, - "ead75016e3a0815072b6b108bcc1b799acf0383e": { - "balance": "2000000000000000000000" + "0xead75016e3a0815072b6b108bcc1b799acf0383e": { + "balance": "0x6c6b935b8bbd400000" }, - "0032403587947b9f15622a68d104d54d33dbd1cd": { - "balance": "77500000000000000000" + "0x0032403587947b9f15622a68d104d54d33dbd1cd": { + "balance": "0x433874f632cc60000" }, - "8f64b9c1246d857831643107d355b5c75fef5d4f": { - "balance": "1999944000000000000000" + "0x8f64b9c1246d857831643107d355b5c75fef5d4f": { + "balance": "0x6c6acc67d7b1d40000" }, - "15dcafcc2bace7b55b54c01a1c514626bf61ebd8": { - "balance": "9400000000000000000000" + "0x15dcafcc2bace7b55b54c01a1c514626bf61ebd8": { + "balance": "0x1fd933494aa5fe00000" }, - "6886ada7bbb0617bda842191c68c922ea3a8ac82": { - "balance": "1160000000000000000000" + "0x6886ada7bbb0617bda842191c68c922ea3a8ac82": { + "balance": "0x3ee23bde0e7d200000" }, - "f736dc96760012388fe88b66c06efe57e0d7cf0a": { - "balance": "2100000000000000000000" + "0xf736dc96760012388fe88b66c06efe57e0d7cf0a": { + "balance": "0x71d75ab9b920500000" }, - "0b288a5a8b75f3dc4191eb0457e1c83dbd204d25": { - "balance": "4853000000000000000000" + "0x0b288a5a8b75f3dc4191eb0457e1c83dbd204d25": { + "balance": "0x10714e77bb43ab40000" }, - "56b6c23dd2ec90b4728f3bb2e764c3c50c85f144": { - "balance": "1000000000000000000000" + "0x56b6c23dd2ec90b4728f3bb2e764c3c50c85f144": { + "balance": "0x3635c9adc5dea00000" }, - "6310b020fd98044957995092090f17f04e52cdfd": { - "balance": "1580000000000000000000" + "0x6310b020fd98044957995092090f17f04e52cdfd": { + "balance": "0x55a6e79ccd1d300000" }, - "b0baeb30e313776c4c6d247402ba4167afcda1cc": { - "balance": "1970000000000000000000" + "0xb0baeb30e313776c4c6d247402ba4167afcda1cc": { + "balance": "0x6acb3df27e1f880000" }, - "7641f7d26a86cddb2be13081810e01c9c83c4b20": { - "balance": "13370000000000000000" + "0x7641f7d26a86cddb2be13081810e01c9c83c4b20": { + "balance": "0xb98bc829a6f90000" }, - "07a8dadec142571a7d53a4297051786d072cba55": { - "balance": "22729000000000000000" + "0x07a8dadec142571a7d53a4297051786d072cba55": { + "balance": "0x13b6da1139bda8000" }, - "cc73dd356b4979b579b401d4cc7a31a268ddce5a": { - "balance": "500000000000000000000" + "0xcc73dd356b4979b579b401d4cc7a31a268ddce5a": { + "balance": "0x1b1ae4d6e2ef500000" }, - "adf1acfe99bc8c14b304c8d905ba27657b8a7bc4": { - "balance": "20000000000000000000000" + "0xadf1acfe99bc8c14b304c8d905ba27657b8a7bc4": { + "balance": "0x43c33c1937564800000" }, - "72dabb5b6eed9e99be915888f6568056381608f8": { - "balance": "208433000000000000000" + "0x72dabb5b6eed9e99be915888f6568056381608f8": { + "balance": "0xb4c96c52cb4fe8000" }, - "9de20ae76aa08263b205d5142461961e2408d266": { - "balance": "252000000000000000000" + "0x9de20ae76aa08263b205d5142461961e2408d266": { + "balance": "0xda933d8d8c6700000" }, - "9d4ff989b7bed9ab109d10c8c7e55f02d76734ad": { - "balance": "1000000000000000000000" + "0x9d4ff989b7bed9ab109d10c8c7e55f02d76734ad": { + "balance": "0x3635c9adc5dea00000" }, - "e58dd23238ee6ea7c2138d385df500c325f376be": { - "balance": "1820000000000000000000" + "0xe58dd23238ee6ea7c2138d385df500c325f376be": { + "balance": "0x62a992e53a0af00000" }, - "4bd6dd0cff23400e1730ba7b894504577d14e74a": { - "balance": "206028000000000000000000" + "0x4bd6dd0cff23400e1730ba7b894504577d14e74a": { + "balance": "0x2ba0ccddd0df73b00000" }, - "35147430c3106500e79fa2f502462e94703c23b1": { - "balance": "1999944000000000000000" + "0x35147430c3106500e79fa2f502462e94703c23b1": { + "balance": "0x6c6acc67d7b1d40000" }, - "c0ae14d724832e2fce2778de7f7b8daf7b12a93e": { - "balance": "20000000000000000000" + "0xc0ae14d724832e2fce2778de7f7b8daf7b12a93e": { + "balance": "0x1158e460913d00000" }, - "b57413060af3f14eb479065f1e9d19b3757ae8cc": { - "balance": "40000000000000000000" + "0xb57413060af3f14eb479065f1e9d19b3757ae8cc": { + "balance": "0x22b1c8c1227a00000" }, - "7d04d2edc058a1afc761d9c99ae4fc5c85d4c8a6": { - "balance": "314807840000000000000000" + "0x7d04d2edc058a1afc761d9c99ae4fc5c85d4c8a6": { + "balance": "0x42a9c4675c9467d00000" }, - "1c94d636e684eb155895ce6db4a2588fba1d001b": { - "balance": "2000000000000000000000" + "0x1c94d636e684eb155895ce6db4a2588fba1d001b": { + "balance": "0x6c6b935b8bbd400000" }, - "c721b2a7aa44c21298e85039d00e2e460e670b9c": { - "balance": "140800000000000000000" + "0xc721b2a7aa44c21298e85039d00e2e460e670b9c": { + "balance": "0x7a1fe160277000000" }, - "2d89a8006a4f137a20dc2bec46fe2eb312ea9654": { - "balance": "200000000000000000000" + "0x2d89a8006a4f137a20dc2bec46fe2eb312ea9654": { + "balance": "0xad78ebc5ac6200000" }, - "646afba71d849e80c0ed59cac519b278e7f7abe4": { - "balance": "1000000000000000000000" + "0x646afba71d849e80c0ed59cac519b278e7f7abe4": { + "balance": "0x3635c9adc5dea00000" }, - "71f2cdd1b046e2da2fbb5a26723422b8325e25a3": { - "balance": "99960000000000000000" + "0x71f2cdd1b046e2da2fbb5a26723422b8325e25a3": { + "balance": "0x56b394263a40c0000" }, - "2c9fa72c95f37d08e9a36009e7a4b07f29bad41a": { - "balance": "16100000000000000000" + "0x2c9fa72c95f37d08e9a36009e7a4b07f29bad41a": { + "balance": "0xdf6eb0b2d3ca0000" }, - "848fbd29d67cf4a013cb02a4b176ef244e9ee68d": { - "balance": "20116000000000000000" + "0x848fbd29d67cf4a013cb02a4b176ef244e9ee68d": { + "balance": "0x1172a636bbdc20000" }, - "68190ca885da4231874c1cfb42b1580a21737f38": { - "balance": "3820000000000000000000" + "0x68190ca885da4231874c1cfb42b1580a21737f38": { + "balance": "0xcf152640c5c8300000" }, - "9adf458bff3599eee1a26398853c575bc38c6313": { - "balance": "280000000000000000000" + "0x9adf458bff3599eee1a26398853c575bc38c6313": { + "balance": "0xf2dc7d47f15600000" }, - "b72220ade364d0369f2d2da783ca474d7b9b34ce": { - "balance": "499986000000000000000" + "0xb72220ade364d0369f2d2da783ca474d7b9b34ce": { + "balance": "0x1b1ab319f5ec750000" }, - "38e2af73393ea98a1d993a74df5cd754b98d529a": { - "balance": "1790000000000000000000" + "0x38e2af73393ea98a1d993a74df5cd754b98d529a": { + "balance": "0x61093d7c2c6d380000" }, - "4d38d90f83f4515c03cc78326a154d358bd882b7": { - "balance": "185000000000000000000" + "0x4d38d90f83f4515c03cc78326a154d358bd882b7": { + "balance": "0xa076407d3f7440000" }, - "aa8eb0823b07b0e6d20aadda0e95cf3835be192e": { - "balance": "32000000000000000000" + "0xaa8eb0823b07b0e6d20aadda0e95cf3835be192e": { + "balance": "0x1bc16d674ec800000" }, - "008639dabbe3aeac887b5dc0e43e13bcd287d76c": { - "balance": "310200000000000000000" + "0x008639dabbe3aeac887b5dc0e43e13bcd287d76c": { + "balance": "0x10d0e3c87d6e2c0000" }, - "fa3a0c4b903f6ea52ea7ab7b8863b6a616ad6650": { - "balance": "20000000000000000000" + "0xfa3a0c4b903f6ea52ea7ab7b8863b6a616ad6650": { + "balance": "0x1158e460913d00000" }, - "e26bf322774e18288769d67e3107deb7447707b8": { - "balance": "2000000000000000000000" + "0xe26bf322774e18288769d67e3107deb7447707b8": { + "balance": "0x6c6b935b8bbd400000" }, - "e061a4f2fc77b296d19ada238e49a5cb8ecbfa70": { - "balance": "4000000000000000000000" + "0xe061a4f2fc77b296d19ada238e49a5cb8ecbfa70": { + "balance": "0xd8d726b7177a800000" }, - "b320834836d1dbfda9e7a3184d1ad1fd4320ccc0": { - "balance": "1000000000000000000000" + "0xb320834836d1dbfda9e7a3184d1ad1fd4320ccc0": { + "balance": "0x3635c9adc5dea00000" }, - "0ed3bb3a4eb554cfca97947d575507cdfd6d21d8": { - "balance": "547863000000000000000" + "0x0ed3bb3a4eb554cfca97947d575507cdfd6d21d8": { + "balance": "0x1db3205fcc23d58000" }, - "32fa0e86cd087dd68d693190f32d93310909ed53": { - "balance": "4000000000000000000000" + "0x32fa0e86cd087dd68d693190f32d93310909ed53": { + "balance": "0xd8d726b7177a800000" }, - "5b759fa110a31c88469f54d44ba303d57dd3e10f": { - "balance": "1683760000000000000000" + "0x5b759fa110a31c88469f54d44ba303d57dd3e10f": { + "balance": "0x5b46dd2f0ea3b80000" }, - "136f4907cab41e27084b9845069ff2fd0c9ade79": { - "balance": "4000000000000000000000" + "0x136f4907cab41e27084b9845069ff2fd0c9ade79": { + "balance": "0xd8d726b7177a800000" }, - "3d89e505cb46e211a53f32f167a877bec87f4b0a": { - "balance": "25019000000000000000" + "0x3d89e505cb46e211a53f32f167a877bec87f4b0a": { + "balance": "0x15b3557f1937f8000" }, - "57a852fdb9b1405bf53ccf9508f83299d3206c52": { - "balance": "2000000000000000000000" + "0x57a852fdb9b1405bf53ccf9508f83299d3206c52": { + "balance": "0x6c6b935b8bbd400000" }, - "747abc9649056d3926044d28c3ad09ed17b67d70": { - "balance": "5000057000000000000000" + "0x747abc9649056d3926044d28c3ad09ed17b67d70": { + "balance": "0x10f0dbae61009528000" }, - "5c29f9e9a523c1f8669448b55c48cbd47c25e610": { - "balance": "964320000000000000000" + "0x5c29f9e9a523c1f8669448b55c48cbd47c25e610": { + "balance": "0x3446a0dad04cb00000" }, - "30a9da72574c51e7ee0904ba1f73a6b7b83b9b9d": { - "balance": "20200000000000000000" + "0x30a9da72574c51e7ee0904ba1f73a6b7b83b9b9d": { + "balance": "0x11854d0f9cee40000" }, - "220e2b92c0f6c902b513d9f1e6fab6a8b0def3d7": { - "balance": "800000000000000000000" + "0x220e2b92c0f6c902b513d9f1e6fab6a8b0def3d7": { + "balance": "0x2b5e3af16b18800000" }, - "5af7c072b2c5acd71c76addcce535cf7f8f93585": { - "balance": "20000000000000000000" + "0x5af7c072b2c5acd71c76addcce535cf7f8f93585": { + "balance": "0x1158e460913d00000" }, - "81556db27349ab8b27004944ed50a46e941a0f5f": { - "balance": "3998000000000000000000" + "0x81556db27349ab8b27004944ed50a46e941a0f5f": { + "balance": "0xd8bb6549b02bb80000" }, - "987618c85656207c7bac1507c0ffefa2fb64b092": { - "balance": "64419000000000000000" + "0x987618c85656207c7bac1507c0ffefa2fb64b092": { + "balance": "0x37dfe433189e38000" }, - "e0f372347c96b55f7d4306034beb83266fd90966": { - "balance": "400000000000000000000" + "0xe0f372347c96b55f7d4306034beb83266fd90966": { + "balance": "0x15af1d78b58c400000" }, - "71784c105117c1f68935797fe159abc74e43d16a": { - "balance": "2001600000000000000000" + "0x71784c105117c1f68935797fe159abc74e43d16a": { + "balance": "0x6c81c7b31195e00000" }, - "9284f96ddb47b5186ee558aa31324df5361c0f73": { - "balance": "16000000000000000000000" + "0x9284f96ddb47b5186ee558aa31324df5361c0f73": { + "balance": "0x3635c9adc5dea000000" }, - "a60c1209754f5d87b181da4f0817a81859ef9fd8": { - "balance": "50000000000000000000" + "0xa60c1209754f5d87b181da4f0817a81859ef9fd8": { + "balance": "0x2b5e3af16b1880000" }, - "5afda9405c8e9736514574da928de67456010918": { - "balance": "6008500000000000000000" + "0x5afda9405c8e9736514574da928de67456010918": { + "balance": "0x145b8b0239a46920000" }, - "6978696d5150a9a263513f8f74c696f8b1397cab": { - "balance": "6640000000000000000000" + "0x6978696d5150a9a263513f8f74c696f8b1397cab": { + "balance": "0x167f482d3c5b1c00000" }, - "a9ad1926bc66bdb331588ea8193788534d982c98": { - "balance": "30000000000000000000000" + "0xa9ad1926bc66bdb331588ea8193788534d982c98": { + "balance": "0x65a4da25d3016c00000" }, - "e3f80b40fb83fb97bb0d5230af4f6ed59b1c7cc8": { - "balance": "1337000000000000000000" + "0xe3f80b40fb83fb97bb0d5230af4f6ed59b1c7cc8": { + "balance": "0x487a9a304539440000" }, - "e207578e1f4ddb8ff6d5867b39582d71b9812ac5": { - "balance": "3880000000000000000000" + "0xe207578e1f4ddb8ff6d5867b39582d71b9812ac5": { + "balance": "0xd255d112e103a00000" }, - "86883d54cd3915e549095530f9ab1805e8c5432d": { - "balance": "4000000000000000000000" + "0x86883d54cd3915e549095530f9ab1805e8c5432d": { + "balance": "0xd8d726b7177a800000" }, - "6974c8a414ceaefd3c2e4dfdbef430568d9a960b": { - "balance": "334250000000000000000" + "0x6974c8a414ceaefd3c2e4dfdbef430568d9a960b": { + "balance": "0x121ea68c114e510000" }, - "532d32b00f305bcc24dcef56817d622f34fb2c24": { - "balance": "1800000000000000000000" + "0x532d32b00f305bcc24dcef56817d622f34fb2c24": { + "balance": "0x6194049f30f7200000" }, - "761f8a3a2af0a8bdbe1da009321fb29764eb62a1": { - "balance": "10000000000000000000000" + "0x761f8a3a2af0a8bdbe1da009321fb29764eb62a1": { + "balance": "0x21e19e0c9bab2400000" }, - "4677b04e0343a32131fd6abb39b1b6156bba3d5b": { - "balance": "200000000000000000000" + "0x4677b04e0343a32131fd6abb39b1b6156bba3d5b": { + "balance": "0xad78ebc5ac6200000" }, - "ef69781f32ffce33346f2c9ae3f08493f3e82f89": { - "balance": "18200000000000000000" + "0xef69781f32ffce33346f2c9ae3f08493f3e82f89": { + "balance": "0xfc936392801c0000" }, - "e3b3d2c9bf570be6a2f72adca1862c310936a43c": { - "balance": "100100000000000000000" + "0xe3b3d2c9bf570be6a2f72adca1862c310936a43c": { + "balance": "0x56d2aa3a5c09a0000" }, - "d19caf39bb377fdf2cf19bd4fb52591c2631a63c": { - "balance": "1000000000000000000000" + "0xd19caf39bb377fdf2cf19bd4fb52591c2631a63c": { + "balance": "0x3635c9adc5dea00000" }, - "5d68324bcb776d3ffd0bf9fea91d9f037fd6ab0f": { - "balance": "2000000000000000000000" + "0x5d68324bcb776d3ffd0bf9fea91d9f037fd6ab0f": { + "balance": "0x6c6b935b8bbd400000" }, - "1c99fe9bb6c6d1066d912099547fd1f4809eacd9": { - "balance": "2000000000000000000000" + "0x1c99fe9bb6c6d1066d912099547fd1f4809eacd9": { + "balance": "0x6c6b935b8bbd400000" }, - "bbfe0a830cace87b7293993a7e9496ce64f8e394": { - "balance": "6000000000000000000000" + "0xbbfe0a830cace87b7293993a7e9496ce64f8e394": { + "balance": "0x14542ba12a337c00000" }, - "26c0054b700d3a7c2dcbe275689d4f4cad16a335": { - "balance": "2000000000000000000000" + "0x26c0054b700d3a7c2dcbe275689d4f4cad16a335": { + "balance": "0x6c6b935b8bbd400000" }, - "7d7e7c61779adb7706c94d32409a2bb4e994bf60": { - "balance": "865992000000000000000" + "0x7d7e7c61779adb7706c94d32409a2bb4e994bf60": { + "balance": "0x2ef20d9fc71a140000" }, - "d037d215d11d1df3d54fbd321cd295c5465e273b": { - "balance": "1400000000000000000000" + "0xd037d215d11d1df3d54fbd321cd295c5465e273b": { + "balance": "0x4be4e7267b6ae00000" }, - "08166f02313feae18bb044e7877c808b55b5bf58": { - "balance": "1970000000000000000000" + "0x08166f02313feae18bb044e7877c808b55b5bf58": { + "balance": "0x6acb3df27e1f880000" }, - "781b1501647a2e06c0ed43ff197fccec35e1700b": { - "balance": "3000000000000000000000" + "0x781b1501647a2e06c0ed43ff197fccec35e1700b": { + "balance": "0xa2a15d09519be00000" }, - "74316adf25378c10f576d5b41a6f47fa98fce33d": { - "balance": "336082000000000000000" + "0x74316adf25378c10f576d5b41a6f47fa98fce33d": { + "balance": "0x1238131e5c7ad50000" }, - "44e2fdc679e6bee01e93ef4a3ab1bcce012abc7c": { - "balance": "410231000000000000000" + "0x44e2fdc679e6bee01e93ef4a3ab1bcce012abc7c": { + "balance": "0x163d194900c5458000" }, - "178eaf6b8554c45dfde16b78ce0c157f2ee31351": { - "balance": "320000000000000000000" + "0x178eaf6b8554c45dfde16b78ce0c157f2ee31351": { + "balance": "0x1158e460913d000000" }, - "cf923a5d8fbc3d01aa079d1cfe4b43ce071b1611": { - "balance": "2000000000000000000000" + "0xcf923a5d8fbc3d01aa079d1cfe4b43ce071b1611": { + "balance": "0x6c6b935b8bbd400000" }, - "0c28847e4f09dfce5f9b25af7c4e530f59c880fe": { - "balance": "1000000000000000000000" + "0x0c28847e4f09dfce5f9b25af7c4e530f59c880fe": { + "balance": "0x3635c9adc5dea00000" }, - "54ce88275956def5f9458e3b95decacd484021a0": { - "balance": "2000000000000000000000" + "0x54ce88275956def5f9458e3b95decacd484021a0": { + "balance": "0x6c6b935b8bbd400000" }, - "9d4213339a01551861764c87a93ce8f85f87959a": { - "balance": "200000000000000000000" + "0x9d4213339a01551861764c87a93ce8f85f87959a": { + "balance": "0xad78ebc5ac6200000" }, - "e559b5fd337b9c5572a9bf9e0f2521f7d446dbe4": { - "balance": "200000000000000000000" + "0xe559b5fd337b9c5572a9bf9e0f2521f7d446dbe4": { + "balance": "0xad78ebc5ac6200000" }, - "dcb03bfa6c1131234e56b7ea7c4f721487546b7a": { - "balance": "1337000000000000000000" + "0xdcb03bfa6c1131234e56b7ea7c4f721487546b7a": { + "balance": "0x487a9a304539440000" }, - "db6ff71b3db0928f839e05a7323bfb57d29c87aa": { - "balance": "910000000000000000000" + "0xdb6ff71b3db0928f839e05a7323bfb57d29c87aa": { + "balance": "0x3154c9729d05780000" }, - "eb7c202b462b7cc5855d7484755f6e26ef43a115": { - "balance": "2000000000000000000000" + "0xeb7c202b462b7cc5855d7484755f6e26ef43a115": { + "balance": "0x6c6b935b8bbd400000" }, - "323486ca64b375474fb2b759a9e7a135859bd9f6": { - "balance": "400000000000000000000" + "0x323486ca64b375474fb2b759a9e7a135859bd9f6": { + "balance": "0x15af1d78b58c400000" }, - "2c1df8a76f48f6b54bcf9caf56f0ee1cf57ab33d": { - "balance": "10118000000000000000000" + "0x2c1df8a76f48f6b54bcf9caf56f0ee1cf57ab33d": { + "balance": "0x2247f750089da580000" }, - "2cd87866568dd81ad47d9d3ad0846e5a65507373": { - "balance": "400000000000000000000" + "0x2cd87866568dd81ad47d9d3ad0846e5a65507373": { + "balance": "0x15af1d78b58c400000" }, - "8566610901aace38b83244f3a9c831306a67b9dc": { - "balance": "3256000000000000000000" + "0x8566610901aace38b83244f3a9c831306a67b9dc": { + "balance": "0xb08213bcf8ffe00000" }, - "1c257ad4a55105ea3b58ed374b198da266c85f63": { - "balance": "10000000000000000000000" + "0x1c257ad4a55105ea3b58ed374b198da266c85f63": { + "balance": "0x21e19e0c9bab2400000" }, - "cf4f1138f1bd6bf5b6d485cce4c1017fcb85f07d": { - "balance": "882038000000000000000" + "0xcf4f1138f1bd6bf5b6d485cce4c1017fcb85f07d": { + "balance": "0x2fd0bc77c32bff0000" }, - "c934becaf71f225f8b4a4bf7b197f4ac9630345c": { - "balance": "20000000000000000000000" + "0xc934becaf71f225f8b4a4bf7b197f4ac9630345c": { + "balance": "0x43c33c1937564800000" }, - "1e2bf4ba8e5ef18d37de6d6ad636c4cae489d0cc": { - "balance": "2000000000000000000000" + "0x1e2bf4ba8e5ef18d37de6d6ad636c4cae489d0cc": { + "balance": "0x6c6b935b8bbd400000" }, - "9d78a975b7db5e4d8e28845cfbe7e31401be0dd9": { - "balance": "1340000000000000000000" + "0x9d78a975b7db5e4d8e28845cfbe7e31401be0dd9": { + "balance": "0x48a43c54602f700000" }, - "16aa52cb0b554723e7060f21f327b0a68315fea3": { - "balance": "250000000000000000000" + "0x16aa52cb0b554723e7060f21f327b0a68315fea3": { + "balance": "0xd8d726b7177a80000" }, - "97e28973b860c567402800fbb63ce39a048a3d79": { - "balance": "97000000000000000000" + "0x97e28973b860c567402800fbb63ce39a048a3d79": { + "balance": "0x542253a126ce40000" }, - "4ac5acad000b8877214cb1ae00eac9a37d59a0fd": { - "balance": "4000000000000000000000" + "0x4ac5acad000b8877214cb1ae00eac9a37d59a0fd": { + "balance": "0xd8d726b7177a800000" }, - "01226e0ad8d62277b162621c62c928e96e0b9a8c": { - "balance": "2000000000000000000000" + "0x01226e0ad8d62277b162621c62c928e96e0b9a8c": { + "balance": "0x6c6b935b8bbd400000" }, - "479abf2da4d58716fd973a0d13a75f530150260a": { - "balance": "20000000000000000000" + "0x479abf2da4d58716fd973a0d13a75f530150260a": { + "balance": "0x1158e460913d00000" }, - "31d81d526c195e3f10b5c6db52b5e59afbe0a995": { - "balance": "264000000000000000000" + "0x31d81d526c195e3f10b5c6db52b5e59afbe0a995": { + "balance": "0xe4fbc69449f200000" }, - "749087ac0f5a97c6fad021538bf1d6cda18e0daa": { - "balance": "1000000000000000000000" + "0x749087ac0f5a97c6fad021538bf1d6cda18e0daa": { + "balance": "0x3635c9adc5dea00000" }, - "1565af837ef3b0bd4e2b23568d5023cd34b16498": { - "balance": "393284000000000000000" + "0x1565af837ef3b0bd4e2b23568d5023cd34b16498": { + "balance": "0x1551e9724ac4ba0000" }, - "997d6592a31589acc31b9901fbeb3cc3d65b3215": { - "balance": "2000000000000000000000" + "0x997d6592a31589acc31b9901fbeb3cc3d65b3215": { + "balance": "0x6c6b935b8bbd400000" }, - "9d207517422cc0d60de7c237097a4d4fce20940c": { - "balance": "500000000000000000000" + "0x9d207517422cc0d60de7c237097a4d4fce20940c": { + "balance": "0x1b1ae4d6e2ef500000" }, - "24b8b446debd1947955dd084f2c544933346d3ad": { - "balance": "4324135000000000000000" + "0x24b8b446debd1947955dd084f2c544933346d3ad": { + "balance": "0xea696d904039bd8000" }, - "107a03cf0842dbdeb0618fb587ca69189ec92ff5": { - "balance": "1970000000000000000000" + "0x107a03cf0842dbdeb0618fb587ca69189ec92ff5": { + "balance": "0x6acb3df27e1f880000" }, - "7f603aec1759ea5f07c7f8d41a1428fbbaf9e762": { - "balance": "20000000000000000000" + "0x7f603aec1759ea5f07c7f8d41a1428fbbaf9e762": { + "balance": "0x1158e460913d00000" }, - "53a244672895480f4a2b1cdf7da5e5a242ec4dbc": { - "balance": "1000000000000000000000" + "0x53a244672895480f4a2b1cdf7da5e5a242ec4dbc": { + "balance": "0x3635c9adc5dea00000" }, - "7db4c7d5b797e9296e6382f203693db409449d62": { - "balance": "400000000000000000000" + "0x7db4c7d5b797e9296e6382f203693db409449d62": { + "balance": "0x15af1d78b58c400000" }, - "2ae82dab92a66389eea1abb901d1d57f5a7cca0b": { - "balance": "2000000000000000000000" + "0x2ae82dab92a66389eea1abb901d1d57f5a7cca0b": { + "balance": "0x6c6b935b8bbd400000" }, - "16bc40215abbd9ae5d280b95b8010b4514ff1292": { - "balance": "200000000000000000000" + "0x16bc40215abbd9ae5d280b95b8010b4514ff1292": { + "balance": "0xad78ebc5ac6200000" }, - "bba4fac3c42039d828e742cde0efffe774941b39": { - "balance": "1999946000000000000000" + "0xbba4fac3c42039d828e742cde0efffe774941b39": { + "balance": "0x6c6ad382d4fb610000" }, - "5431ca427e6165a644bae326bd09750a178c650d": { - "balance": "2000000000000000000000" + "0x5431ca427e6165a644bae326bd09750a178c650d": { + "balance": "0x6c6b935b8bbd400000" }, - "dcf33965531380163168fc11f67e89c6f1bc178a": { - "balance": "334885000000000000000" + "0xdcf33965531380163168fc11f67e89c6f1bc178a": { + "balance": "0x122776853406b08000" }, - "65fd02d704a12a4dace9471b0645f962a89671c8": { - "balance": "28615000000000000000" + "0x65fd02d704a12a4dace9471b0645f962a89671c8": { + "balance": "0x18d1ce6e427cd8000" }, - "135d1719bf03e3f866312479fe338118cd387e70": { - "balance": "2000000000000000000000" + "0x135d1719bf03e3f866312479fe338118cd387e70": { + "balance": "0x6c6b935b8bbd400000" }, - "f3159866c2bc86bba40f9d73bb99f1eee57bb9d7": { - "balance": "1000000000000000000000" + "0xf3159866c2bc86bba40f9d73bb99f1eee57bb9d7": { + "balance": "0x3635c9adc5dea00000" }, - "e3a4621b66004588e31206f718cb00a319889cf0": { - "balance": "2000000000000000000000" + "0xe3a4621b66004588e31206f718cb00a319889cf0": { + "balance": "0x6c6b935b8bbd400000" }, - "abcdbc8f1dd13af578d4a4774a62182bedf9f9be": { - "balance": "36660000000000000000" + "0xabcdbc8f1dd13af578d4a4774a62182bedf9f9be": { + "balance": "0x1fcc27bc459d20000" }, - "9fbe066de57236dc830725d32a02aef9246c6c5e": { - "balance": "2000000000000000000000" + "0x9fbe066de57236dc830725d32a02aef9246c6c5e": { + "balance": "0x6c6b935b8bbd400000" }, - "81cfad760913d3c322fcc77b49c2ae3907e74f6e": { - "balance": "197000000000000000000" + "0x81cfad760913d3c322fcc77b49c2ae3907e74f6e": { + "balance": "0xaadec983fcff40000" }, - "0ab59d390702c9c059db148eb4f3fcfa7d04c7e7": { - "balance": "18200000000000000000" + "0x0ab59d390702c9c059db148eb4f3fcfa7d04c7e7": { + "balance": "0xfc936392801c0000" }, - "2c2db28c3309375eea3c6d72cd6d0eec145afcc0": { - "balance": "2000000000000000000000" + "0x2c2db28c3309375eea3c6d72cd6d0eec145afcc0": { + "balance": "0x6c6b935b8bbd400000" }, - "08306de51981e7aca1856859b7c778696a6b69f9": { - "balance": "3200000000000000000000" + "0x08306de51981e7aca1856859b7c778696a6b69f9": { + "balance": "0xad78ebc5ac62000000" }, - "f814799f6ddf4dcb29c7ee870e75f9cc2d35326d": { - "balance": "1000000000000000000000" + "0xf814799f6ddf4dcb29c7ee870e75f9cc2d35326d": { + "balance": "0x3635c9adc5dea00000" }, - "ee867d20916bd2e9c9ece08aa04385db667c912e": { - "balance": "50000000000000000000000" + "0xee867d20916bd2e9c9ece08aa04385db667c912e": { + "balance": "0xa968163f0a57b400000" }, - "97a86f01ce3f7cfd4441330e1c9b19e1b10606ef": { - "balance": "2000000000000000000000" + "0x97a86f01ce3f7cfd4441330e1c9b19e1b10606ef": { + "balance": "0x6c6b935b8bbd400000" }, - "4c759813ad1386bed27ffae9e4815e3630cca312": { - "balance": "2000000000000000000000" + "0x4c759813ad1386bed27ffae9e4815e3630cca312": { + "balance": "0x6c6b935b8bbd400000" }, - "8f226096c184ebb40105e08dac4d22e1c2d54d30": { - "balance": "306552000000000000000" + "0x8f226096c184ebb40105e08dac4d22e1c2d54d30": { + "balance": "0x109e437bd1618c0000" }, - "13acada8980affc7504921be84eb4944c8fbb2bd": { - "balance": "1601600000000000000000" + "0x13acada8980affc7504921be84eb4944c8fbb2bd": { + "balance": "0x56d2aa3a5c09a00000" }, - "122dcfd81addb97d1a0e4925c4b549806e9f3beb": { - "balance": "1514954000000000000000" + "0x122dcfd81addb97d1a0e4925c4b549806e9f3beb": { + "balance": "0x522035cc6e01210000" }, - "232f525d55859b7d4e608d20487faadb00293135": { - "balance": "4000000000000000000000" + "0x232f525d55859b7d4e608d20487faadb00293135": { + "balance": "0xd8d726b7177a800000" }, - "6f7ac681d45e418fce8b3a1db5bc3be6f06c9849": { - "balance": "2000000000000000000000" + "0x6f7ac681d45e418fce8b3a1db5bc3be6f06c9849": { + "balance": "0x6c6b935b8bbd400000" }, - "0c8692eeff2a53d6d1688ed56a9ddbbd68dabba1": { - "balance": "2000000000000000000000" + "0x0c8692eeff2a53d6d1688ed56a9ddbbd68dabba1": { + "balance": "0x6c6b935b8bbd400000" }, - "6a6337833f8f6a6bf10ca7ec21aa810ed444f4cb": { - "balance": "1028200000000000000000" + "0x6a6337833f8f6a6bf10ca7ec21aa810ed444f4cb": { + "balance": "0x37bd24345ce8a40000" }, - "209377b6ad3fe101c9685b3576545c6b1684e73c": { - "balance": "1820000000000000000000" + "0x209377b6ad3fe101c9685b3576545c6b1684e73c": { + "balance": "0x62a992e53a0af00000" }, - "560fc08d079f047ed8d7df75551aa53501f57013": { - "balance": "7600000000000000000000" + "0x560fc08d079f047ed8d7df75551aa53501f57013": { + "balance": "0x19bff2ff57968c00000" }, - "8e78f351457d016f4ad2755ec7424e5c21ba6d51": { - "balance": "146000000000000000000" + "0x8e78f351457d016f4ad2755ec7424e5c21ba6d51": { + "balance": "0x7ea28327577080000" }, - "2ce11a92fad024ff2b3e87e3b542e6c60dcbd996": { - "balance": "4000000000000000000000" + "0x2ce11a92fad024ff2b3e87e3b542e6c60dcbd996": { + "balance": "0xd8d726b7177a800000" }, - "8ab839aeaf2ad37cb78bacbbb633bcc5c099dc46": { - "balance": "2000000000000000000000" + "0x8ab839aeaf2ad37cb78bacbbb633bcc5c099dc46": { + "balance": "0x6c6b935b8bbd400000" }, - "673144f0ec142e770f4834fee0ee311832f3087b": { - "balance": "500038000000000000000" + "0x673144f0ec142e770f4834fee0ee311832f3087b": { + "balance": "0x1b1b6bd7af64c70000" }, - "ba8a63f3f40de4a88388bc50212fea8e064fbb86": { - "balance": "2000000000000000000000" + "0xba8a63f3f40de4a88388bc50212fea8e064fbb86": { + "balance": "0x6c6b935b8bbd400000" }, - "ee899b02cbcb3939cd61de1342d50482abb68532": { - "balance": "1760000000000000000000" + "0xee899b02cbcb3939cd61de1342d50482abb68532": { + "balance": "0x5f68e8131ecf800000" }, - "c2d9eedbc9019263d9d16cc5ae072d1d3dd9db03": { - "balance": "20000000000000000000000" + "0xc2d9eedbc9019263d9d16cc5ae072d1d3dd9db03": { + "balance": "0x43c33c1937564800000" }, - "355c0c39f5d5700b41d375b3f17851dcd52401f9": { - "balance": "3979000000000000000000" + "0x355c0c39f5d5700b41d375b3f17851dcd52401f9": { + "balance": "0xd7b3b7ba5abf4c0000" }, - "8179c80970182cc5b7d82a4df06ea94db63a25f3": { - "balance": "727432000000000000000" + "0x8179c80970182cc5b7d82a4df06ea94db63a25f3": { + "balance": "0x276f259de66bf40000" }, - "b388b5dfecd2c5e4b596577c642556dbfe277855": { - "balance": "20000000000000000000" + "0xb388b5dfecd2c5e4b596577c642556dbfe277855": { + "balance": "0x1158e460913d00000" }, - "a9e28337e6357193d9e2cb236b01be44b81427df": { - "balance": "2200000000000000000000" + "0xa9e28337e6357193d9e2cb236b01be44b81427df": { + "balance": "0x77432217e683600000" }, - "04ba4bb87140022c214a6fac42db5a16dd954045": { - "balance": "1000000000000000000000" + "0x04ba4bb87140022c214a6fac42db5a16dd954045": { + "balance": "0x3635c9adc5dea00000" }, - "67c926093e9b8927933810d98222d62e2b8206bb": { - "balance": "1910000000000000000000" + "0x67c926093e9b8927933810d98222d62e2b8206bb": { + "balance": "0x678a932062e4180000" }, - "ed7346766e1a676d0d06ec821867a276a083bf31": { - "balance": "4012890000000000000000" + "0xed7346766e1a676d0d06ec821867a276a083bf31": { + "balance": "0xd98a0931cc2d490000" }, - "92558226b384626cad48e09d966bf1395ee7ea5d": { - "balance": "334250000000000000000" + "0x92558226b384626cad48e09d966bf1395ee7ea5d": { + "balance": "0x121ea68c114e510000" }, - "bdf693f833c3fe471753184788eb4bfe4adc3f96": { - "balance": "1970000000000000000000" + "0xbdf693f833c3fe471753184788eb4bfe4adc3f96": { + "balance": "0x6acb3df27e1f880000" }, - "4474299d0ee090dc90789a1486489c3d0d645e6d": { - "balance": "1000000000000000000000" + "0x4474299d0ee090dc90789a1486489c3d0d645e6d": { + "balance": "0x3635c9adc5dea00000" }, - "b1178ad47383c31c8134a1941cbcd474d06244e2": { - "balance": "1000000000000000000000" + "0xb1178ad47383c31c8134a1941cbcd474d06244e2": { + "balance": "0x3635c9adc5dea00000" }, - "979d681c617da16f21bcaca101ed16ed015ab696": { - "balance": "1880000000000000000000" + "0x979d681c617da16f21bcaca101ed16ed015ab696": { + "balance": "0x65ea3db75546600000" }, - "6b20c080606a79c73bd8e75b11717a4e8db3f1c3": { - "balance": "299720000000000000000" + "0x6b20c080606a79c73bd8e75b11717a4e8db3f1c3": { + "balance": "0x103f735803f0140000" }, - "b85218f342f8012eda9f274e63ce2152b2dcfdab": { - "balance": "3100000000000000000000" + "0xb85218f342f8012eda9f274e63ce2152b2dcfdab": { + "balance": "0xa80d24677efef00000" }, - "530b61e42f39426d2408d40852b9e34ab5ebebc5": { - "balance": "267400000000000000000" + "0x530b61e42f39426d2408d40852b9e34ab5ebebc5": { + "balance": "0xe7eeba3410b740000" }, - "76afc225f4fa307de484552bbe1d9d3f15074c4a": { - "balance": "2998800000000000000000" + "0x76afc225f4fa307de484552bbe1d9d3f15074c4a": { + "balance": "0xa290b5c7ad39680000" }, - "1e783e522ab7df0acaac9eeed3593039e5ac7579": { - "balance": "203435800000000000000000" + "0x1e783e522ab7df0acaac9eeed3593039e5ac7579": { + "balance": "0x2b1446dd6aefe41c0000" }, - "0f7bf6373f771a4601762c4dae5fbbf4fedd9cc9": { - "balance": "2000000000000000000000" + "0x0f7bf6373f771a4601762c4dae5fbbf4fedd9cc9": { + "balance": "0x6c6b935b8bbd400000" }, - "7a8797690ab77b5470bf7c0c1bba612508e1ac7d": { - "balance": "8865000000000000000000" + "0x7a8797690ab77b5470bf7c0c1bba612508e1ac7d": { + "balance": "0x1e09296c3378de40000" }, - "2a2ab6b74c7af1d9476bb5bcb4524797bedc3552": { - "balance": "1000000000000000000000" + "0x2a2ab6b74c7af1d9476bb5bcb4524797bedc3552": { + "balance": "0x3635c9adc5dea00000" }, - "523e140dc811b186dee5d6c88bf68e90b8e096fd": { - "balance": "2000000000000000000000" + "0x523e140dc811b186dee5d6c88bf68e90b8e096fd": { + "balance": "0x6c6b935b8bbd400000" }, - "ea8168fbf225e786459ca6bb18d963d26b505309": { - "balance": "500000000000000000000" + "0xea8168fbf225e786459ca6bb18d963d26b505309": { + "balance": "0x1b1ae4d6e2ef500000" }, - "20ff3ede8cadb5c37b48cb14580fb65e23090a7b": { - "balance": "42000000000000000000000" + "0x20ff3ede8cadb5c37b48cb14580fb65e23090a7b": { + "balance": "0x8e4d316827686400000" }, - "e482d255ede56b04c3e8df151f56e9ca62aaa8c2": { - "balance": "500000000000000000000" + "0xe482d255ede56b04c3e8df151f56e9ca62aaa8c2": { + "balance": "0x1b1ae4d6e2ef500000" }, - "2e0880a34596230720f05ac8f065af8681dcb6c2": { - "balance": "100000000000000000000000" + "0x2e0880a34596230720f05ac8f065af8681dcb6c2": { + "balance": "0x152d02c7e14af6800000" }, - "c674f28c8afd073f8b799691b2f0584df942e844": { - "balance": "2000000000000000000000" + "0xc674f28c8afd073f8b799691b2f0584df942e844": { + "balance": "0x6c6b935b8bbd400000" }, - "b646df98b49442746b61525c81a3b04ba3106250": { - "balance": "1970000000000000000000" + "0xb646df98b49442746b61525c81a3b04ba3106250": { + "balance": "0x6acb3df27e1f880000" }, - "d55c1c8dfbe1e02cacbca60fdbdd405b09f0b75f": { - "balance": "2000000000000000000000" + "0xd55c1c8dfbe1e02cacbca60fdbdd405b09f0b75f": { + "balance": "0x6c6b935b8bbd400000" }, - "65ebaed27edb9dcc1957aee5f452ac2105a65c0e": { - "balance": "43531987000000000000000" + "0x65ebaed27edb9dcc1957aee5f452ac2105a65c0e": { + "balance": "0x937dfadae25e29b8000" }, - "f079e1b1265f50e8c8a98ec0c7815eb3aeac9eb4": { - "balance": "20094000000000000000" + "0xf079e1b1265f50e8c8a98ec0c7815eb3aeac9eb4": { + "balance": "0x116dc3a8994b30000" }, - "867eba56748a5904350d2ca2a5ce9ca00b670a9b": { - "balance": "20000000000000000000000" + "0x867eba56748a5904350d2ca2a5ce9ca00b670a9b": { + "balance": "0x43c33c1937564800000" }, - "51ee0cca3bcb10cd3e983722ced8493d926c0866": { - "balance": "999972000000000000000" + "0x51ee0cca3bcb10cd3e983722ced8493d926c0866": { + "balance": "0x36356633ebd8ea0000" }, - "88d541c840ce43cefbaf6d19af6b9859b573c145": { - "balance": "170000000000000000000" + "0x88d541c840ce43cefbaf6d19af6b9859b573c145": { + "balance": "0x93739534d28680000" }, - "f851b010f633c40af1a8f06a73ebbaab65077ab5": { - "balance": "4400000000000000000000" + "0xf851b010f633c40af1a8f06a73ebbaab65077ab5": { + "balance": "0xee86442fcd06c00000" }, - "e0aa69365555b73f282333d1e30c1bbd072854e8": { - "balance": "7000000000000000000000" + "0xe0aa69365555b73f282333d1e30c1bbd072854e8": { + "balance": "0x17b7883c06916600000" }, - "c7b1c83e63203f9547263ef6282e7da33b6ed659": { - "balance": "18200000000000000000" + "0xc7b1c83e63203f9547263ef6282e7da33b6ed659": { + "balance": "0xfc936392801c0000" }, - "af06f5fa6d1214ec43967d1bd4dde74ab814a938": { - "balance": "88000000000000000000" + "0xaf06f5fa6d1214ec43967d1bd4dde74ab814a938": { + "balance": "0x4c53ecdc18a600000" }, - "991173601947c2084a62d639527e961512579af9": { - "balance": "600000000000000000000" + "0x991173601947c2084a62d639527e961512579af9": { + "balance": "0x2086ac351052600000" }, - "7a381122bada791a7ab1f6037dac80432753baad": { - "balance": "10000000000000000000000" + "0x7a381122bada791a7ab1f6037dac80432753baad": { + "balance": "0x21e19e0c9bab2400000" }, - "e766f34ff16f3cfcc97321721f43ddf5a38b0cf4": { - "balance": "1550000000000000000000" + "0xe766f34ff16f3cfcc97321721f43ddf5a38b0cf4": { + "balance": "0x54069233bf7f780000" }, - "d785a8f18c38b9bc4ffb9b8fa8c7727bd642ee1c": { - "balance": "1000000000000000000000" + "0xd785a8f18c38b9bc4ffb9b8fa8c7727bd642ee1c": { + "balance": "0x3635c9adc5dea00000" }, - "aebd4f205de799b64b3564b256d42a711d37ef99": { - "balance": "1177100000000000000000" + "0xaebd4f205de799b64b3564b256d42a711d37ef99": { + "balance": "0x3fcf8b4574f84e0000" }, - "a2fa17c0fb506ce494008b9557841c3f641b8cae": { - "balance": "20000000000000000000" + "0xa2fa17c0fb506ce494008b9557841c3f641b8cae": { + "balance": "0x1158e460913d00000" }, - "a8aca748f9d312ec747f8b6578142694c7e9f399": { - "balance": "2000000000000000000000" + "0xa8aca748f9d312ec747f8b6578142694c7e9f399": { + "balance": "0x6c6b935b8bbd400000" }, - "950c68a40988154d2393fff8da7ccda99614f72c": { - "balance": "4597943000000000000000" + "0x950c68a40988154d2393fff8da7ccda99614f72c": { + "balance": "0xf94146fd8dcde58000" }, - "075d15e2d33d8b4fa7dba8b9e607f04a261e340b": { - "balance": "1910000000000000000000" + "0x075d15e2d33d8b4fa7dba8b9e607f04a261e340b": { + "balance": "0x678a932062e4180000" }, - "3616d448985f5d32aefa8b93a993e094bd854986": { - "balance": "205400000000000000000" + "0x3616d448985f5d32aefa8b93a993e094bd854986": { + "balance": "0xb227f63be813c0000" }, - "4bb9655cfb2a36ea7c637a7b859b4a3154e26ebe": { - "balance": "16000000000000000000000" + "0x4bb9655cfb2a36ea7c637a7b859b4a3154e26ebe": { + "balance": "0x3635c9adc5dea000000" }, - "84949dba559a63bfc845ded06e9f2d9b7f11ef24": { - "balance": "2000000000000000000000" + "0x84949dba559a63bfc845ded06e9f2d9b7f11ef24": { + "balance": "0x6c6b935b8bbd400000" }, - "937563d8a80fd5a537b0e66d20a02525d5d88660": { - "balance": "2500000000000000000000" + "0x937563d8a80fd5a537b0e66d20a02525d5d88660": { + "balance": "0x878678326eac900000" }, - "b183ebee4fcb42c220e47774f59d6c54d5e32ab1": { - "balance": "1604266000000000000000" + "0xb183ebee4fcb42c220e47774f59d6c54d5e32ab1": { + "balance": "0x56f7a9c33c04d10000" }, - "21e5d77320304c201c1e53b261a123d0a1063e81": { - "balance": "86972000000000000000" + "0x21e5d77320304c201c1e53b261a123d0a1063e81": { + "balance": "0x4b6fa9d33dd460000" }, - "fa14b566234abee73042c31d21717182cba14aa1": { - "balance": "328000000000000000000" + "0xfa14b566234abee73042c31d21717182cba14aa1": { + "balance": "0x11c7ea162e78200000" }, - "2da617695009cc57d26ad490b32a5dfbeb934e5e": { - "balance": "20000000000000000000000" + "0x2da617695009cc57d26ad490b32a5dfbeb934e5e": { + "balance": "0x43c33c1937564800000" }, - "3326b88de806184454c40b27f309d9dd6dcfb978": { - "balance": "17900000000000000000000" + "0x3326b88de806184454c40b27f309d9dd6dcfb978": { + "balance": "0x3ca5c66d9bc44300000" }, - "95e6a54b2d5f67a24a4875af75107ca7ea9fd2fa": { - "balance": "1337000000000000000000" + "0x95e6a54b2d5f67a24a4875af75107ca7ea9fd2fa": { + "balance": "0x487a9a304539440000" }, - "8db58e406e202df9bc703c480bd8ed248d52a032": { - "balance": "2000000000000000000000" + "0x8db58e406e202df9bc703c480bd8ed248d52a032": { + "balance": "0x6c6b935b8bbd400000" }, - "f777361a3dd8ab62e5f1b9b047568cc0b555704c": { - "balance": "1000000000000000000000" + "0xf777361a3dd8ab62e5f1b9b047568cc0b555704c": { + "balance": "0x3635c9adc5dea00000" }, - "83a93b5ba41bf88720e415790cdc0b67b4af34c4": { - "balance": "200000000000000000000" + "0x83a93b5ba41bf88720e415790cdc0b67b4af34c4": { + "balance": "0xad78ebc5ac6200000" }, - "8a1cc5ac111c49bfcfd848f37dd768aa65c88802": { - "balance": "10000000000000000000000" + "0x8a1cc5ac111c49bfcfd848f37dd768aa65c88802": { + "balance": "0x21e19e0c9bab2400000" }, - "52214378b54004056a7cc08c891327798ac6b248": { - "balance": "15200000000000000000000" + "0x52214378b54004056a7cc08c891327798ac6b248": { + "balance": "0x337fe5feaf2d1800000" }, - "ad80d865b85c34d2e6494b2e7aefea6b9af184db": { - "balance": "4000000000000000000000" + "0xad80d865b85c34d2e6494b2e7aefea6b9af184db": { + "balance": "0xd8d726b7177a800000" }, - "e7d6240620f42c5edbb2ede6aec43da4ed9b5757": { - "balance": "1000000000000000000000" + "0xe7d6240620f42c5edbb2ede6aec43da4ed9b5757": { + "balance": "0x3635c9adc5dea00000" }, - "d0e35e047646e759f4517093d6408642517f084d": { - "balance": "3939507000000000000000" + "0xd0e35e047646e759f4517093d6408642517f084d": { + "balance": "0xd58fa46818eccb8000" }, - "9340345ca6a3eabdb77363f2586043f29438ce0b": { - "balance": "530922000000000000000" + "0x9340345ca6a3eabdb77363f2586043f29438ce0b": { + "balance": "0x1cc805da0dfff10000" }, - "6640ccf053555c130ae2b656647ea6e31637b9ab": { - "balance": "1970000000000000000000" + "0x6640ccf053555c130ae2b656647ea6e31637b9ab": { + "balance": "0x6acb3df27e1f880000" }, - "184d86f3466ae6683b19729982e7a7e1a48347b2": { - "balance": "10000000000000000000000" + "0x184d86f3466ae6683b19729982e7a7e1a48347b2": { + "balance": "0x21e19e0c9bab2400000" }, - "84ec06f24700fe42414cb9897c154c88de2f6132": { - "balance": "1337000000000000000000" + "0x84ec06f24700fe42414cb9897c154c88de2f6132": { + "balance": "0x487a9a304539440000" }, - "d1e5e234a9f44266a4a6241a84d7a1a55ad5a7fe": { - "balance": "20000000000000000000000" + "0xd1e5e234a9f44266a4a6241a84d7a1a55ad5a7fe": { + "balance": "0x43c33c1937564800000" }, - "e8a9a41740f44f54c3688b53e1ddd42e43c9fe94": { - "balance": "4000000000000000000000" + "0xe8a9a41740f44f54c3688b53e1ddd42e43c9fe94": { + "balance": "0xd8d726b7177a800000" }, - "6e3a51db743d334d2fe88224b5fe7c008e80e624": { - "balance": "106000000000000000000" + "0x6e3a51db743d334d2fe88224b5fe7c008e80e624": { + "balance": "0x5bf0ba6634f680000" }, - "3e94df5313fa520570ef232bc3311d5f622ff183": { - "balance": "2000000000000000000000" + "0x3e94df5313fa520570ef232bc3311d5f622ff183": { + "balance": "0x6c6b935b8bbd400000" }, - "8957727e72cf629020f4e05edf799aa7458062d0": { - "balance": "2200000000000000000000" + "0x8957727e72cf629020f4e05edf799aa7458062d0": { + "balance": "0x77432217e683600000" }, - "cf5e0eacd1b39d0655f2f77535ef6608eb950ba0": { - "balance": "2000000000000000000000" + "0xcf5e0eacd1b39d0655f2f77535ef6608eb950ba0": { + "balance": "0x6c6b935b8bbd400000" }, - "f4aaa3a6163e3706577b49c0767e948a681e16ee": { - "balance": "2000000000000000000000" + "0xf4aaa3a6163e3706577b49c0767e948a681e16ee": { + "balance": "0x6c6b935b8bbd400000" }, - "97f1fe4c8083e596212a187728dd5cf80a31bec5": { - "balance": "20000000000000000000" + "0x97f1fe4c8083e596212a187728dd5cf80a31bec5": { + "balance": "0x1158e460913d00000" }, - "57d5fd0e3d3049330ffcdcd020456917657ba2da": { - "balance": "1991240000000000000000" + "0x57d5fd0e3d3049330ffcdcd020456917657ba2da": { + "balance": "0x6bf20195f554d40000" }, - "49bdbc7ba5abebb6389e91a3285220d3451bd253": { - "balance": "1000000000000000000000" + "0x49bdbc7ba5abebb6389e91a3285220d3451bd253": { + "balance": "0x3635c9adc5dea00000" }, - "ae126b382cf257fad7f0bc7d16297e54cc7267da": { - "balance": "300000000000000000000" + "0xae126b382cf257fad7f0bc7d16297e54cc7267da": { + "balance": "0x1043561a8829300000" }, - "bbf8616d97724af3def165d0e28cda89b800009a": { - "balance": "114063000000000000000" + "0xbbf8616d97724af3def165d0e28cda89b800009a": { + "balance": "0x62ef12e2b17618000" }, - "adb948b1b6fefe207de65e9bbc2de98e605d0b57": { - "balance": "2000000000000000000000" + "0xadb948b1b6fefe207de65e9bbc2de98e605d0b57": { + "balance": "0x6c6b935b8bbd400000" }, - "8a217db38bc35f215fd92906be42436fe7e6ed19": { - "balance": "6000000000000000000000" + "0x8a217db38bc35f215fd92906be42436fe7e6ed19": { + "balance": "0x14542ba12a337c00000" }, - "e28b062259e96eeb3c8d4104943f9eb325893cf5": { - "balance": "1337000000000000000000" + "0xe28b062259e96eeb3c8d4104943f9eb325893cf5": { + "balance": "0x487a9a304539440000" }, - "6a6b18a45a76467e2e5d5a2ef911c3e12929857b": { - "balance": "82000000000000000000000" + "0x6a6b18a45a76467e2e5d5a2ef911c3e12929857b": { + "balance": "0x115d3a99a9614f400000" }, - "cb68ae5abe02dcf8cbc5aa719c25814651af8b85": { - "balance": "500000000000000000000" + "0xcb68ae5abe02dcf8cbc5aa719c25814651af8b85": { + "balance": "0x1b1ae4d6e2ef500000" }, - "4c7e2e2b77ad0cd6f44acb2861f0fb8b28750ef9": { - "balance": "20000000000000000000" + "0x4c7e2e2b77ad0cd6f44acb2861f0fb8b28750ef9": { + "balance": "0x1158e460913d00000" }, - "58ba1569650e5bbbb21d35d3e175c0d6b0c651a9": { - "balance": "500000000000000000000" + "0x58ba1569650e5bbbb21d35d3e175c0d6b0c651a9": { + "balance": "0x1b1ae4d6e2ef500000" }, - "1eb4bf73156a82a0a6822080c6edf49c469af8b9": { - "balance": "1910000000000000000000" + "0x1eb4bf73156a82a0a6822080c6edf49c469af8b9": { + "balance": "0x678a932062e4180000" }, - "4103299671d46763978fa4aa19ee34b1fc952784": { - "balance": "200000000000000000000" + "0x4103299671d46763978fa4aa19ee34b1fc952784": { + "balance": "0xad78ebc5ac6200000" }, - "e321bb4a946adafdade4571fb15c0043d39ee35f": { - "balance": "1575212000000000000000" + "0xe321bb4a946adafdade4571fb15c0043d39ee35f": { + "balance": "0x556475382b4c9e0000" }, - "893608751d68d046e85802926673cdf2f57f7cb8": { - "balance": "19700000000000000000" + "0x893608751d68d046e85802926673cdf2f57f7cb8": { + "balance": "0x11164759ffb320000" }, - "70fee08b00c6c2c04a3c625c1ff77caf1c32df01": { - "balance": "200000000000000000000" + "0x70fee08b00c6c2c04a3c625c1ff77caf1c32df01": { + "balance": "0xad78ebc5ac6200000" }, - "7b0fea1176d52159333a143c294943da36bbddb4": { - "balance": "9380000000000000000000" + "0x7b0fea1176d52159333a143c294943da36bbddb4": { + "balance": "0x1fc7da64ea14c100000" }, - "d331c823825a9e5263d052d8915d4dcde07a5c37": { - "balance": "564000000000000000000" + "0xd331c823825a9e5263d052d8915d4dcde07a5c37": { + "balance": "0x1e931283ccc8500000" }, - "a45432a6f2ac9d56577b938a37fabac8cc7c461c": { - "balance": "1000000000000000000000" + "0xa45432a6f2ac9d56577b938a37fabac8cc7c461c": { + "balance": "0x3635c9adc5dea00000" }, - "764fc46d428b6dbc228a0f5f55c9508c772eab9f": { - "balance": "26000000000000000000000" + "0x764fc46d428b6dbc228a0f5f55c9508c772eab9f": { + "balance": "0x581767ba6189c400000" }, - "1a95a8a8082e4652e4170df9271cb4bb4305f0b2": { - "balance": "50000000000000000000" + "0x1a95a8a8082e4652e4170df9271cb4bb4305f0b2": { + "balance": "0x2b5e3af16b1880000" }, - "08c9f1bfb689fdf804d769f82123360215aff93b": { - "balance": "1970000000000000000000" + "0x08c9f1bfb689fdf804d769f82123360215aff93b": { + "balance": "0x6acb3df27e1f880000" }, - "1572cdfab72a01ce968e78f5b5448da29853fbdd": { - "balance": "5061500000000000000000" + "0x1572cdfab72a01ce968e78f5b5448da29853fbdd": { + "balance": "0x112626c49060fa60000" }, - "379c7166849bc24a02d6535e2def13daeef8aa8d": { - "balance": "100000000000000000000" + "0x379c7166849bc24a02d6535e2def13daeef8aa8d": { + "balance": "0x56bc75e2d63100000" }, - "e0a254ac09b9725bebc8e460431dd0732ebcabbf": { - "balance": "6000000000000000000000" + "0xe0a254ac09b9725bebc8e460431dd0732ebcabbf": { + "balance": "0x14542ba12a337c00000" }, - "3225c1ca5f2a9c88156bb7d9cdc44a326653c214": { - "balance": "400000000000000000000" + "0x3225c1ca5f2a9c88156bb7d9cdc44a326653c214": { + "balance": "0x15af1d78b58c400000" }, - "84686c7bad762c54b667d59f90943cd14d117a26": { - "balance": "20000000000000000000" + "0x84686c7bad762c54b667d59f90943cd14d117a26": { + "balance": "0x1158e460913d00000" }, - "3d5a8b2b80be8b35d8ecf789b5ed7a0775c5076c": { - "balance": "20000000000000000000" + "0x3d5a8b2b80be8b35d8ecf789b5ed7a0775c5076c": { + "balance": "0x1158e460913d00000" }, - "2ccf80e21898125eb4e807cd82e09b9d28592f6e": { - "balance": "2000000000000000000000" + "0x2ccf80e21898125eb4e807cd82e09b9d28592f6e": { + "balance": "0x6c6b935b8bbd400000" }, - "dde969aef34ea87ac299b7597e292b4a0155cc8a": { - "balance": "298819000000000000000" + "0xdde969aef34ea87ac299b7597e292b4a0155cc8a": { + "balance": "0x1032f2594a01738000" }, - "19e94e620050aad766b9e1bad931238312d4bf49": { - "balance": "2396000000000000000000" + "0x19e94e620050aad766b9e1bad931238312d4bf49": { + "balance": "0x81e32df972abf00000" }, - "959f57fded6ae37913d900b81e5f48a79322c627": { - "balance": "255599000000000000000" + "0x959f57fded6ae37913d900b81e5f48a79322c627": { + "balance": "0xddb26104749118000" }, - "b9b0a3219a3288d9b35b091b14650b8fe23dce2b": { - "balance": "14000000000000000000000" + "0xb9b0a3219a3288d9b35b091b14650b8fe23dce2b": { + "balance": "0x2f6f10780d22cc00000" }, - "3575c770668a9d179f1ef768c293f80166e2aa3d": { - "balance": "474000000000000000000" + "0x3575c770668a9d179f1ef768c293f80166e2aa3d": { + "balance": "0x19b21248a3ef280000" }, - "58f05b262560503ca761c61890a4035f4c737280": { - "balance": "8000000000000000000000" + "0x58f05b262560503ca761c61890a4035f4c737280": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "3286d1bc657a312c8847d93cb3cb7950f2b0c6e3": { - "balance": "20000000000000000000000" + "0x3286d1bc657a312c8847d93cb3cb7950f2b0c6e3": { + "balance": "0x43c33c1937564800000" }, - "1d9e6aaf8019a05f230e5def05af5d889bd4d0f2": { - "balance": "133700000000000000000" + "0x1d9e6aaf8019a05f230e5def05af5d889bd4d0f2": { + "balance": "0x73f75d1a085ba0000" }, - "a375b4bc24a24e1f797593cc302b2f331063fa5c": { - "balance": "200000000000000000000" + "0xa375b4bc24a24e1f797593cc302b2f331063fa5c": { + "balance": "0xad78ebc5ac6200000" }, - "108ba7c2895c50e072dc6f964932d50c282d3034": { - "balance": "500000000000000000000" + "0x108ba7c2895c50e072dc6f964932d50c282d3034": { + "balance": "0x1b1ae4d6e2ef500000" }, - "b6b34a263f10c3d2eceb0acc559a7b2ab85ce565": { - "balance": "4000000000000000000000" + "0xb6b34a263f10c3d2eceb0acc559a7b2ab85ce565": { + "balance": "0xd8d726b7177a800000" }, - "a4d2b429f1ad5349e31704969edc5f25ee8aca10": { - "balance": "10000000000000000000000" + "0xa4d2b429f1ad5349e31704969edc5f25ee8aca10": { + "balance": "0x21e19e0c9bab2400000" }, - "674adb21df4c98c7a347ac4c3c24266757dd7039": { - "balance": "2000000000000000000000" + "0x674adb21df4c98c7a347ac4c3c24266757dd7039": { + "balance": "0x6c6b935b8bbd400000" }, - "33565ba9da2c03e778ce12294f081dfe81064d24": { - "balance": "16000000000000000000000" + "0x33565ba9da2c03e778ce12294f081dfe81064d24": { + "balance": "0x3635c9adc5dea000000" }, - "4ddda7586b2237b053a7f3289cf460dc57d37a09": { - "balance": "10000000000000000000000" + "0x4ddda7586b2237b053a7f3289cf460dc57d37a09": { + "balance": "0x21e19e0c9bab2400000" }, - "cc4faac00be6628f92ef6b8cb1b1e76aac81fa18": { - "balance": "205410000000000000000" + "0xcc4faac00be6628f92ef6b8cb1b1e76aac81fa18": { + "balance": "0xb22a2eab0f0fd0000" }, - "5f99dc8e49e61d57daef606acdd91b4d7007326a": { - "balance": "3000000000000000000000" + "0x5f99dc8e49e61d57daef606acdd91b4d7007326a": { + "balance": "0xa2a15d09519be00000" }, - "b8a979352759ba09e35aa5935df175bff678a108": { - "balance": "20000000000000000000" + "0xb8a979352759ba09e35aa5935df175bff678a108": { + "balance": "0x1158e460913d00000" }, - "86fff220e59305c09f483860d6f94e96fbe32f57": { - "balance": "42900000000000000000" + "0x86fff220e59305c09f483860d6f94e96fbe32f57": { + "balance": "0x2535b6ab4c0420000" }, - "03e8b084537557e709eae2e1e1a5a6bce1ef8314": { - "balance": "20000000000000000000" + "0x03e8b084537557e709eae2e1e1a5a6bce1ef8314": { + "balance": "0x1158e460913d00000" }, - "dda4ff7de491c687df4574dd1b17ff8f246ba3d1": { - "balance": "19600000000000000000000" + "0xdda4ff7de491c687df4574dd1b17ff8f246ba3d1": { + "balance": "0x42684a41abfd8400000" }, - "2538532936813c91e653284f017c80c3b8f8a36f": { - "balance": "2002000000000000000000" + "0x2538532936813c91e653284f017c80c3b8f8a36f": { + "balance": "0x6c8754c8f30c080000" }, - "5a82f96cd4b7e2d93d10f3185dc8f43d4b75aa69": { - "balance": "1999400000000000000000" + "0x5a82f96cd4b7e2d93d10f3185dc8f43d4b75aa69": { + "balance": "0x6c633fbab98c040000" }, - "86740a46648e845a5d96461b18091ff57be8a16f": { - "balance": "98000000000000000000000" + "0x86740a46648e845a5d96461b18091ff57be8a16f": { + "balance": "0x14c0973485bf39400000" }, - "7e3f63e13129a221ba1ab06326342cd98b5126ae": { - "balance": "1597960000000000000000" + "0x7e3f63e13129a221ba1ab06326342cd98b5126ae": { + "balance": "0x56a02659a523340000" }, - "1f5f3b34bd134b2781afe5a0424ac5846cdefd11": { - "balance": "99000000000000000000" + "0x1f5f3b34bd134b2781afe5a0424ac5846cdefd11": { + "balance": "0x55de6a779bbac0000" }, - "39936c2719450b9420cc2522cf91db01f227c1c1": { - "balance": "500000000000000000000" + "0x39936c2719450b9420cc2522cf91db01f227c1c1": { + "balance": "0x1b1ae4d6e2ef500000" }, - "967076a877b18ec15a415bb116f06ef32645dba3": { - "balance": "2000000000000000000000" + "0x967076a877b18ec15a415bb116f06ef32645dba3": { + "balance": "0x6c6b935b8bbd400000" }, - "a42908e7fe53980a9abf4044e957a54b70e99cbe": { - "balance": "2000000000000000000000" + "0xa42908e7fe53980a9abf4044e957a54b70e99cbe": { + "balance": "0x6c6b935b8bbd400000" }, - "5eb371c407406c427b3b7de271ad3c1e04269579": { - "balance": "3000000000000000000000" + "0x5eb371c407406c427b3b7de271ad3c1e04269579": { + "balance": "0xa2a15d09519be00000" }, - "a570223ae3caa851418a9843a1ac55db4824f4fd": { - "balance": "200000000000000000000" + "0xa570223ae3caa851418a9843a1ac55db4824f4fd": { + "balance": "0xad78ebc5ac6200000" }, - "764692cccb33405dd0ab0c3379b49caf8e6221ba": { - "balance": "20000000000000000000" + "0x764692cccb33405dd0ab0c3379b49caf8e6221ba": { + "balance": "0x1158e460913d00000" }, - "a365918bfe3f2627b9f3a86775d8756e0fd8a94b": { - "balance": "400000000000000000000" + "0xa365918bfe3f2627b9f3a86775d8756e0fd8a94b": { + "balance": "0x15af1d78b58c400000" }, - "069ed0ab7aa77de571f16106051d92afe195f2d0": { - "balance": "200000000000000000000" + "0x069ed0ab7aa77de571f16106051d92afe195f2d0": { + "balance": "0xad78ebc5ac6200000" }, - "bd432a3916249b4724293af9146e49b8280a7f2a": { - "balance": "4000000000000000000000" + "0xbd432a3916249b4724293af9146e49b8280a7f2a": { + "balance": "0xd8d726b7177a800000" }, - "61c9dce8b2981cb40e98b0402bc3eb28348f03ac": { - "balance": "196910000000000000000" + "0x61c9dce8b2981cb40e98b0402bc3eb28348f03ac": { + "balance": "0xaacacd9b9e22b0000" }, - "8f1fcc3c51e252b693bc5b0ec3f63529fe69281e": { - "balance": "6000000000000000000000" + "0x8f1fcc3c51e252b693bc5b0ec3f63529fe69281e": { + "balance": "0x14542ba12a337c00000" }, - "55fd08d18064bd202c0ec3d2cce0ce0b9d169c4d": { - "balance": "1970000000000000000000" + "0x55fd08d18064bd202c0ec3d2cce0ce0b9d169c4d": { + "balance": "0x6acb3df27e1f880000" }, - "383a7c899ee18bc214969870bc7482f6d8f3570e": { - "balance": "10000000000000000000000" + "0x383a7c899ee18bc214969870bc7482f6d8f3570e": { + "balance": "0x21e19e0c9bab2400000" }, - "b14cc8de33d6338236539a489020ce4655a32bc6": { - "balance": "8000000000000000000000" + "0xb14cc8de33d6338236539a489020ce4655a32bc6": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "448bf410ad9bbc2fecc4508d87a7fc2e4b8561ad": { - "balance": "199955000000000000000" + "0x448bf410ad9bbc2fecc4508d87a7fc2e4b8561ad": { + "balance": "0xad6eedd17cf3b8000" }, - "06f7dc8d1b9462cef6feb13368a7e3974b097f9f": { - "balance": "2000000000000000000000" + "0x06f7dc8d1b9462cef6feb13368a7e3974b097f9f": { + "balance": "0x6c6b935b8bbd400000" }, - "9c9f89a3910f6a2ae8a91047a17ab788bddec170": { - "balance": "10000000000000000000000" + "0x9c9f89a3910f6a2ae8a91047a17ab788bddec170": { + "balance": "0x21e19e0c9bab2400000" }, - "5de598aba344378cab4431555b4f79992dc290c6": { - "balance": "1337000000000000000000" + "0x5de598aba344378cab4431555b4f79992dc290c6": { + "balance": "0x487a9a304539440000" }, - "87e6034ecf23f8b5639d5f0ea70a22538a920423": { - "balance": "328000000000000000000" + "0x87e6034ecf23f8b5639d5f0ea70a22538a920423": { + "balance": "0x11c7ea162e78200000" }, - "8b27392206b958cd375d7ef8af2cf8ef0598c0bc": { - "balance": "1000000000000000000000" + "0x8b27392206b958cd375d7ef8af2cf8ef0598c0bc": { + "balance": "0x3635c9adc5dea00000" }, - "49136fe6e28b7453fcb16b6bbbe9aaacba8337fd": { - "balance": "2000000000000000000000" + "0x49136fe6e28b7453fcb16b6bbbe9aaacba8337fd": { + "balance": "0x6c6b935b8bbd400000" }, - "6982fe8a867e93eb4a0bd051589399f2ec9a5292": { - "balance": "2000000000000000000000" + "0x6982fe8a867e93eb4a0bd051589399f2ec9a5292": { + "balance": "0x6c6b935b8bbd400000" }, - "9fd1052a60506bd1a9ef003afd9d033c267d8e99": { - "balance": "1000000000000000000000" + "0x9fd1052a60506bd1a9ef003afd9d033c267d8e99": { + "balance": "0x3635c9adc5dea00000" }, - "d38fa2c4cc147ad06ad5a2f75579281f22a7cc1f": { - "balance": "20000000000000000000000" + "0xd38fa2c4cc147ad06ad5a2f75579281f22a7cc1f": { + "balance": "0x43c33c1937564800000" }, - "6f794dbdf623daa6e0d00774ad6962737c921ea4": { - "balance": "2000000000000000000000" + "0x6f794dbdf623daa6e0d00774ad6962737c921ea4": { + "balance": "0x6c6b935b8bbd400000" }, - "e96b184e1f0f54924ac874f60bbf44707446b72b": { - "balance": "2910840000000000000000" + "0xe96b184e1f0f54924ac874f60bbf44707446b72b": { + "balance": "0x9dcc0515b56e0c0000" }, - "b5ba29917c78a1d9e5c5c713666c1e411d7f693a": { - "balance": "3100000000000000000000" + "0xb5ba29917c78a1d9e5c5c713666c1e411d7f693a": { + "balance": "0xa80d24677efef00000" }, - "81d619ff5726f2405f12904c72eb1e24a0aaee4f": { - "balance": "20000000000000000000000" + "0x81d619ff5726f2405f12904c72eb1e24a0aaee4f": { + "balance": "0x43c33c1937564800000" }, - "b02fa29387ec12e37f6922ac4ce98c5b09e0b00f": { - "balance": "2000000000000000000000" + "0xb02fa29387ec12e37f6922ac4ce98c5b09e0b00f": { + "balance": "0x6c6b935b8bbd400000" }, - "b7230d1d1ff2aca366963914a79df9f7c5ea2c98": { - "balance": "8000000000000000000000" + "0xb7230d1d1ff2aca366963914a79df9f7c5ea2c98": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "7b4007c45e5a573fdbb6f8bd746bf94ad04a3c26": { - "balance": "15202564000000000000000" + "0x7b4007c45e5a573fdbb6f8bd746bf94ad04a3c26": { + "balance": "0x33821f5135d259a0000" }, - "8d9a0c70d2262042df1017d6c303132024772712": { - "balance": "2000000000000000000000" + "0x8d9a0c70d2262042df1017d6c303132024772712": { + "balance": "0x6c6b935b8bbd400000" }, - "323aad41df4b6fc8fece8c93958aa901fa680843": { - "balance": "970000000000000000000" + "0x323aad41df4b6fc8fece8c93958aa901fa680843": { + "balance": "0x34957444b840e80000" }, - "db04fad9c49f9e880beb8fcf1d3a3890e4b3846f": { - "balance": "1242482000000000000000" + "0xdb04fad9c49f9e880beb8fcf1d3a3890e4b3846f": { + "balance": "0x435ae6cc0c58e50000" }, - "27824666d278d70423f03dfe1dc7a3f02f43e2b5": { - "balance": "1000070000000000000000" + "0x27824666d278d70423f03dfe1dc7a3f02f43e2b5": { + "balance": "0x3636c25e66ece70000" }, - "e04920dc6ecc1d6ecc084f88aa0af5db97bf893a": { - "balance": "182000000000000000000" + "0xe04920dc6ecc1d6ecc084f88aa0af5db97bf893a": { + "balance": "0x9ddc1e3b901180000" }, - "b0c1b177a220e41f7c74d07cde8569c21c75c2f9": { - "balance": "5600000000000000000000" + "0xb0c1b177a220e41f7c74d07cde8569c21c75c2f9": { + "balance": "0x12f939c99edab800000" }, - "7864dc999fe4f8e003c0f43decc39aae1522dc0f": { - "balance": "94400000000000000000" + "0x7864dc999fe4f8e003c0f43decc39aae1522dc0f": { + "balance": "0x51e102bd8ece00000" }, - "c75c37ce2da06bbc40081159c6ba0f976e3993b1": { - "balance": "1078640000000000000000" + "0xc75c37ce2da06bbc40081159c6ba0f976e3993b1": { + "balance": "0x3a7923151ecf580000" }, - "179a825e0f1f6e985309668465cffed436f6aea9": { - "balance": "20000000000000000000" + "0x179a825e0f1f6e985309668465cffed436f6aea9": { + "balance": "0x1158e460913d00000" }, - "2c6b699d9ead349f067f45711a074a641db6a897": { - "balance": "20000000000000000000" + "0x2c6b699d9ead349f067f45711a074a641db6a897": { + "balance": "0x1158e460913d00000" }, - "068ce8bd6e902a45cb83b51541b40f39c4469712": { - "balance": "5240000000000000000000" + "0x068ce8bd6e902a45cb83b51541b40f39c4469712": { + "balance": "0x11c0f9bad4a46e00000" }, - "767ac690791c2e23451089fe6c7083fe55deb62b": { - "balance": "820000000000000000000" + "0x767ac690791c2e23451089fe6c7083fe55deb62b": { + "balance": "0x2c73c937742c500000" }, - "b34f04b8db65bba9c26efc4ce6efc50481f3d65d": { - "balance": "20000000000000000000000" + "0xb34f04b8db65bba9c26efc4ce6efc50481f3d65d": { + "balance": "0x43c33c1937564800000" }, - "29aef48de8c9fbad4b9e4ca970797a5533eb722d": { - "balance": "10000000000000000000000" + "0x29aef48de8c9fbad4b9e4ca970797a5533eb722d": { + "balance": "0x21e19e0c9bab2400000" }, - "0a0ecda6636f7716ef1973614687fd89a820a706": { - "balance": "394000000000000000000" + "0x0a0ecda6636f7716ef1973614687fd89a820a706": { + "balance": "0x155bd9307f9fe80000" }, - "b32825d5f3db249ef4e85cc4f33153958976e8bc": { - "balance": "501375000000000000000" + "0xb32825d5f3db249ef4e85cc4f33153958976e8bc": { + "balance": "0x1b2df9d219f5798000" }, - "7ef16fd8d15b378a0fba306b8d03dd98fc92619f": { - "balance": "700000000000000000000" + "0x7ef16fd8d15b378a0fba306b8d03dd98fc92619f": { + "balance": "0x25f273933db5700000" }, - "b58b52865ea55d8036f2fab26098b352ca837e18": { - "balance": "18200000000000000000" + "0xb58b52865ea55d8036f2fab26098b352ca837e18": { + "balance": "0xfc936392801c0000" }, - "9b658fb361e046d4fcaa8aef6d02a99111223625": { - "balance": "2000000000000000000000" + "0x9b658fb361e046d4fcaa8aef6d02a99111223625": { + "balance": "0x6c6b935b8bbd400000" }, - "b2a498f03bd7178bd8a789a00f5237af79a3e3f8": { - "balance": "19400000000000000000000" + "0xb2a498f03bd7178bd8a789a00f5237af79a3e3f8": { + "balance": "0x41bad155e6512200000" }, - "cb48fe8265d9af55eb7006bc335645b0a3a183be": { - "balance": "3000000000000000000000" + "0xcb48fe8265d9af55eb7006bc335645b0a3a183be": { + "balance": "0xa2a15d09519be00000" }, - "3cf9a1d465e78b7039e3694478e2627b36fcd141": { - "balance": "1372000000000000000000" + "0x3cf9a1d465e78b7039e3694478e2627b36fcd141": { + "balance": "0x4a60532ad51bf00000" }, - "5db84400570069a9573cab04b4e6b69535e202b8": { - "balance": "9700000000000000000000" + "0x5db84400570069a9573cab04b4e6b69535e202b8": { + "balance": "0x20dd68aaf3289100000" }, - "214c89c5bd8e7d22bc574bb35e48950211c6f776": { - "balance": "18903000000000000000" + "0x214c89c5bd8e7d22bc574bb35e48950211c6f776": { + "balance": "0x10654f258fd358000" }, - "53396f4a26c2b4604496306c5442e7fcba272e36": { - "balance": "20055000000000000000000" + "0x53396f4a26c2b4604496306c5442e7fcba272e36": { + "balance": "0x43f2f08d40e5afc0000" }, - "720994dbe56a3a95929774e20e1fe525cf3704e4": { - "balance": "8000000000000000000000" + "0x720994dbe56a3a95929774e20e1fe525cf3704e4": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "3571cf7ad304ecaee595792f4bbfa484418549d6": { - "balance": "5825500000000000000000" + "0x3571cf7ad304ecaee595792f4bbfa484418549d6": { + "balance": "0x13bcd0d892d9e160000" }, - "6042c644bae2b96f25f94d31f678c90dc96690db": { - "balance": "2000000000000000000000" + "0x6042c644bae2b96f25f94d31f678c90dc96690db": { + "balance": "0x6c6b935b8bbd400000" }, - "2e24b597873bb141bdb237ea8a5ab747799af02d": { - "balance": "20000000000000000000000" + "0x2e24b597873bb141bdb237ea8a5ab747799af02d": { + "balance": "0x43c33c1937564800000" }, - "08c802f87758349fa03e6bc2e2fd0791197eea9a": { - "balance": "2000000000000000000000" + "0x08c802f87758349fa03e6bc2e2fd0791197eea9a": { + "balance": "0x6c6b935b8bbd400000" }, - "297a88921b5fca10e5bb9ded60025437ae221694": { - "balance": "200000000000000000000" + "0x297a88921b5fca10e5bb9ded60025437ae221694": { + "balance": "0xad78ebc5ac6200000" }, - "aee49d68adedb081fd43705a5f78c778fb90de48": { - "balance": "20000000000000000000" + "0xaee49d68adedb081fd43705a5f78c778fb90de48": { + "balance": "0x1158e460913d00000" }, - "4cee901b4ac8b156c5e2f8a6f1bef572a7dceb7e": { - "balance": "1000000000000000000000" + "0x4cee901b4ac8b156c5e2f8a6f1bef572a7dceb7e": { + "balance": "0x3635c9adc5dea00000" }, - "dfaf31e622c03d9e18a0ddb8be60fbe3e661be0a": { - "balance": "9999800000000000000000" + "0xdfaf31e622c03d9e18a0ddb8be60fbe3e661be0a": { + "balance": "0x21e171a3ec9f72c0000" }, - "00aa5381b2138ebeffc191d5d8c391753b7098d2": { - "balance": "990049000000000000000" + "0x00aa5381b2138ebeffc191d5d8c391753b7098d2": { + "balance": "0x35abb09ffedeb68000" }, - "5b4c0c60f10ed2894bdb42d9dd1d210587810a0d": { - "balance": "500000000000000000000" + "0x5b4c0c60f10ed2894bdb42d9dd1d210587810a0d": { + "balance": "0x1b1ae4d6e2ef500000" }, - "c44f4ab5bc60397c737eb0683391b633f83c48fa": { - "balance": "1000000000000000000000" + "0xc44f4ab5bc60397c737eb0683391b633f83c48fa": { + "balance": "0x3635c9adc5dea00000" }, - "50bef2756248f9a7a380f91b051ba3be28a649ed": { - "balance": "1999884000000000000000" + "0x50bef2756248f9a7a380f91b051ba3be28a649ed": { + "balance": "0x6c69f73e29134e0000" }, - "1bd909ac0d4a1102ec98dcf2cca96a0adcd7a951": { - "balance": "20055000000000000000" + "0x1bd909ac0d4a1102ec98dcf2cca96a0adcd7a951": { + "balance": "0x11651ac3e7a758000" }, - "9ec03e02e587b7769def538413e97f7e55be71d8": { - "balance": "19700000000000000000000" + "0x9ec03e02e587b7769def538413e97f7e55be71d8": { + "balance": "0x42bf06b78ed3b500000" }, - "9874803fe1f3a0365e7922b14270eaeb032cc1b5": { - "balance": "1124500000000000000000" + "0x9874803fe1f3a0365e7922b14270eaeb032cc1b5": { + "balance": "0x3cf5928824c6c20000" }, - "4e2310191ead8d3bc6489873a5f0c2ec6b87e1be": { - "balance": "1000000000000000000000" + "0x4e2310191ead8d3bc6489873a5f0c2ec6b87e1be": { + "balance": "0x3635c9adc5dea00000" }, - "93678a3c57151aeb68efdc43ef4d36cb59a009f3": { - "balance": "30060000000000000000" + "0x93678a3c57151aeb68efdc43ef4d36cb59a009f3": { + "balance": "0x1a12a92bc3c3e0000" }, - "f483f607a21fcc28100a018c568ffbe140380410": { - "balance": "1000000000000000000000" + "0xf483f607a21fcc28100a018c568ffbe140380410": { + "balance": "0x3635c9adc5dea00000" }, - "2a91a9fed41b7d0e5cd2d83158d3e8a41a9a2d71": { - "balance": "1940000000000000000000" + "0x2a91a9fed41b7d0e5cd2d83158d3e8a41a9a2d71": { + "balance": "0x692ae8897081d00000" }, - "240e559e274aaef0c258998c979f671d1173b88b": { - "balance": "4000000000000000000000" + "0x240e559e274aaef0c258998c979f671d1173b88b": { + "balance": "0xd8d726b7177a800000" }, - "108a2b7c336f784779d8b54d02a8d31d9a139c0a": { - "balance": "10000000000000000000000" + "0x108a2b7c336f784779d8b54d02a8d31d9a139c0a": { + "balance": "0x21e19e0c9bab2400000" }, - "9c98fdf1fdcd8ba8f4c5b04c3ae8587efdf0f6e6": { - "balance": "6000000000000000000000" + "0x9c98fdf1fdcd8ba8f4c5b04c3ae8587efdf0f6e6": { + "balance": "0x14542ba12a337c00000" }, - "194ff44aefc17bd20efd7a204c47d1620c86db5d": { - "balance": "2999400000000000000000" + "0x194ff44aefc17bd20efd7a204c47d1620c86db5d": { + "balance": "0xa29909687f6aa40000" }, - "1f8116bd0af5570eaf0c56c49c7ab5e37a580458": { - "balance": "2000000000000000000000" + "0x1f8116bd0af5570eaf0c56c49c7ab5e37a580458": { + "balance": "0x6c6b935b8bbd400000" }, - "d79835e404fb86bf845fba090d6ba25e0c8866a6": { - "balance": "2400000000000000000000" + "0xd79835e404fb86bf845fba090d6ba25e0c8866a6": { + "balance": "0x821ab0d44149800000" }, - "a8e7201ff619faffc332e6ad37ed41e301bf014a": { - "balance": "600000000000000000000" + "0xa8e7201ff619faffc332e6ad37ed41e301bf014a": { + "balance": "0x2086ac351052600000" }, - "286906b6bd4972e3c71655e04baf36260c7cb153": { - "balance": "340000000000000000000" + "0x286906b6bd4972e3c71655e04baf36260c7cb153": { + "balance": "0x126e72a69a50d00000" }, - "db4bc83b0e6baadb1156c5cf06e0f721808c52c7": { - "balance": "880000000000000000000" + "0xdb4bc83b0e6baadb1156c5cf06e0f721808c52c7": { + "balance": "0x2fb474098f67c00000" }, - "a158148a2e0f3e92dc2ce38febc20107e3253c96": { - "balance": "2000000000000000000000" + "0xa158148a2e0f3e92dc2ce38febc20107e3253c96": { + "balance": "0x6c6b935b8bbd400000" }, - "9f6a322a6d469981426ae844865d7ee0bb15c7b3": { - "balance": "50003000000000000000" + "0x9f6a322a6d469981426ae844865d7ee0bb15c7b3": { + "balance": "0x2b5ee57929fdb8000" }, - "32f29e8727a74c6b4301e3ffff0687c1b870dae9": { - "balance": "1000000000000000000000" + "0x32f29e8727a74c6b4301e3ffff0687c1b870dae9": { + "balance": "0x3635c9adc5dea00000" }, - "19918aa09e7d494e98ffa5db50350892f7156ac6": { - "balance": "10000000000000000000000" + "0x19918aa09e7d494e98ffa5db50350892f7156ac6": { + "balance": "0x21e19e0c9bab2400000" }, - "5a5f8508da0ebebb90be9033bd4d9e274105ae00": { - "balance": "6685000000000000000000" + "0x5a5f8508da0ebebb90be9033bd4d9e274105ae00": { + "balance": "0x16a6502f15a1e540000" }, - "6fc25e7e00ca4f60a9fe6f28d1fde3542e2d1079": { - "balance": "792000000000000000000" + "0x6fc25e7e00ca4f60a9fe6f28d1fde3542e2d1079": { + "balance": "0x2aef353bcddd600000" }, - "72094f3951ffc9771dced23ada080bcaf9c7cca7": { - "balance": "6000000000000000000000" + "0x72094f3951ffc9771dced23ada080bcaf9c7cca7": { + "balance": "0x14542ba12a337c00000" }, - "43f7e86e381ec51ec4906d1476cba97a3db584e4": { - "balance": "1000000000000000000000" + "0x43f7e86e381ec51ec4906d1476cba97a3db584e4": { + "balance": "0x3635c9adc5dea00000" }, - "05696b73916bd3033e05521e3211dfec026e98e4": { - "balance": "2000000000000000000000" + "0x05696b73916bd3033e05521e3211dfec026e98e4": { + "balance": "0x6c6b935b8bbd400000" }, - "5e7f70378775589fc66a81d3f653e954f55560eb": { - "balance": "2434000000000000000000" + "0x5e7f70378775589fc66a81d3f653e954f55560eb": { + "balance": "0x83f289181d84c80000" }, - "895613236f3584216ad75c5d3e07e3fa6863a778": { - "balance": "2000000000000000000000" + "0x895613236f3584216ad75c5d3e07e3fa6863a778": { + "balance": "0x6c6b935b8bbd400000" }, - "4eb1454b573805c8aca37edec7149a41f61202f4": { - "balance": "300000000000000000000" + "0x4eb1454b573805c8aca37edec7149a41f61202f4": { + "balance": "0x1043561a8829300000" }, - "d99999a2490d9494a530cae4daf38554f4dd633e": { - "balance": "120000000000000000000" + "0xd99999a2490d9494a530cae4daf38554f4dd633e": { + "balance": "0x68155a43676e00000" }, - "1704cefcfb1331ec7a78388b29393e85c1af7916": { - "balance": "400000000000000000000" + "0x1704cefcfb1331ec7a78388b29393e85c1af7916": { + "balance": "0x15af1d78b58c400000" }, - "ac4acfc36ed6094a27e118ecc911cd473e8fb91f": { - "balance": "1799800000000000000000" + "0xac4acfc36ed6094a27e118ecc911cd473e8fb91f": { + "balance": "0x61913e14403c0c0000" }, - "a975b077fcb4cc8efcbf838459b6fa243a4159d6": { - "balance": "40000000000000000000" + "0xa975b077fcb4cc8efcbf838459b6fa243a4159d6": { + "balance": "0x22b1c8c1227a00000" }, - "9c405cf697956138065e11c5f7559e67245bd1a5": { - "balance": "200000000000000000000" + "0x9c405cf697956138065e11c5f7559e67245bd1a5": { + "balance": "0xad78ebc5ac6200000" }, - "cafde855864c2598da3cafc05ad98df2898e8048": { - "balance": "14179272000000000000000" + "0xcafde855864c2598da3cafc05ad98df2898e8048": { + "balance": "0x300a8ed96ff4a940000" }, - "8ef711e43a13918f1303e81d0ea78c9eefd67eb2": { - "balance": "4000000000000000000000" + "0x8ef711e43a13918f1303e81d0ea78c9eefd67eb2": { + "balance": "0xd8d726b7177a800000" }, - "0b14891999a65c9ef73308efe3100ca1b20e8192": { - "balance": "800000000000000000000" + "0x0b14891999a65c9ef73308efe3100ca1b20e8192": { + "balance": "0x2b5e3af16b18800000" }, - "47cf9cdaf92fc999cc5efbb7203c61e4f1cdd4c3": { - "balance": "131400000000000000000" + "0x47cf9cdaf92fc999cc5efbb7203c61e4f1cdd4c3": { + "balance": "0x71f8a93d01e540000" }, - "04ba8a3f03f08b895095994dda619edaacee3e7a": { - "balance": "2000000000000000000000" + "0x04ba8a3f03f08b895095994dda619edaacee3e7a": { + "balance": "0x6c6b935b8bbd400000" }, - "02b6d65cb00b7b36e1fb5ed3632c4cb20a894130": { - "balance": "20000000000000000000000" + "0x02b6d65cb00b7b36e1fb5ed3632c4cb20a894130": { + "balance": "0x43c33c1937564800000" }, - "f99aee444b5783c093cfffd1c4632cf93c6f050c": { - "balance": "400000000000000000000" + "0xf99aee444b5783c093cfffd1c4632cf93c6f050c": { + "balance": "0x15af1d78b58c400000" }, - "2541314a0b408e95a694444977712a50713591ab": { - "balance": "1634706000000000000000" + "0x2541314a0b408e95a694444977712a50713591ab": { + "balance": "0x589e1a5df4d7b50000" }, - "3096dca34108085bcf04ae72b94574a13e1a3e1d": { - "balance": "200000000000000000000" + "0x3096dca34108085bcf04ae72b94574a13e1a3e1d": { + "balance": "0xad78ebc5ac6200000" }, - "56df05bad46c3f00ae476ecf017bb8c877383ff1": { - "balance": "197248000000000000000" + "0x56df05bad46c3f00ae476ecf017bb8c877383ff1": { + "balance": "0xab15daaef70400000" }, - "6d59b21cd0e2748804d9abe064eac2bef0c95f27": { - "balance": "2000000000000000000000" + "0x6d59b21cd0e2748804d9abe064eac2bef0c95f27": { + "balance": "0x6c6b935b8bbd400000" }, - "b29f5b7c1930d9f97a115e067066f0b54db44b3b": { - "balance": "1000000000000000000000" + "0xb29f5b7c1930d9f97a115e067066f0b54db44b3b": { + "balance": "0x3635c9adc5dea00000" }, - "888c16144933197cac26504dd76e06fd6600c789": { - "balance": "100000000000000000000" + "0x888c16144933197cac26504dd76e06fd6600c789": { + "balance": "0x56bc75e2d63100000" }, - "dfe3c52a92c30396a4e33a50170dc900fcf8c9cf": { - "balance": "50000000000000000000" + "0xdfe3c52a92c30396a4e33a50170dc900fcf8c9cf": { + "balance": "0x2b5e3af16b1880000" }, - "f76f69cee4faa0a63b30ae1e7881f4f715657010": { - "balance": "200000000000000000000" + "0xf76f69cee4faa0a63b30ae1e7881f4f715657010": { + "balance": "0xad78ebc5ac6200000" }, - "ee0007b0960d00908a94432a737557876aac7c31": { - "balance": "53053000000000000000" + "0xee0007b0960d00908a94432a737557876aac7c31": { + "balance": "0x2e0421e69c4cc8000" }, - "effc15e487b1beda0a8d1325bdb4172240dc540a": { - "balance": "64940000000000000000" + "0xeffc15e487b1beda0a8d1325bdb4172240dc540a": { + "balance": "0x3853939eee1de0000" }, - "40ab0a3e83d0c8ac9366910520eab1772bac3b1a": { - "balance": "976600000000000000000" + "0x40ab0a3e83d0c8ac9366910520eab1772bac3b1a": { + "balance": "0x34f10c2dc05e7c0000" }, - "1895a0eb4a4372722fcbc5afe6936f289c88a419": { - "balance": "910000000000000000000" + "0x1895a0eb4a4372722fcbc5afe6936f289c88a419": { + "balance": "0x3154c9729d05780000" }, - "81efe296ae76c860d1c5fbd33d47e8ce9996d157": { - "balance": "1000000000000000000000" + "0x81efe296ae76c860d1c5fbd33d47e8ce9996d157": { + "balance": "0x3635c9adc5dea00000" }, - "9ddd355e634ee9927e4b7f6c97e7bf3a2f1e687a": { - "balance": "50000000000000000000" + "0x9ddd355e634ee9927e4b7f6c97e7bf3a2f1e687a": { + "balance": "0x2b5e3af16b1880000" }, - "f2b4ab2c9427a9015ef6eefff5edb60139b719d1": { - "balance": "716800000000000000000" + "0xf2b4ab2c9427a9015ef6eefff5edb60139b719d1": { + "balance": "0x26db992a3b18000000" }, - "765be2e12f629e6349b97d21b62a17b7c830edab": { - "balance": "6000000000000000000000" + "0x765be2e12f629e6349b97d21b62a17b7c830edab": { + "balance": "0x14542ba12a337c00000" }, - "ff61c9c1b7a3d8b53bba20b34466544b7b216644": { - "balance": "2000000000000000000000" + "0xff61c9c1b7a3d8b53bba20b34466544b7b216644": { + "balance": "0x6c6b935b8bbd400000" }, - "36a08fd6fd1ac17ce15ed57eefb12a2be28188bf": { - "balance": "1337000000000000000000" + "0x36a08fd6fd1ac17ce15ed57eefb12a2be28188bf": { + "balance": "0x487a9a304539440000" }, - "17049311101d817efb1d65910f663662a699c98c": { - "balance": "1999800000000000000000" + "0x17049311101d817efb1d65910f663662a699c98c": { + "balance": "0x6c68ccd09b022c0000" }, - "30511832918d8034a7bee72ef2bfee440ecbbcf6": { - "balance": "16100000000000000000000" + "0x30511832918d8034a7bee72ef2bfee440ecbbcf6": { + "balance": "0x368c8623a8b4d100000" }, - "d27c234ff7accace3d996708f8f9b04970f97d36": { - "balance": "1337000000000000000000" + "0xd27c234ff7accace3d996708f8f9b04970f97d36": { + "balance": "0x487a9a304539440000" }, - "a961171f5342b173dd70e7bfe5b5ca238b13bcdd": { - "balance": "3397053000000000000000" + "0xa961171f5342b173dd70e7bfe5b5ca238b13bcdd": { + "balance": "0xb82794a9244f0c8000" }, - "30bf61b2d877fe10635126326fa189e4b0b1c3b0": { - "balance": "1027580000000000000000" + "0x30bf61b2d877fe10635126326fa189e4b0b1c3b0": { + "balance": "0x37b48985a5d7e60000" }, - "4bb6d86b8314c22d8d37ea516d0019f156aae12d": { - "balance": "1000000000000000000000" + "0x4bb6d86b8314c22d8d37ea516d0019f156aae12d": { + "balance": "0x3635c9adc5dea00000" }, - "5f363e0ab747e02d1b3b66abb69ea53c7baf523a": { - "balance": "11640000000000000000000" + "0x5f363e0ab747e02d1b3b66abb69ea53c7baf523a": { + "balance": "0x277017338a30ae00000" }, - "283e11203749b1fa4f32febb71e49d135919382a": { - "balance": "1000000000000000000000" + "0x283e11203749b1fa4f32febb71e49d135919382a": { + "balance": "0x3635c9adc5dea00000" }, - "ac5999a89d2dd286d5a80c6dee7e86aad40f9e12": { - "balance": "3880000000000000000000" + "0xac5999a89d2dd286d5a80c6dee7e86aad40f9e12": { + "balance": "0xd255d112e103a00000" }, - "3f6dd3650ee428dcb7759553b017a96a94286ac9": { - "balance": "1337000000000000000000" + "0x3f6dd3650ee428dcb7759553b017a96a94286ac9": { + "balance": "0x487a9a304539440000" }, - "b3fc1d6881abfcb8becc0bb021b8b73b7233dd91": { - "balance": "50000000000000000000" + "0xb3fc1d6881abfcb8becc0bb021b8b73b7233dd91": { + "balance": "0x2b5e3af16b1880000" }, - "f0832a6bb25503eeca435be31b0bf905ca1fcf57": { - "balance": "6685000000000000000000" + "0xf0832a6bb25503eeca435be31b0bf905ca1fcf57": { + "balance": "0x16a6502f15a1e540000" }, - "9d7fda7070bf3ee9bbd9a41f55cad4854ae6c22c": { - "balance": "11027380000000000000000" + "0x9d7fda7070bf3ee9bbd9a41f55cad4854ae6c22c": { + "balance": "0x255cba3c46fcf120000" }, - "4b0bd8acfcbc53a6010b40d4d08ddd2d9d69622d": { - "balance": "668500000000000000000" + "0x4b0bd8acfcbc53a6010b40d4d08ddd2d9d69622d": { + "balance": "0x243d4d18229ca20000" }, - "f3b668b3f14d920ebc379092db98031b67b219b3": { - "balance": "199955000000000000000" + "0xf3b668b3f14d920ebc379092db98031b67b219b3": { + "balance": "0xad6eedd17cf3b8000" }, - "d91d889164479ce436ece51763e22cda19b22d6b": { - "balance": "3365200000000000000000" + "0xd91d889164479ce436ece51763e22cda19b22d6b": { + "balance": "0xb66d88126800880000" }, - "ffe28db53c9044b4ecd4053fd1b4b10d7056c688": { - "balance": "100000000000000000000" + "0xffe28db53c9044b4ecd4053fd1b4b10d7056c688": { + "balance": "0x56bc75e2d63100000" }, - "c77b01a6e911fa988d01a3ab33646beef9c138f3": { - "balance": "721400000000000000000" + "0xc77b01a6e911fa988d01a3ab33646beef9c138f3": { + "balance": "0x271b6fa5dbe6cc0000" }, - "c0064f1d9474ab915d56906c9fb320a2c7098c9b": { - "balance": "358000000000000000000" + "0xc0064f1d9474ab915d56906c9fb320a2c7098c9b": { + "balance": "0x13683f7f3c15d80000" }, - "4e3edad4864dab64cae4c5417a76774053dc6432": { - "balance": "590943000000000000000" + "0x4e3edad4864dab64cae4c5417a76774053dc6432": { + "balance": "0x2008fb478cbfa98000" }, - "71d2cc6d02578c65f73c575e76ce8fbcfadcf356": { - "balance": "72400000000000000000" + "0x71d2cc6d02578c65f73c575e76ce8fbcfadcf356": { + "balance": "0x3ecc078688a480000" }, - "9971df60f0ae66dce9e8c84e17149f09f9c52f64": { - "balance": "200000000000000000000" + "0x9971df60f0ae66dce9e8c84e17149f09f9c52f64": { + "balance": "0xad78ebc5ac6200000" }, - "58e661d0ba73d6cf24099a5562b808f7b3673b68": { - "balance": "2000000000000000000000" + "0x58e661d0ba73d6cf24099a5562b808f7b3673b68": { + "balance": "0x6c6b935b8bbd400000" }, - "84b0ee6bb837d3a4c4c5011c3a228c0edab4634a": { - "balance": "20000000000000000000" + "0x84b0ee6bb837d3a4c4c5011c3a228c0edab4634a": { + "balance": "0x1158e460913d00000" }, - "84375afbf59b3a1d61a1be32d075e0e15a4fbca5": { - "balance": "200000000000000000000" + "0x84375afbf59b3a1d61a1be32d075e0e15a4fbca5": { + "balance": "0xad78ebc5ac6200000" }, - "9ae9476bfecd3591964dd325cf8c2a24faed82c1": { - "balance": "4000000000000000000000" + "0x9ae9476bfecd3591964dd325cf8c2a24faed82c1": { + "balance": "0xd8d726b7177a800000" }, - "6a4c8907b600248057b1e46354b19bdc859c991a": { - "balance": "20000000000000000000" + "0x6a4c8907b600248057b1e46354b19bdc859c991a": { + "balance": "0x1158e460913d00000" }, - "1c045649cd53dc23541f8ed4d341812808d5dd9c": { - "balance": "7000000000000000000000" + "0x1c045649cd53dc23541f8ed4d341812808d5dd9c": { + "balance": "0x17b7883c06916600000" }, - "c5e488cf2b5677933971f64cb8202dd05752a2c0": { - "balance": "1000000000000000000000" + "0xc5e488cf2b5677933971f64cb8202dd05752a2c0": { + "balance": "0x3635c9adc5dea00000" }, - "eb25481fcd9c221f1ac7e5fd1ecd9307a16215b8": { - "balance": "197000000000000000000" + "0xeb25481fcd9c221f1ac7e5fd1ecd9307a16215b8": { + "balance": "0xaadec983fcff40000" }, - "a61887818f914a20e31077290b83715a6b2d6ef9": { - "balance": "1880000000000000000000" + "0xa61887818f914a20e31077290b83715a6b2d6ef9": { + "balance": "0x65ea3db75546600000" }, - "679437eacf437878dc293d48a39c87b7421a216c": { - "balance": "64528000000000000000" + "0x679437eacf437878dc293d48a39c87b7421a216c": { + "balance": "0x37f81821db2680000" }, - "331a1c26cc6994cdd3c14bece276ffff4b9df77c": { - "balance": "18049000000000000000" + "0x331a1c26cc6994cdd3c14bece276ffff4b9df77c": { + "balance": "0xfa7aeddf4f068000" }, - "75b95696e8ec4510d56868a7c1a735c68b244890": { - "balance": "6400000000000000000000" + "0x75b95696e8ec4510d56868a7c1a735c68b244890": { + "balance": "0x15af1d78b58c4000000" }, - "a77f3ee19e9388bbbb2215c62397b96560132360": { - "balance": "200000000000000000000" + "0xa77f3ee19e9388bbbb2215c62397b96560132360": { + "balance": "0xad78ebc5ac6200000" }, - "bc7afc8477412274fc265df13c054473427d43c6": { - "balance": "130034000000000000000" + "0xbc7afc8477412274fc265df13c054473427d43c6": { + "balance": "0x70c95920ce3250000" }, - "91050a5cffadedb4bb6eaafbc9e5013428e96c80": { - "balance": "1700000000000000000000" + "0x91050a5cffadedb4bb6eaafbc9e5013428e96c80": { + "balance": "0x5c283d410394100000" }, - "24586ec5451735eeaaeb470dc8736aae752f82e5": { - "balance": "17600000000000000000" + "0x24586ec5451735eeaaeb470dc8736aae752f82e5": { + "balance": "0xf43fc2c04ee00000" }, - "51039377eed0c573f986c5e8a95fb99a59e9330f": { - "balance": "1970000000000000000000" + "0x51039377eed0c573f986c5e8a95fb99a59e9330f": { + "balance": "0x6acb3df27e1f880000" }, - "fbb161fe875f09290a4b262bc60110848f0d2226": { - "balance": "2000000000000000000000" + "0xfbb161fe875f09290a4b262bc60110848f0d2226": { + "balance": "0x6c6b935b8bbd400000" }, - "ed52a2cc0869dc9e9f842bd0957c47a8e9b0c9ff": { - "balance": "9550000000000000000000" + "0xed52a2cc0869dc9e9f842bd0957c47a8e9b0c9ff": { + "balance": "0x205b4dfa1ee74780000" }, - "bad235d5085dc7b068a67c412677b03e1836884c": { - "balance": "2000000000000000000000" + "0xbad235d5085dc7b068a67c412677b03e1836884c": { + "balance": "0x6c6b935b8bbd400000" }, - "055eac4f1ad3f58f0bd024d68ea60dbe01c6afb3": { - "balance": "100000000000000000000" + "0x055eac4f1ad3f58f0bd024d68ea60dbe01c6afb3": { + "balance": "0x56bc75e2d63100000" }, - "4058808816fdaa3a5fc98ed47cfae6c18315422e": { - "balance": "199800000000000000000" + "0x4058808816fdaa3a5fc98ed47cfae6c18315422e": { + "balance": "0xad4c8316a0b0c0000" }, - "3540c7bd7a8442d5bee21a2180a1c4edff1649e0": { - "balance": "1239295000000000000000" + "0x3540c7bd7a8442d5bee21a2180a1c4edff1649e0": { + "balance": "0x432eac4c6f05b98000" }, - "c5edbbd2ca0357654ad0ea4793f8c5cecd30e254": { - "balance": "6000000000000000000000" + "0xc5edbbd2ca0357654ad0ea4793f8c5cecd30e254": { + "balance": "0x14542ba12a337c00000" }, - "b5906b0ae9a28158e8ac550e39da086ee3157623": { - "balance": "200000000000000000000" + "0xb5906b0ae9a28158e8ac550e39da086ee3157623": { + "balance": "0xad78ebc5ac6200000" }, - "4d801093c19ca9b8f342e33cc9c77bbd4c8312cf": { - "balance": "345005000000000000000" + "0x4d801093c19ca9b8f342e33cc9c77bbd4c8312cf": { + "balance": "0x12b3e7fb95cda48000" }, - "206482ee6f138a778fe1ad62b180ce856fbb23e6": { - "balance": "2000000000000000000000" + "0x206482ee6f138a778fe1ad62b180ce856fbb23e6": { + "balance": "0x6c6b935b8bbd400000" }, - "c0ed0d4ad10de03435b153a0fc25de3b93f45204": { - "balance": "3160000000000000000000" + "0xc0ed0d4ad10de03435b153a0fc25de3b93f45204": { + "balance": "0xab4dcf399a3a600000" }, - "29e67990e1b6d52e1055ffe049c53195a81542cf": { - "balance": "20000000000000000000000" + "0x29e67990e1b6d52e1055ffe049c53195a81542cf": { + "balance": "0x43c33c1937564800000" }, - "e6d22209ffd0b87509ade3a8e2ef429879cb89b5": { - "balance": "17260000000000000000000" + "0xe6d22209ffd0b87509ade3a8e2ef429879cb89b5": { + "balance": "0x3a7aa9e1899ca300000" }, - "d6644d40e90bc97fe7dfe7cabd3269fd579ba4b3": { - "balance": "159000000000000000000" + "0xd6644d40e90bc97fe7dfe7cabd3269fd579ba4b3": { + "balance": "0x89e917994f71c0000" }, - "ece1290877b583e361a2d41b009346e6274e2538": { - "balance": "300000000000000000000" + "0xece1290877b583e361a2d41b009346e6274e2538": { + "balance": "0x1043561a8829300000" }, - "ab3861226ffec1289187fb84a08ec3ed043264e8": { - "balance": "1000000000000000000000" + "0xab3861226ffec1289187fb84a08ec3ed043264e8": { + "balance": "0x3635c9adc5dea00000" }, - "60e0bdd0a259bb9cb09d3f37e5cd8b9daceabf8a": { - "balance": "1370000000000000000000" + "0x60e0bdd0a259bb9cb09d3f37e5cd8b9daceabf8a": { + "balance": "0x4a4491bd6dcd280000" }, - "28b77585cb3d55a199ab291d3a18c68fe89a848a": { - "balance": "1960000000000000000000" + "0x28b77585cb3d55a199ab291d3a18c68fe89a848a": { + "balance": "0x6a4076cf7995a00000" }, - "73128173489528012e76b41a5e28c68ba4e3a9d4": { - "balance": "1000000000000000000000" + "0x73128173489528012e76b41a5e28c68ba4e3a9d4": { + "balance": "0x3635c9adc5dea00000" }, - "018492488ba1a292342247b31855a55905fef269": { - "balance": "140000000000000000000" + "0x018492488ba1a292342247b31855a55905fef269": { + "balance": "0x796e3ea3f8ab00000" }, - "0bb54c72fd6610bfa4363397e020384b022b0c49": { - "balance": "1337000000000000000000" + "0x0bb54c72fd6610bfa4363397e020384b022b0c49": { + "balance": "0x487a9a304539440000" }, - "520f66a0e2657ff0ac4195f2f064cf2fa4b24250": { - "balance": "40000000000000000000" + "0x520f66a0e2657ff0ac4195f2f064cf2fa4b24250": { + "balance": "0x22b1c8c1227a00000" }, - "a1432ed2c6b7777a88e8d46d388e70477f208ca5": { - "balance": "7999538000000000000000" + "0xa1432ed2c6b7777a88e8d46d388e70477f208ca5": { + "balance": "0x1b1a7e413a196c50000" }, - "149ba10f0da2725dc704733e87f5a524ca88515e": { - "balance": "7880000000000000000000" + "0x149ba10f0da2725dc704733e87f5a524ca88515e": { + "balance": "0x1ab2cf7c9f87e200000" }, - "b287f7f8d8c3872c1b586bcd7d0aedbf7e732732": { - "balance": "20000000000000000000" + "0xb287f7f8d8c3872c1b586bcd7d0aedbf7e732732": { + "balance": "0x1158e460913d00000" }, - "c46bbdef76d4ca60d316c07f5d1a780e3b165f7e": { - "balance": "2000000000000000000000" + "0xc46bbdef76d4ca60d316c07f5d1a780e3b165f7e": { + "balance": "0x6c6b935b8bbd400000" }, - "b5a589dd9f4071dbb6fba89b3f5d5dae7d96c163": { - "balance": "2000000000000000000000" + "0xb5a589dd9f4071dbb6fba89b3f5d5dae7d96c163": { + "balance": "0x6c6b935b8bbd400000" }, - "d218efb4db981cdd6a797f4bd48c7c26293ceb40": { - "balance": "2975000000000000000000" + "0xd218efb4db981cdd6a797f4bd48c7c26293ceb40": { + "balance": "0xa1466b31c6431c0000" }, - "af87d2371ef378957fbd05ba2f1d66931b01e2b8": { - "balance": "700000000000000000000" + "0xaf87d2371ef378957fbd05ba2f1d66931b01e2b8": { + "balance": "0x25f273933db5700000" }, - "86ef6426211949cc37f4c75e7850369d0cf5f479": { - "balance": "13399196000000000000000" + "0x86ef6426211949cc37f4c75e7850369d0cf5f479": { + "balance": "0x2d65f32ea045af60000" }, - "fb3a0b0d6b6a718f6fc0292a825dc9247a90a5d0": { - "balance": "199950000000000000000" + "0xfb3a0b0d6b6a718f6fc0292a825dc9247a90a5d0": { + "balance": "0xad6dd199e975b0000" }, - "da16dd5c3d1a2714358fe3752cae53dbab2be98c": { - "balance": "19400000000000000000000" + "0xda16dd5c3d1a2714358fe3752cae53dbab2be98c": { + "balance": "0x41bad155e6512200000" }, - "9eb7834e171d41e069a77947fca87622f0ba4e48": { - "balance": "100000000000000000000" + "0x9eb7834e171d41e069a77947fca87622f0ba4e48": { + "balance": "0x56bc75e2d63100000" }, - "e1d91b0954cede221d6f24c7985fc59965fb98b8": { - "balance": "2000000000000000000000" + "0xe1d91b0954cede221d6f24c7985fc59965fb98b8": { + "balance": "0x6c6b935b8bbd400000" }, - "85d0d88754ac84b8b21ba93dd2bfec72626faba8": { - "balance": "1000000000000000000000" + "0x85d0d88754ac84b8b21ba93dd2bfec72626faba8": { + "balance": "0x3635c9adc5dea00000" }, - "695b4cce085856d9e1f9ff3e79942023359e5fbc": { - "balance": "5000000000000000000000" + "0x695b4cce085856d9e1f9ff3e79942023359e5fbc": { + "balance": "0x10f0cf064dd59200000" }, - "9156d18029350e470408f15f1aa3be9f040a67c6": { - "balance": "1000000000000000000000" + "0x9156d18029350e470408f15f1aa3be9f040a67c6": { + "balance": "0x3635c9adc5dea00000" }, - "a9d64b4f3bb7850722b58b478ba691375e224e42": { - "balance": "6000000000000000000000" + "0xa9d64b4f3bb7850722b58b478ba691375e224e42": { + "balance": "0x14542ba12a337c00000" }, - "17e4a0e52bac3ee44efe0954e753d4b85d644e05": { - "balance": "2000000000000000000000" + "0x17e4a0e52bac3ee44efe0954e753d4b85d644e05": { + "balance": "0x6c6b935b8bbd400000" }, - "b8a79c84945e47a9c3438683d6b5842cff7684b1": { - "balance": "2000000000000000000000" + "0xb8a79c84945e47a9c3438683d6b5842cff7684b1": { + "balance": "0x6c6b935b8bbd400000" }, - "cfac2e1bf33205b05533691a02267ee19cd81836": { - "balance": "1000000000000000000000" + "0xcfac2e1bf33205b05533691a02267ee19cd81836": { + "balance": "0x3635c9adc5dea00000" }, - "6b992521ec852370848ad697cc2df64e63cc06ff": { - "balance": "1000000000000000000000" + "0x6b992521ec852370848ad697cc2df64e63cc06ff": { + "balance": "0x3635c9adc5dea00000" }, - "60af0ee118443c9b37d2fead77f5e521debe1573": { - "balance": "1910000000000000000000" + "0x60af0ee118443c9b37d2fead77f5e521debe1573": { + "balance": "0x678a932062e4180000" }, - "c6dbdb9efd5ec1b3786e0671eb2279b253f215ed": { - "balance": "1000000000000000000000" + "0xc6dbdb9efd5ec1b3786e0671eb2279b253f215ed": { + "balance": "0x3635c9adc5dea00000" }, - "659c0a72c767a3a65ced0e1ca885a4c51fd9b779": { - "balance": "2000000000000000000000" + "0x659c0a72c767a3a65ced0e1ca885a4c51fd9b779": { + "balance": "0x6c6b935b8bbd400000" }, - "ed1276513b6fc68628a74185c2e20cbbca7817bf": { - "balance": "191000000000000000000" + "0xed1276513b6fc68628a74185c2e20cbbca7817bf": { + "balance": "0xa5aa85009e39c0000" }, - "5ad12c5ed4fa827e2150cfa0d68c0aa37b1769b8": { - "balance": "800000000000000000000" + "0x5ad12c5ed4fa827e2150cfa0d68c0aa37b1769b8": { + "balance": "0x2b5e3af16b18800000" }, - "17c0fef6986cfb2e4041f9979d9940b69dff3de2": { - "balance": "4000000000000000000000" + "0x17c0fef6986cfb2e4041f9979d9940b69dff3de2": { + "balance": "0xd8d726b7177a800000" }, - "ca98c7988efa08e925ef9c9945520326e9f43b99": { - "balance": "4000000000000000000000" + "0xca98c7988efa08e925ef9c9945520326e9f43b99": { + "balance": "0xd8d726b7177a800000" }, - "fe8f1fdcab7fbec9a6a3fcc507619600505c36a3": { - "balance": "19700000000000000000" + "0xfe8f1fdcab7fbec9a6a3fcc507619600505c36a3": { + "balance": "0x11164759ffb320000" }, - "4420aa35465be617ad2498f370de0a3cc4d230af": { - "balance": "2000000000000000000000" + "0x4420aa35465be617ad2498f370de0a3cc4d230af": { + "balance": "0x6c6b935b8bbd400000" }, - "8232d1f9742edf8dd927da353b2ae7b4cbce7592": { - "balance": "668500000000000000000" + "0x8232d1f9742edf8dd927da353b2ae7b4cbce7592": { + "balance": "0x243d4d18229ca20000" }, - "eca5f58792b8c62d2af556717ee3ee3028be4dce": { - "balance": "2000000000000000000000" + "0xeca5f58792b8c62d2af556717ee3ee3028be4dce": { + "balance": "0x6c6b935b8bbd400000" }, - "6bf86f1e2f2b8032a95c4d7738a109d3d0ed8104": { - "balance": "1820000000000000000000" + "0x6bf86f1e2f2b8032a95c4d7738a109d3d0ed8104": { + "balance": "0x62a992e53a0af00000" }, - "3ac2f0ff1612e4a1c346d53382abf6d8a25baa53": { - "balance": "2000000000000000000000" + "0x3ac2f0ff1612e4a1c346d53382abf6d8a25baa53": { + "balance": "0x6c6b935b8bbd400000" }, - "daa1bd7a9148fb865cd612dd35f162861d0f3bdc": { - "balance": "3066243000000000000000" + "0xdaa1bd7a9148fb865cd612dd35f162861d0f3bdc": { + "balance": "0xa638ab72d92c138000" }, - "5169c60aee4ceed1849ab36d664cff97061e8ea8": { - "balance": "3000000000000000000000" + "0x5169c60aee4ceed1849ab36d664cff97061e8ea8": { + "balance": "0xa2a15d09519be00000" }, - "2a5e3a40d2cd0325766de73a3d671896b362c73b": { - "balance": "100000000000000000000000" + "0x2a5e3a40d2cd0325766de73a3d671896b362c73b": { + "balance": "0x152d02c7e14af6800000" }, - "a83382b6e15267974a8550b98f7176c1a353f9be": { - "balance": "3541608000000000000000" + "0xa83382b6e15267974a8550b98f7176c1a353f9be": { + "balance": "0xbffdaf2fc1b1a40000" }, - "b50c149a1906fad2786ffb135aab501737e9e56f": { - "balance": "388000000000000000000" + "0xb50c149a1906fad2786ffb135aab501737e9e56f": { + "balance": "0x150894e849b3900000" }, - "d9775965b716476675a8d513eb14bbf7b07cd14a": { - "balance": "5076200000000000000000" + "0xd9775965b716476675a8d513eb14bbf7b07cd14a": { + "balance": "0x1132e6d2d23c5e40000" }, - "66662006015c1f8e3ccfcaebc8ee6807ee196303": { - "balance": "500024000000000000000" + "0x66662006015c1f8e3ccfcaebc8ee6807ee196303": { + "balance": "0x1b1b3a1ac261ec0000" }, - "78746a958dced4c764f876508c414a68342cecb9": { - "balance": "50600000000000000000" + "0x78746a958dced4c764f876508c414a68342cecb9": { + "balance": "0x2be374fe8e2c40000" }, - "e982e6f28c548f5f96f45e63f7ab708724f53fa1": { - "balance": "396238000000000000000" + "0xe982e6f28c548f5f96f45e63f7ab708724f53fa1": { + "balance": "0x157ae829a41f3b0000" }, - "740bfd52e01667a3419b029a1b8e45576a86a2db": { - "balance": "16800000000000000000000" + "0x740bfd52e01667a3419b029a1b8e45576a86a2db": { + "balance": "0x38ebad5cdc902800000" }, - "2bd252e0d732ff1d7c78f0a02e6cb25423cf1b1a": { - "balance": "2674000000000000000000" + "0x2bd252e0d732ff1d7c78f0a02e6cb25423cf1b1a": { + "balance": "0x90f534608a72880000" }, - "2e2d7ea66b9f47d8cc52c01c52b6e191bc7d4786": { - "balance": "3999800000000000000000" + "0x2e2d7ea66b9f47d8cc52c01c52b6e191bc7d4786": { + "balance": "0xd8d4602c26bf6c0000" }, - "3e3161f1ea2fbf126e79da1801da9512b37988c9": { - "balance": "49250000000000000000000" + "0x3e3161f1ea2fbf126e79da1801da9512b37988c9": { + "balance": "0xa6dd90cae5114480000" }, - "7e2ba86da52e785d8625334f3397ba1c4bf2e8d1": { - "balance": "197000000000000000000" + "0x7e2ba86da52e785d8625334f3397ba1c4bf2e8d1": { + "balance": "0xaadec983fcff40000" }, - "7608f437b31f18bc0b64d381ae86fd978ed7b31f": { - "balance": "50000000000000000000" + "0x7608f437b31f18bc0b64d381ae86fd978ed7b31f": { + "balance": "0x2b5e3af16b1880000" }, - "25a5a44d38a2f44c6a9db9cdbc6b1e2e97abb509": { - "balance": "17000000000000000000000" + "0x25a5a44d38a2f44c6a9db9cdbc6b1e2e97abb509": { + "balance": "0x39992648a23c8a00000" }, - "745ad3abc6eeeb2471689b539e789ce2b8268306": { - "balance": "1129977000000000000000" + "0x745ad3abc6eeeb2471689b539e789ce2b8268306": { + "balance": "0x3d4194bea011928000" }, - "09e437d448861228a232b62ee8d37965a904ed9c": { - "balance": "21708305000000000000000" + "0x09e437d448861228a232b62ee8d37965a904ed9c": { + "balance": "0x498cf401df8842e8000" }, - "be53322f43fbb58494d7cce19dda272b2450e827": { - "balance": "200018000000000000000" + "0xbe53322f43fbb58494d7cce19dda272b2450e827": { + "balance": "0xad7ceaf425c150000" }, - "4166fc08ca85f766fde831460e9dc93c0e21aa6c": { - "balance": "1000000000000000000000" + "0x4166fc08ca85f766fde831460e9dc93c0e21aa6c": { + "balance": "0x3635c9adc5dea00000" }, - "99c0174cf84e0783c220b4eb6ae18fe703854ad3": { - "balance": "2074800000000000000000" + "0x99c0174cf84e0783c220b4eb6ae18fe703854ad3": { + "balance": "0x7079a2573d0c780000" }, - "3cf484524fbdfadae26dc185e32b2b630fd2e726": { - "balance": "448798000000000000000" + "0x3cf484524fbdfadae26dc185e32b2b630fd2e726": { + "balance": "0x185452cb2a91c30000" }, - "fdcd5d80b105897a57abc47865768b2900524295": { - "balance": "6400000000000000000000" + "0xfdcd5d80b105897a57abc47865768b2900524295": { + "balance": "0x15af1d78b58c4000000" }, - "f22f4078febbbaa8b0e78e642c8a42f35d433905": { - "balance": "1999944000000000000000" + "0xf22f4078febbbaa8b0e78e642c8a42f35d433905": { + "balance": "0x6c6acc67d7b1d40000" }, - "eac768bf14b8f9432e69eaa82a99fbeb94cd0c9c": { - "balance": "98500000000000000000000" + "0xeac768bf14b8f9432e69eaa82a99fbeb94cd0c9c": { + "balance": "0x14dbb2195ca228900000" }, - "2639eee9873ceec26fcc9454b548b9e7c54aa65c": { - "balance": "1000000000000000000000" + "0x2639eee9873ceec26fcc9454b548b9e7c54aa65c": { + "balance": "0x3635c9adc5dea00000" }, - "c3c3c2510d678020485a63735d1307ec4ca6302b": { - "balance": "1000000000000000000000" + "0xc3c3c2510d678020485a63735d1307ec4ca6302b": { + "balance": "0x3635c9adc5dea00000" }, - "b73d6a77559c86cf6574242903394bacf96e3570": { - "balance": "91200000000000000000" + "0xb73d6a77559c86cf6574242903394bacf96e3570": { + "balance": "0x4f1a77ccd3ba00000" }, - "5ce2e7ceaaa18af0f8aafa7fbad74cc89e3cd436": { - "balance": "20000000000000000000000" + "0x5ce2e7ceaaa18af0f8aafa7fbad74cc89e3cd436": { + "balance": "0x43c33c1937564800000" }, - "03377c0e556b640103289a6189e1aeae63493467": { - "balance": "20000000000000000000000" + "0x03377c0e556b640103289a6189e1aeae63493467": { + "balance": "0x43c33c1937564800000" }, - "6eb0a5a9ae96d22cf01d8fd6483b9f38f08c2c8b": { - "balance": "4000000000000000000000" + "0x6eb0a5a9ae96d22cf01d8fd6483b9f38f08c2c8b": { + "balance": "0xd8d726b7177a800000" }, - "fc8215a0a69913f62a43bf1c8590b9ddcd0d8ddb": { - "balance": "2000000000000000000000" + "0xfc8215a0a69913f62a43bf1c8590b9ddcd0d8ddb": { + "balance": "0x6c6b935b8bbd400000" }, - "4a835c25824c47ecbfc79439bf3f5c3481aa75cd": { - "balance": "1400000000000000000000" + "0x4a835c25824c47ecbfc79439bf3f5c3481aa75cd": { + "balance": "0x4be4e7267b6ae00000" }, - "b5493ef173724445cf345c035d279ba759f28d51": { - "balance": "20000000000000000000" + "0xb5493ef173724445cf345c035d279ba759f28d51": { + "balance": "0x1158e460913d00000" }, - "b9e90c1192b3d5d3e3ab0700f1bf655f5dd4347a": { - "balance": "499928000000000000000" + "0xb9e90c1192b3d5d3e3ab0700f1bf655f5dd4347a": { + "balance": "0x1b19e50b44977c0000" }, - "419bde7316cc1ed295c885ace342c79bf7ee33ea": { - "balance": "6000000000000000000000" + "0x419bde7316cc1ed295c885ace342c79bf7ee33ea": { + "balance": "0x14542ba12a337c00000" }, - "e4625501f52b7af52b19ed612e9d54fdd006b492": { - "balance": "209440000000000000000" + "0xe4625501f52b7af52b19ed612e9d54fdd006b492": { + "balance": "0xb5a905a56ddd00000" }, - "e9d599456b2543e6db80ea9b210e908026e2146e": { - "balance": "200000000000000000000" + "0xe9d599456b2543e6db80ea9b210e908026e2146e": { + "balance": "0xad78ebc5ac6200000" }, - "2c06dd922b61514aafedd84488c0c28e6dcf0e99": { - "balance": "100000000000000000000000" + "0x2c06dd922b61514aafedd84488c0c28e6dcf0e99": { + "balance": "0x152d02c7e14af6800000" }, - "06b5ede6fdf1d6e9a34721379aeaa17c713dd82a": { - "balance": "2000000000000000000000" + "0x06b5ede6fdf1d6e9a34721379aeaa17c713dd82a": { + "balance": "0x6c6b935b8bbd400000" }, - "d8930a39c77357c30ad3a060f00b06046331fd62": { - "balance": "820000000000000000000" + "0xd8930a39c77357c30ad3a060f00b06046331fd62": { + "balance": "0x2c73c937742c500000" }, - "b2a2c2111612fb8bbb8e7dd9378d67f1a384f050": { - "balance": "20000000000000000000" + "0xb2a2c2111612fb8bbb8e7dd9378d67f1a384f050": { + "balance": "0x1158e460913d00000" }, - "1f174f40a0447234e66653914d75bc003e5690dc": { - "balance": "160000000000000000000" + "0x1f174f40a0447234e66653914d75bc003e5690dc": { + "balance": "0x8ac7230489e800000" }, - "e06cb6294704eea7437c2fc3d30773b7bf38889a": { - "balance": "20094000000000000000" + "0xe06cb6294704eea7437c2fc3d30773b7bf38889a": { + "balance": "0x116dc3a8994b30000" }, - "cd06f8c1b5cdbd28e2d96b6346c3e85a0483ba24": { - "balance": "1000000000000000000000" + "0xcd06f8c1b5cdbd28e2d96b6346c3e85a0483ba24": { + "balance": "0x3635c9adc5dea00000" }, - "f316ef1df2ff4d6c1808dba663ec8093697968e0": { - "balance": "1794400000000000000000" + "0xf316ef1df2ff4d6c1808dba663ec8093697968e0": { + "balance": "0x61464d6cdc80f00000" }, - "1e6915ebd9a19c81b692ad99b1218a592c1ac7b1": { - "balance": "4000000000000000000000" + "0x1e6915ebd9a19c81b692ad99b1218a592c1ac7b1": { + "balance": "0xd8d726b7177a800000" }, - "885493bda36a0432976546c1ddce71c3f4570021": { - "balance": "216700000000000000000" + "0x885493bda36a0432976546c1ddce71c3f4570021": { + "balance": "0xbbf510ddfcb260000" }, - "18b0407cdad4ce52600623bd5e1f6a81ab61f026": { - "balance": "319489000000000000000" + "0x18b0407cdad4ce52600623bd5e1f6a81ab61f026": { + "balance": "0x1151ccf0c654c68000" }, - "187d9f0c07f8eb74faaad15ebc7b80447417f782": { - "balance": "20000000000000000000" + "0x187d9f0c07f8eb74faaad15ebc7b80447417f782": { + "balance": "0x1158e460913d00000" }, - "5d6ccf806738091042ad97a6e095fe8c36aa79c5": { - "balance": "188000000000000000000" + "0x5d6ccf806738091042ad97a6e095fe8c36aa79c5": { + "balance": "0xa31062beeed700000" }, - "53437fecf34ab9d435f4deb8ca181519e2592035": { - "balance": "188000000000000000000" + "0x53437fecf34ab9d435f4deb8ca181519e2592035": { + "balance": "0xa31062beeed700000" }, - "fd1faa347b0fcc804c2da86c36d5f1d18b7087bb": { - "balance": "52380000000000000000" + "0xfd1faa347b0fcc804c2da86c36d5f1d18b7087bb": { + "balance": "0x2d6eb247a96f60000" }, - "650cf67db060cce17568d5f2a423687c49647609": { - "balance": "100000000000000000000" + "0x650cf67db060cce17568d5f2a423687c49647609": { + "balance": "0x56bc75e2d63100000" }, - "bcd95ef962462b6edfa10fda87d72242fe3edb5c": { - "balance": "334133000000000000000" + "0xbcd95ef962462b6edfa10fda87d72242fe3edb5c": { + "balance": "0x121d06e12fff988000" }, - "3b5e8b3c77f792decb7a8985df916efb490aac23": { - "balance": "2000000000000000000000" + "0x3b5e8b3c77f792decb7a8985df916efb490aac23": { + "balance": "0x6c6b935b8bbd400000" }, - "f13b083093ba564e2dc631568cf7540d9a0ec719": { - "balance": "1999944000000000000000" + "0xf13b083093ba564e2dc631568cf7540d9a0ec719": { + "balance": "0x6c6acc67d7b1d40000" }, - "373c547e0cb5ce632e1c5ad66155720c01c40995": { - "balance": "4691588000000000000000" + "0x373c547e0cb5ce632e1c5ad66155720c01c40995": { + "balance": "0xfe54dcdce6c55a0000" }, - "7313461208455455465445a459b06c3773b0eb30": { - "balance": "2000000000000000000000" + "0x7313461208455455465445a459b06c3773b0eb30": { + "balance": "0x6c6b935b8bbd400000" }, - "441f37e8a029fd02482f289c49b5d06d00e408a4": { - "balance": "333333000000000000000" + "0x441f37e8a029fd02482f289c49b5d06d00e408a4": { + "balance": "0x1211ecb56d13488000" }, - "d30d4c43adcf55b2cb53d68323264134498d89ce": { - "balance": "1000000000000000000000" + "0xd30d4c43adcf55b2cb53d68323264134498d89ce": { + "balance": "0x3635c9adc5dea00000" }, - "f648ea89c27525710172944e79edff847803b775": { - "balance": "100000000000000000000000" + "0xf648ea89c27525710172944e79edff847803b775": { + "balance": "0x152d02c7e14af6800000" }, - "0c7f869f8e90d53fdc03e8b2819b016b9d18eb26": { - "balance": "20000000000000000000000" + "0x0c7f869f8e90d53fdc03e8b2819b016b9d18eb26": { + "balance": "0x43c33c1937564800000" }, - "c71f92a3a54a7b8c2f5ea44305fccb84eee23148": { - "balance": "49980000000000000000" + "0xc71f92a3a54a7b8c2f5ea44305fccb84eee23148": { + "balance": "0x2b59ca131d2060000" }, - "7988901331e387f713faceb9005cb9b65136eb14": { - "balance": "1970000000000000000000" + "0x7988901331e387f713faceb9005cb9b65136eb14": { + "balance": "0x6acb3df27e1f880000" }, - "e9a39a8bac0f01c349c64cedb69897f633234ed2": { - "balance": "3980000000000000000000" + "0xe9a39a8bac0f01c349c64cedb69897f633234ed2": { + "balance": "0xd7c198710e66b00000" }, - "ad2a5c00f923aaf21ab9f3fb066efa0a03de2fb2": { - "balance": "999996000000000000000" + "0xad2a5c00f923aaf21ab9f3fb066efa0a03de2fb2": { + "balance": "0x3635bb77cb4b860000" }, - "f25259a5c939cd25966c9b6303d3731c53ddbc4c": { - "balance": "200000000000000000000" + "0xf25259a5c939cd25966c9b6303d3731c53ddbc4c": { + "balance": "0xad78ebc5ac6200000" }, - "d1682c2159018dc3d07f08240a8c606daf65f8e1": { - "balance": "200000000000000000000000" + "0xd1682c2159018dc3d07f08240a8c606daf65f8e1": { + "balance": "0x2a5a058fc295ed000000" }, - "a99991cebd98d9c838c25f7a7416d9e244ca250d": { - "balance": "1000000000000000000000" + "0xa99991cebd98d9c838c25f7a7416d9e244ca250d": { + "balance": "0x3635c9adc5dea00000" }, - "5a285755391e914e58025faa48cc685f4fd4f5b8": { - "balance": "26000000000000000000000" + "0x5a285755391e914e58025faa48cc685f4fd4f5b8": { + "balance": "0x581767ba6189c400000" }, - "4d24b7ac47d2f27de90974ba3de5ead203544bcd": { - "balance": "100000000000000000000" + "0x4d24b7ac47d2f27de90974ba3de5ead203544bcd": { + "balance": "0x56bc75e2d63100000" }, - "21b182f2da2b384493cf5f35f83d9d1ee14f2a21": { - "balance": "2000000000000000000000" + "0x21b182f2da2b384493cf5f35f83d9d1ee14f2a21": { + "balance": "0x6c6b935b8bbd400000" }, - "31ab088966ecc7229258f6098fce68cf39b38485": { - "balance": "1000000000000000000000" + "0x31ab088966ecc7229258f6098fce68cf39b38485": { + "balance": "0x3635c9adc5dea00000" }, - "4977a7939d0939689455ce2639d0ee5a4cd910ed": { - "balance": "1820000000000000000000" + "0x4977a7939d0939689455ce2639d0ee5a4cd910ed": { + "balance": "0x62a992e53a0af00000" }, - "07af938c1237a27c9030094dcf240750246e3d2c": { - "balance": "500000000000000000000" + "0x07af938c1237a27c9030094dcf240750246e3d2c": { + "balance": "0x1b1ae4d6e2ef500000" }, - "4e2bfa4a466f82671b800eee426ad00c071ba170": { - "balance": "4000000000000000000000" + "0x4e2bfa4a466f82671b800eee426ad00c071ba170": { + "balance": "0xd8d726b7177a800000" }, - "107379d4c467464f235bc18e55938aad3e688ad7": { - "balance": "50000000000000000000" + "0x107379d4c467464f235bc18e55938aad3e688ad7": { + "balance": "0x2b5e3af16b1880000" }, - "f7b29b82195c882dab7897c2ae95e77710f57875": { - "balance": "2199000000000000000000" + "0xf7b29b82195c882dab7897c2ae95e77710f57875": { + "balance": "0x7735416132dbfc0000" }, - "56586391040c57eec6f5affd8cd4abde10b50acc": { - "balance": "4000000000000000000000" + "0x56586391040c57eec6f5affd8cd4abde10b50acc": { + "balance": "0xd8d726b7177a800000" }, - "ac608e2bac9dd20728d2947effbbbf900a9ce94b": { - "balance": "6000600000000000000000" + "0xac608e2bac9dd20728d2947effbbbf900a9ce94b": { + "balance": "0x1454b0db37568fc0000" }, - "48548b4ba62bcb2f0d34a88dc69a680e539cf046": { - "balance": "100084000000000000000" + "0x48548b4ba62bcb2f0d34a88dc69a680e539cf046": { + "balance": "0x56cf1cbbb74320000" }, - "1665ab1739d71119ee6132abbd926a279fe67948": { - "balance": "100000000000000000000" + "0x1665ab1739d71119ee6132abbd926a279fe67948": { + "balance": "0x56bc75e2d63100000" }, - "af4493e8521ca89d95f5267c1ab63f9f45411e1b": { - "balance": "200000000000000000000" + "0xaf4493e8521ca89d95f5267c1ab63f9f45411e1b": { + "balance": "0xad78ebc5ac6200000" }, - "bf6925c00751008440a6739a02bf2b6cdaab5e3a": { - "balance": "1000000000000000000000" + "0xbf6925c00751008440a6739a02bf2b6cdaab5e3a": { + "balance": "0x3635c9adc5dea00000" }, - "3fe40fbd919aad2818df01ee4df46c46842ac539": { - "balance": "6000000000000000000000" + "0x3fe40fbd919aad2818df01ee4df46c46842ac539": { + "balance": "0x14542ba12a337c00000" }, - "455b9296921a74d1fc41617f43b8303e6f3ed76c": { - "balance": "4200000000000000000000" + "0x455b9296921a74d1fc41617f43b8303e6f3ed76c": { + "balance": "0xe3aeb5737240a00000" }, - "7086b4bde3e35d4aeb24b825f1a215f99d85f745": { - "balance": "1999800000000000000000" + "0x7086b4bde3e35d4aeb24b825f1a215f99d85f745": { + "balance": "0x6c68ccd09b022c0000" }, - "d4ee4919fb37f2bb970c3fff54aaf1f3dda6c03f": { - "balance": "40000000000000000000000" + "0xd4ee4919fb37f2bb970c3fff54aaf1f3dda6c03f": { + "balance": "0x878678326eac9000000" }, - "a4489a50ead5d5445a7bee4d2d5536c2a76c41f8": { - "balance": "200000000000000000000" + "0xa4489a50ead5d5445a7bee4d2d5536c2a76c41f8": { + "balance": "0xad78ebc5ac6200000" }, - "505e4f7c275588c533a20ebd2ac13b409bbdea3c": { - "balance": "17600000000000000000" + "0x505e4f7c275588c533a20ebd2ac13b409bbdea3c": { + "balance": "0xf43fc2c04ee00000" }, - "3bb53598cc20e2055dc553b049404ac9b7dd1e83": { - "balance": "615020000000000000000" + "0x3bb53598cc20e2055dc553b049404ac9b7dd1e83": { + "balance": "0x21571df77c00be0000" }, - "52cd20403ba7eda6bc307a3d63b5911b817c1263": { - "balance": "20000000000000000000" + "0x52cd20403ba7eda6bc307a3d63b5911b817c1263": { + "balance": "0x1158e460913d00000" }, - "a211da03cc0e31ecce5309998718515528a090df": { - "balance": "200000000000000000000" + "0xa211da03cc0e31ecce5309998718515528a090df": { + "balance": "0xad78ebc5ac6200000" }, - "bcb422dc4dd2aae94abae95ea45dd1731bb6b0ba": { - "balance": "447500000000000000000" + "0xbcb422dc4dd2aae94abae95ea45dd1731bb6b0ba": { + "balance": "0x18424f5f0b1b4e0000" }, - "cbde9734b8e6aa538c291d6d7facedb0f338f857": { - "balance": "2000000000000000000000" + "0xcbde9734b8e6aa538c291d6d7facedb0f338f857": { + "balance": "0x6c6b935b8bbd400000" }, - "171ca02a8b6d62bf4ca47e906914079861972cb2": { - "balance": "200000000000000000000" + "0x171ca02a8b6d62bf4ca47e906914079861972cb2": { + "balance": "0xad78ebc5ac6200000" }, - "d40d0055fd9a38488aff923fd03d35ec46d711b3": { - "balance": "4999711000000000000000" + "0xd40d0055fd9a38488aff923fd03d35ec46d711b3": { + "balance": "0x10f08eda8e555098000" }, - "3887192c7f705006b630091276b39ac680448d6b": { - "balance": "60000000000000000000" + "0x3887192c7f705006b630091276b39ac680448d6b": { + "balance": "0x340aad21b3b700000" }, - "3f3c8e61e5604cef0605d436dd22accd862217fc": { - "balance": "1337000000000000000000" + "0x3f3c8e61e5604cef0605d436dd22accd862217fc": { + "balance": "0x487a9a304539440000" }, - "4258fd662fc4ce3295f0d4ed8f7bb1449600a0a9": { - "balance": "6719600000000000000000" + "0x4258fd662fc4ce3295f0d4ed8f7bb1449600a0a9": { + "balance": "0x16c452ed6088ad80000" }, - "4571de672b9904bad8743692c21c4fdcea4c2e01": { - "balance": "4000000000000000000000" + "0x4571de672b9904bad8743692c21c4fdcea4c2e01": { + "balance": "0xd8d726b7177a800000" }, - "5be045512a026e3f1cebfd5a7ec0cfc36f2dc16b": { - "balance": "120000000000000000000" + "0x5be045512a026e3f1cebfd5a7ec0cfc36f2dc16b": { + "balance": "0x68155a43676e00000" }, - "d6300b3215b11de762ecde4b70b7927d01291582": { - "balance": "2000000000000000000000" + "0xd6300b3215b11de762ecde4b70b7927d01291582": { + "balance": "0x6c6b935b8bbd400000" }, - "f9e37447406c412197b2e2aebc001d6e30c98c60": { - "balance": "8346700000000000000000" + "0xf9e37447406c412197b2e2aebc001d6e30c98c60": { + "balance": "0x1c479bb4349c0ee0000" }, - "bd047ff1e69cc6b29ad26497a9a6f27a903fc4dd": { - "balance": "865000000000000000000" + "0xbd047ff1e69cc6b29ad26497a9a6f27a903fc4dd": { + "balance": "0x2ee449550898e40000" }, - "23fa7eb51a48229598f97e762be0869652dffc66": { - "balance": "1000000000000000000000" + "0x23fa7eb51a48229598f97e762be0869652dffc66": { + "balance": "0x3635c9adc5dea00000" }, - "6679aeecd87a57a73f3356811d2cf49d0c4d96dc": { - "balance": "600000000000000000000" + "0x6679aeecd87a57a73f3356811d2cf49d0c4d96dc": { + "balance": "0x2086ac351052600000" }, - "23c55aeb5739876f0ac8d7ebea13be729685f000": { - "balance": "1337000000000000000000" + "0x23c55aeb5739876f0ac8d7ebea13be729685f000": { + "balance": "0x487a9a304539440000" }, - "757b65876dbf29bf911d4f0692a2c9beb1139808": { - "balance": "4124263000000000000000" + "0x757b65876dbf29bf911d4f0692a2c9beb1139808": { + "balance": "0xdf93a59337d6dd8000" }, - "e8fc36b0131ec120ac9e85afc10ce70b56d8b6ba": { - "balance": "200000000000000000000" + "0xe8fc36b0131ec120ac9e85afc10ce70b56d8b6ba": { + "balance": "0xad78ebc5ac6200000" }, - "1a89899cbebdbb64bb26a195a63c08491fcd9eee": { - "balance": "2000000000000000000000" + "0x1a89899cbebdbb64bb26a195a63c08491fcd9eee": { + "balance": "0x6c6b935b8bbd400000" }, - "6edf7f5283725c953ee64317f66188af1184b033": { - "balance": "8050000000000000000000" + "0x6edf7f5283725c953ee64317f66188af1184b033": { + "balance": "0x1b464311d45a6880000" }, - "297385e88634465685c231a314a0d5dcd146af01": { - "balance": "1550000000000000000000" + "0x297385e88634465685c231a314a0d5dcd146af01": { + "balance": "0x54069233bf7f780000" }, - "018f20a27b27ec441af723fd9099f2cbb79d6263": { - "balance": "2167000000000000000000" + "0x018f20a27b27ec441af723fd9099f2cbb79d6263": { + "balance": "0x75792a8abdef7c0000" }, - "a5a4227f6cf98825c0d5baff5315752ccc1a1391": { - "balance": "10000000000000000000000" + "0xa5a4227f6cf98825c0d5baff5315752ccc1a1391": { + "balance": "0x21e19e0c9bab2400000" }, - "69517083e303d4fbb6c2114514215d69bc46a299": { - "balance": "100000000000000000000" + "0x69517083e303d4fbb6c2114514215d69bc46a299": { + "balance": "0x56bc75e2d63100000" }, - "1dab172effa6fbee534c94b17e794edac54f55f8": { - "balance": "1970000000000000000000" + "0x1dab172effa6fbee534c94b17e794edac54f55f8": { + "balance": "0x6acb3df27e1f880000" }, - "c6ee35934229693529dc41d9bb71a2496658b88e": { - "balance": "19700000000000000000000" + "0xc6ee35934229693529dc41d9bb71a2496658b88e": { + "balance": "0x42bf06b78ed3b500000" }, - "a8ee1df5d44b128469e913569ef6ac81eeda4fc8": { - "balance": "500000000000000000000" + "0xa8ee1df5d44b128469e913569ef6ac81eeda4fc8": { + "balance": "0x1b1ae4d6e2ef500000" }, - "35bd246865fab490ac087ac1f1d4f2c10d0cda03": { - "balance": "400000000000000000000" + "0x35bd246865fab490ac087ac1f1d4f2c10d0cda03": { + "balance": "0x15af1d78b58c400000" }, - "4bf8bf1d35a231315764fc8001809a949294fc49": { - "balance": "66850000000000000000" + "0x4bf8bf1d35a231315764fc8001809a949294fc49": { + "balance": "0x39fbae8d042dd0000" }, - "c70fa45576bf9c865f983893002c414926f61029": { - "balance": "400400000000000000000" + "0xc70fa45576bf9c865f983893002c414926f61029": { + "balance": "0x15b4aa8e9702680000" }, - "fdeaac2acf1d138e19f2fc3f9fb74592e3ed818a": { - "balance": "668500000000000000000" + "0xfdeaac2acf1d138e19f2fc3f9fb74592e3ed818a": { + "balance": "0x243d4d18229ca20000" }, - "bfbfbcb656c2992be8fcde8219fbc54aadd59f29": { - "balance": "9999924000000000000000" + "0xbfbfbcb656c2992be8fcde8219fbc54aadd59f29": { + "balance": "0x21e18d2c821c7520000" }, - "1722c4cbe70a94b6559d425084caeed4d6e66e21": { - "balance": "4000000000000000000000" + "0x1722c4cbe70a94b6559d425084caeed4d6e66e21": { + "balance": "0xd8d726b7177a800000" }, - "00e681bc2d10db62de85848324492250348e90bf": { - "balance": "20000000000000000000000" + "0x00e681bc2d10db62de85848324492250348e90bf": { + "balance": "0x43c33c1937564800000" }, - "5c308bac4857d33baea074f3956d3621d9fa28e1": { - "balance": "4999711000000000000000" + "0x5c308bac4857d33baea074f3956d3621d9fa28e1": { + "balance": "0x10f08eda8e555098000" }, - "68c08490c89bf0d6b6f320b1aca95c8312c00608": { - "balance": "4000000000000000000000" + "0x68c08490c89bf0d6b6f320b1aca95c8312c00608": { + "balance": "0xd8d726b7177a800000" }, - "ce1884ddbbb8e10e4dba6e44feeec2a7e5f92f05": { - "balance": "4000000000000000000000" + "0xce1884ddbbb8e10e4dba6e44feeec2a7e5f92f05": { + "balance": "0xd8d726b7177a800000" }, - "427417bd16b1b3d22dbb902d8f9657016f24a61c": { - "balance": "2000000000000000000000" + "0x427417bd16b1b3d22dbb902d8f9657016f24a61c": { + "balance": "0x6c6b935b8bbd400000" }, - "5ff93de6ee054cad459b2d5eb0f6870389dfcb74": { - "balance": "220000000000000000000" + "0x5ff93de6ee054cad459b2d5eb0f6870389dfcb74": { + "balance": "0xbed1d0263d9f00000" }, - "71946b7117fc915ed107385f42d99ddac63249c2": { - "balance": "2000000000000000000000" + "0x71946b7117fc915ed107385f42d99ddac63249c2": { + "balance": "0x6c6b935b8bbd400000" }, - "11ec00f849b6319cf51aa8dd8f66b35529c0be77": { - "balance": "2000000000000000000000" + "0x11ec00f849b6319cf51aa8dd8f66b35529c0be77": { + "balance": "0x6c6b935b8bbd400000" }, - "610fd6ee4eebab10a8c55d0b4bd2e7d6ef817156": { - "balance": "20002000000000000000" + "0x610fd6ee4eebab10a8c55d0b4bd2e7d6ef817156": { + "balance": "0x1159561065d5d0000" }, - "a422e4bf0bf74147cc895bed8f16d3cef3426154": { - "balance": "349281000000000000000" + "0xa422e4bf0bf74147cc895bed8f16d3cef3426154": { + "balance": "0x12ef3f62ee11368000" }, - "745aecbaf9bb39b74a67ea1ce623de368481baa6": { - "balance": "10000000000000000000000" + "0x745aecbaf9bb39b74a67ea1ce623de368481baa6": { + "balance": "0x21e19e0c9bab2400000" }, - "9f496cb2069563144d0811677ba0e4713a0a4143": { - "balance": "1122000000000000000000" + "0x9f496cb2069563144d0811677ba0e4713a0a4143": { + "balance": "0x3cd2e0bf63a4480000" }, - "c500b720734ed22938d78c5e48b2ba9367a575ba": { - "balance": "33400000000000000000000" + "0xc500b720734ed22938d78c5e48b2ba9367a575ba": { + "balance": "0x7129e1cdf373ee00000" }, - "cd072e6e1833137995196d7bb1725fef8761f655": { - "balance": "6000000000000000000000" + "0xcd072e6e1833137995196d7bb1725fef8761f655": { + "balance": "0x14542ba12a337c00000" }, - "94644ad116a41ce2ca7fbec609bdef738a2ac7c7": { - "balance": "5000000000000000000000" + "0x94644ad116a41ce2ca7fbec609bdef738a2ac7c7": { + "balance": "0x10f0cf064dd59200000" }, - "e8d942d82f175ecb1c16a405b10143b3f46b963a": { - "balance": "568600000000000000000" + "0xe8d942d82f175ecb1c16a405b10143b3f46b963a": { + "balance": "0x1ed2e8ff6d971c0000" }, - "f73dd9c142b71bce11d06e30e7e7d032f2ec9c9e": { - "balance": "1970000000000000000000" + "0xf73dd9c142b71bce11d06e30e7e7d032f2ec9c9e": { + "balance": "0x6acb3df27e1f880000" }, - "1327d759d56e0ab87af37ecf63fe01f310be100a": { - "balance": "659200000000000000000" + "0x1327d759d56e0ab87af37ecf63fe01f310be100a": { + "balance": "0x23bc3cdb68a1800000" }, - "28fa2580f9ebe420f3e5eefdd371638e3b7af499": { - "balance": "6000000000000000000000" + "0x28fa2580f9ebe420f3e5eefdd371638e3b7af499": { + "balance": "0x14542ba12a337c00000" }, - "024bdd2c7bfd500ee7404f7fb3e9fb31dd20fbd1": { - "balance": "180000000000000000000" + "0x024bdd2c7bfd500ee7404f7fb3e9fb31dd20fbd1": { + "balance": "0x9c2007651b2500000" }, - "b4b14bf45455d0ab0803358b7524a72be1a2045b": { - "balance": "500000000000000000000" + "0xb4b14bf45455d0ab0803358b7524a72be1a2045b": { + "balance": "0x1b1ae4d6e2ef500000" }, - "b1e2dd95e39ae9775c55aeb13f12c2fa233053ba": { - "balance": "2000000000000000000000" + "0xb1e2dd95e39ae9775c55aeb13f12c2fa233053ba": { + "balance": "0x6c6b935b8bbd400000" }, - "35b03ea4245736f57b85d2eb79628f036ddcd705": { - "balance": "4000000000000000000000" + "0x35b03ea4245736f57b85d2eb79628f036ddcd705": { + "balance": "0xd8d726b7177a800000" }, - "eb2ef3d38fe652403cd4c9d85ed7f0682cd7c2de": { - "balance": "42784000000000000000000" + "0xeb2ef3d38fe652403cd4c9d85ed7f0682cd7c2de": { + "balance": "0x90f534608a728800000" }, - "690594d306613cd3e2fd24bca9994ad98a3d73f8": { - "balance": "2000000000000000000000" + "0x690594d306613cd3e2fd24bca9994ad98a3d73f8": { + "balance": "0x6c6b935b8bbd400000" }, - "8397a1bc47acd647418159b99cea57e1e6532d6e": { - "balance": "9169160000000000000000" + "0x8397a1bc47acd647418159b99cea57e1e6532d6e": { + "balance": "0x1f10fa827b550b40000" }, - "b44815a0f28e569d0e921a4ade8fb2642526497a": { - "balance": "55500000000000000000" + "0xb44815a0f28e569d0e921a4ade8fb2642526497a": { + "balance": "0x302379bf2ca2e0000" }, - "e24109be2f513d87498e926a286499754f9ed49e": { - "balance": "886500000000000000000" + "0xe24109be2f513d87498e926a286499754f9ed49e": { + "balance": "0x300ea8ad1f27ca0000" }, - "37ac29bda93f497bc4aeaab935452c431510341e": { - "balance": "985000000000000000000" + "0x37ac29bda93f497bc4aeaab935452c431510341e": { + "balance": "0x35659ef93f0fc40000" }, - "4a81abe4984c7c6bef63d69820e55743c61f201c": { - "balance": "16011846000000000000000" + "0x4a81abe4984c7c6bef63d69820e55743c61f201c": { + "balance": "0x36401004e9aa3470000" }, - "66dcc5fb4ee7fee046e141819aa968799d644491": { - "balance": "1337000000000000000000" + "0x66dcc5fb4ee7fee046e141819aa968799d644491": { + "balance": "0x487a9a304539440000" }, - "43ff38743ed0cd43308c066509cc8e7e72c862aa": { - "balance": "1940000000000000000000" + "0x43ff38743ed0cd43308c066509cc8e7e72c862aa": { + "balance": "0x692ae8897081d00000" }, - "b8f20005b61352ffa7699a1b52f01f5ab39167f1": { - "balance": "10000000000000000000000" + "0xb8f20005b61352ffa7699a1b52f01f5ab39167f1": { + "balance": "0x21e19e0c9bab2400000" }, - "1cda411bd5163baeca1e558563601ce720e24ee1": { - "balance": "18200000000000000000" + "0x1cda411bd5163baeca1e558563601ce720e24ee1": { + "balance": "0xfc936392801c0000" }, - "86245f596691093ece3f3d3ca2263eace81941d9": { - "balance": "188000000000000000000" + "0x86245f596691093ece3f3d3ca2263eace81941d9": { + "balance": "0xa31062beeed700000" }, - "f52a5882e8927d944b359b26366ba2b9cacfbae8": { - "balance": "25000080000000000000000" + "0xf52a5882e8927d944b359b26366ba2b9cacfbae8": { + "balance": "0x54b41ce2fe63ba80000" }, - "118c18b2dce170e8f445753ba5d7513cb7636d2d": { - "balance": "8800000000000000000000" + "0x118c18b2dce170e8f445753ba5d7513cb7636d2d": { + "balance": "0x1dd0c885f9a0d800000" }, - "7168b3bb8c167321d9bdb023a6e9fd11afc9afd9": { - "balance": "1790000000000000000000" + "0x7168b3bb8c167321d9bdb023a6e9fd11afc9afd9": { + "balance": "0x61093d7c2c6d380000" }, - "d9103bb6b67a55a7fece2d1af62d457c2178946d": { - "balance": "1000000000000000000000" + "0xd9103bb6b67a55a7fece2d1af62d457c2178946d": { + "balance": "0x3635c9adc5dea00000" }, - "8b9fda7d981fe9d64287f85c94d83f9074849fcc": { - "balance": "14000000000000000000000" + "0x8b9fda7d981fe9d64287f85c94d83f9074849fcc": { + "balance": "0x2f6f10780d22cc00000" }, - "91211712719f2b084d3b3875a85069f466363141": { - "balance": "1000000000000000000000" + "0x91211712719f2b084d3b3875a85069f466363141": { + "balance": "0x3635c9adc5dea00000" }, - "4863849739265a63b0a2bf236a5913e6f959ce15": { - "balance": "1520000000000000000000" + "0x4863849739265a63b0a2bf236a5913e6f959ce15": { + "balance": "0x52663ccab1e1c00000" }, - "c2d1778ef6ee5fe488c145f3586b6ebbe3fbb445": { - "balance": "1146000000000000000000" + "0xc2d1778ef6ee5fe488c145f3586b6ebbe3fbb445": { + "balance": "0x3e1ff1e03b55a80000" }, - "2b77a4d88c0d56a3dbe3bae04a05f4fcd1b757e1": { - "balance": "300000000000000000000" + "0x2b77a4d88c0d56a3dbe3bae04a05f4fcd1b757e1": { + "balance": "0x1043561a8829300000" }, - "fe9c0fffefb803081256c0cf4d6659e6d33eb4fb": { - "balance": "1528000000000000000000" + "0xfe9c0fffefb803081256c0cf4d6659e6d33eb4fb": { + "balance": "0x52d542804f1ce00000" }, - "893017ff1adad499aa065401b4236ce6e92b625a": { - "balance": "1999944000000000000000" + "0x893017ff1adad499aa065401b4236ce6e92b625a": { + "balance": "0x6c6acc67d7b1d40000" }, - "073c67e09b5c713c5221c8a0c7f3f74466c347b0": { - "balance": "19400000000000000000000" + "0x073c67e09b5c713c5221c8a0c7f3f74466c347b0": { + "balance": "0x41bad155e6512200000" }, - "93e303411afaf6c107a44101c9ac5b36e9d6538b": { - "balance": "66000000000000000000000" + "0x93e303411afaf6c107a44101c9ac5b36e9d6538b": { + "balance": "0xdf9ddfecd0365400000" }, - "0ec50aa823f465b9464b0bc0c4a57724a555f5d6": { - "balance": "59100000000000000000000" + "0x0ec50aa823f465b9464b0bc0c4a57724a555f5d6": { + "balance": "0xc83d1426ac7b1f00000" }, - "a3e3a6ea509573e21bd0239ece0523a7b7d89b2f": { - "balance": "1970000000000000000000" + "0xa3e3a6ea509573e21bd0239ece0523a7b7d89b2f": { + "balance": "0x6acb3df27e1f880000" }, - "c069ef0eb34299abd2e32dabc47944b272334824": { - "balance": "120000000000000000000" + "0xc069ef0eb34299abd2e32dabc47944b272334824": { + "balance": "0x68155a43676e00000" }, - "28a3da09a8194819ae199f2e6d9d1304817e28a5": { - "balance": "2000000000000000000000" + "0x28a3da09a8194819ae199f2e6d9d1304817e28a5": { + "balance": "0x6c6b935b8bbd400000" }, - "e9495ba5842728c0ed97be37d0e422b98d69202c": { - "balance": "2000000000000000000000" + "0xe9495ba5842728c0ed97be37d0e422b98d69202c": { + "balance": "0x6c6b935b8bbd400000" }, - "bba976f1a1215f7512871892d45f7048acd356c8": { - "balance": "2000000000000000000000" + "0xbba976f1a1215f7512871892d45f7048acd356c8": { + "balance": "0x6c6b935b8bbd400000" }, - "887cac41cd706f3345f2d34ac34e01752a6e5909": { - "balance": "595366000000000000000" + "0x887cac41cd706f3345f2d34ac34e01752a6e5909": { + "balance": "0x20465cee9da1370000" }, - "e0e0b2e29dde73af75987ee4446c829a189c95bc": { - "balance": "149000000000000000000" + "0xe0e0b2e29dde73af75987ee4446c829a189c95bc": { + "balance": "0x813ca56906d340000" }, - "4a5fae3b0372c230c125d6d470140337ab915656": { - "balance": "1600000000000000000000" + "0x4a5fae3b0372c230c125d6d470140337ab915656": { + "balance": "0x56bc75e2d631000000" }, - "425177eb74ad0a9d9a5752228147ee6d6356a6e6": { - "balance": "13370000000000000000" + "0x425177eb74ad0a9d9a5752228147ee6d6356a6e6": { + "balance": "0xb98bc829a6f90000" }, - "5db7bba1f9573f24115d8c8c62e9ce8895068e9f": { - "balance": "49984000000000000000" + "0x5db7bba1f9573f24115d8c8c62e9ce8895068e9f": { + "balance": "0x2b5aad72c65200000" }, - "fa6a37f018e97967937fc5e8617ba1d786dd5f77": { - "balance": "19999800000000000000000" + "0xfa6a37f018e97967937fc5e8617ba1d786dd5f77": { + "balance": "0x43c30fb0884a96c0000" }, - "45e3a93e72144ada860cbc56ff85145ada38c6da": { - "balance": "1610000000000000000000" + "0x45e3a93e72144ada860cbc56ff85145ada38c6da": { + "balance": "0x57473d05dabae80000" }, - "67da922effa472a6b124e84ea8f86b24e0f515aa": { - "balance": "20000000000000000000" + "0x67da922effa472a6b124e84ea8f86b24e0f515aa": { + "balance": "0x1158e460913d00000" }, - "aa9bd4589535db27fa2bc903ca17d679dd654806": { - "balance": "2000000000000000000000" + "0xaa9bd4589535db27fa2bc903ca17d679dd654806": { + "balance": "0x6c6b935b8bbd400000" }, - "16a9e9b73ae98b864d1728798b8766dbc6ea8d12": { - "balance": "957480000000000000000" + "0x16a9e9b73ae98b864d1728798b8766dbc6ea8d12": { + "balance": "0x33e7b44b0db5040000" }, - "d6580ab5ed4c7dfa506fa6fe64ad5ce129707732": { - "balance": "4000000000000000000000" + "0xd6580ab5ed4c7dfa506fa6fe64ad5ce129707732": { + "balance": "0xd8d726b7177a800000" }, - "984a7985e3cc7eb5c93691f6f8cc7b8f245d01b2": { - "balance": "6000000000000000000000" + "0x984a7985e3cc7eb5c93691f6f8cc7b8f245d01b2": { + "balance": "0x14542ba12a337c00000" }, - "7746b6c6699c8f34ca2768a820f1ffa4c207fe05": { - "balance": "4000086000000000000000" + "0x7746b6c6699c8f34ca2768a820f1ffa4c207fe05": { + "balance": "0xd8d8583fa2d52f0000" }, - "2fa491fb5920a6574ebd289f39c1b2430d2d9a6a": { - "balance": "2000000000000000000000" + "0x2fa491fb5920a6574ebd289f39c1b2430d2d9a6a": { + "balance": "0x6c6b935b8bbd400000" }, - "fae76719d97eac41870428e940279d97dd57b2f6": { - "balance": "98500000000000000000000" + "0xfae76719d97eac41870428e940279d97dd57b2f6": { + "balance": "0x14dbb2195ca228900000" }, - "41b2dbd79dda9b864f6a7030275419c39d3efd3b": { - "balance": "3200000000000000000000" + "0x41b2dbd79dda9b864f6a7030275419c39d3efd3b": { + "balance": "0xad78ebc5ac62000000" }, - "dd8254121a6e942fc90828f2431f511dad7f32e6": { - "balance": "3018000000000000000000" + "0xdd8254121a6e942fc90828f2431f511dad7f32e6": { + "balance": "0xa39b29e1f360e80000" }, - "37fac1e6bc122e936dfb84de0c4bef6e0d60c2d7": { - "balance": "2000000000000000000000" + "0x37fac1e6bc122e936dfb84de0c4bef6e0d60c2d7": { + "balance": "0x6c6b935b8bbd400000" }, - "3a10888b7e149cae272c01302c327d0af01a0b24": { - "balance": "17000000000000000000" + "0x3a10888b7e149cae272c01302c327d0af01a0b24": { + "balance": "0xebec21ee1da40000" }, - "401354a297952fa972ad383ca07a0a2811d74a71": { - "balance": "14000000000000000000" + "0x401354a297952fa972ad383ca07a0a2811d74a71": { + "balance": "0xc249fdd327780000" }, - "51865db148881951f51251710e82b9be0d7eadb2": { - "balance": "2000000000000000000000" + "0x51865db148881951f51251710e82b9be0d7eadb2": { + "balance": "0x6c6b935b8bbd400000" }, - "bbbd6ecbb5752891b4ceb3cce73a8f477059376f": { - "balance": "36000000000000000000" + "0xbbbd6ecbb5752891b4ceb3cce73a8f477059376f": { + "balance": "0x1f399b1438a100000" }, - "3f236108eec72289bac3a65cd283f95e041d144c": { - "balance": "999925000000000000000" + "0x3f236108eec72289bac3a65cd283f95e041d144c": { + "balance": "0x3634bf39ab98788000" }, - "dc83b6fd0d512131204707eaf72ea0c8c9bef976": { - "balance": "2000000000000000000000" + "0xdc83b6fd0d512131204707eaf72ea0c8c9bef976": { + "balance": "0x6c6b935b8bbd400000" }, - "036eeff5ba90a6879a14dff4c5043b18ca0460c9": { - "balance": "100000000000000000000" + "0x036eeff5ba90a6879a14dff4c5043b18ca0460c9": { + "balance": "0x56bc75e2d63100000" }, - "fac5ca94758078fbfccd19db3558da7ee8a0a768": { - "balance": "1017500000000000000000" + "0xfac5ca94758078fbfccd19db3558da7ee8a0a768": { + "balance": "0x3728a62b0dcff60000" }, - "d0d62c47ea60fb90a3639209bbfdd4d933991cc6": { - "balance": "194000000000000000000" + "0xd0d62c47ea60fb90a3639209bbfdd4d933991cc6": { + "balance": "0xa844a7424d9c80000" }, - "891cb8238c88e93a1bcf61db49bd82b47a7f4f84": { - "balance": "2680000000000000000000" + "0x891cb8238c88e93a1bcf61db49bd82b47a7f4f84": { + "balance": "0x914878a8c05ee00000" }, - "df53003346d65c5e7a646bc034f2b7d32fcbe56a": { - "balance": "2000000000000000000000" + "0xdf53003346d65c5e7a646bc034f2b7d32fcbe56a": { + "balance": "0x6c6b935b8bbd400000" }, - "6e89c51ea6de13e06cdc748b67c4410fe9bcab03": { - "balance": "4000000000000000000000" + "0x6e89c51ea6de13e06cdc748b67c4410fe9bcab03": { + "balance": "0xd8d726b7177a800000" }, - "a61cdbadf04b1e54c883de6005fcdf16beb8eb2f": { - "balance": "2000000000000000000000" + "0xa61cdbadf04b1e54c883de6005fcdf16beb8eb2f": { + "balance": "0x6c6b935b8bbd400000" }, - "e3951de5aefaf0458768d774c254f7157735e505": { - "balance": "1600930000000000000000" + "0xe3951de5aefaf0458768d774c254f7157735e505": { + "balance": "0x56c95de8e8ca1d0000" }, - "f2732cf2c13b8bb8e7492a988f5f89e38273ddc8": { - "balance": "600000000000000000000" + "0xf2732cf2c13b8bb8e7492a988f5f89e38273ddc8": { + "balance": "0x2086ac351052600000" }, - "4752218e54de423f86c0501933917aea08c8fed5": { - "balance": "20000000000000000000000" + "0x4752218e54de423f86c0501933917aea08c8fed5": { + "balance": "0x43c33c1937564800000" }, - "152f4e860ef3ee806a502777a1b8dbc91a907668": { - "balance": "600000000000000000000" + "0x152f4e860ef3ee806a502777a1b8dbc91a907668": { + "balance": "0x2086ac351052600000" }, - "15b96f30c23b8664e7490651066b00c4391fbf84": { - "balance": "410650000000000000000" + "0x15b96f30c23b8664e7490651066b00c4391fbf84": { + "balance": "0x1642e9df4876290000" }, - "8693e9b8be94425eef7969bc69f9d42f7cad671e": { - "balance": "1000090000000000000000" + "0x8693e9b8be94425eef7969bc69f9d42f7cad671e": { + "balance": "0x3637096c4bcc690000" }, - "f41557dfdfb1a1bdcefefe2eba1e21fe0a4a9942": { - "balance": "1970000000000000000000" + "0xf41557dfdfb1a1bdcefefe2eba1e21fe0a4a9942": { + "balance": "0x6acb3df27e1f880000" }, - "38458e0685573cb4d28f53098829904570179266": { - "balance": "40000000000000000000" + "0x38458e0685573cb4d28f53098829904570179266": { + "balance": "0x22b1c8c1227a00000" }, - "53e4d9696dcb3f4d7b3f70dcaa4eecb71782ff5c": { - "balance": "200000000000000000000" + "0x53e4d9696dcb3f4d7b3f70dcaa4eecb71782ff5c": { + "balance": "0xad78ebc5ac6200000" }, - "2dca0e449ab646dbdfd393a96662960bcab5ae1e": { - "balance": "40000000000000000000000" + "0x2dca0e449ab646dbdfd393a96662960bcab5ae1e": { + "balance": "0x878678326eac9000000" }, - "87d7ac0653ccc67aa9c3469eef4352193f7dbb86": { - "balance": "200000000000000000000000" + "0x87d7ac0653ccc67aa9c3469eef4352193f7dbb86": { + "balance": "0x2a5a058fc295ed000000" }, - "ae9f5c3fbbe0c9bcbf1af8ff74ea280b3a5d8b08": { - "balance": "1730000000000000000000" + "0xae9f5c3fbbe0c9bcbf1af8ff74ea280b3a5d8b08": { + "balance": "0x5dc892aa1131c80000" }, - "7751f363a0a7fd0533190809ddaf9340d8d11291": { - "balance": "20000000000000000000" + "0x7751f363a0a7fd0533190809ddaf9340d8d11291": { + "balance": "0x1158e460913d00000" }, - "708a2af425ceb01e87ffc1be54c0f532b20eacd6": { - "balance": "134159000000000000000" + "0x708a2af425ceb01e87ffc1be54c0f532b20eacd6": { + "balance": "0x745d483b1f5a18000" }, - "ac122a03cd058c122e5fe17b872f4877f9df9572": { - "balance": "1969606000000000000000" + "0xac122a03cd058c122e5fe17b872f4877f9df9572": { + "balance": "0x6ac5c62d9486070000" }, - "5da4ca88935c27f55c311048840e589e04a8a049": { - "balance": "80000000000000000000" + "0x5da4ca88935c27f55c311048840e589e04a8a049": { + "balance": "0x4563918244f400000" }, - "e67c2c1665c88338688187629f49e99b60b2d3ba": { - "balance": "200000000000000000000" + "0xe67c2c1665c88338688187629f49e99b60b2d3ba": { + "balance": "0xad78ebc5ac6200000" }, - "dec82373ade8ebcf2acb6f8bc2414dd7abb70d77": { - "balance": "200000000000000000000" + "0xdec82373ade8ebcf2acb6f8bc2414dd7abb70d77": { + "balance": "0xad78ebc5ac6200000" }, - "47c247f53b9fbeb17bba0703a00c009fdb0f6eae": { - "balance": "20000000000000000000000" + "0x47c247f53b9fbeb17bba0703a00c009fdb0f6eae": { + "balance": "0x43c33c1937564800000" }, - "9a522e52c195bfb7cf5ffaaedb91a3ba7468161d": { - "balance": "1000000000000000000000" + "0x9a522e52c195bfb7cf5ffaaedb91a3ba7468161d": { + "balance": "0x3635c9adc5dea00000" }, - "3159e90c48a915904adfe292b22fa5fd5e72796b": { - "balance": "1008800000000000000000" + "0x3159e90c48a915904adfe292b22fa5fd5e72796b": { + "balance": "0x36afe98f2606100000" }, - "defddfd59b8d2c154eecf5c7c167bf0ba2905d3e": { - "balance": "93588000000000000000" + "0xdefddfd59b8d2c154eecf5c7c167bf0ba2905d3e": { + "balance": "0x512cb5e2647420000" }, - "ad1d68a038fd2586067ef6d135d9628e79c2c924": { - "balance": "4686168000000000000000" + "0xad1d68a038fd2586067ef6d135d9628e79c2c924": { + "balance": "0xfe09a5279e2abc0000" }, - "038e45eadd3d88b87fe4dab066680522f0dfc8f9": { - "balance": "10000000000000000000000" + "0x038e45eadd3d88b87fe4dab066680522f0dfc8f9": { + "balance": "0x21e19e0c9bab2400000" }, - "2561ec0f379218fe5ed4e028a3f744aa41754c72": { - "balance": "13370000000000000000" + "0x2561ec0f379218fe5ed4e028a3f744aa41754c72": { + "balance": "0xb98bc829a6f90000" }, - "b95396daaa490df2569324fcc6623be052f132ca": { - "balance": "2000000000000000000000" + "0xb95396daaa490df2569324fcc6623be052f132ca": { + "balance": "0x6c6b935b8bbd400000" }, - "2376ada90333b1d181084c97e645e810aa5b76f1": { - "balance": "750000000000000000000" + "0x2376ada90333b1d181084c97e645e810aa5b76f1": { + "balance": "0x28a857425466f80000" }, - "07800d2f8068e448c79a4f69b1f15ef682aae5f6": { - "balance": "19400000000000000000000" + "0x07800d2f8068e448c79a4f69b1f15ef682aae5f6": { + "balance": "0x41bad155e6512200000" }, - "adeb204aa0c38e179e81a94ed8b3e7d53047c26b": { - "balance": "608000000000000000000" + "0xadeb204aa0c38e179e81a94ed8b3e7d53047c26b": { + "balance": "0x20f5b1eaad8d800000" }, - "0dc100b107011c7fc0a1339612a16ccec3285208": { - "balance": "2000000000000000000000" + "0x0dc100b107011c7fc0a1339612a16ccec3285208": { + "balance": "0x6c6b935b8bbd400000" }, - "f0b1340b996f6f0bf0d9561c849caf7f4430befa": { - "balance": "100000000000000000000" + "0xf0b1340b996f6f0bf0d9561c849caf7f4430befa": { + "balance": "0x56bc75e2d63100000" }, - "e1443dbd95cc41237f613a48456988a04f683282": { - "balance": "4000086000000000000000" + "0xe1443dbd95cc41237f613a48456988a04f683282": { + "balance": "0xd8d8583fa2d52f0000" }, - "d3c6f1e0f50ec3d2a67e6bcd193ec7ae38f1657f": { - "balance": "6618150000000000000000" + "0xd3c6f1e0f50ec3d2a67e6bcd193ec7ae38f1657f": { + "balance": "0x166c5480889db770000" }, - "b68899e7610d4c93a23535bcc448945ba1666f1c": { - "balance": "200000000000000000000" + "0xb68899e7610d4c93a23535bcc448945ba1666f1c": { + "balance": "0xad78ebc5ac6200000" }, - "a7253763cf4a75df92ca1e766dc4ee8a2745147b": { - "balance": "10740000000000000000000" + "0xa7253763cf4a75df92ca1e766dc4ee8a2745147b": { + "balance": "0x2463770e90a8f500000" }, - "75d67ce14e8d29e8c2ffe381917b930b1aff1a87": { - "balance": "3000000000000000000000" + "0x75d67ce14e8d29e8c2ffe381917b930b1aff1a87": { + "balance": "0xa2a15d09519be00000" }, - "493d48bda015a9bfcf1603936eab68024ce551e0": { - "balance": "22528000000000000000" + "0x493d48bda015a9bfcf1603936eab68024ce551e0": { + "balance": "0x138a388a43c000000" }, - "7ddd57165c87a2707f025dcfc2508c09834759bc": { - "balance": "1400000000000000000000" + "0x7ddd57165c87a2707f025dcfc2508c09834759bc": { + "balance": "0x4be4e7267b6ae00000" }, - "cff7f89a4d4219a38295251331568210ffc1c134": { - "balance": "1760000000000000000000" + "0xcff7f89a4d4219a38295251331568210ffc1c134": { + "balance": "0x5f68e8131ecf800000" }, - "168d30e53fa681092b52e9bae15a0dcb41a8c9bb": { - "balance": "100000000000000000000" + "0x168d30e53fa681092b52e9bae15a0dcb41a8c9bb": { + "balance": "0x56bc75e2d63100000" }, - "99b743d1d9eff90d9a1934b4db21d519d89b4a38": { - "balance": "100000000000000000000" + "0x99b743d1d9eff90d9a1934b4db21d519d89b4a38": { + "balance": "0x56bc75e2d63100000" }, - "a3d0b03cffbb269f796ac29d80bfb07dc7c6ad06": { - "balance": "2000000000000000000000" + "0xa3d0b03cffbb269f796ac29d80bfb07dc7c6ad06": { + "balance": "0x6c6b935b8bbd400000" }, - "816d9772cf11399116cc1e72c26c6774c9edd739": { - "balance": "200000000000000000000" + "0x816d9772cf11399116cc1e72c26c6774c9edd739": { + "balance": "0xad78ebc5ac6200000" }, - "a880e2a8bf88a1a82648b4013c49c4594c433cc8": { - "balance": "4728000000000000000000" + "0xa880e2a8bf88a1a82648b4013c49c4594c433cc8": { + "balance": "0x1004e2e45fb7ee00000" }, - "2a44a7218fe44d65a1b4b7a7d9b1c2c52c8c3e34": { - "balance": "62221355000000000000000" + "0x2a44a7218fe44d65a1b4b7a7d9b1c2c52c8c3e34": { + "balance": "0xd2d06c305a1eb578000" }, - "cb86edbc8bbb1f9131022be649565ebdb09e32a1": { - "balance": "2000000000000000000000" + "0xcb86edbc8bbb1f9131022be649565ebdb09e32a1": { + "balance": "0x6c6b935b8bbd400000" }, - "3915eab5ab2e5977d075dec47d96b68b4b5cf515": { - "balance": "61520000000000000000000" + "0x3915eab5ab2e5977d075dec47d96b68b4b5cf515": { + "balance": "0xd07018185120f400000" }, - "8165cab0eafb5a328fc41ac64dae715b2eef2c65": { - "balance": "1000000000000000000000" + "0x8165cab0eafb5a328fc41ac64dae715b2eef2c65": { + "balance": "0x3635c9adc5dea00000" }, - "416c86b72083d1f8907d84efd2d2d783dffa3efb": { - "balance": "1999944000000000000000" + "0x416c86b72083d1f8907d84efd2d2d783dffa3efb": { + "balance": "0x6c6acc67d7b1d40000" }, - "c524086d46c8112b128b2faf6f7c7d8160a8386c": { - "balance": "400000000000000000000" + "0xc524086d46c8112b128b2faf6f7c7d8160a8386c": { + "balance": "0x15af1d78b58c400000" }, - "902d74a157f7d2b9a3378b1f56703730e03a1719": { - "balance": "4000000000000000000000" + "0x902d74a157f7d2b9a3378b1f56703730e03a1719": { + "balance": "0xd8d726b7177a800000" }, - "74ef2869cbe608856045d8c2041118579f2236ea": { - "balance": "59724000000000000000" + "0x74ef2869cbe608856045d8c2041118579f2236ea": { + "balance": "0x33cd64591956e0000" }, - "af992dd669c0883e5515d3f3112a13f617a4c367": { - "balance": "2000000000000000000000" + "0xaf992dd669c0883e5515d3f3112a13f617a4c367": { + "balance": "0x6c6b935b8bbd400000" }, - "4c6a248fc97d705def495ca20759169ef0d36471": { - "balance": "760000000000000000000" + "0x4c6a248fc97d705def495ca20759169ef0d36471": { + "balance": "0x29331e6558f0e00000" }, - "974d2f17895f2902049deaaecf09c3046507402d": { - "balance": "14707000000000000000" + "0x974d2f17895f2902049deaaecf09c3046507402d": { + "balance": "0xcc19c29437ab8000" }, - "0239b4f21f8e05cd01512b2be7a0e18a6d974607": { - "balance": "1000000000000000000000" + "0x0239b4f21f8e05cd01512b2be7a0e18a6d974607": { + "balance": "0x3635c9adc5dea00000" }, - "b97a6733cd5fe99864b3b33460d1672434d5cafd": { - "balance": "1999579000000000000000" + "0xb97a6733cd5fe99864b3b33460d1672434d5cafd": { + "balance": "0x6c65bbaa46c2cf8000" }, - "f558a2b2dd26dd9593aae04531fd3c3cc3854b67": { - "balance": "198000000000000000000" + "0xf558a2b2dd26dd9593aae04531fd3c3cc3854b67": { + "balance": "0xabbcd4ef377580000" }, - "b577b6befa054e9c040461855094b002d7f57bd7": { - "balance": "114000000000000000000000" + "0xb577b6befa054e9c040461855094b002d7f57bd7": { + "balance": "0x1823f3cf621d23400000" }, - "73bfe7710f31cab949b7a2604fbf5239cee79015": { - "balance": "2000000000000000000000" + "0x73bfe7710f31cab949b7a2604fbf5239cee79015": { + "balance": "0x6c6b935b8bbd400000" }, - "5717f2d8f18ffcc0e5fe247d3a4219037c3a649c": { - "balance": "3998000000000000000000" + "0x5717f2d8f18ffcc0e5fe247d3a4219037c3a649c": { + "balance": "0xd8bb6549b02bb80000" }, - "20707e425d2a11d2c89f391b2b809f556c592421": { - "balance": "2000000000000000000000" + "0x20707e425d2a11d2c89f391b2b809f556c592421": { + "balance": "0x6c6b935b8bbd400000" }, - "9a6708ddb8903c289f83fe889c1edcd61f854423": { - "balance": "1000000000000000000000" + "0x9a6708ddb8903c289f83fe889c1edcd61f854423": { + "balance": "0x3635c9adc5dea00000" }, - "fa27cc49d00b6c987336a875ae39da58fb041b2e": { - "balance": "10000000000000000000000" + "0xfa27cc49d00b6c987336a875ae39da58fb041b2e": { + "balance": "0x21e19e0c9bab2400000" }, - "d688e785c98f00f84b3aa1533355c7a258e87948": { - "balance": "500000000000000000000" + "0xd688e785c98f00f84b3aa1533355c7a258e87948": { + "balance": "0x1b1ae4d6e2ef500000" }, - "927cb7dc187036b5427bc7e200c5ec450c1d27d4": { - "balance": "216000000000000000000" + "0x927cb7dc187036b5427bc7e200c5ec450c1d27d4": { + "balance": "0xbb59a27953c600000" }, - "b2bfaa58b5196c5cb7f89de15f479d1838de713d": { - "balance": "21000000000000000000" + "0xb2bfaa58b5196c5cb7f89de15f479d1838de713d": { + "balance": "0x1236efcbcbb340000" }, - "e180de9e86f57bafacd7904f9826b6b4b26337a3": { - "balance": "830400000000000000000" + "0xe180de9e86f57bafacd7904f9826b6b4b26337a3": { + "balance": "0x2d041d705a2c600000" }, - "a1204dad5f560728a35c0d8fc79481057bf77386": { - "balance": "1000000000000000000000" + "0xa1204dad5f560728a35c0d8fc79481057bf77386": { + "balance": "0x3635c9adc5dea00000" }, - "6b0da25af267d7836c226bcae8d872d2ce52c941": { - "balance": "6000000000000000000000" + "0x6b0da25af267d7836c226bcae8d872d2ce52c941": { + "balance": "0x14542ba12a337c00000" }, - "0517448dada761cc5ba4033ee881c83037036400": { - "balance": "1998000000000000000000" + "0x0517448dada761cc5ba4033ee881c83037036400": { + "balance": "0x6c4fd1ee246e780000" }, - "7ed0a5a847bef9a9da7cba1d6411f5c316312619": { - "balance": "39842000000000000000" + "0x7ed0a5a847bef9a9da7cba1d6411f5c316312619": { + "balance": "0x228eb37e8751d0000" }, - "5b5d517029321562111b43086d0b043591109a70": { - "balance": "2600000000000000000000" + "0x5b5d517029321562111b43086d0b043591109a70": { + "balance": "0x8cf23f909c0fa00000" }, - "56fc1a7bad4047237ce116146296238e078f93ad": { - "balance": "178000000000000000000" + "0x56fc1a7bad4047237ce116146296238e078f93ad": { + "balance": "0x9a63f08ea63880000" }, - "6c5422fb4b14e6d98b6091fdec71f1f08640419d": { - "balance": "400000000000000000000" + "0x6c5422fb4b14e6d98b6091fdec71f1f08640419d": { + "balance": "0x15af1d78b58c400000" }, - "108fe8ee2a13da487b22c6ab6d582ea71064d98c": { - "balance": "399800000000000000000" + "0x108fe8ee2a13da487b22c6ab6d582ea71064d98c": { + "balance": "0x15ac56edc4d12c0000" }, - "0ad3e44d3c001fa290b393617030544108ac6eb9": { - "balance": "1969019000000000000000" + "0x0ad3e44d3c001fa290b393617030544108ac6eb9": { + "balance": "0x6abda0bc30b2df8000" }, - "25aee68d09afb71d8817f3f184ec562f7897b734": { - "balance": "2000000000000000000000" + "0x25aee68d09afb71d8817f3f184ec562f7897b734": { + "balance": "0x6c6b935b8bbd400000" }, - "c2340a4ca94c9678b7494c3c852528ede5ee529f": { - "balance": "48669000000000000000" + "0xc2340a4ca94c9678b7494c3c852528ede5ee529f": { + "balance": "0x2a36b05a3fd7c8000" }, - "44901e0d0e08ac3d5e95b8ec9d5e0ff5f12e0393": { - "balance": "417500000000000000000" + "0x44901e0d0e08ac3d5e95b8ec9d5e0ff5f12e0393": { + "balance": "0x16a1f9f5fd7d960000" }, - "8775a610c502b9f1e6ad4cdadb8ce29bff75f6e4": { - "balance": "600000000000000000000" + "0x8775a610c502b9f1e6ad4cdadb8ce29bff75f6e4": { + "balance": "0x2086ac351052600000" }, - "682897bc4f8e89029120fcffb787c01a93e64184": { - "balance": "10000000000000000000000" + "0x682897bc4f8e89029120fcffb787c01a93e64184": { + "balance": "0x21e19e0c9bab2400000" }, - "f7acff934b84da0969dc37a8fcf643b7d7fbed41": { - "balance": "1999944000000000000000" + "0xf7acff934b84da0969dc37a8fcf643b7d7fbed41": { + "balance": "0x6c6acc67d7b1d40000" }, - "f05fcd4c0d73aa167e5553c8c0d6d4f2faa39757": { - "balance": "13334000000000000000000" + "0xf05fcd4c0d73aa167e5553c8c0d6d4f2faa39757": { + "balance": "0x2d2d66c3170b2980000" }, - "c981d312d287d558871edd973abb76b979e5c35e": { - "balance": "1970000000000000000000" + "0xc981d312d287d558871edd973abb76b979e5c35e": { + "balance": "0x6acb3df27e1f880000" }, - "9da61ccd62bf860656e0325d7157e2f160d93bb5": { - "balance": "4999980000000000000000" + "0x9da61ccd62bf860656e0325d7157e2f160d93bb5": { + "balance": "0x10f0ca956f8799e0000" }, - "d284a50382f83a616d39b8a9c0f396e0ebbfa95d": { - "balance": "1000070000000000000000" + "0xd284a50382f83a616d39b8a9c0f396e0ebbfa95d": { + "balance": "0x3636c25e66ece70000" }, - "d6cf5c1bcf9da662bcea2255905099f9d6e84dcc": { - "balance": "8349332000000000000000" + "0xd6cf5c1bcf9da662bcea2255905099f9d6e84dcc": { + "balance": "0x1c49e420157d9c20000" }, - "c71b2a3d7135d2a85fb5a571dcbe695e13fc43cd": { - "balance": "1000000000000000000000" + "0xc71b2a3d7135d2a85fb5a571dcbe695e13fc43cd": { + "balance": "0x3635c9adc5dea00000" }, - "b22dadd7e1e05232a93237baed98e0df92b1869e": { - "balance": "2000000000000000000000" + "0xb22dadd7e1e05232a93237baed98e0df92b1869e": { + "balance": "0x6c6b935b8bbd400000" }, - "b09fe6d4349b99bc37938054022d54fca366f7af": { - "balance": "200000000000000000000000" + "0xb09fe6d4349b99bc37938054022d54fca366f7af": { + "balance": "0x2a5a058fc295ed000000" }, - "427e4751c3babe78cff8830886febc10f9908d74": { - "balance": "1970000000000000000000" + "0x427e4751c3babe78cff8830886febc10f9908d74": { + "balance": "0x6acb3df27e1f880000" }, - "60b358cb3dbefa37f47df2d7365840da8e3bc98c": { - "balance": "20000000000000000000" + "0x60b358cb3dbefa37f47df2d7365840da8e3bc98c": { + "balance": "0x1158e460913d00000" }, - "dcd5bca2005395b675fde5035659b26bfefc49ee": { - "balance": "197000000000000000000" + "0xdcd5bca2005395b675fde5035659b26bfefc49ee": { + "balance": "0xaadec983fcff40000" }, - "81186931184137d1192ac88cd3e1e5d0fdb86a74": { - "balance": "2900000000000000000000" + "0x81186931184137d1192ac88cd3e1e5d0fdb86a74": { + "balance": "0x9d3595ab2438d00000" }, - "de212293f8f1d231fa10e609470d512cb8ffc512": { - "balance": "2000000000000000000000" + "0xde212293f8f1d231fa10e609470d512cb8ffc512": { + "balance": "0x6c6b935b8bbd400000" }, - "1937c5c515057553ccbd46d5866455ce66290284": { - "balance": "1000000000000000000000000" + "0x1937c5c515057553ccbd46d5866455ce66290284": { + "balance": "0xd3c21bcecceda1000000" }, - "592777261e3bd852c48eca95b3a44c5b7f2d422c": { - "balance": "20000000000000000000000" + "0x592777261e3bd852c48eca95b3a44c5b7f2d422c": { + "balance": "0x43c33c1937564800000" }, - "bbf84292d954acd9e4072fb860b1504106e077ae": { - "balance": "1500000000000000000000" + "0xbbf84292d954acd9e4072fb860b1504106e077ae": { + "balance": "0x5150ae84a8cdf00000" }, - "3b4100e30a73b0c734b18ffa8426d19b19312f1a": { - "balance": "55300000000000000000000" + "0x3b4100e30a73b0c734b18ffa8426d19b19312f1a": { + "balance": "0xbb5d1aa700afd900000" }, - "a03a3dc7c533d1744295be955d61af3f52b51af5": { - "balance": "40000000000000000000" + "0xa03a3dc7c533d1744295be955d61af3f52b51af5": { + "balance": "0x22b1c8c1227a00000" }, - "4aa148c2c33401e66a2b586e6577c4b292d3f240": { - "balance": "216200000000000000000" + "0x4aa148c2c33401e66a2b586e6577c4b292d3f240": { + "balance": "0xbb860b285f7740000" }, - "ff850e3be1eb6a4d726c08fa73aad358f39706da": { - "balance": "1940000000000000000000" + "0xff850e3be1eb6a4d726c08fa73aad358f39706da": { + "balance": "0x692ae8897081d00000" }, - "743651b55ef8429df50cf81938c2508de5c8870f": { - "balance": "2000000000000000000000" + "0x743651b55ef8429df50cf81938c2508de5c8870f": { + "balance": "0x6c6b935b8bbd400000" }, - "3700e3027424d939dbde5d42fb78f6c4dbec1a8f": { - "balance": "40000000000000000000" + "0x3700e3027424d939dbde5d42fb78f6c4dbec1a8f": { + "balance": "0x22b1c8c1227a00000" }, - "c1cbd2e2332a524cf219b10d871ccc20af1fb0fa": { - "balance": "1000000000000000000000" + "0xc1cbd2e2332a524cf219b10d871ccc20af1fb0fa": { + "balance": "0x3635c9adc5dea00000" }, - "e25b9f76b8ad023f057eb11ad94257a0862e4e8c": { - "balance": "2000000000000000000000" + "0xe25b9f76b8ad023f057eb11ad94257a0862e4e8c": { + "balance": "0x6c6b935b8bbd400000" }, - "719e891fbcc0a33e19c12dc0f02039ca05b801df": { - "balance": "6185800000000000000000" + "0x719e891fbcc0a33e19c12dc0f02039ca05b801df": { + "balance": "0x14f5538463a1b540000" }, - "39636b25811b176abfcfeeca64bc87452f1fdff4": { - "balance": "400000000000000000000" + "0x39636b25811b176abfcfeeca64bc87452f1fdff4": { + "balance": "0x15af1d78b58c400000" }, - "631030a5b27b07288a45696f189e1114f12a81c0": { - "balance": "499970000000000000000" + "0x631030a5b27b07288a45696f189e1114f12a81c0": { + "balance": "0x1b1a7a420ba00d0000" }, - "bcc84597b91e73d5c5b4d69c80ecf146860f779a": { - "balance": "4380000000000000000000" + "0xbcc84597b91e73d5c5b4d69c80ecf146860f779a": { + "balance": "0xed70b5e9c3f2f00000" }, - "095e0174829f34c3781be1a5e38d1541ea439b7f": { - "balance": "6000000000000000000000" + "0x095e0174829f34c3781be1a5e38d1541ea439b7f": { + "balance": "0x14542ba12a337c00000" }, - "2e7e05e29edda7e4ae25c5173543efd71f6d3d80": { - "balance": "6000000000000000000000" + "0x2e7e05e29edda7e4ae25c5173543efd71f6d3d80": { + "balance": "0x14542ba12a337c00000" }, - "dbb6ac484027041642bbfd8d80f9d0c1cf33c1eb": { - "balance": "2000000000000000000000" + "0xdbb6ac484027041642bbfd8d80f9d0c1cf33c1eb": { + "balance": "0x6c6b935b8bbd400000" }, - "153c08aa8b96a611ef63c0253e2a4334829e579d": { - "balance": "394000000000000000000" + "0x153c08aa8b96a611ef63c0253e2a4334829e579d": { + "balance": "0x155bd9307f9fe80000" }, - "10f4bff0caa5027c0a6a2dcfc952824de2940909": { - "balance": "2000000000000000000000" + "0x10f4bff0caa5027c0a6a2dcfc952824de2940909": { + "balance": "0x6c6b935b8bbd400000" }, - "2ef869f0350b57d53478d701e3fee529bc911c75": { - "balance": "50000000000000000000" + "0x2ef869f0350b57d53478d701e3fee529bc911c75": { + "balance": "0x2b5e3af16b1880000" }, - "70ab34bc17b66f9c3b63f151274f2a727c539263": { - "balance": "2000000000000000000000" + "0x70ab34bc17b66f9c3b63f151274f2a727c539263": { + "balance": "0x6c6b935b8bbd400000" }, - "3201259caf734ad7581c561051ba0bca7fd6946b": { - "balance": "180000000000000000000000" + "0x3201259caf734ad7581c561051ba0bca7fd6946b": { + "balance": "0x261dd1ce2f2088800000" }, - "84e9cf8166c36abfa49053b7a1ad4036202681ef": { - "balance": "2000000000000000000000" + "0x84e9cf8166c36abfa49053b7a1ad4036202681ef": { + "balance": "0x6c6b935b8bbd400000" }, - "4ebc5629f9a6a66b2cf3363ac4895c0348e8bf87": { - "balance": "1000090000000000000000" + "0x4ebc5629f9a6a66b2cf3363ac4895c0348e8bf87": { + "balance": "0x3637096c4bcc690000" }, - "e50b464ac9de35a5618b7cbf254674182b81b97e": { - "balance": "4100000000000000000000" + "0xe50b464ac9de35a5618b7cbf254674182b81b97e": { + "balance": "0xde42ee1544dd900000" }, - "2abdf1a637ef6c42a7e2fe217773d677e804ebdd": { - "balance": "5000000000000000000000" + "0x2abdf1a637ef6c42a7e2fe217773d677e804ebdd": { + "balance": "0x10f0cf064dd59200000" }, - "7a0a78a9cc393f91c3d9e39a6b8c069f075e6bf5": { - "balance": "1337000000000000000000" + "0x7a0a78a9cc393f91c3d9e39a6b8c069f075e6bf5": { + "balance": "0x487a9a304539440000" }, - "2d9c5fecd2b44fbb6a1ec732ea059f4f1f9d2b5c": { - "balance": "1010694000000000000000" + "0x2d9c5fecd2b44fbb6a1ec732ea059f4f1f9d2b5c": { + "balance": "0x36ca32661d1aa70000" }, - "7b712c7af11676006a66d2fc5c1ab4c479ce6037": { - "balance": "8000000000000000000000" + "0x7b712c7af11676006a66d2fc5c1ab4c479ce6037": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "3466f67e39636c01f43b3a21a0e8529325c08624": { - "balance": "842864000000000000000" + "0x3466f67e39636c01f43b3a21a0e8529325c08624": { + "balance": "0x2db1167650acd80000" }, - "fdd502a74e813bcfa355ceda3c176f6a6871af7f": { - "balance": "400000000000000000000" + "0xfdd502a74e813bcfa355ceda3c176f6a6871af7f": { + "balance": "0x15af1d78b58c400000" }, - "26475419c06d5f147aa597248eb46cf7befa64a5": { - "balance": "1640000000000000000000" + "0x26475419c06d5f147aa597248eb46cf7befa64a5": { + "balance": "0x58e7926ee858a00000" }, - "9243d7762d77287b12638688b9854e88a769b271": { - "balance": "1000000000000000000000" + "0x9243d7762d77287b12638688b9854e88a769b271": { + "balance": "0x3635c9adc5dea00000" }, - "723d8baa2551d2addc43c21b45e8af4ca2bfb2c2": { - "balance": "1760000000000000000000" + "0x723d8baa2551d2addc43c21b45e8af4ca2bfb2c2": { + "balance": "0x5f68e8131ecf800000" }, - "f2fbb6d887f8b8cc3a869aba847f3d1f643c53d6": { - "balance": "3999000000000000000000" + "0xf2fbb6d887f8b8cc3a869aba847f3d1f643c53d6": { + "balance": "0xd8c9460063d31c0000" }, - "2cdb3944650616e47cb182e060322fa1487978ce": { - "balance": "1820000000000000000000" + "0x2cdb3944650616e47cb182e060322fa1487978ce": { + "balance": "0x62a992e53a0af00000" }, - "f0d21663d8b0176e05fde1b90ef31f8530fda95f": { - "balance": "1999944000000000000000" + "0xf0d21663d8b0176e05fde1b90ef31f8530fda95f": { + "balance": "0x6c6acc67d7b1d40000" }, - "77cc02f623a9cf98530997ea67d95c3b491859ae": { - "balance": "1354900000000000000000" + "0x77cc02f623a9cf98530997ea67d95c3b491859ae": { + "balance": "0x497303c36ea0c20000" }, - "d1b5a454ac3405bb4179208c6c84de006bcb9be9": { - "balance": "500000000000000000000" + "0xd1b5a454ac3405bb4179208c6c84de006bcb9be9": { + "balance": "0x1b1ae4d6e2ef500000" }, - "b9920fd0e2c735c256463caa240fb7ac86a93dfa": { - "balance": "1760000000000000000000" + "0xb9920fd0e2c735c256463caa240fb7ac86a93dfa": { + "balance": "0x5f68e8131ecf800000" }, - "ed1f1e115a0d60ce02fb25df014d289e3a0cbe7d": { - "balance": "500000000000000000000" + "0xed1f1e115a0d60ce02fb25df014d289e3a0cbe7d": { + "balance": "0x1b1ae4d6e2ef500000" }, - "23e2c6a8be8e0acfa5c4df5e36058bb7cbac5a81": { - "balance": "2000000000000000000000" + "0x23e2c6a8be8e0acfa5c4df5e36058bb7cbac5a81": { + "balance": "0x6c6b935b8bbd400000" }, - "f0be0faf4d7923fc444622d1980cf2d990aab307": { - "balance": "2000000000000000000000" + "0xf0be0faf4d7923fc444622d1980cf2d990aab307": { + "balance": "0x6c6b935b8bbd400000" }, - "0829d0f7bb7c446cfbb0deadb2394d9db7249a87": { - "balance": "40110000000000000000" + "0x0829d0f7bb7c446cfbb0deadb2394d9db7249a87": { + "balance": "0x22ca3587cf4eb0000" }, - "2ecac504b233866eb5a4a99e7bd2901359e43b3d": { - "balance": "20000000000000000000000" + "0x2ecac504b233866eb5a4a99e7bd2901359e43b3d": { + "balance": "0x43c33c1937564800000" }, - "06d6cb308481c336a6e1a225a912f6e6355940a1": { - "balance": "1760000000000000000000" + "0x06d6cb308481c336a6e1a225a912f6e6355940a1": { + "balance": "0x5f68e8131ecf800000" }, - "d4879fd12b1f3a27f7e109761b23ca343c48e3d8": { - "balance": "666000000000000000000" + "0xd4879fd12b1f3a27f7e109761b23ca343c48e3d8": { + "balance": "0x241a9b4f617a280000" }, - "857f100b1a5930225efc7e9020d78327b41c02cb": { - "balance": "2000000000000000000000" + "0x857f100b1a5930225efc7e9020d78327b41c02cb": { + "balance": "0x6c6b935b8bbd400000" }, - "3aa42c21b9b31c3e27ccd17e099af679cdf56907": { - "balance": "8000000000000000000000" + "0x3aa42c21b9b31c3e27ccd17e099af679cdf56907": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "764d5212263aff4a2a14f031f04ec749dc883e45": { - "balance": "1850000000000000000000" + "0x764d5212263aff4a2a14f031f04ec749dc883e45": { + "balance": "0x6449e84e47a8a80000" }, - "d03a2da41e868ed3fef5745b96f5eca462ff6fda": { - "balance": "3000000000000000000000" + "0xd03a2da41e868ed3fef5745b96f5eca462ff6fda": { + "balance": "0xa2a15d09519be00000" }, - "4f26690c992b7a312ab12e1385d94acd58288e7b": { - "balance": "14000000000000000000000" + "0x4f26690c992b7a312ab12e1385d94acd58288e7b": { + "balance": "0x2f6f10780d22cc00000" }, - "7b122162c913e7146cad0b7ed37affc92a0bf27f": { - "balance": "1506799000000000000000" + "0x7b122162c913e7146cad0b7ed37affc92a0bf27f": { + "balance": "0x51af096b2301d18000" }, - "c87352dba582ee2066b9c002a962e003134f78b1": { - "balance": "500000000000000000000" + "0xc87352dba582ee2066b9c002a962e003134f78b1": { + "balance": "0x1b1ae4d6e2ef500000" }, - "9f4ac9c9e7e24cb2444a0454fa5b9ad9d92d3853": { - "balance": "835000000000000000000" + "0x9f4ac9c9e7e24cb2444a0454fa5b9ad9d92d3853": { + "balance": "0x2d43f3ebfafb2c0000" }, - "ccf62a663f1353ba2ef8e6521dc1ecb673ec8ef7": { - "balance": "152000000000000000000" + "0xccf62a663f1353ba2ef8e6521dc1ecb673ec8ef7": { + "balance": "0x83d6c7aab63600000" }, - "557f5e65e0da33998219ad4e99570545b2a9d511": { - "balance": "11024000000000000000000" + "0x557f5e65e0da33998219ad4e99570545b2a9d511": { + "balance": "0x2559cbb985842400000" }, - "a5f0077b351f6c505cd515dfa6d2fa7f5c4cd287": { - "balance": "40000000000000000000000" + "0xa5f0077b351f6c505cd515dfa6d2fa7f5c4cd287": { + "balance": "0x878678326eac9000000" }, - "79c6002f8452ca157f1317e80a2faf24475559b7": { - "balance": "20000000000000000000" + "0x79c6002f8452ca157f1317e80a2faf24475559b7": { + "balance": "0x1158e460913d00000" }, - "3aa07a34a1afc8967d3d1383b96b62cf96d5fa90": { - "balance": "20000000000000000000000" + "0x3aa07a34a1afc8967d3d1383b96b62cf96d5fa90": { + "balance": "0x43c33c1937564800000" }, - "7f389c12f3c6164f6446566c77669503c2792527": { - "balance": "98500000000000000000" + "0x7f389c12f3c6164f6446566c77669503c2792527": { + "balance": "0x556f64c1fe7fa0000" }, - "ac4cc256ae74d624ace80db078b2207f57198f6b": { - "balance": "2001000000000000000000" + "0xac4cc256ae74d624ace80db078b2207f57198f6b": { + "balance": "0x6c7974123f64a40000" }, - "823ba7647238d113bce9964a43d0a098118bfe4d": { - "balance": "200000000000000000000" + "0x823ba7647238d113bce9964a43d0a098118bfe4d": { + "balance": "0xad78ebc5ac6200000" }, - "f5a7676ad148ae9c1ef8b6f5e5a0c2c473be850b": { - "balance": "200000000000000000000" + "0xf5a7676ad148ae9c1ef8b6f5e5a0c2c473be850b": { + "balance": "0xad78ebc5ac6200000" }, - "7d34803569e00bd6b59fff081dfa5c0ab4197a62": { - "balance": "1712700000000000000000" + "0x7d34803569e00bd6b59fff081dfa5c0ab4197a62": { + "balance": "0x5cd87cb7b9fb860000" }, - "061ea4877cd08944eb64c2966e9db8dedcfec06b": { - "balance": "1000000000000000000000" + "0x061ea4877cd08944eb64c2966e9db8dedcfec06b": { + "balance": "0x3635c9adc5dea00000" }, - "df37c22e603aedb60a627253c47d8ba866f6d972": { - "balance": "24000000000000000000000" + "0xdf37c22e603aedb60a627253c47d8ba866f6d972": { + "balance": "0x5150ae84a8cdf000000" }, - "529aa002c6962a3a8545027fd8b05f22b5bf9564": { - "balance": "1670000000000000000000" + "0x529aa002c6962a3a8545027fd8b05f22b5bf9564": { + "balance": "0x5a87e7d7f5f6580000" }, - "eb89a882670909cf377e9e78286ee97ba78d46c2": { - "balance": "802200000000000000000" + "0xeb89a882670909cf377e9e78286ee97ba78d46c2": { + "balance": "0x2b7cc2e9c3225c0000" }, - "9ac85397792a69d78f286b86432a07aeceb60e64": { - "balance": "14300000000000000000" + "0x9ac85397792a69d78f286b86432a07aeceb60e64": { + "balance": "0xc673ce3c40160000" }, - "9610592202c282ab9bd8a884518b3e0bd4758137": { - "balance": "268000000000000000000" + "0x9610592202c282ab9bd8a884518b3e0bd4758137": { + "balance": "0xe873f44133cb00000" }, - "73932709a97f02c98e51b091312865122385ae8e": { - "balance": "1430000000000000000000" + "0x73932709a97f02c98e51b091312865122385ae8e": { + "balance": "0x4d853c8f8908980000" }, - "5ef8c96186b37984cbfe04c598406e3b0ac3171f": { - "balance": "9400000000000000000000" + "0x5ef8c96186b37984cbfe04c598406e3b0ac3171f": { + "balance": "0x1fd933494aa5fe00000" }, - "b6f78da4f4d041b3bc14bc5ba519a5ba0c32f128": { - "balance": "172326253000000000000000" + "0xb6f78da4f4d041b3bc14bc5ba519a5ba0c32f128": { + "balance": "0x247dd32c3fe195048000" }, - "6f0edd23bcd85f6015f9289c28841fe04c83efeb": { - "balance": "19100000000000000000" + "0x6f0edd23bcd85f6015f9289c28841fe04c83efeb": { + "balance": "0x10910d4cdc9f60000" }, - "a8a43c009100616cb4ae4e033f1fc5d7e0b6f152": { - "balance": "3939015000000000000000" + "0xa8a43c009100616cb4ae4e033f1fc5d7e0b6f152": { + "balance": "0xd588d078b43f4d8000" }, - "7081fa6baad6cfb7f51b2cca16fb8970991a64ba": { - "balance": "233953000000000000000" + "0x7081fa6baad6cfb7f51b2cca16fb8970991a64ba": { + "balance": "0xcaec005f6c0f68000" }, - "9de7386dde401ce4c67b71b6553f8aa34ea5a17d": { - "balance": "60000000000000000000" + "0x9de7386dde401ce4c67b71b6553f8aa34ea5a17d": { + "balance": "0x340aad21b3b700000" }, - "54ec7300b81ac84333ed1b033cd5d7a33972e234": { - "balance": "200000000000000000000" + "0x54ec7300b81ac84333ed1b033cd5d7a33972e234": { + "balance": "0xad78ebc5ac6200000" }, - "67a80e0190721f94390d6802729dd12c31a895ad": { - "balance": "1999964000000000000000" + "0x67a80e0190721f94390d6802729dd12c31a895ad": { + "balance": "0x6c6b1375bc91560000" }, - "3a4297da3c555e46c073669d0478fce75f2f790e": { - "balance": "1969606000000000000000" + "0x3a4297da3c555e46c073669d0478fce75f2f790e": { + "balance": "0x6ac5c62d9486070000" }, - "c2e0584a71348cc314b73b2029b6230b92dbb116": { - "balance": "2000000000000000000000" + "0xc2e0584a71348cc314b73b2029b6230b92dbb116": { + "balance": "0x6c6b935b8bbd400000" }, - "0a2ade95b2e8c66d8ae6f0ba64ca57d783be6d44": { - "balance": "4000000000000000000000" + "0x0a2ade95b2e8c66d8ae6f0ba64ca57d783be6d44": { + "balance": "0xd8d726b7177a800000" }, - "544b5b351d1bc82e9297439948cf4861dac9ae11": { - "balance": "22000000000000000000000" + "0x544b5b351d1bc82e9297439948cf4861dac9ae11": { + "balance": "0x4a89f54ef0121c00000" }, - "3ae62bd271a760637fad79c31c94ff62b4cd12f7": { - "balance": "2000000000000000000000" + "0x3ae62bd271a760637fad79c31c94ff62b4cd12f7": { + "balance": "0x6c6b935b8bbd400000" }, - "0d8023929d917234ae40512b1aabb5e8a4512771": { - "balance": "148000000000000000000" + "0x0d8023929d917234ae40512b1aabb5e8a4512771": { + "balance": "0x805e99fdcc5d00000" }, - "2858acacaf21ea81cab7598fdbd86b452e9e8e15": { - "balance": "666000000000000000000" + "0x2858acacaf21ea81cab7598fdbd86b452e9e8e15": { + "balance": "0x241a9b4f617a280000" }, - "c033b1325a0af45472c25527853b1f1c21fa35de": { - "balance": "2000000000000000000000" + "0xc033b1325a0af45472c25527853b1f1c21fa35de": { + "balance": "0x6c6b935b8bbd400000" }, - "bbf85aaaa683738f073baef44ac9dc34c4c779ea": { - "balance": "2000000000000000000000" + "0xbbf85aaaa683738f073baef44ac9dc34c4c779ea": { + "balance": "0x6c6b935b8bbd400000" }, - "6ae57f27917c562a132a4d1bf7ec0ac785832926": { - "balance": "6000000000000000000000" + "0x6ae57f27917c562a132a4d1bf7ec0ac785832926": { + "balance": "0x14542ba12a337c00000" }, - "88e6f9b247f988f6c0fc14c56f1de53ec69d43cc": { - "balance": "100000000000000000000" + "0x88e6f9b247f988f6c0fc14c56f1de53ec69d43cc": { + "balance": "0x56bc75e2d63100000" }, - "b72c2a011c0df50fbb6e28b20ae1aad217886790": { - "balance": "4000000000000000000000" + "0xb72c2a011c0df50fbb6e28b20ae1aad217886790": { + "balance": "0xd8d726b7177a800000" }, - "161caf5a972ace8379a6d0a04ae6e163fe21df2b": { - "balance": "100000000000000000000000" + "0x161caf5a972ace8379a6d0a04ae6e163fe21df2b": { + "balance": "0x152d02c7e14af6800000" }, - "2a63590efe9986c3fee09b0a0a338b15bed91f21": { - "balance": "6458400000000000000000" + "0x2a63590efe9986c3fee09b0a0a338b15bed91f21": { + "balance": "0x15e1c4e05ee26d00000" }, - "50e1c8ec98415bef442618708799437b86e6c205": { - "balance": "6000000000000000000000" + "0x50e1c8ec98415bef442618708799437b86e6c205": { + "balance": "0x14542ba12a337c00000" }, - "33f4a6471eb1bca6a9f85b3b4872e10755c82be1": { - "balance": "2000000000000000000000" + "0x33f4a6471eb1bca6a9f85b3b4872e10755c82be1": { + "balance": "0x6c6b935b8bbd400000" }, - "9c49deff47085fc09704caa2dca8c287a9a137da": { - "balance": "8000000000000000000000" + "0x9c49deff47085fc09704caa2dca8c287a9a137da": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "e1173a247d29d8238df0922f4df25a05f2af77c3": { - "balance": "40007051000000000000000" + "0xe1173a247d29d8238df0922f4df25a05f2af77c3": { + "balance": "0x878c95d560f30478000" }, - "51891b2ccdd2f5a44b2a8bc49a5d9bca6477251c": { - "balance": "310000000000000000000" + "0x51891b2ccdd2f5a44b2a8bc49a5d9bca6477251c": { + "balance": "0x10ce1d3d8cb3180000" }, - "ecaf3350b7ce144d068b186010852c84dd0ce0f0": { - "balance": "2000000000000000000000" + "0xecaf3350b7ce144d068b186010852c84dd0ce0f0": { + "balance": "0x6c6b935b8bbd400000" }, - "72393d37b451effb9e1ff3b8552712e2a970d8c2": { - "balance": "985000000000000000000" + "0x72393d37b451effb9e1ff3b8552712e2a970d8c2": { + "balance": "0x35659ef93f0fc40000" }, - "1bbc60bcc80e5cdc35c5416a1f0a40a83dae867b": { - "balance": "2000000000000000000000" + "0x1bbc60bcc80e5cdc35c5416a1f0a40a83dae867b": { + "balance": "0x6c6b935b8bbd400000" }, - "b8ab39805bd821184f6cbd3d2473347b12bf175c": { - "balance": "118200000000000000000" + "0xb8ab39805bd821184f6cbd3d2473347b12bf175c": { + "balance": "0x6685ac1bfe32c0000" }, - "c55a6b4761fd11e8c85f15174d74767cd8bd9a68": { - "balance": "133700000000000000000" + "0xc55a6b4761fd11e8c85f15174d74767cd8bd9a68": { + "balance": "0x73f75d1a085ba0000" }, - "99d1b585965f406a42a49a1ca70f769e765a3f98": { - "balance": "16700000000000000000000" + "0x99d1b585965f406a42a49a1ca70f769e765a3f98": { + "balance": "0x3894f0e6f9b9f700000" }, - "9ab988b505cfee1dbe9cd18e9b5473b9a2d4f536": { - "balance": "320000000000000000000" + "0x9ab988b505cfee1dbe9cd18e9b5473b9a2d4f536": { + "balance": "0x1158e460913d000000" }, - "7fef8c38779fb307ec6f044bebe47f3cfae796f1": { - "balance": "168561000000000000000" + "0x7fef8c38779fb307ec6f044bebe47f3cfae796f1": { + "balance": "0x92340f86cf09e8000" }, - "322d6f9a140d213f4c80cd051afe25c620bf4c7d": { - "balance": "20000000000000000000" + "0x322d6f9a140d213f4c80cd051afe25c620bf4c7d": { + "balance": "0x1158e460913d00000" }, - "3bd9a06d1bd36c4edd27fc0d1f5b088ddae3c72a": { - "balance": "499970000000000000000" + "0x3bd9a06d1bd36c4edd27fc0d1f5b088ddae3c72a": { + "balance": "0x1b1a7a420ba00d0000" }, - "5dcdb6b87a503c6d8a3c65c2cf9a9aa883479a1e": { - "balance": "9200000000000000000000" + "0x5dcdb6b87a503c6d8a3c65c2cf9a9aa883479a1e": { + "balance": "0x1f2bba5d84f99c00000" }, - "6e84c2fd18d8095714a96817189ca21cca62bab1": { - "balance": "340935000000000000000" + "0x6e84c2fd18d8095714a96817189ca21cca62bab1": { + "balance": "0x127b6c702621cd8000" }, - "a5bad86509fbe0e0e3c0e93f6d381f1af6e9d481": { - "balance": "6000000000000000000000" + "0xa5bad86509fbe0e0e3c0e93f6d381f1af6e9d481": { + "balance": "0x14542ba12a337c00000" }, - "3954bdfe0bf587c695a305d9244c3d5bdddac9bb": { - "balance": "19187461000000000000000" + "0x3954bdfe0bf587c695a305d9244c3d5bdddac9bb": { + "balance": "0x410278327f985608000" }, - "63f0e5a752f79f67124eed633ad3fd2705a397d4": { - "balance": "3940000000000000000000" + "0x63f0e5a752f79f67124eed633ad3fd2705a397d4": { + "balance": "0xd5967be4fc3f100000" }, - "33fd718f0b91b5cec88a5dc15eecf0ecefa4ef3d": { - "balance": "432500000000000000000" + "0x33fd718f0b91b5cec88a5dc15eecf0ecefa4ef3d": { + "balance": "0x177224aa844c720000" }, - "68027d19558ed7339a08aee8de3559be063ec2ea": { - "balance": "2000000000000000000000" + "0x68027d19558ed7339a08aee8de3559be063ec2ea": { + "balance": "0x6c6b935b8bbd400000" }, - "96f0462ae6f8b96088f7e9c68c74b9d8ad34b347": { - "balance": "1790000000000000000000" + "0x96f0462ae6f8b96088f7e9c68c74b9d8ad34b347": { + "balance": "0x61093d7c2c6d380000" }, - "f1f391ca92808817b755a8b8f4e2ca08d1fd1108": { - "balance": "6000000000000000000000" + "0xf1f391ca92808817b755a8b8f4e2ca08d1fd1108": { + "balance": "0x14542ba12a337c00000" }, - "7fcf5ba6666f966c5448c17bf1cb0bbcd8019b06": { - "balance": "99999000000000000000" + "0x7fcf5ba6666f966c5448c17bf1cb0bbcd8019b06": { + "balance": "0x56bc3d0aebe498000" }, - "e9b9a2747510e310241d2ece98f56b3301d757e0": { - "balance": "2000000000000000000000" + "0xe9b9a2747510e310241d2ece98f56b3301d757e0": { + "balance": "0x6c6b935b8bbd400000" }, - "2100381d60a5b54adc09d19683a8f6d5bb4bfbcb": { - "balance": "10000000000000000000000" + "0x2100381d60a5b54adc09d19683a8f6d5bb4bfbcb": { + "balance": "0x21e19e0c9bab2400000" }, - "7495ae78c0d90261e2140ef2063104731a60d1ed": { - "balance": "34250000000000000000" + "0x7495ae78c0d90261e2140ef2063104731a60d1ed": { + "balance": "0x1db50718925210000" }, - "dc911cf7dc5dd0813656670528e9338e67034786": { - "balance": "2000000000000000000000" + "0xdc911cf7dc5dd0813656670528e9338e67034786": { + "balance": "0x6c6b935b8bbd400000" }, - "262aed4bc0f4a4b2c6fb35793e835a49189cdfec": { - "balance": "10000000000000000000000" + "0x262aed4bc0f4a4b2c6fb35793e835a49189cdfec": { + "balance": "0x21e19e0c9bab2400000" }, - "9ee93f339e6726ec65eea44f8a4bfe10da3d3282": { - "balance": "2000000000000000000000" + "0x9ee93f339e6726ec65eea44f8a4bfe10da3d3282": { + "balance": "0x6c6b935b8bbd400000" }, - "a3a57b0716132804d60aac281197ff2b3d237b01": { - "balance": "1400000000000000000000" + "0xa3a57b0716132804d60aac281197ff2b3d237b01": { + "balance": "0x4be4e7267b6ae00000" }, - "c799e34e88ff88be7de28e15e4f2a63d0b33c4cb": { - "balance": "200000000000000000000" + "0xc799e34e88ff88be7de28e15e4f2a63d0b33c4cb": { + "balance": "0xad78ebc5ac6200000" }, - "c7506c1019121ff08a2c8c1591a65eb4bdfb4a3f": { - "balance": "600000000000000000000" + "0xc7506c1019121ff08a2c8c1591a65eb4bdfb4a3f": { + "balance": "0x2086ac351052600000" }, - "795ebc2626fc39b0c86294e0e837dcf523553090": { - "balance": "1000000000000000000000" + "0x795ebc2626fc39b0c86294e0e837dcf523553090": { + "balance": "0x3635c9adc5dea00000" }, - "441aca82631324acbfa2468bda325bbd78477bbf": { - "balance": "6000000000000000000000" + "0x441aca82631324acbfa2468bda325bbd78477bbf": { + "balance": "0x14542ba12a337c00000" }, - "9f271d285500d73846b18f733e25dd8b4f5d4a8b": { - "balance": "722000000000000000000" + "0x9f271d285500d73846b18f733e25dd8b4f5d4a8b": { + "balance": "0x2723c346ae18080000" }, - "d77892e2273b235d7689e430e7aeed9cbce8a1f3": { - "balance": "2000000000000000000000" + "0xd77892e2273b235d7689e430e7aeed9cbce8a1f3": { + "balance": "0x6c6b935b8bbd400000" }, - "4f8972838f70c903c9b6c6c46162e99d6216d451": { - "balance": "4610000000000000000000" + "0x4f8972838f70c903c9b6c6c46162e99d6216d451": { + "balance": "0xf9e89a0f2c56c80000" }, - "4c85ed362f24f6b9f04cdfccd022ae535147cbb9": { - "balance": "1500000000000000000000" + "0x4c85ed362f24f6b9f04cdfccd022ae535147cbb9": { + "balance": "0x5150ae84a8cdf00000" }, - "3807eff43aa97c76910a19752dd715ee0182d94e": { - "balance": "250190000000000000000" + "0x3807eff43aa97c76910a19752dd715ee0182d94e": { + "balance": "0xd90156f6fc2fb0000" }, - "3a9e5441d44b243be55b75027a1ceb9eacf50df2": { - "balance": "1000000000000000000000" + "0x3a9e5441d44b243be55b75027a1ceb9eacf50df2": { + "balance": "0x3635c9adc5dea00000" }, - "3deae43327913f62808faa1b6276a2bd6368ead9": { - "balance": "2000000000000000000000" + "0x3deae43327913f62808faa1b6276a2bd6368ead9": { + "balance": "0x6c6b935b8bbd400000" }, - "c270456885342b640b4cfc1b520e1a544ee0d571": { - "balance": "1820000000000000000000" + "0xc270456885342b640b4cfc1b520e1a544ee0d571": { + "balance": "0x62a992e53a0af00000" }, - "77798f201257b9c35204957057b54674aefa51df": { - "balance": "149000000000000000000" + "0x77798f201257b9c35204957057b54674aefa51df": { + "balance": "0x813ca56906d340000" }, - "225f9eb3fb6ff3e9e3c8447e14a66e8d4f3779f6": { - "balance": "2000000000000000000000" + "0x225f9eb3fb6ff3e9e3c8447e14a66e8d4f3779f6": { + "balance": "0x6c6b935b8bbd400000" }, - "78df2681d6d602e22142d54116dea15d454957aa": { - "balance": "298000000000000000000" + "0x78df2681d6d602e22142d54116dea15d454957aa": { + "balance": "0x102794ad20da680000" }, - "283396ce3cac398bcbe7227f323e78ff96d08767": { - "balance": "400000000000000000000" + "0x283396ce3cac398bcbe7227f323e78ff96d08767": { + "balance": "0x15af1d78b58c400000" }, - "747ff7943b71dc4dcdb1668078f83dd7cc4520c2": { - "balance": "60000000000000000000" + "0x747ff7943b71dc4dcdb1668078f83dd7cc4520c2": { + "balance": "0x340aad21b3b700000" }, - "a4ed11b072d89fb136759fc69b428c48aa5d4ced": { - "balance": "262800000000000000000" + "0xa4ed11b072d89fb136759fc69b428c48aa5d4ced": { + "balance": "0xe3f1527a03ca80000" }, - "cc043c4388d345f884c6855e71142a9f41fd6935": { - "balance": "20000000000000000000" + "0xcc043c4388d345f884c6855e71142a9f41fd6935": { + "balance": "0x1158e460913d00000" }, - "ab14d221e33d544629198cd096ed63dfa28d9f47": { - "balance": "6000000000000000000000" + "0xab14d221e33d544629198cd096ed63dfa28d9f47": { + "balance": "0x14542ba12a337c00000" }, - "251e6838f7cec5b383c1d90146341274daf8e502": { - "balance": "147510000000000000000" + "0x251e6838f7cec5b383c1d90146341274daf8e502": { + "balance": "0x7ff1ccb7561df0000" }, - "36a0e61e1be47fa87e30d32888ee0330901ca991": { - "balance": "20000000000000000000" + "0x36a0e61e1be47fa87e30d32888ee0330901ca991": { + "balance": "0x1158e460913d00000" }, - "bcfc98e5c82b6adb180a3fcb120b9a7690c86a3f": { - "balance": "1970000000000000000000" + "0xbcfc98e5c82b6adb180a3fcb120b9a7690c86a3f": { + "balance": "0x6acb3df27e1f880000" }, - "18a6d2fc52be73084023c91802f05bc24a4be09f": { - "balance": "2000000000000000000000" + "0x18a6d2fc52be73084023c91802f05bc24a4be09f": { + "balance": "0x6c6b935b8bbd400000" }, - "80591a42179f34e64d9df75dcd463b28686f5574": { - "balance": "20000000000000000000000" + "0x80591a42179f34e64d9df75dcd463b28686f5574": { + "balance": "0x43c33c1937564800000" }, - "881230047c211d2d5b00d8de4c5139de5e3227c7": { - "balance": "10000000000000000000000" + "0x881230047c211d2d5b00d8de4c5139de5e3227c7": { + "balance": "0x21e19e0c9bab2400000" }, - "9eb1ff71798f28d6e989fa1ea0588e27ba86cb7d": { - "balance": "140800000000000000000" + "0x9eb1ff71798f28d6e989fa1ea0588e27ba86cb7d": { + "balance": "0x7a1fe160277000000" }, - "a01fd1906a908506dedae1e208128872b56ee792": { - "balance": "3000000000000000000000" + "0xa01fd1906a908506dedae1e208128872b56ee792": { + "balance": "0xa2a15d09519be00000" }, - "1b05ea6a6ac8af7cb6a8b911a8cce8fe1a2acfc8": { - "balance": "2000000000000000000000" + "0x1b05ea6a6ac8af7cb6a8b911a8cce8fe1a2acfc8": { + "balance": "0x6c6b935b8bbd400000" }, - "6add932193cd38494aa3f03aeccc4b7ab7fabca2": { - "balance": "89600000000000000000" + "0x6add932193cd38494aa3f03aeccc4b7ab7fabca2": { + "balance": "0x4db73254763000000" }, - "2aaa35274d742546670b7426264521032af4f4c3": { - "balance": "10000000000000000000000" + "0x2aaa35274d742546670b7426264521032af4f4c3": { + "balance": "0x21e19e0c9bab2400000" }, - "67b8a6e90fdf0a1cac441793301e8750a9fa7957": { - "balance": "895000000000000000000" + "0x67b8a6e90fdf0a1cac441793301e8750a9fa7957": { + "balance": "0x30849ebe16369c0000" }, - "5b5be0d8c67276baabd8edb30d48ea75640b8b29": { - "balance": "824480000000000000000" + "0x5b5be0d8c67276baabd8edb30d48ea75640b8b29": { + "balance": "0x2cb1f55fb7be100000" }, - "28d7e5866f1d85fd1ceb32bfbe1dfc36db434566": { - "balance": "7199000000000000000000" + "0x28d7e5866f1d85fd1ceb32bfbe1dfc36db434566": { + "balance": "0x1864231c610351c0000" }, - "98e3e90b28fccaee828779b8d40a5568c4116e21": { - "balance": "40000000000000000000" + "0x98e3e90b28fccaee828779b8d40a5568c4116e21": { + "balance": "0x22b1c8c1227a00000" }, - "2dd578f7407dfbd548d05e95ccc39c485429626a": { - "balance": "4200000000000000000000" + "0x2dd578f7407dfbd548d05e95ccc39c485429626a": { + "balance": "0xe3aeb5737240a00000" }, - "8ca6989746b06e32e2487461b1ce996a273acfd7": { - "balance": "20000000000000000000" + "0x8ca6989746b06e32e2487461b1ce996a273acfd7": { + "balance": "0x1158e460913d00000" }, - "a6f93307f8bce03195fece872043e8a03f7bd11a": { - "balance": "2886000000000000000000" + "0xa6f93307f8bce03195fece872043e8a03f7bd11a": { + "balance": "0x9c734bad5111580000" }, - "efbd52f97da5fd3a673a46cbf330447b7e8aad5c": { - "balance": "100033000000000000000" + "0xefbd52f97da5fd3a673a46cbf330447b7e8aad5c": { + "balance": "0x56c3c9b80a0a68000" }, - "52bdd9af5978850bc24110718b3723759b437e59": { - "balance": "1730000000000000000000" + "0x52bdd9af5978850bc24110718b3723759b437e59": { + "balance": "0x5dc892aa1131c80000" }, - "6e073b66d1b8c66744d88096a8dd99ec7e0228da": { - "balance": "4000000000000000000000" + "0x6e073b66d1b8c66744d88096a8dd99ec7e0228da": { + "balance": "0xd8d726b7177a800000" }, - "a29d661a6376f66d0b74e2fe9d8f26c0247ec84c": { - "balance": "4117300000000000000000" + "0xa29d661a6376f66d0b74e2fe9d8f26c0247ec84c": { + "balance": "0xdf3304079c13d20000" }, - "7d34ff59ae840a7413c6ba4c5bb2ba2c75eab018": { - "balance": "3000000000000000000000" + "0x7d34ff59ae840a7413c6ba4c5bb2ba2c75eab018": { + "balance": "0xa2a15d09519be00000" }, - "2eca6a3c5d9f449d0956bd43fa7b4d7be8435958": { - "balance": "2000020000000000000000" + "0x2eca6a3c5d9f449d0956bd43fa7b4d7be8435958": { + "balance": "0x6c6bda69709cc20000" }, - "f59f9f02bbc98efe097eabb78210979021898bfd": { - "balance": "9999800000000000000000" + "0xf59f9f02bbc98efe097eabb78210979021898bfd": { + "balance": "0x21e171a3ec9f72c0000" }, - "90e300ac71451e401f887f6e7728851647a80e07": { - "balance": "400000000000000000000" + "0x90e300ac71451e401f887f6e7728851647a80e07": { + "balance": "0x15af1d78b58c400000" }, - "05ae7fd4bbcc80ca11a90a1ec7a301f7cccc83db": { - "balance": "910000000000000000000" + "0x05ae7fd4bbcc80ca11a90a1ec7a301f7cccc83db": { + "balance": "0x3154c9729d05780000" }, - "e54102534de8f23effb093b31242ad3b233facfd": { - "balance": "4000000000000000000000" + "0xe54102534de8f23effb093b31242ad3b233facfd": { + "balance": "0xd8d726b7177a800000" }, - "c127aab59065a28644a56ba3f15e2eac13da2995": { - "balance": "600000000000000000000" + "0xc127aab59065a28644a56ba3f15e2eac13da2995": { + "balance": "0x2086ac351052600000" }, - "ed60c4ab6e540206317e35947a63a9ca6b03e2cb": { - "balance": "57275000000000000000" + "0xed60c4ab6e540206317e35947a63a9ca6b03e2cb": { + "balance": "0x31ad9ad0b467f8000" }, - "d855b03ccb029a7747b1f07303e0a664793539c8": { - "balance": "2000000000000000000000" + "0xd855b03ccb029a7747b1f07303e0a664793539c8": { + "balance": "0x6c6b935b8bbd400000" }, - "1178501ff94add1c5881fe886136f6dfdbe61a94": { - "balance": "158000000000000000000" + "0x1178501ff94add1c5881fe886136f6dfdbe61a94": { + "balance": "0x890b0c2e14fb80000" }, - "f447108b98df64b57e871033885c1ad71db1a3f9": { - "balance": "6916709000000000000000" + "0xf447108b98df64b57e871033885c1ad71db1a3f9": { + "balance": "0x176f49ead3483508000" }, - "deee2689fa9006b59cf285237de53b3a7fd01438": { - "balance": "450034000000000000000" + "0xdeee2689fa9006b59cf285237de53b3a7fd01438": { + "balance": "0x186579f29e20250000" }, - "7f01dc7c3747ca608f983dfc8c9b39e755a3b914": { - "balance": "206980000000000000000" + "0x7f01dc7c3747ca608f983dfc8c9b39e755a3b914": { + "balance": "0xb386cad5f7a5a0000" }, - "9edeac4c026b93054dc5b1d6610c6f3960f2ad73": { - "balance": "1200000000000000000000" + "0x9edeac4c026b93054dc5b1d6610c6f3960f2ad73": { + "balance": "0x410d586a20a4c00000" }, - "e3cffe239c64e7e20388e622117391301b298696": { - "balance": "500000000000000000000" + "0xe3cffe239c64e7e20388e622117391301b298696": { + "balance": "0x1b1ae4d6e2ef500000" }, - "ebbb4f2c3da8be3eb62d1ffb1f950261cf98ecda": { - "balance": "2000000000000000000000" + "0xebbb4f2c3da8be3eb62d1ffb1f950261cf98ecda": { + "balance": "0x6c6b935b8bbd400000" }, - "38c10b90c859cbb7815692f99dae520ab5febf5e": { - "balance": "13169000000000000000000" + "0x38c10b90c859cbb7815692f99dae520ab5febf5e": { + "balance": "0x2c9e4966fa5cf240000" }, - "23f9ecf3e5dddca38815d3e59ed34b5b90b4a353": { - "balance": "204608000000000000000" + "0x23f9ecf3e5dddca38815d3e59ed34b5b90b4a353": { + "balance": "0xb1781a3f0bb200000" }, - "d7fa5ffb6048f96fb1aba09ef87b1c11dd7005e4": { - "balance": "1000000000000000000000" + "0xd7fa5ffb6048f96fb1aba09ef87b1c11dd7005e4": { + "balance": "0x3635c9adc5dea00000" }, - "9ca42ee7a0b898f6a5cc60b5a5d7b1bfa3c33231": { - "balance": "2000000000000000000000" + "0x9ca42ee7a0b898f6a5cc60b5a5d7b1bfa3c33231": { + "balance": "0x6c6b935b8bbd400000" }, - "8b9577920053b1a00189304d888010d9ef2cb4bf": { - "balance": "500000000000000000000" + "0x8b9577920053b1a00189304d888010d9ef2cb4bf": { + "balance": "0x1b1ae4d6e2ef500000" }, - "fcd0b4827cd208ffbf5e759dba8c3cc61d8c2c3c": { - "balance": "8000000000000000000000" + "0xfcd0b4827cd208ffbf5e759dba8c3cc61d8c2c3c": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "01ff1eb1dead50a7f2f9638fdee6eccf3a7b2ac8": { - "balance": "600000000000000000000" + "0x01ff1eb1dead50a7f2f9638fdee6eccf3a7b2ac8": { + "balance": "0x2086ac351052600000" }, - "abde147b2af789eaa586547e66c4fa2664d328a4": { - "balance": "247545000000000000000" + "0xabde147b2af789eaa586547e66c4fa2664d328a4": { + "balance": "0xd6b6081f34c128000" }, - "64042ba68b12d4c151651ca2813b7352bd56f08e": { - "balance": "600000000000000000000" + "0x64042ba68b12d4c151651ca2813b7352bd56f08e": { + "balance": "0x2086ac351052600000" }, - "dccca42045ec3e16508b603fd936e7fd7de5f36a": { - "balance": "19700000000000000000" + "0xdccca42045ec3e16508b603fd936e7fd7de5f36a": { + "balance": "0x11164759ffb320000" }, - "e77a89bd45dc04eeb4e41d7b596b707e6e51e74c": { - "balance": "12000000000000000000000" + "0xe77a89bd45dc04eeb4e41d7b596b707e6e51e74c": { + "balance": "0x28a857425466f800000" }, - "f77c7b845149efba19e261bc7c75157908afa990": { - "balance": "2000000000000000000000" + "0xf77c7b845149efba19e261bc7c75157908afa990": { + "balance": "0x6c6b935b8bbd400000" }, - "fa5201fe1342af11307b9142a041243ca92e2f09": { - "balance": "152150000000000000000000" + "0xfa5201fe1342af11307b9142a041243ca92e2f09": { + "balance": "0x2038116a3ac043980000" }, - "40df495ecf3f8b4cef2a6c189957248fe884bc2b": { - "balance": "12000000000000000000000" + "0x40df495ecf3f8b4cef2a6c189957248fe884bc2b": { + "balance": "0x28a857425466f800000" }, - "3d79a853d71be0621b44e29759656ca075fdf409": { - "balance": "2000000000000000000000" + "0x3d79a853d71be0621b44e29759656ca075fdf409": { + "balance": "0x6c6b935b8bbd400000" }, - "6de02f2dd67efdb7393402fa9eaacbcf589d2e56": { - "balance": "1182000000000000000000" + "0x6de02f2dd67efdb7393402fa9eaacbcf589d2e56": { + "balance": "0x40138b917edfb80000" }, - "729aad4627744e53f5d66309aa74448b3acdf46f": { - "balance": "2000000000000000000000" + "0x729aad4627744e53f5d66309aa74448b3acdf46f": { + "balance": "0x6c6b935b8bbd400000" }, - "4e4318f5e13e824a54edfe30a7ed4f26cd3da504": { - "balance": "2000000000000000000000" + "0x4e4318f5e13e824a54edfe30a7ed4f26cd3da504": { + "balance": "0x6c6b935b8bbd400000" }, - "c6a286e065c85f3af74812ed8bd3a8ce5d25e21d": { - "balance": "18200000000000000000" + "0xc6a286e065c85f3af74812ed8bd3a8ce5d25e21d": { + "balance": "0xfc936392801c0000" }, - "fd686de53fa97f99639e2568549720bc588c9efc": { - "balance": "1969606000000000000000" + "0xfd686de53fa97f99639e2568549720bc588c9efc": { + "balance": "0x6ac5c62d9486070000" }, - "06b0ff834073cce1cbc9ea557ea87b605963e8b4": { - "balance": "300000000000000000000" + "0x06b0ff834073cce1cbc9ea557ea87b605963e8b4": { + "balance": "0x1043561a8829300000" }, - "72b5633fe477fe542e742facfd690c137854f216": { - "balance": "1670000000000000000000" + "0x72b5633fe477fe542e742facfd690c137854f216": { + "balance": "0x5a87e7d7f5f6580000" }, - "8bf373d076814cbc57e1c6d16a82c5be13c73d37": { - "balance": "200000000000000000000" + "0x8bf373d076814cbc57e1c6d16a82c5be13c73d37": { + "balance": "0xad78ebc5ac6200000" }, - "cf264e6925130906c4d7c18591aa41b2a67f6f58": { - "balance": "2000000000000000000000" + "0xcf264e6925130906c4d7c18591aa41b2a67f6f58": { + "balance": "0x6c6b935b8bbd400000" }, - "0ea2a210312b3e867ee0d1cc682ce1d666f18ed5": { - "balance": "10000000000000000000000" + "0x0ea2a210312b3e867ee0d1cc682ce1d666f18ed5": { + "balance": "0x21e19e0c9bab2400000" }, - "d02afecf8e2ec2b62ac8ad204161fd1fae771d0e": { - "balance": "2000000000000000000000" + "0xd02afecf8e2ec2b62ac8ad204161fd1fae771d0e": { + "balance": "0x6c6b935b8bbd400000" }, - "e6b20f980ad853ad04cbfc887ce6601c6be0b24c": { - "balance": "4000000000000000000000" + "0xe6b20f980ad853ad04cbfc887ce6601c6be0b24c": { + "balance": "0xd8d726b7177a800000" }, - "4280a58f8bb10b9440de94f42b4f592120820191": { - "balance": "2000000000000000000000" + "0x4280a58f8bb10b9440de94f42b4f592120820191": { + "balance": "0x6c6b935b8bbd400000" }, - "a914cdb571bfd93d64da66a4e108ea134e50d000": { - "balance": "1430143000000000000000" + "0xa914cdb571bfd93d64da66a4e108ea134e50d000": { + "balance": "0x4d8738994713798000" }, - "60864236930d04d8402b5dcbeb807f3caf611ea2": { - "balance": "4000000000000000000000" + "0x60864236930d04d8402b5dcbeb807f3caf611ea2": { + "balance": "0xd8d726b7177a800000" }, - "f9dd239008182fb519fb30eedd2093fed1639be8": { - "balance": "500000000000000000000" + "0xf9dd239008182fb519fb30eedd2093fed1639be8": { + "balance": "0x1b1ae4d6e2ef500000" }, - "18e53243981aabc8767da10c73449f1391560eaa": { - "balance": "6000000000000000000000" + "0x18e53243981aabc8767da10c73449f1391560eaa": { + "balance": "0x14542ba12a337c00000" }, - "c3a9226ae275df2cab312b911040634a9c9c9ef6": { - "balance": "4000000000000000000000" + "0xc3a9226ae275df2cab312b911040634a9c9c9ef6": { + "balance": "0xd8d726b7177a800000" }, - "4fcc19ea9f4c57dcbce893193cfb166aa914edc5": { - "balance": "7001380000000000000000" + "0x4fcc19ea9f4c57dcbce893193cfb166aa914edc5": { + "balance": "0x17b8baa7f19546a0000" }, - "c1e1409ca52c25435134d006c2a6a8542dfb7273": { - "balance": "34380000000000000000" + "0xc1e1409ca52c25435134d006c2a6a8542dfb7273": { + "balance": "0x1dd1e4bd8d1ee0000" }, - "981ddf0404e4d22dda556a0726f00b2d98ab9569": { - "balance": "999972000000000000000" + "0x981ddf0404e4d22dda556a0726f00b2d98ab9569": { + "balance": "0x36356633ebd8ea0000" }, - "e5bcc88c3b256f6ed5fe550e4a18198b943356ad": { - "balance": "2000000000000000000000" + "0xe5bcc88c3b256f6ed5fe550e4a18198b943356ad": { + "balance": "0x6c6b935b8bbd400000" }, - "74a17f064b344e84db6365da9591ff1628257643": { - "balance": "20000000000000000000" + "0x74a17f064b344e84db6365da9591ff1628257643": { + "balance": "0x1158e460913d00000" }, - "2720f9ca426ef2f2cbd2fecd39920c4f1a89e16d": { - "balance": "2000000000000000000000" + "0x2720f9ca426ef2f2cbd2fecd39920c4f1a89e16d": { + "balance": "0x6c6b935b8bbd400000" }, - "8d04a5ebfb5db409db0617c9fa5631c192861f4a": { - "balance": "970000000000000000000" + "0x8d04a5ebfb5db409db0617c9fa5631c192861f4a": { + "balance": "0x34957444b840e80000" }, - "f18b14cbf6694336d0fe12ac1f25df2da0c05dbb": { - "balance": "3999800000000000000000" + "0xf18b14cbf6694336d0fe12ac1f25df2da0c05dbb": { + "balance": "0xd8d4602c26bf6c0000" }, - "56ac20d63bd803595cec036da7ed1dc66e0a9e07": { - "balance": "63927000000000000000" + "0x56ac20d63bd803595cec036da7ed1dc66e0a9e07": { + "balance": "0x3772a53ccdc658000" }, - "92c94c2820dfcf7156e6f13088ece7958b3676fd": { - "balance": "95500000000000000000" + "0x92c94c2820dfcf7156e6f13088ece7958b3676fd": { + "balance": "0x52d542804f1ce0000" }, - "968dea60df3e09ae3c8d3505e9c080454be0e819": { - "balance": "6000000000000000000000" + "0x968dea60df3e09ae3c8d3505e9c080454be0e819": { + "balance": "0x14542ba12a337c00000" }, - "9268d62646563611dc3b832a30aa2394c64613e3": { - "balance": "2000000000000000000000" + "0x9268d62646563611dc3b832a30aa2394c64613e3": { + "balance": "0x6c6b935b8bbd400000" }, - "5a192b964afd80773e5f5eda6a56f14e25e0c6f3": { - "balance": "500000000000000000000" + "0x5a192b964afd80773e5f5eda6a56f14e25e0c6f3": { + "balance": "0x1b1ae4d6e2ef500000" }, - "df8d48b1eb07b3c217790e6c2df04dc319e7e848": { - "balance": "500000000000000000000" + "0xdf8d48b1eb07b3c217790e6c2df04dc319e7e848": { + "balance": "0x1b1ae4d6e2ef500000" }, - "7f61fa6cf5f898b440dac5abd8600d6d691fdef9": { - "balance": "280000000000000000000" + "0x7f61fa6cf5f898b440dac5abd8600d6d691fdef9": { + "balance": "0xf2dc7d47f15600000" }, - "929d368eb46a2d1fbdc8ffa0607ede4ba88f59ad": { - "balance": "2000000000000000000000" + "0x929d368eb46a2d1fbdc8ffa0607ede4ba88f59ad": { + "balance": "0x6c6b935b8bbd400000" }, - "9982a5890ffb5406d3aca8d2bfc1dd70aaa80ae0": { - "balance": "2000000000000000000000" + "0x9982a5890ffb5406d3aca8d2bfc1dd70aaa80ae0": { + "balance": "0x6c6b935b8bbd400000" }, - "bf2aea5a1dcf6ed3b5e8323944e983fedfd1acfb": { - "balance": "1580000000000000000000" + "0xbf2aea5a1dcf6ed3b5e8323944e983fedfd1acfb": { + "balance": "0x55a6e79ccd1d300000" }, - "46aa501870677e7f0a504876b4e8801a0ad01c46": { - "balance": "800000000000000000000" + "0x46aa501870677e7f0a504876b4e8801a0ad01c46": { + "balance": "0x2b5e3af16b18800000" }, - "8f473d0ab876ddaa15608621d7013e6ff714b675": { - "balance": "470400000000000000000" + "0x8f473d0ab876ddaa15608621d7013e6ff714b675": { + "balance": "0x19801c83b6c7c00000" }, - "02290fb5f9a517f82845acdeca0fc846039be233": { - "balance": "2000000000000000000000" + "0x02290fb5f9a517f82845acdeca0fc846039be233": { + "balance": "0x6c6b935b8bbd400000" }, - "8a5831282ce14a657a730dc18826f7f9b99db968": { - "balance": "4330268000000000000000" + "0x8a5831282ce14a657a730dc18826f7f9b99db968": { + "balance": "0xeabe8a5b41c1360000" }, - "0328510c09dbcd85194a98d67c33ac49f2f94d60": { - "balance": "11000000000000000000000" + "0x0328510c09dbcd85194a98d67c33ac49f2f94d60": { + "balance": "0x2544faa778090e00000" }, - "cf883a20329667ea226a1e3c765dbb6bab32219f": { - "balance": "3038972000000000000000" + "0xcf883a20329667ea226a1e3c765dbb6bab32219f": { + "balance": "0xa4be3564d616660000" }, - "2615100ea7e25bba9bca746058afbbb4ffbe4244": { - "balance": "500000000000000000000" + "0x2615100ea7e25bba9bca746058afbbb4ffbe4244": { + "balance": "0x1b1ae4d6e2ef500000" }, - "b115ee3ab7641e1aa6d000e41bfc1ec7210c2f32": { - "balance": "13000000000000000000000" + "0xb115ee3ab7641e1aa6d000e41bfc1ec7210c2f32": { + "balance": "0x2c0bb3dd30c4e200000" }, - "5cfa8d568575658ca4c1a593ac4c5d0e44c60745": { - "balance": "291000000000000000000" + "0x5cfa8d568575658ca4c1a593ac4c5d0e44c60745": { + "balance": "0xfc66fae3746ac0000" }, - "d3c24d4b3a5e0ff8a4622d518edd73f16ab28610": { - "balance": "20000000000000000000" + "0xd3c24d4b3a5e0ff8a4622d518edd73f16ab28610": { + "balance": "0x1158e460913d00000" }, - "a639acd96b31ba53b0d08763229e1f06fd105e9d": { - "balance": "8000000000000000000000" + "0xa639acd96b31ba53b0d08763229e1f06fd105e9d": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "ffa4aff1a37f984b0a67272149273ae9bd41e3bc": { - "balance": "10000000000000000000000" + "0xffa4aff1a37f984b0a67272149273ae9bd41e3bc": { + "balance": "0x21e19e0c9bab2400000" }, - "cf684dfb8304729355b58315e8019b1aa2ad1bac": { - "balance": "432500000000000000000" + "0xcf684dfb8304729355b58315e8019b1aa2ad1bac": { + "balance": "0x177224aa844c720000" }, - "5797b60fd2894ab3c2f4aede86daf2e788d745ad": { - "balance": "6000000000000000000000" + "0x5797b60fd2894ab3c2f4aede86daf2e788d745ad": { + "balance": "0x14542ba12a337c00000" }, - "a6a0de421ae54f6d17281308f5646d2f39f7775d": { - "balance": "2000000000000000000000" + "0xa6a0de421ae54f6d17281308f5646d2f39f7775d": { + "balance": "0x6c6b935b8bbd400000" }, - "08504f05643fab5919f5eea55925d7a3ed7d807a": { - "balance": "20000000000000000000" + "0x08504f05643fab5919f5eea55925d7a3ed7d807a": { + "balance": "0x1158e460913d00000" }, - "7a7068e1c3375c0e599db1fbe6b2ea23b8f407d2": { - "balance": "2000000000000000000000" + "0x7a7068e1c3375c0e599db1fbe6b2ea23b8f407d2": { + "balance": "0x6c6b935b8bbd400000" }, - "1078d7f61b0e56c74ee6635b2e1819ef1e3d8785": { - "balance": "1000000000000000000000" + "0x1078d7f61b0e56c74ee6635b2e1819ef1e3d8785": { + "balance": "0x3635c9adc5dea00000" }, - "6e12b51e225b4a4372e59ad7a2a1a13ea3d3a137": { - "balance": "14172200000000000000000" + "0x6e12b51e225b4a4372e59ad7a2a1a13ea3d3a137": { + "balance": "0x30046c8cc775f040000" }, - "6a2e86469a5bf37cee82e88b4c3863895d28fcaf": { - "balance": "519000000000000000000" + "0x6a2e86469a5bf37cee82e88b4c3863895d28fcaf": { + "balance": "0x1c229266385bbc0000" }, - "197672fd39d6f246ce66a790d13aa922d70ea109": { - "balance": "1000000000000000000000" + "0x197672fd39d6f246ce66a790d13aa922d70ea109": { + "balance": "0x3635c9adc5dea00000" }, - "8009a7cbd192b3aed4adb983d5284552c16c7451": { - "balance": "4000000000000000000000" + "0x8009a7cbd192b3aed4adb983d5284552c16c7451": { + "balance": "0xd8d726b7177a800000" }, - "f6c3c48a1ac0a34799f04db86ec7a975fe7768f3": { - "balance": "1970000000000000000000" + "0xf6c3c48a1ac0a34799f04db86ec7a975fe7768f3": { + "balance": "0x6acb3df27e1f880000" }, - "16be75e98a995a395222d00bd79ff4b6e638e191": { - "balance": "36000000000000000000000" + "0x16be75e98a995a395222d00bd79ff4b6e638e191": { + "balance": "0x79f905c6fd34e800000" }, - "6c05e34e5ef2f42ed09deff1026cd66bcb6960bb": { - "balance": "2000000000000000000000" + "0x6c05e34e5ef2f42ed09deff1026cd66bcb6960bb": { + "balance": "0x6c6b935b8bbd400000" }, - "5d6ae8cbd6b3393c22d16254100d0238e808147c": { - "balance": "719992000000000000000" + "0x5d6ae8cbd6b3393c22d16254100d0238e808147c": { + "balance": "0x2707e56d51a30c0000" }, - "1a376e1b2d2f590769bb858d4575320d4e149970": { - "balance": "4841200000000000000000" + "0x1a376e1b2d2f590769bb858d4575320d4e149970": { + "balance": "0x106712576391d180000" }, - "f6ead67dbf5b7eb13358e10f36189d53e643cfcf": { - "balance": "40000000000000000000000" + "0xf6ead67dbf5b7eb13358e10f36189d53e643cfcf": { + "balance": "0x878678326eac9000000" }, - "467d5988249a68614716659840ed0ae6f6f457bc": { - "balance": "387500000000000000000" + "0x467d5988249a68614716659840ed0ae6f6f457bc": { + "balance": "0x1501a48cefdfde0000" }, - "aa960e10c52391c54e15387cc67af827b5316dcc": { - "balance": "2000000000000000000000" + "0xaa960e10c52391c54e15387cc67af827b5316dcc": { + "balance": "0x6c6b935b8bbd400000" }, - "483ba99034e900e3aedf61499d3b2bce39beb7aa": { - "balance": "985000000000000000000" + "0x483ba99034e900e3aedf61499d3b2bce39beb7aa": { + "balance": "0x35659ef93f0fc40000" }, - "86f23e9c0aafc78b9c404dcd60339a925bffa266": { - "balance": "400000000000000000000" + "0x86f23e9c0aafc78b9c404dcd60339a925bffa266": { + "balance": "0x15af1d78b58c400000" }, - "d05a447c911dbb275bfb2e5a37e5a703a56f9997": { - "balance": "200000000000000000000" + "0xd05a447c911dbb275bfb2e5a37e5a703a56f9997": { + "balance": "0xad78ebc5ac6200000" }, - "edb71ec41bda7dce86e766e6e8c3e9907723a69b": { - "balance": "20000000000000000000" + "0xedb71ec41bda7dce86e766e6e8c3e9907723a69b": { + "balance": "0x1158e460913d00000" }, - "f86a3ea8071f7095c7db8a05ae507a8929dbb876": { - "balance": "336000000000000000000" + "0xf86a3ea8071f7095c7db8a05ae507a8929dbb876": { + "balance": "0x1236efcbcbb3400000" }, - "323b3cfe3ee62bbde2a261e53cb3ecc05810f2c6": { - "balance": "13790000000000000000000" + "0x323b3cfe3ee62bbde2a261e53cb3ecc05810f2c6": { + "balance": "0x2eb8eb1a172dcb80000" }, - "936f3813f5f6a13b8e4ffec83fe7f826186a71cd": { - "balance": "520000000000000000000" + "0x936f3813f5f6a13b8e4ffec83fe7f826186a71cd": { + "balance": "0x1c30731cec03200000" }, - "6db72bfd43fef465ca5632b45aab7261404e13bf": { - "balance": "2000000000000000000000" + "0x6db72bfd43fef465ca5632b45aab7261404e13bf": { + "balance": "0x6c6b935b8bbd400000" }, - "9bb76204186af2f63be79168601687fc9bad661f": { - "balance": "300000000000000000000" + "0x9bb76204186af2f63be79168601687fc9bad661f": { + "balance": "0x1043561a8829300000" }, - "28ab165ffb69eda0c549ae38e9826f5f7f92f853": { - "balance": "1296890000000000000000" + "0x28ab165ffb69eda0c549ae38e9826f5f7f92f853": { + "balance": "0x464df6d7c844590000" }, - "c73e2112282215dc0762f32b7e807dcd1a7aae3e": { - "balance": "6900000000000000000000" + "0xc73e2112282215dc0762f32b7e807dcd1a7aae3e": { + "balance": "0x1760cbc623bb3500000" }, - "f8086e42661ea929d2dda1ab6c748ce3055d111e": { - "balance": "1000000000000000000000" + "0xf8086e42661ea929d2dda1ab6c748ce3055d111e": { + "balance": "0x3635c9adc5dea00000" }, - "4db21284bcd4f787a7556500d6d7d8f36623cf35": { - "balance": "1939806000000000000000" + "0x4db21284bcd4f787a7556500d6d7d8f36623cf35": { + "balance": "0x6928374f77a3630000" }, - "c48651c1d9c16bff4c9554886c3f3f26431f6f68": { - "balance": "658000000000000000000" + "0xc48651c1d9c16bff4c9554886c3f3f26431f6f68": { + "balance": "0x23ab9599c43f080000" }, - "9bdbdc9b973431d13c89a3f9757e9b3b6275bfc7": { - "balance": "499971000000000000000" + "0x9bdbdc9b973431d13c89a3f9757e9b3b6275bfc7": { + "balance": "0x1b1a7dcf8a44d38000" }, - "560da37e956d862f81a75fd580a7135c1b246352": { - "balance": "10000000000000000000000" + "0x560da37e956d862f81a75fd580a7135c1b246352": { + "balance": "0x21e19e0c9bab2400000" }, - "4b60a3e253bf38c8d5662010bb93a473c965c3e5": { - "balance": "1490000000000000000000" + "0x4b60a3e253bf38c8d5662010bb93a473c965c3e5": { + "balance": "0x50c5e761a444080000" }, - "64e02abb016cc23a2934f6bcddb681905021d563": { - "balance": "1000000000000000000000" + "0x64e02abb016cc23a2934f6bcddb681905021d563": { + "balance": "0x3635c9adc5dea00000" }, - "ac2c8e09d06493a63858437bd20be01962450365": { - "balance": "1910000000000000000000" + "0xac2c8e09d06493a63858437bd20be01962450365": { + "balance": "0x678a932062e4180000" }, - "9bf9b3b2f23cf461eb591f28340bc719931c8364": { - "balance": "1000000000000000000000" + "0x9bf9b3b2f23cf461eb591f28340bc719931c8364": { + "balance": "0x3635c9adc5dea00000" }, - "9b5c39f7e0ac168c8ed0ed340477117d1b682ee9": { - "balance": "98000000000000000000" + "0x9b5c39f7e0ac168c8ed0ed340477117d1b682ee9": { + "balance": "0x55005f0c614480000" }, - "f75bb39c799779ebc04a336d260da63146ed98d0": { - "balance": "25000000000000000000" + "0xf75bb39c799779ebc04a336d260da63146ed98d0": { + "balance": "0x15af1d78b58c40000" }, - "a7966c489f4c748a7ae980aa27a574251767caf9": { - "balance": "3000000000000000000000" + "0xa7966c489f4c748a7ae980aa27a574251767caf9": { + "balance": "0xa2a15d09519be00000" }, - "ea53c954f4ed97fd4810111bdab69ef981ef25b9": { - "balance": "17300000000000000000000" + "0xea53c954f4ed97fd4810111bdab69ef981ef25b9": { + "balance": "0x3a9d5baa4abf1d00000" }, - "03a26cfc4c18316f70d59e9e1a79ee3e8b962f4c": { - "balance": "2000000000000000000000" + "0x03a26cfc4c18316f70d59e9e1a79ee3e8b962f4c": { + "balance": "0x6c6b935b8bbd400000" }, - "3e63ce3b24ca2865b4c5a687b7aea3597ef6e548": { - "balance": "2000000000000000000000" + "0x3e63ce3b24ca2865b4c5a687b7aea3597ef6e548": { + "balance": "0x6c6b935b8bbd400000" }, - "500c902958f6421594d1b6ded712490d52ed6c44": { - "balance": "1970000000000000000000" + "0x500c902958f6421594d1b6ded712490d52ed6c44": { + "balance": "0x6acb3df27e1f880000" }, - "6f44ca09f0c6a8294cbd519cdc594ad42c67579f": { - "balance": "50000000000000000000" + "0x6f44ca09f0c6a8294cbd519cdc594ad42c67579f": { + "balance": "0x2b5e3af16b1880000" }, - "3616fb46c81578c9c8eb4d3bf880451a88379d7d": { - "balance": "200000000000000000000" + "0x3616fb46c81578c9c8eb4d3bf880451a88379d7d": { + "balance": "0xad78ebc5ac6200000" }, - "57bc20e2d62b3d19663cdb4c309d5b4f2fc2db8f": { - "balance": "100000000000000000000" + "0x57bc20e2d62b3d19663cdb4c309d5b4f2fc2db8f": { + "balance": "0x56bc75e2d63100000" }, - "1cebf0985d7f680aaa915c44cc62edb49eab269e": { - "balance": "1000000000000000000000" + "0x1cebf0985d7f680aaa915c44cc62edb49eab269e": { + "balance": "0x3635c9adc5dea00000" }, - "c0cbf6032fa39e7c46ff778a94f7d445fe22cf30": { - "balance": "310000000000000000000" + "0xc0cbf6032fa39e7c46ff778a94f7d445fe22cf30": { + "balance": "0x10ce1d3d8cb3180000" }, - "c58b9cc61dedbb98c33f224d271f0e228b583433": { - "balance": "3880000000000000000000" + "0xc58b9cc61dedbb98c33f224d271f0e228b583433": { + "balance": "0xd255d112e103a00000" }, - "e9c6dfae97f7099fc5f4e94b784db802923a1419": { - "balance": "48800000000000000000" + "0xe9c6dfae97f7099fc5f4e94b784db802923a1419": { + "balance": "0x2a53c6d724f100000" }, - "9bacd3d40f3b82ac91a264d9d88d908eac8664b9": { - "balance": "20000000000000000000000" + "0x9bacd3d40f3b82ac91a264d9d88d908eac8664b9": { + "balance": "0x43c33c1937564800000" }, - "63d80048877596e0c28489e650cd4ac180096a49": { - "balance": "280000000000000000000" + "0x63d80048877596e0c28489e650cd4ac180096a49": { + "balance": "0xf2dc7d47f15600000" }, - "e6a6f6dd6f70a456f4ec15ef7ad5e5dbb68bd7dc": { - "balance": "200000000000000000000" + "0xe6a6f6dd6f70a456f4ec15ef7ad5e5dbb68bd7dc": { + "balance": "0xad78ebc5ac6200000" }, - "d418870bc2e4fa7b8a6121ae0872d55247b62501": { - "balance": "1580000000000000000000" + "0xd418870bc2e4fa7b8a6121ae0872d55247b62501": { + "balance": "0x55a6e79ccd1d300000" }, - "e2f9383d5810ea7b43182b8704b62b27f5925d39": { - "balance": "400000000000000000000" + "0xe2f9383d5810ea7b43182b8704b62b27f5925d39": { + "balance": "0x15af1d78b58c400000" }, - "bd5e473abce8f97a6932f77c2facaf9cc0a00514": { - "balance": "1117350000000000000000" + "0xbd5e473abce8f97a6932f77c2facaf9cc0a00514": { + "balance": "0x3c9258a106a6b70000" }, - "2ff1ca55fd9cec1b1fe9f0a9abb74c513c1e2aaa": { - "balance": "3000000000000000000000" + "0x2ff1ca55fd9cec1b1fe9f0a9abb74c513c1e2aaa": { + "balance": "0xa2a15d09519be00000" }, - "9d99b189bbd9a48fc2e16e8fcda33bb99a317bbb": { - "balance": "1126900000000000000000" + "0x9d99b189bbd9a48fc2e16e8fcda33bb99a317bbb": { + "balance": "0x3d16e10b6d8bb20000" }, - "6e96faeda3054302c45f58f161324c99a3eebb62": { - "balance": "20000000000000000000" + "0x6e96faeda3054302c45f58f161324c99a3eebb62": { + "balance": "0x1158e460913d00000" }, - "ef93818f684db0c3675ec81332b3183ecc28a495": { - "balance": "1550000000000000000000" + "0xef93818f684db0c3675ec81332b3183ecc28a495": { + "balance": "0x54069233bf7f780000" }, - "2659facb1e83436553b5b42989adb8075f9953ed": { - "balance": "29356000000000000000" + "0x2659facb1e83436553b5b42989adb8075f9953ed": { + "balance": "0x1976576771a5e0000" }, - "c4ffadaaf2823fbea7bff702021bffc4853eb5c9": { - "balance": "42233000000000000000" + "0xc4ffadaaf2823fbea7bff702021bffc4853eb5c9": { + "balance": "0x24a19c1bd6f128000" }, - "e9864c1afc8eaad37f3ba56fcb7477cc622009b7": { - "balance": "79000000000000000000" + "0xe9864c1afc8eaad37f3ba56fcb7477cc622009b7": { + "balance": "0x448586170a7dc0000" }, - "87ef6d8b6a7cbf9b5c8c97f67ee2adc2a73b3f77": { - "balance": "200400000000000000000" + "0x87ef6d8b6a7cbf9b5c8c97f67ee2adc2a73b3f77": { + "balance": "0xadd1bd23c3c480000" }, - "c043f2452dcb9602ef62bd360e033dd23971fe84": { - "balance": "2000000000000000000000" + "0xc043f2452dcb9602ef62bd360e033dd23971fe84": { + "balance": "0x6c6b935b8bbd400000" }, - "0fdd65402395df9bd19fee4507ef5345f745104c": { - "balance": "5000000000000000000000" + "0x0fdd65402395df9bd19fee4507ef5345f745104c": { + "balance": "0x10f0cf064dd59200000" }, - "939c4313d2280edf5e071bced846063f0a975d54": { - "balance": "120000000000000000000000" + "0x939c4313d2280edf5e071bced846063f0a975d54": { + "balance": "0x1969368974c05b000000" }, - "b28245037cb192f75785cb86cbfe7c930da258b0": { - "balance": "16000000000000000000000" + "0xb28245037cb192f75785cb86cbfe7c930da258b0": { + "balance": "0x3635c9adc5dea000000" }, - "a80cb1738bac08d4f9c08b4deff515545fa8584f": { - "balance": "500000000000000000000" + "0xa80cb1738bac08d4f9c08b4deff515545fa8584f": { + "balance": "0x1b1ae4d6e2ef500000" }, - "62971bf2634cee0be3c9890f51a56099dbb9519b": { - "balance": "656000000000000000000" + "0x62971bf2634cee0be3c9890f51a56099dbb9519b": { + "balance": "0x238fd42c5cf0400000" }, - "f2efe96560c9d97b72bd36447843885c1d90c231": { - "balance": "2000000000000000000000" + "0xf2efe96560c9d97b72bd36447843885c1d90c231": { + "balance": "0x6c6b935b8bbd400000" }, - "0e390f44053ddfcef0d608b35e4d9c2cbe9871bb": { - "balance": "1970000000000000000000" + "0x0e390f44053ddfcef0d608b35e4d9c2cbe9871bb": { + "balance": "0x6acb3df27e1f880000" }, - "61d101a033ee0e2ebb3100ede766df1ad0244954": { - "balance": "500000000000000000000" + "0x61d101a033ee0e2ebb3100ede766df1ad0244954": { + "balance": "0x1b1ae4d6e2ef500000" }, - "6785513cf732e47e87670770b5419be10cd1fc74": { - "balance": "2000000000000000000000" + "0x6785513cf732e47e87670770b5419be10cd1fc74": { + "balance": "0x6c6b935b8bbd400000" }, - "167699f48a78c615512515739958993312574f07": { - "balance": "39000000000000000000" + "0x167699f48a78c615512515739958993312574f07": { + "balance": "0x21d3bd55e803c0000" }, - "68ec79d5be7155716c40941c79d78d17de9ef803": { - "balance": "500600000000000000000" + "0x68ec79d5be7155716c40941c79d78d17de9ef803": { + "balance": "0x1b233877b5208c0000" }, - "a0e8ba661b48154cf843d4c2a5c0f792d528ee29": { - "balance": "400000000000000000000" + "0xa0e8ba661b48154cf843d4c2a5c0f792d528ee29": { + "balance": "0x15af1d78b58c400000" }, - "1a201b4327cea7f399046246a3c87e6e03a3cda8": { - "balance": "1000000000000000000000" + "0x1a201b4327cea7f399046246a3c87e6e03a3cda8": { + "balance": "0x3635c9adc5dea00000" }, - "f60f62d73937953fef35169e11d872d2ea317eec": { - "balance": "5348000000000000000000" + "0xf60f62d73937953fef35169e11d872d2ea317eec": { + "balance": "0x121ea68c114e5100000" }, - "c0c04d0106810e3ec0e54a19f2ab8597e69a573d": { - "balance": "50000000000000000000" + "0xc0c04d0106810e3ec0e54a19f2ab8597e69a573d": { + "balance": "0x2b5e3af16b1880000" }, - "ef47cf073e36f271d522d7fa4e7120ad5007a0bc": { - "balance": "2500000000000000000000" + "0xef47cf073e36f271d522d7fa4e7120ad5007a0bc": { + "balance": "0x878678326eac900000" }, - "a44fe800d96fcad73b7170d0f610cb8c0682d6ce": { - "balance": "4000000000000000000000" + "0xa44fe800d96fcad73b7170d0f610cb8c0682d6ce": { + "balance": "0xd8d726b7177a800000" }, - "010f4a98dfa1d9799bf5c796fb550efbe7ecd877": { - "balance": "8023366000000000000000" + "0x010f4a98dfa1d9799bf5c796fb550efbe7ecd877": { + "balance": "0x1b2f292236292c70000" }, - "708fa11fe33d85ad1befcbae3818acb71f6a7d7e": { - "balance": "18200000000000000000" + "0x708fa11fe33d85ad1befcbae3818acb71f6a7d7e": { + "balance": "0xfc936392801c0000" }, - "b38c4e537b5df930d65a74d043831d6b485bbde4": { - "balance": "400000000000000000000" + "0xb38c4e537b5df930d65a74d043831d6b485bbde4": { + "balance": "0x15af1d78b58c400000" }, - "250a69430776f6347703f9529783955a6197b682": { - "balance": "1940000000000000000000" + "0x250a69430776f6347703f9529783955a6197b682": { + "balance": "0x692ae8897081d00000" }, - "2d35a9df62757f7ffad1049afb06ca4afc464c51": { - "balance": "20000000000000000000" + "0x2d35a9df62757f7ffad1049afb06ca4afc464c51": { + "balance": "0x1158e460913d00000" }, - "6aff1466c2623675e3cb0e75e423d37a25e442eb": { - "balance": "1730000000000000000000" + "0x6aff1466c2623675e3cb0e75e423d37a25e442eb": { + "balance": "0x5dc892aa1131c80000" }, - "fc15cb99a8d1030b12770add033a79ee0d0c908c": { - "balance": "350056000000000000000" + "0xfc15cb99a8d1030b12770add033a79ee0d0c908c": { + "balance": "0x12fa00bd52e6240000" }, - "e784dcc873aa8c1513ec26ff36bc92eac6d4c968": { - "balance": "200000000000000000000" + "0xe784dcc873aa8c1513ec26ff36bc92eac6d4c968": { + "balance": "0xad78ebc5ac6200000" }, - "b1c328fb98f2f19ab6646f0a7c8c566fda5a8540": { - "balance": "2500000000000000000000" + "0xb1c328fb98f2f19ab6646f0a7c8c566fda5a8540": { + "balance": "0x878678326eac900000" }, - "247a0a11c57f0383b949de540b66dee68604b0a1": { - "balance": "1069600000000000000000" + "0x247a0a11c57f0383b949de540b66dee68604b0a1": { + "balance": "0x39fbae8d042dd00000" }, - "1af60343360e0b2d75255210375720df21db5c7d": { - "balance": "1000000000000000000000" + "0x1af60343360e0b2d75255210375720df21db5c7d": { + "balance": "0x3635c9adc5dea00000" }, - "8794bf47d54540ece5c72237a1ffb511ddb74762": { - "balance": "2000000000000000000000" + "0x8794bf47d54540ece5c72237a1ffb511ddb74762": { + "balance": "0x6c6b935b8bbd400000" }, - "e76d945aa89df1e457aa342b31028a5e9130b2ce": { - "balance": "1015200000000000000000" + "0xe76d945aa89df1e457aa342b31028a5e9130b2ce": { + "balance": "0x3708baed3d68900000" }, - "a30e0acb534c9b3084e8501da090b4eb16a2c0cd": { - "balance": "2000000000000000000000" + "0xa30e0acb534c9b3084e8501da090b4eb16a2c0cd": { + "balance": "0x6c6b935b8bbd400000" }, - "7099d12f6ec656899b049a7657065d62996892c8": { - "balance": "400000000000000000000" + "0x7099d12f6ec656899b049a7657065d62996892c8": { + "balance": "0x15af1d78b58c400000" }, - "7be7f2456971883b9a8dbe4c91dec08ac34e8862": { - "balance": "3000000000000000000000" + "0x7be7f2456971883b9a8dbe4c91dec08ac34e8862": { + "balance": "0xa2a15d09519be00000" }, - "42746aeea14f27beff0c0da64253f1e7971890a0": { - "balance": "1550000000000000000000" + "0x42746aeea14f27beff0c0da64253f1e7971890a0": { + "balance": "0x54069233bf7f780000" }, - "736b44503dd2f6dd5469ff4c5b2db8ea4fec65d0": { - "balance": "313950000000000000000" + "0x736b44503dd2f6dd5469ff4c5b2db8ea4fec65d0": { + "balance": "0x1104ee759f21e30000" }, - "822edff636563a6106e52e9a2598f7e6d0ef2782": { - "balance": "36099000000000000000" + "0x822edff636563a6106e52e9a2598f7e6d0ef2782": { + "balance": "0x1f4f9693d42d38000" }, - "03c647a9f929b0781fe9ae01caa3e183e876777e": { - "balance": "445800000000000000000" + "0x03c647a9f929b0781fe9ae01caa3e183e876777e": { + "balance": "0x182ab7c20ce5240000" }, - "63612e7862c27b587cfb6daf9912cb051f030a9f": { - "balance": "43458000000000000000" + "0x63612e7862c27b587cfb6daf9912cb051f030a9f": { + "balance": "0x25b19d4bfe8ed0000" }, - "d46bae61b027e5bb422e83a3f9c93f3c8fc77d27": { - "balance": "2000000000000000000000" + "0xd46bae61b027e5bb422e83a3f9c93f3c8fc77d27": { + "balance": "0x6c6b935b8bbd400000" }, - "5f23ba1f37a96c45bc490259538a54c28ba3b0d5": { - "balance": "1200000000000000000000" + "0x5f23ba1f37a96c45bc490259538a54c28ba3b0d5": { + "balance": "0x410d586a20a4c00000" }, - "d41d7fb49fe701baac257170426cc9b38ca3a9b2": { - "balance": "176000000000000000000" + "0xd41d7fb49fe701baac257170426cc9b38ca3a9b2": { + "balance": "0x98a7d9b8314c00000" }, - "1ebacb7844fdc322f805904fbf1962802db1537c": { - "balance": "10000000000000000000000" + "0x1ebacb7844fdc322f805904fbf1962802db1537c": { + "balance": "0x21e19e0c9bab2400000" }, - "9c80bc18e9f8d4968b185da8c79fa6e11ffc3e23": { - "balance": "240000000000000000000" + "0x9c80bc18e9f8d4968b185da8c79fa6e11ffc3e23": { + "balance": "0xd02ab486cedc00000" }, - "e4ca0a5238564dfc91e8bf22bade2901619a1cd4": { - "balance": "1000000000000000000000" + "0xe4ca0a5238564dfc91e8bf22bade2901619a1cd4": { + "balance": "0x3635c9adc5dea00000" }, - "1ad72d20a76e7fcc6b764058f48d417d496fa6cd": { - "balance": "2000000000000000000000" + "0x1ad72d20a76e7fcc6b764058f48d417d496fa6cd": { + "balance": "0x6c6b935b8bbd400000" }, - "d3bc730937fa75d8452616ad1ef1fe7fffe0d0e7": { - "balance": "83363000000000000000" + "0xd3bc730937fa75d8452616ad1ef1fe7fffe0d0e7": { + "balance": "0x484e4ded2eae38000" }, - "eac1482826acb6111e19d340a45fb851576bed60": { - "balance": "32177000000000000000" + "0xeac1482826acb6111e19d340a45fb851576bed60": { + "balance": "0x1be8bab04d9be8000" }, - "01e40521122530d9ac91113c06a0190b6d63850b": { - "balance": "1337000000000000000000" + "0x01e40521122530d9ac91113c06a0190b6d63850b": { + "balance": "0x487a9a304539440000" }, - "9e20e5fd361eabcf63891f5b87b09268b8eb3793": { - "balance": "100000000000000000000" + "0x9e20e5fd361eabcf63891f5b87b09268b8eb3793": { + "balance": "0x56bc75e2d63100000" }, - "69ff429074cb9b6c63bc914284bce5f0c8fbf7d0": { - "balance": "500000000000000000000" + "0x69ff429074cb9b6c63bc914284bce5f0c8fbf7d0": { + "balance": "0x1b1ae4d6e2ef500000" }, - "0d3265d3e7bdb93d5e8e8b1ca47f210a793ecc8e": { - "balance": "200000000000000000000" + "0x0d3265d3e7bdb93d5e8e8b1ca47f210a793ecc8e": { + "balance": "0xad78ebc5ac6200000" }, - "5b4ea16db6809b0352d4b6e81c3913f76a51bb32": { - "balance": "400000000000000000000" + "0x5b4ea16db6809b0352d4b6e81c3913f76a51bb32": { + "balance": "0x15af1d78b58c400000" }, - "d8fe088fffce948f5137ee23b01d959e84ac4223": { - "balance": "227942000000000000000" + "0xd8fe088fffce948f5137ee23b01d959e84ac4223": { + "balance": "0xc5b54a94fc0170000" }, - "7e4e9409704121d1d77997026ff06ea9b19a8b90": { - "balance": "2602600000000000000000" + "0x7e4e9409704121d1d77997026ff06ea9b19a8b90": { + "balance": "0x8d16549ed58fa40000" }, - "96b434fe0657e42acc8212b6865139dede15979c": { - "balance": "4000000000000000000000" + "0x96b434fe0657e42acc8212b6865139dede15979c": { + "balance": "0xd8d726b7177a800000" }, - "22f004df8de9e6ebf523ccace457accb26f97281": { - "balance": "10000000000000000000000" + "0x22f004df8de9e6ebf523ccace457accb26f97281": { + "balance": "0x21e19e0c9bab2400000" }, - "d8f9240c55cff035523c6d5bd300d370dc8f0c95": { - "balance": "285000000000000000000" + "0xd8f9240c55cff035523c6d5bd300d370dc8f0c95": { + "balance": "0xf732b66015a540000" }, - "9d9e57fde30e5068c03e49848edce343b7028358": { - "balance": "1730000000000000000000" + "0x9d9e57fde30e5068c03e49848edce343b7028358": { + "balance": "0x5dc892aa1131c80000" }, - "317cf4a23cb191cdc56312c29d15e210b3b9b784": { - "balance": "144000000000000000000" + "0x317cf4a23cb191cdc56312c29d15e210b3b9b784": { + "balance": "0x7ce66c50e28400000" }, - "79f08e01ce0988e63c7f8f2908fade43c7f9f5c9": { - "balance": "18200000000000000000" + "0x79f08e01ce0988e63c7f8f2908fade43c7f9f5c9": { + "balance": "0xfc936392801c0000" }, - "04e5f5bc7c923fd1e31735e72ef968fd67110c6e": { - "balance": "1611000000000000000000" + "0x04e5f5bc7c923fd1e31735e72ef968fd67110c6e": { + "balance": "0x57551dbc8e624c0000" }, - "1ec4ec4b77bf19d091a868e6f49154180541f90e": { - "balance": "2000000000000000000000" + "0x1ec4ec4b77bf19d091a868e6f49154180541f90e": { + "balance": "0x6c6b935b8bbd400000" }, - "8737dae671823a8d5917e0157ace9c43468d946b": { - "balance": "1999944000000000000000" + "0x8737dae671823a8d5917e0157ace9c43468d946b": { + "balance": "0x6c6acc67d7b1d40000" }, - "f998ca3411730a6cd10e7455b0410fb0f6d3ff80": { - "balance": "2000000000000000000000" + "0xf998ca3411730a6cd10e7455b0410fb0f6d3ff80": { + "balance": "0x6c6b935b8bbd400000" }, - "6e2eab85dc89fe29dc0aa1853247dab43a523d56": { - "balance": "80000000000000000000" + "0x6e2eab85dc89fe29dc0aa1853247dab43a523d56": { + "balance": "0x4563918244f400000" }, - "72c083beadbdc227c5fb43881597e32e83c26056": { - "balance": "20000000000000000000000" + "0x72c083beadbdc227c5fb43881597e32e83c26056": { + "balance": "0x43c33c1937564800000" }, - "5902e44af769a87246a21e079c08bf36b06efeb3": { - "balance": "1000000000000000000000" + "0x5902e44af769a87246a21e079c08bf36b06efeb3": { + "balance": "0x3635c9adc5dea00000" }, - "cc2d04f0a4017189b340ca77198641dcf6456b91": { - "balance": "3940000000000000000000" + "0xcc2d04f0a4017189b340ca77198641dcf6456b91": { + "balance": "0xd5967be4fc3f100000" }, - "bde4c73f969b89e9ceae66a2b51844480e038e9a": { - "balance": "1000000000000000000000" + "0xbde4c73f969b89e9ceae66a2b51844480e038e9a": { + "balance": "0x3635c9adc5dea00000" }, - "adff0d1d0b97471e76d789d2e49c8a74f9bd54ff": { - "balance": "1880000000000000000000" + "0xadff0d1d0b97471e76d789d2e49c8a74f9bd54ff": { + "balance": "0x65ea3db75546600000" }, - "397cdb8c80c67950b18d654229610e93bfa6ee1a": { - "balance": "1172938000000000000000" + "0x397cdb8c80c67950b18d654229610e93bfa6ee1a": { + "balance": "0x3f95c8e08215210000" }, - "a3e051fb744aa3410c3b88f899f5d57f168df12d": { - "balance": "2955000000000000000000" + "0xa3e051fb744aa3410c3b88f899f5d57f168df12d": { + "balance": "0xa030dcebbd2f4c0000" }, - "810db25675f45ea4c7f3177f37ce29e22d67999c": { - "balance": "200000000000000000000" + "0x810db25675f45ea4c7f3177f37ce29e22d67999c": { + "balance": "0xad78ebc5ac6200000" }, - "1e13ec51142cebb7a26083412c3ce35144ba56a1": { - "balance": "5000000000000000000000" + "0x1e13ec51142cebb7a26083412c3ce35144ba56a1": { + "balance": "0x10f0cf064dd59200000" }, - "25bdfa3ee26f3849617b230062588a97e3cae701": { - "balance": "1000008000000000000000" + "0x25bdfa3ee26f3849617b230062588a97e3cae701": { + "balance": "0x3635e619bb04d40000" }, - "ae538c73c5b38d8d584d7ebdadefb15cabe48357": { - "balance": "999000000000000000000" + "0xae538c73c5b38d8d584d7ebdadefb15cabe48357": { + "balance": "0x3627e8f712373c0000" }, - "a2ecce2c49f72a0995a0bda57aacf1e9f001e22a": { - "balance": "4000000000000000000000" + "0xa2ecce2c49f72a0995a0bda57aacf1e9f001e22a": { + "balance": "0xd8d726b7177a800000" }, - "7e24fbdad290175eb2df6d180a19b9a9f41370be": { - "balance": "1000000000000000000000" + "0x7e24fbdad290175eb2df6d180a19b9a9f41370be": { + "balance": "0x3635c9adc5dea00000" }, - "e8cc43bc4f8acf39bff04ebfbf42aac06a328470": { - "balance": "400000000000000000000" + "0xe8cc43bc4f8acf39bff04ebfbf42aac06a328470": { + "balance": "0x15af1d78b58c400000" }, - "c2779771f0536d79a8708f6931abc44b3035e999": { - "balance": "20002000000000000000000" + "0xc2779771f0536d79a8708f6931abc44b3035e999": { + "balance": "0x43c4f8300dcb3480000" }, - "ab27ba78c8e5e3daef31ad05aef0ff0325721e08": { - "balance": "468000000000000000000" + "0xab27ba78c8e5e3daef31ad05aef0ff0325721e08": { + "balance": "0x195ece006e02d00000" }, - "563cb8803c1d32a25b27b64114852bd04d9c20cd": { - "balance": "204400000000000000000" + "0x563cb8803c1d32a25b27b64114852bd04d9c20cd": { + "balance": "0xb149ead0ad9d80000" }, - "08d4267feb15da9700f7ccc3c84a8918bf17cfde": { - "balance": "1790000000000000000000" + "0x08d4267feb15da9700f7ccc3c84a8918bf17cfde": { + "balance": "0x61093d7c2c6d380000" }, - "d1778c13fbd968bc083cb7d1024ffe1f49d02caa": { - "balance": "4020000000000000000000" + "0xd1778c13fbd968bc083cb7d1024ffe1f49d02caa": { + "balance": "0xd9ecb4fd208e500000" }, - "1796bcc97b8abc717f4b4a7c6b1036ea2182639f": { - "balance": "355242000000000000000" + "0x1796bcc97b8abc717f4b4a7c6b1036ea2182639f": { + "balance": "0x1341f91cd8e3510000" }, - "beecd6af900c8b064afcc6073f2d85d59af11956": { - "balance": "2000000000000000000000" + "0xbeecd6af900c8b064afcc6073f2d85d59af11956": { + "balance": "0x6c6b935b8bbd400000" }, - "045ed7f6d9ee9f252e073268db022c6326adfc5b": { - "balance": "100000000000000000000" + "0x045ed7f6d9ee9f252e073268db022c6326adfc5b": { + "balance": "0x56bc75e2d63100000" }, - "b88a37c27f78a617d5c091b7d5b73a3761e65f2a": { - "balance": "2000000000000000000000" + "0xb88a37c27f78a617d5c091b7d5b73a3761e65f2a": { + "balance": "0x6c6b935b8bbd400000" }, - "72fb49c29d23a18950c4b2dc0ddf410f532d6f53": { - "balance": "2000000000000000000000" + "0x72fb49c29d23a18950c4b2dc0ddf410f532d6f53": { + "balance": "0x6c6b935b8bbd400000" }, - "6ecaefa6fc3ee534626db02c6f85a0c395571e77": { - "balance": "600000000000000000000" + "0x6ecaefa6fc3ee534626db02c6f85a0c395571e77": { + "balance": "0x2086ac351052600000" }, - "d1811c55976980f083901d8a0db269222dfb5cfe": { - "balance": "1550000000000000000000" + "0xd1811c55976980f083901d8a0db269222dfb5cfe": { + "balance": "0x54069233bf7f780000" }, - "98855c7dfbee335344904a12c40c731795b13a54": { - "balance": "1069600000000000000000" + "0x98855c7dfbee335344904a12c40c731795b13a54": { + "balance": "0x39fbae8d042dd00000" }, - "92a898d46f19719c38126a8a3c27867ae2cee596": { - "balance": "2000000000000000000000" + "0x92a898d46f19719c38126a8a3c27867ae2cee596": { + "balance": "0x6c6b935b8bbd400000" }, - "ca428863a5ca30369892d612183ef9fb1a04bcea": { - "balance": "1520000000000000000000" + "0xca428863a5ca30369892d612183ef9fb1a04bcea": { + "balance": "0x52663ccab1e1c00000" }, - "797427e3dbf0feae7a2506f12df1dc40326e8505": { - "balance": "1000000000000000000000" + "0x797427e3dbf0feae7a2506f12df1dc40326e8505": { + "balance": "0x3635c9adc5dea00000" }, - "3d574fcf00fae1d98cc8bf9ddfa1b3953b9741bc": { - "balance": "1970000000000000000000" + "0x3d574fcf00fae1d98cc8bf9ddfa1b3953b9741bc": { + "balance": "0x6acb3df27e1f880000" }, - "28818e18b610001321b31df6fe7d2815cdadc9f5": { - "balance": "1000000000000000000000" + "0x28818e18b610001321b31df6fe7d2815cdadc9f5": { + "balance": "0x3635c9adc5dea00000" }, - "5f3e1e6739b0c62200e00a003691d9efb238d89f": { - "balance": "3000000000000000000000" + "0x5f3e1e6739b0c62200e00a003691d9efb238d89f": { + "balance": "0xa2a15d09519be00000" }, - "d9d370fec63576ab15b318bf9e58364dc2a3552a": { - "balance": "100000000000000000000" + "0xd9d370fec63576ab15b318bf9e58364dc2a3552a": { + "balance": "0x56bc75e2d63100000" }, - "b223bf1fbf80485ca2b5567d98db7bc3534dd669": { - "balance": "4000000000000000000000" + "0xb223bf1fbf80485ca2b5567d98db7bc3534dd669": { + "balance": "0xd8d726b7177a800000" }, - "7b27d0d1f3dd3c140294d0488b783ebf4015277d": { - "balance": "400000000000000000000" + "0x7b27d0d1f3dd3c140294d0488b783ebf4015277d": { + "balance": "0x15af1d78b58c400000" }, - "7930c2d9cbfa87f510f8f98777ff8a8448ca5629": { - "balance": "199955000000000000000" + "0x7930c2d9cbfa87f510f8f98777ff8a8448ca5629": { + "balance": "0xad6eedd17cf3b8000" }, - "820c19291196505b65059d9914b7090be1db87de": { - "balance": "140000000000000000000" + "0x820c19291196505b65059d9914b7090be1db87de": { + "balance": "0x796e3ea3f8ab00000" }, - "e545ee84ea48e564161e9482d59bcf406a602ca2": { - "balance": "1850000000000000000000" + "0xe545ee84ea48e564161e9482d59bcf406a602ca2": { + "balance": "0x6449e84e47a8a80000" }, - "af4cf41785161f571d0ca69c94f8021f41294eca": { - "balance": "9850000000000000000000" + "0xaf4cf41785161f571d0ca69c94f8021f41294eca": { + "balance": "0x215f835bc769da80000" }, - "7a4f9b850690c7c94600dbee0ca4b0a411e9c221": { - "balance": "1910000000000000000000" + "0x7a4f9b850690c7c94600dbee0ca4b0a411e9c221": { + "balance": "0x678a932062e4180000" }, - "ddab6b51a9030b40fb95cf0b748a059c2417bec7": { - "balance": "2000000000000000000000" + "0xddab6b51a9030b40fb95cf0b748a059c2417bec7": { + "balance": "0x6c6b935b8bbd400000" }, - "315ef2da620fd330d12ee55de5f329a696e0a968": { - "balance": "150000000000000000000" + "0x315ef2da620fd330d12ee55de5f329a696e0a968": { + "balance": "0x821ab0d4414980000" }, - "4db1c43a0f834d7d0478b8960767ec1ac44c9aeb": { - "balance": "872870000000000000000" + "0x4db1c43a0f834d7d0478b8960767ec1ac44c9aeb": { + "balance": "0x2f5181305627370000" }, - "2fef81478a4b2e8098db5ff387ba2153f4e22b79": { - "balance": "999000000000000000000" + "0x2fef81478a4b2e8098db5ff387ba2153f4e22b79": { + "balance": "0x3627e8f712373c0000" }, - "6c6aa0d30b64721990b9504a863fa0bfb5e57da7": { - "balance": "2700000000000000000000" + "0x6c6aa0d30b64721990b9504a863fa0bfb5e57da7": { + "balance": "0x925e06eec972b00000" }, - "33380c6fff5acd2651309629db9a71bf3f20c5ba": { - "balance": "16100000000000000000000" + "0x33380c6fff5acd2651309629db9a71bf3f20c5ba": { + "balance": "0x368c8623a8b4d100000" }, - "4eebf1205d0cc20cee6c7f8ff3115f56d48fba26": { - "balance": "19400000000000000000" + "0x4eebf1205d0cc20cee6c7f8ff3115f56d48fba26": { + "balance": "0x10d3aa536e2940000" }, - "03cc9d2d21f86b84ac8ceaf971dba78a90e62570": { - "balance": "1610000000000000000000" + "0x03cc9d2d21f86b84ac8ceaf971dba78a90e62570": { + "balance": "0x57473d05dabae80000" }, - "728f9ab080157db3073156dbca1a169ef3179407": { - "balance": "500000000000000000000" + "0x728f9ab080157db3073156dbca1a169ef3179407": { + "balance": "0x1b1ae4d6e2ef500000" }, - "30ed11b77bc17e5e6694c8bc5b6e4798f68d9ca7": { - "balance": "143731500000000000000000" + "0x30ed11b77bc17e5e6694c8bc5b6e4798f68d9ca7": { + "balance": "0x1e6fb3421fe0299e0000" }, - "f617b967b9bd485f7695d2ef51fb7792d898f500": { - "balance": "500000000000000000000" + "0xf617b967b9bd485f7695d2ef51fb7792d898f500": { + "balance": "0x1b1ae4d6e2ef500000" }, - "c0cbad3ccdf654da22cbcf5c786597ca1955c115": { - "balance": "2000000000000000000000" + "0xc0cbad3ccdf654da22cbcf5c786597ca1955c115": { + "balance": "0x6c6b935b8bbd400000" }, - "80522ddf944ec52e27d724ed4c93e1f7be6083d6": { - "balance": "200000000000000000000" + "0x80522ddf944ec52e27d724ed4c93e1f7be6083d6": { + "balance": "0xad78ebc5ac6200000" }, - "4e90ccb13258acaa9f4febc0a34292f95991e230": { - "balance": "15800000000000000000" + "0x4e90ccb13258acaa9f4febc0a34292f95991e230": { + "balance": "0xdb44e049bb2c0000" }, - "ff207308ced238a6c01ad0213ca9eb4465d42590": { - "balance": "1999944000000000000000" + "0xff207308ced238a6c01ad0213ca9eb4465d42590": { + "balance": "0x6c6acc67d7b1d40000" }, - "35f2949cf78bc219bb4f01907cf3b4b3d3865482": { - "balance": "289800000000000000000" + "0x35f2949cf78bc219bb4f01907cf3b4b3d3865482": { + "balance": "0xfb5c86c92e4340000" }, - "68f525921dc11c329b754fbf3e529fc723c834cd": { - "balance": "1610000000000000000000" + "0x68f525921dc11c329b754fbf3e529fc723c834cd": { + "balance": "0x57473d05dabae80000" }, - "81139bfdcca656c430203f72958c543b6580d40c": { - "balance": "2000000000000000000000" + "0x81139bfdcca656c430203f72958c543b6580d40c": { + "balance": "0x6c6b935b8bbd400000" }, - "9d511543b3d9dc60d47f09d49d01b6c498d82078": { - "balance": "11245000000000000000000" + "0x9d511543b3d9dc60d47f09d49d01b6c498d82078": { + "balance": "0x26197b9516fc3940000" }, - "084d103254759b343cb2b9c2d8ff9e1ac5f14596": { - "balance": "7600000000000000000000" + "0x084d103254759b343cb2b9c2d8ff9e1ac5f14596": { + "balance": "0x19bff2ff57968c00000" }, - "b323dcbf2eddc5382ee4bbbb201ca3931be8b438": { - "balance": "2000000000000000000000" + "0xb323dcbf2eddc5382ee4bbbb201ca3931be8b438": { + "balance": "0x6c6b935b8bbd400000" }, - "349d2c918fd09e2807318e66ce432909176bd50b": { - "balance": "1120000000000000000000" + "0x349d2c918fd09e2807318e66ce432909176bd50b": { + "balance": "0x3cb71f51fc55800000" }, - "b535f8db879fc67fec58824a5cbe6e5498aba692": { - "balance": "1910000000000000000000" + "0xb535f8db879fc67fec58824a5cbe6e5498aba692": { + "balance": "0x678a932062e4180000" }, - "824074312806da4748434266ee002140e3819ac2": { - "balance": "1507000000000000000000" + "0x824074312806da4748434266ee002140e3819ac2": { + "balance": "0x51b1d3839261ac0000" }, - "e8ef100d7ce0895832f2678df72d4acf8c28b8e3": { - "balance": "500038000000000000000" + "0xe8ef100d7ce0895832f2678df72d4acf8c28b8e3": { + "balance": "0x1b1b6bd7af64c70000" }, - "84af1b157342d54368260d17876230a534b54b0e": { - "balance": "985000000000000000000" + "0x84af1b157342d54368260d17876230a534b54b0e": { + "balance": "0x35659ef93f0fc40000" }, - "419a71a36c11d105e0f2aef5a3e598078e85c80b": { - "balance": "5000000000000000000000" + "0x419a71a36c11d105e0f2aef5a3e598078e85c80b": { + "balance": "0x10f0cf064dd59200000" }, - "55af092f94ba6a79918b0cf939eab3f01b3f51c7": { - "balance": "149940000000000000000" + "0x55af092f94ba6a79918b0cf939eab3f01b3f51c7": { + "balance": "0x820d5e39576120000" }, - "35a549e8fd6c368d6dcca6d2e7d18e4db95f5284": { - "balance": "499938000000000000000" + "0x35a549e8fd6c368d6dcca6d2e7d18e4db95f5284": { + "balance": "0x1b1a089237073d0000" }, - "f0e2649c7e6a3f2c5dfe33bbfbd927ca3c350a58": { - "balance": "2000000000000000000000" + "0xf0e2649c7e6a3f2c5dfe33bbfbd927ca3c350a58": { + "balance": "0x6c6b935b8bbd400000" }, - "f4b759cc8a1c75f80849ebbcda878dc8f0d66de4": { - "balance": "400000000000000000000" + "0xf4b759cc8a1c75f80849ebbcda878dc8f0d66de4": { + "balance": "0x15af1d78b58c400000" }, - "21846f2fdf5a41ed8df36e5ed8544df75988ece3": { - "balance": "1999944000000000000000" + "0x21846f2fdf5a41ed8df36e5ed8544df75988ece3": { + "balance": "0x6c6acc67d7b1d40000" }, - "229ff80bf5708009a9f739e0f8b560914016d5a6": { - "balance": "333333000000000000000" + "0x229ff80bf5708009a9f739e0f8b560914016d5a6": { + "balance": "0x1211ecb56d13488000" }, - "da505537537ffb33c415fec64e69bae090c5f60f": { - "balance": "160000000000000000000" + "0xda505537537ffb33c415fec64e69bae090c5f60f": { + "balance": "0x8ac7230489e800000" }, - "b91d9e916cd40d193db60e79202778a0087716fc": { - "balance": "404800000000000000000" + "0xb91d9e916cd40d193db60e79202778a0087716fc": { + "balance": "0x15f1ba7f4716200000" }, - "bb6823a1bd819f13515538264a2de052b4442208": { - "balance": "25610000000000000000" + "0xbb6823a1bd819f13515538264a2de052b4442208": { + "balance": "0x16368ff4ff9c10000" }, - "459393d63a063ef3721e16bd9fde45ee9dbd77fb": { - "balance": "1968818000000000000000" + "0x459393d63a063ef3721e16bd9fde45ee9dbd77fb": { + "balance": "0x6abad6a3c153050000" }, - "95f62d0243ede61dad9a3165f53905270d54e242": { - "balance": "1610000000000000000000" + "0x95f62d0243ede61dad9a3165f53905270d54e242": { + "balance": "0x57473d05dabae80000" }, - "b0bb29a861ea1d424d45acd4bfc492fb8ed809b7": { - "balance": "80000000000000000000" + "0xb0bb29a861ea1d424d45acd4bfc492fb8ed809b7": { + "balance": "0x4563918244f400000" }, - "5e74ed80e9655788e1bb269752319667fe754e5a": { - "balance": "56000000000000000000" + "0x5e74ed80e9655788e1bb269752319667fe754e5a": { + "balance": "0x30927f74c9de00000" }, - "a276b058cb98d88beedb67e543506c9a0d9470d8": { - "balance": "2668652000000000000000" + "0xa276b058cb98d88beedb67e543506c9a0d9470d8": { + "balance": "0x90aafc76e02fbe0000" }, - "8ae9ef8c8a8adfa6ab798ab2cdc405082a1bbb70": { - "balance": "2000000000000000000000" + "0x8ae9ef8c8a8adfa6ab798ab2cdc405082a1bbb70": { + "balance": "0x6c6b935b8bbd400000" }, - "e5102c3b711b810344197419b1cd8a7059f13e32": { - "balance": "299999000000000000000" + "0xe5102c3b711b810344197419b1cd8a7059f13e32": { + "balance": "0x1043528d0984698000" }, - "c32038ca52aee19745be5c31fcdc54148bb2c4d0": { - "balance": "49984000000000000000" + "0xc32038ca52aee19745be5c31fcdc54148bb2c4d0": { + "balance": "0x2b5aad72c65200000" }, - "13e321728c9c57628058e93fc866a032dd0bda90": { - "balance": "714580000000000000000" + "0x13e321728c9c57628058e93fc866a032dd0bda90": { + "balance": "0x26bcca23fe2ea20000" }, - "c2bae4a233c2d85724f0dabebda0249d833e37d3": { - "balance": "5000000000000000000000" + "0xc2bae4a233c2d85724f0dabebda0249d833e37d3": { + "balance": "0x10f0cf064dd59200000" }, - "10d32416722ca4e648630548ead91edd79c06aff": { - "balance": "100000000000000000000" + "0x10d32416722ca4e648630548ead91edd79c06aff": { + "balance": "0x56bc75e2d63100000" }, - "d5f07552b5c693c20067b378b809cee853b8f136": { - "balance": "505540000000000000000" + "0xd5f07552b5c693c20067b378b809cee853b8f136": { + "balance": "0x1b67c6df88c6fa0000" }, - "8668af868a1e98885f937f2615ded6751804eb2d": { - "balance": "20000000000000000000" + "0x8668af868a1e98885f937f2615ded6751804eb2d": { + "balance": "0x1158e460913d00000" }, - "139d3531c9922ad56269f6309aa789fb2485f98c": { - "balance": "4000000000000000000000" + "0x139d3531c9922ad56269f6309aa789fb2485f98c": { + "balance": "0xd8d726b7177a800000" }, - "1d29c7aab42b2048d2b25225d498dba67a03fbb2": { - "balance": "200000000000000000000" + "0x1d29c7aab42b2048d2b25225d498dba67a03fbb2": { + "balance": "0xad78ebc5ac6200000" }, - "d35075ca61fe59d123969c36a82d1ab2d918aa38": { - "balance": "2674000000000000000000" + "0xd35075ca61fe59d123969c36a82d1ab2d918aa38": { + "balance": "0x90f534608a72880000" }, - "d6fc0446c6a8d40ae3551db7e701d1fa876e4a49": { - "balance": "2000000000000000000000" + "0xd6fc0446c6a8d40ae3551db7e701d1fa876e4a49": { + "balance": "0x6c6b935b8bbd400000" }, - "fccd0d1ecee27addea95f6857aeec8c7a04b28ee": { - "balance": "10000000000000000000000" + "0xfccd0d1ecee27addea95f6857aeec8c7a04b28ee": { + "balance": "0x21e19e0c9bab2400000" }, - "c12cfb7b3df70fceca0ede263500e27873f8ed16": { - "balance": "1000000000000000000000" + "0xc12cfb7b3df70fceca0ede263500e27873f8ed16": { + "balance": "0x3635c9adc5dea00000" }, - "d0db456178206f5c4430fe005063903c3d7a49a7": { - "balance": "706245000000000000000" + "0xd0db456178206f5c4430fe005063903c3d7a49a7": { + "balance": "0x26491e45a753c08000" }, - "73cf80ae9688e1580e68e782cd0811f7aa494d2c": { - "balance": "7760000000000000000000" + "0x73cf80ae9688e1580e68e782cd0811f7aa494d2c": { + "balance": "0x1a4aba225c207400000" }, - "d60651e393783423e5cc1bc5f889e44ef7ea243e": { - "balance": "398800000000000000000" + "0xd60651e393783423e5cc1bc5f889e44ef7ea243e": { + "balance": "0x159e76371129c80000" }, - "048a8970ea4145c64d5517b8de5b46d0595aad06": { - "balance": "20000000000000000000000" + "0x048a8970ea4145c64d5517b8de5b46d0595aad06": { + "balance": "0x43c33c1937564800000" }, - "dd9b485a3b1cd33a6a9c62f1e5bee92701856d25": { - "balance": "225073000000000000000" + "0xdd9b485a3b1cd33a6a9c62f1e5bee92701856d25": { + "balance": "0xc3383ed031b7e8000" }, - "5b287c7e734299e727626f93fb1187a60d5057fe": { - "balance": "101230000000000000000" + "0x5b287c7e734299e727626f93fb1187a60d5057fe": { + "balance": "0x57cd934a914cb0000" }, - "635c00fdf035bca15fa3610df3384e0fb79068b1": { - "balance": "9000000000000000000000" + "0x635c00fdf035bca15fa3610df3384e0fb79068b1": { + "balance": "0x1e7e4171bf4d3a00000" }, - "630a913a9031c9492abd4c41dbb15054cfec4416": { - "balance": "5688000000000000000000" + "0x630a913a9031c9492abd4c41dbb15054cfec4416": { + "balance": "0x13458db67af35e00000" }, - "af3614dcb68a36e45a4e911e62796247222d595b": { - "balance": "2259800000000000000000" + "0xaf3614dcb68a36e45a4e911e62796247222d595b": { + "balance": "0x7a81065f1103bc0000" }, - "335e22025b7a77c3a074c78b8e3dfe071341946e": { - "balance": "10178744000000000000000" + "0x335e22025b7a77c3a074c78b8e3dfe071341946e": { + "balance": "0x227ca730ab3f6ac0000" }, - "f0e1dfa42adeac2f17f6fdf584c94862fd563393": { - "balance": "500000000000000000000" + "0xf0e1dfa42adeac2f17f6fdf584c94862fd563393": { + "balance": "0x1b1ae4d6e2ef500000" }, - "1a9e702f385dcd105e8b9fa428eea21c57ff528a": { - "balance": "1400000000000000000000" + "0x1a9e702f385dcd105e8b9fa428eea21c57ff528a": { + "balance": "0x4be4e7267b6ae00000" }, - "8ce4949d8a16542d423c17984e6739fa72ceb177": { - "balance": "24999975000000000000000" + "0x8ce4949d8a16542d423c17984e6739fa72ceb177": { + "balance": "0x54b405926f4a63d8000" }, - "5f29c9de765dde25852af07d33f2ce468fd20982": { - "balance": "2000000000000000000000" + "0x5f29c9de765dde25852af07d33f2ce468fd20982": { + "balance": "0x6c6b935b8bbd400000" }, - "dbf5f061a0f48e5e69618739a77d2ec19768d201": { - "balance": "152000000000000000000" + "0xdbf5f061a0f48e5e69618739a77d2ec19768d201": { + "balance": "0x83d6c7aab63600000" }, - "b247cf9c72ec482af3eaa759658f793d670a570c": { - "balance": "912000000000000000000" + "0xb247cf9c72ec482af3eaa759658f793d670a570c": { + "balance": "0x31708ae00454400000" }, - "99f4147ccc6bcb80cc842e69f6d00e30fa4133d9": { - "balance": "400000000000000000000" + "0x99f4147ccc6bcb80cc842e69f6d00e30fa4133d9": { + "balance": "0x15af1d78b58c400000" }, - "ba6d31b9a261d640b5dea51ef2162c3109f1eba8": { - "balance": "5000000000000000000000" + "0xba6d31b9a261d640b5dea51ef2162c3109f1eba8": { + "balance": "0x10f0cf064dd59200000" }, - "f05ba8d7b68539d933300bc9289c3d9474d0419e": { - "balance": "126400000000000000000" + "0xf05ba8d7b68539d933300bc9289c3d9474d0419e": { + "balance": "0x6da27024dd9600000" }, - "682e96276f518d31d7e56e30dfb009c1218201bd": { - "balance": "20000000000000000000" + "0x682e96276f518d31d7e56e30dfb009c1218201bd": { + "balance": "0x1158e460913d00000" }, - "0927220492194b2eda9fc4bbe38f25d681dfd36c": { - "balance": "6000000000000000000000" + "0x0927220492194b2eda9fc4bbe38f25d681dfd36c": { + "balance": "0x14542ba12a337c00000" }, - "a3c33afc8cb4704e23153de2049d35ae71332472": { - "balance": "799600000000000000000" + "0xa3c33afc8cb4704e23153de2049d35ae71332472": { + "balance": "0x2b58addb89a2580000" }, - "05c736d365aa37b5c0be9c12c8ad5cd903c32cf9": { - "balance": "6002000000000000000000" + "0x05c736d365aa37b5c0be9c12c8ad5cd903c32cf9": { + "balance": "0x1455e7b800a86880000" }, - "d8eef4cf4beb01ee20d111748b61cb4d3f641a01": { - "balance": "2740000000000000000000" + "0xd8eef4cf4beb01ee20d111748b61cb4d3f641a01": { + "balance": "0x9489237adb9a500000" }, - "16c1bf5b7dc9c83c179efacbcf2eb174e3561cb3": { - "balance": "1000000000000000000000" + "0x16c1bf5b7dc9c83c179efacbcf2eb174e3561cb3": { + "balance": "0x3635c9adc5dea00000" }, - "d79db5ab43621a7a3da795e58929f3dd25af67d9": { - "balance": "1999944000000000000000" + "0xd79db5ab43621a7a3da795e58929f3dd25af67d9": { + "balance": "0x6c6acc67d7b1d40000" }, - "28efae6356509edface89fc61a7fdcdb39eea8e5": { - "balance": "5348000000000000000000" + "0x28efae6356509edface89fc61a7fdcdb39eea8e5": { + "balance": "0x121ea68c114e5100000" }, - "c55005a6c37e8ca7e543ce259973a3cace961a4a": { - "balance": "2000000000000000000000" + "0xc55005a6c37e8ca7e543ce259973a3cace961a4a": { + "balance": "0x6c6b935b8bbd400000" }, - "ab3d86bc82927e0cd421d146e07f919327cdf6f9": { - "balance": "1910000000000000000000" + "0xab3d86bc82927e0cd421d146e07f919327cdf6f9": { + "balance": "0x678a932062e4180000" }, - "b74ed2666001c16333cf7af59e4a3d4860363b9c": { - "balance": "193600000000000000000" + "0xb74ed2666001c16333cf7af59e4a3d4860363b9c": { + "balance": "0xa7ebd5e4363a00000" }, - "1899f69f653b05a5a6e81f480711d09bbf97588c": { - "balance": "1955000000000000000000" + "0x1899f69f653b05a5a6e81f480711d09bbf97588c": { + "balance": "0x69fb133df750ac0000" }, - "27fc85a49cff90dbcfdadc9ddd40d6b9a2210a6c": { - "balance": "100000000000000000000" + "0x27fc85a49cff90dbcfdadc9ddd40d6b9a2210a6c": { + "balance": "0x56bc75e2d63100000" }, - "cd1ed263fbf6f6f7b48aef8f733d329d4382c7c7": { - "balance": "18500000000000000000" + "0xcd1ed263fbf6f6f7b48aef8f733d329d4382c7c7": { + "balance": "0x100bd33fb98ba0000" }, - "d97fe6f53f2a58f6d76d752adf74a8a2c18e9074": { - "balance": "309990000000000000000" + "0xd97fe6f53f2a58f6d76d752adf74a8a2c18e9074": { + "balance": "0x10cdf9b69a43570000" }, - "80da2fdda29a9e27f9e115975e69ae9cfbf3f27e": { - "balance": "200000000000000000000" + "0x80da2fdda29a9e27f9e115975e69ae9cfbf3f27e": { + "balance": "0xad78ebc5ac6200000" }, - "09146ea3885176f07782e1fe30dce3ce24c49e1f": { - "balance": "20000000000000000000" + "0x09146ea3885176f07782e1fe30dce3ce24c49e1f": { + "balance": "0x1158e460913d00000" }, - "393ff4255e5c658f2e7f10ecbd292572671bc2d2": { - "balance": "2000000000000000000000" + "0x393ff4255e5c658f2e7f10ecbd292572671bc2d2": { + "balance": "0x6c6b935b8bbd400000" }, - "a390ca122b8501ee3e5e07a8ca4b419f7e4dae15": { - "balance": "100000000000000000000" + "0xa390ca122b8501ee3e5e07a8ca4b419f7e4dae15": { + "balance": "0x56bc75e2d63100000" }, - "6d9193996b194617211106d1635eb26cc4b66c6c": { - "balance": "399640000000000000000" + "0x6d9193996b194617211106d1635eb26cc4b66c6c": { + "balance": "0x15aa1e7e9dd51c0000" }, - "999c49c174ca13bc836c1e0a92bff48b271543ca": { - "balance": "3280000000000000000000" + "0x999c49c174ca13bc836c1e0a92bff48b271543ca": { + "balance": "0xb1cf24ddd0b1400000" }, - "7421ce5be381738ddc83f02621974ff0686c79b8": { - "balance": "1632000000000000000000" + "0x7421ce5be381738ddc83f02621974ff0686c79b8": { + "balance": "0x58788cb94b1d800000" }, - "6be9030ee6e2fbc491aca3de4022d301772b7b7d": { - "balance": "26740000000000000000" + "0x6be9030ee6e2fbc491aca3de4022d301772b7b7d": { + "balance": "0x1731790534df20000" }, - "81bd75abd865e0c3f04a0b4fdbcb74d34082fbb7": { - "balance": "4000000000000000000000" + "0x81bd75abd865e0c3f04a0b4fdbcb74d34082fbb7": { + "balance": "0xd8d726b7177a800000" }, - "8bc1ff8714828bf286ff7e8a7709106548ed1b18": { - "balance": "10000000000000000000000" + "0x8bc1ff8714828bf286ff7e8a7709106548ed1b18": { + "balance": "0x21e19e0c9bab2400000" }, - "a0aadbd9509722705f6d2358a5c79f37970f00f6": { - "balance": "200000000000000000000" + "0xa0aadbd9509722705f6d2358a5c79f37970f00f6": { + "balance": "0xad78ebc5ac6200000" }, - "3d881433f04a7d0d27f84944e08a512da3555287": { - "balance": "1200000000000000000000" + "0x3d881433f04a7d0d27f84944e08a512da3555287": { + "balance": "0x410d586a20a4c00000" }, - "cc1d6ead01aada3e8dc7b95dca25df26eefa639d": { - "balance": "2000000000000000000000" + "0xcc1d6ead01aada3e8dc7b95dca25df26eefa639d": { + "balance": "0x6c6b935b8bbd400000" }, - "35106ba94e8563d4b3cb3c5c692c10e604b7ced8": { - "balance": "2000000000000000000000" + "0x35106ba94e8563d4b3cb3c5c692c10e604b7ced8": { + "balance": "0x6c6b935b8bbd400000" }, - "4d8697af0fbf2ca36e8768f4af22133570685a60": { - "balance": "20000000000000000000" + "0x4d8697af0fbf2ca36e8768f4af22133570685a60": { + "balance": "0x1158e460913d00000" }, - "1afcc585896cd0ede129ee2de5c19ea811540b64": { - "balance": "3231259000000000000000" + "0x1afcc585896cd0ede129ee2de5c19ea811540b64": { + "balance": "0xaf2aba0c8e5bef8000" }, - "e5215631b14248d45a255296bed1fbfa0330ff35": { - "balance": "1310000000000000000000" + "0xe5215631b14248d45a255296bed1fbfa0330ff35": { + "balance": "0x4703e6eb5291b80000" }, - "e3878f91ca86053fced5444686a330e09cc388fb": { - "balance": "194000000000000000000" + "0xe3878f91ca86053fced5444686a330e09cc388fb": { + "balance": "0xa844a7424d9c80000" }, - "555df19390c16d01298772bae8bc3a1152199cbd": { - "balance": "200000000000000000000" + "0x555df19390c16d01298772bae8bc3a1152199cbd": { + "balance": "0xad78ebc5ac6200000" }, - "dc3dae59ed0fe18b58511e6fe2fb69b219689423": { - "balance": "100000000000000000000" + "0xdc3dae59ed0fe18b58511e6fe2fb69b219689423": { + "balance": "0x56bc75e2d63100000" }, - "74648caac748dd135cd91ea14c28e1bd4d7ff6ae": { - "balance": "3100000000000000000000" + "0x74648caac748dd135cd91ea14c28e1bd4d7ff6ae": { + "balance": "0xa80d24677efef00000" }, - "cf2e2ad635e9861ae95cb9bafcca036b5281f5ce": { - "balance": "35200000000000000000000" + "0xcf2e2ad635e9861ae95cb9bafcca036b5281f5ce": { + "balance": "0x77432217e6836000000" }, - "14eec09bf03e352bd6ff1b1e876be664ceffd0cf": { - "balance": "20094000000000000000" + "0x14eec09bf03e352bd6ff1b1e876be664ceffd0cf": { + "balance": "0x116dc3a8994b30000" }, - "856e5ab3f64c9ab56b009393b01664fc0324050e": { - "balance": "1790000000000000000000" + "0x856e5ab3f64c9ab56b009393b01664fc0324050e": { + "balance": "0x61093d7c2c6d380000" }, - "632b9149d70178a7333634275e82d5953f27967b": { - "balance": "700000000000000000000" + "0x632b9149d70178a7333634275e82d5953f27967b": { + "balance": "0x25f273933db5700000" }, - "2a39190a4fde83dfb3ddcb4c5fbb83ac6c49755c": { - "balance": "1000000000000000000000" + "0x2a39190a4fde83dfb3ddcb4c5fbb83ac6c49755c": { + "balance": "0x3635c9adc5dea00000" }, - "369ef761195f3a373e24ece6cd22520fe0b9e86e": { - "balance": "534933000000000000000" + "0x369ef761195f3a373e24ece6cd22520fe0b9e86e": { + "balance": "0x1cffafc94db2088000" }, - "16afa787fc9f94bdff6976b1a42f430a8bf6fb0f": { - "balance": "2000000000000000000000" + "0x16afa787fc9f94bdff6976b1a42f430a8bf6fb0f": { + "balance": "0x6c6b935b8bbd400000" }, - "1b0b31afff4b6df3653a94d7c87978ae35f34aae": { - "balance": "354600000000000000000" + "0x1b0b31afff4b6df3653a94d7c87978ae35f34aae": { + "balance": "0x133910453fa9840000" }, - "b4d82f2e69943f7de0f5f7743879406fac2e9cec": { - "balance": "40000000000000000000" + "0xb4d82f2e69943f7de0f5f7743879406fac2e9cec": { + "balance": "0x22b1c8c1227a00000" }, - "09d6cefd75b0c4b3f8f1d687a522c96123f1f539": { - "balance": "6000000000000000000000" + "0x09d6cefd75b0c4b3f8f1d687a522c96123f1f539": { + "balance": "0x14542ba12a337c00000" }, - "01577afd4e50890247c9b10d44af73229aec884f": { - "balance": "680000000000000000000" + "0x01577afd4e50890247c9b10d44af73229aec884f": { + "balance": "0x24dce54d34a1a00000" }, - "a35606d51220ee7f2146d411582ee4ee4a45596e": { - "balance": "3996800000000000000000" + "0xa35606d51220ee7f2146d411582ee4ee4a45596e": { + "balance": "0xd8aabe080bc9400000" }, - "352e77c861696ef96ad54934f894aa8ea35151dd": { - "balance": "1000000000000000000000" + "0x352e77c861696ef96ad54934f894aa8ea35151dd": { + "balance": "0x3635c9adc5dea00000" }, - "b87f5376c2de0b6cc3c179c06087aa473d6b4674": { - "balance": "1337000000000000000000" + "0xb87f5376c2de0b6cc3c179c06087aa473d6b4674": { + "balance": "0x487a9a304539440000" }, - "5b49afcd75447838f6e7ceda8d21777d4fc1c3c0": { - "balance": "4000000000000000000000" + "0x5b49afcd75447838f6e7ceda8d21777d4fc1c3c0": { + "balance": "0xd8d726b7177a800000" }, - "b884add88d83dc564ab8e0e02cbdb63919aea844": { - "balance": "2000000000000000000000" + "0xb884add88d83dc564ab8e0e02cbdb63919aea844": { + "balance": "0x6c6b935b8bbd400000" }, - "5c312a56c784b122099b764d059c21ece95e84ca": { - "balance": "95000000000000000000" + "0x5c312a56c784b122099b764d059c21ece95e84ca": { + "balance": "0x52663ccab1e1c0000" }, - "4697baaf9ccb603fd30430689d435445e9c98bf5": { - "balance": "199600000000000000000" + "0x4697baaf9ccb603fd30430689d435445e9c98bf5": { + "balance": "0xad201a6794ff80000" }, - "c625f8c98d27a09a1bcabd5128b1c2a94856af30": { - "balance": "200000000000000000000" + "0xc625f8c98d27a09a1bcabd5128b1c2a94856af30": { + "balance": "0xad78ebc5ac6200000" }, - "19f5caf4c40e6908813c0745b0aea9586d9dd931": { - "balance": "664000000000000000000" + "0x19f5caf4c40e6908813c0745b0aea9586d9dd931": { + "balance": "0x23fed9e1fa2b600000" }, - "1e596a81b357c6f24970cc313df6dbdaabd0d09e": { - "balance": "2000000000000000000000" + "0x1e596a81b357c6f24970cc313df6dbdaabd0d09e": { + "balance": "0x6c6b935b8bbd400000" }, - "c1631228efbf2a2e3a4092ee8900c639ed34fbc8": { - "balance": "955000000000000000000" + "0xc1631228efbf2a2e3a4092ee8900c639ed34fbc8": { + "balance": "0x33c5499031720c0000" }, - "6f6cf20649a9e973177ac67dbadee4ebe5c7bdda": { - "balance": "5080000000000000000000" + "0x6f6cf20649a9e973177ac67dbadee4ebe5c7bdda": { + "balance": "0x11363297d01a8600000" }, - "5fa7bfe043886127d4011d8356a47e947963aca8": { - "balance": "1820000000000000000000" + "0x5fa7bfe043886127d4011d8356a47e947963aca8": { + "balance": "0x62a992e53a0af00000" }, - "6af8e55969682c715f48ad4fc0fbb67eb59795a3": { - "balance": "2000000000000000000000" + "0x6af8e55969682c715f48ad4fc0fbb67eb59795a3": { + "balance": "0x6c6b935b8bbd400000" }, - "122f56122549d168a5c5e267f52662e5c5cce5c8": { - "balance": "185000000000000000000" + "0x122f56122549d168a5c5e267f52662e5c5cce5c8": { + "balance": "0xa076407d3f7440000" }, - "7713ab8037411c09ba687f6f9364f0d3239fac28": { - "balance": "10000000000000000000000" + "0x7713ab8037411c09ba687f6f9364f0d3239fac28": { + "balance": "0x21e19e0c9bab2400000" }, - "31ccc616b3118268e75d9ab8996c8858ebd7f3c3": { - "balance": "399924000000000000000" + "0x31ccc616b3118268e75d9ab8996c8858ebd7f3c3": { + "balance": "0x15ae0f771ca1520000" }, - "09c88f917e4d6ad473fa12e98ea3c4472a5ed6da": { - "balance": "10000000000000000000000" + "0x09c88f917e4d6ad473fa12e98ea3c4472a5ed6da": { + "balance": "0x21e19e0c9bab2400000" }, - "e796fd4e839b4c95d7510fb7c5c72b83c6c3e3c7": { - "balance": "512200000000000000000" + "0xe796fd4e839b4c95d7510fb7c5c72b83c6c3e3c7": { + "balance": "0x1bc433f23f83140000" }, - "a8285539869d88f8a961533755717d7eb65576ae": { - "balance": "200000000000000000000" + "0xa8285539869d88f8a961533755717d7eb65576ae": { + "balance": "0xad78ebc5ac6200000" }, - "d929c65d69d5bbaea59762662ef418bc21ad924a": { - "balance": "1000000000000000000000" + "0xd929c65d69d5bbaea59762662ef418bc21ad924a": { + "balance": "0x3635c9adc5dea00000" }, - "f7418aa0e713d248228776b2e7434222ae75e3a5": { - "balance": "2000000000000000000000" + "0xf7418aa0e713d248228776b2e7434222ae75e3a5": { + "balance": "0x6c6b935b8bbd400000" }, - "7f0b90a1fdd48f27b268feb38382e55ddb50ef0f": { - "balance": "940000000000000000000" + "0x7f0b90a1fdd48f27b268feb38382e55ddb50ef0f": { + "balance": "0x32f51edbaaa3300000" }, - "34a0431fff5ead927f3c69649616dc6e97945f6f": { - "balance": "400000000000000000000" + "0x34a0431fff5ead927f3c69649616dc6e97945f6f": { + "balance": "0x15af1d78b58c400000" }, - "1b3cb81e51011b549d78bf720b0d924ac763a7c2": { - "balance": "560000000000000000000000" + "0x1b3cb81e51011b549d78bf720b0d924ac763a7c2": { + "balance": "0x7695a92c20d6fe000000" }, - "155b3779bb6d56342e2fda817b5b2d81c7f41327": { - "balance": "50200000000000000000" + "0x155b3779bb6d56342e2fda817b5b2d81c7f41327": { + "balance": "0x2b8aa3a076c9c0000" }, - "ecd486fc196791b92cf612d348614f9156488b7e": { - "balance": "12000000000000000000000" + "0xecd486fc196791b92cf612d348614f9156488b7e": { + "balance": "0x28a857425466f800000" }, - "82a8cbbfdff02b2e38ae4bbfca15f1f0e83b1aea": { - "balance": "84999000000000000000" + "0x82a8cbbfdff02b2e38ae4bbfca15f1f0e83b1aea": { + "balance": "0x49b991c27ef6d8000" }, - "06b0c1e37f5a5ec4bbf50840548f9d3ac0288897": { - "balance": "4000098000000000000000" + "0x06b0c1e37f5a5ec4bbf50840548f9d3ac0288897": { + "balance": "0xd8d882e1928e7d0000" }, - "e6d49f86c228f47367a35e886caacb271e539429": { - "balance": "412656000000000000000" + "0xe6d49f86c228f47367a35e886caacb271e539429": { + "balance": "0x165ec09da7a1980000" }, - "704a6eb41ba34f13addde7d2db7df04915c7a221": { - "balance": "1820000000000000000000" + "0x704a6eb41ba34f13addde7d2db7df04915c7a221": { + "balance": "0x62a992e53a0af00000" }, - "745ccf2d819edbbddea8117b5c49ed3c2a066e93": { - "balance": "4000000000000000000000" + "0x745ccf2d819edbbddea8117b5c49ed3c2a066e93": { + "balance": "0xd8d726b7177a800000" }, - "6d3b7836a2b9d899721a4d237b522385dce8dfcd": { - "balance": "1000070000000000000000" + "0x6d3b7836a2b9d899721a4d237b522385dce8dfcd": { + "balance": "0x3636c25e66ece70000" }, - "856aa23c82d7215bec8d57f60ad75ef14fa35f44": { - "balance": "20000000000000000000000" + "0x856aa23c82d7215bec8d57f60ad75ef14fa35f44": { + "balance": "0x43c33c1937564800000" }, - "ea79057dabef5e64e7b44f7f18648e7e533718d2": { - "balance": "200000000000000000000" + "0xea79057dabef5e64e7b44f7f18648e7e533718d2": { + "balance": "0xad78ebc5ac6200000" }, - "9df057cd03a4e27e8e032f857985fd7f01adc8d7": { - "balance": "2000000000000000000000" + "0x9df057cd03a4e27e8e032f857985fd7f01adc8d7": { + "balance": "0x6c6b935b8bbd400000" }, - "5f2f07d2d697e8c567fcfdfe020f49f360be2139": { - "balance": "2000000000000000000000" + "0x5f2f07d2d697e8c567fcfdfe020f49f360be2139": { + "balance": "0x6c6b935b8bbd400000" }, - "5efbdfe5389999633c26605a5bfc2c1bb5959393": { - "balance": "69200000000000000000" + "0x5efbdfe5389999633c26605a5bfc2c1bb5959393": { + "balance": "0x3c057c95cd9080000" }, - "047e87c8f7d1fce3b01353a85862a948ac049f3e": { - "balance": "1490000000000000000000" + "0x047e87c8f7d1fce3b01353a85862a948ac049f3e": { + "balance": "0x50c5e761a444080000" }, - "265383d68b52d034161bfab01ae1b047942fbc32": { - "balance": "21000600000000000000000" + "0x265383d68b52d034161bfab01ae1b047942fbc32": { + "balance": "0x47271dee20d745c0000" }, - "760ff3354e0fde938d0fb5b82cef5ba15c3d2916": { - "balance": "10000000000000000000000" + "0x760ff3354e0fde938d0fb5b82cef5ba15c3d2916": { + "balance": "0x21e19e0c9bab2400000" }, - "bc46d537cf2edd403565bde733b2e34b215001bd": { - "balance": "20000000000000000000000" + "0xbc46d537cf2edd403565bde733b2e34b215001bd": { + "balance": "0x43c33c1937564800000" }, - "ee58fb3db29070d0130188ce472be0a172b89055": { - "balance": "10021400000000000000000" + "0xee58fb3db29070d0130188ce472be0a172b89055": { + "balance": "0x21f42dcdc58e39c0000" }, - "75abe5270f3a78ce007cf37f8fbc045d489b7bb1": { - "balance": "1999944000000000000000" + "0x75abe5270f3a78ce007cf37f8fbc045d489b7bb1": { + "balance": "0x6c6acc67d7b1d40000" }, - "5fc6c11426b4a1eae7e51dd512ad1090c6f1a85b": { - "balance": "2730000000000000000000" + "0x5fc6c11426b4a1eae7e51dd512ad1090c6f1a85b": { + "balance": "0x93fe5c57d710680000" }, - "26cfffd052152bb3f957b478d5f98b233a7c2b92": { - "balance": "4000000000000000000000" + "0x26cfffd052152bb3f957b478d5f98b233a7c2b92": { + "balance": "0xd8d726b7177a800000" }, - "0a4a011995c681bc999fdd79754e9a324ae3b379": { - "balance": "41350300000000000000000" + "0x0a4a011995c681bc999fdd79754e9a324ae3b379": { + "balance": "0x8c19ab06eb89af60000" }, - "6fa60df818a5446418b1bbd62826e0b9825e1318": { - "balance": "13200000000000000000000" + "0x6fa60df818a5446418b1bbd62826e0b9825e1318": { + "balance": "0x2cb92cc8f6714400000" }, - "63d55ad99b9137fd1b20cc2b4f03d42cbaddf334": { - "balance": "400000000000000000000" + "0x63d55ad99b9137fd1b20cc2b4f03d42cbaddf334": { + "balance": "0x15af1d78b58c400000" }, - "679b9a109930517e8999099ccf2a914c4c8dd934": { - "balance": "60000000000000000000" + "0x679b9a109930517e8999099ccf2a914c4c8dd934": { + "balance": "0x340aad21b3b700000" }, - "3e83544f0082552572c782bee5d218f1ef064a9d": { - "balance": "100076000000000000000" + "0x3e83544f0082552572c782bee5d218f1ef064a9d": { + "balance": "0x56cd55fc64dfe0000" }, - "968b14648f018333687cd213fa640aec04ce6323": { - "balance": "1000000000000000000000" + "0x968b14648f018333687cd213fa640aec04ce6323": { + "balance": "0x3635c9adc5dea00000" }, - "427b462ab84e5091f48a46eb0cdc92ddcb26e078": { - "balance": "2000000000000000000000" + "0x427b462ab84e5091f48a46eb0cdc92ddcb26e078": { + "balance": "0x6c6b935b8bbd400000" }, - "df8510793eee811c2dab1c93c6f4473f30fbef5b": { - "balance": "1000000000000000000000" + "0xdf8510793eee811c2dab1c93c6f4473f30fbef5b": { + "balance": "0x3635c9adc5dea00000" }, - "362fbcb10662370a068fc2652602a2577937cce6": { - "balance": "200000000000000000000" + "0x362fbcb10662370a068fc2652602a2577937cce6": { + "balance": "0xad78ebc5ac6200000" }, - "5d83b21bd2712360436b67a597ee3378db3e7ae4": { - "balance": "2000000000000000000000" + "0x5d83b21bd2712360436b67a597ee3378db3e7ae4": { + "balance": "0x6c6b935b8bbd400000" }, - "5777441c83e03f0be8dd340bde636850847c620b": { - "balance": "10000000000000000000000" + "0x5777441c83e03f0be8dd340bde636850847c620b": { + "balance": "0x21e19e0c9bab2400000" }, - "c94a585203da7bbafd93e15884e660d4b1ead854": { - "balance": "7000000000000000000000" + "0xc94a585203da7bbafd93e15884e660d4b1ead854": { + "balance": "0x17b7883c06916600000" }, - "35a08081799173e001cc5bd46a02406dc95d1787": { - "balance": "10000000000000000000000" + "0x35a08081799173e001cc5bd46a02406dc95d1787": { + "balance": "0x21e19e0c9bab2400000" }, - "21d13f0c4024e967d9470791b50f22de3afecf1b": { - "balance": "4452210000000000000000" + "0x21d13f0c4024e967d9470791b50f22de3afecf1b": { + "balance": "0xf15ad35e2e31e50000" }, - "fdfd6134c04a8ab7eb16f00643f8fed7daaaecb2": { - "balance": "400000000000000000000" + "0xfdfd6134c04a8ab7eb16f00643f8fed7daaaecb2": { + "balance": "0x15af1d78b58c400000" }, - "fd812bc69fb170ef57e2327e80affd14f8e4b6d2": { - "balance": "2000000000000000000000" + "0xfd812bc69fb170ef57e2327e80affd14f8e4b6d2": { + "balance": "0x6c6b935b8bbd400000" }, - "7148aef33261d8031fac3f7182ff35928daf54d9": { - "balance": "4100000000000000000000" + "0x7148aef33261d8031fac3f7182ff35928daf54d9": { + "balance": "0xde42ee1544dd900000" }, - "0b06390f2437b20ec4a3d3431b3279c6583e5ed7": { - "balance": "194000000000000000000" + "0x0b06390f2437b20ec4a3d3431b3279c6583e5ed7": { + "balance": "0xa844a7424d9c80000" }, - "4909b31998ead414b8fb0e846bd5cbde393935be": { - "balance": "4000000000000000000000" + "0x4909b31998ead414b8fb0e846bd5cbde393935be": { + "balance": "0xd8d726b7177a800000" }, - "b70dba9391682b4a364e77fe99256301a6c0bf1f": { - "balance": "200000000000000000000" + "0xb70dba9391682b4a364e77fe99256301a6c0bf1f": { + "balance": "0xad78ebc5ac6200000" }, - "6b83bae7b565244558555bcf4ba8da2011891c17": { - "balance": "2000000000000000000000" + "0x6b83bae7b565244558555bcf4ba8da2011891c17": { + "balance": "0x6c6b935b8bbd400000" }, - "70a03549aa6168e97e88a508330a5a0bea74711a": { - "balance": "1337000000000000000000" + "0x70a03549aa6168e97e88a508330a5a0bea74711a": { + "balance": "0x487a9a304539440000" }, - "0fc9a0e34145fbfdd2c9d2a499b617d7a02969b9": { - "balance": "180000000000000000000" + "0x0fc9a0e34145fbfdd2c9d2a499b617d7a02969b9": { + "balance": "0x9c2007651b2500000" }, - "2ddf40905769bcc426cb2c2938ffe077e1e89d98": { - "balance": "3000000000000000000000" + "0x2ddf40905769bcc426cb2c2938ffe077e1e89d98": { + "balance": "0xa2a15d09519be00000" }, - "794b51c39e53d9e762b0613b829a44b472f4fff3": { - "balance": "667965000000000000000" + "0x794b51c39e53d9e762b0613b829a44b472f4fff3": { + "balance": "0x2435e0647841cc8000" }, - "d062588171cf99bbeb58f126b870f9a3728d61ec": { - "balance": "4500000000000000000000" + "0xd062588171cf99bbeb58f126b870f9a3728d61ec": { + "balance": "0xf3f20b8dfa69d00000" }, - "8db185fe1b70a94a6a080e7e23a8bedc4acbf34b": { - "balance": "1400000000000000000000" + "0x8db185fe1b70a94a6a080e7e23a8bedc4acbf34b": { + "balance": "0x4be4e7267b6ae00000" }, - "e73bfeada6f0fd016fbc843ebcf6e370a65be70c": { - "balance": "1970000000000000000000" + "0xe73bfeada6f0fd016fbc843ebcf6e370a65be70c": { + "balance": "0x6acb3df27e1f880000" }, - "79ed10cf1f6db48206b50919b9b697081fbdaaf3": { - "balance": "2000000000000000000000" + "0x79ed10cf1f6db48206b50919b9b697081fbdaaf3": { + "balance": "0x6c6b935b8bbd400000" }, - "276b0521b0e68b277df0bb32f3fd48326350bfb2": { - "balance": "50000000000000000000" + "0x276b0521b0e68b277df0bb32f3fd48326350bfb2": { + "balance": "0x2b5e3af16b1880000" }, - "2e439348df8a4277b22a768457d1158e97c40904": { - "balance": "776970000000000000000" + "0x2e439348df8a4277b22a768457d1158e97c40904": { + "balance": "0x2a1e9ff26fbf410000" }, - "6c25327f8dcbb2f45e561e86e35d8850e53ab059": { - "balance": "1103200000000000000000" + "0x6c25327f8dcbb2f45e561e86e35d8850e53ab059": { + "balance": "0x3bcdf9bafef2f00000" }, - "04d73896cf6593a691972a13a6e4871ff2c42b13": { - "balance": "2000000000000000000000" + "0x04d73896cf6593a691972a13a6e4871ff2c42b13": { + "balance": "0x6c6b935b8bbd400000" }, - "b10fd2a647102f881f74c9fbc37da632949f2375": { - "balance": "40000000000000000000" + "0xb10fd2a647102f881f74c9fbc37da632949f2375": { + "balance": "0x22b1c8c1227a00000" }, - "615f82365c5101f071e7d2cb6af14f7aad2c16c6": { - "balance": "20000000000000000000" + "0x615f82365c5101f071e7d2cb6af14f7aad2c16c6": { + "balance": "0x1158e460913d00000" }, - "93aa8f92ebfff991fc055e906e651ac768d32bc8": { - "balance": "940000000000000000000" + "0x93aa8f92ebfff991fc055e906e651ac768d32bc8": { + "balance": "0x32f51edbaaa3300000" }, - "0cbf8770f0d1082e5c20c5aead34e5fca9ae7ae2": { - "balance": "1000000000000000000000" + "0x0cbf8770f0d1082e5c20c5aead34e5fca9ae7ae2": { + "balance": "0x3635c9adc5dea00000" }, - "ffc9cc3094b041ad0e076f968a0de3b167255866": { - "balance": "432400000000000000000" + "0xffc9cc3094b041ad0e076f968a0de3b167255866": { + "balance": "0x1770c1650beee80000" }, - "46531e8b1bde097fdf849d6d119885608a008df7": { - "balance": "200000000000000000000" + "0x46531e8b1bde097fdf849d6d119885608a008df7": { + "balance": "0xad78ebc5ac6200000" }, - "23cd2598a20e149ead2ad69379576ecedb60e38e": { - "balance": "2000000000000000000000" + "0x23cd2598a20e149ead2ad69379576ecedb60e38e": { + "balance": "0x6c6b935b8bbd400000" }, - "85ca8bc6da2803d0725f5e1a456c89f9bc774e2f": { - "balance": "600000000000000000000" + "0x85ca8bc6da2803d0725f5e1a456c89f9bc774e2f": { + "balance": "0x2086ac351052600000" }, - "c0725ec2bdc33a1d826071dea29d62d4385a8c25": { - "balance": "40740000000000000000000" + "0xc0725ec2bdc33a1d826071dea29d62d4385a8c25": { + "balance": "0x8a08513463aa6100000" }, - "0e4765790352656bc656682c24fc5ef3e76a23c7": { - "balance": "46610000000000000000" + "0x0e4765790352656bc656682c24fc5ef3e76a23c7": { + "balance": "0x286d7fc0cb4f50000" }, - "2ef9e465716acacfb8c8252fa8e7bc7969ebf6e4": { - "balance": "2760000000000000000000" + "0x2ef9e465716acacfb8c8252fa8e7bc7969ebf6e4": { + "balance": "0x959eb1c0e4ae200000" }, - "0ec5308b31282e218fc9e759d4fec5db3708cec4": { - "balance": "1001000000000000000000" + "0x0ec5308b31282e218fc9e759d4fec5db3708cec4": { + "balance": "0x3643aa647986040000" }, - "bf7701fc6225d5a17815438a8941d21ebc5d059d": { - "balance": "1880000000000000000000" + "0xbf7701fc6225d5a17815438a8941d21ebc5d059d": { + "balance": "0x65ea3db75546600000" }, - "c489c83ffbb0252ac0dbe3521217630e0f491f14": { - "balance": "4000000000000000000000" + "0xc489c83ffbb0252ac0dbe3521217630e0f491f14": { + "balance": "0xd8d726b7177a800000" }, - "8eb51774af206b966b8909c45aa6722748802c0c": { - "balance": "500000000000000000000" + "0x8eb51774af206b966b8909c45aa6722748802c0c": { + "balance": "0x1b1ae4d6e2ef500000" }, - "7b9226d46fe751940bc416a798b69ccf0dfab667": { - "balance": "4200000000000000000000" + "0x7b9226d46fe751940bc416a798b69ccf0dfab667": { + "balance": "0xe3aeb5737240a00000" }, - "8f660f8b2e4c7cc2b4ac9c47ed28508d5f8f8650": { - "balance": "20000000000000000000000" + "0x8f660f8b2e4c7cc2b4ac9c47ed28508d5f8f8650": { + "balance": "0x43c33c1937564800000" }, - "9f19fac8a32437d80ac6837a0bb7841729f4972e": { - "balance": "650100000000000000000" + "0x9f19fac8a32437d80ac6837a0bb7841729f4972e": { + "balance": "0x233df3299f61720000" }, - "201864a8f784c2277b0b7c9ee734f7b377eab648": { - "balance": "4467000000000000000000" + "0x201864a8f784c2277b0b7c9ee734f7b377eab648": { + "balance": "0xf2281400d1d5ec0000" }, - "a6101c961e8e1c15798ffcd0e3201d7786ec373a": { - "balance": "6000000000000000000000" + "0xa6101c961e8e1c15798ffcd0e3201d7786ec373a": { + "balance": "0x14542ba12a337c00000" }, - "d4ff46203efa23064b1caf00516e28704a82a4f8": { - "balance": "1337000000000000000000" + "0xd4ff46203efa23064b1caf00516e28704a82a4f8": { + "balance": "0x487a9a304539440000" }, - "aa136b47962bb8b4fb540db4ccf5fdd042ffb8cf": { - "balance": "500038000000000000000" + "0xaa136b47962bb8b4fb540db4ccf5fdd042ffb8cf": { + "balance": "0x1b1b6bd7af64c70000" }, - "704ae21d762d6e1dde28c235d13104597236db1a": { - "balance": "2000000000000000000000" + "0x704ae21d762d6e1dde28c235d13104597236db1a": { + "balance": "0x6c6b935b8bbd400000" }, - "f17a92e0361dbacecdc5de0d1894955af6a9b606": { - "balance": "2000000000000000000000" + "0xf17a92e0361dbacecdc5de0d1894955af6a9b606": { + "balance": "0x6c6b935b8bbd400000" }, - "8b48e19d39dd35b66e6e1bb6b9c657cb2cf59d04": { - "balance": "17844175000000000000000" + "0x8b48e19d39dd35b66e6e1bb6b9c657cb2cf59d04": { + "balance": "0x3c755ac9c024a018000" }, - "9ad47fdcf9cd942d28effd5b84115b31a658a13e": { - "balance": "3290000000000000000000" + "0x9ad47fdcf9cd942d28effd5b84115b31a658a13e": { + "balance": "0xb259ec00d53b280000" }, - "df0d08617bd252a911df8bd41a39b83ddf809673": { - "balance": "10000000000000000000000" + "0xdf0d08617bd252a911df8bd41a39b83ddf809673": { + "balance": "0x21e19e0c9bab2400000" }, - "4c666b86f1c5ee8ca41285f5bde4f79052081406": { - "balance": "500000000000000000000" + "0x4c666b86f1c5ee8ca41285f5bde4f79052081406": { + "balance": "0x1b1ae4d6e2ef500000" }, - "88dec5bd3f4eba2d18b8aacefa7b721548c319ba": { - "balance": "1370000000000000000000" + "0x88dec5bd3f4eba2d18b8aacefa7b721548c319ba": { + "balance": "0x4a4491bd6dcd280000" }, - "9f9fe0c95f10fee87af1af207236c8f3614ef02f": { - "balance": "6000000000000000000000" + "0x9f9fe0c95f10fee87af1af207236c8f3614ef02f": { + "balance": "0x14542ba12a337c00000" }, - "f7d0d310acea18406138baaabbfe0571e80de85f": { - "balance": "1337000000000000000000" + "0xf7d0d310acea18406138baaabbfe0571e80de85f": { + "balance": "0x487a9a304539440000" }, - "9569c63a9284a805626db3a32e9d236393476151": { - "balance": "1970000000000000000000" + "0x9569c63a9284a805626db3a32e9d236393476151": { + "balance": "0x6acb3df27e1f880000" }, - "5d5c2c1099bbeefb267e74b58880b444d94449e0": { - "balance": "253574000000000000000" + "0x5d5c2c1099bbeefb267e74b58880b444d94449e0": { + "balance": "0xdbf0bd181e2e70000" }, - "8c6ae7a05a1de57582ae2768204276c0ff47ed03": { - "balance": "208000000000000000000000" + "0x8c6ae7a05a1de57582ae2768204276c0ff47ed03": { + "balance": "0x2c0bb3dd30c4e2000000" }, - "432d884bd69db1acc0d89c64ade4cb4fc3a88b7a": { - "balance": "2483000000000000000000" + "0x432d884bd69db1acc0d89c64ade4cb4fc3a88b7a": { + "balance": "0x869a8c10808eec0000" }, - "672cbca8440a8577097b19aff593a2ad9d28a756": { - "balance": "80000000000000000000" + "0x672cbca8440a8577097b19aff593a2ad9d28a756": { + "balance": "0x4563918244f400000" }, - "19df9445a81c1b3d804aeaeb6f6e204e4236663f": { - "balance": "37387000000000000000" + "0x19df9445a81c1b3d804aeaeb6f6e204e4236663f": { + "balance": "0x206d94e6a49878000" }, - "1cb5f33b4d488936d13e3161da33a1da7df70d1b": { - "balance": "200000000000000000000" + "0x1cb5f33b4d488936d13e3161da33a1da7df70d1b": { + "balance": "0xad78ebc5ac6200000" }, - "df60f18c812a11ed4e2776e7a80ecf5e5305b3d6": { - "balance": "900000000000000000000" + "0xdf60f18c812a11ed4e2776e7a80ecf5e5305b3d6": { + "balance": "0x30ca024f987b900000" }, - "c99a9cd6c9c1be3534eecd92ecc22f5c38e9515b": { - "balance": "4821030000000000000000" + "0xc99a9cd6c9c1be3534eecd92ecc22f5c38e9515b": { + "balance": "0x105593b3a169d770000" }, - "00c40fe2095423509b9fd9b754323158af2310f3": { - "balance": "0" + "0x00c40fe2095423509b9fd9b754323158af2310f3": { + "balance": "0x0" }, - "da4a5f557f3bab390a92f49b9b900af30c46ae80": { - "balance": "10000000000000000000000" + "0xda4a5f557f3bab390a92f49b9b900af30c46ae80": { + "balance": "0x21e19e0c9bab2400000" }, - "f36df02fbd89607347afce2969b9c4236a58a506": { - "balance": "2000000000000000000000" + "0xf36df02fbd89607347afce2969b9c4236a58a506": { + "balance": "0x6c6b935b8bbd400000" }, - "c549df83c6f65eec0f1dc9a0934a5c5f3a50fd88": { - "balance": "2910000000000000000000" + "0xc549df83c6f65eec0f1dc9a0934a5c5f3a50fd88": { + "balance": "0x9dc05cce28c2b80000" }, - "9f662e95274121f177566e636d23964cf1fd686f": { - "balance": "2000000000000000000000" + "0x9f662e95274121f177566e636d23964cf1fd686f": { + "balance": "0x6c6b935b8bbd400000" }, - "5a267331facb262daaecd9dd63a9700c5f5259df": { - "balance": "100000000000000000000" + "0x5a267331facb262daaecd9dd63a9700c5f5259df": { + "balance": "0x56bc75e2d63100000" }, - "117d9aa3c4d13bee12c7500f09f5dd1c66c46504": { - "balance": "206000000000000000000" + "0x117d9aa3c4d13bee12c7500f09f5dd1c66c46504": { + "balance": "0xb2ad30490b2780000" }, - "1b4d07acd38183a61bb2783d2b7b178dd502ac8d": { - "balance": "200000000000000000000" + "0x1b4d07acd38183a61bb2783d2b7b178dd502ac8d": { + "balance": "0xad78ebc5ac6200000" }, - "3c0c3defac9cea7acc319a96c30b8e1fedab4574": { - "balance": "1940000000000000000000" + "0x3c0c3defac9cea7acc319a96c30b8e1fedab4574": { + "balance": "0x692ae8897081d00000" }, - "e4dc22ed595bf0a337c01e03cc6be744255fc9e8": { - "balance": "191000000000000000000" + "0xe4dc22ed595bf0a337c01e03cc6be744255fc9e8": { + "balance": "0xa5aa85009e39c0000" }, - "8f067c7c1bbd57780b7b9eeb9ec0032f90d0dcf9": { - "balance": "20000000000000000000000" + "0x8f067c7c1bbd57780b7b9eeb9ec0032f90d0dcf9": { + "balance": "0x43c33c1937564800000" }, - "40e2440ae142c880366a12c6d4102f4b8434b62a": { - "balance": "1000000000000000000000" + "0x40e2440ae142c880366a12c6d4102f4b8434b62a": { + "balance": "0x3635c9adc5dea00000" }, - "f9ece022bccd2c92346911e79dd50303c01e0188": { - "balance": "1000000000000000000000" + "0xf9ece022bccd2c92346911e79dd50303c01e0188": { + "balance": "0x3635c9adc5dea00000" }, - "f70328ef97625fe745faa49ee0f9d4aa3b0dfb69": { - "balance": "1000000000000000000000" + "0xf70328ef97625fe745faa49ee0f9d4aa3b0dfb69": { + "balance": "0x3635c9adc5dea00000" }, - "b6aacb8cb30bab2ae4a2424626e6e12b02d04605": { - "balance": "8000000000000000000000" + "0xb6aacb8cb30bab2ae4a2424626e6e12b02d04605": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "154459fa2f21318e3434449789d826cdc1570ce5": { - "balance": "2000000000000000000000" + "0x154459fa2f21318e3434449789d826cdc1570ce5": { + "balance": "0x6c6b935b8bbd400000" }, - "684a44c069339d08e19a75668bdba303be855332": { - "balance": "70000000000000000000000" + "0x684a44c069339d08e19a75668bdba303be855332": { + "balance": "0xed2b525841adfc00000" }, - "9fe501aa57ead79278937cd6308c5cfa7a5629fe": { - "balance": "50003000000000000000" + "0x9fe501aa57ead79278937cd6308c5cfa7a5629fe": { + "balance": "0x2b5ee57929fdb8000" }, - "3e45bd55db9060eced923bb9cb733cb3573fb531": { - "balance": "1640000000000000000000" + "0x3e45bd55db9060eced923bb9cb733cb3573fb531": { + "balance": "0x58e7926ee858a00000" }, - "9c9f3b8a811b21f3ff3fe20fe970051ce66a824f": { - "balance": "1157740000000000000000" + "0x9c9f3b8a811b21f3ff3fe20fe970051ce66a824f": { + "balance": "0x3ec2debc07d4be0000" }, - "e99aece90541cae224b87da673965e0aeb296afd": { - "balance": "920000000000000000000" + "0xe99aece90541cae224b87da673965e0aeb296afd": { + "balance": "0x31df9095a18f600000" }, - "2f6dce1330c59ef921602154572d4d4bacbd048a": { - "balance": "1000000000000000000000" + "0x2f6dce1330c59ef921602154572d4d4bacbd048a": { + "balance": "0x3635c9adc5dea00000" }, - "6a6353b971589f18f2955cba28abe8acce6a5761": { - "balance": "3000000000000000000000" + "0x6a6353b971589f18f2955cba28abe8acce6a5761": { + "balance": "0xa2a15d09519be00000" }, - "98c10ebf2c4f97cba5a1ab3f2aafe1cac423f8cb": { - "balance": "300000000000000000000" + "0x98c10ebf2c4f97cba5a1ab3f2aafe1cac423f8cb": { + "balance": "0x1043561a8829300000" }, - "8077c3e4c445586e094ce102937fa05b737b568c": { - "balance": "100000000000000000000" + "0x8077c3e4c445586e094ce102937fa05b737b568c": { + "balance": "0x56bc75e2d63100000" }, - "13371f92a56ea8381e43059a95128bdc4d43c5a6": { - "balance": "1000000000000000000000" + "0x13371f92a56ea8381e43059a95128bdc4d43c5a6": { + "balance": "0x3635c9adc5dea00000" }, - "35a6885083c899dabbf530ed6c12f4dd3a204cf5": { - "balance": "200000000000000000000" + "0x35a6885083c899dabbf530ed6c12f4dd3a204cf5": { + "balance": "0xad78ebc5ac6200000" }, - "36b2c85e3aeeebb70d63c4a4730ce2e8e88a3624": { - "balance": "10000000000000000000000" + "0x36b2c85e3aeeebb70d63c4a4730ce2e8e88a3624": { + "balance": "0x21e19e0c9bab2400000" }, - "5ce44068b8f4a3fe799e6a8311dbfdeda29dee0e": { - "balance": "2000000000000000000000" + "0x5ce44068b8f4a3fe799e6a8311dbfdeda29dee0e": { + "balance": "0x6c6b935b8bbd400000" }, - "6fa6388d402b30afe59934c3b9e13d1186476018": { - "balance": "670000000000000000000" + "0x6fa6388d402b30afe59934c3b9e13d1186476018": { + "balance": "0x24521e2a3017b80000" }, - "8251358ca4e060ddb559ca58bc0bddbeb4070203": { - "balance": "2000000000000000000000" + "0x8251358ca4e060ddb559ca58bc0bddbeb4070203": { + "balance": "0x6c6b935b8bbd400000" }, - "17e86f3b5b30c0ba59f2b2e858425ba89f0a10b0": { - "balance": "2000000000000000000000" + "0x17e86f3b5b30c0ba59f2b2e858425ba89f0a10b0": { + "balance": "0x6c6b935b8bbd400000" }, - "298ec76b440d8807b3f78b5f90979bee42ed43db": { - "balance": "30000000000000000000000" + "0x298ec76b440d8807b3f78b5f90979bee42ed43db": { + "balance": "0x65a4da25d3016c00000" }, - "ce4b065dbcb23047203262fb48c1188364977470": { - "balance": "500000000000000000000" + "0xce4b065dbcb23047203262fb48c1188364977470": { + "balance": "0x1b1ae4d6e2ef500000" }, - "c8e2adeb545e499d982c0c117363ceb489c5b11f": { - "balance": "985000000000000000000" + "0xc8e2adeb545e499d982c0c117363ceb489c5b11f": { + "balance": "0x35659ef93f0fc40000" }, - "9928ff715afc3a2b60f8eb4cc4ba4ee8dab6e59d": { - "balance": "440000000000000000000" + "0x9928ff715afc3a2b60f8eb4cc4ba4ee8dab6e59d": { + "balance": "0x17da3a04c7b3e00000" }, - "c76130c73cb9210238025c9df95d0be54ac67fbe": { - "balance": "1500000000000000000000" + "0xc76130c73cb9210238025c9df95d0be54ac67fbe": { + "balance": "0x5150ae84a8cdf00000" }, - "72d03d4dfab3500cf89b86866f15d4528e14a195": { - "balance": "4488000000000000000000" + "0x72d03d4dfab3500cf89b86866f15d4528e14a195": { + "balance": "0xf34b82fd8e91200000" }, - "d193e583d6070563e7b862b9614a47e99489f3e5": { - "balance": "999972000000000000000" + "0xd193e583d6070563e7b862b9614a47e99489f3e5": { + "balance": "0x36356633ebd8ea0000" }, - "4df140ba796585dd5489315bca4bba680adbb818": { - "balance": "2674000000000000000000" + "0x4df140ba796585dd5489315bca4bba680adbb818": { + "balance": "0x90f534608a72880000" }, - "009eef0a0886056e3f69211853b9b7457f3782e4": { - "balance": "3000512000000000000000" + "0x009eef0a0886056e3f69211853b9b7457f3782e4": { + "balance": "0xa2a878069b28e00000" }, - "6e255b700ae7138a4bacf22888a9e2c00a285eec": { - "balance": "4000000000000000000000" + "0x6e255b700ae7138a4bacf22888a9e2c00a285eec": { + "balance": "0xd8d726b7177a800000" }, - "aa47a4ffc979363232c99b99fada0f2734b0aeee": { - "balance": "8121800000000000000000" + "0xaa47a4ffc979363232c99b99fada0f2734b0aeee": { + "balance": "0x1b8489df4dbff940000" }, - "9d069197d1de50045a186f5ec744ac40e8af91c6": { - "balance": "2000000000000000000000" + "0x9d069197d1de50045a186f5ec744ac40e8af91c6": { + "balance": "0x6c6b935b8bbd400000" }, - "b514882c979bb642a80dd38754d5b8c8296d9a07": { - "balance": "955000000000000000000" + "0xb514882c979bb642a80dd38754d5b8c8296d9a07": { + "balance": "0x33c5499031720c0000" }, - "17c0478657e1d3d17aaa331dd429cecf91f8ae5d": { - "balance": "999942000000000000000" + "0x17c0478657e1d3d17aaa331dd429cecf91f8ae5d": { + "balance": "0x3634fb9f1489a70000" }, - "5f9616c47b4a67f406b95a14fe6fc268396f1721": { - "balance": "200000000000000000000" + "0x5f9616c47b4a67f406b95a14fe6fc268396f1721": { + "balance": "0xad78ebc5ac6200000" }, - "f70a998a717b338d1dd99854409b1a338deea4b0": { - "balance": "2000000000000000000000" + "0xf70a998a717b338d1dd99854409b1a338deea4b0": { + "balance": "0x6c6b935b8bbd400000" }, - "d1ee905957fe7cc70ec8f2868b43fe47b13febff": { - "balance": "44000000000000000000" + "0xd1ee905957fe7cc70ec8f2868b43fe47b13febff": { + "balance": "0x2629f66e0c5300000" }, - "fc018a690ad6746dbe3acf9712ddca52b6250039": { - "balance": "10000000000000000000000" + "0xfc018a690ad6746dbe3acf9712ddca52b6250039": { + "balance": "0x21e19e0c9bab2400000" }, - "5118557d600d05c2fcbf3806ffbd93d02025d730": { - "balance": "11360000000000000000000" + "0x5118557d600d05c2fcbf3806ffbd93d02025d730": { + "balance": "0x267d3ab6423f5800000" }, - "1ef5c9c73650cfbbde5c885531d427c7c3fe5544": { - "balance": "6000000000000000000000" + "0x1ef5c9c73650cfbbde5c885531d427c7c3fe5544": { + "balance": "0x14542ba12a337c00000" }, - "d1a396dcdab2c7494130b3fd307820340dfd8c1f": { - "balance": "17952000000000000000" + "0xd1a396dcdab2c7494130b3fd307820340dfd8c1f": { + "balance": "0xf92250e2dfd00000" }, - "2d8e061892a5dcce21966ae1bb0788fd3e8ba059": { - "balance": "250066000000000000000" + "0x2d8e061892a5dcce21966ae1bb0788fd3e8ba059": { + "balance": "0xd8e5ce617f2d50000" }, - "8834b2453471f324fb26be5b25166b5b5726025d": { - "balance": "573000000000000000000" + "0x8834b2453471f324fb26be5b25166b5b5726025d": { + "balance": "0x1f0ff8f01daad40000" }, - "14f221159518783bc4a706676fc4f3c5ee405829": { - "balance": "200000000000000000000" + "0x14f221159518783bc4a706676fc4f3c5ee405829": { + "balance": "0xad78ebc5ac6200000" }, - "c056d4bd6bf3cbacac65f8f5a0e3980b852740ae": { - "balance": "100000000000000000000" + "0xc056d4bd6bf3cbacac65f8f5a0e3980b852740ae": { + "balance": "0x56bc75e2d63100000" }, - "560536794a9e2b0049d10233c41adc5f418a264a": { - "balance": "1000000000000000000000" + "0x560536794a9e2b0049d10233c41adc5f418a264a": { + "balance": "0x3635c9adc5dea00000" }, - "bc9e0ec6788f7df4c7fc210aacd220c27e45c910": { - "balance": "500000000000000000000" + "0xbc9e0ec6788f7df4c7fc210aacd220c27e45c910": { + "balance": "0x1b1ae4d6e2ef500000" }, - "54bcb8e7f73cda3d73f4d38b2d0847e600ba0df8": { - "balance": "1078000000000000000000" + "0x54bcb8e7f73cda3d73f4d38b2d0847e600ba0df8": { + "balance": "0x3a70415882df180000" }, - "4361d4846fafb377b6c0ee49a596a78ddf3516a3": { - "balance": "3580000000000000000000" + "0x4361d4846fafb377b6c0ee49a596a78ddf3516a3": { + "balance": "0xc2127af858da700000" }, - "41c3c2367534d13ba2b33f185cdbe6ac43c2fa31": { - "balance": "4000000000000000000000" + "0x41c3c2367534d13ba2b33f185cdbe6ac43c2fa31": { + "balance": "0xd8d726b7177a800000" }, - "5dc6f45fef26b06e3302313f884daf48e2746fb9": { - "balance": "500000000000000000000" + "0x5dc6f45fef26b06e3302313f884daf48e2746fb9": { + "balance": "0x1b1ae4d6e2ef500000" }, - "ad414d29cb7ee973fec54e22a388491786cf5402": { - "balance": "14000000000000000000000" + "0xad414d29cb7ee973fec54e22a388491786cf5402": { + "balance": "0x2f6f10780d22cc00000" }, - "802dc3c4ff2d7d925ee2859f4a06d7ba60f1308c": { - "balance": "98040000000000000000" + "0x802dc3c4ff2d7d925ee2859f4a06d7ba60f1308c": { + "balance": "0x550940c8fd34c0000" }, - "2aed2ce531c056b0097efc3c6de10c4762004ed9": { - "balance": "10430000000000000000000" + "0x2aed2ce531c056b0097efc3c6de10c4762004ed9": { + "balance": "0x2356953ab7ddc380000" }, - "39782ffe06ac78822a3c3a8afe305e50a56188ce": { - "balance": "10000000000000000000000" + "0x39782ffe06ac78822a3c3a8afe305e50a56188ce": { + "balance": "0x21e19e0c9bab2400000" }, - "ec73833de4b810bb027810fc8f69f544e83c12d1": { - "balance": "1000000000000000000000" + "0xec73833de4b810bb027810fc8f69f544e83c12d1": { + "balance": "0x3635c9adc5dea00000" }, - "8d51a4cc62011322c696fd725b9fb8f53feaaa07": { - "balance": "1000000000000000000000" + "0x8d51a4cc62011322c696fd725b9fb8f53feaaa07": { + "balance": "0x3635c9adc5dea00000" }, - "29298ccbdff689f87fe41aa6e98fdfb53deaf37a": { - "balance": "19800000000000000000000" + "0x29298ccbdff689f87fe41aa6e98fdfb53deaf37a": { + "balance": "0x4315c32d71a9e600000" }, - "827531a6c5817ae35f82b00b9754fcf74c55e232": { - "balance": "3600000000000000000000" + "0x827531a6c5817ae35f82b00b9754fcf74c55e232": { + "balance": "0xc328093e61ee400000" }, - "9c581a60b61028d934167929b22d70b313c34fd0": { - "balance": "50000000000000000000000" + "0x9c581a60b61028d934167929b22d70b313c34fd0": { + "balance": "0xa968163f0a57b400000" }, - "0a077db13ffeb09484c217709d5886b8bf9c5a8b": { - "balance": "4000000000000000000000" + "0x0a077db13ffeb09484c217709d5886b8bf9c5a8b": { + "balance": "0xd8d726b7177a800000" }, - "07b7a57033f8f11330e4665e185d234e83ec140b": { - "balance": "4325683000000000000000" + "0x07b7a57033f8f11330e4665e185d234e83ec140b": { + "balance": "0xea7ee92a0c9a0b8000" }, - "17f523f117bc9fe978aa481eb4f5561711371bc8": { - "balance": "1999884000000000000000" + "0x17f523f117bc9fe978aa481eb4f5561711371bc8": { + "balance": "0x6c69f73e29134e0000" }, - "de42fcd24ce4239383304367595f068f0c610740": { - "balance": "45120000000000000000" + "0xde42fcd24ce4239383304367595f068f0c610740": { + "balance": "0x2722a70f1a9a00000" }, - "2a46d353777176ff8e83ffa8001f4f70f9733aa5": { - "balance": "106000000000000000000" + "0x2a46d353777176ff8e83ffa8001f4f70f9733aa5": { + "balance": "0x5bf0ba6634f680000" }, - "92e4392816e5f2ef5fb65837cec2c2325cc64922": { - "balance": "10000000000000000000000" + "0x92e4392816e5f2ef5fb65837cec2c2325cc64922": { + "balance": "0x21e19e0c9bab2400000" }, - "9a3da65023a13020d22145cfc18bab10bd19ce4e": { - "balance": "456516000000000000000" + "0x9a3da65023a13020d22145cfc18bab10bd19ce4e": { + "balance": "0x18bf6ea3464a3a0000" }, - "1a085d43ec92414ea27b914fe767b6d46b1eef44": { - "balance": "29550000000000000000000" + "0x1a085d43ec92414ea27b914fe767b6d46b1eef44": { + "balance": "0x641e8a13563d8f80000" }, - "3b2367f8494b5fe18d683c055d89999c9f3d1b34": { - "balance": "10000000000000000000000" + "0x3b2367f8494b5fe18d683c055d89999c9f3d1b34": { + "balance": "0x21e19e0c9bab2400000" }, - "84244fc95a6957ed7c1504e49f30b8c35eca4b79": { - "balance": "2000000000000000000000" + "0x84244fc95a6957ed7c1504e49f30b8c35eca4b79": { + "balance": "0x6c6b935b8bbd400000" }, - "5e031b0a724471d476f3bcd2eb078338bf67fbef": { - "balance": "18200000000000000000" + "0x5e031b0a724471d476f3bcd2eb078338bf67fbef": { + "balance": "0xfc936392801c0000" }, - "97e5cc6127c4f885be02f44b42d1c8b0ac91e493": { - "balance": "200000000000000000000" + "0x97e5cc6127c4f885be02f44b42d1c8b0ac91e493": { + "balance": "0xad78ebc5ac6200000" }, - "eb1cea7b45d1bd4d0e2a007bd3bfb354759e2c16": { - "balance": "198000000000000000000" + "0xeb1cea7b45d1bd4d0e2a007bd3bfb354759e2c16": { + "balance": "0xabbcd4ef377580000" }, - "72feaf124579523954645b7fafff0378d1c8242e": { - "balance": "1000000000000000000000" + "0x72feaf124579523954645b7fafff0378d1c8242e": { + "balance": "0x3635c9adc5dea00000" }, - "8d07d42d831c2d7c838aa1872b3ad5d277176823": { - "balance": "349200000000000000000" + "0x8d07d42d831c2d7c838aa1872b3ad5d277176823": { + "balance": "0x12ee1f9ddbee680000" }, - "9637dc12723d9c78588542eab082664f3f038d9d": { - "balance": "1000000000000000000000" + "0x9637dc12723d9c78588542eab082664f3f038d9d": { + "balance": "0x3635c9adc5dea00000" }, - "e84b55b525f1039e744b918cb3332492e45eca7a": { - "balance": "200000000000000000000" + "0xe84b55b525f1039e744b918cb3332492e45eca7a": { + "balance": "0xad78ebc5ac6200000" }, - "b1d6b01b94d854fe8b374aa65e895cf22aa2560e": { - "balance": "940000000000000000000" + "0xb1d6b01b94d854fe8b374aa65e895cf22aa2560e": { + "balance": "0x32f51edbaaa3300000" }, - "8161d940c3760100b9080529f8a60325030f6edc": { - "balance": "300000000000000000000" + "0x8161d940c3760100b9080529f8a60325030f6edc": { + "balance": "0x1043561a8829300000" }, - "d30ee9a12b4d68abace6baca9ad7bf5cd1faf91c": { - "balance": "1499936000000000000000" + "0xd30ee9a12b4d68abace6baca9ad7bf5cd1faf91c": { + "balance": "0x514fcb24ff9c500000" }, - "057949e1ca0570469e4ce3c690ae613a6b01c559": { - "balance": "200000000000000000000" + "0x057949e1ca0570469e4ce3c690ae613a6b01c559": { + "balance": "0xad78ebc5ac6200000" }, - "4bf8e26f4c2790da6533a2ac9abac3c69a199433": { - "balance": "200000000000000000000" + "0x4bf8e26f4c2790da6533a2ac9abac3c69a199433": { + "balance": "0xad78ebc5ac6200000" }, - "36fec62c2c425e219b18448ad757009d8c54026f": { - "balance": "400000000000000000000" + "0x36fec62c2c425e219b18448ad757009d8c54026f": { + "balance": "0x15af1d78b58c400000" }, - "77bfe93ccda750847e41a1affee6b2da96e7214e": { - "balance": "300000000000000000000" + "0x77bfe93ccda750847e41a1affee6b2da96e7214e": { + "balance": "0x1043561a8829300000" }, - "cc48414d2ac4d42a5962f29eee4497092f431352": { - "balance": "161000000000000000000" + "0xcc48414d2ac4d42a5962f29eee4497092f431352": { + "balance": "0x8ba52e6fc45e40000" }, - "ddbddd1bbd38ffade0305d30f02028d92e9f3aa8": { - "balance": "2000000000000000000000" + "0xddbddd1bbd38ffade0305d30f02028d92e9f3aa8": { + "balance": "0x6c6b935b8bbd400000" }, - "30c01142907acb1565f70438b9980ae731818738": { - "balance": "2000000000000000000000" + "0x30c01142907acb1565f70438b9980ae731818738": { + "balance": "0x6c6b935b8bbd400000" }, - "cffc49c1787eebb2b56cabe92404b636147d4558": { - "balance": "5679305000000000000000" + "0xcffc49c1787eebb2b56cabe92404b636147d4558": { + "balance": "0x133e0308f40a3da8000" }, - "f99eeece39fa7ef5076d855061384009792cf2e0": { - "balance": "500000000000000000000" + "0xf99eeece39fa7ef5076d855061384009792cf2e0": { + "balance": "0x1b1ae4d6e2ef500000" }, - "e9b6a790009bc16642c8d820b7cde0e9fd16d8f5": { - "balance": "3640000000000000000000" + "0xe9b6a790009bc16642c8d820b7cde0e9fd16d8f5": { + "balance": "0xc55325ca7415e00000" }, - "03b41b51f41df20dd279bae18c12775f77ad771c": { - "balance": "1000000000000000000000" + "0x03b41b51f41df20dd279bae18c12775f77ad771c": { + "balance": "0x3635c9adc5dea00000" }, - "787d313fd36b053eeeaedbce74b9fb0678333289": { - "balance": "27160000000000000000000" + "0x787d313fd36b053eeeaedbce74b9fb0678333289": { + "balance": "0x5c058b7842719600000" }, - "35d2970f49dcc81ea9ee707e9c8a0ab2a8bb7463": { - "balance": "1440000000000000000000" + "0x35d2970f49dcc81ea9ee707e9c8a0ab2a8bb7463": { + "balance": "0x4e1003b28d92800000" }, - "4c0aca508b3caf5ee028bc707dd1e800b838f453": { - "balance": "18200000000000000000" + "0x4c0aca508b3caf5ee028bc707dd1e800b838f453": { + "balance": "0xfc936392801c0000" }, - "514632efbd642c04de6ca342315d40dd90a2dba6": { - "balance": "2674000000000000000000" + "0x514632efbd642c04de6ca342315d40dd90a2dba6": { + "balance": "0x90f534608a72880000" }, - "36810ff9d213a271eda2b8aa798be654fa4bbe06": { - "balance": "2000000000000000000000" + "0x36810ff9d213a271eda2b8aa798be654fa4bbe06": { + "balance": "0x6c6b935b8bbd400000" }, - "0c088006c64b30c4ddafbc36cb5f05469eb62834": { - "balance": "2000000000000000000000" + "0x0c088006c64b30c4ddafbc36cb5f05469eb62834": { + "balance": "0x6c6b935b8bbd400000" }, - "568df31856699bb5acfc1fe1d680df9960ca4359": { - "balance": "1379999000000000000000" + "0x568df31856699bb5acfc1fe1d680df9960ca4359": { + "balance": "0x4acf5552f3b2498000" }, - "d48e3f9357e303513841b3f84bda83fc89727587": { - "balance": "1000000000000000000000" + "0xd48e3f9357e303513841b3f84bda83fc89727587": { + "balance": "0x3635c9adc5dea00000" }, - "953ef652e7b769f53d6e786a58952fa93ee6abe7": { - "balance": "2860000000000000000000" + "0x953ef652e7b769f53d6e786a58952fa93ee6abe7": { + "balance": "0x9b0a791f1211300000" }, - "7c60a05f7a4a5f8cf2784391362e755a8341ef59": { - "balance": "1892300000000000000000" + "0x7c60a05f7a4a5f8cf2784391362e755a8341ef59": { + "balance": "0x6694f0182a37ae0000" }, - "7a6b26f438d9a352449155b8876cbd17c9d99b64": { - "balance": "6000000000000000000000" + "0x7a6b26f438d9a352449155b8876cbd17c9d99b64": { + "balance": "0x14542ba12a337c00000" }, - "68f719ae342bd7fef18a05cbb02f705ad38ed5b2": { - "balance": "1050000000000000000000" + "0x68f719ae342bd7fef18a05cbb02f705ad38ed5b2": { + "balance": "0x38ebad5cdc90280000" }, - "45ca8d956608f9e00a2f9974028640888465668f": { - "balance": "2000000000000000000000" + "0x45ca8d956608f9e00a2f9974028640888465668f": { + "balance": "0x6c6b935b8bbd400000" }, - "3eaf316b87615d88f7adc77c58e712ed4d77966b": { - "balance": "100141000000000000000" + "0x3eaf316b87615d88f7adc77c58e712ed4d77966b": { + "balance": "0x56dbc4cee24648000" }, - "1f0412bfedcd964e837d092c71a5fcbaf30126e2": { - "balance": "20000000000000000000" + "0x1f0412bfedcd964e837d092c71a5fcbaf30126e2": { + "balance": "0x1158e460913d00000" }, - "7471f72eeb300624eb282eab4d03723c649b1b58": { - "balance": "8000000000000000000000" + "0x7471f72eeb300624eb282eab4d03723c649b1b58": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "9bf71f7fb537ac54f4e514947fa7ff6728f16d2f": { - "balance": "33400000000000000000" + "0x9bf71f7fb537ac54f4e514947fa7ff6728f16d2f": { + "balance": "0x1cf84a30a0a0c0000" }, - "1098c774c20ca1daac5ddb620365316d353f109c": { - "balance": "100000000000000000000" + "0x1098c774c20ca1daac5ddb620365316d353f109c": { + "balance": "0x56bc75e2d63100000" }, - "7dd8d7a1a34fa1f8e73ccb005fc2a03a15b8229c": { - "balance": "200000000000000000000" + "0x7dd8d7a1a34fa1f8e73ccb005fc2a03a15b8229c": { + "balance": "0xad78ebc5ac6200000" }, - "0151fa5d17a2dce2d7f1eb39ef7fe2ad213d5d89": { - "balance": "4000000000000000000000" + "0x0151fa5d17a2dce2d7f1eb39ef7fe2ad213d5d89": { + "balance": "0xd8d726b7177a800000" }, - "ad6628352ed3390bafa86d923e56014cfcb360f4": { - "balance": "2000000000000000000000" + "0xad6628352ed3390bafa86d923e56014cfcb360f4": { + "balance": "0x6c6b935b8bbd400000" }, - "02af2459a93d0b3f4d062636236cd4b29e3bcecf": { - "balance": "1910000000000000000000" + "0x02af2459a93d0b3f4d062636236cd4b29e3bcecf": { + "balance": "0x678a932062e4180000" }, - "ace2abb63b0604409fbde3e716d2876d44e8e5dd": { - "balance": "152000000000000000000" + "0xace2abb63b0604409fbde3e716d2876d44e8e5dd": { + "balance": "0x83d6c7aab63600000" }, - "e710dcd09b8101f9437bd97db90a73ef993d0bf4": { - "balance": "386100000000000000000" + "0xe710dcd09b8101f9437bd97db90a73ef993d0bf4": { + "balance": "0x14ee36c05ac2520000" }, - "d43ee438d83de9a37562bb4e286cb1bd19f4964d": { - "balance": "1000000000000000000000" + "0xd43ee438d83de9a37562bb4e286cb1bd19f4964d": { + "balance": "0x3635c9adc5dea00000" }, - "ea3779d14a13f6c78566bcde403591413a6239db": { - "balance": "197000000000000000000000" + "0xea3779d14a13f6c78566bcde403591413a6239db": { + "balance": "0x29b76432b94451200000" }, - "6704f169e0d0b36b57bbc39f3c45437b5ee3d28d": { - "balance": "394000000000000000000" + "0x6704f169e0d0b36b57bbc39f3c45437b5ee3d28d": { + "balance": "0x155bd9307f9fe80000" }, - "5584423050e3c2051f0bbd8f44bd6dbc27ecb62c": { - "balance": "3000000000000000000000" + "0x5584423050e3c2051f0bbd8f44bd6dbc27ecb62c": { + "balance": "0xa2a15d09519be00000" }, - "2f315d9016e8ee5f536681202f9084b032544d4d": { - "balance": "1037400000000000000000" + "0x2f315d9016e8ee5f536681202f9084b032544d4d": { + "balance": "0x383cd12b9e863c0000" }, - "e1b63201fae1f129f95c7a116bd9dde5159c6cda": { - "balance": "22837462000000000000000" + "0xe1b63201fae1f129f95c7a116bd9dde5159c6cda": { + "balance": "0x4d60573a2f0c9ef0000" }, - "2bbe62eac80ca7f4d6fdee7e7d8e28b63acf770e": { - "balance": "2396000000000000000000" + "0x2bbe62eac80ca7f4d6fdee7e7d8e28b63acf770e": { + "balance": "0x81e32df972abf00000" }, - "38da1ba2de9e2c954b092dd9d81204fd016ba016": { - "balance": "10156000000000000000000" + "0x38da1ba2de9e2c954b092dd9d81204fd016ba016": { + "balance": "0x2268ed01f34b3300000" }, - "8a86e4a51c013b1fb4c76bcf30667c78d52eedef": { - "balance": "2000000000000000000000" + "0x8a86e4a51c013b1fb4c76bcf30667c78d52eedef": { + "balance": "0x6c6b935b8bbd400000" }, - "8f717ec1552f4c440084fba1154a81dc003ebdc0": { - "balance": "10000000000000000000000" + "0x8f717ec1552f4c440084fba1154a81dc003ebdc0": { + "balance": "0x21e19e0c9bab2400000" }, - "c760971bbc181c6a7cf77441f24247d19ce9b4cf": { - "balance": "2000000000000000000000" + "0xc760971bbc181c6a7cf77441f24247d19ce9b4cf": { + "balance": "0x6c6b935b8bbd400000" }, - "7f150afb1a77c2b45928c268c1e9bdb4641d47d8": { - "balance": "2000000000000000000000" + "0x7f150afb1a77c2b45928c268c1e9bdb4641d47d8": { + "balance": "0x6c6b935b8bbd400000" }, - "1ea334b5750807ea74aac5ab8694ec5f28aa77cf": { - "balance": "492500000000000000000" + "0x1ea334b5750807ea74aac5ab8694ec5f28aa77cf": { + "balance": "0x1ab2cf7c9f87e20000" }, - "2afb058c3d31032b353bf24f09ae20d54de57dbe": { - "balance": "1100000000000000000000" + "0x2afb058c3d31032b353bf24f09ae20d54de57dbe": { + "balance": "0x3ba1910bf341b00000" }, - "caef027b1ab504c73f41f2a10979b474f97e309f": { - "balance": "200000000000000000000" + "0xcaef027b1ab504c73f41f2a10979b474f97e309f": { + "balance": "0xad78ebc5ac6200000" }, - "5dd112f368c0e6ceff77a9df02a5481651a02fb7": { - "balance": "169800000000000000000" + "0x5dd112f368c0e6ceff77a9df02a5481651a02fb7": { + "balance": "0x93472c85c6d540000" }, - "bd93e550403e2a06113ed4c3fba1a8913b19407e": { - "balance": "2000000000000000000000" + "0xbd93e550403e2a06113ed4c3fba1a8913b19407e": { + "balance": "0x6c6b935b8bbd400000" }, - "500c16352e901d48ba8d04e2c767121772790b02": { - "balance": "30239000000000000000" + "0x500c16352e901d48ba8d04e2c767121772790b02": { + "balance": "0x1a3a6824973098000" }, - "d2a80327cbe55c4c7bd51ff9dde4ca648f9eb3f8": { - "balance": "50000000000000000000" + "0xd2a80327cbe55c4c7bd51ff9dde4ca648f9eb3f8": { + "balance": "0x2b5e3af16b1880000" }, - "355ccfe0e77d557b971be1a558bc02df9eee0594": { - "balance": "1759120000000000000000" + "0x355ccfe0e77d557b971be1a558bc02df9eee0594": { + "balance": "0x5f5cb1afc865280000" }, - "5aed0e6cfe95f9d680c76472a81a2b680a7f93e2": { - "balance": "197000000000000000000" + "0x5aed0e6cfe95f9d680c76472a81a2b680a7f93e2": { + "balance": "0xaadec983fcff40000" }, - "f56442f60e21691395d0bffaa9194dcaff12e2b7": { - "balance": "260000000000000000000" + "0xf56442f60e21691395d0bffaa9194dcaff12e2b7": { + "balance": "0xe18398e7601900000" }, - "7db9eacc52e429dc83b461c5f4d86010e5383a28": { - "balance": "1000000000000000000000" + "0x7db9eacc52e429dc83b461c5f4d86010e5383a28": { + "balance": "0x3635c9adc5dea00000" }, - "4b984ef26c576e815a2eaed2f5177f07dbb1c476": { - "balance": "1560000000000000000000" + "0x4b984ef26c576e815a2eaed2f5177f07dbb1c476": { + "balance": "0x54915956c409600000" }, - "9846648836a307a057184fd51f628a5f8c12427c": { - "balance": "19100000000000000000000" + "0x9846648836a307a057184fd51f628a5f8c12427c": { + "balance": "0x40b69bf43dce8f00000" }, - "4af0db077bb9ba5e443e21e148e59f379105c592": { - "balance": "600000000000000000000" + "0x4af0db077bb9ba5e443e21e148e59f379105c592": { + "balance": "0x2086ac351052600000" }, - "e96e2d3813efd1165f12f602f97f4a62909d3c66": { - "balance": "2300000000000000000000" + "0xe96e2d3813efd1165f12f602f97f4a62909d3c66": { + "balance": "0x7caee97613e6700000" }, - "30e789b3d2465e946e6210fa5b35de4e8c93085f": { - "balance": "2000000000000000000000" + "0x30e789b3d2465e946e6210fa5b35de4e8c93085f": { + "balance": "0x6c6b935b8bbd400000" }, - "97f99b6ba31346cd98a9fe4c308f87c5a58c5151": { - "balance": "6000000000000000000000" + "0x97f99b6ba31346cd98a9fe4c308f87c5a58c5151": { + "balance": "0x14542ba12a337c00000" }, - "595e23d788a2d4bb85a15df7136d264a635511b3": { - "balance": "3940000000000000000000" + "0x595e23d788a2d4bb85a15df7136d264a635511b3": { + "balance": "0xd5967be4fc3f100000" }, - "2f61efa5819d705f2b1e4ee754aeb8a819506a75": { - "balance": "1460000000000000000000" + "0x2f61efa5819d705f2b1e4ee754aeb8a819506a75": { + "balance": "0x4f2591f896a6500000" }, - "3554947b7b947b0040da52ca180925c6d3b88ffe": { - "balance": "66850000000000000000" + "0x3554947b7b947b0040da52ca180925c6d3b88ffe": { + "balance": "0x39fbae8d042dd0000" }, - "8feffadb387a1547fb284da9b8147f3e7c6dc6da": { - "balance": "837200000000000000000" + "0x8feffadb387a1547fb284da9b8147f3e7c6dc6da": { + "balance": "0x2d627be45305080000" }, - "258939bbf00c9de9af5338f5d714abf6d0c1c671": { - "balance": "1550000000000000000000" + "0x258939bbf00c9de9af5338f5d714abf6d0c1c671": { + "balance": "0x54069233bf7f780000" }, - "5b333696e04cca1692e71986579c920d6b2916f9": { - "balance": "500000000000000000000" + "0x5b333696e04cca1692e71986579c920d6b2916f9": { + "balance": "0x1b1ae4d6e2ef500000" }, - "5381448503c0c702542b1de7cc5fb5f6ab1cf6a5": { - "balance": "8000000000000000000000" + "0x5381448503c0c702542b1de7cc5fb5f6ab1cf6a5": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "7e81f6449a03374191f3b7cb05d938b72e090dff": { - "balance": "100000000000000000000" + "0x7e81f6449a03374191f3b7cb05d938b72e090dff": { + "balance": "0x56bc75e2d63100000" }, - "4ef1c214633ad9c0703b4e2374a2e33e3e429291": { - "balance": "1337000000000000000000" + "0x4ef1c214633ad9c0703b4e2374a2e33e3e429291": { + "balance": "0x487a9a304539440000" }, - "fed8476d10d584b38bfa6737600ef19d35c41ed8": { - "balance": "1820000000000000000000" + "0xfed8476d10d584b38bfa6737600ef19d35c41ed8": { + "balance": "0x62a992e53a0af00000" }, - "1a95c9b7546b5d1786c3858fb1236446bc0ca4ce": { - "balance": "1970000000000000000000" + "0x1a95c9b7546b5d1786c3858fb1236446bc0ca4ce": { + "balance": "0x6acb3df27e1f880000" }, - "3b07db5a357f5af2484cbc9d77d73b1fd0519fc7": { - "balance": "500000000000000000000" + "0x3b07db5a357f5af2484cbc9d77d73b1fd0519fc7": { + "balance": "0x1b1ae4d6e2ef500000" }, - "5f68a24c7eb4117667737b33393fb3c2148a53b6": { - "balance": "51800000000000000000" + "0x5f68a24c7eb4117667737b33393fb3c2148a53b6": { + "balance": "0x2cede918d453c0000" }, - "d8f665fd8cd5c2bcc6ddc0a8ae521e4dc6aa6060": { - "balance": "1700000000000000000000" + "0xd8f665fd8cd5c2bcc6ddc0a8ae521e4dc6aa6060": { + "balance": "0x5c283d410394100000" }, - "d66acc0d11b689cea6d9ea5ff4014c224a5dc7c4": { - "balance": "18200000000000000000" + "0xd66acc0d11b689cea6d9ea5ff4014c224a5dc7c4": { + "balance": "0xfc936392801c0000" }, - "6e72b2a1186a8e2916543b1cb36a68870ea5d197": { - "balance": "186000000000000000000" + "0x6e72b2a1186a8e2916543b1cb36a68870ea5d197": { + "balance": "0xa1544be879ea80000" }, - "5102a4a42077e11c58df4773e3ac944623a66d9f": { - "balance": "2000325000000000000000" + "0x5102a4a42077e11c58df4773e3ac944623a66d9f": { + "balance": "0x6c7015fd52ed408000" }, - "72480bede81ad96423f2228b5c61be44fb523100": { - "balance": "6400000000000000000000" + "0x72480bede81ad96423f2228b5c61be44fb523100": { + "balance": "0x15af1d78b58c4000000" }, - "e076db30ab486f79194ebbc45d8fab9a9242f654": { - "balance": "4840000000000000000000" + "0xe076db30ab486f79194ebbc45d8fab9a9242f654": { + "balance": "0x106607e3494baa00000" }, - "8ceea15eec3bdad8023f98ecf25b2b8fef27db29": { - "balance": "2000000000000000000000" + "0x8ceea15eec3bdad8023f98ecf25b2b8fef27db29": { + "balance": "0x6c6b935b8bbd400000" }, - "40652360d6716dc55cf9aab21f3482f816cc2cbd": { - "balance": "10000000000000000000000" + "0x40652360d6716dc55cf9aab21f3482f816cc2cbd": { + "balance": "0x21e19e0c9bab2400000" }, - "13e02fb448d6c84ae17db310ad286d056160da95": { - "balance": "2000000000000000000000" + "0x13e02fb448d6c84ae17db310ad286d056160da95": { + "balance": "0x6c6b935b8bbd400000" }, - "d6598b1386e93c5ccb9602ff4bbbecdbd3701dc4": { - "balance": "224096000000000000000" + "0xd6598b1386e93c5ccb9602ff4bbbecdbd3701dc4": { + "balance": "0xc25f4ecb041f00000" }, - "d5ea472cb9466018110af00c37495b5c2c713112": { - "balance": "4997800000000000000000" + "0xd5ea472cb9466018110af00c37495b5c2c713112": { + "balance": "0x10eee686c854f440000" }, - "bb75cb5051a0b0944b4673ca752a97037f7c8c15": { - "balance": "200000000000000000000" + "0xbb75cb5051a0b0944b4673ca752a97037f7c8c15": { + "balance": "0xad78ebc5ac6200000" }, - "8af626a5f327d7506589eeb7010ff9c9446020d2": { - "balance": "1400000000000000000000" + "0x8af626a5f327d7506589eeb7010ff9c9446020d2": { + "balance": "0x4be4e7267b6ae00000" }, - "318c76ecfd8af68d70555352e1f601e35988042d": { - "balance": "501600000000000000000" + "0x318c76ecfd8af68d70555352e1f601e35988042d": { + "balance": "0x1b31192e68c7f00000" }, - "5c3d19441d196cb443662020fcad7fbb79b29e78": { - "balance": "14300000000000000000" + "0x5c3d19441d196cb443662020fcad7fbb79b29e78": { + "balance": "0xc673ce3c40160000" }, - "27101a0f56d39a88c5a84f9b324cdde33e5cb68c": { - "balance": "2000000000000000000000" + "0x27101a0f56d39a88c5a84f9b324cdde33e5cb68c": { + "balance": "0x6c6b935b8bbd400000" }, - "e229e746a83f2ce253b0b03eb1472411b57e5700": { - "balance": "5730000000000000000000" + "0xe229e746a83f2ce253b0b03eb1472411b57e5700": { + "balance": "0x1369fb96128ac480000" }, - "604cdf18628dbfa8329194d478dd5201eecc4be7": { - "balance": "23000000000000000000" + "0x604cdf18628dbfa8329194d478dd5201eecc4be7": { + "balance": "0x13f306a2409fc0000" }, - "657473774f63ac3d6279fd0743d5790c4f161503": { - "balance": "200000000000000000000" + "0x657473774f63ac3d6279fd0743d5790c4f161503": { + "balance": "0xad78ebc5ac6200000" }, - "1ddefefd35ab8f658b2471e54790bc17af98dea4": { - "balance": "1000000000000000000000" + "0x1ddefefd35ab8f658b2471e54790bc17af98dea4": { + "balance": "0x3635c9adc5dea00000" }, - "ac3900298dd14d7cc96d4abb428da1bae213ffed": { - "balance": "24730250000000000000000" + "0xac3900298dd14d7cc96d4abb428da1bae213ffed": { + "balance": "0x53ca12974851c010000" }, - "944f07b96f90c5f0d7c0c580533149f3f585a078": { - "balance": "74000000000000000000" + "0x944f07b96f90c5f0d7c0c580533149f3f585a078": { + "balance": "0x402f4cfee62e80000" }, - "232c6d03b5b6e6711efff190e49c28eef36c82b0": { - "balance": "1337000000000000000000" + "0x232c6d03b5b6e6711efff190e49c28eef36c82b0": { + "balance": "0x487a9a304539440000" }, - "c87c77e3c24adecdcd1038a38b56e18dead3b702": { - "balance": "8800000000000000000000" + "0xc87c77e3c24adecdcd1038a38b56e18dead3b702": { + "balance": "0x1dd0c885f9a0d800000" }, - "c4b6e5f09cc1b90df07803ce3d4d13766a9c46f4": { - "balance": "6000000000000000000000" + "0xc4b6e5f09cc1b90df07803ce3d4d13766a9c46f4": { + "balance": "0x14542ba12a337c00000" }, - "d44334b4e23a169a0c16bd21e866bba52d970587": { - "balance": "2600000000000000000000" + "0xd44334b4e23a169a0c16bd21e866bba52d970587": { + "balance": "0x8cf23f909c0fa00000" }, - "7757a4b9cc3d0247ccaaeb9909a0e56e1dd6dcc2": { - "balance": "20000000000000000000" + "0x7757a4b9cc3d0247ccaaeb9909a0e56e1dd6dcc2": { + "balance": "0x1158e460913d00000" }, - "cf694081c76d18c64ca71382be5cd63b3cb476f8": { - "balance": "1000000000000000000000" + "0xcf694081c76d18c64ca71382be5cd63b3cb476f8": { + "balance": "0x3635c9adc5dea00000" }, - "133e4f15e1e39c53435930aaedf3e0fe56fde843": { - "balance": "20000000000000000000" + "0x133e4f15e1e39c53435930aaedf3e0fe56fde843": { + "balance": "0x1158e460913d00000" }, - "f067fb10dfb293e998abe564c055e3348f9fbf1e": { - "balance": "2000000000000000000000" + "0xf067fb10dfb293e998abe564c055e3348f9fbf1e": { + "balance": "0x6c6b935b8bbd400000" }, - "94449c01b32a7fa55af8104f42cdd844aa8cbc40": { - "balance": "16548000000000000000000" + "0x94449c01b32a7fa55af8104f42cdd844aa8cbc40": { + "balance": "0x38111a1f4f03c100000" }, - "0e2094ac1654a46ba1c4d3a40bb8c17da7f39688": { - "balance": "358000000000000000000" + "0x0e2094ac1654a46ba1c4d3a40bb8c17da7f39688": { + "balance": "0x13683f7f3c15d80000" }, - "738ca94db7ce8be1c3056cd6988eb376359f3353": { - "balance": "25500000000000000000000" + "0x738ca94db7ce8be1c3056cd6988eb376359f3353": { + "balance": "0x5665b96cf35acf00000" }, - "0cfb172335b16c87d519cd1475530d20577f5e0e": { - "balance": "100000000000000000000000" + "0x0cfb172335b16c87d519cd1475530d20577f5e0e": { + "balance": "0x152d02c7e14af6800000" }, - "3cb561ce86424b359891e364ec925ffeff277df7": { - "balance": "200000000000000000000" + "0x3cb561ce86424b359891e364ec925ffeff277df7": { + "balance": "0xad78ebc5ac6200000" }, - "5f981039fcf50225e2adf762752112d1cc26b6e3": { - "balance": "499954000000000000000" + "0x5f981039fcf50225e2adf762752112d1cc26b6e3": { + "balance": "0x1b1a416a2153a50000" }, - "b43657a50eecbc3077e005d8f8d94f377876bad4": { - "balance": "35460000000000000000" + "0xb43657a50eecbc3077e005d8f8d94f377876bad4": { + "balance": "0x1ec1b3a1ff75a0000" }, - "d07e511864b1cf9969e3560602829e32fc4e71f5": { - "balance": "50000000000000000000" + "0xd07e511864b1cf9969e3560602829e32fc4e71f5": { + "balance": "0x2b5e3af16b1880000" }, - "11306c7d57588637780fc9fde8e98ecb008f0164": { - "balance": "1999944000000000000000" + "0x11306c7d57588637780fc9fde8e98ecb008f0164": { + "balance": "0x6c6acc67d7b1d40000" }, - "45ca9862003b4e40a3171fb5cafa9028cac8de19": { - "balance": "13790000000000000000000" + "0x45ca9862003b4e40a3171fb5cafa9028cac8de19": { + "balance": "0x2eb8eb1a172dcb80000" }, - "231d94155dbcfe2a93a319b6171f63b20bd2b6fa": { - "balance": "3819952000000000000000" + "0x231d94155dbcfe2a93a319b6171f63b20bd2b6fa": { + "balance": "0xcf147bb906e2f80000" }, - "e7533e270cc61fa164ac1553455c105d04887e14": { - "balance": "121550000000000000000" + "0xe7533e270cc61fa164ac1553455c105d04887e14": { + "balance": "0x696d8590020bb0000" }, - "070d5d364cb7bbf822fc2ca91a35bdd441b215d5": { - "balance": "2000000000000000000000" + "0x070d5d364cb7bbf822fc2ca91a35bdd441b215d5": { + "balance": "0x6c6b935b8bbd400000" }, - "d475477fa56390d33017518d6711027f05f28dbf": { - "balance": "1975032000000000000000" + "0xd475477fa56390d33017518d6711027f05f28dbf": { + "balance": "0x6b111333d4fd4c0000" }, - "cea34a4dd93dd9aefd399002a97d997a1b4b89cd": { - "balance": "1500000000000000000000" + "0xcea34a4dd93dd9aefd399002a97d997a1b4b89cd": { + "balance": "0x5150ae84a8cdf00000" }, - "560becdf52b71f3d8827d927610f1a980f33716f": { - "balance": "429413000000000000000" + "0x560becdf52b71f3d8827d927610f1a980f33716f": { + "balance": "0x17474d705f56d08000" }, - "f632adff490da4b72d1236d04b510f74d2faa3cd": { - "balance": "1400000000000000000000" + "0xf632adff490da4b72d1236d04b510f74d2faa3cd": { + "balance": "0x4be4e7267b6ae00000" }, - "2fdd9b79df8df530ad63c20e62af431ae99216b8": { - "balance": "21000000000000000000" + "0x2fdd9b79df8df530ad63c20e62af431ae99216b8": { + "balance": "0x1236efcbcbb340000" }, - "535201a0a1d73422801f55ded4dfaee4fbaa6e3b": { - "balance": "39641000000000000000" + "0x535201a0a1d73422801f55ded4dfaee4fbaa6e3b": { + "balance": "0x226211f7915428000" }, - "409d5a962edeeebea178018c0f38b9cdb213f289": { - "balance": "20000000000000000000" + "0x409d5a962edeeebea178018c0f38b9cdb213f289": { + "balance": "0x1158e460913d00000" }, - "9d911f3682f32fe0792e9fb6ff3cfc47f589fca5": { - "balance": "4000000000000000000000" + "0x9d911f3682f32fe0792e9fb6ff3cfc47f589fca5": { + "balance": "0xd8d726b7177a800000" }, - "9f7a0392f857732e3004a375e6b1068d49d83031": { - "balance": "2000000000000000000000" + "0x9f7a0392f857732e3004a375e6b1068d49d83031": { + "balance": "0x6c6b935b8bbd400000" }, - "6a04f5d53fc0f515be942b8f12a9cb7ab0f39778": { - "balance": "3129800000000000000000" + "0x6a04f5d53fc0f515be942b8f12a9cb7ab0f39778": { + "balance": "0xa9aab3459be1940000" }, - "be478e8e3dde6bd403bb2d1c657c4310ee192723": { - "balance": "492500000000000000000" + "0xbe478e8e3dde6bd403bb2d1c657c4310ee192723": { + "balance": "0x1ab2cf7c9f87e20000" }, - "007622d84a234bb8b078230fcf84b67ae9a8acae": { - "balance": "698800000000000000000" + "0x007622d84a234bb8b078230fcf84b67ae9a8acae": { + "balance": "0x25e1cc519952f80000" }, - "9475c510ec9a26979247744c3d8c3b0e0b5f44d3": { - "balance": "10000000000000000000000" + "0x9475c510ec9a26979247744c3d8c3b0e0b5f44d3": { + "balance": "0x21e19e0c9bab2400000" }, - "df47a8ef95f2f49f8e6f58184154145d11f72797": { - "balance": "1910000000000000000000" + "0xdf47a8ef95f2f49f8e6f58184154145d11f72797": { + "balance": "0x678a932062e4180000" }, - "13ce332dff65a6ab933897588aa23e000980fa82": { - "balance": "258400000000000000000" + "0x13ce332dff65a6ab933897588aa23e000980fa82": { + "balance": "0xe020536f028f00000" }, - "9c4bbcd5f1644a6f075824ddfe85c571d6abf69c": { - "balance": "1800000000000000000000" + "0x9c4bbcd5f1644a6f075824ddfe85c571d6abf69c": { + "balance": "0x6194049f30f7200000" }, - "d42b20bd0311608b66f8a6d15b2a95e6de27c5bf": { - "balance": "2000000000000000000000" + "0xd42b20bd0311608b66f8a6d15b2a95e6de27c5bf": { + "balance": "0x6c6b935b8bbd400000" }, - "a4dd59ab5e517d398e49fa537f899fed4c15e95d": { - "balance": "20000000000000000000000" + "0xa4dd59ab5e517d398e49fa537f899fed4c15e95d": { + "balance": "0x43c33c1937564800000" }, - "1a8a5ce414de9cd172937e37f2d59cff71ce57a0": { - "balance": "10000000000000000000000" + "0x1a8a5ce414de9cd172937e37f2d59cff71ce57a0": { + "balance": "0x21e19e0c9bab2400000" }, - "55c564664166a1edf3913e0169f1cd451fdb5d0c": { - "balance": "2399800000000000000000" + "0x55c564664166a1edf3913e0169f1cd451fdb5d0c": { + "balance": "0x8217ea49508e6c0000" }, - "58ae2ddc5f4c8ada97e06c0086171767c423f5d7": { - "balance": "1610000000000000000000" + "0x58ae2ddc5f4c8ada97e06c0086171767c423f5d7": { + "balance": "0x57473d05dabae80000" }, - "fb79abdb925c55b9f98efeef64cfc9eb61f51bb1": { - "balance": "1794000000000000000000" + "0xfb79abdb925c55b9f98efeef64cfc9eb61f51bb1": { + "balance": "0x6140c056fb0ac80000" }, - "e7a42f59fee074e4fb13ea9e57ecf1cc48282249": { - "balance": "20000000000000000000000" + "0xe7a42f59fee074e4fb13ea9e57ecf1cc48282249": { + "balance": "0x43c33c1937564800000" }, - "07e2b4cdeed9d087b12e556d9e770c13c099615f": { - "balance": "668500000000000000000" + "0x07e2b4cdeed9d087b12e556d9e770c13c099615f": { + "balance": "0x243d4d18229ca20000" }, - "68473b7a7d965904bedba556dfbc17136cd5d434": { - "balance": "100000000000000000000" + "0x68473b7a7d965904bedba556dfbc17136cd5d434": { + "balance": "0x56bc75e2d63100000" }, - "6c5c3a54cda7c2f118edba434ed81e6ebb11dd7a": { - "balance": "200000000000000000000" + "0x6c5c3a54cda7c2f118edba434ed81e6ebb11dd7a": { + "balance": "0xad78ebc5ac6200000" }, - "24c117d1d2b3a97ab11a4679c99a774a9eade8d1": { - "balance": "1000000000000000000000" + "0x24c117d1d2b3a97ab11a4679c99a774a9eade8d1": { + "balance": "0x3635c9adc5dea00000" }, - "f68c5e33fa97139df5b2e63886ce34ebf3e4979c": { - "balance": "3320000000000000000000" + "0xf68c5e33fa97139df5b2e63886ce34ebf3e4979c": { + "balance": "0xb3fa4169e2d8e00000" }, - "bd7419dc2a090a46e2873d7de6eaaad59e19c479": { - "balance": "6802000000000000000000" + "0xbd7419dc2a090a46e2873d7de6eaaad59e19c479": { + "balance": "0x170bcb671759f080000" }, - "1a0a1ddfb031e5c8cc1d46cf05842d50fddc7130": { - "balance": "1000000000000000000000" + "0x1a0a1ddfb031e5c8cc1d46cf05842d50fddc7130": { + "balance": "0x3635c9adc5dea00000" }, - "2b3a68db6b0cae8a7c7a476bdfcfbd6205e10687": { - "balance": "2400000000000000000000" + "0x2b3a68db6b0cae8a7c7a476bdfcfbd6205e10687": { + "balance": "0x821ab0d44149800000" }, - "426d15f407a01135b13a6b72f8f2520b3531e302": { - "balance": "20000000000000000000" + "0x426d15f407a01135b13a6b72f8f2520b3531e302": { + "balance": "0x1158e460913d00000" }, - "0394b90fadb8604f86f43fc1e35d3124b32a5989": { - "balance": "764000000000000000000" + "0x0394b90fadb8604f86f43fc1e35d3124b32a5989": { + "balance": "0x296aa140278e700000" }, - "7412c9bc30b4df439f023100e63924066afd53af": { - "balance": "500000000000000000000" + "0x7412c9bc30b4df439f023100e63924066afd53af": { + "balance": "0x1b1ae4d6e2ef500000" }, - "80e7b3205230a566a1f061d922819bb4d4d2a0e1": { - "balance": "14000000000000000000000" + "0x80e7b3205230a566a1f061d922819bb4d4d2a0e1": { + "balance": "0x2f6f10780d22cc00000" }, - "ff4fc66069046c525658c337a917f2d4b832b409": { - "balance": "2000000000000000000000" + "0xff4fc66069046c525658c337a917f2d4b832b409": { + "balance": "0x6c6b935b8bbd400000" }, - "f5061ee2e5ee26b815503677130e1de07a52db07": { - "balance": "100000000000000000000" + "0xf5061ee2e5ee26b815503677130e1de07a52db07": { + "balance": "0x56bc75e2d63100000" }, - "49793463e1681083d6abd6e725d5bba745dccde8": { - "balance": "545974000000000000000" + "0x49793463e1681083d6abd6e725d5bba745dccde8": { + "balance": "0x1d98e94c4e471f0000" }, - "23551f56975fe92b31fa469c49ea66ee6662f41e": { - "balance": "1910000000000000000000" + "0x23551f56975fe92b31fa469c49ea66ee6662f41e": { + "balance": "0x678a932062e4180000" }, - "fad96ab6ac768ad5099452ac4777bd1a47edc48f": { - "balance": "100000000000000000000" + "0xfad96ab6ac768ad5099452ac4777bd1a47edc48f": { + "balance": "0x56bc75e2d63100000" }, - "2a746cd44027af3ebd37c378c85ef7f754ab5f28": { - "balance": "394000000000000000000" + "0x2a746cd44027af3ebd37c378c85ef7f754ab5f28": { + "balance": "0x155bd9307f9fe80000" }, - "b8d389e624a3a7aebce4d3e5dbdf6cdc29932aed": { - "balance": "200000000000000000000" + "0xb8d389e624a3a7aebce4d3e5dbdf6cdc29932aed": { + "balance": "0xad78ebc5ac6200000" }, - "7b761feb7fcfa7ded1f0eb058f4a600bf3a708cb": { - "balance": "4600000000000000000000" + "0x7b761feb7fcfa7ded1f0eb058f4a600bf3a708cb": { + "balance": "0xf95dd2ec27cce00000" }, - "5435c6c1793317d32ce13bba4c4ffeb973b78adc": { - "balance": "250070000000000000000" + "0x5435c6c1793317d32ce13bba4c4ffeb973b78adc": { + "balance": "0xd8e6b1c1285ef0000" }, - "dd04eee74e0bf30c3f8d6c2c7f52e0519210df93": { - "balance": "80000000000000000000" + "0xdd04eee74e0bf30c3f8d6c2c7f52e0519210df93": { + "balance": "0x4563918244f400000" }, - "4331ab3747d35720a9d8ca25165cd285acd4bda8": { - "balance": "2000000000000000000000" + "0x4331ab3747d35720a9d8ca25165cd285acd4bda8": { + "balance": "0x6c6b935b8bbd400000" }, - "b84c8b9fd33ece00af9199f3cf5fe0cce28cd14a": { - "balance": "3820000000000000000000" + "0xb84c8b9fd33ece00af9199f3cf5fe0cce28cd14a": { + "balance": "0xcf152640c5c8300000" }, - "393f783b5cdb86221bf0294fb714959c7b45899c": { - "balance": "5910000000000000000000" + "0x393f783b5cdb86221bf0294fb714959c7b45899c": { + "balance": "0x14061b9d77a5e980000" }, - "259ec4d265f3ab536b7c70fa97aca142692c13fc": { - "balance": "20400000000000000000" + "0x259ec4d265f3ab536b7c70fa97aca142692c13fc": { + "balance": "0x11b1b5bea89f80000" }, - "5d2f7f0b04ba4be161e19cb6f112ce7a5e7d7fe4": { - "balance": "35200000000000000000" + "0x5d2f7f0b04ba4be161e19cb6f112ce7a5e7d7fe4": { + "balance": "0x1e87f85809dc00000" }, - "d54ba2d85681dc130e5b9b02c4e8c851391fd9b9": { - "balance": "3940000000000000000000" + "0xd54ba2d85681dc130e5b9b02c4e8c851391fd9b9": { + "balance": "0xd5967be4fc3f100000" }, - "5cd8af60de65f24dc3ce5730ba92653022dc5963": { - "balance": "1790000000000000000000" + "0x5cd8af60de65f24dc3ce5730ba92653022dc5963": { + "balance": "0x61093d7c2c6d380000" }, - "3b42a66d979f582834747a8b60428e9b4eeccd23": { - "balance": "620400000000000000000" + "0x3b42a66d979f582834747a8b60428e9b4eeccd23": { + "balance": "0x21a1c790fadc580000" }, - "4b19eb0c354bc1393960eb06063b83926f0d67b2": { - "balance": "29000000000000000000" + "0x4b19eb0c354bc1393960eb06063b83926f0d67b2": { + "balance": "0x19274b259f6540000" }, - "8cf3546fd1cda33d58845fc8fcfecabca7c5642a": { - "balance": "574027000000000000000" + "0x8cf3546fd1cda33d58845fc8fcfecabca7c5642a": { + "balance": "0x1f1e39932cb3278000" }, - "113612bc3ba0ee4898b49dd20233905f2f458f62": { - "balance": "14000000000000000000000" + "0x113612bc3ba0ee4898b49dd20233905f2f458f62": { + "balance": "0x2f6f10780d22cc00000" }, - "1f2afc0aed11bfc71e77a907657b36ea76e3fb99": { - "balance": "4000000000000000000000" + "0x1f2afc0aed11bfc71e77a907657b36ea76e3fb99": { + "balance": "0xd8d726b7177a800000" }, - "03714b41d2a6f751008ef8dd4d2b29aecab8f36e": { - "balance": "6000000000000000000000" + "0x03714b41d2a6f751008ef8dd4d2b29aecab8f36e": { + "balance": "0x14542ba12a337c00000" }, - "25721c87b0dc21377c7200e524b14a22f0af69fb": { - "balance": "4000000000000000000000" + "0x25721c87b0dc21377c7200e524b14a22f0af69fb": { + "balance": "0xd8d726b7177a800000" }, - "335858f749f169cabcfe52b796e3c11ec47ea3c2": { - "balance": "200000000000000000000" + "0x335858f749f169cabcfe52b796e3c11ec47ea3c2": { + "balance": "0xad78ebc5ac6200000" }, - "52fb46ac5d00c3518b2c3a1c177d442f8165555f": { - "balance": "1500000000000000000000" + "0x52fb46ac5d00c3518b2c3a1c177d442f8165555f": { + "balance": "0x5150ae84a8cdf00000" }, - "7a8c89c014509d56d7b68130668ff6a3ecec7370": { - "balance": "300000000000000000000" + "0x7a8c89c014509d56d7b68130668ff6a3ecec7370": { + "balance": "0x1043561a8829300000" }, - "7d5d2f73949dadda0856b206989df0078d51a1e5": { - "balance": "10560000000000000000000" + "0x7d5d2f73949dadda0856b206989df0078d51a1e5": { + "balance": "0x23c757072b8dd000000" }, - "be538246dd4e6f0c20bf5ad1373c3b463a131e86": { - "balance": "200000000000000000000" + "0xbe538246dd4e6f0c20bf5ad1373c3b463a131e86": { + "balance": "0xad78ebc5ac6200000" }, - "62680a15f8ccb8bdc02f7360c25ad8cfb57b8ccd": { - "balance": "1000000000000000000000" + "0x62680a15f8ccb8bdc02f7360c25ad8cfb57b8ccd": { + "balance": "0x3635c9adc5dea00000" }, - "aa0ca3737337178a0caac3099c584b056c56301c": { - "balance": "880000000000000000000" + "0xaa0ca3737337178a0caac3099c584b056c56301c": { + "balance": "0x2fb474098f67c00000" }, - "1d341fa5a3a1bd051f7db807b6db2fc7ba4f9b45": { - "balance": "18200000000000000000" + "0x1d341fa5a3a1bd051f7db807b6db2fc7ba4f9b45": { + "balance": "0xfc936392801c0000" }, - "6463f715d594a1a4ace4bb9c3b288a74decf294d": { - "balance": "1970000000000000000000" + "0x6463f715d594a1a4ace4bb9c3b288a74decf294d": { + "balance": "0x6acb3df27e1f880000" }, - "e00d153b10369143f97f54b8d4ca229eb3e8f324": { - "balance": "152000000000000000000" + "0xe00d153b10369143f97f54b8d4ca229eb3e8f324": { + "balance": "0x83d6c7aab63600000" }, - "8d0b9ea53fd263415eac11391f7ce9123c447062": { - "balance": "2000000000000000000000" + "0x8d0b9ea53fd263415eac11391f7ce9123c447062": { + "balance": "0x6c6b935b8bbd400000" }, - "cacb675e0996235404efafbb2ecb8152271b55e0": { - "balance": "700000000000000000000" + "0xcacb675e0996235404efafbb2ecb8152271b55e0": { + "balance": "0x25f273933db5700000" }, - "b615e940143eb57f875893bc98a61b3d618c1e8c": { - "balance": "20000000000000000000" + "0xb615e940143eb57f875893bc98a61b3d618c1e8c": { + "balance": "0x1158e460913d00000" }, - "606f177121f7855c21a5062330c8762264a97b31": { - "balance": "4000000000000000000000" + "0x606f177121f7855c21a5062330c8762264a97b31": { + "balance": "0xd8d726b7177a800000" }, - "e3925509c8d0b2a6738c5f6a72f35314491248ce": { - "balance": "1012961000000000000000" + "0xe3925509c8d0b2a6738c5f6a72f35314491248ce": { + "balance": "0x36e9a8669a44768000" }, - "3f08d9ad894f813e8e2148c160d24b353a8e74b0": { - "balance": "60000000000000000000000" + "0x3f08d9ad894f813e8e2148c160d24b353a8e74b0": { + "balance": "0xcb49b44ba602d800000" }, - "40f4f4c06c732cd35b119b893b127e7d9d0771e4": { - "balance": "10000000000000000000000" + "0x40f4f4c06c732cd35b119b893b127e7d9d0771e4": { + "balance": "0x21e19e0c9bab2400000" }, - "1406854d149e081ac09cb4ca560da463f3123059": { - "balance": "1337000000000000000000" + "0x1406854d149e081ac09cb4ca560da463f3123059": { + "balance": "0x487a9a304539440000" }, - "ecf05d07ea026e7ebf4941002335baf2fed0f002": { - "balance": "200000000000000000000" + "0xecf05d07ea026e7ebf4941002335baf2fed0f002": { + "balance": "0xad78ebc5ac6200000" }, - "9a990b8aeb588d7ee7ec2ed8c2e64f7382a9fee2": { - "balance": "33518000000000000000" + "0x9a990b8aeb588d7ee7ec2ed8c2e64f7382a9fee2": { + "balance": "0x1d127db69fd8b0000" }, - "a2e0683a805de6a05edb2ffbb5e96f0570b637c3": { - "balance": "20000000000000000000" + "0xa2e0683a805de6a05edb2ffbb5e96f0570b637c3": { + "balance": "0x1158e460913d00000" }, - "fba5486d53c6e240494241abf87e43c7600d413a": { - "balance": "1987592000000000000000" + "0xfba5486d53c6e240494241abf87e43c7600d413a": { + "balance": "0x6bbf61494948340000" }, - "d81bd54ba2c44a6f6beb1561d68b80b5444e6dc6": { - "balance": "1163806000000000000000" + "0xd81bd54ba2c44a6f6beb1561d68b80b5444e6dc6": { + "balance": "0x3f170d7ee43c430000" }, - "5298ab182a19359ffcecafd7d1b5fa212dede6dd": { - "balance": "20000000000000000000" + "0x5298ab182a19359ffcecafd7d1b5fa212dede6dd": { + "balance": "0x1158e460913d00000" }, - "d1acb5adc1183973258d6b8524ffa28ffeb23de3": { - "balance": "4000000000000000000000" + "0xd1acb5adc1183973258d6b8524ffa28ffeb23de3": { + "balance": "0xd8d726b7177a800000" }, - "4e7aa67e12183ef9d7468ea28ad239c2eef71b76": { - "balance": "4925000000000000000000" + "0x4e7aa67e12183ef9d7468ea28ad239c2eef71b76": { + "balance": "0x10afc1ade3b4ed40000" }, - "509a20bc48e72be1cdaf9569c711e8648d957334": { - "balance": "2000000000000000000000" + "0x509a20bc48e72be1cdaf9569c711e8648d957334": { + "balance": "0x6c6b935b8bbd400000" }, - "949f84f0b1d7c4a7cf49ee7f8b2c4a134de32878": { - "balance": "685000000000000000000" + "0x949f84f0b1d7c4a7cf49ee7f8b2c4a134de32878": { + "balance": "0x252248deb6e6940000" }, - "edbac9527b54d6df7ae2e000cca3613ba015cae3": { - "balance": "1970000000000000000000" + "0xedbac9527b54d6df7ae2e000cca3613ba015cae3": { + "balance": "0x6acb3df27e1f880000" }, - "c697b70477cab42e2b8b266681f4ae7375bb2541": { - "balance": "5577200000000000000000" + "0xc697b70477cab42e2b8b266681f4ae7375bb2541": { + "balance": "0x12e5732baba5c980000" }, - "86c934e38e53be3b33f274d0539cfca159a4d0d1": { - "balance": "970000000000000000000" + "0x86c934e38e53be3b33f274d0539cfca159a4d0d1": { + "balance": "0x34957444b840e80000" }, - "0877eeaeab78d5c00e83c32b2d98fa79ad51482f": { - "balance": "439420000000000000000" + "0x0877eeaeab78d5c00e83c32b2d98fa79ad51482f": { + "balance": "0x17d22d71da62260000" }, - "5e11ecf69d551d7f4f84df128046b3a13240a328": { - "balance": "20000000000000000000" + "0x5e11ecf69d551d7f4f84df128046b3a13240a328": { + "balance": "0x1158e460913d00000" }, - "43ff8853e98ed8406b95000ada848362d6a0392a": { - "balance": "22100000000000000000000" + "0x43ff8853e98ed8406b95000ada848362d6a0392a": { + "balance": "0x4ae0b1c4d2e84d00000" }, - "f11cf5d363746fee6864d3ca336dd80679bb87ae": { - "balance": "40000000000000000000000" + "0xf11cf5d363746fee6864d3ca336dd80679bb87ae": { + "balance": "0x878678326eac9000000" }, - "fb223c1e22eac1269b32ee156a5385922ed36fb8": { - "balance": "2000000000000000000000" + "0xfb223c1e22eac1269b32ee156a5385922ed36fb8": { + "balance": "0x6c6b935b8bbd400000" }, - "4e6600806289454acda330a2a3556010dfacade6": { - "balance": "6000000000000000000000" + "0x4e6600806289454acda330a2a3556010dfacade6": { + "balance": "0x14542ba12a337c00000" }, - "cfe2caaf3cec97061d0939748739bffe684ae91f": { - "balance": "10000000000000000000000" + "0xcfe2caaf3cec97061d0939748739bffe684ae91f": { + "balance": "0x21e19e0c9bab2400000" }, - "adeb52b604e5f77faaac88275b8d6b49e9f9f97f": { - "balance": "2089268000000000000000" + "0xadeb52b604e5f77faaac88275b8d6b49e9f9f97f": { + "balance": "0x71426b00956ed20000" }, - "d53c567f0c3ff2e08b7d59e2b5c73485437fc58d": { - "balance": "600000000000000000000" + "0xd53c567f0c3ff2e08b7d59e2b5c73485437fc58d": { + "balance": "0x2086ac351052600000" }, - "fbf75933e01b75b154ef0669076be87f62dffae1": { - "balance": "78000000000000000000000" + "0xfbf75933e01b75b154ef0669076be87f62dffae1": { + "balance": "0x10846372f249d4c00000" }, - "7dfd2962b575bcbeee97f49142d63c30ab009f66": { - "balance": "4000000000000000000000" + "0x7dfd2962b575bcbeee97f49142d63c30ab009f66": { + "balance": "0xd8d726b7177a800000" }, - "df6485c4297ac152b289b19dde32c77ec417f47d": { - "balance": "1000000000000000000000" + "0xdf6485c4297ac152b289b19dde32c77ec417f47d": { + "balance": "0x3635c9adc5dea00000" }, - "ffb974673367f5c07be5fd270dc4b7138b074d57": { - "balance": "2470407000000000000000" + "0xffb974673367f5c07be5fd270dc4b7138b074d57": { + "balance": "0x85ebc8bdb9066d8000" }, - "f7d7af204c56f31fd94398e40df1964bd8bf123c": { - "balance": "150011000000000000000" + "0xf7d7af204c56f31fd94398e40df1964bd8bf123c": { + "balance": "0x821d221b5291f8000" }, - "4506fe19fa4b006baa3984529d8516db2b2b50ab": { - "balance": "2000000000000000000000" + "0x4506fe19fa4b006baa3984529d8516db2b2b50ab": { + "balance": "0x6c6b935b8bbd400000" }, - "f4dc7ba85480bbb3f535c09568aaa3af6f3721c6": { - "balance": "7214962000000000000000" + "0xf4dc7ba85480bbb3f535c09568aaa3af6f3721c6": { + "balance": "0x1871fb6307e35e50000" }, - "d171c3f2258aef35e599c7da1aa07300234da9a6": { - "balance": "2000000000000000000000" + "0xd171c3f2258aef35e599c7da1aa07300234da9a6": { + "balance": "0x6c6b935b8bbd400000" }, - "33581cee233088c0860d944e0cf1ceabb8261c2e": { - "balance": "13370000000000000000" + "0x33581cee233088c0860d944e0cf1ceabb8261c2e": { + "balance": "0xb98bc829a6f90000" }, - "1c2e3607e127caca0fbd5c5948adad7dd830b285": { - "balance": "19700000000000000000000" + "0x1c2e3607e127caca0fbd5c5948adad7dd830b285": { + "balance": "0x42bf06b78ed3b500000" }, - "fd7ede8f5240a06541eb699d782c2f9afb2170f6": { - "balance": "1337000000000000000000" + "0xfd7ede8f5240a06541eb699d782c2f9afb2170f6": { + "balance": "0x487a9a304539440000" }, - "368c5414b56b8455171fbf076220c1cba4b5ca31": { - "balance": "557940000000000000000" + "0x368c5414b56b8455171fbf076220c1cba4b5ca31": { + "balance": "0x1e3ef911e83d720000" }, - "3e8745ba322f5fd6cb50124ec46688c7a69a7fae": { - "balance": "4925000000000000000000" + "0x3e8745ba322f5fd6cb50124ec46688c7a69a7fae": { + "balance": "0x10afc1ade3b4ed40000" }, - "76506eb4a780c951c74a06b03d3b8362f0999d71": { - "balance": "500000000000000000000" + "0x76506eb4a780c951c74a06b03d3b8362f0999d71": { + "balance": "0x1b1ae4d6e2ef500000" }, - "96d62dfd46087f62409d93dd606188e70e381257": { - "balance": "2000000000000000000000" + "0x96d62dfd46087f62409d93dd606188e70e381257": { + "balance": "0x6c6b935b8bbd400000" }, - "37eada93c475ded2f7e15e7787d400470fa52062": { - "balance": "200000000000000000000" + "0x37eada93c475ded2f7e15e7787d400470fa52062": { + "balance": "0xad78ebc5ac6200000" }, - "26babf42b267fdcf3861fdd4236a5e474848b358": { - "balance": "1000000000000000000000" + "0x26babf42b267fdcf3861fdd4236a5e474848b358": { + "balance": "0x3635c9adc5dea00000" }, - "3526eece1a6bdc3ee7b400fe935b48463f31bed7": { - "balance": "82400000000000000000" + "0x3526eece1a6bdc3ee7b400fe935b48463f31bed7": { + "balance": "0x477879b6d14300000" }, - "27b62816e1e3b8d19b79d1513d5dfa855b0c3a2a": { - "balance": "99941000000000000000" + "0x27b62816e1e3b8d19b79d1513d5dfa855b0c3a2a": { + "balance": "0x56af5c1fd69508000" }, - "b3e3c439069880156600c2892e448d4136c92d9b": { - "balance": "850000000000000000000" + "0xb3e3c439069880156600c2892e448d4136c92d9b": { + "balance": "0x2e141ea081ca080000" }, - "574ad9355390e4889ef42acd138b2a27e78c00ae": { - "balance": "1557000000000000000000" + "0x574ad9355390e4889ef42acd138b2a27e78c00ae": { + "balance": "0x5467b732a913340000" }, - "f0b9d683cea12ba600baace219b0b3c97e8c00e4": { - "balance": "100000000000000000000" + "0xf0b9d683cea12ba600baace219b0b3c97e8c00e4": { + "balance": "0x56bc75e2d63100000" }, - "a437fe6ec103ca8d158f63b334224eccac5b3ea3": { - "balance": "8000000000000000000000" + "0xa437fe6ec103ca8d158f63b334224eccac5b3ea3": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "7a48d877b63a8f8f9383e9d01e53e80c528e955f": { - "balance": "8000000000000000000000" + "0x7a48d877b63a8f8f9383e9d01e53e80c528e955f": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "e965daa34039f7f0df62375a37e5ab8a72b301e7": { - "balance": "4796000000000000000000" + "0xe965daa34039f7f0df62375a37e5ab8a72b301e7": { + "balance": "0x103fddecdb3f5700000" }, - "72cd048a110574482983492dfb1bd27942a696ba": { - "balance": "2000000000000000000000" + "0x72cd048a110574482983492dfb1bd27942a696ba": { + "balance": "0x6c6b935b8bbd400000" }, - "6611ce59a98b072ae959dc49ad511daaaaa19d6b": { - "balance": "200000000000000000000" + "0x6611ce59a98b072ae959dc49ad511daaaaa19d6b": { + "balance": "0xad78ebc5ac6200000" }, - "0d92582fdba05eabc3e51538c56db8813785b328": { - "balance": "191000000000000000000" + "0x0d92582fdba05eabc3e51538c56db8813785b328": { + "balance": "0xa5aa85009e39c0000" }, - "e87e9bbfbbb71c1a740c74c723426df55d063dd9": { - "balance": "7998000000000000000000" + "0xe87e9bbfbbb71c1a740c74c723426df55d063dd9": { + "balance": "0x1b1928c00c7a6380000" }, - "9c99a1da91d5920bc14e0cb914fdf62b94cb8358": { - "balance": "20000000000000000000000" + "0x9c99a1da91d5920bc14e0cb914fdf62b94cb8358": { + "balance": "0x43c33c1937564800000" }, - "fe8e6e3665570dff7a1bda697aa589c0b4e9024a": { - "balance": "2000000000000000000000" + "0xfe8e6e3665570dff7a1bda697aa589c0b4e9024a": { + "balance": "0x6c6b935b8bbd400000" }, - "811461a2b0ca90badac06a9ea16e787b33b196cc": { - "balance": "164000000000000000000" + "0x811461a2b0ca90badac06a9ea16e787b33b196cc": { + "balance": "0x8e3f50b173c100000" }, - "d211b21f1b12b5096181590de07ef81a89537ead": { - "balance": "2000000000000000000000" + "0xd211b21f1b12b5096181590de07ef81a89537ead": { + "balance": "0x6c6b935b8bbd400000" }, - "01155057002f6b0d18acb9388d3bc8129f8f7a20": { - "balance": "1340000000000000000000" + "0x01155057002f6b0d18acb9388d3bc8129f8f7a20": { + "balance": "0x48a43c54602f700000" }, - "8ce22f9fa372449a420610b47ae0c8d565481232": { - "balance": "2000000000000000000000" + "0x8ce22f9fa372449a420610b47ae0c8d565481232": { + "balance": "0x6c6b935b8bbd400000" }, - "e02b74a47628be315b1f76b315054ad44ae9716f": { - "balance": "4000000000000000000000" + "0xe02b74a47628be315b1f76b315054ad44ae9716f": { + "balance": "0xd8d726b7177a800000" }, - "92a7c5a64362e9f842a23deca21035857f889800": { - "balance": "1999944000000000000000" + "0x92a7c5a64362e9f842a23deca21035857f889800": { + "balance": "0x6c6acc67d7b1d40000" }, - "5213f459e078ad3ab95a0920239fcf1633dc04ca": { - "balance": "2599989000000000000000" + "0x5213f459e078ad3ab95a0920239fcf1633dc04ca": { + "balance": "0x8cf2187c2afb188000" }, - "c9957ba94c1b29e5277ec36622704904c63dc023": { - "balance": "1923000000000000000000" + "0xc9957ba94c1b29e5277ec36622704904c63dc023": { + "balance": "0x683efc6782642c0000" }, - "6ac40f532dfee5118117d2ad352da77d4f6da2c8": { - "balance": "400000000000000000000" + "0x6ac40f532dfee5118117d2ad352da77d4f6da2c8": { + "balance": "0x15af1d78b58c400000" }, - "ea1efb3ce789bedec3d67c3e1b3bc0e9aa227f90": { - "balance": "734000000000000000000" + "0xea1efb3ce789bedec3d67c3e1b3bc0e9aa227f90": { + "balance": "0x27ca4bd719f0b80000" }, - "b01e389b28a31d8e4995bdd7d7c81beeab1e4119": { - "balance": "1000000000000000000000" + "0xb01e389b28a31d8e4995bdd7d7c81beeab1e4119": { + "balance": "0x3635c9adc5dea00000" }, - "ee97aa8ac69edf7a987d6d70979f8ec1fbca7a94": { - "balance": "376000000000000000000" + "0xee97aa8ac69edf7a987d6d70979f8ec1fbca7a94": { + "balance": "0x14620c57dddae00000" }, - "0fad05507cdc8f24b2be4cb7fa5d927ddb911b88": { - "balance": "3004447000000000000000" + "0x0fad05507cdc8f24b2be4cb7fa5d927ddb911b88": { + "balance": "0xa2df13f441f0098000" }, - "b6e8afd93dfa9af27f39b4df06076710bee3dfab": { - "balance": "25000000000000000000" + "0xb6e8afd93dfa9af27f39b4df06076710bee3dfab": { + "balance": "0x15af1d78b58c40000" }, - "7d0b255efb57e10f7008aa22d40e9752dfcf0378": { - "balance": "29944000000000000000" + "0x7d0b255efb57e10f7008aa22d40e9752dfcf0378": { + "balance": "0x19f8e7559924c0000" }, - "aef5b12258a18dec07d5ec2e316574919d79d6d6": { - "balance": "2000000000000000000000" + "0xaef5b12258a18dec07d5ec2e316574919d79d6d6": { + "balance": "0x6c6b935b8bbd400000" }, - "63666755bd41b5986997783c13043008242b3cb5": { - "balance": "500000000000000000000" + "0x63666755bd41b5986997783c13043008242b3cb5": { + "balance": "0x1b1ae4d6e2ef500000" }, - "921f5261f4f612760706892625c75e7bce96b708": { - "balance": "2000000000000000000000" + "0x921f5261f4f612760706892625c75e7bce96b708": { + "balance": "0x6c6b935b8bbd400000" }, - "10e1e3377885c42d7df218522ee7766887c05e6a": { - "balance": "300031000000000000000" + "0x10e1e3377885c42d7df218522ee7766887c05e6a": { + "balance": "0x1043c43cde1d398000" }, - "134163be9fbbe1c5696ee255e90b13254395c318": { - "balance": "200000000000000000000" + "0x134163be9fbbe1c5696ee255e90b13254395c318": { + "balance": "0xad78ebc5ac6200000" }, - "870f15e5df8b0eabd02569537a8ef93b56785c42": { - "balance": "388000000000000000000" + "0x870f15e5df8b0eabd02569537a8ef93b56785c42": { + "balance": "0x150894e849b3900000" }, - "68eec1e288ac31b6eaba7e1fbd4f04ad579a6b5d": { - "balance": "2000000000000000000000" + "0x68eec1e288ac31b6eaba7e1fbd4f04ad579a6b5d": { + "balance": "0x6c6b935b8bbd400000" }, - "1a2694ec07cf5e4d68ba40f3e7a14c53f3038c6e": { - "balance": "1000073000000000000000" + "0x1a2694ec07cf5e4d68ba40f3e7a14c53f3038c6e": { + "balance": "0x3636cd06e2db3a8000" }, - "cd9b4cef73390c83a8fd71d7b540a7f9cf8b8c92": { - "balance": "90000000000000000000" + "0xcd9b4cef73390c83a8fd71d7b540a7f9cf8b8c92": { + "balance": "0x4e1003b28d9280000" }, - "c8de7a564c7f4012a6f6d10fd08f47890fbf07d4": { - "balance": "300000000000000000000" + "0xc8de7a564c7f4012a6f6d10fd08f47890fbf07d4": { + "balance": "0x1043561a8829300000" }, - "c0345b33f49ce27fe82cf7c84d141c68f590ce76": { - "balance": "1000000000000000000000" + "0xc0345b33f49ce27fe82cf7c84d141c68f590ce76": { + "balance": "0x3635c9adc5dea00000" }, - "fe53b94989d89964da2061539526bbe979dd2ea9": { - "balance": "1930600000000000000000" + "0xfe53b94989d89964da2061539526bbe979dd2ea9": { + "balance": "0x68a875073e29240000" }, - "14410fb310711be074a80883c635d0ef6afb2539": { - "balance": "2000000000000000000000" + "0x14410fb310711be074a80883c635d0ef6afb2539": { + "balance": "0x6c6b935b8bbd400000" }, - "1d344e962567cb27e44db9f2fac7b68df1c1e6f7": { - "balance": "1940000000000000000000" + "0x1d344e962567cb27e44db9f2fac7b68df1c1e6f7": { + "balance": "0x692ae8897081d00000" }, - "fe016ec17ec5f10e3bb98ff4a1eda045157682ab": { - "balance": "375804000000000000000" + "0xfe016ec17ec5f10e3bb98ff4a1eda045157682ab": { + "balance": "0x145f5402e7b2e60000" }, - "e89da96e06beaf6bd880b378f0680c43fd2e9d30": { - "balance": "601400000000000000000" + "0xe89da96e06beaf6bd880b378f0680c43fd2e9d30": { + "balance": "0x209a1a01a56fec0000" }, - "0fee81ac331efd8f81161c57382bb4507bb9ebec": { - "balance": "400030000000000000000" + "0x0fee81ac331efd8f81161c57382bb4507bb9ebec": { + "balance": "0x15af880d8cdb830000" }, - "40cf90ef5b768c5da585002ccbe6617650d8e837": { - "balance": "999800000000000000000" + "0x40cf90ef5b768c5da585002ccbe6617650d8e837": { + "balance": "0x36330322d5238c0000" }, - "256fa150cc87b5056a07d004efc84524739e62b5": { - "balance": "200000000000000000000" + "0x256fa150cc87b5056a07d004efc84524739e62b5": { + "balance": "0xad78ebc5ac6200000" }, - "1b9b2dc2960e4cb9408f7405827c9b59071612fd": { - "balance": "1000000000000000000000" + "0x1b9b2dc2960e4cb9408f7405827c9b59071612fd": { + "balance": "0x3635c9adc5dea00000" }, - "0efd1789eb1244a3dede0f5de582d8963cb1f39f": { - "balance": "1500000000000000000000" + "0x0efd1789eb1244a3dede0f5de582d8963cb1f39f": { + "balance": "0x5150ae84a8cdf00000" }, - "049c5d4bc6f25d4e456c697b52a07811ccd19fb1": { - "balance": "300048000000000000000" + "0x049c5d4bc6f25d4e456c697b52a07811ccd19fb1": { + "balance": "0x104400a2470e680000" }, - "02b7b1d6b34ce053a40eb65cd4a4f7dddd0e9f30": { - "balance": "685000000000000000000" + "0x02b7b1d6b34ce053a40eb65cd4a4f7dddd0e9f30": { + "balance": "0x252248deb6e6940000" }, - "c1827686c0169485ec15b3a7c8c01517a2874de1": { - "balance": "40000000000000000000" + "0xc1827686c0169485ec15b3a7c8c01517a2874de1": { + "balance": "0x22b1c8c1227a00000" }, - "d8e5c9675ef4deed266b86956fc4590ea7d4a27d": { - "balance": "1000000000000000000000" + "0xd8e5c9675ef4deed266b86956fc4590ea7d4a27d": { + "balance": "0x3635c9adc5dea00000" }, - "48f883e567b436a27bb5a3124dbc84dec775a800": { - "balance": "771840000000000000000" + "0x48f883e567b436a27bb5a3124dbc84dec775a800": { + "balance": "0x29d76e869dcd800000" }, - "a34076f84bd917f20f8342c98ba79e6fb08ecd31": { - "balance": "4200000000000000000000" + "0xa34076f84bd917f20f8342c98ba79e6fb08ecd31": { + "balance": "0xe3aeb5737240a00000" }, - "21ce6d5b9018cec04ad6967944bea39e8030b6b8": { - "balance": "20000000000000000000" + "0x21ce6d5b9018cec04ad6967944bea39e8030b6b8": { + "balance": "0x1158e460913d00000" }, - "0596a27dc3ee115fce2f94b481bc207a9e261525": { - "balance": "1000000000000000000000" + "0x0596a27dc3ee115fce2f94b481bc207a9e261525": { + "balance": "0x3635c9adc5dea00000" }, - "717cf9beab3638308ded7e195e0c86132d163fed": { - "balance": "15097428000000000000000" + "0x717cf9beab3638308ded7e195e0c86132d163fed": { + "balance": "0x3326ee6f865f4220000" }, - "d5ce55d1b62f59433c2126bcec09bafc9dfaa514": { - "balance": "197000000000000000000" + "0xd5ce55d1b62f59433c2126bcec09bafc9dfaa514": { + "balance": "0xaadec983fcff40000" }, - "7dd46da677e161825e12e80dc446f58276e1127c": { - "balance": "820000000000000000000" + "0x7dd46da677e161825e12e80dc446f58276e1127c": { + "balance": "0x2c73c937742c500000" }, - "98c5494a03ac91a768dffc0ea1dde0acbf889019": { - "balance": "200000000000000000000000" + "0x98c5494a03ac91a768dffc0ea1dde0acbf889019": { + "balance": "0x2a5a058fc295ed000000" }, - "617ff2cc803e31c9082233b825d025be3f7b1056": { - "balance": "1970000000000000000000" + "0x617ff2cc803e31c9082233b825d025be3f7b1056": { + "balance": "0x6acb3df27e1f880000" }, - "1091176be19b9964a8f72e0ece6bf8e3cfad6e9c": { - "balance": "10020000000000000000000" + "0x1091176be19b9964a8f72e0ece6bf8e3cfad6e9c": { + "balance": "0x21f2f6f0fc3c6100000" }, - "4ea56e1112641c038d0565a9c296c463afefc17e": { - "balance": "182000000000000000000" + "0x4ea56e1112641c038d0565a9c296c463afefc17e": { + "balance": "0x9ddc1e3b901180000" }, - "e303167f3d4960fe881b32800a2b4aeff1b088d4": { - "balance": "2000000000000000000000" + "0xe303167f3d4960fe881b32800a2b4aeff1b088d4": { + "balance": "0x6c6b935b8bbd400000" }, - "773141127d8cf318aebf88365add3d5527d85b6a": { - "balance": "1000076000000000000000" + "0x773141127d8cf318aebf88365add3d5527d85b6a": { + "balance": "0x3636d7af5ec98e0000" }, - "b916b1a01cdc4e56e7657715ea37e2a0f087d106": { - "balance": "2406017000000000000000" + "0xb916b1a01cdc4e56e7657715ea37e2a0f087d106": { + "balance": "0x826e3181e027068000" }, - "46a430a2d4a894a0d8aa3feac615361415c3f81f": { - "balance": "2000000000000000000000" + "0x46a430a2d4a894a0d8aa3feac615361415c3f81f": { + "balance": "0x6c6b935b8bbd400000" }, - "e6a3010f0201bc94ff67a2f699dfc206f9e76742": { - "balance": "879088000000000000000" + "0xe6a3010f0201bc94ff67a2f699dfc206f9e76742": { + "balance": "0x2fa7cbf66464980000" }, - "d7ad09c6d32657685355b5c6ec8e9f57b4ebb982": { - "balance": "1970000000000000000000" + "0xd7ad09c6d32657685355b5c6ec8e9f57b4ebb982": { + "balance": "0x6acb3df27e1f880000" }, - "95e80a82c20cbe3d2060242cb92d735810d034a2": { - "balance": "32511000000000000000" + "0x95e80a82c20cbe3d2060242cb92d735810d034a2": { + "balance": "0x1c32e463fd4b98000" }, - "9a390162535e398877e416787d6239e0754e937c": { - "balance": "1000000000000000000000" + "0x9a390162535e398877e416787d6239e0754e937c": { + "balance": "0x3635c9adc5dea00000" }, - "d85fdeaf2a61f95db902f9b5a53c9b8f9266c3ac": { - "balance": "2010000000000000000000" + "0xd85fdeaf2a61f95db902f9b5a53c9b8f9266c3ac": { + "balance": "0x6cf65a7e9047280000" }, - "c3e20c96df8d4e38f50b265a98a906d61bc51a71": { - "balance": "2000000000000000000000" + "0xc3e20c96df8d4e38f50b265a98a906d61bc51a71": { + "balance": "0x6c6b935b8bbd400000" }, - "2949fd1def5c76a286b3872424809a07db3966f3": { - "balance": "5236067000000000000000" + "0x2949fd1def5c76a286b3872424809a07db3966f3": { + "balance": "0x11bd906daa0c9438000" }, - "86cdb7e51ac44772be3690f61d0e59766e8bfc18": { - "balance": "4000000000000000000000" + "0x86cdb7e51ac44772be3690f61d0e59766e8bfc18": { + "balance": "0xd8d726b7177a800000" }, - "749a4a768b5f237248938a12c623847bd4e688dc": { - "balance": "72000000000000000000" + "0x749a4a768b5f237248938a12c623847bd4e688dc": { + "balance": "0x3e733628714200000" }, - "3524a000234ebaaf0789a134a2a417383ce5282a": { - "balance": "5635000000000000000000" + "0x3524a000234ebaaf0789a134a2a417383ce5282a": { + "balance": "0x1317955947d8e2c0000" }, - "7b43c7eea8d62355b0a8a81da081c6446b33e9e0": { - "balance": "4000000000000000000000" + "0x7b43c7eea8d62355b0a8a81da081c6446b33e9e0": { + "balance": "0xd8d726b7177a800000" }, - "0eb189ef2c2d5762a963d6b7bdf9698ea8e7b48a": { - "balance": "1337000000000000000000" + "0x0eb189ef2c2d5762a963d6b7bdf9698ea8e7b48a": { + "balance": "0x487a9a304539440000" }, - "767fd7797d5169a05f7364321c19843a8c348e1e": { - "balance": "18800000000000000000" + "0x767fd7797d5169a05f7364321c19843a8c348e1e": { + "balance": "0x104e70464b1580000" }, - "1b2639588b55c344b023e8de5fd4087b1f040361": { - "balance": "1500000000000000000000" + "0x1b2639588b55c344b023e8de5fd4087b1f040361": { + "balance": "0x5150ae84a8cdf00000" }, - "1e33d1c2fb5e084f2f1d54bc5267727fec3f985d": { - "balance": "500000000000000000000" + "0x1e33d1c2fb5e084f2f1d54bc5267727fec3f985d": { + "balance": "0x1b1ae4d6e2ef500000" }, - "06b106649aa8c421ddcd1b8c32cd0418cf30da1f": { - "balance": "40000000000000000000000" + "0x06b106649aa8c421ddcd1b8c32cd0418cf30da1f": { + "balance": "0x878678326eac9000000" }, - "3c5a241459c6abbf630239c98a30d20b8b3ac561": { - "balance": "157600000000000000000" + "0x3c5a241459c6abbf630239c98a30d20b8b3ac561": { + "balance": "0x88b23acffd9900000" }, - "0f4f94b9191bb7bb556aaad7c74ddb288417a50b": { - "balance": "1400000000000000000000" + "0x0f4f94b9191bb7bb556aaad7c74ddb288417a50b": { + "balance": "0x4be4e7267b6ae00000" }, - "d6f4a7d04e8faf20e8c6eb859cf7f78dd23d7a15": { - "balance": "131784000000000000000" + "0xd6f4a7d04e8faf20e8c6eb859cf7f78dd23d7a15": { + "balance": "0x724ded1c748140000" }, - "61adf5929a5e2981684ea243baa01f7d1f5e148a": { - "balance": "110302000000000000000" + "0x61adf5929a5e2981684ea243baa01f7d1f5e148a": { + "balance": "0x5fabf6c984f230000" }, - "8f58d8348fc1dc4e0dd8343b6543c857045ee940": { - "balance": "13632400000000000000000" + "0x8f58d8348fc1dc4e0dd8343b6543c857045ee940": { + "balance": "0x2e3038df47303280000" }, - "a6e3baa38e104a1e27a4d82869afb1c0ae6eff8d": { - "balance": "19690000000000000000" + "0xa6e3baa38e104a1e27a4d82869afb1c0ae6eff8d": { + "balance": "0x11140eead8b710000" }, - "67350b5331926f5e28f3c1e986f96443809c8b8c": { - "balance": "352000000000000000000" + "0x67350b5331926f5e28f3c1e986f96443809c8b8c": { + "balance": "0x1314fb370629800000" }, - "0b5d66b13c87b392e94d91d5f76c0d450a552843": { - "balance": "2000000000000000000000" + "0x0b5d66b13c87b392e94d91d5f76c0d450a552843": { + "balance": "0x6c6b935b8bbd400000" }, - "562a8dcbbeeef7b360685d27303bd69e094accf6": { - "balance": "10000000000000000000000" + "0x562a8dcbbeeef7b360685d27303bd69e094accf6": { + "balance": "0x21e19e0c9bab2400000" }, - "b5d9934d7b292bcf603b2880741eb760288383a0": { - "balance": "16700000000000000000" + "0xb5d9934d7b292bcf603b2880741eb760288383a0": { + "balance": "0xe7c2518505060000" }, - "6fc53662371dca587b59850de78606e2359df383": { - "balance": "180000000000000000000" + "0x6fc53662371dca587b59850de78606e2359df383": { + "balance": "0x9c2007651b2500000" }, - "e069c0173352b10bf6834719db5bed01adf97bbc": { - "balance": "18894000000000000000" + "0xe069c0173352b10bf6834719db5bed01adf97bbc": { + "balance": "0x10634f8e5323b0000" }, - "10a93457496f1108cd98e140a1ecdbae5e6de171": { - "balance": "399600000000000000000" + "0x10a93457496f1108cd98e140a1ecdbae5e6de171": { + "balance": "0x15a99062d416180000" }, - "69ff8901b541763f817c5f2998f02dcfc1df2997": { - "balance": "40000000000000000000" + "0x69ff8901b541763f817c5f2998f02dcfc1df2997": { + "balance": "0x22b1c8c1227a00000" }, - "00c27d63fde24b92ee8a1e7ed5d26d8dc5c83b03": { - "balance": "2000000000000000000000" + "0x00c27d63fde24b92ee8a1e7ed5d26d8dc5c83b03": { + "balance": "0x6c6b935b8bbd400000" }, - "77f81b1b26fc84d6de97ef8b9fbd72a33130cc4a": { - "balance": "1000000000000000000000" + "0x77f81b1b26fc84d6de97ef8b9fbd72a33130cc4a": { + "balance": "0x3635c9adc5dea00000" }, - "6d20ef9704670a500bb269b5832e859802049f01": { - "balance": "130000000000000000000" + "0x6d20ef9704670a500bb269b5832e859802049f01": { + "balance": "0x70c1cc73b00c80000" }, - "186afdc085f2a3dce4615edffbadf71a11780f50": { - "balance": "200000000000000000000" + "0x186afdc085f2a3dce4615edffbadf71a11780f50": { + "balance": "0xad78ebc5ac6200000" }, - "7ff0c63f70241bece19b737e5341b12b109031d8": { - "balance": "346000000000000000000" + "0x7ff0c63f70241bece19b737e5341b12b109031d8": { + "balance": "0x12c1b6eed03d280000" }, - "9d4174aa6af28476e229dadb46180808c67505c1": { - "balance": "1219430000000000000000" + "0x9d4174aa6af28476e229dadb46180808c67505c1": { + "balance": "0x421afda42ed6970000" }, - "5fec49c665e64ee89dd441ee74056e1f01e92870": { - "balance": "6320000000000000000000" + "0x5fec49c665e64ee89dd441ee74056e1f01e92870": { + "balance": "0x1569b9e733474c00000" }, - "6cd228dc712169307fe27ceb7477b48cfc8272e5": { - "balance": "77600000000000000000" + "0x6cd228dc712169307fe27ceb7477b48cfc8272e5": { + "balance": "0x434ea94db8a500000" }, - "fd918536a8efa6f6cefe1fa1153995fef5e33d3b": { - "balance": "500000000000000000000" + "0xfd918536a8efa6f6cefe1fa1153995fef5e33d3b": { + "balance": "0x1b1ae4d6e2ef500000" }, - "2fbb504a5dc527d3e3eb0085e2fc3c7dd538cb7a": { - "balance": "1249961000000000000000" + "0x2fbb504a5dc527d3e3eb0085e2fc3c7dd538cb7a": { + "balance": "0x43c2b18aec3c0a8000" }, - "6ab323ae5056ed0a453072c5abe2e42fcf5d7139": { - "balance": "880000000000000000000" + "0x6ab323ae5056ed0a453072c5abe2e42fcf5d7139": { + "balance": "0x2fb474098f67c00000" }, - "67d682a282ef73fb8d6e9071e2614f47ab1d0f5e": { - "balance": "1000000000000000000000" + "0x67d682a282ef73fb8d6e9071e2614f47ab1d0f5e": { + "balance": "0x3635c9adc5dea00000" }, - "1858cf11aea79f5398ad2bb22267b5a3c952ea74": { - "balance": "9850000000000000000000" + "0x1858cf11aea79f5398ad2bb22267b5a3c952ea74": { + "balance": "0x215f835bc769da80000" }, - "39d6caca22bccd6a72f87ee7d6b59e0bde21d719": { - "balance": "2002000000000000000000" + "0x39d6caca22bccd6a72f87ee7d6b59e0bde21d719": { + "balance": "0x6c8754c8f30c080000" }, - "daa63cbda45dd487a3f1cd4a746a01bb5e060b90": { - "balance": "4797800000000000000000" + "0xdaa63cbda45dd487a3f1cd4a746a01bb5e060b90": { + "balance": "0x10416d9b02a89240000" }, - "a90476e2efdfee4f387b0f32a50678b0efb573b5": { - "balance": "10000000000000000000000" + "0xa90476e2efdfee4f387b0f32a50678b0efb573b5": { + "balance": "0x21e19e0c9bab2400000" }, - "ae5aa1e6c2b60f6fd3efe721bb4a719cbe3d6f5d": { - "balance": "795860000000000000000" + "0xae5aa1e6c2b60f6fd3efe721bb4a719cbe3d6f5d": { + "balance": "0x2b24c6b55a5e620000" }, - "ac2e766dac3f648f637ac6713fddb068e4a4f04d": { - "balance": "197000000000000000000" + "0xac2e766dac3f648f637ac6713fddb068e4a4f04d": { + "balance": "0xaadec983fcff40000" }, - "6191ddc9b64a8e0890b4323709d7a07c48b92a64": { - "balance": "775000000000000000000" + "0x6191ddc9b64a8e0890b4323709d7a07c48b92a64": { + "balance": "0x2a034919dfbfbc0000" }, - "cc4f0ff2aeb67d54ce3bc8c6510b9ae83e9d328b": { - "balance": "400000000000000000000" + "0xcc4f0ff2aeb67d54ce3bc8c6510b9ae83e9d328b": { + "balance": "0x15af1d78b58c400000" }, - "ca23f62dff0d6460036c62e840aec5577e0befd2": { - "balance": "140800000000000000000" + "0xca23f62dff0d6460036c62e840aec5577e0befd2": { + "balance": "0x7a1fe160277000000" }, - "97dc26ec670a31e0221d2a75bc5dc9f90c1f6fd4": { - "balance": "50000000000000000000" + "0x97dc26ec670a31e0221d2a75bc5dc9f90c1f6fd4": { + "balance": "0x2b5e3af16b1880000" }, - "848c994a79003fe7b7c26cc63212e1fc2f9c19eb": { - "balance": "2000000000000000000000" + "0x848c994a79003fe7b7c26cc63212e1fc2f9c19eb": { + "balance": "0x6c6b935b8bbd400000" }, - "20c284ba10a20830fc3d699ec97d2dfa27e1b95e": { - "balance": "2000000000000000000000" + "0x20c284ba10a20830fc3d699ec97d2dfa27e1b95e": { + "balance": "0x6c6b935b8bbd400000" }, - "4fa3f32ef4086448b344d5f0a9890d1ce4d617c3": { - "balance": "1500000000000000000000" + "0x4fa3f32ef4086448b344d5f0a9890d1ce4d617c3": { + "balance": "0x5150ae84a8cdf00000" }, - "255abc8d08a096a88f3d6ab55fbc7352bddcb9ce": { - "balance": "82161000000000000000" + "0x255abc8d08a096a88f3d6ab55fbc7352bddcb9ce": { + "balance": "0x4743682313ede8000" }, - "7c60e51f0be228e4d56fdd2992c814da7740c6bc": { - "balance": "200000000000000000000" + "0x7c60e51f0be228e4d56fdd2992c814da7740c6bc": { + "balance": "0xad78ebc5ac6200000" }, - "1c356cfdb95febb714633b28d5c132dd84a9b436": { - "balance": "25000000000000000000" + "0x1c356cfdb95febb714633b28d5c132dd84a9b436": { + "balance": "0x15af1d78b58c40000" }, - "5062e5134c612f12694dbd0e131d4ce197d1b6a4": { - "balance": "1000000000000000000000" + "0x5062e5134c612f12694dbd0e131d4ce197d1b6a4": { + "balance": "0x3635c9adc5dea00000" }, - "ed862616fcbfb3becb7406f73c5cbff00c940755": { - "balance": "1700000000000000000000" + "0xed862616fcbfb3becb7406f73c5cbff00c940755": { + "balance": "0x5c283d410394100000" }, - "62c9b271ffd5b770a5eee4edc9787b5cdc709714": { - "balance": "2000000000000000000000" + "0x62c9b271ffd5b770a5eee4edc9787b5cdc709714": { + "balance": "0x6c6b935b8bbd400000" }, - "3c925619c9b33144463f0537d896358706c520b0": { - "balance": "2000000000000000000000" + "0x3c925619c9b33144463f0537d896358706c520b0": { + "balance": "0x6c6b935b8bbd400000" }, - "ffe2e28c3fb74749d7e780dc8a5d422538e6e451": { - "balance": "253319000000000000000" + "0xffe2e28c3fb74749d7e780dc8a5d422538e6e451": { + "balance": "0xdbb81e05bc12d8000" }, - "37195a635dcc62f56a718049d47e8f9f96832891": { - "balance": "1970000000000000000000" + "0x37195a635dcc62f56a718049d47e8f9f96832891": { + "balance": "0x6acb3df27e1f880000" }, - "90e9a9a82edaa814c284d232b6e9ba90701d4952": { - "balance": "100007000000000000000" + "0x90e9a9a82edaa814c284d232b6e9ba90701d4952": { + "balance": "0x56be03ca3e47d8000" }, - "e0c4ab9072b4e6e3654a49f8a8db026a4b3386a9": { - "balance": "2000000000000000000000" + "0xe0c4ab9072b4e6e3654a49f8a8db026a4b3386a9": { + "balance": "0x6c6b935b8bbd400000" }, - "439dee3f7679ff1030733f9340c096686b49390b": { - "balance": "2000000000000000000000" + "0x439dee3f7679ff1030733f9340c096686b49390b": { + "balance": "0x6c6b935b8bbd400000" }, - "548558d08cfcb101181dac1eb6094b4e1a896fa6": { - "balance": "1999944000000000000000" + "0x548558d08cfcb101181dac1eb6094b4e1a896fa6": { + "balance": "0x6c6acc67d7b1d40000" }, - "3090f8130ec44466afadb36ed3c926133963677b": { - "balance": "4000000000000000000000" + "0x3090f8130ec44466afadb36ed3c926133963677b": { + "balance": "0xd8d726b7177a800000" }, - "d1648503b1ccc5b8be03fa1ec4f3ee267e6adf7b": { - "balance": "5828000000000000000000" + "0xd1648503b1ccc5b8be03fa1ec4f3ee267e6adf7b": { + "balance": "0x13befbf51eec0900000" }, - "65b42faecc1edfb14283ca979af545f63b30e60c": { - "balance": "18200000000000000000" + "0x65b42faecc1edfb14283ca979af545f63b30e60c": { + "balance": "0xfc936392801c0000" }, - "6420f8bcc8164a6152a99d6b99693005ccf7e053": { - "balance": "999972000000000000000" + "0x6420f8bcc8164a6152a99d6b99693005ccf7e053": { + "balance": "0x36356633ebd8ea0000" }, - "84b4b74e6623ba9d1583e0cfbe49643f16384149": { - "balance": "20000000000000000000" + "0x84b4b74e6623ba9d1583e0cfbe49643f16384149": { + "balance": "0x1158e460913d00000" }, - "b8310a16cc6abc465007694b930f978ece1930bd": { - "balance": "740000000000000000000" + "0xb8310a16cc6abc465007694b930f978ece1930bd": { + "balance": "0x281d901f4fdd100000" }, - "16019a4dafab43f4d9bf4163fae0847d848afca2": { - "balance": "25060000000000000000" + "0x16019a4dafab43f4d9bf4163fae0847d848afca2": { + "balance": "0x15bc70139f74a0000" }, - "479298a9de147e63a1c7d6d2fce089c7e64083bd": { - "balance": "9999999000000000000000" + "0x479298a9de147e63a1c7d6d2fce089c7e64083bd": { + "balance": "0x21e19dd3c3c0d798000" }, - "030973807b2f426914ad00181270acd27b8ff61f": { - "balance": "5348000000000000000000" + "0x030973807b2f426914ad00181270acd27b8ff61f": { + "balance": "0x121ea68c114e5100000" }, - "b07bcf1cc5d4462e5124c965ecf0d70dc27aca75": { - "balance": "1600000000000000000000" + "0xb07bcf1cc5d4462e5124c965ecf0d70dc27aca75": { + "balance": "0x56bc75e2d631000000" }, - "a2f798e077b07d86124e1407df32890dbb4b6379": { - "balance": "200000000000000000000" + "0xa2f798e077b07d86124e1407df32890dbb4b6379": { + "balance": "0xad78ebc5ac6200000" }, - "0cbd921dbe121563b98a6871fecb14f1cc7e88d7": { - "balance": "200000000000000000000" + "0x0cbd921dbe121563b98a6871fecb14f1cc7e88d7": { + "balance": "0xad78ebc5ac6200000" }, - "6042276df2983fe2bc4759dc1943e18fdbc34f77": { - "balance": "1970000000000000000000" + "0x6042276df2983fe2bc4759dc1943e18fdbc34f77": { + "balance": "0x6acb3df27e1f880000" }, - "be2b2280523768ea8ac35cd9e888d60a719300d4": { - "balance": "2000000000000000000000" + "0xbe2b2280523768ea8ac35cd9e888d60a719300d4": { + "balance": "0x6c6b935b8bbd400000" }, - "2f4da753430fc09e73acbccdcde9da647f2b5d37": { - "balance": "200000000000000000000" + "0x2f4da753430fc09e73acbccdcde9da647f2b5d37": { + "balance": "0xad78ebc5ac6200000" }, - "734223d27ff23e5906caed22595701bb34830ca1": { - "balance": "2000000000000000000000" + "0x734223d27ff23e5906caed22595701bb34830ca1": { + "balance": "0x6c6b935b8bbd400000" }, - "5b430d779696a3653fc60e74fbcbacf6b9c2baf1": { - "balance": "14000000000000000000000" + "0x5b430d779696a3653fc60e74fbcbacf6b9c2baf1": { + "balance": "0x2f6f10780d22cc00000" }, - "84232107932b12e03186583525ce023a703ef8d9": { - "balance": "2000000000000000000000" + "0x84232107932b12e03186583525ce023a703ef8d9": { + "balance": "0x6c6b935b8bbd400000" }, - "4ed14d81b60b23fb25054d8925dfa573dcae6168": { - "balance": "340000000000000000000" + "0x4ed14d81b60b23fb25054d8925dfa573dcae6168": { + "balance": "0x126e72a69a50d00000" }, - "8b338411f26ccf37658cc75521d77629099e467d": { - "balance": "2000000000000000000000" + "0x8b338411f26ccf37658cc75521d77629099e467d": { + "balance": "0x6c6b935b8bbd400000" }, - "a37622ac9bbdc4d82b75015d745b9f8de65a28ec": { - "balance": "2910000000000000000000" + "0xa37622ac9bbdc4d82b75015d745b9f8de65a28ec": { + "balance": "0x9dc05cce28c2b80000" }, - "1dd77441844afe9cc18f15d8c77bccfb655ee034": { - "balance": "4850000000000000000000" + "0x1dd77441844afe9cc18f15d8c77bccfb655ee034": { + "balance": "0x106eb45579944880000" }, - "65849be1af20100eb8a3ba5a5be4d3ae8db5a70e": { - "balance": "400000000000000000000" + "0x65849be1af20100eb8a3ba5a5be4d3ae8db5a70e": { + "balance": "0x15af1d78b58c400000" }, - "d5586da4e59583c8d86cccf71a86197f17996749": { - "balance": "2000000000000000000000" + "0xd5586da4e59583c8d86cccf71a86197f17996749": { + "balance": "0x6c6b935b8bbd400000" }, - "4b53ae59c784b6b5c43616b9a0809558e684e10c": { - "balance": "1200000000000000000000" + "0x4b53ae59c784b6b5c43616b9a0809558e684e10c": { + "balance": "0x410d586a20a4c00000" }, - "55d42eb495bf46a634997b5f2ea362814918e2b0": { - "balance": "106128000000000000000" + "0x55d42eb495bf46a634997b5f2ea362814918e2b0": { + "balance": "0x5c0d265b5b2a80000" }, - "959ff17f1d51b473b44010052755a7fa8c75bd54": { - "balance": "1970000000000000000000" + "0x959ff17f1d51b473b44010052755a7fa8c75bd54": { + "balance": "0x6acb3df27e1f880000" }, - "5a2daab25c31a61a92a4c82c9925a1d2ef58585e": { - "balance": "225400000000000000000" + "0x5a2daab25c31a61a92a4c82c9925a1d2ef58585e": { + "balance": "0xc380da9c7950c0000" }, - "24c0c88b54a3544709828ab4ab06840559f6c5e2": { - "balance": "2674000000000000000000" + "0x24c0c88b54a3544709828ab4ab06840559f6c5e2": { + "balance": "0x90f534608a72880000" }, - "7e8649e690fc8c1bfda1b5e186581f649b50fe33": { - "balance": "98500000000000000000" + "0x7e8649e690fc8c1bfda1b5e186581f649b50fe33": { + "balance": "0x556f64c1fe7fa0000" }, - "4acfa9d94eda6625c9dfa5f9f4f5d107c4031fdf": { - "balance": "39400000000000000000" + "0x4acfa9d94eda6625c9dfa5f9f4f5d107c4031fdf": { + "balance": "0x222c8eb3ff6640000" }, - "5778ffdc9b94c5a59e224eb965b6de90f222d170": { - "balance": "335320000000000000000" + "0x5778ffdc9b94c5a59e224eb965b6de90f222d170": { + "balance": "0x122d7ff36603fc0000" }, - "825a7f4e10949cb6f8964268f1fa5f57e712b4c4": { - "balance": "20000000000000000000" + "0x825a7f4e10949cb6f8964268f1fa5f57e712b4c4": { + "balance": "0x1158e460913d00000" }, - "6f39cc37caaa2ddc9b610f6131e0619fae772a3c": { - "balance": "500000000000000000000" + "0x6f39cc37caaa2ddc9b610f6131e0619fae772a3c": { + "balance": "0x1b1ae4d6e2ef500000" }, - "5b437365ae3a9a2ff97c68e6f90a7620188c7d19": { - "balance": "2002000000000000000000" + "0x5b437365ae3a9a2ff97c68e6f90a7620188c7d19": { + "balance": "0x6c8754c8f30c080000" }, - "6710c2c03c65992b2e774be52d3ab4a6ba217ef7": { - "balance": "11600000000000000000000" + "0x6710c2c03c65992b2e774be52d3ab4a6ba217ef7": { + "balance": "0x274d656ac90e3400000" }, - "896e335ca47af57962fa0f4dbf3e45e688cba584": { - "balance": "1368500000000000000000" + "0x896e335ca47af57962fa0f4dbf3e45e688cba584": { + "balance": "0x4a2fc0ab6052120000" }, - "b57549bfbc9bdd18f736b22650e48a73601fa65c": { - "balance": "446000000000000000000" + "0xb57549bfbc9bdd18f736b22650e48a73601fa65c": { + "balance": "0x182d7e4cfda0380000" }, - "85ca1e727e9d1a87991cc2c41840ebb9edf21d1b": { - "balance": "13370000000000000000" + "0x85ca1e727e9d1a87991cc2c41840ebb9edf21d1b": { + "balance": "0xb98bc829a6f90000" }, - "cf4166746e1d3bc1f8d0714b01f17e8a62df1464": { - "balance": "1004700000000000000000" + "0xcf4166746e1d3bc1f8d0714b01f17e8a62df1464": { + "balance": "0x3677036edf0af60000" }, - "4a75c3d4fa6fccbd5dd5a703c15379a1e783e9b7": { - "balance": "1820000000000000000000" + "0x4a75c3d4fa6fccbd5dd5a703c15379a1e783e9b7": { + "balance": "0x62a992e53a0af00000" }, - "9e5811b40be1e2a1e1d28c3b0774acde0a09603d": { - "balance": "3000000000000000000000" + "0x9e5811b40be1e2a1e1d28c3b0774acde0a09603d": { + "balance": "0xa2a15d09519be00000" }, - "763886e333c56feff85be3951ab0b889ce262e95": { - "balance": "2000000000000000000000" + "0x763886e333c56feff85be3951ab0b889ce262e95": { + "balance": "0x6c6b935b8bbd400000" }, - "2b101e822cd962962a06800a2c08d3b15d82b735": { - "balance": "152000000000000000000" + "0x2b101e822cd962962a06800a2c08d3b15d82b735": { + "balance": "0x83d6c7aab63600000" }, - "a01e9476df84431825c836e8803a97e22fa5a0cd": { - "balance": "6000000000000000000000" + "0xa01e9476df84431825c836e8803a97e22fa5a0cd": { + "balance": "0x14542ba12a337c00000" }, - "be4e7d983f2e2a636b1102ec7039efebc842e98d": { - "balance": "66000000000000000000" + "0xbe4e7d983f2e2a636b1102ec7039efebc842e98d": { + "balance": "0x393ef1a5127c80000" }, - "9e427272516b3e67d4fcbf82f59390d04c8e28e5": { - "balance": "4000000000000000000000" + "0x9e427272516b3e67d4fcbf82f59390d04c8e28e5": { + "balance": "0xd8d726b7177a800000" }, - "e0d231e144ec9107386c7c9b02f1702ceaa4f700": { - "balance": "5000057000000000000000" + "0xe0d231e144ec9107386c7c9b02f1702ceaa4f700": { + "balance": "0x10f0dbae61009528000" }, - "6a0f056066c2d56628850273d7ecb7f8e6e9129e": { - "balance": "5000016000000000000000" + "0x6a0f056066c2d56628850273d7ecb7f8e6e9129e": { + "balance": "0x10f0d293cc7a5880000" }, - "d1538e9a87e59ca9ec8e5826a5b793f99f96c4c3": { - "balance": "1000000000000000000000" + "0xd1538e9a87e59ca9ec8e5826a5b793f99f96c4c3": { + "balance": "0x3635c9adc5dea00000" }, - "f85bab1cb3710fc05fa19ffac22e67521a0ba21d": { - "balance": "2003000000000000000000" + "0xf85bab1cb3710fc05fa19ffac22e67521a0ba21d": { + "balance": "0x6c95357fa6b36c0000" }, - "f7cbdba6be6cfe68dbc23c2b0ff530ee05226f84": { - "balance": "20000000000000000000" + "0xf7cbdba6be6cfe68dbc23c2b0ff530ee05226f84": { + "balance": "0x1158e460913d00000" }, - "4eb87ba8788eba0df87e5b9bd50a8e45368091c1": { - "balance": "20000000000000000000" + "0x4eb87ba8788eba0df87e5b9bd50a8e45368091c1": { + "balance": "0x1158e460913d00000" }, - "1479a9ec7480b74b5db8fc499be352da7f84ee9c": { - "balance": "1000000000000000000000" + "0x1479a9ec7480b74b5db8fc499be352da7f84ee9c": { + "balance": "0x3635c9adc5dea00000" }, - "d311bcd7aa4e9b4f383ff3d0d6b6e07e21e3705d": { - "balance": "200000000000000000000" + "0xd311bcd7aa4e9b4f383ff3d0d6b6e07e21e3705d": { + "balance": "0xad78ebc5ac6200000" }, - "425c1816868f7777cc2ba6c6d28c9e1e796c52b3": { - "balance": "10000000000000000000000" + "0x425c1816868f7777cc2ba6c6d28c9e1e796c52b3": { + "balance": "0x21e19e0c9bab2400000" }, - "8510ee934f0cbc900e1007eb38a21e2a5101b8b2": { - "balance": "106000000000000000000" + "0x8510ee934f0cbc900e1007eb38a21e2a5101b8b2": { + "balance": "0x5bf0ba6634f680000" }, - "01e864d354741b423e6f42851724468c74f5aa9c": { - "balance": "20000000000000000000000" + "0x01e864d354741b423e6f42851724468c74f5aa9c": { + "balance": "0x43c33c1937564800000" }, - "a543a066fb32a8668aa0736a0c9cd40d78098727": { - "balance": "1000000000000000000000" + "0xa543a066fb32a8668aa0736a0c9cd40d78098727": { + "balance": "0x3635c9adc5dea00000" }, - "f3eb1948b951e22df1617829bf3b8d8680ec6b68": { - "balance": "4000000000000000000000" + "0xf3eb1948b951e22df1617829bf3b8d8680ec6b68": { + "balance": "0xd8d726b7177a800000" }, - "f6b782f4dcd745a6c0e2e030600e04a24b25e542": { - "balance": "400000000000000000000" + "0xf6b782f4dcd745a6c0e2e030600e04a24b25e542": { + "balance": "0x15af1d78b58c400000" }, - "229f4f1a2a4f540774505b4707a81de44410255b": { - "balance": "2000000000000000000000" + "0x229f4f1a2a4f540774505b4707a81de44410255b": { + "balance": "0x6c6b935b8bbd400000" }, - "cff8d06b00e3f50c191099ad56ba6ae26571cd88": { - "balance": "1000000000000000000000" + "0xcff8d06b00e3f50c191099ad56ba6ae26571cd88": { + "balance": "0x3635c9adc5dea00000" }, - "910b7d577a7e39aa23acf62ad7f1ef342934b968": { - "balance": "10000000000000000000000" + "0x910b7d577a7e39aa23acf62ad7f1ef342934b968": { + "balance": "0x21e19e0c9bab2400000" }, - "392433d2ce83d3fb4a7602cca3faca4ec140a4b0": { - "balance": "51000000000000000000" + "0x392433d2ce83d3fb4a7602cca3faca4ec140a4b0": { + "balance": "0x2c3c465ca58ec0000" }, - "8ff46045687723dc33e4d099a06904f1ebb584dc": { - "balance": "2000000000000000000000" + "0x8ff46045687723dc33e4d099a06904f1ebb584dc": { + "balance": "0x6c6b935b8bbd400000" }, - "9ca0429f874f8dcee2e9c062a9020a842a587ab9": { - "balance": "2000000000000000000000" + "0x9ca0429f874f8dcee2e9c062a9020a842a587ab9": { + "balance": "0x6c6b935b8bbd400000" }, - "160ceb6f980e04315f53c4fc988b2bf69e284d7d": { - "balance": "19100000000000000000" + "0x160ceb6f980e04315f53c4fc988b2bf69e284d7d": { + "balance": "0x10910d4cdc9f60000" }, - "c340f9b91c26728c31d121d5d6fc3bb56d3d8624": { - "balance": "2000000000000000000000" + "0xc340f9b91c26728c31d121d5d6fc3bb56d3d8624": { + "balance": "0x6c6b935b8bbd400000" }, - "afa1d5ad38fed44759c05b8993c1aa0dace19f40": { - "balance": "80000000000000000000" + "0xafa1d5ad38fed44759c05b8993c1aa0dace19f40": { + "balance": "0x4563918244f400000" }, - "3969b4f71bb8751ede43c016363a7a614f76118e": { - "balance": "2000000000000000000000" + "0x3969b4f71bb8751ede43c016363a7a614f76118e": { + "balance": "0x6c6b935b8bbd400000" }, - "2bb6f578adfbe7b2a116b3554facf9969813c319": { - "balance": "7400000000000000000000" + "0x2bb6f578adfbe7b2a116b3554facf9969813c319": { + "balance": "0x19127a1391ea2a00000" }, - "8334764b7b397a4e578f50364d60ce44899bff94": { - "balance": "92500000000000000000" + "0x8334764b7b397a4e578f50364d60ce44899bff94": { + "balance": "0x503b203e9fba20000" }, - "9dd2196624a1ddf14a9d375e5f07152baf22afa2": { - "balance": "1211747000000000000000" + "0x9dd2196624a1ddf14a9d375e5f07152baf22afa2": { + "balance": "0x41b05e2463a5438000" }, - "f242da845d42d4bf779a00f295b40750fe49ea13": { - "balance": "1000000000000000000000" + "0xf242da845d42d4bf779a00f295b40750fe49ea13": { + "balance": "0x3635c9adc5dea00000" }, - "c6234657a807384126f8968ca1708bb07baa493c": { - "balance": "20000000000000000000" + "0xc6234657a807384126f8968ca1708bb07baa493c": { + "balance": "0x1158e460913d00000" }, - "94c055e858357aaa30cf2041fa9059ce164a1f91": { - "balance": "19999000000000000000000" + "0x94c055e858357aaa30cf2041fa9059ce164a1f91": { + "balance": "0x43c25e0dcc1bd1c0000" }, - "74c73c90528a157336f1e7ea20620ae53fd24728": { - "balance": "8969310000000000000000" + "0x74c73c90528a157336f1e7ea20620ae53fd24728": { + "balance": "0x1e63a2e538f16e30000" }, - "19e7f3eb7bf67f3599209ebe08b62ad3327f8cde": { - "balance": "2000000000000000000000" + "0x19e7f3eb7bf67f3599209ebe08b62ad3327f8cde": { + "balance": "0x6c6b935b8bbd400000" }, - "b2b516fdd19e7f3864b6d2cf1b252a4156f1b03b": { - "balance": "53720000000000000000" + "0xb2b516fdd19e7f3864b6d2cf1b252a4156f1b03b": { + "balance": "0x2e983c76115fc0000" }, - "8164e78314ae16b28926cc553d2ccb16f356270d": { - "balance": "8450000000000000000000" + "0x8164e78314ae16b28926cc553d2ccb16f356270d": { + "balance": "0x1ca134e95fb32c80000" }, - "4d828894752f6f25175daf2177094487954b6f9f": { - "balance": "1459683000000000000000" + "0x4d828894752f6f25175daf2177094487954b6f9f": { + "balance": "0x4f212bc2c49c838000" }, - "ab84a0f147ad265400002b85029a41fc9ce57f85": { - "balance": "1000000000000000000000" + "0xab84a0f147ad265400002b85029a41fc9ce57f85": { + "balance": "0x3635c9adc5dea00000" }, - "f3fe51fde34413c73318b9c85437fe7e820f561a": { - "balance": "1003200000000000000000" + "0xf3fe51fde34413c73318b9c85437fe7e820f561a": { + "balance": "0x3662325cd18fe00000" }, - "16c7b31e8c376282ac2271728c31c95e35d952c3": { - "balance": "2000000000000000000000" + "0x16c7b31e8c376282ac2271728c31c95e35d952c3": { + "balance": "0x6c6b935b8bbd400000" }, - "80d5c40c59c7f54ea3a55fcfd175471ea35099b3": { - "balance": "1000000000000000000000" + "0x80d5c40c59c7f54ea3a55fcfd175471ea35099b3": { + "balance": "0x3635c9adc5dea00000" }, - "7abb10f5bd9bc33b8ec1a82d64b55b6b18777541": { - "balance": "20000000000000000000000" + "0x7abb10f5bd9bc33b8ec1a82d64b55b6b18777541": { + "balance": "0x43c33c1937564800000" }, - "095b0ea2b218d82e0aea7c2889238a39c9bf9077": { - "balance": "20000000000000000000000" + "0x095b0ea2b218d82e0aea7c2889238a39c9bf9077": { + "balance": "0x43c33c1937564800000" }, - "5d5cdbe25b2a044b7b9be383bcaa5807b06d3c6b": { - "balance": "2000000000000000000000" + "0x5d5cdbe25b2a044b7b9be383bcaa5807b06d3c6b": { + "balance": "0x6c6b935b8bbd400000" }, - "323749a3b971959e46c8b4822dcafaf7aaf9bd6e": { - "balance": "20064000000000000000" + "0x323749a3b971959e46c8b4822dcafaf7aaf9bd6e": { + "balance": "0x11671a5b245700000" }, - "e0272213e8d2fd3e96bd6217b24b4ba01b617079": { - "balance": "20000000000000000000" + "0xe0272213e8d2fd3e96bd6217b24b4ba01b617079": { + "balance": "0x1158e460913d00000" }, - "00acbfb2f25a5485c739ef70a44eeeeb7c65a66f": { - "balance": "100000000000000000000" + "0x00acbfb2f25a5485c739ef70a44eeeeb7c65a66f": { + "balance": "0x56bc75e2d63100000" }, - "52f15423323c24f19ae2ab673717229d3f747d9b": { - "balance": "1026115000000000000000" + "0x52f15423323c24f19ae2ab673717229d3f747d9b": { + "balance": "0x37a034cbe8e3f38000" }, - "cb4abfc282aed76e5d57affda542c1f382fcacf4": { - "balance": "8136100000000000000000" + "0xcb4abfc282aed76e5d57affda542c1f382fcacf4": { + "balance": "0x1b90f11c3183faa0000" }, - "f71b4534f286e43093b1e15efea749e7597b8b57": { - "balance": "104410000000000000000000" + "0xf71b4534f286e43093b1e15efea749e7597b8b57": { + "balance": "0x161c13d3341c87280000" }, - "44cd77535a893fa7c4d5eb3a240e79d099a72d2d": { - "balance": "820000000000000000000" + "0x44cd77535a893fa7c4d5eb3a240e79d099a72d2d": { + "balance": "0x2c73c937742c500000" }, - "eb3ce7fc381c51db7d5fbd692f8f9e058a4c703d": { - "balance": "200000000000000000000" + "0xeb3ce7fc381c51db7d5fbd692f8f9e058a4c703d": { + "balance": "0xad78ebc5ac6200000" }, - "f1c8c4a941b4628c0d6c30fda56452d99c7e1b64": { - "balance": "1449000000000000000000" + "0xf1c8c4a941b4628c0d6c30fda56452d99c7e1b64": { + "balance": "0x4e8cea1ede75040000" }, - "277677aba1e52c3b53bfa2071d4e859a0af7e8e1": { - "balance": "1000000000000000000000" + "0x277677aba1e52c3b53bfa2071d4e859a0af7e8e1": { + "balance": "0x3635c9adc5dea00000" }, - "a5f075fd401335577b6683c281e6d101432dc6e0": { - "balance": "2680000000000000000000" + "0xa5f075fd401335577b6683c281e6d101432dc6e0": { + "balance": "0x914878a8c05ee00000" }, - "e28dbc8efd5e416a762ec0e018864bb9aa83287b": { - "balance": "24533161000000000000000" + "0xe28dbc8efd5e416a762ec0e018864bb9aa83287b": { + "balance": "0x531f200ab3e030a8000" }, - "2b717cd432a323a4659039848d3b87de26fc9546": { - "balance": "500000000000000000000000" + "0x2b717cd432a323a4659039848d3b87de26fc9546": { + "balance": "0x69e10de76676d0800000" }, - "b358e97c70b605b1d7d729dfb640b43c5eafd1e7": { - "balance": "20000000000000000000000" + "0xb358e97c70b605b1d7d729dfb640b43c5eafd1e7": { + "balance": "0x43c33c1937564800000" }, - "293c2306df3604ae4fda0d207aba736f67de0792": { - "balance": "200000000000000000000" + "0x293c2306df3604ae4fda0d207aba736f67de0792": { + "balance": "0xad78ebc5ac6200000" }, - "74d366b07b2f56477d7c7077ac6fe497e0eb6559": { - "balance": "5000000000000000000000" + "0x74d366b07b2f56477d7c7077ac6fe497e0eb6559": { + "balance": "0x10f0cf064dd59200000" }, - "490145afa8b54522bb21f352f06da5a788fa8f1d": { - "balance": "9231182000000000000000" + "0x490145afa8b54522bb21f352f06da5a788fa8f1d": { + "balance": "0x1f46c62901a03fb0000" }, - "862569211e8c6327b5415e3a67e5738b15baaf6e": { - "balance": "140000000000000000000" + "0x862569211e8c6327b5415e3a67e5738b15baaf6e": { + "balance": "0x796e3ea3f8ab00000" }, - "5a74ba62e7c81a3474e27d894fed33dd24ad95fe": { - "balance": "18200000000000000000" + "0x5a74ba62e7c81a3474e27d894fed33dd24ad95fe": { + "balance": "0xfc936392801c0000" }, - "536e4d8029b73f5579dca33e70b24eba89e11d7e": { - "balance": "1970000000000000000000" + "0x536e4d8029b73f5579dca33e70b24eba89e11d7e": { + "balance": "0x6acb3df27e1f880000" }, - "25c6e74ff1d928df98137af4df8430df24f07cd7": { - "balance": "390000000000000000000" + "0x25c6e74ff1d928df98137af4df8430df24f07cd7": { + "balance": "0x15245655b102580000" }, - "19b36b0c87ea664ed80318dc77b688dde87d95a5": { - "balance": "1948386000000000000000" + "0x19b36b0c87ea664ed80318dc77b688dde87d95a5": { + "balance": "0x699f499802303d0000" }, - "abc4caeb474d4627cb6eb456ecba0ecd08ed8ae1": { - "balance": "3940000000000000000000" + "0xabc4caeb474d4627cb6eb456ecba0ecd08ed8ae1": { + "balance": "0xd5967be4fc3f100000" }, - "8ea656e71ec651bfa17c5a5759d86031cc359977": { - "balance": "100000000000000000000" + "0x8ea656e71ec651bfa17c5a5759d86031cc359977": { + "balance": "0x56bc75e2d63100000" }, - "8d620bde17228f6cbba74df6be87264d985cc179": { - "balance": "100000000000000000000" + "0x8d620bde17228f6cbba74df6be87264d985cc179": { + "balance": "0x56bc75e2d63100000" }, - "b2aa2f1f8e93e79713d92cea9ffce9a40af9c82d": { - "balance": "2000000000000000000000" + "0xb2aa2f1f8e93e79713d92cea9ffce9a40af9c82d": { + "balance": "0x6c6b935b8bbd400000" }, - "198ef1ec325a96cc354c7266a038be8b5c558f67": { - "balance": "608334724000000000000000" + "0x198ef1ec325a96cc354c7266a038be8b5c558f67": { + "balance": "0x80d1e4373e7f21da0000" }, - "6a13d5e32c1fd26d7e91ff6e053160a89b2c8aad": { - "balance": "53480000000000000000" + "0x6a13d5e32c1fd26d7e91ff6e053160a89b2c8aad": { + "balance": "0x2e62f20a69be40000" }, - "e056bf3ff41c26256fef51716612b9d39ade999c": { - "balance": "100009000000000000000" + "0xe056bf3ff41c26256fef51716612b9d39ade999c": { + "balance": "0x56be757a12e0a8000" }, - "2c128c95d957215101f043dd8fc582456d41016d": { - "balance": "835000000000000000000" + "0x2c128c95d957215101f043dd8fc582456d41016d": { + "balance": "0x2d43f3ebfafb2c0000" }, - "2560b09b89a4ae6849ed5a3c9958426631714466": { - "balance": "1700000000000000000000" + "0x2560b09b89a4ae6849ed5a3c9958426631714466": { + "balance": "0x5c283d410394100000" }, - "d3d6e9fb82542fd29ed9ea3609891e151396b6f7": { - "balance": "54000000000000000000000" + "0xd3d6e9fb82542fd29ed9ea3609891e151396b6f7": { + "balance": "0xb6f588aa7bcf5c00000" }, - "a7607b42573bb6f6b4d4f23c7e2a26b3a0f6b6f0": { - "balance": "1610000000000000000000" + "0xa7607b42573bb6f6b4d4f23c7e2a26b3a0f6b6f0": { + "balance": "0x57473d05dabae80000" }, - "020362c3ade878ca90d6b2d889a4cc5510eed5f3": { - "balance": "1042883000000000000000" + "0x020362c3ade878ca90d6b2d889a4cc5510eed5f3": { + "balance": "0x3888e8b311adb38000" }, - "14830704e99aaad5c55e1f502b27b22c12c91933": { - "balance": "620000000000000000000" + "0x14830704e99aaad5c55e1f502b27b22c12c91933": { + "balance": "0x219c3a7b1966300000" }, - "8030b111c6983f0485ddaca76224c6180634789f": { - "balance": "80000000000000000000" + "0x8030b111c6983f0485ddaca76224c6180634789f": { + "balance": "0x4563918244f400000" }, - "2c5b7d7b195a371bf9abddb42fe04f2f1d9a9910": { - "balance": "200000000000000000000" + "0x2c5b7d7b195a371bf9abddb42fe04f2f1d9a9910": { + "balance": "0xad78ebc5ac6200000" }, - "77d43fa7b481dbf3db530cfbf5fdced0e6571831": { - "balance": "2000000000000000000000" + "0x77d43fa7b481dbf3db530cfbf5fdced0e6571831": { + "balance": "0x6c6b935b8bbd400000" }, - "2d90b415a38e2e19cdd02ff3ad81a97af7cbf672": { - "balance": "109800000000000000000" + "0x2d90b415a38e2e19cdd02ff3ad81a97af7cbf672": { + "balance": "0x5f3c7f64131e40000" }, - "2fc82ef076932341264f617a0c80dd571e6ae939": { - "balance": "7160000000000000000000" + "0x2fc82ef076932341264f617a0c80dd571e6ae939": { + "balance": "0x18424f5f0b1b4e00000" }, - "dfe549fe8430e552c6d07cc3b92ccd43b12fb50f": { - "balance": "83620000000000000000" + "0xdfe549fe8430e552c6d07cc3b92ccd43b12fb50f": { + "balance": "0x48875eaf6562a0000" }, - "1e8e689b02917cdc29245d0c9c68b094b41a9ed6": { - "balance": "2000000000000000000000" + "0x1e8e689b02917cdc29245d0c9c68b094b41a9ed6": { + "balance": "0x6c6b935b8bbd400000" }, - "21c3a8bba267c8cca27b1a9afabad86f607af708": { - "balance": "8940000000000000000000" + "0x21c3a8bba267c8cca27b1a9afabad86f607af708": { + "balance": "0x1e4a36c49d998300000" }, - "143c639752caeecf6a997d39709fc8f19878c7e8": { - "balance": "1970000000000000000000" + "0x143c639752caeecf6a997d39709fc8f19878c7e8": { + "balance": "0x6acb3df27e1f880000" }, - "02603d7a3bb297c67c877e5d34fbd5b913d4c63a": { - "balance": "20000000000000000000" + "0x02603d7a3bb297c67c877e5d34fbd5b913d4c63a": { + "balance": "0x1158e460913d00000" }, - "a166f911c644ac3213d29e0e1ae010f794d5ad26": { - "balance": "2000000000000000000000" + "0xa166f911c644ac3213d29e0e1ae010f794d5ad26": { + "balance": "0x6c6b935b8bbd400000" }, - "6eb3819617404058268f0c3cff3596bfe9148c1c": { - "balance": "1670000000000000000000" + "0x6eb3819617404058268f0c3cff3596bfe9148c1c": { + "balance": "0x5a87e7d7f5f6580000" }, - "7a67dd043a504fc2f2fc7194e9becf484cecb1fb": { - "balance": "250000000000000000000" + "0x7a67dd043a504fc2f2fc7194e9becf484cecb1fb": { + "balance": "0xd8d726b7177a80000" }, - "f824ee331e4ac3cc587693395b57ecf625a6c0c2": { - "balance": "1600930000000000000000" + "0xf824ee331e4ac3cc587693395b57ecf625a6c0c2": { + "balance": "0x56c95de8e8ca1d0000" }, - "1179c60dbd068b150b074da4be23033b20c68558": { - "balance": "680000000000000000000" + "0x1179c60dbd068b150b074da4be23033b20c68558": { + "balance": "0x24dce54d34a1a00000" }, - "d2a479404347c5543aab292ae1bb4a6f158357fa": { - "balance": "4000000000000000000000" + "0xd2a479404347c5543aab292ae1bb4a6f158357fa": { + "balance": "0xd8d726b7177a800000" }, - "b0d32bd7e4e695b7b01aa3d0416f80557dba9903": { - "balance": "16300000000000000000000" + "0xb0d32bd7e4e695b7b01aa3d0416f80557dba9903": { + "balance": "0x3739ff0f6e613300000" }, - "f734ec03724ddee5bb5279aa1afcf61b0cb448a1": { - "balance": "4238080000000000000000" + "0xf734ec03724ddee5bb5279aa1afcf61b0cb448a1": { + "balance": "0xe5bf2cc9b097800000" }, - "c04069dfb18b096c7867f8bee77a6dc7477ad062": { - "balance": "2674000000000000000000" + "0xc04069dfb18b096c7867f8bee77a6dc7477ad062": { + "balance": "0x90f534608a72880000" }, - "80c53ee7e3357f94ce0d7868009c208b4a130125": { - "balance": "2000000000000000000000" + "0x80c53ee7e3357f94ce0d7868009c208b4a130125": { + "balance": "0x6c6b935b8bbd400000" }, - "0f32d9cb4d0fdaa0150656bb608dcc43ed7d9301": { - "balance": "753978000000000000000" + "0x0f32d9cb4d0fdaa0150656bb608dcc43ed7d9301": { + "balance": "0x28df8bf440db790000" }, - "6ddb6092779d5842ead378e21e8120fd4c6bc132": { - "balance": "2000000000000000000000" + "0x6ddb6092779d5842ead378e21e8120fd4c6bc132": { + "balance": "0x6c6b935b8bbd400000" }, - "82ea01e3bf2e83836e71704e22a2719377efd9c3": { - "balance": "3040000000000000000000" + "0x82ea01e3bf2e83836e71704e22a2719377efd9c3": { + "balance": "0xa4cc799563c3800000" }, - "44c1110b18870ec81178d93d215838c551d48e64": { - "balance": "199958000000000000000" + "0x44c1110b18870ec81178d93d215838c551d48e64": { + "balance": "0xad6f98593bd8f0000" }, - "7727af101f0aaba4d23a1cafe17c6eb5dab1c6dc": { - "balance": "2000000000000000000000" + "0x7727af101f0aaba4d23a1cafe17c6eb5dab1c6dc": { + "balance": "0x6c6b935b8bbd400000" }, - "a11a03c4bb26d21eff677d5d555c80b25453ee7a": { - "balance": "69979000000000000000" + "0xa11a03c4bb26d21eff677d5d555c80b25453ee7a": { + "balance": "0x3cb2759bc410f8000" }, - "19e5dea3370a2c746aae34a37c531f41da264e83": { - "balance": "200000000000000000000" + "0x19e5dea3370a2c746aae34a37c531f41da264e83": { + "balance": "0xad78ebc5ac6200000" }, - "c325c352801ba883b3226c5feb0df9eae2d6e653": { - "balance": "3940000000000000000000" + "0xc325c352801ba883b3226c5feb0df9eae2d6e653": { + "balance": "0xd5967be4fc3f100000" }, - "ae5055814cb8be0c117bb8b1c8d2b63b4698b728": { - "balance": "32035000000000000000" + "0xae5055814cb8be0c117bb8b1c8d2b63b4698b728": { + "balance": "0x1bc932ec573a38000" }, - "deb1bc34d86d4a4dde2580d8beaf074eb0e1a244": { - "balance": "1580000000000000000000" + "0xdeb1bc34d86d4a4dde2580d8beaf074eb0e1a244": { + "balance": "0x55a6e79ccd1d300000" }, - "558360206883dd1b6d4a59639e5629d0f0c675d0": { - "balance": "2000000000000000000000" + "0x558360206883dd1b6d4a59639e5629d0f0c675d0": { + "balance": "0x6c6b935b8bbd400000" }, - "a9d6f871ca781a759a20ac3adb972cf12829a208": { - "balance": "925000000000000000000" + "0xa9d6f871ca781a759a20ac3adb972cf12829a208": { + "balance": "0x3224f42723d4540000" }, - "b0ac4eff6680ee14169cdadbffdb30804f6d25f5": { - "balance": "2000000000000000000000" + "0xb0ac4eff6680ee14169cdadbffdb30804f6d25f5": { + "balance": "0x6c6b935b8bbd400000" }, - "f1b58faffa8794f50af8e88309c7a6265455d51a": { - "balance": "999800000000000000000" + "0xf1b58faffa8794f50af8e88309c7a6265455d51a": { + "balance": "0x36330322d5238c0000" }, - "a61a54df784a44d71b771b87317509211381f200": { - "balance": "1000000000000000000000" + "0xa61a54df784a44d71b771b87317509211381f200": { + "balance": "0x3635c9adc5dea00000" }, - "baa4b64c2b15b79f5f204246fd70bcbd86e4a92a": { - "balance": "500000000000000000000" + "0xbaa4b64c2b15b79f5f204246fd70bcbd86e4a92a": { + "balance": "0x1b1ae4d6e2ef500000" }, - "a20d8ff60caae31d02e0b665fa435d76f77c9442": { - "balance": "489600000000000000000" + "0xa20d8ff60caae31d02e0b665fa435d76f77c9442": { + "balance": "0x1a8a909dfcef400000" }, - "f3e74f470c7d3a3f0033780f76a89f3ef691e6cb": { - "balance": "3021800000000000000000" + "0xf3e74f470c7d3a3f0033780f76a89f3ef691e6cb": { + "balance": "0xa3cfe631d143640000" }, - "d330728131fe8e3a15487a34573c93457e2afe95": { - "balance": "4000000000000000000000" + "0xd330728131fe8e3a15487a34573c93457e2afe95": { + "balance": "0xd8d726b7177a800000" }, - "9af9dbe47422d177f945bdead7e6d82930356230": { - "balance": "3940000000000000000000" + "0x9af9dbe47422d177f945bdead7e6d82930356230": { + "balance": "0xd5967be4fc3f100000" }, - "0eb5b662a1c718608fd52f0c25f9378830178519": { - "balance": "6091400000000000000000" + "0x0eb5b662a1c718608fd52f0c25f9378830178519": { + "balance": "0x14a37281a612e740000" }, - "fda6810ea5ac985d6ffbf1c511f1c142edcfddf7": { - "balance": "4000000000000000000000" + "0xfda6810ea5ac985d6ffbf1c511f1c142edcfddf7": { + "balance": "0xd8d726b7177a800000" }, - "832c54176bdf43d2c9bcd7b808b89556b89cbf31": { - "balance": "200000000000000000000" + "0x832c54176bdf43d2c9bcd7b808b89556b89cbf31": { + "balance": "0xad78ebc5ac6200000" }, - "704d5de4846d39b53cd21d1c49f096db5c19ba29": { - "balance": "152000000000000000000" + "0x704d5de4846d39b53cd21d1c49f096db5c19ba29": { + "balance": "0x83d6c7aab63600000" }, - "344a8db086faed4efc37131b3a22b0782dad7095": { - "balance": "500000000000000000000" + "0x344a8db086faed4efc37131b3a22b0782dad7095": { + "balance": "0x1b1ae4d6e2ef500000" }, - "8c7fa5cae82fedb69ab189d3ff27ae209293fb93": { - "balance": "400030000000000000000" + "0x8c7fa5cae82fedb69ab189d3ff27ae209293fb93": { + "balance": "0x15af880d8cdb830000" }, - "ad660dec825522a9f62fcec3c5b731980dc286ea": { - "balance": "3000000000000000000000" + "0xad660dec825522a9f62fcec3c5b731980dc286ea": { + "balance": "0xa2a15d09519be00000" }, - "13b9b10715714c09cfd610cf9c9846051cb1d513": { - "balance": "1970000000000000000000" + "0x13b9b10715714c09cfd610cf9c9846051cb1d513": { + "balance": "0x6acb3df27e1f880000" }, - "40467d80e74c35407b7db51789234615fea66818": { - "balance": "388000000000000000000" + "0x40467d80e74c35407b7db51789234615fea66818": { + "balance": "0x150894e849b3900000" }, - "30e9d5a0088f1ddb2fd380e2a049192266c51cbf": { - "balance": "196910000000000000000" + "0x30e9d5a0088f1ddb2fd380e2a049192266c51cbf": { + "balance": "0xaacacd9b9e22b0000" }, - "b2d1e99af91231858e7065dd1918330dc4c747d5": { - "balance": "16700000000000000000000" + "0xb2d1e99af91231858e7065dd1918330dc4c747d5": { + "balance": "0x3894f0e6f9b9f700000" }, - "9f21302ca5096bea7402b91b0fd506254f999a3d": { - "balance": "1246832000000000000000" + "0x9f21302ca5096bea7402b91b0fd506254f999a3d": { + "balance": "0x4397451a003dd80000" }, - "d24b6644f439c8051dfc64d381b8c86c75c17538": { - "balance": "2000000000000000000000" + "0xd24b6644f439c8051dfc64d381b8c86c75c17538": { + "balance": "0x6c6b935b8bbd400000" }, - "8228ebc087480fd64547ca281f5eace3041453b9": { - "balance": "1970000000000000000000" + "0x8228ebc087480fd64547ca281f5eace3041453b9": { + "balance": "0x6acb3df27e1f880000" }, - "29da3e35b23bb1f72f8e2258cf7f553359d24bac": { - "balance": "20000000000000000000000" + "0x29da3e35b23bb1f72f8e2258cf7f553359d24bac": { + "balance": "0x43c33c1937564800000" }, - "c8e558a3c5697e6fb23a2594c880b7a1b68f9860": { - "balance": "10000000000000000000000" + "0xc8e558a3c5697e6fb23a2594c880b7a1b68f9860": { + "balance": "0x21e19e0c9bab2400000" }, - "6b951a43274eeafc8a0903b0af2ec92bf1efc839": { - "balance": "100000000000000000000" + "0x6b951a43274eeafc8a0903b0af2ec92bf1efc839": { + "balance": "0x56bc75e2d63100000" }, - "d015f6fcb84df7bb410e8c8f04894a881dcac237": { - "balance": "1038000000000000000000" + "0xd015f6fcb84df7bb410e8c8f04894a881dcac237": { + "balance": "0x384524cc70b7780000" }, - "6ccb03acf7f53ce87aadcc21a9932de915f89804": { - "balance": "8000000000000000000000" + "0x6ccb03acf7f53ce87aadcc21a9932de915f89804": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "388c85a9b9207d8146033fe38143f6d34b595c47": { - "balance": "200000000000000000000" + "0x388c85a9b9207d8146033fe38143f6d34b595c47": { + "balance": "0xad78ebc5ac6200000" }, - "429c06b487e8546abdfc958a25a3f0fba53f6f00": { - "balance": "13503000000000000000" + "0x429c06b487e8546abdfc958a25a3f0fba53f6f00": { + "balance": "0xbb644af542198000" }, - "771507aeee6a255dc2cd9df55154062d0897b297": { - "balance": "334250000000000000000" + "0x771507aeee6a255dc2cd9df55154062d0897b297": { + "balance": "0x121ea68c114e510000" }, - "5a2b1c853aeb28c45539af76a00ac2d8a8242896": { - "balance": "25000000000000000000" + "0x5a2b1c853aeb28c45539af76a00ac2d8a8242896": { + "balance": "0x15af1d78b58c40000" }, - "f4d67a9044b435b66e8977ff39a28dc4bd53729a": { - "balance": "200000000000000000000" + "0xf4d67a9044b435b66e8977ff39a28dc4bd53729a": { + "balance": "0xad78ebc5ac6200000" }, - "063759dd1c4e362eb19398951ff9f8fad1d31068": { - "balance": "10000000000000000000000" + "0x063759dd1c4e362eb19398951ff9f8fad1d31068": { + "balance": "0x21e19e0c9bab2400000" }, - "cb58990bcd90cfbf6d8f0986f6fa600276b94e2d": { - "balance": "999925000000000000000" + "0xcb58990bcd90cfbf6d8f0986f6fa600276b94e2d": { + "balance": "0x3634bf39ab98788000" }, - "6df5c84f7b909aab3e61fe0ecb1b3bf260222ad2": { - "balance": "4000000000000000000000" + "0x6df5c84f7b909aab3e61fe0ecb1b3bf260222ad2": { + "balance": "0xd8d726b7177a800000" }, - "deb2495d6aca7b2a6a2d138b6e1a42e2dc311fdd": { - "balance": "2000000000000000000000" + "0xdeb2495d6aca7b2a6a2d138b6e1a42e2dc311fdd": { + "balance": "0x6c6b935b8bbd400000" }, - "59203cc37599b648312a7cc9e06dacb589a9ae6a": { - "balance": "148689000000000000000" + "0x59203cc37599b648312a7cc9e06dacb589a9ae6a": { + "balance": "0x80f7971b6400e8000" }, - "fc9b347464b2f9929d807e039dae48d3d98de379": { - "balance": "14000000000000000000000" + "0xfc9b347464b2f9929d807e039dae48d3d98de379": { + "balance": "0x2f6f10780d22cc00000" }, - "48d2434b7a7dbbff08223b6387b05da2e5093126": { - "balance": "18000000000000000000000" + "0x48d2434b7a7dbbff08223b6387b05da2e5093126": { + "balance": "0x3cfc82e37e9a7400000" }, - "c9d76446d5aadff80b68b91b08cd9bc8f5551ac1": { - "balance": "714000000000000000000" + "0xc9d76446d5aadff80b68b91b08cd9bc8f5551ac1": { + "balance": "0x26b4bd9110dce80000" }, - "3d31587b5fd5869845788725a663290a49d3678c": { - "balance": "500000000000000000000" + "0x3d31587b5fd5869845788725a663290a49d3678c": { + "balance": "0x1b1ae4d6e2ef500000" }, - "d8715ef9176f850b2e30eb8e382707f777a6fbe9": { - "balance": "2000000000000000000000" + "0xd8715ef9176f850b2e30eb8e382707f777a6fbe9": { + "balance": "0x6c6b935b8bbd400000" }, - "2c2147947ae33fb098b489a5c16bfff9abcd4e2a": { - "balance": "200000000000000000000" + "0x2c2147947ae33fb098b489a5c16bfff9abcd4e2a": { + "balance": "0xad78ebc5ac6200000" }, - "d6c0d0bc93a62e257174700e10f024c8b23f1f87": { - "balance": "2000000000000000000000" + "0xd6c0d0bc93a62e257174700e10f024c8b23f1f87": { + "balance": "0x6c6b935b8bbd400000" }, - "d1978f2e34407fab1dc2183d95cfda6260b35982": { - "balance": "788000000000000000000" + "0xd1978f2e34407fab1dc2183d95cfda6260b35982": { + "balance": "0x2ab7b260ff3fd00000" }, - "1bf974d9904f45ce81a845e11ef4cbcf27af719e": { - "balance": "100000000000000000000" + "0x1bf974d9904f45ce81a845e11ef4cbcf27af719e": { + "balance": "0x56bc75e2d63100000" }, - "6e761eaa0f345f777b5441b73a0fa5b56b85f22d": { - "balance": "2000000000000000000000" + "0x6e761eaa0f345f777b5441b73a0fa5b56b85f22d": { + "balance": "0x6c6b935b8bbd400000" }, - "ea60436912de6bf187d3a472ff8f5333a0f7ed06": { - "balance": "19700000000000000000" + "0xea60436912de6bf187d3a472ff8f5333a0f7ed06": { + "balance": "0x11164759ffb320000" }, - "94f8f057db7e60e675ad940f155885d1a477348e": { - "balance": "401100000000000000000" + "0x94f8f057db7e60e675ad940f155885d1a477348e": { + "balance": "0x15be6174e1912e0000" }, - "8933491760c8f0b4df8caac78ed835caee21046d": { - "balance": "20000000000000000000000" + "0x8933491760c8f0b4df8caac78ed835caee21046d": { + "balance": "0x43c33c1937564800000" }, - "a7775e4af6a23afa201fb78b915e51a515b7a728": { - "balance": "120000000000000000000" + "0xa7775e4af6a23afa201fb78b915e51a515b7a728": { + "balance": "0x68155a43676e00000" }, - "d8d64384249b776794063b569878d5e3b530a4b2": { - "balance": "177569000000000000000" + "0xd8d64384249b776794063b569878d5e3b530a4b2": { + "balance": "0x9a043d0b2f9568000" }, - "be633a3737f68439bac7c90a52142058ee8e8a6f": { - "balance": "960000000000000000000" + "0xbe633a3737f68439bac7c90a52142058ee8e8a6f": { + "balance": "0x340aad21b3b7000000" }, - "90bd62a050845261fa4a9f7cf241ea630b05efb8": { - "balance": "500000000000000000000" + "0x90bd62a050845261fa4a9f7cf241ea630b05efb8": { + "balance": "0x1b1ae4d6e2ef500000" }, - "552987f0651b915b2e1e5328c121960d4bdd6af4": { - "balance": "1790000000000000000000" + "0x552987f0651b915b2e1e5328c121960d4bdd6af4": { + "balance": "0x61093d7c2c6d380000" }, - "0baf6ecdb91acb3606a8357c0bc4f45cfd2d7e6f": { - "balance": "1000000000000000000000" + "0x0baf6ecdb91acb3606a8357c0bc4f45cfd2d7e6f": { + "balance": "0x3635c9adc5dea00000" }, - "9e5a311d9f69898a7c6a9d6360680438e67a7b2f": { - "balance": "1490000000000000000000" + "0x9e5a311d9f69898a7c6a9d6360680438e67a7b2f": { + "balance": "0x50c5e761a444080000" }, - "78859c5b548b700d9284cee4b6633c2f52e529c2": { - "balance": "2955000000000000000000" + "0x78859c5b548b700d9284cee4b6633c2f52e529c2": { + "balance": "0xa030dcebbd2f4c0000" }, - "d572309169b1402ec8131a17a6aac3222f89e6eb": { - "balance": "13800000000000000000000" + "0xd572309169b1402ec8131a17a6aac3222f89e6eb": { + "balance": "0x2ec1978c47766a00000" }, - "8e6d7485cbe990acc1ad0ee9e8ccf39c0c93440e": { - "balance": "955000000000000000000" + "0x8e6d7485cbe990acc1ad0ee9e8ccf39c0c93440e": { + "balance": "0x33c5499031720c0000" }, - "75c11d024d12ae486c1095b7a7b9c4af3e8edeb9": { - "balance": "20000000000000000000" + "0x75c11d024d12ae486c1095b7a7b9c4af3e8edeb9": { + "balance": "0x1158e460913d00000" }, - "903413878aea3bc1086309a3fe768b65559e8cab": { - "balance": "8000000000000000000000" + "0x903413878aea3bc1086309a3fe768b65559e8cab": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "6d0569e5558fc7df2766f2ba15dc8aeffc5beb75": { - "balance": "4001070000000000000000" + "0x6d0569e5558fc7df2766f2ba15dc8aeffc5beb75": { + "balance": "0xd8e6001e6c302b0000" }, - "3815b0743f94fc8cc8654fd9d597ed7d8b77c57e": { - "balance": "738578000000000000000" + "0x3815b0743f94fc8cc8654fd9d597ed7d8b77c57e": { + "balance": "0x2809d429d896750000" }, - "0f26480a150961b8e30750713a94ee6f2e47fc00": { - "balance": "1000000000000000000000" + "0x0f26480a150961b8e30750713a94ee6f2e47fc00": { + "balance": "0x3635c9adc5dea00000" }, - "ede5de7c7fb7eee0f36e64530a41440edfbefacf": { - "balance": "617200000000000000000" + "0xede5de7c7fb7eee0f36e64530a41440edfbefacf": { + "balance": "0x21755ee1ef2b180000" }, - "763a7cbab70d7a64d0a7e52980f681472593490c": { - "balance": "600000000000000000000" + "0x763a7cbab70d7a64d0a7e52980f681472593490c": { + "balance": "0x2086ac351052600000" }, - "6e270ad529f1f0b8d9cb6d2427ec1b7e2dc64a74": { - "balance": "200000000000000000000" + "0x6e270ad529f1f0b8d9cb6d2427ec1b7e2dc64a74": { + "balance": "0xad78ebc5ac6200000" }, - "eb3bdd59dcdda5a9bb2ac1641fd02180f5f36560": { - "balance": "6600000000000000000000" + "0xeb3bdd59dcdda5a9bb2ac1641fd02180f5f36560": { + "balance": "0x165c96647b38a200000" }, - "f4ebf50bc7e54f82e9b9bd24baef29438e259ce6": { - "balance": "10000000000000000000000" + "0xf4ebf50bc7e54f82e9b9bd24baef29438e259ce6": { + "balance": "0x21e19e0c9bab2400000" }, - "882c8f81872c79fed521cb5f950d8b032322ea69": { - "balance": "40000000000000000000000" + "0x882c8f81872c79fed521cb5f950d8b032322ea69": { + "balance": "0x878678326eac9000000" }, - "394132600f4155e07f4d45bc3eb8d9fb72dcd784": { - "balance": "2941000000000000000000" + "0x394132600f4155e07f4d45bc3eb8d9fb72dcd784": { + "balance": "0x9f6e92edea07d40000" }, - "0be2b94ad950a2a62640c35bfccd6c67dae450f6": { - "balance": "1940000000000000000000" + "0x0be2b94ad950a2a62640c35bfccd6c67dae450f6": { + "balance": "0x692ae8897081d00000" }, - "d4c6ac742e7c857d4a05a04c33d4d05c1467571d": { - "balance": "200000000000000000000" + "0xd4c6ac742e7c857d4a05a04c33d4d05c1467571d": { + "balance": "0xad78ebc5ac6200000" }, - "1fddd85fc98be9c4045961f40f93805ecc4549e5": { - "balance": "164000000000000000000" + "0x1fddd85fc98be9c4045961f40f93805ecc4549e5": { + "balance": "0x8e3f50b173c100000" }, - "534065361cb854fac42bfb5c9fcde0604ac919da": { - "balance": "2000000000000000000000" + "0x534065361cb854fac42bfb5c9fcde0604ac919da": { + "balance": "0x6c6b935b8bbd400000" }, - "9a6ff5f6a7af7b7ae0ed9c20ecec5023d281b786": { - "balance": "2547000000000000000000" + "0x9a6ff5f6a7af7b7ae0ed9c20ecec5023d281b786": { + "balance": "0x8a12b9bd6a67ec0000" }, - "4f3a4854911145ea01c644044bdb2e5a960a982f": { - "balance": "4000000000000000000000" + "0x4f3a4854911145ea01c644044bdb2e5a960a982f": { + "balance": "0xd8d726b7177a800000" }, - "00497e92cdc0e0b963d752b2296acb87da828b24": { - "balance": "194800000000000000000" + "0x00497e92cdc0e0b963d752b2296acb87da828b24": { + "balance": "0xa8f649fe7c6180000" }, - "4ff67fb87f6efba9279930cfbd1b7a343c79fade": { - "balance": "400000000000000000000" + "0x4ff67fb87f6efba9279930cfbd1b7a343c79fade": { + "balance": "0x15af1d78b58c400000" }, - "62f2e5ccecd52cc4b95e0597df27cc079715608c": { - "balance": "143000000000000000000" + "0x62f2e5ccecd52cc4b95e0597df27cc079715608c": { + "balance": "0x7c0860e5a80dc0000" }, - "1eda084e796500ba14c5121c0d90846f66e4be62": { - "balance": "534800000000000000000" + "0x1eda084e796500ba14c5121c0d90846f66e4be62": { + "balance": "0x1cfdd7468216e80000" }, - "9836b4d30473641ab56aeee19242761d72725178": { - "balance": "2000000000000000000000" + "0x9836b4d30473641ab56aeee19242761d72725178": { + "balance": "0x6c6b935b8bbd400000" }, - "de55de0458f850b37e4d78a641dd2eb2dd8f38ce": { - "balance": "4000000000000000000000" + "0xde55de0458f850b37e4d78a641dd2eb2dd8f38ce": { + "balance": "0xd8d726b7177a800000" }, - "140ca28ff33b9f66d7f1fc0078f8c1eef69a1bc0": { - "balance": "1600000000000000000000" + "0x140ca28ff33b9f66d7f1fc0078f8c1eef69a1bc0": { + "balance": "0x56bc75e2d631000000" }, - "2014261f01089f53795630ba9dd24f9a34c2d942": { - "balance": "1337000000000000000000" + "0x2014261f01089f53795630ba9dd24f9a34c2d942": { + "balance": "0x487a9a304539440000" }, - "11415fab61e0dfd4b90676141a557a869ba0bde9": { - "balance": "2048000000000000000000" + "0x11415fab61e0dfd4b90676141a557a869ba0bde9": { + "balance": "0x6f05b59d3b20000000" }, - "88344909644c7ad4930fd873ca1c0da2d434c07f": { - "balance": "131970000000000000000" + "0x88344909644c7ad4930fd873ca1c0da2d434c07f": { + "balance": "0x727739fcb004d0000" }, - "88b217ccb786a254cf4dc57f5d9ac3c455a30483": { - "balance": "925000000000000000000" + "0x88b217ccb786a254cf4dc57f5d9ac3c455a30483": { + "balance": "0x3224f42723d4540000" }, - "dfdbcec1014b96da2158ca513e9c8d3b9af1c3d0": { - "balance": "2000000000000000000000" + "0xdfdbcec1014b96da2158ca513e9c8d3b9af1c3d0": { + "balance": "0x6c6b935b8bbd400000" }, - "1ba9f7997e5387b6b2aa0135ac2452fe36b4c20d": { - "balance": "850000000000000000000" + "0x1ba9f7997e5387b6b2aa0135ac2452fe36b4c20d": { + "balance": "0x2e141ea081ca080000" }, - "d70ad2c4e9eebfa637ef56bd486ad2a1e5bce093": { - "balance": "200000000000000000000" + "0xd70ad2c4e9eebfa637ef56bd486ad2a1e5bce093": { + "balance": "0xad78ebc5ac6200000" }, - "9ce27f245e02d1c312c1d500788c9def7690453b": { - "balance": "200000000000000000000" + "0x9ce27f245e02d1c312c1d500788c9def7690453b": { + "balance": "0xad78ebc5ac6200000" }, - "8234f463d18485501f8f85ace4972c9b632dbccc": { - "balance": "2000000000000000000000" + "0x8234f463d18485501f8f85ace4972c9b632dbccc": { + "balance": "0x6c6b935b8bbd400000" }, - "994152fc95d5c1ca8b88113abbad4d710e40def6": { - "balance": "500000000000000000000" + "0x994152fc95d5c1ca8b88113abbad4d710e40def6": { + "balance": "0x1b1ae4d6e2ef500000" }, - "e5b980d28eece2c06fca6c9473068b37d4a6d6e9": { - "balance": "695200000000000000000" + "0xe5b980d28eece2c06fca6c9473068b37d4a6d6e9": { + "balance": "0x25afd68cac2b900000" }, - "2d426912d059fad9740b2e390a2eeac0546ff01b": { - "balance": "1400000000000000000000" + "0x2d426912d059fad9740b2e390a2eeac0546ff01b": { + "balance": "0x4be4e7267b6ae00000" }, - "6d9997509882027ea947231424bedede2965d0ba": { - "balance": "2001600000000000000000" + "0x6d9997509882027ea947231424bedede2965d0ba": { + "balance": "0x6c81c7b31195e00000" }, - "167ce7de65e84708595a525497a3eb5e5a665073": { - "balance": "575400000000000000000" + "0x167ce7de65e84708595a525497a3eb5e5a665073": { + "balance": "0x1f314773666fc40000" }, - "e430c0024fdbf73a82e21fccf8cbd09138421c21": { - "balance": "4000000000000000000000" + "0xe430c0024fdbf73a82e21fccf8cbd09138421c21": { + "balance": "0xd8d726b7177a800000" }, - "2e52912bc10ea39d54e293f7aed6b99a0f4c73be": { - "balance": "400000000000000000000" + "0x2e52912bc10ea39d54e293f7aed6b99a0f4c73be": { + "balance": "0x15af1d78b58c400000" }, - "12cf8b0e465213211a5b53dfb0dd271a282c12c9": { - "balance": "15200000000000000000" + "0x12cf8b0e465213211a5b53dfb0dd271a282c12c9": { + "balance": "0xd2f13f7789f00000" }, - "06964e2d17e9189f88a8203936b40ac96e533c06": { - "balance": "18200000000000000000" + "0x06964e2d17e9189f88a8203936b40ac96e533c06": { + "balance": "0xfc936392801c0000" }, - "66b1a63da4dcd9f81fe54f5e3fcb4055ef7ec54f": { - "balance": "201412000000000000000" + "0x66b1a63da4dcd9f81fe54f5e3fcb4055ef7ec54f": { + "balance": "0xaeb272adf9cfa0000" }, - "0a77e7f72b437b574f00128b21f2ac265133528c": { - "balance": "2000000000000000000000" + "0x0a77e7f72b437b574f00128b21f2ac265133528c": { + "balance": "0x6c6b935b8bbd400000" }, - "78f5c74785c5668a838072048bf8b453594ddaab": { - "balance": "400000000000000000000" + "0x78f5c74785c5668a838072048bf8b453594ddaab": { + "balance": "0x15af1d78b58c400000" }, - "58e554af3d87629620da61d538c7f5b4b54c4afe": { - "balance": "1297081000000000000000" + "0x58e554af3d87629620da61d538c7f5b4b54c4afe": { + "balance": "0x46509d694534728000" }, - "37a10451f36166cf643dd2de6c1cbba8a011cfa3": { - "balance": "380000000000000000000" + "0x37a10451f36166cf643dd2de6c1cbba8a011cfa3": { + "balance": "0x14998f32ac78700000" }, - "fe9ad12ef05d6d90261f96c8340a0381974df477": { - "balance": "2000000000000000000000" + "0xfe9ad12ef05d6d90261f96c8340a0381974df477": { + "balance": "0x6c6b935b8bbd400000" }, - "057f7f81cd7a406fc45994408b5049912c566463": { - "balance": "1700000000000000000000" + "0x057f7f81cd7a406fc45994408b5049912c566463": { + "balance": "0x5c283d410394100000" }, - "55a3df57b7aaec16a162fd5316f35bec082821cf": { - "balance": "1970000000000000000000" + "0x55a3df57b7aaec16a162fd5316f35bec082821cf": { + "balance": "0x6acb3df27e1f880000" }, - "c0e0b903088e0c63f53dd069575452aff52410c3": { - "balance": "3000000000000000000000" + "0xc0e0b903088e0c63f53dd069575452aff52410c3": { + "balance": "0xa2a15d09519be00000" }, - "63e88e2e539ffb450386b4e46789b223f5476c45": { - "balance": "6292000000000000000000" + "0x63e88e2e539ffb450386b4e46789b223f5476c45": { + "balance": "0x155170a778e25d00000" }, - "3727341f26c12001e378405ee38b2d8464ec7140": { - "balance": "2000000000000000000000" + "0x3727341f26c12001e378405ee38b2d8464ec7140": { + "balance": "0x6c6b935b8bbd400000" }, - "c96751656c0a8ef4357b7344322134b983504aca": { - "balance": "2000000000000000000000" + "0xc96751656c0a8ef4357b7344322134b983504aca": { + "balance": "0x6c6b935b8bbd400000" }, - "1e060dc6c5f1cb8cc7e1452e02ee167508b56542": { - "balance": "12715500000000000000000" + "0x1e060dc6c5f1cb8cc7e1452e02ee167508b56542": { + "balance": "0x2b14f02c864c77e0000" }, - "18136c9df167aa17b6f18e22a702c88f4bc28245": { - "balance": "4000000000000000000000" + "0x18136c9df167aa17b6f18e22a702c88f4bc28245": { + "balance": "0xd8d726b7177a800000" }, - "116108c12084612eeda7a93ddcf8d2602e279e5c": { - "balance": "2000000000000000000000" + "0x116108c12084612eeda7a93ddcf8d2602e279e5c": { + "balance": "0x6c6b935b8bbd400000" }, - "bbb643d2187b364afc10a6fd368d7d55f50d1a3c": { - "balance": "1000000000000000000000" + "0xbbb643d2187b364afc10a6fd368d7d55f50d1a3c": { + "balance": "0x3635c9adc5dea00000" }, - "ec83e798c396b7a55e2a2224abcd834b27ea459c": { - "balance": "12000000000000000000000" + "0xec83e798c396b7a55e2a2224abcd834b27ea459c": { + "balance": "0x28a857425466f800000" }, - "973f4e361fe5decd989d4c8f7d7cc97990385daf": { - "balance": "388500000000000000000" + "0x973f4e361fe5decd989d4c8f7d7cc97990385daf": { + "balance": "0x150f8543a387420000" }, - "c0f29ed0076611b5e55e130547e68a48e26df5e4": { - "balance": "3000000000000000000000" + "0xc0f29ed0076611b5e55e130547e68a48e26df5e4": { + "balance": "0xa2a15d09519be00000" }, - "fd4b551f6fdbcda6c511b5bb372250a6b783e534": { - "balance": "20600000000000000000" + "0xfd4b551f6fdbcda6c511b5bb372250a6b783e534": { + "balance": "0x11de1e6db450c0000" }, - "144b19f1f66cbe318347e48d84b14039466c5909": { - "balance": "2000000000000000000000" + "0x144b19f1f66cbe318347e48d84b14039466c5909": { + "balance": "0x6c6b935b8bbd400000" }, - "bf183641edb886ce60b8190261e14f42d93cce01": { - "balance": "25019000000000000000" + "0xbf183641edb886ce60b8190261e14f42d93cce01": { + "balance": "0x15b3557f1937f8000" }, - "94db807873860aac3d5aea1e885e52bff2869954": { - "balance": "3220000000000000000000" + "0x94db807873860aac3d5aea1e885e52bff2869954": { + "balance": "0xae8e7a0bb575d00000" }, - "7a74cee4fa0f6370a7894f116cd00c1147b83e59": { - "balance": "800000000000000000000" + "0x7a74cee4fa0f6370a7894f116cd00c1147b83e59": { + "balance": "0x2b5e3af16b18800000" }, - "cd32a4a8a27f1cc63954aa634f7857057334c7a3": { - "balance": "1085000000000000000000" + "0xcd32a4a8a27f1cc63954aa634f7857057334c7a3": { + "balance": "0x3ad166576c72d40000" }, - "7cbeb99932e97e6e02058cfc62d0b26bc7cca52b": { - "balance": "2000000000000000000000" + "0x7cbeb99932e97e6e02058cfc62d0b26bc7cca52b": { + "balance": "0x6c6b935b8bbd400000" }, - "8cde8b732e6023878eb23ed16229124b5f7afbec": { - "balance": "133700000000000000000" + "0x8cde8b732e6023878eb23ed16229124b5f7afbec": { + "balance": "0x73f75d1a085ba0000" }, - "45c4ecb4ee891ea984a7c5cefd8dfb00310b2850": { - "balance": "1980000000000000000000" + "0x45c4ecb4ee891ea984a7c5cefd8dfb00310b2850": { + "balance": "0x6b56051582a9700000" }, - "8b393fb0813ee101db1e14ecc7d322c72b8c0473": { - "balance": "455578000000000000000" + "0x8b393fb0813ee101db1e14ecc7d322c72b8c0473": { + "balance": "0x18b26a313e8ae90000" }, - "7b66126879844dfa34fe65c9f288117fefb449ad": { - "balance": "6000000000000000000000" + "0x7b66126879844dfa34fe65c9f288117fefb449ad": { + "balance": "0x14542ba12a337c00000" }, - "162ba503276214b509f97586bd842110d103d517": { - "balance": "9002000000000000000000" + "0x162ba503276214b509f97586bd842110d103d517": { + "balance": "0x1e7ffd8895c22680000" }, - "7dece6998ae1900dd3770cf4b93812bad84f0322": { - "balance": "100000000000000000000" + "0x7dece6998ae1900dd3770cf4b93812bad84f0322": { + "balance": "0x56bc75e2d63100000" }, - "ec0927bac7dc36669c28354ab1be83d7eec30934": { - "balance": "2000000000000000000000" + "0xec0927bac7dc36669c28354ab1be83d7eec30934": { + "balance": "0x6c6b935b8bbd400000" }, - "8d7f3e61299c2db9b9c0487cf627519ed00a9123": { - "balance": "1742400000000000000000" + "0x8d7f3e61299c2db9b9c0487cf627519ed00a9123": { + "balance": "0x5e74a8505e80a00000" }, - "4fc46c396e674869ad9481638f0013630c87caac": { - "balance": "1000000000000000000000" + "0x4fc46c396e674869ad9481638f0013630c87caac": { + "balance": "0x3635c9adc5dea00000" }, - "bf68d28aaf1eeefef646b65e8cc8d190f6c6da9c": { - "balance": "2000000000000000000000" + "0xbf68d28aaf1eeefef646b65e8cc8d190f6c6da9c": { + "balance": "0x6c6b935b8bbd400000" }, - "00969747f7a5b30645fe00e44901435ace24cc37": { - "balance": "1700000000000000000000" + "0x00969747f7a5b30645fe00e44901435ace24cc37": { + "balance": "0x5c283d410394100000" }, - "494dec4d5ee88a2771a815f1ee7264942fb58b28": { - "balance": "2000000000000000000000" + "0x494dec4d5ee88a2771a815f1ee7264942fb58b28": { + "balance": "0x6c6b935b8bbd400000" }, - "ffeac0305ede3a915295ec8e61c7f881006f4474": { - "balance": "98500000000000000000" + "0xffeac0305ede3a915295ec8e61c7f881006f4474": { + "balance": "0x556f64c1fe7fa0000" }, - "b39139576194a0866195151f33f2140ad1cc86cf": { - "balance": "100000000000000000000000" + "0xb39139576194a0866195151f33f2140ad1cc86cf": { + "balance": "0x152d02c7e14af6800000" }, - "fead1803e5e737a68e18472d9ac715f0994cc2be": { - "balance": "500000000000000000000" + "0xfead1803e5e737a68e18472d9ac715f0994cc2be": { + "balance": "0x1b1ae4d6e2ef500000" }, - "698ab9a2f33381e07c0c47433d0d21d6f336b127": { - "balance": "20000000000000000000" + "0x698ab9a2f33381e07c0c47433d0d21d6f336b127": { + "balance": "0x1158e460913d00000" }, - "e5edc73e626f5d3441a45539b5f7a398c593edf6": { - "balance": "865000000000000000000" + "0xe5edc73e626f5d3441a45539b5f7a398c593edf6": { + "balance": "0x2ee449550898e40000" }, - "dd4f5fa2111db68f6bde3589b63029395b69a92d": { - "balance": "158400000000000000000" + "0xdd4f5fa2111db68f6bde3589b63029395b69a92d": { + "balance": "0x8963dd8c2c5e00000" }, - "8c93c3c6db9d37717de165c3a1b4fe51952c08de": { - "balance": "400000000000000000000" + "0x8c93c3c6db9d37717de165c3a1b4fe51952c08de": { + "balance": "0x15af1d78b58c400000" }, - "f87bb07b289df7301e54c0efda6a2cf291e89200": { - "balance": "1400000000000000000000" + "0xf87bb07b289df7301e54c0efda6a2cf291e89200": { + "balance": "0x4be4e7267b6ae00000" }, - "e7a4560c84b20e0fb54c49670c2903b0a96c42a4": { - "balance": "598000000000000000000" + "0xe7a4560c84b20e0fb54c49670c2903b0a96c42a4": { + "balance": "0x206aeac7a903980000" }, - "00a5797f52c9d58f189f36b1d45d1bf6041f2f6b": { - "balance": "5456900000000000000000" + "0x00a5797f52c9d58f189f36b1d45d1bf6041f2f6b": { + "balance": "0x127d1b3461acd1a0000" }, - "9da3302240af0511c6fd1857e6ddb7394f77ab6b": { - "balance": "3100000000000000000000" + "0x9da3302240af0511c6fd1857e6ddb7394f77ab6b": { + "balance": "0xa80d24677efef00000" }, - "2c2d15ff39561c1b72eda1cc027ffef23743a144": { - "balance": "3920000000000000000000" + "0x2c2d15ff39561c1b72eda1cc027ffef23743a144": { + "balance": "0xd480ed9ef32b400000" }, - "9b4c2715780ca4e99e60ebf219f1590c8cad500a": { - "balance": "1600000000000000000000" + "0x9b4c2715780ca4e99e60ebf219f1590c8cad500a": { + "balance": "0x56bc75e2d631000000" }, - "ff5e7ee7d5114821e159dca5e81f18f1bfffbff9": { - "balance": "2000000000000000000000" + "0xff5e7ee7d5114821e159dca5e81f18f1bfffbff9": { + "balance": "0x6c6b935b8bbd400000" }, - "0169c1c210eae845e56840412e1f65993ea90fb4": { - "balance": "2000000000000000000000" + "0x0169c1c210eae845e56840412e1f65993ea90fb4": { + "balance": "0x6c6b935b8bbd400000" }, - "abc45f84db7382dde54c5f7d8938c42f4f3a3bc4": { - "balance": "200000000000000000000" + "0xabc45f84db7382dde54c5f7d8938c42f4f3a3bc4": { + "balance": "0xad78ebc5ac6200000" }, - "d9383d4b6d17b3f9cd426e10fb944015c0d44bfb": { - "balance": "800000000000000000000" + "0xd9383d4b6d17b3f9cd426e10fb944015c0d44bfb": { + "balance": "0x2b5e3af16b18800000" }, - "c090fe23dcd86b358c32e48d2af91024259f6566": { - "balance": "200000000000000000000" + "0xc090fe23dcd86b358c32e48d2af91024259f6566": { + "balance": "0xad78ebc5ac6200000" }, - "9ffedcc36b7cc312ad2a9ede431a514fccb49ba3": { - "balance": "669800000000000000000" + "0x9ffedcc36b7cc312ad2a9ede431a514fccb49ba3": { + "balance": "0x244f579f3f5ca40000" }, - "2ffe93ec1a5636e9ee34af70dff52682e6ff7079": { - "balance": "2000000000000000000000" + "0x2ffe93ec1a5636e9ee34af70dff52682e6ff7079": { + "balance": "0x6c6b935b8bbd400000" }, - "6e01e4ad569c95d007ada30d5e2db12888492294": { - "balance": "4000000000000000000000" + "0x6e01e4ad569c95d007ada30d5e2db12888492294": { + "balance": "0xd8d726b7177a800000" }, - "d4d92c62b280e00f626d8657f1b86166cb1f740f": { - "balance": "200028000000000000000" + "0xd4d92c62b280e00f626d8657f1b86166cb1f740f": { + "balance": "0xad7f23634cbd60000" }, - "1d36683063b7e9eb99462dabd569bddce71686f2": { - "balance": "1000000000000000000000" + "0x1d36683063b7e9eb99462dabd569bddce71686f2": { + "balance": "0x3635c9adc5dea00000" }, - "3a48e0a7098b06a905802b87545731118e89f439": { - "balance": "2000000000000000000000" + "0x3a48e0a7098b06a905802b87545731118e89f439": { + "balance": "0x6c6b935b8bbd400000" }, - "bd9e56e902f4be1fc8768d8038bac63e2acbbf8e": { - "balance": "999972000000000000000" + "0xbd9e56e902f4be1fc8768d8038bac63e2acbbf8e": { + "balance": "0x36356633ebd8ea0000" }, - "4d67f2ab8599fef5fc413999aa01fd7fce70b43d": { - "balance": "10000000000000000000000" + "0x4d67f2ab8599fef5fc413999aa01fd7fce70b43d": { + "balance": "0x21e19e0c9bab2400000" }, - "8e74e0d1b77ebc823aca03f119854cb12027f6d7": { - "balance": "107200000000000000000000" + "0x8e74e0d1b77ebc823aca03f119854cb12027f6d7": { + "balance": "0x16b352da5e0ed3000000" }, - "7e5b19ae1be94ff4dee635492a1b012d14db0213": { - "balance": "100000000000000000000" + "0x7e5b19ae1be94ff4dee635492a1b012d14db0213": { + "balance": "0x56bc75e2d63100000" }, - "5de9e7d5d1b667d095dd34099c85b0421a0bc681": { - "balance": "20000000000000000000" + "0x5de9e7d5d1b667d095dd34099c85b0421a0bc681": { + "balance": "0x1158e460913d00000" }, - "316eb4e47df71b42e16d6fe46825b7327baf3124": { - "balance": "4000000000000000000000" + "0x316eb4e47df71b42e16d6fe46825b7327baf3124": { + "balance": "0xd8d726b7177a800000" }, - "772c297f0ad194482ee8c3f036bdeb01c201d5cc": { - "balance": "200000000000000000000" + "0x772c297f0ad194482ee8c3f036bdeb01c201d5cc": { + "balance": "0xad78ebc5ac6200000" }, - "d7052519756af42590f15391b723a03fa564a951": { - "balance": "4615591000000000000000" + "0xd7052519756af42590f15391b723a03fa564a951": { + "balance": "0xfa3631480d01fd8000" }, - "2c6846a1aa999a2246a287056000ba4dcba8e63d": { - "balance": "10020000000000000000000" + "0x2c6846a1aa999a2246a287056000ba4dcba8e63d": { + "balance": "0x21f2f6f0fc3c6100000" }, - "de5b005fe8daae8d1f05de3eda042066c6c4691c": { - "balance": "1100000000000000000000" + "0xde5b005fe8daae8d1f05de3eda042066c6c4691c": { + "balance": "0x3ba1910bf341b00000" }, - "254c1ecc630c2877de8095f0a8dba1e8bf1f550c": { - "balance": "1700000000000000000000" + "0x254c1ecc630c2877de8095f0a8dba1e8bf1f550c": { + "balance": "0x5c283d410394100000" }, - "f8f226142a428434ab17a1864a2597f64aab2f06": { - "balance": "172473000000000000000" + "0xf8f226142a428434ab17a1864a2597f64aab2f06": { + "balance": "0x9598b2fb2e9f28000" }, - "a6c910ce4d494a919ccdaaa1fc3b82aa74ba06cf": { - "balance": "8000000000000000000000" + "0xa6c910ce4d494a919ccdaaa1fc3b82aa74ba06cf": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "e587b16abc8a74081e3613e14342c03375bf0847": { - "balance": "2000000000000000000000" + "0xe587b16abc8a74081e3613e14342c03375bf0847": { + "balance": "0x6c6b935b8bbd400000" }, - "6f176065e88e3c6fe626267d18a088aaa4db80bc": { - "balance": "3520000000000000000000" + "0x6f176065e88e3c6fe626267d18a088aaa4db80bc": { + "balance": "0xbed1d0263d9f000000" }, - "50dcbc27bcad984093a212a9b4178eabe9017561": { - "balance": "145512000000000000000" + "0x50dcbc27bcad984093a212a9b4178eabe9017561": { + "balance": "0x7e362790b5ca40000" }, - "e1953c6e975814c571311c34c0f6a99cdf48ab82": { - "balance": "50000000000000000000" + "0xe1953c6e975814c571311c34c0f6a99cdf48ab82": { + "balance": "0x2b5e3af16b1880000" }, - "be0a2f385f09dbfce96732e12bb40ac349871ba8": { - "balance": "1610348000000000000000" + "0xbe0a2f385f09dbfce96732e12bb40ac349871ba8": { + "balance": "0x574c115e02b8be0000" }, - "4712540265cbeec3847022c59f1b318d43400a9e": { - "balance": "3500000000000000000000" + "0x4712540265cbeec3847022c59f1b318d43400a9e": { + "balance": "0xbdbc41e0348b300000" }, - "29bdc4f28de0180f433c2694eb74f5504ce94337": { - "balance": "2000000000000000000000" + "0x29bdc4f28de0180f433c2694eb74f5504ce94337": { + "balance": "0x6c6b935b8bbd400000" }, - "2f66bfbf2262efcc8d2bd0444fc5b0696298ff1e": { - "balance": "9940000000000000000000" + "0x2f66bfbf2262efcc8d2bd0444fc5b0696298ff1e": { + "balance": "0x21ad935f79f76d00000" }, - "506411fd79003480f6f2b6aac26b7ba792f094b2": { - "balance": "500000000000000000000" + "0x506411fd79003480f6f2b6aac26b7ba792f094b2": { + "balance": "0x1b1ae4d6e2ef500000" }, - "23ea669e3564819a83b0c26c00a16d9e826f6c46": { - "balance": "1430590000000000000000" + "0x23ea669e3564819a83b0c26c00a16d9e826f6c46": { + "balance": "0x4d8d6ca968ca130000" }, - "e3ffb02cb7d9ea5243701689afd5d417d7ed2ece": { - "balance": "78000000000000000000" + "0xe3ffb02cb7d9ea5243701689afd5d417d7ed2ece": { + "balance": "0x43a77aabd00780000" }, - "38e7dba8fd4f1f850dbc2649d8e84f0952e3eb3c": { - "balance": "50000000000000000000" + "0x38e7dba8fd4f1f850dbc2649d8e84f0952e3eb3c": { + "balance": "0x2b5e3af16b1880000" }, - "8644cc281be332ccced36da483fb2a0746d9ba2e": { - "balance": "400000000000000000000" + "0x8644cc281be332ccced36da483fb2a0746d9ba2e": { + "balance": "0x15af1d78b58c400000" }, - "e8a91da6cf1b9d65c74a02ec1f96eecb6dd241f3": { - "balance": "1940000000000000000000" + "0xe8a91da6cf1b9d65c74a02ec1f96eecb6dd241f3": { + "balance": "0x692ae8897081d00000" }, - "0631dc40d74e5095e3729eddf49544ecd4396f67": { - "balance": "160000000000000000000" + "0x0631dc40d74e5095e3729eddf49544ecd4396f67": { + "balance": "0x8ac7230489e800000" }, - "83c897a84b695eebe46679f7da19d776621c2694": { - "balance": "500000000000000000000" + "0x83c897a84b695eebe46679f7da19d776621c2694": { + "balance": "0x1b1ae4d6e2ef500000" }, - "db73460b59d8e85045d5e752e62559875e42502e": { - "balance": "999800000000000000000" + "0xdb73460b59d8e85045d5e752e62559875e42502e": { + "balance": "0x36330322d5238c0000" }, - "0dd4e674bbadb1b0dc824498713dce3b5156da29": { - "balance": "170000000000000000000" + "0x0dd4e674bbadb1b0dc824498713dce3b5156da29": { + "balance": "0x93739534d28680000" }, - "e3933d61b77dcdc716407f8250bc91e4ffaeb09d": { - "balance": "86600000000000000000000" + "0xe3933d61b77dcdc716407f8250bc91e4ffaeb09d": { + "balance": "0x1256986c95891c200000" }, - "58c90754d2f20a1cb1dd330625e04b45fa619d5c": { - "balance": "2000000000000000000000" + "0x58c90754d2f20a1cb1dd330625e04b45fa619d5c": { + "balance": "0x6c6b935b8bbd400000" }, - "895ec5545644e0b78330fffab8ddeac9e833156c": { - "balance": "600000000000000000000" + "0x895ec5545644e0b78330fffab8ddeac9e833156c": { + "balance": "0x2086ac351052600000" }, - "7e1e29721d6cb91057f6c4042d8a0bbc644afe73": { - "balance": "159800000000000000000" + "0x7e1e29721d6cb91057f6c4042d8a0bbc644afe73": { + "balance": "0x8a9aba557e36c0000" }, - "72b90a4dc097239492c5b9777dcd1e52ba2be2c2": { - "balance": "6000000000000000000000" + "0x72b90a4dc097239492c5b9777dcd1e52ba2be2c2": { + "balance": "0x14542ba12a337c00000" }, - "64241a7844290e0ab855f1d4aa75b55345032224": { - "balance": "1600000000000000000000" + "0x64241a7844290e0ab855f1d4aa75b55345032224": { + "balance": "0x56bc75e2d631000000" }, - "6fd4e0f3f32bee6d3767fdbc9d353a6d3aab7899": { - "balance": "695240000000000000000" + "0x6fd4e0f3f32bee6d3767fdbc9d353a6d3aab7899": { + "balance": "0x25b064a875ea940000" }, - "3a035594c747476d42d1ee966c36224cdd224993": { - "balance": "355890000000000000000" + "0x3a035594c747476d42d1ee966c36224cdd224993": { + "balance": "0x134af74569f9c50000" }, - "de97f4330700b48c496d437c91ca1de9c4b01ba4": { - "balance": "2910840000000000000000" + "0xde97f4330700b48c496d437c91ca1de9c4b01ba4": { + "balance": "0x9dcc0515b56e0c0000" }, - "716ad3c33a9b9a0a18967357969b94ee7d2abc10": { - "balance": "482000000000000000000" + "0x716ad3c33a9b9a0a18967357969b94ee7d2abc10": { + "balance": "0x1a2117fe412a480000" }, - "bfbe05e88c9cbbcc0e92a405fac1d85de248ee24": { - "balance": "100000000000000000000" + "0xbfbe05e88c9cbbcc0e92a405fac1d85de248ee24": { + "balance": "0x56bc75e2d63100000" }, - "cfc4e6f7f8b011414bfba42f23adfaa78d4ecc5e": { - "balance": "1850000000000000000000" + "0xcfc4e6f7f8b011414bfba42f23adfaa78d4ecc5e": { + "balance": "0x6449e84e47a8a80000" }, - "d931ac2668ba6a84481ab139735aec14b7bfbabf": { - "balance": "2000000000000000000000" + "0xd931ac2668ba6a84481ab139735aec14b7bfbabf": { + "balance": "0x6c6b935b8bbd400000" }, - "e3263ce8af6db3e467584502ed7109125eae22a5": { - "balance": "2000000000000000000000" + "0xe3263ce8af6db3e467584502ed7109125eae22a5": { + "balance": "0x6c6b935b8bbd400000" }, - "f78258c12481bcdddbb72a8ca0c043097261c6c5": { - "balance": "20000000000000000000" + "0xf78258c12481bcdddbb72a8ca0c043097261c6c5": { + "balance": "0x1158e460913d00000" }, - "4493123c021ece3b33b1a452c9268de14007f9d3": { - "balance": "6685000000000000000000" + "0x4493123c021ece3b33b1a452c9268de14007f9d3": { + "balance": "0x16a6502f15a1e540000" }, - "431f2c19e316b044a4b3e61a0c6ff8c104a1a12f": { - "balance": "1000000000000000000000" + "0x431f2c19e316b044a4b3e61a0c6ff8c104a1a12f": { + "balance": "0x3635c9adc5dea00000" }, - "e63e787414b9048478a50733359ecdd7e3647aa6": { - "balance": "1580000000000000000000" + "0xe63e787414b9048478a50733359ecdd7e3647aa6": { + "balance": "0x55a6e79ccd1d300000" }, - "e4715956f52f15306ee9506bf82bccc406b3895e": { - "balance": "274944000000000000000" + "0xe4715956f52f15306ee9506bf82bccc406b3895e": { + "balance": "0xee79d4f48c5000000" }, - "f7f91e7acb5b8129a306877ce3168e6f438b66a1": { - "balance": "176000000000000000000" + "0xf7f91e7acb5b8129a306877ce3168e6f438b66a1": { + "balance": "0x98a7d9b8314c00000" }, - "dcdbbd4e2604e40e1710cc6730289dccfad3892d": { - "balance": "4600000000000000000000" + "0xdcdbbd4e2604e40e1710cc6730289dccfad3892d": { + "balance": "0xf95dd2ec27cce00000" }, - "2b5f4b3f1e11707a227aa5e69fa49dded33fb321": { - "balance": "6000000000000000000000" + "0x2b5f4b3f1e11707a227aa5e69fa49dded33fb321": { + "balance": "0x14542ba12a337c00000" }, - "01488ad3da603c4cdd6cb0b7a1e30d2a30c8fc38": { - "balance": "200000000000000000000" + "0x01488ad3da603c4cdd6cb0b7a1e30d2a30c8fc38": { + "balance": "0xad78ebc5ac6200000" }, - "841145b44840c946e21dbc190264b8e0d5029369": { - "balance": "300000000000000000000000" + "0x841145b44840c946e21dbc190264b8e0d5029369": { + "balance": "0x3f870857a3e0e3800000" }, - "bf05070c2c34219311c4548b2614a438810ded6d": { - "balance": "2000000000000000000000" + "0xbf05070c2c34219311c4548b2614a438810ded6d": { + "balance": "0x6c6b935b8bbd400000" }, - "38f387e1a4ed4a73106ef2b462e474e2e3143ad0": { - "balance": "6000000000000000000000" + "0x38f387e1a4ed4a73106ef2b462e474e2e3143ad0": { + "balance": "0x14542ba12a337c00000" }, - "f116b0b4680f53ab72c968ba802e10aa1be11dc8": { - "balance": "20000000000000000000" + "0xf116b0b4680f53ab72c968ba802e10aa1be11dc8": { + "balance": "0x1158e460913d00000" }, - "bea0afc93aae2108a3fac059623bf86fa582a75e": { - "balance": "1700000000000000000000" + "0xbea0afc93aae2108a3fac059623bf86fa582a75e": { + "balance": "0x5c283d410394100000" }, - "4c997992036c5b433ac33d25a8ea1dc3d4e4e6d8": { - "balance": "29200000000000000000" + "0x4c997992036c5b433ac33d25a8ea1dc3d4e4e6d8": { + "balance": "0x1953b3d4ab1680000" }, - "ab7e0b83ed9a424c6d1e6a6f87a4dbf06409c7d6": { - "balance": "2400000000000000000000" + "0xab7e0b83ed9a424c6d1e6a6f87a4dbf06409c7d6": { + "balance": "0x821ab0d44149800000" }, - "d71fb130f0150c565269e00efb43902b52a455a6": { - "balance": "200000000000000000000" + "0xd71fb130f0150c565269e00efb43902b52a455a6": { + "balance": "0xad78ebc5ac6200000" }, - "99b018932bcad355b6792b255db6702dec8ce5dd": { - "balance": "4000086000000000000000" + "0x99b018932bcad355b6792b255db6702dec8ce5dd": { + "balance": "0xd8d8583fa2d52f0000" }, - "4b904e934bd0cc8b20705f879e905b93ea0ccc30": { - "balance": "2000000000000000000000" + "0x4b904e934bd0cc8b20705f879e905b93ea0ccc30": { + "balance": "0x6c6b935b8bbd400000" }, - "672ec42faa8cd69aaa71b32cc7b404881d52ff91": { - "balance": "10000000000000000000000" + "0x672ec42faa8cd69aaa71b32cc7b404881d52ff91": { + "balance": "0x21e19e0c9bab2400000" }, - "acbc2d19e06c3babbb5b6f052b6bf7fc37e07229": { - "balance": "200000000000000000000" + "0xacbc2d19e06c3babbb5b6f052b6bf7fc37e07229": { + "balance": "0xad78ebc5ac6200000" }, - "cea8743341533cb2f0b9c6efb8fda80d77162825": { - "balance": "100000000000000000000" + "0xcea8743341533cb2f0b9c6efb8fda80d77162825": { + "balance": "0x56bc75e2d63100000" }, - "9568b7de755628af359a84543de23504e15e41e6": { - "balance": "40000000000000000000000" + "0x9568b7de755628af359a84543de23504e15e41e6": { + "balance": "0x878678326eac9000000" }, - "6ec96d13bdb24dc7a557293f029e02dd74b97a55": { - "balance": "4000000000000000000000" + "0x6ec96d13bdb24dc7a557293f029e02dd74b97a55": { + "balance": "0xd8d726b7177a800000" }, - "d95c90ffbe5484864780b867494a83c89256d6e4": { - "balance": "1640000000000000000000" + "0xd95c90ffbe5484864780b867494a83c89256d6e4": { + "balance": "0x58e7926ee858a00000" }, - "ade6f8163bf7c7bb4abe8e9893bd0cc112fe8872": { - "balance": "327600000000000000000" + "0xade6f8163bf7c7bb4abe8e9893bd0cc112fe8872": { + "balance": "0x11c25d004d01f80000" }, - "250eb7c66f869ddf49da85f3393e980c029aa434": { - "balance": "4000000000000000000000" + "0x250eb7c66f869ddf49da85f3393e980c029aa434": { + "balance": "0xd8d726b7177a800000" }, - "a35c19132cac1935576abfed6c0495fb07881ba0": { - "balance": "2000000000000000000000" + "0xa35c19132cac1935576abfed6c0495fb07881ba0": { + "balance": "0x6c6b935b8bbd400000" }, - "d5550caaf743b037c56fd2558a1c8ed235130750": { - "balance": "5347598000000000000000" + "0xd5550caaf743b037c56fd2558a1c8ed235130750": { + "balance": "0x121e4d49036255b0000" }, - "03097923ba155e16d82f3ad3f6b815540884b92c": { - "balance": "1820000000000000000000" + "0x03097923ba155e16d82f3ad3f6b815540884b92c": { + "balance": "0x62a992e53a0af00000" }, - "d6d9e30f0842012a7176a917d9d2048ca0738759": { - "balance": "4000000000000000000000" + "0xd6d9e30f0842012a7176a917d9d2048ca0738759": { + "balance": "0xd8d726b7177a800000" }, - "ab9ad36e5c74ce2e96399f57839431d0e79f96ab": { - "balance": "164000000000000000000" + "0xab9ad36e5c74ce2e96399f57839431d0e79f96ab": { + "balance": "0x8e3f50b173c100000" }, - "75be8ff65e5788aec6b2a52d5fa7b1e7a03ba675": { - "balance": "67720000000000000000" + "0x75be8ff65e5788aec6b2a52d5fa7b1e7a03ba675": { + "balance": "0x3abcdc5343d740000" }, - "4f6d4737d7a940382487264886697cf7637f8015": { - "balance": "1670000000000000000000" + "0x4f6d4737d7a940382487264886697cf7637f8015": { + "balance": "0x5a87e7d7f5f6580000" }, - "5f7b3bbac16dab831a4a0fc53b0c549dc36c31ca": { - "balance": "1940000000000000000000" + "0x5f7b3bbac16dab831a4a0fc53b0c549dc36c31ca": { + "balance": "0x692ae8897081d00000" }, - "d843ee0863ce933e22f89c802d31287b9671e81c": { - "balance": "13370000000000000000" + "0xd843ee0863ce933e22f89c802d31287b9671e81c": { + "balance": "0xb98bc829a6f90000" }, - "361f3ba9ed956b770f257d3672fe1ff9f7b0240c": { - "balance": "600000000000000000000" + "0x361f3ba9ed956b770f257d3672fe1ff9f7b0240c": { + "balance": "0x2086ac351052600000" }, - "6c0ae9f043c834d44271f13406593dfe094f389f": { - "balance": "1517545000000000000000" + "0x6c0ae9f043c834d44271f13406593dfe094f389f": { + "balance": "0x52442ae133b62a8000" }, - "db34745ede8576b499db01beb7c1ecda85cf4abe": { - "balance": "80000000000000000000" + "0xdb34745ede8576b499db01beb7c1ecda85cf4abe": { + "balance": "0x4563918244f400000" }, - "7be8ccb4f11b66ca6e1d57c0b5396221a31ba53a": { - "balance": "20000000000000000000" + "0x7be8ccb4f11b66ca6e1d57c0b5396221a31ba53a": { + "balance": "0x1158e460913d00000" }, - "128b908fe743a434203de294c441c7e20a86ea67": { - "balance": "713304000000000000000" + "0x128b908fe743a434203de294c441c7e20a86ea67": { + "balance": "0x26ab14e0c0e13c0000" }, - "df236bf6abf4f3293795bf0c28718f93e3b1b36b": { - "balance": "1337000000000000000000" + "0xdf236bf6abf4f3293795bf0c28718f93e3b1b36b": { + "balance": "0x487a9a304539440000" }, - "14254ea126b52d0142da0a7e188ce255d8c47178": { - "balance": "775000000000000000000" + "0x14254ea126b52d0142da0a7e188ce255d8c47178": { + "balance": "0x2a034919dfbfbc0000" }, - "ceed47ca5b899fd1623f21e9bd4db65a10e5b09d": { - "balance": "133196000000000000000" + "0xceed47ca5b899fd1623f21e9bd4db65a10e5b09d": { + "balance": "0x73877404c1eee0000" }, - "30acd858875fa24eef0d572fc7d62aad0ebddc35": { - "balance": "400000000000000000000" + "0x30acd858875fa24eef0d572fc7d62aad0ebddc35": { + "balance": "0x15af1d78b58c400000" }, - "47a281dff64167197855bf6e705eb9f2cef632ea": { - "balance": "1000072000000000000000" + "0x47a281dff64167197855bf6e705eb9f2cef632ea": { + "balance": "0x3636c9796436740000" }, - "297d5dbe222f2fb52531acbd0b013dc446ac7368": { - "balance": "20000000000000000000000" + "0x297d5dbe222f2fb52531acbd0b013dc446ac7368": { + "balance": "0x43c33c1937564800000" }, - "adf85203c8376a5fde9815384a350c3879c4cb93": { - "balance": "1147300000000000000000" + "0xadf85203c8376a5fde9815384a350c3879c4cb93": { + "balance": "0x3e31fc675815aa0000" }, - "c3e0471c64ff35fa5232cc3121d1d38d1a0fb7de": { - "balance": "2000000000000000000000" + "0xc3e0471c64ff35fa5232cc3121d1d38d1a0fb7de": { + "balance": "0x6c6b935b8bbd400000" }, - "fdecc82ddfc56192e26f563c3d68cb544a96bfed": { - "balance": "440000000000000000000" + "0xfdecc82ddfc56192e26f563c3d68cb544a96bfed": { + "balance": "0x17da3a04c7b3e00000" }, - "2614f42d5da844377578e6b448dc24305bef2b03": { - "balance": "2000000000000000000000" + "0x2614f42d5da844377578e6b448dc24305bef2b03": { + "balance": "0x6c6b935b8bbd400000" }, - "1d96bcd58457bbf1d3c2a46ffaf16dbf7d836859": { - "balance": "171313000000000000000" + "0x1d96bcd58457bbf1d3c2a46ffaf16dbf7d836859": { + "balance": "0x9497209d8467e8000" }, - "bd66ffedb530ea0b2e856dd12ac2296c31fe29e0": { - "balance": "200000000000000000000" + "0xbd66ffedb530ea0b2e856dd12ac2296c31fe29e0": { + "balance": "0xad78ebc5ac6200000" }, - "6e84876dbb95c40b6656e42ba9aea08a993b54dc": { - "balance": "1101932000000000000000" + "0x6e84876dbb95c40b6656e42ba9aea08a993b54dc": { + "balance": "0x3bbc60e3b6cbbe0000" }, - "a1c4f45a82e1c478d845082eb18875c4ea6539ab": { - "balance": "200000000000000000000000" + "0xa1c4f45a82e1c478d845082eb18875c4ea6539ab": { + "balance": "0x2a5a058fc295ed000000" }, - "2c964849b1f69cc7cea4442538ed87fdf16cfc8f": { - "balance": "2000000000000000000000" + "0x2c964849b1f69cc7cea4442538ed87fdf16cfc8f": { + "balance": "0x6c6b935b8bbd400000" }, - "45b47105fe42c4712dce6e2a21c05bffd5ea47a9": { - "balance": "2000000000000000000000" + "0x45b47105fe42c4712dce6e2a21c05bffd5ea47a9": { + "balance": "0x6c6b935b8bbd400000" }, - "31e9c00f0c206a4e4e7e0522170dc81e88f3eb70": { - "balance": "2685000000000000000000" + "0x31e9c00f0c206a4e4e7e0522170dc81e88f3eb70": { + "balance": "0x918ddc3a42a3d40000" }, - "5fe77703808f823e6c399352108bdb2c527cb87c": { - "balance": "1960000000000000000000" + "0x5fe77703808f823e6c399352108bdb2c527cb87c": { + "balance": "0x6a4076cf7995a00000" }, - "2272186ef27dcbe2f5fc373050fdae7f2ace2316": { - "balance": "16100000000000000000000" + "0x2272186ef27dcbe2f5fc373050fdae7f2ace2316": { + "balance": "0x368c8623a8b4d100000" }, - "b7576e9d314df41ec5506494293afb1bd5d3f65d": { - "balance": "20000000000000000000" + "0xb7576e9d314df41ec5506494293afb1bd5d3f65d": { + "balance": "0x1158e460913d00000" }, - "ac9fff68c61b011efbecf038ed72db97bb9e7281": { - "balance": "9550000000000000000000" + "0xac9fff68c61b011efbecf038ed72db97bb9e7281": { + "balance": "0x205b4dfa1ee74780000" }, - "cd9529492b5c29e475acb941402b3d3ba50686b0": { - "balance": "1970000000000000000000" + "0xcd9529492b5c29e475acb941402b3d3ba50686b0": { + "balance": "0x6acb3df27e1f880000" }, - "f19b39389d47b11b8a2c3f1da9124decffbefaf7": { - "balance": "2000000000000000000000" + "0xf19b39389d47b11b8a2c3f1da9124decffbefaf7": { + "balance": "0x6c6b935b8bbd400000" }, - "9e951f6dc5e352afb8d04299d2478a451259bf56": { - "balance": "72004000000000000000" + "0x9e951f6dc5e352afb8d04299d2478a451259bf56": { + "balance": "0x3e7419881a73a0000" }, - "8eb1fbe4e5d3019cd7d30dae9c0d5b4c76fb6331": { - "balance": "2000000000000000000000" + "0x8eb1fbe4e5d3019cd7d30dae9c0d5b4c76fb6331": { + "balance": "0x6c6b935b8bbd400000" }, - "29cc804d922be91f5909f348b0aaa5d21b607830": { - "balance": "4000000000000000000000" + "0x29cc804d922be91f5909f348b0aaa5d21b607830": { + "balance": "0xd8d726b7177a800000" }, - "5c7b9ec7a2438d1e3c7698b545b9c3fd77b7cd55": { - "balance": "1000000000000000000000" + "0x5c7b9ec7a2438d1e3c7698b545b9c3fd77b7cd55": { + "balance": "0x3635c9adc5dea00000" }, - "a16160851d2b9c349b92e46f829abfb210943595": { - "balance": "1790000000000000000000" + "0xa16160851d2b9c349b92e46f829abfb210943595": { + "balance": "0x61093d7c2c6d380000" }, - "eac6b98842542ea10bb74f26d7c7488f698b6452": { - "balance": "20000000000000000000000" + "0xeac6b98842542ea10bb74f26d7c7488f698b6452": { + "balance": "0x43c33c1937564800000" }, - "57825aeb09076caa477887fbc9ae37e8b27cc962": { - "balance": "100000000000000000000" + "0x57825aeb09076caa477887fbc9ae37e8b27cc962": { + "balance": "0x56bc75e2d63100000" }, - "b35e8a1c0dac7e0e66dbac736a592abd44012561": { - "balance": "14974000000000000000" + "0xb35e8a1c0dac7e0e66dbac736a592abd44012561": { + "balance": "0xcfce55aa12b30000" }, - "756b84eb85fcc1f4fcdcc2b08db6a86e135fbc25": { - "balance": "3220000000000000000000" + "0x756b84eb85fcc1f4fcdcc2b08db6a86e135fbc25": { + "balance": "0xae8e7a0bb575d00000" }, - "e13b3d2bbfdcbc8772a23315724c1425167c5688": { - "balance": "1032115000000000000000" + "0xe13b3d2bbfdcbc8772a23315724c1425167c5688": { + "balance": "0x37f379141ed04b8000" }, - "0a2dcb7a671701dbb8f495728088265873356c8e": { - "balance": "152120000000000000000" + "0x0a2dcb7a671701dbb8f495728088265873356c8e": { + "balance": "0x83f16ce08a06c0000" }, - "03cb4c4f4516c4ff79a1b6244fbf572e1c7fea79": { - "balance": "2740000000000000000000" + "0x03cb4c4f4516c4ff79a1b6244fbf572e1c7fea79": { + "balance": "0x9489237adb9a500000" }, - "98ba4e9ca72fddc20c69b4396f76f8183f7a2a4e": { - "balance": "12800000000000000000000" + "0x98ba4e9ca72fddc20c69b4396f76f8183f7a2a4e": { + "balance": "0x2b5e3af16b188000000" }, - "f8087786b42da04ed6d1e0fe26f6c0eefe1e9f5a": { - "balance": "10000000000000000000000" + "0xf8087786b42da04ed6d1e0fe26f6c0eefe1e9f5a": { + "balance": "0x21e19e0c9bab2400000" }, - "02f7f67209b16a17550c694c72583819c80b54ad": { - "balance": "98400000000000000000" + "0x02f7f67209b16a17550c694c72583819c80b54ad": { + "balance": "0x5559306a78a700000" }, - "32bb2e9693e4e085344d2f0dbd46a283e3a087fd": { - "balance": "400000000000000000000" + "0x32bb2e9693e4e085344d2f0dbd46a283e3a087fd": { + "balance": "0x15af1d78b58c400000" }, - "9c78963fbc263c09bd72e4f8def74a9475f7055c": { - "balance": "13790000000000000000000" + "0x9c78963fbc263c09bd72e4f8def74a9475f7055c": { + "balance": "0x2eb8eb1a172dcb80000" }, - "27144ca9a7771a836ad50f803f64d869b2ae2b20": { - "balance": "4000000000000000000000" + "0x27144ca9a7771a836ad50f803f64d869b2ae2b20": { + "balance": "0xd8d726b7177a800000" }, - "cc758d071d25a6320af68c5dc9c4f6955ba94520": { - "balance": "6000000000000000000000" + "0xcc758d071d25a6320af68c5dc9c4f6955ba94520": { + "balance": "0x14542ba12a337c00000" }, - "cb42b44eb5fd60b5837e4f9eb47267523d1a229c": { - "balance": "865000000000000000000" + "0xcb42b44eb5fd60b5837e4f9eb47267523d1a229c": { + "balance": "0x2ee449550898e40000" }, - "aaf5b207b88b0de4ac40d747cee06e172df6e745": { - "balance": "31428000000000000000000" + "0xaaf5b207b88b0de4ac40d747cee06e172df6e745": { + "balance": "0x6a7b71d7f51d0900000" }, - "52d380511df19d5ec2807bbcb676581b67fd37a3": { - "balance": "13400000000000000000" + "0x52d380511df19d5ec2807bbcb676581b67fd37a3": { + "balance": "0xb9f65d00f63c0000" }, - "aa1b3768c16d821f580e76c8e4c8e86d7dc78853": { - "balance": "400000000000000000000" + "0xaa1b3768c16d821f580e76c8e4c8e86d7dc78853": { + "balance": "0x15af1d78b58c400000" }, - "41098a81452317c19e3eef0bd123bbe178e9e9ca": { - "balance": "2800000000000000000000" + "0x41098a81452317c19e3eef0bd123bbe178e9e9ca": { + "balance": "0x97c9ce4cf6d5c00000" }, - "267148fd72c54f620a592fb92799319cc4532b5c": { - "balance": "410000000000000000000" + "0x267148fd72c54f620a592fb92799319cc4532b5c": { + "balance": "0x1639e49bba16280000" }, - "d7cdbd41fff20df727c70b6255c1ba7606055468": { - "balance": "200000000000000000000" + "0xd7cdbd41fff20df727c70b6255c1ba7606055468": { + "balance": "0xad78ebc5ac6200000" }, - "0e33fcbbc003510be35785b52a9c5d216bc005f4": { - "balance": "1880000000000000000000" + "0x0e33fcbbc003510be35785b52a9c5d216bc005f4": { + "balance": "0x65ea3db75546600000" }, - "6727daf5b9d68efcab489fedec96d7f7325dd423": { - "balance": "2000000000000000000000" + "0x6727daf5b9d68efcab489fedec96d7f7325dd423": { + "balance": "0x6c6b935b8bbd400000" }, - "cd0a161bc367ae0927a92aac9cf6e5086714efca": { - "balance": "2000000000000000000000" + "0xcd0a161bc367ae0927a92aac9cf6e5086714efca": { + "balance": "0x6c6b935b8bbd400000" }, - "612667f172135b950b2cd1de10afdece6857b873": { - "balance": "1000000000000000000000" + "0x612667f172135b950b2cd1de10afdece6857b873": { + "balance": "0x3635c9adc5dea00000" }, - "900194c4b1074305d19de405b0ac78280ecaf967": { - "balance": "1000000000000000000000" + "0x900194c4b1074305d19de405b0ac78280ecaf967": { + "balance": "0x3635c9adc5dea00000" }, - "51f55ef47e6456a418ab32b9221ed27dba6608ee": { - "balance": "4200000000000000000000" + "0x51f55ef47e6456a418ab32b9221ed27dba6608ee": { + "balance": "0xe3aeb5737240a00000" }, - "0da532c910e3ac0dfb14db61cd739a93353fd05f": { - "balance": "1336866000000000000000" + "0x0da532c910e3ac0dfb14db61cd739a93353fd05f": { + "balance": "0x4878be1ffaf95d0000" }, - "21df2dcdaf74b2bf803404dd4de6a35eabec1bbd": { - "balance": "6920000000000000000000" + "0x21df2dcdaf74b2bf803404dd4de6a35eabec1bbd": { + "balance": "0x177224aa844c7200000" }, - "f0e7fb9e420a5340d536f40408344feaefc06aef": { - "balance": "1000000000000000000000" + "0xf0e7fb9e420a5340d536f40408344feaefc06aef": { + "balance": "0x3635c9adc5dea00000" }, - "6742a2cfce8d79a2c4a51b77747498912245cd6a": { - "balance": "258064000000000000000" + "0x6742a2cfce8d79a2c4a51b77747498912245cd6a": { + "balance": "0xdfd5b80b7e4680000" }, - "8663a241a0a89e70e182c845e2105c8ad7264bcf": { - "balance": "14825507000000000000000" + "0x8663a241a0a89e70e182c845e2105c8ad7264bcf": { + "balance": "0x323b13d8398f3238000" }, - "18e113d8177c691a61be785852fa5bb47aeebdaf": { - "balance": "1337000000000000000000" + "0x18e113d8177c691a61be785852fa5bb47aeebdaf": { + "balance": "0x487a9a304539440000" }, - "1bec4d02ce85fc48feb62489841d85b170586a9b": { - "balance": "2400000000000000000000" + "0x1bec4d02ce85fc48feb62489841d85b170586a9b": { + "balance": "0x821ab0d44149800000" }, - "287cf9d0902ef819a7a5f149445bf1775ee8c47c": { - "balance": "16000000000000000000000" + "0x287cf9d0902ef819a7a5f149445bf1775ee8c47c": { + "balance": "0x3635c9adc5dea000000" }, - "28967280214e218a120c5dda37041b111ea36d74": { - "balance": "200000000000000000000" + "0x28967280214e218a120c5dda37041b111ea36d74": { + "balance": "0xad78ebc5ac6200000" }, - "a0b771951ce1deee363ae2b771b73e07c4b5e800": { - "balance": "1400000000000000000000" + "0xa0b771951ce1deee363ae2b771b73e07c4b5e800": { + "balance": "0x4be4e7267b6ae00000" }, - "29f8fba4c30772b057edbbe62ae7420c390572e1": { - "balance": "1000000000000000000000" + "0x29f8fba4c30772b057edbbe62ae7420c390572e1": { + "balance": "0x3635c9adc5dea00000" }, - "ee34c7e7995db9f187cff156918cfb6f13f6e003": { - "balance": "1960000000000000000000" + "0xee34c7e7995db9f187cff156918cfb6f13f6e003": { + "balance": "0x6a4076cf7995a00000" }, - "916bf7e3c545921d3206d900c24f14127cbd5e70": { - "balance": "18020000000000000000000" + "0x916bf7e3c545921d3206d900c24f14127cbd5e70": { + "balance": "0x3d0ddbc7df2bb100000" }, - "93235f340d2863e18d2f4c52996516138d220267": { - "balance": "73800000000000000000" + "0x93235f340d2863e18d2f4c52996516138d220267": { + "balance": "0x4002e44fda7d40000" }, - "7efec0c6253caf397f71287c1c07f6c9582b5b86": { - "balance": "482839000000000000000" + "0x7efec0c6253caf397f71287c1c07f6c9582b5b86": { + "balance": "0x1a2cbcb84f30d58000" }, - "8d2e31b08803b2c5f13d398ecad88528209f6057": { - "balance": "9993000000000000000000" + "0x8d2e31b08803b2c5f13d398ecad88528209f6057": { + "balance": "0x21db8bbcad11e840000" }, - "964eab4b276b4cd8983e15ca72b106900fe41fce": { - "balance": "500000000000000000000" + "0x964eab4b276b4cd8983e15ca72b106900fe41fce": { + "balance": "0x1b1ae4d6e2ef500000" }, - "eea1e97988de75d821cd28ad6822b22cce988b31": { - "balance": "520000000000000000000" + "0xeea1e97988de75d821cd28ad6822b22cce988b31": { + "balance": "0x1c30731cec03200000" }, - "278c0bde630ec393b1e7267fc9d7d97019e4145b": { - "balance": "2000000000000000000000" + "0x278c0bde630ec393b1e7267fc9d7d97019e4145b": { + "balance": "0x6c6b935b8bbd400000" }, - "82e4461eb9d849f0041c1404219e4272c4900ab4": { - "balance": "2000000000000000000000" + "0x82e4461eb9d849f0041c1404219e4272c4900ab4": { + "balance": "0x6c6b935b8bbd400000" }, - "4a73389298031b8816cca946421c199e18b343d6": { - "balance": "631254000000000000000" + "0x4a73389298031b8816cca946421c199e18b343d6": { + "balance": "0x223868b879146f0000" }, - "9a5af31c7e06339ac8b4628d7c4db0ce0f45c8a4": { - "balance": "500000000000000000000" + "0x9a5af31c7e06339ac8b4628d7c4db0ce0f45c8a4": { + "balance": "0x1b1ae4d6e2ef500000" }, - "cb9b5103e4ce89af4f64916150bff9eecb9faa5c": { - "balance": "500000000000000000000" + "0xcb9b5103e4ce89af4f64916150bff9eecb9faa5c": { + "balance": "0x1b1ae4d6e2ef500000" }, - "740f641614779dcfa88ed1d425d60db42a060ca6": { - "balance": "998630000000000000000" + "0x740f641614779dcfa88ed1d425d60db42a060ca6": { + "balance": "0x3622c6760810570000" }, - "a4e623451e7e94e7e89ba5ed95c8a83a62ffc4ea": { - "balance": "20000000000000000000" + "0xa4e623451e7e94e7e89ba5ed95c8a83a62ffc4ea": { + "balance": "0x1158e460913d00000" }, - "25a500eeec7a662a841552b5168b707b0de21e9e": { - "balance": "10020000000000000000000" + "0x25a500eeec7a662a841552b5168b707b0de21e9e": { + "balance": "0x21f2f6f0fc3c6100000" }, - "185a7fc4ace368d233e620b2a45935661292bdf2": { - "balance": "20000000000000000000000" + "0x185a7fc4ace368d233e620b2a45935661292bdf2": { + "balance": "0x43c33c1937564800000" }, - "9b68f67416a63bf4451a31164c92f672a68759e9": { - "balance": "60000000000000000000000" + "0x9b68f67416a63bf4451a31164c92f672a68759e9": { + "balance": "0xcb49b44ba602d800000" }, - "a38b5bd81a9db9d2b21d5ec7c60552cd02ed561b": { - "balance": "6000000000000000000000" + "0xa38b5bd81a9db9d2b21d5ec7c60552cd02ed561b": { + "balance": "0x14542ba12a337c00000" }, - "61c830f1654718f075ccaba316faacb85b7d120b": { - "balance": "400000000000000000000" + "0x61c830f1654718f075ccaba316faacb85b7d120b": { + "balance": "0x15af1d78b58c400000" }, - "8392e53776713578015bff4940cf43849d7dcba1": { - "balance": "153190000000000000000" + "0x8392e53776713578015bff4940cf43849d7dcba1": { + "balance": "0x84df0355d56170000" }, - "dc57477dafa42f705c7fe40eae9c81756e0225f1": { - "balance": "500044000000000000000" + "0xdc57477dafa42f705c7fe40eae9c81756e0225f1": { + "balance": "0x1b1b8128a7416e0000" }, - "febc3173bc9072136354002b7b4fb3bfc53f22f1": { - "balance": "370000000000000000000" + "0xfebc3173bc9072136354002b7b4fb3bfc53f22f1": { + "balance": "0x140ec80fa7ee880000" }, - "d78f84e38944a0e0255faece48ba4950d4bd39d2": { - "balance": "5000000000000000000000" + "0xd78f84e38944a0e0255faece48ba4950d4bd39d2": { + "balance": "0x10f0cf064dd59200000" }, - "a7a3bb6139b0ada00c1f7f1f9f56d994ba4d1fa8": { - "balance": "2000000000000000000000" + "0xa7a3bb6139b0ada00c1f7f1f9f56d994ba4d1fa8": { + "balance": "0x6c6b935b8bbd400000" }, - "aa3f29601a1331745e05c42830a15e71938a6237": { - "balance": "1700000000000000000000" + "0xaa3f29601a1331745e05c42830a15e71938a6237": { + "balance": "0x5c283d410394100000" }, - "bec6640f4909b58cbf1e806342961d607595096c": { - "balance": "1999944000000000000000" + "0xbec6640f4909b58cbf1e806342961d607595096c": { + "balance": "0x6c6acc67d7b1d40000" }, - "9be3c329b62a28b8b0886cbd8b99f8bc930ce3e6": { - "balance": "74500000000000000000" + "0x9be3c329b62a28b8b0886cbd8b99f8bc930ce3e6": { + "balance": "0x409e52b48369a0000" }, - "e3eb2c0a132a524f72ccc0d60fee8b41685d39e2": { - "balance": "1970000000000000000000" + "0xe3eb2c0a132a524f72ccc0d60fee8b41685d39e2": { + "balance": "0x6acb3df27e1f880000" }, - "90b1f370f9c1eb0be0fb8e2b8ad96a416371dd8a": { - "balance": "900000000000000000000" + "0x90b1f370f9c1eb0be0fb8e2b8ad96a416371dd8a": { + "balance": "0x30ca024f987b900000" }, - "f2742e6859c569d5f2108351e0bf4dca352a48a8": { - "balance": "10000000000000000000000" + "0xf2742e6859c569d5f2108351e0bf4dca352a48a8": { + "balance": "0x21e19e0c9bab2400000" }, - "b134c004391ab4992878337a51ec242f42285742": { - "balance": "2000000000000000000000" + "0xb134c004391ab4992878337a51ec242f42285742": { + "balance": "0x6c6b935b8bbd400000" }, - "ab7416ff32254951cbbc624ec7fb45fc7ecaa872": { - "balance": "340000000000000000000" + "0xab7416ff32254951cbbc624ec7fb45fc7ecaa872": { + "balance": "0x126e72a69a50d00000" }, - "9795f64319fc17dd0f8261f9d206fb66b64cd0c9": { - "balance": "200000000000000000000" + "0x9795f64319fc17dd0f8261f9d206fb66b64cd0c9": { + "balance": "0xad78ebc5ac6200000" }, - "64e03ef070a54703b7184e48276c5c0077ef4b34": { - "balance": "320000000000000000000" + "0x64e03ef070a54703b7184e48276c5c0077ef4b34": { + "balance": "0x1158e460913d000000" }, - "3430a16381f869f6ea5423915855e800883525a9": { - "balance": "17900000000000000000000" + "0x3430a16381f869f6ea5423915855e800883525a9": { + "balance": "0x3ca5c66d9bc44300000" }, - "f4a367b166d2991a2bfda9f56463a09f252c1b1d": { - "balance": "1970000000000000000000" + "0xf4a367b166d2991a2bfda9f56463a09f252c1b1d": { + "balance": "0x6acb3df27e1f880000" }, - "77c4a697e603d42b12056cbba761e7f51d0443f5": { - "balance": "680000000000000000000" + "0x77c4a697e603d42b12056cbba761e7f51d0443f5": { + "balance": "0x24dce54d34a1a00000" }, - "153ef58a1e2e7a3eb6b459a80ab2a547c94182a2": { - "balance": "96000000000000000000000" + "0x153ef58a1e2e7a3eb6b459a80ab2a547c94182a2": { + "balance": "0x14542ba12a337c000000" }, - "6dbe8abfa1742806263981371bf3d35590806b6e": { - "balance": "20000000000000000000000" + "0x6dbe8abfa1742806263981371bf3d35590806b6e": { + "balance": "0x43c33c1937564800000" }, - "4c99dae96481e807c1f99f8b7fbde29b7547c5bf": { - "balance": "150000000000000000000" + "0x4c99dae96481e807c1f99f8b7fbde29b7547c5bf": { + "balance": "0x821ab0d4414980000" }, - "d5b9d277d8aad20697a51f76e20978996bffe055": { - "balance": "143250000000000000000" + "0xd5b9d277d8aad20697a51f76e20978996bffe055": { + "balance": "0x7c3fe3c076ab50000" }, - "0f24105abbdaa03fa6309ef6c188e51f714a6e59": { - "balance": "200000000000000000000" + "0x0f24105abbdaa03fa6309ef6c188e51f714a6e59": { + "balance": "0xad78ebc5ac6200000" }, - "1cb6b2d7cfc559b7f41e6f56ab95c7c958cd0e4c": { - "balance": "1337000000000000000000" + "0x1cb6b2d7cfc559b7f41e6f56ab95c7c958cd0e4c": { + "balance": "0x487a9a304539440000" }, - "f37b426547a1642d8033324814f0ede3114fc212": { - "balance": "401100000000000000000" + "0xf37b426547a1642d8033324814f0ede3114fc212": { + "balance": "0x15be6174e1912e0000" }, - "318f1f8bd220b0558b95fb33100ffdbb640d7ca6": { - "balance": "4000000000000000000000" + "0x318f1f8bd220b0558b95fb33100ffdbb640d7ca6": { + "balance": "0xd8d726b7177a800000" }, - "206d55d5792a514ec108e090599f2a065e501185": { - "balance": "200550000000000000000" + "0x206d55d5792a514ec108e090599f2a065e501185": { + "balance": "0xadf30ba70c8970000" }, - "11d2247a221e70c2d66d17ee138d38c55ffb8640": { - "balance": "10000000000000000000000" + "0x11d2247a221e70c2d66d17ee138d38c55ffb8640": { + "balance": "0x21e19e0c9bab2400000" }, - "e8de725eca5def805ff7941d31ac1c2e342dfe95": { - "balance": "2462500000000000000000" + "0xe8de725eca5def805ff7941d31ac1c2e342dfe95": { + "balance": "0x857e0d6f1da76a0000" }, - "d561cbbc05515de73ab8cf9eae1357341e7dfdf4": { - "balance": "6000000000000000000000" + "0xd561cbbc05515de73ab8cf9eae1357341e7dfdf4": { + "balance": "0x14542ba12a337c00000" }, - "0455dcec8a7fc4461bfd7f37456fce3f4c3caac7": { - "balance": "400000000000000000000" + "0x0455dcec8a7fc4461bfd7f37456fce3f4c3caac7": { + "balance": "0x15af1d78b58c400000" }, - "5161fd49e847f67455f1c8bb7abb36e985260d03": { - "balance": "1200000000000000000000" + "0x5161fd49e847f67455f1c8bb7abb36e985260d03": { + "balance": "0x410d586a20a4c00000" }, - "8e073bad25e42218615f4a0e6b2ea8f8de2230c0": { - "balance": "2402500000000000000000" + "0x8e073bad25e42218615f4a0e6b2ea8f8de2230c0": { + "balance": "0x823d629d026bfa0000" }, - "6c08a6dc0173c7342955d1d3f2c065d62f83aec7": { - "balance": "20000000000000000000" + "0x6c08a6dc0173c7342955d1d3f2c065d62f83aec7": { + "balance": "0x1158e460913d00000" }, - "95cb6d8a6379f94aba8b885669562c4d448e56a7": { - "balance": "2000000000000000000000" + "0x95cb6d8a6379f94aba8b885669562c4d448e56a7": { + "balance": "0x6c6b935b8bbd400000" }, - "2805415e1d7fdec6dedfb89e521d10592d743c10": { - "balance": "100000000000000000000" + "0x2805415e1d7fdec6dedfb89e521d10592d743c10": { + "balance": "0x56bc75e2d63100000" }, - "daacdaf42226d15cb1cf98fa15048c7f4ceefe69": { - "balance": "300000000000000000000" + "0xdaacdaf42226d15cb1cf98fa15048c7f4ceefe69": { + "balance": "0x1043561a8829300000" }, - "e33df4ce80ccb62a76b12bcdfcecc46289973aa9": { - "balance": "6000000000000000000000" + "0xe33df4ce80ccb62a76b12bcdfcecc46289973aa9": { + "balance": "0x14542ba12a337c00000" }, - "8f8cd26e82e7c6defd02dfad07979021cbf7150c": { - "balance": "3000000000000000000000" + "0x8f8cd26e82e7c6defd02dfad07979021cbf7150c": { + "balance": "0xa2a15d09519be00000" }, - "77a17122fa31b98f1711d32a99f03ec326f33d08": { - "balance": "1700000000000000000000" + "0x77a17122fa31b98f1711d32a99f03ec326f33d08": { + "balance": "0x5c283d410394100000" }, - "6f791d359bc3536a315d6382b88311af8ed6da47": { - "balance": "92000000000000000000" + "0x6f791d359bc3536a315d6382b88311af8ed6da47": { + "balance": "0x4fcc1a89027f00000" }, - "de30e49e5ab313214d2f01dcabce8940b81b1c76": { - "balance": "197000000000000000000" + "0xde30e49e5ab313214d2f01dcabce8940b81b1c76": { + "balance": "0xaadec983fcff40000" }, - "cf9be9b9ab86c66b59968e67b8d4dcff46b1814a": { - "balance": "660000000000000000000" + "0xcf9be9b9ab86c66b59968e67b8d4dcff46b1814a": { + "balance": "0x23c757072b8dd00000" }, - "7fdfc88d78bf1b285ac64f1adb35dc11fcb03951": { - "balance": "2287900000000000000000" + "0x7fdfc88d78bf1b285ac64f1adb35dc11fcb03951": { + "balance": "0x7c06fda02fb0360000" }, - "c5134cfbb1df7a20b0ed7057622eeed280947dad": { - "balance": "3800000000000000000000" + "0xc5134cfbb1df7a20b0ed7057622eeed280947dad": { + "balance": "0xcdff97fabcb4600000" }, - "fa9ec8efe08686fa58c181335872ba698560ecab": { - "balance": "1999944000000000000000" + "0xfa9ec8efe08686fa58c181335872ba698560ecab": { + "balance": "0x6c6acc67d7b1d40000" }, - "f6a8635757c5e8c134d20d028cf778cf8609e46a": { - "balance": "1459416000000000000000" + "0xf6a8635757c5e8c134d20d028cf778cf8609e46a": { + "balance": "0x4f1d772faec17c0000" }, - "6265b2e7730f36b776b52d0c9d02ada55d8e3cb6": { - "balance": "1000000000000000000000" + "0x6265b2e7730f36b776b52d0c9d02ada55d8e3cb6": { + "balance": "0x3635c9adc5dea00000" }, - "6a8cea2de84a8df997fd3f84e3083d93de57cda9": { - "balance": "100007000000000000000" + "0x6a8cea2de84a8df997fd3f84e3083d93de57cda9": { + "balance": "0x56be03ca3e47d8000" }, - "1b7ed974b6e234ce81247498429a5bd4a0a2d139": { - "balance": "2000000000000000000000" + "0x1b7ed974b6e234ce81247498429a5bd4a0a2d139": { + "balance": "0x6c6b935b8bbd400000" }, - "9ba53dc8c95e9a472feba2c4e32c1dc4dd7bab46": { - "balance": "1337000000000000000000" + "0x9ba53dc8c95e9a472feba2c4e32c1dc4dd7bab46": { + "balance": "0x487a9a304539440000" }, - "d7b740dff8c457668fdf74f6a266bfc1dcb723f9": { - "balance": "20000000000000000000" + "0xd7b740dff8c457668fdf74f6a266bfc1dcb723f9": { + "balance": "0x1158e460913d00000" }, - "07bc2cc8eedc01970700efc9c4fb36735e98cd71": { - "balance": "4000000000000000000000" + "0x07bc2cc8eedc01970700efc9c4fb36735e98cd71": { + "balance": "0xd8d726b7177a800000" }, - "3e1c962063e0d5295941f210dca3ab531eec8809": { - "balance": "3000000000000000000000" + "0x3e1c962063e0d5295941f210dca3ab531eec8809": { + "balance": "0xa2a15d09519be00000" }, - "b447571dacbb3ecbb6d1cf0b0c8f3838e52324e2": { - "balance": "30199000000000000000" + "0xb447571dacbb3ecbb6d1cf0b0c8f3838e52324e2": { + "balance": "0x1a318667fb4058000" }, - "87764e3677eef604cbc59aed24abdc566b09fc25": { - "balance": "3000000000000000000000" + "0x87764e3677eef604cbc59aed24abdc566b09fc25": { + "balance": "0xa2a15d09519be00000" }, - "03aa622881236dd0f4940c24c324ff8b7b7e2186": { - "balance": "3200000000000000000000" + "0x03aa622881236dd0f4940c24c324ff8b7b7e2186": { + "balance": "0xad78ebc5ac62000000" }, - "a4a7d306f510cd58359428c0d2f7c3609d5674d7": { - "balance": "3349000000000000000000" + "0xa4a7d306f510cd58359428c0d2f7c3609d5674d7": { + "balance": "0xb58cb61c3ccf340000" }, - "3c83c1701db0388b68210d00f5717cd9bd322c6a": { - "balance": "30000000000000000000000" + "0x3c83c1701db0388b68210d00f5717cd9bd322c6a": { + "balance": "0x65a4da25d3016c00000" }, - "047d5a26d7ad8f8e70600f70a398ddaa1c2db26f": { - "balance": "6000000000000000000000" + "0x047d5a26d7ad8f8e70600f70a398ddaa1c2db26f": { + "balance": "0x14542ba12a337c00000" }, - "43767bf7fd2af95b72e9312da9443cb1688e4343": { - "balance": "300000000000000000000" + "0x43767bf7fd2af95b72e9312da9443cb1688e4343": { + "balance": "0x1043561a8829300000" }, - "34a85d6d243fb1dfb7d1d2d44f536e947a4cee9e": { - "balance": "20000000000000000000000" + "0x34a85d6d243fb1dfb7d1d2d44f536e947a4cee9e": { + "balance": "0x43c33c1937564800000" }, - "65a9dad42e1632ba3e4e49623fab62a17e4d3611": { - "balance": "93120000000000000000" + "0x65a9dad42e1632ba3e4e49623fab62a17e4d3611": { + "balance": "0x50c4cb2a10c600000" }, - "48e0cbd67f18acdb7a6291e1254db32e0972737f": { - "balance": "100007000000000000000" + "0x48e0cbd67f18acdb7a6291e1254db32e0972737f": { + "balance": "0x56be03ca3e47d8000" }, - "a5de5e434fdcdd688f1c31b6fb512cb196724701": { - "balance": "800000000000000000000" + "0xa5de5e434fdcdd688f1c31b6fb512cb196724701": { + "balance": "0x2b5e3af16b18800000" }, - "6d63d38ee8b90e0e6ed8f192eda051b2d6a58bfd": { - "balance": "30000000000000000000" + "0x6d63d38ee8b90e0e6ed8f192eda051b2d6a58bfd": { + "balance": "0x1a055690d9db80000" }, - "b079bb4d9866143a6da72ae7ac0022062981315c": { - "balance": "760000000000000000000" + "0xb079bb4d9866143a6da72ae7ac0022062981315c": { + "balance": "0x29331e6558f0e00000" }, - "c0413f5a7c2d9a4b8108289ef6ecd271781524f4": { - "balance": "50000000000000000000000" + "0xc0413f5a7c2d9a4b8108289ef6ecd271781524f4": { + "balance": "0xa968163f0a57b400000" }, - "a91a5a7b341f99c535144e20be9c6b3bb4c28e4d": { - "balance": "5431790000000000000000" + "0xa91a5a7b341f99c535144e20be9c6b3bb4c28e4d": { + "balance": "0x126753aa224a70b0000" }, - "993f146178605e66d517be782ef0b3c61a4e1925": { - "balance": "7011998000000000000000" + "0x993f146178605e66d517be782ef0b3c61a4e1925": { + "balance": "0x17c1f0535d7a5830000" }, - "966c04781cb5e67dde3235d7f8620e1ab663a9a5": { - "balance": "75800000000000000000000" + "0x966c04781cb5e67dde3235d7f8620e1ab663a9a5": { + "balance": "0x100d2050da6351600000" }, - "b3f82a87e59a39d0d2808f0751eb72c2329cdcc5": { - "balance": "5000000000000000000000" + "0xb3f82a87e59a39d0d2808f0751eb72c2329cdcc5": { + "balance": "0x10f0cf064dd59200000" }, - "9b77ebced7e215f0920e8c2b870024f6ecb2ff31": { - "balance": "1000000000000000000000" + "0x9b77ebced7e215f0920e8c2b870024f6ecb2ff31": { + "balance": "0x3635c9adc5dea00000" }, - "fe697ff22ca547bfc95e33d960da605c6763f35b": { - "balance": "1325000000000000000000" + "0xfe697ff22ca547bfc95e33d960da605c6763f35b": { + "balance": "0x47d4119fd960940000" }, - "480af52076009ca73781b70e43b95916a62203ab": { - "balance": "924171000000000000000" + "0x480af52076009ca73781b70e43b95916a62203ab": { + "balance": "0x321972f4083d878000" }, - "a9dc0424c6969d798358b393b1933a1f51bee00a": { - "balance": "20000000000000000000000" + "0xa9dc0424c6969d798358b393b1933a1f51bee00a": { + "balance": "0x43c33c1937564800000" }, - "7aba56f63a48bc0817d6b97039039a7ad62fae2e": { - "balance": "600000000000000000000" + "0x7aba56f63a48bc0817d6b97039039a7ad62fae2e": { + "balance": "0x2086ac351052600000" }, - "59d139e2e40c7b97239d23dfaca33858f602d22b": { - "balance": "2000000000000000000000" + "0x59d139e2e40c7b97239d23dfaca33858f602d22b": { + "balance": "0x6c6b935b8bbd400000" }, - "8d6170ff66978e773bb621bf72b1ba7be3a7f87e": { - "balance": "200000000000000000000" + "0x8d6170ff66978e773bb621bf72b1ba7be3a7f87e": { + "balance": "0xad78ebc5ac6200000" }, - "d668523a90f0293d65c538d2dd6c57673710196e": { - "balance": "39500000000000000000" + "0xd668523a90f0293d65c538d2dd6c57673710196e": { + "balance": "0x2242c30b853ee0000" }, - "bbb5a0f4802c8648009e8a6998af352cde87544f": { - "balance": "95500000000000000000" + "0xbbb5a0f4802c8648009e8a6998af352cde87544f": { + "balance": "0x52d542804f1ce0000" }, - "fc43829ac787ff88aaf183ba352aadbf5a15b193": { - "balance": "3960000000000000000000" + "0xfc43829ac787ff88aaf183ba352aadbf5a15b193": { + "balance": "0xd6ac0a2b0552e00000" }, - "fe22a0b388668d1ae2643e771dacf38a434223cc": { - "balance": "4000304000000000000000" + "0xfe22a0b388668d1ae2643e771dacf38a434223cc": { + "balance": "0xd8db5ebd7b26380000" }, - "092acb624b08c05510189bbbe21e6524d644ccad": { - "balance": "18200000000000000000" + "0x092acb624b08c05510189bbbe21e6524d644ccad": { + "balance": "0xfc936392801c0000" }, - "8f0538ed71da1155e0f3bde5667ceb84318a1a87": { - "balance": "1940000000000000000000" + "0x8f0538ed71da1155e0f3bde5667ceb84318a1a87": { + "balance": "0x692ae8897081d00000" }, - "06994cd83aa2640a97b2600b41339d1e0d3ede6c": { - "balance": "250000000000000000000" + "0x06994cd83aa2640a97b2600b41339d1e0d3ede6c": { + "balance": "0xd8d726b7177a80000" }, - "9d460c1b379ddb19a8c85b4c6747050ddf17a875": { - "balance": "3340000000000000000000" + "0x9d460c1b379ddb19a8c85b4c6747050ddf17a875": { + "balance": "0xb50fcfafebecb00000" }, - "77a769fafdecf4a638762d5ba3969df63120a41d": { - "balance": "2000000000000000000000" + "0x77a769fafdecf4a638762d5ba3969df63120a41d": { + "balance": "0x6c6b935b8bbd400000" }, - "5f375b86600c40cca8b2676b7a1a1d1644c5f52c": { - "balance": "78838000000000000000" + "0x5f375b86600c40cca8b2676b7a1a1d1644c5f52c": { + "balance": "0x44618d74c623f0000" }, - "15ee0fc63ebf1b1fc49d7bb38f8863823a2e17d2": { - "balance": "1910000000000000000000" + "0x15ee0fc63ebf1b1fc49d7bb38f8863823a2e17d2": { + "balance": "0x678a932062e4180000" }, - "6651736fb59b91fee9c93aa0bd6ea2f7b2506180": { - "balance": "500000000000000000000" + "0x6651736fb59b91fee9c93aa0bd6ea2f7b2506180": { + "balance": "0x1b1ae4d6e2ef500000" }, - "361d9ed80b5bd27cf9f1226f26753258ee5f9b3f": { - "balance": "3530900000000000000000" + "0x361d9ed80b5bd27cf9f1226f26753258ee5f9b3f": { + "balance": "0xbf6914ba7d72c20000" }, - "c9b6b686111691ee6aa197c7231a88dc60bd295d": { - "balance": "500000000000000000000" + "0xc9b6b686111691ee6aa197c7231a88dc60bd295d": { + "balance": "0x1b1ae4d6e2ef500000" }, - "e9b4a4853577a9dbcc2e795be0310d1bed28641a": { - "balance": "1000000000000000000000" + "0xe9b4a4853577a9dbcc2e795be0310d1bed28641a": { + "balance": "0x3635c9adc5dea00000" }, - "36758e049cd98bcea12277a676f9297362890023": { - "balance": "4000000000000000000000" + "0x36758e049cd98bcea12277a676f9297362890023": { + "balance": "0xd8d726b7177a800000" }, - "6bb50813146a9add42ee22038c9f1f7469d47f47": { - "balance": "200200000000000000000" + "0x6bb50813146a9add42ee22038c9f1f7469d47f47": { + "balance": "0xada55474b81340000" }, - "6de4b581385cf7fc9fe8c77d131fe2ee7724c76a": { - "balance": "2308840000000000000000" + "0x6de4b581385cf7fc9fe8c77d131fe2ee7724c76a": { + "balance": "0x7d2997733dcce40000" }, - "d2a5a024230a57ccc666760b89b0e26cafd189c7": { - "balance": "49997115000000000000000" + "0xd2a5a024230a57ccc666760b89b0e26cafd189c7": { + "balance": "0xa96595a5c6e8a3f8000" }, - "65af9087e05167715497c9a5a749189489004def": { - "balance": "835000000000000000000" + "0x65af9087e05167715497c9a5a749189489004def": { + "balance": "0x2d43f3ebfafb2c0000" }, - "ead21c1deccfbf1c5cd96688a2476b69ba07ce4a": { - "balance": "72800000000000000000" + "0xead21c1deccfbf1c5cd96688a2476b69ba07ce4a": { + "balance": "0x3f24d8e4a00700000" }, - "e308435204793764f5fcbe65eb510f5a744a655a": { - "balance": "200000000000000000000" + "0xe308435204793764f5fcbe65eb510f5a744a655a": { + "balance": "0xad78ebc5ac6200000" }, - "9376dce2af2ec8dcda741b7e7345664681d93668": { - "balance": "1000000000000000000000" + "0x9376dce2af2ec8dcda741b7e7345664681d93668": { + "balance": "0x3635c9adc5dea00000" }, - "a1b47c4d0ed6018842e6cfc8630ac3a3142e5e6b": { - "balance": "20000000000000000000" + "0xa1b47c4d0ed6018842e6cfc8630ac3a3142e5e6b": { + "balance": "0x1158e460913d00000" }, - "e2198c8ca1b399f7521561fd5384a7132fba486b": { - "balance": "1015200000000000000000" + "0xe2198c8ca1b399f7521561fd5384a7132fba486b": { + "balance": "0x3708baed3d68900000" }, - "92c13fe0d6ce87fd50e03def9fa6400509bd7073": { - "balance": "40000000000000000000" + "0x92c13fe0d6ce87fd50e03def9fa6400509bd7073": { + "balance": "0x22b1c8c1227a00000" }, - "7517f16c28d132bb40e3ba36c6aef131c462da17": { - "balance": "18200000000000000000" + "0x7517f16c28d132bb40e3ba36c6aef131c462da17": { + "balance": "0xfc936392801c0000" }, - "6a023af57d584d845e698736f130db9db40dfa9a": { - "balance": "98800000000000000000" + "0x6a023af57d584d845e698736f130db9db40dfa9a": { + "balance": "0x55b201c8900980000" }, - "1518627b88351fede796d3f3083364fbd4887b0c": { - "balance": "16000000000000000000000" + "0x1518627b88351fede796d3f3083364fbd4887b0c": { + "balance": "0x3635c9adc5dea000000" }, - "f5b6e9061a4eb096160777e26762cf48bdd8b55d": { - "balance": "254030000000000000000" + "0xf5b6e9061a4eb096160777e26762cf48bdd8b55d": { + "balance": "0xdc55fdb17647b0000" }, - "28073efc17d05cab3195c2db332b61984777a612": { - "balance": "1000000000000000000000" + "0x28073efc17d05cab3195c2db332b61984777a612": { + "balance": "0x3635c9adc5dea00000" }, - "f06a854a3c5dc36d1c49f4c87d6db333b57e4add": { - "balance": "10000000000000000000000" + "0xf06a854a3c5dc36d1c49f4c87d6db333b57e4add": { + "balance": "0x21e19e0c9bab2400000" }, - "9225983860a1cb4623c72480ac16272b0c95e5f5": { - "balance": "2000000000000000000000" + "0x9225983860a1cb4623c72480ac16272b0c95e5f5": { + "balance": "0x6c6b935b8bbd400000" }, - "5260dc51ee07bddaababb9ee744b393c7f4793a6": { - "balance": "34040000000000000000" + "0x5260dc51ee07bddaababb9ee744b393c7f4793a6": { + "balance": "0x1d8665fa5fa4c0000" }, - "0f127bbf8e311caea2ba502a33feced3f730ba42": { - "balance": "188000000000000000000" + "0x0f127bbf8e311caea2ba502a33feced3f730ba42": { + "balance": "0xa31062beeed700000" }, - "17d521a8d9779023f7164d233c3b6420ffd223ed": { - "balance": "20000000000000000000" + "0x17d521a8d9779023f7164d233c3b6420ffd223ed": { + "balance": "0x1158e460913d00000" }, - "8c2b7d8b608d28b77f5caa9cd645242a823e4cd9": { - "balance": "1820000000000000000000" + "0x8c2b7d8b608d28b77f5caa9cd645242a823e4cd9": { + "balance": "0x62a992e53a0af00000" }, - "6e866d032d405abdd65cf651411d803796c22311": { - "balance": "2000000000000000000000" + "0x6e866d032d405abdd65cf651411d803796c22311": { + "balance": "0x6c6b935b8bbd400000" }, - "dc51b2dc9d247a1d0e5bc36ca3156f7af21ff9f6": { - "balance": "1000000000000000000000" + "0xdc51b2dc9d247a1d0e5bc36ca3156f7af21ff9f6": { + "balance": "0x3635c9adc5dea00000" }, - "c84d9bea0a7b9f140220fd8b9097cfbfd5edf564": { - "balance": "123047000000000000000" + "0xc84d9bea0a7b9f140220fd8b9097cfbfd5edf564": { + "balance": "0x6ab9ec291ad7d8000" }, - "ff86e5e8e15b53909600e41308dab75f0e24e46b": { - "balance": "902400000000000000000" + "0xff86e5e8e15b53909600e41308dab75f0e24e46b": { + "balance": "0x30eb50d2e140800000" }, - "d7164aa261c09ad9b2b5068d453ed8eb6aa13083": { - "balance": "3000000000000000000000" + "0xd7164aa261c09ad9b2b5068d453ed8eb6aa13083": { + "balance": "0xa2a15d09519be00000" }, - "76aaf8c1ac012f8752d4c09bb46607b6651d5ca8": { - "balance": "20000000000000000000" + "0x76aaf8c1ac012f8752d4c09bb46607b6651d5ca8": { + "balance": "0x1158e460913d00000" }, - "41786a10d447f484d33244ccb7facd8b427b5b8c": { - "balance": "1000000000000000000000" + "0x41786a10d447f484d33244ccb7facd8b427b5b8c": { + "balance": "0x3635c9adc5dea00000" }, - "2e0c57b47150f95aa6a7e16ab9b1cbf54328979a": { - "balance": "100000000000000000000" + "0x2e0c57b47150f95aa6a7e16ab9b1cbf54328979a": { + "balance": "0x56bc75e2d63100000" }, - "3f747237806fed3f828a6852eb0867f79027af89": { - "balance": "1500000000000000000000" + "0x3f747237806fed3f828a6852eb0867f79027af89": { + "balance": "0x5150ae84a8cdf00000" }, - "a568db4d57e4d67462d733c69a9e0fe26e218327": { - "balance": "1096140000000000000000" + "0xa568db4d57e4d67462d733c69a9e0fe26e218327": { + "balance": "0x3b6bff9266c0ae0000" }, - "1f88f8a1338fc7c10976abcd3fb8d38554b5ec9c": { - "balance": "13400000000000000000" + "0x1f88f8a1338fc7c10976abcd3fb8d38554b5ec9c": { + "balance": "0xb9f65d00f63c0000" }, - "d1ea4d72a67b5b3e0f315559f52bd0614d713069": { - "balance": "2000000000000000000000" + "0xd1ea4d72a67b5b3e0f315559f52bd0614d713069": { + "balance": "0x6c6b935b8bbd400000" }, - "bfaeb91067617dcf8b44172b02af615674835dba": { - "balance": "160661000000000000000" + "0xbfaeb91067617dcf8b44172b02af615674835dba": { + "balance": "0x8b59e884813088000" }, - "b71a13ba8e95167b80331b52d69e37054fe7a826": { - "balance": "200000000000000000000" + "0xb71a13ba8e95167b80331b52d69e37054fe7a826": { + "balance": "0xad78ebc5ac6200000" }, - "b67a80f170197d96cdcc4ab6cba627b4afa6e12c": { - "balance": "2400000000000000000000" + "0xb67a80f170197d96cdcc4ab6cba627b4afa6e12c": { + "balance": "0x821ab0d44149800000" }, - "35af040a0cc2337a76af288154c7561e1a233349": { - "balance": "1000000000000000000000" + "0x35af040a0cc2337a76af288154c7561e1a233349": { + "balance": "0x3635c9adc5dea00000" }, - "c86190904b8d079ec010e462cbffc90834ffaa5c": { - "balance": "10100000000000000000000" + "0xc86190904b8d079ec010e462cbffc90834ffaa5c": { + "balance": "0x22385a827e815500000" }, - "383304dd7a5720b29c1a10f60342219f48032f80": { - "balance": "5600000000000000000000" + "0x383304dd7a5720b29c1a10f60342219f48032f80": { + "balance": "0x12f939c99edab800000" }, - "191313525238a21c767457a91374f02200c55448": { - "balance": "116400000000000000000" + "0x191313525238a21c767457a91374f02200c55448": { + "balance": "0x64f5fdf494f780000" }, - "cc4a2f2cf86cf3e43375f360a4734691195f1490": { - "balance": "1348127000000000000000" + "0xcc4a2f2cf86cf3e43375f360a4734691195f1490": { + "balance": "0x4915053bd129098000" }, - "4e020779b5ddd3df228a00cb48c2fc979da6ae38": { - "balance": "2000000000000000000000" + "0x4e020779b5ddd3df228a00cb48c2fc979da6ae38": { + "balance": "0x6c6b935b8bbd400000" }, - "e206fb7324e9deb79e19903496d6961b9be56603": { - "balance": "100000000000000000000" + "0xe206fb7324e9deb79e19903496d6961b9be56603": { + "balance": "0x56bc75e2d63100000" }, - "3ae160e3cd60ae31b9d6742d68e14e76bd96c517": { - "balance": "30000000000000000000" + "0x3ae160e3cd60ae31b9d6742d68e14e76bd96c517": { + "balance": "0x1a055690d9db80000" }, - "1f7d8e86d6eeb02545aad90e91327bd369d7d2f3": { - "balance": "20000000000000000000" + "0x1f7d8e86d6eeb02545aad90e91327bd369d7d2f3": { + "balance": "0x1158e460913d00000" }, - "68c7d1711b011a33f16f1f55b5c902cce970bdd7": { - "balance": "152000000000000000000" + "0x68c7d1711b011a33f16f1f55b5c902cce970bdd7": { + "balance": "0x83d6c7aab63600000" }, - "637be71b3aa815ff453d5642f73074450b64c82a": { - "balance": "2000000000000000000000" + "0x637be71b3aa815ff453d5642f73074450b64c82a": { + "balance": "0x6c6b935b8bbd400000" }, - "1584a2c066b7a455dbd6ae2807a7334e83c35fa5": { - "balance": "130000000000000000000" + "0x1584a2c066b7a455dbd6ae2807a7334e83c35fa5": { + "balance": "0x70c1cc73b00c80000" }, - "9c05e9d0f0758e795303717e31da213ca157e686": { - "balance": "1000000000000000000000" + "0x9c05e9d0f0758e795303717e31da213ca157e686": { + "balance": "0x3635c9adc5dea00000" }, - "4f1a2da54a4c6da19d142412e56e815741db2325": { - "balance": "100000000000000000000" + "0x4f1a2da54a4c6da19d142412e56e815741db2325": { + "balance": "0x56bc75e2d63100000" }, - "9a4ca8b82117894e43db72b9fa78f0b9b93ace09": { - "balance": "50000000000000000000" + "0x9a4ca8b82117894e43db72b9fa78f0b9b93ace09": { + "balance": "0x2b5e3af16b1880000" }, - "26c99f8849c9802b83c861217fd07a9e84cdb79d": { - "balance": "300000000000000000000" + "0x26c99f8849c9802b83c861217fd07a9e84cdb79d": { + "balance": "0x1043561a8829300000" }, - "45c0d19f0b8e054f9e893836d5ecae7901af2812": { - "balance": "5000000000000000000000" + "0x45c0d19f0b8e054f9e893836d5ecae7901af2812": { + "balance": "0x10f0cf064dd59200000" }, - "00dc01cbf44978a42e8de8e436edf94205cfb6ec": { - "balance": "1458440000000000000000" + "0x00dc01cbf44978a42e8de8e436edf94205cfb6ec": { + "balance": "0x4f0febbcda8cb40000" }, - "de7dee220f0457a7187d56c1c41f2eb00ac56021": { - "balance": "629924000000000000000" + "0xde7dee220f0457a7187d56c1c41f2eb00ac56021": { + "balance": "0x2225f39c85052a0000" }, - "1c128bd6cda5fca27575e4b43b3253c8c4172afe": { - "balance": "2000000000000000000000" + "0x1c128bd6cda5fca27575e4b43b3253c8c4172afe": { + "balance": "0x6c6b935b8bbd400000" }, - "666746fb93d1935c5a3c684e725010c4fad0b1d8": { - "balance": "20000000000000000000" + "0x666746fb93d1935c5a3c684e725010c4fad0b1d8": { + "balance": "0x1158e460913d00000" }, - "51d78b178d707e396e8710965c4f41b1a1d9179d": { - "balance": "110600000000000000000" + "0x51d78b178d707e396e8710965c4f41b1a1d9179d": { + "balance": "0x5fee222041e340000" }, - "68f7573cd457e14c03fea43e302d30347c10705c": { - "balance": "5000000000000000000000" + "0x68f7573cd457e14c03fea43e302d30347c10705c": { + "balance": "0x10f0cf064dd59200000" }, - "9d30cb237bc096f17036fc80dd21ca68992ca2d9": { - "balance": "30380000000000000000000" + "0x9d30cb237bc096f17036fc80dd21ca68992ca2d9": { + "balance": "0x66ee7318fdc8f300000" }, - "fbcfcc4a7b0f26cf26e9f3332132e2fc6a230766": { - "balance": "8000000000000000000000" + "0xfbcfcc4a7b0f26cf26e9f3332132e2fc6a230766": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "b166e37d2e501ae73c84142b5ffb5aa655dd5a99": { - "balance": "1999000000000000000000" + "0xb166e37d2e501ae73c84142b5ffb5aa655dd5a99": { + "balance": "0x6c5db2a4d815dc0000" }, - "6df24f6685a62f791ba337bf3ff67e91f3d4bc3a": { - "balance": "2166000000000000000000" + "0x6df24f6685a62f791ba337bf3ff67e91f3d4bc3a": { + "balance": "0x756b49d40a48180000" }, - "92e435340e9d253c00256389f52b067d55974e76": { - "balance": "268000000000000000000" + "0x92e435340e9d253c00256389f52b067d55974e76": { + "balance": "0xe873f44133cb00000" }, - "ea53d26564859d9e90bb0e53b7abf560e0162c38": { - "balance": "400000000000000000000" + "0xea53d26564859d9e90bb0e53b7abf560e0162c38": { + "balance": "0x15af1d78b58c400000" }, - "e26657f0ed201ea2392c9222b80a7003608ddf30": { - "balance": "40000000000000000000" + "0xe26657f0ed201ea2392c9222b80a7003608ddf30": { + "balance": "0x22b1c8c1227a00000" }, - "f4177a0d85d48b0e264211ce2aa2efd3f1b47f08": { - "balance": "3593425000000000000000" + "0xf4177a0d85d48b0e264211ce2aa2efd3f1b47f08": { + "balance": "0xc2ccca26b7e80e8000" }, - "9d47ba5b4c8505ad8da42934280b61a0e1e8b971": { - "balance": "100000000000000000000" + "0x9d47ba5b4c8505ad8da42934280b61a0e1e8b971": { + "balance": "0x56bc75e2d63100000" }, - "63c2a3d235e5eeabd0d4a6afdb89d94627396495": { - "balance": "1241620000000000000000" + "0x63c2a3d235e5eeabd0d4a6afdb89d94627396495": { + "balance": "0x434ef05b9d84820000" }, - "446a8039cecf9dce4879cbcaf3493bf545a88610": { - "balance": "7000000000000000000000" + "0x446a8039cecf9dce4879cbcaf3493bf545a88610": { + "balance": "0x17b7883c06916600000" }, - "7fa37ed67887751a471f0eb306be44e0dbcd6089": { - "balance": "1060000000000000000000" + "0x7fa37ed67887751a471f0eb306be44e0dbcd6089": { + "balance": "0x3976747fe11a100000" }, - "26d4a16891f52922789217fcd886f7fce296d400": { - "balance": "2000000000000000000000" + "0x26d4a16891f52922789217fcd886f7fce296d400": { + "balance": "0x6c6b935b8bbd400000" }, - "487e108502b0b189ef9c8c6da4d0db6261eec6c0": { - "balance": "1910000000000000000000" + "0x487e108502b0b189ef9c8c6da4d0db6261eec6c0": { + "balance": "0x678a932062e4180000" }, - "7484d26becc1eea8c6315ec3ee0a450117dc86a0": { - "balance": "12000000000000000000000" + "0x7484d26becc1eea8c6315ec3ee0a450117dc86a0": { + "balance": "0x28a857425466f800000" }, - "ad9e97a0482f353a05c0f792b977b6c7e811fa5f": { - "balance": "200000000000000000000" + "0xad9e97a0482f353a05c0f792b977b6c7e811fa5f": { + "balance": "0xad78ebc5ac6200000" }, - "2273bad7bc4e487622d175ef7a66988b6a93c4ee": { - "balance": "20000000000000000000" + "0x2273bad7bc4e487622d175ef7a66988b6a93c4ee": { + "balance": "0x1158e460913d00000" }, - "3b93b16136f11eaf10996c95990d3b2739ccea5f": { - "balance": "10000000000000000000000" + "0x3b93b16136f11eaf10996c95990d3b2739ccea5f": { + "balance": "0x21e19e0c9bab2400000" }, - "f3f1fa3918ca34e2cf7e84670b1f4d8eca160db3": { - "balance": "680000000000000000000" + "0xf3f1fa3918ca34e2cf7e84670b1f4d8eca160db3": { + "balance": "0x24dce54d34a1a00000" }, - "88a2154430c0e41147d3c1fee3b3b006f851edbd": { - "balance": "999972000000000000000" + "0x88a2154430c0e41147d3c1fee3b3b006f851edbd": { + "balance": "0x36356633ebd8ea0000" }, - "25185f325acf2d64500698f65c769ddf68301602": { - "balance": "5000000000000000000000" + "0x25185f325acf2d64500698f65c769ddf68301602": { + "balance": "0x10f0cf064dd59200000" }, - "e9cafe41a5e8bbd90ba02d9e06585b4eb546c57f": { - "balance": "2000000000000000000000" + "0xe9cafe41a5e8bbd90ba02d9e06585b4eb546c57f": { + "balance": "0x6c6b935b8bbd400000" }, - "95681cdae69b2049ce101e325c759892cac3f811": { - "balance": "2857600000000000000000" + "0x95681cdae69b2049ce101e325c759892cac3f811": { + "balance": "0x9ae92a9bc94c400000" }, - "475066f9ad26655196d5535327bbeb9b7929cb04": { - "balance": "3040000000000000000000" + "0x475066f9ad26655196d5535327bbeb9b7929cb04": { + "balance": "0xa4cc799563c3800000" }, - "6685fd2e2544702c360b8bb9ee78f130dad16da5": { - "balance": "2000000000000000000000" + "0x6685fd2e2544702c360b8bb9ee78f130dad16da5": { + "balance": "0x6c6b935b8bbd400000" }, - "45e68db94c7d0ab7ac41857a71d67147870f4e71": { - "balance": "400000000000000000000000" + "0x45e68db94c7d0ab7ac41857a71d67147870f4e71": { + "balance": "0x54b40b1f852bda000000" }, - "4ad95d188d6464709add2555fb4d97fe1ebf311f": { - "balance": "346000000000000000000" + "0x4ad95d188d6464709add2555fb4d97fe1ebf311f": { + "balance": "0x12c1b6eed03d280000" }, - "73bedd6fda7ba3272185087b6351fc133d484e37": { - "balance": "5057200000000000000000" + "0x73bedd6fda7ba3272185087b6351fc133d484e37": { + "balance": "0x11226bf9dce59780000" }, - "1ea4715504c6af107b0194f4f7b1cb6fcccd6f4b": { - "balance": "590598000000000000000" + "0x1ea4715504c6af107b0194f4f7b1cb6fcccd6f4b": { + "balance": "0x20043197e0b0270000" }, - "77306ffe2e4a8f3ca826c1a249f7212da43aeffd": { - "balance": "20000000000000000000000" + "0x77306ffe2e4a8f3ca826c1a249f7212da43aeffd": { + "balance": "0x43c33c1937564800000" }, - "eb453f5a3adddd8ab56750fadb0fe7f94d9c89e7": { - "balance": "20000000000000000000" + "0xeb453f5a3adddd8ab56750fadb0fe7f94d9c89e7": { + "balance": "0x1158e460913d00000" }, - "7201d1c06920cd397ae8ad869bcda6e47ffb1b5a": { - "balance": "20000000000000000000" + "0x7201d1c06920cd397ae8ad869bcda6e47ffb1b5a": { + "balance": "0x1158e460913d00000" }, - "821cb5cd05c7ef909fe1be60733d8963d760dc41": { - "balance": "4000000000000000000000" + "0x821cb5cd05c7ef909fe1be60733d8963d760dc41": { + "balance": "0xd8d726b7177a800000" }, - "496e319592b341eaccd778dda7c8196d54cac775": { - "balance": "9250000000000000000000" + "0x496e319592b341eaccd778dda7c8196d54cac775": { + "balance": "0x1f5718987664b480000" }, - "88609e0a465b6e99fce907166d57e9da0814f5c8": { - "balance": "20000000000000000000000" + "0x88609e0a465b6e99fce907166d57e9da0814f5c8": { + "balance": "0x43c33c1937564800000" }, - "c7ec62b804b1f69b1e3070b5d362c62fb309b070": { - "balance": "13068074000000000000000" + "0xc7ec62b804b1f69b1e3070b5d362c62fb309b070": { + "balance": "0x2c46bf5416066110000" }, - "3eb9ef06d0c259040319947e8c7a6812aa0253d8": { - "balance": "167000000000000000000" + "0x3eb9ef06d0c259040319947e8c7a6812aa0253d8": { + "balance": "0x90d972f32323c0000" }, - "cbf37ff854a2f1ce53934494777892d3ec655782": { - "balance": "10000000000000000000000" + "0xcbf37ff854a2f1ce53934494777892d3ec655782": { + "balance": "0x21e19e0c9bab2400000" }, - "02b1af72339b2a2256389fd64607de24f0de600a": { - "balance": "2000000000000000000000" + "0x02b1af72339b2a2256389fd64607de24f0de600a": { + "balance": "0x6c6b935b8bbd400000" }, - "a8beb91c2b99c8964aa95b6b4a184b1269fc3483": { - "balance": "400000000000000000000" + "0xa8beb91c2b99c8964aa95b6b4a184b1269fc3483": { + "balance": "0x15af1d78b58c400000" }, - "922a20c79a1d3a26dd3829677bf1d45c8f672bb6": { - "balance": "4000000000000000000000" + "0x922a20c79a1d3a26dd3829677bf1d45c8f672bb6": { + "balance": "0xd8d726b7177a800000" }, - "c5843399d150066bf7979c34ba294620368ad7c0": { - "balance": "200000000000000000000" + "0xc5843399d150066bf7979c34ba294620368ad7c0": { + "balance": "0xad78ebc5ac6200000" }, - "8cd0cd22e620eda79c0461e896c93c44837e2968": { - "balance": "2000000000000000000000" + "0x8cd0cd22e620eda79c0461e896c93c44837e2968": { + "balance": "0x6c6b935b8bbd400000" }, - "6170dd0687bd55ca88b87adef51cfdc55c4dd458": { - "balance": "2005160000000000000000" + "0x6170dd0687bd55ca88b87adef51cfdc55c4dd458": { + "balance": "0x6cb32f5c34fe440000" }, - "eed384ef2d41d9d203974e57c12328ea760e08ea": { - "balance": "1000000000000000000000" + "0xeed384ef2d41d9d203974e57c12328ea760e08ea": { + "balance": "0x3635c9adc5dea00000" }, - "b129a5cb7105fe810bd895dc7206a991a4545488": { - "balance": "30000000000000000000" + "0xb129a5cb7105fe810bd895dc7206a991a4545488": { + "balance": "0x1a055690d9db80000" }, - "3872f48dc5e3f817bc6b2ad2d030fc5e0471193d": { - "balance": "4000000000000000000000" + "0x3872f48dc5e3f817bc6b2ad2d030fc5e0471193d": { + "balance": "0xd8d726b7177a800000" }, - "514b7512c9ae5ea63cbf11715b63f21e18d296c1": { - "balance": "1999944000000000000000" + "0x514b7512c9ae5ea63cbf11715b63f21e18d296c1": { + "balance": "0x6c6acc67d7b1d40000" }, - "7ab256b204800af20137fabcc916a23258752501": { - "balance": "20000000000000000000000" + "0x7ab256b204800af20137fabcc916a23258752501": { + "balance": "0x43c33c1937564800000" }, - "fc66faba277f4b5de64ad45eb19c31e00ced3ed5": { - "balance": "5640000000000000000000" + "0xfc66faba277f4b5de64ad45eb19c31e00ced3ed5": { + "balance": "0x131beb925ffd3200000" }, - "39824f8bced176fd3ea22ec6a493d0ccc33fc147": { - "balance": "4000000000000000000000" + "0x39824f8bced176fd3ea22ec6a493d0ccc33fc147": { + "balance": "0xd8d726b7177a800000" }, - "e338e859fe2e8c15554848b75caecda877a0e832": { - "balance": "1801800000000000000000" + "0xe338e859fe2e8c15554848b75caecda877a0e832": { + "balance": "0x61acff81a78ad40000" }, - "e53c68796212033e4e6f9cff56e19c461eb454f9": { - "balance": "1000000000000000000000" + "0xe53c68796212033e4e6f9cff56e19c461eb454f9": { + "balance": "0x3635c9adc5dea00000" }, - "8461ecc4a6a45eb1a5b947fb86b88069b91fcd6f": { - "balance": "2000000000000000000000" + "0x8461ecc4a6a45eb1a5b947fb86b88069b91fcd6f": { + "balance": "0x6c6b935b8bbd400000" }, - "6b4b99cb3fa9f7b74ce3a48317b1cd13090a1a7a": { - "balance": "57300000000000000000" + "0x6b4b99cb3fa9f7b74ce3a48317b1cd13090a1a7a": { + "balance": "0x31b327e695de20000" }, - "97de21e421c37fe4b8025f9a51b7b390b5df7804": { - "balance": "80000000000000000000000" + "0x97de21e421c37fe4b8025f9a51b7b390b5df7804": { + "balance": "0x10f0cf064dd592000000" }, - "d25aecd7eb8bd6345b063b5dbd271c77d3514494": { - "balance": "1820000000000000000000" + "0xd25aecd7eb8bd6345b063b5dbd271c77d3514494": { + "balance": "0x62a992e53a0af00000" }, - "57b23d6a1adc06c652a779c6a7fb6b95b9fead66": { - "balance": "200000000000000000000" + "0x57b23d6a1adc06c652a779c6a7fb6b95b9fead66": { + "balance": "0xad78ebc5ac6200000" }, - "0d658014a199061cf6b39433140303c20ffd4e5a": { - "balance": "8200000000000000000000" + "0x0d658014a199061cf6b39433140303c20ffd4e5a": { + "balance": "0x1bc85dc2a89bb200000" }, - "30eac740e4f02cb56eef0526e5d300322600d03e": { - "balance": "1970000000000000000000" + "0x30eac740e4f02cb56eef0526e5d300322600d03e": { + "balance": "0x6acb3df27e1f880000" }, - "4eead40aad8c73ef08fc84bc0a92c9092f6a36bf": { - "balance": "26740000000000000000" + "0x4eead40aad8c73ef08fc84bc0a92c9092f6a36bf": { + "balance": "0x1731790534df20000" }, - "30f7d025d16f7bee105580486f9f561c7bae3fef": { - "balance": "500000000000000000000" + "0x30f7d025d16f7bee105580486f9f561c7bae3fef": { + "balance": "0x1b1ae4d6e2ef500000" }, - "0977bfba038a44fb49b03970d8d8cf2cb61f8b25": { - "balance": "420000000000000000000" + "0x0977bfba038a44fb49b03970d8d8cf2cb61f8b25": { + "balance": "0x16c4abbebea0100000" }, - "b14bbeff70720975dc6191b2a44ff49f2672873c": { - "balance": "143000000000000000000" + "0xb14bbeff70720975dc6191b2a44ff49f2672873c": { + "balance": "0x7c0860e5a80dc0000" }, - "d588c3a5df228185d98ee7e60748255cdea68b01": { - "balance": "4000000000000000000000" + "0xd588c3a5df228185d98ee7e60748255cdea68b01": { + "balance": "0xd8d726b7177a800000" }, - "225d35faedb391c7bc2db7fa9071160405996d00": { - "balance": "167774000000000000000" + "0x225d35faedb391c7bc2db7fa9071160405996d00": { + "balance": "0x91854fc1862630000" }, - "c0e457bd56ec36a1246bfa3230fff38e5926ef22": { - "balance": "1940000000000000000000" + "0xc0e457bd56ec36a1246bfa3230fff38e5926ef22": { + "balance": "0x692ae8897081d00000" }, - "2a9c57fe7b6b138a920d676f3c76b6c2a0eef699": { - "balance": "9400000000000000000000" + "0x2a9c57fe7b6b138a920d676f3c76b6c2a0eef699": { + "balance": "0x1fd933494aa5fe00000" }, - "36df8f883c1273ec8a171f7a33cfd649b1fe6075": { - "balance": "227290000000000000000" + "0x36df8f883c1273ec8a171f7a33cfd649b1fe6075": { + "balance": "0xc52484ac416890000" }, - "234f46bab73fe45d31bf87f0a1e0466199f2ebac": { - "balance": "485000000000000000000" + "0x234f46bab73fe45d31bf87f0a1e0466199f2ebac": { + "balance": "0x1a4aba225c20740000" }, - "a2e1b8aa900e9c139b3fa122354f6156d92a18b1": { - "balance": "500000000000000000000" + "0xa2e1b8aa900e9c139b3fa122354f6156d92a18b1": { + "balance": "0x1b1ae4d6e2ef500000" }, - "517cd7608e5d0d83a26b717f3603dac2277dc3a4": { - "balance": "2000000000000000000000" + "0x517cd7608e5d0d83a26b717f3603dac2277dc3a4": { + "balance": "0x6c6b935b8bbd400000" }, - "75f7539d309e9039989efe2e8b2dbd865a0df088": { - "balance": "2460000000000000000000" + "0x75f7539d309e9039989efe2e8b2dbd865a0df088": { + "balance": "0x855b5ba65c84f00000" }, - "4b792e29683eb586e394bb33526c6001b397999e": { - "balance": "600000000000000000000" + "0x4b792e29683eb586e394bb33526c6001b397999e": { + "balance": "0x2086ac351052600000" }, - "a34f9d568bf7afd94c2a5b8a5ff55c66c4087999": { - "balance": "2444000000000000000000" + "0xa34f9d568bf7afd94c2a5b8a5ff55c66c4087999": { + "balance": "0x847d503b220eb00000" }, - "4b31bf41abc75c9ae2cd8f7f35163b6e2b745054": { - "balance": "382000000000000000000" + "0x4b31bf41abc75c9ae2cd8f7f35163b6e2b745054": { + "balance": "0x14b550a013c7380000" }, - "e35453eef2cc3c7a044d0ac134ba615908fa82ee": { - "balance": "147510000000000000000" + "0xe35453eef2cc3c7a044d0ac134ba615908fa82ee": { + "balance": "0x7ff1ccb7561df0000" }, - "7aa79ac04316cc8d08f20065baa6d4142897d54e": { - "balance": "1400000000000000000000" + "0x7aa79ac04316cc8d08f20065baa6d4142897d54e": { + "balance": "0x4be4e7267b6ae00000" }, - "f1dc8ac81042c67a9c3c6792b230c46ac016ca10": { - "balance": "200000000000000000000" + "0xf1dc8ac81042c67a9c3c6792b230c46ac016ca10": { + "balance": "0xad78ebc5ac6200000" }, - "2bb366b9edcb0da680f0e10b3b6e28748190d6c3": { - "balance": "5799400000000000000000" + "0x2bb366b9edcb0da680f0e10b3b6e28748190d6c3": { + "balance": "0x13a62d7b57640640000" }, - "a567770b6ae320bdde50f904d663e746a61dace6": { - "balance": "2000000000000000000000" + "0xa567770b6ae320bdde50f904d663e746a61dace6": { + "balance": "0x6c6b935b8bbd400000" }, - "d9d42fd13ebd4bf69cac5e9c7e82483ab46dd7e9": { - "balance": "5348000000000000000000" + "0xd9d42fd13ebd4bf69cac5e9c7e82483ab46dd7e9": { + "balance": "0x121ea68c114e5100000" }, - "27830c5f6023afaaf79745676c204a0faccda0ba": { - "balance": "240000000000000000000" + "0x27830c5f6023afaaf79745676c204a0faccda0ba": { + "balance": "0xd02ab486cedc00000" }, - "3cb179cb4801a99b95c3b0c324a2bdc101a65360": { - "balance": "26000000000000000000" + "0x3cb179cb4801a99b95c3b0c324a2bdc101a65360": { + "balance": "0x168d28e3f00280000" }, - "976e3ceaf3f1af51f8c29aff5d7fa21f0386d8ee": { - "balance": "240000000000000000000" + "0x976e3ceaf3f1af51f8c29aff5d7fa21f0386d8ee": { + "balance": "0xd02ab486cedc00000" }, - "752a5ee232612cd3005fb26e5b597de19f776be6": { - "balance": "5460000000000000000000" + "0x752a5ee232612cd3005fb26e5b597de19f776be6": { + "balance": "0x127fcb8afae20d00000" }, - "7d5aa33fc14b51841a06906edb2bb49c2a117269": { - "balance": "300048000000000000000" + "0x7d5aa33fc14b51841a06906edb2bb49c2a117269": { + "balance": "0x104400a2470e680000" }, - "55ca6abe79ea2497f46fdbb830346010fe469cbe": { - "balance": "5730000000000000000000" + "0x55ca6abe79ea2497f46fdbb830346010fe469cbe": { + "balance": "0x1369fb96128ac480000" }, - "6bec311ad05008b4af353c958c40bd06739a3ff3": { - "balance": "16380000000000000000000" + "0x6bec311ad05008b4af353c958c40bd06739a3ff3": { + "balance": "0x377f62a0f0a62700000" }, - "30e9698cf1e08a9d048bd8d8048f28be7ed9409f": { - "balance": "6685000000000000000000" + "0x30e9698cf1e08a9d048bd8d8048f28be7ed9409f": { + "balance": "0x16a6502f15a1e540000" }, - "9afa536b4c66bc38d875c4b30099d9261fdb38eb": { - "balance": "205981000000000000000" + "0x9afa536b4c66bc38d875c4b30099d9261fdb38eb": { + "balance": "0xb2a8f842a77bc8000" }, - "6b63a2dfb2bcd0caec0022b88be30c1451ea56aa": { - "balance": "809021000000000000000" + "0x6b63a2dfb2bcd0caec0022b88be30c1451ea56aa": { + "balance": "0x2bdb6bf91f7f4c8000" }, - "d07be0f90997caf903c8ac1d53cde904fb190741": { - "balance": "1000200000000000000000" + "0xd07be0f90997caf903c8ac1d53cde904fb190741": { + "balance": "0x36389038b699b40000" }, - "893cdddf5377f3c751bf2e541120045a47cba101": { - "balance": "100000000000000000000" + "0x893cdddf5377f3c751bf2e541120045a47cba101": { + "balance": "0x56bc75e2d63100000" }, - "c1cdc601f89c0428b31302d187e0dc08ad7d1c57": { - "balance": "6000000000000000000000" + "0xc1cdc601f89c0428b31302d187e0dc08ad7d1c57": { + "balance": "0x14542ba12a337c00000" }, - "8f8acb107607388479f64baaabea8ff007ada97d": { - "balance": "27281800000000000000000" + "0x8f8acb107607388479f64baaabea8ff007ada97d": { + "balance": "0x5c6f3080ad423f40000" }, - "88bc43012edb0ea9f062ac437843250a39b78fbb": { - "balance": "20000000000000000000000" + "0x88bc43012edb0ea9f062ac437843250a39b78fbb": { + "balance": "0x43c33c1937564800000" }, - "fcfc3a5004d678613f0b36a642269a7f371c3f6a": { - "balance": "1000000000000000000000" + "0xfcfc3a5004d678613f0b36a642269a7f371c3f6a": { + "balance": "0x3635c9adc5dea00000" }, - "f509557e90183fbf0f0651a786487bcc428ba175": { - "balance": "194000000000000000000" + "0xf509557e90183fbf0f0651a786487bcc428ba175": { + "balance": "0xa844a7424d9c80000" }, - "e3d915eda3b825d6ee4af9328d32ac18ada35497": { - "balance": "500000000000000000000" + "0xe3d915eda3b825d6ee4af9328d32ac18ada35497": { + "balance": "0x1b1ae4d6e2ef500000" }, - "f237ef05261c34d79cc22b860de0f17f793c3860": { - "balance": "200000000000000000000" + "0xf237ef05261c34d79cc22b860de0f17f793c3860": { + "balance": "0xad78ebc5ac6200000" }, - "a3a2e319e7d3a1448b5aa2468953160c2dbcba71": { - "balance": "2000000000000000000000" + "0xa3a2e319e7d3a1448b5aa2468953160c2dbcba71": { + "balance": "0x6c6b935b8bbd400000" }, - "3a368efe4ad786e26395ec9fc6ad698cae29fe01": { - "balance": "632200000000000000000" + "0x3a368efe4ad786e26395ec9fc6ad698cae29fe01": { + "balance": "0x2245899675f9f40000" }, - "8e3240b0810e1cf407a500804740cf8d616432a4": { - "balance": "40309000000000000000" + "0x8e3240b0810e1cf407a500804740cf8d616432a4": { + "balance": "0x22f6655ef0b388000" }, - "5691dd2f6745f20e22d2e1d1b955aa2903d65656": { - "balance": "1969606000000000000000" + "0x5691dd2f6745f20e22d2e1d1b955aa2903d65656": { + "balance": "0x6ac5c62d9486070000" }, - "5f93ff832774db5114c55bb4bf44ccf3b58f903f": { - "balance": "192026650000000000000000" + "0x5f93ff832774db5114c55bb4bf44ccf3b58f903f": { + "balance": "0x28a9c91a263458290000" }, - "2c1cc6e18c152488ba11c2cc1bcefa2df306abd1": { - "balance": "1670000000000000000000" + "0x2c1cc6e18c152488ba11c2cc1bcefa2df306abd1": { + "balance": "0x5a87e7d7f5f6580000" }, - "bde9786a84e75b48f18e726dd78d70e4af3ed802": { - "balance": "5730000000000000000000" + "0xbde9786a84e75b48f18e726dd78d70e4af3ed802": { + "balance": "0x1369fb96128ac480000" }, - "79551cede376f747e3716c8d79400d766d2e0195": { - "balance": "46250000000000000000000" + "0x79551cede376f747e3716c8d79400d766d2e0195": { + "balance": "0x9cb37afa4ff78680000" }, - "49f028395b5a86c9e07f7778630e4c2e3d373a77": { - "balance": "122735000000000000000" + "0x49f028395b5a86c9e07f7778630e4c2e3d373a77": { + "balance": "0x6a74a5038db918000" }, - "6a3694424c7cc6b8bcd9bccaba540cc1f5df18d7": { - "balance": "2000000000000000000000" + "0x6a3694424c7cc6b8bcd9bccaba540cc1f5df18d7": { + "balance": "0x6c6b935b8bbd400000" }, - "068e29b3f191c812a6393918f71ab933ae6847f2": { - "balance": "1999944000000000000000" + "0x068e29b3f191c812a6393918f71ab933ae6847f2": { + "balance": "0x6c6acc67d7b1d40000" }, - "6e64e6129f224e378c0e6e736a7e7a06c211e9ec": { - "balance": "1000000000000000000000" + "0x6e64e6129f224e378c0e6e736a7e7a06c211e9ec": { + "balance": "0x3635c9adc5dea00000" }, - "c4c15318d370c73318cc18bdd466dbaa4c6603bf": { - "balance": "19700000000000000000" + "0xc4c15318d370c73318cc18bdd466dbaa4c6603bf": { + "balance": "0x11164759ffb320000" }, - "8035bcffaefdeeea35830c497d14289d362023de": { - "balance": "300000000000000000000" + "0x8035bcffaefdeeea35830c497d14289d362023de": { + "balance": "0x1043561a8829300000" }, - "a997dfc7986a27050848fa1c64d7a7d6e07acca2": { - "balance": "143000000000000000000" + "0xa997dfc7986a27050848fa1c64d7a7d6e07acca2": { + "balance": "0x7c0860e5a80dc0000" }, - "2fe13a8d0785de8758a5e41876c36e916cf75074": { - "balance": "4000000000000000000000" + "0x2fe13a8d0785de8758a5e41876c36e916cf75074": { + "balance": "0xd8d726b7177a800000" }, - "6f24c9af2b763480515d1b0951bb77a540f1e3f9": { - "balance": "1970000000000000000000" + "0x6f24c9af2b763480515d1b0951bb77a540f1e3f9": { + "balance": "0x6acb3df27e1f880000" }, - "4c23b370fc992bb67cec06e26715b62f0b3a4ac3": { - "balance": "10000000000000000000000" + "0x4c23b370fc992bb67cec06e26715b62f0b3a4ac3": { + "balance": "0x21e19e0c9bab2400000" }, - "4ac07673e42f64c1a25ec2fa2d86e5aa2b34e039": { - "balance": "2000000000000000000000" + "0x4ac07673e42f64c1a25ec2fa2d86e5aa2b34e039": { + "balance": "0x6c6b935b8bbd400000" }, - "117db836377fe15455e02c2ebda40b1ceb551b19": { - "balance": "6000000000000000000000" + "0x117db836377fe15455e02c2ebda40b1ceb551b19": { + "balance": "0x14542ba12a337c00000" }, - "ef1c0477f1184d60accab374d374557a0a3e10f3": { - "balance": "152000000000000000000" + "0xef1c0477f1184d60accab374d374557a0a3e10f3": { + "balance": "0x83d6c7aab63600000" }, - "99fe0d201228a753145655d428eb9fd94985d36d": { - "balance": "1939268000000000000000" + "0x99fe0d201228a753145655d428eb9fd94985d36d": { + "balance": "0x6920bff3515a3a0000" }, - "b3731b046c8ac695a127fd79d0a5d5fa6ae6d12e": { - "balance": "1998000000000000000000" + "0xb3731b046c8ac695a127fd79d0a5d5fa6ae6d12e": { + "balance": "0x6c4fd1ee246e780000" }, - "dce30c31f3ca66721ecb213c809aab561d9b52e4": { - "balance": "2000000000000000000000" + "0xdce30c31f3ca66721ecb213c809aab561d9b52e4": { + "balance": "0x6c6b935b8bbd400000" }, - "ddd69c5b9bf5eb5a39cee7c3341a120d973fdb34": { - "balance": "1987730000000000000000" + "0xddd69c5b9bf5eb5a39cee7c3341a120d973fdb34": { + "balance": "0x6bc14b8f8e1b350000" }, - "216e41864ef98f060da08ecae19ad1166a17d036": { - "balance": "5730000000000000000000" + "0x216e41864ef98f060da08ecae19ad1166a17d036": { + "balance": "0x1369fb96128ac480000" }, - "6a53d41ae4a752b21abed5374649953a513de5e5": { - "balance": "2000000000000000000000" + "0x6a53d41ae4a752b21abed5374649953a513de5e5": { + "balance": "0x6c6b935b8bbd400000" }, - "20dd8fcbb46ea46fe381a68b8ca0ea5be21fe9a5": { - "balance": "2000000000000000000000" + "0x20dd8fcbb46ea46fe381a68b8ca0ea5be21fe9a5": { + "balance": "0x6c6b935b8bbd400000" }, - "19732bf973055dbd91a4533adaa2149a91d38380": { - "balance": "2000000000000000000000" + "0x19732bf973055dbd91a4533adaa2149a91d38380": { + "balance": "0x6c6b935b8bbd400000" }, - "51ea1c0934e3d04022ed9c95a087a150ef705e81": { - "balance": "6280000000000000000000" + "0x51ea1c0934e3d04022ed9c95a087a150ef705e81": { + "balance": "0x1547081e7224d200000" }, - "a0de5c601e696635c698b7ae9ca4539fc7b941ec": { - "balance": "346150000000000000000" + "0xa0de5c601e696635c698b7ae9ca4539fc7b941ec": { + "balance": "0x12c3cbd704c9770000" }, - "94e1f5cb9b8abace03a1a6428256553b690c2355": { - "balance": "20000000000000000000" + "0x94e1f5cb9b8abace03a1a6428256553b690c2355": { + "balance": "0x1158e460913d00000" }, - "a539b4a401b584dfe0f344b1b422c65543167e2e": { - "balance": "200000000000000000000" + "0xa539b4a401b584dfe0f344b1b422c65543167e2e": { + "balance": "0xad78ebc5ac6200000" }, - "50584d9206a46ce15c301117ee28f15c30e60e75": { - "balance": "13400000000000000000" + "0x50584d9206a46ce15c301117ee28f15c30e60e75": { + "balance": "0xb9f65d00f63c0000" }, - "856eb204241a87830fb229031343dc30854f581a": { - "balance": "1000000000000000000000" + "0x856eb204241a87830fb229031343dc30854f581a": { + "balance": "0x3635c9adc5dea00000" }, - "9dd46b1c6d3f05e29e9c6f037eed9a595af4a9aa": { - "balance": "500000000000000000000" + "0x9dd46b1c6d3f05e29e9c6f037eed9a595af4a9aa": { + "balance": "0x1b1ae4d6e2ef500000" }, - "8925da4549e15155e57a628522cea9dddf627d81": { - "balance": "1000070000000000000000" + "0x8925da4549e15155e57a628522cea9dddf627d81": { + "balance": "0x3636c25e66ece70000" }, - "a89df34859edd7c820db887740d8ff9e15157c7b": { - "balance": "2000000000000000000000" + "0xa89df34859edd7c820db887740d8ff9e15157c7b": { + "balance": "0x6c6b935b8bbd400000" }, - "ad9f4c890a3b511cee51dfe6cfd7f1093b76412c": { - "balance": "506600000000000000000" + "0xad9f4c890a3b511cee51dfe6cfd7f1093b76412c": { + "balance": "0x1b767cbfeb0ce40000" }, - "f8c7f34a38b31801da43063477b12b27d0f203ff": { - "balance": "494800000000000000000" + "0xf8c7f34a38b31801da43063477b12b27d0f203ff": { + "balance": "0x1ad2baba6fef480000" }, - "a642501004c90ea9c9ed1998ba140a4cd62c6f5f": { - "balance": "250543000000000000000" + "0xa642501004c90ea9c9ed1998ba140a4cd62c6f5f": { + "balance": "0xd94fb8b10f8b18000" }, - "508cf19119db70aa86454253da764a2cb1b2be1a": { - "balance": "1000000000000000000000" + "0x508cf19119db70aa86454253da764a2cb1b2be1a": { + "balance": "0x3635c9adc5dea00000" }, - "2979741174a8c1ea0b7f9edf658177859417f512": { - "balance": "461283000000000000000" + "0x2979741174a8c1ea0b7f9edf658177859417f512": { + "balance": "0x1901966c8496838000" }, - "654f524847b3a6acc0d3d5f1f362b603edf65f96": { - "balance": "8000000000000000000000" + "0x654f524847b3a6acc0d3d5f1f362b603edf65f96": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "5cf18fa7c8a7c0a2b3d5efd1990f64ddc569242c": { - "balance": "1000000000000000000000" + "0x5cf18fa7c8a7c0a2b3d5efd1990f64ddc569242c": { + "balance": "0x3635c9adc5dea00000" }, - "17e82e7078dc4fd9e879fb8a50667f53a5c54591": { - "balance": "200000000000000000000" + "0x17e82e7078dc4fd9e879fb8a50667f53a5c54591": { + "balance": "0xad78ebc5ac6200000" }, - "8b07d050754dc9ba230db01c310afdb5395aa1b3": { - "balance": "118080000000000000000" + "0x8b07d050754dc9ba230db01c310afdb5395aa1b3": { + "balance": "0x666b06e62a6200000" }, - "5f77a107ab1226b3f95f10ee83aefc6c5dff3edc": { - "balance": "500000000000000000000" + "0x5f77a107ab1226b3f95f10ee83aefc6c5dff3edc": { + "balance": "0x1b1ae4d6e2ef500000" }, - "475a6193572d4a4e59d7be09cb960ddd8c530e2f": { - "balance": "667323000000000000000" + "0x475a6193572d4a4e59d7be09cb960ddd8c530e2f": { + "balance": "0x242cf78cdf07ff8000" }, - "6470a4f92ec6b0fccd01234fa59023e9ff1f3aac": { - "balance": "3000000000000000000000" + "0x6470a4f92ec6b0fccd01234fa59023e9ff1f3aac": { + "balance": "0xa2a15d09519be00000" }, - "2fbcef3384d420e4bf61a0669990bc7054f1a5af": { - "balance": "2000000000000000000000" + "0x2fbcef3384d420e4bf61a0669990bc7054f1a5af": { + "balance": "0x6c6b935b8bbd400000" }, - "bbabf6643beb4bd01c120bd0598a0987d82967d1": { - "balance": "3342500000000000000000" + "0xbbabf6643beb4bd01c120bd0598a0987d82967d1": { + "balance": "0xb5328178ad0f2a0000" }, - "41a2f2e6ecb86394ec0e338c0fc97e9c5583ded2": { - "balance": "2009400000000000000000" + "0x41a2f2e6ecb86394ec0e338c0fc97e9c5583ded2": { + "balance": "0x6cee06ddbe15ec0000" }, - "fb9473cf7712350a1fa0395273fc80560752e4fb": { - "balance": "123300000000000000000" + "0xfb9473cf7712350a1fa0395273fc80560752e4fb": { + "balance": "0x6af2198ba85aa0000" }, - "38b2197106123387a0d4de368431a8bacdda30e2": { - "balance": "20000000000000000000" + "0x38b2197106123387a0d4de368431a8bacdda30e2": { + "balance": "0x1158e460913d00000" }, - "5ed56115bd6505a88273df5c56839470d24a2db7": { - "balance": "65601000000000000000" + "0x5ed56115bd6505a88273df5c56839470d24a2db7": { + "balance": "0x38e6591ee56668000" }, - "523f6d64690fdacd942853591bb0ff20d3656d95": { - "balance": "1820000000000000000000" + "0x523f6d64690fdacd942853591bb0ff20d3656d95": { + "balance": "0x62a992e53a0af00000" }, - "55caff4bba04d220c9a5d2018672ec85e31ef83e": { - "balance": "2000000000000000000000" + "0x55caff4bba04d220c9a5d2018672ec85e31ef83e": { + "balance": "0x6c6b935b8bbd400000" }, - "65af8d8b5b1d1eedfa77bcbc96c1b133f83306df": { - "balance": "98000000000000000000" + "0x65af8d8b5b1d1eedfa77bcbc96c1b133f83306df": { + "balance": "0x55005f0c614480000" }, - "7456c5b2c5436e3e571008933f1805ccfe34e9ec": { - "balance": "1000000000000000000000" + "0x7456c5b2c5436e3e571008933f1805ccfe34e9ec": { + "balance": "0x3635c9adc5dea00000" }, - "a6eebbe464d39187bf80ca9c13d72027ec5ba8be": { - "balance": "3000000000000000000000" + "0xa6eebbe464d39187bf80ca9c13d72027ec5ba8be": { + "balance": "0xa2a15d09519be00000" }, - "dd35cfdbcb993395537aecc9f59085a8d5ddb6f5": { - "balance": "1000000000000000000000" + "0xdd35cfdbcb993395537aecc9f59085a8d5ddb6f5": { + "balance": "0x3635c9adc5dea00000" }, - "98e2b6d606fd2d6991c9d6d4077fdf3fdd4585da": { - "balance": "901520000000000000000" + "0x98e2b6d606fd2d6991c9d6d4077fdf3fdd4585da": { + "balance": "0x30df1a6f8ad6280000" }, - "860f5ffc10de767ded807f71e861d647dfd219b1": { - "balance": "10000000000000000000000" + "0x860f5ffc10de767ded807f71e861d647dfd219b1": { + "balance": "0x21e19e0c9bab2400000" }, - "1a644a50cbc2aee823bd2bf243e825be4d47df02": { - "balance": "100007000000000000000" + "0x1a644a50cbc2aee823bd2bf243e825be4d47df02": { + "balance": "0x56be03ca3e47d8000" }, - "a8455b411765d6901e311e726403091e42c56683": { - "balance": "3380000000000000000000" + "0xa8455b411765d6901e311e726403091e42c56683": { + "balance": "0xb73aec3bfe14500000" }, - "3a86ee94862b743dd34f410969d94e2c5652d4ad": { - "balance": "201610000000000000000" + "0x3a86ee94862b743dd34f410969d94e2c5652d4ad": { + "balance": "0xaede69ad30e810000" }, - "a57360f002e0d64d2d74457d8ca4857ee00bcddf": { - "balance": "335780000000000000000" + "0xa57360f002e0d64d2d74457d8ca4857ee00bcddf": { + "balance": "0x1233e232f618aa0000" }, - "e59b3bd300893f97233ef947c46f7217e392f7e9": { - "balance": "1000000000000000000000" + "0xe59b3bd300893f97233ef947c46f7217e392f7e9": { + "balance": "0x3635c9adc5dea00000" }, - "9f3a74fd5e7edcc1162993171381cbb632b7cff0": { - "balance": "10000000000000000000000" + "0x9f3a74fd5e7edcc1162993171381cbb632b7cff0": { + "balance": "0x21e19e0c9bab2400000" }, - "675d5caa609bf70a18aca580465d8fb7310d1bbb": { - "balance": "20000000000000000000000" + "0x675d5caa609bf70a18aca580465d8fb7310d1bbb": { + "balance": "0x43c33c1937564800000" }, - "77f609ca8720a023262c55c46f2d26fb3930ac69": { - "balance": "17300000000000000000" + "0x77f609ca8720a023262c55c46f2d26fb3930ac69": { + "balance": "0xf015f25736420000" }, - "f8ac4a39b53c11307820973b441365cffe596f66": { - "balance": "2000000000000000000000" + "0xf8ac4a39b53c11307820973b441365cffe596f66": { + "balance": "0x6c6b935b8bbd400000" }, - "112634b4ec30ff786e024159f796a57939ea144e": { - "balance": "1999944000000000000000" + "0x112634b4ec30ff786e024159f796a57939ea144e": { + "balance": "0x6c6acc67d7b1d40000" }, - "49d2c28ee9bc545eaaf7fd14c27c4073b4bb5f1a": { - "balance": "1474134000000000000000" + "0x49d2c28ee9bc545eaaf7fd14c27c4073b4bb5f1a": { + "balance": "0x4fe9b806b40daf0000" }, - "91cc46aa379f856a6640dccd5a648a7902f849d9": { - "balance": "200000000000000000000" + "0x91cc46aa379f856a6640dccd5a648a7902f849d9": { + "balance": "0xad78ebc5ac6200000" }, - "b46440c797a556e04c7d9104660491f96bb076bf": { - "balance": "14900000000000000000" + "0xb46440c797a556e04c7d9104660491f96bb076bf": { + "balance": "0xcec76f0e71520000" }, - "e5968797468ef767101b761d431fce14abffdbb4": { - "balance": "8040000000000000000000" + "0xe5968797468ef767101b761d431fce14abffdbb4": { + "balance": "0x1b3d969fa411ca00000" }, - "c0895efd056d9a3a81c3da578ada311bfb9356cf": { - "balance": "200000000000000000000" + "0xc0895efd056d9a3a81c3da578ada311bfb9356cf": { + "balance": "0xad78ebc5ac6200000" }, - "76846f0de03b5a76971ead298cdd08843a4bc6c6": { - "balance": "15500000000000000000" + "0x76846f0de03b5a76971ead298cdd08843a4bc6c6": { + "balance": "0xd71b0fe0a28e0000" }, - "5f708eaf39d823946c51b3a3e9b7b3c003e26341": { - "balance": "1820000000000000000000" + "0x5f708eaf39d823946c51b3a3e9b7b3c003e26341": { + "balance": "0x62a992e53a0af00000" }, - "24f7450ddbf18b020feb1a2032d9d54b633edf37": { - "balance": "50000000000000000000" + "0x24f7450ddbf18b020feb1a2032d9d54b633edf37": { + "balance": "0x2b5e3af16b1880000" }, - "cae3a253bcb2cf4e13ba80c298ab0402da7c2aa0": { - "balance": "5400000000000000000000" + "0xcae3a253bcb2cf4e13ba80c298ab0402da7c2aa0": { + "balance": "0x124bc0ddd92e5600000" }, - "91e8810652e8e6161525d63bb7751dc20f676076": { - "balance": "725000000000000000000" + "0x91e8810652e8e6161525d63bb7751dc20f676076": { + "balance": "0x274d656ac90e340000" }, - "543629c95cdef428ad37d453ca9538a9f90900ac": { - "balance": "43250000000000000000000" + "0x543629c95cdef428ad37d453ca9538a9f90900ac": { + "balance": "0x92896529baddc880000" }, - "6e79edd4845b076e4cd88d188b6e432dd93f35aa": { - "balance": "955000000000000000000" + "0x6e79edd4845b076e4cd88d188b6e432dd93f35aa": { + "balance": "0x33c5499031720c0000" }, - "bd325d4029e0d8729f6d399c478224ae9e7ae41e": { - "balance": "3880000000000000000000" + "0xbd325d4029e0d8729f6d399c478224ae9e7ae41e": { + "balance": "0xd255d112e103a00000" }, - "42cecfd2921079c2d7df3f08b07aa3beee5e219a": { - "balance": "1000000000000000000000" + "0x42cecfd2921079c2d7df3f08b07aa3beee5e219a": { + "balance": "0x3635c9adc5dea00000" }, - "3690246ba3c80679e22eac4412a1aefce6d7cd82": { - "balance": "20000000000000000000000" + "0x3690246ba3c80679e22eac4412a1aefce6d7cd82": { + "balance": "0x43c33c1937564800000" }, - "577aeee8d4bc08fc97ab156ed57fb970925366be": { - "balance": "333046000000000000000" + "0x577aeee8d4bc08fc97ab156ed57fb970925366be": { + "balance": "0x120df1147258bf0000" }, - "fe00bf439911a553982db638039245bcf032dbdc": { - "balance": "394000000000000000000" + "0xfe00bf439911a553982db638039245bcf032dbdc": { + "balance": "0x155bd9307f9fe80000" }, - "91f624b24a1fa5a056fe571229e7379db14b9a1e": { - "balance": "11999974000000000000000" + "0x91f624b24a1fa5a056fe571229e7379db14b9a1e": { + "balance": "0x28a8517c669b3570000" }, - "f206d328e471d0117b246d2a4619827709e96df3": { - "balance": "3001000000000000000000" + "0xf206d328e471d0117b246d2a4619827709e96df3": { + "balance": "0xa2af3dc00543440000" }, - "073f1ed1c9c3e9c52a9b0249a5c1caa0571fdf05": { - "balance": "70400000000000000000" + "0x073f1ed1c9c3e9c52a9b0249a5c1caa0571fdf05": { + "balance": "0x3d0ff0b013b800000" }, - "f56048dd2181d4a36f64fcecc6215481e42abc15": { - "balance": "200000000000000000000" + "0xf56048dd2181d4a36f64fcecc6215481e42abc15": { + "balance": "0xad78ebc5ac6200000" }, - "ef76a4cd8febcbc9b818f17828f8d93473f3f3cb": { - "balance": "4000000000000000000000" + "0xef76a4cd8febcbc9b818f17828f8d93473f3f3cb": { + "balance": "0xd8d726b7177a800000" }, - "1031e0ecb54985ae21af1793950dc811888fde7c": { - "balance": "20000000000000000000" + "0x1031e0ecb54985ae21af1793950dc811888fde7c": { + "balance": "0x1158e460913d00000" }, - "8e0fee38685a94aabcd7ce857b6b1409824f75b8": { - "balance": "500000000000000000000" + "0x8e0fee38685a94aabcd7ce857b6b1409824f75b8": { + "balance": "0x1b1ae4d6e2ef500000" }, - "f0cbef84e169630098d4e301b20208ef05846ac9": { - "balance": "259084000000000000000" + "0xf0cbef84e169630098d4e301b20208ef05846ac9": { + "balance": "0xe0b8345506b4e0000" }, - "bbca65b3266ea2fb73a03f921635f912c7bede00": { - "balance": "1970000000000000000000" + "0xbbca65b3266ea2fb73a03f921635f912c7bede00": { + "balance": "0x6acb3df27e1f880000" }, - "0aec2e426ed6cc0cf3c249c1897eac47a7faa9bd": { - "balance": "200000000000000000000" + "0x0aec2e426ed6cc0cf3c249c1897eac47a7faa9bd": { + "balance": "0xad78ebc5ac6200000" }, - "b8f30758faa808dbc919aa7b425ec922b93b8129": { - "balance": "1000076000000000000000" + "0xb8f30758faa808dbc919aa7b425ec922b93b8129": { + "balance": "0x3636d7af5ec98e0000" }, - "936dcf000194e3bff50ac5b4243a3ba014d661d8": { - "balance": "10000000000000000000000" + "0x936dcf000194e3bff50ac5b4243a3ba014d661d8": { + "balance": "0x21e19e0c9bab2400000" }, - "b14ddb0386fb606398b8cc47565afae00ff1d66a": { - "balance": "2973024000000000000000" + "0xb14ddb0386fb606398b8cc47565afae00ff1d66a": { + "balance": "0xa12aff083e66f00000" }, - "2ec95822eb887bc113b4712a4dfd7f13b097b5e7": { - "balance": "1000000000000000000000" + "0x2ec95822eb887bc113b4712a4dfd7f13b097b5e7": { + "balance": "0x3635c9adc5dea00000" }, - "0136a5af6c3299c6b5f005fdaddb148c070b299b": { - "balance": "20368000000000000000" + "0x0136a5af6c3299c6b5f005fdaddb148c070b299b": { + "balance": "0x11aa9ac15f1280000" }, - "37cb868d2c3f95b257611eb34a4188d58b749802": { - "balance": "2000000000000000000000" + "0x37cb868d2c3f95b257611eb34a4188d58b749802": { + "balance": "0x6c6b935b8bbd400000" }, - "cd7f09d7ed66d0c38bc5ad4e32b7f2b08dc1b30d": { - "balance": "1148000000000000000000" + "0xcd7f09d7ed66d0c38bc5ad4e32b7f2b08dc1b30d": { + "balance": "0x3e3bb34da2a4700000" }, - "b5fa8184e43ed3e0b8ab91216461b3528d84fd09": { - "balance": "2680000000000000000000" + "0xb5fa8184e43ed3e0b8ab91216461b3528d84fd09": { + "balance": "0x914878a8c05ee00000" }, - "3dbf0dbfd77890800533f09dea8301b9f025d2a6": { - "balance": "1000000000000000000000" + "0x3dbf0dbfd77890800533f09dea8301b9f025d2a6": { + "balance": "0x3635c9adc5dea00000" }, - "b553d25d6b5421e81c2ad05e0b8ba751f8f010e3": { - "balance": "2000000000000000000000" + "0xb553d25d6b5421e81c2ad05e0b8ba751f8f010e3": { + "balance": "0x6c6b935b8bbd400000" }, - "dbf8b13967f55125272de0562536c450ba5655a0": { - "balance": "2046830000000000000000" + "0xdbf8b13967f55125272de0562536c450ba5655a0": { + "balance": "0x6ef578f06e0ccb0000" }, - "0f6e840a3f2a24647d8e43e09d45c7c335df4248": { - "balance": "2500000000000000000000" + "0x0f6e840a3f2a24647d8e43e09d45c7c335df4248": { + "balance": "0x878678326eac900000" }, - "fa2fd29d03fee9a07893df3a269f56b72f2e1e64": { - "balance": "10000000000000000000000" + "0xfa2fd29d03fee9a07893df3a269f56b72f2e1e64": { + "balance": "0x21e19e0c9bab2400000" }, - "8b57b2bc83cc8d4de331204e893f2f3b1db1079a": { - "balance": "40000000000000000000" + "0x8b57b2bc83cc8d4de331204e893f2f3b1db1079a": { + "balance": "0x22b1c8c1227a00000" }, - "7f541491d2ac00d2612f94aa7f0bcb014651fbd4": { - "balance": "376000000000000000000" + "0x7f541491d2ac00d2612f94aa7f0bcb014651fbd4": { + "balance": "0x14620c57dddae00000" }, - "4f4a9be10cd5d3fb5de48c17be296f895690645b": { - "balance": "40000000000000000000000" + "0x4f4a9be10cd5d3fb5de48c17be296f895690645b": { + "balance": "0x878678326eac9000000" }, - "45d1c9eedf7cab41a779057b79395f5428d80528": { - "balance": "2000000000000000000000" + "0x45d1c9eedf7cab41a779057b79395f5428d80528": { + "balance": "0x6c6b935b8bbd400000" }, - "662334814724935b7931ddca6100e00d467727cd": { - "balance": "637000000000000000000" + "0x662334814724935b7931ddca6100e00d467727cd": { + "balance": "0x2288269d0783d40000" }, - "2c52c984102ee0cd3e31821b84d408930efa1ac7": { - "balance": "2000000000000000000000" + "0x2c52c984102ee0cd3e31821b84d408930efa1ac7": { + "balance": "0x6c6b935b8bbd400000" }, - "000d836201318ec6899a67540690382780743280": { - "balance": "200000000000000000000" + "0x000d836201318ec6899a67540690382780743280": { + "balance": "0xad78ebc5ac6200000" }, - "81498ca07b0f2f17e8bbc7e61a7f4ae7be66b78b": { - "balance": "101600000000000000000" + "0x81498ca07b0f2f17e8bbc7e61a7f4ae7be66b78b": { + "balance": "0x581fbb5b33bb00000" }, - "7860a3de38df382ae4a4dce18c0c07b98bce3dfa": { - "balance": "1000000000000000000000" + "0x7860a3de38df382ae4a4dce18c0c07b98bce3dfa": { + "balance": "0x3635c9adc5dea00000" }, - "5e8e4df18cf0af770978a8df8dac90931510a679": { - "balance": "2000000000000000000000" + "0x5e8e4df18cf0af770978a8df8dac90931510a679": { + "balance": "0x6c6b935b8bbd400000" }, - "05d68dad61d3bbdfb3f779265c49474aff3fcd30": { - "balance": "39399000000000000000" + "0x05d68dad61d3bbdfb3f779265c49474aff3fcd30": { + "balance": "0x222c55dc1519d8000" }, - "96eafbf2fb6f4db9a436a74c45b5654452e23819": { - "balance": "20000000000000000000" + "0x96eafbf2fb6f4db9a436a74c45b5654452e23819": { + "balance": "0x1158e460913d00000" }, - "d7d7f2caa462a41b3b30a34aeb3ba61010e2626f": { - "balance": "2000000000000000000000" + "0xd7d7f2caa462a41b3b30a34aeb3ba61010e2626f": { + "balance": "0x6c6b935b8bbd400000" }, - "0b71f554122469ef978e2f1fefd7cbb410982772": { - "balance": "3880000000000000000000" + "0x0b71f554122469ef978e2f1fefd7cbb410982772": { + "balance": "0xd255d112e103a00000" }, - "504666ce8931175e11a5ed11c1dcaa06e57f4e66": { - "balance": "11792000000000000000000" + "0x504666ce8931175e11a5ed11c1dcaa06e57f4e66": { + "balance": "0x27f3edfb34e6e400000" }, - "d00f067286c0fbd082f9f4a61083ec76deb3cee6": { - "balance": "1000000000000000000000" + "0xd00f067286c0fbd082f9f4a61083ec76deb3cee6": { + "balance": "0x3635c9adc5dea00000" }, - "02e4cb22be46258a40e16d4338d802fffd00c151": { - "balance": "379786000000000000000" + "0x02e4cb22be46258a40e16d4338d802fffd00c151": { + "balance": "0x149696eaceba810000" }, - "1c13d38637b9a47ce79d37a86f50fb409c060728": { - "balance": "1337000000000000000000" + "0x1c13d38637b9a47ce79d37a86f50fb409c060728": { + "balance": "0x487a9a304539440000" }, - "e30212b2011bb56bdbf1bc35690f3a4e0fd905ea": { - "balance": "8022000000000000000000" + "0xe30212b2011bb56bdbf1bc35690f3a4e0fd905ea": { + "balance": "0x1b2df9d219f57980000" }, - "1df6911672679bb0ef3509038c0c27e394fdfe30": { - "balance": "540000000000000000000" + "0x1df6911672679bb0ef3509038c0c27e394fdfe30": { + "balance": "0x1d460162f516f00000" }, - "2b8fe4166e23d11963c0932b8ade8e0145ea0770": { - "balance": "43250000000000000000000" + "0x2b8fe4166e23d11963c0932b8ade8e0145ea0770": { + "balance": "0x92896529baddc880000" }, - "6509eeb1347e842ffb413e37155e2cbc738273fd": { - "balance": "2000000000000000000000" + "0x6509eeb1347e842ffb413e37155e2cbc738273fd": { + "balance": "0x6c6b935b8bbd400000" }, - "8b7e9f6f05f7e36476a16e3e7100c9031cf404af": { - "balance": "1000000000000000000000" + "0x8b7e9f6f05f7e36476a16e3e7100c9031cf404af": { + "balance": "0x3635c9adc5dea00000" }, - "bec8caf7ee49468fee552eff3ac5234eb9b17d42": { - "balance": "2000000000000000000000" + "0xbec8caf7ee49468fee552eff3ac5234eb9b17d42": { + "balance": "0x6c6b935b8bbd400000" }, - "38898bbb4553e00bbfd0cf268b2fc464d154add5": { - "balance": "320000000000000000000" + "0x38898bbb4553e00bbfd0cf268b2fc464d154add5": { + "balance": "0x1158e460913d000000" }, - "cbb3189e4bd7f45f178b1c30c76e26314d4a4b0a": { - "balance": "295007000000000000000" + "0xcbb3189e4bd7f45f178b1c30c76e26314d4a4b0a": { + "balance": "0xffe0b677c65a98000" }, - "be1cd7f4c472070968f3bde268366b21eeea8321": { - "balance": "4300000000000000000000" + "0xbe1cd7f4c472070968f3bde268366b21eeea8321": { + "balance": "0xe91a7cd19fa3b00000" }, - "976a18536af41874426308871bcd1512a775c9f8": { - "balance": "10000000000000000000000" + "0x976a18536af41874426308871bcd1512a775c9f8": { + "balance": "0x21e19e0c9bab2400000" }, - "e9c758f8da41e3346e4350e5ac3976345c6c1082": { - "balance": "1930050000000000000000" + "0xe9c758f8da41e3346e4350e5ac3976345c6c1082": { + "balance": "0x68a0d3092826ad0000" }, - "64ec8a5b743f3479e707dae9ee20ddaa4f40f1d9": { - "balance": "200000000000000000000" + "0x64ec8a5b743f3479e707dae9ee20ddaa4f40f1d9": { + "balance": "0xad78ebc5ac6200000" }, - "9e01765aff08bc220550aca5ea2e1ce8e5b09923": { - "balance": "1000000000000000000000" + "0x9e01765aff08bc220550aca5ea2e1ce8e5b09923": { + "balance": "0x3635c9adc5dea00000" }, - "ba0f39023bdb29eb1862a9f9059cab5d306e662f": { - "balance": "2000000000000000000000" + "0xba0f39023bdb29eb1862a9f9059cab5d306e662f": { + "balance": "0x6c6b935b8bbd400000" }, - "2baf8d6e221174124820ee492b9459ec4fadafbb": { - "balance": "2000000000000000000000" + "0x2baf8d6e221174124820ee492b9459ec4fadafbb": { + "balance": "0x6c6b935b8bbd400000" }, - "655d5cd7489629e2413c2105b5a172d933c27af8": { - "balance": "4040060000000000000000" + "0x655d5cd7489629e2413c2105b5a172d933c27af8": { + "balance": "0xdb03186cd840a60000" }, - "badc2aef9f5951a8d78a6b35c3d0b3a4e6e2e739": { - "balance": "6000000000000000000000" + "0xbadc2aef9f5951a8d78a6b35c3d0b3a4e6e2e739": { + "balance": "0x14542ba12a337c00000" }, - "e64f6e1d6401b56c076b64a1b0867d0b2f310d4e": { - "balance": "51570000000000000000" + "0xe64f6e1d6401b56c076b64a1b0867d0b2f310d4e": { + "balance": "0x2cbad71c53ae50000" }, - "7a8563867901206f3f2bf0fa3e1c8109cabccd85": { - "balance": "137000000000000000000" + "0x7a8563867901206f3f2bf0fa3e1c8109cabccd85": { + "balance": "0x76d41c62494840000" }, - "d17fbe22d90462ed37280670a2ea0b3086a0d6d6": { - "balance": "199955000000000000000" + "0xd17fbe22d90462ed37280670a2ea0b3086a0d6d6": { + "balance": "0xad6eedd17cf3b8000" }, - "e96d7d4cdd15553a4e4d316d6d6480ca3cea1e38": { - "balance": "12200000000000000000000" + "0xe96d7d4cdd15553a4e4d316d6d6480ca3cea1e38": { + "balance": "0x2955d02e1a135a00000" }, - "f04d2c91efb6e9c45ffbe74b434c8c5f2b028f1f": { - "balance": "1000000000000000000000" + "0xf04d2c91efb6e9c45ffbe74b434c8c5f2b028f1f": { + "balance": "0x3635c9adc5dea00000" }, - "81164deb10814ae08391f32c08667b6248c27d7a": { - "balance": "394000000000000000000" + "0x81164deb10814ae08391f32c08667b6248c27d7a": { + "balance": "0x155bd9307f9fe80000" }, - "7f5ae05ae0f8cbe5dfe721f044d7a7bef4c27997": { - "balance": "60000000000000000000" + "0x7f5ae05ae0f8cbe5dfe721f044d7a7bef4c27997": { + "balance": "0x340aad21b3b700000" }, - "c982586d63b0d74c201b1af8418372e30c7616be": { - "balance": "100000000000000000000" + "0xc982586d63b0d74c201b1af8418372e30c7616be": { + "balance": "0x56bc75e2d63100000" }, - "64cf0935bf19d2cebbecd8780d27d2e2b2c34166": { - "balance": "1970000000000000000000" + "0x64cf0935bf19d2cebbecd8780d27d2e2b2c34166": { + "balance": "0x6acb3df27e1f880000" }, - "cd566ad7b883f01fd3998a9a58a9dee4724ddca5": { - "balance": "58848000000000000000" + "0xcd566ad7b883f01fd3998a9a58a9dee4724ddca5": { + "balance": "0x330ae1835be300000" }, - "9da609fa3a7e6cf2cc0e70cdabe78dc4e382e11e": { - "balance": "1200000000000000000000" + "0x9da609fa3a7e6cf2cc0e70cdabe78dc4e382e11e": { + "balance": "0x410d586a20a4c00000" }, - "0d69100c395ce6c5eaadf95d05d872837ededd21": { - "balance": "400000000000000000000" + "0x0d69100c395ce6c5eaadf95d05d872837ededd21": { + "balance": "0x15af1d78b58c400000" }, - "fe91eccf2bd566afa11696c5049fa84c69630a52": { - "balance": "1940000000000000000000" + "0xfe91eccf2bd566afa11696c5049fa84c69630a52": { + "balance": "0x692ae8897081d00000" }, - "005d0ee8155ec0a6ff6808552ca5f16bb5be323a": { - "balance": "197000000000000000000" + "0x005d0ee8155ec0a6ff6808552ca5f16bb5be323a": { + "balance": "0xaadec983fcff40000" }, - "3e5cb8928c417825c03a3bfcc52183e5c91e42d7": { - "balance": "4264790000000000000000" + "0x3e5cb8928c417825c03a3bfcc52183e5c91e42d7": { + "balance": "0xe731d9c52c962f0000" }, - "9c1b771f09af882af0643083de2aa79dc097c40e": { - "balance": "2480000000000000000000" + "0x9c1b771f09af882af0643083de2aa79dc097c40e": { + "balance": "0x8670e9ec6598c00000" }, - "eba388b0da27c87b1cc0eac6c57b2c5a0b459c1a": { - "balance": "6800000000000000000000" + "0xeba388b0da27c87b1cc0eac6c57b2c5a0b459c1a": { + "balance": "0x170a0f5040e50400000" }, - "7529f3797bb6a20f7ea6492419c84c867641d81c": { - "balance": "2000000000000000000000" + "0x7529f3797bb6a20f7ea6492419c84c867641d81c": { + "balance": "0x6c6b935b8bbd400000" }, - "532a7da0a5ad7407468d3be8e07e69c7dd64e861": { - "balance": "500000000000000000000" + "0x532a7da0a5ad7407468d3be8e07e69c7dd64e861": { + "balance": "0x1b1ae4d6e2ef500000" }, - "de82cc8d4a1bb1d9434392965b3e80bad3c03d4f": { - "balance": "1477500000000000000000" + "0xde82cc8d4a1bb1d9434392965b3e80bad3c03d4f": { + "balance": "0x50186e75de97a60000" }, - "4a82694fa29d9e213202a1a209285df6e745c209": { - "balance": "4000000000000000000000" + "0x4a82694fa29d9e213202a1a209285df6e745c209": { + "balance": "0xd8d726b7177a800000" }, - "3e53ff2107a8debe3328493a92a586a7e1f49758": { - "balance": "23143470000000000000000" + "0x3e53ff2107a8debe3328493a92a586a7e1f49758": { + "balance": "0x4e69c2a71a405ab0000" }, - "b2ddb786d3794e270187d0451ad6c8b79e0e8745": { - "balance": "400000000000000000000" + "0xb2ddb786d3794e270187d0451ad6c8b79e0e8745": { + "balance": "0x15af1d78b58c400000" }, - "6ebcf9957f5fc5e985add475223b04b8c14a7aed": { - "balance": "1730000000000000000000" + "0x6ebcf9957f5fc5e985add475223b04b8c14a7aed": { + "balance": "0x5dc892aa1131c80000" }, - "c5c7590b5621ecf8358588de9b6890f2626143f1": { - "balance": "3000000000000000000000" + "0xc5c7590b5621ecf8358588de9b6890f2626143f1": { + "balance": "0xa2a15d09519be00000" }, - "ae4f122e35c0b1d1e4069291457c83c07f965fa3": { - "balance": "1000000000000000000000" + "0xae4f122e35c0b1d1e4069291457c83c07f965fa3": { + "balance": "0x3635c9adc5dea00000" }, - "47885ababedf4d928e1c3c71d7ca40d563ed595f": { - "balance": "1820000000000000000000" + "0x47885ababedf4d928e1c3c71d7ca40d563ed595f": { + "balance": "0x62a992e53a0af00000" }, - "78ce3e3d474a8a047b92c41542242d0a08c70f99": { - "balance": "10000000000000000000000" + "0x78ce3e3d474a8a047b92c41542242d0a08c70f99": { + "balance": "0x21e19e0c9bab2400000" }, - "6134d942f037f2cc3d424a230c603d67abd3edf7": { - "balance": "2000000000000000000000" + "0x6134d942f037f2cc3d424a230c603d67abd3edf7": { + "balance": "0x6c6b935b8bbd400000" }, - "1360e87df24c69ee6d51c76e73767ffe19a2131c": { - "balance": "92000000000000000000" + "0x1360e87df24c69ee6d51c76e73767ffe19a2131c": { + "balance": "0x4fcc1a89027f00000" }, - "5fd1c3e31778276cb42ea740f5eae9c641dbc701": { - "balance": "194000000000000000000" + "0x5fd1c3e31778276cb42ea740f5eae9c641dbc701": { + "balance": "0xa844a7424d9c80000" }, - "98397342ec5f3d4cb877e54ef5d6f1d366731bd4": { - "balance": "5910000000000000000000" + "0x98397342ec5f3d4cb877e54ef5d6f1d366731bd4": { + "balance": "0x14061b9d77a5e980000" }, - "6d4b5c05d06a20957e1748ab6df206f343f92f01": { - "balance": "10020475000000000000000" + "0x6d4b5c05d06a20957e1748ab6df206f343f92f01": { + "balance": "0x21f360699bf825f8000" }, - "e6115b13f9795f7e956502d5074567dab945ce6b": { - "balance": "100000000000000000000000" + "0xe6115b13f9795f7e956502d5074567dab945ce6b": { + "balance": "0x152d02c7e14af6800000" }, - "23730c357a91026e44b1d0e2fc2a51d071d8d77b": { - "balance": "4000000000000000000000" + "0x23730c357a91026e44b1d0e2fc2a51d071d8d77b": { + "balance": "0xd8d726b7177a800000" }, - "fae881937047895a660cf229760f27e66828d643": { - "balance": "182000000000000000000" + "0xfae881937047895a660cf229760f27e66828d643": { + "balance": "0x9ddc1e3b901180000" }, - "ff3ef6ba151c21b59986ae64f6e8228bc9a2c733": { - "balance": "2000000000000000000000" + "0xff3ef6ba151c21b59986ae64f6e8228bc9a2c733": { + "balance": "0x6c6b935b8bbd400000" }, - "dfbd4232c17c407a980db87ffbcda03630e5c459": { - "balance": "553150000000000000000" + "0xdfbd4232c17c407a980db87ffbcda03630e5c459": { + "balance": "0x1dfc7f924923530000" }, - "4429a29fee198450672c0c1d073162250bec6474": { - "balance": "999200000000000000000" + "0x4429a29fee198450672c0c1d073162250bec6474": { + "balance": "0x362aaf8202f2500000" }, - "7e8f96cc29f57b0975120cb593b7dd833d606b53": { - "balance": "197000000000000000000" + "0x7e8f96cc29f57b0975120cb593b7dd833d606b53": { + "balance": "0xaadec983fcff40000" }, - "5ed3f1ebe2ae6756b5d8dc19cad02c419aa5778b": { - "balance": "0" + "0x5ed3f1ebe2ae6756b5d8dc19cad02c419aa5778b": { + "balance": "0x0" }, - "daa776a6754469d7b9267a89b86725e740da0fa0": { - "balance": "1970000000000000000000" + "0xdaa776a6754469d7b9267a89b86725e740da0fa0": { + "balance": "0x6acb3df27e1f880000" }, - "139e479764b499d666208c4a8a047a97043163dd": { - "balance": "598880000000000000000" + "0x139e479764b499d666208c4a8a047a97043163dd": { + "balance": "0x2077212aff6df00000" }, - "5ad5e420755613886f35aa56ac403eebdfe4b0d0": { - "balance": "80000000000000000000000" + "0x5ad5e420755613886f35aa56ac403eebdfe4b0d0": { + "balance": "0x10f0cf064dd592000000" }, - "3fe801e61335c5140dc7eda2ef5204460a501230": { - "balance": "2000000000000000000000" + "0x3fe801e61335c5140dc7eda2ef5204460a501230": { + "balance": "0x6c6b935b8bbd400000" }, - "ce8a6b6d5033b1498b1ffeb41a41550405fa03a2": { - "balance": "4000000000000000000000" + "0xce8a6b6d5033b1498b1ffeb41a41550405fa03a2": { + "balance": "0xd8d726b7177a800000" }, - "26c2ffc30efdc5273e76183a16c2698d6e531286": { - "balance": "776000000000000000000" + "0x26c2ffc30efdc5273e76183a16c2698d6e531286": { + "balance": "0x2a1129d09367200000" }, - "71ec3aec3f8f9221f9149fede06903a0f9a232f2": { - "balance": "200000000000000000000" + "0x71ec3aec3f8f9221f9149fede06903a0f9a232f2": { + "balance": "0xad78ebc5ac6200000" }, - "ef35f6d4b1075e6aa139151c974b2f4658f70538": { - "balance": "1111111000000000000000" + "0xef35f6d4b1075e6aa139151c974b2f4658f70538": { + "balance": "0x3c3bc33f94e50d8000" }, - "26a68eab905a8b3dce00e317308225dab1b9f6b8": { - "balance": "1980000000000000000000" + "0x26a68eab905a8b3dce00e317308225dab1b9f6b8": { + "balance": "0x6b56051582a9700000" }, - "63f5b53d79bf2e411489526530223845fac6f601": { - "balance": "30000000000000000000000" + "0x63f5b53d79bf2e411489526530223845fac6f601": { + "balance": "0x65a4da25d3016c00000" }, - "481115296ab7db52492ff7b647d63329fb5cbc6b": { - "balance": "16100000000000000000000" + "0x481115296ab7db52492ff7b647d63329fb5cbc6b": { + "balance": "0x368c8623a8b4d100000" }, - "f19f193508393e4d2a127b20b2031f39c82581c6": { - "balance": "3500088000000000000000" + "0xf19f193508393e4d2a127b20b2031f39c82581c6": { + "balance": "0xbdbd7a83bd2f6c0000" }, - "500e34cde5bd9e2b71bb92d7cf55eee188d5fa0c": { - "balance": "5348000000000000000000" + "0x500e34cde5bd9e2b71bb92d7cf55eee188d5fa0c": { + "balance": "0x121ea68c114e5100000" }, - "65ea67ad3fb56ad5fb94387dd38eb383001d7c68": { - "balance": "100000000000000000000" + "0x65ea67ad3fb56ad5fb94387dd38eb383001d7c68": { + "balance": "0x56bc75e2d63100000" }, - "7f9f9b56e4289dfb58e70fd5f12a97b56d35c6a5": { - "balance": "1970000000000000000000" + "0x7f9f9b56e4289dfb58e70fd5f12a97b56d35c6a5": { + "balance": "0x6acb3df27e1f880000" }, - "60be6f953f2a4d25b6256ffd2423ac1438252e4e": { - "balance": "150000000000000000000" + "0x60be6f953f2a4d25b6256ffd2423ac1438252e4e": { + "balance": "0x821ab0d4414980000" }, - "ac1dfc984b71a19929a81d81f04a7cbb14073703": { - "balance": "600000000000000000000" + "0xac1dfc984b71a19929a81d81f04a7cbb14073703": { + "balance": "0x2086ac351052600000" }, - "a3c14ace28b192cbb062145fcbbd5869c67271f6": { - "balance": "8000000000000000000000" + "0xa3c14ace28b192cbb062145fcbbd5869c67271f6": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "2da76b7c39b420e388ba2c1020b0856b0270648a": { - "balance": "2000000000000000000000" + "0x2da76b7c39b420e388ba2c1020b0856b0270648a": { + "balance": "0x6c6b935b8bbd400000" }, - "622be4b45495fcd93143efc412d699d6cdc23dc5": { - "balance": "17300000000000000000" + "0x622be4b45495fcd93143efc412d699d6cdc23dc5": { + "balance": "0xf015f25736420000" }, - "d3f873bd9956135789ab00ebc195b922e94b259d": { - "balance": "2000000000000000000000" + "0xd3f873bd9956135789ab00ebc195b922e94b259d": { + "balance": "0x6c6b935b8bbd400000" }, - "975f3764e97bbccf767cbd3b795ba86d8ba9840e": { - "balance": "346000000000000000000" + "0x975f3764e97bbccf767cbd3b795ba86d8ba9840e": { + "balance": "0x12c1b6eed03d280000" }, - "fc39be41094b1997d2169e8264c2c3baa6c99bc4": { - "balance": "2000000000000000000000" + "0xfc39be41094b1997d2169e8264c2c3baa6c99bc4": { + "balance": "0x6c6b935b8bbd400000" }, - "12ffc1128605cb0c13709a7290506f2690977193": { - "balance": "3340000000000000000000" + "0x12ffc1128605cb0c13709a7290506f2690977193": { + "balance": "0xb50fcfafebecb00000" }, - "9b1168de8ab64b47552f3389800a9cc08b4666cf": { - "balance": "1730000000000000000000" + "0x9b1168de8ab64b47552f3389800a9cc08b4666cf": { + "balance": "0x5dc892aa1131c80000" }, - "9f1aa8fcfc89a1a5328cbd6344b71f278a2ca4a0": { - "balance": "500000000000000000000" + "0x9f1aa8fcfc89a1a5328cbd6344b71f278a2ca4a0": { + "balance": "0x1b1ae4d6e2ef500000" }, - "505a33a18634dd4800693c67f48a1d693d4833f8": { - "balance": "7252000000000000000000" + "0x505a33a18634dd4800693c67f48a1d693d4833f8": { + "balance": "0x18921b79941dcd00000" }, - "d08fc09a0030fd0928cd321198580182a76aae9f": { - "balance": "1000000000000000000000" + "0xd08fc09a0030fd0928cd321198580182a76aae9f": { + "balance": "0x3635c9adc5dea00000" }, - "6acddca3cd2b4990e25cd65c24149d0912099e79": { - "balance": "3000037000000000000000" + "0x6acddca3cd2b4990e25cd65c24149d0912099e79": { + "balance": "0xa2a1e07c9f6c908000" }, - "397a6ef8763a18f00fac217e055c0d3094101011": { - "balance": "2000000000000000000000" + "0x397a6ef8763a18f00fac217e055c0d3094101011": { + "balance": "0x6c6b935b8bbd400000" }, - "4e0bd32473c4c51bf25654def69f797c6b29a232": { - "balance": "1600930000000000000000" + "0x4e0bd32473c4c51bf25654def69f797c6b29a232": { + "balance": "0x56c95de8e8ca1d0000" }, - "28d8c35fb7eea622582135e3ad47a227c9a663bd": { - "balance": "18200000000000000000" + "0x28d8c35fb7eea622582135e3ad47a227c9a663bd": { + "balance": "0xfc936392801c0000" }, - "f96488698590dc3b2c555642b871348dfa067ad5": { - "balance": "500000000000000000000" + "0xf96488698590dc3b2c555642b871348dfa067ad5": { + "balance": "0x1b1ae4d6e2ef500000" }, - "4eebe80cb6f3ae5904f6f4b28d907f907189fcab": { - "balance": "1999944000000000000000" + "0x4eebe80cb6f3ae5904f6f4b28d907f907189fcab": { + "balance": "0x6c6acc67d7b1d40000" }, - "8d1abd897dacd4312e18080c88fb9647eab44052": { - "balance": "216000000000000000000" + "0x8d1abd897dacd4312e18080c88fb9647eab44052": { + "balance": "0xbb59a27953c600000" }, - "457029c469c4548d168cec3e65872e4428d42b67": { - "balance": "2000000000000000000000" + "0x457029c469c4548d168cec3e65872e4428d42b67": { + "balance": "0x6c6b935b8bbd400000" }, - "1296acded1e063af39fe8ba0b4b63df789f70517": { - "balance": "100014000000000000000" + "0x1296acded1e063af39fe8ba0b4b63df789f70517": { + "balance": "0x56bf91b1a65eb0000" }, - "71762c63678c18d1c6378ce068e666381315147e": { - "balance": "2000000000000000000000" + "0x71762c63678c18d1c6378ce068e666381315147e": { + "balance": "0x6c6b935b8bbd400000" }, - "6cc1c878fa6cde8a9a0b8311247e741e4642fe6d": { - "balance": "985000000000000000000" + "0x6cc1c878fa6cde8a9a0b8311247e741e4642fe6d": { + "balance": "0x35659ef93f0fc40000" }, - "8d9ed7f4553058c26f7836a3802d3064eb1b363d": { - "balance": "90000000000000000000" + "0x8d9ed7f4553058c26f7836a3802d3064eb1b363d": { + "balance": "0x4e1003b28d9280000" }, - "5032e4bcf7932b49fdba377b6f1499636513cfc3": { - "balance": "100000000000000000000" + "0x5032e4bcf7932b49fdba377b6f1499636513cfc3": { + "balance": "0x56bc75e2d63100000" }, - "462b678b51b584f3ed7ada070b5cd99c0bf7b87f": { - "balance": "100000000000000000000" + "0x462b678b51b584f3ed7ada070b5cd99c0bf7b87f": { + "balance": "0x56bc75e2d63100000" }, - "c8aa49e3809f0899f28ab57e6743709d58419033": { - "balance": "880000000000000000000" + "0xc8aa49e3809f0899f28ab57e6743709d58419033": { + "balance": "0x2fb474098f67c00000" }, - "01b1cae91a3b9559afb33cdc6d689442fdbfe037": { - "balance": "200000000000000000000" + "0x01b1cae91a3b9559afb33cdc6d689442fdbfe037": { + "balance": "0xad78ebc5ac6200000" }, - "b1043004ec1941a8cf4f2b00b15700ddac6ff17e": { - "balance": "1000000000000000000000" + "0xb1043004ec1941a8cf4f2b00b15700ddac6ff17e": { + "balance": "0x3635c9adc5dea00000" }, - "5ba2c6c35dfaec296826591904d544464aeabd5e": { - "balance": "20000000000000000000" + "0x5ba2c6c35dfaec296826591904d544464aeabd5e": { + "balance": "0x1158e460913d00000" }, - "b32400fd13c5500917cb037b29fe22e7d5228f2d": { - "balance": "40000000000000000000000" + "0xb32400fd13c5500917cb037b29fe22e7d5228f2d": { + "balance": "0x878678326eac9000000" }, - "d59d92d2c8701980cc073c375d720af064743c0c": { - "balance": "19000000000000000000000" + "0xd59d92d2c8701980cc073c375d720af064743c0c": { + "balance": "0x405fdf7e5af85e00000" }, - "11dd6185d9a8d73ddfdaa71e9b7774431c4dfec2": { - "balance": "1000000000000000000000" + "0x11dd6185d9a8d73ddfdaa71e9b7774431c4dfec2": { + "balance": "0x3635c9adc5dea00000" }, - "d4cb21e590c5a0e06801366aff342c7d7db16424": { - "balance": "494000000000000000000" + "0xd4cb21e590c5a0e06801366aff342c7d7db16424": { + "balance": "0x1ac7a08ead02f80000" }, - "5b6d55f6712967405c659129f4b1de09acf2cb7b": { - "balance": "267400000000000000000" + "0x5b6d55f6712967405c659129f4b1de09acf2cb7b": { + "balance": "0xe7eeba3410b740000" }, - "6179979907fe7f037e4c38029d60bcbab832b3d6": { - "balance": "1610000000000000000000" + "0x6179979907fe7f037e4c38029d60bcbab832b3d6": { + "balance": "0x57473d05dabae80000" }, - "33c407133b84b3ca4c3ded1f4658900c38101624": { - "balance": "2800000000000000000000" + "0x33c407133b84b3ca4c3ded1f4658900c38101624": { + "balance": "0x97c9ce4cf6d5c00000" }, - "cd2a36d753e9e0ed012a584d716807587b41d56a": { - "balance": "261400000000000000000" + "0xcd2a36d753e9e0ed012a584d716807587b41d56a": { + "balance": "0xe2ba75b0b1f1c0000" }, - "8155fa6c51eb31d808412d748aa086105018122f": { - "balance": "1880000000000000000000" + "0x8155fa6c51eb31d808412d748aa086105018122f": { + "balance": "0x65ea3db75546600000" }, - "3ecc8e1668dde995dc570fe414f44211c534a615": { - "balance": "2000000000000000000000" + "0x3ecc8e1668dde995dc570fe414f44211c534a615": { + "balance": "0x6c6b935b8bbd400000" }, - "d6395db5a4bb66e60f4cfbcdf0057bb4d97862e2": { - "balance": "910000000000000000000" + "0xd6395db5a4bb66e60f4cfbcdf0057bb4d97862e2": { + "balance": "0x3154c9729d05780000" }, - "b6fb39786250081426a342c70d47ee521e5bc563": { - "balance": "15000000000000000000000" + "0xb6fb39786250081426a342c70d47ee521e5bc563": { + "balance": "0x32d26d12e980b600000" }, - "510eda5601499a0d5e1a006bfffd833672f2e267": { - "balance": "2000000000000000000000" + "0x510eda5601499a0d5e1a006bfffd833672f2e267": { + "balance": "0x6c6b935b8bbd400000" }, - "98c19dba810ba611e68f2f83ee16f6e7744f0c1f": { - "balance": "200000000000000000000" + "0x98c19dba810ba611e68f2f83ee16f6e7744f0c1f": { + "balance": "0xad78ebc5ac6200000" }, - "34ff26eb60a8d1a95a489fae136ee91d4e58084c": { - "balance": "600000000000000000000" + "0x34ff26eb60a8d1a95a489fae136ee91d4e58084c": { + "balance": "0x2086ac351052600000" }, - "6ad90be252d9cd464d998125fab693060ba8e429": { - "balance": "4000000000000000000000" + "0x6ad90be252d9cd464d998125fab693060ba8e429": { + "balance": "0xd8d726b7177a800000" }, - "038323b184cff7a82ae2e1bda7793fe4319ca0bf": { - "balance": "20000000000000000000000" + "0x038323b184cff7a82ae2e1bda7793fe4319ca0bf": { + "balance": "0x43c33c1937564800000" }, - "dc5305b4020a06b49d657c7ca34c35c91c5f2c56": { - "balance": "7045990000000000000000" + "0xdc5305b4020a06b49d657c7ca34c35c91c5f2c56": { + "balance": "0x17df6c10dbeba970000" }, - "c9c80dc12e7bab86e949d01e4c3ed35f2b9bba5f": { - "balance": "2000000000000000000000" + "0xc9c80dc12e7bab86e949d01e4c3ed35f2b9bba5f": { + "balance": "0x6c6b935b8bbd400000" }, - "7beb81fb2f5e91526b2ac9795e76c69bcff04bc0": { - "balance": "69400000000000000000000" + "0x7beb81fb2f5e91526b2ac9795e76c69bcff04bc0": { + "balance": "0xeb22e794f0a8d600000" }, - "b8bc9bca7f71b4ed12e620438d620f53c114342f": { - "balance": "500000000000000000000" + "0xb8bc9bca7f71b4ed12e620438d620f53c114342f": { + "balance": "0x1b1ae4d6e2ef500000" }, - "d288e7cb7ba9f620ab0f7452e508633d1c5aa276": { - "balance": "4000000000000000000000" + "0xd288e7cb7ba9f620ab0f7452e508633d1c5aa276": { + "balance": "0xd8d726b7177a800000" }, - "a2e460a989cb15565f9ecca7d121a18e4eb405b6": { - "balance": "2000000000000000000000" + "0xa2e460a989cb15565f9ecca7d121a18e4eb405b6": { + "balance": "0x6c6b935b8bbd400000" }, - "7489cc8abe75cda4ef0d01cef2605e47eda67ab1": { - "balance": "133700000000000000000" + "0x7489cc8abe75cda4ef0d01cef2605e47eda67ab1": { + "balance": "0x73f75d1a085ba0000" }, - "38b403fb1fb7c14559a2d6f6564a5552bca39aff": { - "balance": "2000000000000000000000" + "0x38b403fb1fb7c14559a2d6f6564a5552bca39aff": { + "balance": "0x6c6b935b8bbd400000" }, - "e55c80520a1b0f755b9a2cd3ce214f7625653e8a": { - "balance": "2000000000000000000000" + "0xe55c80520a1b0f755b9a2cd3ce214f7625653e8a": { + "balance": "0x6c6b935b8bbd400000" }, - "451b7070259bdba27100e36e23428a53dfe304e9": { - "balance": "13370000000000000000" + "0x451b7070259bdba27100e36e23428a53dfe304e9": { + "balance": "0xb98bc829a6f90000" }, - "8b5c914b128bf1695c088923fa467e7911f351fa": { - "balance": "98500000000000000000" + "0x8b5c914b128bf1695c088923fa467e7911f351fa": { + "balance": "0x556f64c1fe7fa0000" }, - "17df49518d73b129f0da36b1c9b40cb66420fdc7": { - "balance": "10000000000000000000000" + "0x17df49518d73b129f0da36b1c9b40cb66420fdc7": { + "balance": "0x21e19e0c9bab2400000" }, - "c1950543554d8a713003f662bb612c10ad4cdf21": { - "balance": "18200000000000000000" + "0xc1950543554d8a713003f662bb612c10ad4cdf21": { + "balance": "0xfc936392801c0000" }, - "fa7606435b356cee257bd2fcd3d9eacb3cd1c4e1": { - "balance": "100000000000000000000" + "0xfa7606435b356cee257bd2fcd3d9eacb3cd1c4e1": { + "balance": "0x56bc75e2d63100000" }, - "e0bad98eee9698dbf6d76085b7923de5754e906d": { - "balance": "167000000000000000000" + "0xe0bad98eee9698dbf6d76085b7923de5754e906d": { + "balance": "0x90d972f32323c0000" }, - "ce53c8cdd74296aca987b2bc19c2b875a48749d0": { - "balance": "3000000000000000000000" + "0xce53c8cdd74296aca987b2bc19c2b875a48749d0": { + "balance": "0xa2a15d09519be00000" }, - "d0c55abf976fdc3db2afe9be99d499484d576c02": { - "balance": "1000000000000000000000" + "0xd0c55abf976fdc3db2afe9be99d499484d576c02": { + "balance": "0x3635c9adc5dea00000" }, - "238a6b7635252f5244486c0af0a73a207385e039": { - "balance": "1370000000000000000000" + "0x238a6b7635252f5244486c0af0a73a207385e039": { + "balance": "0x4a4491bd6dcd280000" }, - "ceb389381d48a8ae4ffc483ad0bb5e204cfdb1ec": { - "balance": "740745000000000000000" + "0xceb389381d48a8ae4ffc483ad0bb5e204cfdb1ec": { + "balance": "0x2827e6e4dd62ba8000" }, - "3847667038f33b01c1cc795d8daf5475eff5a0d4": { - "balance": "728330000000000000000" + "0x3847667038f33b01c1cc795d8daf5475eff5a0d4": { + "balance": "0x277b9bf4246c410000" }, - "a08d215b5b6aac4861a281ac7e400b78fef04cbf": { - "balance": "20000000000000000000" + "0xa08d215b5b6aac4861a281ac7e400b78fef04cbf": { + "balance": "0x1158e460913d00000" }, - "2d0dec51a6e87330a6a8fa2a0f65d88d4abcdf73": { - "balance": "185000000000000000000" + "0x2d0dec51a6e87330a6a8fa2a0f65d88d4abcdf73": { + "balance": "0xa076407d3f7440000" }, - "9e8f64ddcde9b8b451bafaa235a9bf511a25ac91": { - "balance": "2674000000000000000000" + "0x9e8f64ddcde9b8b451bafaa235a9bf511a25ac91": { + "balance": "0x90f534608a72880000" }, - "ddac6bf4bbdd7d597d9c686d0695593bedccc7fa": { - "balance": "865000000000000000000" + "0xddac6bf4bbdd7d597d9c686d0695593bedccc7fa": { + "balance": "0x2ee449550898e40000" }, - "22e15158b5ee3e86eb0332e3e6a9ac6cd9b55ecd": { - "balance": "160000000000000000000" + "0x22e15158b5ee3e86eb0332e3e6a9ac6cd9b55ecd": { + "balance": "0x8ac7230489e800000" }, - "3aea4e82d2400248f99871a41ca257060d3a221b": { - "balance": "1000000000000000000000" + "0x3aea4e82d2400248f99871a41ca257060d3a221b": { + "balance": "0x3635c9adc5dea00000" }, - "fb126f0ec769f49dcefca2f200286451583084b8": { - "balance": "5013750000000000000000" + "0xfb126f0ec769f49dcefca2f200286451583084b8": { + "balance": "0x10fcbc2350396bf0000" }, - "1b8bd6d2eca20185a78e7d98e8e185678dac4830": { - "balance": "16700000000000000000000" + "0x1b8bd6d2eca20185a78e7d98e8e185678dac4830": { + "balance": "0x3894f0e6f9b9f700000" }, - "664cd67dccc9ac8228b45c55db8d76550b659cdc": { - "balance": "394000000000000000000" + "0x664cd67dccc9ac8228b45c55db8d76550b659cdc": { + "balance": "0x155bd9307f9fe80000" }, - "553f37d92466550e9fd775ae74362df030179132": { - "balance": "2000000000000000000000" + "0x553f37d92466550e9fd775ae74362df030179132": { + "balance": "0x6c6b935b8bbd400000" }, - "730d8763c6a4fd824ab8b859161ef7e3a96a1200": { - "balance": "20000000000000000000000" + "0x730d8763c6a4fd824ab8b859161ef7e3a96a1200": { + "balance": "0x43c33c1937564800000" }, - "04c2c64bb54c3eccd05585e10ec6f99a0cdb01a3": { - "balance": "100000000000000000000" + "0x04c2c64bb54c3eccd05585e10ec6f99a0cdb01a3": { + "balance": "0x56bc75e2d63100000" }, - "f1624d980b65336feac5a6d54125005cfcf2aacb": { - "balance": "2000000000000000000000" + "0xf1624d980b65336feac5a6d54125005cfcf2aacb": { + "balance": "0x6c6b935b8bbd400000" }, - "0b7fc9ddf70576f6330669eaaa71b6a831e99528": { - "balance": "140000000000000000000" + "0x0b7fc9ddf70576f6330669eaaa71b6a831e99528": { + "balance": "0x796e3ea3f8ab00000" }, - "fa2bbca15d3fe39f8a328e91f90da14f7ac6253d": { - "balance": "200000000000000000000" + "0xfa2bbca15d3fe39f8a328e91f90da14f7ac6253d": { + "balance": "0xad78ebc5ac6200000" }, - "07feef54c136850829badc4b49c3f2a73c89fb9e": { - "balance": "118200000000000000000" + "0x07feef54c136850829badc4b49c3f2a73c89fb9e": { + "balance": "0x6685ac1bfe32c0000" }, - "3703350c4d6fe337342cddc65bf1e2386bf3f9b2": { - "balance": "2020000000000000000000" + "0x3703350c4d6fe337342cddc65bf1e2386bf3f9b2": { + "balance": "0x6d8121a194d1100000" }, - "6d7d1c949511f88303808c60c5ea0640fcc02683": { - "balance": "10000000000000000000000" + "0x6d7d1c949511f88303808c60c5ea0640fcc02683": { + "balance": "0x21e19e0c9bab2400000" }, - "34fa7792bad8bbd7ff64056214a33eb6600c1ea8": { - "balance": "50000000000000000000" + "0x34fa7792bad8bbd7ff64056214a33eb6600c1ea8": { + "balance": "0x2b5e3af16b1880000" }, - "994cc2b5227ec3cf048512467c41b7b7b748909f": { - "balance": "2000000000000000000000" + "0x994cc2b5227ec3cf048512467c41b7b7b748909f": { + "balance": "0x6c6b935b8bbd400000" }, - "08da3a7a0f452161cfbcec311bb68ebfdee17e88": { - "balance": "2000000000000000000000" + "0x08da3a7a0f452161cfbcec311bb68ebfdee17e88": { + "balance": "0x6c6b935b8bbd400000" }, - "bbb4ee1d82f2e156442cc93338a2fc286fa28864": { - "balance": "1370000000000000000000" + "0xbbb4ee1d82f2e156442cc93338a2fc286fa28864": { + "balance": "0x4a4491bd6dcd280000" }, - "7a2dfc770e24368131b7847795f203f3d50d5b56": { - "balance": "11400000000000000000000" + "0x7a2dfc770e24368131b7847795f203f3d50d5b56": { + "balance": "0x269fec7f0361d200000" }, - "7cef4d43aa417f9ef8b787f8b99d53f1fea1ee88": { - "balance": "1910000000000000000000" + "0x7cef4d43aa417f9ef8b787f8b99d53f1fea1ee88": { + "balance": "0x678a932062e4180000" }, - "c6a30ef5bb3320f40dc5e981230d52ae3ac19322": { - "balance": "182000000000000000000" + "0xc6a30ef5bb3320f40dc5e981230d52ae3ac19322": { + "balance": "0x9ddc1e3b901180000" }, - "6a74844d8e9cb5581c45079a2e94462a6cee8821": { - "balance": "1082970000000000000000" + "0x6a74844d8e9cb5581c45079a2e94462a6cee8821": { + "balance": "0x3ab53a552dd4c90000" }, - "c3110be01dc9734cfc6e1ce07f87d77d1345b7e1": { - "balance": "4999998000000000000000" + "0xc3110be01dc9734cfc6e1ce07f87d77d1345b7e1": { + "balance": "0x10f0ce949e00f930000" }, - "aeb916ebf49d0f86c13f7331cef19e129937512d": { - "balance": "599908000000000000000" + "0xaeb916ebf49d0f86c13f7331cef19e129937512d": { + "balance": "0x2085655b8d1b0a0000" }, - "3e5abd09ce5af7ba8487c359e0f2a93a986b0b18": { - "balance": "10000000000000000000000" + "0x3e5abd09ce5af7ba8487c359e0f2a93a986b0b18": { + "balance": "0x21e19e0c9bab2400000" }, - "cdd60d73efaad873c9bbfb178ca1b7105a81a681": { - "balance": "32000000000000000000" + "0xcdd60d73efaad873c9bbfb178ca1b7105a81a681": { + "balance": "0x1bc16d674ec800000" }, - "31eb123c95c82bf685ace7a75a1881a289efca10": { - "balance": "920034000000000000000" + "0x31eb123c95c82bf685ace7a75a1881a289efca10": { + "balance": "0x31e009607371bd0000" }, - "86e8670e27598ea09c3899ab7711d3b9fe901c17": { - "balance": "200000000000000000000" + "0x86e8670e27598ea09c3899ab7711d3b9fe901c17": { + "balance": "0xad78ebc5ac6200000" }, - "a144f6b60f72d64a21e330dadb62d8990ade2b09": { - "balance": "1000000000000000000000" + "0xa144f6b60f72d64a21e330dadb62d8990ade2b09": { + "balance": "0x3635c9adc5dea00000" }, - "68883e152e5660fee59626e7e3b4f05110e6222f": { - "balance": "54683300000000000000000" + "0x68883e152e5660fee59626e7e3b4f05110e6222f": { + "balance": "0xb94633be975a62a0000" }, - "fe4249127950e2f896ec0e7e2e3d055aab10550f": { - "balance": "668500000000000000000" + "0xfe4249127950e2f896ec0e7e2e3d055aab10550f": { + "balance": "0x243d4d18229ca20000" }, - "403d53cf620f0922b417848dee96c190b5bc8271": { - "balance": "9850000000000000000000" + "0x403d53cf620f0922b417848dee96c190b5bc8271": { + "balance": "0x215f835bc769da80000" }, - "bec2e6de39c07c2bae556acfbee2c4728b9982e3": { - "balance": "573000000000000000000" + "0xbec2e6de39c07c2bae556acfbee2c4728b9982e3": { + "balance": "0x1f0ff8f01daad40000" }, - "f3c4716d1ee5279a86d0163a14618181e16136c7": { - "balance": "1000000000000000000000" + "0xf3c4716d1ee5279a86d0163a14618181e16136c7": { + "balance": "0x3635c9adc5dea00000" }, - "e38ef28a5ed984a7db24a1ae782dfb87f397dfc6": { - "balance": "143000000000000000000" + "0xe38ef28a5ed984a7db24a1ae782dfb87f397dfc6": { + "balance": "0x7c0860e5a80dc0000" }, - "30fbe5885f9fcce9ea5edb82ed4a1196dd259aed": { - "balance": "5200000000000000000000" + "0x30fbe5885f9fcce9ea5edb82ed4a1196dd259aed": { + "balance": "0x119e47f21381f400000" }, - "48bf14d7b1fc84ebf3c96be12f7bce01aa69b03e": { - "balance": "120000000000000000000" + "0x48bf14d7b1fc84ebf3c96be12f7bce01aa69b03e": { + "balance": "0x68155a43676e00000" }, - "b8d5c324a8209d7c8049d0d4aede02ba80ab578b": { - "balance": "16889329000000000000000" + "0xb8d5c324a8209d7c8049d0d4aede02ba80ab578b": { + "balance": "0x393928629fff75e8000" }, - "43d5a71ce8b8f8ae02b2eaf8eaf2ca2840b93fb6": { - "balance": "6000000000000000000000" + "0x43d5a71ce8b8f8ae02b2eaf8eaf2ca2840b93fb6": { + "balance": "0x14542ba12a337c00000" }, - "f9a59c3cc5ffacbcb67be0fc7256f64c9b127cb4": { - "balance": "2000000000000000000000" + "0xf9a59c3cc5ffacbcb67be0fc7256f64c9b127cb4": { + "balance": "0x6c6b935b8bbd400000" }, - "0e21af1b8dbf27fcf63f37e047b87a825cbe7c27": { - "balance": "3000000000000000000000" + "0x0e21af1b8dbf27fcf63f37e047b87a825cbe7c27": { + "balance": "0xa2a15d09519be00000" }, - "1c35aab688a0cd8ef82e76541ba7ac39527f743b": { - "balance": "500000000000000000000" + "0x1c35aab688a0cd8ef82e76541ba7ac39527f743b": { + "balance": "0x1b1ae4d6e2ef500000" }, - "91ac5cfe67c54aa7ebfba448666c461a3b1fe2e1": { - "balance": "401880000000000000000" + "0x91ac5cfe67c54aa7ebfba448666c461a3b1fe2e1": { + "balance": "0x15c93492bf9dfc0000" }, - "4ba53ab549e2016dfa223c9ed5a38fad91288d07": { - "balance": "1400000000000000000000" + "0x4ba53ab549e2016dfa223c9ed5a38fad91288d07": { + "balance": "0x4be4e7267b6ae00000" }, - "99a4de19ded79008cfdcd45d014d2e584b8914a8": { - "balance": "1500000000000000000000" + "0x99a4de19ded79008cfdcd45d014d2e584b8914a8": { + "balance": "0x5150ae84a8cdf00000" }, - "4adbf4aae0e3ef44f7dd4d8985cfaf096ec48e98": { - "balance": "150000000000000000000" + "0x4adbf4aae0e3ef44f7dd4d8985cfaf096ec48e98": { + "balance": "0x821ab0d4414980000" }, - "9a633fcd112cceeb765fe0418170732a9705e79c": { - "balance": "18200000000000000000" + "0x9a633fcd112cceeb765fe0418170732a9705e79c": { + "balance": "0xfc936392801c0000" }, - "292f228b0a94748c8eec612d246f989363e08f08": { - "balance": "185000000000000000000" + "0x292f228b0a94748c8eec612d246f989363e08f08": { + "balance": "0xa076407d3f7440000" }, - "9f3497f5ef5fe63095836c004eb9ce02e9013b4b": { - "balance": "633424000000000000000" + "0x9f3497f5ef5fe63095836c004eb9ce02e9013b4b": { + "balance": "0x2256861bf9cf080000" }, - "0e6dfd553b2e873d2aec15bd5fbb3f8472d8d394": { - "balance": "12000000000000000000000" + "0x0e6dfd553b2e873d2aec15bd5fbb3f8472d8d394": { + "balance": "0x28a857425466f800000" }, - "74ebf4425646e6cf81b109ce7bf4a2a63d84815f": { - "balance": "40000000000000000000" + "0x74ebf4425646e6cf81b109ce7bf4a2a63d84815f": { + "balance": "0x22b1c8c1227a00000" }, - "8ce5e3b5f591d5eca38abf228f2e3c35134bdac0": { - "balance": "2319920000000000000000" + "0x8ce5e3b5f591d5eca38abf228f2e3c35134bdac0": { + "balance": "0x7dc35b84897c380000" }, - "90c41eba008e20cbe927f346603fc88698125969": { - "balance": "42000000000000000000" + "0x90c41eba008e20cbe927f346603fc88698125969": { + "balance": "0x246ddf97976680000" }, - "382ba76db41b75606dd48a48f0137e9174e031b6": { - "balance": "20000000000000000000" + "0x382ba76db41b75606dd48a48f0137e9174e031b6": { + "balance": "0x1158e460913d00000" }, - "5d24bdbc1c47f0eb83d128cae48ac33c4817e91f": { - "balance": "1000000000000000000000" + "0x5d24bdbc1c47f0eb83d128cae48ac33c4817e91f": { + "balance": "0x3635c9adc5dea00000" }, - "a64e5ffb704c2c9139d77ef61d8cdfa31d7a88e9": { - "balance": "143000000000000000000" + "0xa64e5ffb704c2c9139d77ef61d8cdfa31d7a88e9": { + "balance": "0x7c0860e5a80dc0000" }, - "a18360e985f2062e8f8efe02ad2cbc91ad9a5aad": { - "balance": "3000000000000000000000" + "0xa18360e985f2062e8f8efe02ad2cbc91ad9a5aad": { + "balance": "0xa2a15d09519be00000" }, - "d251f903ae18727259eee841a189a1f569a5fd76": { - "balance": "10000000000000000000000" + "0xd251f903ae18727259eee841a189a1f569a5fd76": { + "balance": "0x21e19e0c9bab2400000" }, - "efa6b1f0db603537826891b8b4bc163984bb40cd": { - "balance": "985000000000000000000" + "0xefa6b1f0db603537826891b8b4bc163984bb40cd": { + "balance": "0x35659ef93f0fc40000" }, - "47fff42c678551d141eb75a6ee398117df3e4a8d": { - "balance": "100010000000000000000" + "0x47fff42c678551d141eb75a6ee398117df3e4a8d": { + "balance": "0x56beae51fd2d10000" }, - "f2294adbb6f0dcc76e632ebef48ab49f124dbba4": { - "balance": "1443690000000000000000" + "0xf2294adbb6f0dcc76e632ebef48ab49f124dbba4": { + "balance": "0x4e43393600a7b10000" }, - "53700d53254d430f22781a4a76a463933b5d6b08": { - "balance": "1970000000000000000000" + "0x53700d53254d430f22781a4a76a463933b5d6b08": { + "balance": "0x6acb3df27e1f880000" }, - "b14a7aaa8f49f2fb9a8102d6bbe4c48ae7c06fb2": { - "balance": "8000000000000000000000" + "0xb14a7aaa8f49f2fb9a8102d6bbe4c48ae7c06fb2": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "9ed4e63f526542d44fddd34d59cd25388ffd6bda": { - "balance": "3885000000000000000000" + "0x9ed4e63f526542d44fddd34d59cd25388ffd6bda": { + "balance": "0xd29b34a46348940000" }, - "4cac91fb83a147d2f76c3267984b910a79933348": { - "balance": "2167000000000000000000" + "0x4cac91fb83a147d2f76c3267984b910a79933348": { + "balance": "0x75792a8abdef7c0000" }, - "9b32cf4f5115f4b34a00a64c617de06387354323": { - "balance": "105501000000000000000" + "0x9b32cf4f5115f4b34a00a64c617de06387354323": { + "balance": "0x5b81ed888207c8000" }, - "b8bedd576a4b4c2027da735a5bc3f533252a1808": { - "balance": "2000000000000000000000" + "0xb8bedd576a4b4c2027da735a5bc3f533252a1808": { + "balance": "0x6c6b935b8bbd400000" }, - "c5a3b98e4593fea0b38c4f455a5065f051a2f815": { - "balance": "20309030000000000000000" + "0xc5a3b98e4593fea0b38c4f455a5065f051a2f815": { + "balance": "0x44cf468af25bf770000" }, - "eaf52388546ec35aca6f6c6393d8d609de3a4bf3": { - "balance": "20000000000000000000" + "0xeaf52388546ec35aca6f6c6393d8d609de3a4bf3": { + "balance": "0x1158e460913d00000" }, - "4c423c76930d07f93c47a5cc4f615745c45a9d72": { - "balance": "100000000000000000000" + "0x4c423c76930d07f93c47a5cc4f615745c45a9d72": { + "balance": "0x56bc75e2d63100000" }, - "9052f2e4a3e3c12dd1c71bf78a4ec3043dc88b7e": { - "balance": "267400000000000000000" + "0x9052f2e4a3e3c12dd1c71bf78a4ec3043dc88b7e": { + "balance": "0xe7eeba3410b740000" }, - "2bade91d154517620fd4b439ac97157a4102a9f7": { - "balance": "4000000000000000000000" + "0x2bade91d154517620fd4b439ac97157a4102a9f7": { + "balance": "0xd8d726b7177a800000" }, - "da698d64c65c7f2b2c7253059cd3d181d899b6b7": { - "balance": "295500000000000000000" + "0xda698d64c65c7f2b2c7253059cd3d181d899b6b7": { + "balance": "0x1004e2e45fb7ee0000" }, - "c6d8954e8f3fc533d2d230ff025cb4dce14f3426": { - "balance": "400000000000000000000" + "0xc6d8954e8f3fc533d2d230ff025cb4dce14f3426": { + "balance": "0x15af1d78b58c400000" }, - "349a816b17ab3d27bbc0ae0051f6a070be1ff29d": { - "balance": "10000000000000000000000" + "0x349a816b17ab3d27bbc0ae0051f6a070be1ff29d": { + "balance": "0x21e19e0c9bab2400000" }, - "ff4d9c8484c43c42ff2c5ab759996498d323994d": { - "balance": "4000000000000000000000" + "0xff4d9c8484c43c42ff2c5ab759996498d323994d": { + "balance": "0xd8d726b7177a800000" }, - "22944fbca9b57963084eb84df7c85fb9bcdfb856": { - "balance": "4649845000000000000000" + "0x22944fbca9b57963084eb84df7c85fb9bcdfb856": { + "balance": "0xfc118fef90ba388000" }, - "bfd93c90c29c07bc5fb5fc49aeea55a40e134f35": { - "balance": "28000000000000000000000" + "0xbfd93c90c29c07bc5fb5fc49aeea55a40e134f35": { + "balance": "0x5ede20f01a459800000" }, - "3caedb5319fe806543c56e5021d372f71be9062e": { - "balance": "40000000000000000000000" + "0x3caedb5319fe806543c56e5021d372f71be9062e": { + "balance": "0x878678326eac9000000" }, - "9a079c92a629ca15c8cafa2eb28d5bc17af82811": { - "balance": "500000000000000000000" + "0x9a079c92a629ca15c8cafa2eb28d5bc17af82811": { + "balance": "0x1b1ae4d6e2ef500000" }, - "7d2a52a7cf0c8436a8e007976b6c26b7229d1e15": { - "balance": "438040000000000000000" + "0x7d2a52a7cf0c8436a8e007976b6c26b7229d1e15": { + "balance": "0x17bf06b32a241c0000" }, - "cf89f7460ba3dfe83c5a1d3a019ee1250f242f0f": { - "balance": "985177000000000000000" + "0xcf89f7460ba3dfe83c5a1d3a019ee1250f242f0f": { + "balance": "0x356813cdcefd028000" }, - "577bfe64e3a1e3800e94db1c6c184d8dc8aafc66": { - "balance": "1498000000000000000000" + "0x577bfe64e3a1e3800e94db1c6c184d8dc8aafc66": { + "balance": "0x5134ed17417f280000" }, - "7ffd02ed370c7060b2ae53c078c8012190dfbb75": { - "balance": "10000000000000000000000" + "0x7ffd02ed370c7060b2ae53c078c8012190dfbb75": { + "balance": "0x21e19e0c9bab2400000" }, - "90b62f131a5f29b45571513ee7a74a8f0b232202": { - "balance": "158000000000000000000" + "0x90b62f131a5f29b45571513ee7a74a8f0b232202": { + "balance": "0x890b0c2e14fb80000" }, - "6e8212b722afd408a7a73ed3e2395ee6454a0330": { - "balance": "159000000000000000000" + "0x6e8212b722afd408a7a73ed3e2395ee6454a0330": { + "balance": "0x89e917994f71c0000" }, - "515f30bc90cdf4577ee47d65d785fbe2e837c6bc": { - "balance": "10166128000000000000000" + "0x515f30bc90cdf4577ee47d65d785fbe2e837c6bc": { + "balance": "0x2271b5e018ba0580000" }, - "c27376f45d21e15ede3b26f2655fcee02ccc0f2a": { - "balance": "20000000000000000000" + "0xc27376f45d21e15ede3b26f2655fcee02ccc0f2a": { + "balance": "0x1158e460913d00000" }, - "3da39ce3ef4a7a3966b32ee7ea4ebc2335a8f11f": { - "balance": "2000000000000000000000" + "0x3da39ce3ef4a7a3966b32ee7ea4ebc2335a8f11f": { + "balance": "0x6c6b935b8bbd400000" }, - "25259d975a21d83ae30e33f800f53f37dfa01938": { - "balance": "20000000000000000000" + "0x25259d975a21d83ae30e33f800f53f37dfa01938": { + "balance": "0x1158e460913d00000" }, - "8ed143701f2f72280fd04a7b4164281979ea87c9": { - "balance": "14000000000000000000" + "0x8ed143701f2f72280fd04a7b4164281979ea87c9": { + "balance": "0xc249fdd327780000" }, - "5ac99ad7816ae9020ff8adf79fa9869b7cea6601": { - "balance": "21000000000000000000000" + "0x5ac99ad7816ae9020ff8adf79fa9869b7cea6601": { + "balance": "0x472698b413b43200000" }, - "f51fded80acb502890e87369741f3722514cefff": { - "balance": "20000042000000000000000" + "0xf51fded80acb502890e87369741f3722514cefff": { + "balance": "0x43c3456ca3c6d110000" }, - "f657fcbe682eb4e8db152ecf892456000b513d15": { - "balance": "1940000000000000000000" + "0xf657fcbe682eb4e8db152ecf892456000b513d15": { + "balance": "0x692ae8897081d00000" }, - "62c37c52b97f4b040b1aa391d6dec152893c4707": { - "balance": "1000000000000000000000" + "0x62c37c52b97f4b040b1aa391d6dec152893c4707": { + "balance": "0x3635c9adc5dea00000" }, - "89fc8e4d386b0d0bb4a707edf3bd560df1ad8f4e": { - "balance": "2955000000000000000000" + "0x89fc8e4d386b0d0bb4a707edf3bd560df1ad8f4e": { + "balance": "0xa030dcebbd2f4c0000" }, - "53c0bb7fc88ea422d2ef7e540e2d8f28b1bb8183": { - "balance": "20000000000000000000" + "0x53c0bb7fc88ea422d2ef7e540e2d8f28b1bb8183": { + "balance": "0x1158e460913d00000" }, - "56f493a3d108aaa2d18d98922f8efe1662cfb73d": { - "balance": "2020000000000000000000" + "0x56f493a3d108aaa2d18d98922f8efe1662cfb73d": { + "balance": "0x6d8121a194d1100000" }, - "e9458f68bb272cb5673a04f781b403556fd3a387": { - "balance": "61000000000000000000" + "0xe9458f68bb272cb5673a04f781b403556fd3a387": { + "balance": "0x34e8b88cee2d40000" }, - "be525a33ea916177f17283fca29e8b350b7f530b": { - "balance": "2638000000000000000000" + "0xbe525a33ea916177f17283fca29e8b350b7f530b": { + "balance": "0x8f019aaf46e8780000" }, - "4feb846be43041fd6b34202897943e3f21cb7f04": { - "balance": "83226000000000000000" + "0x4feb846be43041fd6b34202897943e3f21cb7f04": { + "balance": "0x482fe260cbca90000" }, - "15aa530dc36958b4edb38eee6dd9e3c77d4c9145": { - "balance": "2000000000000000000000" + "0x15aa530dc36958b4edb38eee6dd9e3c77d4c9145": { + "balance": "0x6c6b935b8bbd400000" }, - "2458d6555ff98a129cce4037953d00206eff4287": { - "balance": "197000000000000000000" + "0x2458d6555ff98a129cce4037953d00206eff4287": { + "balance": "0xaadec983fcff40000" }, - "8035fe4e6b6af27ae492a578515e9d39fa6fa65b": { - "balance": "4000000000000000000000" + "0x8035fe4e6b6af27ae492a578515e9d39fa6fa65b": { + "balance": "0xd8d726b7177a800000" }, - "296b71c0015819c242a7861e6ff7eded8a5f71e3": { - "balance": "1999800000000000000000" + "0x296b71c0015819c242a7861e6ff7eded8a5f71e3": { + "balance": "0x6c68ccd09b022c0000" }, - "8f1952eed1c548d9ee9b97d0169a07933be69f63": { - "balance": "1000000000000000000000" + "0x8f1952eed1c548d9ee9b97d0169a07933be69f63": { + "balance": "0x3635c9adc5dea00000" }, - "a421dbb89b3a07419084ad10c3c15dfe9b32d0c2": { - "balance": "20000000000000000000000" + "0xa421dbb89b3a07419084ad10c3c15dfe9b32d0c2": { + "balance": "0x43c33c1937564800000" }, - "554336ee4ea155f9f24f87bca9ca72e253e12cd2": { - "balance": "100000000000000000000" + "0x554336ee4ea155f9f24f87bca9ca72e253e12cd2": { + "balance": "0x56bc75e2d63100000" }, - "ffc5fc4b7e8a0293ff39a3a0f7d60d2646d37a74": { - "balance": "2000000000000000000000" + "0xffc5fc4b7e8a0293ff39a3a0f7d60d2646d37a74": { + "balance": "0x6c6b935b8bbd400000" }, - "ea2c197d26e98b0da83e1b72c787618c979d3db0": { - "balance": "19700000000000000000" + "0xea2c197d26e98b0da83e1b72c787618c979d3db0": { + "balance": "0x11164759ffb320000" }, - "96aa573fed2f233410dbae5180145b23c31a02f0": { - "balance": "1730000000000000000000" + "0x96aa573fed2f233410dbae5180145b23c31a02f0": { + "balance": "0x5dc892aa1131c80000" }, - "c23b2f921ce4a37a259ee4ad8b2158d15d664f59": { - "balance": "25403000000000000000" + "0xc23b2f921ce4a37a259ee4ad8b2158d15d664f59": { + "balance": "0x1608995e8bd3f8000" }, - "d874b9dfae456a929ba3b1a27e572c9b2cecdfb3": { - "balance": "170000000000000000000" + "0xd874b9dfae456a929ba3b1a27e572c9b2cecdfb3": { + "balance": "0x93739534d28680000" }, - "bf8b8005d636a49664f74275ef42438acd65ac91": { - "balance": "200000000000000000000" + "0xbf8b8005d636a49664f74275ef42438acd65ac91": { + "balance": "0xad78ebc5ac6200000" }, - "441a52001661fac718b2d7b351b7c6fb521a7afd": { - "balance": "400000000000000000000" + "0x441a52001661fac718b2d7b351b7c6fb521a7afd": { + "balance": "0x15af1d78b58c400000" }, - "812a55c43caedc597218379000ce510d548836fd": { - "balance": "18200000000000000000" + "0x812a55c43caedc597218379000ce510d548836fd": { + "balance": "0xfc936392801c0000" }, - "5e90c85877198756b0366c0e17b28e52b446505a": { - "balance": "374288000000000000000" + "0x5e90c85877198756b0366c0e17b28e52b446505a": { + "balance": "0x144a4a18efeb680000" }, - "da3017c150dd0dce7fcf881b0a48d0d1c756c4c7": { - "balance": "100014000000000000000" + "0xda3017c150dd0dce7fcf881b0a48d0d1c756c4c7": { + "balance": "0x56bf91b1a65eb0000" }, - "6baf7a2a02ae78801e8904ad7ac05108fc56cff6": { - "balance": "1000000000000000000000" + "0x6baf7a2a02ae78801e8904ad7ac05108fc56cff6": { + "balance": "0x3635c9adc5dea00000" }, - "177dae78bc0113d8d39c4402f2a641ae2a105ab8": { - "balance": "1818320000000000000000" + "0x177dae78bc0113d8d39c4402f2a641ae2a105ab8": { + "balance": "0x6292425620b4480000" }, - "01b5b5bc5a117fa08b34ed1db9440608597ac548": { - "balance": "200000000000000000000" + "0x01b5b5bc5a117fa08b34ed1db9440608597ac548": { + "balance": "0xad78ebc5ac6200000" }, - "aae732eda65988c3a00c7f472f351c463b1c968e": { - "balance": "2000000000000000000000" + "0xaae732eda65988c3a00c7f472f351c463b1c968e": { + "balance": "0x6c6b935b8bbd400000" }, - "d95342953c8a21e8b635eefac7819bea30f17047": { - "balance": "94160000000000000000000" + "0xd95342953c8a21e8b635eefac7819bea30f17047": { + "balance": "0x13f06c7ffef05d400000" }, - "8d616b1eee77eef6f176e0698db3c0c141b2fc8f": { - "balance": "500000000000000000000" + "0x8d616b1eee77eef6f176e0698db3c0c141b2fc8f": { + "balance": "0x1b1ae4d6e2ef500000" }, - "12d20790b7d3dbd88c81a279b812039e8a603bd0": { - "balance": "1604400000000000000000" + "0x12d20790b7d3dbd88c81a279b812039e8a603bd0": { + "balance": "0x56f985d38644b80000" }, - "3734cb187491ede713ae5b3b2d12284af46b8101": { - "balance": "3000000000000000000000" + "0x3734cb187491ede713ae5b3b2d12284af46b8101": { + "balance": "0xa2a15d09519be00000" }, - "dd967c4c5f8ae47e266fb416aad1964ee3e7e8c3": { - "balance": "7750000000000000000000" + "0xdd967c4c5f8ae47e266fb416aad1964ee3e7e8c3": { + "balance": "0x1a420db02bd7d580000" }, - "3dcef19c868b15d34eda426ec7e04b18b6017002": { - "balance": "1999800000000000000000" + "0x3dcef19c868b15d34eda426ec7e04b18b6017002": { + "balance": "0x6c68ccd09b022c0000" }, - "ce9d21c692cd3c01f2011f505f870036fa8f6cd2": { - "balance": "400000000000000000000" + "0xce9d21c692cd3c01f2011f505f870036fa8f6cd2": { + "balance": "0x15af1d78b58c400000" }, - "d44f6ac3923b5fd731a4c45944ec4f7ec52a6ae4": { - "balance": "10000000000000000000000" + "0xd44f6ac3923b5fd731a4c45944ec4f7ec52a6ae4": { + "balance": "0x21e19e0c9bab2400000" }, - "b424d68d9d0d00cec1938c854e15ffb880ba0170": { - "balance": "200000000000000000000" + "0xb424d68d9d0d00cec1938c854e15ffb880ba0170": { + "balance": "0xad78ebc5ac6200000" }, - "1f2186ded23e0cf9521694e4e164593e690a9685": { - "balance": "300000000000000000000" + "0x1f2186ded23e0cf9521694e4e164593e690a9685": { + "balance": "0x1043561a8829300000" }, - "7f4b5e278578c046cceaf65730a0e068329ed5b6": { - "balance": "1880000000000000000000" + "0x7f4b5e278578c046cceaf65730a0e068329ed5b6": { + "balance": "0x65ea3db75546600000" }, - "8c50aa2a9212bcde56418ae261f0b35e7a9dbb82": { - "balance": "400000000000000000000" + "0x8c50aa2a9212bcde56418ae261f0b35e7a9dbb82": { + "balance": "0x15af1d78b58c400000" }, - "1953313e2ad746239cb2270f48af34d8bb9c4465": { - "balance": "2000000000000000000000" + "0x1953313e2ad746239cb2270f48af34d8bb9c4465": { + "balance": "0x6c6b935b8bbd400000" }, - "a15025f595acdbf3110f77c5bf24477e6548f9e8": { - "balance": "2000000000000000000000" + "0xa15025f595acdbf3110f77c5bf24477e6548f9e8": { + "balance": "0x6c6b935b8bbd400000" }, - "53af32c22fef99803f178cf90b802fb571c61cb9": { - "balance": "3880000000000000000000" + "0x53af32c22fef99803f178cf90b802fb571c61cb9": { + "balance": "0xd255d112e103a00000" }, - "d0a8abd80a199b54b08b65f01d209c27fef0115b": { - "balance": "6525979000000000000000" + "0xd0a8abd80a199b54b08b65f01d209c27fef0115b": { + "balance": "0x161c626dc61a2ef8000" }, - "2b68306ba7f8daaf73f4c644ef7d2743c0f26856": { - "balance": "864800000000000000000" + "0x2b68306ba7f8daaf73f4c644ef7d2743c0f26856": { + "balance": "0x2ee182ca17ddd00000" }, - "96924191b7df655b3319dc6d6137f481a73a0ff3": { - "balance": "4020000000000000000000" + "0x96924191b7df655b3319dc6d6137f481a73a0ff3": { + "balance": "0xd9ecb4fd208e500000" }, - "6fa72015fa78696efd9a86174f7f1f21019286b1": { - "balance": "1337000000000000000000" + "0x6fa72015fa78696efd9a86174f7f1f21019286b1": { + "balance": "0x487a9a304539440000" }, - "0b119df99c6b8de58a1e2c3f297a6744bf552277": { - "balance": "2000000000000000000000" + "0x0b119df99c6b8de58a1e2c3f297a6744bf552277": { + "balance": "0x6c6b935b8bbd400000" }, - "61733947fab820dbd351efd67855ea0e881373a0": { - "balance": "20000000000000000000" + "0x61733947fab820dbd351efd67855ea0e881373a0": { + "balance": "0x1158e460913d00000" }, - "8ae6f80b70e1f23c91fbd5a966b0e499d95df832": { - "balance": "197000000000000000000" + "0x8ae6f80b70e1f23c91fbd5a966b0e499d95df832": { + "balance": "0xaadec983fcff40000" }, - "01a7d9fa7d0eb1185c67e54da83c2e75db69e39f": { - "balance": "7623900000000000000000" + "0x01a7d9fa7d0eb1185c67e54da83c2e75db69e39f": { + "balance": "0x19d4addd0d8bc960000" }, - "9932ef1c85b75a9b2a80057d508734c51085becc": { - "balance": "50170000000000000000" + "0x9932ef1c85b75a9b2a80057d508734c51085becc": { + "balance": "0x2b83fa5301d590000" }, - "aefcfe88c826ccf131d54eb4ea9eb80e61e1ee25": { - "balance": "340000000000000000000" + "0xaefcfe88c826ccf131d54eb4ea9eb80e61e1ee25": { + "balance": "0x126e72a69a50d00000" }, - "c21fa6643a1f14c02996ad7144b75926e87ecb4b": { - "balance": "20000000000000000000000" + "0xc21fa6643a1f14c02996ad7144b75926e87ecb4b": { + "balance": "0x43c33c1937564800000" }, - "97d9e46a7604d7b5a4ea4ee61a42b3d2350fc3ed": { - "balance": "2000000000000000000000" + "0x97d9e46a7604d7b5a4ea4ee61a42b3d2350fc3ed": { + "balance": "0x6c6b935b8bbd400000" }, - "3cafaf5e62505615068af8eb22a13ad8a9e55070": { - "balance": "1999600000000000000000" + "0x3cafaf5e62505615068af8eb22a13ad8a9e55070": { + "balance": "0x6c660645aa47180000" }, - "22f2dcff5ad78c3eb6850b5cb951127b659522e6": { - "balance": "13700000000000000000" + "0x22f2dcff5ad78c3eb6850b5cb951127b659522e6": { + "balance": "0xbe202d6a0eda0000" }, - "aaad1baade5af04e2b17439e935987bf8c2bb4b9": { - "balance": "2000000000000000000000" + "0xaaad1baade5af04e2b17439e935987bf8c2bb4b9": { + "balance": "0x6c6b935b8bbd400000" }, - "298887bab57c5ba4f0615229d7525fa113b7ea89": { - "balance": "40000000000000000000" + "0x298887bab57c5ba4f0615229d7525fa113b7ea89": { + "balance": "0x22b1c8c1227a00000" }, - "7539333046deb1ef3c4daf50619993f444e1de68": { - "balance": "1182000000000000000000" + "0x7539333046deb1ef3c4daf50619993f444e1de68": { + "balance": "0x40138b917edfb80000" }, - "9752d14f5e1093f071711c1adbc4e3eb1e5c57f3": { - "balance": "2000000000000000000000" + "0x9752d14f5e1093f071711c1adbc4e3eb1e5c57f3": { + "balance": "0x6c6b935b8bbd400000" }, - "ed641e06368fb0efaa1703e01fe48f4a685309eb": { - "balance": "200000000000000000000" + "0xed641e06368fb0efaa1703e01fe48f4a685309eb": { + "balance": "0xad78ebc5ac6200000" }, - "d0ee4d02cf24382c3090d3e99560de3678735cdf": { - "balance": "2400000000000000000000" + "0xd0ee4d02cf24382c3090d3e99560de3678735cdf": { + "balance": "0x821ab0d44149800000" }, - "47e25df8822538a8596b28c637896b4d143c351d": { - "balance": "80500000000000000000000" + "0x47e25df8822538a8596b28c637896b4d143c351d": { + "balance": "0x110be9eb24b881500000" }, - "559706c332d20779c45f8a6d046a699159b74921": { - "balance": "380123000000000000000" + "0x559706c332d20779c45f8a6d046a699159b74921": { + "balance": "0x149b442e85a3cf8000" }, - "3a4da78dce05aeb87de9aead9185726da1926798": { - "balance": "200000000000000000000" + "0x3a4da78dce05aeb87de9aead9185726da1926798": { + "balance": "0xad78ebc5ac6200000" }, - "3041445a33ba158741160d9c344eb88e5c306f94": { - "balance": "60000000000000000000" + "0x3041445a33ba158741160d9c344eb88e5c306f94": { + "balance": "0x340aad21b3b700000" }, - "08d4311c9c1bbaf87fabe1a1d01463828d5d98ce": { - "balance": "90000000000000000000000" + "0x08d4311c9c1bbaf87fabe1a1d01463828d5d98ce": { + "balance": "0x130ee8e7179044400000" }, - "6bd3e59f239fafe4776bb9bddd6bee83ba5d9d9f": { - "balance": "1000000000000000000000" + "0x6bd3e59f239fafe4776bb9bddd6bee83ba5d9d9f": { + "balance": "0x3635c9adc5dea00000" }, - "29eaae82761762f4d2db53a9c68b0f6b0b6d4e66": { - "balance": "2000000000000000000000" + "0x29eaae82761762f4d2db53a9c68b0f6b0b6d4e66": { + "balance": "0x6c6b935b8bbd400000" }, - "0b7d339371e5be6727e6e331b5821fa24bdb9d5a": { - "balance": "857738000000000000000" + "0x0b7d339371e5be6727e6e331b5821fa24bdb9d5a": { + "balance": "0x2e7f81868262010000" }, - "4714cfa4f46bd6bd70737d75878197e08f88e631": { - "balance": "11792000000000000000000" + "0x4714cfa4f46bd6bd70737d75878197e08f88e631": { + "balance": "0x27f3edfb34e6e400000" }, - "ad92ca066edb7c711dfc5b166192d1edf8e77185": { - "balance": "36000000000000000000000" + "0xad92ca066edb7c711dfc5b166192d1edf8e77185": { + "balance": "0x79f905c6fd34e800000" }, - "f97b56ebd5b77abc9fbacbabd494b9d2c221cd03": { - "balance": "1970000000000000000000" + "0xf97b56ebd5b77abc9fbacbabd494b9d2c221cd03": { + "balance": "0x6acb3df27e1f880000" }, - "591bef3171d1c5957717a4e98d17eb142c214e56": { - "balance": "20000000000000000000000" + "0x591bef3171d1c5957717a4e98d17eb142c214e56": { + "balance": "0x43c33c1937564800000" }, - "899b3c249f0c4b81df75d212004d3d6d952fd223": { - "balance": "2000000000000000000000" + "0x899b3c249f0c4b81df75d212004d3d6d952fd223": { + "balance": "0x6c6b935b8bbd400000" }, - "a819d2ece122e028c8e8a04a064d02b9029b08b9": { - "balance": "1000000000000000000000" + "0xa819d2ece122e028c8e8a04a064d02b9029b08b9": { + "balance": "0x3635c9adc5dea00000" }, - "e341642d40d2afce2e9107c67079ac7a2660086c": { - "balance": "400000000000000000000" + "0xe341642d40d2afce2e9107c67079ac7a2660086c": { + "balance": "0x15af1d78b58c400000" }, - "0329188f080657ab3a2afa522467178279832085": { - "balance": "216700000000000000000" + "0x0329188f080657ab3a2afa522467178279832085": { + "balance": "0xbbf510ddfcb260000" }, - "03317826d1f70aa4bddfa09be0c4105552d2358b": { - "balance": "38800000000000000000" + "0x03317826d1f70aa4bddfa09be0c4105552d2358b": { + "balance": "0x21a754a6dc5280000" }, - "3ac9dc7a436ae98fd01c7a9621aa8e9d0b8b531d": { - "balance": "1790000000000000000000" + "0x3ac9dc7a436ae98fd01c7a9621aa8e9d0b8b531d": { + "balance": "0x61093d7c2c6d380000" }, - "93c88e2d88621e30f58a9586bed4098999eb67dd": { - "balance": "31200000000000000000000" + "0x93c88e2d88621e30f58a9586bed4098999eb67dd": { + "balance": "0x69b5afac750bb800000" }, - "cd1e66ed539dd92fc40bbaa1fa16de8c02c14d45": { - "balance": "230000000000000000000" + "0xcd1e66ed539dd92fc40bbaa1fa16de8c02c14d45": { + "balance": "0xc77e4256863d80000" }, - "e6c81ffcecb47ecdc55c0b71e4855f3e5e97fc1e": { - "balance": "334250000000000000000" + "0xe6c81ffcecb47ecdc55c0b71e4855f3e5e97fc1e": { + "balance": "0x121ea68c114e510000" }, - "50f8fa4bb9e2677c990a4ee8ce70dd1523251e4f": { - "balance": "26030000000000000000" + "0x50f8fa4bb9e2677c990a4ee8ce70dd1523251e4f": { + "balance": "0x1693d23164f6b0000" }, - "4f64a85e8e9a40498c0c75fceb0337fb49083e5e": { - "balance": "1000000000000000000000" + "0x4f64a85e8e9a40498c0c75fceb0337fb49083e5e": { + "balance": "0x3635c9adc5dea00000" }, - "4b29437c97b4a844be71cca3b648d4ca0fdd9ba4": { - "balance": "150200000000000000000" + "0x4b29437c97b4a844be71cca3b648d4ca0fdd9ba4": { + "balance": "0x824719834cfac0000" }, - "1eee6cbee4fe96ad615a9cf5857a647940df8c78": { - "balance": "19400000000000000000" + "0x1eee6cbee4fe96ad615a9cf5857a647940df8c78": { + "balance": "0x10d3aa536e2940000" }, - "29f0edc60338e7112085a1d114da8c42ce8f55d6": { - "balance": "2958000000000000000000" + "0x29f0edc60338e7112085a1d114da8c42ce8f55d6": { + "balance": "0xa05a7f0fd825780000" }, - "23b1c4917fbd93ee3d48389306957384a5496cbf": { - "balance": "4000086000000000000000" + "0x23b1c4917fbd93ee3d48389306957384a5496cbf": { + "balance": "0xd8d8583fa2d52f0000" }, - "1767525c5f5a22ed80e9d4d7710f0362d29efa33": { - "balance": "400000000000000000000" + "0x1767525c5f5a22ed80e9d4d7710f0362d29efa33": { + "balance": "0x15af1d78b58c400000" }, - "3064899a963c4779cbf613cd6980846af1e6ec65": { - "balance": "6999908000000000000000" + "0x3064899a963c4779cbf613cd6980846af1e6ec65": { + "balance": "0x17b773ce6e5df0a0000" }, - "68531f4dda808f5320767a03113428ca0ce2f389": { - "balance": "19400000000000000000" + "0x68531f4dda808f5320767a03113428ca0ce2f389": { + "balance": "0x10d3aa536e2940000" }, - "1db9ac9a9eaeec0a523757050c71f47278c72d50": { - "balance": "1337000000000000000000" + "0x1db9ac9a9eaeec0a523757050c71f47278c72d50": { + "balance": "0x487a9a304539440000" }, - "7592c69d067b51b6cc639d1164d5578c60d2d244": { - "balance": "20000000000000000000" + "0x7592c69d067b51b6cc639d1164d5578c60d2d244": { + "balance": "0x1158e460913d00000" }, - "cf3fbfa1fd32d7a6e0e6f8ef4eab57be34025c4c": { - "balance": "1063120000000000000000" + "0xcf3fbfa1fd32d7a6e0e6f8ef4eab57be34025c4c": { + "balance": "0x39a1c0f7594d480000" }, - "8efec058cc546157766a632775404a334aaada87": { - "balance": "1999000000000000000000" + "0x8efec058cc546157766a632775404a334aaada87": { + "balance": "0x6c5db2a4d815dc0000" }, - "faf5f0b7b6d558f5090d9ea1fb2d42259c586078": { - "balance": "6401000000000000000000" + "0xfaf5f0b7b6d558f5090d9ea1fb2d42259c586078": { + "balance": "0x15affb8420c6b640000" }, - "19ecf2abf40c9e857b252fe1dbfd3d4c5d8f816e": { - "balance": "2000000000000000000000" + "0x19ecf2abf40c9e857b252fe1dbfd3d4c5d8f816e": { + "balance": "0x6c6b935b8bbd400000" }, - "6e8a26689f7a2fdefd009cbaaa5310253450daba": { - "balance": "2049982000000000000000" + "0x6e8a26689f7a2fdefd009cbaaa5310253450daba": { + "balance": "0x6f213717bad8d30000" }, - "e2f40d358f5e3fe7463ec70480bd2ed398a7063b": { - "balance": "20000000000000000000" + "0xe2f40d358f5e3fe7463ec70480bd2ed398a7063b": { + "balance": "0x1158e460913d00000" }, - "fa19d6f7a50f4f079893d167bf14e21d0073d196": { - "balance": "530000000000000000000" + "0xfa19d6f7a50f4f079893d167bf14e21d0073d196": { + "balance": "0x1cbb3a3ff08d080000" }, - "3e2ca0d234baf607ad466a1b85f4a6488ef00ae7": { - "balance": "89505000000000000000" + "0x3e2ca0d234baf607ad466a1b85f4a6488ef00ae7": { + "balance": "0x4da21a3483d568000" }, - "f8a49ca2390c1f6d5c0e62513b079571743f7cc6": { - "balance": "3000000000000000000000" + "0xf8a49ca2390c1f6d5c0e62513b079571743f7cc6": { + "balance": "0xa2a15d09519be00000" }, - "5d3f3b1f7130b0bb21a0fd32396239179a25657f": { - "balance": "62474000000000000000000" + "0x5d3f3b1f7130b0bb21a0fd32396239179a25657f": { + "balance": "0xd3ab8ea5e8fd9e80000" }, - "f332c0f3e05a27d9126fd0b641a8c2d4060608fd": { - "balance": "5001041000000000000000" + "0xf332c0f3e05a27d9126fd0b641a8c2d4060608fd": { + "balance": "0x10f1b62c4d9644e8000" }, - "e304a32f05a83762744a9542976ff9b723fa31ea": { - "balance": "1576256000000000000000" + "0xe304a32f05a83762744a9542976ff9b723fa31ea": { + "balance": "0x5572f240a346200000" }, - "f768f321fd6433d96b4f354d3cc1652c1732f57f": { - "balance": "10000000000000000000000" + "0xf768f321fd6433d96b4f354d3cc1652c1732f57f": { + "balance": "0x21e19e0c9bab2400000" }, - "147af46ae9ccd18bb35ca01b353b51990e49dce1": { - "balance": "4000000000000000000000" + "0x147af46ae9ccd18bb35ca01b353b51990e49dce1": { + "balance": "0xd8d726b7177a800000" }, - "21eae6feffa9fbf4cd874f4739ace530ccbe5937": { - "balance": "5000000000000000000000" + "0x21eae6feffa9fbf4cd874f4739ace530ccbe5937": { + "balance": "0x10f0cf064dd59200000" }, - "6994fb3231d7e41d491a9d68d1fa4cae2cc15960": { - "balance": "4000000000000000000000" + "0x6994fb3231d7e41d491a9d68d1fa4cae2cc15960": { + "balance": "0xd8d726b7177a800000" }, - "51126446ab3d8032557e8eba65597d75fadc815c": { - "balance": "322000000000000000000" + "0x51126446ab3d8032557e8eba65597d75fadc815c": { + "balance": "0x1174a5cdf88bc80000" }, - "24daaaddf7b06bbcea9b80590085a88567682b4e": { - "balance": "319008000000000000000" + "0x24daaaddf7b06bbcea9b80590085a88567682b4e": { + "balance": "0x114b2015d2bbd00000" }, - "cd020f8edfcf524798a9b73a640334bbf72f80a5": { - "balance": "133700000000000000000" + "0xcd020f8edfcf524798a9b73a640334bbf72f80a5": { + "balance": "0x73f75d1a085ba0000" }, - "56febf9e1003af15b1bd4907ec089a4a1b91d268": { - "balance": "200000000000000000000" + "0x56febf9e1003af15b1bd4907ec089a4a1b91d268": { + "balance": "0xad78ebc5ac6200000" }, - "3c79c863c3d372b3ff0c6f452734a7f97042d706": { - "balance": "176000000000000000000" + "0x3c79c863c3d372b3ff0c6f452734a7f97042d706": { + "balance": "0x98a7d9b8314c00000" }, - "e1203eb3a723e99c2220117ca6afeb66fa424f61": { - "balance": "9461996000000000000000" + "0xe1203eb3a723e99c2220117ca6afeb66fa424f61": { + "balance": "0x200ef929e3256fe0000" }, - "18fb09188f27f1038e654031924f628a2106703d": { - "balance": "2000000000000000000000" + "0x18fb09188f27f1038e654031924f628a2106703d": { + "balance": "0x6c6b935b8bbd400000" }, - "2eba0c6ee5a1145c1c573984963a605d880a7a20": { - "balance": "500000000000000000000" + "0x2eba0c6ee5a1145c1c573984963a605d880a7a20": { + "balance": "0x1b1ae4d6e2ef500000" }, - "4cefbe2398e47d52e78db4334c8b697675f193ae": { - "balance": "4011000000000000000000" + "0x4cefbe2398e47d52e78db4334c8b697675f193ae": { + "balance": "0xd96fce90cfabcc0000" }, - "c02471e3fc2ea0532615a7571d493289c13c36ef": { - "balance": "20000000000000000000" + "0xc02471e3fc2ea0532615a7571d493289c13c36ef": { + "balance": "0x1158e460913d00000" }, - "ba469aa5c386b19295d4a1b5473b540353390c85": { - "balance": "2000000000000000000000" + "0xba469aa5c386b19295d4a1b5473b540353390c85": { + "balance": "0x6c6b935b8bbd400000" }, - "7b11673cc019626b290cbdce26046f7e6d141e21": { - "balance": "500000000000000000000" + "0x7b11673cc019626b290cbdce26046f7e6d141e21": { + "balance": "0x1b1ae4d6e2ef500000" }, - "26784ade91c8a83a8e39658c8d8277413ccc9954": { - "balance": "6000000000000000000000" + "0x26784ade91c8a83a8e39658c8d8277413ccc9954": { + "balance": "0x14542ba12a337c00000" }, - "57d3df804f2beee6ef53ab94cb3ee9cf524a18d3": { - "balance": "393606000000000000000" + "0x57d3df804f2beee6ef53ab94cb3ee9cf524a18d3": { + "balance": "0x1556616b9606670000" }, - "ccae0d3d852a7da3860f0636154c0a6ca31628d4": { - "balance": "106560000000000000000" + "0xccae0d3d852a7da3860f0636154c0a6ca31628d4": { + "balance": "0x5c6d12b6bc1a00000" }, - "bfe3a1fc6e24c8f7b3250560991f93cba2cf8047": { - "balance": "80000000000000000000000" + "0xbfe3a1fc6e24c8f7b3250560991f93cba2cf8047": { + "balance": "0x10f0cf064dd592000000" }, - "724ce858857ec5481c86bd906e83a04882e5821d": { - "balance": "3000000000000000000000" + "0x724ce858857ec5481c86bd906e83a04882e5821d": { + "balance": "0xa2a15d09519be00000" }, - "fb37cf6b4f81a9e222fba22e9bd24b5098b733cf": { - "balance": "38800000000000000000" + "0xfb37cf6b4f81a9e222fba22e9bd24b5098b733cf": { + "balance": "0x21a754a6dc5280000" }, - "9b22a80d5c7b3374a05b446081f97d0a34079e7f": { - "balance": "3000000000000000000000" + "0x9b22a80d5c7b3374a05b446081f97d0a34079e7f": { + "balance": "0xa2a15d09519be00000" }, - "0a29a8a4d5fd950075ffb34d77afeb2d823bd689": { - "balance": "200000000000000000000" + "0x0a29a8a4d5fd950075ffb34d77afeb2d823bd689": { + "balance": "0xad78ebc5ac6200000" }, - "d01af9134faf5257174e8b79186f42ee354e642d": { - "balance": "1000000000000000000000" + "0xd01af9134faf5257174e8b79186f42ee354e642d": { + "balance": "0x3635c9adc5dea00000" }, - "7f1619988f3715e94ff1d253262dc5581db3de1c": { - "balance": "900000000000000000000" + "0x7f1619988f3715e94ff1d253262dc5581db3de1c": { + "balance": "0x30ca024f987b900000" }, - "6f137a71a6f197df2cbbf010dcbd3c444ef5c925": { - "balance": "2000000000000000000000" + "0x6f137a71a6f197df2cbbf010dcbd3c444ef5c925": { + "balance": "0x6c6b935b8bbd400000" }, - "11efb8a20451161b644a8ccebbc1d343a3bbcb52": { - "balance": "3200000000000000000000" + "0x11efb8a20451161b644a8ccebbc1d343a3bbcb52": { + "balance": "0xad78ebc5ac62000000" }, - "46504e6a215ac83bccf956befc82ab5a679371c8": { - "balance": "518898000000000000000" + "0x46504e6a215ac83bccf956befc82ab5a679371c8": { + "balance": "0x1c212805c2b4a50000" }, - "b523fff9749871b35388438837f7e6e0dea9cb6b": { - "balance": "2000000000000000000000" + "0xb523fff9749871b35388438837f7e6e0dea9cb6b": { + "balance": "0x6c6b935b8bbd400000" }, - "c5c6a4998a33feb764437a8be929a73ba34a0764": { - "balance": "50000000000000000000000" + "0xc5c6a4998a33feb764437a8be929a73ba34a0764": { + "balance": "0xa968163f0a57b400000" }, - "3cd7f7c7c2353780cde081eeec45822b25f2860c": { - "balance": "200000000000000000000" + "0x3cd7f7c7c2353780cde081eeec45822b25f2860c": { + "balance": "0xad78ebc5ac6200000" }, - "b3050beff9de33c80e1fa15225e28f2c413ae313": { - "balance": "700000000000000000000" + "0xb3050beff9de33c80e1fa15225e28f2c413ae313": { + "balance": "0x25f273933db5700000" }, - "59268171b833e0aa13c54b52ccc0422e4fa03aeb": { - "balance": "3000000000000000000000" + "0x59268171b833e0aa13c54b52ccc0422e4fa03aeb": { + "balance": "0xa2a15d09519be00000" }, - "7169724ee72271c534cad6420fb04ee644cb86fe": { - "balance": "410164000000000000000" + "0x7169724ee72271c534cad6420fb04ee644cb86fe": { + "balance": "0x163c2b40dba5520000" }, - "6e6d5bbbb9053b89d744a27316c2a7b8c09b547d": { - "balance": "909831000000000000000" + "0x6e6d5bbbb9053b89d744a27316c2a7b8c09b547d": { + "balance": "0x3152710a023e6d8000" }, - "3f3f46b75cabe37bfacc8760281f4341ca7f463d": { - "balance": "602709000000000000000" + "0x3f3f46b75cabe37bfacc8760281f4341ca7f463d": { + "balance": "0x20ac448235fae88000" }, - "7a33834e8583733e2d52aead589bd1affb1dd256": { - "balance": "1000000000000000000000" + "0x7a33834e8583733e2d52aead589bd1affb1dd256": { + "balance": "0x3635c9adc5dea00000" }, - "e94ded99dcb572b9bb1dcba32f6dee91e057984e": { - "balance": "394000000000000000000" + "0xe94ded99dcb572b9bb1dcba32f6dee91e057984e": { + "balance": "0x155bd9307f9fe80000" }, - "19336a236ded755872411f2e0491d83e3e00159e": { - "balance": "940000000000000000000" + "0x19336a236ded755872411f2e0491d83e3e00159e": { + "balance": "0x32f51edbaaa3300000" }, - "63ac545c991243fa18aec41d4f6f598e555015dc": { - "balance": "600000000000000000000" + "0x63ac545c991243fa18aec41d4f6f598e555015dc": { + "balance": "0x2086ac351052600000" }, - "cfee05c69d1f29e7714684c88de5a16098e91399": { - "balance": "1970000000000000000000" + "0xcfee05c69d1f29e7714684c88de5a16098e91399": { + "balance": "0x6acb3df27e1f880000" }, - "77be6b64d7c733a436adec5e14bf9ad7402b1b46": { - "balance": "1000000000000000000000" + "0x77be6b64d7c733a436adec5e14bf9ad7402b1b46": { + "balance": "0x3635c9adc5dea00000" }, - "233bdddd5da94852f4ade8d212885682d9076bc6": { - "balance": "4000000000000000000000" + "0x233bdddd5da94852f4ade8d212885682d9076bc6": { + "balance": "0xd8d726b7177a800000" }, - "952c57d2fb195107d4cd5ca300774119dfad2f78": { - "balance": "2000000000000000000000" + "0x952c57d2fb195107d4cd5ca300774119dfad2f78": { + "balance": "0x6c6b935b8bbd400000" }, - "e237baa4dbc9926e32a3d85d1264402d54db012f": { - "balance": "2000000000000000000000" + "0xe237baa4dbc9926e32a3d85d1264402d54db012f": { + "balance": "0x6c6b935b8bbd400000" }, - "aa91237e740d25a92f7fa146faa18ce56dc6e1f3": { - "balance": "925000000000000000000" + "0xaa91237e740d25a92f7fa146faa18ce56dc6e1f3": { + "balance": "0x3224f42723d4540000" }, - "2339e9492870afea2537f389ac2f838302a33c06": { - "balance": "2000000000000000000000" + "0x2339e9492870afea2537f389ac2f838302a33c06": { + "balance": "0x6c6b935b8bbd400000" }, - "1d45586eb803ca2190650bf748a2b174312bb507": { - "balance": "1400000000000000000000" + "0x1d45586eb803ca2190650bf748a2b174312bb507": { + "balance": "0x4be4e7267b6ae00000" }, - "c61446b754c24e3b1642d9e51765b4d3e46b34b6": { - "balance": "2000000000000000000000" + "0xc61446b754c24e3b1642d9e51765b4d3e46b34b6": { + "balance": "0x6c6b935b8bbd400000" }, - "ac28b5edea05b76f8c5f97084541277c96696a4c": { - "balance": "1000000000000000000000" + "0xac28b5edea05b76f8c5f97084541277c96696a4c": { + "balance": "0x3635c9adc5dea00000" }, - "1a1c9a26e0e02418a5cf687da75a275c622c9440": { - "balance": "5000000000000000000000" + "0x1a1c9a26e0e02418a5cf687da75a275c622c9440": { + "balance": "0x10f0cf064dd59200000" }, - "299368609042a858d1ecdf1fc0ada5eaceca29cf": { - "balance": "2000000000000000000000" + "0x299368609042a858d1ecdf1fc0ada5eaceca29cf": { + "balance": "0x6c6b935b8bbd400000" }, - "095f5a51d06f6340d80b6d29ea2e88118ad730fe": { - "balance": "2000200000000000000000" + "0x095f5a51d06f6340d80b6d29ea2e88118ad730fe": { + "balance": "0x6c6e59e67c78540000" }, - "751a2ca34e7187c163d28e3618db28b13c196d26": { - "balance": "500000000000000000000" + "0x751a2ca34e7187c163d28e3618db28b13c196d26": { + "balance": "0x1b1ae4d6e2ef500000" }, - "75b0e9c942a4f0f6f86d3f95ff998022fa67963b": { - "balance": "1490000000000000000000" + "0x75b0e9c942a4f0f6f86d3f95ff998022fa67963b": { + "balance": "0x50c5e761a444080000" }, - "d1b37f03cb107424e9c4dd575ccd4f4cee57e6cd": { - "balance": "2000000000000000000000" + "0xd1b37f03cb107424e9c4dd575ccd4f4cee57e6cd": { + "balance": "0x6c6b935b8bbd400000" }, - "7f993ddb7e02c282b898f6155f680ef5b9aff907": { - "balance": "20000000000000000000000" + "0x7f993ddb7e02c282b898f6155f680ef5b9aff907": { + "balance": "0x43c33c1937564800000" }, - "a3d583a7b65b23f60b7905f3e4aa62aac87f4227": { - "balance": "1046779000000000000000" + "0xa3d583a7b65b23f60b7905f3e4aa62aac87f4227": { + "balance": "0x38befa126d5a9f8000" }, - "526bb533b76e20c8ee1ebf123f1e9ff4148e40be": { - "balance": "197000000000000000000" + "0x526bb533b76e20c8ee1ebf123f1e9ff4148e40be": { + "balance": "0xaadec983fcff40000" }, - "2160b4c02cac0a81de9108de434590a8bfe68735": { - "balance": "1970000000000000000000" + "0x2160b4c02cac0a81de9108de434590a8bfe68735": { + "balance": "0x6acb3df27e1f880000" }, - "010007394b8b7565a1658af88ce463499135d6b7": { - "balance": "100000000000000000000" + "0x010007394b8b7565a1658af88ce463499135d6b7": { + "balance": "0x56bc75e2d63100000" }, - "64457fa33b0832506c4f7d1180dce48f46f3e0ff": { - "balance": "2000000000000000000000" + "0x64457fa33b0832506c4f7d1180dce48f46f3e0ff": { + "balance": "0x6c6b935b8bbd400000" }, - "b51e558eb5512fbcfa81f8d0bd938c79ebb5242b": { - "balance": "715000000000000000000" + "0xb51e558eb5512fbcfa81f8d0bd938c79ebb5242b": { + "balance": "0x26c29e47c4844c0000" }, - "94f13f9f0836a3ee2437a84922d2984dc0f7d53b": { - "balance": "2999916000000000000000" + "0x94f13f9f0836a3ee2437a84922d2984dc0f7d53b": { + "balance": "0xa2a0329bc38abe0000" }, - "6bd457ade051795df3f2465c3839aed3c5dee978": { - "balance": "999925000000000000000" + "0x6bd457ade051795df3f2465c3839aed3c5dee978": { + "balance": "0x3634bf39ab98788000" }, - "f3dbcf135acb9dee1a489c593c024f03c2bbaece": { - "balance": "2000000000000000000000" + "0xf3dbcf135acb9dee1a489c593c024f03c2bbaece": { + "balance": "0x6c6b935b8bbd400000" }, - "61b902c5a673885826820d1fe14549e4865fbdc2": { - "balance": "334703000000000000000" + "0x61b902c5a673885826820d1fe14549e4865fbdc2": { + "balance": "0x1224efed2ae1918000" }, - "2acc9c1a32240b4d5b2f777a2ea052b42fc1271c": { - "balance": "41764000000000000000000" + "0x2acc9c1a32240b4d5b2f777a2ea052b42fc1271c": { + "balance": "0x8d807ee14d836100000" }, - "6ddfef639155daab0a5cb4953aa8c5afaa880453": { - "balance": "1820000000000000000000" + "0x6ddfef639155daab0a5cb4953aa8c5afaa880453": { + "balance": "0x62a992e53a0af00000" }, - "96ff6f509968f36cb42cba48db32f21f5676abf8": { - "balance": "1970000000000000000000" + "0x96ff6f509968f36cb42cba48db32f21f5676abf8": { + "balance": "0x6acb3df27e1f880000" }, - "b4c8170f7b2ab536d1d9a25bdd203ae1288dc3d5": { - "balance": "200000000000000000000" + "0xb4c8170f7b2ab536d1d9a25bdd203ae1288dc3d5": { + "balance": "0xad78ebc5ac6200000" }, - "78d4f8c71c1e68a69a98f52fcb45da8af56ea1a0": { - "balance": "2000000000000000000000" + "0x78d4f8c71c1e68a69a98f52fcb45da8af56ea1a0": { + "balance": "0x6c6b935b8bbd400000" }, - "dec99e972fca7177508c8e1a47ac22d768acab7c": { - "balance": "2000000000000000000000" + "0xdec99e972fca7177508c8e1a47ac22d768acab7c": { + "balance": "0x6c6b935b8bbd400000" }, - "a07aa16d74aee8a9a3288d52db1551d593883297": { - "balance": "600000000000000000000" + "0xa07aa16d74aee8a9a3288d52db1551d593883297": { + "balance": "0x2086ac351052600000" }, - "cf1169041c1745e45b172435a2fc99b49ace2b00": { - "balance": "31960000000000000000" + "0xcf1169041c1745e45b172435a2fc99b49ace2b00": { + "balance": "0x1bb88baab2d7c0000" }, - "526cb09ce3ada3672eec1deb46205be89a4b563e": { - "balance": "2468000000000000000000" + "0x526cb09ce3ada3672eec1deb46205be89a4b563e": { + "balance": "0x85ca615bf9c0100000" }, - "ee6959de2b67967b71948c891ab00d8c8f38c7dc": { - "balance": "118200000000000000000" + "0xee6959de2b67967b71948c891ab00d8c8f38c7dc": { + "balance": "0x6685ac1bfe32c0000" }, - "ca7ba3ff536c7e5f0e153800bd383db8312998e0": { - "balance": "169600000000000000000" + "0xca7ba3ff536c7e5f0e153800bd383db8312998e0": { + "balance": "0x931ac3d6bb2400000" }, - "1ed06ee51662a86c634588fb62dc43c8f27e7c17": { - "balance": "200000000000000000000" + "0x1ed06ee51662a86c634588fb62dc43c8f27e7c17": { + "balance": "0xad78ebc5ac6200000" }, - "730447f97ce9b25f22ba1afb36df27f9586beb9b": { - "balance": "820000000000000000000" + "0x730447f97ce9b25f22ba1afb36df27f9586beb9b": { + "balance": "0x2c73c937742c500000" }, - "ae5c9bdad3c5c8a1220444aea5c229c1839f1d64": { - "balance": "477500000000000000000" + "0xae5c9bdad3c5c8a1220444aea5c229c1839f1d64": { + "balance": "0x19e2a4c818b9060000" }, - "a38306cb70baa8e49186bd68aa70a83d242f2907": { - "balance": "2000000000000000000000" + "0xa38306cb70baa8e49186bd68aa70a83d242f2907": { + "balance": "0x6c6b935b8bbd400000" }, - "71213fca313404204ecba87197741aa9dfe96338": { - "balance": "60000000000000000000" + "0x71213fca313404204ecba87197741aa9dfe96338": { + "balance": "0x340aad21b3b700000" }, - "10e390ad2ba33d82b37388d09c4544c6b0225de5": { - "balance": "200000000000000000000" + "0x10e390ad2ba33d82b37388d09c4544c6b0225de5": { + "balance": "0xad78ebc5ac6200000" }, - "3b6e814f770748a7c3997806347605480a3fd509": { - "balance": "2000000000000000000000" + "0x3b6e814f770748a7c3997806347605480a3fd509": { + "balance": "0x6c6b935b8bbd400000" }, - "fd452c3969ece3801c542020f1cdcaa1c71ed23d": { - "balance": "100000000000000000000000" + "0xfd452c3969ece3801c542020f1cdcaa1c71ed23d": { + "balance": "0x152d02c7e14af6800000" }, - "e742b1e6069a8ffc3c4767235defb0d49cbed222": { - "balance": "800000000000000000000" + "0xe742b1e6069a8ffc3c4767235defb0d49cbed222": { + "balance": "0x2b5e3af16b18800000" }, - "d7225738dcf3578438f8e7c8b3837e42e04a262f": { - "balance": "445860000000000000000" + "0xd7225738dcf3578438f8e7c8b3837e42e04a262f": { + "balance": "0x182b8cebbb83aa0000" }, - "cd0b0257e783a3d2c2e3ba9d6e79b75ef98024d4": { - "balance": "2945500000000000000000" + "0xcd0b0257e783a3d2c2e3ba9d6e79b75ef98024d4": { + "balance": "0x9fad06241279160000" }, - "e80e7fef18a5db15b01473f3ad6b78b2a2f8acd9": { - "balance": "500000000000000000000" + "0xe80e7fef18a5db15b01473f3ad6b78b2a2f8acd9": { + "balance": "0x1b1ae4d6e2ef500000" }, - "261575e9cf59c8226fa7aaf91de86fb70f5ac3ae": { - "balance": "300022000000000000000" + "0x261575e9cf59c8226fa7aaf91de86fb70f5ac3ae": { + "balance": "0x1043a4436a523f0000" }, - "7e71171f2949fa0c3ac254254b1f0440e5e6a038": { - "balance": "40000000000000000000" + "0x7e71171f2949fa0c3ac254254b1f0440e5e6a038": { + "balance": "0x22b1c8c1227a00000" }, - "96ea6ac89a2bac95347b51dba63d8bd5ebdedce1": { - "balance": "2000000000000000000000" + "0x96ea6ac89a2bac95347b51dba63d8bd5ebdedce1": { + "balance": "0x6c6b935b8bbd400000" }, - "e6ec5cf0c49b9c317e1e706315ef9eb7c0bf11a7": { - "balance": "17200000000000000000000" + "0xe6ec5cf0c49b9c317e1e706315ef9eb7c0bf11a7": { + "balance": "0x3a469f3467e8ec00000" }, - "2b99b42e4f42619ee36baa7e4af2d65eacfcba35": { - "balance": "40000000000000000000000" + "0x2b99b42e4f42619ee36baa7e4af2d65eacfcba35": { + "balance": "0x878678326eac9000000" }, - "c6e4cc0c7283fc1c85bc4813effaaf72b49823c0": { - "balance": "276926000000000000000" + "0xc6e4cc0c7283fc1c85bc4813effaaf72b49823c0": { + "balance": "0xf031ec9c87dd30000" }, - "dbc1ce0e49b1a705d22e2037aec878ee0d75c703": { - "balance": "250000000000000000000" + "0xdbc1ce0e49b1a705d22e2037aec878ee0d75c703": { + "balance": "0xd8d726b7177a80000" }, - "806f44bdeb688037015e84ff218049e382332a33": { - "balance": "1999000000000000000000" + "0x806f44bdeb688037015e84ff218049e382332a33": { + "balance": "0x6c5db2a4d815dc0000" }, - "1a3a330e4fcb69dbef5e6901783bf50fd1c15342": { - "balance": "4200000000000000000000" + "0x1a3a330e4fcb69dbef5e6901783bf50fd1c15342": { + "balance": "0xe3aeb5737240a00000" }, - "d2a84f75675c62d80c88756c428eee2bcb185421": { - "balance": "1200000000000000000000" + "0xd2a84f75675c62d80c88756c428eee2bcb185421": { + "balance": "0x410d586a20a4c00000" }, - "c593b546b7698710a205ad468b2c13152219a342": { - "balance": "1550000000000000000000" + "0xc593b546b7698710a205ad468b2c13152219a342": { + "balance": "0x54069233bf7f780000" }, - "3f627a769e6a950eb87017a7cd9ca20871136831": { - "balance": "13790000000000000000000" + "0x3f627a769e6a950eb87017a7cd9ca20871136831": { + "balance": "0x2eb8eb1a172dcb80000" }, - "f2d5763ce073127e2cedde6faba786c73ca94141": { - "balance": "7900000000000000000000" + "0xf2d5763ce073127e2cedde6faba786c73ca94141": { + "balance": "0x1ac4286100191f00000" }, - "162110f29eac5f7d02b543d8dcd5bb59a5e33b73": { - "balance": "2000000000000000000000" + "0x162110f29eac5f7d02b543d8dcd5bb59a5e33b73": { + "balance": "0x6c6b935b8bbd400000" }, - "59473cd300fffae240f5785626c65dfec792b9af": { - "balance": "20000000000000000000" + "0x59473cd300fffae240f5785626c65dfec792b9af": { + "balance": "0x1158e460913d00000" }, - "4dcd11815818ae29b85d01367349a8a7fb12d06b": { - "balance": "7900000000000000000000" + "0x4dcd11815818ae29b85d01367349a8a7fb12d06b": { + "balance": "0x1ac4286100191f00000" }, - "9329ffdc268babde8874b366406c81445b9b2d35": { - "balance": "422415000000000000000" + "0x9329ffdc268babde8874b366406c81445b9b2d35": { + "balance": "0x16e62f8c730ca18000" }, - "0ab4281ebb318590abb89a81df07fa3af904258a": { - "balance": "500000000000000000000" + "0x0ab4281ebb318590abb89a81df07fa3af904258a": { + "balance": "0x1b1ae4d6e2ef500000" }, - "875061ee12e820041a01942cb0e65bb427b00060": { - "balance": "2800000000000000000000" + "0x875061ee12e820041a01942cb0e65bb427b00060": { + "balance": "0x97c9ce4cf6d5c00000" }, - "c9b698e898d20d4d4f408e4e4d061922aa856307": { - "balance": "40000000000000000000" + "0xc9b698e898d20d4d4f408e4e4d061922aa856307": { + "balance": "0x22b1c8c1227a00000" }, - "ca49a5f58adbefae23ee59eea241cf0482622eaa": { - "balance": "1430000000000000000000" + "0xca49a5f58adbefae23ee59eea241cf0482622eaa": { + "balance": "0x4d853c8f8908980000" }, - "196e85df7e732b4a8f0ed03623f4db9db0b8fa31": { - "balance": "21165000000000000000" + "0x196e85df7e732b4a8f0ed03623f4db9db0b8fa31": { + "balance": "0x125b92f5cef248000" }, - "4c760cd9e195ee4f2d6bce2500ff96da7c43ee91": { - "balance": "60000000000000000000000" + "0x4c760cd9e195ee4f2d6bce2500ff96da7c43ee91": { + "balance": "0xcb49b44ba602d800000" }, - "024a098ae702bef5406c9c22b78bd4eb2cc7a293": { - "balance": "4000000000000000000000" + "0x024a098ae702bef5406c9c22b78bd4eb2cc7a293": { + "balance": "0xd8d726b7177a800000" }, - "9d81aea69aed6ad07089d61445348c17f34bfc5b": { - "balance": "300000000000000000000" + "0x9d81aea69aed6ad07089d61445348c17f34bfc5b": { + "balance": "0x1043561a8829300000" }, - "76ab87dd5a05ad839a4e2fc8c85aa6ba05641730": { - "balance": "2000000000000000000000" + "0x76ab87dd5a05ad839a4e2fc8c85aa6ba05641730": { + "balance": "0x6c6b935b8bbd400000" }, - "c6e2f5af979a03fd723a1b6efa728318cf9c1800": { - "balance": "668500000000000000000" + "0xc6e2f5af979a03fd723a1b6efa728318cf9c1800": { + "balance": "0x243d4d18229ca20000" }, - "5db69fe93e6fb6fbd450966b97238b110ad8279a": { - "balance": "40000000000000000000000" + "0x5db69fe93e6fb6fbd450966b97238b110ad8279a": { + "balance": "0x878678326eac9000000" }, - "a4259f8345f7e3a8b72b0fec2cf75e321fda4dc2": { - "balance": "1910000000000000000000" + "0xa4259f8345f7e3a8b72b0fec2cf75e321fda4dc2": { + "balance": "0x678a932062e4180000" }, - "095030e4b82692dcf8b8d0912494b9b378ec9328": { - "balance": "1340000000000000000000" + "0x095030e4b82692dcf8b8d0912494b9b378ec9328": { + "balance": "0x48a43c54602f700000" }, - "4b470f7ba030bc7cfcf338d4bf0432a91e2ea5ff": { - "balance": "2000000000000000000000" + "0x4b470f7ba030bc7cfcf338d4bf0432a91e2ea5ff": { + "balance": "0x6c6b935b8bbd400000" }, - "99c9f93e45fe3c1418c353e4c5ac3894eef8121e": { - "balance": "101870000000000000000" + "0x99c9f93e45fe3c1418c353e4c5ac3894eef8121e": { + "balance": "0x585baf145050b0000" }, - "ffac3db879a6c7158e8dec603b407463ba0d31cf": { - "balance": "1970000000000000000000" + "0xffac3db879a6c7158e8dec603b407463ba0d31cf": { + "balance": "0x6acb3df27e1f880000" }, - "ac8e87ddda5e78fcbcb9fa7fc3ce038f9f7d2e34": { - "balance": "2000000000000000000000" + "0xac8e87ddda5e78fcbcb9fa7fc3ce038f9f7d2e34": { + "balance": "0x6c6b935b8bbd400000" }, - "7a0589b143a8e5e107c9ac66a9f9f8597ab3e7ab": { - "balance": "1510990000000000000000" + "0x7a0589b143a8e5e107c9ac66a9f9f8597ab3e7ab": { + "balance": "0x51e932d76e8f7b0000" }, - "b7d581fe0af1ec383f3b3c416783f385146a7612": { - "balance": "20000000000000000000000" + "0xb7d581fe0af1ec383f3b3c416783f385146a7612": { + "balance": "0x43c33c1937564800000" }, - "bb3fc0a29c034d710812dcc775c8cab9d28d6975": { - "balance": "1066806000000000000000" + "0xbb3fc0a29c034d710812dcc775c8cab9d28d6975": { + "balance": "0x39d4e844d1cf5f0000" }, - "2c603ff0fe93616c43573ef279bfea40888d6ae7": { - "balance": "4740000000000000000000" + "0x2c603ff0fe93616c43573ef279bfea40888d6ae7": { + "balance": "0x100f4b6d66757900000" }, - "15f2b7b16432ee50a5f55b41232f6334ed58bdc0": { - "balance": "400000000000000000000" + "0x15f2b7b16432ee50a5f55b41232f6334ed58bdc0": { + "balance": "0x15af1d78b58c400000" }, - "7f3d7203c8a447f7bf36d88ae9b6062a5eee78ae": { - "balance": "6000000000000000000000" + "0x7f3d7203c8a447f7bf36d88ae9b6062a5eee78ae": { + "balance": "0x14542ba12a337c00000" }, - "f067e1f1d683556a4cc4fd0c0313239f32c4cfd8": { - "balance": "1000000000000000000000" + "0xf067e1f1d683556a4cc4fd0c0313239f32c4cfd8": { + "balance": "0x3635c9adc5dea00000" }, - "52738c90d860e04cb12f498d96fdb5bf36fc340e": { - "balance": "30000000000000000000" + "0x52738c90d860e04cb12f498d96fdb5bf36fc340e": { + "balance": "0x1a055690d9db80000" }, - "45781bbe7714a1c8f73b1c747921df4f84278b70": { - "balance": "2000000000000000000000" + "0x45781bbe7714a1c8f73b1c747921df4f84278b70": { + "balance": "0x6c6b935b8bbd400000" }, - "4a97e8fcf4635ea7fc5e96ee51752ec388716b60": { - "balance": "546000000000000000000" + "0x4a97e8fcf4635ea7fc5e96ee51752ec388716b60": { + "balance": "0x1d9945ab2b03480000" }, - "54939ff08921b467cf2946751d856378296c63ed": { - "balance": "1000000000000000000000" + "0x54939ff08921b467cf2946751d856378296c63ed": { + "balance": "0x3635c9adc5dea00000" }, - "6485470e61db110aebdbafd536769e3c599cc908": { - "balance": "600000000000000000000" + "0x6485470e61db110aebdbafd536769e3c599cc908": { + "balance": "0x2086ac351052600000" }, - "e20d1bcb71286dc7128a9fc7c6ed7f733892eef5": { - "balance": "1003400000000000000000" + "0xe20d1bcb71286dc7128a9fc7c6ed7f733892eef5": { + "balance": "0x3664f8e7c24af40000" }, - "d6eea898d4ae2b718027a19ce9a5eb7300abe3ca": { - "balance": "27475000000000000000" + "0xd6eea898d4ae2b718027a19ce9a5eb7300abe3ca": { + "balance": "0x17d4aceee63db8000" }, - "014974a1f46bf204944a853111e52f1602617def": { - "balance": "2000000000000000000000" + "0x014974a1f46bf204944a853111e52f1602617def": { + "balance": "0x6c6b935b8bbd400000" }, - "6aa5732f3b86fb8c81efbe6b5b47b563730b06c8": { - "balance": "1000000000000000000000" + "0x6aa5732f3b86fb8c81efbe6b5b47b563730b06c8": { + "balance": "0x3635c9adc5dea00000" }, - "6107d71dd6d0eefb11d4c916404cb98c753e117d": { - "balance": "2000000000000000000000" + "0x6107d71dd6d0eefb11d4c916404cb98c753e117d": { + "balance": "0x6c6b935b8bbd400000" }, - "dd7bcda65924aaa49b80984ae173750258b92847": { - "balance": "10000000000000000000000" + "0xdd7bcda65924aaa49b80984ae173750258b92847": { + "balance": "0x21e19e0c9bab2400000" }, - "4e7b54474d01fefd388dfcd53b9f662624418a05": { - "balance": "8000000000000000000000" + "0x4e7b54474d01fefd388dfcd53b9f662624418a05": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "24fc73d20793098e09ddab5798506224fa1e1850": { - "balance": "200000000000000000000" + "0x24fc73d20793098e09ddab5798506224fa1e1850": { + "balance": "0xad78ebc5ac6200000" }, - "2b8488bd2d3c197a3d26151815b5a798d27168dc": { - "balance": "6680000000000000000000" + "0x2b8488bd2d3c197a3d26151815b5a798d27168dc": { + "balance": "0x16a1f9f5fd7d9600000" }, - "949131f28943925cfc97d41e0cea0b262973a730": { - "balance": "2800000000000000000000" + "0x949131f28943925cfc97d41e0cea0b262973a730": { + "balance": "0x97c9ce4cf6d5c00000" }, - "60b8d6b73b79534fb08bb8cbcefac7f393c57bfe": { - "balance": "1760000000000000000000" + "0x60b8d6b73b79534fb08bb8cbcefac7f393c57bfe": { + "balance": "0x5f68e8131ecf800000" }, - "d6acc220ba2e51dfcf21d443361eea765cbd35d8": { - "balance": "20000000000000000000" + "0xd6acc220ba2e51dfcf21d443361eea765cbd35d8": { + "balance": "0x1158e460913d00000" }, - "c4c6cb723dd7afa7eb535615e53f3cef14f18118": { - "balance": "1999999000000000000000" + "0xc4c6cb723dd7afa7eb535615e53f3cef14f18118": { + "balance": "0x6c6b8fce0d18798000" }, - "4c9a862ad115d6c8274ed0b944bdd6a5500510a7": { - "balance": "100000000000000000000" + "0x4c9a862ad115d6c8274ed0b944bdd6a5500510a7": { + "balance": "0x56bc75e2d63100000" }, - "85732c065cbd64119941aed430ac59670b6c51c4": { - "balance": "731345000000000000000" + "0x85732c065cbd64119941aed430ac59670b6c51c4": { + "balance": "0x27a57362ab0a0e8000" }, - "0126e12ebc17035f35c0e9d11dd148393c405d7a": { - "balance": "1999600000000000000000" + "0x0126e12ebc17035f35c0e9d11dd148393c405d7a": { + "balance": "0x6c660645aa47180000" }, - "472048cc609aeb242165eaaa8705850cf3125de0": { - "balance": "1000000000000000000000" + "0x472048cc609aeb242165eaaa8705850cf3125de0": { + "balance": "0x3635c9adc5dea00000" }, - "d2edd1ddd6d86dc005baeb541d22b640d5c7cae5": { - "balance": "20000000000000000000" + "0xd2edd1ddd6d86dc005baeb541d22b640d5c7cae5": { + "balance": "0x1158e460913d00000" }, - "4549b15979255f7e65e99b0d5604db98dfcac8bf": { - "balance": "4000000000000000000000" + "0x4549b15979255f7e65e99b0d5604db98dfcac8bf": { + "balance": "0xd8d726b7177a800000" }, - "c6c7c191379897dd9c9d9a33839c4a5f62c0890d": { - "balance": "4000085000000000000000" + "0xc6c7c191379897dd9c9d9a33839c4a5f62c0890d": { + "balance": "0xd8d854b22430688000" }, - "d367009ab658263b62c2333a1c9e4140498e1389": { - "balance": "2000000000000000000000" + "0xd367009ab658263b62c2333a1c9e4140498e1389": { + "balance": "0x6c6b935b8bbd400000" }, - "143f5f1658d9e578f4f3d95f80c0b1bd3933cbda": { - "balance": "1490000000000000000000" + "0x143f5f1658d9e578f4f3d95f80c0b1bd3933cbda": { + "balance": "0x50c5e761a444080000" }, - "1a09fdc2c7a20e23574b97c69e93deba67d37220": { - "balance": "1998000000000000000000" + "0x1a09fdc2c7a20e23574b97c69e93deba67d37220": { + "balance": "0x6c4fd1ee246e780000" }, - "ac8b509aefea1dbfaf2bb33500d6570b6fd96d51": { - "balance": "1820000000000000000000" + "0xac8b509aefea1dbfaf2bb33500d6570b6fd96d51": { + "balance": "0x62a992e53a0af00000" }, - "16ffac84032940f0121a09668b858a7e79ffa3bb": { - "balance": "3879210000000000000000" + "0x16ffac84032940f0121a09668b858a7e79ffa3bb": { + "balance": "0xd24ada6e1087110000" }, - "f338459f32a159b23db30ac335769ab2351aa63c": { - "balance": "30000000000000000000000" + "0xf338459f32a159b23db30ac335769ab2351aa63c": { + "balance": "0x65a4da25d3016c00000" }, - "d82251456dc1380f8f5692f962828640ab9f2a03": { - "balance": "4879980000000000000000" + "0xd82251456dc1380f8f5692f962828640ab9f2a03": { + "balance": "0x1088b53b2c202be0000" }, - "47f4696bd462b20da09fb83ed2039818d77625b3": { - "balance": "149000000000000000000" + "0x47f4696bd462b20da09fb83ed2039818d77625b3": { + "balance": "0x813ca56906d340000" }, - "3dde8b15b3ccbaa5780112c3d674f313bba68026": { - "balance": "1773000000000000000000" + "0x3dde8b15b3ccbaa5780112c3d674f313bba68026": { + "balance": "0x601d515a3e4f940000" }, - "f70d637a845c06db6cdc91e6371ce7c4388a628e": { - "balance": "20000000000000000000" + "0xf70d637a845c06db6cdc91e6371ce7c4388a628e": { + "balance": "0x1158e460913d00000" }, - "68295e8ea5afd9093fc0a465d157922b5d2ae234": { - "balance": "19982000000000000000" + "0x68295e8ea5afd9093fc0a465d157922b5d2ae234": { + "balance": "0x1154e53217ddb0000" }, - "614e8bef3dd2c59b59a4145674401018351884ea": { - "balance": "20000000000000000000" + "0x614e8bef3dd2c59b59a4145674401018351884ea": { + "balance": "0x1158e460913d00000" }, - "4737d042dc6ae73ec73ae2517acea2fdd96487c5": { - "balance": "1000000000000000000000" + "0x4737d042dc6ae73ec73ae2517acea2fdd96487c5": { + "balance": "0x3635c9adc5dea00000" }, - "cec6fc65853f9cce5f8e844676362e1579015f02": { - "balance": "2000000000000000000000" + "0xcec6fc65853f9cce5f8e844676362e1579015f02": { + "balance": "0x6c6b935b8bbd400000" }, - "ae47e2609cfafe369d66d415d939de05081a9872": { - "balance": "27060000000000000000000" + "0xae47e2609cfafe369d66d415d939de05081a9872": { + "balance": "0x5baecf025f9b6500000" }, - "09a928d528ec1b3e25ffc83e218c1e0afe8928c7": { - "balance": "18200000000000000000" + "0x09a928d528ec1b3e25ffc83e218c1e0afe8928c7": { + "balance": "0xfc936392801c0000" }, - "9b444fd337e5d75293adcfff70e1ea01db023222": { - "balance": "100000000000000000000" + "0x9b444fd337e5d75293adcfff70e1ea01db023222": { + "balance": "0x56bc75e2d63100000" }, - "168bdec818eafc6d2992e5ef54aa0e1601e3c561": { - "balance": "1000110000000000000000" + "0x168bdec818eafc6d2992e5ef54aa0e1601e3c561": { + "balance": "0x3637507a30abeb0000" }, - "353dbec42f92b50f975129b93c4c997375f09073": { - "balance": "1999000000000000000000" + "0x353dbec42f92b50f975129b93c4c997375f09073": { + "balance": "0x6c5db2a4d815dc0000" }, - "6fcc2c732bdd934af6ccd16846fb26ef89b2aa9b": { - "balance": "10001242000000000000000" + "0x6fcc2c732bdd934af6ccd16846fb26ef89b2aa9b": { + "balance": "0x21e2b1d42261d490000" }, - "6f2576da4de283bbe8e3ee69ddd66e5e711db3f5": { - "balance": "1260800000000000000000" + "0x6f2576da4de283bbe8e3ee69ddd66e5e711db3f5": { + "balance": "0x44591d67fecc800000" }, - "3a3dd104cd7eb04f21932fd433ea7affd39369f5": { - "balance": "357500000000000000000" + "0x3a3dd104cd7eb04f21932fd433ea7affd39369f5": { + "balance": "0x13614f23e242260000" }, - "d44f4ac5fad76bdc1537a3b3af6472319b410d9d": { - "balance": "1600000000000000000000" + "0xd44f4ac5fad76bdc1537a3b3af6472319b410d9d": { + "balance": "0x56bc75e2d631000000" }, - "3d9d6be57ff83e065985664f12564483f2e600b2": { - "balance": "2041600000000000000000" + "0x3d9d6be57ff83e065985664f12564483f2e600b2": { + "balance": "0x6eace43f23bd800000" }, - "88f1045f19f2d3191816b1df18bb6e1435ad1b38": { - "balance": "240000000000000000000" + "0x88f1045f19f2d3191816b1df18bb6e1435ad1b38": { + "balance": "0xd02ab486cedc00000" }, - "ddab75fb2ff9fecb88f89476688e2b00e367ebf9": { - "balance": "19400000000000000000000" + "0xddab75fb2ff9fecb88f89476688e2b00e367ebf9": { + "balance": "0x41bad155e6512200000" }, - "092e815558402d67f90d6bfe6da0b2fffa91455a": { - "balance": "60000000000000000000" + "0x092e815558402d67f90d6bfe6da0b2fffa91455a": { + "balance": "0x340aad21b3b700000" }, - "a7024cfd742c1ec13c01fea18d3042e65f1d5dee": { - "balance": "11272229000000000000000" + "0xa7024cfd742c1ec13c01fea18d3042e65f1d5dee": { + "balance": "0x263119a28abd0b08000" }, - "7f46bb25460dd7dae4211ca7f15ad312fc7dc75c": { - "balance": "6685000000000000000000" + "0x7f46bb25460dd7dae4211ca7f15ad312fc7dc75c": { + "balance": "0x16a6502f15a1e540000" }, - "93f18cd2526040761488c513174d1e7963768b2c": { - "balance": "2416500000000000000000" + "0x93f18cd2526040761488c513174d1e7963768b2c": { + "balance": "0x82ffac9ad593720000" }, - "352f25babf4a690673e35195efa8f79d05848aad": { - "balance": "66800000000000000000000" + "0x352f25babf4a690673e35195efa8f79d05848aad": { + "balance": "0xe253c39be6e7dc00000" }, - "f7b151cc5e571c17c76539dbe9964cbb6fe5de79": { - "balance": "2148000000000000000000" + "0xf7b151cc5e571c17c76539dbe9964cbb6fe5de79": { + "balance": "0x74717cfb6883100000" }, - "ff3eee57c34d6dae970d8b311117c53586cd3502": { - "balance": "1700000000000000000000" + "0xff3eee57c34d6dae970d8b311117c53586cd3502": { + "balance": "0x5c283d410394100000" }, - "ae6f0c73fdd77c489727512174d9b50296611c4c": { - "balance": "6000000000000000000000" + "0xae6f0c73fdd77c489727512174d9b50296611c4c": { + "balance": "0x14542ba12a337c00000" }, - "7819b0458e314e2b53bfe00c38495fd4b9fdf8d6": { - "balance": "20000000000000000000" + "0x7819b0458e314e2b53bfe00c38495fd4b9fdf8d6": { + "balance": "0x1158e460913d00000" }, - "7fdba031c78f9c096d62d05a369eeab0bccc55e5": { - "balance": "2800000000000000000000" + "0x7fdba031c78f9c096d62d05a369eeab0bccc55e5": { + "balance": "0x97c9ce4cf6d5c00000" }, - "735e328666ed5637142b3306b77ccc5460e72c3d": { - "balance": "1968682000000000000000" + "0x735e328666ed5637142b3306b77ccc5460e72c3d": { + "balance": "0x6ab8f37879c9910000" }, - "0bfbb6925dc75e52cf2684224bbe0550fea685d3": { - "balance": "1970000000000000000000" + "0x0bfbb6925dc75e52cf2684224bbe0550fea685d3": { + "balance": "0x6acb3df27e1f880000" }, - "6be16313643ebc91ff9bb1a2e116b854ea933a45": { - "balance": "500000000000000000000" + "0x6be16313643ebc91ff9bb1a2e116b854ea933a45": { + "balance": "0x1b1ae4d6e2ef500000" }, - "d6acffd0bfd99c382e7bd56ff0e6144a9e52b08e": { - "balance": "160000000000000000000" + "0xd6acffd0bfd99c382e7bd56ff0e6144a9e52b08e": { + "balance": "0x8ac7230489e800000" }, - "276a006e3028ecd44cdb62ba0a77ce94ebd9f10f": { - "balance": "1800000000000000000000" + "0x276a006e3028ecd44cdb62ba0a77ce94ebd9f10f": { + "balance": "0x6194049f30f7200000" }, - "10711c3dda32317885f0a2fd8ae92e82069b0d0b": { - "balance": "4000000000000000000000" + "0x10711c3dda32317885f0a2fd8ae92e82069b0d0b": { + "balance": "0xd8d726b7177a800000" }, - "43cb9652818c6f4d6796b0e89409306c79db6349": { - "balance": "2000000000000000000000" + "0x43cb9652818c6f4d6796b0e89409306c79db6349": { + "balance": "0x6c6b935b8bbd400000" }, - "7109dd011d15f3122d9d3a27588c10d77744508b": { - "balance": "2000000000000000000000" + "0x7109dd011d15f3122d9d3a27588c10d77744508b": { + "balance": "0x6c6b935b8bbd400000" }, - "3497dd66fd118071a78c2cb36e40b6651cc82598": { - "balance": "109600000000000000000" + "0x3497dd66fd118071a78c2cb36e40b6651cc82598": { + "balance": "0x5f1016b5076d00000" }, - "9bf672d979b36652fc5282547a6a6bc212ae4368": { - "balance": "656000000000000000000" + "0x9bf672d979b36652fc5282547a6a6bc212ae4368": { + "balance": "0x238fd42c5cf0400000" }, - "eaed16eaf5daab5bf0295e5e077f59fb8255900b": { - "balance": "4000000000000000000000" + "0xeaed16eaf5daab5bf0295e5e077f59fb8255900b": { + "balance": "0xd8d726b7177a800000" }, - "7ac58f6ffc4f8107ae6e30378e4e9f99c57fbb24": { - "balance": "40000000000000000000" + "0x7ac58f6ffc4f8107ae6e30378e4e9f99c57fbb24": { + "balance": "0x22b1c8c1227a00000" }, - "45a570dcc2090c86a6b3ea29a60863dde41f13b5": { - "balance": "232500000000000000000" + "0x45a570dcc2090c86a6b3ea29a60863dde41f13b5": { + "balance": "0xc9a95ee2986520000" }, - "433a3b68e56b0df1862b90586bbd39c840ff1936": { - "balance": "2000000000000000000000" + "0x433a3b68e56b0df1862b90586bbd39c840ff1936": { + "balance": "0x6c6b935b8bbd400000" }, - "e8eaf12944092dc3599b3953fa7cb1c9761cc246": { - "balance": "1800000000000000000000" + "0xe8eaf12944092dc3599b3953fa7cb1c9761cc246": { + "balance": "0x6194049f30f7200000" }, - "ec11362cec810985d0ebbd7b73451444985b369f": { - "balance": "30000047000000000000000" + "0xec11362cec810985d0ebbd7b73451444985b369f": { + "balance": "0x65a4e49577057318000" }, - "78e83f80b3678c7a0a4e3e8c84dccde064426277": { - "balance": "1790000000000000000000" + "0x78e83f80b3678c7a0a4e3e8c84dccde064426277": { + "balance": "0x61093d7c2c6d380000" }, - "0cc67f8273e1bae0867fd42e8b8193d72679dbf8": { - "balance": "500000000000000000000" + "0x0cc67f8273e1bae0867fd42e8b8193d72679dbf8": { + "balance": "0x1b1ae4d6e2ef500000" }, - "c70d856d621ec145303c0a6400cd17bbd6f5eaf7": { - "balance": "20000000000000000000" + "0xc70d856d621ec145303c0a6400cd17bbd6f5eaf7": { + "balance": "0x1158e460913d00000" }, - "f468906e7edf664ab0d8be3d83eb7ab3f7ffdc78": { - "balance": "1700000000000000000000" + "0xf468906e7edf664ab0d8be3d83eb7ab3f7ffdc78": { + "balance": "0x5c283d410394100000" }, - "3c286cfb30146e5fd790c2c8541552578de334d8": { - "balance": "10203000000000000000000" + "0x3c286cfb30146e5fd790c2c8541552578de334d8": { + "balance": "0x2291b11aa306e8c0000" }, - "c401c427cccff10decb864202f36f5808322a0a8": { - "balance": "3329300000000000000000" + "0xc401c427cccff10decb864202f36f5808322a0a8": { + "balance": "0xb47b51a69cd4020000" }, - "afd019ff36a09155346b69974815a1c912c90aa4": { - "balance": "2000000000000000000000" + "0xafd019ff36a09155346b69974815a1c912c90aa4": { + "balance": "0x6c6b935b8bbd400000" }, - "96fe59c3dbb3aa7cc8cb62480c65e56e6204a7e2": { - "balance": "20000000000000000000000" + "0x96fe59c3dbb3aa7cc8cb62480c65e56e6204a7e2": { + "balance": "0x43c33c1937564800000" }, - "a47779d8bc1c7bce0f011ccb39ef68b854f8de8f": { - "balance": "2000000000000000000000" + "0xa47779d8bc1c7bce0f011ccb39ef68b854f8de8f": { + "balance": "0x6c6b935b8bbd400000" }, - "58c650ced40bb65641b8e8a924a039def46854df": { - "balance": "18500000000000000000" + "0x58c650ced40bb65641b8e8a924a039def46854df": { + "balance": "0x100bd33fb98ba0000" }, - "86f4f40ad984fbb80933ae626e0e42f9333fdd41": { - "balance": "1000000000000000000000" + "0x86f4f40ad984fbb80933ae626e0e42f9333fdd41": { + "balance": "0x3635c9adc5dea00000" }, - "b22d5055d9623135961e6abd273c90deea16a3e7": { - "balance": "1400000000000000000000" + "0xb22d5055d9623135961e6abd273c90deea16a3e7": { + "balance": "0x4be4e7267b6ae00000" }, - "ee3564f5f1ba0f94ec7bac164bddbf31c6888b55": { - "balance": "100000000000000000000" + "0xee3564f5f1ba0f94ec7bac164bddbf31c6888b55": { + "balance": "0x56bc75e2d63100000" }, - "cf26b47bd034bc508e6c4bcfd6c7d30034925761": { - "balance": "1800000000000000000000" + "0xcf26b47bd034bc508e6c4bcfd6c7d30034925761": { + "balance": "0x6194049f30f7200000" }, - "e87dbac636a37721df54b08a32ef4959b5e4ff82": { - "balance": "2000000000000000000000" + "0xe87dbac636a37721df54b08a32ef4959b5e4ff82": { + "balance": "0x6c6b935b8bbd400000" }, - "3bf86ed8a3153ec933786a02ac090301855e576b": { - "balance": "450000000000000000000000" + "0x3bf86ed8a3153ec933786a02ac090301855e576b": { + "balance": "0x5f4a8c8375d155400000" }, - "cfd2728dfb8bdbf3bf73598a6e13eaf43052ea2b": { - "balance": "170000000000000000000" + "0xcfd2728dfb8bdbf3bf73598a6e13eaf43052ea2b": { + "balance": "0x93739534d28680000" }, - "85b16f0b8b34dff3804f69e2168a4f7b24d1042b": { - "balance": "317000000000000000000" + "0x85b16f0b8b34dff3804f69e2168a4f7b24d1042b": { + "balance": "0x112f423c7646d40000" }, - "84db1459bb00812ea67ecb3dc189b72187d9c501": { - "balance": "148851000000000000000" + "0x84db1459bb00812ea67ecb3dc189b72187d9c501": { + "balance": "0x811b8fbda85ab8000" }, - "8c3a9ee71f729f236cba3867b4d79d8ceee25dbc": { - "balance": "100000000000000000000" + "0x8c3a9ee71f729f236cba3867b4d79d8ceee25dbc": { + "balance": "0x56bc75e2d63100000" }, - "e677c31fd9cb720075dca49f1abccd59ec33f734": { - "balance": "7800000000000000000000" + "0xe677c31fd9cb720075dca49f1abccd59ec33f734": { + "balance": "0x1a6d6beb1d42ee00000" }, - "8889448316ccf14ed86df8e2f478dc63c4338340": { - "balance": "15200000000000000000" + "0x8889448316ccf14ed86df8e2f478dc63c4338340": { + "balance": "0xd2f13f7789f00000" }, - "b279c7d355c2880392aad1aa21ee867c3b3507df": { - "balance": "1261000000000000000000" + "0xb279c7d355c2880392aad1aa21ee867c3b3507df": { + "balance": "0x445be3f2ef87940000" }, - "12b5e28945bb2969f9c64c63cc05b6f1f8d6f4d5": { - "balance": "7722162000000000000000" + "0x12b5e28945bb2969f9c64c63cc05b6f1f8d6f4d5": { + "balance": "0x1a29e86913b74050000" }, - "8d2303341e1e1eb5e8189bde03f73a60a2a54861": { - "balance": "100000000000000000000" + "0x8d2303341e1e1eb5e8189bde03f73a60a2a54861": { + "balance": "0x56bc75e2d63100000" }, - "94d81074db5ae197d2bb1373ab80a87d121c4bd3": { - "balance": "9400000000000000000000" + "0x94d81074db5ae197d2bb1373ab80a87d121c4bd3": { + "balance": "0x1fd933494aa5fe00000" }, - "752c9febf42f66c4787bfa7eb17cf5333bba5070": { - "balance": "1966448000000000000000" + "0x752c9febf42f66c4787bfa7eb17cf5333bba5070": { + "balance": "0x6a99f2b54fdd580000" }, - "16816aac0ede0d2d3cd442da79e063880f0f1d67": { - "balance": "2000000000000000000000" + "0x16816aac0ede0d2d3cd442da79e063880f0f1d67": { + "balance": "0x6c6b935b8bbd400000" }, - "daac91c1e859d5e57ed3084b50200f9766e2c52b": { - "balance": "400000000000000000000" + "0xdaac91c1e859d5e57ed3084b50200f9766e2c52b": { + "balance": "0x15af1d78b58c400000" }, - "32c2fde2b6aabb80e5aea2b949a217f3cb092283": { - "balance": "5614827000000000000000" + "0x32c2fde2b6aabb80e5aea2b949a217f3cb092283": { + "balance": "0x1306160afdf20378000" }, - "cdab46a5902080646fbf954204204ae88404822b": { - "balance": "544942000000000000000" + "0xcdab46a5902080646fbf954204204ae88404822b": { + "balance": "0x1d8a96e5c606eb0000" }, - "fdf42343019b0b0c6bf260b173afab7e45b9d621": { - "balance": "1999944000000000000000" + "0xfdf42343019b0b0c6bf260b173afab7e45b9d621": { + "balance": "0x6c6acc67d7b1d40000" }, - "791f6040b4e3e50dcf3553f182cd97a90630b75d": { - "balance": "4000000000000000000000" + "0x791f6040b4e3e50dcf3553f182cd97a90630b75d": { + "balance": "0xd8d726b7177a800000" }, - "4b762166dd1118e84369f804c75f9cd657bf730c": { - "balance": "500000000000000000000" + "0x4b762166dd1118e84369f804c75f9cd657bf730c": { + "balance": "0x1b1ae4d6e2ef500000" }, - "a76d3f156251b72c0ccf4b47a3393cbd6f49a9c5": { - "balance": "1337000000000000000000" + "0xa76d3f156251b72c0ccf4b47a3393cbd6f49a9c5": { + "balance": "0x487a9a304539440000" }, - "c5eb42295e9cadeaf2af12dede8a8d53c579c469": { - "balance": "3820000000000000000000" + "0xc5eb42295e9cadeaf2af12dede8a8d53c579c469": { + "balance": "0xcf152640c5c8300000" }, - "db9371b30c4c844e59e03e924be606a938d1d310": { - "balance": "2000000000000000000000" + "0xdb9371b30c4c844e59e03e924be606a938d1d310": { + "balance": "0x6c6b935b8bbd400000" }, - "2cd39334ac7eac797257abe3736195f5b4b5ce0f": { - "balance": "99964000000000000000" + "0x2cd39334ac7eac797257abe3736195f5b4b5ce0f": { + "balance": "0x56b47785e37260000" }, - "ad44357e017e244f476931c7b8189efee80a5d0a": { - "balance": "300000000000000000000" + "0xad44357e017e244f476931c7b8189efee80a5d0a": { + "balance": "0x1043561a8829300000" }, - "4ca7b717d9bc8793b04e051a8d23e1640f5ba5e3": { - "balance": "1248980000000000000000" + "0x4ca7b717d9bc8793b04e051a8d23e1640f5ba5e3": { + "balance": "0x43b514549ecf620000" }, - "73e4a2b60cf48e8baf2b777e175a5b1e4d0c2d8f": { - "balance": "100000000000000000000" + "0x73e4a2b60cf48e8baf2b777e175a5b1e4d0c2d8f": { + "balance": "0x56bc75e2d63100000" }, - "5a1d2d2d1d520304b6208849570437eb3091bb9f": { - "balance": "1970000000000000000000" + "0x5a1d2d2d1d520304b6208849570437eb3091bb9f": { + "balance": "0x6acb3df27e1f880000" }, - "53047dc8ac9083d90672e8b3473c100ccd278323": { - "balance": "40000000000000000000" + "0x53047dc8ac9083d90672e8b3473c100ccd278323": { + "balance": "0x22b1c8c1227a00000" }, - "26fe174cbf526650e0cd009bd6126502ce8e684d": { - "balance": "11640000000000000000000" + "0x26fe174cbf526650e0cd009bd6126502ce8e684d": { + "balance": "0x277017338a30ae00000" }, - "e2df23f6ea04becf4ab701748dc0963184555cdb": { - "balance": "2000000000000000000000" + "0xe2df23f6ea04becf4ab701748dc0963184555cdb": { + "balance": "0x6c6b935b8bbd400000" }, - "c1170dbaadb3dee6198ea544baec93251860fda5": { - "balance": "1200000000000000000000" + "0xc1170dbaadb3dee6198ea544baec93251860fda5": { + "balance": "0x410d586a20a4c00000" }, - "8bbeacfc29cfe93402db3c41d99ab759662e73ec": { - "balance": "2000000000000000000000" + "0x8bbeacfc29cfe93402db3c41d99ab759662e73ec": { + "balance": "0x6c6b935b8bbd400000" }, - "165305b787322e25dc6ad0cefe6c6f334678d569": { - "balance": "2000000000000000000000" + "0x165305b787322e25dc6ad0cefe6c6f334678d569": { + "balance": "0x6c6b935b8bbd400000" }, - "095457f8ef8e2bdc362196b9a9125da09c67e3ab": { - "balance": "200000000000000000000" + "0x095457f8ef8e2bdc362196b9a9125da09c67e3ab": { + "balance": "0xad78ebc5ac6200000" }, - "702802f36d00250fab53adbcd696f0176f638a49": { - "balance": "2000000000000000000000" + "0x702802f36d00250fab53adbcd696f0176f638a49": { + "balance": "0x6c6b935b8bbd400000" }, - "489334c2b695c8ee0794bd864217fb9fd8f8b135": { - "balance": "18200000000000000000" + "0x489334c2b695c8ee0794bd864217fb9fd8f8b135": { + "balance": "0xfc936392801c0000" }, - "fa8cf4e627698c5d5788abb7880417e750231399": { - "balance": "4244640000000000000000" + "0xfa8cf4e627698c5d5788abb7880417e750231399": { + "balance": "0xe61a3696eef6100000" }, - "3329eb3baf4345d600ced40e6e9975656f113742": { - "balance": "4999711000000000000000" + "0x3329eb3baf4345d600ced40e6e9975656f113742": { + "balance": "0x10f08eda8e555098000" }, - "b4dd5499daeb2507fb2de12297731d4c72b16bb0": { - "balance": "20000000000000000000" + "0xb4dd5499daeb2507fb2de12297731d4c72b16bb0": { + "balance": "0x1158e460913d00000" }, - "88c2516a7cdb09a6276d7297d30f5a4db1e84b86": { - "balance": "4000000000000000000000" + "0x88c2516a7cdb09a6276d7297d30f5a4db1e84b86": { + "balance": "0xd8d726b7177a800000" }, - "612ced8dc0dc9e899ee46f7962333315f3f55e44": { - "balance": "338830000000000000000" + "0x612ced8dc0dc9e899ee46f7962333315f3f55e44": { + "balance": "0x125e35f9cd3d9b0000" }, - "d71e43a45177ad51cbe0f72184a5cb503917285a": { - "balance": "200000000000000000000" + "0xd71e43a45177ad51cbe0f72184a5cb503917285a": { + "balance": "0xad78ebc5ac6200000" }, - "2fb566c94bbba4e3cb67cdda7d5fad7131539102": { - "balance": "2000000000000000000000" + "0x2fb566c94bbba4e3cb67cdda7d5fad7131539102": { + "balance": "0x6c6b935b8bbd400000" }, - "03be5b4629aefbbcab9de26d39576cb7f691d764": { - "balance": "200550000000000000000" + "0x03be5b4629aefbbcab9de26d39576cb7f691d764": { + "balance": "0xadf30ba70c8970000" }, - "025367960304beee34591118e9ac2d1358d8021a": { - "balance": "2000000000000000000000" + "0x025367960304beee34591118e9ac2d1358d8021a": { + "balance": "0x6c6b935b8bbd400000" }, - "a5d5b8b62d002def92413710d13b6ff8d4fc7dd3": { - "balance": "400000000000000000000" + "0xa5d5b8b62d002def92413710d13b6ff8d4fc7dd3": { + "balance": "0x15af1d78b58c400000" }, - "df3b72c5bd71d4814e88a62321a93d4011e3578b": { - "balance": "4000000000000000000000" + "0xdf3b72c5bd71d4814e88a62321a93d4011e3578b": { + "balance": "0xd8d726b7177a800000" }, - "3588895ac9fbafec012092dc05c0c302d90740fa": { - "balance": "3000000000000000000000" + "0x3588895ac9fbafec012092dc05c0c302d90740fa": { + "balance": "0xa2a15d09519be00000" }, - "6021e85a8814fce1e82a41abd1d3b2dad2faefe0": { - "balance": "2000000000000000000000" + "0x6021e85a8814fce1e82a41abd1d3b2dad2faefe0": { + "balance": "0x6c6b935b8bbd400000" }, - "17ee9f54d4ddc84d670eff11e54a659fd72f4455": { - "balance": "16000000000000000000000" + "0x17ee9f54d4ddc84d670eff11e54a659fd72f4455": { + "balance": "0x3635c9adc5dea000000" }, - "873c6f70efb6b1d0f2bbc57eebcd70617c6ce662": { - "balance": "1013478000000000000000" + "0x873c6f70efb6b1d0f2bbc57eebcd70617c6ce662": { + "balance": "0x36f0d5275d09570000" }, - "1fcc7ce6a8485895a3199e16481f72e1f762defe": { - "balance": "1000000000000000000000" + "0x1fcc7ce6a8485895a3199e16481f72e1f762defe": { + "balance": "0x3635c9adc5dea00000" }, - "d0a7209b80cf60db62f57d0a5d7d521a69606655": { - "balance": "160000000000000000000" + "0xd0a7209b80cf60db62f57d0a5d7d521a69606655": { + "balance": "0x8ac7230489e800000" }, - "a514d00edd7108a6be839a638db2415418174196": { - "balance": "30000000000000000000000" + "0xa514d00edd7108a6be839a638db2415418174196": { + "balance": "0x65a4da25d3016c00000" }, - "046377f864b0143f282174a892a73d3ec8ec6132": { - "balance": "191000000000000000000" + "0x046377f864b0143f282174a892a73d3ec8ec6132": { + "balance": "0xa5aa85009e39c0000" }, - "c126573d87b0175a5295f1dd07c575cf8cfa15f2": { - "balance": "10000000000000000000000" + "0xc126573d87b0175a5295f1dd07c575cf8cfa15f2": { + "balance": "0x21e19e0c9bab2400000" }, - "0e123d7da6d1e6fac2dcadd27029240bb39052fe": { - "balance": "1000000000000000000000" + "0x0e123d7da6d1e6fac2dcadd27029240bb39052fe": { + "balance": "0x3635c9adc5dea00000" }, - "ad5a8d3c6478b69f657db3837a2575ef8e1df931": { - "balance": "36990000000000000000" + "0xad5a8d3c6478b69f657db3837a2575ef8e1df931": { + "balance": "0x20156e104c1b30000" }, - "db882eacedd0eff263511b312adbbc59c6b8b25b": { - "balance": "9100000000000000000000" + "0xdb882eacedd0eff263511b312adbbc59c6b8b25b": { + "balance": "0x1ed4fde7a2236b00000" }, - "0b43bd2391025581d8956ce42a072579cbbfcb14": { - "balance": "18800000000000000000" + "0x0b43bd2391025581d8956ce42a072579cbbfcb14": { + "balance": "0x104e70464b1580000" }, - "affea0473722cb7f0e0e86b9e11883bf428d8d54": { - "balance": "1940000000000000000000" + "0xaffea0473722cb7f0e0e86b9e11883bf428d8d54": { + "balance": "0x692ae8897081d00000" }, - "e32b1c4725a1875449e98f970eb3e54062d15800": { - "balance": "200000000000000000000" + "0xe32b1c4725a1875449e98f970eb3e54062d15800": { + "balance": "0xad78ebc5ac6200000" }, - "98f4af3af0aede5fafdc42a081ecc1f89e3ccf20": { - "balance": "9400000000000000000000" + "0x98f4af3af0aede5fafdc42a081ecc1f89e3ccf20": { + "balance": "0x1fd933494aa5fe00000" }, - "3b4768fd71e2db2cbe7fa050483c27b4eb931df3": { - "balance": "2000000000000000000000" + "0x3b4768fd71e2db2cbe7fa050483c27b4eb931df3": { + "balance": "0x6c6b935b8bbd400000" }, - "d5f7c41e07729dfa6dfc64c4423160a22c609fd3": { - "balance": "1790000000000000000000" + "0xd5f7c41e07729dfa6dfc64c4423160a22c609fd3": { + "balance": "0x61093d7c2c6d380000" }, - "d944c8a69ff2ca1249690c1229c7192f36251062": { - "balance": "1970000000000000000000" + "0xd944c8a69ff2ca1249690c1229c7192f36251062": { + "balance": "0x6acb3df27e1f880000" }, - "5ae64e853ba0a51282cb8db52e41615e7c9f733f": { - "balance": "2000000000000000000000" + "0x5ae64e853ba0a51282cb8db52e41615e7c9f733f": { + "balance": "0x6c6b935b8bbd400000" }, - "b13f93af30e8d7667381b2b95bc1a699d5e3e129": { - "balance": "420000000000000000000" + "0xb13f93af30e8d7667381b2b95bc1a699d5e3e129": { + "balance": "0x16c4abbebea0100000" }, - "8a20e5b5cee7cd1f5515bace3bf4f77ffde5cc07": { - "balance": "80000000000000000000" + "0x8a20e5b5cee7cd1f5515bace3bf4f77ffde5cc07": { + "balance": "0x4563918244f400000" }, - "2448596f91c09baa30bc96106a2d37b5705e5d28": { - "balance": "2000000000000000000000" + "0x2448596f91c09baa30bc96106a2d37b5705e5d28": { + "balance": "0x6c6b935b8bbd400000" }, - "ccca24d8c56d6e2c07db086ec07e585be267ac8d": { - "balance": "200000000000000000000" + "0xccca24d8c56d6e2c07db086ec07e585be267ac8d": { + "balance": "0xad78ebc5ac6200000" }, - "f67bb8e2118bbcd59027666eedf6943ec9f880a5": { - "balance": "4000000000000000000000" + "0xf67bb8e2118bbcd59027666eedf6943ec9f880a5": { + "balance": "0xd8d726b7177a800000" }, - "7ae659eb3bc46852fa86fac4e21c768d50388945": { - "balance": "286000000000000000000" + "0x7ae659eb3bc46852fa86fac4e21c768d50388945": { + "balance": "0xf810c1cb501b80000" }, - "467e0ed54f3b76ae0636176e07420815a021736e": { - "balance": "2000000000000000000000" + "0x467e0ed54f3b76ae0636176e07420815a021736e": { + "balance": "0x6c6b935b8bbd400000" }, - "a46cd237b63eea438c8e3b6585f679e4860832ac": { - "balance": "1000000000000000000000" + "0xa46cd237b63eea438c8e3b6585f679e4860832ac": { + "balance": "0x3635c9adc5dea00000" }, - "6b760d4877e6a627c1c967bee451a8507ddddbab": { - "balance": "910000000000000000000" + "0x6b760d4877e6a627c1c967bee451a8507ddddbab": { + "balance": "0x3154c9729d05780000" }, - "593044670faeff00a55b5ae051eb7be870b11694": { - "balance": "133700000000000000000" + "0x593044670faeff00a55b5ae051eb7be870b11694": { + "balance": "0x73f75d1a085ba0000" }, - "533c06928f19d0a956cc28866bf6c8d8f4191a94": { - "balance": "292320000000000000000" + "0x533c06928f19d0a956cc28866bf6c8d8f4191a94": { + "balance": "0xfd8c14338e6300000" }, - "262dc1364ccf6df85c43268ee182554dae692e29": { - "balance": "4927600000000000000000" + "0x262dc1364ccf6df85c43268ee182554dae692e29": { + "balance": "0x10b202fec74ced80000" }, - "e4368bc1420b35efda95fafbc73090521916aa34": { - "balance": "4000000000000000000000" + "0xe4368bc1420b35efda95fafbc73090521916aa34": { + "balance": "0xd8d726b7177a800000" }, - "feb92d30bf01ff9a1901666c5573532bfa07eeec": { - "balance": "1000000000000000000000" + "0xfeb92d30bf01ff9a1901666c5573532bfa07eeec": { + "balance": "0x3635c9adc5dea00000" }, - "ee25b9a7032679b113588ed52c137d1a053a1e94": { - "balance": "199820000000000000000" + "0xee25b9a7032679b113588ed52c137d1a053a1e94": { + "balance": "0xad50f3f4eea8e0000" }, - "20134cbff88bfadc466b52eceaa79857891d831e": { - "balance": "1000000000000000000000" + "0x20134cbff88bfadc466b52eceaa79857891d831e": { + "balance": "0x3635c9adc5dea00000" }, - "07b1a306cb4312df66482c2cae72d1e061400fcd": { - "balance": "20000000000000000000000" + "0x07b1a306cb4312df66482c2cae72d1e061400fcd": { + "balance": "0x43c33c1937564800000" }, - "e791d585b89936b25d298f9d35f9f9edc25a2932": { - "balance": "2000000000000000000000" + "0xe791d585b89936b25d298f9d35f9f9edc25a2932": { + "balance": "0x6c6b935b8bbd400000" }, - "2e6933543d4f2cc00b5350bd8068ba9243d6beb0": { - "balance": "2000000000000000000000" + "0x2e6933543d4f2cc00b5350bd8068ba9243d6beb0": { + "balance": "0x6c6b935b8bbd400000" }, - "dae0d33eaa341569fa9ff5982684854a4a328a6e": { - "balance": "1000000000000000000000" + "0xdae0d33eaa341569fa9ff5982684854a4a328a6e": { + "balance": "0x3635c9adc5dea00000" }, - "125cc5e4d56b2bcc2ee1c709fb9e68fb177440bd": { - "balance": "2000000000000000000000" + "0x125cc5e4d56b2bcc2ee1c709fb9e68fb177440bd": { + "balance": "0x6c6b935b8bbd400000" }, - "ec99e95dece46ffffb175eb6400fbebb08ee9b95": { - "balance": "100000000000000000000" + "0xec99e95dece46ffffb175eb6400fbebb08ee9b95": { + "balance": "0x56bc75e2d63100000" }, - "c538a0ff282aaa5f4b75cfb62c70037ee67d4fb5": { - "balance": "2000000000000000000000" + "0xc538a0ff282aaa5f4b75cfb62c70037ee67d4fb5": { + "balance": "0x6c6b935b8bbd400000" }, - "60676d1fa21fca052297e24bf96389c5b12a70d7": { - "balance": "241500000000000000000" + "0x60676d1fa21fca052297e24bf96389c5b12a70d7": { + "balance": "0xd177c5a7a68d60000" }, - "4b3dfbdb454be5279a3b8addfd0ed1cd37a9420d": { - "balance": "2000000000000000000000" + "0x4b3dfbdb454be5279a3b8addfd0ed1cd37a9420d": { + "balance": "0x6c6b935b8bbd400000" }, - "cdb597299030183f6e2d238533f4642aa58754b6": { - "balance": "400000000000000000000" + "0xcdb597299030183f6e2d238533f4642aa58754b6": { + "balance": "0x15af1d78b58c400000" }, - "1ef2dcbfe0a500411d956eb8c8939c3d6cfe669d": { - "balance": "776000000000000000000" + "0x1ef2dcbfe0a500411d956eb8c8939c3d6cfe669d": { + "balance": "0x2a1129d09367200000" }, - "a7247c53d059eb7c9310f628d7fc6c6a0a773f08": { - "balance": "500000000000000000000" + "0xa7247c53d059eb7c9310f628d7fc6c6a0a773f08": { + "balance": "0x1b1ae4d6e2ef500000" }, - "9799ca21dbcf69bfa1b3f72bac51b9e3ca587cf9": { - "balance": "1700000000000000000000" + "0x9799ca21dbcf69bfa1b3f72bac51b9e3ca587cf9": { + "balance": "0x5c283d410394100000" }, - "ddf95c1e99ce2f9f5698057c19d5c94027ee4a6e": { - "balance": "6000000000000000000000" + "0xddf95c1e99ce2f9f5698057c19d5c94027ee4a6e": { + "balance": "0x14542ba12a337c00000" }, - "83563bc364ed81a0c6da3b56ff49bbf267827a9c": { - "balance": "17332000000000000000000" + "0x83563bc364ed81a0c6da3b56ff49bbf267827a9c": { + "balance": "0x3ab91d17b20de500000" }, - "a192698007cc11aa603d221d5feea076bcf7c30d": { - "balance": "2000000000000000000000" + "0xa192698007cc11aa603d221d5feea076bcf7c30d": { + "balance": "0x6c6b935b8bbd400000" }, - "0134ff38155fabae94fd35c4ffe1d79de7ef9c59": { - "balance": "985000000000000000000" + "0x0134ff38155fabae94fd35c4ffe1d79de7ef9c59": { + "balance": "0x35659ef93f0fc40000" }, - "80977316944e5942e79b0e3abad38da746086519": { - "balance": "38800000000000000000" + "0x80977316944e5942e79b0e3abad38da746086519": { + "balance": "0x21a754a6dc5280000" }, - "193d37ed347d1c2f4e35350d9a444bc57ca4db43": { - "balance": "60000000000000000000" + "0x193d37ed347d1c2f4e35350d9a444bc57ca4db43": { + "balance": "0x340aad21b3b700000" }, - "009a6d7db326679b77c90391a7476d238f3ba33e": { - "balance": "200200000000000000000" + "0x009a6d7db326679b77c90391a7476d238f3ba33e": { + "balance": "0xada55474b81340000" }, - "337b3bdf86d713dbd07b5dbfcc022b7a7b1946ae": { - "balance": "3980000000000000000000" + "0x337b3bdf86d713dbd07b5dbfcc022b7a7b1946ae": { + "balance": "0xd7c198710e66b00000" }, - "7de7fe419cc61f91f408d234cc80d5ca3d054d99": { - "balance": "20000000000000000000" + "0x7de7fe419cc61f91f408d234cc80d5ca3d054d99": { + "balance": "0x1158e460913d00000" }, - "f47bb134da30a812d003af8dccb888f44bbf5724": { - "balance": "5190000000000000000000" + "0xf47bb134da30a812d003af8dccb888f44bbf5724": { + "balance": "0x11959b7fe3395580000" }, - "fd920f722682afb5af451b0544d4f41b3b9d5742": { - "balance": "2330200000000000000000" + "0xfd920f722682afb5af451b0544d4f41b3b9d5742": { + "balance": "0x7e52056a123f3c0000" }, - "0a917f3b5cb0b883047fd9b6593dbcd557f453b9": { - "balance": "1000000000000000000000" + "0x0a917f3b5cb0b883047fd9b6593dbcd557f453b9": { + "balance": "0x3635c9adc5dea00000" }, - "ce9786d3712fa200e9f68537eeaa1a06a6f45a4b": { - "balance": "1790000000000000000000" + "0xce9786d3712fa200e9f68537eeaa1a06a6f45a4b": { + "balance": "0x61093d7c2c6d380000" }, - "9ab98d6dbb1eaae16d45a04568541ad3d8fe06cc": { - "balance": "272451000000000000000" + "0x9ab98d6dbb1eaae16d45a04568541ad3d8fe06cc": { + "balance": "0xec50464fe23f38000" }, - "0b7bb342f01bc9888e6a9af4a887cbf4c2dd2caf": { - "balance": "16000000000000000000000" + "0x0b7bb342f01bc9888e6a9af4a887cbf4c2dd2caf": { + "balance": "0x3635c9adc5dea000000" }, - "4c0b1515dfced7a13e13ee12c0f523ae504f032b": { - "balance": "50000000000000000000000" + "0x4c0b1515dfced7a13e13ee12c0f523ae504f032b": { + "balance": "0xa968163f0a57b400000" }, - "ac2889b5966f0c7f9edb42895cb69d1c04f923a2": { - "balance": "5000000000000000000000" + "0xac2889b5966f0c7f9edb42895cb69d1c04f923a2": { + "balance": "0x10f0cf064dd59200000" }, - "d008513b27604a89ba1763b6f84ce688b346945b": { - "balance": "1000000000000000000000" + "0xd008513b27604a89ba1763b6f84ce688b346945b": { + "balance": "0x3635c9adc5dea00000" }, - "a4b09de6e713dc69546e76ef0acf40b94f0241e6": { - "balance": "322656000000000000000" + "0xa4b09de6e713dc69546e76ef0acf40b94f0241e6": { + "balance": "0x117dc0627ec8700000" }, - "b153f828dd076d4a7c1c2574bb2dee1a44a318a8": { - "balance": "400000000000000000000" + "0xb153f828dd076d4a7c1c2574bb2dee1a44a318a8": { + "balance": "0x15af1d78b58c400000" }, - "02ade5db22f8b758ee1443626c64ec2f32aa0a15": { - "balance": "20000000000000000000000" + "0x02ade5db22f8b758ee1443626c64ec2f32aa0a15": { + "balance": "0x43c33c1937564800000" }, - "0a0650861f785ed8e4bf1005c450bbd06eb48fb6": { - "balance": "3066860000000000000000" + "0x0a0650861f785ed8e4bf1005c450bbd06eb48fb6": { + "balance": "0xa6413b79144e7e0000" }, - "b75149e185f6e3927057739073a1822ae1cf0df2": { - "balance": "4000086000000000000000" + "0xb75149e185f6e3927057739073a1822ae1cf0df2": { + "balance": "0xd8d8583fa2d52f0000" }, - "84cb7da0502df45cf561817bbd2362f451be02da": { - "balance": "1337000000000000000000" + "0x84cb7da0502df45cf561817bbd2362f451be02da": { + "balance": "0x487a9a304539440000" }, - "c91bb562e42bd46130e2d3ae4652b6a4eb86bc0f": { - "balance": "540000000000000000000" + "0xc91bb562e42bd46130e2d3ae4652b6a4eb86bc0f": { + "balance": "0x1d460162f516f00000" }, - "b234035f7544463ce1e22bc553064684c513cd51": { - "balance": "249750000000000000000" + "0xb234035f7544463ce1e22bc553064684c513cd51": { + "balance": "0xd89fa3dc48dcf0000" }, - "e5e33800a1b2e96bde1031630a959aa007f26e51": { - "balance": "1337000000000000000000" + "0xe5e33800a1b2e96bde1031630a959aa007f26e51": { + "balance": "0x487a9a304539440000" }, - "ae5ce3355a7ba9b332760c0950c2bc45a85fa9a0": { - "balance": "400000000000000000000" + "0xae5ce3355a7ba9b332760c0950c2bc45a85fa9a0": { + "balance": "0x15af1d78b58c400000" }, - "e6f5eb649afb99599c414b27a9c9c855357fa878": { - "balance": "2674000000000000000000" + "0xe6f5eb649afb99599c414b27a9c9c855357fa878": { + "balance": "0x90f534608a72880000" }, - "7010be2df57bd0ab9ae8196cd50ab0c521aba9f9": { - "balance": "1970000000000000000000" + "0x7010be2df57bd0ab9ae8196cd50ab0c521aba9f9": { + "balance": "0x6acb3df27e1f880000" }, - "ca4288014eddc5632f5facb5e38517a8f8bc5d98": { - "balance": "340000000000000000000" + "0xca4288014eddc5632f5facb5e38517a8f8bc5d98": { + "balance": "0x126e72a69a50d00000" }, - "2784903f1d7c1b5cd901f8875d14a79b3cbe2a56": { - "balance": "22388000000000000000000" + "0x2784903f1d7c1b5cd901f8875d14a79b3cbe2a56": { + "balance": "0x4bda7e9d74ad5500000" }, - "f8dce867f0a39c5bef9eeba609229efa02678b6c": { - "balance": "2000000000000000000000" + "0xf8dce867f0a39c5bef9eeba609229efa02678b6c": { + "balance": "0x6c6b935b8bbd400000" }, - "e020e86362b487752836a6de0bc02cd8d89a8b6a": { - "balance": "6000000000000000000000" + "0xe020e86362b487752836a6de0bc02cd8d89a8b6a": { + "balance": "0x14542ba12a337c00000" }, - "c4088c025f3e85013f5439fb3440a17301e544fe": { - "balance": "2325000000000000000000" + "0xc4088c025f3e85013f5439fb3440a17301e544fe": { + "balance": "0x7e09db4d9f3f340000" }, - "befb448c0c5f683fb67ee570baf0db5686599751": { - "balance": "1970000000000000000000" + "0xbefb448c0c5f683fb67ee570baf0db5686599751": { + "balance": "0x6acb3df27e1f880000" }, - "2f187d5a704d5a338c5b2876a090dce964284e29": { - "balance": "4000000000000000000000" + "0x2f187d5a704d5a338c5b2876a090dce964284e29": { + "balance": "0xd8d726b7177a800000" }, - "ec0e18a01dc4dc5daae567c3fa4c7f8f9b590205": { - "balance": "315900000000000000000" + "0xec0e18a01dc4dc5daae567c3fa4c7f8f9b590205": { + "balance": "0x111ffe404a41e60000" }, - "637f5869d6e4695f0eb9e27311c4878aff333380": { - "balance": "1969212000000000000000" + "0x637f5869d6e4695f0eb9e27311c4878aff333380": { + "balance": "0x6ac04e68aaec860000" }, - "d1100dd00fe2ddf18163ad964d0b69f1f2e9658a": { - "balance": "5959598000000000000000" + "0xd1100dd00fe2ddf18163ad964d0b69f1f2e9658a": { + "balance": "0x143120955b2506b0000" }, - "17ef4acc1bf147e326749d10e677dcffd76f9e06": { - "balance": "39980000000000000000000" + "0x17ef4acc1bf147e326749d10e677dcffd76f9e06": { + "balance": "0x87751f4e0e1b5300000" }, - "200dfc0b71e359b2b465440a36a6cdc352773007": { - "balance": "1500000000000000000000" + "0x200dfc0b71e359b2b465440a36a6cdc352773007": { + "balance": "0x5150ae84a8cdf00000" }, - "efe0675da98a5dda70cd96196b87f4e726b43348": { - "balance": "1164000000000000000000" + "0xefe0675da98a5dda70cd96196b87f4e726b43348": { + "balance": "0x3f19beb8dd1ab00000" }, - "d5bd5e8455c130169357c471e3e681b7996a7276": { - "balance": "841500000000000000000" + "0xd5bd5e8455c130169357c471e3e681b7996a7276": { + "balance": "0x2d9e288f8abb360000" }, - "9c7b6dc5190fe2912963fcd579683ec7395116b0": { - "balance": "776000000000000000000" + "0x9c7b6dc5190fe2912963fcd579683ec7395116b0": { + "balance": "0x2a1129d09367200000" }, - "b105dd3d987cffd813e9c8500a80a1ad257d56c6": { - "balance": "1999944000000000000000" + "0xb105dd3d987cffd813e9c8500a80a1ad257d56c6": { + "balance": "0x6c6acc67d7b1d40000" }, - "145250b06e4fa7cb2749422eb817bdda8b54de5f": { - "balance": "219000000000000000000" + "0x145250b06e4fa7cb2749422eb817bdda8b54de5f": { + "balance": "0xbdf3c4bb0328c0000" }, - "d96db33b7b5a950c3efa2dc31b10ba10a532ef87": { - "balance": "2000000000000000000000" + "0xd96db33b7b5a950c3efa2dc31b10ba10a532ef87": { + "balance": "0x6c6b935b8bbd400000" }, - "af529bdb459cc185bee5a1c58bf7e8cce25c150d": { - "balance": "197000000000000000000" + "0xaf529bdb459cc185bee5a1c58bf7e8cce25c150d": { + "balance": "0xaadec983fcff40000" }, - "185546e8768d506873818ac9751c1f12116a3bef": { - "balance": "200000000000000000000" + "0x185546e8768d506873818ac9751c1f12116a3bef": { + "balance": "0xad78ebc5ac6200000" }, - "51d24bc3736f88dd63b7222026886630b6eb878d": { - "balance": "2000000000000000000000" + "0x51d24bc3736f88dd63b7222026886630b6eb878d": { + "balance": "0x6c6b935b8bbd400000" }, - "69af28b0746cac0da17084b9398c5e36bb3a0df2": { - "balance": "1004700000000000000000" + "0x69af28b0746cac0da17084b9398c5e36bb3a0df2": { + "balance": "0x3677036edf0af60000" }, - "76f83ac3da30f7092628c7339f208bfc142cb1ee": { - "balance": "2842600000000000000000" + "0x76f83ac3da30f7092628c7339f208bfc142cb1ee": { + "balance": "0x9a18ffe7427d640000" }, - "00f463e137dcf625fbf3bca39eca98d2b968cf7f": { - "balance": "5910000000000000000000" + "0x00f463e137dcf625fbf3bca39eca98d2b968cf7f": { + "balance": "0x14061b9d77a5e980000" }, - "2084fce505d97bebf1ad8c5ff6826fc645371fb2": { - "balance": "30000000000000000000" + "0x2084fce505d97bebf1ad8c5ff6826fc645371fb2": { + "balance": "0x1a055690d9db80000" }, - "53a714f99fa00fef758e23a2e746326dad247ca7": { - "balance": "1490000000000000000000" + "0x53a714f99fa00fef758e23a2e746326dad247ca7": { + "balance": "0x50c5e761a444080000" }, - "0bf064428f83626722a7b5b26a9ab20421a7723e": { - "balance": "133700000000000000000" + "0x0bf064428f83626722a7b5b26a9ab20421a7723e": { + "balance": "0x73f75d1a085ba0000" }, - "ac6f68e837cf1961cb14ab47446da168a16dde89": { - "balance": "1337000000000000000000" + "0xac6f68e837cf1961cb14ab47446da168a16dde89": { + "balance": "0x487a9a304539440000" }, - "4b3c7388cc76da3d62d40067dabccd7ef0433d23": { - "balance": "100076000000000000000" + "0x4b3c7388cc76da3d62d40067dabccd7ef0433d23": { + "balance": "0x56cd55fc64dfe0000" }, - "deb9a49a43873020f0759185e20bbb4cf381bb8f": { - "balance": "211628000000000000000" + "0xdeb9a49a43873020f0759185e20bbb4cf381bb8f": { + "balance": "0xb78edb0bf2e5e0000" }, - "5bf9f2226e5aeacf1d80ae0a59c6e38038bc8db5": { - "balance": "6000000000000000000000" + "0x5bf9f2226e5aeacf1d80ae0a59c6e38038bc8db5": { + "balance": "0x14542ba12a337c00000" }, - "9d0e7d92fb305853d798263bf15e97c72bf9d7e0": { - "balance": "1000000000000000000000" + "0x9d0e7d92fb305853d798263bf15e97c72bf9d7e0": { + "balance": "0x3635c9adc5dea00000" }, - "2b5c60e84535eeb4d580de127a12eb2677ccb392": { - "balance": "20000000000000000000000" + "0x2b5c60e84535eeb4d580de127a12eb2677ccb392": { + "balance": "0x43c33c1937564800000" }, - "d8d65420c18c2327cc5af97425f857e4a9fd51b3": { - "balance": "1760000000000000000000" + "0xd8d65420c18c2327cc5af97425f857e4a9fd51b3": { + "balance": "0x5f68e8131ecf800000" }, - "30ec9392244a2108c987bc5cdde0ed9f837a817b": { - "balance": "1560562000000000000000" + "0x30ec9392244a2108c987bc5cdde0ed9f837a817b": { + "balance": "0x549925f6c9c5250000" }, - "56a1d60d40f57f308eebf087dee3b37f1e7c2cba": { - "balance": "1159600000000000000000" + "0x56a1d60d40f57f308eebf087dee3b37f1e7c2cba": { + "balance": "0x3edcaec82d06f80000" }, - "a9a1cdc33bfd376f1c0d76fb6c84b6b4ac274d68": { - "balance": "5000000000000000000000" + "0xa9a1cdc33bfd376f1c0d76fb6c84b6b4ac274d68": { + "balance": "0x10f0cf064dd59200000" }, - "a67f38819565423aa85f3e3ab61bc763cbab89dd": { - "balance": "2130000000000000000000" + "0xa67f38819565423aa85f3e3ab61bc763cbab89dd": { + "balance": "0x7377b022c6be080000" }, - "62d5cc7117e18500ac2f9e3c26c86b0a94b0de15": { - "balance": "105000000000000000000" + "0x62d5cc7117e18500ac2f9e3c26c86b0a94b0de15": { + "balance": "0x5b12aefafa8040000" }, - "4970d3acf72b5b1f32a7003cf102c64ee0547941": { - "balance": "140000000000000000000000" + "0x4970d3acf72b5b1f32a7003cf102c64ee0547941": { + "balance": "0x1da56a4b0835bf800000" }, - "76628150e2995b5b279fc83e0dd5f102a671dd1c": { - "balance": "40000000000000000000000" + "0x76628150e2995b5b279fc83e0dd5f102a671dd1c": { + "balance": "0x878678326eac9000000" }, - "3d8f39881b9edfe91227c33fa4cdd91e678544b0": { - "balance": "86111000000000000000" + "0x3d8f39881b9edfe91227c33fa4cdd91e678544b0": { + "balance": "0x4ab07ba43ada98000" }, - "ff0b7cb71da9d4c1ea6ecc28ebda504c63f82fd1": { - "balance": "1043000000000000000000" + "0xff0b7cb71da9d4c1ea6ecc28ebda504c63f82fd1": { + "balance": "0x388a885df2fc6c0000" }, - "8d795c5f4a5689ad62da961671f028065286d554": { - "balance": "2048000000000000000000" + "0x8d795c5f4a5689ad62da961671f028065286d554": { + "balance": "0x6f05b59d3b20000000" }, - "be2346a27ff9b702044f500deff2e7ffe6824541": { - "balance": "20000000000000000000" + "0xbe2346a27ff9b702044f500deff2e7ffe6824541": { + "balance": "0x1158e460913d00000" }, - "0dbd417c372b8b0d01bcd944706bd32e60ae28d1": { - "balance": "340000000000000000000" + "0x0dbd417c372b8b0d01bcd944706bd32e60ae28d1": { + "balance": "0x126e72a69a50d00000" }, - "467fbf41441600757fe15830c8cd5f4ffbbbd560": { - "balance": "10000000000000000000000" + "0x467fbf41441600757fe15830c8cd5f4ffbbbd560": { + "balance": "0x21e19e0c9bab2400000" }, - "090cd67b60e81d54e7b5f6078f3e021ba65b9a1e": { - "balance": "1000000000000000000000" + "0x090cd67b60e81d54e7b5f6078f3e021ba65b9a1e": { + "balance": "0x3635c9adc5dea00000" }, - "55a4cac0cb8b582d9fef38c5c9fff9bd53093d1f": { - "balance": "1970000000000000000000" + "0x55a4cac0cb8b582d9fef38c5c9fff9bd53093d1f": { + "balance": "0x6acb3df27e1f880000" }, - "3b7b4f53c45655f3dc5f017edc23b16f9bc536fa": { - "balance": "100000000000000000000" + "0x3b7b4f53c45655f3dc5f017edc23b16f9bc536fa": { + "balance": "0x56bc75e2d63100000" }, - "d508d39c70916f6abc4cc7f999f011f077105802": { - "balance": "100470000000000000000" + "0xd508d39c70916f6abc4cc7f999f011f077105802": { + "balance": "0x5724d24afe77f0000" }, - "037dd056e7fdbd641db5b6bea2a8780a83fae180": { - "balance": "140000000000000000000" + "0x037dd056e7fdbd641db5b6bea2a8780a83fae180": { + "balance": "0x796e3ea3f8ab00000" }, - "660557bb43f4be3a1b8b85e7df7b3c5bcd548057": { - "balance": "6000000000000000000000" + "0x660557bb43f4be3a1b8b85e7df7b3c5bcd548057": { + "balance": "0x14542ba12a337c00000" }, - "02089361a3fe7451fb1f87f01a2d866653dc0b07": { - "balance": "39976000000000000000" + "0x02089361a3fe7451fb1f87f01a2d866653dc0b07": { + "balance": "0x22ac74832b5040000" }, - "c4bec96308a20f90cab18399c493fd3d065abf45": { - "balance": "14000000000000000000000" + "0xc4bec96308a20f90cab18399c493fd3d065abf45": { + "balance": "0x2f6f10780d22cc00000" }, - "cca07bb794571d4acf041dad87f0d1ef3185b319": { - "balance": "2000000000000000000000" + "0xcca07bb794571d4acf041dad87f0d1ef3185b319": { + "balance": "0x6c6b935b8bbd400000" }, - "f2d0e986d814ea13c8f466a0538c53dc922651f0": { - "balance": "1380000000000000000000" + "0xf2d0e986d814ea13c8f466a0538c53dc922651f0": { + "balance": "0x4acf58e07257100000" }, - "662cfa038fab37a01745a364e1b98127c503746d": { - "balance": "3940000000000000000000" + "0x662cfa038fab37a01745a364e1b98127c503746d": { + "balance": "0xd5967be4fc3f100000" }, - "3336c3ef6e8b50ee90e037b164b7a8ea5faac65d": { - "balance": "272712000000000000000" + "0x3336c3ef6e8b50ee90e037b164b7a8ea5faac65d": { + "balance": "0xec8a3a71c22540000" }, - "30e33358fc21c85006e40f32357dc8895940aaf0": { - "balance": "1910000000000000000000" + "0x30e33358fc21c85006e40f32357dc8895940aaf0": { + "balance": "0x678a932062e4180000" }, - "41a9a404fc9f5bfee48ec265b12523338e29a8bf": { - "balance": "388000000000000000000" + "0x41a9a404fc9f5bfee48ec265b12523338e29a8bf": { + "balance": "0x150894e849b3900000" }, - "6af235d2bbe050e6291615b71ca5829658810142": { - "balance": "3000000000000000000000" + "0x6af235d2bbe050e6291615b71ca5829658810142": { + "balance": "0xa2a15d09519be00000" }, - "fd5a63157f914fd398eab19c137dd9550bb7715c": { - "balance": "100000000000000000000" + "0xfd5a63157f914fd398eab19c137dd9550bb7715c": { + "balance": "0x56bc75e2d63100000" }, - "8a4314fb61cd938fc33e15e816b113f2ac89a7fb": { - "balance": "432800000000000000000" + "0x8a4314fb61cd938fc33e15e816b113f2ac89a7fb": { + "balance": "0x17764e7aed65100000" }, - "b216dc59e27c3d7279f5cd5bb2becfb2606e14d9": { - "balance": "400000000000000000000" + "0xb216dc59e27c3d7279f5cd5bb2becfb2606e14d9": { + "balance": "0x15af1d78b58c400000" }, - "f5a5459fcdd5e5b273830df88eea4cb77ddadfb9": { - "balance": "74500000000000000000" + "0xf5a5459fcdd5e5b273830df88eea4cb77ddadfb9": { + "balance": "0x409e52b48369a0000" }, - "df31025f5649d2c6eea41ed3bdd3471a790f759a": { - "balance": "20000000000000000000" + "0xdf31025f5649d2c6eea41ed3bdd3471a790f759a": { + "balance": "0x1158e460913d00000" }, - "721f9d17e5a0e74205947aeb9bc6a7938961038f": { - "balance": "51900000000000000000" + "0x721f9d17e5a0e74205947aeb9bc6a7938961038f": { + "balance": "0x2d041d705a2c60000" }, - "08d0864dc32f9acb36bf4ea447e8dd6726906a15": { - "balance": "2000200000000000000000" + "0x08d0864dc32f9acb36bf4ea447e8dd6726906a15": { + "balance": "0x6c6e59e67c78540000" }, - "54575c3114751e3c631971da6a2a02fd3ffbfcc8": { - "balance": "1940000000000000000000" + "0x54575c3114751e3c631971da6a2a02fd3ffbfcc8": { + "balance": "0x692ae8897081d00000" }, - "8f60895fbebbb5017fcbff3cdda397292bf25ba6": { - "balance": "429177000000000000000" + "0x8f60895fbebbb5017fcbff3cdda397292bf25ba6": { + "balance": "0x174406ff9f6fd28000" }, - "91fe8a4c6164df8fa606995d6ba7adcaf1c893ce": { - "balance": "17000000000000000000000" + "0x91fe8a4c6164df8fa606995d6ba7adcaf1c893ce": { + "balance": "0x39992648a23c8a00000" }, - "889087f66ff284f8b5efbd29493b706733ab1447": { - "balance": "9850000000000000000000" + "0x889087f66ff284f8b5efbd29493b706733ab1447": { + "balance": "0x215f835bc769da80000" }, - "051633080d07a557adde319261b074997f14692d": { - "balance": "5800000000000000000000" + "0x051633080d07a557adde319261b074997f14692d": { + "balance": "0x13a6b2b564871a00000" }, - "59a12df2e3ef857aceff9306b309f6a500f70134": { - "balance": "1000000000000000000000" + "0x59a12df2e3ef857aceff9306b309f6a500f70134": { + "balance": "0x3635c9adc5dea00000" }, - "9f64a8e8dacf4ade30d10f4d59b0a3d5abfdbf74": { - "balance": "1000060000000000000000" + "0x9f64a8e8dacf4ade30d10f4d59b0a3d5abfdbf74": { + "balance": "0x36369ed7747d260000" }, - "8846928d683289a2d11df8db7a9474988ef01348": { - "balance": "10000000000000000000000" + "0x8846928d683289a2d11df8db7a9474988ef01348": { + "balance": "0x21e19e0c9bab2400000" }, - "dff1b220de3d8e9ca4c1b5be34a799bcded4f61c": { - "balance": "385428000000000000000" + "0xdff1b220de3d8e9ca4c1b5be34a799bcded4f61c": { + "balance": "0x14e4e353ea39420000" }, - "7e7c1e9a61a08a83984835c70ec31d34d3eaa87f": { - "balance": "191000000000000000000" + "0x7e7c1e9a61a08a83984835c70ec31d34d3eaa87f": { + "balance": "0xa5aa85009e39c0000" }, - "fe210b8f04dc6d4f76216acfcbd59ba83be9b630": { - "balance": "20000000000000000000" + "0xfe210b8f04dc6d4f76216acfcbd59ba83be9b630": { + "balance": "0x1158e460913d00000" }, - "dc8c2912f084a6d184aa73638513ccbc326e0102": { - "balance": "1295000000000000000000" + "0xdc8c2912f084a6d184aa73638513ccbc326e0102": { + "balance": "0x4633bc36cbc2dc0000" }, - "dddd7b9e6eab409b92263ac272da801b664f8a57": { - "balance": "500000000000000000000000" + "0xdddd7b9e6eab409b92263ac272da801b664f8a57": { + "balance": "0x69e10de76676d0800000" }, - "86a5f8259ed5b09e188ce346ee92d34aa5dd93fa": { - "balance": "200000000000000000000" + "0x86a5f8259ed5b09e188ce346ee92d34aa5dd93fa": { + "balance": "0xad78ebc5ac6200000" }, - "dc1f1979615f082140b8bb78c67b27a1942713b1": { - "balance": "60000000000000000000" + "0xdc1f1979615f082140b8bb78c67b27a1942713b1": { + "balance": "0x340aad21b3b700000" }, - "ea66e7b84dcdbf36eea3e75b85382a75f1a15d96": { - "balance": "1729135000000000000000" + "0xea66e7b84dcdbf36eea3e75b85382a75f1a15d96": { + "balance": "0x5dbc9191266f118000" }, - "039e7a4ebc284e2ccd42b1bdd60bd6511c0f7706": { - "balance": "17300000000000000000" + "0x039e7a4ebc284e2ccd42b1bdd60bd6511c0f7706": { + "balance": "0xf015f25736420000" }, - "36bfe1fa3b7b70c172eb042f6819a8972595413e": { - "balance": "1000000000000000000000" + "0x36bfe1fa3b7b70c172eb042f6819a8972595413e": { + "balance": "0x3635c9adc5dea00000" }, - "039ef1ce52fe7963f166d5a275c4b1069fe3a832": { - "balance": "400008000000000000000" + "0x039ef1ce52fe7963f166d5a275c4b1069fe3a832": { + "balance": "0x15af39e4aab2740000" }, - "f1df55dcc34a051012b575cb968bc9c458ea09c9": { - "balance": "4000000000000000000000" + "0xf1df55dcc34a051012b575cb968bc9c458ea09c9": { + "balance": "0xd8d726b7177a800000" }, - "168b5019b818691644835fe69bf229e17112d52c": { - "balance": "28000000000000000000000" + "0x168b5019b818691644835fe69bf229e17112d52c": { + "balance": "0x5ede20f01a459800000" }, - "f60bd735543e6bfd2ea6f11bff627340bc035a23": { - "balance": "2000000000000000000000" + "0xf60bd735543e6bfd2ea6f11bff627340bc035a23": { + "balance": "0x6c6b935b8bbd400000" }, - "2cbb0c73df91b91740b6693b774a7d05177e8e58": { - "balance": "1850000000000000000000" + "0x2cbb0c73df91b91740b6693b774a7d05177e8e58": { + "balance": "0x6449e84e47a8a80000" }, - "9ffcf5ef46d933a519d1d16c6ba3189b27496224": { - "balance": "1000000000000000000000" + "0x9ffcf5ef46d933a519d1d16c6ba3189b27496224": { + "balance": "0x3635c9adc5dea00000" }, - "0e11d77a8977fac30d268445e531149b31541a24": { - "balance": "2000000000000000000000" + "0x0e11d77a8977fac30d268445e531149b31541a24": { + "balance": "0x6c6b935b8bbd400000" }, - "dfb1626ef48a1d7d7552a5e0298f1fc23a3b482d": { - "balance": "1713860000000000000000" + "0xdfb1626ef48a1d7d7552a5e0298f1fc23a3b482d": { + "balance": "0x5ce895dd949efa0000" }, - "cc943be1222cd1400a2399dd1b459445cf6d54a9": { - "balance": "12530000000000000000000" + "0xcc943be1222cd1400a2399dd1b459445cf6d54a9": { + "balance": "0x2a740ae6536fc880000" }, - "b37c2b9f50637bece0ca959208aefee6463ba720": { - "balance": "400000000000000000000" + "0xb37c2b9f50637bece0ca959208aefee6463ba720": { + "balance": "0x15af1d78b58c400000" }, - "96b906ea729f4655afe3e57d35277c967dfa1577": { - "balance": "1000000000000000000000" + "0x96b906ea729f4655afe3e57d35277c967dfa1577": { + "balance": "0x3635c9adc5dea00000" }, - "7995bd8ce2e0c67bf1c7a531d477bca1b2b97561": { - "balance": "5945100000000000000000" + "0x7995bd8ce2e0c67bf1c7a531d477bca1b2b97561": { + "balance": "0x14248d617829ece0000" }, - "96f820500b70f4a3e3239d619cff8f222075b135": { - "balance": "200000000000000000000" + "0x96f820500b70f4a3e3239d619cff8f222075b135": { + "balance": "0xad78ebc5ac6200000" }, - "ad3565d52b688added08168b2d3872d17d0a26ae": { - "balance": "100000000000000000000" + "0xad3565d52b688added08168b2d3872d17d0a26ae": { + "balance": "0x56bc75e2d63100000" }, - "9e7c2050a227bbfd60937e268cea3e68fea8d1fe": { - "balance": "100000000000000000000" + "0x9e7c2050a227bbfd60937e268cea3e68fea8d1fe": { + "balance": "0x56bc75e2d63100000" }, - "7e59dc60be8b2fc19abd0a5782c52c28400bce97": { - "balance": "1000000000000000000000" + "0x7e59dc60be8b2fc19abd0a5782c52c28400bce97": { + "balance": "0x3635c9adc5dea00000" }, - "01ed5fba8d2eab673aec042d30e4e8a611d8c55a": { - "balance": "2000000000000000000000" + "0x01ed5fba8d2eab673aec042d30e4e8a611d8c55a": { + "balance": "0x6c6b935b8bbd400000" }, - "59a087b9351ca42f58f36e021927a22988284f38": { - "balance": "18500000000000000000" + "0x59a087b9351ca42f58f36e021927a22988284f38": { + "balance": "0x100bd33fb98ba0000" }, - "2fe0023f5722650f3a8ac01009125e74e3f82e9b": { - "balance": "3000000000000000000000" + "0x2fe0023f5722650f3a8ac01009125e74e3f82e9b": { + "balance": "0xa2a15d09519be00000" }, - "bd1803370bddb129d239fd16ea8526a6188ae58e": { - "balance": "500000000000000000000" + "0xbd1803370bddb129d239fd16ea8526a6188ae58e": { + "balance": "0x1b1ae4d6e2ef500000" }, - "c70527d444c490e9fc3f5cc44e66eb4f306b380f": { - "balance": "4000000000000000000000" + "0xc70527d444c490e9fc3f5cc44e66eb4f306b380f": { + "balance": "0xd8d726b7177a800000" }, - "0f206e1a1da7207ea518b112418baa8b06260328": { - "balance": "600000000000000000000" + "0x0f206e1a1da7207ea518b112418baa8b06260328": { + "balance": "0x2086ac351052600000" }, - "6e1a046caf5b4a57f4fd4bc173622126b4e2fd86": { - "balance": "1790000000000000000000" + "0x6e1a046caf5b4a57f4fd4bc173622126b4e2fd86": { + "balance": "0x61093d7c2c6d380000" }, - "84008a72f8036f3feba542e35078c057f32a8825": { - "balance": "100000000000000000000" + "0x84008a72f8036f3feba542e35078c057f32a8825": { + "balance": "0x56bc75e2d63100000" }, - "246291165b59332df5f18ce5c98856fae95897d6": { - "balance": "1700000000000000000000" + "0x246291165b59332df5f18ce5c98856fae95897d6": { + "balance": "0x5c283d410394100000" }, - "7e99dfbe989d3ba529d19751b7f4317f8953a3e2": { - "balance": "400000000000000000000" + "0x7e99dfbe989d3ba529d19751b7f4317f8953a3e2": { + "balance": "0x15af1d78b58c400000" }, - "748c285ef1233fe4d31c8fb1378333721c12e27a": { - "balance": "2000000000000000000000" + "0x748c285ef1233fe4d31c8fb1378333721c12e27a": { + "balance": "0x6c6b935b8bbd400000" }, - "3dd12e556a603736feba4a6fa8bd4ac45d662a04": { - "balance": "167450000000000000000000" + "0x3dd12e556a603736feba4a6fa8bd4ac45d662a04": { + "balance": "0x23757b9183e078280000" }, - "d0ae735d915e946866e1fea77e5ea466b5cadd16": { - "balance": "2000000000000000000000" + "0xd0ae735d915e946866e1fea77e5ea466b5cadd16": { + "balance": "0x6c6b935b8bbd400000" }, - "4f767bc8794aef9a0a38fea5c81f14694ff21a13": { - "balance": "512200000000000000000" + "0x4f767bc8794aef9a0a38fea5c81f14694ff21a13": { + "balance": "0x1bc433f23f83140000" }, - "0e2f8e28a681f77c583bd0ecde16634bdd7e00cd": { - "balance": "95060000000000000000" + "0x0e2f8e28a681f77c583bd0ecde16634bdd7e00cd": { + "balance": "0x52738f659bca20000" }, - "d74a6e8d6aab34ce85976814c1327bd6ea0784d2": { - "balance": "100000000000000000000000" + "0xd74a6e8d6aab34ce85976814c1327bd6ea0784d2": { + "balance": "0x152d02c7e14af6800000" }, - "629be7ab126a5398edd6da9f18447e78c692a4fd": { - "balance": "2000000000000000000000" + "0x629be7ab126a5398edd6da9f18447e78c692a4fd": { + "balance": "0x6c6b935b8bbd400000" }, - "2e46fcee6a3bb145b594a243a3913fce5dad6fba": { - "balance": "10000000000000000000000" + "0x2e46fcee6a3bb145b594a243a3913fce5dad6fba": { + "balance": "0x21e19e0c9bab2400000" }, - "e39b11a8ab1ff5e22e5ae6517214f73c5b9b55dc": { - "balance": "2000000000000000000000" + "0xe39b11a8ab1ff5e22e5ae6517214f73c5b9b55dc": { + "balance": "0x6c6b935b8bbd400000" }, - "119aa64d5b7d181dae9d3cb449955c89c1f963fa": { - "balance": "700000000000000000000" + "0x119aa64d5b7d181dae9d3cb449955c89c1f963fa": { + "balance": "0x25f273933db5700000" }, - "ce079f51887774d8021cb3b575f58f18e9acf984": { - "balance": "180000000000000000000" + "0xce079f51887774d8021cb3b575f58f18e9acf984": { + "balance": "0x9c2007651b2500000" }, - "550c306f81ef5d9580c06cb1ab201b95c748a691": { - "balance": "665800000000000000000" + "0x550c306f81ef5d9580c06cb1ab201b95c748a691": { + "balance": "0x2417d4c470bf140000" }, - "06dc7f18cee7edab5b795337b1df6a9e8bd8ae59": { - "balance": "400000000000000000000" + "0x06dc7f18cee7edab5b795337b1df6a9e8bd8ae59": { + "balance": "0x15af1d78b58c400000" }, - "e21c778ef2a0d7f751ea8c074d1f812243863e4e": { - "balance": "5308559000000000000000" + "0xe21c778ef2a0d7f751ea8c074d1f812243863e4e": { + "balance": "0x11fc70e2c8c8ae18000" }, - "45d4b54d37a8cf599821235f062fa9d170ede8a4": { - "balance": "324000000000000000000" + "0x45d4b54d37a8cf599821235f062fa9d170ede8a4": { + "balance": "0x1190673b5fda900000" }, - "893a6c2eb8b40ab096b4f67e74a897b840746e86": { - "balance": "1730000000000000000000" + "0x893a6c2eb8b40ab096b4f67e74a897b840746e86": { + "balance": "0x5dc892aa1131c80000" }, - "d44d81e18f46e2cfb5c1fcf5041bc8569767d100": { - "balance": "36381800000000000000000" + "0xd44d81e18f46e2cfb5c1fcf5041bc8569767d100": { + "balance": "0x7b442e684f65aa40000" }, - "c5de1203d3cc2cea31c82ee2de5916880799eafd": { - "balance": "5000000000000000000000" + "0xc5de1203d3cc2cea31c82ee2de5916880799eafd": { + "balance": "0x10f0cf064dd59200000" }, - "7f0f04fcf37a53a4e24ede6e93104e78be1d3c9e": { - "balance": "2000000000000000000000" + "0x7f0f04fcf37a53a4e24ede6e93104e78be1d3c9e": { + "balance": "0x6c6b935b8bbd400000" }, - "3ce1dc97fcd7b7c4d3a18a49d6f2a5c1b1a906d7": { - "balance": "200000000000000000000" + "0x3ce1dc97fcd7b7c4d3a18a49d6f2a5c1b1a906d7": { + "balance": "0xad78ebc5ac6200000" }, - "ac4ee9d502e7d2d2e99e59d8ca7d5f00c94b4dd6": { - "balance": "1000000000000000000000" + "0xac4ee9d502e7d2d2e99e59d8ca7d5f00c94b4dd6": { + "balance": "0x3635c9adc5dea00000" }, - "7640a37f8052981515bce078da93afa4789b5734": { - "balance": "2000000000000000000000" + "0x7640a37f8052981515bce078da93afa4789b5734": { + "balance": "0x6c6b935b8bbd400000" }, - "76cac488111a4fd595f568ae3a858770fc915d5f": { - "balance": "200000000000000000000" + "0x76cac488111a4fd595f568ae3a858770fc915d5f": { + "balance": "0xad78ebc5ac6200000" }, - "ff4a408f50e9e72146a28ce4fc8d90271f116e84": { - "balance": "1970000000000000000000" + "0xff4a408f50e9e72146a28ce4fc8d90271f116e84": { + "balance": "0x6acb3df27e1f880000" }, - "249db29dbc19d1235da7298a04081c315742e9ac": { - "balance": "1801800000000000000000" + "0x249db29dbc19d1235da7298a04081c315742e9ac": { + "balance": "0x61acff81a78ad40000" }, - "3a04572847d31e81f7765ca5bfc9d557159f3683": { - "balance": "133031000000000000000" + "0x3a04572847d31e81f7765ca5bfc9d557159f3683": { + "balance": "0x7362d0dabeafd8000" }, - "b6771b0bf3427f9ae7a93e7c2e61ee63941fdb08": { - "balance": "18800000000000000000000" + "0xb6771b0bf3427f9ae7a93e7c2e61ee63941fdb08": { + "balance": "0x3fb26692954bfc00000" }, - "30c26a8e971baa1855d633ba703f028cc7873140": { - "balance": "10000000000000000000000" + "0x30c26a8e971baa1855d633ba703f028cc7873140": { + "balance": "0x21e19e0c9bab2400000" }, - "167e3e3ae2003348459392f7dfce44af7c21ad59": { - "balance": "500000000000000000000" + "0x167e3e3ae2003348459392f7dfce44af7c21ad59": { + "balance": "0x1b1ae4d6e2ef500000" }, - "43f16f1e75c3c06a9478e8c597a40a3cb0bf04cc": { - "balance": "2914000000000000000000" + "0x43f16f1e75c3c06a9478e8c597a40a3cb0bf04cc": { + "balance": "0x9df7dfa8f760480000" }, - "056b1546894f9a85e203fb336db569b16c25e04f": { - "balance": "169397000000000000000" + "0x056b1546894f9a85e203fb336db569b16c25e04f": { + "balance": "0x92edb09ff08d88000" }, - "70616e2892fa269705b2046b8fe3e72fa55816d3": { - "balance": "20000000000000000000000" + "0x70616e2892fa269705b2046b8fe3e72fa55816d3": { + "balance": "0x43c33c1937564800000" }, - "8f4d1d41693e462cf982fd81d0aa701d3a5374c9": { - "balance": "4000000000000000000000" + "0x8f4d1d41693e462cf982fd81d0aa701d3a5374c9": { + "balance": "0xd8d726b7177a800000" }, - "c518799a5925576213e21896e0539abb85b05ae3": { - "balance": "1000000000000000000000" + "0xc518799a5925576213e21896e0539abb85b05ae3": { + "balance": "0x3635c9adc5dea00000" }, - "0e3a28c1dfafb0505bdce19fe025f506a6d01ceb": { - "balance": "2000000000000000000000" + "0x0e3a28c1dfafb0505bdce19fe025f506a6d01ceb": { + "balance": "0x6c6b935b8bbd400000" }, - "e4a47e3933246c3fd62979a1ea19ffdf8c72ef37": { - "balance": "148273000000000000000" + "0xe4a47e3933246c3fd62979a1ea19ffdf8c72ef37": { + "balance": "0x809b383ea7d7e8000" }, - "d231929735132102471ba59007b6644cc0c1de3e": { - "balance": "1000090000000000000000" + "0xd231929735132102471ba59007b6644cc0c1de3e": { + "balance": "0x3637096c4bcc690000" }, - "555d8d3ce1798aca902754f164b8be2a02329c6c": { - "balance": "10000000000000000000000" + "0x555d8d3ce1798aca902754f164b8be2a02329c6c": { + "balance": "0x21e19e0c9bab2400000" }, - "5ab1a5615348001c7c775dc75748669b8be4de14": { - "balance": "690200000000000000000" + "0x5ab1a5615348001c7c775dc75748669b8be4de14": { + "balance": "0x256a72fb29e69c0000" }, - "2fee36a49ee50ecf716f1047915646779f8ba03f": { - "balance": "1056230000000000000000" + "0x2fee36a49ee50ecf716f1047915646779f8ba03f": { + "balance": "0x394222c4da86d70000" }, - "54db5e06b4815d31cb56a8719ba33af2d73e7252": { - "balance": "670000000000000000000" + "0x54db5e06b4815d31cb56a8719ba33af2d73e7252": { + "balance": "0x24521e2a3017b80000" }, - "7c8bb65a6fbb49bd413396a9d7e31053bbb37aa9": { - "balance": "6000000000000000000000" + "0x7c8bb65a6fbb49bd413396a9d7e31053bbb37aa9": { + "balance": "0x14542ba12a337c00000" }, - "c1384c6e717ebe4b23014e51f31c9df7e4e25b31": { - "balance": "500000000000000000000" + "0xc1384c6e717ebe4b23014e51f31c9df7e4e25b31": { + "balance": "0x1b1ae4d6e2ef500000" }, - "474158a1a9dc693c133f65e47b5c3ae2f773a86f": { - "balance": "200200000000000000000" + "0x474158a1a9dc693c133f65e47b5c3ae2f773a86f": { + "balance": "0xada55474b81340000" }, - "2934c0df7bbc172b6c186b0b72547ace8bf75454": { - "balance": "60000000000000000000" + "0x2934c0df7bbc172b6c186b0b72547ace8bf75454": { + "balance": "0x340aad21b3b700000" }, - "6966063aa5de1db5c671f3dd699d5abe213ee902": { - "balance": "8000000000000000000000" + "0x6966063aa5de1db5c671f3dd699d5abe213ee902": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "9225d46a5a80943924a39e5b84b96da0ac450581": { - "balance": "40000000000000000000000" + "0x9225d46a5a80943924a39e5b84b96da0ac450581": { + "balance": "0x878678326eac9000000" }, - "671bbca099ff899bab07ea1cf86965c3054c8960": { - "balance": "50000000000000000000" + "0x671bbca099ff899bab07ea1cf86965c3054c8960": { + "balance": "0x2b5e3af16b1880000" }, - "f1f766b0e46d73fcd4d52e7a72e1b9190cc632b3": { - "balance": "8000000000000000000000" + "0xf1f766b0e46d73fcd4d52e7a72e1b9190cc632b3": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "ef0dc7dd7a53d612728bcbd2b27c19dd4d7d666f": { - "balance": "705668000000000000000" + "0xef0dc7dd7a53d612728bcbd2b27c19dd4d7d666f": { + "balance": "0x26411c5b35f05a0000" }, - "38d2e9154964b41c8d50a7487d391e7ee2c3d3c2": { - "balance": "3500000000000000000000" + "0x38d2e9154964b41c8d50a7487d391e7ee2c3d3c2": { + "balance": "0xbdbc41e0348b300000" }, - "352a785f4a921632504ce5d015f83c49aa838d6d": { - "balance": "4314800000000000000000" + "0x352a785f4a921632504ce5d015f83c49aa838d6d": { + "balance": "0xe9e7e0fb35b7780000" }, - "743de50026ca67c94df54f066260e1d14acc11ac": { - "balance": "2000000000000000000000" + "0x743de50026ca67c94df54f066260e1d14acc11ac": { + "balance": "0x6c6b935b8bbd400000" }, - "b188078444027e386798a8ae68698919d5cc230d": { - "balance": "267400000000000000000" + "0xb188078444027e386798a8ae68698919d5cc230d": { + "balance": "0xe7eeba3410b740000" }, - "53608105ce4b9e11f86bf497ffca3b78967b5f96": { - "balance": "20000000000000000000000" + "0x53608105ce4b9e11f86bf497ffca3b78967b5f96": { + "balance": "0x43c33c1937564800000" }, - "3b159099075207c6807663b1f0f7eda54ac8cce3": { - "balance": "1969543000000000000000" + "0x3b159099075207c6807663b1f0f7eda54ac8cce3": { + "balance": "0x6ac4e65b69f92d8000" }, - "141a5e39ee2f680a600fbf6fa297de90f3225cdd": { - "balance": "10000000000000000000000" + "0x141a5e39ee2f680a600fbf6fa297de90f3225cdd": { + "balance": "0x21e19e0c9bab2400000" }, - "44fff37be01a3888d3b8b8e18880a7ddefeeead3": { - "balance": "259145000000000000000" + "0x44fff37be01a3888d3b8b8e18880a7ddefeeead3": { + "balance": "0xe0c5bfc7dae9a8000" }, - "c5a629a3962552cb8eded889636aafbd0c18ce65": { - "balance": "10000000000000000000000" + "0xc5a629a3962552cb8eded889636aafbd0c18ce65": { + "balance": "0x21e19e0c9bab2400000" }, - "fdba5359f7ec3bc770ac49975d844ec9716256f1": { - "balance": "1000000000000000000000" + "0xfdba5359f7ec3bc770ac49975d844ec9716256f1": { + "balance": "0x3635c9adc5dea00000" }, - "7c1df24a4f7fb2c7b472e0bb006cb27dcd164156": { - "balance": "1000000000000000000000" + "0x7c1df24a4f7fb2c7b472e0bb006cb27dcd164156": { + "balance": "0x3635c9adc5dea00000" }, - "ab7d54c7c6570efca5b4b8ce70f52a5773e5d53b": { - "balance": "279600000000000000000" + "0xab7d54c7c6570efca5b4b8ce70f52a5773e5d53b": { + "balance": "0xf283abe9d9f380000" }, - "3f173aa6edf469d185e59bd26ae4236b92b4d8e1": { - "balance": "320000000000000000000" + "0x3f173aa6edf469d185e59bd26ae4236b92b4d8e1": { + "balance": "0x1158e460913d000000" }, - "a3f4ad14e0bb44e2ce2c14359c75b8e732d37054": { - "balance": "200000000000000000000" + "0xa3f4ad14e0bb44e2ce2c14359c75b8e732d37054": { + "balance": "0xad78ebc5ac6200000" }, - "ac5f627231480d0d95302e6d89fc32cb1d4fe7e3": { - "balance": "200000000000000000000" + "0xac5f627231480d0d95302e6d89fc32cb1d4fe7e3": { + "balance": "0xad78ebc5ac6200000" }, - "d0775dba2af4c30a3a78365939cd71c2f9de95d2": { - "balance": "1940000000000000000000" + "0xd0775dba2af4c30a3a78365939cd71c2f9de95d2": { + "balance": "0x692ae8897081d00000" }, - "ad94235fc3b3f47a2413af31e884914908ef0c45": { - "balance": "500008000000000000000" + "0xad94235fc3b3f47a2413af31e884914908ef0c45": { + "balance": "0x1b1b0142d815840000" }, - "eaedcc6b8b6962d5d9288c156c579d47c0a9fcff": { - "balance": "85000000000000000000" + "0xeaedcc6b8b6962d5d9288c156c579d47c0a9fcff": { + "balance": "0x49b9ca9a694340000" }, - "7ac48d40c664cc9a6d89f1c5f5c80a1c70e744e6": { - "balance": "3008000000000000000000" + "0x7ac48d40c664cc9a6d89f1c5f5c80a1c70e744e6": { + "balance": "0xa31062beeed7000000" }, - "ec73114c5e406fdbbe09b4fa621bd70ed54ea1ef": { - "balance": "24500000000000000000000" + "0xec73114c5e406fdbbe09b4fa621bd70ed54ea1ef": { + "balance": "0x53025cd216fce500000" }, - "a690f1a4b20ab7ba34628620de9ca040c43c1963": { - "balance": "4000000000000000000000" + "0xa690f1a4b20ab7ba34628620de9ca040c43c1963": { + "balance": "0xd8d726b7177a800000" }, - "cad14f9ebba76680eb836b079c7f7baaf481ed6d": { - "balance": "238600000000000000000" + "0xcad14f9ebba76680eb836b079c7f7baaf481ed6d": { + "balance": "0xcef3d7bd7d0340000" }, - "6c714a58fff6e97d14b8a5e305eb244065688bbd": { - "balance": "4000000000000000000000" + "0x6c714a58fff6e97d14b8a5e305eb244065688bbd": { + "balance": "0xd8d726b7177a800000" }, - "3e618350fa01657ab0ef3ebac8e37012f8fc2b6f": { - "balance": "2804400000000000000000" + "0x3e618350fa01657ab0ef3ebac8e37012f8fc2b6f": { + "balance": "0x9806de3da6e9780000" }, - "c946d5acc1346eba0a7279a0ac1d465c996d827e": { - "balance": "16385128000000000000000" + "0xc946d5acc1346eba0a7279a0ac1d465c996d827e": { + "balance": "0x3783d545fdf0aa40000" }, - "1164caaa8cc5977afe1fad8a7d6028ce2d57299b": { - "balance": "400000000000000000000" + "0x1164caaa8cc5977afe1fad8a7d6028ce2d57299b": { + "balance": "0x15af1d78b58c400000" }, - "7917e5bd82a9790fd650d043cdd930f7799633db": { - "balance": "3999800000000000000000" + "0x7917e5bd82a9790fd650d043cdd930f7799633db": { + "balance": "0xd8d4602c26bf6c0000" }, - "d52aecc6493938a28ca1c367b701c21598b6a02e": { - "balance": "1100000000000000000000" + "0xd52aecc6493938a28ca1c367b701c21598b6a02e": { + "balance": "0x3ba1910bf341b00000" }, - "98bed3a72eccfbafb923489293e429e703c7e25b": { - "balance": "2000000000000000000000" + "0x98bed3a72eccfbafb923489293e429e703c7e25b": { + "balance": "0x6c6b935b8bbd400000" }, - "42db0b902559e04087dd5c441bc7611934184b89": { - "balance": "2014420000000000000000" + "0x42db0b902559e04087dd5c441bc7611934184b89": { + "balance": "0x6d33b17d253a620000" }, - "43bc2d4ddcd6583be2c7bc094b28fb72e62ba83b": { - "balance": "2000000000000000000000" + "0x43bc2d4ddcd6583be2c7bc094b28fb72e62ba83b": { + "balance": "0x6c6b935b8bbd400000" }, - "85f0e7c1e3aff805a627a2aaf2cff6b4c0dbe9cb": { - "balance": "20000000000000000000" + "0x85f0e7c1e3aff805a627a2aaf2cff6b4c0dbe9cb": { + "balance": "0x1158e460913d00000" }, - "581b9fd6eae372f3501f42eb9619eec820b78a84": { - "balance": "19699015000000000000000" + "0x581b9fd6eae372f3501f42eb9619eec820b78a84": { + "balance": "0x42be2c00ca53b8d8000" }, - "541db20a80cf3b17f1621f1b3ff79b882f50def3": { - "balance": "1000000000000000000000" + "0x541db20a80cf3b17f1621f1b3ff79b882f50def3": { + "balance": "0x3635c9adc5dea00000" }, - "4e8a6d63489ccc10a57f885f96eb04ecbb546024": { - "balance": "18500000000000000000000" + "0x4e8a6d63489ccc10a57f885f96eb04ecbb546024": { + "balance": "0x3eae3130ecc96900000" }, - "28349f7ef974ea55fe36a1583b34cec3c45065f0": { - "balance": "234490000000000000000" + "0x28349f7ef974ea55fe36a1583b34cec3c45065f0": { + "balance": "0xcb633d49e65590000" }, - "a3241d890a92baf52908dc4aa049726be426ebd3": { - "balance": "19999560000000000000000" + "0xa3241d890a92baf52908dc4aa049726be426ebd3": { + "balance": "0x43c2da661ca2f540000" }, - "b4b11d109f608fa8edd3fea9f8c315649aeb3d11": { - "balance": "5000000000000000000000" + "0xb4b11d109f608fa8edd3fea9f8c315649aeb3d11": { + "balance": "0x10f0cf064dd59200000" }, - "5f321b3daaa296cadf29439f9dab062a4bffedd6": { - "balance": "81868000000000000000" + "0x5f321b3daaa296cadf29439f9dab062a4bffedd6": { + "balance": "0x47025903ea7ae0000" }, - "c5ae86b0c6c7e3900f1368105c56537faf8d743e": { - "balance": "188000000000000000000" + "0xc5ae86b0c6c7e3900f1368105c56537faf8d743e": { + "balance": "0xa31062beeed700000" }, - "9a8eca4189ff4aa8ff7ed4b6b7039f0902219b15": { - "balance": "20000000000000000000" + "0x9a8eca4189ff4aa8ff7ed4b6b7039f0902219b15": { + "balance": "0x1158e460913d00000" }, - "a3facc50195c0b4933c85897fecc5bbd995c34b8": { - "balance": "20000000000000000000" + "0xa3facc50195c0b4933c85897fecc5bbd995c34b8": { + "balance": "0x1158e460913d00000" }, - "f07bd0e5c2ce69c7c4a724bd26bbfa9d2a17ca03": { - "balance": "5910000000000000000000" + "0xf07bd0e5c2ce69c7c4a724bd26bbfa9d2a17ca03": { + "balance": "0x14061b9d77a5e980000" }, - "640aba6de984d94517377803705eaea7095f4a11": { - "balance": "10000000000000000000000" + "0x640aba6de984d94517377803705eaea7095f4a11": { + "balance": "0x21e19e0c9bab2400000" }, - "204ac98867a7c9c7ed711cb82f28a878caf69b48": { - "balance": "6000000000000000000000" + "0x204ac98867a7c9c7ed711cb82f28a878caf69b48": { + "balance": "0x14542ba12a337c00000" }, - "9d34dac25bd15828faefaaf28f710753b39e89dc": { - "balance": "1090400000000000000000" + "0x9d34dac25bd15828faefaaf28f710753b39e89dc": { + "balance": "0x3b1c56fed02df00000" }, - "fe418b421a9c6d373602790475d2303e11a75930": { - "balance": "1015200000000000000000" + "0xfe418b421a9c6d373602790475d2303e11a75930": { + "balance": "0x3708baed3d68900000" }, - "3f472963197883bbda5a9b7dfcb22db11440ad31": { - "balance": "481445000000000000000" + "0x3f472963197883bbda5a9b7dfcb22db11440ad31": { + "balance": "0x1a19643cb1eff08000" }, - "1578bdbc371b4d243845330556fff2d5ef4dff67": { - "balance": "100000000000000000000" + "0x1578bdbc371b4d243845330556fff2d5ef4dff67": { + "balance": "0x56bc75e2d63100000" }, - "dba4796d0ceb4d3a836b84c96f910afc103f5ba0": { - "balance": "166666000000000000000" + "0xdba4796d0ceb4d3a836b84c96f910afc103f5ba0": { + "balance": "0x908f493f737410000" }, - "466fda6b9b58c5532750306a10a2a8c768103b07": { - "balance": "199955000000000000000" + "0x466fda6b9b58c5532750306a10a2a8c768103b07": { + "balance": "0xad6eedd17cf3b8000" }, - "2770f14efb165ddeba79c10bb0af31c31e59334c": { - "balance": "3000000000000000000000" + "0x2770f14efb165ddeba79c10bb0af31c31e59334c": { + "balance": "0xa2a15d09519be00000" }, - "7c382c0296612e4e97e440e02d3871273b55f53b": { - "balance": "197600000000000000000" + "0x7c382c0296612e4e97e440e02d3871273b55f53b": { + "balance": "0xab640391201300000" }, - "1fb7bd310d95f2a6d9baaf8a8a430a9a04453a8b": { - "balance": "3000000000000000000000" + "0x1fb7bd310d95f2a6d9baaf8a8a430a9a04453a8b": { + "balance": "0xa2a15d09519be00000" }, - "a9acf600081bb55bb6bfbab1815ffc4e17e85a95": { - "balance": "200000000000000000000" + "0xa9acf600081bb55bb6bfbab1815ffc4e17e85a95": { + "balance": "0xad78ebc5ac6200000" }, - "f93d5bcb0644b0cce5fcdda343f5168ffab2877d": { - "balance": "209978000000000000000" + "0xf93d5bcb0644b0cce5fcdda343f5168ffab2877d": { + "balance": "0xb6207b67d26f90000" }, - "db0cc78f74d9827bdc8a6473276eb84fdc976212": { - "balance": "2000000000000000000000" + "0xdb0cc78f74d9827bdc8a6473276eb84fdc976212": { + "balance": "0x6c6b935b8bbd400000" }, - "b66411e3a02dedb726fa79107dc90bc1cae64d48": { - "balance": "2000000000000000000000" + "0xb66411e3a02dedb726fa79107dc90bc1cae64d48": { + "balance": "0x6c6b935b8bbd400000" }, - "4d6e8fe109ccd2158e4db114132fe75fecc8be5b": { - "balance": "25019000000000000000" + "0x4d6e8fe109ccd2158e4db114132fe75fecc8be5b": { + "balance": "0x15b3557f1937f8000" }, - "6fd947d5a73b175008ae6ee8228163da289b167d": { - "balance": "30000000000000000000000" + "0x6fd947d5a73b175008ae6ee8228163da289b167d": { + "balance": "0x65a4da25d3016c00000" }, - "32d950d5e93ea1d5b48db4714f867b0320b31c0f": { - "balance": "1015200000000000000000" + "0x32d950d5e93ea1d5b48db4714f867b0320b31c0f": { + "balance": "0x3708baed3d68900000" }, - "9c99b62606281b5cefabf36156c8fe62839ef5f3": { - "balance": "4000000000000000000000" + "0x9c99b62606281b5cefabf36156c8fe62839ef5f3": { + "balance": "0xd8d726b7177a800000" }, - "86c8d0d982b539f48f9830f9891f9d607a942659": { - "balance": "13260000000000000000000" + "0x86c8d0d982b539f48f9830f9891f9d607a942659": { + "balance": "0x2ced37761824fb00000" }, - "f2127d54188fedef0f338a5f38c7ff73ad9f6f42": { - "balance": "20000000000000000000000" + "0xf2127d54188fedef0f338a5f38c7ff73ad9f6f42": { + "balance": "0x43c33c1937564800000" }, - "e864fec07ed1214a65311e11e329de040d04f0fd": { - "balance": "1656353000000000000000" + "0xe864fec07ed1214a65311e11e329de040d04f0fd": { + "balance": "0x59ca83f5c404968000" }, - "1d09ad2412691cc581c1ab36b6f9434cd4f08b54": { - "balance": "7000000000000000000000" + "0x1d09ad2412691cc581c1ab36b6f9434cd4f08b54": { + "balance": "0x17b7883c06916600000" }, - "4ea70f04313fae65c3ff224a055c3d2dab28dddf": { - "balance": "19999800000000000000000" + "0x4ea70f04313fae65c3ff224a055c3d2dab28dddf": { + "balance": "0x43c30fb0884a96c0000" }, - "e0668fa82c14d6e8d93a53113ef2862fa81581bc": { - "balance": "870400000000000000000" + "0xe0668fa82c14d6e8d93a53113ef2862fa81581bc": { + "balance": "0x2f2f39fc6c54000000" }, - "f0d858105e1b648101ac3f85a0f8222bf4f81d6a": { - "balance": "600000000000000000000" + "0xf0d858105e1b648101ac3f85a0f8222bf4f81d6a": { + "balance": "0x2086ac351052600000" }, - "0f3a1023cac04dbf44f5a5fa6a9cf8508cd4fddf": { - "balance": "1820000000000000000000" + "0x0f3a1023cac04dbf44f5a5fa6a9cf8508cd4fddf": { + "balance": "0x62a992e53a0af00000" }, - "5793abe6f1533311fd51536891783b3f9625ef1c": { - "balance": "827268000000000000000" + "0x5793abe6f1533311fd51536891783b3f9625ef1c": { + "balance": "0x2cd8a656f23fda0000" }, - "8d667637e29eca05b6bfbef1f96d460eefbf9984": { - "balance": "4000000000000000000000" + "0x8d667637e29eca05b6bfbef1f96d460eefbf9984": { + "balance": "0xd8d726b7177a800000" }, - "d76dbaebc30d4ef67b03e6e6ecc6d84e004d502d": { - "balance": "2019250000000000000000" + "0xd76dbaebc30d4ef67b03e6e6ecc6d84e004d502d": { + "balance": "0x6d76b9188e13850000" }, - "42d1a6399b3016a8597f8b640927b8afbce4b215": { - "balance": "2980000000000000000000" + "0x42d1a6399b3016a8597f8b640927b8afbce4b215": { + "balance": "0xa18bcec34888100000" }, - "21fd47c5256012198fa5abf131c06d6aa1965f75": { - "balance": "7880000000000000000000" + "0x21fd47c5256012198fa5abf131c06d6aa1965f75": { + "balance": "0x1ab2cf7c9f87e200000" }, - "2f2bba1b1796821a766fce64b84f28ec68f15aea": { - "balance": "20000000000000000000" + "0x2f2bba1b1796821a766fce64b84f28ec68f15aea": { + "balance": "0x1158e460913d00000" }, - "d24bf12d2ddf457decb17874efde2052b65cbb49": { - "balance": "14000000000000000000000" + "0xd24bf12d2ddf457decb17874efde2052b65cbb49": { + "balance": "0x2f6f10780d22cc00000" }, - "88de13b09931877c910d593165c364c8a1641bd3": { - "balance": "3000000000000000000000" + "0x88de13b09931877c910d593165c364c8a1641bd3": { + "balance": "0xa2a15d09519be00000" }, - "555ca9f05cc134ab54ae9bea1c3ff87aa85198ca": { - "balance": "100000000000000000000" + "0x555ca9f05cc134ab54ae9bea1c3ff87aa85198ca": { + "balance": "0x56bc75e2d63100000" }, - "ae9ecd6bdd952ef497c0050ae0ab8a82a91898ce": { - "balance": "30000000000000000000" + "0xae9ecd6bdd952ef497c0050ae0ab8a82a91898ce": { + "balance": "0x1a055690d9db80000" }, - "ad8bfef8c68a4816b3916f35cb7bfcd7d3040976": { - "balance": "40000000000000000000000" + "0xad8bfef8c68a4816b3916f35cb7bfcd7d3040976": { + "balance": "0x878678326eac9000000" }, - "dad136b88178b4837a6c780feba226b98569a94c": { - "balance": "200000000000000000000" + "0xdad136b88178b4837a6c780feba226b98569a94c": { + "balance": "0xad78ebc5ac6200000" }, - "800e7d631c6e573a90332f17f71f5fd19b528cb9": { - "balance": "152000000000000000000" + "0x800e7d631c6e573a90332f17f71f5fd19b528cb9": { + "balance": "0x83d6c7aab63600000" }, - "94a9a71691317c2064271b51c9353fbded3501a8": { - "balance": "3340000000000000000000" + "0x94a9a71691317c2064271b51c9353fbded3501a8": { + "balance": "0xb50fcfafebecb00000" }, - "80a0f6cc186cf6201400736e065a391f52a9df4a": { - "balance": "10000000000000000000000" + "0x80a0f6cc186cf6201400736e065a391f52a9df4a": { + "balance": "0x21e19e0c9bab2400000" }, - "712ff7370a13ed360973fedc9ff5d2c93a505e9e": { - "balance": "3940000000000000000000" + "0x712ff7370a13ed360973fedc9ff5d2c93a505e9e": { + "balance": "0xd5967be4fc3f100000" }, - "42399659aca6a5a863ea2245c933fe9a35b7880e": { - "balance": "2044000000000000000000" + "0x42399659aca6a5a863ea2245c933fe9a35b7880e": { + "balance": "0x6ece32c26c82700000" }, - "ae239acffd4ebe2e1ba5b4170572dc79cc6533ec": { - "balance": "12000000000000000000000" + "0xae239acffd4ebe2e1ba5b4170572dc79cc6533ec": { + "balance": "0x28a857425466f800000" }, - "007b9fc31905b4994b04c9e2cfdc5e2770503f42": { - "balance": "1999000000000000000000" + "0x007b9fc31905b4994b04c9e2cfdc5e2770503f42": { + "balance": "0x6c5db2a4d815dc0000" }, - "7480de62254f2ba82b578219c07ba5be430dc3cb": { - "balance": "7040000000000000000000" + "0x7480de62254f2ba82b578219c07ba5be430dc3cb": { + "balance": "0x17da3a04c7b3e000000" }, - "917b8f9f3a8d09e9202c52c29e724196b897d35e": { - "balance": "161000000000000000000" + "0x917b8f9f3a8d09e9202c52c29e724196b897d35e": { + "balance": "0x8ba52e6fc45e40000" }, - "708ea707bae4357f1ebea959c3a250acd6aa21b3": { - "balance": "500000000000000000000" + "0x708ea707bae4357f1ebea959c3a250acd6aa21b3": { + "balance": "0x1b1ae4d6e2ef500000" }, - "6dc7053a718616cfc78bee6382ee51add0c70330": { - "balance": "2000000000000000000000" + "0x6dc7053a718616cfc78bee6382ee51add0c70330": { + "balance": "0x6c6b935b8bbd400000" }, - "c4dac5a8a0264fbc1055391c509cc3ee21a6e04c": { - "balance": "6501000000000000000000" + "0xc4dac5a8a0264fbc1055391c509cc3ee21a6e04c": { + "balance": "0x1606b7fa039ce740000" }, - "c1b2a0fb9cad45cd699192cd27540b88d3384279": { - "balance": "500000000000000000000" + "0xc1b2a0fb9cad45cd699192cd27540b88d3384279": { + "balance": "0x1b1ae4d6e2ef500000" }, - "b07cb9c12405b711807543c4934465f87f98bd2d": { - "balance": "2000000000000000000000" + "0xb07cb9c12405b711807543c4934465f87f98bd2d": { + "balance": "0x6c6b935b8bbd400000" }, - "c7f72bb758016b374714d4899bce22b4aec70a31": { - "balance": "1072706000000000000000" + "0xc7f72bb758016b374714d4899bce22b4aec70a31": { + "balance": "0x3a26c9478f5e2d0000" }, - "0c480de9f7461002908b49f60fc61e2b62d3140b": { - "balance": "10000000000000000000000" + "0x0c480de9f7461002908b49f60fc61e2b62d3140b": { + "balance": "0x21e19e0c9bab2400000" }, - "83d532d38d6dee3f60adc68b936133c7a2a1b0dd": { - "balance": "500000000000000000000" + "0x83d532d38d6dee3f60adc68b936133c7a2a1b0dd": { + "balance": "0x1b1ae4d6e2ef500000" }, - "12afbcba1427a6a39e7ba4849f7ab1c4358ac31b": { - "balance": "20000000000000000000000" + "0x12afbcba1427a6a39e7ba4849f7ab1c4358ac31b": { + "balance": "0x43c33c1937564800000" }, - "f8f6645e0dee644b3dad81d571ef9baf840021ad": { - "balance": "2000000000000000000000" + "0xf8f6645e0dee644b3dad81d571ef9baf840021ad": { + "balance": "0x6c6b935b8bbd400000" }, - "40cf890591eae4a18f812a2954cb295f633327e6": { - "balance": "48132000000000000000" + "0x40cf890591eae4a18f812a2954cb295f633327e6": { + "balance": "0x29bf736fc591a0000" }, - "735b97f2fc1bd24b12076efaf3d1288073d20c8c": { - "balance": "20000000000000000000" + "0x735b97f2fc1bd24b12076efaf3d1288073d20c8c": { + "balance": "0x1158e460913d00000" }, - "47c7e5efb48b3aed4b7c6e824b435f357df4c723": { - "balance": "18200000000000000000" + "0x47c7e5efb48b3aed4b7c6e824b435f357df4c723": { + "balance": "0xfc936392801c0000" }, - "d34d708d7398024533a5a2b2309b19d3c55171bb": { - "balance": "400000000000000000000" + "0xd34d708d7398024533a5a2b2309b19d3c55171bb": { + "balance": "0x15af1d78b58c400000" }, - "64370e87202645125a35b207af1231fb6072f9a7": { - "balance": "200000000000000000000" + "0x64370e87202645125a35b207af1231fb6072f9a7": { + "balance": "0xad78ebc5ac6200000" }, - "b055af4cadfcfdb425cf65ba6431078f07ecd5ab": { - "balance": "100000000000000000000" + "0xb055af4cadfcfdb425cf65ba6431078f07ecd5ab": { + "balance": "0x56bc75e2d63100000" }, - "c7de5e8eafb5f62b1a0af2195cf793c7894c9268": { - "balance": "1000000000000000000000" + "0xc7de5e8eafb5f62b1a0af2195cf793c7894c9268": { + "balance": "0x3635c9adc5dea00000" }, - "c63cd7882118b8a91e074d4c8f4ba91851303b9a": { - "balance": "260000000000000000000" + "0xc63cd7882118b8a91e074d4c8f4ba91851303b9a": { + "balance": "0xe18398e7601900000" }, - "164d7aac3eecbaeca1ad5191b753f173fe12ec33": { - "balance": "744090000000000000000" + "0x164d7aac3eecbaeca1ad5191b753f173fe12ec33": { + "balance": "0x285652b8a468690000" }, - "e4fb26d1ca1eecba3d8298d9d148119ac2bbf580": { - "balance": "400000000000000000000" + "0xe4fb26d1ca1eecba3d8298d9d148119ac2bbf580": { + "balance": "0x15af1d78b58c400000" }, - "613ac53be565d46536b820715b9b8d3ae68a4b95": { - "balance": "3760000000000000000000" + "0x613ac53be565d46536b820715b9b8d3ae68a4b95": { + "balance": "0xcbd47b6eaa8cc00000" }, - "7f616c6f008adfa082f34da7d0650460368075fb": { - "balance": "1000000000000000000000" + "0x7f616c6f008adfa082f34da7d0650460368075fb": { + "balance": "0x3635c9adc5dea00000" }, - "9af100cc3dae83a33402051ce4496b16615483f6": { - "balance": "2000000000000000000000" + "0x9af100cc3dae83a33402051ce4496b16615483f6": { + "balance": "0x6c6b935b8bbd400000" }, - "b45cca0d36826662683cf7d0b2fdac687f02d0c4": { - "balance": "1000000000000000000000" + "0xb45cca0d36826662683cf7d0b2fdac687f02d0c4": { + "balance": "0x3635c9adc5dea00000" }, - "93a6b3ab423010f981a7489d4aad25e2625c5741": { - "balance": "20190033000000000000000" + "0x93a6b3ab423010f981a7489d4aad25e2625c5741": { + "balance": "0x44680fe6a1ede4e8000" }, - "ee049af005974dd1c7b3a9ca8d9aa77175ba53aa": { - "balance": "333333000000000000000" + "0xee049af005974dd1c7b3a9ca8d9aa77175ba53aa": { + "balance": "0x1211ecb56d13488000" }, - "687927e3048bb5162ae7c15cf76bd124f9497b9e": { - "balance": "2000000000000000000000" + "0x687927e3048bb5162ae7c15cf76bd124f9497b9e": { + "balance": "0x6c6b935b8bbd400000" }, - "1aa40270d21e5cde86b6316d1ac3c533494b79ed": { - "balance": "20000000000000000000" + "0x1aa40270d21e5cde86b6316d1ac3c533494b79ed": { + "balance": "0x1158e460913d00000" }, - "426259b0a756701a8b663528522156c0288f0f24": { - "balance": "9900000000000000000000" + "0x426259b0a756701a8b663528522156c0288f0f24": { + "balance": "0x218ae196b8d4f300000" }, - "91c75e3cb4aa89f34619a164e2a47898f5674d9c": { - "balance": "2000000000000000000000" + "0x91c75e3cb4aa89f34619a164e2a47898f5674d9c": { + "balance": "0x6c6b935b8bbd400000" }, - "437983388ab59a4ffc215f8e8269461029c3f1c1": { - "balance": "20000000000000000000000" + "0x437983388ab59a4ffc215f8e8269461029c3f1c1": { + "balance": "0x43c33c1937564800000" }, - "272a131a5a656a7a3aca35c8bd202222a7592258": { - "balance": "2674000000000000000000" + "0x272a131a5a656a7a3aca35c8bd202222a7592258": { + "balance": "0x90f534608a72880000" }, - "bc0ca4f217e052753614d6b019948824d0d8688b": { - "balance": "400000000000000000000" + "0xbc0ca4f217e052753614d6b019948824d0d8688b": { + "balance": "0x15af1d78b58c400000" }, - "cc6c03bd603e09de54e9c4d5ac6d41cbce715724": { - "balance": "98500000000000000000" + "0xcc6c03bd603e09de54e9c4d5ac6d41cbce715724": { + "balance": "0x556f64c1fe7fa0000" }, - "d79aff13ba2da75d46240cac0a2467c656949823": { - "balance": "1730000000000000000000" + "0xd79aff13ba2da75d46240cac0a2467c656949823": { + "balance": "0x5dc892aa1131c80000" }, - "477b24eee8839e4fd19d1250bd0b6645794a61ca": { - "balance": "8000000000000000000000" + "0x477b24eee8839e4fd19d1250bd0b6645794a61ca": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "79fd6d48315066c204f9651869c1096c14fc9781": { - "balance": "2000000000000000000000" + "0x79fd6d48315066c204f9651869c1096c14fc9781": { + "balance": "0x6c6b935b8bbd400000" }, - "1463a873555bc0397e575c2471cf77fa9db146e0": { - "balance": "10000000000000000000000" + "0x1463a873555bc0397e575c2471cf77fa9db146e0": { + "balance": "0x21e19e0c9bab2400000" }, - "89ab13ee266d779c35e8bb04cd8a90cc2103a95b": { - "balance": "60000000000000000000000" + "0x89ab13ee266d779c35e8bb04cd8a90cc2103a95b": { + "balance": "0xcb49b44ba602d800000" }, - "90acced7e48c08c6b934646dfa0adf29dc94074f": { - "balance": "56154000000000000000" + "0x90acced7e48c08c6b934646dfa0adf29dc94074f": { + "balance": "0x30b4b157bbd490000" }, - "31ea6eab19d00764e9a95e183f2b1b22fc7dc40f": { - "balance": "20000000000000000000" + "0x31ea6eab19d00764e9a95e183f2b1b22fc7dc40f": { + "balance": "0x1158e460913d00000" }, - "87a53ea39f59a35bada8352521645594a1a714cb": { - "balance": "1910000000000000000000" + "0x87a53ea39f59a35bada8352521645594a1a714cb": { + "balance": "0x678a932062e4180000" }, - "1e1aed85b86c6562cb8fa1eb6f8f3bc9dcae6e79": { - "balance": "4516200000000000000000" + "0x1e1aed85b86c6562cb8fa1eb6f8f3bc9dcae6e79": { + "balance": "0xf4d2dd84259b240000" }, - "e36a8ea87f1e99e8a2dc1b2608d166667c9dfa01": { - "balance": "100000000000000000000" + "0xe36a8ea87f1e99e8a2dc1b2608d166667c9dfa01": { + "balance": "0x56bc75e2d63100000" }, - "ec2cb8b9378dff31aec3c22e0e6dadff314ab5dd": { - "balance": "2000000000000000000000" + "0xec2cb8b9378dff31aec3c22e0e6dadff314ab5dd": { + "balance": "0x6c6b935b8bbd400000" }, - "3cadeb3d3eed3f62311d52553e70df4afce56f23": { - "balance": "4000000000000000000000" + "0x3cadeb3d3eed3f62311d52553e70df4afce56f23": { + "balance": "0xd8d726b7177a800000" }, - "3ceca96bb1cdc214029cbc5e181d398ab94d3d41": { - "balance": "80000000000000000000000" + "0x3ceca96bb1cdc214029cbc5e181d398ab94d3d41": { + "balance": "0x10f0cf064dd592000000" }, - "3283eb7f9137dd39bed55ffe6b8dc845f3e1a079": { - "balance": "66224000000000000000" + "0x3283eb7f9137dd39bed55ffe6b8dc845f3e1a079": { + "balance": "0x3970ae92155780000" }, - "0954a8cb5d321fc3351a7523a617d0f58da676a7": { - "balance": "2506000000000000000000" + "0x0954a8cb5d321fc3351a7523a617d0f58da676a7": { + "balance": "0x87d9bc7aa498e80000" }, - "de33d708a3b89e909eaf653b30fdc3a5d5ccb4b3": { - "balance": "177300000000000000000" + "0xde33d708a3b89e909eaf653b30fdc3a5d5ccb4b3": { + "balance": "0x99c88229fd4c20000" }, - "1c6702b3b05a5114bdbcaeca25531aeeb34835f4": { - "balance": "26071500000000000000000" + "0x1c6702b3b05a5114bdbcaeca25531aeeb34835f4": { + "balance": "0x58556bead45dcae0000" }, - "e5b96fc9ac03d448c1613ac91d15978145dbdfd1": { - "balance": "200000000000000000000" + "0xe5b96fc9ac03d448c1613ac91d15978145dbdfd1": { + "balance": "0xad78ebc5ac6200000" }, - "fbf204c813f836d83962c7870c7808ca347fd33e": { - "balance": "20000000000000000000" + "0xfbf204c813f836d83962c7870c7808ca347fd33e": { + "balance": "0x1158e460913d00000" }, - "3b13631a1b89cb566548899a1d60915cdcc4205b": { - "balance": "2000000000000000000000" + "0x3b13631a1b89cb566548899a1d60915cdcc4205b": { + "balance": "0x6c6b935b8bbd400000" }, - "a87f7abd6fa31194289678efb63cf584ee5e2a61": { - "balance": "4000000000000000000000" + "0xa87f7abd6fa31194289678efb63cf584ee5e2a61": { + "balance": "0xd8d726b7177a800000" }, - "c0a39308a80e9e84aaaf16ac01e3b01d74bd6b2d": { - "balance": "136499000000000000000" + "0xc0a39308a80e9e84aaaf16ac01e3b01d74bd6b2d": { + "balance": "0x7664ddd4c1c0b8000" }, - "ffd6da958eecbc016bab91058440d39b41c7be83": { - "balance": "20000000000000000000000" + "0xffd6da958eecbc016bab91058440d39b41c7be83": { + "balance": "0x43c33c1937564800000" }, - "0e3dd7d4e429fe3930a6414035f52bdc599d784d": { - "balance": "40110000000000000000" + "0x0e3dd7d4e429fe3930a6414035f52bdc599d784d": { + "balance": "0x22ca3587cf4eb0000" }, - "e0663e8cd66792a641f56e5003660147880f018e": { - "balance": "2000000000000000000000" + "0xe0663e8cd66792a641f56e5003660147880f018e": { + "balance": "0x6c6b935b8bbd400000" }, - "5b78eca27fbdea6f26befba8972b295e7814364b": { - "balance": "2000000000000000000000" + "0x5b78eca27fbdea6f26befba8972b295e7814364b": { + "balance": "0x6c6b935b8bbd400000" }, - "ec9851bd917270610267d60518b54d3ca2b35b17": { - "balance": "40000000000000000000000" + "0xec9851bd917270610267d60518b54d3ca2b35b17": { + "balance": "0x878678326eac9000000" }, - "bc9c95dfab97a574cea2aa803b5caa197cef0cff": { - "balance": "420000000000000000000" + "0xbc9c95dfab97a574cea2aa803b5caa197cef0cff": { + "balance": "0x16c4abbebea0100000" }, - "100b4d0977fcbad4debd5e64a0497aeae5168fab": { - "balance": "314500000000000000000" + "0x100b4d0977fcbad4debd5e64a0497aeae5168fab": { + "balance": "0x110c9073b5245a0000" }, - "1b6610fb68bad6ed1cfaa0bbe33a24eb2e96fafb": { - "balance": "152000000000000000000" + "0x1b6610fb68bad6ed1cfaa0bbe33a24eb2e96fafb": { + "balance": "0x83d6c7aab63600000" }, - "b4524c95a7860e21840296a616244019421c4aba": { - "balance": "8000000000000000000000" + "0xb4524c95a7860e21840296a616244019421c4aba": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "88975a5f1ef2528c300b83c0c607b8e87dd69315": { - "balance": "83500000000000000000" + "0x88975a5f1ef2528c300b83c0c607b8e87dd69315": { + "balance": "0x486cb9799191e0000" }, - "853e6abaf44469c72f151d4e223819aced4e3728": { - "balance": "2000000000000000000000" + "0x853e6abaf44469c72f151d4e223819aced4e3728": { + "balance": "0x6c6b935b8bbd400000" }, - "d604abce4330842e3d396ca73ddb5519ed3ec03f": { - "balance": "163940000000000000000" + "0xd604abce4330842e3d396ca73ddb5519ed3ec03f": { + "balance": "0x8e31fe1689d8a0000" }, - "d209482bb549abc4777bea6d7f650062c9c57a1c": { - "balance": "320880000000000000000" + "0xd209482bb549abc4777bea6d7f650062c9c57a1c": { + "balance": "0x11651ac3e7a7580000" }, - "590acbda37290c0d3ec84fc2000d7697f9a4b15d": { - "balance": "500000000000000000000" + "0x590acbda37290c0d3ec84fc2000d7697f9a4b15d": { + "balance": "0x1b1ae4d6e2ef500000" }, - "571950ea2c90c1427d939d61b4f2de4cf1cfbfb0": { - "balance": "20000000000000000000" + "0x571950ea2c90c1427d939d61b4f2de4cf1cfbfb0": { + "balance": "0x1158e460913d00000" }, - "cb94e76febe208116733e76e805d48d112ec9fca": { - "balance": "1000000000000000000000" + "0xcb94e76febe208116733e76e805d48d112ec9fca": { + "balance": "0x3635c9adc5dea00000" }, - "fa8e3b1f13433900737daaf1f6299c4887f85b5f": { - "balance": "715000000000000000000" + "0xfa8e3b1f13433900737daaf1f6299c4887f85b5f": { + "balance": "0x26c29e47c4844c0000" }, - "162d76c2e6514a3afb6fe3d3cb93a35c5ae783f1": { - "balance": "2000000000000000000000" + "0x162d76c2e6514a3afb6fe3d3cb93a35c5ae783f1": { + "balance": "0x6c6b935b8bbd400000" }, - "4bea288eea42c4955eb9faad2a9faf4783cbddac": { - "balance": "28790618000000000000000" + "0x4bea288eea42c4955eb9faad2a9faf4783cbddac": { + "balance": "0x618be1663c4af490000" }, - "c8ab1a3cf46cb8b064df2e222d39607394203277": { - "balance": "2000000000000000000000" + "0xc8ab1a3cf46cb8b064df2e222d39607394203277": { + "balance": "0x6c6b935b8bbd400000" }, - "318b2ea5f0aaa879c4d5e548ac9d92a0c67487b7": { - "balance": "200000000000000000000" + "0x318b2ea5f0aaa879c4d5e548ac9d92a0c67487b7": { + "balance": "0xad78ebc5ac6200000" }, - "53c5fe0119e1e848640cee30adea96940f2a5d8b": { - "balance": "21746000000000000000000" + "0x53c5fe0119e1e848640cee30adea96940f2a5d8b": { + "balance": "0x49ada5fa8c10c880000" }, - "0701f9f147ec486856f5e1b71de9f117e99e2105": { - "balance": "173360000000000000000" + "0x0701f9f147ec486856f5e1b71de9f117e99e2105": { + "balance": "0x965da717fd5b80000" }, - "337cfe1157a5c6912010dd561533791769c2b6a6": { - "balance": "1000000000000000000000" + "0x337cfe1157a5c6912010dd561533791769c2b6a6": { + "balance": "0x3635c9adc5dea00000" }, - "fd60d2b5af3d35f7aaf0c393052e79c4d823d985": { - "balance": "56400000000000000000" + "0xfd60d2b5af3d35f7aaf0c393052e79c4d823d985": { + "balance": "0x30eb50d2e14080000" }, - "0f049a8bdfd761de8ec02cee2829c4005b23c06b": { - "balance": "252000000000000000000" + "0x0f049a8bdfd761de8ec02cee2829c4005b23c06b": { + "balance": "0xda933d8d8c6700000" }, - "924bce7a853c970bb5ec7bb759baeb9c7410857b": { - "balance": "13700000000000000000" + "0x924bce7a853c970bb5ec7bb759baeb9c7410857b": { + "balance": "0xbe202d6a0eda0000" }, - "16abb8b021a710bdc78ea53494b20614ff4eafe8": { - "balance": "158000000000000000000" + "0x16abb8b021a710bdc78ea53494b20614ff4eafe8": { + "balance": "0x890b0c2e14fb80000" }, - "9e7f65a90e8508867bccc914256a1ea574cf07e3": { - "balance": "1240000000000000000000" + "0x9e7f65a90e8508867bccc914256a1ea574cf07e3": { + "balance": "0x433874f632cc600000" }, - "01d03815c61f416b71a2610a2daba59ff6a6de5b": { - "balance": "9553100000000000000000" + "0x01d03815c61f416b71a2610a2daba59ff6a6de5b": { + "balance": "0x205dfe50b81c82e0000" }, - "3df762049eda8ac6927d904c7af42f94e5519601": { - "balance": "2000000000000000000000" + "0x3df762049eda8ac6927d904c7af42f94e5519601": { + "balance": "0x6c6b935b8bbd400000" }, - "5593c9d4b664730fd93ca60151c25c2eaed93c3b": { - "balance": "200000000000000000000" + "0x5593c9d4b664730fd93ca60151c25c2eaed93c3b": { + "balance": "0xad78ebc5ac6200000" }, - "e023f09b2887612c7c9cf1988e3a3a602b3394c9": { - "balance": "2000000000000000000000" + "0xe023f09b2887612c7c9cf1988e3a3a602b3394c9": { + "balance": "0x6c6b935b8bbd400000" }, - "4c13980c32dcf3920b78a4a7903312907c1b123f": { - "balance": "60024000000000000000" + "0x4c13980c32dcf3920b78a4a7903312907c1b123f": { + "balance": "0x3410015faae0c0000" }, - "a282e969cac9f7a0e1c0cd90f5d0c438ac570da3": { - "balance": "627760000000000000000" + "0xa282e969cac9f7a0e1c0cd90f5d0c438ac570da3": { + "balance": "0x2207eb89fc27380000" }, - "3b22da2a0271c8efe102532773636a69b1c17e09": { - "balance": "502000000000000000000" + "0x3b22da2a0271c8efe102532773636a69b1c17e09": { + "balance": "0x1b36a6444a3e180000" }, - "1aa1021f550af158c747668dd13b463160f95a40": { - "balance": "1470000000000000000000" + "0x1aa1021f550af158c747668dd13b463160f95a40": { + "balance": "0x4fb0591b9b30380000" }, - "f15178ffc43aa8070ece327e930f809ab1a54f9d": { - "balance": "197600000000000000000" + "0xf15178ffc43aa8070ece327e930f809ab1a54f9d": { + "balance": "0xab640391201300000" }, - "db1293a506e90cad2a59e1b8561f5e66961a6788": { - "balance": "2000000000000000000000" + "0xdb1293a506e90cad2a59e1b8561f5e66961a6788": { + "balance": "0x6c6b935b8bbd400000" }, - "88c361640d6b69373b081ce0c433bd590287d5ec": { - "balance": "50000000000000000000000" + "0x88c361640d6b69373b081ce0c433bd590287d5ec": { + "balance": "0xa968163f0a57b400000" }, - "3737216ee91f177732fb58fa4097267207e2cf55": { - "balance": "1520000000000000000000" + "0x3737216ee91f177732fb58fa4097267207e2cf55": { + "balance": "0x52663ccab1e1c00000" }, - "a16d9e3d63986159a800b46837f45e8bb980ee0b": { - "balance": "2030400000000000000000" + "0xa16d9e3d63986159a800b46837f45e8bb980ee0b": { + "balance": "0x6e1175da7ad1200000" }, - "ec76f12e57a65504033f2c0bce6fc03bd7fa0ac4": { - "balance": "3580000000000000000000" + "0xec76f12e57a65504033f2c0bce6fc03bd7fa0ac4": { + "balance": "0xc2127af858da700000" }, - "d9f1b26408f0ec67ad1d0d6fe22e8515e1740624": { - "balance": "24000000000000000000" + "0xd9f1b26408f0ec67ad1d0d6fe22e8515e1740624": { + "balance": "0x14d1120d7b1600000" }, - "716ba01ead2a91270635f95f25bfaf2dd610ca23": { - "balance": "44750000000000000000000" + "0x716ba01ead2a91270635f95f25bfaf2dd610ca23": { + "balance": "0x979e7012056aa780000" }, - "42a98bf16027ce589c4ed2c95831e2724205064e": { - "balance": "10000000000000000000000" + "0x42a98bf16027ce589c4ed2c95831e2724205064e": { + "balance": "0x21e19e0c9bab2400000" }, - "0f88aac9346cb0e7347fba70905475ba8b3e5ece": { - "balance": "10000000000000000000000" + "0x0f88aac9346cb0e7347fba70905475ba8b3e5ece": { + "balance": "0x21e19e0c9bab2400000" }, - "2d8c52329f38d2a2fa9cbaf5c583daf1490bb11c": { - "balance": "20000000000000000000" + "0x2d8c52329f38d2a2fa9cbaf5c583daf1490bb11c": { + "balance": "0x1158e460913d00000" }, - "3cea302a472a940379dd398a24eafdbadf88ad79": { - "balance": "3000000000000000000000" + "0x3cea302a472a940379dd398a24eafdbadf88ad79": { + "balance": "0xa2a15d09519be00000" }, - "a29d5bda74e003474872bd5894b88533ff64c2b5": { - "balance": "10000000000000000000000" + "0xa29d5bda74e003474872bd5894b88533ff64c2b5": { + "balance": "0x21e19e0c9bab2400000" }, - "2d23766b6f6b05737dad80a419c40eda4d77103e": { - "balance": "3820000000000000000000" + "0x2d23766b6f6b05737dad80a419c40eda4d77103e": { + "balance": "0xcf152640c5c8300000" }, - "b07249e055044a9155359a402937bbd954fe48b6": { - "balance": "100000000000000000000" + "0xb07249e055044a9155359a402937bbd954fe48b6": { + "balance": "0x56bc75e2d63100000" }, - "f1e980c559a1a8e5e50a47f8fffdc773b7e06a54": { - "balance": "30104784000000000000000" + "0xf1e980c559a1a8e5e50a47f8fffdc773b7e06a54": { + "balance": "0x65ffbcdea04b7480000" }, - "8275cd684c3679d5887d03664e338345dc3cdde1": { - "balance": "15800000000000000000" + "0x8275cd684c3679d5887d03664e338345dc3cdde1": { + "balance": "0xdb44e049bb2c0000" }, - "b27c1a24204c1e118d75149dd109311e07c073ab": { - "balance": "3100000000000000000000" + "0xb27c1a24204c1e118d75149dd109311e07c073ab": { + "balance": "0xa80d24677efef00000" }, - "451b3699475bed5d7905f8905aa3456f1ed788fc": { - "balance": "2560000000000000000000" + "0x451b3699475bed5d7905f8905aa3456f1ed788fc": { + "balance": "0x8ac7230489e8000000" }, - "31ad4d9946ef09d8e988d946b1227f9141901736": { - "balance": "22880000000000000000000" + "0x31ad4d9946ef09d8e988d946b1227f9141901736": { + "balance": "0x4d853c8f89089800000" }, - "52b8a9592634f7300b7c5c59a3345b835f01b95c": { - "balance": "2000000000000000000000" + "0x52b8a9592634f7300b7c5c59a3345b835f01b95c": { + "balance": "0x6c6b935b8bbd400000" }, - "b161725fdcedd17952d57b23ef285b7e4b1169e8": { - "balance": "50071000000000000000" + "0xb161725fdcedd17952d57b23ef285b7e4b1169e8": { + "balance": "0x2b6dfed3664958000" }, - "74fc5a99c0c5460503a13b0509459da19ce7cd90": { - "balance": "200000000000000000000" + "0x74fc5a99c0c5460503a13b0509459da19ce7cd90": { + "balance": "0xad78ebc5ac6200000" }, - "d99df7421b9382e42c89b006c7f087702a0757c0": { - "balance": "480000000000000000000" + "0xd99df7421b9382e42c89b006c7f087702a0757c0": { + "balance": "0x1a055690d9db800000" }, - "8a4f4a7f52a355ba105fca2072d3065fc8f7944b": { - "balance": "500000000000000000000" + "0x8a4f4a7f52a355ba105fca2072d3065fc8f7944b": { + "balance": "0x1b1ae4d6e2ef500000" }, - "12316fc7f178eac22eb2b25aedeadf3d75d00177": { - "balance": "19999999000000000000000" + "0x12316fc7f178eac22eb2b25aedeadf3d75d00177": { + "balance": "0x43c33be05f6bfb98000" }, - "f598db2e09a8a5ee7d720d2b5c43bb126d11ecc2": { - "balance": "200000000000000000000" + "0xf598db2e09a8a5ee7d720d2b5c43bb126d11ecc2": { + "balance": "0xad78ebc5ac6200000" }, - "37b8beac7b1ca38829d61ab552c766f48a10c32f": { - "balance": "400000000000000000000" + "0x37b8beac7b1ca38829d61ab552c766f48a10c32f": { + "balance": "0x15af1d78b58c400000" }, - "851dc38adb4593729a76f33a8616dab6f5f59a77": { - "balance": "100000000000000000000" + "0x851dc38adb4593729a76f33a8616dab6f5f59a77": { + "balance": "0x56bc75e2d63100000" }, - "bf4096bc547dbfc4e74809a31c039e7b389d5e17": { - "balance": "3940000000000000000000" + "0xbf4096bc547dbfc4e74809a31c039e7b389d5e17": { + "balance": "0xd5967be4fc3f100000" }, - "98d3731992d1d40e1211c7f735f2189afa0702e0": { - "balance": "8000000000000000000000" + "0x98d3731992d1d40e1211c7f735f2189afa0702e0": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "0f4073c1b99df60a1549d69789c7318d9403a814": { - "balance": "20000000000000000000000" + "0x0f4073c1b99df60a1549d69789c7318d9403a814": { + "balance": "0x43c33c1937564800000" }, - "a430995ddb185b9865dbe62539ad90d22e4b73c2": { - "balance": "10000000000000000000000" + "0xa430995ddb185b9865dbe62539ad90d22e4b73c2": { + "balance": "0x21e19e0c9bab2400000" }, - "898c72dd736558ef9e4be9fdc34fef54d7fc7e08": { - "balance": "1000000000000000000000" + "0x898c72dd736558ef9e4be9fdc34fef54d7fc7e08": { + "balance": "0x3635c9adc5dea00000" }, - "f9b617f752edecae3e909fbb911d2f8192f84209": { - "balance": "2674000000000000000000" + "0xf9b617f752edecae3e909fbb911d2f8192f84209": { + "balance": "0x90f534608a72880000" }, - "e1ae029b17e373cde3de5a9152201a14cac4e119": { - "balance": "99968000000000000000" + "0xe1ae029b17e373cde3de5a9152201a14cac4e119": { + "balance": "0x56b55ae58ca400000" }, - "d8e8474292e7a051604ca164c0707783bb2885e8": { - "balance": "13370000000000000000000" + "0xd8e8474292e7a051604ca164c0707783bb2885e8": { + "balance": "0x2d4ca05e2b43ca80000" }, - "f476f2cb7208a32e051fd94ea8662992638287a2": { - "balance": "100000000000000000000" + "0xf476f2cb7208a32e051fd94ea8662992638287a2": { + "balance": "0x56bc75e2d63100000" }, - "3a84e950ed410e51b7e8801049ab2634b285fea1": { - "balance": "18690000000000000000000" + "0x3a84e950ed410e51b7e8801049ab2634b285fea1": { + "balance": "0x3f52fdaa822d2c80000" }, - "5b7784caea01799ca30227827667ce207c5cbc76": { - "balance": "2000000000000000000000" + "0x5b7784caea01799ca30227827667ce207c5cbc76": { + "balance": "0x6c6b935b8bbd400000" }, - "3af65b3e28895a4a001153391d1e69c31fb9db39": { - "balance": "3940000000000000000000" + "0x3af65b3e28895a4a001153391d1e69c31fb9db39": { + "balance": "0xd5967be4fc3f100000" }, - "95fb5afb14c1ef9ab7d179c5c300503fd66a5ee2": { - "balance": "34225000000000000000" + "0x95fb5afb14c1ef9ab7d179c5c300503fd66a5ee2": { + "balance": "0x1daf7a02b0dbe8000" }, - "a8446c4781a737ac4328b1e15b8a0b3fbb0fd668": { - "balance": "21390500000000000000000" + "0xa8446c4781a737ac4328b1e15b8a0b3fbb0fd668": { + "balance": "0x48794d1f246192a0000" }, - "4888fb25cd50dbb9e048f41ca47d78b78a27c7d9": { - "balance": "17300000000000000000000" + "0x4888fb25cd50dbb9e048f41ca47d78b78a27c7d9": { + "balance": "0x3a9d5baa4abf1d00000" }, - "566c10d638e8b88b47d6e6a414497afdd00600d4": { - "balance": "99960000000000000000" + "0x566c10d638e8b88b47d6e6a414497afdd00600d4": { + "balance": "0x56b394263a40c0000" }, - "bd47f5f76e3b930fd9485209efa0d4763da07568": { - "balance": "1000000000000000000000" + "0xbd47f5f76e3b930fd9485209efa0d4763da07568": { + "balance": "0x3635c9adc5dea00000" }, - "1e1c6351776ac31091397ecf16002d979a1b2d51": { - "balance": "1400000000000000000000" + "0x1e1c6351776ac31091397ecf16002d979a1b2d51": { + "balance": "0x4be4e7267b6ae00000" }, - "edf603890228d7d5de9309942b5cad4219ef9ad7": { - "balance": "5000000000000000000000" + "0xedf603890228d7d5de9309942b5cad4219ef9ad7": { + "balance": "0x10f0cf064dd59200000" }, - "1923cfc68b13ea7e2055803645c1e320156bd88d": { - "balance": "1337000000000000000000" + "0x1923cfc68b13ea7e2055803645c1e320156bd88d": { + "balance": "0x487a9a304539440000" }, - "8f8f37d0ad8f335d2a7101b41156b688a81a9cbe": { - "balance": "70000000000000000000" + "0x8f8f37d0ad8f335d2a7101b41156b688a81a9cbe": { + "balance": "0x3cb71f51fc5580000" }, - "63334fcf1745840e4b094a3bb40bb76f9604c04c": { - "balance": "3978000000000000000000" + "0x63334fcf1745840e4b094a3bb40bb76f9604c04c": { + "balance": "0xd7a5d703a717e80000" }, - "001762430ea9c3a26e5749afdb70da5f78ddbb8c": { - "balance": "200000000000000000000" + "0x001762430ea9c3a26e5749afdb70da5f78ddbb8c": { + "balance": "0xad78ebc5ac6200000" }, - "512116817ba9aaf843d1507c65a5ea640a7b9eec": { - "balance": "50000000000000000000" + "0x512116817ba9aaf843d1507c65a5ea640a7b9eec": { + "balance": "0x2b5e3af16b1880000" }, - "2961fb391c61957cb5c9e407dda29338d3b92c80": { - "balance": "999942000000000000000" + "0x2961fb391c61957cb5c9e407dda29338d3b92c80": { + "balance": "0x3634fb9f1489a70000" }, - "fc2952b4c49fedd0bc0528a308495e6d6a1c71d6": { - "balance": "2000000000000000000000" + "0xfc2952b4c49fedd0bc0528a308495e6d6a1c71d6": { + "balance": "0x6c6b935b8bbd400000" }, - "13ec812284026e409bc066dfebf9d5a4a2bf801e": { - "balance": "1610000000000000000000" + "0x13ec812284026e409bc066dfebf9d5a4a2bf801e": { + "balance": "0x57473d05dabae80000" }, - "ef463c2679fb279164e20c3d2691358773a0ad95": { - "balance": "2000000000000000000000" + "0xef463c2679fb279164e20c3d2691358773a0ad95": { + "balance": "0x6c6b935b8bbd400000" }, - "3aadf98b61e5c896e7d100a3391d3250225d61df": { - "balance": "234000000000000000000" + "0x3aadf98b61e5c896e7d100a3391d3250225d61df": { + "balance": "0xcaf67003701680000" }, - "e8137fc1b2ec7cc7103af921899b4a39e1d959a1": { - "balance": "1490000000000000000000" + "0xe8137fc1b2ec7cc7103af921899b4a39e1d959a1": { + "balance": "0x50c5e761a444080000" }, - "b1a2b43a7433dd150bb82227ed519cd6b142d382": { - "balance": "2738000000000000000000" + "0xb1a2b43a7433dd150bb82227ed519cd6b142d382": { + "balance": "0x946d620d744b880000" }, - "c1f39bd35dd9cec337b96f47c677818160df37b7": { - "balance": "20000000000000000000" + "0xc1f39bd35dd9cec337b96f47c677818160df37b7": { + "balance": "0x1158e460913d00000" }, - "b587b44a2ca79e4bc1dd8bfdd43a207150f2e7e0": { - "balance": "630400000000000000000" + "0xb587b44a2ca79e4bc1dd8bfdd43a207150f2e7e0": { + "balance": "0x222c8eb3ff66400000" }, - "41485612d03446ec4c05e5244e563f1cbae0f197": { - "balance": "970000000000000000000" + "0x41485612d03446ec4c05e5244e563f1cbae0f197": { + "balance": "0x34957444b840e80000" }, - "a12623e629df93096704b16084be2cd89d562da4": { - "balance": "8500000000000000000000" + "0xa12623e629df93096704b16084be2cd89d562da4": { + "balance": "0x1ccc9324511e4500000" }, - "3f2f381491797cc5c0d48296c14fd0cd00cdfa2d": { - "balance": "804000000000000000000" + "0x3f2f381491797cc5c0d48296c14fd0cd00cdfa2d": { + "balance": "0x2b95bdcc39b6100000" }, - "9470cc36594586821821c5c996b6edc83b6d5a32": { - "balance": "24000000000000000000" + "0x9470cc36594586821821c5c996b6edc83b6d5a32": { + "balance": "0x14d1120d7b1600000" }, - "3605372d93a9010988018f9f315d032ed1880fa1": { - "balance": "500066000000000000000" + "0x3605372d93a9010988018f9f315d032ed1880fa1": { + "balance": "0x1b1bcf51896a7d0000" }, - "12632388b2765ee4452b50161d1fffd91ab81f4a": { - "balance": "740000000000000000000" + "0x12632388b2765ee4452b50161d1fffd91ab81f4a": { + "balance": "0x281d901f4fdd100000" }, - "274a3d771a3d709796fbc4d5f48fce2fe38c79d6": { - "balance": "20000000000000000000" + "0x274a3d771a3d709796fbc4d5f48fce2fe38c79d6": { + "balance": "0x1158e460913d00000" }, - "d60a52580728520df7546bc1e283291788dbae0c": { - "balance": "999910000000000000000" + "0xd60a52580728520df7546bc1e283291788dbae0c": { + "balance": "0x363489ef3ff0d70000" }, - "1ab53a11bcc63ddfaa40a02b9e186496cdbb8aff": { - "balance": "1996800000000000000000" + "0x1ab53a11bcc63ddfaa40a02b9e186496cdbb8aff": { + "balance": "0x6c3f2aac800c000000" }, - "c282e6993fbe7a912ea047153ffd9274270e285b": { - "balance": "139939000000000000000" + "0xc282e6993fbe7a912ea047153ffd9274270e285b": { + "balance": "0x7960b331247638000" }, - "a291e9c7990d552dd1ae16cebc3fca342cbaf1d1": { - "balance": "20000000000000000000000" + "0xa291e9c7990d552dd1ae16cebc3fca342cbaf1d1": { + "balance": "0x43c33c1937564800000" }, - "5547fdb4ae11953e01292b7807fa9223d0e4606a": { - "balance": "98940000000000000000" + "0x5547fdb4ae11953e01292b7807fa9223d0e4606a": { + "balance": "0x55d117dcb1d260000" }, - "bded11612fb5c6da99d1e30e320bc0995466141e": { - "balance": "400000000000000000000" + "0xbded11612fb5c6da99d1e30e320bc0995466141e": { + "balance": "0x15af1d78b58c400000" }, - "b73b4ff99eb88fd89b0b6d57a9bc338e886fa06a": { - "balance": "32000000000000000000" + "0xb73b4ff99eb88fd89b0b6d57a9bc338e886fa06a": { + "balance": "0x1bc16d674ec800000" }, - "b1c751786939bba0d671a677a158c6abe7265e46": { - "balance": "10000000000000000000000" + "0xb1c751786939bba0d671a677a158c6abe7265e46": { + "balance": "0x21e19e0c9bab2400000" }, - "e881bbbe69722d81efecaa48d1952a10a2bfac8f": { - "balance": "16000000000000000000000" + "0xe881bbbe69722d81efecaa48d1952a10a2bfac8f": { + "balance": "0x3635c9adc5dea000000" }, - "fe96c4cd381562401aa32a86e65b9d52fa8aee27": { - "balance": "2640000000000000000000" + "0xfe96c4cd381562401aa32a86e65b9d52fa8aee27": { + "balance": "0x8f1d5c1cae37400000" }, - "683dba36f7e94f40ea6aea0d79b8f521de55076e": { - "balance": "140000000000000000000" + "0x683dba36f7e94f40ea6aea0d79b8f521de55076e": { + "balance": "0x796e3ea3f8ab00000" }, - "5ac2908b0f398c0df5bac2cb13ca7314fba8fa3d": { - "balance": "199800000000000000000" + "0x5ac2908b0f398c0df5bac2cb13ca7314fba8fa3d": { + "balance": "0xad4c8316a0b0c0000" }, - "8914a680a5aec5226d4baaec2e5552b44dd7c874": { - "balance": "100076000000000000000" + "0x8914a680a5aec5226d4baaec2e5552b44dd7c874": { + "balance": "0x56cd55fc64dfe0000" }, - "041170f581de80e58b2a045c8f7c1493b001b7cb": { - "balance": "889800000000000000000" + "0x041170f581de80e58b2a045c8f7c1493b001b7cb": { + "balance": "0x303c74a1a336940000" }, - "4665e47396c7db97eb2a03d90863d5d4ba319a94": { - "balance": "600000000000000000000" + "0x4665e47396c7db97eb2a03d90863d5d4ba319a94": { + "balance": "0x2086ac351052600000" }, - "ed4be04a052d7accb3dcce90319dba4020ab2c68": { - "balance": "37547947000000000000000" + "0xed4be04a052d7accb3dcce90319dba4020ab2c68": { + "balance": "0x7f37a70eaf362178000" }, - "4b0619d9d8aa313a9531ac7dbe04ca0d6a5ad1b6": { - "balance": "2000000000000000000000" + "0x4b0619d9d8aa313a9531ac7dbe04ca0d6a5ad1b6": { + "balance": "0x6c6b935b8bbd400000" }, - "a21442ab05340ade68c915f3c3399b9955f3f7eb": { - "balance": "775000000000000000000" + "0xa21442ab05340ade68c915f3c3399b9955f3f7eb": { + "balance": "0x2a034919dfbfbc0000" }, - "655934da8e744eaa3de34dbbc0894c4eda0b61f2": { - "balance": "200000000000000000000" + "0x655934da8e744eaa3de34dbbc0894c4eda0b61f2": { + "balance": "0xad78ebc5ac6200000" }, - "6038740ae28d66ba93b0be08482b3205a0f7a07b": { - "balance": "316000000000000000000" + "0x6038740ae28d66ba93b0be08482b3205a0f7a07b": { + "balance": "0x11216185c29f700000" }, - "99924a9816bb7ddf3fec1844828e9ad7d06bf4e6": { - "balance": "1760000000000000000000" + "0x99924a9816bb7ddf3fec1844828e9ad7d06bf4e6": { + "balance": "0x5f68e8131ecf800000" }, - "6847825bdee8240e28042c83cad642f286a3bddc": { - "balance": "1500000000000000000000" + "0x6847825bdee8240e28042c83cad642f286a3bddc": { + "balance": "0x5150ae84a8cdf00000" }, - "a718aaad59bf395cba2b23e09b02fe0c89816247": { - "balance": "999600000000000000000" + "0xa718aaad59bf395cba2b23e09b02fe0c89816247": { + "balance": "0x36303c97e468780000" }, - "2c89f5fdca3d155409b638b98a742e55eb4652b7": { - "balance": "98500000000000000000000" + "0x2c89f5fdca3d155409b638b98a742e55eb4652b7": { + "balance": "0x14dbb2195ca228900000" }, - "1a7044e2383f8708305b495bd1176b92e7ef043a": { - "balance": "200000000000000000000" + "0x1a7044e2383f8708305b495bd1176b92e7ef043a": { + "balance": "0xad78ebc5ac6200000" }, - "282e80a554875a56799fa0a97f5510e795974c4e": { - "balance": "1000000000000000000000" + "0x282e80a554875a56799fa0a97f5510e795974c4e": { + "balance": "0x3635c9adc5dea00000" }, - "ffb3bcc3196a8c3cb834cec94c34fed35b3e1054": { - "balance": "1340000000000000000000" + "0xffb3bcc3196a8c3cb834cec94c34fed35b3e1054": { + "balance": "0x48a43c54602f700000" }, - "d135794b149a18e147d16e621a6931f0a40a969a": { - "balance": "20000000000000000000000" + "0xd135794b149a18e147d16e621a6931f0a40a969a": { + "balance": "0x43c33c1937564800000" }, - "6b94615db750656ac38c7e1cf29a9d13677f4e15": { - "balance": "12000000000000000000000" + "0x6b94615db750656ac38c7e1cf29a9d13677f4e15": { + "balance": "0x28a857425466f800000" }, - "ecbe425e670d39094e20fb5643a9d818eed236de": { - "balance": "5000000000000000000000" + "0xecbe425e670d39094e20fb5643a9d818eed236de": { + "balance": "0x10f0cf064dd59200000" }, - "511e0efb04ac4e3ff2e6550e498295bfcd56ffd5": { - "balance": "668500000000000000000" + "0x511e0efb04ac4e3ff2e6550e498295bfcd56ffd5": { + "balance": "0x243d4d18229ca20000" }, - "ff65511cada259260c1ddc41974ecaecd32d6357": { - "balance": "1760000000000000000000" + "0xff65511cada259260c1ddc41974ecaecd32d6357": { + "balance": "0x5f68e8131ecf800000" }, - "9ffc5fe06f33f5a480b75aa94eb8556d997a16c0": { - "balance": "20000000000000000000" + "0x9ffc5fe06f33f5a480b75aa94eb8556d997a16c0": { + "balance": "0x1158e460913d00000" }, - "57df23bebdc65eb75feb9cb2fad1c073692b2baf": { - "balance": "4000000000000000000000" + "0x57df23bebdc65eb75feb9cb2fad1c073692b2baf": { + "balance": "0xd8d726b7177a800000" }, - "207ef80b5d60b6fbffc51f3a64b8c72036a5abbd": { - "balance": "6685000000000000000000" + "0x207ef80b5d60b6fbffc51f3a64b8c72036a5abbd": { + "balance": "0x16a6502f15a1e540000" }, - "c573e841fa08174a208b060ccb7b4c0d7697127f": { - "balance": "668500000000000000000" + "0xc573e841fa08174a208b060ccb7b4c0d7697127f": { + "balance": "0x243d4d18229ca20000" }, - "411610b178d5617dfab934d293f512a93e5c10e1": { - "balance": "170000000000000000000" + "0x411610b178d5617dfab934d293f512a93e5c10e1": { + "balance": "0x93739534d28680000" }, - "9991614c5baa47dd6c96874645f97add2c3d8380": { - "balance": "1970000000000000000000" + "0x9991614c5baa47dd6c96874645f97add2c3d8380": { + "balance": "0x6acb3df27e1f880000" }, - "2d3480bf0865074a72c7759ee5137b4d70c51ce9": { - "balance": "200000000000000000000" + "0x2d3480bf0865074a72c7759ee5137b4d70c51ce9": { + "balance": "0xad78ebc5ac6200000" }, - "9d40e012f60425a340d82d03a1c757bfabc706fb": { - "balance": "169799000000000000000" + "0x9d40e012f60425a340d82d03a1c757bfabc706fb": { + "balance": "0x9346f3addc88d8000" }, - "47648bed01f3cd3249084e635d14daa9e7ec3c8a": { - "balance": "194000000000000000000" + "0x47648bed01f3cd3249084e635d14daa9e7ec3c8a": { + "balance": "0xa844a7424d9c80000" }, - "a5ff62222d80c013cec1a0e8850ed4d354dac16d": { - "balance": "207600000000000000000" + "0xa5ff62222d80c013cec1a0e8850ed4d354dac16d": { + "balance": "0xb41075c168b180000" }, - "f80d3619702fa5838c48391859a839fb9ce7160f": { - "balance": "1992800000000000000000" + "0xf80d3619702fa5838c48391859a839fb9ce7160f": { + "balance": "0x6c07a7d1b16e700000" }, - "7c0f5e072043c9ee740242197e78cc4b98cdf960": { - "balance": "200000000000000000000" + "0x7c0f5e072043c9ee740242197e78cc4b98cdf960": { + "balance": "0xad78ebc5ac6200000" }, - "a40aa2bbce0c72b4d0dfffcc42715b2b54b01bfa": { - "balance": "1000000000000000000000" + "0xa40aa2bbce0c72b4d0dfffcc42715b2b54b01bfa": { + "balance": "0x3635c9adc5dea00000" }, - "2eeed50471a1a2bf53ee30b1232e6e9d80ef866d": { - "balance": "20000000000000000000" + "0x2eeed50471a1a2bf53ee30b1232e6e9d80ef866d": { + "balance": "0x1158e460913d00000" }, - "0c2808b951ed9e872d7b32790fcc5994ae41ffdc": { - "balance": "102000000000000000000000" + "0x0c2808b951ed9e872d7b32790fcc5994ae41ffdc": { + "balance": "0x15996e5b3cd6b3c00000" }, - "7f06c89d59807fa60bc60136fcf814cbaf2543bd": { - "balance": "10000000000000000000000" + "0x7f06c89d59807fa60bc60136fcf814cbaf2543bd": { + "balance": "0x21e19e0c9bab2400000" }, - "8d4b603c5dd4570c34669515fdcc665890840c77": { - "balance": "18200000000000000000" + "0x8d4b603c5dd4570c34669515fdcc665890840c77": { + "balance": "0xfc936392801c0000" }, - "d5e5c135d0c4c3303934711993d0d16ff9e7baa0": { - "balance": "2000000000000000000000" + "0xd5e5c135d0c4c3303934711993d0d16ff9e7baa0": { + "balance": "0x6c6b935b8bbd400000" }, - "241361559feef80ef137302153bd9ed2f25db3ef": { - "balance": "20000000000000000000000" + "0x241361559feef80ef137302153bd9ed2f25db3ef": { + "balance": "0x43c33c1937564800000" }, - "db63122de7037da4971531fae9af85867886c692": { - "balance": "277000000000000000000" + "0xdb63122de7037da4971531fae9af85867886c692": { + "balance": "0xf0425b0641f340000" }, - "417e4e2688b1fd66d821529e46ed4f42f8b3db3d": { - "balance": "2000000000000000000000" + "0x417e4e2688b1fd66d821529e46ed4f42f8b3db3d": { + "balance": "0x6c6b935b8bbd400000" }, - "127db1cadf1b771cbd7475e1b272690f558c8565": { - "balance": "14000000000000000000000" + "0x127db1cadf1b771cbd7475e1b272690f558c8565": { + "balance": "0x2f6f10780d22cc00000" }, - "48659d8f8c9a2fd44f68daa55d23a608fbe500dc": { - "balance": "2000000000000000000000" + "0x48659d8f8c9a2fd44f68daa55d23a608fbe500dc": { + "balance": "0x6c6b935b8bbd400000" }, - "b3a64b1176724f5409e1414a3523661baee74b4a": { - "balance": "25610000000000000000" + "0xb3a64b1176724f5409e1414a3523661baee74b4a": { + "balance": "0x16368ff4ff9c10000" }, - "aa14422d6f0ae5a758194ed15780c838d67f1ee1": { - "balance": "28503824000000000000000" + "0xaa14422d6f0ae5a758194ed15780c838d67f1ee1": { + "balance": "0x60932056c449de80000" }, - "a0a0e65204541fca9b2fb282cd95138fae16f809": { - "balance": "10000000000000000000000" + "0xa0a0e65204541fca9b2fb282cd95138fae16f809": { + "balance": "0x21e19e0c9bab2400000" }, - "d2107b353726c3a2b46566eaa7d9f80b5d21dbe3": { - "balance": "20000000000000000000" + "0xd2107b353726c3a2b46566eaa7d9f80b5d21dbe3": { + "balance": "0x1158e460913d00000" }, - "e4cafb727fb5c6b70bb27533b8a9ccc9ef6888e1": { - "balance": "300443000000000000000" + "0xe4cafb727fb5c6b70bb27533b8a9ccc9ef6888e1": { + "balance": "0x10497bf4af4caf8000" }, - "09f3f601f605441140586ce0656fa24aa5b1d9ae": { - "balance": "1539400000000000000000" + "0x09f3f601f605441140586ce0656fa24aa5b1d9ae": { + "balance": "0x5373776fe8c4540000" }, - "87fcbe7c4193ffcb08143779c9bec83fe7fda9fc": { - "balance": "100275000000000000000" + "0x87fcbe7c4193ffcb08143779c9bec83fe7fda9fc": { + "balance": "0x56f985d38644b8000" }, - "03ebc63fda6660a465045e235fbe6e5cf195735f": { - "balance": "141840000000000000000" + "0x03ebc63fda6660a465045e235fbe6e5cf195735f": { + "balance": "0x7b06ce87fdd680000" }, - "bdbaf6434d40d6355b1e80e40cc4ab9c68d96116": { - "balance": "100000000000000000000" + "0xbdbaf6434d40d6355b1e80e40cc4ab9c68d96116": { + "balance": "0x56bc75e2d63100000" }, - "4e2225a1bb59bc88a2316674d333b9b0afca6655": { - "balance": "155000000000000000000" + "0x4e2225a1bb59bc88a2316674d333b9b0afca6655": { + "balance": "0x8670e9ec6598c0000" }, - "4dc3da13b2b4afd44f5d0d3189f444d4ddf91b1b": { - "balance": "2000000000000000000000" + "0x4dc3da13b2b4afd44f5d0d3189f444d4ddf91b1b": { + "balance": "0x6c6b935b8bbd400000" }, - "4ba8e0117fc0b6a3e56b24a3a58fe6cef442ff98": { - "balance": "5640000000000000000000" + "0x4ba8e0117fc0b6a3e56b24a3a58fe6cef442ff98": { + "balance": "0x131beb925ffd3200000" }, - "27146913563aa745e2588430d9348e86ea7c3510": { - "balance": "400000000000000000000" + "0x27146913563aa745e2588430d9348e86ea7c3510": { + "balance": "0x15af1d78b58c400000" }, - "4c5afe40f18ffc48d3a1aec41fc29de179f4d297": { - "balance": "2000000000000000000000" + "0x4c5afe40f18ffc48d3a1aec41fc29de179f4d297": { + "balance": "0x6c6b935b8bbd400000" }, - "8a810114b2025db9fbb50099a6e0cb9e2efa6bdc": { - "balance": "1910000000000000000000" + "0x8a810114b2025db9fbb50099a6e0cb9e2efa6bdc": { + "balance": "0x678a932062e4180000" }, - "2dee90a28f192d676a8773232b56f18f239e2fad": { - "balance": "18587970000000000000000" + "0x2dee90a28f192d676a8773232b56f18f239e2fad": { + "balance": "0x3efa7e747b6d1ad0000" }, - "60676e92d18b000509c61de540e6c5ddb676d509": { - "balance": "1200000000000000000000" + "0x60676e92d18b000509c61de540e6c5ddb676d509": { + "balance": "0x410d586a20a4c00000" }, - "9bfc659c9c601ea42a6b21b8f17084ec87d70212": { - "balance": "10000000000000000000000" + "0x9bfc659c9c601ea42a6b21b8f17084ec87d70212": { + "balance": "0x21e19e0c9bab2400000" }, - "5d5d6e821c6eef96810c83c491468560ef70bfb5": { - "balance": "2000000000000000000000" + "0x5d5d6e821c6eef96810c83c491468560ef70bfb5": { + "balance": "0x6c6b935b8bbd400000" }, - "d5787668c2c5175b01a8ee1ac3ecc9c8b2aba95a": { - "balance": "1999944000000000000000" + "0xd5787668c2c5175b01a8ee1ac3ecc9c8b2aba95a": { + "balance": "0x6c6acc67d7b1d40000" }, - "33b336f5ba5edb7b1ccc7eb1a0d984c1231d0edc": { - "balance": "2000000000000000000000" + "0x33b336f5ba5edb7b1ccc7eb1a0d984c1231d0edc": { + "balance": "0x6c6b935b8bbd400000" }, - "3abb8adfc604f48d5984811d7f1d52fef6758270": { - "balance": "4475000000000000000000" + "0x3abb8adfc604f48d5984811d7f1d52fef6758270": { + "balance": "0xf29719b66f110c0000" }, - "980a84b686fc31bdc83c221058546a71b11f838a": { - "balance": "779471000000000000000" + "0x980a84b686fc31bdc83c221058546a71b11f838a": { + "balance": "0x2a415548af86818000" }, - "0b507cf553568daaf65504ae4eaa17a8ea3cdbf5": { - "balance": "2000000000000000000000" + "0x0b507cf553568daaf65504ae4eaa17a8ea3cdbf5": { + "balance": "0x6c6b935b8bbd400000" }, - "896009526a2c7b0c09a6f63a80bdf29d9c87de9c": { - "balance": "3462830000000000000000" + "0x896009526a2c7b0c09a6f63a80bdf29d9c87de9c": { + "balance": "0xbbb86b8223edeb0000" }, - "9696052138338c722f1140815cf7749d0d3b3a74": { - "balance": "500000000000000000000" + "0x9696052138338c722f1140815cf7749d0d3b3a74": { + "balance": "0x1b1ae4d6e2ef500000" }, - "3831757eae7557cb8a37a4b10644b63e4d3b3c75": { - "balance": "200000000000000000000" + "0x3831757eae7557cb8a37a4b10644b63e4d3b3c75": { + "balance": "0xad78ebc5ac6200000" }, - "62dc72729024375fc37cbb9c7c2393d10233330f": { - "balance": "2000000000000000000000" + "0x62dc72729024375fc37cbb9c7c2393d10233330f": { + "balance": "0x6c6b935b8bbd400000" }, - "44098866a69b68c0b6bc168229b9603587058967": { - "balance": "188000000000000000000" + "0x44098866a69b68c0b6bc168229b9603587058967": { + "balance": "0xa31062beeed700000" }, - "25adb8f96f39492c9bb47c5edc88624e46075697": { - "balance": "26740000000000000000000" + "0x25adb8f96f39492c9bb47c5edc88624e46075697": { + "balance": "0x5a9940bc56879500000" }, - "fd4de8e3748a289cf7d060517d9d38388db01fb8": { - "balance": "250000000000000000000" + "0xfd4de8e3748a289cf7d060517d9d38388db01fb8": { + "balance": "0xd8d726b7177a80000" }, - "6be7595ea0f068489a2701ec4649158ddc43e178": { - "balance": "2000000000000000000000" + "0x6be7595ea0f068489a2701ec4649158ddc43e178": { + "balance": "0x6c6b935b8bbd400000" }, - "d402b4f6a099ebe716cb14df4f79c0cd01c6071b": { - "balance": "2000000000000000000000" + "0xd402b4f6a099ebe716cb14df4f79c0cd01c6071b": { + "balance": "0x6c6b935b8bbd400000" }, - "a07682000b1bcf3002f85c80c0fa2949bd1e82fd": { - "balance": "4000000000000000000000" + "0xa07682000b1bcf3002f85c80c0fa2949bd1e82fd": { + "balance": "0xd8d726b7177a800000" }, - "eb4f00e28336ea09942588eeac921811c522143c": { - "balance": "2000000000000000000000" + "0xeb4f00e28336ea09942588eeac921811c522143c": { + "balance": "0x6c6b935b8bbd400000" }, - "8f31c7005197ec997a87e69bec48649ab94bb2a5": { - "balance": "4000000000000000000000" + "0x8f31c7005197ec997a87e69bec48649ab94bb2a5": { + "balance": "0xd8d726b7177a800000" }, - "e7fd8fd959aed2767ea7fa960ce1db53af802573": { - "balance": "1000000000000000000000" + "0xe7fd8fd959aed2767ea7fa960ce1db53af802573": { + "balance": "0x3635c9adc5dea00000" }, - "a8ef9ad274436042903e413c3b0c62f5f52ed584": { - "balance": "10000000000000000000000" + "0xa8ef9ad274436042903e413c3b0c62f5f52ed584": { + "balance": "0x21e19e0c9bab2400000" }, - "d83ad260e9a6f432fb6ea28743299b4a09ad658c": { - "balance": "2000000000000000000000" + "0xd83ad260e9a6f432fb6ea28743299b4a09ad658c": { + "balance": "0x6c6b935b8bbd400000" }, - "b5c816a8283ca4df68a1a73d63bd80260488df08": { - "balance": "200000000000000000000" + "0xb5c816a8283ca4df68a1a73d63bd80260488df08": { + "balance": "0xad78ebc5ac6200000" }, - "d7d3c75920590438b82c3e9515be2eb6ed7a8b1a": { - "balance": "60000000000000000000000" + "0xd7d3c75920590438b82c3e9515be2eb6ed7a8b1a": { + "balance": "0xcb49b44ba602d800000" }, - "af3cb5965933e7dad883693b9c3e15beb68a4873": { - "balance": "2000000000000000000000" + "0xaf3cb5965933e7dad883693b9c3e15beb68a4873": { + "balance": "0x6c6b935b8bbd400000" }, - "6e899e59a9b41ab7ea41df7517860f2acb59f4fd": { - "balance": "20000000000000000000000" + "0x6e899e59a9b41ab7ea41df7517860f2acb59f4fd": { + "balance": "0x43c33c1937564800000" }, - "527a8ca1268633a6c939c5de1b929aee92aeac8d": { - "balance": "900000000000000000000" + "0x527a8ca1268633a6c939c5de1b929aee92aeac8d": { + "balance": "0x30ca024f987b900000" }, - "1680cec5021ee93050f8ae127251839e74c1f1fd": { - "balance": "13098657000000000000000" + "0x1680cec5021ee93050f8ae127251839e74c1f1fd": { + "balance": "0x2c61461e5d743d68000" }, - "ff7843c7010aa7e61519b762dfe49124a76b0e4e": { - "balance": "933580000000000000000000" + "0xff7843c7010aa7e61519b762dfe49124a76b0e4e": { + "balance": "0xc5b17924412b9bb00000" }, - "140fba58dbc04803d84c2130f01978f9e0c73129": { - "balance": "400000000000000000000" + "0x140fba58dbc04803d84c2130f01978f9e0c73129": { + "balance": "0x15af1d78b58c400000" }, - "0261ad3a172abf1315f0ffec3270986a8409cb25": { - "balance": "203500000000000000000" + "0x0261ad3a172abf1315f0ffec3270986a8409cb25": { + "balance": "0xb08213bcf8ffe0000" }, - "ab5a79016176320973e8cd38f6375530022531c0": { - "balance": "1000000000000000000000" + "0xab5a79016176320973e8cd38f6375530022531c0": { + "balance": "0x3635c9adc5dea00000" }, - "fca73eff8771c0103ba3cc1a9c259448c72abf0b": { - "balance": "1000000000000000000000" + "0xfca73eff8771c0103ba3cc1a9c259448c72abf0b": { + "balance": "0x3635c9adc5dea00000" }, - "07d41217badca5e0e60327d845a3464f0f27f84a": { - "balance": "4000000000000000000000" + "0x07d41217badca5e0e60327d845a3464f0f27f84a": { + "balance": "0xd8d726b7177a800000" }, - "2c1c19114e3d6de27851484b8d2715e50f8a1065": { - "balance": "100000000000000000000" + "0x2c1c19114e3d6de27851484b8d2715e50f8a1065": { + "balance": "0x56bc75e2d63100000" }, - "abd21eff954fc6a7de26912a7cbb303a6607804e": { - "balance": "1517000000000000000000" + "0xabd21eff954fc6a7de26912a7cbb303a6607804e": { + "balance": "0x523c9aa696eb940000" }, - "f303d5a816affd97e83d9e4dac2f79072bb0098f": { - "balance": "960000000000000000000" + "0xf303d5a816affd97e83d9e4dac2f79072bb0098f": { + "balance": "0x340aad21b3b7000000" }, - "114cfefe50170dd97ae08f0a44544978c599548d": { - "balance": "863000000000000000000" + "0x114cfefe50170dd97ae08f0a44544978c599548d": { + "balance": "0x2ec887e7a14a1c0000" }, - "647b85044df2cf0b4ed4882e88819fe22ae5f793": { - "balance": "1000032000000000000000" + "0x647b85044df2cf0b4ed4882e88819fe22ae5f793": { + "balance": "0x36363b5d9a77700000" }, - "1b130d6fa51d5c48ec8d1d52dc8a227be8735c8a": { - "balance": "2000000000000000000000" + "0x1b130d6fa51d5c48ec8d1d52dc8a227be8735c8a": { + "balance": "0x6c6b935b8bbd400000" }, - "0d9d3f9bc4a4c6efbd59679b69826bc1f63d9916": { - "balance": "600000000000000000000" + "0x0d9d3f9bc4a4c6efbd59679b69826bc1f63d9916": { + "balance": "0x2086ac351052600000" }, - "c765e00476810947816af142d46d2ee7bca8cc4f": { - "balance": "500000000000000000000" + "0xc765e00476810947816af142d46d2ee7bca8cc4f": { + "balance": "0x1b1ae4d6e2ef500000" }, - "b57b04fa23d1203fae061eac4542cb60f3a57637": { - "balance": "191000000000000000000" + "0xb57b04fa23d1203fae061eac4542cb60f3a57637": { + "balance": "0xa5aa85009e39c0000" }, - "e192489b85a982c1883246d915b229cb13207f38": { - "balance": "5000000000000000000000" + "0xe192489b85a982c1883246d915b229cb13207f38": { + "balance": "0x10f0cf064dd59200000" }, - "5f483ffb8f680aedf2a38f7833afdcde59b61e4b": { - "balance": "2000000000000000000000" + "0x5f483ffb8f680aedf2a38f7833afdcde59b61e4b": { + "balance": "0x6c6b935b8bbd400000" }, - "b46d1182e5aacaff0d26b2fcf72f3c9ffbcdd97d": { - "balance": "3139000000000000000000" + "0xb46d1182e5aacaff0d26b2fcf72f3c9ffbcdd97d": { + "balance": "0xaa2a603cdd7f2c0000" }, - "59c7f785c93160e5807ed34e5e534bc6188647a7": { - "balance": "640000000000000000000" + "0x59c7f785c93160e5807ed34e5e534bc6188647a7": { + "balance": "0x22b1c8c1227a000000" }, - "18e4ce47483b53040adbab35172c01ef64506e0c": { - "balance": "9000000000000000000000" + "0x18e4ce47483b53040adbab35172c01ef64506e0c": { + "balance": "0x1e7e4171bf4d3a00000" }, - "296d66b521571a4e4103a7f562c511e6aa732d81": { - "balance": "668500000000000000000" + "0x296d66b521571a4e4103a7f562c511e6aa732d81": { + "balance": "0x243d4d18229ca20000" }, - "bcd99edc2160f210a05e3a1fa0b0434ced00439b": { - "balance": "2000000000000000000000" + "0xbcd99edc2160f210a05e3a1fa0b0434ced00439b": { + "balance": "0x6c6b935b8bbd400000" }, - "f14f0eb86db0eb68753f16918e5d4b807437bd3e": { - "balance": "200000000000000000000" + "0xf14f0eb86db0eb68753f16918e5d4b807437bd3e": { + "balance": "0xad78ebc5ac6200000" }, - "60d5667140d12614b21c8e5e8a33082e32dfcf23": { - "balance": "20000000000000000000000" + "0x60d5667140d12614b21c8e5e8a33082e32dfcf23": { + "balance": "0x43c33c1937564800000" }, - "8ccabf25077f3aa41545344d53be1b2b9c339000": { - "balance": "1695400000000000000000" + "0x8ccabf25077f3aa41545344d53be1b2b9c339000": { + "balance": "0x5be866c562c5440000" }, - "8cc0d7c016fa7aa950114aa1db094882eda274ea": { - "balance": "159800000000000000000" + "0x8cc0d7c016fa7aa950114aa1db094882eda274ea": { + "balance": "0x8a9aba557e36c0000" }, - "c71145e529c7a714e67903ee6206e4c3042b6727": { - "balance": "1430000000000000000000" + "0xc71145e529c7a714e67903ee6206e4c3042b6727": { + "balance": "0x4d853c8f8908980000" }, - "c5e9939334f1252ed2ba26814487dfd2982b3128": { - "balance": "70000000000000000000" + "0xc5e9939334f1252ed2ba26814487dfd2982b3128": { + "balance": "0x3cb71f51fc5580000" }, - "f09b3e87f913ddfd57ae8049c731dba9b636dfc3": { - "balance": "608000000000000000000" + "0xf09b3e87f913ddfd57ae8049c731dba9b636dfc3": { + "balance": "0x20f5b1eaad8d800000" }, - "4349225a62f70aea480a029915a01e5379e64fa5": { - "balance": "2598000000000000000000" + "0x4349225a62f70aea480a029915a01e5379e64fa5": { + "balance": "0x8cd67e2334c0d80000" }, - "666b4f37d55d63b7d056b615bb74c96b3b01991a": { - "balance": "4000000000000000000000" + "0x666b4f37d55d63b7d056b615bb74c96b3b01991a": { + "balance": "0xd8d726b7177a800000" }, - "8bd6b1c6d74d010d1008dba6ef835d4430b35c32": { - "balance": "50000000000000000000" + "0x8bd6b1c6d74d010d1008dba6ef835d4430b35c32": { + "balance": "0x2b5e3af16b1880000" }, - "7363cd90fbab5bb8c49ac20fc62c398fe6fb744c": { - "balance": "2000000000000000000000" + "0x7363cd90fbab5bb8c49ac20fc62c398fe6fb744c": { + "balance": "0x6c6b935b8bbd400000" }, - "b7479dab5022c4d5dbaaf8de171b4e951dd1a457": { - "balance": "80000000000000000000" + "0xb7479dab5022c4d5dbaaf8de171b4e951dd1a457": { + "balance": "0x4563918244f400000" }, - "5a5468fa5ca226c7532ecf06e1bc1c45225d7ec9": { - "balance": "1910000000000000000000" + "0x5a5468fa5ca226c7532ecf06e1bc1c45225d7ec9": { + "balance": "0x678a932062e4180000" }, - "32a20d028e2c6218b9d95b445c771524636a22ef": { - "balance": "9500000000000000000000" + "0x32a20d028e2c6218b9d95b445c771524636a22ef": { + "balance": "0x202fefbf2d7c2f00000" }, - "1bd28cd5c78aee51357c95c1ef9235e7c18bc854": { - "balance": "2000000000000000000000" + "0x1bd28cd5c78aee51357c95c1ef9235e7c18bc854": { + "balance": "0x6c6b935b8bbd400000" }, - "693492a5c51396a482881669ccf6d8d779f00951": { - "balance": "345827000000000000000" + "0x693492a5c51396a482881669ccf6d8d779f00951": { + "balance": "0x12bf50503ae3038000" }, - "bd723b289a7367b6ece2455ed61edb49670ab9c4": { - "balance": "4999995000000000000000" + "0xbd723b289a7367b6ece2455ed61edb49670ab9c4": { + "balance": "0x10f0cdea164213f8000" }, - "1be3542c3613687465f15a70aeeb81662b65cca8": { - "balance": "2000000000000000000000" + "0x1be3542c3613687465f15a70aeeb81662b65cca8": { + "balance": "0x6c6b935b8bbd400000" }, - "5803e68b34da121aef08b602badbafb4d12481ca": { - "balance": "18000000000000000000000" + "0x5803e68b34da121aef08b602badbafb4d12481ca": { + "balance": "0x3cfc82e37e9a7400000" }, - "9ac907ee85e6f3e223459992e256a43fa08fa8b2": { - "balance": "10000000000000000000000" + "0x9ac907ee85e6f3e223459992e256a43fa08fa8b2": { + "balance": "0x21e19e0c9bab2400000" }, - "833b6a8ec8da408186ac8a7d2a6dd61523e7ce84": { - "balance": "16000000000000000000000" + "0x833b6a8ec8da408186ac8a7d2a6dd61523e7ce84": { + "balance": "0x3635c9adc5dea000000" }, - "64628c6fb8ec743adbd87ce5e018d531d9210437": { - "balance": "26740000000000000000" + "0x64628c6fb8ec743adbd87ce5e018d531d9210437": { + "balance": "0x1731790534df20000" }, - "566c28e34c3808d9766fe8421ebf4f2b1c4f7d77": { - "balance": "1970000000000000000000" + "0x566c28e34c3808d9766fe8421ebf4f2b1c4f7d77": { + "balance": "0x6acb3df27e1f880000" }, - "171ad9a04bedc8b861e8ed4bddf5717813b1bb48": { - "balance": "400000000000000000000" + "0x171ad9a04bedc8b861e8ed4bddf5717813b1bb48": { + "balance": "0x15af1d78b58c400000" }, - "4f85bc1fc5cbc9c001e8f1372e07505370d8c71f": { - "balance": "940000000000000000000" + "0x4f85bc1fc5cbc9c001e8f1372e07505370d8c71f": { + "balance": "0x32f51edbaaa3300000" }, - "6d2f976734b9d0070d1883cf7acab8b3e4920fc1": { - "balance": "10000000000000000000000" + "0x6d2f976734b9d0070d1883cf7acab8b3e4920fc1": { + "balance": "0x21e19e0c9bab2400000" }, - "357a02c0a9dfe287de447fb67a70ec5b62366647": { - "balance": "26740000000000000000" + "0x357a02c0a9dfe287de447fb67a70ec5b62366647": { + "balance": "0x1731790534df20000" }, - "44a01fb04ac0db2cce5dbe281e1c46e28b39d878": { - "balance": "1999944000000000000000" + "0x44a01fb04ac0db2cce5dbe281e1c46e28b39d878": { + "balance": "0x6c6acc67d7b1d40000" }, - "3630c5e565ceaa8a0f0ffe32875eae2a6ce63c19": { - "balance": "170016000000000000000" + "0x3630c5e565ceaa8a0f0ffe32875eae2a6ce63c19": { + "balance": "0x937722b3774d00000" }, - "334340ee4b9cdc81f850a75116d50ee9b69825bf": { - "balance": "2000000000000000000000" + "0x334340ee4b9cdc81f850a75116d50ee9b69825bf": { + "balance": "0x6c6b935b8bbd400000" }, - "c0afb7d8b79370cfd663c68cc6b9702a37cd9eff": { - "balance": "1000000000000000000000" + "0xc0afb7d8b79370cfd663c68cc6b9702a37cd9eff": { + "balance": "0x3635c9adc5dea00000" }, - "2016895df32c8ed5478269468423aea7b7fbce50": { - "balance": "20000000000000000000" + "0x2016895df32c8ed5478269468423aea7b7fbce50": { + "balance": "0x1158e460913d00000" }, - "1e2fe4e4a77d141ff49a0c7fbc95b0a2b283eeeb": { - "balance": "2000000000000000000000" + "0x1e2fe4e4a77d141ff49a0c7fbc95b0a2b283eeeb": { + "balance": "0x6c6b935b8bbd400000" }, - "260df8943a8c9a5dba7945327fd7e0837c11ad07": { - "balance": "200000000000000000000" + "0x260df8943a8c9a5dba7945327fd7e0837c11ad07": { + "balance": "0xad78ebc5ac6200000" }, - "32fbeed6f626fcdfd51acafb730b9eeff612f564": { - "balance": "2000000000000000000000" + "0x32fbeed6f626fcdfd51acafb730b9eeff612f564": { + "balance": "0x6c6b935b8bbd400000" }, - "9bd88068e13075f3a8cac464a5f949d6d818c0f6": { - "balance": "6000000000000000000000" + "0x9bd88068e13075f3a8cac464a5f949d6d818c0f6": { + "balance": "0x14542ba12a337c00000" }, - "ab4572fbb1d72b575d69ec6ad17333873e8552fc": { - "balance": "1999942000000000000000" + "0xab4572fbb1d72b575d69ec6ad17333873e8552fc": { + "balance": "0x6c6ac54cda68470000" }, - "e44ea51063405154aae736be2bf1ee3b9be639ae": { - "balance": "4000000000000000000000" + "0xe44ea51063405154aae736be2bf1ee3b9be639ae": { + "balance": "0xd8d726b7177a800000" }, - "617f20894fa70e94a86a49cd74e03238f64d3cd9": { - "balance": "5000057000000000000000" + "0x617f20894fa70e94a86a49cd74e03238f64d3cd9": { + "balance": "0x10f0dbae61009528000" }, - "3e914e3018ac00449341c49da71d04dfeeed6221": { - "balance": "4000000000000000000000" + "0x3e914e3018ac00449341c49da71d04dfeeed6221": { + "balance": "0xd8d726b7177a800000" }, - "590181d445007bd0875aaf061c8d51153900836a": { - "balance": "2000000000000000000000" + "0x590181d445007bd0875aaf061c8d51153900836a": { + "balance": "0x6c6b935b8bbd400000" }, - "27987110221a880826adb2e7ab5eca78c6e31aec": { - "balance": "4000000000000000000000" + "0x27987110221a880826adb2e7ab5eca78c6e31aec": { + "balance": "0xd8d726b7177a800000" }, - "06618e9d5762df62028601a81d4487d6a0ecb80e": { - "balance": "1337000000000000000000" + "0x06618e9d5762df62028601a81d4487d6a0ecb80e": { + "balance": "0x487a9a304539440000" }, - "8cc652dd13e7fe14dabbb36d5d320db9ffee8a54": { - "balance": "1790000000000000000000" + "0x8cc652dd13e7fe14dabbb36d5d320db9ffee8a54": { + "balance": "0x61093d7c2c6d380000" }, - "8973aefd5efaee96095d9e288f6a046c97374b43": { - "balance": "141000000000000000000" + "0x8973aefd5efaee96095d9e288f6a046c97374b43": { + "balance": "0x7a4c4a0f332140000" }, - "dbd51cdf2c3bfacdff106221de2e19ad6d420414": { - "balance": "1760000000000000000000" + "0xdbd51cdf2c3bfacdff106221de2e19ad6d420414": { + "balance": "0x5f68e8131ecf800000" }, - "25697ef20cccaa70d32d376f8272d9c1070c3d78": { - "balance": "200000000000000000000" + "0x25697ef20cccaa70d32d376f8272d9c1070c3d78": { + "balance": "0xad78ebc5ac6200000" }, - "0726c42e00f45404836eb1e280d073e7059687f5": { - "balance": "1623331000000000000000" + "0x0726c42e00f45404836eb1e280d073e7059687f5": { + "balance": "0x58003e3fb947a38000" }, - "5e0785532c7723e4c0af9357d5274b73bdddddde": { - "balance": "25000088000000000000000" + "0x5e0785532c7723e4c0af9357d5274b73bdddddde": { + "balance": "0x54b41ea9bdb61dc0000" }, - "38430e931d93be01b4c3ef0dc535f1e0a9610063": { - "balance": "10000000000000000000000" + "0x38430e931d93be01b4c3ef0dc535f1e0a9610063": { + "balance": "0x21e19e0c9bab2400000" }, - "143d536b8b1cb84f56a39e0bc81fd5442bcacce1": { - "balance": "100000000000000000000" + "0x143d536b8b1cb84f56a39e0bc81fd5442bcacce1": { + "balance": "0x56bc75e2d63100000" }, - "5c6d041da7af4487b9dc48e8e1f60766d0a56dbc": { - "balance": "1457800000000000000000" + "0x5c6d041da7af4487b9dc48e8e1f60766d0a56dbc": { + "balance": "0x4f070a003e9c740000" }, - "f9bfb59d538afc4874d4f5941b08c9730e38e24b": { - "balance": "40000000000000000000" + "0xf9bfb59d538afc4874d4f5941b08c9730e38e24b": { + "balance": "0x22b1c8c1227a00000" }, - "83dbfd8eda01d0de8e158b16d0935fc2380a5dc7": { - "balance": "600000000000000000000" + "0x83dbfd8eda01d0de8e158b16d0935fc2380a5dc7": { + "balance": "0x2086ac351052600000" }, - "0e6cd664ad9c1ed64bf98749f40644b626e3792c": { - "balance": "60000000000000000000000" + "0x0e6cd664ad9c1ed64bf98749f40644b626e3792c": { + "balance": "0xcb49b44ba602d800000" }, - "ce2e0da8934699bb1a553e55a0b85c169435bea3": { - "balance": "4999962000000000000000" + "0xce2e0da8934699bb1a553e55a0b85c169435bea3": { + "balance": "0x10f0c696410e3a90000" }, - "a39bfee4aec9bd75bd22c6b672898ca9a1e95d32": { - "balance": "10000000000000000000000" + "0xa39bfee4aec9bd75bd22c6b672898ca9a1e95d32": { + "balance": "0x21e19e0c9bab2400000" }, - "1bc44c8761231ba1f11f5faa40fa669a013e12ce": { - "balance": "203586000000000000000" + "0x1bc44c8761231ba1f11f5faa40fa669a013e12ce": { + "balance": "0xb0952c45aeaad0000" }, - "68809af5d532a11c1a4d6e32aac75c4c52b08ead": { - "balance": "10000000000000000000000" + "0x68809af5d532a11c1a4d6e32aac75c4c52b08ead": { + "balance": "0x21e19e0c9bab2400000" }, - "80cc21bd99f39005c58fe4a448909220218f66cb": { - "balance": "1000072000000000000000" + "0x80cc21bd99f39005c58fe4a448909220218f66cb": { + "balance": "0x3636c9796436740000" }, - "1080c1d8358a15bc84dac8253c6883319020df2c": { - "balance": "2674000000000000000000" + "0x1080c1d8358a15bc84dac8253c6883319020df2c": { + "balance": "0x90f534608a72880000" }, - "9eaf6a328a4076024efa6b67b48b21eedcc0f0b8": { - "balance": "158000000000000000000" + "0x9eaf6a328a4076024efa6b67b48b21eedcc0f0b8": { + "balance": "0x890b0c2e14fb80000" }, - "1e7b5e4d1f572becf2c00fc90cb4767b4a6e33d4": { - "balance": "112970000000000000000" + "0x1e7b5e4d1f572becf2c00fc90cb4767b4a6e33d4": { + "balance": "0x61fc6107593e10000" }, - "acbd185589f7a68a67aa4b1bd65077f8c64e4e21": { - "balance": "200000000000000000000" + "0xacbd185589f7a68a67aa4b1bd65077f8c64e4e21": { + "balance": "0xad78ebc5ac6200000" }, - "ff78541756ab2b706e0d70b18adb700fc4f1643d": { - "balance": "43250000000000000000000" + "0xff78541756ab2b706e0d70b18adb700fc4f1643d": { + "balance": "0x92896529baddc880000" }, - "7f0ec3db804692d4d1ea3245365aab0590075bc4": { - "balance": "4000000000000000000000" + "0x7f0ec3db804692d4d1ea3245365aab0590075bc4": { + "balance": "0xd8d726b7177a800000" }, - "4a918032439159bb315b6725b6830dc83697739f": { - "balance": "343800000000000000000" + "0x4a918032439159bb315b6725b6830dc83697739f": { + "balance": "0x12a32ef678334c0000" }, - "bc1b021a78fde42d9b5226d6ec26e06aa3670090": { - "balance": "80000000000000000000" + "0xbc1b021a78fde42d9b5226d6ec26e06aa3670090": { + "balance": "0x4563918244f400000" }, - "2f2523cc834f0086052402626296675186a8e582": { - "balance": "16000000000000000000000" + "0x2f2523cc834f0086052402626296675186a8e582": { + "balance": "0x3635c9adc5dea000000" }, - "9db2e15ca681f4c66048f6f9b7941ed08b1ff506": { - "balance": "4000000000000000000000" + "0x9db2e15ca681f4c66048f6f9b7941ed08b1ff506": { + "balance": "0xd8d726b7177a800000" }, - "20b9a9e6bd8880d9994ae00dd0b9282a0beab816": { - "balance": "500000000000000000000" + "0x20b9a9e6bd8880d9994ae00dd0b9282a0beab816": { + "balance": "0x1b1ae4d6e2ef500000" }, - "3bddbc8134f77d55597fc97c26d26698090604eb": { - "balance": "13700000000000000000" + "0x3bddbc8134f77d55597fc97c26d26698090604eb": { + "balance": "0xbe202d6a0eda0000" }, - "80c3a9f695b16db1597286d1b3a8b7696c39fa27": { - "balance": "100000000000000000000" + "0x80c3a9f695b16db1597286d1b3a8b7696c39fa27": { + "balance": "0x56bc75e2d63100000" }, - "53194d8afa3e883502767edbc30586af33b114d3": { - "balance": "2000000000000000000000" + "0x53194d8afa3e883502767edbc30586af33b114d3": { + "balance": "0x6c6b935b8bbd400000" }, - "e2efd0a9bc407ece03d67e8ec8e9d283f48d2a49": { - "balance": "12280000000000000000000" + "0xe2efd0a9bc407ece03d67e8ec8e9d283f48d2a49": { + "balance": "0x299b33bf9c584e00000" }, - "1cb450920078aab2317c7db3b38af7dd298b2d41": { - "balance": "340000000000000000000" + "0x1cb450920078aab2317c7db3b38af7dd298b2d41": { + "balance": "0x126e72a69a50d00000" }, - "ca8276c477b4a07b80107b843594189607b53bec": { - "balance": "6000000000000000000000" + "0xca8276c477b4a07b80107b843594189607b53bec": { + "balance": "0x14542ba12a337c00000" }, - "147f4210ab5804940a0b7db8c14c28396b62a6bf": { - "balance": "2000000000000000000000" + "0x147f4210ab5804940a0b7db8c14c28396b62a6bf": { + "balance": "0x6c6b935b8bbd400000" }, - "d3df3b53cb3b4755de54e180451cc44c9e8ae0aa": { - "balance": "659801000000000000000" + "0xd3df3b53cb3b4755de54e180451cc44c9e8ae0aa": { + "balance": "0x23c49409b977828000" }, - "f7c708015071d4fb0a3a2a09a45d156396e3349e": { - "balance": "3000000000000000000000" + "0xf7c708015071d4fb0a3a2a09a45d156396e3349e": { + "balance": "0xa2a15d09519be00000" }, - "a8cafac32280d021020bf6f2a9782883d7aabe12": { - "balance": "100000000000000000000" + "0xa8cafac32280d021020bf6f2a9782883d7aabe12": { + "balance": "0x56bc75e2d63100000" }, - "399aa6f5d078cb0970882bc9992006f8fbdf3471": { - "balance": "1000000000000000000000" + "0x399aa6f5d078cb0970882bc9992006f8fbdf3471": { + "balance": "0x3635c9adc5dea00000" }, - "15669180dee29598869b08a721c7d24c4c0ee63f": { - "balance": "1000000000000000000000" + "0x15669180dee29598869b08a721c7d24c4c0ee63f": { + "balance": "0x3635c9adc5dea00000" }, - "bba8ab22d2fedbcfc63f684c08afdf1c175090b5": { - "balance": "99091000000000000000" + "0xbba8ab22d2fedbcfc63f684c08afdf1c175090b5": { + "balance": "0x55f29f37e4e3b8000" }, - "5e5a441974a83d74c687ebdc633fb1a49e7b1ad7": { - "balance": "3000000000000000000000" + "0x5e5a441974a83d74c687ebdc633fb1a49e7b1ad7": { + "balance": "0xa2a15d09519be00000" }, - "98b769cc305cecfb629a00c907069d7ef9bc3a12": { - "balance": "26000000000000000000" + "0x98b769cc305cecfb629a00c907069d7ef9bc3a12": { + "balance": "0x168d28e3f00280000" }, - "c820c711f07705273807aaaa6de44d0e4b48be2e": { - "balance": "155000000000000000000" + "0xc820c711f07705273807aaaa6de44d0e4b48be2e": { + "balance": "0x8670e9ec6598c0000" }, - "12aa7d86ddfbad301692feac8a08f841cb215c37": { - "balance": "137000000000000000000" + "0x12aa7d86ddfbad301692feac8a08f841cb215c37": { + "balance": "0x76d41c62494840000" }, - "6ff5d361b52ad0b68b1588607ec304ae5665fc98": { - "balance": "1940000000000000000000" + "0x6ff5d361b52ad0b68b1588607ec304ae5665fc98": { + "balance": "0x692ae8897081d00000" }, - "2382a9d48ec83ea3652890fd0ee79c907b5b2dc1": { - "balance": "133700000000000000000" + "0x2382a9d48ec83ea3652890fd0ee79c907b5b2dc1": { + "balance": "0x73f75d1a085ba0000" }, - "b2a144b1ea67b9510f2267f9da39d3f93de26642": { - "balance": "2000000000000000000000" + "0xb2a144b1ea67b9510f2267f9da39d3f93de26642": { + "balance": "0x6c6b935b8bbd400000" }, - "b3e20eb4de18bd060221689894bee5aeb25351ee": { - "balance": "73535000000000000000" + "0xb3e20eb4de18bd060221689894bee5aeb25351ee": { + "balance": "0x3fc80cce516598000" }, - "101a0a64f9afcc448a8a130d4dfcbee89537d854": { - "balance": "15200000000000000000000" + "0x101a0a64f9afcc448a8a130d4dfcbee89537d854": { + "balance": "0x337fe5feaf2d1800000" }, - "1b826fb3c012b0d159e294ba5b8a499ff3c0e03c": { - "balance": "2000000000000000000000" + "0x1b826fb3c012b0d159e294ba5b8a499ff3c0e03c": { + "balance": "0x6c6b935b8bbd400000" }, - "aafb7b013aa1f8541c7e327bf650adbd194c208f": { - "balance": "1358000000000000000000" + "0xaafb7b013aa1f8541c7e327bf650adbd194c208f": { + "balance": "0x499e092d01f4780000" }, - "96eb523e832f500a017de13ec27f5d366c560eff": { - "balance": "307600000000000000000" + "0x96eb523e832f500a017de13ec27f5d366c560eff": { + "balance": "0x10acceba43ee280000" }, - "c7bf17c4c11f98941f507e77084fffbd2dbd3db5": { - "balance": "1000000000000000000000" + "0xc7bf17c4c11f98941f507e77084fffbd2dbd3db5": { + "balance": "0x3635c9adc5dea00000" }, - "840ec83ea93621f034e7bb3762bb8e29ded4c479": { - "balance": "2500000000000000000000" + "0x840ec83ea93621f034e7bb3762bb8e29ded4c479": { + "balance": "0x878678326eac900000" }, - "0e9c511864a177f49be78202773f60489fe04e52": { - "balance": "6000000000000000000000" + "0x0e9c511864a177f49be78202773f60489fe04e52": { + "balance": "0x14542ba12a337c00000" }, - "f6f1a44309051c6b25e47dff909b179bb9ab591c": { - "balance": "1940000000000000000000" + "0xf6f1a44309051c6b25e47dff909b179bb9ab591c": { + "balance": "0x692ae8897081d00000" }, - "63fe6bcc4b8a9850abbe75803730c932251f145b": { - "balance": "18200000000000000000" + "0x63fe6bcc4b8a9850abbe75803730c932251f145b": { + "balance": "0xfc936392801c0000" }, - "f88b58db37420b464c0be88b45ee2b95290f8cfa": { - "balance": "40000000000000000000" + "0xf88b58db37420b464c0be88b45ee2b95290f8cfa": { + "balance": "0x22b1c8c1227a00000" }, - "9d4d321177256ebd9afbda304135d517c3dc5693": { - "balance": "616000000000000000000" + "0x9d4d321177256ebd9afbda304135d517c3dc5693": { + "balance": "0x2164b7a04ac8a00000" }, - "8c1fbe5f0aea359c5aa1fa08c8895412ca8e05a6": { - "balance": "1000000000000000000000" + "0x8c1fbe5f0aea359c5aa1fa08c8895412ca8e05a6": { + "balance": "0x3635c9adc5dea00000" }, - "cb0dd7cf4e5d8661f6028943a4b9b75c914436a7": { - "balance": "120000000000000000000000" + "0xcb0dd7cf4e5d8661f6028943a4b9b75c914436a7": { + "balance": "0x1969368974c05b000000" }, - "a3979a92760a135adf69d72f75e167755f1cb8c3": { - "balance": "100000000000000000000" + "0xa3979a92760a135adf69d72f75e167755f1cb8c3": { + "balance": "0x56bc75e2d63100000" }, - "ca22cda3606da5cad013b8074706d7e9e721a50c": { - "balance": "6816200000000000000000" + "0xca22cda3606da5cad013b8074706d7e9e721a50c": { + "balance": "0x17181c6fa3981940000" }, - "157559adc55764cc6df79323092534e3d6645a66": { - "balance": "6000000000000000000000" + "0x157559adc55764cc6df79323092534e3d6645a66": { + "balance": "0x14542ba12a337c00000" }, - "4f52ad6170d25b2a2e850eadbb52413ff2303e7f": { - "balance": "3040000000000000000000" + "0x4f52ad6170d25b2a2e850eadbb52413ff2303e7f": { + "balance": "0xa4cc799563c3800000" }, - "eed28c3f068e094a304b853c950a6809ebcb03e0": { - "balance": "17300000000000000000000" + "0xeed28c3f068e094a304b853c950a6809ebcb03e0": { + "balance": "0x3a9d5baa4abf1d00000" }, - "2e47f287f498233713850d3126823cc67dcee255": { - "balance": "14600000000000000000" + "0x2e47f287f498233713850d3126823cc67dcee255": { + "balance": "0xca9d9ea558b40000" }, - "6c359e58a13d4578a9338e335c67e7639f5fb4d7": { - "balance": "218000000000000000000" + "0x6c359e58a13d4578a9338e335c67e7639f5fb4d7": { + "balance": "0xbd15b94fc8b280000" }, - "4968a2cedb457555a139295aea28776e54003c87": { - "balance": "10092310000000000000000" + "0x4968a2cedb457555a139295aea28776e54003c87": { + "balance": "0x2231aefc9a6628f0000" }, - "4041374b0feef4792e4b33691fb86897a4ff560c": { - "balance": "365000000000000000000" + "0x4041374b0feef4792e4b33691fb86897a4ff560c": { + "balance": "0x13c9647e25a9940000" }, - "83e48055327c28b5936fd9f4447e73bdb2dd3376": { - "balance": "2674000000000000000000" + "0x83e48055327c28b5936fd9f4447e73bdb2dd3376": { + "balance": "0x90f534608a72880000" }, - "32b7feebc5c59bf65e861c4c0be42a7611a5541a": { - "balance": "2212000000000000000000" + "0x32b7feebc5c59bf65e861c4c0be42a7611a5541a": { + "balance": "0x77e9aaa8525c100000" }, - "21a6db6527467bc6dad54bc16e9fe2953b6794ed": { - "balance": "14000000000000000000000" + "0x21a6db6527467bc6dad54bc16e9fe2953b6794ed": { + "balance": "0x2f6f10780d22cc00000" }, - "e8ead1bb90ccc3aea2b0dcc5b58056554655d1d5": { - "balance": "7760000000000000000000" + "0xe8ead1bb90ccc3aea2b0dcc5b58056554655d1d5": { + "balance": "0x1a4aba225c207400000" }, - "7a94b19992ceb8ce63bc92ee4b5aded10c4d9725": { - "balance": "16770000000000000000000" + "0x7a94b19992ceb8ce63bc92ee4b5aded10c4d9725": { + "balance": "0x38d1a8064bb64c80000" }, - "90e93e4dc17121487952333614002be42356498e": { - "balance": "1910000000000000000000" + "0x90e93e4dc17121487952333614002be42356498e": { + "balance": "0x678a932062e4180000" }, - "aab00abf5828d7ebf26b47ceaccdb8ba03325166": { - "balance": "10000000000000000000000" + "0xaab00abf5828d7ebf26b47ceaccdb8ba03325166": { + "balance": "0x21e19e0c9bab2400000" }, - "0a9ab2638b1cfd654d25dab018a0aebddf85fd55": { - "balance": "21801000000000000000" + "0x0a9ab2638b1cfd654d25dab018a0aebddf85fd55": { + "balance": "0x12e8cb5fe4c4a8000" }, - "b12ed07b8a38ad5506363fc07a0b6d799936bdaf": { - "balance": "10000000000000000000000" + "0xb12ed07b8a38ad5506363fc07a0b6d799936bdaf": { + "balance": "0x21e19e0c9bab2400000" }, - "f4a9d00cefa97b7a58ef9417fc6267a5069039ee": { - "balance": "21800000000000000000" + "0xf4a9d00cefa97b7a58ef9417fc6267a5069039ee": { + "balance": "0x12e89287fa7840000" }, - "04a1cada1cc751082ff8da928e3cfa000820a9e9": { - "balance": "40000000000000000000" + "0x04a1cada1cc751082ff8da928e3cfa000820a9e9": { + "balance": "0x22b1c8c1227a00000" }, - "9018cc1f48d2308e252ab6089fb99a7c1d569410": { - "balance": "200000000000000000000" + "0x9018cc1f48d2308e252ab6089fb99a7c1d569410": { + "balance": "0xad78ebc5ac6200000" }, - "895d694e880b13ccd0848a86c5ce411f88476bbf": { - "balance": "199955000000000000000" + "0x895d694e880b13ccd0848a86c5ce411f88476bbf": { + "balance": "0xad6eedd17cf3b8000" }, - "40a7f72867a7dc86770b162b7557a434ed50cce9": { - "balance": "1000000000000000000000" + "0x40a7f72867a7dc86770b162b7557a434ed50cce9": { + "balance": "0x3635c9adc5dea00000" }, - "467ea10445827ef1e502daf76b928a209e0d4032": { - "balance": "2000000000000000000000" + "0x467ea10445827ef1e502daf76b928a209e0d4032": { + "balance": "0x6c6b935b8bbd400000" }, - "7553aa23b68aa5f57e135fe39fdc235eaca8c98c": { - "balance": "1000000000000000000000" + "0x7553aa23b68aa5f57e135fe39fdc235eaca8c98c": { + "balance": "0x3635c9adc5dea00000" }, - "31b43b015d0081643c6cda46a7073a6dfdbca825": { - "balance": "50019600000000000000000" + "0x31b43b015d0081643c6cda46a7073a6dfdbca825": { + "balance": "0xa97916520cd18e80000" }, - "d82fd9fdf6996bedad2843159c06f37e0924337d": { - "balance": "1688800000000000000000" + "0xd82fd9fdf6996bedad2843159c06f37e0924337d": { + "balance": "0x5b8ccedc5aa7b00000" }, - "24a4eb36a7e498c36f99975c1a8d729fd6b305d7": { - "balance": "258000000000000000000" + "0x24a4eb36a7e498c36f99975c1a8d729fd6b305d7": { + "balance": "0xdfc78210eb2c80000" }, - "91d66ea6288faa4b3d606c2aa45c7b6b8a252739": { - "balance": "2000000000000000000000" + "0x91d66ea6288faa4b3d606c2aa45c7b6b8a252739": { + "balance": "0x6c6b935b8bbd400000" }, - "83a402438e0519773d5448326bfb61f8b20cf52d": { - "balance": "1520000000000000000000" + "0x83a402438e0519773d5448326bfb61f8b20cf52d": { + "balance": "0x52663ccab1e1c00000" }, - "c2fafdd30acb6d6706e9293cb02641f9edbe07b5": { - "balance": "1494224000000000000000" + "0xc2fafdd30acb6d6706e9293cb02641f9edbe07b5": { + "balance": "0x5100860b430f480000" }, - "79dba256472db4e058f2e4cdc3ea4e8a42773833": { - "balance": "1460000000000000000000" + "0x79dba256472db4e058f2e4cdc3ea4e8a42773833": { + "balance": "0x4f2591f896a6500000" }, - "498abdeb14c26b7b7234d70fceaef361a76dff72": { - "balance": "3000000000000000000000" + "0x498abdeb14c26b7b7234d70fceaef361a76dff72": { + "balance": "0xa2a15d09519be00000" }, - "7b73242d75ca9ad558d650290df17692d54cd8b8": { - "balance": "2000200000000000000000" + "0x7b73242d75ca9ad558d650290df17692d54cd8b8": { + "balance": "0x6c6e59e67c78540000" }, - "6ec3659571b11f889dd439bcd4d67510a25be57e": { - "balance": "123000000000000000000" + "0x6ec3659571b11f889dd439bcd4d67510a25be57e": { + "balance": "0x6aaf7c8516d0c0000" }, - "ab098633eeee0ccefdf632f9575456f6dd80fc86": { - "balance": "200000000000000000000000" + "0xab098633eeee0ccefdf632f9575456f6dd80fc86": { + "balance": "0x2a5a058fc295ed000000" }, - "f4a51fce4a1d5b94b0718389ba4e7814139ca738": { - "balance": "300000000000000000000" + "0xf4a51fce4a1d5b94b0718389ba4e7814139ca738": { + "balance": "0x1043561a8829300000" }, - "8f561b41b209f248c8a99f858788376250609cf3": { - "balance": "1700000000000000000000" + "0x8f561b41b209f248c8a99f858788376250609cf3": { + "balance": "0x5c283d410394100000" }, - "05d0f4d728ebe82e84bf597515ad41b60bf28b39": { - "balance": "4200000000000000000000" + "0x05d0f4d728ebe82e84bf597515ad41b60bf28b39": { + "balance": "0xe3aeb5737240a00000" }, - "dfdf43393c649caebe1bb18059decb39f09fb4e8": { - "balance": "400000000000000000000" + "0xdfdf43393c649caebe1bb18059decb39f09fb4e8": { + "balance": "0x15af1d78b58c400000" }, - "0089508679abf8c71bf6781687120e3e6a84584d": { - "balance": "1800000000000000000000" + "0x0089508679abf8c71bf6781687120e3e6a84584d": { + "balance": "0x6194049f30f7200000" }, - "80907f593148b57c46c177e23d25abc4aae18361": { - "balance": "100000000000000000000" + "0x80907f593148b57c46c177e23d25abc4aae18361": { + "balance": "0x56bc75e2d63100000" }, - "94fcceadfe5c109c5eaeaf462d43873142c88e22": { - "balance": "4800000000000000000000" + "0x94fcceadfe5c109c5eaeaf462d43873142c88e22": { + "balance": "0x1043561a88293000000" }, - "e89249738b7eced7cb666a663c49cbf6de8343ea": { - "balance": "2000000000000000000000" + "0xe89249738b7eced7cb666a663c49cbf6de8343ea": { + "balance": "0x6c6b935b8bbd400000" }, - "23c99ba087448e19c9701df66e0cab52368331fa": { - "balance": "2000000000000000000000" + "0x23c99ba087448e19c9701df66e0cab52368331fa": { + "balance": "0x6c6b935b8bbd400000" }, - "a68e0c30cba3bc5a883e540320f999c7cd558e5c": { - "balance": "1799869000000000000000" + "0xa68e0c30cba3bc5a883e540320f999c7cd558e5c": { + "balance": "0x6192333762a58c8000" }, - "88888a57bd9687cbf950aeeacf9740dcc4d1ef59": { - "balance": "1820000000000000000000" + "0x88888a57bd9687cbf950aeeacf9740dcc4d1ef59": { + "balance": "0x62a992e53a0af00000" }, - "e9b36fe9b51412ddca1a521d6e94bc901213dda8": { - "balance": "10000000000000000000000" + "0xe9b36fe9b51412ddca1a521d6e94bc901213dda8": { + "balance": "0x21e19e0c9bab2400000" }, - "a9145046fa3628cf5fd4c613927be531e6db1fdd": { - "balance": "112000000000000000000" + "0xa9145046fa3628cf5fd4c613927be531e6db1fdd": { + "balance": "0x6124fee993bc00000" }, - "e82c58c579431b673546b53a86459acaf1de9b93": { - "balance": "1000000000000000000000" + "0xe82c58c579431b673546b53a86459acaf1de9b93": { + "balance": "0x3635c9adc5dea00000" }, - "bd6a474d66345bcdd707594adb63b30c7822af54": { - "balance": "4000000000000000000000" + "0xbd6a474d66345bcdd707594adb63b30c7822af54": { + "balance": "0xd8d726b7177a800000" }, - "6a6159074ab573e0ee581f0f3df2d6a594629b74": { - "balance": "310000000000000000000" + "0x6a6159074ab573e0ee581f0f3df2d6a594629b74": { + "balance": "0x10ce1d3d8cb3180000" }, - "2e7f465520ec35cc23d68e75651bb6689544a196": { - "balance": "1050049000000000000000" + "0x2e7f465520ec35cc23d68e75651bb6689544a196": { + "balance": "0x38ec5b721a1a268000" }, - "ac6d02e9a46b379fac4ac9b1d7b5d47bc850ce16": { - "balance": "1760000000000000000000" + "0xac6d02e9a46b379fac4ac9b1d7b5d47bc850ce16": { + "balance": "0x5f68e8131ecf800000" }, - "bd59094e074f8d79142ab1489f148e32151f2089": { - "balance": "20000000000000000000" + "0xbd59094e074f8d79142ab1489f148e32151f2089": { + "balance": "0x1158e460913d00000" }, - "0ba6e46af25a13f57169255a34a4dac7ce12be04": { - "balance": "500000000000000000000" + "0x0ba6e46af25a13f57169255a34a4dac7ce12be04": { + "balance": "0x1b1ae4d6e2ef500000" }, - "35145f620397c69cb8e00962961f0f4886643989": { - "balance": "6000000000000000000000" + "0x35145f620397c69cb8e00962961f0f4886643989": { + "balance": "0x14542ba12a337c00000" }, - "d84b922f7841fc5774f00e14604ae0df42c8551e": { - "balance": "4011000000000000000000" + "0xd84b922f7841fc5774f00e14604ae0df42c8551e": { + "balance": "0xd96fce90cfabcc0000" }, - "44232ff66ddad1fd841266380036afd7cf7d7f42": { - "balance": "200000000000000000000" + "0x44232ff66ddad1fd841266380036afd7cf7d7f42": { + "balance": "0xad78ebc5ac6200000" }, - "516954025fca2608f47da81c215eedfd844a09ff": { - "balance": "382000000000000000000" + "0x516954025fca2608f47da81c215eedfd844a09ff": { + "balance": "0x14b550a013c7380000" }, - "e5aa0b833bb916dc19a8dd683f0ede241d988eba": { - "balance": "3000000000000000000000" + "0xe5aa0b833bb916dc19a8dd683f0ede241d988eba": { + "balance": "0xa2a15d09519be00000" }, - "80ea1acc136eca4b68c842a95adf6b7fee7eb8a2": { - "balance": "4000000000000000000000" + "0x80ea1acc136eca4b68c842a95adf6b7fee7eb8a2": { + "balance": "0xd8d726b7177a800000" }, - "98a0e54c6d9dc8be96276cebf4fec460f6235d85": { - "balance": "1969803000000000000000" + "0x98a0e54c6d9dc8be96276cebf4fec460f6235d85": { + "balance": "0x6ac882100952c78000" }, - "91620f3eb304e813d28b0297556d65dc4e5de5aa": { - "balance": "3820000000000000000000" + "0x91620f3eb304e813d28b0297556d65dc4e5de5aa": { + "balance": "0xcf152640c5c8300000" }, - "7bb984c6dbb9e279966afafda59c01d02627c804": { - "balance": "8050000000000000000000" + "0x7bb984c6dbb9e279966afafda59c01d02627c804": { + "balance": "0x1b464311d45a6880000" }, - "41f489a1ec747bc29c3e5f9d8db97877d4d1b4e9": { - "balance": "133700000000000000000" + "0x41f489a1ec747bc29c3e5f9d8db97877d4d1b4e9": { + "balance": "0x73f75d1a085ba0000" }, - "8dbc3e6cb433e194f40f82b40faadb1f8b856116": { - "balance": "1910000000000000000000" + "0x8dbc3e6cb433e194f40f82b40faadb1f8b856116": { + "balance": "0x678a932062e4180000" }, - "889da40fb1b60f9ea9bd7a453e584cf7b1b4d9f7": { - "balance": "40000000000000000000" + "0x889da40fb1b60f9ea9bd7a453e584cf7b1b4d9f7": { + "balance": "0x22b1c8c1227a00000" }, - "debbdd831e0f20ae6e378252decdf92f7cf0c658": { - "balance": "2000000000000000000000" + "0xdebbdd831e0f20ae6e378252decdf92f7cf0c658": { + "balance": "0x6c6b935b8bbd400000" }, - "a22ade0ddb5c6ef8d0cd8de94d82b11082cb2e91": { - "balance": "1020000000000000000000" + "0xa22ade0ddb5c6ef8d0cd8de94d82b11082cb2e91": { + "balance": "0x374b57f3cef2700000" }, - "823219a25976bb2aa4af8bad41ac3526b493361f": { - "balance": "2000000000000000000000" + "0x823219a25976bb2aa4af8bad41ac3526b493361f": { + "balance": "0x6c6b935b8bbd400000" }, - "6d39a9e98f81f769d73aad2cead276ac1387babe": { - "balance": "394000000000000000000" + "0x6d39a9e98f81f769d73aad2cead276ac1387babe": { + "balance": "0x155bd9307f9fe80000" }, - "751abcb6cc033059911815c96fd191360ab0442d": { - "balance": "8000000000000000000000" + "0x751abcb6cc033059911815c96fd191360ab0442d": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "64d80c3b8ba68282290b75e65d8978a15a87782c": { - "balance": "1970000000000000000000" + "0x64d80c3b8ba68282290b75e65d8978a15a87782c": { + "balance": "0x6acb3df27e1f880000" }, - "6ba8f7e25fc2d871618e24e40184199137f9f6aa": { - "balance": "400020000000000000000" + "0x6ba8f7e25fc2d871618e24e40184199137f9f6aa": { + "balance": "0x15af64869a6bc20000" }, - "25a74c2ac75dc8baa8b31a9c7cb4b7829b2456da": { - "balance": "2000000000000000000000" + "0x25a74c2ac75dc8baa8b31a9c7cb4b7829b2456da": { + "balance": "0x6c6b935b8bbd400000" }, - "0f7b61c59b016322e8226cafaee9d9e76d50a1b3": { - "balance": "4000000000000000000000" + "0x0f7b61c59b016322e8226cafaee9d9e76d50a1b3": { + "balance": "0xd8d726b7177a800000" }, - "7526e482529f0a14eec98871dddd0e721b0cd9a2": { - "balance": "20000000000000000000" + "0x7526e482529f0a14eec98871dddd0e721b0cd9a2": { + "balance": "0x1158e460913d00000" }, - "071dd90d14d41f4ff7c413c24238d3359cd61a07": { - "balance": "36400000000000000000000" + "0x071dd90d14d41f4ff7c413c24238d3359cd61a07": { + "balance": "0x7b53f79e888dac00000" }, - "a986762f7a4f294f2e0b173279ad2c81a2223458": { - "balance": "20000000000000000000" + "0xa986762f7a4f294f2e0b173279ad2c81a2223458": { + "balance": "0x1158e460913d00000" }, - "e667f652f957c28c0e66d0b63417c80c8c9db878": { - "balance": "601650000000000000000" + "0xe667f652f957c28c0e66d0b63417c80c8c9db878": { + "balance": "0x209d922f5259c50000" }, - "7b98e23cb96beee80a168069ebba8f20edd55ccf": { - "balance": "214500000000000000000" + "0x7b98e23cb96beee80a168069ebba8f20edd55ccf": { + "balance": "0xba0c91587c14a0000" }, - "2d8e5bb8d3521695c77e7c834e0291bfacee7408": { - "balance": "1970000000000000000000" + "0x2d8e5bb8d3521695c77e7c834e0291bfacee7408": { + "balance": "0x6acb3df27e1f880000" }, - "f23d01589eb12d439f7448ff54307529f191858d": { - "balance": "2000000000000000000000" + "0xf23d01589eb12d439f7448ff54307529f191858d": { + "balance": "0x6c6b935b8bbd400000" }, - "abd9605b3e91acfd777830d16463478ae0fc7720": { - "balance": "133700000000000000000" + "0xabd9605b3e91acfd777830d16463478ae0fc7720": { + "balance": "0x73f75d1a085ba0000" }, - "eabb90d37989aab31feae547e0e6f3999ce6a35d": { - "balance": "2000000000000000000000" + "0xeabb90d37989aab31feae547e0e6f3999ce6a35d": { + "balance": "0x6c6b935b8bbd400000" }, - "0abfb39b11486d79572866195ba26c630b6784db": { - "balance": "121500000000000000000000" + "0x0abfb39b11486d79572866195ba26c630b6784db": { + "balance": "0x19ba8737f96928f00000" }, - "d56a144d7af0ae8df649abae535a15983aa04d02": { - "balance": "5000000000000000000000" + "0xd56a144d7af0ae8df649abae535a15983aa04d02": { + "balance": "0x10f0cf064dd59200000" }, - "998c1f93bcdb6ff23c10d0dc924728b73be2ff9f": { - "balance": "1002750000000000000000" + "0x998c1f93bcdb6ff23c10d0dc924728b73be2ff9f": { + "balance": "0x365bf3a433eaf30000" }, - "bc62b3096a91e7dc11a1592a293dd2542150d751": { - "balance": "1000000000000000000000" + "0xbc62b3096a91e7dc11a1592a293dd2542150d751": { + "balance": "0x3635c9adc5dea00000" }, - "0c8f66c6017bce5b20347204b602b743bad78d60": { - "balance": "2000000000000000000000" + "0x0c8f66c6017bce5b20347204b602b743bad78d60": { + "balance": "0x6c6b935b8bbd400000" }, - "4c5b3dc0e2b9360f91289b1fe13ce12c0fbda3e1": { - "balance": "2000000000000000000000" + "0x4c5b3dc0e2b9360f91289b1fe13ce12c0fbda3e1": { + "balance": "0x6c6b935b8bbd400000" }, - "b44605552471a6eee4daab71ff3bb41326d473e0": { - "balance": "839200000000000000000" + "0xb44605552471a6eee4daab71ff3bb41326d473e0": { + "balance": "0x2d7e3d51ba53d00000" }, - "fc3d226bb36a58f526568857b0bb12d109ec9301": { - "balance": "2000000000000000000000" + "0xfc3d226bb36a58f526568857b0bb12d109ec9301": { + "balance": "0x6c6b935b8bbd400000" }, - "adc8228ef928e18b2a807d00fb3c6c79cd1d9e96": { - "balance": "22800000000000000000" + "0xadc8228ef928e18b2a807d00fb3c6c79cd1d9e96": { + "balance": "0x13c69df334ee80000" }, - "9df32a501c0b781c0281022f42a1293ffd7b892a": { - "balance": "9000000000000000000000" + "0x9df32a501c0b781c0281022f42a1293ffd7b892a": { + "balance": "0x1e7e4171bf4d3a00000" }, - "e7da609d40cde80f00ce5b4ffb6aa9d0b03494fc": { - "balance": "1000000000000000000000" + "0xe7da609d40cde80f00ce5b4ffb6aa9d0b03494fc": { + "balance": "0x3635c9adc5dea00000" }, - "9b64d3cd8d2b73f66841b5c46bb695b88a9ab75d": { - "balance": "20769000000000000000" + "0x9b64d3cd8d2b73f66841b5c46bb695b88a9ab75d": { + "balance": "0x1203a4f760c168000" }, - "8e9c08f738661f9676236eff82ba6261dd3f4822": { - "balance": "100000000000000000000" + "0x8e9c08f738661f9676236eff82ba6261dd3f4822": { + "balance": "0x56bc75e2d63100000" }, - "deb97254474c0d2f5a7970dcdb2f52fb1098b896": { - "balance": "1000000000000000000000" + "0xdeb97254474c0d2f5a7970dcdb2f52fb1098b896": { + "balance": "0x3635c9adc5dea00000" }, - "b4256273962bf631d014555cc1da0dcc31616b49": { - "balance": "2000000000000000000000" + "0xb4256273962bf631d014555cc1da0dcc31616b49": { + "balance": "0x6c6b935b8bbd400000" }, - "23abd9e93e7957e5b636be6579051c15e5ce0b0e": { - "balance": "17188400000000000000000" + "0x23abd9e93e7957e5b636be6579051c15e5ce0b0e": { + "balance": "0x3a3c8f7cbf42c380000" }, - "382591e7217b435e8e884cdbf415fe377a6fe29e": { - "balance": "8022000000000000000000" + "0x382591e7217b435e8e884cdbf415fe377a6fe29e": { + "balance": "0x1b2df9d219f57980000" }, - "f17adb740f45cbbde3094e7e13716f8103f563bd": { - "balance": "2000000000000000000000" + "0xf17adb740f45cbbde3094e7e13716f8103f563bd": { + "balance": "0x6c6b935b8bbd400000" }, - "61ed5596c697207f3d55b2a51aa7d50f07fa09e8": { - "balance": "2000000000000000000000" + "0x61ed5596c697207f3d55b2a51aa7d50f07fa09e8": { + "balance": "0x6c6b935b8bbd400000" }, - "788e809741a3b14a22a4b1d937c82cfea489eebe": { - "balance": "7000000000000000000000" + "0x788e809741a3b14a22a4b1d937c82cfea489eebe": { + "balance": "0x17b7883c06916600000" }, - "992646ac1acaabf5ddaba8f9429aa6a94e7496a7": { - "balance": "1000110000000000000000" + "0x992646ac1acaabf5ddaba8f9429aa6a94e7496a7": { + "balance": "0x3637507a30abeb0000" }, - "51296f5044270d17707646129c86aad1645eadc1": { - "balance": "1337133000000000000000" + "0x51296f5044270d17707646129c86aad1645eadc1": { + "balance": "0x487c72b310d4648000" }, - "6ee8aad7e0a065d8852d7c3b9a6e5fdc4bf50c00": { - "balance": "20000000000000000000" + "0x6ee8aad7e0a065d8852d7c3b9a6e5fdc4bf50c00": { + "balance": "0x1158e460913d00000" }, - "30db6b9b107e62102f434a9dd0960c2021f5ce4c": { - "balance": "599742000000000000000" + "0x30db6b9b107e62102f434a9dd0960c2021f5ce4c": { + "balance": "0x2083179b6e42530000" }, - "63fc93001305adfbc9b85d29d9291a05f8f1410b": { - "balance": "1000000000000000000000" + "0x63fc93001305adfbc9b85d29d9291a05f8f1410b": { + "balance": "0x3635c9adc5dea00000" }, - "df6ed6006a6abe886ed33d95a4de28fc12183927": { - "balance": "910000000000000000000" + "0xdf6ed6006a6abe886ed33d95a4de28fc12183927": { + "balance": "0x3154c9729d05780000" }, - "4745ab181a36aa8cbf2289d0c45165bc7ebe2381": { - "balance": "39400000000000000000" + "0x4745ab181a36aa8cbf2289d0c45165bc7ebe2381": { + "balance": "0x222c8eb3ff6640000" }, - "7bb0fdf5a663b5fba28d9c902af0c811e252f298": { - "balance": "200000000000000000000" + "0x7bb0fdf5a663b5fba28d9c902af0c811e252f298": { + "balance": "0xad78ebc5ac6200000" }, - "e0ff0bd9154439c4a5b7233e291d7d868af53f33": { - "balance": "396110000000000000000" + "0xe0ff0bd9154439c4a5b7233e291d7d868af53f33": { + "balance": "0x1579216a51bbfb0000" }, - "09261f9acb451c3788844f0c1451a35bad5098e3": { - "balance": "8664000000000000000000" + "0x09261f9acb451c3788844f0c1451a35bad5098e3": { + "balance": "0x1d5ad27502920600000" }, - "2813d263fc5ff2479e970595d6b6b560f8d6d6d1": { - "balance": "2000000000000000000000" + "0x2813d263fc5ff2479e970595d6b6b560f8d6d6d1": { + "balance": "0x6c6b935b8bbd400000" }, - "2cd19694d1926a0fa9189edebafc671cf1b2caa5": { - "balance": "1000000000000000000000" + "0x2cd19694d1926a0fa9189edebafc671cf1b2caa5": { + "balance": "0x3635c9adc5dea00000" }, - "05336e9a722728d963e7a1cf2759fd0274530fca": { - "balance": "915583000000000000000" + "0x05336e9a722728d963e7a1cf2759fd0274530fca": { + "balance": "0x31a2443f888a798000" }, - "e5b7af146986c0ff8f85d22e6cc334077d84e824": { - "balance": "2000000000000000000000" + "0xe5b7af146986c0ff8f85d22e6cc334077d84e824": { + "balance": "0x6c6b935b8bbd400000" }, - "3e4fbd661015f6461ed6735cefef01f31445de3a": { - "balance": "16200000000000000000000" + "0x3e4fbd661015f6461ed6735cefef01f31445de3a": { + "balance": "0x36e342998b8b0200000" }, - "4f5df5b94357de948604c51b7893cddf6076baad": { - "balance": "3760000000000000000000" + "0x4f5df5b94357de948604c51b7893cddf6076baad": { + "balance": "0xcbd47b6eaa8cc00000" }, - "9567a0de811de6ff095b7ee64e7f1b83c2615b80": { - "balance": "267400000000000000000" + "0x9567a0de811de6ff095b7ee64e7f1b83c2615b80": { + "balance": "0xe7eeba3410b740000" }, - "955db3b74360b9a268677e73cea821668af6face": { - "balance": "30000000000000000000000" + "0x955db3b74360b9a268677e73cea821668af6face": { + "balance": "0x65a4da25d3016c00000" }, - "3e040d40cb80ba0125f3b15fdefcc83f3005da1b": { - "balance": "1038000000000000000000" + "0x3e040d40cb80ba0125f3b15fdefcc83f3005da1b": { + "balance": "0x384524cc70b7780000" }, - "43f470ed659e2991c375957e5ddec5bd1d382231": { - "balance": "100000000000000000000" + "0x43f470ed659e2991c375957e5ddec5bd1d382231": { + "balance": "0x56bc75e2d63100000" }, - "047f9bf1529daf87d407175e6f171b5e59e9ff3e": { - "balance": "650000000000000000000" + "0x047f9bf1529daf87d407175e6f171b5e59e9ff3e": { + "balance": "0x233c8fe42703e80000" }, - "15e3b584056b62c973cf5eb096f1733e54c15c91": { - "balance": "936702000000000000000" + "0x15e3b584056b62c973cf5eb096f1733e54c15c91": { + "balance": "0x32c75a0223ddf30000" }, - "c03de42a109b657a64e92224c08dc1275e80d9b2": { - "balance": "20000000000000000000" + "0xc03de42a109b657a64e92224c08dc1275e80d9b2": { + "balance": "0x1158e460913d00000" }, - "e4fc13cfcbac1b17ce7783acd423a845943f6b3a": { - "balance": "20000000000000000000" + "0xe4fc13cfcbac1b17ce7783acd423a845943f6b3a": { + "balance": "0x1158e460913d00000" }, - "65ff874fafce4da318d6c93d57e2c38a0d73e820": { - "balance": "1000160000000000000000" + "0x65ff874fafce4da318d6c93d57e2c38a0d73e820": { + "balance": "0x3638021cecdab00000" }, - "8b997dbc078ad02961355da0a159f2927ed43d64": { - "balance": "197000000000000000000" + "0x8b997dbc078ad02961355da0a159f2927ed43d64": { + "balance": "0xaadec983fcff40000" }, - "2f5080b83f7e2dc0a1dd11b092ad042bff788f4c": { - "balance": "3338355000000000000000" + "0x2f5080b83f7e2dc0a1dd11b092ad042bff788f4c": { + "balance": "0xb4f8fb79231d2b8000" }, - "1b3920d001c43e72b24e7ca46f0fd6e0c20a5ff2": { - "balance": "2000000000000000000000" + "0x1b3920d001c43e72b24e7ca46f0fd6e0c20a5ff2": { + "balance": "0x6c6b935b8bbd400000" }, - "5ade77fd81c25c0af713b10702768c1eb2f975e7": { - "balance": "20000000000000000000" + "0x5ade77fd81c25c0af713b10702768c1eb2f975e7": { + "balance": "0x1158e460913d00000" }, - "acaaddcbf286cb0e215dda55598f7ff0f4ada5c6": { - "balance": "1000000000000000000000" + "0xacaaddcbf286cb0e215dda55598f7ff0f4ada5c6": { + "balance": "0x3635c9adc5dea00000" }, - "64e0217a5b38aa40583625967fa9883690388b6f": { - "balance": "200000000000000000000" + "0x64e0217a5b38aa40583625967fa9883690388b6f": { + "balance": "0xad78ebc5ac6200000" }, - "ae648155a658370f929be384f7e001047e49dd46": { - "balance": "13561000000000000000000" + "0xae648155a658370f929be384f7e001047e49dd46": { + "balance": "0x2df24ae32be20440000" }, - "f7c1b443968b117b5dd9b755572fcd39ca5ec04b": { - "balance": "456082000000000000000" + "0xf7c1b443968b117b5dd9b755572fcd39ca5ec04b": { + "balance": "0x18b968c292f1b50000" }, - "de027efbb38503226ed871099cb30bdb02af1335": { - "balance": "1000000000000000000000" + "0xde027efbb38503226ed871099cb30bdb02af1335": { + "balance": "0x3635c9adc5dea00000" }, - "49cf1e54be363106b920729d2d0ba46f0867989a": { - "balance": "268000000000000000000" + "0x49cf1e54be363106b920729d2d0ba46f0867989a": { + "balance": "0xe873f44133cb00000" }, - "e7f4d7fe6f561f7fa1da3005fd365451ad89df89": { - "balance": "200000000000000000000" + "0xe7f4d7fe6f561f7fa1da3005fd365451ad89df89": { + "balance": "0xad78ebc5ac6200000" }, - "b036916bdacf94b69e5a8a65602975eb026104dd": { - "balance": "20000000000000000000" + "0xb036916bdacf94b69e5a8a65602975eb026104dd": { + "balance": "0x1158e460913d00000" }, - "e923c06177b3427ea448c0a6ff019b54cc548d95": { - "balance": "36281000000000000000" + "0xe923c06177b3427ea448c0a6ff019b54cc548d95": { + "balance": "0x1f780014667f28000" }, - "ad927e03d1599a78ca2bf0cad2a183dceb71eac0": { - "balance": "1970000000000000000000" + "0xad927e03d1599a78ca2bf0cad2a183dceb71eac0": { + "balance": "0x6acb3df27e1f880000" }, - "ef39ca9173df15531d73e6b72a684b51ba0f2bb4": { - "balance": "1598000000000000000000" + "0xef39ca9173df15531d73e6b72a684b51ba0f2bb4": { + "balance": "0x56a0b4756ee2380000" }, - "6443b8ae639de91cf73c5ae763eeeed3ddbb9253": { - "balance": "2000000000000000000000" + "0x6443b8ae639de91cf73c5ae763eeeed3ddbb9253": { + "balance": "0x6c6b935b8bbd400000" }, - "8026435aac728d497b19b3e7e57c28c563954f2b": { - "balance": "1730000000000000000000" + "0x8026435aac728d497b19b3e7e57c28c563954f2b": { + "balance": "0x5dc892aa1131c80000" }, - "ed327a14d5cfadd98103fc0999718d7ed70528ea": { - "balance": "1440000000000000000000" + "0xed327a14d5cfadd98103fc0999718d7ed70528ea": { + "balance": "0x4e1003b28d92800000" }, - "38a3dccf2fcfe0c91a2624bd0cbf88ee4a076c33": { - "balance": "2000000000000000000000" + "0x38a3dccf2fcfe0c91a2624bd0cbf88ee4a076c33": { + "balance": "0x6c6b935b8bbd400000" }, - "f0b1f9e27832c6de6914d70afc238c749995ace4": { - "balance": "2000000000000000000000" + "0xf0b1f9e27832c6de6914d70afc238c749995ace4": { + "balance": "0x6c6b935b8bbd400000" }, - "770d98d31b4353fceee8560c4ccf803e88c0c4e0": { - "balance": "600000000000000000000" + "0x770d98d31b4353fceee8560c4ccf803e88c0c4e0": { + "balance": "0x2086ac351052600000" }, - "ba1f0e03cb9aa021f4dcebfa94e5c889c9c7bc9e": { - "balance": "32200000000000000000000" + "0xba1f0e03cb9aa021f4dcebfa94e5c889c9c7bc9e": { + "balance": "0x6d190c475169a200000" }, - "233842b1d0692fd11140cf5acda4bf9630bae5f8": { - "balance": "2000000000000000000000" + "0x233842b1d0692fd11140cf5acda4bf9630bae5f8": { + "balance": "0x6c6b935b8bbd400000" }, - "b5dd50a15da34968890a53b4f13fe1af081baaaa": { - "balance": "4000000000000000000000" + "0xb5dd50a15da34968890a53b4f13fe1af081baaaa": { + "balance": "0xd8d726b7177a800000" }, - "72072a0ef1cff3d567cdd260e708ddc11cbc9a31": { - "balance": "100000000000000000000" + "0x72072a0ef1cff3d567cdd260e708ddc11cbc9a31": { + "balance": "0x56bc75e2d63100000" }, - "81a88196fac5f23c3e12a69dec4b880eb7d97310": { - "balance": "2000000000000000000000" + "0x81a88196fac5f23c3e12a69dec4b880eb7d97310": { + "balance": "0x6c6b935b8bbd400000" }, - "6c63f84556d290bfcd99e434ee9997bfd779577a": { - "balance": "2000000000000000000000" + "0x6c63f84556d290bfcd99e434ee9997bfd779577a": { + "balance": "0x6c6b935b8bbd400000" }, - "5f167aa242bc4c189adecb3ac4a7c452cf192fcf": { - "balance": "1999980000000000000000" + "0x5f167aa242bc4c189adecb3ac4a7c452cf192fcf": { + "balance": "0x6c6b4c4da6ddbe0000" }, - "445cb8de5e3df520b499efc980f52bff40f55c76": { - "balance": "2000000000000000000000" + "0x445cb8de5e3df520b499efc980f52bff40f55c76": { + "balance": "0x6c6b935b8bbd400000" }, - "aec27ce2133e82d052520afb5c576d9f7eb93ed2": { - "balance": "65232380000000000000000" + "0xaec27ce2133e82d052520afb5c576d9f7eb93ed2": { + "balance": "0xdd04120ba09cfe60000" }, - "07dc2bf83bc6af19a842ffea661af5b41b67fda1": { - "balance": "1500000000000000000000" + "0x07dc2bf83bc6af19a842ffea661af5b41b67fda1": { + "balance": "0x5150ae84a8cdf00000" }, - "febd48d0ffdbd5656cd5e686363a61145228f279": { - "balance": "2800000000000000000000" + "0xfebd48d0ffdbd5656cd5e686363a61145228f279": { + "balance": "0x97c9ce4cf6d5c00000" }, - "a86db07d9f812f4796622d40e03d135874a88a74": { - "balance": "20000000000000000000" + "0xa86db07d9f812f4796622d40e03d135874a88a74": { + "balance": "0x1158e460913d00000" }, - "5413c97ffa4a6e2a7bba8961dc9fce8530a787d7": { - "balance": "1000000000000000000000" + "0x5413c97ffa4a6e2a7bba8961dc9fce8530a787d7": { + "balance": "0x3635c9adc5dea00000" }, - "e2ff9ee4b6ecc14141cc74ca52a9e7a2ee14d908": { - "balance": "1400000000000000000000" + "0xe2ff9ee4b6ecc14141cc74ca52a9e7a2ee14d908": { + "balance": "0x4be4e7267b6ae00000" }, - "2e8eb30a716e5fe15c74233e039bfb1106e81d12": { - "balance": "100000000000000000000" + "0x2e8eb30a716e5fe15c74233e039bfb1106e81d12": { + "balance": "0x56bc75e2d63100000" }, - "fd88d114220f081cb3d5e15be8152ab07366576a": { - "balance": "300000000000000000000" + "0xfd88d114220f081cb3d5e15be8152ab07366576a": { + "balance": "0x1043561a8829300000" }, - "e408fceaa1b98f3c640f48fcba39f056066d6308": { - "balance": "10000000000000000000000" + "0xe408fceaa1b98f3c640f48fcba39f056066d6308": { + "balance": "0x21e19e0c9bab2400000" }, - "057dd29f2d19aa3da42327ea50bce86ff5c911d9": { - "balance": "4000000000000000000000" + "0x057dd29f2d19aa3da42327ea50bce86ff5c911d9": { + "balance": "0xd8d726b7177a800000" }, - "ed1065dbcf9d73c04ffc7908870d881468c1e132": { - "balance": "2000000000000000000000" + "0xed1065dbcf9d73c04ffc7908870d881468c1e132": { + "balance": "0x6c6b935b8bbd400000" }, - "bbc9d8112e5beb02dd29a2257b1fe69b3536a945": { - "balance": "2000000000000000000000" + "0xbbc9d8112e5beb02dd29a2257b1fe69b3536a945": { + "balance": "0x6c6b935b8bbd400000" }, - "79c1be19711f73bee4e6316ae7549459aacea2e0": { - "balance": "400000000000000000000" + "0x79c1be19711f73bee4e6316ae7549459aacea2e0": { + "balance": "0x15af1d78b58c400000" }, - "1bcf3441a866bdbe963009ce33c81cbb0261b02c": { - "balance": "182000000000000000000" + "0x1bcf3441a866bdbe963009ce33c81cbb0261b02c": { + "balance": "0x9ddc1e3b901180000" }, - "e2e26e4e1dcf30d048cc6ecf9d51ec1205a4e926": { - "balance": "4000000000000000000000" + "0xe2e26e4e1dcf30d048cc6ecf9d51ec1205a4e926": { + "balance": "0xd8d726b7177a800000" }, - "77701e2c493da47c1b58f421b5495dee45bea39b": { - "balance": "6068279000000000000000" + "0x77701e2c493da47c1b58f421b5495dee45bea39b": { + "balance": "0x148f649cf6142a58000" }, - "37a05aceb9395c8635a39a7c5d266ae610d10bf2": { - "balance": "30000000000000000000000" + "0x37a05aceb9395c8635a39a7c5d266ae610d10bf2": { + "balance": "0x65a4da25d3016c00000" }, - "c6355ec4768c70a49af69513cd83a5bca7e3b9cd": { - "balance": "6000000000000000000000" + "0xc6355ec4768c70a49af69513cd83a5bca7e3b9cd": { + "balance": "0x14542ba12a337c00000" }, - "e3c0c128327a9ad80148139e269773428e638cb0": { - "balance": "2000000000000000000000" + "0xe3c0c128327a9ad80148139e269773428e638cb0": { + "balance": "0x6c6b935b8bbd400000" }, - "f7f4898c4c526d955f21f055cb6e47b915e51964": { - "balance": "2288000000000000000000" + "0xf7f4898c4c526d955f21f055cb6e47b915e51964": { + "balance": "0x7c0860e5a80dc00000" }, - "29824e94cc4348bc963279dcdf47391715324cd3": { - "balance": "1940000000000000000000" + "0x29824e94cc4348bc963279dcdf47391715324cd3": { + "balance": "0x692ae8897081d00000" }, - "eaa45cea02d87d2cc8fda9434e2d985bd4031584": { - "balance": "1920750000000000000000" + "0xeaa45cea02d87d2cc8fda9434e2d985bd4031584": { + "balance": "0x681fc2cc6e2b8b0000" }, - "e08b9aba6bd9d28bc2056779d2fbf0f2855a3d9d": { - "balance": "2000000000000000000000" + "0xe08b9aba6bd9d28bc2056779d2fbf0f2855a3d9d": { + "balance": "0x6c6b935b8bbd400000" }, - "87c498170934b8233d1ad1e769317d5c475f2f40": { - "balance": "1015200000000000000000" + "0x87c498170934b8233d1ad1e769317d5c475f2f40": { + "balance": "0x3708baed3d68900000" }, - "352d29a26e8a41818181746467f582e6e84012e0": { - "balance": "6000000000000000000000" + "0x352d29a26e8a41818181746467f582e6e84012e0": { + "balance": "0x14542ba12a337c00000" }, - "403220600a36f73f24e190d1edb2d61be3f41354": { - "balance": "304000000000000000000" + "0x403220600a36f73f24e190d1edb2d61be3f41354": { + "balance": "0x107ad8f556c6c00000" }, - "0a48296f7631708c95d2b74975bc4ab88ac1392a": { - "balance": "5000000000000000000000" + "0x0a48296f7631708c95d2b74975bc4ab88ac1392a": { + "balance": "0x10f0cf064dd59200000" }, - "ffe0e997f1977a615f5a315af413fd4869343ba0": { - "balance": "100076000000000000000" + "0xffe0e997f1977a615f5a315af413fd4869343ba0": { + "balance": "0x56cd55fc64dfe0000" }, - "ca66b2280fa282c5b67631ce552b62ee55ad8474": { - "balance": "1969488000000000000000" + "0xca66b2280fa282c5b67631ce552b62ee55ad8474": { + "balance": "0x6ac422f53492880000" }, - "2b6ed29a95753c3ad948348e3e7b1a251080ffb9": { - "balance": "250000000000000000000000" + "0x2b6ed29a95753c3ad948348e3e7b1a251080ffb9": { + "balance": "0x34f086f3b33b68400000" }, - "492e70f04d18408cb41e25603730506b35a2876b": { - "balance": "39400000000000000000" + "0x492e70f04d18408cb41e25603730506b35a2876b": { + "balance": "0x222c8eb3ff6640000" }, - "0e6baaa3deb989f289620076668618e9ac332865": { - "balance": "200000000000000000000" + "0x0e6baaa3deb989f289620076668618e9ac332865": { + "balance": "0xad78ebc5ac6200000" }, - "b753a75f9ed10b21643a0a3dc0517ac96b1a4068": { - "balance": "401800000000000000000" + "0xb753a75f9ed10b21643a0a3dc0517ac96b1a4068": { + "balance": "0x15c8185b2c1ff40000" }, - "3ad915d550b723415620f5a9b5b88a85f382f035": { - "balance": "1000000000000000000000" + "0x3ad915d550b723415620f5a9b5b88a85f382f035": { + "balance": "0x3635c9adc5dea00000" }, - "c992be59c6721caf4e028f9e8f05c25c55515bd4": { - "balance": "20000000000000000000" + "0xc992be59c6721caf4e028f9e8f05c25c55515bd4": { + "balance": "0x1158e460913d00000" }, - "02b643d6fabd437a851accbe79abb7fde126dccf": { - "balance": "7200000000000000000000" + "0x02b643d6fabd437a851accbe79abb7fde126dccf": { + "balance": "0x18650127cc3dc800000" }, - "88797e58675ed5cc4c19980783dbd0c956085153": { - "balance": "2000000000000000000000" + "0x88797e58675ed5cc4c19980783dbd0c956085153": { + "balance": "0x6c6b935b8bbd400000" }, - "ac142eda1157b9a9a64390df7e6ae694fac98905": { - "balance": "200000000000000000000" + "0xac142eda1157b9a9a64390df7e6ae694fac98905": { + "balance": "0xad78ebc5ac6200000" }, - "656579daedd29370d9b737ee3f5cd9d84bc2b342": { - "balance": "1430000000000000000000" + "0x656579daedd29370d9b737ee3f5cd9d84bc2b342": { + "balance": "0x4d853c8f8908980000" }, - "9bb9b02a26bfe1ccc3f0c6219e261c397fc5ca78": { - "balance": "1337000000000000000000" + "0x9bb9b02a26bfe1ccc3f0c6219e261c397fc5ca78": { + "balance": "0x487a9a304539440000" }, - "bee8d0b008421954f92d000d390fb8f8e658eaee": { - "balance": "1000000000000000000000" + "0xbee8d0b008421954f92d000d390fb8f8e658eaee": { + "balance": "0x3635c9adc5dea00000" }, - "7989d09f3826c3e5af8c752a8115723a84d80970": { - "balance": "415554000000000000000" + "0x7989d09f3826c3e5af8c752a8115723a84d80970": { + "balance": "0x1686f8614cf0ad0000" }, - "7cd5d81eab37e11e6276a3a1091251607e0d7e38": { - "balance": "62856000000000000000" + "0x7cd5d81eab37e11e6276a3a1091251607e0d7e38": { + "balance": "0x3684d5ef981f40000" }, - "6ce1b0f6adc47051e8ab38b39edb4186b03babcc": { - "balance": "1207800000000000000000" + "0x6ce1b0f6adc47051e8ab38b39edb4186b03babcc": { + "balance": "0x41799794cd24cc0000" }, - "abfcf5f25091ce57875fc674dcf104e2a73dd2f2": { - "balance": "19700000000000000000" + "0xabfcf5f25091ce57875fc674dcf104e2a73dd2f2": { + "balance": "0x11164759ffb320000" }, - "1c3ef05dae9dcbd489f3024408669de244c52a02": { - "balance": "20000000000000000000000" + "0x1c3ef05dae9dcbd489f3024408669de244c52a02": { + "balance": "0x43c33c1937564800000" }, - "cfa8b37127149bdbfee25c34d878510951ea10eb": { - "balance": "2000000000000000000000" + "0xcfa8b37127149bdbfee25c34d878510951ea10eb": { + "balance": "0x6c6b935b8bbd400000" }, - "74863acec75d03d53e860e64002f2c165e538377": { - "balance": "1000000000000000000000" + "0x74863acec75d03d53e860e64002f2c165e538377": { + "balance": "0x3635c9adc5dea00000" }, - "59b9e733cba4be00429b4bd9dfa64732053a7d55": { - "balance": "20000000000000000000" + "0x59b9e733cba4be00429b4bd9dfa64732053a7d55": { + "balance": "0x1158e460913d00000" }, - "aeadfcd0978edad74a32bd01a0a51d37f246e661": { - "balance": "260000000000000000000" + "0xaeadfcd0978edad74a32bd01a0a51d37f246e661": { + "balance": "0xe18398e7601900000" }, - "08090876baadfee65c3d363ba55312748cfa873d": { - "balance": "1700170000000000000000" + "0x08090876baadfee65c3d363ba55312748cfa873d": { + "balance": "0x5c2a99371cffe10000" }, - "e589fa76984db5ec4004b46ee8a59492c30744ce": { - "balance": "2800000000000000000000" + "0xe589fa76984db5ec4004b46ee8a59492c30744ce": { + "balance": "0x97c9ce4cf6d5c00000" }, - "3485361ee6bf06ef6508ccd23d94641f814d3e2f": { - "balance": "2000000000000000000000" + "0x3485361ee6bf06ef6508ccd23d94641f814d3e2f": { + "balance": "0x6c6b935b8bbd400000" }, - "5cb731160d2e8965670bde925d9de5510935347d": { - "balance": "40000000000000000000" + "0x5cb731160d2e8965670bde925d9de5510935347d": { + "balance": "0x22b1c8c1227a00000" }, - "8ef4d8a2c23c5279187b64e96f741404085385f3": { - "balance": "299598000000000000000" + "0x8ef4d8a2c23c5279187b64e96f741404085385f3": { + "balance": "0x103dc1e9a9697b0000" }, - "e246683cc99db7c4a52bcbacaab0b32f6bfc93d7": { - "balance": "2000000000000000000000" + "0xe246683cc99db7c4a52bcbacaab0b32f6bfc93d7": { + "balance": "0x6c6b935b8bbd400000" }, - "7d273e637ef1eac481119413b91c989dc5eac122": { - "balance": "500000000000000000000" + "0x7d273e637ef1eac481119413b91c989dc5eac122": { + "balance": "0x1b1ae4d6e2ef500000" }, - "6efba8fb2ac5b6730729a972ec224426a287c3ad": { - "balance": "283152000000000000000" + "0x6efba8fb2ac5b6730729a972ec224426a287c3ad": { + "balance": "0xf5985fbcbe1680000" }, - "0773eeacc050f74720b4a1bd57895b1cceeb495d": { - "balance": "10000000000000000000000" + "0x0773eeacc050f74720b4a1bd57895b1cceeb495d": { + "balance": "0x21e19e0c9bab2400000" }, - "88a122a2382c523931fb51a0ccad3beb5b7259c3": { - "balance": "2000000000000000000000" + "0x88a122a2382c523931fb51a0ccad3beb5b7259c3": { + "balance": "0x6c6b935b8bbd400000" }, - "b0b779b94bfa3c2e1f587bcc9c7e21789222378f": { - "balance": "1550000000000000000000" + "0xb0b779b94bfa3c2e1f587bcc9c7e21789222378f": { + "balance": "0x54069233bf7f780000" }, - "86f95c5b11a293940e35c0b898d8b75f08aab06d": { - "balance": "29605000000000000000000" + "0x86f95c5b11a293940e35c0b898d8b75f08aab06d": { + "balance": "0x644e3e875fccf740000" }, - "cf2288ef4ebf88e86db13d8a0e0bf52a056582c3": { - "balance": "2533000000000000000000" + "0xcf2288ef4ebf88e86db13d8a0e0bf52a056582c3": { + "balance": "0x89506fbf9740740000" }, - "71ea5b11ad8d29b1a4cb67bf58ca6c9f9c338c16": { - "balance": "1600000000000000000000" + "0x71ea5b11ad8d29b1a4cb67bf58ca6c9f9c338c16": { + "balance": "0x56bc75e2d631000000" }, - "9917d68d4af341d651e7f0075c6de6d7144e7409": { - "balance": "5660000000000000000000" + "0x9917d68d4af341d651e7f0075c6de6d7144e7409": { + "balance": "0x132d4476c08e6f00000" }, - "1e5800227d4dcf75e30f5595c5bed3f72e341e3b": { - "balance": "248300000000000000000" + "0x1e5800227d4dcf75e30f5595c5bed3f72e341e3b": { + "balance": "0xd75dace73417e0000" }, - "123759f333e13e3069e2034b4f05398918119d36": { - "balance": "20000000000000000000000" + "0x123759f333e13e3069e2034b4f05398918119d36": { + "balance": "0x43c33c1937564800000" }, - "f798d16da4e460c460cd485fae0fa0599708eb82": { - "balance": "1000000000000000000000" + "0xf798d16da4e460c460cd485fae0fa0599708eb82": { + "balance": "0x3635c9adc5dea00000" }, - "864bec5069f855a4fd5892a6c4491db07c88ff7c": { - "balance": "1000000000000000000000" + "0x864bec5069f855a4fd5892a6c4491db07c88ff7c": { + "balance": "0x3635c9adc5dea00000" }, - "fa283299603d8758e8cab082125d2c8f7d445429": { - "balance": "6415633000000000000000" + "0xfa283299603d8758e8cab082125d2c8f7d445429": { + "balance": "0x15bcacb1e0501ae8000" }, - "c811c2e9aa1ac3462eba5e88fcb5120e9f6e2ca2": { - "balance": "1400140000000000000000" + "0xc811c2e9aa1ac3462eba5e88fcb5120e9f6e2ca2": { + "balance": "0x4be6d887bd876e0000" }, - "61547d376e5369bcf978fc162c3c56ae453547e8": { - "balance": "200000000000000000000" + "0x61547d376e5369bcf978fc162c3c56ae453547e8": { + "balance": "0xad78ebc5ac6200000" }, - "0d747ee5969bf79d57381d6fe3a2406cd0d8ce27": { - "balance": "100000000000000000000000" + "0x0d747ee5969bf79d57381d6fe3a2406cd0d8ce27": { + "balance": "0x152d02c7e14af6800000" }, - "f8962b75db5d24c7e8b7cef1068c3e67cebb30a5": { - "balance": "280000000000000000000" + "0xf8962b75db5d24c7e8b7cef1068c3e67cebb30a5": { + "balance": "0xf2dc7d47f15600000" }, - "35bf6688522f35467a7f75302314c02ba176800e": { - "balance": "17400000000000000000000" + "0x35bf6688522f35467a7f75302314c02ba176800e": { + "balance": "0x3af418202d954e00000" }, - "05cb6c3b0072d3116761b532b218443b53e8f6c5": { - "balance": "141722000000000000000000" + "0x05cb6c3b0072d3116761b532b218443b53e8f6c5": { + "balance": "0x1e02c3d7fca9b6280000" }, - "91c80caa081b38351d2a0e0e00f80a34e56474c1": { - "balance": "1000000000000000000000" + "0x91c80caa081b38351d2a0e0e00f80a34e56474c1": { + "balance": "0x3635c9adc5dea00000" }, - "d75a502a5b677287470f65c5aa51b87c10150572": { - "balance": "907400000000000000000" + "0xd75a502a5b677287470f65c5aa51b87c10150572": { + "balance": "0x3130b4646385740000" }, - "3e194b4ecef8bb711ea2ff24fec4e87bd032f7d1": { - "balance": "2575465000000000000000" + "0x3e194b4ecef8bb711ea2ff24fec4e87bd032f7d1": { + "balance": "0x8b9dc1bc1a036a8000" }, - "736bf1402c83800f893e583192582a134eb532e9": { - "balance": "9999996000000000000000" + "0x736bf1402c83800f893e583192582a134eb532e9": { + "balance": "0x21e19d293c01f260000" }, - "c2cb1ada5da9a0423873814793f16144ef36b2f3": { - "balance": "1334326000000000000000" + "0xc2cb1ada5da9a0423873814793f16144ef36b2f3": { + "balance": "0x48557e3b7017df0000" }, - "efcce06bd6089d0e458ef561f5a689480afe7000": { - "balance": "600000000000000000000" + "0xefcce06bd6089d0e458ef561f5a689480afe7000": { + "balance": "0x2086ac351052600000" }, - "bfe6bcb0f0c07852643324aa5df5fd6225abc3ca": { - "balance": "74500000000000000000" + "0xbfe6bcb0f0c07852643324aa5df5fd6225abc3ca": { + "balance": "0x409e52b48369a0000" }, - "9d799e943e306ba2e5b99c8a6858cbb52c0cf735": { - "balance": "300000000000000000000" + "0x9d799e943e306ba2e5b99c8a6858cbb52c0cf735": { + "balance": "0x1043561a8829300000" }, - "f45b1dcb2e41dc27ffa024daadf619c11175c087": { - "balance": "19700000000000000000" + "0xf45b1dcb2e41dc27ffa024daadf619c11175c087": { + "balance": "0x11164759ffb320000" }, - "08e38ee0ce48c9ca645c1019f73b5355581c56e6": { - "balance": "1600000000000000000000" + "0x08e38ee0ce48c9ca645c1019f73b5355581c56e6": { + "balance": "0x56bc75e2d631000000" }, - "2cb4c3c16bb1c55e7c6b7a19b127a1ac9390cc09": { - "balance": "3397053000000000000000" + "0x2cb4c3c16bb1c55e7c6b7a19b127a1ac9390cc09": { + "balance": "0xb82794a9244f0c8000" }, - "bdc02cd4330c93d6fbda4f6db2a85df22f43c233": { - "balance": "2000000000000000000000" + "0xbdc02cd4330c93d6fbda4f6db2a85df22f43c233": { + "balance": "0x6c6b935b8bbd400000" }, - "acec91ef6941cf630ba9a3e787a012f4a2d91dd4": { - "balance": "80000000000000000000000" + "0xacec91ef6941cf630ba9a3e787a012f4a2d91dd4": { + "balance": "0x10f0cf064dd592000000" }, - "27ac073be79ce657a93aa693ee43bf0fa41fef04": { - "balance": "50000000000000000000000" + "0x27ac073be79ce657a93aa693ee43bf0fa41fef04": { + "balance": "0xa968163f0a57b400000" }, - "22fe884d9037291b4d52e6285ae68dea0be9ffb5": { - "balance": "2000000000000000000000" + "0x22fe884d9037291b4d52e6285ae68dea0be9ffb5": { + "balance": "0x6c6b935b8bbd400000" }, - "c3107a9af3322d5238df0132419131629539577d": { - "balance": "492650000000000000000" + "0xc3107a9af3322d5238df0132419131629539577d": { + "balance": "0x1ab4e464d414310000" }, - "b5cac5ed03477d390bb267d4ebd46101fbc2c3da": { - "balance": "197000000000000000000" + "0xb5cac5ed03477d390bb267d4ebd46101fbc2c3da": { + "balance": "0xaadec983fcff40000" }, - "58fb947364e7695765361ebb1e801ffb8b95e6d0": { - "balance": "200000000000000000000" + "0x58fb947364e7695765361ebb1e801ffb8b95e6d0": { + "balance": "0xad78ebc5ac6200000" }, - "32860997d730b2d83b73241a25d3667d51c908ef": { - "balance": "499938000000000000000" + "0x32860997d730b2d83b73241a25d3667d51c908ef": { + "balance": "0x1b1a089237073d0000" }, - "c79d5062c796dd7761f1f13e558d73a59f82f38b": { - "balance": "8000000000000000000000" + "0xc79d5062c796dd7761f1f13e558d73a59f82f38b": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "fa142fe47eda97e6503b386b18a2bedd73ccb5b1": { - "balance": "850080000000000000000" + "0xfa142fe47eda97e6503b386b18a2bedd73ccb5b1": { + "balance": "0x2e153ad81548100000" }, - "6ca5de00817de0cedce5fd000128dede12648b3c": { - "balance": "20000000000000000000" + "0x6ca5de00817de0cedce5fd000128dede12648b3c": { + "balance": "0x1158e460913d00000" }, - "214b743955a512de6e0d886a8cbd0282bee6d2a2": { - "balance": "2000000000000000000000" + "0x214b743955a512de6e0d886a8cbd0282bee6d2a2": { + "balance": "0x6c6b935b8bbd400000" }, - "ede79ae1ff4f1606d59270216fa46ab2ddd4ecaa": { - "balance": "146000000000000000000" + "0xede79ae1ff4f1606d59270216fa46ab2ddd4ecaa": { + "balance": "0x7ea28327577080000" }, - "528101ce46b720a2214dcdae6618a53177ffa377": { - "balance": "508876000000000000000" + "0x528101ce46b720a2214dcdae6618a53177ffa377": { + "balance": "0x1b9612b9dc01ae0000" }, - "b5870ce342d43343333673038b4764a46e925f3e": { - "balance": "1000000000000000000000" + "0xb5870ce342d43343333673038b4764a46e925f3e": { + "balance": "0x3635c9adc5dea00000" }, - "843bd3502f45f8bc4da370b323bdac3fcf5f19a6": { - "balance": "1476000000000000000000" + "0x843bd3502f45f8bc4da370b323bdac3fcf5f19a6": { + "balance": "0x50039d63d11c900000" }, - "5067f4549afbfe884c59cbc12b96934923d45db0": { - "balance": "1000000000000000000000" + "0x5067f4549afbfe884c59cbc12b96934923d45db0": { + "balance": "0x3635c9adc5dea00000" }, - "6f2a42e6e033d01061131929f7a6ee1538021e52": { - "balance": "2000000000000000000000" + "0x6f2a42e6e033d01061131929f7a6ee1538021e52": { + "balance": "0x6c6b935b8bbd400000" }, - "e9e1f7cb00a110edd0ebf8b377ef8a7bb856117f": { - "balance": "200000000000000000000" + "0xe9e1f7cb00a110edd0ebf8b377ef8a7bb856117f": { + "balance": "0xad78ebc5ac6200000" }, - "a387ecde0ee4c8079499fd8e03473bd88ad7522a": { - "balance": "1970000000000000000000" + "0xa387ecde0ee4c8079499fd8e03473bd88ad7522a": { + "balance": "0x6acb3df27e1f880000" }, - "6dff90e6dc359d2590882b1483edbcf887c0e423": { - "balance": "1000000000000000000000" + "0x6dff90e6dc359d2590882b1483edbcf887c0e423": { + "balance": "0x3635c9adc5dea00000" }, - "22e512149a18d369b73c71efa43e86c9edabaf1d": { - "balance": "1455000000000000000000" + "0x22e512149a18d369b73c71efa43e86c9edabaf1d": { + "balance": "0x4ee02e6714615c0000" }, - "a3203095edb7028e6871ce0a84f548459f83300a": { - "balance": "4000000000000000000000" + "0xa3203095edb7028e6871ce0a84f548459f83300a": { + "balance": "0xd8d726b7177a800000" }, - "93b4bf3fdff6de3f4e56ba6d7799dc4b93a6548f": { - "balance": "19100000000000000000" + "0x93b4bf3fdff6de3f4e56ba6d7799dc4b93a6548f": { + "balance": "0x10910d4cdc9f60000" }, - "8c75956e8fed50f5a7dd7cfd27da200f6746aea6": { - "balance": "1000000000000000000000" + "0x8c75956e8fed50f5a7dd7cfd27da200f6746aea6": { + "balance": "0x3635c9adc5dea00000" }, - "afc8ebe8988bd4105acc4c018e546a1e8f9c7888": { - "balance": "500000000000000000000" + "0xafc8ebe8988bd4105acc4c018e546a1e8f9c7888": { + "balance": "0x1b1ae4d6e2ef500000" }, - "bf9acd4445d9c9554689cabbbab18800ff1741c2": { - "balance": "1000000000000000000000" + "0xbf9acd4445d9c9554689cabbbab18800ff1741c2": { + "balance": "0x3635c9adc5dea00000" }, - "603f2fab7afb6e017b94766069a4b43b38964923": { - "balance": "1656954000000000000000" + "0x603f2fab7afb6e017b94766069a4b43b38964923": { + "balance": "0x59d2db2414da990000" }, - "a1f765c44fe45f790677944844be4f2d42165fbd": { - "balance": "3687750000000000000000" + "0xa1f765c44fe45f790677944844be4f2d42165fbd": { + "balance": "0xc7e9cfde768ec70000" }, - "4dc9d5bb4b19cecd94f19ec25d200ea72f25d7ed": { - "balance": "2000000000000000000000" + "0x4dc9d5bb4b19cecd94f19ec25d200ea72f25d7ed": { + "balance": "0x6c6b935b8bbd400000" }, - "48f60a35484fe7792bcc8a7b6393d0dda1f6b717": { - "balance": "3600000000000000000000" + "0x48f60a35484fe7792bcc8a7b6393d0dda1f6b717": { + "balance": "0xc328093e61ee400000" }, - "588ed990a2aff44a94105d58c305257735c868ac": { - "balance": "16100000000000000000000" + "0x588ed990a2aff44a94105d58c305257735c868ac": { + "balance": "0x368c8623a8b4d100000" }, - "710be8fd5e2918468be2aabea80d828435d79612": { - "balance": "17600000000000000000" + "0x710be8fd5e2918468be2aabea80d828435d79612": { + "balance": "0xf43fc2c04ee00000" }, - "03ea6d26d080e57aee3926b18e8ed73a4e5b2826": { - "balance": "200000000000000000000" + "0x03ea6d26d080e57aee3926b18e8ed73a4e5b2826": { + "balance": "0xad78ebc5ac6200000" }, - "20824ba1dbebbef9846ef3d0f6c1b017e6912ec4": { - "balance": "7170194000000000000000" + "0x20824ba1dbebbef9846ef3d0f6c1b017e6912ec4": { + "balance": "0x184b26e4daf1d350000" }, - "f7500c166f8bea2f82347606e5024be9e4f4ce99": { - "balance": "20000000000000000000" + "0xf7500c166f8bea2f82347606e5024be9e4f4ce99": { + "balance": "0x1158e460913d00000" }, - "9d369165fb70b81a3a765f188fd60cbe5e7b0968": { - "balance": "2000000000000000000000" + "0x9d369165fb70b81a3a765f188fd60cbe5e7b0968": { + "balance": "0x6c6b935b8bbd400000" }, - "6fddbd9bca66e28765c2162c8433548c1052ed11": { - "balance": "82720000000000000000000" + "0x6fddbd9bca66e28765c2162c8433548c1052ed11": { + "balance": "0x1184429b82a818800000" }, - "8b81156e698639943c01a75272ad3d35851ab282": { - "balance": "344946000000000000000" + "0x8b81156e698639943c01a75272ad3d35851ab282": { + "balance": "0x12b3165f65d3e50000" }, - "75804aac64b4199083982902994d9c5ed8828f11": { - "balance": "557800000000000000000" + "0x75804aac64b4199083982902994d9c5ed8828f11": { + "balance": "0x1e3d07b0a620e40000" }, - "d6e8e97ae9839b9ee507eedb28edfb7477031439": { - "balance": "2000000000000000000000" + "0xd6e8e97ae9839b9ee507eedb28edfb7477031439": { + "balance": "0x6c6b935b8bbd400000" }, - "6c808cabb8ff5fbb6312d9c8e84af8cf12ef0875": { - "balance": "4000086000000000000000" + "0x6c808cabb8ff5fbb6312d9c8e84af8cf12ef0875": { + "balance": "0xd8d8583fa2d52f0000" }, - "afa539586e4719174a3b46b9b3e663a7d1b5b987": { - "balance": "5000000000000000000000" + "0xafa539586e4719174a3b46b9b3e663a7d1b5b987": { + "balance": "0x10f0cf064dd59200000" }, - "f8a065f287d91d77cd626af38ffa220d9b552a2b": { - "balance": "1910000000000000000000" + "0xf8a065f287d91d77cd626af38ffa220d9b552a2b": { + "balance": "0x678a932062e4180000" }, - "30e60900cacc7203f314dc604347255167fc2a0f": { - "balance": "2000000000000000000000" + "0x30e60900cacc7203f314dc604347255167fc2a0f": { + "balance": "0x6c6b935b8bbd400000" }, - "796f87ba617a2930b1670be92ed1281fb0b346e1": { - "balance": "128400000000000000000" + "0x796f87ba617a2930b1670be92ed1281fb0b346e1": { + "balance": "0x6f5e86fb528280000" }, - "f114ff0d0f24eff896edde5471dea484824a99b3": { - "balance": "13700000000000000000" + "0xf114ff0d0f24eff896edde5471dea484824a99b3": { + "balance": "0xbe202d6a0eda0000" }, - "0b80fc70282cbdd5fde35bf78984db3bdb120188": { - "balance": "1000160000000000000000" + "0x0b80fc70282cbdd5fde35bf78984db3bdb120188": { + "balance": "0x3638021cecdab00000" }, - "da7ad025ebde25d22243cb830ea1d3f64a566323": { - "balance": "500000000000000000000" + "0xda7ad025ebde25d22243cb830ea1d3f64a566323": { + "balance": "0x1b1ae4d6e2ef500000" }, - "65a52141f56bef98991724c6e7053381da8b5925": { - "balance": "60140000000000000000" + "0x65a52141f56bef98991724c6e7053381da8b5925": { + "balance": "0x3429c335d57fe0000" }, - "bbc8eaff637e94fcc58d913c7770c88f9b479277": { - "balance": "200000000000000000000" + "0xbbc8eaff637e94fcc58d913c7770c88f9b479277": { + "balance": "0xad78ebc5ac6200000" }, - "0469e8c440450b0e512626fe817e6754a8152830": { - "balance": "2000000000000000000000" + "0x0469e8c440450b0e512626fe817e6754a8152830": { + "balance": "0x6c6b935b8bbd400000" }, - "0727be0a2a00212048b5520fbefb953ebc9d54a0": { - "balance": "10000000000000000000000" + "0x0727be0a2a00212048b5520fbefb953ebc9d54a0": { + "balance": "0x21e19e0c9bab2400000" }, - "7d858493f07415e0912d05793c972113eae8ae88": { - "balance": "1818000000000000000000" + "0x7d858493f07415e0912d05793c972113eae8ae88": { + "balance": "0x628dd177d2bc280000" }, - "7091303116d5f2389b23238b4d656a8596d984d3": { - "balance": "1094014000000000000000" + "0x7091303116d5f2389b23238b4d656a8596d984d3": { + "balance": "0x3b4e7e80aa58330000" }, - "3702e704cc21617439ad4ea27a5714f2fda1e932": { - "balance": "1000000000000000000000" + "0x3702e704cc21617439ad4ea27a5714f2fda1e932": { + "balance": "0x3635c9adc5dea00000" }, - "b87de1bcd29269d521b8761cc39cfb4319d2ead5": { - "balance": "1000000000000000000000" + "0xb87de1bcd29269d521b8761cc39cfb4319d2ead5": { + "balance": "0x3635c9adc5dea00000" }, - "f639ac31da9f67271bd10402b7654e5ce763bd47": { - "balance": "399996000000000000000" + "0xf639ac31da9f67271bd10402b7654e5ce763bd47": { + "balance": "0x15af0f42baf9260000" }, - "e7735ec76518fc6aa92da8715a9ee3f625788f13": { - "balance": "1997803000000000000000" + "0xe7735ec76518fc6aa92da8715a9ee3f625788f13": { + "balance": "0x6c4d160bafa1b78000" }, - "51277fe7c81eebd252a03df69a6b9f326e272207": { - "balance": "59965000000000000000" + "0x51277fe7c81eebd252a03df69a6b9f326e272207": { + "balance": "0x3402e79cab44c8000" }, - "3b8098533f7d9bdcd307dbb23e1777ca18418936": { - "balance": "2000000000000000000000" + "0x3b8098533f7d9bdcd307dbb23e1777ca18418936": { + "balance": "0x6c6b935b8bbd400000" }, - "2cba6d5d0dc204ea8a25ada2e26f5675bd5f2fdc": { - "balance": "1330755000000000000000" + "0x2cba6d5d0dc204ea8a25ada2e26f5675bd5f2fdc": { + "balance": "0x4823ef7ddb9af38000" }, - "5c3c1c645b917543113b3e6c1c054da1fe742b9a": { - "balance": "800000000000000000000" + "0x5c3c1c645b917543113b3e6c1c054da1fe742b9a": { + "balance": "0x2b5e3af16b18800000" }, - "5ecdbaeab9106ffe5d7b519696609a05baeb85ad": { - "balance": "20000000000000000000" + "0x5ecdbaeab9106ffe5d7b519696609a05baeb85ad": { + "balance": "0x1158e460913d00000" }, - "45a820a0672f17dc74a08112bc643fd1167736c3": { - "balance": "199943000000000000000" + "0x45a820a0672f17dc74a08112bc643fd1167736c3": { + "balance": "0xad6c43b2815ed8000" }, - "beef94213879e02622142bea61290978939a60d7": { - "balance": "5728109000000000000000" + "0xbeef94213879e02622142bea61290978939a60d7": { + "balance": "0x136857b32ad86048000" }, - "6cd212aee04e013f3d2abad2a023606bfb5c6ac7": { - "balance": "1999944000000000000000" + "0x6cd212aee04e013f3d2abad2a023606bfb5c6ac7": { + "balance": "0x6c6acc67d7b1d40000" }, - "92698e345378c62d8eda184d94366a144b0c105b": { - "balance": "1400000000000000000000" + "0x92698e345378c62d8eda184d94366a144b0c105b": { + "balance": "0x4be4e7267b6ae00000" }, - "2d5b42fc59ebda0dfd66ae914bc28c1b0a6ef83a": { - "balance": "206764195000000000000000" + "0x2d5b42fc59ebda0dfd66ae914bc28c1b0a6ef83a": { + "balance": "0x2bc8b59fdcd836638000" }, - "b7a6791c16eb4e2162f14b6537a02b3d63bfc602": { - "balance": "780700000000000000000" + "0xb7a6791c16eb4e2162f14b6537a02b3d63bfc602": { + "balance": "0x2a526391ac93760000" }, - "fa105f1a11b6e4b1f56012a27922e2ac2da4812f": { - "balance": "9550000000000000000000" + "0xfa105f1a11b6e4b1f56012a27922e2ac2da4812f": { + "balance": "0x205b4dfa1ee74780000" }, - "2306df931a940d58c01665fa4d0800802c02edfe": { - "balance": "1000000000000000000000" + "0x2306df931a940d58c01665fa4d0800802c02edfe": { + "balance": "0x3635c9adc5dea00000" }, - "f37bf78c5875154711cb640d37ea6d28cfcb1259": { - "balance": "200000000000000000000" + "0xf37bf78c5875154711cb640d37ea6d28cfcb1259": { + "balance": "0xad78ebc5ac6200000" }, - "66201bd227ae6dc6bdfed5fbde811fecfe5e9dd9": { - "balance": "594808000000000000000" + "0x66201bd227ae6dc6bdfed5fbde811fecfe5e9dd9": { + "balance": "0x203e9e8492788c0000" }, - "2bafbf9e9ed2c219f7f2791374e7d05cb06777e7": { - "balance": "220000000000000000000" + "0x2bafbf9e9ed2c219f7f2791374e7d05cb06777e7": { + "balance": "0xbed1d0263d9f00000" }, - "8e9b35ad4a0a86f758446fffde34269d940ceacd": { - "balance": "4000000000000000000000" + "0x8e9b35ad4a0a86f758446fffde34269d940ceacd": { + "balance": "0xd8d726b7177a800000" }, - "1b43232ccd4880d6f46fa751a96cd82473315841": { - "balance": "80000000000000000000" + "0x1b43232ccd4880d6f46fa751a96cd82473315841": { + "balance": "0x4563918244f400000" }, - "6eefdc850e87b715c72791773c0316c3559b58a4": { - "balance": "4000000000000000000000" + "0x6eefdc850e87b715c72791773c0316c3559b58a4": { + "balance": "0xd8d726b7177a800000" }, - "f2c03e2a38998c21648760f1e5ae7ea3077d8522": { - "balance": "2642456000000000000000" + "0xf2c03e2a38998c21648760f1e5ae7ea3077d8522": { + "balance": "0x8f3f7193ab079c0000" }, - "0625d06056968b002206ff91980140242bfaa499": { - "balance": "1000000000000000000000" + "0x0625d06056968b002206ff91980140242bfaa499": { + "balance": "0x3635c9adc5dea00000" }, - "6158e107c5eb54cb7604e0cd8dc1e07500d91c3c": { - "balance": "50000000000000000000" + "0x6158e107c5eb54cb7604e0cd8dc1e07500d91c3c": { + "balance": "0x2b5e3af16b1880000" }, - "02477212ffdd75e5155651b76506b1646671a1eb": { - "balance": "1760000000000000000000" + "0x02477212ffdd75e5155651b76506b1646671a1eb": { + "balance": "0x5f68e8131ecf800000" }, - "fa44a855e404c86d0ca8ef3324251dfb349c539e": { - "balance": "1552000000000000000000" + "0xfa44a855e404c86d0ca8ef3324251dfb349c539e": { + "balance": "0x542253a126ce400000" }, - "49897fe932bbb3154c95d3bce6d93b6d732904dd": { - "balance": "4000000000000000000000" + "0x49897fe932bbb3154c95d3bce6d93b6d732904dd": { + "balance": "0xd8d726b7177a800000" }, - "9b6641b13e172fc072ca4b8327a3bc28a15b66a9": { - "balance": "120000000000000000000" + "0x9b6641b13e172fc072ca4b8327a3bc28a15b66a9": { + "balance": "0x68155a43676e00000" }, - "a46b4387fb4dcce011e76e4d73547d4481e09be5": { - "balance": "1337000000000000000000" + "0xa46b4387fb4dcce011e76e4d73547d4481e09be5": { + "balance": "0x487a9a304539440000" }, - "72bb27cb99f3e2c2cf90a98f707d30e4a201a071": { - "balance": "1640000000000000000000" + "0x72bb27cb99f3e2c2cf90a98f707d30e4a201a071": { + "balance": "0x58e7926ee858a00000" }, - "b6bfe1c3ef94e1846fb9e3acfe9b50c3e9069233": { - "balance": "1999944000000000000000" + "0xb6bfe1c3ef94e1846fb9e3acfe9b50c3e9069233": { + "balance": "0x6c6acc67d7b1d40000" }, - "e6cb3f3124c9c9cc3834b1274bc3336456a38bac": { - "balance": "427382000000000000000" + "0xe6cb3f3124c9c9cc3834b1274bc3336456a38bac": { + "balance": "0x172b1de0a213ff0000" }, - "fcbc5c71ace79741450b012cf6b8d3f17db68a70": { - "balance": "9550000000000000000000" + "0xfcbc5c71ace79741450b012cf6b8d3f17db68a70": { + "balance": "0x205b4dfa1ee74780000" }, - "15dbb48c98309764f99ced3692dcca35ee306bac": { - "balance": "150000000000000000000000" + "0x15dbb48c98309764f99ced3692dcca35ee306bac": { + "balance": "0x1fc3842bd1f071c00000" }, - "2e10910ba6e0bc17e055556614cb87090f4d7e5b": { - "balance": "200000000000000000000" + "0x2e10910ba6e0bc17e055556614cb87090f4d7e5b": { + "balance": "0xad78ebc5ac6200000" }, - "e5fbe34984b637196f331c679d0c0c47d83410e1": { - "balance": "2000050000000000000000" + "0xe5fbe34984b637196f331c679d0c0c47d83410e1": { + "balance": "0x6c6c44fe47ec050000" }, - "6d120f0caae44fd94bcafe55e2e279ef96ba5c7a": { - "balance": "4000000000000000000000" + "0x6d120f0caae44fd94bcafe55e2e279ef96ba5c7a": { + "balance": "0xd8d726b7177a800000" }, - "aa5afcfd8309c2df9d15be5e6a504e7d706624c5": { - "balance": "5846763000000000000000" + "0xaa5afcfd8309c2df9d15be5e6a504e7d706624c5": { + "balance": "0x13cf422e305a1378000" }, - "37959c20b7e9931d72f5a8ae869dafddad3b6d5c": { - "balance": "200000000000000000000" + "0x37959c20b7e9931d72f5a8ae869dafddad3b6d5c": { + "balance": "0xad78ebc5ac6200000" }, - "b041310fe9eed6864cedd4bee58df88eb4ed3cac": { - "balance": "10000000000000000000000" + "0xb041310fe9eed6864cedd4bee58df88eb4ed3cac": { + "balance": "0x21e19e0c9bab2400000" }, - "986df47e76e4d7a789cdee913cc9831650936c9d": { - "balance": "5000000000000000000000" + "0x986df47e76e4d7a789cdee913cc9831650936c9d": { + "balance": "0x10f0cf064dd59200000" }, - "35aaa0465d1c260c420fa30e2629869fb6559207": { - "balance": "704976000000000000000" + "0x35aaa0465d1c260c420fa30e2629869fb6559207": { + "balance": "0x263781e0e087c80000" }, - "7f655c6789eddf455cb4b88099720639389eebac": { - "balance": "6000000000000000000000" + "0x7f655c6789eddf455cb4b88099720639389eebac": { + "balance": "0x14542ba12a337c00000" }, - "9e3eb509278fe0dcd8e0bbe78a194e06b6803943": { - "balance": "940000000000000000000" + "0x9e3eb509278fe0dcd8e0bbe78a194e06b6803943": { + "balance": "0x32f51edbaaa3300000" }, - "3e9410d3b9a87ed5e451a6b91bb8923fe90fb2b5": { - "balance": "200000000000000000000" + "0x3e9410d3b9a87ed5e451a6b91bb8923fe90fb2b5": { + "balance": "0xad78ebc5ac6200000" }, - "9e960dcd03d5ba99cb115d17ff4c09248ad4d0be": { - "balance": "200000000000000000000" + "0x9e960dcd03d5ba99cb115d17ff4c09248ad4d0be": { + "balance": "0xad78ebc5ac6200000" }, - "f057aa66ca767ede124a1c5b9cc5fc94ef0b0137": { - "balance": "2077730000000000000000" + "0xf057aa66ca767ede124a1c5b9cc5fc94ef0b0137": { + "balance": "0x70a24bcab6f45d0000" }, - "f38a6ca80168537e974d14e1c3d13990a44c2c1b": { - "balance": "6000000000000000000000" + "0xf38a6ca80168537e974d14e1c3d13990a44c2c1b": { + "balance": "0x14542ba12a337c00000" }, - "229e430de2b74f442651ddcdb70176bc054cad54": { - "balance": "13545000000000000000" + "0x229e430de2b74f442651ddcdb70176bc054cad54": { + "balance": "0xbbf981bc4aaa8000" }, - "27bf9f44ba7d05c33540c3a53bb02cbbffe7c3c6": { - "balance": "2000000000000000000000" + "0x27bf9f44ba7d05c33540c3a53bb02cbbffe7c3c6": { + "balance": "0x6c6b935b8bbd400000" }, - "10389858b800e8c0ec32f51ed61a355946cc409b": { - "balance": "200000000000000000000" + "0x10389858b800e8c0ec32f51ed61a355946cc409b": { + "balance": "0xad78ebc5ac6200000" }, - "fd2929271e9d2095a264767e7b0df52ea0d1d400": { - "balance": "3000040000000000000000" + "0xfd2929271e9d2095a264767e7b0df52ea0d1d400": { + "balance": "0xa2a1eb251b5ae40000" }, - "44250d476e062484e9080a3967bf3a4a732ad73f": { - "balance": "20000000000000000000" + "0x44250d476e062484e9080a3967bf3a4a732ad73f": { + "balance": "0x1158e460913d00000" }, - "0c67033dd8ee7f0c8ae534d42a51f7d9d4f7978f": { - "balance": "200000000000000000000" + "0x0c67033dd8ee7f0c8ae534d42a51f7d9d4f7978f": { + "balance": "0xad78ebc5ac6200000" }, - "e083d34863e0e17f926b7928edff317e998e9c4b": { - "balance": "400000000000000000000" + "0xe083d34863e0e17f926b7928edff317e998e9c4b": { + "balance": "0x15af1d78b58c400000" }, - "7f7192c0df1c7db6d9ed65d71184d8e4155a17ba": { - "balance": "79800000000000000000" + "0x7f7192c0df1c7db6d9ed65d71184d8e4155a17ba": { + "balance": "0x453728d33942c0000" }, - "51e7b55c2f9820eed73884361b5066a59b6f45c6": { - "balance": "2000000000000000000000" + "0x51e7b55c2f9820eed73884361b5066a59b6f45c6": { + "balance": "0x6c6b935b8bbd400000" }, - "4fa983bb5e3073a8edb557effeb4f9fb1d60ef86": { - "balance": "1599800000000000000000" + "0x4fa983bb5e3073a8edb557effeb4f9fb1d60ef86": { + "balance": "0x56b9af57e575ec0000" }, - "5a5ee8e9bb0e8ab2fecb4b33d29478be50bbd44b": { - "balance": "776000000000000000000" + "0x5a5ee8e9bb0e8ab2fecb4b33d29478be50bbd44b": { + "balance": "0x2a1129d09367200000" }, - "1f3959fc291110e88232c36b7667fc78a379613f": { - "balance": "18200000000000000000" + "0x1f3959fc291110e88232c36b7667fc78a379613f": { + "balance": "0xfc936392801c0000" }, - "2d7d5c40ddafc450b04a74a4dabc2bb5d665002e": { - "balance": "2000000000000000000000" + "0x2d7d5c40ddafc450b04a74a4dabc2bb5d665002e": { + "balance": "0x6c6b935b8bbd400000" }, - "5215183b8f80a9bc03d26ce91207832a0d39e620": { - "balance": "1000000000000000000000" + "0x5215183b8f80a9bc03d26ce91207832a0d39e620": { + "balance": "0x3635c9adc5dea00000" }, - "5607590059a9fec1881149a44b36949aef85d560": { - "balance": "2000000000000000000000" + "0x5607590059a9fec1881149a44b36949aef85d560": { + "balance": "0x6c6b935b8bbd400000" }, - "f7c50f922ad16b61c6d1baa045ed816815bac48f": { - "balance": "12566370000000000000000" + "0xf7c50f922ad16b61c6d1baa045ed816815bac48f": { + "balance": "0x2a9396a9784ad7d0000" }, - "da10978a39a46ff0bb848cf65dd9c77509a6d70e": { - "balance": "2000000000000000000000" + "0xda10978a39a46ff0bb848cf65dd9c77509a6d70e": { + "balance": "0x6c6b935b8bbd400000" }, - "a7dcbba9b9bf6762c145416c506a71e3b497209c": { - "balance": "1999944000000000000000" + "0xa7dcbba9b9bf6762c145416c506a71e3b497209c": { + "balance": "0x6c6acc67d7b1d40000" }, - "54e01283cc8b384538dd646770b357c960d6cacd": { - "balance": "5000000000000000000000" + "0x54e01283cc8b384538dd646770b357c960d6cacd": { + "balance": "0x10f0cf064dd59200000" }, - "78cf8336b328db3d87813a472b9e89b75e0cf3bc": { - "balance": "1000000000000000000000" + "0x78cf8336b328db3d87813a472b9e89b75e0cf3bc": { + "balance": "0x3635c9adc5dea00000" }, - "ba24fc436753a739db2c8d40e6d4d04c528e86fa": { - "balance": "13000000000000000000000" + "0xba24fc436753a739db2c8d40e6d4d04c528e86fa": { + "balance": "0x2c0bb3dd30c4e200000" }, - "dfe929a61c1b38eddbe82c25c2d6753cb1e12d68": { - "balance": "402500000000000000000" + "0xdfe929a61c1b38eddbe82c25c2d6753cb1e12d68": { + "balance": "0x15d1cf4176aeba0000" }, - "2b49fba29830360fcdb6da23bbfea5c0bbac5281": { - "balance": "20000000000000000000" + "0x2b49fba29830360fcdb6da23bbfea5c0bbac5281": { + "balance": "0x1158e460913d00000" }, - "76becae4a31d36f3cb577f2a43594fb1abc1bb96": { - "balance": "24860000000000000000000" + "0x76becae4a31d36f3cb577f2a43594fb1abc1bb96": { + "balance": "0x543a9ce0e1332f00000" }, - "e0cf698a053327ebd16b7d7700092fe2e8542446": { - "balance": "95275000000000000000" + "0xe0cf698a053327ebd16b7d7700092fe2e8542446": { + "balance": "0x52a34cbb61f578000" }, - "a3802d8a659e89a2c47e905430b2a827978950a7": { - "balance": "1000000000000000000000" + "0xa3802d8a659e89a2c47e905430b2a827978950a7": { + "balance": "0x3635c9adc5dea00000" }, - "75636cdb109050e43d5d6ec47e359e218e857eca": { - "balance": "22886800000000000000000" + "0x75636cdb109050e43d5d6ec47e359e218e857eca": { + "balance": "0x4d8b2276c8962280000" }, - "3d813ff2b6ed57b937dabf2b381d148a411fa085": { - "balance": "100000000000000000000" + "0x3d813ff2b6ed57b937dabf2b381d148a411fa085": { + "balance": "0x56bc75e2d63100000" }, - "a9252551a624ae513719dabe5207fbefb2fd7749": { - "balance": "40000000000000000000" + "0xa9252551a624ae513719dabe5207fbefb2fd7749": { + "balance": "0x22b1c8c1227a00000" }, - "c749668042e71123a648975e08ed6382f83e05e2": { - "balance": "14000000000000000000000" + "0xc749668042e71123a648975e08ed6382f83e05e2": { + "balance": "0x2f6f10780d22cc00000" }, - "04eca501630abce35218b174956b891ba25efb23": { - "balance": "1000060000000000000000" + "0x04eca501630abce35218b174956b891ba25efb23": { + "balance": "0x36369ed7747d260000" }, - "790f91bd5d1c5cc4739ae91300db89e1c1303c93": { - "balance": "2000000000000000000000" + "0x790f91bd5d1c5cc4739ae91300db89e1c1303c93": { + "balance": "0x6c6b935b8bbd400000" }, - "009560a3de627868f91fa8bfe1c1b7afaf08186b": { - "balance": "524000000000000000000" + "0x009560a3de627868f91fa8bfe1c1b7afaf08186b": { + "balance": "0x1c67f5f7baa0b00000" }, - "1329dd19cd4baa9fc64310efeceab22117251f12": { - "balance": "200000000000000000000" + "0x1329dd19cd4baa9fc64310efeceab22117251f12": { + "balance": "0xad78ebc5ac6200000" }, - "7005a772282b1f62afda63f89b5dc6ab64c84cb9": { - "balance": "18000000000000000000000" + "0x7005a772282b1f62afda63f89b5dc6ab64c84cb9": { + "balance": "0x3cfc82e37e9a7400000" }, - "abfe936425dcc7b74b955082bbaaf2a11d78bc05": { - "balance": "1400000000000000000000" + "0xabfe936425dcc7b74b955082bbaaf2a11d78bc05": { + "balance": "0x4be4e7267b6ae00000" }, - "97d0d9725e3b70e675843173938ed371b62c7fac": { - "balance": "170000000000000000000" + "0x97d0d9725e3b70e675843173938ed371b62c7fac": { + "balance": "0x93739534d28680000" }, - "41ed2d8e7081482c919fc23d8f0091b3c82c4685": { - "balance": "1295460000000000000000" + "0x41ed2d8e7081482c919fc23d8f0091b3c82c4685": { + "balance": "0x463a1e765bd78a0000" }, - "992365d764c5ce354039ddfc912e023a75b8e168": { - "balance": "18200000000000000000" + "0x992365d764c5ce354039ddfc912e023a75b8e168": { + "balance": "0xfc936392801c0000" }, - "e1c607c0a8a060da8f02a8eb38a013ea8cda5b8c": { - "balance": "805000000000000000000" + "0xe1c607c0a8a060da8f02a8eb38a013ea8cda5b8c": { + "balance": "0x2ba39e82ed5d740000" }, - "3b2c45990e21474451cf4f59f01955b331c7d7c9": { - "balance": "2000000000000000000000" + "0x3b2c45990e21474451cf4f59f01955b331c7d7c9": { + "balance": "0x6c6b935b8bbd400000" }, - "29ac2b458454a36c7e96c73a8667222a12242c71": { - "balance": "4000000000000000000000" + "0x29ac2b458454a36c7e96c73a8667222a12242c71": { + "balance": "0xd8d726b7177a800000" }, - "b8555010776e3c5cb311a5adeefe9e92bb9a64b9": { - "balance": "4000000000000000000000" + "0xb8555010776e3c5cb311a5adeefe9e92bb9a64b9": { + "balance": "0xd8d726b7177a800000" }, - "30380087786965149e81423b15e313ba32c5c783": { - "balance": "18200000000000000000" + "0x30380087786965149e81423b15e313ba32c5c783": { + "balance": "0xfc936392801c0000" }, - "a2f86bc061884e9eef05640edd51a2f7c0596c69": { - "balance": "2000050000000000000000" + "0xa2f86bc061884e9eef05640edd51a2f7c0596c69": { + "balance": "0x6c6c44fe47ec050000" }, - "9f98eb34d46979b0a6de8b05aa533a89b825dcf1": { - "balance": "86500000000000000000" + "0x9f98eb34d46979b0a6de8b05aa533a89b825dcf1": { + "balance": "0x4b06dbbb40f4a0000" }, - "c81fb7d20fd2800192f0aac198d6d6a37d3fcb7d": { - "balance": "259500000000000000000" + "0xc81fb7d20fd2800192f0aac198d6d6a37d3fcb7d": { + "balance": "0xe1149331c2dde0000" }, - "a4035ab1e5180821f0f380f1131b7387c8d981cd": { - "balance": "20000000000000000000" + "0xa4035ab1e5180821f0f380f1131b7387c8d981cd": { + "balance": "0x1158e460913d00000" }, - "782f52f0a676c77716d574c81ec4684f9a020a97": { - "balance": "850055000000000000000" + "0x782f52f0a676c77716d574c81ec4684f9a020a97": { + "balance": "0x2e14e206b730ad8000" }, - "261e0fa64c51137465eecf5b90f197f7937fdb05": { - "balance": "18000000000000000000000" + "0x261e0fa64c51137465eecf5b90f197f7937fdb05": { + "balance": "0x3cfc82e37e9a7400000" }, - "276fd7d24f8f883f5a7a28295bf17151c7a84b03": { - "balance": "2000000000000000000000" + "0x276fd7d24f8f883f5a7a28295bf17151c7a84b03": { + "balance": "0x6c6b935b8bbd400000" }, - "a1f5b840140d5a9acef402ac3cc3886a68cad248": { - "balance": "2000000000000000000000" + "0xa1f5b840140d5a9acef402ac3cc3886a68cad248": { + "balance": "0x6c6b935b8bbd400000" }, - "d2bf67a7f3c6ce56b7be41675dbbadfe7ea93a33": { - "balance": "400000000000000000000" + "0xd2bf67a7f3c6ce56b7be41675dbbadfe7ea93a33": { + "balance": "0x15af1d78b58c400000" }, - "8ee584337ddbc80f9e3498df55f0a21eacb57fb1": { - "balance": "20000000000000000000" + "0x8ee584337ddbc80f9e3498df55f0a21eacb57fb1": { + "balance": "0x1158e460913d00000" }, - "34393c5d91b9de597203e75bac4309b5fa3d28c3": { - "balance": "194000000000000000000" + "0x34393c5d91b9de597203e75bac4309b5fa3d28c3": { + "balance": "0xa844a7424d9c80000" }, - "114cbbbf6fb52ac414be7ec61f7bb71495ce1dfa": { - "balance": "3000000000000000000000" + "0x114cbbbf6fb52ac414be7ec61f7bb71495ce1dfa": { + "balance": "0xa2a15d09519be00000" }, - "ab7c42c5e52d641a07ad75099c62928b7f86622f": { - "balance": "335940000000000000000" + "0xab7c42c5e52d641a07ad75099c62928b7f86622f": { + "balance": "0x12361aa21d14ba0000" }, - "80bf995ed8ba92701d10fec49f9e7d014dbee026": { - "balance": "572153000000000000000" + "0x80bf995ed8ba92701d10fec49f9e7d014dbee026": { + "balance": "0x1f0437ca1a7e128000" }, - "4a192035e2619b24b0709d56590e9183ccf2c1d9": { - "balance": "10000000000000000000000" + "0x4a192035e2619b24b0709d56590e9183ccf2c1d9": { + "balance": "0x21e19e0c9bab2400000" }, - "376cd7577383e902951b60a2017ba7ea29e33576": { - "balance": "2000000000000000000000" + "0x376cd7577383e902951b60a2017ba7ea29e33576": { + "balance": "0x6c6b935b8bbd400000" }, - "f5437e158090b2a2d68f82b54a5864b95dd6dbea": { - "balance": "4010732000000000000000" + "0xf5437e158090b2a2d68f82b54a5864b95dd6dbea": { + "balance": "0xd96c16703b2bfe0000" }, - "13a5eecb38305df94971ef2d9e179ae6cebab337": { - "balance": "330000000000000000000" + "0x13a5eecb38305df94971ef2d9e179ae6cebab337": { + "balance": "0x11e3ab8395c6e80000" }, - "efc8cf1963c9a95267b228c086239889f4dfd467": { - "balance": "10000000000000000000000" + "0xefc8cf1963c9a95267b228c086239889f4dfd467": { + "balance": "0x21e19e0c9bab2400000" }, - "db77b88dcb712fd17ee91a5b94748d720c90a994": { - "balance": "2000000000000000000000" + "0xdb77b88dcb712fd17ee91a5b94748d720c90a994": { + "balance": "0x6c6b935b8bbd400000" }, - "9aaafa0067647ed999066b7a4ca5b4b3f3feaa6f": { - "balance": "1000000000000000000000" + "0x9aaafa0067647ed999066b7a4ca5b4b3f3feaa6f": { + "balance": "0x3635c9adc5dea00000" }, - "ae36f7452121913e800e0fcd1a65a5471c23846f": { - "balance": "164000000000000000000" + "0xae36f7452121913e800e0fcd1a65a5471c23846f": { + "balance": "0x8e3f50b173c100000" }, - "b124bcb6ffa430fcae2e86b45f27e3f21e81ee08": { - "balance": "2000000000000000000000" + "0xb124bcb6ffa430fcae2e86b45f27e3f21e81ee08": { + "balance": "0x6c6b935b8bbd400000" }, - "f2813a64c5265d020235cb9c319b6c96f906c41e": { - "balance": "350000000000000000000" + "0xf2813a64c5265d020235cb9c319b6c96f906c41e": { + "balance": "0x12f939c99edab80000" }, - "e848ca7ebff5c24f9b9c316797a43bf7c356292d": { - "balance": "114000000000000000000" + "0xe848ca7ebff5c24f9b9c316797a43bf7c356292d": { + "balance": "0x62e115c008a880000" }, - "21a6feb6ab11c766fdd977f8df4121155f47a1c0": { - "balance": "57200000000000000000" + "0x21a6feb6ab11c766fdd977f8df4121155f47a1c0": { + "balance": "0x319cf38f100580000" }, - "e95e92bbc6de07bf3a660ebf5feb1c8a3527e1c5": { - "balance": "18200000000000000000" + "0xe95e92bbc6de07bf3a660ebf5feb1c8a3527e1c5": { + "balance": "0xfc936392801c0000" }, - "0b369e002e1b4c7913fcf00f2d5e19c58165478f": { - "balance": "64520000000000000000" + "0x0b369e002e1b4c7913fcf00f2d5e19c58165478f": { + "balance": "0x37f6516288c340000" }, - "0909648c18a3ce5bae7a047ec2f868d24cdda81d": { - "balance": "3820000000000000000000" + "0x0909648c18a3ce5bae7a047ec2f868d24cdda81d": { + "balance": "0xcf152640c5c8300000" }, - "d32b45564614516c91b07fa9f72dcf787cce4e1c": { - "balance": "291000000000000000000" + "0xd32b45564614516c91b07fa9f72dcf787cce4e1c": { + "balance": "0xfc66fae3746ac0000" }, - "cf1bdb799b2ea63ce134668bdc198b54840f180b": { - "balance": "18200000000000000000" + "0xcf1bdb799b2ea63ce134668bdc198b54840f180b": { + "balance": "0xfc936392801c0000" }, - "ae062c448618643075de7a0030342dced63dbad7": { - "balance": "825982000000000000000" + "0xae062c448618643075de7a0030342dced63dbad7": { + "balance": "0x2cc6cd8cc282b30000" }, - "99dfd0504c06c743e46534fd7b55f1f9c7ec3329": { - "balance": "2000000000000000000000" + "0x99dfd0504c06c743e46534fd7b55f1f9c7ec3329": { + "balance": "0x6c6b935b8bbd400000" }, - "87fc4635263944ce14a46c75fa4a821f39ce7f72": { - "balance": "20000000000000000000" + "0x87fc4635263944ce14a46c75fa4a821f39ce7f72": { + "balance": "0x1158e460913d00000" }, - "27c2d7ca504daa3d9066dc09137dc42f3aaab452": { - "balance": "600000000000000000000" + "0x27c2d7ca504daa3d9066dc09137dc42f3aaab452": { + "balance": "0x2086ac351052600000" }, - "cc60f836acdef3548a1fefcca13ec6a937db44a0": { - "balance": "86500000000000000000" + "0xcc60f836acdef3548a1fefcca13ec6a937db44a0": { + "balance": "0x4b06dbbb40f4a0000" }, - "c910a970556c9716ea53af66ddef93143124913d": { - "balance": "1580000000000000000000" + "0xc910a970556c9716ea53af66ddef93143124913d": { + "balance": "0x55a6e79ccd1d300000" }, - "8173c835646a672e0152be10ffe84162dd256e4c": { - "balance": "492000000000000000000" + "0x8173c835646a672e0152be10ffe84162dd256e4c": { + "balance": "0x1aabdf2145b4300000" }, - "e989733ca1d58d9e7b5029ba5d444858bec03172": { - "balance": "581595000000000000000" + "0xe989733ca1d58d9e7b5029ba5d444858bec03172": { + "balance": "0x1f87408313df4f8000" }, - "86806474c358047d9406e6a07f40945bc8328e67": { - "balance": "6884000000000000000000" + "0x86806474c358047d9406e6a07f40945bc8328e67": { + "balance": "0x1752eb0f7013d100000" }, - "5395a4455d95d178b4532aa4725b193ffe512961": { - "balance": "1000000000000000000000" + "0x5395a4455d95d178b4532aa4725b193ffe512961": { + "balance": "0x3635c9adc5dea00000" }, - "56397638bb3cebf1f62062794b5eb942f916171d": { - "balance": "2000000000000000000000" + "0x56397638bb3cebf1f62062794b5eb942f916171d": { + "balance": "0x6c6b935b8bbd400000" }, - "6958f83bb2fdfb27ce0409cd03f9c5edbf4cbedd": { - "balance": "20000000000000000000000" + "0x6958f83bb2fdfb27ce0409cd03f9c5edbf4cbedd": { + "balance": "0x43c33c1937564800000" }, - "26ff0a51e7cece8400276978dbd6236ef162c0e6": { - "balance": "100020000000000000000000" + "0x26ff0a51e7cece8400276978dbd6236ef162c0e6": { + "balance": "0x152e185627540a500000" }, - "4ca783b556e5bf53aa13c8116613d65782c9b642": { - "balance": "25200000000000000000000" + "0x4ca783b556e5bf53aa13c8116613d65782c9b642": { + "balance": "0x5561840b4ad83c00000" }, - "15a0aec37ff9ff3d5409f2a4f0c1212aaccb0296": { - "balance": "1000000000000000000000" + "0x15a0aec37ff9ff3d5409f2a4f0c1212aaccb0296": { + "balance": "0x3635c9adc5dea00000" }, - "50378af7ef54043f892ab7ce97d647793511b108": { - "balance": "19700000000000000000" + "0x50378af7ef54043f892ab7ce97d647793511b108": { + "balance": "0x11164759ffb320000" }, - "e7c6b5fc05fc748e5b4381726449a1c0ad0fb0f1": { - "balance": "2000000000000000000000" + "0xe7c6b5fc05fc748e5b4381726449a1c0ad0fb0f1": { + "balance": "0x6c6b935b8bbd400000" }, - "5317ecb023052ca7f5652be2fa854cfe4563df4d": { - "balance": "499986000000000000000" + "0x5317ecb023052ca7f5652be2fa854cfe4563df4d": { + "balance": "0x1b1ab319f5ec750000" }, - "c94f7c35c027d47df8ef4f9df85a9248a17dd23b": { - "balance": "29944000000000000000" + "0xc94f7c35c027d47df8ef4f9df85a9248a17dd23b": { + "balance": "0x19f8e7559924c0000" }, - "6a63fc89abc7f36e282d80787b7b04afd6553e71": { - "balance": "160000000000000000000" + "0x6a63fc89abc7f36e282d80787b7b04afd6553e71": { + "balance": "0x8ac7230489e800000" }, - "5fd3d6777ec2620ae83a05528ed425072d3ca8fd": { - "balance": "2000000000000000000000" + "0x5fd3d6777ec2620ae83a05528ed425072d3ca8fd": { + "balance": "0x6c6b935b8bbd400000" }, - "29adcf83b6b20ac6a434abb1993cbd05c60ea2e4": { - "balance": "10000000000000000000000" + "0x29adcf83b6b20ac6a434abb1993cbd05c60ea2e4": { + "balance": "0x21e19e0c9bab2400000" }, - "8c6f9f4e5b7ae276bf58497bd7bf2a7d25245f64": { - "balance": "2730000000000000000000" + "0x8c6f9f4e5b7ae276bf58497bd7bf2a7d25245f64": { + "balance": "0x93fe5c57d710680000" }, - "d94a57882a52739bbe2a0647c80c24f58a2b4f1c": { - "balance": "1341230000000000000000" + "0xd94a57882a52739bbe2a0647c80c24f58a2b4f1c": { + "balance": "0x48b54e2adbe12b0000" }, - "7286e89cd9de8f7a8a00c86ffdb53992dd9251d1": { - "balance": "1940000000000000000000" + "0x7286e89cd9de8f7a8a00c86ffdb53992dd9251d1": { + "balance": "0x692ae8897081d00000" }, - "5773b6026721a1dd04b7828cd62b591bfb34534c": { - "balance": "27000000000000000000000" + "0x5773b6026721a1dd04b7828cd62b591bfb34534c": { + "balance": "0x5b7ac4553de7ae00000" }, - "11fefb5dc1a4598aa712640c517775dfa1d91f8c": { - "balance": "10000000000000000000000" + "0x11fefb5dc1a4598aa712640c517775dfa1d91f8c": { + "balance": "0x21e19e0c9bab2400000" }, - "c6e324beeb5b36765ecd464260f7f26006c5c62e": { - "balance": "2000000000000000000000" + "0xc6e324beeb5b36765ecd464260f7f26006c5c62e": { + "balance": "0x6c6b935b8bbd400000" }, - "118fbd753b9792395aef7a4d78d263cdcaabd4f7": { - "balance": "999800000000000000000" + "0x118fbd753b9792395aef7a4d78d263cdcaabd4f7": { + "balance": "0x36330322d5238c0000" }, - "f8298591523e50b103f0b701d623cbf0f74556f6": { - "balance": "200000000000000000000" + "0xf8298591523e50b103f0b701d623cbf0f74556f6": { + "balance": "0xad78ebc5ac6200000" }, - "ab0ced762e1661fae1a92afb1408889413794825": { - "balance": "1910000000000000000000" + "0xab0ced762e1661fae1a92afb1408889413794825": { + "balance": "0x678a932062e4180000" }, - "fa67b67b4f37a0150915110ede073b05b853bda2": { - "balance": "647490000000000000000" + "0xfa67b67b4f37a0150915110ede073b05b853bda2": { + "balance": "0x2319ba947371ad0000" }, - "ca122cf0f2948896b74843f49afed0ba1618eed7": { - "balance": "560000000000000000000" + "0xca122cf0f2948896b74843f49afed0ba1618eed7": { + "balance": "0x1e5b8fa8fe2ac00000" }, - "186b95f8e5effddcc94f1a315bf0295d3b1ea588": { - "balance": "1999944000000000000000" + "0x186b95f8e5effddcc94f1a315bf0295d3b1ea588": { + "balance": "0x6c6acc67d7b1d40000" }, - "2915624bcb679137b8dae9ab57d11b4905eaee4b": { - "balance": "20000000000000000000" + "0x2915624bcb679137b8dae9ab57d11b4905eaee4b": { + "balance": "0x1158e460913d00000" }, - "0c6845bf41d5ee273c3ee6b5b0d69f6fd5eabbf7": { - "balance": "3000026000000000000000" + "0x0c6845bf41d5ee273c3ee6b5b0d69f6fd5eabbf7": { + "balance": "0xa2a1b9682e58090000" }, - "cb7479109b43b26657f4465f4d18c6f974be5f42": { - "balance": "1820000000000000000000" + "0xcb7479109b43b26657f4465f4d18c6f974be5f42": { + "balance": "0x62a992e53a0af00000" }, - "8dd6a9bae57f518549ada677466fea8ab04fd9b4": { - "balance": "4000000000000000000000" + "0x8dd6a9bae57f518549ada677466fea8ab04fd9b4": { + "balance": "0xd8d726b7177a800000" }, - "34958a46d30e30b273ecc6e5d358a212e5307e8c": { - "balance": "2000000000000000000000" + "0x34958a46d30e30b273ecc6e5d358a212e5307e8c": { + "balance": "0x6c6b935b8bbd400000" }, - "2003717907a72560f4307f1beecc5436f43d21e7": { - "balance": "500000000000000000000" + "0x2003717907a72560f4307f1beecc5436f43d21e7": { + "balance": "0x1b1ae4d6e2ef500000" }, - "55ab99b0e0e55d7bb874b7cfe834de631c97ec23": { - "balance": "1031400000000000000000" + "0x55ab99b0e0e55d7bb874b7cfe834de631c97ec23": { + "balance": "0x37e98ce36899e40000" }, - "79b48d2d6137c3854d611c01ea42427a0f597bb7": { - "balance": "191000000000000000000" + "0x79b48d2d6137c3854d611c01ea42427a0f597bb7": { + "balance": "0xa5aa85009e39c0000" }, - "d609ec0be70d0ad26f6e67c9d4762b52ee51122c": { - "balance": "1000000000000000000000" + "0xd609ec0be70d0ad26f6e67c9d4762b52ee51122c": { + "balance": "0x3635c9adc5dea00000" }, - "e8c3f045bb7d38c9d2f395b0ba8492b253230901": { - "balance": "9000000000000000000000" + "0xe8c3f045bb7d38c9d2f395b0ba8492b253230901": { + "balance": "0x1e7e4171bf4d3a00000" }, - "aaca60d9d700e78596bbbbb1f1e2f70f4627f9d8": { - "balance": "999996000000000000000" + "0xaaca60d9d700e78596bbbbb1f1e2f70f4627f9d8": { + "balance": "0x3635bb77cb4b860000" }, - "89d75b8e0831e46f80bc174188184e006fde0eae": { - "balance": "1000000000000000000000" + "0x89d75b8e0831e46f80bc174188184e006fde0eae": { + "balance": "0x3635c9adc5dea00000" }, - "b3667894b7863c068ad344873fcff4b5671e0689": { - "balance": "20000000000000000000000" + "0xb3667894b7863c068ad344873fcff4b5671e0689": { + "balance": "0x43c33c1937564800000" }, - "bc1609d685b76b48ec909aa099219022f89b2ccd": { - "balance": "1182000000000000000000" + "0xbc1609d685b76b48ec909aa099219022f89b2ccd": { + "balance": "0x40138b917edfb80000" }, - "88ee7f0efc8f778c6b687ec32be9e7d6f020b674": { - "balance": "2000000000000000000000" + "0x88ee7f0efc8f778c6b687ec32be9e7d6f020b674": { + "balance": "0x6c6b935b8bbd400000" }, - "470ac5d1f3efe28f3802af925b571e63868b397d": { - "balance": "2000000000000000000000" + "0x470ac5d1f3efe28f3802af925b571e63868b397d": { + "balance": "0x6c6b935b8bbd400000" }, - "abf8ffe0708a99b528cc1ed4e9ce4b0d0630be8c": { - "balance": "2263600000000000000000" + "0xabf8ffe0708a99b528cc1ed4e9ce4b0d0630be8c": { + "balance": "0x7ab5c2aeeee6380000" }, - "8cee38d6595788a56e3fb94634b3ffe1fbdb26d6": { - "balance": "20000000000000000000000" + "0x8cee38d6595788a56e3fb94634b3ffe1fbdb26d6": { + "balance": "0x43c33c1937564800000" }, - "19798cbda715ea9a9b9d6aab942c55121e98bf91": { - "balance": "1200000000000000000000" + "0x19798cbda715ea9a9b9d6aab942c55121e98bf91": { + "balance": "0x410d586a20a4c00000" }, - "e25a167b031e84616d0f013f31bda95dcc6350b9": { - "balance": "10560000000000000000000" + "0xe25a167b031e84616d0f013f31bda95dcc6350b9": { + "balance": "0x23c757072b8dd000000" }, - "6196c3d3c0908d254366b7bca55745222d9d4db1": { - "balance": "4000000000000000000000" + "0x6196c3d3c0908d254366b7bca55745222d9d4db1": { + "balance": "0xd8d726b7177a800000" }, - "e8e9850586e94f5299ab494bb821a5f40c00bd04": { - "balance": "3820000000000000000000" + "0xe8e9850586e94f5299ab494bb821a5f40c00bd04": { + "balance": "0xcf152640c5c8300000" }, - "1059cbc63e36c43e88f30008aca7ce058eeaa096": { - "balance": "100000000000000000000000" + "0x1059cbc63e36c43e88f30008aca7ce058eeaa096": { + "balance": "0x152d02c7e14af6800000" }, - "c4f2913b265c430fa1ab8adf26c333fc1d9b66f2": { - "balance": "20000000000000000000" + "0xc4f2913b265c430fa1ab8adf26c333fc1d9b66f2": { + "balance": "0x1158e460913d00000" }, - "26e9e2ad729702626417ef25de0dc800f7a779b3": { - "balance": "1000000000000000000000" + "0x26e9e2ad729702626417ef25de0dc800f7a779b3": { + "balance": "0x3635c9adc5dea00000" }, - "0dfbd4817050d91d9d625c02053cf61a3ee28572": { - "balance": "340000000000000000000" + "0x0dfbd4817050d91d9d625c02053cf61a3ee28572": { + "balance": "0x126e72a69a50d00000" }, - "709fe9d2c1f1ce42207c9585044a60899f35942f": { - "balance": "2000000000000000000000" + "0x709fe9d2c1f1ce42207c9585044a60899f35942f": { + "balance": "0x6c6b935b8bbd400000" }, - "7ad82caea1a8b4ed05319b9c9870173c814e06ee": { - "balance": "616000000000000000000" + "0x7ad82caea1a8b4ed05319b9c9870173c814e06ee": { + "balance": "0x2164b7a04ac8a00000" }, - "2a595f16eee4cb0c17d9a2d939b3c10f6c677243": { - "balance": "1100000000000000000000" + "0x2a595f16eee4cb0c17d9a2d939b3c10f6c677243": { + "balance": "0x3ba1910bf341b00000" }, - "a8f89dd5cc6e64d7b1eeace00702022cd7d2f03d": { - "balance": "700000000000000000000" + "0xa8f89dd5cc6e64d7b1eeace00702022cd7d2f03d": { + "balance": "0x25f273933db5700000" }, - "c0a6cbad77692a3d88d141ef769a99bb9e3c9951": { - "balance": "100000000000000000000" + "0xc0a6cbad77692a3d88d141ef769a99bb9e3c9951": { + "balance": "0x56bc75e2d63100000" }, - "868c23be873466d4c74c220a19b245d1787e807f": { - "balance": "1366481000000000000000" + "0x868c23be873466d4c74c220a19b245d1787e807f": { + "balance": "0x4a13bbbd92c88e8000" }, - "2905b192e83ce659aa355b9d0c204e3e95f9bb9a": { - "balance": "2160817000000000000000" + "0x2905b192e83ce659aa355b9d0c204e3e95f9bb9a": { + "balance": "0x75235c1d00393e8000" }, - "50b9fef0a1329b02d16506255f5a2db71ec92d1f": { - "balance": "1325464000000000000000" + "0x50b9fef0a1329b02d16506255f5a2db71ec92d1f": { + "balance": "0x47da821564085c0000" }, - "fc10b7a67b3268d5331bfb6a14def5ea4a162ca3": { - "balance": "200000000000000000000" + "0xfc10b7a67b3268d5331bfb6a14def5ea4a162ca3": { + "balance": "0xad78ebc5ac6200000" }, - "85eb256b51c819d60ea61a82d12c9358d59c1cae": { - "balance": "460000000000000000000" + "0x85eb256b51c819d60ea61a82d12c9358d59c1cae": { + "balance": "0x18efc84ad0c7b00000" }, - "75de7e9352e90b13a59a5878ffecc7831cac4d82": { - "balance": "2740000000000000000000" + "0x75de7e9352e90b13a59a5878ffecc7831cac4d82": { + "balance": "0x9489237adb9a500000" }, - "d32b2c79c36478c5431901f6d700b04dbe9b8810": { - "balance": "396000000000000000000" + "0xd32b2c79c36478c5431901f6d700b04dbe9b8810": { + "balance": "0x15779a9de6eeb00000" }, - "2d0326b23f0409c0c0e9236863a133075a94ba18": { - "balance": "210380000000000000000" + "0x2d0326b23f0409c0c0e9236863a133075a94ba18": { + "balance": "0xb679be75be6ae0000" }, - "d2e21ed56868fab28e0947927adaf29f23ebad6c": { - "balance": "1994000000000000000000" + "0xd2e21ed56868fab28e0947927adaf29f23ebad6c": { + "balance": "0x6c184f1355d0e80000" }, - "2ad6c9d10c261819a1a0ca2c48d8c7b2a71728df": { - "balance": "1000000000000000000000" + "0x2ad6c9d10c261819a1a0ca2c48d8c7b2a71728df": { + "balance": "0x3635c9adc5dea00000" }, - "7d445267c59ab8d2a2d9e709990e09682580c49f": { - "balance": "1000000000000000000000" + "0x7d445267c59ab8d2a2d9e709990e09682580c49f": { + "balance": "0x3635c9adc5dea00000" }, - "b6047cdf932db3e4045f4976122341537ed5961e": { - "balance": "20000000000000000000" + "0xb6047cdf932db3e4045f4976122341537ed5961e": { + "balance": "0x1158e460913d00000" }, - "2b3cf97311ff30f460945a9d8099f4a88e26d456": { - "balance": "2000000000000000000000" + "0x2b3cf97311ff30f460945a9d8099f4a88e26d456": { + "balance": "0x6c6b935b8bbd400000" }, - "7f4f593b618c330ba2c3d5f41eceeb92e27e426c": { - "balance": "2775000000000000000000" + "0x7f4f593b618c330ba2c3d5f41eceeb92e27e426c": { + "balance": "0x966edc756b7cfc0000" }, - "72a2fc8675feb972fa41b50dffdbbae7fa2adfb7": { - "balance": "2853840000000000000000" + "0x72a2fc8675feb972fa41b50dffdbbae7fa2adfb7": { + "balance": "0x9ab4fc67b528c80000" }, - "076561a856455d7ef86e63f87c73dbb628a55f45": { - "balance": "900000000000000000000" + "0x076561a856455d7ef86e63f87c73dbb628a55f45": { + "balance": "0x30ca024f987b900000" }, - "03d1724fd00e54aabcd2de2a91e8462b1049dd3a": { - "balance": "2640000000000000000000" + "0x03d1724fd00e54aabcd2de2a91e8462b1049dd3a": { + "balance": "0x8f1d5c1cae37400000" }, - "7ea0f96ee0a573a330b56897761f3d4c0130a8e3": { - "balance": "1337000000000000000000" + "0x7ea0f96ee0a573a330b56897761f3d4c0130a8e3": { + "balance": "0x487a9a304539440000" }, - "fe65c4188d7922576909642044fdc52395560165": { - "balance": "4000000000000000000000" + "0xfe65c4188d7922576909642044fdc52395560165": { + "balance": "0xd8d726b7177a800000" }, - "57883010b4ac857fedac03eab2551723a8447ffb": { - "balance": "1000000000000000000000" + "0x57883010b4ac857fedac03eab2551723a8447ffb": { + "balance": "0x3635c9adc5dea00000" }, - "0729a8a4a5ba23f579d0025b1ad0f8a0d35cdfd2": { - "balance": "9700000000000000000000" + "0x0729a8a4a5ba23f579d0025b1ad0f8a0d35cdfd2": { + "balance": "0x20dd68aaf3289100000" }, - "e75c1fb177089f3e58b1067935a6596ef1737fb5": { - "balance": "99910000000000000000" + "0xe75c1fb177089f3e58b1067935a6596ef1737fb5": { + "balance": "0x56a879fa775470000" }, - "e0e978753d982f7f9d1d238a18bd4889aefe451b": { - "balance": "9700000000000000000000" + "0xe0e978753d982f7f9d1d238a18bd4889aefe451b": { + "balance": "0x20dd68aaf3289100000" }, - "5620f46d1451c2353d6243a5d4b427130be2d407": { - "balance": "60000000000000000000" + "0x5620f46d1451c2353d6243a5d4b427130be2d407": { + "balance": "0x340aad21b3b700000" }, - "f3d688f06bbdbf50f9932c4145cbe48ecdf68904": { - "balance": "20000000000000000000" + "0xf3d688f06bbdbf50f9932c4145cbe48ecdf68904": { + "balance": "0x1158e460913d00000" }, - "3aa948ea02397755effb2f9dc9392df1058f7e33": { - "balance": "850000000000000000000" + "0x3aa948ea02397755effb2f9dc9392df1058f7e33": { + "balance": "0x2e141ea081ca080000" }, - "20d1417f99c569e3beb095856530fe12d0fceaaa": { - "balance": "1182175000000000000000" + "0x20d1417f99c569e3beb095856530fe12d0fceaaa": { + "balance": "0x4015f94b1183698000" }, - "ac77bdf00fd5985b5db12bbef800380abc2a0677": { - "balance": "1000000000000000000000" + "0xac77bdf00fd5985b5db12bbef800380abc2a0677": { + "balance": "0x3635c9adc5dea00000" }, - "267a7e6e82e1b91d51deddb644f0e96dbb1f7f7e": { - "balance": "20000000000000000000" + "0x267a7e6e82e1b91d51deddb644f0e96dbb1f7f7e": { + "balance": "0x1158e460913d00000" }, - "4bbcbf38b3c90163a84b1cd2a93b58b2a3348d87": { - "balance": "8000000000000000000000" + "0x4bbcbf38b3c90163a84b1cd2a93b58b2a3348d87": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "4c6b93a3bec16349540cbfcae96c9621d6645010": { - "balance": "2000000000000000000000" + "0x4c6b93a3bec16349540cbfcae96c9621d6645010": { + "balance": "0x6c6b935b8bbd400000" }, - "c9308879056dfe138ef8208f79a915c6bc7e70a8": { - "balance": "10000000000000000000000" + "0xc9308879056dfe138ef8208f79a915c6bc7e70a8": { + "balance": "0x21e19e0c9bab2400000" }, - "c48b693cacefdbd6cb5d7895a42e3196327e261c": { - "balance": "1000000000000000000000" + "0xc48b693cacefdbd6cb5d7895a42e3196327e261c": { + "balance": "0x3635c9adc5dea00000" }, - "a0951970dfd0832fb83bda12c23545e79041756c": { - "balance": "600000000000000000000" + "0xa0951970dfd0832fb83bda12c23545e79041756c": { + "balance": "0x2086ac351052600000" }, - "7cdf74213945953db39ad0e8a9781add792e4d1d": { - "balance": "2000000000000000000000" + "0x7cdf74213945953db39ad0e8a9781add792e4d1d": { + "balance": "0x6c6b935b8bbd400000" }, - "75621865b6591365606ed378308c2d1def4f222c": { - "balance": "3100000000000000000000" + "0x75621865b6591365606ed378308c2d1def4f222c": { + "balance": "0xa80d24677efef00000" }, - "67d6a8aa1bf8d6eaf7384e993dfdf10f0af68a61": { - "balance": "198067000000000000000" + "0x67d6a8aa1bf8d6eaf7384e993dfdf10f0af68a61": { + "balance": "0xabcbb5718974b8000" }, - "8f0af37566d152802f1ae8f928b25af9b139b448": { - "balance": "200000000000000000000" + "0x8f0af37566d152802f1ae8f928b25af9b139b448": { + "balance": "0xad78ebc5ac6200000" }, - "2c6afcd4037c1ed14fa74ff6758e0945a185a8e8": { - "balance": "17600000000000000000" + "0x2c6afcd4037c1ed14fa74ff6758e0945a185a8e8": { + "balance": "0xf43fc2c04ee00000" }, - "c1b2aa8cb2bf62cdc13a47ecc4657facaa995f98": { - "balance": "1000129000000000000000" + "0xc1b2aa8cb2bf62cdc13a47ecc4657facaa995f98": { + "balance": "0x363793fa96e6a68000" }, - "9e8144e08e89647811fe6b72d445d6a5f80ad244": { - "balance": "10000000000000000000000" + "0x9e8144e08e89647811fe6b72d445d6a5f80ad244": { + "balance": "0x21e19e0c9bab2400000" }, - "e04ff5e5a7e2af995d8857ce0290b53a2b0eda5d": { - "balance": "1000000000000000000000" + "0xe04ff5e5a7e2af995d8857ce0290b53a2b0eda5d": { + "balance": "0x3635c9adc5dea00000" }, - "03dedfcd0b3c2e17c705da248790ef98a6bd5751": { - "balance": "1337000000000000000000" + "0x03dedfcd0b3c2e17c705da248790ef98a6bd5751": { + "balance": "0x487a9a304539440000" }, - "698a8a6f01f9ab682f637c7969be885f6c5302bf": { - "balance": "19400000000000000000" + "0x698a8a6f01f9ab682f637c7969be885f6c5302bf": { + "balance": "0x10d3aa536e2940000" }, - "d82c6fedbdac98af2eed10b00f32b00056ca5a6d": { - "balance": "200000000000000000000" + "0xd82c6fedbdac98af2eed10b00f32b00056ca5a6d": { + "balance": "0xad78ebc5ac6200000" }, - "2697b339813b0c2d964b2471eb1c606f4ecb9616": { - "balance": "1154000000000000000000" + "0x2697b339813b0c2d964b2471eb1c606f4ecb9616": { + "balance": "0x3e8ef795d890c80000" }, - "987c9bcd6e3f3990a52be3eda4710c27518f4f72": { - "balance": "400000000000000000000" + "0x987c9bcd6e3f3990a52be3eda4710c27518f4f72": { + "balance": "0x15af1d78b58c400000" }, - "c5d48ca2db2f85d8c555cb0e9cfe826936783f9e": { - "balance": "200000000000000000000" + "0xc5d48ca2db2f85d8c555cb0e9cfe826936783f9e": { + "balance": "0xad78ebc5ac6200000" }, - "da214c023e2326ff696c00393168ce46ffac39ec": { - "balance": "1000000000000000000000" + "0xda214c023e2326ff696c00393168ce46ffac39ec": { + "balance": "0x3635c9adc5dea00000" }, - "86570ab259c9b1c32c9729202f77f590c07dd612": { - "balance": "200000000000000000000" + "0x86570ab259c9b1c32c9729202f77f590c07dd612": { + "balance": "0xad78ebc5ac6200000" }, - "a646a95c6d6f59f104c6541d7760757ab392b08c": { - "balance": "4200000000000000000000" + "0xa646a95c6d6f59f104c6541d7760757ab392b08c": { + "balance": "0xe3aeb5737240a00000" }, - "1933e334c40f3acbad0c0b851158206924beca3a": { - "balance": "7551541000000000000000" + "0x1933e334c40f3acbad0c0b851158206924beca3a": { + "balance": "0x1995eaf01b896188000" }, - "3552a496eba67f12be6eedab360cd13661dc7480": { - "balance": "300000000000000000000" + "0x3552a496eba67f12be6eedab360cd13661dc7480": { + "balance": "0x1043561a8829300000" }, - "2a9c96c19151ffcbe29a4616d0c52b3933b4659f": { - "balance": "69263000000000000000" + "0x2a9c96c19151ffcbe29a4616d0c52b3933b4659f": { + "balance": "0x3c1379b8765e18000" }, - "3b7b8e27de33d3ce7961b98d19a52fe79f6c25be": { - "balance": "100000000000000000000000" + "0x3b7b8e27de33d3ce7961b98d19a52fe79f6c25be": { + "balance": "0x152d02c7e14af6800000" }, - "a1911405cf6e999ed011f0ddcd2a4ff7c28f2526": { - "balance": "40000000000000000000" + "0xa1911405cf6e999ed011f0ddcd2a4ff7c28f2526": { + "balance": "0x22b1c8c1227a00000" }, - "0cae108e6db99b9e637876b064c6303eda8a65c8": { - "balance": "3000000000000000000000" + "0x0cae108e6db99b9e637876b064c6303eda8a65c8": { + "balance": "0xa2a15d09519be00000" }, - "3883becc08b9be68ad3b0836aac3b620dc0017ef": { - "balance": "2000000000000000000000" + "0x3883becc08b9be68ad3b0836aac3b620dc0017ef": { + "balance": "0x6c6b935b8bbd400000" }, - "d0abcc70c0420e0e172f97d43b87d5e80c336ea9": { - "balance": "10000000000000000000000" + "0xd0abcc70c0420e0e172f97d43b87d5e80c336ea9": { + "balance": "0x21e19e0c9bab2400000" }, - "cbf16a0fe2745258cd52db2bf21954c975fc6a15": { - "balance": "300000000000000000000" + "0xcbf16a0fe2745258cd52db2bf21954c975fc6a15": { + "balance": "0x1043561a8829300000" }, - "1b23cb8663554871fbbe0d9e60397efb6faedc3e": { - "balance": "200000000000000000000" + "0x1b23cb8663554871fbbe0d9e60397efb6faedc3e": { + "balance": "0xad78ebc5ac6200000" }, - "fbede32c349f3300ef4cd33b4de7dc18e443d326": { - "balance": "3160000000000000000000" + "0xfbede32c349f3300ef4cd33b4de7dc18e443d326": { + "balance": "0xab4dcf399a3a600000" }, - "5e806e845730f8073e6cc9018ee90f5c05f909a3": { - "balance": "9480000000000000000000" + "0x5e806e845730f8073e6cc9018ee90f5c05f909a3": { + "balance": "0x201e96dacceaf200000" }, - "425c338a1325e3a1578efa299e57d986eb474f81": { - "balance": "2000000000000000000000" + "0x425c338a1325e3a1578efa299e57d986eb474f81": { + "balance": "0x6c6b935b8bbd400000" }, - "8bf297f8f453523ed66a1acb7676856337b93bf0": { - "balance": "4000000000000000000000" + "0x8bf297f8f453523ed66a1acb7676856337b93bf0": { + "balance": "0xd8d726b7177a800000" }, - "38e8a31af2d265e31a9fff2d8f46286d1245a467": { - "balance": "20000000000000000000" + "0x38e8a31af2d265e31a9fff2d8f46286d1245a467": { + "balance": "0x1158e460913d00000" }, - "7edafba8984baf631a820b6b92bbc2c53655f6bd": { - "balance": "2000000000000000000000" + "0x7edafba8984baf631a820b6b92bbc2c53655f6bd": { + "balance": "0x6c6b935b8bbd400000" }, - "aa0200f1d17e9c54da0647bb96395d57a78538d8": { - "balance": "1056000000000000000000" + "0xaa0200f1d17e9c54da0647bb96395d57a78538d8": { + "balance": "0x393ef1a5127c800000" }, - "433eb94a339086ed12d9bde9cd1d458603c97dd6": { - "balance": "100000000000000000000000" + "0x433eb94a339086ed12d9bde9cd1d458603c97dd6": { + "balance": "0x152d02c7e14af6800000" }, - "cd7e47909464d871b9a6dc76a8e9195db3485e7a": { - "balance": "9850000000000000000000" + "0xcd7e47909464d871b9a6dc76a8e9195db3485e7a": { + "balance": "0x215f835bc769da80000" }, - "5975d78d974ee5bb9e4d4ca2ae77c84b9c3b4b82": { - "balance": "1370000000000000000000" + "0x5975d78d974ee5bb9e4d4ca2ae77c84b9c3b4b82": { + "balance": "0x4a4491bd6dcd280000" }, - "cea2896623f4910287a2bdc5be83aea3f2e6de08": { - "balance": "9359000000000000000000" + "0xcea2896623f4910287a2bdc5be83aea3f2e6de08": { + "balance": "0x1fb5a3751e490dc0000" }, - "cb4ad0c723da46ab56d526da0c1d25c73daff10a": { - "balance": "510000000000000000000" + "0xcb4ad0c723da46ab56d526da0c1d25c73daff10a": { + "balance": "0x1ba5abf9e779380000" }, - "e2cf360aa2329eb79d2bf7ca04a27a17c532e4d8": { - "balance": "102000000000000000000" + "0xe2cf360aa2329eb79d2bf7ca04a27a17c532e4d8": { + "balance": "0x58788cb94b1d80000" }, - "ea60549ec7553f511d2149f2d4666cbd9243d93c": { - "balance": "2000000000000000000000" + "0xea60549ec7553f511d2149f2d4666cbd9243d93c": { + "balance": "0x6c6b935b8bbd400000" }, - "cbb7be17953f2ccc93e1bc99805bf45511434e4c": { - "balance": "50440000000000000000000" + "0xcbb7be17953f2ccc93e1bc99805bf45511434e4c": { + "balance": "0xaae5b9df56d2f200000" }, - "3549bd40bbbc2b30095cac8be2c07a0588e0aed6": { - "balance": "20000000000000000000" + "0x3549bd40bbbc2b30095cac8be2c07a0588e0aed6": { + "balance": "0x1158e460913d00000" }, - "6510df42a599bcb0a519cca961b488759a6f6777": { - "balance": "2000000000000000000000" + "0x6510df42a599bcb0a519cca961b488759a6f6777": { + "balance": "0x6c6b935b8bbd400000" }, - "ed12a1ba1fb8adfcb20dfa19582e525aa3b74524": { - "balance": "6685000000000000000000" + "0xed12a1ba1fb8adfcb20dfa19582e525aa3b74524": { + "balance": "0x16a6502f15a1e540000" }, - "135eb8c0e9e101deedec11f2ecdb66ae1aae8867": { - "balance": "20000000000000000000000" + "0x135eb8c0e9e101deedec11f2ecdb66ae1aae8867": { + "balance": "0x43c33c1937564800000" }, - "ee906d7d5f1748258174be4cbc38930302ab7b42": { - "balance": "200000000000000000000" + "0xee906d7d5f1748258174be4cbc38930302ab7b42": { + "balance": "0xad78ebc5ac6200000" }, - "253f1e742a2cec86b0d7b306e5eacb6ccb2f8554": { - "balance": "20040000000000000000000" + "0x253f1e742a2cec86b0d7b306e5eacb6ccb2f8554": { + "balance": "0x43e5ede1f878c200000" }, - "ecd1a62802351a41568d23033004acc6c005a5d3": { - "balance": "50000000000000000000" + "0xecd1a62802351a41568d23033004acc6c005a5d3": { + "balance": "0x2b5e3af16b1880000" }, - "558c54649a8a6e94722bd6d21d14714f71780534": { - "balance": "2000000000000000000000" + "0x558c54649a8a6e94722bd6d21d14714f71780534": { + "balance": "0x6c6b935b8bbd400000" }, - "ca657ec06fe5bc09cf23e52af7f80cc3689e6ede": { - "balance": "900000000000000000000" + "0xca657ec06fe5bc09cf23e52af7f80cc3689e6ede": { + "balance": "0x30ca024f987b900000" }, - "74bf7a5ab59293149b5c60cf364263e5ebf1aa0d": { - "balance": "115800000000000000000" + "0x74bf7a5ab59293149b5c60cf364263e5ebf1aa0d": { + "balance": "0x6470c3e771e3c0000" }, - "7a6d781c77c4ba1fcadf687341c1e31799e93d27": { - "balance": "274000000000000000000" + "0x7a6d781c77c4ba1fcadf687341c1e31799e93d27": { + "balance": "0xeda838c4929080000" }, - "77028e409cc43a3bd33d21a9fc53ec606e94910e": { - "balance": "3880000000000000000000" + "0x77028e409cc43a3bd33d21a9fc53ec606e94910e": { + "balance": "0xd255d112e103a00000" }, - "4781a10a4df5eebc82f4cfe107ba1d8a7640bd66": { - "balance": "1790000000000000000000" + "0x4781a10a4df5eebc82f4cfe107ba1d8a7640bd66": { + "balance": "0x61093d7c2c6d380000" }, - "78e08bc533413c26e291b3143ffa7cc9afb97b78": { - "balance": "200000000000000000000" + "0x78e08bc533413c26e291b3143ffa7cc9afb97b78": { + "balance": "0xad78ebc5ac6200000" }, - "03ef6ad20ff7bd4f002bac58d47544cf879ae728": { - "balance": "6895000000000000000000" + "0x03ef6ad20ff7bd4f002bac58d47544cf879ae728": { + "balance": "0x175c758d0b96e5c0000" }, - "0e3696cf1f4217b163d1bc12a5ea730f1c32a14a": { - "balance": "4000000000000000000000" + "0x0e3696cf1f4217b163d1bc12a5ea730f1c32a14a": { + "balance": "0xd8d726b7177a800000" }, - "825135b1a7fc1605614c8aa4d0ac6dbad08f480e": { - "balance": "1430000000000000000000" + "0x825135b1a7fc1605614c8aa4d0ac6dbad08f480e": { + "balance": "0x4d853c8f8908980000" }, - "286b186d61ea1fd78d9930fe12b06537b05c3d51": { - "balance": "1000000000000000000000" + "0x286b186d61ea1fd78d9930fe12b06537b05c3d51": { + "balance": "0x3635c9adc5dea00000" }, - "8d6657f59711b1f803c6ebef682f915b62f92dc9": { - "balance": "2000000000000000000000" + "0x8d6657f59711b1f803c6ebef682f915b62f92dc9": { + "balance": "0x6c6b935b8bbd400000" }, - "da8bbee182e455d2098acb338a6d45b4b17ed8b6": { - "balance": "2000000000000000000000" + "0xda8bbee182e455d2098acb338a6d45b4b17ed8b6": { + "balance": "0x6c6b935b8bbd400000" }, - "3f2da093bb16eb064f8bfa9e30b929d15f8e1c4c": { - "balance": "2000000000000000000000" + "0x3f2da093bb16eb064f8bfa9e30b929d15f8e1c4c": { + "balance": "0x6c6b935b8bbd400000" }, - "f5d9cf00d658dd45517a48a9d3f5f633541a533d": { - "balance": "116400000000000000000" + "0xf5d9cf00d658dd45517a48a9d3f5f633541a533d": { + "balance": "0x64f5fdf494f780000" }, - "c5f64babb7033142f20e46d7aa6201ed86f67103": { - "balance": "2000000000000000000000" + "0xc5f64babb7033142f20e46d7aa6201ed86f67103": { + "balance": "0x6c6b935b8bbd400000" }, - "a2e2b5941e0c01944bfe1d5fb4e8a34b922ccfb1": { - "balance": "200000000000000000000" + "0xa2e2b5941e0c01944bfe1d5fb4e8a34b922ccfb1": { + "balance": "0xad78ebc5ac6200000" }, - "6114b0eae5576903f80bfb98842d24ed92237f1e": { - "balance": "100000000000000000000" + "0x6114b0eae5576903f80bfb98842d24ed92237f1e": { + "balance": "0x56bc75e2d63100000" }, - "38df0c4abe7ded5fe068eadf154ac691774324a4": { - "balance": "1790000000000000000000" + "0x38df0c4abe7ded5fe068eadf154ac691774324a4": { + "balance": "0x61093d7c2c6d380000" }, - "1c2010bd662df417f2a271879afb13ef4c88a3ae": { - "balance": "4000000000000000000000" + "0x1c2010bd662df417f2a271879afb13ef4c88a3ae": { + "balance": "0xd8d726b7177a800000" }, - "918967918cd897dd0005e36dc6c883ef438fc8c7": { - "balance": "140000000000000000000" + "0x918967918cd897dd0005e36dc6c883ef438fc8c7": { + "balance": "0x796e3ea3f8ab00000" }, - "a522de7eb6ae1250522a513133a93bd42849475c": { - "balance": "20000000000000000000000" + "0xa522de7eb6ae1250522a513133a93bd42849475c": { + "balance": "0x43c33c1937564800000" }, - "7de442c82386154d2e993cbd1280bb7ca6b12ada": { - "balance": "4002000000000000000000" + "0x7de442c82386154d2e993cbd1280bb7ca6b12ada": { + "balance": "0xd8f2e8247ec9480000" }, - "66424bd8785b8cb461102a900283c35dfa07ef6a": { - "balance": "40221000000000000000" + "0x66424bd8785b8cb461102a900283c35dfa07ef6a": { + "balance": "0x22e2db26666fc8000" }, - "7bbbec5e70bdead8bb32b42805988e9648c0aa97": { - "balance": "1000076000000000000000" + "0x7bbbec5e70bdead8bb32b42805988e9648c0aa97": { + "balance": "0x3636d7af5ec98e0000" }, - "fec06fe27b44c784b2396ec92f7b923ad17e9077": { - "balance": "2000000000000000000000" + "0xfec06fe27b44c784b2396ec92f7b923ad17e9077": { + "balance": "0x6c6b935b8bbd400000" }, - "95d550427b5a514c751d73a0f6d29fb65d22ed10": { - "balance": "300000000000000000000" + "0x95d550427b5a514c751d73a0f6d29fb65d22ed10": { + "balance": "0x1043561a8829300000" }, - "8dde60eb08a099d7daa356daaab2470d7b025a6b": { - "balance": "197000000000000000000" + "0x8dde60eb08a099d7daa356daaab2470d7b025a6b": { + "balance": "0xaadec983fcff40000" }, - "81bccbff8f44347eb7fca95b27ce7c952492aaad": { - "balance": "152240000000000000000" + "0x81bccbff8f44347eb7fca95b27ce7c952492aaad": { + "balance": "0x840c12165dd780000" }, - "3995e096b08a5a726800fcd17d9c64c64e088d2b": { - "balance": "200000000000000000000" + "0x3995e096b08a5a726800fcd17d9c64c64e088d2b": { + "balance": "0xad78ebc5ac6200000" }, - "4ee13c0d41200b46d19dee5c4bcec71d82bb8e38": { - "balance": "7893915000000000000000" + "0x4ee13c0d41200b46d19dee5c4bcec71d82bb8e38": { + "balance": "0x1abee13ccbeefaf8000" }, - "c41461a3cfbd32c9865555a4813137c076312360": { - "balance": "999999000000000000000" + "0xc41461a3cfbd32c9865555a4813137c076312360": { + "balance": "0x3635c6204739d98000" }, - "3300fb149aded65bcba6c04e9cd6b7a03b893bb1": { - "balance": "18200000000000000000" + "0x3300fb149aded65bcba6c04e9cd6b7a03b893bb1": { + "balance": "0xfc936392801c0000" }, - "29f9286c0e738d1721a691c6b95ab3d9a797ede8": { - "balance": "200000000000000000000000" + "0x29f9286c0e738d1721a691c6b95ab3d9a797ede8": { + "balance": "0x2a5a058fc295ed000000" }, - "34c8e5f1330fcb4b14ca75cb2580a4b93d204e36": { - "balance": "2000000000000000000000" + "0x34c8e5f1330fcb4b14ca75cb2580a4b93d204e36": { + "balance": "0x6c6b935b8bbd400000" }, - "ec5df227bfa85d7ad76b426e1cee963bc7f519dd": { - "balance": "1000000000000000000000" + "0xec5df227bfa85d7ad76b426e1cee963bc7f519dd": { + "balance": "0x3635c9adc5dea00000" }, - "797510e386f56393ced8f477378a444c484f7dad": { - "balance": "1000000000000000000000" + "0x797510e386f56393ced8f477378a444c484f7dad": { + "balance": "0x3635c9adc5dea00000" }, - "0191eb547e7bf6976b9b1b577546761de65622e2": { - "balance": "1999980000000000000000" + "0x0191eb547e7bf6976b9b1b577546761de65622e2": { + "balance": "0x6c6b4c4da6ddbe0000" }, - "615a6f36777f40d6617eb5819896186983fd3731": { - "balance": "5910000000000000000000" + "0x615a6f36777f40d6617eb5819896186983fd3731": { + "balance": "0x14061b9d77a5e980000" }, - "17580b766f7453525ca4c6a88b01b50570ea088c": { - "balance": "100000000000000000000" + "0x17580b766f7453525ca4c6a88b01b50570ea088c": { + "balance": "0x56bc75e2d63100000" }, - "945d96ea573e8df7262bbfa572229b4b16016b0f": { - "balance": "209300000000000000000" + "0x945d96ea573e8df7262bbfa572229b4b16016b0f": { + "balance": "0xb589ef914c1420000" }, - "2de0964400c282bdd78a919c6bf77c6b5f796179": { - "balance": "200000000000000000000" + "0x2de0964400c282bdd78a919c6bf77c6b5f796179": { + "balance": "0xad78ebc5ac6200000" }, - "304ec69a74545721d7316aef4dcfb41ac59ee2f0": { - "balance": "200000000000000000000" + "0x304ec69a74545721d7316aef4dcfb41ac59ee2f0": { + "balance": "0xad78ebc5ac6200000" }, - "be2b326e78ed10e550fee8efa8f8070396522f5a": { - "balance": "39400000000000000000000" + "0xbe2b326e78ed10e550fee8efa8f8070396522f5a": { + "balance": "0x857e0d6f1da76a00000" }, - "1a0841b92a7f7075569dc4627e6b76cab05ade91": { - "balance": "1520000000000000000000" + "0x1a0841b92a7f7075569dc4627e6b76cab05ade91": { + "balance": "0x52663ccab1e1c00000" }, - "5fa61f152de6123516c751242979285f796ac791": { - "balance": "204000000000000000000" + "0x5fa61f152de6123516c751242979285f796ac791": { + "balance": "0xb0f11972963b00000" }, - "68c8791dc342c373769ea61fb7b510f251d32088": { - "balance": "1000000000000000000000" + "0x68c8791dc342c373769ea61fb7b510f251d32088": { + "balance": "0x3635c9adc5dea00000" }, - "4167cd48e733418e8f99ffd134121c4a4ab278c4": { - "balance": "3640000000000000000000" + "0x4167cd48e733418e8f99ffd134121c4a4ab278c4": { + "balance": "0xc55325ca7415e00000" }, - "598aaabae9ed833d7bc222e91fcaa0647b77580b": { - "balance": "1800000000000000000000" + "0x598aaabae9ed833d7bc222e91fcaa0647b77580b": { + "balance": "0x6194049f30f7200000" }, - "979f30158b574b999aab348107b9eed85b1ff8c1": { - "balance": "970000000000000000000" + "0x979f30158b574b999aab348107b9eed85b1ff8c1": { + "balance": "0x34957444b840e80000" }, - "3ad06149b21c55ff867cc3fb9740d2bcc7101231": { - "balance": "197000000000000000000000" + "0x3ad06149b21c55ff867cc3fb9740d2bcc7101231": { + "balance": "0x29b76432b94451200000" }, - "7133843a78d939c69d4486e10ebc7b602a349ff7": { - "balance": "329000000000000000000" + "0x7133843a78d939c69d4486e10ebc7b602a349ff7": { + "balance": "0x11d5cacce21f840000" }, - "8bdfda6c215720eda2136f91052321af4e936c1f": { - "balance": "1000008000000000000000" + "0x8bdfda6c215720eda2136f91052321af4e936c1f": { + "balance": "0x3635e619bb04d40000" }, - "3e1c53300e4c168912163c7e99b95da268ad280a": { - "balance": "1003200000000000000000" + "0x3e1c53300e4c168912163c7e99b95da268ad280a": { + "balance": "0x3662325cd18fe00000" }, - "e07ebbc7f4da416e42c8d4f842aba16233c12580": { - "balance": "2000000000000000000000" + "0xe07ebbc7f4da416e42c8d4f842aba16233c12580": { + "balance": "0x6c6b935b8bbd400000" }, - "bac8922c4acc7d2cb6fd59a14eb45cf3e702214b": { - "balance": "800000000000000000000" + "0xbac8922c4acc7d2cb6fd59a14eb45cf3e702214b": { + "balance": "0x2b5e3af16b18800000" }, - "bb6c284aac8a69b75cddb00f28e145583b56bece": { - "balance": "2000000000000000000000" + "0xbb6c284aac8a69b75cddb00f28e145583b56bece": { + "balance": "0x6c6b935b8bbd400000" }, - "0372ee5508bf8163ed284e5eef94ce4d7367e522": { - "balance": "100000000000000000000" + "0x0372ee5508bf8163ed284e5eef94ce4d7367e522": { + "balance": "0x56bc75e2d63100000" }, - "17125b59ac51cee029e4bd78d7f5947d1ea49bb2": { - "balance": "22000000000000000000000" + "0x17125b59ac51cee029e4bd78d7f5947d1ea49bb2": { + "balance": "0x4a89f54ef0121c00000" }, - "c88ca1e6e5f4d558d13780f488f10d4ad3130d34": { - "balance": "1550000000000000000000" + "0xc88ca1e6e5f4d558d13780f488f10d4ad3130d34": { + "balance": "0x54069233bf7f780000" }, - "a825fd5abb7926a67cf36ba246a24bd27be6f6ed": { - "balance": "17600000000000000000" + "0xa825fd5abb7926a67cf36ba246a24bd27be6f6ed": { + "balance": "0xf43fc2c04ee00000" }, - "04241b41ecbd0bfdf1295e9d4fa59ea09e6c6186": { - "balance": "1870000000000000000000" + "0x04241b41ecbd0bfdf1295e9d4fa59ea09e6c6186": { + "balance": "0x655f769450bc780000" }, - "6de4d15219182faf3aa2c5d4d2595ff23091a727": { - "balance": "1580000000000000000000" + "0x6de4d15219182faf3aa2c5d4d2595ff23091a727": { + "balance": "0x55a6e79ccd1d300000" }, - "b203d29e6c56b92699c4b92d1f6f84648dc4cfbc": { - "balance": "400000000000000000000" + "0xb203d29e6c56b92699c4b92d1f6f84648dc4cfbc": { + "balance": "0x15af1d78b58c400000" }, - "80b42de170dbd723f454e88f7716452d92985092": { - "balance": "300202000000000000000" + "0x80b42de170dbd723f454e88f7716452d92985092": { + "balance": "0x104623c0762dd10000" }, - "0a5b79d8f23b6483dbe2bdaa62b1064cc76366ae": { - "balance": "1969803000000000000000" + "0x0a5b79d8f23b6483dbe2bdaa62b1064cc76366ae": { + "balance": "0x6ac882100952c78000" }, - "32034e8581d9484e8af42a28df190132ec29c466": { - "balance": "3460000000000000000000" + "0x32034e8581d9484e8af42a28df190132ec29c466": { + "balance": "0xbb9125542263900000" }, - "7ee604c7a9dc2909ce321de6b9b24f5767577555": { - "balance": "5533575000000000000000" + "0x7ee604c7a9dc2909ce321de6b9b24f5767577555": { + "balance": "0x12bf9c7985cf62d8000" }, - "a387ce4e961a7847f560075c64e1596b5641d21c": { - "balance": "668500000000000000000" + "0xa387ce4e961a7847f560075c64e1596b5641d21c": { + "balance": "0x243d4d18229ca20000" }, - "fcc9d4a4262e7a027ab7519110d802c495ceea39": { - "balance": "6370000000000000000000" + "0xfcc9d4a4262e7a027ab7519110d802c495ceea39": { + "balance": "0x1595182224b26480000" }, - "ff8a2ca5a81333f19998255f203256e1a819c0aa": { - "balance": "224000000000000000000" + "0xff8a2ca5a81333f19998255f203256e1a819c0aa": { + "balance": "0xc249fdd3277800000" }, - "f9811fa19dadbf029f8bfe569adb18228c80481a": { - "balance": "200000000000000000000" + "0xf9811fa19dadbf029f8bfe569adb18228c80481a": { + "balance": "0xad78ebc5ac6200000" }, - "0d1f2a57713ebc6e94de29846e8844d376665763": { - "balance": "5000000000000000000000" + "0x0d1f2a57713ebc6e94de29846e8844d376665763": { + "balance": "0x10f0cf064dd59200000" }, - "eab0bd148309186cf8cbd13b7232d8095acb833a": { - "balance": "10691800000000000000000" + "0xeab0bd148309186cf8cbd13b7232d8095acb833a": { + "balance": "0x2439a881c6a717c0000" }, - "36928b55bc861509d51c8cf1d546bfec6e3e90af": { - "balance": "1970000000000000000000" + "0x36928b55bc861509d51c8cf1d546bfec6e3e90af": { + "balance": "0x6acb3df27e1f880000" }, - "30480164bcd84974ebc0d90c9b9afab626cd1c73": { - "balance": "800000000000000000000" + "0x30480164bcd84974ebc0d90c9b9afab626cd1c73": { + "balance": "0x2b5e3af16b18800000" }, - "36339f84a5c2b44ce53dfdb6d4f97df78212a7df": { - "balance": "321600000000000000000" + "0x36339f84a5c2b44ce53dfdb6d4f97df78212a7df": { + "balance": "0x116f18b81715a00000" }, - "cfeacaaed57285e0ac7268ce6a4e35ecfdb242d7": { - "balance": "1086400000000000000000" + "0xcfeacaaed57285e0ac7268ce6a4e35ecfdb242d7": { + "balance": "0x3ae4d4240190600000" }, - "572dd8cd3fe399d1d0ec281231b7cefc20b9e4bb": { - "balance": "10400000000000000000000" + "0x572dd8cd3fe399d1d0ec281231b7cefc20b9e4bb": { + "balance": "0x233c8fe42703e800000" }, - "5dded049a6e1f329dc4b971e722c9c1f2ade83f0": { - "balance": "1000000000000000000000" + "0x5dded049a6e1f329dc4b971e722c9c1f2ade83f0": { + "balance": "0x3635c9adc5dea00000" }, - "9756e176c9ef693ee1eec6b9f8b151d313beb099": { - "balance": "1200000000000000000000" + "0x9756e176c9ef693ee1eec6b9f8b151d313beb099": { + "balance": "0x410d586a20a4c00000" }, - "01e6415d587b065490f1ed7f21d6e0f386ee6747": { - "balance": "2000000000000000000000" + "0x01e6415d587b065490f1ed7f21d6e0f386ee6747": { + "balance": "0x6c6b935b8bbd400000" }, - "b4413576869c08f9512ad311fe925988a52d3414": { - "balance": "10000000000000000000000" + "0xb4413576869c08f9512ad311fe925988a52d3414": { + "balance": "0x21e19e0c9bab2400000" }, - "da9f55460946d7bfb570ddec757ca5773b58429a": { - "balance": "507600000000000000000" + "0xda9f55460946d7bfb570ddec757ca5773b58429a": { + "balance": "0x1b845d769eb4480000" }, - "7180b83ee5574317f21c8072b191d895d46153c3": { - "balance": "460000000000000000000" + "0x7180b83ee5574317f21c8072b191d895d46153c3": { + "balance": "0x18efc84ad0c7b00000" }, - "0aca9a5626913b08cfc9a66d40508dce52b60f87": { - "balance": "1910000000000000000000" + "0x0aca9a5626913b08cfc9a66d40508dce52b60f87": { + "balance": "0x678a932062e4180000" }, - "5cd0e475b54421bdfc0c12ea8e082bd7a5af0a6a": { - "balance": "59000000000000000000" + "0x5cd0e475b54421bdfc0c12ea8e082bd7a5af0a6a": { + "balance": "0x332ca1b67940c0000" }, - "7edb02c61a227287611ad950696369cc4e647a68": { - "balance": "274000000000000000000" + "0x7edb02c61a227287611ad950696369cc4e647a68": { + "balance": "0xeda838c4929080000" }, - "b2676841ee9f2d31c172e82303b0fe9bbf9f1e09": { - "balance": "200000000000000000000" + "0xb2676841ee9f2d31c172e82303b0fe9bbf9f1e09": { + "balance": "0xad78ebc5ac6200000" }, - "a2222259dd9c3e3ded127084f808e92a1887302c": { - "balance": "162000000000000000000" + "0xa2222259dd9c3e3ded127084f808e92a1887302c": { + "balance": "0x8c8339dafed480000" }, - "4b3a7cc3a7d7b00ed5282221a60259f25bf6538a": { - "balance": "1000000000000000000000" + "0x4b3a7cc3a7d7b00ed5282221a60259f25bf6538a": { + "balance": "0x3635c9adc5dea00000" }, - "e33ff987541dde5cdee0a8a96dcc3f33c3f24cc2": { - "balance": "200000000000000000000000" + "0xe33ff987541dde5cdee0a8a96dcc3f33c3f24cc2": { + "balance": "0x2a5a058fc295ed000000" }, - "1e1a4828119be309bd88236e4d482b504dc55711": { - "balance": "2955000000000000000000" + "0x1e1a4828119be309bd88236e4d482b504dc55711": { + "balance": "0xa030dcebbd2f4c0000" }, - "9b1811c3051f46e664ae4bc9c824d18592c4574a": { - "balance": "199955000000000000000" + "0x9b1811c3051f46e664ae4bc9c824d18592c4574a": { + "balance": "0xad6eedd17cf3b8000" }, - "59fe00696dbd87b7976b29d1156c8842a2e17914": { - "balance": "2000000000000000000000" + "0x59fe00696dbd87b7976b29d1156c8842a2e17914": { + "balance": "0x6c6b935b8bbd400000" }, - "48010ef3b8e95e3f308f30a8cb7f4eb4bf60d965": { - "balance": "2000000000000000000000" + "0x48010ef3b8e95e3f308f30a8cb7f4eb4bf60d965": { + "balance": "0x6c6b935b8bbd400000" }, - "c90300cb1d4077e6a6d7e169a460468cf4a492d7": { - "balance": "2000000000000000000000" + "0xc90300cb1d4077e6a6d7e169a460468cf4a492d7": { + "balance": "0x6c6b935b8bbd400000" }, - "6dedf62e743f4d2c2a4b87a787f5424a7aeb393c": { - "balance": "180000000000000000000" + "0x6dedf62e743f4d2c2a4b87a787f5424a7aeb393c": { + "balance": "0x9c2007651b2500000" }, - "fb744b951d094b310262c8f986c860df9ab1de65": { - "balance": "52009000000000000000" + "0xfb744b951d094b310262c8f986c860df9ab1de65": { + "balance": "0x2d1c515f1cb4a8000" }, - "193ac65183651800e23580f8f0ead3bb597eb8a4": { - "balance": "50020000000000000000" + "0x193ac65183651800e23580f8f0ead3bb597eb8a4": { + "balance": "0x2b62abcfb910a0000" }, - "bf05ff5ecf0df2df887759fb8274d93238ac267d": { - "balance": "800000000000000000000" + "0xbf05ff5ecf0df2df887759fb8274d93238ac267d": { + "balance": "0x2b5e3af16b18800000" }, - "6c0e712f405c59725fe829e9774bf4df7f4dd965": { - "balance": "57413800000000000000000" + "0x6c0e712f405c59725fe829e9774bf4df7f4dd965": { + "balance": "0xc2868889ca68a440000" }, - "2744ff67464121e35afc2922177164fa2fcb0267": { - "balance": "100000000000000000000" + "0x2744ff67464121e35afc2922177164fa2fcb0267": { + "balance": "0x56bc75e2d63100000" }, - "d09cb2e6082d693a13e8d2f68dd1dd8461f55840": { - "balance": "1000000000000000000000" + "0xd09cb2e6082d693a13e8d2f68dd1dd8461f55840": { + "balance": "0x3635c9adc5dea00000" }, - "bc171e53d17ac9b61241ae436deec7af452e7496": { - "balance": "5348000000000000000000" + "0xbc171e53d17ac9b61241ae436deec7af452e7496": { + "balance": "0x121ea68c114e5100000" }, - "71fa22cc6d33206b7d701a163a0dab31ae4d31d6": { - "balance": "1610000000000000000000" + "0x71fa22cc6d33206b7d701a163a0dab31ae4d31d6": { + "balance": "0x57473d05dabae80000" }, - "4da8030769844bc34186b85cd4c7348849ff49e9": { - "balance": "10000000000000000000000" + "0x4da8030769844bc34186b85cd4c7348849ff49e9": { + "balance": "0x21e19e0c9bab2400000" }, - "c8616b4ec09128cdff39d6e4b9ac86eec471d5f2": { - "balance": "19400000000000000000" + "0xc8616b4ec09128cdff39d6e4b9ac86eec471d5f2": { + "balance": "0x10d3aa536e2940000" }, - "407295ebd94b48269c2d569c9b9af9aa05e83e5e": { - "balance": "10000000000000000000000" + "0x407295ebd94b48269c2d569c9b9af9aa05e83e5e": { + "balance": "0x21e19e0c9bab2400000" }, - "d45d5daa138dd1d374c71b9019916811f4b20a4e": { - "balance": "576000000000000000000" + "0xd45d5daa138dd1d374c71b9019916811f4b20a4e": { + "balance": "0x1f399b1438a1000000" }, - "42c6edc515d35557808d13cd44dcc4400b2504e4": { - "balance": "197876000000000000000" + "0x42c6edc515d35557808d13cd44dcc4400b2504e4": { + "balance": "0xaba14c59ba7320000" }, - "0bc95cb32dbb574c832fa8174a81356d38bc92ac": { - "balance": "2000000000000000000000" + "0x0bc95cb32dbb574c832fa8174a81356d38bc92ac": { + "balance": "0x6c6b935b8bbd400000" }, - "5a6071bcebfcba4ab57f4db96fc7a68bece2ba5b": { - "balance": "2000000000000000000000" + "0x5a6071bcebfcba4ab57f4db96fc7a68bece2ba5b": { + "balance": "0x6c6b935b8bbd400000" }, - "54c93e03a9b2e8e4c3672835a9ee76f9615bc14e": { - "balance": "19400000000000000000" + "0x54c93e03a9b2e8e4c3672835a9ee76f9615bc14e": { + "balance": "0x10d3aa536e2940000" }, - "3c03bbc023e1e93fa3a3a6e428cf0cd8f95e1ec6": { - "balance": "1520000000000000000000" + "0x3c03bbc023e1e93fa3a3a6e428cf0cd8f95e1ec6": { + "balance": "0x52663ccab1e1c00000" }, - "ba1531fb9e791896bcf3a80558a359f6e7c144bd": { - "balance": "3940000000000000000000" + "0xba1531fb9e791896bcf3a80558a359f6e7c144bd": { + "balance": "0xd5967be4fc3f100000" }, - "aa56a65dc4abb72f11bae32b6fbb07444791d5c9": { - "balance": "748600000000000000000" + "0xaa56a65dc4abb72f11bae32b6fbb07444791d5c9": { + "balance": "0x2894e975bf496c0000" }, - "e437acbe0f6227b0e36f36e4bcf7cf613335fb68": { - "balance": "200000000000000000000" + "0xe437acbe0f6227b0e36f36e4bcf7cf613335fb68": { + "balance": "0xad78ebc5ac6200000" }, - "39d4a931402c0c79c457186f24df8729cf957031": { - "balance": "4000000000000000000000" + "0x39d4a931402c0c79c457186f24df8729cf957031": { + "balance": "0xd8d726b7177a800000" }, - "e22b20c77894463baf774cc256d5bddbbf7ddd09": { - "balance": "1000000000000000000000" + "0xe22b20c77894463baf774cc256d5bddbbf7ddd09": { + "balance": "0x3635c9adc5dea00000" }, - "70a4067d448cc25dc8e70e651cea7cf84e92109e": { - "balance": "176000000000000000000" + "0x70a4067d448cc25dc8e70e651cea7cf84e92109e": { + "balance": "0x98a7d9b8314c00000" }, - "aa3925dc220bb4ae2177b2883078b6dc346ca1b2": { - "balance": "8000000000000000000000" + "0xaa3925dc220bb4ae2177b2883078b6dc346ca1b2": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "ad57aa9d00d10c439b35efcc0becac2e3955c313": { - "balance": "200000000000000000000" + "0xad57aa9d00d10c439b35efcc0becac2e3955c313": { + "balance": "0xad78ebc5ac6200000" }, - "e93d47a8ca885d540c4e526f25d5c6f2c108c4b8": { - "balance": "112640000000000000000000" + "0xe93d47a8ca885d540c4e526f25d5c6f2c108c4b8": { + "balance": "0x17da3a04c7b3e0000000" }, - "232ce782506225fd9860a2edc14a7a3047736da2": { - "balance": "20000000000000000000" + "0x232ce782506225fd9860a2edc14a7a3047736da2": { + "balance": "0x1158e460913d00000" }, - "49a645e0667dfd7b32d075cc2467dd8c680907c4": { - "balance": "129560000000000000000" + "0x49a645e0667dfd7b32d075cc2467dd8c680907c4": { + "balance": "0x70601958fcb9c0000" }, - "cf2e734042a355d05ffb2e3915b16811f45a695e": { - "balance": "2000000000000000000000" + "0xcf2e734042a355d05ffb2e3915b16811f45a695e": { + "balance": "0x6c6b935b8bbd400000" }, - "39b1c471ae94e12164452e811fbbe2b3cd7275ac": { - "balance": "2000000000000000000000" + "0x39b1c471ae94e12164452e811fbbe2b3cd7275ac": { + "balance": "0x6c6b935b8bbd400000" }, - "ffad3dd74e2c1f796ac640de56dc99b4c792a402": { - "balance": "5000000000000000000000" + "0xffad3dd74e2c1f796ac640de56dc99b4c792a402": { + "balance": "0x10f0cf064dd59200000" }, - "a69d7cd17d4842fe03f62a90b2fbf8f6af7bb380": { - "balance": "100000000000000000000" + "0xa69d7cd17d4842fe03f62a90b2fbf8f6af7bb380": { + "balance": "0x56bc75e2d63100000" }, - "2001bef77b66f51e1599b02fb110194a0099b78d": { - "balance": "2000000000000000000000" + "0x2001bef77b66f51e1599b02fb110194a0099b78d": { + "balance": "0x6c6b935b8bbd400000" }, - "95e7616424cd0961a71727247437f0069272280e": { - "balance": "400000000000000000000" + "0x95e7616424cd0961a71727247437f0069272280e": { + "balance": "0x15af1d78b58c400000" }, - "c04f4bd4049f044685b883b62959ae631d667e35": { - "balance": "5820000000000000000000" + "0xc04f4bd4049f044685b883b62959ae631d667e35": { + "balance": "0x13b80b99c5185700000" }, - "ede0147ec032c3618310c1ff25690bf172193dac": { - "balance": "2000000000000000000000" + "0xede0147ec032c3618310c1ff25690bf172193dac": { + "balance": "0x6c6b935b8bbd400000" }, - "66719c0682b2ac7f9e27abebec7edf8decf0ae0d": { - "balance": "20000000000000000000" + "0x66719c0682b2ac7f9e27abebec7edf8decf0ae0d": { + "balance": "0x1158e460913d00000" }, - "45272b8f62e9f9fa8ce04420e1aea3eba9686eac": { - "balance": "4000000000000000000000" + "0x45272b8f62e9f9fa8ce04420e1aea3eba9686eac": { + "balance": "0xd8d726b7177a800000" }, - "d1da0c8fb7c210e0f2ec618f85bdae7d3e734b1c": { - "balance": "1970000000000000000000" + "0xd1da0c8fb7c210e0f2ec618f85bdae7d3e734b1c": { + "balance": "0x6acb3df27e1f880000" }, - "e9133e7d31845d5f2b66a2618792e869311acf66": { - "balance": "24050000000000000000000" + "0xe9133e7d31845d5f2b66a2618792e869311acf66": { + "balance": "0x517c0cbf9a390880000" }, - "ebb62cf8e22c884b1b28c6fa88fbbc17938aa787": { - "balance": "798000000000000000000" + "0xebb62cf8e22c884b1b28c6fa88fbbc17938aa787": { + "balance": "0x2b42798403c9b80000" }, - "6205c2d5647470848a3840f3887e9b015d34755c": { - "balance": "1800000000000000000000" + "0x6205c2d5647470848a3840f3887e9b015d34755c": { + "balance": "0x6194049f30f7200000" }, - "76ca22bcb8799e5327c4aa2a7d0949a1fcce5f29": { - "balance": "1524180000000000000000" + "0x76ca22bcb8799e5327c4aa2a7d0949a1fcce5f29": { + "balance": "0x52a03f228c5ae20000" }, - "6b925dd5d8ed6132ab6d0860b82c44e1a51f1fee": { - "balance": "1480000000000000000000" + "0x6b925dd5d8ed6132ab6d0860b82c44e1a51f1fee": { + "balance": "0x503b203e9fba200000" }, - "797bb7f157d9feaa17f76da4f704b74dc1038341": { - "balance": "3340000000000000000000" + "0x797bb7f157d9feaa17f76da4f704b74dc1038341": { + "balance": "0xb50fcfafebecb00000" }, - "ae8954f8d6166de507cf61297d0fc7ca6b9e7128": { - "balance": "300000000000000000000" + "0xae8954f8d6166de507cf61297d0fc7ca6b9e7128": { + "balance": "0x1043561a8829300000" }, - "75c1ad23d23f24b384d0c3149177e86697610d21": { - "balance": "6426082000000000000000" + "0x75c1ad23d23f24b384d0c3149177e86697610d21": { + "balance": "0x15c5bcd6c288bbd0000" }, - "805d846fb0bc02a7337226d685be9ee773b9198a": { - "balance": "19999800000000000000000" + "0x805d846fb0bc02a7337226d685be9ee773b9198a": { + "balance": "0x43c30fb0884a96c0000" }, - "c3cb6b36af443f2c6e258b4a39553a818747811f": { - "balance": "1610000000000000000000" + "0xc3cb6b36af443f2c6e258b4a39553a818747811f": { + "balance": "0x57473d05dabae80000" }, - "cea43f7075816b60bbfce68b993af0881270f6c4": { - "balance": "2000000000000000000000" + "0xcea43f7075816b60bbfce68b993af0881270f6c4": { + "balance": "0x6c6b935b8bbd400000" }, - "e0388aeddd3fe2ad56f85748e80e710a34b7c92e": { - "balance": "500000000000000000000" + "0xe0388aeddd3fe2ad56f85748e80e710a34b7c92e": { + "balance": "0x1b1ae4d6e2ef500000" }, - "e131f87efc5ef07e43f0f2f4a747b551d750d9e6": { - "balance": "19999000000000000000000" + "0xe131f87efc5ef07e43f0f2f4a747b551d750d9e6": { + "balance": "0x43c25e0dcc1bd1c0000" }, - "c2b2cbe65bc6c2ee7a3c75b2e47c189c062e8d8b": { - "balance": "20000000000000000000000" + "0xc2b2cbe65bc6c2ee7a3c75b2e47c189c062e8d8b": { + "balance": "0x43c33c1937564800000" }, - "bd8765f41299c7f479923c4fd18f126d7229047d": { - "balance": "4000000000000000000000" + "0xbd8765f41299c7f479923c4fd18f126d7229047d": { + "balance": "0xd8d726b7177a800000" }, - "c83ba6dd9549be1d3287a5a654d106c34c6b5da2": { - "balance": "7000000000000000000000" + "0xc83ba6dd9549be1d3287a5a654d106c34c6b5da2": { + "balance": "0x17b7883c06916600000" }, - "f870995fe1e522321d754337a45c0c9d7b38951c": { - "balance": "20000000000000000000" + "0xf870995fe1e522321d754337a45c0c9d7b38951c": { + "balance": "0x1158e460913d00000" }, - "0d8ed7d0d15638330ed7e4eaccab8a458d75737e": { - "balance": "2000000000000000000000" + "0x0d8ed7d0d15638330ed7e4eaccab8a458d75737e": { + "balance": "0x6c6b935b8bbd400000" }, - "36c510bf8d6e569bf2f37d47265dbcb502ff2bce": { - "balance": "30000000000000000000000" + "0x36c510bf8d6e569bf2f37d47265dbcb502ff2bce": { + "balance": "0x65a4da25d3016c00000" }, - "0eccf617844fd61fba62cb0e445b7ac68bcc1fbe": { - "balance": "387260000000000000000" + "0x0eccf617844fd61fba62cb0e445b7ac68bcc1fbe": { + "balance": "0x14fe4fe63565c60000" }, - "ae10e27a014f0d306baf266d4897c89aeee2e974": { - "balance": "20000000000000000000000" + "0xae10e27a014f0d306baf266d4897c89aeee2e974": { + "balance": "0x43c33c1937564800000" }, - "1827039f09570294088fddf047165c33e696a492": { - "balance": "9550000000000000000000" + "0x1827039f09570294088fddf047165c33e696a492": { + "balance": "0x205b4dfa1ee74780000" }, - "23378f42926d0184b793b0c827a6dd3e3d334fcd": { - "balance": "56000000000000000000" + "0x23378f42926d0184b793b0c827a6dd3e3d334fcd": { + "balance": "0x30927f74c9de00000" }, - "467124ae7f452f26b3d574f6088894fa5d1cfb3b": { - "balance": "2700000000000000000000" + "0x467124ae7f452f26b3d574f6088894fa5d1cfb3b": { + "balance": "0x925e06eec972b00000" }, - "aae61e43cb0d0c96b30699f77e00d711d0a3979b": { - "balance": "1000000000000000000000" + "0xaae61e43cb0d0c96b30699f77e00d711d0a3979b": { + "balance": "0x3635c9adc5dea00000" }, - "15c7edb8118ee27b342285eb5926b47a855bc7a5": { - "balance": "20000000000000000000" + "0x15c7edb8118ee27b342285eb5926b47a855bc7a5": { + "balance": "0x1158e460913d00000" }, - "0d5d98565c647ca5f177a2adb9d3022fac287f21": { - "balance": "200000000000000000000" + "0x0d5d98565c647ca5f177a2adb9d3022fac287f21": { + "balance": "0xad78ebc5ac6200000" }, - "7222fec7711781d26eaa4e8485f7aa3fac442483": { - "balance": "456000000000000000000" + "0x7222fec7711781d26eaa4e8485f7aa3fac442483": { + "balance": "0x18b84570022a200000" }, - "dc44275b1715baea1b0345735a29ac42c9f51b4f": { - "balance": "1164000000000000000000" + "0xdc44275b1715baea1b0345735a29ac42c9f51b4f": { + "balance": "0x3f19beb8dd1ab00000" }, - "04d82af9e01a936d97f8f85940b970f9d4db9936": { - "balance": "200000000000000000000" + "0x04d82af9e01a936d97f8f85940b970f9d4db9936": { + "balance": "0xad78ebc5ac6200000" }, - "45533390e340fe0de3b3cf5fb9fc8ea552e29e62": { - "balance": "1460000000000000000000" + "0x45533390e340fe0de3b3cf5fb9fc8ea552e29e62": { + "balance": "0x4f2591f896a6500000" }, - "1284f0cee9d2ff2989b65574d06ffd9ab0f7b805": { - "balance": "400000000000000000000" + "0x1284f0cee9d2ff2989b65574d06ffd9ab0f7b805": { + "balance": "0x15af1d78b58c400000" }, - "ed9ebccba42f9815e78233266dd6e835b6afc31b": { - "balance": "6000000000000000000000" + "0xed9ebccba42f9815e78233266dd6e835b6afc31b": { + "balance": "0x14542ba12a337c00000" }, - "e4324912d64ea3aef76b3c2ff9df82c7e13ae991": { - "balance": "2000000000000000000000" + "0xe4324912d64ea3aef76b3c2ff9df82c7e13ae991": { + "balance": "0x6c6b935b8bbd400000" }, - "94c742fd7a8b7906b3bfe4f8904fc0be5c768033": { - "balance": "20000000000000000000000" + "0x94c742fd7a8b7906b3bfe4f8904fc0be5c768033": { + "balance": "0x43c33c1937564800000" }, - "62fb8bd1f0e66b90533e071e6cbe6111fef0bc63": { - "balance": "17600000000000000000000" + "0x62fb8bd1f0e66b90533e071e6cbe6111fef0bc63": { + "balance": "0x3ba1910bf341b000000" }, - "2c83aeb02fcf067d65a47082fd977833ab1cec91": { - "balance": "150400000000000000000" + "0x2c83aeb02fcf067d65a47082fd977833ab1cec91": { + "balance": "0x8273823258ac00000" }, - "06cbfa08cdd4fba737bac407be8224f4eef35828": { - "balance": "593459000000000000000" + "0x06cbfa08cdd4fba737bac407be8224f4eef35828": { + "balance": "0x202be5e8382e8b8000" }, - "67ee406ea4a7ae6a3a381eb4edd2f09f174b4928": { - "balance": "1036000000000000000000" + "0x67ee406ea4a7ae6a3a381eb4edd2f09f174b4928": { + "balance": "0x3829635f0968b00000" }, - "83c23d8a502124ee150f08d71dc6727410a0f901": { - "balance": "33999600000000000000000" + "0x83c23d8a502124ee150f08d71dc6727410a0f901": { + "balance": "0x7331f3bfe661b180000" }, - "f7c00cdb1f020310d5acab7b496aaa44b779085e": { - "balance": "1670000000000000000000" + "0xf7c00cdb1f020310d5acab7b496aaa44b779085e": { + "balance": "0x5a87e7d7f5f6580000" }, - "d096565b7c7407d06536580355fdd6d239144aa1": { - "balance": "250000000000000000000" + "0xd096565b7c7407d06536580355fdd6d239144aa1": { + "balance": "0xd8d726b7177a80000" }, - "f8d52dcc5f96cc28007b3ecbb409f7e22a646caa": { - "balance": "149200000000000000000" + "0xf8d52dcc5f96cc28007b3ecbb409f7e22a646caa": { + "balance": "0x81690e18128480000" }, - "0c222c7c41c9b048efcce0a232434362e12d673b": { - "balance": "10007600000000000000000" + "0x0c222c7c41c9b048efcce0a232434362e12d673b": { + "balance": "0x21e8359697677380000" }, - "503bdbd8bc421c32a443032deb2e3e4cd5ba8b4e": { - "balance": "2000000000000000000000" + "0x503bdbd8bc421c32a443032deb2e3e4cd5ba8b4e": { + "balance": "0x6c6b935b8bbd400000" }, - "77da5e6c72fb36bce1d9798f7bcdf1d18f459c2e": { - "balance": "22380000000000000000" + "0x77da5e6c72fb36bce1d9798f7bcdf1d18f459c2e": { + "balance": "0x13695bb6cf93e0000" }, - "e62f98650712eb158753d82972b8e99ca3f61877": { - "balance": "2000000000000000000000" + "0xe62f98650712eb158753d82972b8e99ca3f61877": { + "balance": "0x6c6b935b8bbd400000" }, - "87a7c508ef71582dd9a54372f89cb01f252fb180": { - "balance": "200000000000000000000" + "0x87a7c508ef71582dd9a54372f89cb01f252fb180": { + "balance": "0xad78ebc5ac6200000" }, - "f61283b4bd8504058ca360e993999b62cbc8cd67": { - "balance": "255000000000000000000" + "0xf61283b4bd8504058ca360e993999b62cbc8cd67": { + "balance": "0xdd2d5fcf3bc9c0000" }, - "9ccddcb2cfc2b25b08729a0a98d9e6f0202ea2c1": { - "balance": "100000000000000000000" + "0x9ccddcb2cfc2b25b08729a0a98d9e6f0202ea2c1": { + "balance": "0x56bc75e2d63100000" }, - "d460a4b908dd2b056759b488850b66a838fc77a8": { - "balance": "1970000000000000000000" + "0xd460a4b908dd2b056759b488850b66a838fc77a8": { + "balance": "0x6acb3df27e1f880000" }, - "5431b1d18751b98fc9e2888ac7759f1535a2db47": { - "balance": "2000000000000000000000" + "0x5431b1d18751b98fc9e2888ac7759f1535a2db47": { + "balance": "0x6c6b935b8bbd400000" }, - "da2a14f9724015d79014ed8e5909681d596148f1": { - "balance": "48499000000000000000" + "0xda2a14f9724015d79014ed8e5909681d596148f1": { + "balance": "0x2a10f0f8a91ab8000" }, - "c989434f825aaf9c552f685eba7c11db4a5fc73a": { - "balance": "501000000000000000000" + "0xc989434f825aaf9c552f685eba7c11db4a5fc73a": { + "balance": "0x1b28c58d9696b40000" }, - "2b701d16c0d3cc1e4cd85445e6ad02eea4ac012d": { - "balance": "600000000000000000000" + "0x2b701d16c0d3cc1e4cd85445e6ad02eea4ac012d": { + "balance": "0x2086ac351052600000" }, - "78b978a9d7e91ee529ea4fc4b76feaf8762f698c": { - "balance": "32000000000000000000000" + "0x78b978a9d7e91ee529ea4fc4b76feaf8762f698c": { + "balance": "0x6c6b935b8bbd4000000" }, - "c89cf504b9f3f835181fd8424f5ccbc8e1bddf7d": { - "balance": "10000000000000000000000" + "0xc89cf504b9f3f835181fd8424f5ccbc8e1bddf7d": { + "balance": "0x21e19e0c9bab2400000" }, - "e94941b6036019b4016a30c1037d5a6903babaad": { - "balance": "780000000000000000000" + "0xe94941b6036019b4016a30c1037d5a6903babaad": { + "balance": "0x2a48acab6204b00000" }, - "95d98d0c1069908f067a52acac2b8b534da37afd": { - "balance": "2054053000000000000000" + "0x95d98d0c1069908f067a52acac2b8b534da37afd": { + "balance": "0x6f59b630a929708000" }, - "8284923b62e68bbf7c2b9f3414d13ef6c812a904": { - "balance": "3880000000000000000000" + "0x8284923b62e68bbf7c2b9f3414d13ef6c812a904": { + "balance": "0xd255d112e103a00000" }, - "3e5a39fdda70df1126ab0dc49a7378311a537a1f": { - "balance": "2400000000000000000000" + "0x3e5a39fdda70df1126ab0dc49a7378311a537a1f": { + "balance": "0x821ab0d44149800000" }, - "a2ace4c993bb1e5383f8ac74e179066e814f0591": { - "balance": "100000000000000000000" + "0xa2ace4c993bb1e5383f8ac74e179066e814f0591": { + "balance": "0x56bc75e2d63100000" }, - "0609d83a6ce1ffc9b690f3e9a81e983e8bdc4d9d": { - "balance": "70000000000000000000000" + "0x0609d83a6ce1ffc9b690f3e9a81e983e8bdc4d9d": { + "balance": "0xed2b525841adfc00000" }, - "d119417c46732cf34d1a1afb79c3e7e2cd8eece4": { - "balance": "2000000000000000000000" + "0xd119417c46732cf34d1a1afb79c3e7e2cd8eece4": { + "balance": "0x6c6b935b8bbd400000" }, - "fdb33944f2360615e5be239577c8a19ba52d9887": { - "balance": "601650000000000000000" + "0xfdb33944f2360615e5be239577c8a19ba52d9887": { + "balance": "0x209d922f5259c50000" }, - "dd95dbe30f1f1877c5dd7684aeef302ab6885192": { - "balance": "8372000000000000000000" + "0xdd95dbe30f1f1877c5dd7684aeef302ab6885192": { + "balance": "0x1c5d8d6eb3e32500000" }, - "413f4b02669ccff6806bc826fcb7deca3b0ea9bc": { - "balance": "20000000000000000000" + "0x413f4b02669ccff6806bc826fcb7deca3b0ea9bc": { + "balance": "0x1158e460913d00000" }, - "5800cd8130839e94495d2d8415a8ea2c90e0c5cb": { - "balance": "200000000000000000000" + "0x5800cd8130839e94495d2d8415a8ea2c90e0c5cb": { + "balance": "0xad78ebc5ac6200000" }, - "65053191319e067a25e6361d47f37f6318f83419": { - "balance": "394000000000000000000" + "0x65053191319e067a25e6361d47f37f6318f83419": { + "balance": "0x155bd9307f9fe80000" }, - "9bc573bcda23b8b26f9073d90c230e8e71e0270b": { - "balance": "999544000000000000000" + "0x9bc573bcda23b8b26f9073d90c230e8e71e0270b": { + "balance": "0x362f75a4305d0c0000" }, - "97f7760657c1e202759086963eb4211c5f8139b9": { - "balance": "49770000000000000000000" + "0x97f7760657c1e202759086963eb4211c5f8139b9": { + "balance": "0xa8a097fcb3d17680000" }, - "126897a311a14ad43b78e0920100c4426bfd6bdd": { - "balance": "973581000000000000000" + "0x126897a311a14ad43b78e0920100c4426bfd6bdd": { + "balance": "0x34c726893f2d948000" }, - "d5276f0cd5ffd5ffb63f98b5703d5594ede0838b": { - "balance": "400000000000000000000" + "0xd5276f0cd5ffd5ffb63f98b5703d5594ede0838b": { + "balance": "0x15af1d78b58c400000" }, - "e9c35c913ca1fceab461582fe1a5815164b4fd21": { - "balance": "8000000000000000000000" + "0xe9c35c913ca1fceab461582fe1a5815164b4fd21": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "b43067fe70d9b55973ba58dc64dd7f311e554259": { - "balance": "200000000000000000000" + "0xb43067fe70d9b55973ba58dc64dd7f311e554259": { + "balance": "0xad78ebc5ac6200000" }, - "6f8f0d15cc96fb7fe94f1065bc6940f8d12957b2": { - "balance": "1000000000000000000000" + "0x6f8f0d15cc96fb7fe94f1065bc6940f8d12957b2": { + "balance": "0x3635c9adc5dea00000" }, - "b1dba5250ba9625755246e067967f2ad2f0791de": { - "balance": "80000000000000000000000" + "0xb1dba5250ba9625755246e067967f2ad2f0791de": { + "balance": "0x10f0cf064dd592000000" }, - "72b7a03dda14ca9c661a1d469fd33736f673c8e8": { - "balance": "2000000000000000000000" + "0x72b7a03dda14ca9c661a1d469fd33736f673c8e8": { + "balance": "0x6c6b935b8bbd400000" }, - "e792349ce9f6f14f81d0674096befa1f9221cdea": { - "balance": "1685365000000000000000" + "0xe792349ce9f6f14f81d0674096befa1f9221cdea": { + "balance": "0x5b5d234a0db4388000" }, - "1815279dff9952da3be8f77249dbe22243377be7": { - "balance": "4749800000000000000000" + "0x1815279dff9952da3be8f77249dbe22243377be7": { + "balance": "0x1017cb76e7b26640000" }, - "33481e856ebed48ea708a27426ef28e867f57cd1": { - "balance": "200000000000000000000" + "0x33481e856ebed48ea708a27426ef28e867f57cd1": { + "balance": "0xad78ebc5ac6200000" }, - "8eb8c71982a00fb84275293253f8044544b66b49": { - "balance": "400000000000000000000" + "0x8eb8c71982a00fb84275293253f8044544b66b49": { + "balance": "0x15af1d78b58c400000" }, - "65f5870f26bce089677dfc23b5001ee492483428": { - "balance": "5067230000000000000000" + "0x65f5870f26bce089677dfc23b5001ee492483428": { + "balance": "0x112b1f155aa32a30000" }, - "8e23facd12c765c36ab81a6dd34d8aa9e68918ae": { - "balance": "167310000000000000000" + "0x8e23facd12c765c36ab81a6dd34d8aa9e68918ae": { + "balance": "0x911e4868dba9b0000" }, - "4912d902931676ff39fc34fe3c3cc8fb2182fa7a": { - "balance": "20000000000000000000" + "0x4912d902931676ff39fc34fe3c3cc8fb2182fa7a": { + "balance": "0x1158e460913d00000" }, - "c09a66172aea370d9a63da04ff71ffbbfcff7f94": { - "balance": "2000000000000000000000" + "0xc09a66172aea370d9a63da04ff71ffbbfcff7f94": { + "balance": "0x6c6b935b8bbd400000" }, - "e969ea1595edc5c4a707cfde380929633251a2b0": { - "balance": "200000000000000000000" + "0xe969ea1595edc5c4a707cfde380929633251a2b0": { + "balance": "0xad78ebc5ac6200000" }, - "4f2b47e2775a1fa7178dad92985a5bbe493ba6d6": { - "balance": "200000000000000000000" + "0x4f2b47e2775a1fa7178dad92985a5bbe493ba6d6": { + "balance": "0xad78ebc5ac6200000" }, - "cab9a97ada065c87816e6860a8f1426fe6b3d775": { - "balance": "1000000000000000000000" + "0xcab9a97ada065c87816e6860a8f1426fe6b3d775": { + "balance": "0x3635c9adc5dea00000" }, - "cdfd8217339725d7ebac11a63655f265eff1cc3d": { - "balance": "4999962000000000000000" + "0xcdfd8217339725d7ebac11a63655f265eff1cc3d": { + "balance": "0x10f0c696410e3a90000" }, - "ab4004c0403f7eabb0ea586f212156c4203d67f1": { - "balance": "1999944000000000000000" + "0xab4004c0403f7eabb0ea586f212156c4203d67f1": { + "balance": "0x6c6acc67d7b1d40000" }, - "1c7cb2fe6bf3e09cbcdc187af38fa8f5053a70b6": { - "balance": "9970823000000000000000" + "0x1c7cb2fe6bf3e09cbcdc187af38fa8f5053a70b6": { + "balance": "0x21c84f742d0cead8000" }, - "a951b244ff50cfae591d5e1a148df6a938ef2a1a": { - "balance": "1734000000000000000000" + "0xa951b244ff50cfae591d5e1a148df6a938ef2a1a": { + "balance": "0x5e001584dfcf580000" }, - "b158db43fa62d30e65f3d09bf781c7b67372ebaa": { - "balance": "1999000000000000000000" + "0xb158db43fa62d30e65f3d09bf781c7b67372ebaa": { + "balance": "0x6c5db2a4d815dc0000" }, - "25e037f00a18270ba5ec3420229ddb0a2ce38fa2": { - "balance": "10000000000000000000000" + "0x25e037f00a18270ba5ec3420229ddb0a2ce38fa2": { + "balance": "0x21e19e0c9bab2400000" }, - "2aaea1f1046f30f109faec1c63ef5c7594eb08da": { - "balance": "4000000000000000000000" + "0x2aaea1f1046f30f109faec1c63ef5c7594eb08da": { + "balance": "0xd8d726b7177a800000" }, - "73d7269ff06c9ffd33754ce588f74a966abbbbba": { - "balance": "6600000000000000000000" + "0x73d7269ff06c9ffd33754ce588f74a966abbbbba": { + "balance": "0x165c96647b38a200000" }, - "4c767b65fd91161f4fbdcc6a69e2f6ad711bb918": { - "balance": "720000000000000000000" + "0x4c767b65fd91161f4fbdcc6a69e2f6ad711bb918": { + "balance": "0x270801d946c9400000" }, - "92ae5b7c7eb492ff1ffa16dd42ad9cad40b7f8dc": { - "balance": "865000000000000000000" + "0x92ae5b7c7eb492ff1ffa16dd42ad9cad40b7f8dc": { + "balance": "0x2ee449550898e40000" }, - "a04f2ae02add14c12faf65cb259022d0830a8e26": { - "balance": "100000000000000000000000" + "0xa04f2ae02add14c12faf65cb259022d0830a8e26": { + "balance": "0x152d02c7e14af6800000" }, - "63ef2fbc3daf5edaf4a295629ccf31bcdf4038e5": { - "balance": "1460000000000000000000" + "0x63ef2fbc3daf5edaf4a295629ccf31bcdf4038e5": { + "balance": "0x4f2591f896a6500000" }, - "749ad6f2b5706bbe2f689a44c4b640b58e96b992": { - "balance": "100000000000000000000" + "0x749ad6f2b5706bbe2f689a44c4b640b58e96b992": { + "balance": "0x56bc75e2d63100000" }, - "4d836d9d3b0e2cbd4de050596faa490cffb60d5d": { - "balance": "300000000000000000000" + "0x4d836d9d3b0e2cbd4de050596faa490cffb60d5d": { + "balance": "0x1043561a8829300000" }, - "59f6247b0d582aaa25e5114765e4bf3c774f43c2": { - "balance": "50000000000000000000" + "0x59f6247b0d582aaa25e5114765e4bf3c774f43c2": { + "balance": "0x2b5e3af16b1880000" }, - "1293c78c7d6a443b9d74b0ba5ee7bb47fd418588": { - "balance": "6685000000000000000000" + "0x1293c78c7d6a443b9d74b0ba5ee7bb47fd418588": { + "balance": "0x16a6502f15a1e540000" }, - "67bc85e87dc34c4e80aafa066ba8d29dbb8e438e": { - "balance": "402500000000000000000" + "0x67bc85e87dc34c4e80aafa066ba8d29dbb8e438e": { + "balance": "0x15d1cf4176aeba0000" }, - "a09f4d5eaa65a2f4cb750a49923401dae59090af": { - "balance": "140000000000000000000" + "0xa09f4d5eaa65a2f4cb750a49923401dae59090af": { + "balance": "0x796e3ea3f8ab00000" }, - "ebbd4db9019952d68b1b0f6d8cf0683c00387bb5": { - "balance": "332330000000000000000" + "0xebbd4db9019952d68b1b0f6d8cf0683c00387bb5": { + "balance": "0x120401563d7d910000" }, - "b16479ba8e7df8f63e1b95d149cd8529d735c2da": { - "balance": "846477000000000000000" + "0xb16479ba8e7df8f63e1b95d149cd8529d735c2da": { + "balance": "0x2de33a6aac32548000" }, - "e1b2aca154b8e0766c4eba30bc10c7f35036f368": { - "balance": "19980000000000000000" + "0xe1b2aca154b8e0766c4eba30bc10c7f35036f368": { + "balance": "0x115473824344e0000" }, - "5c464197791c8a3da3c925436f277ab13bf2faa2": { - "balance": "8000000000000000000000" + "0x5c464197791c8a3da3c925436f277ab13bf2faa2": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "170a88a8997f92d238370f1affdee6347050b013": { - "balance": "3000800000000000000000" + "0x170a88a8997f92d238370f1affdee6347050b013": { + "balance": "0xa2ac77351488300000" }, - "dadbfafd8b62b92a24efd75256dd83abdbd7bbdb": { - "balance": "19700000000000000000" + "0xdadbfafd8b62b92a24efd75256dd83abdbd7bbdb": { + "balance": "0x11164759ffb320000" }, - "bb993b96ee925ada7d99d786573d3f89180ce3aa": { - "balance": "2000000000000000000000" + "0xbb993b96ee925ada7d99d786573d3f89180ce3aa": { + "balance": "0x6c6b935b8bbd400000" }, - "f2c362b0ef991bc82fb36e66ff75932ae8dd8225": { - "balance": "74000000000000000000" + "0xf2c362b0ef991bc82fb36e66ff75932ae8dd8225": { + "balance": "0x402f4cfee62e80000" }, - "7f2382ffd8f83956467937f9ba72374623f11b38": { - "balance": "600000000000000000000" + "0x7f2382ffd8f83956467937f9ba72374623f11b38": { + "balance": "0x2086ac351052600000" }, - "74d1a4d0c7524e018d4e06ed3b648092b5b6af2c": { - "balance": "50000000000000000000" + "0x74d1a4d0c7524e018d4e06ed3b648092b5b6af2c": { + "balance": "0x2b5e3af16b1880000" }, - "24a750eae5874711116dd7d47b7186ce990d3103": { - "balance": "200000000000000000000" + "0x24a750eae5874711116dd7d47b7186ce990d3103": { + "balance": "0xad78ebc5ac6200000" }, - "a8e42a4e33d7526cca19d9a36dcd6e8040d0ea73": { - "balance": "1080000000000000000000" + "0xa8e42a4e33d7526cca19d9a36dcd6e8040d0ea73": { + "balance": "0x3a8c02c5ea2de00000" }, - "3e1b2230afbbd310b4926a4c776d5ae7819c661d": { - "balance": "30000000000000000000000" + "0x3e1b2230afbbd310b4926a4c776d5ae7819c661d": { + "balance": "0x65a4da25d3016c00000" }, - "6af9f0dfeeaebb5f64bf91ab771669bf05295553": { - "balance": "400000000000000000000" + "0x6af9f0dfeeaebb5f64bf91ab771669bf05295553": { + "balance": "0x15af1d78b58c400000" }, - "41e4a20275e39bdcefeb655c0322744b765140c2": { - "balance": "10000000000000000000000" + "0x41e4a20275e39bdcefeb655c0322744b765140c2": { + "balance": "0x21e19e0c9bab2400000" }, - "ceb089ec8a78337e8ef88de11b49e3dd910f748f": { - "balance": "1000000000000000000000" + "0xceb089ec8a78337e8ef88de11b49e3dd910f748f": { + "balance": "0x3635c9adc5dea00000" }, - "e6bcd30a8fa138c5d9e5f6c7d2da806992812dcd": { - "balance": "260000000000000000000000" + "0xe6bcd30a8fa138c5d9e5f6c7d2da806992812dcd": { + "balance": "0x370ea0d47cf61a800000" }, - "e08c60313106e3f9334fe6f7e7624d211130c077": { - "balance": "40000000000000000000" + "0xe08c60313106e3f9334fe6f7e7624d211130c077": { + "balance": "0x22b1c8c1227a00000" }, - "f5cffbba624e7eb321bc83c60ca68199b4e36671": { - "balance": "2000000000000000000000" + "0xf5cffbba624e7eb321bc83c60ca68199b4e36671": { + "balance": "0x6c6b935b8bbd400000" }, - "d7c2803ed7b0e0837351411a8e6637d168bc5b05": { - "balance": "29549015000000000000000" + "0xd7c2803ed7b0e0837351411a8e6637d168bc5b05": { + "balance": "0x641daf5c91bd9358000" }, - "0f3665d48e9f1419cd984fc7fa92788710c8f2e4": { - "balance": "2000000000000000000000" + "0x0f3665d48e9f1419cd984fc7fa92788710c8f2e4": { + "balance": "0x6c6b935b8bbd400000" }, - "b48921c9687d5510744584936e8886bdbf2df69b": { - "balance": "1000000000000000000000" + "0xb48921c9687d5510744584936e8886bdbf2df69b": { + "balance": "0x3635c9adc5dea00000" }, - "a94bbb8214cf8da0c2f668a2ac73e86248528d4b": { - "balance": "960000000000000000000" + "0xa94bbb8214cf8da0c2f668a2ac73e86248528d4b": { + "balance": "0x340aad21b3b7000000" }, - "be0c2a80b9de084b172894a76cf4737a4f529e1a": { - "balance": "1999944000000000000000" + "0xbe0c2a80b9de084b172894a76cf4737a4f529e1a": { + "balance": "0x6c6acc67d7b1d40000" }, - "fcf199f8b854222f182e4e1d099d4e323e2aae01": { - "balance": "1000000000000000000000" + "0xfcf199f8b854222f182e4e1d099d4e323e2aae01": { + "balance": "0x3635c9adc5dea00000" }, - "b52dfb45de5d74e3df208332bc571c809b8dcf32": { - "balance": "6000000000000000000000" + "0xb52dfb45de5d74e3df208332bc571c809b8dcf32": { + "balance": "0x14542ba12a337c00000" }, - "704819d2e44d6ed1da25bfce84c49fcca25613e5": { - "balance": "400000000000000000000" + "0x704819d2e44d6ed1da25bfce84c49fcca25613e5": { + "balance": "0x15af1d78b58c400000" }, - "6ff6cc90d649de4e96cffee1077a5b302a848dcb": { - "balance": "28600000000000000000" + "0x6ff6cc90d649de4e96cffee1077a5b302a848dcb": { + "balance": "0x18ce79c78802c0000" }, - "4d9c77d0750c5e6fbc247f2fd79274686cb353d6": { - "balance": "20000000000000000000" + "0x4d9c77d0750c5e6fbc247f2fd79274686cb353d6": { + "balance": "0x1158e460913d00000" }, - "68e8022740f4af29eb48db32bcecddfd148d3de3": { - "balance": "1000000000000000000000" + "0x68e8022740f4af29eb48db32bcecddfd148d3de3": { + "balance": "0x3635c9adc5dea00000" }, - "2cb615073a40dcdb99faa848572e987b3b056efb": { - "balance": "799600000000000000000" + "0x2cb615073a40dcdb99faa848572e987b3b056efb": { + "balance": "0x2b58addb89a2580000" }, - "64adcceec53dd9d9dd15c8cc1a9e736de4241d2c": { - "balance": "56000000000000000000" + "0x64adcceec53dd9d9dd15c8cc1a9e736de4241d2c": { + "balance": "0x30927f74c9de00000" }, - "2aec809df9325b9f483996e99f7331097f08aa0e": { - "balance": "4000000000000000000000" + "0x2aec809df9325b9f483996e99f7331097f08aa0e": { + "balance": "0xd8d726b7177a800000" }, - "438c2f54ff8e629bab36b1442b760b12a88f02ae": { - "balance": "2000000000000000000000" + "0x438c2f54ff8e629bab36b1442b760b12a88f02ae": { + "balance": "0x6c6b935b8bbd400000" }, - "9e35399071a4a101e9194daa3f09f04a0b5f9870": { - "balance": "4000000000000000000000" + "0x9e35399071a4a101e9194daa3f09f04a0b5f9870": { + "balance": "0xd8d726b7177a800000" }, - "a5c336083b04f9471b8c6ed73679b74d66c363ec": { - "balance": "3014100000000000000000" + "0xa5c336083b04f9471b8c6ed73679b74d66c363ec": { + "balance": "0xa3650a4c9d20e20000" }, - "7ad3f307616f19dcb143e6444dab9c3c33611f52": { - "balance": "50000000000000000000" + "0x7ad3f307616f19dcb143e6444dab9c3c33611f52": { + "balance": "0x2b5e3af16b1880000" }, - "455cb8ee39ffbc752331e5aefc588ef0ee593454": { - "balance": "999963000000000000000" + "0x455cb8ee39ffbc752331e5aefc588ef0ee593454": { + "balance": "0x3635463a780def8000" }, - "c4c01afc3e0f045221da1284d7878574442fb9ac": { - "balance": "7419944000000000000000" + "0xc4c01afc3e0f045221da1284d7878574442fb9ac": { + "balance": "0x1923c688b73ab040000" }, - "99268327c373332e06c3f6164287d455b9d5fa4b": { - "balance": "2000000000000000000000" + "0x99268327c373332e06c3f6164287d455b9d5fa4b": { + "balance": "0x6c6b935b8bbd400000" }, - "4367ae4b0ce964f4a54afd4b5c368496db169e9a": { - "balance": "2000000000000000000000" + "0x4367ae4b0ce964f4a54afd4b5c368496db169e9a": { + "balance": "0x6c6b935b8bbd400000" }, - "2cd79eb52027b12c18828e3eaab2969bfcd287e9": { - "balance": "20000000000000000000" + "0x2cd79eb52027b12c18828e3eaab2969bfcd287e9": { + "balance": "0x1158e460913d00000" }, - "b96841cabbc7dbd69ef0cf8f81dff3c8a5e21570": { - "balance": "12000000000000000000000" + "0xb96841cabbc7dbd69ef0cf8f81dff3c8a5e21570": { + "balance": "0x28a857425466f800000" }, - "d7ebddb9f93987779b680155375438db65afcb6a": { - "balance": "100600000000000000000" + "0xd7ebddb9f93987779b680155375438db65afcb6a": { + "balance": "0x5741afeff944c0000" }, - "0631d18bbbbd30d9e1732bf36edae2ce8901ab80": { - "balance": "3024800000000000000000" + "0x0631d18bbbbd30d9e1732bf36edae2ce8901ab80": { + "balance": "0xa3f98855ec39900000" }, - "5fad960f6b2c84569c9f4d47bf1985fcb2c65da6": { - "balance": "999972000000000000000" + "0x5fad960f6b2c84569c9f4d47bf1985fcb2c65da6": { + "balance": "0x36356633ebd8ea0000" }, - "01d599ee0d5f8c38ab2d392e2c65b74c3ce31820": { - "balance": "510000000000000000000" + "0x01d599ee0d5f8c38ab2d392e2c65b74c3ce31820": { + "balance": "0x1ba5abf9e779380000" }, - "ff0cc8dac824fa24fc3caa2169e6e057cf638ad6": { - "balance": "4000000000000000000000" + "0xff0cc8dac824fa24fc3caa2169e6e057cf638ad6": { + "balance": "0xd8d726b7177a800000" }, - "c25266c7676632f13ef29be455ed948add567792": { - "balance": "1337000000000000000000" + "0xc25266c7676632f13ef29be455ed948add567792": { + "balance": "0x487a9a304539440000" }, - "9c344098ba615a398f11d009905b177c44a7b602": { - "balance": "1000000000000000000000" + "0x9c344098ba615a398f11d009905b177c44a7b602": { + "balance": "0x3635c9adc5dea00000" }, - "3b0accaf4b607cfe61d17334c214b75cdefdbd89": { - "balance": "2000000000000000000000" + "0x3b0accaf4b607cfe61d17334c214b75cdefdbd89": { + "balance": "0x6c6b935b8bbd400000" }, - "6d6634b5b8a40195d949027af4828802092ceeb6": { - "balance": "3000000000000000000000" + "0x6d6634b5b8a40195d949027af4828802092ceeb6": { + "balance": "0xa2a15d09519be00000" }, - "208c45732c0a378f17ac8324926d459ba8b658b4": { - "balance": "2955000000000000000000" + "0x208c45732c0a378f17ac8324926d459ba8b658b4": { + "balance": "0xa030dcebbd2f4c0000" }, - "c24399b4bf86f7338fbf645e3b22b0e0b7973912": { - "balance": "2000000000000000000000" + "0xc24399b4bf86f7338fbf645e3b22b0e0b7973912": { + "balance": "0x6c6b935b8bbd400000" }, - "29763dd6da9a7c161173888321eba6b63c8fb845": { - "balance": "328000000000000000000" + "0x29763dd6da9a7c161173888321eba6b63c8fb845": { + "balance": "0x11c7ea162e78200000" }, - "9c2fd54089af665df5971d73b804616039647375": { - "balance": "1000000000000000000000" + "0x9c2fd54089af665df5971d73b804616039647375": { + "balance": "0x3635c9adc5dea00000" }, - "0e09646c99af438e99fa274cb2f9c856cb65f736": { - "balance": "1910000000000000000000" + "0x0e09646c99af438e99fa274cb2f9c856cb65f736": { + "balance": "0x678a932062e4180000" }, - "be73274d8c5aa44a3cbefc8263c37ba121b20ad3": { - "balance": "500000000000000000000" + "0xbe73274d8c5aa44a3cbefc8263c37ba121b20ad3": { + "balance": "0x1b1ae4d6e2ef500000" }, - "ecfd004d02f36cd4d8b4a8c1a9533b6af85cd716": { - "balance": "5003800000000000000000" + "0xecfd004d02f36cd4d8b4a8c1a9533b6af85cd716": { + "balance": "0x10f41acb4bb3b9c0000" }, - "f978b025b64233555cc3c19ada7f4199c9348bf7": { - "balance": "400000000000000000000000" + "0xf978b025b64233555cc3c19ada7f4199c9348bf7": { + "balance": "0x54b40b1f852bda000000" }, - "705ddd38355482b8c7d3b515bda1500dd7d7a817": { - "balance": "400000000000000000000" + "0x705ddd38355482b8c7d3b515bda1500dd7d7a817": { + "balance": "0x15af1d78b58c400000" }, - "2b8a0dee5cb0e1e97e15cfca6e19ad21f995efad": { - "balance": "504206000000000000000" + "0x2b8a0dee5cb0e1e97e15cfca6e19ad21f995efad": { + "balance": "0x1b55438d9a249b0000" }, - "1098cc20ef84bad5146639c4cd1ca6c3996cb99b": { - "balance": "18200000000000000000" + "0x1098cc20ef84bad5146639c4cd1ca6c3996cb99b": { + "balance": "0xfc936392801c0000" }, - "afdac5c1cb56e245bf70330066a817eaafac4cd1": { - "balance": "20000000000000000000" + "0xafdac5c1cb56e245bf70330066a817eaafac4cd1": { + "balance": "0x1158e460913d00000" }, - "910e996543344c6815fb97cda7af4b8698765a5b": { - "balance": "103400000000000000000" + "0x910e996543344c6815fb97cda7af4b8698765a5b": { + "balance": "0x59af69829cf640000" }, - "94612781033b57b146ee74e753c672017f5385e4": { - "balance": "3600000000000000000000" + "0x94612781033b57b146ee74e753c672017f5385e4": { + "balance": "0xc328093e61ee400000" }, - "d03fc165576aaed525e5502c8e140f8b2e869639": { - "balance": "6850000000000000000000" + "0xd03fc165576aaed525e5502c8e140f8b2e869639": { + "balance": "0x17356d8b32501c80000" }, - "293384c42b6f8f2905ce52b7205c2274376c612b": { - "balance": "1400000000000000000000" + "0x293384c42b6f8f2905ce52b7205c2274376c612b": { + "balance": "0x4be4e7267b6ae00000" }, - "09ee12b1b42b05af9cf207d5fcac255b2ec411f2": { - "balance": "58929000000000000000" + "0x09ee12b1b42b05af9cf207d5fcac255b2ec411f2": { + "balance": "0x331cddd47e0fe8000" }, - "dbd71efa4b93c889e76593de609c3b04cbafbe08": { - "balance": "20000000000000000000" + "0xdbd71efa4b93c889e76593de609c3b04cbafbe08": { + "balance": "0x1158e460913d00000" }, - "fa86ca27bf2854d98870837fb6f6dfe4bf6453fc": { - "balance": "322061000000000000000" + "0xfa86ca27bf2854d98870837fb6f6dfe4bf6453fc": { + "balance": "0x11757e8525cf148000" }, - "61ff8e67b34d9ee6f78eb36ffea1b9f7c15787af": { - "balance": "1640000000000000000000" + "0x61ff8e67b34d9ee6f78eb36ffea1b9f7c15787af": { + "balance": "0x58e7926ee858a00000" }, - "6d4cbf3d8284833ae99344303e08b4d614bfda3b": { - "balance": "12000000000000000000000" + "0x6d4cbf3d8284833ae99344303e08b4d614bfda3b": { + "balance": "0x28a857425466f800000" }, - "2ff160c44f72a299b5ec2d71e28ce5446d2fcbaf": { - "balance": "360000000000000000000" + "0x2ff160c44f72a299b5ec2d71e28ce5446d2fcbaf": { + "balance": "0x138400eca364a00000" }, - "94a7cda8f481f9d89d42c303ae1632b3b709db1d": { - "balance": "300000000000000000000" + "0x94a7cda8f481f9d89d42c303ae1632b3b709db1d": { + "balance": "0x1043561a8829300000" }, - "7566496162ba584377be040a4f87777a707acaeb": { - "balance": "4000000000000000000000" + "0x7566496162ba584377be040a4f87777a707acaeb": { + "balance": "0xd8d726b7177a800000" }, - "bdc461462b6322b462bdb33f22799e8108e2417d": { - "balance": "668500000000000000000" + "0xbdc461462b6322b462bdb33f22799e8108e2417d": { + "balance": "0x243d4d18229ca20000" }, - "7e47637e97c14622882be057bea229386f4052e5": { - "balance": "440000000000000000000" + "0x7e47637e97c14622882be057bea229386f4052e5": { + "balance": "0x17da3a04c7b3e00000" }, - "3b5c251d7fd7893ba209fe541cecd0ce253a990d": { - "balance": "30000000000000000000000" + "0x3b5c251d7fd7893ba209fe541cecd0ce253a990d": { + "balance": "0x65a4da25d3016c00000" }, - "0e498800447177b8c8afc3fdfa7f69f4051bb629": { - "balance": "2140234000000000000000" + "0x0e498800447177b8c8afc3fdfa7f69f4051bb629": { + "balance": "0x7405b69b8de5610000" }, - "b71623f35107cf7431a83fb3d204b29ee0b1a7f4": { - "balance": "19700000000000000000" + "0xb71623f35107cf7431a83fb3d204b29ee0b1a7f4": { + "balance": "0x11164759ffb320000" }, - "1d395b30adda1cf21f091a4f4a7b753371189441": { - "balance": "100000000000000000000000" + "0x1d395b30adda1cf21f091a4f4a7b753371189441": { + "balance": "0x152d02c7e14af6800000" }, - "2c2428e4a66974edc822d5dbfb241b2728075158": { - "balance": "2000000000000000000000" + "0x2c2428e4a66974edc822d5dbfb241b2728075158": { + "balance": "0x6c6b935b8bbd400000" }, - "a575f2891dcfcda83c5cf01474af11ee01b72dc2": { - "balance": "100076000000000000000" + "0xa575f2891dcfcda83c5cf01474af11ee01b72dc2": { + "balance": "0x56cd55fc64dfe0000" }, - "ad728121873f0456d0518b80ab6580a203706595": { - "balance": "500000000000000000000" + "0xad728121873f0456d0518b80ab6580a203706595": { + "balance": "0x1b1ae4d6e2ef500000" }, - "48669eb5a801d8b75fb6aa58c3451b7058c243bf": { - "balance": "30940000000000000000000" + "0x48669eb5a801d8b75fb6aa58c3451b7058c243bf": { + "balance": "0x68d42c138dab9f00000" }, - "b3ae54fba09d3ee1d6bdd1e957923919024c35fa": { - "balance": "65513000000000000000" + "0xb3ae54fba09d3ee1d6bdd1e957923919024c35fa": { + "balance": "0x38d2cee65b22a8000" }, - "0d35408f226566116fb8acdaa9e2c9d59b76683f": { - "balance": "940000000000000000000" + "0x0d35408f226566116fb8acdaa9e2c9d59b76683f": { + "balance": "0x32f51edbaaa3300000" }, - "df211cd21288d6c56fae66c3ff54625dd4b15427": { - "balance": "2500024000000000000000" + "0xdf211cd21288d6c56fae66c3ff54625dd4b15427": { + "balance": "0x8786cd764e1f2c0000" }, - "8a746c5d67064711bfca685b95a4fe291a27028e": { - "balance": "40000000000000000000" + "0x8a746c5d67064711bfca685b95a4fe291a27028e": { + "balance": "0x22b1c8c1227a00000" }, - "1cf105ab23023b554c583e86d7921179ee83169f": { - "balance": "1970000000000000000000" + "0x1cf105ab23023b554c583e86d7921179ee83169f": { + "balance": "0x6acb3df27e1f880000" }, - "8cfedef198db0a9143f09129b3fd64dcbb9b4956": { - "balance": "2000000000000000000000" + "0x8cfedef198db0a9143f09129b3fd64dcbb9b4956": { + "balance": "0x6c6b935b8bbd400000" }, - "1e381adcf801a3bf9fd7bfac9ccc2b8482ad5e66": { - "balance": "600200000000000000000" + "0x1e381adcf801a3bf9fd7bfac9ccc2b8482ad5e66": { + "balance": "0x208972c0010d740000" }, - "e74608f506866ada6bfbfdf20fea440be76989ef": { - "balance": "1999944000000000000000" + "0xe74608f506866ada6bfbfdf20fea440be76989ef": { + "balance": "0x6c6acc67d7b1d40000" }, - "27e63989ca1e903bc620cf1b9c3f67b9e2ae6581": { - "balance": "1337000000000000000000" + "0x27e63989ca1e903bc620cf1b9c3f67b9e2ae6581": { + "balance": "0x487a9a304539440000" }, - "bb0857f1c911b24b86c8a70681473fe6aaa1cce2": { - "balance": "100000000000000000000" + "0xbb0857f1c911b24b86c8a70681473fe6aaa1cce2": { + "balance": "0x56bc75e2d63100000" }, - "4f8e8d274fb22a3fd36a47fe72980471544b3434": { - "balance": "200000000000000000000" + "0x4f8e8d274fb22a3fd36a47fe72980471544b3434": { + "balance": "0xad78ebc5ac6200000" }, - "127d3fc5003bf63c0d83e93957836515fd279045": { - "balance": "111890000000000000000" + "0x127d3fc5003bf63c0d83e93957836515fd279045": { + "balance": "0x610c9222e6e750000" }, - "95809e8da3fbe4b7f281f0b8b1715f420f7d7d63": { - "balance": "2000000000000000000000" + "0x95809e8da3fbe4b7f281f0b8b1715f420f7d7d63": { + "balance": "0x6c6b935b8bbd400000" }, - "28904bb7c4302943b709b14d7970e42b8324e1a1": { - "balance": "10027500000000000000000" + "0x28904bb7c4302943b709b14d7970e42b8324e1a1": { + "balance": "0x21f97846a072d7e0000" }, - "c07e3867ada096807a051a6c9c34cc3b3f4ad34a": { - "balance": "1788210000000000000000" + "0xc07e3867ada096807a051a6c9c34cc3b3f4ad34a": { + "balance": "0x60f06620a849450000" }, - "f0b469eae89d400ce7d5d66a9695037036b88903": { - "balance": "20000000000000000000000" + "0xf0b469eae89d400ce7d5d66a9695037036b88903": { + "balance": "0x43c33c1937564800000" }, - "7445202f0c74297a004eb3726aa6a82dd7c02fa1": { - "balance": "2000000000000000000000" + "0x7445202f0c74297a004eb3726aa6a82dd7c02fa1": { + "balance": "0x6c6b935b8bbd400000" }, - "c58f62fee9711e6a05dc0910b618420aa127f288": { - "balance": "3980000000000000000000" + "0xc58f62fee9711e6a05dc0910b618420aa127f288": { + "balance": "0xd7c198710e66b00000" }, - "801d65c518b11d0e3f4f470221417013c8e53ec5": { - "balance": "4000000000000000000000" + "0x801d65c518b11d0e3f4f470221417013c8e53ec5": { + "balance": "0xd8d726b7177a800000" }, - "41010fc8baf8437d17a04369809a168a17ca56fb": { - "balance": "100000000000000000000" + "0x41010fc8baf8437d17a04369809a168a17ca56fb": { + "balance": "0x56bc75e2d63100000" }, - "a1998144968a5c70a6415554cefec2824690c4a5": { - "balance": "20000000000000000000" + "0xa1998144968a5c70a6415554cefec2824690c4a5": { + "balance": "0x1158e460913d00000" }, - "e9559185f166fc9513cc71116144ce2deb0f1d4b": { - "balance": "20000000000000000000000" + "0xe9559185f166fc9513cc71116144ce2deb0f1d4b": { + "balance": "0x43c33c1937564800000" }, - "ed5b4c41e762d942404373caf21ed4615d25e6c1": { - "balance": "2013960000000000000000" + "0xed5b4c41e762d942404373caf21ed4615d25e6c1": { + "balance": "0x6d2d4f3d9525b40000" }, - "665b000f0b772750cc3c217a5ef429a92bf1ccbb": { - "balance": "4000000000000000000000" + "0x665b000f0b772750cc3c217a5ef429a92bf1ccbb": { + "balance": "0xd8d726b7177a800000" }, - "febd9f81cf78bd5fb6c4b9a24bd414bb9bfa4c4e": { - "balance": "1990019000000000000000" + "0xfebd9f81cf78bd5fb6c4b9a24bd414bb9bfa4c4e": { + "balance": "0x6be10fb8ed6e138000" }, - "a072691c8dd7cd4237ff72a75c1a9506d0ce5b9e": { - "balance": "370000000000000000000" + "0xa072691c8dd7cd4237ff72a75c1a9506d0ce5b9e": { + "balance": "0x140ec80fa7ee880000" }, - "6765df25280e8e4f38d4b1cf446fc5d7eb659e34": { - "balance": "100000000000000000000" + "0x6765df25280e8e4f38d4b1cf446fc5d7eb659e34": { + "balance": "0x56bc75e2d63100000" }, - "524fb210522c5e23bb67dfbf8c26aa616da49955": { - "balance": "999971000000000000000" + "0x524fb210522c5e23bb67dfbf8c26aa616da49955": { + "balance": "0x363562a66d34238000" }, - "e987e6139e6146a717fef96bc24934a5447fe05d": { - "balance": "2000000000000000000000" + "0xe987e6139e6146a717fef96bc24934a5447fe05d": { + "balance": "0x6c6b935b8bbd400000" }, - "d6110276cfe31e42825a577f6b435dbcc10cf764": { - "balance": "1000000000000000000000" + "0xd6110276cfe31e42825a577f6b435dbcc10cf764": { + "balance": "0x3635c9adc5dea00000" }, - "5e51b8a3bb09d303ea7c86051582fd600fb3dc1a": { - "balance": "20000000000000000000" + "0x5e51b8a3bb09d303ea7c86051582fd600fb3dc1a": { + "balance": "0x1158e460913d00000" }, - "5c4f24e994ed8f850ea7818f471c8fac3bcf0452": { - "balance": "1724800000000000000000" + "0x5c4f24e994ed8f850ea7818f471c8fac3bcf0452": { + "balance": "0x5d80688d9e31c00000" }, - "85b2998d0c73302cb2ba13f489313301e053be15": { - "balance": "10000000000000000000000" + "0x85b2998d0c73302cb2ba13f489313301e053be15": { + "balance": "0x21e19e0c9bab2400000" }, - "0af6c8d539c96d50259e1ba6719e9c8060f388c2": { - "balance": "1000000000000000000000" + "0x0af6c8d539c96d50259e1ba6719e9c8060f388c2": { + "balance": "0x3635c9adc5dea00000" }, - "7d901b28bf7f88ef73d8f73cca97564913ea8a24": { - "balance": "955000000000000000000" + "0x7d901b28bf7f88ef73d8f73cca97564913ea8a24": { + "balance": "0x33c5499031720c0000" }, - "e01859f242f1a0ec602fa8a3b0b57640ec89075e": { - "balance": "555000000000000000000" + "0xe01859f242f1a0ec602fa8a3b0b57640ec89075e": { + "balance": "0x1e162c177be5cc0000" }, - "c66ae4cee87fb3353219f77f1d6486c580280332": { - "balance": "29550000000000000000" + "0xc66ae4cee87fb3353219f77f1d6486c580280332": { + "balance": "0x19a16b06ff8cb0000" }, - "2d40558b06f90a3923145592123b6774e46e31f4": { - "balance": "1000000000000000000000" + "0x2d40558b06f90a3923145592123b6774e46e31f4": { + "balance": "0x3635c9adc5dea00000" }, - "ccf43975b76bfe735fec3cb7d4dd24f805ba0962": { - "balance": "60000000000000000000" + "0xccf43975b76bfe735fec3cb7d4dd24f805ba0962": { + "balance": "0x340aad21b3b700000" }, - "1703b4b292b8a9deddede81bb25d89179f6446b6": { - "balance": "19690000000000000000000" + "0x1703b4b292b8a9deddede81bb25d89179f6446b6": { + "balance": "0x42b65a455e8b1680000" }, - "0e9096d343c060db581a120112b278607ec6e52b": { - "balance": "20000000000000000000" + "0x0e9096d343c060db581a120112b278607ec6e52b": { + "balance": "0x1158e460913d00000" }, - "f65819ac4cc14c137f05dd7977c7dae08d1a4ab5": { - "balance": "102000000000000000000" + "0xf65819ac4cc14c137f05dd7977c7dae08d1a4ab5": { + "balance": "0x58788cb94b1d80000" }, - "ca373fe3c906b8c6559ee49ccd07f37cd4fb5266": { - "balance": "1790000000000000000000" + "0xca373fe3c906b8c6559ee49ccd07f37cd4fb5266": { + "balance": "0x61093d7c2c6d380000" }, - "d28298524df5ec4b24b0ffb9df85170a145a9eb5": { - "balance": "287700000000000000000" + "0xd28298524df5ec4b24b0ffb9df85170a145a9eb5": { + "balance": "0xf98a3b9b337e20000" }, - "5fcda847aaf8d7fa8bca08029ca2849166aa15a3": { - "balance": "623350000000000000000" + "0x5fcda847aaf8d7fa8bca08029ca2849166aa15a3": { + "balance": "0x21cab81259a3bf0000" }, - "bdc739a699700b2e8e2c4a4c7b058a0e513ddebe": { - "balance": "2000000000000000000000" + "0xbdc739a699700b2e8e2c4a4c7b058a0e513ddebe": { + "balance": "0x6c6b935b8bbd400000" }, - "0bb05f7224bb5804856556c07eeadbed87ba8f7c": { - "balance": "401100000000000000000" + "0x0bb05f7224bb5804856556c07eeadbed87ba8f7c": { + "balance": "0x15be6174e1912e0000" }, - "ab416fe30d58afe5d9454c7fce7f830bcc750356": { - "balance": "114515000000000000000" + "0xab416fe30d58afe5d9454c7fce7f830bcc750356": { + "balance": "0x6353701c605db8000" }, - "3eee6f1e96360b7689b3069adaf9af8eb60ce481": { - "balance": "1000000000000000000000" + "0x3eee6f1e96360b7689b3069adaf9af8eb60ce481": { + "balance": "0x3635c9adc5dea00000" }, - "9a0d3cee3d9892ea3b3700a27ff84140d9025493": { - "balance": "60000000000000000000" + "0x9a0d3cee3d9892ea3b3700a27ff84140d9025493": { + "balance": "0x340aad21b3b700000" }, - "5dc36de5359450a1ec09cb0c44cf2bb42b3ae435": { - "balance": "1117500000000000000000" + "0x5dc36de5359450a1ec09cb0c44cf2bb42b3ae435": { + "balance": "0x3c946d893b33060000" }, - "35c8adc11125432b3b77acd64625fe58ebee9d66": { - "balance": "2000000000000000000000" + "0x35c8adc11125432b3b77acd64625fe58ebee9d66": { + "balance": "0x6c6b935b8bbd400000" }, - "a5e9cd4b74255d22b7d9b27ae8dd43ed6ed0252b": { - "balance": "766527000000000000000" + "0xa5e9cd4b74255d22b7d9b27ae8dd43ed6ed0252b": { + "balance": "0x298db2f54411d98000" }, - "31ea12d49a35a740780ddeeaece84c0835b26270": { - "balance": "200000000000000000000" + "0x31ea12d49a35a740780ddeeaece84c0835b26270": { + "balance": "0xad78ebc5ac6200000" }, - "7aef7b551f0b9c46e755c0f38e5b3a73fe1199f5": { - "balance": "1490000000000000000000" + "0x7aef7b551f0b9c46e755c0f38e5b3a73fe1199f5": { + "balance": "0x50c5e761a444080000" }, - "cc6d7b12061bc96d104d606d65ffa32b0036eb07": { - "balance": "10000000000000000000000" + "0xcc6d7b12061bc96d104d606d65ffa32b0036eb07": { + "balance": "0x21e19e0c9bab2400000" }, - "322021022678a0166d204b3aaa7ad4ec4b88b7d0": { - "balance": "400000000000000000000" + "0x322021022678a0166d204b3aaa7ad4ec4b88b7d0": { + "balance": "0x15af1d78b58c400000" }, - "b31196714a48dff726ea9433cd2912f1a414b3b3": { - "balance": "2680000000000000000000" + "0xb31196714a48dff726ea9433cd2912f1a414b3b3": { + "balance": "0x914878a8c05ee00000" }, - "0f2fb884c8aaff6f543ac6228bd08e4f60b0a5fd": { - "balance": "3145000000000000000000" + "0x0f2fb884c8aaff6f543ac6228bd08e4f60b0a5fd": { + "balance": "0xaa7da485136b840000" }, - "7d9d221a3df89ddd7b5f61c1468c6787d6b333e6": { - "balance": "138000000000000000000" + "0x7d9d221a3df89ddd7b5f61c1468c6787d6b333e6": { + "balance": "0x77b227cd83be80000" }, - "367f59cc82795329384e41e1283115e791f26a01": { - "balance": "2000000000000000000000" + "0x367f59cc82795329384e41e1283115e791f26a01": { + "balance": "0x6c6b935b8bbd400000" }, - "fd9579f119bbc819a02b61e38d8803c942f24d32": { - "balance": "105600000000000000000" + "0xfd9579f119bbc819a02b61e38d8803c942f24d32": { + "balance": "0x5b97e9081d9400000" }, - "3e2f26235e137a7324e4dc154b5df5af46ea1a49": { - "balance": "22458000000000000000" + "0x3e2f26235e137a7324e4dc154b5df5af46ea1a49": { + "balance": "0x137aad8032db90000" }, - "4c1579af3312e4f88ae93c68e9449c2e9a68d9c4": { - "balance": "2000000000000000000000" + "0x4c1579af3312e4f88ae93c68e9449c2e9a68d9c4": { + "balance": "0x6c6b935b8bbd400000" }, - "ffb04726dfa41afdc819168418610472970d7bfc": { - "balance": "4000000000000000000000" + "0xffb04726dfa41afdc819168418610472970d7bfc": { + "balance": "0xd8d726b7177a800000" }, - "403c64896a75cad816a9105e18d8aa5bf80f238e": { - "balance": "985000000000000000000" + "0x403c64896a75cad816a9105e18d8aa5bf80f238e": { + "balance": "0x35659ef93f0fc40000" }, - "5cd588a14ec648ccf64729f9167aa7bf8be6eb3d": { - "balance": "1000000000000000000000" + "0x5cd588a14ec648ccf64729f9167aa7bf8be6eb3d": { + "balance": "0x3635c9adc5dea00000" }, - "24b2be118b16d8b2174769d17b4cf84f07ca946d": { - "balance": "2000000000000000000000" + "0x24b2be118b16d8b2174769d17b4cf84f07ca946d": { + "balance": "0x6c6b935b8bbd400000" }, - "d3bb59fa31258be62f8ed232f1a7d47b4a0b41ee": { - "balance": "100000000000000000000" + "0xd3bb59fa31258be62f8ed232f1a7d47b4a0b41ee": { + "balance": "0x56bc75e2d63100000" }, - "cc9ac715cd6f2610c52b58676456884297018b29": { - "balance": "13370000000000000000" + "0xcc9ac715cd6f2610c52b58676456884297018b29": { + "balance": "0xb98bc829a6f90000" }, - "6f2a31900e240395b19f159c1d00dfe4d898ebdf": { - "balance": "1999600000000000000000" + "0x6f2a31900e240395b19f159c1d00dfe4d898ebdf": { + "balance": "0x6c660645aa47180000" }, - "d60b247321a32a5affb96b1e279927cc584de943": { - "balance": "2265500000000000000000" + "0xd60b247321a32a5affb96b1e279927cc584de943": { + "balance": "0x7ad020d6ddd7760000" }, - "f7a1ade2d0f529123d1055f19b17919f56214e67": { - "balance": "500000000000000000000" + "0xf7a1ade2d0f529123d1055f19b17919f56214e67": { + "balance": "0x1b1ae4d6e2ef500000" }, - "bea00df17067a43a82bc1daecafb6c14300e89e6": { - "balance": "1820000000000000000000" + "0xbea00df17067a43a82bc1daecafb6c14300e89e6": { + "balance": "0x62a992e53a0af00000" }, - "a2968fc1c64bac0b7ae0d68ba949874d6db253f4": { - "balance": "20000000000000000000000" + "0xa2968fc1c64bac0b7ae0d68ba949874d6db253f4": { + "balance": "0x43c33c1937564800000" }, - "92d8ad9a4d61683b80d4a6672e84c20d62421e80": { - "balance": "20000000000000000000" + "0x92d8ad9a4d61683b80d4a6672e84c20d62421e80": { + "balance": "0x1158e460913d00000" }, - "6ed2a12b02f8c688c7b5d3a6ea14d63687dab3b6": { - "balance": "2000000000000000000000" + "0x6ed2a12b02f8c688c7b5d3a6ea14d63687dab3b6": { + "balance": "0x6c6b935b8bbd400000" }, - "7a63869fc767a4c6b1cd0e0649f3634cb121d24b": { - "balance": "77500000000000000000" + "0x7a63869fc767a4c6b1cd0e0649f3634cb121d24b": { + "balance": "0x433874f632cc60000" }, - "84f522f0520eba52dd18ad21fa4b829f2b89cb97": { - "balance": "4949566000000000000000" + "0x84f522f0520eba52dd18ad21fa4b829f2b89cb97": { + "balance": "0x10c5106d5134f130000" }, - "d6234aaf45c6f22e66a225ffb93add629b4ef80f": { - "balance": "1000000000000000000000" + "0xd6234aaf45c6f22e66a225ffb93add629b4ef80f": { + "balance": "0x3635c9adc5dea00000" }, - "e3d8bf4efe84b1616d1b89e427ddc6c8830685ae": { - "balance": "2000000000000000000000" + "0xe3d8bf4efe84b1616d1b89e427ddc6c8830685ae": { + "balance": "0x6c6b935b8bbd400000" }, - "a3db364a332d884ba93b2617ae4d85a1489bea47": { - "balance": "1700000000000000000000" + "0xa3db364a332d884ba93b2617ae4d85a1489bea47": { + "balance": "0x5c283d410394100000" }, - "9f7986924aeb02687cd64189189fb167ded2dd5c": { - "balance": "985000000000000000000" + "0x9f7986924aeb02687cd64189189fb167ded2dd5c": { + "balance": "0x35659ef93f0fc40000" }, - "2eaf4e2a46b789ccc288c8d1d9294e3fb0853896": { - "balance": "2000000000000000000000" + "0x2eaf4e2a46b789ccc288c8d1d9294e3fb0853896": { + "balance": "0x6c6b935b8bbd400000" }, - "a02dc6aa328b880de99eac546823fccf774047fb": { - "balance": "1970000000000000000000" + "0xa02dc6aa328b880de99eac546823fccf774047fb": { + "balance": "0x6acb3df27e1f880000" }, - "873b7f786d3c99ff012c4a7cae2677270240b9c5": { - "balance": "1730000000000000000000" + "0x873b7f786d3c99ff012c4a7cae2677270240b9c5": { + "balance": "0x5dc892aa1131c80000" }, - "1d69c83d28ff0474ceebeacb3ad227a144ece7a3": { - "balance": "5474937000000000000000" + "0x1d69c83d28ff0474ceebeacb3ad227a144ece7a3": { + "balance": "0x128cc03920a62d28000" }, - "7b827cae7ff4740918f2e030ab26cb98c4f46cf5": { - "balance": "7460000000000000000000" + "0x7b827cae7ff4740918f2e030ab26cb98c4f46cf5": { + "balance": "0x194684c0b39de100000" }, - "3083ef0ed4c4401196774a95cf4edc83edc1484f": { - "balance": "170000000000000000000000" + "0x3083ef0ed4c4401196774a95cf4edc83edc1484f": { + "balance": "0x23ffb7ed6565d6400000" }, - "40ad74bc0bce2a45e52f36c3debb1b3ada1b7619": { - "balance": "6790000000000000000000" + "0x40ad74bc0bce2a45e52f36c3debb1b3ada1b7619": { + "balance": "0x170162de109c6580000" }, - "05423a54c8d0f9707e704173d923b946edc8e700": { - "balance": "127543000000000000000" + "0x05423a54c8d0f9707e704173d923b946edc8e700": { + "balance": "0x6ea03c2bf8ba58000" }, - "22eb7db0ba56b0f8b816ccb206e615d929185b0d": { - "balance": "80500000000000000000" + "0x22eb7db0ba56b0f8b816ccb206e615d929185b0d": { + "balance": "0x45d29737e22f20000" }, - "66082c75a8de31a53913bbd44de3a0374f7faa41": { - "balance": "1460000000000000000000" + "0x66082c75a8de31a53913bbd44de3a0374f7faa41": { + "balance": "0x4f2591f896a6500000" }, - "e3d3eaa299887865569e88be219be507189be1c9": { - "balance": "456156000000000000000" + "0xe3d3eaa299887865569e88be219be507189be1c9": { + "balance": "0x18ba6fa92e93160000" }, - "ae57cc129a96a89981dac60d2ffb877d5dc5e432": { - "balance": "1110994000000000000000" + "0xae57cc129a96a89981dac60d2ffb877d5dc5e432": { + "balance": "0x3c3a2394b396550000" }, - "1a2434cc774422d48d53d59c5d562cce8407c94b": { - "balance": "30000000000000000000" + "0x1a2434cc774422d48d53d59c5d562cce8407c94b": { + "balance": "0x1a055690d9db80000" }, - "21546914dfd3af2add41b0ff3e83ffda7414e1e0": { - "balance": "5969100000000000000000" + "0x21546914dfd3af2add41b0ff3e83ffda7414e1e0": { + "balance": "0x14395e7385a502e0000" }, - "4dcf62a3de3f061db91498fd61060f1f6398ff73": { - "balance": "1999944000000000000000" + "0x4dcf62a3de3f061db91498fd61060f1f6398ff73": { + "balance": "0x6c6acc67d7b1d40000" }, - "6fd98e563d12ce0fd60f4f1f850ae396a9823c02": { - "balance": "1261000000000000000000" + "0x6fd98e563d12ce0fd60f4f1f850ae396a9823c02": { + "balance": "0x445be3f2ef87940000" }, - "edf8a3e1d40f13b79ec8e3e1ecf262fd92116263": { - "balance": "158000000000000000000" + "0xedf8a3e1d40f13b79ec8e3e1ecf262fd92116263": { + "balance": "0x890b0c2e14fb80000" }, - "c09e3cfc19f605ff3ec9c9c70e2540d7ee974366": { - "balance": "500000000000000000000" + "0xc09e3cfc19f605ff3ec9c9c70e2540d7ee974366": { + "balance": "0x1b1ae4d6e2ef500000" }, - "953572f0ea6df9b197cae40e4b8ecc056c4371c5": { - "balance": "1000000000000000000000" + "0x953572f0ea6df9b197cae40e4b8ecc056c4371c5": { + "balance": "0x3635c9adc5dea00000" }, - "163cc8be227646cb09719159f28ed09c5dc0dce0": { - "balance": "1337000000000000000000" + "0x163cc8be227646cb09719159f28ed09c5dc0dce0": { + "balance": "0x487a9a304539440000" }, - "a3932a31d6ff75fb3b1271ace7caa7d5e1ff1051": { - "balance": "20000000000000000000000" + "0xa3932a31d6ff75fb3b1271ace7caa7d5e1ff1051": { + "balance": "0x43c33c1937564800000" }, - "f9a94bd56198da245ed01d1e6430b24b2708dcc0": { - "balance": "749938000000000000000" + "0xf9a94bd56198da245ed01d1e6430b24b2708dcc0": { + "balance": "0x28a77afda87ee50000" }, - "3eb8b33b21d23cda86d8288884ab470e164691b5": { - "balance": "500000000000000000000" + "0x3eb8b33b21d23cda86d8288884ab470e164691b5": { + "balance": "0x1b1ae4d6e2ef500000" }, - "84bcbf22c09607ac84341d2edbc03bfb1739d744": { - "balance": "500000000000000000000" + "0x84bcbf22c09607ac84341d2edbc03bfb1739d744": { + "balance": "0x1b1ae4d6e2ef500000" }, - "961c59adc74505d1864d1ecfcb8afa0412593c93": { - "balance": "40000000000000000000000" + "0x961c59adc74505d1864d1ecfcb8afa0412593c93": { + "balance": "0x878678326eac9000000" }, - "f068dfe95d15cd3a7f98ffa688b4346842be2690": { - "balance": "1255160000000000000000" + "0xf068dfe95d15cd3a7f98ffa688b4346842be2690": { + "balance": "0x440ad819e0974c0000" }, - "291efe0081dce8c14799f7b2a43619c0c3b3fc1f": { - "balance": "1200000000000000000000" + "0x291efe0081dce8c14799f7b2a43619c0c3b3fc1f": { + "balance": "0x410d586a20a4c00000" }, - "be4fd073617022b67f5c13499b827f763639e4e3": { - "balance": "2000000000000000000000" + "0xbe4fd073617022b67f5c13499b827f763639e4e3": { + "balance": "0x6c6b935b8bbd400000" }, - "e40a7c82e157540a0b00901dbb86c716e1a062da": { - "balance": "49800000000000000000" + "0xe40a7c82e157540a0b00901dbb86c716e1a062da": { + "balance": "0x2b31d2425f6740000" }, - "6635b46f711d2da6f0e16370cd8ee43efb2c2d52": { - "balance": "2000000000000000000000" + "0x6635b46f711d2da6f0e16370cd8ee43efb2c2d52": { + "balance": "0x6c6b935b8bbd400000" }, - "43748928e8c3ec4436a1d092fbe43ac749be1251": { - "balance": "400000000000000000000" + "0x43748928e8c3ec4436a1d092fbe43ac749be1251": { + "balance": "0x15af1d78b58c400000" }, - "b557ab9439ef50d237b553f02508364a466a5c03": { - "balance": "200000000000000000000" + "0xb557ab9439ef50d237b553f02508364a466a5c03": { + "balance": "0xad78ebc5ac6200000" }, - "11928378d27d55c520ceedf24ceb1e822d890df0": { - "balance": "8000000000000000000000" + "0x11928378d27d55c520ceedf24ceb1e822d890df0": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "61518464fdd8b73c1bb6ac6db600654938dbf17a": { - "balance": "200000000000000000000" + "0x61518464fdd8b73c1bb6ac6db600654938dbf17a": { + "balance": "0xad78ebc5ac6200000" }, - "004bfbe1546bc6c65b5c7eaa55304b38bbfec6d3": { - "balance": "2000000000000000000000" + "0x004bfbe1546bc6c65b5c7eaa55304b38bbfec6d3": { + "balance": "0x6c6b935b8bbd400000" }, - "a5e0fc3c3affed3db6710947d1d6fb017f3e276d": { - "balance": "2000000000000000000000" + "0xa5e0fc3c3affed3db6710947d1d6fb017f3e276d": { + "balance": "0x6c6b935b8bbd400000" }, - "8ecbcfacbfafe9f00c3922a24e2cf0026756ca20": { - "balance": "5640000000000000000000" + "0x8ecbcfacbfafe9f00c3922a24e2cf0026756ca20": { + "balance": "0x131beb925ffd3200000" }, - "fb5ffaa0f7615726357891475818939d2037cf96": { - "balance": "20000000000000000000" + "0xfb5ffaa0f7615726357891475818939d2037cf96": { + "balance": "0x1158e460913d00000" }, - "ae222865799079aaf4f0674a0cdaab02a6d570ff": { - "balance": "2000000000000000000000" + "0xae222865799079aaf4f0674a0cdaab02a6d570ff": { + "balance": "0x6c6b935b8bbd400000" }, - "9edc90f4be210865214ab5b35e5a8dd77415279d": { - "balance": "4000000000000000000000" + "0x9edc90f4be210865214ab5b35e5a8dd77415279d": { + "balance": "0xd8d726b7177a800000" }, - "9d7831e834c20b1baa697af1d8e0c621c5afff9a": { - "balance": "86500000000000000000" + "0x9d7831e834c20b1baa697af1d8e0c621c5afff9a": { + "balance": "0x4b06dbbb40f4a0000" }, - "046d274b1af615fb505a764ad8dda770b1db2f3d": { - "balance": "2000000000000000000000" + "0x046d274b1af615fb505a764ad8dda770b1db2f3d": { + "balance": "0x6c6b935b8bbd400000" }, - "eaea23aa057200e7c9c15e8ff190d0e66c0c0e83": { - "balance": "2000000000000000000000" + "0xeaea23aa057200e7c9c15e8ff190d0e66c0c0e83": { + "balance": "0x6c6b935b8bbd400000" }, - "417a3cd19496530a6d4204c3b5a17ce0f207b1a5": { - "balance": "8000000000000000000000" + "0x417a3cd19496530a6d4204c3b5a17ce0f207b1a5": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "a035a3652478f82dbd6d115faa8ca946ec9e681d": { - "balance": "109880000000000000000" + "0xa035a3652478f82dbd6d115faa8ca946ec9e681d": { + "balance": "0x5f4e42dd4afec0000" }, - "4f5801b1eb30b712d8a0575a9a71ff965d4f34eb": { - "balance": "300000000000000000000" + "0x4f5801b1eb30b712d8a0575a9a71ff965d4f34eb": { + "balance": "0x1043561a8829300000" }, - "91dbb6aaad149585be47375c5d6de5ff09191518": { - "balance": "20000000000000000000000" + "0x91dbb6aaad149585be47375c5d6de5ff09191518": { + "balance": "0x43c33c1937564800000" }, - "d043a011ec4270ee7ec8b968737515e503f83028": { - "balance": "500000000000000000000" + "0xd043a011ec4270ee7ec8b968737515e503f83028": { + "balance": "0x1b1ae4d6e2ef500000" }, - "bb371c72c9f0316cea2bd9c6fbb4079e775429ef": { - "balance": "1760000000000000000000" + "0xbb371c72c9f0316cea2bd9c6fbb4079e775429ef": { + "balance": "0x5f68e8131ecf800000" }, - "aa1df92e51dff70b1973e0e924c66287b494a178": { - "balance": "534400000000000000000" + "0xaa1df92e51dff70b1973e0e924c66287b494a178": { + "balance": "0x1cf84a30a0a0c00000" }, - "bd5f46caab2c3d4b289396bbb07f203c4da82530": { - "balance": "80000000000000000000" + "0xbd5f46caab2c3d4b289396bbb07f203c4da82530": { + "balance": "0x4563918244f400000" }, - "4d29fc523a2c1629532121da9998e9b5ab9d1b45": { - "balance": "15800000000000000000" + "0x4d29fc523a2c1629532121da9998e9b5ab9d1b45": { + "balance": "0xdb44e049bb2c0000" }, - "addb26317227f45c87a2cb90dc4cfd02fb23caf8": { - "balance": "1000000000000000000000" + "0xaddb26317227f45c87a2cb90dc4cfd02fb23caf8": { + "balance": "0x3635c9adc5dea00000" }, - "52e46783329a769301b175009d346768f4c87ee4": { - "balance": "2000000000000000000000" + "0x52e46783329a769301b175009d346768f4c87ee4": { + "balance": "0x6c6b935b8bbd400000" }, - "caad9dc20d589ce428d8fda3a9d53a607b7988b5": { - "balance": "4000000000000000000000" + "0xcaad9dc20d589ce428d8fda3a9d53a607b7988b5": { + "balance": "0xd8d726b7177a800000" }, - "95034e1621865137cd4739b346dc17da3a27c34e": { - "balance": "1580000000000000000000" + "0x95034e1621865137cd4739b346dc17da3a27c34e": { + "balance": "0x55a6e79ccd1d300000" }, - "0c3239e2e841242db989a61518c22247e8c55208": { - "balance": "263656000000000000000" + "0x0c3239e2e841242db989a61518c22247e8c55208": { + "balance": "0xe4af6471734640000" }, - "5a0d609aae2332b137ab3b2f26615a808f37e433": { - "balance": "160000000000000000000000" + "0x5a0d609aae2332b137ab3b2f26615a808f37e433": { + "balance": "0x21e19e0c9bab24000000" }, - "2334c590c7a48769103045c5b6534c8a3469f44a": { - "balance": "17443200000000000000000" + "0x2334c590c7a48769103045c5b6534c8a3469f44a": { + "balance": "0x3b199073df72dc00000" }, - "ddfcca13f934f0cfbe231da13039d70475e6a1d0": { - "balance": "1000169000000000000000" + "0xddfcca13f934f0cfbe231da13039d70475e6a1d0": { + "balance": "0x3638221660a5aa8000" }, - "ee7288d91086d9e2eb910014d9ab90a02d78c2a0": { - "balance": "2000000000000000000000" + "0xee7288d91086d9e2eb910014d9ab90a02d78c2a0": { + "balance": "0x6c6b935b8bbd400000" }, - "fb91fb1a695553f0c68e21276decf0b83909b86d": { - "balance": "100016000000000000000" + "0xfb91fb1a695553f0c68e21276decf0b83909b86d": { + "balance": "0x56c003617af780000" }, - "38695fc7e1367ceb163ebb053751f9f68ddb07a0": { - "balance": "2000000000000000000000" + "0x38695fc7e1367ceb163ebb053751f9f68ddb07a0": { + "balance": "0x6c6b935b8bbd400000" }, - "65093b239bbfba23c7775ca7da5a8648a9f54cf7": { - "balance": "400000000000000000000" + "0x65093b239bbfba23c7775ca7da5a8648a9f54cf7": { + "balance": "0x15af1d78b58c400000" }, - "73d8fee3cb864dce22bb26ca9c2f086d5e95e63b": { - "balance": "1000000000000000000000" + "0x73d8fee3cb864dce22bb26ca9c2f086d5e95e63b": { + "balance": "0x3635c9adc5dea00000" }, - "f7155213449892744bc60f2e04400788bd041fdd": { - "balance": "66850000000000000000" + "0xf7155213449892744bc60f2e04400788bd041fdd": { + "balance": "0x39fbae8d042dd0000" }, - "d1a71b2d0858e83270085d95a3b1549650035e23": { - "balance": "14900000000000000000000" + "0xd1a71b2d0858e83270085d95a3b1549650035e23": { + "balance": "0x327bb09d06aa8500000" }, - "eac17b81ed5191fb0802aa54337313834107aaa4": { - "balance": "8000000000000000000000" + "0xeac17b81ed5191fb0802aa54337313834107aaa4": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "bb076aac92208069ea318a31ff8eeb14b7e996e3": { - "balance": "149000000000000000000" + "0xbb076aac92208069ea318a31ff8eeb14b7e996e3": { + "balance": "0x813ca56906d340000" }, - "9f46e7c1e9078cae86305ac7060b01467d6685ee": { - "balance": "668500000000000000000" + "0x9f46e7c1e9078cae86305ac7060b01467d6685ee": { + "balance": "0x243d4d18229ca20000" }, - "1598127982f2f8ad3b6b8fc3cf27bf617801ba2b": { - "balance": "173000000000000000000" + "0x1598127982f2f8ad3b6b8fc3cf27bf617801ba2b": { + "balance": "0x960db77681e940000" }, - "e91dac0195b19e37b59b53f7c017c0b2395ba44c": { - "balance": "1880000000000000000000" + "0xe91dac0195b19e37b59b53f7c017c0b2395ba44c": { + "balance": "0x65ea3db75546600000" }, - "a436c75453ccca4a1f1b62e5c4a30d86dde4be68": { - "balance": "2000000000000000000000" + "0xa436c75453ccca4a1f1b62e5c4a30d86dde4be68": { + "balance": "0x6c6b935b8bbd400000" }, - "11001b89ed873e3aaec1155634b4681643986323": { - "balance": "1000000000000000000000" + "0x11001b89ed873e3aaec1155634b4681643986323": { + "balance": "0x3635c9adc5dea00000" }, - "ab93b26ece0a0aa21365afed1fa9aea31cd54468": { - "balance": "1608000000000000000000" + "0xab93b26ece0a0aa21365afed1fa9aea31cd54468": { + "balance": "0x572b7b98736c200000" }, - "e77febabdf080f0f5dca1d3f5766f2a79c0ffa7c": { - "balance": "1386000000000000000000" + "0xe77febabdf080f0f5dca1d3f5766f2a79c0ffa7c": { + "balance": "0x4b229d28a843680000" }, - "1c4af0e863d2656c8635bc6ffec8dd9928908cb5": { - "balance": "2000000000000000000000" + "0x1c4af0e863d2656c8635bc6ffec8dd9928908cb5": { + "balance": "0x6c6b935b8bbd400000" }, - "0c48ae62d1539788eba013d75ea60b64eeba4e80": { - "balance": "2213311000000000000000" + "0x0c48ae62d1539788eba013d75ea60b64eeba4e80": { + "balance": "0x77fbdc43e030998000" }, - "423cc4594cf4abb6368de59fd2b1230734612143": { - "balance": "2000000000000000000000" + "0x423cc4594cf4abb6368de59fd2b1230734612143": { + "balance": "0x6c6b935b8bbd400000" }, - "7f6b28c88421e4857e459281d78461692489d3fb": { - "balance": "2000000000000000000000" + "0x7f6b28c88421e4857e459281d78461692489d3fb": { + "balance": "0x6c6b935b8bbd400000" }, - "806854588ecce541495f81c28a290373df0274b2": { - "balance": "582000000000000000000" + "0x806854588ecce541495f81c28a290373df0274b2": { + "balance": "0x1f8cdf5c6e8d580000" }, - "dc76e85ba50b9b31ec1e2620bce6e7c8058c0eaf": { - "balance": "20000000000000000000" + "0xdc76e85ba50b9b31ec1e2620bce6e7c8058c0eaf": { + "balance": "0x1158e460913d00000" }, - "b00996b0566ecb3e7243b8227988dcb352c21899": { - "balance": "12000000000000000000000" + "0xb00996b0566ecb3e7243b8227988dcb352c21899": { + "balance": "0x28a857425466f800000" }, - "f5d14552b1dce0d6dc1f320da6ffc8a331cd6f0c": { - "balance": "1337000000000000000000" + "0xf5d14552b1dce0d6dc1f320da6ffc8a331cd6f0c": { + "balance": "0x487a9a304539440000" }, - "55a61b109480b5b2c4fcfdef92d90584160c0d35": { - "balance": "44700000000000000000" + "0x55a61b109480b5b2c4fcfdef92d90584160c0d35": { + "balance": "0x26c564d2b53f60000" }, - "b8947822d5ace7a6ad8326e95496221e0be6b73d": { - "balance": "20000000000000000000" + "0xb8947822d5ace7a6ad8326e95496221e0be6b73d": { + "balance": "0x1158e460913d00000" }, - "492de46aaf8f1d708d59d79af1d03ad2cb60902f": { - "balance": "2000000000000000000000" + "0x492de46aaf8f1d708d59d79af1d03ad2cb60902f": { + "balance": "0x6c6b935b8bbd400000" }, - "0e0d6633db1e0c7f234a6df163a10e0ab39c200f": { - "balance": "200000000000000000000" + "0x0e0d6633db1e0c7f234a6df163a10e0ab39c200f": { + "balance": "0xad78ebc5ac6200000" }, - "f8bf9c04874e5a77f38f4c38527e80c676f7b887": { - "balance": "2000000000000000000000" + "0xf8bf9c04874e5a77f38f4c38527e80c676f7b887": { + "balance": "0x6c6b935b8bbd400000" }, - "15528350e0d9670a2ea27f7b4a33b9c0f9621d21": { - "balance": "4000086000000000000000" + "0x15528350e0d9670a2ea27f7b4a33b9c0f9621d21": { + "balance": "0xd8d8583fa2d52f0000" }, - "eccf7a0457b566b346ca673a180f444130216ac3": { - "balance": "100000000000000000000" + "0xeccf7a0457b566b346ca673a180f444130216ac3": { + "balance": "0x56bc75e2d63100000" }, - "10cf560964ff83c1c9674c783c0f73fcd89943fc": { - "balance": "40000000000000000000000" + "0x10cf560964ff83c1c9674c783c0f73fcd89943fc": { + "balance": "0x878678326eac9000000" }, - "e7f06f699be31c440b43b4db0501ec0e25261644": { - "balance": "500000000000000000000" + "0xe7f06f699be31c440b43b4db0501ec0e25261644": { + "balance": "0x1b1ae4d6e2ef500000" }, - "b6ce4dc560fc73dc69fb7a62e388db7e72ea764f": { - "balance": "966000000000000000000" + "0xb6ce4dc560fc73dc69fb7a62e388db7e72ea764f": { + "balance": "0x345df169e9a3580000" }, - "f456055a11ab91ff668e2ec922961f2a23e3db25": { - "balance": "18200000000000000000" + "0xf456055a11ab91ff668e2ec922961f2a23e3db25": { + "balance": "0xfc936392801c0000" }, - "8dfbafbc0e5b5c86cd1ad697feea04f43188de96": { - "balance": "390060000000000000000" + "0x8dfbafbc0e5b5c86cd1ad697feea04f43188de96": { + "balance": "0x15252b7f5fa0de0000" }, - "085b4ab75d8362d914435cedee1daa2b1ee1a23b": { - "balance": "3880000000000000000000" + "0x085b4ab75d8362d914435cedee1daa2b1ee1a23b": { + "balance": "0xd255d112e103a00000" }, - "e400d651bb3f2d23d5f849e6f92d9c5795c43a8a": { - "balance": "2674000000000000000000" + "0xe400d651bb3f2d23d5f849e6f92d9c5795c43a8a": { + "balance": "0x90f534608a72880000" }, - "851aa91c82f42fad5dd8e8bb5ea69c8f3a5977d1": { - "balance": "148607000000000000000" + "0x851aa91c82f42fad5dd8e8bb5ea69c8f3a5977d1": { + "balance": "0x80e561f2578798000" }, - "4c935bb250778b3c4c7f7e07fc251fa630314aab": { - "balance": "1500000000000000000000" + "0x4c935bb250778b3c4c7f7e07fc251fa630314aab": { + "balance": "0x5150ae84a8cdf00000" }, - "ebd356156a383123343d48843bffed6103e866b3": { - "balance": "1970000000000000000000" + "0xebd356156a383123343d48843bffed6103e866b3": { + "balance": "0x6acb3df27e1f880000" }, - "da0b48e489d302b4b7bf204f957c1c9be383b0df": { - "balance": "2000000000000000000000" + "0xda0b48e489d302b4b7bf204f957c1c9be383b0df": { + "balance": "0x6c6b935b8bbd400000" }, - "7085ae7e7e4d932197b5c7858c00a3674626b7a5": { - "balance": "6000000000000000000000" + "0x7085ae7e7e4d932197b5c7858c00a3674626b7a5": { + "balance": "0x14542ba12a337c00000" }, - "5b06d1e6930c1054692b79e3dbe6ecce53966420": { - "balance": "205400000000000000000" + "0x5b06d1e6930c1054692b79e3dbe6ecce53966420": { + "balance": "0xb227f63be813c0000" }, - "8df53d96191471e059de51c718b983e4a51d2afd": { - "balance": "32000000000000000000000" + "0x8df53d96191471e059de51c718b983e4a51d2afd": { + "balance": "0x6c6b935b8bbd4000000" }, - "0678654ac6761db904a2f7e8595ec1eaac734308": { - "balance": "878000000000000000000" + "0x0678654ac6761db904a2f7e8595ec1eaac734308": { + "balance": "0x2f98b29c2818f80000" }, - "89fee30d1728d96cecc1dab3da2e771afbcfaa41": { - "balance": "1999944000000000000000" + "0x89fee30d1728d96cecc1dab3da2e771afbcfaa41": { + "balance": "0x6c6acc67d7b1d40000" }, - "59c5d06b170ee4d26eb0a0eb46cb7d90c1c91019": { - "balance": "10000000000000000000000" + "0x59c5d06b170ee4d26eb0a0eb46cb7d90c1c91019": { + "balance": "0x21e19e0c9bab2400000" }, - "2b129c26b75dde127f8320bd0f63410c92a9f876": { - "balance": "2200000000000000000000" + "0x2b129c26b75dde127f8320bd0f63410c92a9f876": { + "balance": "0x77432217e683600000" }, - "3d6ae053fcbc318d6fd0fbc353b8bf542e680d27": { - "balance": "14300000000000000000" + "0x3d6ae053fcbc318d6fd0fbc353b8bf542e680d27": { + "balance": "0xc673ce3c40160000" }, - "755a60bf522fbd8fff9723446b7e343a7068567e": { - "balance": "20000000000000000000000" + "0x755a60bf522fbd8fff9723446b7e343a7068567e": { + "balance": "0x43c33c1937564800000" }, - "947e11e5ea290d6fc3b38048979e0cd44ec7c17f": { - "balance": "2000000000000000000000" + "0x947e11e5ea290d6fc3b38048979e0cd44ec7c17f": { + "balance": "0x6c6b935b8bbd400000" }, - "711ecf77d71b3d0ea95ce4758afecdb9c131079d": { - "balance": "760000000000000000000" + "0x711ecf77d71b3d0ea95ce4758afecdb9c131079d": { + "balance": "0x29331e6558f0e00000" }, - "de9eff4c798811d968dccb460d9b069cf30278e0": { - "balance": "400000000000000000000" + "0xde9eff4c798811d968dccb460d9b069cf30278e0": { + "balance": "0x15af1d78b58c400000" }, - "4e892e8081bf36e488fddb3b2630f3f1e8da30d2": { - "balance": "12003800000000000000000" + "0x4e892e8081bf36e488fddb3b2630f3f1e8da30d2": { + "balance": "0x28aba30752451fc0000" }, - "8ede7e3dc50749c6c50e2e28168478c34db81946": { - "balance": "19999800000000000000000" + "0x8ede7e3dc50749c6c50e2e28168478c34db81946": { + "balance": "0x43c30fb0884a96c0000" }, - "0c30cacc3f72269f8b4f04cf073d2b05a83d9ad1": { - "balance": "2001000000000000000000" + "0x0c30cacc3f72269f8b4f04cf073d2b05a83d9ad1": { + "balance": "0x6c7974123f64a40000" }, - "e51eb87e7fb7311f5228c479b48ec9878831ac4c": { - "balance": "2000000000000000000000" + "0xe51eb87e7fb7311f5228c479b48ec9878831ac4c": { + "balance": "0x6c6b935b8bbd400000" }, - "8b01da34d470c1d115acf4d8113c4dd8a8c338e4": { - "balance": "25220000000000000000000" + "0x8b01da34d470c1d115acf4d8113c4dd8a8c338e4": { + "balance": "0x5572dcefab697900000" }, - "4329fc0931cbeb033880fe4c9398ca45b0e2d11a": { - "balance": "2000400000000000000000" + "0x4329fc0931cbeb033880fe4c9398ca45b0e2d11a": { + "balance": "0x6c7120716d33680000" }, - "540c072802014ef0d561345aec481e8e11cb3570": { - "balance": "8000000000000000000000" + "0x540c072802014ef0d561345aec481e8e11cb3570": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "21e5d2bae995ccfd08a5c16bb524e1f630448f82": { - "balance": "2800000000000000000000" + "0x21e5d2bae995ccfd08a5c16bb524e1f630448f82": { + "balance": "0x97c9ce4cf6d5c00000" }, - "5cf8c03eb3e872e50f7cfd0c2f8d3b3f2cb5183a": { - "balance": "200000000000000000000" + "0x5cf8c03eb3e872e50f7cfd0c2f8d3b3f2cb5183a": { + "balance": "0xad78ebc5ac6200000" }, - "5c0f2e51378f6b0d7bab617331580b6e39ad3ca5": { - "balance": "9600000000000000000000" + "0x5c0f2e51378f6b0d7bab617331580b6e39ad3ca5": { + "balance": "0x2086ac3510526000000" }, - "d2f241255dd7c3f73c07043071ec08ddd9c5cde5": { - "balance": "500000000000000000000" + "0xd2f241255dd7c3f73c07043071ec08ddd9c5cde5": { + "balance": "0x1b1ae4d6e2ef500000" }, - "cbe1b948864d8474e765145858fca4550f784b92": { - "balance": "10000000000000000000000" + "0xcbe1b948864d8474e765145858fca4550f784b92": { + "balance": "0x21e19e0c9bab2400000" }, - "30742ccdf4abbcd005681f8159345c9e79054b1a": { - "balance": "668500000000000000000" + "0x30742ccdf4abbcd005681f8159345c9e79054b1a": { + "balance": "0x243d4d18229ca20000" }, - "6aeb9f74742ea491813dbbf0d6fcde1a131d4db3": { - "balance": "440800000000000000000" + "0x6aeb9f74742ea491813dbbf0d6fcde1a131d4db3": { + "balance": "0x17e554308aa0300000" }, - "821eb90994a2fbf94bdc3233910296f76f9bf6e7": { - "balance": "10000000000000000000000" + "0x821eb90994a2fbf94bdc3233910296f76f9bf6e7": { + "balance": "0x21e19e0c9bab2400000" }, - "25c1a37ee5f08265a1e10d3d90d5472955f97806": { - "balance": "1820000000000000000000" + "0x25c1a37ee5f08265a1e10d3d90d5472955f97806": { + "balance": "0x62a992e53a0af00000" }, - "7ef98b52bee953bef992f305fda027f8911c5851": { - "balance": "514717000000000000000" + "0x7ef98b52bee953bef992f305fda027f8911c5851": { + "balance": "0x1be722206996bc8000" }, - "8adc53ef8c18ed3051785d88e996f3e4b20ecd51": { - "balance": "42000000000000000000000" + "0x8adc53ef8c18ed3051785d88e996f3e4b20ecd51": { + "balance": "0x8e4d316827686400000" }, - "007f4a23ca00cd043d25c2888c1aa5688f81a344": { - "balance": "773658000000000000000" + "0x007f4a23ca00cd043d25c2888c1aa5688f81a344": { + "balance": "0x29f0a95bfbf7290000" }, - "4a735d224792376d331367c093d31c8794341582": { - "balance": "1900000000000000000000" + "0x4a735d224792376d331367c093d31c8794341582": { + "balance": "0x66ffcbfd5e5a300000" }, - "05440c5b073b529b4829209dff88090e07c4f6f5": { - "balance": "1288000000000000000000" + "0x05440c5b073b529b4829209dff88090e07c4f6f5": { + "balance": "0x45d29737e22f200000" }, - "5e772e27f28800c50dda973bb33e10762e6eea20": { - "balance": "1790000000000000000000" + "0x5e772e27f28800c50dda973bb33e10762e6eea20": { + "balance": "0x61093d7c2c6d380000" }, - "a429fa88731fdd350e8ecd6ea54296b6484fe695": { - "balance": "1969606000000000000000" + "0xa429fa88731fdd350e8ecd6ea54296b6484fe695": { + "balance": "0x6ac5c62d9486070000" }, - "e0d76b7166b1f3a12b4091ee2b29de8caa7d07db": { - "balance": "2000000000000000000000" + "0xe0d76b7166b1f3a12b4091ee2b29de8caa7d07db": { + "balance": "0x6c6b935b8bbd400000" }, - "7ebd95e9c470f7283583dc6e9d2c4dce0bea8f84": { - "balance": "14000000000000000000000" + "0x7ebd95e9c470f7283583dc6e9d2c4dce0bea8f84": { + "balance": "0x2f6f10780d22cc00000" }, - "883a78aeabaa50d8ddd8570bcd34265f14b19363": { - "balance": "3879951000000000000000" + "0x883a78aeabaa50d8ddd8570bcd34265f14b19363": { + "balance": "0xd25522fda379a18000" }, - "51f9c432a4e59ac86282d6adab4c2eb8919160eb": { - "balance": "530000000000000000000000" + "0x51f9c432a4e59ac86282d6adab4c2eb8919160eb": { + "balance": "0x703b5b89c3a6e7400000" }, - "b86607021b62d340cf2652f3f95fd2dc67698bdf": { - "balance": "5000000000000000000000" + "0xb86607021b62d340cf2652f3f95fd2dc67698bdf": { + "balance": "0x10f0cf064dd59200000" }, - "acc0909fda2ea6b7b7a88db7a0aac868091ddbf6": { - "balance": "22155000000000000000" + "0xacc0909fda2ea6b7b7a88db7a0aac868091ddbf6": { + "balance": "0x133765f1e26c78000" }, - "69b80ed90f84834afa3ff82eb964703b560977d6": { - "balance": "26740000000000000000" + "0x69b80ed90f84834afa3ff82eb964703b560977d6": { + "balance": "0x1731790534df20000" }, - "ca4ca9e4779d530ecbacd47e6a8058cfde65d98f": { - "balance": "800000000000000000000" + "0xca4ca9e4779d530ecbacd47e6a8058cfde65d98f": { + "balance": "0x2b5e3af16b18800000" }, - "5d6c5c720d66a6abca8397142e63d26818eaab54": { - "balance": "40000000000000000000" + "0x5d6c5c720d66a6abca8397142e63d26818eaab54": { + "balance": "0x22b1c8c1227a00000" }, - "c2c13e72d268e7150dc799e7c6cf03c88954ced7": { - "balance": "700000000000000000000" + "0xc2c13e72d268e7150dc799e7c6cf03c88954ced7": { + "balance": "0x25f273933db5700000" }, - "6bbd1e719390e6b91043f8b6b9df898ea8001b34": { - "balance": "2000053000000000000000" + "0x6bbd1e719390e6b91043f8b6b9df898ea8001b34": { + "balance": "0x6c6c4fa6c3da588000" }, - "a9ba6f413b82fcddf3affbbdd09287dcf50415ca": { - "balance": "4000000000000000000000" + "0xa9ba6f413b82fcddf3affbbdd09287dcf50415ca": { + "balance": "0xd8d726b7177a800000" }, - "ced3c7be8de7585140952aeb501dc1f876ecafb0": { - "balance": "4000000000000000000000" + "0xced3c7be8de7585140952aeb501dc1f876ecafb0": { + "balance": "0xd8d726b7177a800000" }, - "1c63fa9e2cbbf23c49fcdef1cbabfe6e0d1e14c1": { - "balance": "1000000000000000000000" + "0x1c63fa9e2cbbf23c49fcdef1cbabfe6e0d1e14c1": { + "balance": "0x3635c9adc5dea00000" }, - "7d6e990daa7105de2526339833f77b5c0b85d84f": { - "balance": "20000000000000000000000" + "0x7d6e990daa7105de2526339833f77b5c0b85d84f": { + "balance": "0x43c33c1937564800000" }, - "68addf019d6b9cab70acb13f0b3117999f062e12": { - "balance": "49941000000000000000" + "0x68addf019d6b9cab70acb13f0b3117999f062e12": { + "balance": "0x2b51212e6b7c88000" }, - "a77428bcb2a0db76fc8ef1e20e461a0a32c5ac15": { - "balance": "401100000000000000000" + "0xa77428bcb2a0db76fc8ef1e20e461a0a32c5ac15": { + "balance": "0x15be6174e1912e0000" }, - "26048fe84d9b010a62e731627e49bc2eb73f408f": { - "balance": "4000000000000000000000" + "0x26048fe84d9b010a62e731627e49bc2eb73f408f": { + "balance": "0xd8d726b7177a800000" }, - "ff26138330274df4e0a3081e6df7dd983ec6e78f": { - "balance": "2000000000000000000000" + "0xff26138330274df4e0a3081e6df7dd983ec6e78f": { + "balance": "0x6c6b935b8bbd400000" }, - "b7382d37db0398ac72410cf9813de9f8e1ec8dad": { - "balance": "1000070000000000000000" + "0xb7382d37db0398ac72410cf9813de9f8e1ec8dad": { + "balance": "0x3636c25e66ece70000" }, - "44f62f2aaabc29ad3a6b04e1ff6f9ce452d1c140": { - "balance": "17000000000000000000000" + "0x44f62f2aaabc29ad3a6b04e1ff6f9ce452d1c140": { + "balance": "0x39992648a23c8a00000" }, - "47fef58584465248a0810d60463ee93e5a6ee8d3": { - "balance": "283100000000000000000" + "0x47fef58584465248a0810d60463ee93e5a6ee8d3": { + "balance": "0xf58cd3e1269160000" }, - "bd2b70fecc37640f69514fc7f3404946aad86b11": { - "balance": "1200000000000000000000" + "0xbd2b70fecc37640f69514fc7f3404946aad86b11": { + "balance": "0x410d586a20a4c00000" }, - "649a85b93653075fa6562c409a565d087ba3e1ba": { - "balance": "2000000000000000000000" + "0x649a85b93653075fa6562c409a565d087ba3e1ba": { + "balance": "0x6c6b935b8bbd400000" }, - "55866486ec168f79dbe0e1abb18864d98991ae2c": { - "balance": "16100000000000000000" + "0x55866486ec168f79dbe0e1abb18864d98991ae2c": { + "balance": "0xdf6eb0b2d3ca0000" }, - "d7e74afdbad55e96cebc5a374f2c8b768680f2b0": { - "balance": "99000000000000000000" + "0xd7e74afdbad55e96cebc5a374f2c8b768680f2b0": { + "balance": "0x55de6a779bbac0000" }, - "a8c1d6aa41fe3d65f67bd01de2a866ed1ed9ae52": { - "balance": "30000000000000000000" + "0xa8c1d6aa41fe3d65f67bd01de2a866ed1ed9ae52": { + "balance": "0x1a055690d9db80000" }, - "744c0c77ba7f236920d1e434de5da33e48ebf02c": { - "balance": "1970000000000000000000" + "0x744c0c77ba7f236920d1e434de5da33e48ebf02c": { + "balance": "0x6acb3df27e1f880000" }, - "9445ba5c30e98961b8602461d0385d40fbd80311": { - "balance": "10000000000000000000000" + "0x9445ba5c30e98961b8602461d0385d40fbd80311": { + "balance": "0x21e19e0c9bab2400000" }, - "eb835c1a911817878a33d167569ea3cdd387f328": { - "balance": "1000000000000000000000" + "0xeb835c1a911817878a33d167569ea3cdd387f328": { + "balance": "0x3635c9adc5dea00000" }, - "761a6e362c97fbbd7c5977acba2da74687365f49": { - "balance": "183840000000000000000" + "0x761a6e362c97fbbd7c5977acba2da74687365f49": { + "balance": "0x9f74ae1f953d00000" }, - "38202c5cd7078d4f887673ab07109ad8ada89720": { - "balance": "1000000000000000000000" + "0x38202c5cd7078d4f887673ab07109ad8ada89720": { + "balance": "0x3635c9adc5dea00000" }, - "5abfec25f74cd88437631a7731906932776356f9": { - "balance": "11901484239480000000000000" + "0x5abfec25f74cd88437631a7731906932776356f9": { + "balance": "0x9d83cc0dfa11177ff8000" }, - "28e4af30cd93f686a122ad7bb19f8a8785eee342": { - "balance": "2101000000000000000000" + "0x28e4af30cd93f686a122ad7bb19f8a8785eee342": { + "balance": "0x71e53b706cc7b40000" }, - "3a9b111029ce1f20c9109c7a74eeeef34f4f2eb2": { - "balance": "4000000000000000000000" + "0x3a9b111029ce1f20c9109c7a74eeeef34f4f2eb2": { + "balance": "0xd8d726b7177a800000" }, - "7bb9571f394b0b1a8eba5664e9d8b5e840677bea": { - "balance": "19700000000000000000" + "0x7bb9571f394b0b1a8eba5664e9d8b5e840677bea": { + "balance": "0x11164759ffb320000" }, - "50fb36c27107ee2ca9a3236e2746cca19ace6b49": { - "balance": "2000000000000000000000" + "0x50fb36c27107ee2ca9a3236e2746cca19ace6b49": { + "balance": "0x6c6b935b8bbd400000" }, - "a3bc979b7080092fa1f92f6e0fb347e28d995045": { - "balance": "2800000000000000000000" + "0xa3bc979b7080092fa1f92f6e0fb347e28d995045": { + "balance": "0x97c9ce4cf6d5c00000" }, - "d04b861b3d9acc563a901689941ab1e1861161a2": { - "balance": "20000000000000000000" + "0xd04b861b3d9acc563a901689941ab1e1861161a2": { + "balance": "0x1158e460913d00000" }, - "58c555bc293cdb16c6362ed97ae9550b92ea180e": { - "balance": "20000000000000000000" + "0x58c555bc293cdb16c6362ed97ae9550b92ea180e": { + "balance": "0x1158e460913d00000" }, - "8bf02bd748690e1fd1c76d270833048b66b25fd3": { - "balance": "11800000000000000000000" + "0x8bf02bd748690e1fd1c76d270833048b66b25fd3": { + "balance": "0x27fade568eba9600000" }, - "fbc01db54e47cdc3c438694ab717a856c23fe6e9": { - "balance": "8456774000000000000000" + "0xfbc01db54e47cdc3c438694ab717a856c23fe6e9": { + "balance": "0x1ca7150ab174f470000" }, - "9c9a07a8e57c3172a919ef64789474490f0d9f51": { - "balance": "10000000000000000000000" + "0x9c9a07a8e57c3172a919ef64789474490f0d9f51": { + "balance": "0x21e19e0c9bab2400000" }, - "fc7e22a503ec5abe9b08c50bd14999f520fa4884": { - "balance": "6387725000000000000000" + "0xfc7e22a503ec5abe9b08c50bd14999f520fa4884": { + "balance": "0x15a477dfbe1ea148000" }, - "9b773669e87d76018c090f8255e54409b9dca8b2": { - "balance": "20000000000000000000" + "0x9b773669e87d76018c090f8255e54409b9dca8b2": { + "balance": "0x1158e460913d00000" }, - "ffe8cbc1681e5e9db74a0f93f8ed25897519120f": { - "balance": "1507000000000000000000" + "0xffe8cbc1681e5e9db74a0f93f8ed25897519120f": { + "balance": "0x51b1d3839261ac0000" }, - "4d4cf5807429615e30cdface1e5aae4dad3055e6": { - "balance": "600000000000000000000" + "0x4d4cf5807429615e30cdface1e5aae4dad3055e6": { + "balance": "0x2086ac351052600000" }, - "cfde0fc75d6f16c443c3038217372d99f5d907f7": { - "balance": "2419000000000000000000" + "0xcfde0fc75d6f16c443c3038217372d99f5d907f7": { + "balance": "0x83225e6396b5ec0000" }, - "818ffe271fc3973565c303f213f6d2da89897ebd": { - "balance": "5734655000000000000000" + "0x818ffe271fc3973565c303f213f6d2da89897ebd": { + "balance": "0x136e05342fee1b98000" }, - "ba1fcaf223937ef89e85675503bdb7ca6a928b78": { - "balance": "640000000000000000000" + "0xba1fcaf223937ef89e85675503bdb7ca6a928b78": { + "balance": "0x22b1c8c1227a000000" }, - "a30a45520e5206d9004070e6af3e7bb2e8dd5313": { - "balance": "400000000000000000000" + "0xa30a45520e5206d9004070e6af3e7bb2e8dd5313": { + "balance": "0x15af1d78b58c400000" }, - "a747439ad0d393b5a03861d77296326de8bb9db9": { - "balance": "1000000000000000000000" + "0xa747439ad0d393b5a03861d77296326de8bb9db9": { + "balance": "0x3635c9adc5dea00000" }, - "14d00aad39a0a7d19ca05350f7b03727f08dd82e": { - "balance": "500000000000000000000" + "0x14d00aad39a0a7d19ca05350f7b03727f08dd82e": { + "balance": "0x1b1ae4d6e2ef500000" }, - "551999ddd205563327b9b530785acff9bc73a4ba": { - "balance": "6000000000000000000000" + "0x551999ddd205563327b9b530785acff9bc73a4ba": { + "balance": "0x14542ba12a337c00000" }, - "a4670731175893bbcff4fa85ce97d94fc51c4ba8": { - "balance": "8000000000000000000000" + "0xa4670731175893bbcff4fa85ce97d94fc51c4ba8": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "f858171a04d357a13b4941c16e7e55ddd4941329": { - "balance": "41984000000000000000" + "0xf858171a04d357a13b4941c16e7e55ddd4941329": { + "balance": "0x246a5218f2a000000" }, - "a6484cc684c4c91db53eb68a4da45a6a6bda3067": { - "balance": "6000000000000000000000" + "0xa6484cc684c4c91db53eb68a4da45a6a6bda3067": { + "balance": "0x14542ba12a337c00000" }, - "00d75ed60c774f8b3a5a5173fb1833ad7105a2d9": { - "balance": "2005500000000000000000" + "0x00d75ed60c774f8b3a5a5173fb1833ad7105a2d9": { + "balance": "0x6cb7e74867d5e60000" }, - "bf92418a0c6c31244d220260cb3e867dd7b4ef49": { - "balance": "99800000000000000000" + "0xbf92418a0c6c31244d220260cb3e867dd7b4ef49": { + "balance": "0x56900d33ca7fc0000" }, - "716d50cca01e938500e6421cc070c3507c67d387": { - "balance": "2000000000000000000000" + "0x716d50cca01e938500e6421cc070c3507c67d387": { + "balance": "0x6c6b935b8bbd400000" }, - "82a8b96b6c9e13ebec1e9f18ac02a60ea88a48ff": { - "balance": "1999998000000000000000" + "0x82a8b96b6c9e13ebec1e9f18ac02a60ea88a48ff": { + "balance": "0x6c6b8c408e73b30000" }, - "5a565285374a49eedd504c957d510874d00455bc": { - "balance": "100000000000000000000" + "0x5a565285374a49eedd504c957d510874d00455bc": { + "balance": "0x56bc75e2d63100000" }, - "778c79f4de1953ebce98fe8006d53a81fb514012": { - "balance": "999800000000000000000" + "0x778c79f4de1953ebce98fe8006d53a81fb514012": { + "balance": "0x36330322d5238c0000" }, - "41b2d34fde0b1029262b4172c81c1590405b03ae": { - "balance": "1000000000000000000000" + "0x41b2d34fde0b1029262b4172c81c1590405b03ae": { + "balance": "0x3635c9adc5dea00000" }, - "4039bd50a2bde15ffe37191f410390962a2b8886": { - "balance": "200000000000000000000" + "0x4039bd50a2bde15ffe37191f410390962a2b8886": { + "balance": "0xad78ebc5ac6200000" }, - "c033be10cb48613bd5ebcb33ed4902f38b583003": { - "balance": "3000000000000000000000" + "0xc033be10cb48613bd5ebcb33ed4902f38b583003": { + "balance": "0xa2a15d09519be00000" }, - "5d5751819b4f3d26ed0c1ac571552735271dbefa": { - "balance": "1000000000000000000000" + "0x5d5751819b4f3d26ed0c1ac571552735271dbefa": { + "balance": "0x3635c9adc5dea00000" }, - "b600429752f399c80d0734744bae0a022eca67c6": { - "balance": "20000000000000000000" + "0xb600429752f399c80d0734744bae0a022eca67c6": { + "balance": "0x1158e460913d00000" }, - "f875619d8a23e45d8998d184d480c0748970822a": { - "balance": "4000000000000000000000" + "0xf875619d8a23e45d8998d184d480c0748970822a": { + "balance": "0xd8d726b7177a800000" }, - "71c7230a1d35bdd6819ed4b9a88e94a0eb0786dd": { - "balance": "4365000000000000000000" + "0x71c7230a1d35bdd6819ed4b9a88e94a0eb0786dd": { + "balance": "0xeca08b353d24140000" }, - "b2f9c972c1e9737755b3ff1b3088738396395b26": { - "balance": "20000000000000000000000" + "0xb2f9c972c1e9737755b3ff1b3088738396395b26": { + "balance": "0x43c33c1937564800000" }, - "a66a4963b27f1ee1932b172be5964e0d3ae54b51": { - "balance": "173000000000000000000" + "0xa66a4963b27f1ee1932b172be5964e0d3ae54b51": { + "balance": "0x960db77681e940000" }, - "53ce88e66c5af2f29bbd8f592a56a3d15f206c32": { - "balance": "140840000000000000000" + "0x53ce88e66c5af2f29bbd8f592a56a3d15f206c32": { + "balance": "0x7a28c31cc36040000" }, - "433e3ba1c51b810fc467d5ba4dea42f7a9885e69": { - "balance": "40000000000000000000000" + "0x433e3ba1c51b810fc467d5ba4dea42f7a9885e69": { + "balance": "0x878678326eac9000000" }, - "c7837ad0a0bf14186937ace06c5546a36aa54f46": { - "balance": "4000000000000000000000" + "0xc7837ad0a0bf14186937ace06c5546a36aa54f46": { + "balance": "0xd8d726b7177a800000" }, - "c3f8f67295a5cd049364d05d23502623a3e52e84": { - "balance": "6000000000000000000000" + "0xc3f8f67295a5cd049364d05d23502623a3e52e84": { + "balance": "0x14542ba12a337c00000" }, - "3fd0bb47798cf44cdfbe4d333de637df4a00e45c": { - "balance": "100040000000000000000" + "0x3fd0bb47798cf44cdfbe4d333de637df4a00e45c": { + "balance": "0x56c5579f722140000" }, - "a1ae8d4540d4db6fdde7146f415b431eb55c7983": { - "balance": "197000000000000000000" + "0xa1ae8d4540d4db6fdde7146f415b431eb55c7983": { + "balance": "0xaadec983fcff40000" }, - "5cccf1508bfd35c20530aa642500c10dee65eaed": { - "balance": "850000000000000000000" + "0x5cccf1508bfd35c20530aa642500c10dee65eaed": { + "balance": "0x2e141ea081ca080000" }, - "a53ead54f7850af21438cbe07af686279a315b86": { - "balance": "10000000000000000000000" + "0xa53ead54f7850af21438cbe07af686279a315b86": { + "balance": "0x21e19e0c9bab2400000" }, - "8cf6da0204dbc4860b46ad973fc111008d9e0c46": { - "balance": "200000000000000000000" + "0x8cf6da0204dbc4860b46ad973fc111008d9e0c46": { + "balance": "0xad78ebc5ac6200000" }, - "8e7936d592008fdc7aa04edeeb755ab513dbb89d": { - "balance": "20000000000000000000" + "0x8e7936d592008fdc7aa04edeeb755ab513dbb89d": { + "balance": "0x1158e460913d00000" }, - "4a53dcdb56ce4cdce9f82ec0eb13d67352e7c88b": { - "balance": "4200000000000000000000" + "0x4a53dcdb56ce4cdce9f82ec0eb13d67352e7c88b": { + "balance": "0xe3aeb5737240a00000" }, - "2b4f4507bb6b9817942ce433781b708fbcd166fd": { - "balance": "18200000000000000000" + "0x2b4f4507bb6b9817942ce433781b708fbcd166fd": { + "balance": "0xfc936392801c0000" }, - "026432af37dc5113f1f46d480a4de0b28052237e": { - "balance": "355800000000000000000" + "0x026432af37dc5113f1f46d480a4de0b28052237e": { + "balance": "0x1349b786e40bfc0000" }, - "e780a56306ba1e6bb331952c22539b858af9f77d": { - "balance": "50000000000000000000000" + "0xe780a56306ba1e6bb331952c22539b858af9f77d": { + "balance": "0xa968163f0a57b400000" }, - "d1f1694d22671b5aad6a94995c369fbe6133676f": { - "balance": "1000000000000000000000" + "0xd1f1694d22671b5aad6a94995c369fbe6133676f": { + "balance": "0x3635c9adc5dea00000" }, - "7c45f0f8442a56dbd39dbf159995415c52ed479b": { - "balance": "2000000000000000000000" + "0x7c45f0f8442a56dbd39dbf159995415c52ed479b": { + "balance": "0x6c6b935b8bbd400000" }, - "b65941d44c50d24666670d364766e991c02e11c2": { - "balance": "600000000000000000000" + "0xb65941d44c50d24666670d364766e991c02e11c2": { + "balance": "0x2086ac351052600000" }, - "45e68db8dbbaba5fc2cb337c62bcd0d61b059189": { - "balance": "2000000000000000000000" + "0x45e68db8dbbaba5fc2cb337c62bcd0d61b059189": { + "balance": "0x6c6b935b8bbd400000" }, - "05f3631f5664bdad5d0132c8388d36d7d8920918": { - "balance": "20000000000000000000" + "0x05f3631f5664bdad5d0132c8388d36d7d8920918": { + "balance": "0x1158e460913d00000" }, - "5475d7f174bdb1f789017c7c1705989646079d49": { - "balance": "9400000000000000000000" + "0x5475d7f174bdb1f789017c7c1705989646079d49": { + "balance": "0x1fd933494aa5fe00000" }, - "c7bf2ed1ed312940ee6aded1516e268e4a604856": { - "balance": "6000000000000000000000" + "0xc7bf2ed1ed312940ee6aded1516e268e4a604856": { + "balance": "0x14542ba12a337c00000" }, - "39aaf0854db6eb39bc7b2e43846a76171c0445de": { - "balance": "1850000000000000000000" + "0x39aaf0854db6eb39bc7b2e43846a76171c0445de": { + "balance": "0x6449e84e47a8a80000" }, - "c817df1b91faf30fe3251571727c9711b45d8f06": { - "balance": "1999944000000000000000" + "0xc817df1b91faf30fe3251571727c9711b45d8f06": { + "balance": "0x6c6acc67d7b1d40000" }, - "7d13d6705884ab2157dd8dcc7046caf58ee94be4": { - "balance": "137200000000000000000000" + "0x7d13d6705884ab2157dd8dcc7046caf58ee94be4": { + "balance": "0x1d0da07cbb3ee9c00000" }, - "478dc09a1311377c093f9cc8ae74111f65f82f39": { - "balance": "4000000000000000000000" + "0x478dc09a1311377c093f9cc8ae74111f65f82f39": { + "balance": "0xd8d726b7177a800000" }, - "8043ed22f997e5a2a4c16e364486ae64975692c4": { - "balance": "1130513000000000000000" + "0x8043ed22f997e5a2a4c16e364486ae64975692c4": { + "balance": "0x3d4904ffc9112e8000" }, - "b9a985501ee950829b17fae1c9cf348c3156542c": { - "balance": "294100000000000000000" + "0xb9a985501ee950829b17fae1c9cf348c3156542c": { + "balance": "0xff17517ca9a620000" }, - "d5cba5b26bea5d73fabb1abafacdef85def368cc": { - "balance": "200000000000000000000" + "0xd5cba5b26bea5d73fabb1abafacdef85def368cc": { + "balance": "0xad78ebc5ac6200000" }, - "6776e133d9dc354c12a951087b639650f539a433": { - "balance": "120000000000000000000" + "0x6776e133d9dc354c12a951087b639650f539a433": { + "balance": "0x68155a43676e00000" }, - "804ca94972634f633a51f3560b1d06c0b293b3b1": { - "balance": "200000000000000000000" + "0x804ca94972634f633a51f3560b1d06c0b293b3b1": { + "balance": "0xad78ebc5ac6200000" }, - "0be1fdf626ee6189102d70d13b31012c95cd1cd6": { - "balance": "2000000000000000000000" + "0x0be1fdf626ee6189102d70d13b31012c95cd1cd6": { + "balance": "0x6c6b935b8bbd400000" }, - "f848fce9ab611c7d99206e23fac69ad488b94fe1": { - "balance": "48500000000000000000" + "0xf848fce9ab611c7d99206e23fac69ad488b94fe1": { + "balance": "0x2a1129d0936720000" }, - "f01195d657ef3c942e6cb83949e5a20b5cfa8b1e": { - "balance": "25760000000000000000000" + "0xf01195d657ef3c942e6cb83949e5a20b5cfa8b1e": { + "balance": "0x57473d05dabae800000" }, - "78a5e89900bd3f81dd71ba869d25fec65261df15": { - "balance": "51900000000000000000000" + "0x78a5e89900bd3f81dd71ba869d25fec65261df15": { + "balance": "0xafd812fee03d5700000" }, - "d6f1e55b1694089ebcb4fe7d7882aa66c8976176": { - "balance": "19998846000000000000000" + "0xd6f1e55b1694089ebcb4fe7d7882aa66c8976176": { + "balance": "0x43c23bdbe929db30000" }, - "d5294b666242303b6df0b1c88d37429bc8c965aa": { - "balance": "300700000000000000000" + "0xd5294b666242303b6df0b1c88d37429bc8c965aa": { + "balance": "0x104d0d00d2b7f60000" }, - "3171877e9d820cc618fc0919b29efd333fda4934": { - "balance": "1000000000000000000000" + "0x3171877e9d820cc618fc0919b29efd333fda4934": { + "balance": "0x3635c9adc5dea00000" }, - "2901f8077f34190bb47a8e227fa29b30ce113b31": { - "balance": "100000000000000000000" + "0x2901f8077f34190bb47a8e227fa29b30ce113b31": { + "balance": "0x56bc75e2d63100000" }, - "6b2284440221ce16a8382de5ff0229472269deec": { - "balance": "1000000000000000000000" + "0x6b2284440221ce16a8382de5ff0229472269deec": { + "balance": "0x3635c9adc5dea00000" }, - "1bba03ff6b4ad5bf18184acb21b188a399e9eb4a": { - "balance": "1790000000000000000000" + "0x1bba03ff6b4ad5bf18184acb21b188a399e9eb4a": { + "balance": "0x61093d7c2c6d380000" }, - "80744618de396a543197ee4894abd06398dd7c27": { - "balance": "2000000000000000000000" + "0x80744618de396a543197ee4894abd06398dd7c27": { + "balance": "0x6c6b935b8bbd400000" }, - "1b799033ef6dc7127822f74542bb22dbfc09a308": { - "balance": "100000000000000000000" + "0x1b799033ef6dc7127822f74542bb22dbfc09a308": { + "balance": "0x56bc75e2d63100000" }, - "d513a45080ff2febe62cd5854abe29ee4467f996": { - "balance": "153200000000000000000" + "0xd513a45080ff2febe62cd5854abe29ee4467f996": { + "balance": "0x84e13bc4fc5d80000" }, - "e761d27fa3502cc76bb1a608740e1403cf9dfc69": { - "balance": "280000000000000000000" + "0xe761d27fa3502cc76bb1a608740e1403cf9dfc69": { + "balance": "0xf2dc7d47f15600000" }, - "53989ed330563fd57dfec9bd343c3760b0799390": { - "balance": "6208000000000000000000" + "0x53989ed330563fd57dfec9bd343c3760b0799390": { + "balance": "0x150894e849b39000000" }, - "ccf7110d1bd9a74bfd1d7d7d2d9d55607e7b837d": { - "balance": "900000000000000000000" + "0xccf7110d1bd9a74bfd1d7d7d2d9d55607e7b837d": { + "balance": "0x30ca024f987b900000" }, - "f373e9daac0c8675f53b797a160f6fc034ae6b23": { - "balance": "100000000000000000000" + "0xf373e9daac0c8675f53b797a160f6fc034ae6b23": { + "balance": "0x56bc75e2d63100000" }, - "abc9a99e8a2148a55a6d82bd51b98eb5391fdbaf": { - "balance": "6000000000000000000000" + "0xabc9a99e8a2148a55a6d82bd51b98eb5391fdbaf": { + "balance": "0x14542ba12a337c00000" }, - "ffec0913c635baca2f5e57a37aa9fb7b6c9b6e26": { - "balance": "805000000000000000000" + "0xffec0913c635baca2f5e57a37aa9fb7b6c9b6e26": { + "balance": "0x2ba39e82ed5d740000" }, - "581a3af297efa4436a29af0072929abf9826f58b": { - "balance": "2000000000000000000000" + "0x581a3af297efa4436a29af0072929abf9826f58b": { + "balance": "0x6c6b935b8bbd400000" }, - "924efa6db595b79313277e88319625076b580a10": { - "balance": "2000000000000000000000" + "0x924efa6db595b79313277e88319625076b580a10": { + "balance": "0x6c6b935b8bbd400000" }, - "65d8dd4e251cbc021f05b010f2d5dc520c3872e0": { - "balance": "834956000000000000000" + "0x65d8dd4e251cbc021f05b010f2d5dc520c3872e0": { + "balance": "0x2d43579a36a90e0000" }, - "6c67d6db1d03516c128b8ff234bf3d49b26d2941": { - "balance": "100000000000000000000000" + "0x6c67d6db1d03516c128b8ff234bf3d49b26d2941": { + "balance": "0x152d02c7e14af6800000" }, - "496d365534530a5fc1577c0a5241cb88c4da7072": { - "balance": "1790000000000000000000" + "0x496d365534530a5fc1577c0a5241cb88c4da7072": { + "balance": "0x61093d7c2c6d380000" }, - "b85ff03e7b5fc422981fae5e9941dacbdaba7584": { - "balance": "1337000000000000000000" + "0xb85ff03e7b5fc422981fae5e9941dacbdaba7584": { + "balance": "0x487a9a304539440000" }, - "e13540ecee11b212e8b775dc8e71f374aae9b3f8": { - "balance": "2000000000000000000000" + "0xe13540ecee11b212e8b775dc8e71f374aae9b3f8": { + "balance": "0x6c6b935b8bbd400000" }, - "a02e3f8f5959a7aab7418612129b701ca1b80010": { - "balance": "20000000000000000000" + "0xa02e3f8f5959a7aab7418612129b701ca1b80010": { + "balance": "0x1158e460913d00000" }, - "a7a3f153cdc38821c20c5d8c8241b294a3f82b24": { - "balance": "500000000000000000000" + "0xa7a3f153cdc38821c20c5d8c8241b294a3f82b24": { + "balance": "0x1b1ae4d6e2ef500000" }, - "366175403481e0ab15bb514615cbb989ebc68f82": { - "balance": "2000000000000000000000" + "0x366175403481e0ab15bb514615cbb989ebc68f82": { + "balance": "0x6c6b935b8bbd400000" }, - "5104ecc0e330dd1f81b58ac9dbb1a9fbf88a3c85": { - "balance": "100000000000000000000000" + "0x5104ecc0e330dd1f81b58ac9dbb1a9fbf88a3c85": { + "balance": "0x152d02c7e14af6800000" }, - "a466d770d898d8c9d405e4a0e551efafcde53cf9": { - "balance": "492500000000000000000" + "0xa466d770d898d8c9d405e4a0e551efafcde53cf9": { + "balance": "0x1ab2cf7c9f87e20000" }, - "5fa8a54e68176c4fe2c01cf671c515bfbdd528a8": { - "balance": "330000000000000000000000" + "0x5fa8a54e68176c4fe2c01cf671c515bfbdd528a8": { + "balance": "0x45e155fa0110fa400000" }, - "e2e15c60dd381e3a4be25071ab249a4c5c5264da": { - "balance": "2350502000000000000000" + "0xe2e15c60dd381e3a4be25071ab249a4c5c5264da": { + "balance": "0x7f6bc49b81b5370000" }, - "0628bfbe5535782fb588406bc96660a49b011af5": { - "balance": "1520000000000000000000" + "0x0628bfbe5535782fb588406bc96660a49b011af5": { + "balance": "0x52663ccab1e1c00000" }, - "04d6b8d4da867407bb997749debbcdc0b358538a": { - "balance": "1000000000000000000000" + "0x04d6b8d4da867407bb997749debbcdc0b358538a": { + "balance": "0x3635c9adc5dea00000" }, - "0e6ec313376271dff55423ab5422cc3a8b06b22b": { - "balance": "4000000000000000000000" + "0x0e6ec313376271dff55423ab5422cc3a8b06b22b": { + "balance": "0xd8d726b7177a800000" }, - "8787d12677a5ec291e57e31ffbfad105c3324b87": { - "balance": "12438777000000000000000" + "0x8787d12677a5ec291e57e31ffbfad105c3324b87": { + "balance": "0x2a24eb53208f3128000" }, - "58e2f11223fc8237f69d99c6289c148c0604f742": { - "balance": "24000000000000000000000" + "0x58e2f11223fc8237f69d99c6289c148c0604f742": { + "balance": "0x5150ae84a8cdf000000" }, - "5600730a55f6b20ebd24811faa3de96d1662abab": { - "balance": "1880000000000000000000" + "0x5600730a55f6b20ebd24811faa3de96d1662abab": { + "balance": "0x65ea3db75546600000" }, - "fce089635ce97abac06b44819be5bb0a3e2e0b37": { - "balance": "92491000000000000000" + "0xfce089635ce97abac06b44819be5bb0a3e2e0b37": { + "balance": "0x503920a7630a78000" }, - "fa0c1a988c8a17ad3528eb28b3409daa58225f26": { - "balance": "200000000000000000000" + "0xfa0c1a988c8a17ad3528eb28b3409daa58225f26": { + "balance": "0xad78ebc5ac6200000" }, - "7ae1c19e53c71cee4c73fae2d7fc73bf9ab5e392": { - "balance": "1000000000000000000000" + "0x7ae1c19e53c71cee4c73fae2d7fc73bf9ab5e392": { + "balance": "0x3635c9adc5dea00000" }, - "bd17eed82b9a2592019a1b1b3c0fbad45c408d22": { - "balance": "250000000000000000000" + "0xbd17eed82b9a2592019a1b1b3c0fbad45c408d22": { + "balance": "0xd8d726b7177a80000" }, - "884a7a39d0916e05f1c242df55607f37df8c5fda": { - "balance": "23400000000000000000000" + "0x884a7a39d0916e05f1c242df55607f37df8c5fda": { + "balance": "0x4f4843c157c8ca00000" }, - "ca70f4ddbf069d2143bd6bbc7f696b52789b32e7": { - "balance": "3000000000000000000000" + "0xca70f4ddbf069d2143bd6bbc7f696b52789b32e7": { + "balance": "0xa2a15d09519be00000" }, - "7b25bb9ca8e702217e9333225250e53c36804d48": { - "balance": "1880000000000000000000" + "0x7b25bb9ca8e702217e9333225250e53c36804d48": { + "balance": "0x65ea3db75546600000" }, - "ea8317197959424041d9d7c67a3ece1dbb78bb55": { - "balance": "394000000000000000000" + "0xea8317197959424041d9d7c67a3ece1dbb78bb55": { + "balance": "0x155bd9307f9fe80000" }, - "5cb953a0e42f5030812226217fffc3ce230457e4": { - "balance": "100000000000000000000" + "0x5cb953a0e42f5030812226217fffc3ce230457e4": { + "balance": "0x56bc75e2d63100000" }, - "d1f4dc1ddb8abb8848a8b14e25f3b55a8591c266": { - "balance": "250000000000000000000" + "0xd1f4dc1ddb8abb8848a8b14e25f3b55a8591c266": { + "balance": "0xd8d726b7177a80000" }, - "6a42ca971c6578d5ade295c3e7f4ad331dd3424e": { - "balance": "6000000000000000000000" + "0x6a42ca971c6578d5ade295c3e7f4ad331dd3424e": { + "balance": "0x14542ba12a337c00000" }, - "07e1162ceae3cf21a3f62d105990302e307f4e3b": { - "balance": "1530000000000000000000" + "0x07e1162ceae3cf21a3f62d105990302e307f4e3b": { + "balance": "0x52f103edb66ba80000" }, - "5d1dc3387b47b8451e55106c0cc67d6dc72b7f0b": { - "balance": "2000000000000000000000" + "0x5d1dc3387b47b8451e55106c0cc67d6dc72b7f0b": { + "balance": "0x6c6b935b8bbd400000" }, - "5d2819e8d57821922ee445650ccaec7d40544a8d": { - "balance": "200000000000000000000" + "0x5d2819e8d57821922ee445650ccaec7d40544a8d": { + "balance": "0xad78ebc5ac6200000" }, - "4c24b78baf2bafc7fcc69016426be973e20a50b2": { - "balance": "3000000000000000000000" + "0x4c24b78baf2bafc7fcc69016426be973e20a50b2": { + "balance": "0xa2a15d09519be00000" }, - "630c5273126d517ce67101811cab16b8534cf9a8": { - "balance": "9422595000000000000000" + "0x630c5273126d517ce67101811cab16b8534cf9a8": { + "balance": "0x1feccc62573bbd38000" }, - "291f929ca59b54f8443e3d4d75d95dee243cef78": { - "balance": "499938000000000000000" + "0x291f929ca59b54f8443e3d4d75d95dee243cef78": { + "balance": "0x1b1a089237073d0000" }, - "2dd325fdffb97b19995284afa5abdb574a1df16a": { - "balance": "500000000000000000000" + "0x2dd325fdffb97b19995284afa5abdb574a1df16a": { + "balance": "0x1b1ae4d6e2ef500000" }, - "4fce8429ba49caa0369d1e494db57e89eab2ad39": { - "balance": "200000000000000000000000" + "0x4fce8429ba49caa0369d1e494db57e89eab2ad39": { + "balance": "0x2a5a058fc295ed000000" }, - "712b76510214dc620f6c3a1dd29aa22bf6d214fb": { - "balance": "6000000000000000000000" + "0x712b76510214dc620f6c3a1dd29aa22bf6d214fb": { + "balance": "0x14542ba12a337c00000" }, - "266f2da7f0085ef3f3fa09baee232b93c744db2e": { - "balance": "60000000000000000000000" + "0x266f2da7f0085ef3f3fa09baee232b93c744db2e": { + "balance": "0xcb49b44ba602d800000" }, - "0770c61be78772230cb5a3bb2429a72614a0b336": { - "balance": "6767695000000000000000" + "0x0770c61be78772230cb5a3bb2429a72614a0b336": { + "balance": "0x16ee0a299b713418000" }, - "02dfcb17a1b87441036374b762a5d3418b1cb4d4": { - "balance": "1340860000000000000000" + "0x02dfcb17a1b87441036374b762a5d3418b1cb4d4": { + "balance": "0x48b02ba9d1ba460000" }, - "5e67df8969101adabd91accd6bb1991274af8df2": { - "balance": "500000000000000000000" + "0x5e67df8969101adabd91accd6bb1991274af8df2": { + "balance": "0x1b1ae4d6e2ef500000" }, - "7d9c59631e2ba2e8e82891f3979922aaa3b567a1": { - "balance": "8000000000000000000000" + "0x7d9c59631e2ba2e8e82891f3979922aaa3b567a1": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "949f8c107bc7f0aceaa0f17052aadbd2f9732b2e": { - "balance": "2000000000000000000000" + "0x949f8c107bc7f0aceaa0f17052aadbd2f9732b2e": { + "balance": "0x6c6b935b8bbd400000" }, - "ea4e809e266ae5f13cdbe38f9d0456e6386d1274": { - "balance": "4500000000000000000000" + "0xea4e809e266ae5f13cdbe38f9d0456e6386d1274": { + "balance": "0xf3f20b8dfa69d00000" }, - "cd5510a242dfb0183de925fba866e312fabc1657": { - "balance": "2400000000000000000000" + "0xcd5510a242dfb0183de925fba866e312fabc1657": { + "balance": "0x821ab0d44149800000" }, - "a36e0d94b95364a82671b608cb2d373245612909": { - "balance": "150011000000000000000" + "0xa36e0d94b95364a82671b608cb2d373245612909": { + "balance": "0x821d221b5291f8000" }, - "0ec46696ffac1f58005fa8439824f08eed1df89b": { - "balance": "10000000000000000000000" + "0x0ec46696ffac1f58005fa8439824f08eed1df89b": { + "balance": "0x21e19e0c9bab2400000" }, - "c6fb1ee37417d080a0d048923bdabab095d077c6": { - "balance": "200000000000000000000" + "0xc6fb1ee37417d080a0d048923bdabab095d077c6": { + "balance": "0xad78ebc5ac6200000" }, - "53c9eca40973f63bb5927be0bc6a8a8be1951f74": { - "balance": "2000000000000000000000" + "0x53c9eca40973f63bb5927be0bc6a8a8be1951f74": { + "balance": "0x6c6b935b8bbd400000" }, - "ea14bfda0a6e76668f8788321f07df37824ec5df": { - "balance": "200000000000000000000000" + "0xea14bfda0a6e76668f8788321f07df37824ec5df": { + "balance": "0x2a5a058fc295ed000000" }, - "dfb4d4ade52fcc818acc7a2c6bb2b00224658f78": { - "balance": "7750000000000000000000" + "0xdfb4d4ade52fcc818acc7a2c6bb2b00224658f78": { + "balance": "0x1a420db02bd7d580000" }, - "5997ffefb3c1d9d10f1ae2ac8ac3c8e2d2292783": { - "balance": "1000000000000000000000" + "0x5997ffefb3c1d9d10f1ae2ac8ac3c8e2d2292783": { + "balance": "0x3635c9adc5dea00000" }, - "8eceb2e124536c5b5ffc640ed14ff15ed9a8cb71": { - "balance": "2000000000000000000000" + "0x8eceb2e124536c5b5ffc640ed14ff15ed9a8cb71": { + "balance": "0x6c6b935b8bbd400000" }, - "8f02bda6c36922a6be6a509be51906d393f7b99b": { - "balance": "1019835000000000000000" + "0x8f02bda6c36922a6be6a509be51906d393f7b99b": { + "balance": "0x37490dc12ebe7f8000" }, - "530077c9f7b907ff9cec0c77a41a70e9029add4a": { - "balance": "2000000000000000000000" + "0x530077c9f7b907ff9cec0c77a41a70e9029add4a": { + "balance": "0x6c6b935b8bbd400000" }, - "08936a37df85b3a158cafd9de021f58137681347": { - "balance": "18200000000000000000" + "0x08936a37df85b3a158cafd9de021f58137681347": { + "balance": "0xfc936392801c0000" }, - "8e9c429266df057efa78dd1d5f77fc40742ad466": { - "balance": "300061000000000000000" + "0x8e9c429266df057efa78dd1d5f77fc40742ad466": { + "balance": "0x10442ed1b56c7c8000" }, - "acc59f3b30ceffc56461cc5b8df48902240e0e7b": { - "balance": "2000000000000000000000" + "0xacc59f3b30ceffc56461cc5b8df48902240e0e7b": { + "balance": "0x6c6b935b8bbd400000" }, - "f5534815dc635efa5cc84b2ac734723e21b29372": { - "balance": "1580000000000000000000" + "0xf5534815dc635efa5cc84b2ac734723e21b29372": { + "balance": "0x55a6e79ccd1d300000" }, - "f873e57a65c93b6e18cb75f0dc077d5b8933dc5c": { - "balance": "197000000000000000000" + "0xf873e57a65c93b6e18cb75f0dc077d5b8933dc5c": { + "balance": "0xaadec983fcff40000" }, - "25b78c9fad85b43343f0bfcd0fac11c9949ca5eb": { - "balance": "2000000000000000000000" + "0x25b78c9fad85b43343f0bfcd0fac11c9949ca5eb": { + "balance": "0x6c6b935b8bbd400000" }, - "aad2b7f8106695078e6c138ec81a7486aaca1eb2": { - "balance": "200000000000000000000" + "0xaad2b7f8106695078e6c138ec81a7486aaca1eb2": { + "balance": "0xad78ebc5ac6200000" }, - "509c8668036d143fb8ae70b11995631f3dfcad87": { - "balance": "1000000000000000000000" + "0x509c8668036d143fb8ae70b11995631f3dfcad87": { + "balance": "0x3635c9adc5dea00000" }, - "3602458da86f6d6a9d9eb03daf97fe5619d442fa": { - "balance": "2000000000000000000000" + "0x3602458da86f6d6a9d9eb03daf97fe5619d442fa": { + "balance": "0x6c6b935b8bbd400000" }, - "9f607b3f12469f446121cebf3475356b71b4328c": { - "balance": "4000000000000000000000" + "0x9f607b3f12469f446121cebf3475356b71b4328c": { + "balance": "0xd8d726b7177a800000" }, - "fe3827d57630cf8761d512797b0b858e478bbd12": { - "balance": "20000000000000000000" + "0xfe3827d57630cf8761d512797b0b858e478bbd12": { + "balance": "0x1158e460913d00000" }, - "9d9c4efe9f433989e23be94049215329fa55b4cb": { - "balance": "256215000000000000000" + "0x9d9c4efe9f433989e23be94049215329fa55b4cb": { + "balance": "0xde3b28903c6b58000" }, - "9bd905f1719fc7acd0159d4dc1f8db2f21472338": { - "balance": "1000000000000000000000" + "0x9bd905f1719fc7acd0159d4dc1f8db2f21472338": { + "balance": "0x3635c9adc5dea00000" }, - "7d82e523cc2dc591da3954e8b6bb2caf6461e69c": { - "balance": "2316058000000000000000" + "0x7d82e523cc2dc591da3954e8b6bb2caf6461e69c": { + "balance": "0x7d8dc2efffb1a90000" }, - "74afe54902d615782576f8baac13ac970c050f6e": { - "balance": "177670000000000000000" + "0x74afe54902d615782576f8baac13ac970c050f6e": { + "balance": "0x9a1aaa3a9fba70000" }, - "aff11ccf699304d5f5862af86083451c26e79ae5": { - "balance": "1999000000000000000000" + "0xaff11ccf699304d5f5862af86083451c26e79ae5": { + "balance": "0x6c5db2a4d815dc0000" }, - "3885fee67107dc3a3c741ee290c98918c9b99397": { - "balance": "20000000000000000000" + "0x3885fee67107dc3a3c741ee290c98918c9b99397": { + "balance": "0x1158e460913d00000" }, - "36343aeca07b6ed58a0e62fa4ecb498a124fc971": { - "balance": "300000000000000000000" + "0x36343aeca07b6ed58a0e62fa4ecb498a124fc971": { + "balance": "0x1043561a8829300000" }, - "c94a28fb3230a9ddfa964e770f2ce3c253a7be4f": { - "balance": "200000000000000000000" + "0xc94a28fb3230a9ddfa964e770f2ce3c253a7be4f": { + "balance": "0xad78ebc5ac6200000" }, - "9882967cee68d2a839fad8ab4a7c3dddf6c0adc8": { - "balance": "1336866000000000000000" + "0x9882967cee68d2a839fad8ab4a7c3dddf6c0adc8": { + "balance": "0x4878be1ffaf95d0000" }, - "95df4e3445d7662624c48eba74cf9e0a53e9f732": { - "balance": "56000000000000000000000" + "0x95df4e3445d7662624c48eba74cf9e0a53e9f732": { + "balance": "0xbdbc41e0348b3000000" }, - "ca9faa17542fafbb388eab21bc4c94e8a7b34788": { - "balance": "1999999000000000000000" + "0xca9faa17542fafbb388eab21bc4c94e8a7b34788": { + "balance": "0x6c6b8fce0d18798000" }, - "c8b1850525d946f2ae84f317b15188c536a5dc86": { - "balance": "2685000000000000000000" + "0xc8b1850525d946f2ae84f317b15188c536a5dc86": { + "balance": "0x918ddc3a42a3d40000" }, - "39bac68d947859f59e9226089c96d62e9fbe3cde": { - "balance": "40000000000000000000" + "0x39bac68d947859f59e9226089c96d62e9fbe3cde": { + "balance": "0x22b1c8c1227a00000" }, - "a9bfc410dddb20711e45c07387eab30a054e19ac": { - "balance": "1154750000000000000000" + "0xa9bfc410dddb20711e45c07387eab30a054e19ac": { + "balance": "0x3e99601edf4e530000" }, - "540a1819bd7c35861e791804e5fbb3bc97c9abb1": { - "balance": "1454400000000000000000" + "0x540a1819bd7c35861e791804e5fbb3bc97c9abb1": { + "balance": "0x4ed7dac64230200000" }, - "667b61c03bb937a9f5d0fc5a09f1ea3363c77035": { - "balance": "4250000000000000000000" + "0x667b61c03bb937a9f5d0fc5a09f1ea3363c77035": { + "balance": "0xe664992288f2280000" }, - "010df1df4bed23760d2d1c03781586ddf7918e54": { - "balance": "60000000000000000000" + "0x010df1df4bed23760d2d1c03781586ddf7918e54": { + "balance": "0x340aad21b3b700000" }, - "bd51ee2ea143d7b1d6b77e7e44bdd7da12f485ac": { - "balance": "1318800000000000000000" + "0xbd51ee2ea143d7b1d6b77e7e44bdd7da12f485ac": { + "balance": "0x477e06ccb2b9280000" }, - "fb5125bf0f5eb0b6f020e56bfc2fdf3d402c097e": { - "balance": "5910000000000000000000" + "0xfb5125bf0f5eb0b6f020e56bfc2fdf3d402c097e": { + "balance": "0x14061b9d77a5e980000" }, - "3f0c83aac5717962734e5ceaeaecd39b28ad06be": { - "balance": "2000000000000000000000" + "0x3f0c83aac5717962734e5ceaeaecd39b28ad06be": { + "balance": "0x6c6b935b8bbd400000" }, - "f10661ff94140f203e7a482572437938bec9c3f7": { - "balance": "20000000000000000000000" + "0xf10661ff94140f203e7a482572437938bec9c3f7": { + "balance": "0x43c33c1937564800000" }, - "bd3097a79b3c0d2ebff0e6e86ab0edadbed47096": { - "balance": "1670000000000000000000" + "0xbd3097a79b3c0d2ebff0e6e86ab0edadbed47096": { + "balance": "0x5a87e7d7f5f6580000" }, - "edeb4894aadd0081bbddd3e8846804b583d19f27": { - "balance": "2000000000000000000000" + "0xedeb4894aadd0081bbddd3e8846804b583d19f27": { + "balance": "0x6c6b935b8bbd400000" }, - "49c9771fca19d5b9d245c891f8158fe49f47a062": { - "balance": "10000000000000000000000" + "0x49c9771fca19d5b9d245c891f8158fe49f47a062": { + "balance": "0x21e19e0c9bab2400000" }, - "6405dd13e93abcff377e700e3c1a0086eca27d29": { - "balance": "18200000000000000000" + "0x6405dd13e93abcff377e700e3c1a0086eca27d29": { + "balance": "0xfc936392801c0000" }, - "ce5e04f0184369bcfa06aca66ffa91bf59fa0fb9": { - "balance": "40000000000000000000" + "0xce5e04f0184369bcfa06aca66ffa91bf59fa0fb9": { + "balance": "0x22b1c8c1227a00000" }, - "4364309a9fa07095600f79edc65120cdcd23dc64": { - "balance": "10000000000000000000000" + "0x4364309a9fa07095600f79edc65120cdcd23dc64": { + "balance": "0x21e19e0c9bab2400000" }, - "b749b54e04d5b19bdcedfb84da7701ab478c27ae": { - "balance": "2680000000000000000000" + "0xb749b54e04d5b19bdcedfb84da7701ab478c27ae": { + "balance": "0x914878a8c05ee00000" }, - "f593c65285ee6bbd6637f3be8f89ad40d489f655": { - "balance": "3000000000000000000000" + "0xf593c65285ee6bbd6637f3be8f89ad40d489f655": { + "balance": "0xa2a15d09519be00000" }, - "d224f880f9479a89d32f09e52be990b288135cef": { - "balance": "17300000000000000000000" + "0xd224f880f9479a89d32f09e52be990b288135cef": { + "balance": "0x3a9d5baa4abf1d00000" }, - "85bb51bc3bfe9a1b2a2f6b1cda95bca8b38c8d5e": { - "balance": "321750000000000000000" + "0x85bb51bc3bfe9a1b2a2f6b1cda95bca8b38c8d5e": { + "balance": "0x11712da04ba1ef0000" }, - "caf4481d9db78dc4f25f7b4ac8bd3b1ca0106b31": { - "balance": "5000000000000000000000" + "0xcaf4481d9db78dc4f25f7b4ac8bd3b1ca0106b31": { + "balance": "0x10f0cf064dd59200000" }, - "51ca8bd4dc644fac47af675563d5804a0da21eeb": { - "balance": "788000000000000000000" + "0x51ca8bd4dc644fac47af675563d5804a0da21eeb": { + "balance": "0x2ab7b260ff3fd00000" }, - "19f643e1a8fa04ae16006028138333a59a96de87": { - "balance": "20000000000000000000" + "0x19f643e1a8fa04ae16006028138333a59a96de87": { + "balance": "0x1158e460913d00000" }, - "58b808a65b51e6338969afb95ec70735e451d526": { - "balance": "39998000000000000000000" + "0x58b808a65b51e6338969afb95ec70735e451d526": { + "balance": "0x8784bc1b9837a380000" }, - "574921838cc77d6c98b17d903a3ae0ee0da95bd0": { - "balance": "53480000000000000000000" + "0x574921838cc77d6c98b17d903a3ae0ee0da95bd0": { + "balance": "0xb5328178ad0f2a00000" }, - "7c6924d07c3ef5891966fe0a7856c87bef9d2034": { - "balance": "2000000000000000000000" + "0x7c6924d07c3ef5891966fe0a7856c87bef9d2034": { + "balance": "0x6c6b935b8bbd400000" }, - "f9767e4ecb4a5980527508d7bec3d45e4c649c13": { - "balance": "1910000000000000000000" + "0xf9767e4ecb4a5980527508d7bec3d45e4c649c13": { + "balance": "0x678a932062e4180000" }, - "f3be99b9103ce7550aa74ff1db18e09dfe32e005": { - "balance": "2000000000000000000000" + "0xf3be99b9103ce7550aa74ff1db18e09dfe32e005": { + "balance": "0x6c6b935b8bbd400000" }, - "625644c95a873ef8c06cdb9e9f6d8d7680043d62": { - "balance": "1800000000000000000000" + "0x625644c95a873ef8c06cdb9e9f6d8d7680043d62": { + "balance": "0x6194049f30f7200000" }, - "6a44af96b3f032ae641beb67f4b6c83342d37c5d": { - "balance": "29000000000000000000" + "0x6a44af96b3f032ae641beb67f4b6c83342d37c5d": { + "balance": "0x19274b259f6540000" }, - "d3a10ec7a5c9324999dd9e9b6bde7c911e584bda": { - "balance": "600000000000000000000" + "0xd3a10ec7a5c9324999dd9e9b6bde7c911e584bda": { + "balance": "0x2086ac351052600000" }, - "e8ddbed732ebfe754096fde9086b8ea4a4cdc616": { - "balance": "2000000000000000000000" + "0xe8ddbed732ebfe754096fde9086b8ea4a4cdc616": { + "balance": "0x6c6b935b8bbd400000" }, - "235fa66c025ef5540070ebcf0d372d8177c467ab": { - "balance": "33400000000000000000000" + "0x235fa66c025ef5540070ebcf0d372d8177c467ab": { + "balance": "0x7129e1cdf373ee00000" }, - "4d08471d68007aff2ae279bc5e3fe4156fbbe3de": { - "balance": "40000000000000000000000" + "0x4d08471d68007aff2ae279bc5e3fe4156fbbe3de": { + "balance": "0x878678326eac9000000" }, - "dadc00ab7927603c2fcf31cee352f80e6c4d6351": { - "balance": "1999664000000000000000" + "0xdadc00ab7927603c2fcf31cee352f80e6c4d6351": { + "balance": "0x6c66e9a55378b80000" }, - "7393cbe7f9ba2165e5a7553500b6e75da3c33abf": { - "balance": "100000000000000000000" + "0x7393cbe7f9ba2165e5a7553500b6e75da3c33abf": { + "balance": "0x56bc75e2d63100000" }, - "77617ebc4bebc5f5ddeb1b7a70cdeb6ae2ffa024": { - "balance": "1970000000000000000000" + "0x77617ebc4bebc5f5ddeb1b7a70cdeb6ae2ffa024": { + "balance": "0x6acb3df27e1f880000" }, - "7fea1962e35d62059768c749bedd96cab930d378": { - "balance": "2000000000000000000000" + "0x7fea1962e35d62059768c749bedd96cab930d378": { + "balance": "0x6c6b935b8bbd400000" }, - "243b3bca6a299359e886ce33a30341fafe4d573d": { - "balance": "20000000000000000000000" + "0x243b3bca6a299359e886ce33a30341fafe4d573d": { + "balance": "0x43c33c1937564800000" }, - "b94d47b3c052a5e50e4261ae06a20f45d8eee297": { - "balance": "2000000000000000000000" + "0xb94d47b3c052a5e50e4261ae06a20f45d8eee297": { + "balance": "0x6c6b935b8bbd400000" }, - "e727e67ef911b81f6cf9c73fcbfebc2b02b5bfc6": { - "balance": "2000000000000000000000" + "0xe727e67ef911b81f6cf9c73fcbfebc2b02b5bfc6": { + "balance": "0x6c6b935b8bbd400000" }, - "e510d6797fba3d6693835a844ea2ad540691971b": { - "balance": "17381000000000000000000" + "0xe510d6797fba3d6693835a844ea2ad540691971b": { + "balance": "0x3ae39d47383e8740000" }, - "0cdc960b998c141998160dc179b36c15d28470ed": { - "balance": "500038000000000000000" + "0x0cdc960b998c141998160dc179b36c15d28470ed": { + "balance": "0x1b1b6bd7af64c70000" }, - "3e76a62db187aa74f63817533b306cead0e8cebe": { - "balance": "31200000000000000000000" + "0x3e76a62db187aa74f63817533b306cead0e8cebe": { + "balance": "0x69b5afac750bb800000" }, - "495b641b1cdea362c3b4cbbd0f5cc50b1e176b9c": { - "balance": "1000000000000000000000" + "0x495b641b1cdea362c3b4cbbd0f5cc50b1e176b9c": { + "balance": "0x3635c9adc5dea00000" }, - "5126460d692c71c9af6f05574d93998368a23799": { - "balance": "52000000000000000000" + "0x5126460d692c71c9af6f05574d93998368a23799": { + "balance": "0x2d1a51c7e00500000" }, - "a008019863c1a77c1499eb39bbd7bf2dd7a31cb9": { - "balance": "137000000000000000000" + "0xa008019863c1a77c1499eb39bbd7bf2dd7a31cb9": { + "balance": "0x76d41c62494840000" }, - "65ee20b06d9ad589a7e7ce04b9f5f795f402aece": { - "balance": "2000000000000000000000" + "0x65ee20b06d9ad589a7e7ce04b9f5f795f402aece": { + "balance": "0x6c6b935b8bbd400000" }, - "f432b9dbaf11bdbd73b6519fc0a904198771aac6": { - "balance": "152000000000000000000" + "0xf432b9dbaf11bdbd73b6519fc0a904198771aac6": { + "balance": "0x83d6c7aab63600000" }, - "85946d56a4d371a93368539690b60ec825107454": { - "balance": "1730000000000000000000" + "0x85946d56a4d371a93368539690b60ec825107454": { + "balance": "0x5dc892aa1131c80000" }, - "26f9f7cefd7e394b9d3924412bf2c2831faf1f85": { - "balance": "4000000000000000000000" + "0x26f9f7cefd7e394b9d3924412bf2c2831faf1f85": { + "balance": "0xd8d726b7177a800000" }, - "d4ebb1929a23871cf77fe049ab9602be08be0a73": { - "balance": "1910000000000000000000" + "0xd4ebb1929a23871cf77fe049ab9602be08be0a73": { + "balance": "0x678a932062e4180000" }, - "4fdac1aa517007e0089430b3316a1badd12c01c7": { - "balance": "500000000000000000000" + "0x4fdac1aa517007e0089430b3316a1badd12c01c7": { + "balance": "0x1b1ae4d6e2ef500000" }, - "05e671de55afec964b074de574d5158d5d21b0a3": { - "balance": "3940000000000000000000" + "0x05e671de55afec964b074de574d5158d5d21b0a3": { + "balance": "0xd5967be4fc3f100000" }, - "20181c4b41f6f972b66958215f19f570c15ddff1": { - "balance": "1600000000000000000000" + "0x20181c4b41f6f972b66958215f19f570c15ddff1": { + "balance": "0x56bc75e2d631000000" }, - "cc9519d1f3985f6b255eaded12d5624a972721e1": { - "balance": "1000000000000000000000" + "0xcc9519d1f3985f6b255eaded12d5624a972721e1": { + "balance": "0x3635c9adc5dea00000" }, - "169bbefc41cfd7d7cbb8dfc63020e9fb06d49546": { - "balance": "2000000000000000000000" + "0x169bbefc41cfd7d7cbb8dfc63020e9fb06d49546": { + "balance": "0x6c6b935b8bbd400000" }, - "175a183a3a235ffbb03ba835675267229417a091": { - "balance": "16000000000000000000000" + "0x175a183a3a235ffbb03ba835675267229417a091": { + "balance": "0x3635c9adc5dea000000" }, - "8dde3cb8118568ef4503fe998ccdf536bf19a098": { - "balance": "4000000000000000000000" + "0x8dde3cb8118568ef4503fe998ccdf536bf19a098": { + "balance": "0xd8d726b7177a800000" }, - "6a05b21c4f17f9d73f5fb2b0cb89ff5356a6cc7e": { - "balance": "1500000000000000000000" + "0x6a05b21c4f17f9d73f5fb2b0cb89ff5356a6cc7e": { + "balance": "0x5150ae84a8cdf00000" }, - "5cc4cba621f220637742057f6055b80dffd77e13": { - "balance": "39997692000000000000000" + "0x5cc4cba621f220637742057f6055b80dffd77e13": { + "balance": "0x878477b7d253b660000" }, - "ecb94c568bfe59ade650645f4f26306c736cace4": { - "balance": "267400000000000000000" + "0xecb94c568bfe59ade650645f4f26306c736cace4": { + "balance": "0xe7eeba3410b740000" }, - "dfa6b8b8ad3184e357da282951d79161cfb089bc": { - "balance": "400000000000000000000" + "0xdfa6b8b8ad3184e357da282951d79161cfb089bc": { + "balance": "0x15af1d78b58c400000" }, - "a3058c51737a4e96c55f2ef6bd7bb358167ec2a7": { - "balance": "606093000000000000000" + "0xa3058c51737a4e96c55f2ef6bd7bb358167ec2a7": { + "balance": "0x20db3ae4481ad48000" }, - "051d424276b21239665186133d653bb8b1862f89": { - "balance": "1000000000000000000000" + "0x051d424276b21239665186133d653bb8b1862f89": { + "balance": "0x3635c9adc5dea00000" }, - "d05ffb2b74f867204fe531653b0248e21c13544e": { - "balance": "1000000000000000000000" + "0xd05ffb2b74f867204fe531653b0248e21c13544e": { + "balance": "0x3635c9adc5dea00000" }, - "e1f63ebbc62c7b7444040eb99623964f7667b376": { - "balance": "20000000000000000000" + "0xe1f63ebbc62c7b7444040eb99623964f7667b376": { + "balance": "0x1158e460913d00000" }, - "e5a3d7eb13b15c100177236d1beb30d17ee15420": { - "balance": "2000000000000000000000" + "0xe5a3d7eb13b15c100177236d1beb30d17ee15420": { + "balance": "0x6c6b935b8bbd400000" }, - "18fa8625c9dc843c78c7ab259ff87c9599e07f10": { - "balance": "1000000000000000000000" + "0x18fa8625c9dc843c78c7ab259ff87c9599e07f10": { + "balance": "0x3635c9adc5dea00000" }, - "64264aedd52dcae918a012fbcd0c030ee6f71821": { - "balance": "1000000000000000000000" + "0x64264aedd52dcae918a012fbcd0c030ee6f71821": { + "balance": "0x3635c9adc5dea00000" }, - "6f1f4907b8f61f0c51568d692806b382f50324f5": { - "balance": "2000000000000000000000" + "0x6f1f4907b8f61f0c51568d692806b382f50324f5": { + "balance": "0x6c6b935b8bbd400000" }, - "becef61c1c442bef7ce04b73adb249a8ba047e00": { - "balance": "1000400000000000000000" + "0xbecef61c1c442bef7ce04b73adb249a8ba047e00": { + "balance": "0x363b56c3a754c80000" }, - "7b893286427e72db219a21fc4dcd5fbf59283c31": { - "balance": "10000000000000000000000" + "0x7b893286427e72db219a21fc4dcd5fbf59283c31": { + "balance": "0x21e19e0c9bab2400000" }, - "ce5eb63a7bf4fbc2f6e4baa0c68ab1cb4cf98fb4": { - "balance": "2000000000000000000000" + "0xce5eb63a7bf4fbc2f6e4baa0c68ab1cb4cf98fb4": { + "balance": "0x6c6b935b8bbd400000" }, - "66ec16ee9caab411c55a6629e318de6ee216491d": { - "balance": "865000000000000000000" + "0x66ec16ee9caab411c55a6629e318de6ee216491d": { + "balance": "0x2ee449550898e40000" }, - "30b66150f1a63457023fdd45d0cc6cb54e0c0f06": { - "balance": "1000000000000000000000" + "0x30b66150f1a63457023fdd45d0cc6cb54e0c0f06": { + "balance": "0x3635c9adc5dea00000" }, - "87183160d172d2e084d327b86bcb7c1d8e6784ef": { - "balance": "4000086000000000000000" + "0x87183160d172d2e084d327b86bcb7c1d8e6784ef": { + "balance": "0xd8d8583fa2d52f0000" }, - "c420388fbee84ad656dd68cdc1fbaa9392780b34": { - "balance": "187767000000000000000" + "0xc420388fbee84ad656dd68cdc1fbaa9392780b34": { + "balance": "0xa2dca63aaf4c58000" }, - "90f774c9147dde90853ddc43f08f16d455178b8c": { - "balance": "4000000000000000000000" + "0x90f774c9147dde90853ddc43f08f16d455178b8c": { + "balance": "0xd8d726b7177a800000" }, - "1e1d7a5f2468b94ea826982dbf2125793c6e4a5a": { - "balance": "999940000000000000000" + "0x1e1d7a5f2468b94ea826982dbf2125793c6e4a5a": { + "balance": "0x3634f48417401a0000" }, - "8043fdd0bc4c973d1663d55fc135508ec5d4f4fa": { - "balance": "20000000000000000000" + "0x8043fdd0bc4c973d1663d55fc135508ec5d4f4fa": { + "balance": "0x1158e460913d00000" }, - "7bca1da6c80a66baa5db5ac98541c4be276b447d": { - "balance": "679000000000000000000" + "0x7bca1da6c80a66baa5db5ac98541c4be276b447d": { + "balance": "0x24cf049680fa3c0000" }, - "73550beb732ba9ddafda7ae406e18f7feb0f8bb2": { - "balance": "2800000000000000000000" + "0x73550beb732ba9ddafda7ae406e18f7feb0f8bb2": { + "balance": "0x97c9ce4cf6d5c00000" }, - "adc19ec835afe3e58d87dc93a8a9213c90451326": { - "balance": "1971200000000000000000" + "0xadc19ec835afe3e58d87dc93a8a9213c90451326": { + "balance": "0x6adbe5342282000000" }, - "821d798af19989c3ae5b84a7a7283cd7fda1fabe": { - "balance": "20000000000000000000000" + "0x821d798af19989c3ae5b84a7a7283cd7fda1fabe": { + "balance": "0x43c33c1937564800000" }, - "4c4e6f13fb5e3f70c3760262a03e317982691d10": { - "balance": "100000000000000000000" + "0x4c4e6f13fb5e3f70c3760262a03e317982691d10": { + "balance": "0x56bc75e2d63100000" }, - "664e43119870af107a448db1278b044838ffcdaf": { - "balance": "400000000000000000000" + "0x664e43119870af107a448db1278b044838ffcdaf": { + "balance": "0x15af1d78b58c400000" }, - "8da1178f55d97772bb1d24111a404a4f8715b95d": { - "balance": "878149000000000000000" + "0x8da1178f55d97772bb1d24111a404a4f8715b95d": { + "balance": "0x2f9ac3f6de00808000" }, - "5e6e9747e162f8b45c656e0f6cae7a84bac80e4e": { - "balance": "2000000000000000000000" + "0x5e6e9747e162f8b45c656e0f6cae7a84bac80e4e": { + "balance": "0x6c6b935b8bbd400000" }, - "c7eac31abce6d5f1dea42202b6a674153db47a29": { - "balance": "591000000000000000000" + "0xc7eac31abce6d5f1dea42202b6a674153db47a29": { + "balance": "0x2009c5c8bf6fdc0000" }, - "d96711540e2e998343d4f590b6fc8fac3bb8b31d": { - "balance": "1758944000000000000000" + "0xd96711540e2e998343d4f590b6fc8fac3bb8b31d": { + "balance": "0x5f5a4068b71cb00000" }, - "9da4ec407077f4b9707b2d9d2ede5ea5282bf1df": { - "balance": "4000000000000000000000" + "0x9da4ec407077f4b9707b2d9d2ede5ea5282bf1df": { + "balance": "0xd8d726b7177a800000" }, - "f60c1b45f164b9580e20275a5c39e1d71e35f891": { - "balance": "2000000000000000000000" + "0xf60c1b45f164b9580e20275a5c39e1d71e35f891": { + "balance": "0x6c6b935b8bbd400000" }, - "eb6394a7bfa4d28911d5a5b23e93f35e340c2294": { - "balance": "78000000000000000000" + "0xeb6394a7bfa4d28911d5a5b23e93f35e340c2294": { + "balance": "0x43a77aabd00780000" }, - "a89ac93b23370472daac337e9afdf642543f3e57": { - "balance": "10000000000000000000000" + "0xa89ac93b23370472daac337e9afdf642543f3e57": { + "balance": "0x21e19e0c9bab2400000" }, - "bb618e25221ad9a740b299ed1406bc3934b0b16d": { - "balance": "1000000000000000000000" + "0xbb618e25221ad9a740b299ed1406bc3934b0b16d": { + "balance": "0x3635c9adc5dea00000" }, - "817ac33bd8f847567372951f4a10d7a91ce3f430": { - "balance": "200015000000000000000" + "0x817ac33bd8f847567372951f4a10d7a91ce3f430": { + "balance": "0xad7c406c66dc18000" }, - "fe6a895b795cb4bf85903d3ce09c5aa43953d3bf": { - "balance": "3400000000000000000000" + "0xfe6a895b795cb4bf85903d3ce09c5aa43953d3bf": { + "balance": "0xb8507a820728200000" }, - "3673954399f6dfbe671818259bb278e2e92ee315": { - "balance": "200000000000000000000000" + "0x3673954399f6dfbe671818259bb278e2e92ee315": { + "balance": "0x2a5a058fc295ed000000" }, - "df0ff1f3d27a8ec9fb8f6b0cb254a63bba8224a5": { - "balance": "4367636000000000000000" + "0xdf0ff1f3d27a8ec9fb8f6b0cb254a63bba8224a5": { + "balance": "0xecc5202945d0020000" }, - "ff12e49d8e06aa20f886293c0b98ed7eff788805": { - "balance": "4000000000000000000000" + "0xff12e49d8e06aa20f886293c0b98ed7eff788805": { + "balance": "0xd8d726b7177a800000" }, - "5aef16a226dd68071f2483e1da42598319f69b2c": { - "balance": "2000000000000000000000" + "0x5aef16a226dd68071f2483e1da42598319f69b2c": { + "balance": "0x6c6b935b8bbd400000" }, - "0266ab1c6b0216230b9395443d5fa75e684568c6": { - "balance": "1000000000000000000000" + "0x0266ab1c6b0216230b9395443d5fa75e684568c6": { + "balance": "0x3635c9adc5dea00000" }, - "14a7352066364404db50f0d0d78d754a22198ef4": { - "balance": "1880000000000000000000" + "0x14a7352066364404db50f0d0d78d754a22198ef4": { + "balance": "0x65ea3db75546600000" }, - "444caf79b71338ee9aa7c733b02acaa7dc025948": { - "balance": "40000000000000000000" + "0x444caf79b71338ee9aa7c733b02acaa7dc025948": { + "balance": "0x22b1c8c1227a00000" }, - "64e2de21200b1899c3a0c0653b5040136d0dc842": { - "balance": "20000000000000000000000" + "0x64e2de21200b1899c3a0c0653b5040136d0dc842": { + "balance": "0x43c33c1937564800000" }, - "36e156610cd8ff64e780d89d0054385ca76755aa": { - "balance": "14000000000000000000000" + "0x36e156610cd8ff64e780d89d0054385ca76755aa": { + "balance": "0x2f6f10780d22cc00000" }, - "0a6ebe723b6ed1f9a86a69ddda68dc47465c2b1b": { - "balance": "1185000000000000000000" + "0x0a6ebe723b6ed1f9a86a69ddda68dc47465c2b1b": { + "balance": "0x403d2db599d5e40000" }, - "38bf2a1f7a69de0e2546adb808b36335645da9ff": { - "balance": "2000320000000000000000" + "0x38bf2a1f7a69de0e2546adb808b36335645da9ff": { + "balance": "0x6c700439d9b5600000" }, - "39f44663d92561091b82a70dcf593d754005973a": { - "balance": "199999000000000000000" + "0x39f44663d92561091b82a70dcf593d754005973a": { + "balance": "0xad78b2edc21598000" }, - "24b9e6644f6ba4cde126270d81f6ab60f286dff4": { - "balance": "133700000000000000000" + "0x24b9e6644f6ba4cde126270d81f6ab60f286dff4": { + "balance": "0x73f75d1a085ba0000" }, - "9b59eb213b1e7565e45047e04ea0374f10762d16": { - "balance": "2000000000000000000000" + "0x9b59eb213b1e7565e45047e04ea0374f10762d16": { + "balance": "0x6c6b935b8bbd400000" }, - "309544b6232c3dd737f945a03193d19b5f3f65b9": { - "balance": "1087440000000000000000" + "0x309544b6232c3dd737f945a03193d19b5f3f65b9": { + "balance": "0x3af342f67ef6c80000" }, - "b28bb39f3466517cd46f979cf59653ee7d8f152e": { - "balance": "450000000000000000000" + "0xb28bb39f3466517cd46f979cf59653ee7d8f152e": { + "balance": "0x18650127cc3dc80000" }, - "9da8e22ca10e67fea44e525e4751eeac36a31194": { - "balance": "260000000000000000000" + "0x9da8e22ca10e67fea44e525e4751eeac36a31194": { + "balance": "0xe18398e7601900000" }, - "4f8ae80238e60008557075ab6afe0a7f2e74d729": { - "balance": "100000000000000000000" + "0x4f8ae80238e60008557075ab6afe0a7f2e74d729": { + "balance": "0x56bc75e2d63100000" }, - "74ed33acf43f35b98c9230b9e6642ecb5330839e": { - "balance": "681872000000000000000" + "0x74ed33acf43f35b98c9230b9e6642ecb5330839e": { + "balance": "0x24f6dffb498d280000" }, - "22842ab830da509913f81dd1f04f10af9edd1c55": { - "balance": "2000000000000000000000" + "0x22842ab830da509913f81dd1f04f10af9edd1c55": { + "balance": "0x6c6b935b8bbd400000" }, - "a8f37f0ab3a1d448a9e3ce40965f97a646083a34": { - "balance": "329800000000000000000" + "0xa8f37f0ab3a1d448a9e3ce40965f97a646083a34": { + "balance": "0x11e0e4f8a50bd40000" }, - "582b70669c97aab7d68148d8d4e90411e2810d56": { - "balance": "999972000000000000000" + "0x582b70669c97aab7d68148d8d4e90411e2810d56": { + "balance": "0x36356633ebd8ea0000" }, - "d5e55100fbd1956bbed2ca518d4b1fa376032b0b": { - "balance": "100000000000000000000" + "0xd5e55100fbd1956bbed2ca518d4b1fa376032b0b": { + "balance": "0x56bc75e2d63100000" }, - "b7cc6b1acc32d8b295df68ed9d5e60b8f64cb67b": { - "balance": "300000000000000000000" + "0xb7cc6b1acc32d8b295df68ed9d5e60b8f64cb67b": { + "balance": "0x1043561a8829300000" }, - "e081ca1f4882db6043d5a9190703fde0ab3bf56d": { - "balance": "400000000000000000000" + "0xe081ca1f4882db6043d5a9190703fde0ab3bf56d": { + "balance": "0x15af1d78b58c400000" }, - "c02077449a134a7ad1ef7e4d927affeceeadb5ae": { - "balance": "18200000000000000000" + "0xc02077449a134a7ad1ef7e4d927affeceeadb5ae": { + "balance": "0xfc936392801c0000" }, - "e09fea755aee1a44c0a89f03b5deb762ba33006f": { - "balance": "1100070000000000000000" + "0xe09fea755aee1a44c0a89f03b5deb762ba33006f": { + "balance": "0x3ba289bc944ff70000" }, - "b3717731dad65132da792d876030e46ac227bb8a": { - "balance": "1000000000000000000000" + "0xb3717731dad65132da792d876030e46ac227bb8a": { + "balance": "0x3635c9adc5dea00000" }, - "157eb3d3113bd3b597714d3a954edd018982a5cb": { - "balance": "2000000000000000000000" + "0x157eb3d3113bd3b597714d3a954edd018982a5cb": { + "balance": "0x6c6b935b8bbd400000" }, - "dc57345b38e0f067c9a31d9deac5275a10949321": { - "balance": "200000000000000000000" + "0xdc57345b38e0f067c9a31d9deac5275a10949321": { + "balance": "0xad78ebc5ac6200000" }, - "40ea5044b204b23076b1a5803bf1d30c0f88871a": { - "balance": "14000000000000000000000" + "0x40ea5044b204b23076b1a5803bf1d30c0f88871a": { + "balance": "0x2f6f10780d22cc00000" }, - "2bab0fbe28d58420b52036770a12f9952aea6911": { - "balance": "3820000000000000000000" + "0x2bab0fbe28d58420b52036770a12f9952aea6911": { + "balance": "0xcf152640c5c8300000" }, - "adaa0e548c035affed64ca678a963fabe9a26bfd": { - "balance": "70000000000000000000" + "0xadaa0e548c035affed64ca678a963fabe9a26bfd": { + "balance": "0x3cb71f51fc5580000" }, - "bb48eaf516ce2dec3e41feb4c679e4957641164f": { - "balance": "3820000000000000000000" + "0xbb48eaf516ce2dec3e41feb4c679e4957641164f": { + "balance": "0xcf152640c5c8300000" }, - "7693bdeb6fc82b5bca721355223175d47a084b4d": { - "balance": "22000000000000000000000" + "0x7693bdeb6fc82b5bca721355223175d47a084b4d": { + "balance": "0x4a89f54ef0121c00000" }, - "03cb98d7acd817de9d886d22fab3f1b57d92a608": { - "balance": "1600000000000000000000" + "0x03cb98d7acd817de9d886d22fab3f1b57d92a608": { + "balance": "0x56bc75e2d631000000" }, - "f88900db737955b1519b1a7d170a18864ce590eb": { - "balance": "18200000000000000000" + "0xf88900db737955b1519b1a7d170a18864ce590eb": { + "balance": "0xfc936392801c0000" }, - "757fa55446c460968bb74b5ebca96c4ef2c709c5": { - "balance": "1015200000000000000000" + "0x757fa55446c460968bb74b5ebca96c4ef2c709c5": { + "balance": "0x3708baed3d68900000" }, - "da855d53477f505ec4c8d5e8bb9180d38681119c": { - "balance": "5600000000000000000000" + "0xda855d53477f505ec4c8d5e8bb9180d38681119c": { + "balance": "0x12f939c99edab800000" }, - "e41aea250b877d423a63ba2bce2f3a61c0248d56": { - "balance": "260000000000000000000" + "0xe41aea250b877d423a63ba2bce2f3a61c0248d56": { + "balance": "0xe18398e7601900000" }, - "8262169b615870134eb4ac6c5f471c6bf2f789fc": { - "balance": "462500000000000000000" + "0x8262169b615870134eb4ac6c5f471c6bf2f789fc": { + "balance": "0x19127a1391ea2a0000" }, - "66b0c100c49149935d14c0dc202cce907cea1a3d": { - "balance": "1970000000000000000000" + "0x66b0c100c49149935d14c0dc202cce907cea1a3d": { + "balance": "0x6acb3df27e1f880000" }, - "854c0c469c246b83b5d1b3eca443b39af5ee128a": { - "balance": "1600000000000000000000" + "0x854c0c469c246b83b5d1b3eca443b39af5ee128a": { + "balance": "0x56bc75e2d631000000" }, - "eb6810691d1ae0d19e47bd22cebee0b3ba27f88a": { - "balance": "2499922000000000000000" + "0xeb6810691d1ae0d19e47bd22cebee0b3ba27f88a": { + "balance": "0x87856315d878150000" }, - "24dcc24bd9c7210ceacfb30da98ae04a4d7b8ab9": { - "balance": "1000000000000000000000" + "0x24dcc24bd9c7210ceacfb30da98ae04a4d7b8ab9": { + "balance": "0x3635c9adc5dea00000" }, - "e31b4eef184c24ab098e36c802714bd4743dd0d4": { - "balance": "200000000000000000000" + "0xe31b4eef184c24ab098e36c802714bd4743dd0d4": { + "balance": "0xad78ebc5ac6200000" }, - "99b8c824869de9ed24f3bff6854cb6dd45cc3f9f": { - "balance": "1880000000000000000000" + "0x99b8c824869de9ed24f3bff6854cb6dd45cc3f9f": { + "balance": "0x65ea3db75546600000" }, - "2ae73a79aea0278533accf21070922b1613f8f32": { - "balance": "3097417000000000000000" + "0x2ae73a79aea0278533accf21070922b1613f8f32": { + "balance": "0xa7e94bbeae701a8000" }, - "ddbd2b932c763ba5b1b7ae3b362eac3e8d40121a": { - "balance": "10000000000000000000000" + "0xddbd2b932c763ba5b1b7ae3b362eac3e8d40121a": { + "balance": "0x21e19e0c9bab2400000" }, - "1b4bbcb18165211b265b280716cb3f1f212176e8": { - "balance": "472325000000000000000" + "0x1b4bbcb18165211b265b280716cb3f1f212176e8": { + "balance": "0x199ad37d03d0608000" }, - "e177e0c201d335ba3956929c571588b51c5223ae": { - "balance": "2000000000000000000000" + "0xe177e0c201d335ba3956929c571588b51c5223ae": { + "balance": "0x6c6b935b8bbd400000" }, - "1945fe377fe6d4b71e3e791f6f17db243c9b8b0f": { - "balance": "2185500000000000000000" + "0x1945fe377fe6d4b71e3e791f6f17db243c9b8b0f": { + "balance": "0x7679e7beb988360000" }, - "3e9b34a57f3375ae59c0a75e19c4b641228d9700": { - "balance": "17900000000000000000" + "0x3e9b34a57f3375ae59c0a75e19c4b641228d9700": { + "balance": "0xf8699329677e0000" }, - "a4d6c82eddae5947fbe9cdfbd548ae33d91a7191": { - "balance": "8000000000000000000000" + "0xa4d6c82eddae5947fbe9cdfbd548ae33d91a7191": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "bad4425e171c3e72975eb46ac0a015db315a5d8f": { - "balance": "2000000000000000000000" + "0xbad4425e171c3e72975eb46ac0a015db315a5d8f": { + "balance": "0x6c6b935b8bbd400000" }, - "a2d2aa626b09d6d4e4b13f7ffc5a88bd7ad36742": { - "balance": "4639390000000000000000" + "0xa2d2aa626b09d6d4e4b13f7ffc5a88bd7ad36742": { + "balance": "0xfb8078507553830000" }, - "b61c34fcacda701a5aa8702459deb0e4ae838df8": { - "balance": "35000000000000000000000" + "0xb61c34fcacda701a5aa8702459deb0e4ae838df8": { + "balance": "0x7695a92c20d6fe00000" }, - "145e0600e2a927b2dd8d379356b45a2e7d51d3ae": { - "balance": "2545843000000000000000" + "0x145e0600e2a927b2dd8d379356b45a2e7d51d3ae": { + "balance": "0x8a02ab400bb2cb8000" }, - "8df339214b6ad1b24663ce716034749d6ef838d9": { - "balance": "11000000000000000000000" + "0x8df339214b6ad1b24663ce716034749d6ef838d9": { + "balance": "0x2544faa778090e00000" }, - "8fd9a5c33a7d9edce0997bdf77ab306424a11ea9": { - "balance": "2000000000000000000000" + "0x8fd9a5c33a7d9edce0997bdf77ab306424a11ea9": { + "balance": "0x6c6b935b8bbd400000" }, - "097da12cfc1f7c1a2464def08c29bed5e2f851e9": { - "balance": "20000000000000000000" + "0x097da12cfc1f7c1a2464def08c29bed5e2f851e9": { + "balance": "0x1158e460913d00000" }, - "ddabf13c3c8ea4e3d73d78ec717afafa430e5479": { - "balance": "41600000000000000000000" + "0xddabf13c3c8ea4e3d73d78ec717afafa430e5479": { + "balance": "0x8cf23f909c0fa000000" }, - "9eeb07bd2b7890195e7d46bdf2071b6617514ddb": { - "balance": "2000000000000000000000" + "0x9eeb07bd2b7890195e7d46bdf2071b6617514ddb": { + "balance": "0x6c6b935b8bbd400000" }, - "819af9a1c27332b1c369bbda1b3de1c6e933d640": { - "balance": "314308000000000000000" + "0x819af9a1c27332b1c369bbda1b3de1c6e933d640": { + "balance": "0x1109e654b98f7a0000" }, - "d7d2c6fca8ad1f75395210b57de5dfd673933909": { - "balance": "340000000000000000000" + "0xd7d2c6fca8ad1f75395210b57de5dfd673933909": { + "balance": "0x126e72a69a50d00000" }, - "cdd5d881a7362c9070073bdfbc75e72453ac510e": { - "balance": "842000000000000000000" + "0xcdd5d881a7362c9070073bdfbc75e72453ac510e": { + "balance": "0x2da518eae48ee80000" }, - "e9ac36376efa06109d40726307dd1a57e213eaa9": { - "balance": "194000000000000000000" + "0xe9ac36376efa06109d40726307dd1a57e213eaa9": { + "balance": "0xa844a7424d9c80000" }, - "1bea4df5122fafdeb3607eddda1ea4ffdb9abf2a": { - "balance": "346000000000000000000" + "0x1bea4df5122fafdeb3607eddda1ea4ffdb9abf2a": { + "balance": "0x12c1b6eed03d280000" }, - "3e5e93fb4c9c9d1246f8f247358e22c3c5d17b6a": { - "balance": "150000000000000000000" + "0x3e5e93fb4c9c9d1246f8f247358e22c3c5d17b6a": { + "balance": "0x821ab0d4414980000" }, - "6c1ddd33c81966dc8621776071a4129482f2c65f": { - "balance": "40000000000000000000000" + "0x6c1ddd33c81966dc8621776071a4129482f2c65f": { + "balance": "0x878678326eac9000000" }, - "2ccb66494d0af689abf9483d365d782444e7dead": { - "balance": "1000000000000000000000" + "0x2ccb66494d0af689abf9483d365d782444e7dead": { + "balance": "0x3635c9adc5dea00000" }, - "19571a2b8f81c6bcf66ab3a10083295617150003": { - "balance": "492500000000000000000" + "0x19571a2b8f81c6bcf66ab3a10083295617150003": { + "balance": "0x1ab2cf7c9f87e20000" }, - "38ac664ee8e0795e4275cb852bcba6a479ad9c8d": { - "balance": "20000000000000000000" + "0x38ac664ee8e0795e4275cb852bcba6a479ad9c8d": { + "balance": "0x1158e460913d00000" }, - "c4803bb407c762f90b7596e6fde194931e769590": { - "balance": "4000000000000000000000" + "0xc4803bb407c762f90b7596e6fde194931e769590": { + "balance": "0xd8d726b7177a800000" }, - "93507e9e8119cbceda8ab087e7ecb071383d6981": { - "balance": "14000000000000000000000" + "0x93507e9e8119cbceda8ab087e7ecb071383d6981": { + "balance": "0x2f6f10780d22cc00000" }, - "b672734afcc224e2e609fc51d4f059732744c948": { - "balance": "295500000000000000000" + "0xb672734afcc224e2e609fc51d4f059732744c948": { + "balance": "0x1004e2e45fb7ee0000" }, - "fbbbebcfbe235e57dd2306ad1a9ec581c7f9f48f": { - "balance": "40000000000000000000" + "0xfbbbebcfbe235e57dd2306ad1a9ec581c7f9f48f": { + "balance": "0x22b1c8c1227a00000" }, - "8c81410ea8354cc5c65c41be8bd5de733c0b111d": { - "balance": "9550000000000000000000" + "0x8c81410ea8354cc5c65c41be8bd5de733c0b111d": { + "balance": "0x205b4dfa1ee74780000" }, - "942c6b8c955bc0d88812678a236725b32739d947": { - "balance": "1550000000000000000000" + "0x942c6b8c955bc0d88812678a236725b32739d947": { + "balance": "0x54069233bf7f780000" }, - "d2e817738abf1fb486583f80c350318bed860c80": { - "balance": "240010000000000000000" + "0xd2e817738abf1fb486583f80c350318bed860c80": { + "balance": "0xd02cecf5f5d810000" }, - "bff5df769934b8943ca9137d0efef2fe6ebbb34e": { - "balance": "100000000000000000000" + "0xbff5df769934b8943ca9137d0efef2fe6ebbb34e": { + "balance": "0x56bc75e2d63100000" }, - "6c4e426e8dc005dfa3516cb8a680b02eea95ae8e": { - "balance": "1337000000000000000000" + "0x6c4e426e8dc005dfa3516cb8a680b02eea95ae8e": { + "balance": "0x487a9a304539440000" }, - "f645dd7c890093e8e4c8aa92a6bb353522d3dc98": { - "balance": "134000000000000000000" + "0xf645dd7c890093e8e4c8aa92a6bb353522d3dc98": { + "balance": "0x7439fa2099e580000" }, - "4bac846af4169f1d95431b341d8800b22180af1a": { - "balance": "20000000000000000000" + "0x4bac846af4169f1d95431b341d8800b22180af1a": { + "balance": "0x1158e460913d00000" }, - "0514954c3c2fb657f9a06f510ea22748f027cdd3": { - "balance": "400000000000000000000" + "0x0514954c3c2fb657f9a06f510ea22748f027cdd3": { + "balance": "0x15af1d78b58c400000" }, - "163dca73d7d6ea3f3e6062322a8734180c0b78ef": { - "balance": "2941400000000000000000" + "0x163dca73d7d6ea3f3e6062322a8734180c0b78ef": { + "balance": "0x9f742003cb7dfc0000" }, - "feaca2ac74624bf348dac9985143cfd652a4be55": { - "balance": "26148245000000000000000" + "0xfeaca2ac74624bf348dac9985143cfd652a4be55": { + "balance": "0x5897fcbb02914088000" }, - "fe80e9232deaff19baf99869883a4bdf0004e53c": { - "balance": "855680000000000000000" + "0xfe80e9232deaff19baf99869883a4bdf0004e53c": { + "balance": "0x2e62f20a69be400000" }, - "17108dab2c50f99de110e1b3b3b4cd82f5df28e7": { - "balance": "980000000000000000000" + "0x17108dab2c50f99de110e1b3b3b4cd82f5df28e7": { + "balance": "0x35203b67bccad00000" }, - "837a645dc95c49549f899c4e8bcf875324b2f57c": { - "balance": "600400000000000000000" + "0x837a645dc95c49549f899c4e8bcf875324b2f57c": { + "balance": "0x208c394af1c8880000" }, - "762998e1d75227fced7a70be109a4c0b4ed86414": { - "balance": "20000000000000000000" + "0x762998e1d75227fced7a70be109a4c0b4ed86414": { + "balance": "0x1158e460913d00000" }, - "c0a7e8435dff14c25577739db55c24d5bf57a3d9": { - "balance": "49250000000000000000000" + "0xc0a7e8435dff14c25577739db55c24d5bf57a3d9": { + "balance": "0xa6dd90cae5114480000" }, - "aead88d689416b1c91f2364421375b7d3c70fb2e": { - "balance": "2000000000000000000000" + "0xaead88d689416b1c91f2364421375b7d3c70fb2e": { + "balance": "0x6c6b935b8bbd400000" }, - "9279b2228cec8f7b4dda3f320e9a0466c2f585ca": { - "balance": "5000000000000000000000" + "0x9279b2228cec8f7b4dda3f320e9a0466c2f585ca": { + "balance": "0x10f0cf064dd59200000" }, - "36726f3b885a24f92996da81625ec8ad16d8cbe6": { - "balance": "1543723000000000000000" + "0x36726f3b885a24f92996da81625ec8ad16d8cbe6": { + "balance": "0x53af75d18148578000" }, - "3951e48e3c869e6b72a143b6a45068cdb9d466d0": { - "balance": "20000000000000000000" + "0x3951e48e3c869e6b72a143b6a45068cdb9d466d0": { + "balance": "0x1158e460913d00000" }, - "f5d61ac4ca95475e5b7bffd5f2f690b316759615": { - "balance": "31040000000000000000000" + "0xf5d61ac4ca95475e5b7bffd5f2f690b316759615": { + "balance": "0x692ae8897081d000000" }, - "158a0d619253bf4432b5cd02c7b862f7c2b75636": { - "balance": "135733000000000000000" + "0x158a0d619253bf4432b5cd02c7b862f7c2b75636": { + "balance": "0x75bac7c5b12188000" }, - "e56d431324c92911a1749df292709c14b77a65cd": { - "balance": "8200000000000000000000" + "0xe56d431324c92911a1749df292709c14b77a65cd": { + "balance": "0x1bc85dc2a89bb200000" }, - "9976947eff5f6ae5da08dd541192f378b428ff94": { - "balance": "8000000000000000000000" + "0x9976947eff5f6ae5da08dd541192f378b428ff94": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "83210583c16a4e1e1dac84ebd37e3d0f7c57eba4": { - "balance": "2000000000000000000000" + "0x83210583c16a4e1e1dac84ebd37e3d0f7c57eba4": { + "balance": "0x6c6b935b8bbd400000" }, - "dcb64df43758c7cf974fa660484fbb718f8c67c1": { - "balance": "20000000000000000000000" + "0xdcb64df43758c7cf974fa660484fbb718f8c67c1": { + "balance": "0x43c33c1937564800000" }, - "d4205592844055b3c7a1f80cefe3b8eb509bcde7": { - "balance": "178973000000000000000" + "0xd4205592844055b3c7a1f80cefe3b8eb509bcde7": { + "balance": "0x9b3bfd342a9fc8000" }, - "d0648a581b3508e135a2935d12c9657045d871ca": { - "balance": "8022000000000000000000" + "0xd0648a581b3508e135a2935d12c9657045d871ca": { + "balance": "0x1b2df9d219f57980000" }, - "e7d17524d00bad82497c0f27156a647ff51d2792": { - "balance": "20000000000000000000" + "0xe7d17524d00bad82497c0f27156a647ff51d2792": { + "balance": "0x1158e460913d00000" }, - "21582e99e502cbf3d3c23bdffb76e901ac6d56b2": { - "balance": "100000000000000000000" + "0x21582e99e502cbf3d3c23bdffb76e901ac6d56b2": { + "balance": "0x56bc75e2d63100000" }, - "e61f280915c774a31d223cf80c069266e5adf19b": { - "balance": "880000000000000000000" + "0xe61f280915c774a31d223cf80c069266e5adf19b": { + "balance": "0x2fb474098f67c00000" }, - "03c91d92943603e752203e05340e566013b90045": { - "balance": "802200000000000000000" + "0x03c91d92943603e752203e05340e566013b90045": { + "balance": "0x2b7cc2e9c3225c0000" }, - "22561c5931143536309c17e832587b625c390b9a": { - "balance": "4000000000000000000000" + "0x22561c5931143536309c17e832587b625c390b9a": { + "balance": "0xd8d726b7177a800000" }, - "e399c81a1d701b44f0b66f3399e66b275aaaf8c1": { - "balance": "1000000000000000000000" + "0xe399c81a1d701b44f0b66f3399e66b275aaaf8c1": { + "balance": "0x3635c9adc5dea00000" }, - "7f8dbce180ed9c563635aad2d97b4cbc428906d9": { - "balance": "2674000000000000000000" + "0x7f8dbce180ed9c563635aad2d97b4cbc428906d9": { + "balance": "0x90f534608a72880000" }, - "9f61beb46f5e853d0a8521c7446e68e34c7d0973": { - "balance": "560000000000000000000" + "0x9f61beb46f5e853d0a8521c7446e68e34c7d0973": { + "balance": "0x1e5b8fa8fe2ac00000" }, - "6d3f2ba856ccbb0237fa7661156b14b013f21240": { - "balance": "1000000000000000000000" + "0x6d3f2ba856ccbb0237fa7661156b14b013f21240": { + "balance": "0x3635c9adc5dea00000" }, - "5f742e487e3ab81af2f94afdbe1b9b8f5ccc81bc": { - "balance": "2172412000000000000000" + "0x5f742e487e3ab81af2f94afdbe1b9b8f5ccc81bc": { + "balance": "0x75c445d41163e60000" }, - "b600feab4aa96c537504d96057223141692c193a": { - "balance": "400000000000000000000" + "0xb600feab4aa96c537504d96057223141692c193a": { + "balance": "0x15af1d78b58c400000" }, - "fab487500df20fb83ebed916791d561772adbebf": { - "balance": "1999980000000000000000" + "0xfab487500df20fb83ebed916791d561772adbebf": { + "balance": "0x6c6b4c4da6ddbe0000" }, - "f8704c16d2fd5ba3a2c01d0eb20484e6ecfa3109": { - "balance": "200000000000000000000" + "0xf8704c16d2fd5ba3a2c01d0eb20484e6ecfa3109": { + "balance": "0xad78ebc5ac6200000" }, - "3f1bc420c53c002c9e90037c44fe6a8ef4ddc962": { - "balance": "173000000000000000000" + "0x3f1bc420c53c002c9e90037c44fe6a8ef4ddc962": { + "balance": "0x960db77681e940000" }, - "82e577b515cb2b0860aafe1ce09a59e09fe7d040": { - "balance": "600000000000000000000" + "0x82e577b515cb2b0860aafe1ce09a59e09fe7d040": { + "balance": "0x2086ac351052600000" }, - "bc999e385c5aebcac8d6f3f0d60d5aa725336d0d": { - "balance": "2000000000000000000000" + "0xbc999e385c5aebcac8d6f3f0d60d5aa725336d0d": { + "balance": "0x6c6b935b8bbd400000" }, - "e16ce35961cd74bd590d04c4ad4a1989e05691c6": { - "balance": "146000000000000000000" + "0xe16ce35961cd74bd590d04c4ad4a1989e05691c6": { + "balance": "0x7ea28327577080000" }, - "eb76424c0fd597d3e341a9642ad1ee118b2b579d": { - "balance": "4000000000000000000000" + "0xeb76424c0fd597d3e341a9642ad1ee118b2b579d": { + "balance": "0xd8d726b7177a800000" }, - "c440c7ca2f964b6972ef664a2261dde892619d9c": { - "balance": "20000000000000000000000" + "0xc440c7ca2f964b6972ef664a2261dde892619d9c": { + "balance": "0x43c33c1937564800000" }, - "460d5355b2ceeb6e62107d81e51270b26bf45620": { - "balance": "2005500000000000000000" + "0x460d5355b2ceeb6e62107d81e51270b26bf45620": { + "balance": "0x6cb7e74867d5e60000" }, - "fcada300283f6bcc134a91456760b0d77de410e0": { - "balance": "2000000000000000000000" + "0xfcada300283f6bcc134a91456760b0d77de410e0": { + "balance": "0x6c6b935b8bbd400000" }, - "be8d7f18adfe5d6cc775394989e1930c979d007d": { - "balance": "1000000000000000000000" + "0xbe8d7f18adfe5d6cc775394989e1930c979d007d": { + "balance": "0x3635c9adc5dea00000" }, - "a7f9220c8047826bd5d5183f4e676a6d77bfed36": { - "balance": "153368000000000000000" + "0xa7f9220c8047826bd5d5183f4e676a6d77bfed36": { + "balance": "0x85068976be81c0000" }, - "98d204f9085f8c8e7de23e589b64c6eff692cc63": { - "balance": "2000000000000000000000" + "0x98d204f9085f8c8e7de23e589b64c6eff692cc63": { + "balance": "0x6c6b935b8bbd400000" }, - "5a2916b8d2e8cc12e207ab464d433e2370d823d9": { - "balance": "2000000000000000000000" + "0x5a2916b8d2e8cc12e207ab464d433e2370d823d9": { + "balance": "0x6c6b935b8bbd400000" }, - "c42d6aeb710e3a50bfb44d6c31092969a11aa7f3": { - "balance": "150052000000000000000" + "0xc42d6aeb710e3a50bfb44d6c31092969a11aa7f3": { + "balance": "0x82263cafd8cea0000" }, - "04ce45f600db18a9d0851b29d9393ebdaafe3dc5": { - "balance": "20000000000000000000" + "0x04ce45f600db18a9d0851b29d9393ebdaafe3dc5": { + "balance": "0x1158e460913d00000" }, - "7a1370a742ec2687e761a19ac5a794329ee67404": { - "balance": "2999988000000000000000" + "0x7a1370a742ec2687e761a19ac5a794329ee67404": { + "balance": "0xa2a1326761e2920000" }, - "da2ad58e77deddede2187646c465945a8dc3f641": { - "balance": "660000000000000000000" + "0xda2ad58e77deddede2187646c465945a8dc3f641": { + "balance": "0x23c757072b8dd00000" }, - "ec58bc0d0c20d8f49465664153c5c196fe59e6be": { - "balance": "400000000000000000000" + "0xec58bc0d0c20d8f49465664153c5c196fe59e6be": { + "balance": "0x15af1d78b58c400000" }, - "f8063af4cc1dd9619ab5d8bff3fcd1faa8488221": { - "balance": "2000000000000000000000" + "0xf8063af4cc1dd9619ab5d8bff3fcd1faa8488221": { + "balance": "0x6c6b935b8bbd400000" }, - "b9231eb26e5f9e4b4d288f03906704fab96c87d6": { - "balance": "19700000000000000000000" + "0xb9231eb26e5f9e4b4d288f03906704fab96c87d6": { + "balance": "0x42bf06b78ed3b500000" }, - "6e5c2d9b1c546a86eefd5d0a5120c9e4e730190e": { - "balance": "199600000000000000000" + "0x6e5c2d9b1c546a86eefd5d0a5120c9e4e730190e": { + "balance": "0xad201a6794ff80000" }, - "e49936a92a8ccf710eaac342bc454b9b14ebecb1": { - "balance": "2000000000000000000000" + "0xe49936a92a8ccf710eaac342bc454b9b14ebecb1": { + "balance": "0x6c6b935b8bbd400000" }, - "21dbdb817a0d8404c6bdd61504374e9c43c9210e": { - "balance": "9999917000000000000000" + "0x21dbdb817a0d8404c6bdd61504374e9c43c9210e": { + "balance": "0x21e18b9e9ab45e48000" }, - "5cebe30b2a95f4aefda665651dc0cf7ef5758199": { - "balance": "18200000000000000000" + "0x5cebe30b2a95f4aefda665651dc0cf7ef5758199": { + "balance": "0xfc936392801c0000" }, - "597038ff91a0900cbbab488af483c790e6ec00a0": { - "balance": "10000000000000000000000" + "0x597038ff91a0900cbbab488af483c790e6ec00a0": { + "balance": "0x21e19e0c9bab2400000" }, - "0fa5d8c5b3f294efd495ab69d768f81872508548": { - "balance": "2000000000000000000000" + "0x0fa5d8c5b3f294efd495ab69d768f81872508548": { + "balance": "0x6c6b935b8bbd400000" }, - "feef3b6eabc94affd3310c1c4d0e65375e131119": { - "balance": "20000000000000000000" + "0xfeef3b6eabc94affd3310c1c4d0e65375e131119": { + "balance": "0x1158e460913d00000" }, - "1ce81d31a7923022e125bf48a3e03693b98dc9dd": { - "balance": "2000000000000000000000" + "0x1ce81d31a7923022e125bf48a3e03693b98dc9dd": { + "balance": "0x6c6b935b8bbd400000" }, - "5887dc6a33dfed5ac1edefe35ef91a216231ac96": { - "balance": "250000000000000000000" + "0x5887dc6a33dfed5ac1edefe35ef91a216231ac96": { + "balance": "0xd8d726b7177a80000" }, - "4e8e47ae3b1ef50c9d54a38e14208c1abd3603c2": { - "balance": "2235000000000000000000" + "0x4e8e47ae3b1ef50c9d54a38e14208c1abd3603c2": { + "balance": "0x7928db1276660c0000" }, - "e845e387c4cbdf982280f6aa01c40e4be958ddb2": { - "balance": "25000000000000000000000" + "0xe845e387c4cbdf982280f6aa01c40e4be958ddb2": { + "balance": "0x54b40b1f852bda00000" }, - "71d9494e50c5dd59c599dba3810ba1755e6537f0": { - "balance": "4000000000000000000000" + "0x71d9494e50c5dd59c599dba3810ba1755e6537f0": { + "balance": "0xd8d726b7177a800000" }, - "6eb5578a6bb7c32153195b0d8020a6914852c059": { - "balance": "660000000000000000000000" + "0x6eb5578a6bb7c32153195b0d8020a6914852c059": { + "balance": "0x8bc2abf40221f4800000" }, - "543f8c674e2462d8d5daa0e80195a8708e11a29e": { - "balance": "63940000000000000000" + "0x543f8c674e2462d8d5daa0e80195a8708e11a29e": { + "balance": "0x37758833b3a7a0000" }, - "a0459ef3693aacd1647cd5d8929839204cef53be": { - "balance": "1000000000000000000000" + "0xa0459ef3693aacd1647cd5d8929839204cef53be": { + "balance": "0x3635c9adc5dea00000" }, - "dda371e600d30688d4710e088e02fdf2b9524d5f": { - "balance": "6920000000000000000000" + "0xdda371e600d30688d4710e088e02fdf2b9524d5f": { + "balance": "0x177224aa844c7200000" }, - "dd4dd6d36033b0636fcc8d0938609f4dd64f4a86": { - "balance": "60000000000000000000" + "0xdd4dd6d36033b0636fcc8d0938609f4dd64f4a86": { + "balance": "0x340aad21b3b700000" }, - "3bd624b548cb659736907ed8aa3c0c705e24b575": { - "balance": "2000000000000000000000" + "0x3bd624b548cb659736907ed8aa3c0c705e24b575": { + "balance": "0x6c6b935b8bbd400000" }, - "414599092e879ae25372a84d735af5c4e510cd6d": { - "balance": "400000000000000000000" + "0x414599092e879ae25372a84d735af5c4e510cd6d": { + "balance": "0x15af1d78b58c400000" }, - "3d66cd4bd64d5c8c1b5eea281e106d1c5aad2373": { - "balance": "1951100000000000000000" + "0x3d66cd4bd64d5c8c1b5eea281e106d1c5aad2373": { + "balance": "0x69c4f3a8a110a60000" }, - "5948bc3650ed519bf891a572679fd992f8780c57": { - "balance": "197000000000000000000" + "0x5948bc3650ed519bf891a572679fd992f8780c57": { + "balance": "0xaadec983fcff40000" }, - "8b74a7cb1bb8c58fce267466a30358adaf527f61": { - "balance": "13620000000000000000000" + "0x8b74a7cb1bb8c58fce267466a30358adaf527f61": { + "balance": "0x2e257784e25b4500000" }, - "3f10800282d1b7ddc78fa92d8230074e1bf6aeae": { - "balance": "4925000000000000000000" + "0x3f10800282d1b7ddc78fa92d8230074e1bf6aeae": { + "balance": "0x10afc1ade3b4ed40000" }, - "32dbb6716c54e83165829a4abb36757849b6e47d": { - "balance": "1000000000000000000000" + "0x32dbb6716c54e83165829a4abb36757849b6e47d": { + "balance": "0x3635c9adc5dea00000" }, - "e6b3ac3f5d4da5a8857d0b3f30fc4b2b692b77d7": { - "balance": "1460000000000000000000" + "0xe6b3ac3f5d4da5a8857d0b3f30fc4b2b692b77d7": { + "balance": "0x4f2591f896a6500000" }, - "052a58e035f1fe9cdd169bcf20970345d12b9c51": { - "balance": "1490000000000000000000" + "0x052a58e035f1fe9cdd169bcf20970345d12b9c51": { + "balance": "0x50c5e761a444080000" }, - "581bdf1bb276dbdd86aedcdb397a01efc0e00c5b": { - "balance": "1000000000000000000000" + "0x581bdf1bb276dbdd86aedcdb397a01efc0e00c5b": { + "balance": "0x3635c9adc5dea00000" }, - "604e9477ebf4727c745bcabbedcb6ccf29994022": { - "balance": "1000060000000000000000" + "0x604e9477ebf4727c745bcabbedcb6ccf29994022": { + "balance": "0x36369ed7747d260000" }, - "59b96deb8784885d8d3b4a166143cc435d2555a1": { - "balance": "1337000000000000000000" + "0x59b96deb8784885d8d3b4a166143cc435d2555a1": { + "balance": "0x487a9a304539440000" }, - "37d980a12ee3bf23cc5cdb63b4ae45691f74c837": { - "balance": "2000000000000000000000" + "0x37d980a12ee3bf23cc5cdb63b4ae45691f74c837": { + "balance": "0x6c6b935b8bbd400000" }, - "3bfbd3847c17a61cf3f17b52f8eba1b960b3f39f": { - "balance": "3000000000000000000000" + "0x3bfbd3847c17a61cf3f17b52f8eba1b960b3f39f": { + "balance": "0xa2a15d09519be00000" }, - "49c941e0e5018726b7290fc473b471d41dae80d1": { - "balance": "500000000000000000000" + "0x49c941e0e5018726b7290fc473b471d41dae80d1": { + "balance": "0x1b1ae4d6e2ef500000" }, - "f26bcedce3feadcea3bc3e96eb1040dfd8ffe1a0": { - "balance": "775000000000000000000" + "0xf26bcedce3feadcea3bc3e96eb1040dfd8ffe1a0": { + "balance": "0x2a034919dfbfbc0000" }, - "d0944aa185a1337061ae20dc9dd96c83b2ba4602": { - "balance": "200000000000000000000" + "0xd0944aa185a1337061ae20dc9dd96c83b2ba4602": { + "balance": "0xad78ebc5ac6200000" }, - "904caa429c619d940f8e6741826a0db692b19728": { - "balance": "1000000000000000000000" + "0x904caa429c619d940f8e6741826a0db692b19728": { + "balance": "0x3635c9adc5dea00000" }, - "b95c9b10aa981cf4a67a71cc52c504dee8cf58bd": { - "balance": "4000000000000000000000" + "0xb95c9b10aa981cf4a67a71cc52c504dee8cf58bd": { + "balance": "0xd8d726b7177a800000" }, - "15874686b6733d10d703c9f9bec6c52eb8628d67": { - "balance": "2000000000000000000000" + "0x15874686b6733d10d703c9f9bec6c52eb8628d67": { + "balance": "0x6c6b935b8bbd400000" }, - "1374facd7b3f8d68649d60d4550ee69ff0484133": { - "balance": "269700000000000000000" + "0x1374facd7b3f8d68649d60d4550ee69ff0484133": { + "balance": "0xe9ed6e11172da0000" }, - "b0e469c886593815b3495638595daef0665fae62": { - "balance": "1940000000000000000000" + "0xb0e469c886593815b3495638595daef0665fae62": { + "balance": "0x692ae8897081d00000" }, - "47ff6feb43212060bb1503d7a397fc08f4e70352": { - "balance": "2000000000000000000000" + "0x47ff6feb43212060bb1503d7a397fc08f4e70352": { + "balance": "0x6c6b935b8bbd400000" }, - "c60b04654e003b4683041f1cbd6bc38fda7cdbd6": { - "balance": "2000000000000000000000" + "0xc60b04654e003b4683041f1cbd6bc38fda7cdbd6": { + "balance": "0x6c6b935b8bbd400000" }, - "3ecdb532e397579662b2a46141e78f8235936a5f": { - "balance": "66850000000000000000" + "0x3ecdb532e397579662b2a46141e78f8235936a5f": { + "balance": "0x39fbae8d042dd0000" }, - "b3a8c2cb7d358e5739941d945ba9045a023a8bbb": { - "balance": "1000000000000000000000" + "0xb3a8c2cb7d358e5739941d945ba9045a023a8bbb": { + "balance": "0x3635c9adc5dea00000" }, - "32ef5cdc671df5562a901aee5db716b9be76dcf6": { - "balance": "2000000000000000000000" + "0x32ef5cdc671df5562a901aee5db716b9be76dcf6": { + "balance": "0x6c6b935b8bbd400000" }, - "c94110e71afe578aa218e4fc286403b0330ace8d": { - "balance": "2000000000000000000000" + "0xc94110e71afe578aa218e4fc286403b0330ace8d": { + "balance": "0x6c6b935b8bbd400000" }, - "9b43dcb95fde318075a567f1e6b57617055ef9e8": { - "balance": "3940000000000000000000" + "0x9b43dcb95fde318075a567f1e6b57617055ef9e8": { + "balance": "0xd5967be4fc3f100000" }, - "efeea010756f81da4ba25b721787f058170befbd": { - "balance": "32470000000000000000" + "0xefeea010756f81da4ba25b721787f058170befbd": { + "balance": "0x1c29c9cf770ef0000" }, - "c88255eddcf521c6f81d97f5a42181c9073d4ef1": { - "balance": "290793000000000000000" + "0xc88255eddcf521c6f81d97f5a42181c9073d4ef1": { + "balance": "0xfc39044d00a2a8000" }, - "dd47189a3e64397167f0620e484565b762bfbbf4": { - "balance": "1850000000000000000000" + "0xdd47189a3e64397167f0620e484565b762bfbbf4": { + "balance": "0x6449e84e47a8a80000" }, - "82f39b2758ae42277b86d69f75e628d958ebcab0": { - "balance": "40000000000000000000000" + "0x82f39b2758ae42277b86d69f75e628d958ebcab0": { + "balance": "0x878678326eac9000000" }, - "e37f5fdc6ec97d2f866a1cfd0d3a4da4387b22b5": { - "balance": "10000000000000000000000" + "0xe37f5fdc6ec97d2f866a1cfd0d3a4da4387b22b5": { + "balance": "0x21e19e0c9bab2400000" }, - "62331df2a3cbee3520e911dea9f73e905f892505": { - "balance": "2000000000000000000000" + "0x62331df2a3cbee3520e911dea9f73e905f892505": { + "balance": "0x6c6b935b8bbd400000" }, - "8c5d16ed65e3ed7e8b96ca972bc86173e3500b03": { - "balance": "2000000000000000000000" + "0x8c5d16ed65e3ed7e8b96ca972bc86173e3500b03": { + "balance": "0x6c6b935b8bbd400000" }, - "8b9841862e77fbbe919470935583a93cf027e450": { - "balance": "2000054000000000000000" + "0x8b9841862e77fbbe919470935583a93cf027e450": { + "balance": "0x6c6c5334427f1f0000" }, - "c8dd27f16bf22450f5771b9fe4ed4ffcb30936f4": { - "balance": "197000000000000000000" + "0xc8dd27f16bf22450f5771b9fe4ed4ffcb30936f4": { + "balance": "0xaadec983fcff40000" }, - "dec8a1a898f1b895d8301fe64ab3ad5de941f689": { - "balance": "787803000000000000000" + "0xdec8a1a898f1b895d8301fe64ab3ad5de941f689": { + "balance": "0x2ab4f67e8a730f8000" }, - "61c4ee7c864c4d6b5e37ea1331c203739e826b2f": { - "balance": "30063000000000000000" + "0x61c4ee7c864c4d6b5e37ea1331c203739e826b2f": { + "balance": "0x1a1353b382a918000" }, - "3250e3e858c26adeccadf36a5663c22aa84c4170": { - "balance": "5000000000000000000000" + "0x3250e3e858c26adeccadf36a5663c22aa84c4170": { + "balance": "0x10f0cf064dd59200000" }, - "299e0bca55e069de8504e89aca6eca21d38a9a5d": { - "balance": "55500000000000000000" + "0x299e0bca55e069de8504e89aca6eca21d38a9a5d": { + "balance": "0x302379bf2ca2e0000" }, - "d50f7fa03e389876d3908b60a537a6706304fb56": { - "balance": "100000000000000000000" + "0xd50f7fa03e389876d3908b60a537a6706304fb56": { + "balance": "0x56bc75e2d63100000" }, - "69073269729e6414b26ec8dc0fd935c73b579f1e": { - "balance": "30000000000000000000000" + "0x69073269729e6414b26ec8dc0fd935c73b579f1e": { + "balance": "0x65a4da25d3016c00000" }, - "14fcd1391e7d732f41766cdacd84fa1deb9ffdd2": { - "balance": "2000000000000000000000" + "0x14fcd1391e7d732f41766cdacd84fa1deb9ffdd2": { + "balance": "0x6c6b935b8bbd400000" }, - "823768746737ce6da312d53e54534e106f967cf3": { - "balance": "20000000000000000000" + "0x823768746737ce6da312d53e54534e106f967cf3": { + "balance": "0x1158e460913d00000" }, - "882f75708386653c80171d0663bfe30b017ed0ad": { - "balance": "2000000000000000000000" + "0x882f75708386653c80171d0663bfe30b017ed0ad": { + "balance": "0x6c6b935b8bbd400000" }, - "a25b086437fd2192d0a0f64f6ed044f38ef3da32": { - "balance": "335000000000000000000" + "0xa25b086437fd2192d0a0f64f6ed044f38ef3da32": { + "balance": "0x12290f15180bdc0000" }, - "5a9c8b69fc614d69564999b00dcb42db67f97e90": { - "balance": "3429227000000000000000" + "0x5a9c8b69fc614d69564999b00dcb42db67f97e90": { + "balance": "0xb9e615abad3a778000" }, - "a2b701f9f5cdd09e4ba62baebae3a88257105885": { - "balance": "1000000000000000000000" + "0xa2b701f9f5cdd09e4ba62baebae3a88257105885": { + "balance": "0x3635c9adc5dea00000" }, - "5e7b8c54dc57b0402062719dee7ef5e37ea35d62": { - "balance": "2877224000000000000000" + "0x5e7b8c54dc57b0402062719dee7ef5e37ea35d62": { + "balance": "0x9bf9810fd05c840000" }, - "7ffabfbc390cbe43ce89188f0868b27dcb0f0cad": { - "balance": "6370000000000000000000" + "0x7ffabfbc390cbe43ce89188f0868b27dcb0f0cad": { + "balance": "0x1595182224b26480000" }, - "b5cdbc4115406f52e5aa85d0fea170d2979cc7ba": { - "balance": "1337000000000000000000" + "0xb5cdbc4115406f52e5aa85d0fea170d2979cc7ba": { + "balance": "0x487a9a304539440000" }, - "263814309de4e635cf585e0d365477fc40e66cf7": { - "balance": "146000000000000000000" + "0x263814309de4e635cf585e0d365477fc40e66cf7": { + "balance": "0x7ea28327577080000" }, - "24cff0e9336a9f80f9b1cb968caf6b1d1c4932a4": { - "balance": "200200000000000000000" + "0x24cff0e9336a9f80f9b1cb968caf6b1d1c4932a4": { + "balance": "0xada55474b81340000" }, - "d3a941c961e8ca8b1070f23c6d6d0d2a758a4444": { - "balance": "200000000000000000000" + "0xd3a941c961e8ca8b1070f23c6d6d0d2a758a4444": { + "balance": "0xad78ebc5ac6200000" }, - "a97beb3a48c45f1528284cb6a95f7de453358ec6": { - "balance": "31000000000000000000000" + "0xa97beb3a48c45f1528284cb6a95f7de453358ec6": { + "balance": "0x690836c0af5f5600000" }, - "4dd131c74a068a37c90aded4f309c2409f6478d3": { - "balance": "400008000000000000000" + "0x4dd131c74a068a37c90aded4f309c2409f6478d3": { + "balance": "0x15af39e4aab2740000" }, - "653675b842d7d8b461f722b4117cb81dac8e639d": { - "balance": "31000000000000000000" + "0x653675b842d7d8b461f722b4117cb81dac8e639d": { + "balance": "0x1ae361fc1451c0000" }, - "561be9299b3e6b3e63b79b09169d1a948ae6db01": { - "balance": "500000000000000000000" + "0x561be9299b3e6b3e63b79b09169d1a948ae6db01": { + "balance": "0x1b1ae4d6e2ef500000" }, - "dc067ed3e12d711ed475f5156ef7e71a80d934b9": { - "balance": "9550000000000000000000" + "0xdc067ed3e12d711ed475f5156ef7e71a80d934b9": { + "balance": "0x205b4dfa1ee74780000" }, - "08d97eadfcb7b064e1ccd9c8979fbee5e77a9719": { - "balance": "266063000000000000000" + "0x08d97eadfcb7b064e1ccd9c8979fbee5e77a9719": { + "balance": "0xe6c5da8d67ac18000" }, - "6e4c2ab7db026939dbd3bc68384af660a61816b2": { - "balance": "167000000000000000000" + "0x6e4c2ab7db026939dbd3bc68384af660a61816b2": { + "balance": "0x90d972f32323c0000" }, - "bf4c73a7ede7b164fe072114843654e4d8781dde": { - "balance": "2000000000000000000000" + "0xbf4c73a7ede7b164fe072114843654e4d8781dde": { + "balance": "0x6c6b935b8bbd400000" }, - "f504943aaf16796e0b341bbcdf21d11cc586cdd1": { - "balance": "9000000000000000000000" + "0xf504943aaf16796e0b341bbcdf21d11cc586cdd1": { + "balance": "0x1e7e4171bf4d3a00000" }, - "ea81ca8638540cd9d4d73d060f2cebf2241ffc3e": { - "balance": "1970000000000000000000" + "0xea81ca8638540cd9d4d73d060f2cebf2241ffc3e": { + "balance": "0x6acb3df27e1f880000" }, - "9944fee9d34a4a880023c78932c00b59d5c82a82": { - "balance": "750022000000000000000" + "0x9944fee9d34a4a880023c78932c00b59d5c82a82": { + "balance": "0x28a8a56b3690070000" }, - "12f460ae646cd2780fd35c50a6af4b9accfa85c6": { - "balance": "1000000000000000000000" + "0x12f460ae646cd2780fd35c50a6af4b9accfa85c6": { + "balance": "0x3635c9adc5dea00000" }, - "4e232d53b3e6be8f895361d31c34d4762b12c82e": { - "balance": "1760000000000000000000" + "0x4e232d53b3e6be8f895361d31c34d4762b12c82e": { + "balance": "0x5f68e8131ecf800000" }, - "6bb2aca23fa1626d18efd6777fb97db02d8e0ae4": { - "balance": "40000000000000000000000" + "0x6bb2aca23fa1626d18efd6777fb97db02d8e0ae4": { + "balance": "0x878678326eac9000000" }, - "bc4e471560c99c8a2a4b1b1ad0c36aa6502b7c4b": { - "balance": "12000000000000000000000" + "0xbc4e471560c99c8a2a4b1b1ad0c36aa6502b7c4b": { + "balance": "0x28a857425466f800000" }, - "2e2cbd7ad82547b4f5ff8b3ab56f942a6445a3b0": { - "balance": "200000000000000000000" + "0x2e2cbd7ad82547b4f5ff8b3ab56f942a6445a3b0": { + "balance": "0xad78ebc5ac6200000" }, - "21ecb2dfa65779c7592d041cd2105a81f4fd4e46": { - "balance": "1000000000000000000000" + "0x21ecb2dfa65779c7592d041cd2105a81f4fd4e46": { + "balance": "0x3635c9adc5dea00000" }, - "34318625818ec13f11835ae97353ce377d6f590a": { - "balance": "1520000000000000000000" + "0x34318625818ec13f11835ae97353ce377d6f590a": { + "balance": "0x52663ccab1e1c00000" }, - "a7ef35ce87eda6c28df248785815053ec97a5045": { - "balance": "4999998000000000000000" + "0xa7ef35ce87eda6c28df248785815053ec97a5045": { + "balance": "0x10f0ce949e00f930000" }, - "6a514e6242f6b68c137e97fea1e78eb555a7e5f7": { - "balance": "20000000000000000000" + "0x6a514e6242f6b68c137e97fea1e78eb555a7e5f7": { + "balance": "0x1158e460913d00000" }, - "9340b5f678e45ee05eb708bb7abb6ec8f08f1b6b": { - "balance": "6000000000000000000000" + "0x9340b5f678e45ee05eb708bb7abb6ec8f08f1b6b": { + "balance": "0x14542ba12a337c00000" }, - "43cc08d0732aa58adef7619bed46558ad7774173": { - "balance": "4443926000000000000000" + "0x43cc08d0732aa58adef7619bed46558ad7774173": { + "balance": "0xf0e7dcb0122a8f0000" }, - "12e9a4ad2ad57484dd700565bddb46423bd9bd31": { - "balance": "19999800000000000000000" + "0x12e9a4ad2ad57484dd700565bddb46423bd9bd31": { + "balance": "0x43c30fb0884a96c0000" }, - "ebbeeb259184a6e01cccfc2207bbd883785ac90a": { - "balance": "619966000000000000000" + "0xebbeeb259184a6e01cccfc2207bbd883785ac90a": { + "balance": "0x219bc1b04783d30000" }, - "704ab1150d5e10f5e3499508f0bf70650f028d4b": { - "balance": "4000000000000000000000" + "0x704ab1150d5e10f5e3499508f0bf70650f028d4b": { + "balance": "0xd8d726b7177a800000" }, - "fc361105dd90f9ede566499d69e9130395f12ac8": { - "balance": "395000000000000000000000" + "0xfc361105dd90f9ede566499d69e9130395f12ac8": { + "balance": "0x53a4fe2f204e80e00000" }, - "c1b9a5704d351cfe983f79abeec3dbbbae3bb629": { - "balance": "20000000000000000000" + "0xc1b9a5704d351cfe983f79abeec3dbbbae3bb629": { + "balance": "0x1158e460913d00000" }, - "66f50406eb1b11a946cab45927cca37470e5a208": { - "balance": "2000000000000000000000" + "0x66f50406eb1b11a946cab45927cca37470e5a208": { + "balance": "0x6c6b935b8bbd400000" }, - "53942e7949d6788bb780a7e8a0792781b1614b84": { - "balance": "15899600000000000000000" + "0x53942e7949d6788bb780a7e8a0792781b1614b84": { + "balance": "0x35deb46684f10c80000" }, - "32ba9a7d0423e03a525fe2ebeb661d2085778bd8": { - "balance": "20000000000000000000000" + "0x32ba9a7d0423e03a525fe2ebeb661d2085778bd8": { + "balance": "0x43c33c1937564800000" }, - "11c0358aa6479de21866fe21071924b65e70f8b9": { - "balance": "36400000000000000000000" + "0x11c0358aa6479de21866fe21071924b65e70f8b9": { + "balance": "0x7b53f79e888dac00000" }, - "76cb9c8b69f4387675c48253e234cb7e0d74a426": { - "balance": "7396300000000000000000" + "0x76cb9c8b69f4387675c48253e234cb7e0d74a426": { + "balance": "0x190f4482eb91dae0000" }, - "9f5f44026b576a4adb41e95961561d41039ca391": { - "balance": "250000000000000000000" + "0x9f5f44026b576a4adb41e95961561d41039ca391": { + "balance": "0xd8d726b7177a80000" }, - "533a73a4a2228eee05c4ffd718bbf3f9c1b129a7": { - "balance": "6000000000000000000000" + "0x533a73a4a2228eee05c4ffd718bbf3f9c1b129a7": { + "balance": "0x14542ba12a337c00000" }, - "dcc52d8f8d9fc742a8b82767f0555387c563efff": { - "balance": "500000000000000000000" + "0xdcc52d8f8d9fc742a8b82767f0555387c563efff": { + "balance": "0x1b1ae4d6e2ef500000" }, - "f456a75bb99655a7412ce97da081816dfdb2b1f2": { - "balance": "200000000000000000000" + "0xf456a75bb99655a7412ce97da081816dfdb2b1f2": { + "balance": "0xad78ebc5ac6200000" }, - "d0c101fd1f01c63f6b1d19bc920d9f932314b136": { - "balance": "20000000000000000000000" + "0xd0c101fd1f01c63f6b1d19bc920d9f932314b136": { + "balance": "0x43c33c1937564800000" }, - "dabc225042a6592cfa13ebe54efa41040878a5a2": { - "balance": "259550000000000000000" + "0xdabc225042a6592cfa13ebe54efa41040878a5a2": { + "balance": "0xe11fad5d85ca30000" }, - "38eec6e217f4d41aa920e424b9525197041cd4c6": { - "balance": "4428166000000000000000" + "0x38eec6e217f4d41aa920e424b9525197041cd4c6": { + "balance": "0xf00d25eb922e670000" }, - "8a247d186510809f71cffc4559471c3910858121": { - "balance": "1790000000000000000000" + "0x8a247d186510809f71cffc4559471c3910858121": { + "balance": "0x61093d7c2c6d380000" }, - "4f152b2fb8659d43776ebb1e81673aa84169be96": { - "balance": "2000000000000000000000" + "0x4f152b2fb8659d43776ebb1e81673aa84169be96": { + "balance": "0x6c6b935b8bbd400000" }, - "b4496ddb27799a222457d73979116728e8a1845b": { - "balance": "2610331000000000000000" + "0xb4496ddb27799a222457d73979116728e8a1845b": { + "balance": "0x8d819ea65fa62f8000" }, - "4a4053b31d0ee5dbafb1d06bd7ac7ff3222c47d6": { - "balance": "1400000000000000000000" + "0x4a4053b31d0ee5dbafb1d06bd7ac7ff3222c47d6": { + "balance": "0x4be4e7267b6ae00000" }, - "0f7bea4ef3f73ae0233df1e100718cbe29310bb0": { - "balance": "2000000000000000000000" + "0x0f7bea4ef3f73ae0233df1e100718cbe29310bb0": { + "balance": "0x6c6b935b8bbd400000" }, - "c836e24a6fcf29943b3608e662290a215f6529ea": { - "balance": "292000000000000000000" + "0xc836e24a6fcf29943b3608e662290a215f6529ea": { + "balance": "0xfd45064eaee100000" }, - "1765361c2ec2f83616ce8363aae21025f2566f40": { - "balance": "5000000000000000000000" + "0x1765361c2ec2f83616ce8363aae21025f2566f40": { + "balance": "0x10f0cf064dd59200000" }, - "b6e6c3222b6b6f9be2875d2a89f127fb64100fe2": { - "balance": "8008000000000000000000" + "0xb6e6c3222b6b6f9be2875d2a89f127fb64100fe2": { + "balance": "0x1b21d5323cc30200000" }, - "01bbc14f67af0639aab1441e6a08d4ce7162090f": { - "balance": "1309500000000000000000" + "0x01bbc14f67af0639aab1441e6a08d4ce7162090f": { + "balance": "0x46fcf68ff8be060000" }, - "af2058c7282cf67c8c3cf930133c89617ce75d29": { - "balance": "6920000000000000000000" + "0xaf2058c7282cf67c8c3cf930133c89617ce75d29": { + "balance": "0x177224aa844c7200000" }, - "464d9c89cce484df000277198ed8075fa63572d1": { - "balance": "20000000000000000000" + "0x464d9c89cce484df000277198ed8075fa63572d1": { + "balance": "0x1158e460913d00000" }, - "50cd97e9378b5cf18f173963236c9951ef7438a5": { - "balance": "1400000000000000000000" + "0x50cd97e9378b5cf18f173963236c9951ef7438a5": { + "balance": "0x4be4e7267b6ae00000" }, - "cb47bd30cfa8ec5468aaa6a94642ced9c819c8d4": { - "balance": "4000000000000000000000" + "0xcb47bd30cfa8ec5468aaa6a94642ced9c819c8d4": { + "balance": "0xd8d726b7177a800000" }, - "6b10f8f8b3e3b60de90aa12d155f9ff5ffb22c50": { - "balance": "2000000000000000000000" + "0x6b10f8f8b3e3b60de90aa12d155f9ff5ffb22c50": { + "balance": "0x6c6b935b8bbd400000" }, - "09b7a988d13ff89186736f03fdf46175b53d16e0": { - "balance": "6000000000000000000000" + "0x09b7a988d13ff89186736f03fdf46175b53d16e0": { + "balance": "0x14542ba12a337c00000" }, - "5bfafe97b1dd1d712be86d41df79895345875a87": { - "balance": "500000000000000000000" + "0x5bfafe97b1dd1d712be86d41df79895345875a87": { + "balance": "0x1b1ae4d6e2ef500000" }, - "a06cd1f396396c0a64464651d7c205efaf387ca3": { - "balance": "1999944000000000000000" + "0xa06cd1f396396c0a64464651d7c205efaf387ca3": { + "balance": "0x6c6acc67d7b1d40000" }, - "fc0096b21e95acb8d619d176a4a1d8d529badbef": { - "balance": "384601000000000000000" + "0xfc0096b21e95acb8d619d176a4a1d8d529badbef": { + "balance": "0x14d9693bcbec028000" }, - "a74444f90fbb54e56f3ac9b6cfccaa4819e4614a": { - "balance": "20000000000000000000" + "0xa74444f90fbb54e56f3ac9b6cfccaa4819e4614a": { + "balance": "0x1158e460913d00000" }, - "3c15b3511df6f0342e7348cc89af39a168b7730f": { - "balance": "1000000000000000000000" + "0x3c15b3511df6f0342e7348cc89af39a168b7730f": { + "balance": "0x3635c9adc5dea00000" }, - "3d6ff82c9377059fb30d9215723f60c775c891fe": { - "balance": "250066000000000000000" + "0x3d6ff82c9377059fb30d9215723f60c775c891fe": { + "balance": "0xd8e5ce617f2d50000" }, - "a524a8cccc49518d170a328270a2f88133fbaf5d": { - "balance": "294500000000000000000" + "0xa524a8cccc49518d170a328270a2f88133fbaf5d": { + "balance": "0xff7022dac108a0000" }, - "8a7a06be199a3a58019d846ac9cbd4d95dd757de": { - "balance": "3000200000000000000000" + "0x8a7a06be199a3a58019d846ac9cbd4d95dd757de": { + "balance": "0xa2a423944256f40000" }, - "d744ac7e5310be696a63b003c40bd039370561c6": { - "balance": "1670000000000000000000" + "0xd744ac7e5310be696a63b003c40bd039370561c6": { + "balance": "0x5a87e7d7f5f6580000" }, - "fe362688845fa244cc807e4b1130eb3741a8051e": { - "balance": "1000000000000000000000" + "0xfe362688845fa244cc807e4b1130eb3741a8051e": { + "balance": "0x3635c9adc5dea00000" }, - "b2d0360515f17daba90fcbac8205d569b915d6ac": { - "balance": "6000000000000000000000" + "0xb2d0360515f17daba90fcbac8205d569b915d6ac": { + "balance": "0x14542ba12a337c00000" }, - "c53594c7cfb2a08f284cc9d7a63bbdfc0b319732": { - "balance": "49200000000000000000000" + "0xc53594c7cfb2a08f284cc9d7a63bbdfc0b319732": { + "balance": "0xa6b2328ff3a62c00000" }, - "b3c228731d186d2ded5b5fbe004c666c8e469b86": { - "balance": "29000000000000000000" + "0xb3c228731d186d2ded5b5fbe004c666c8e469b86": { + "balance": "0x19274b259f6540000" }, - "63e414603e80d4e5a0f5c18774204642258208e4": { - "balance": "5000000000000000000000" + "0x63e414603e80d4e5a0f5c18774204642258208e4": { + "balance": "0x10f0cf064dd59200000" }, - "826ce5790532e0548c6102a30d3eac836bd6388f": { - "balance": "18000000000000000000000" + "0x826ce5790532e0548c6102a30d3eac836bd6388f": { + "balance": "0x3cfc82e37e9a7400000" }, - "c5e812f76f15f2e1f2f9bc4823483c8804636f67": { - "balance": "73000000000000000000" + "0xc5e812f76f15f2e1f2f9bc4823483c8804636f67": { + "balance": "0x3f514193abb840000" }, - "116fef5e601642c918cb89160fc2293ba71da936": { - "balance": "802200000000000000000" + "0x116fef5e601642c918cb89160fc2293ba71da936": { + "balance": "0x2b7cc2e9c3225c0000" }, - "08b84536b74c8c01543da88b84d78bb95747d822": { - "balance": "200000000000000000000" + "0x08b84536b74c8c01543da88b84d78bb95747d822": { + "balance": "0xad78ebc5ac6200000" }, - "04a80afad53ef1f84165cfd852b0fdf1b1c24ba8": { - "balance": "58000000000000000000" + "0x04a80afad53ef1f84165cfd852b0fdf1b1c24ba8": { + "balance": "0x324e964b3eca80000" }, - "2b0362633614bfcb583569438ecc4ea57b1d337e": { - "balance": "20000000000000000000000" + "0x2b0362633614bfcb583569438ecc4ea57b1d337e": { + "balance": "0x43c33c1937564800000" }, - "e95179527deca5916ca9a38f215c1e9ce737b4c9": { - "balance": "10000000000000000000000" + "0xe95179527deca5916ca9a38f215c1e9ce737b4c9": { + "balance": "0x21e19e0c9bab2400000" }, - "2c5df866666a194b26cebb407e4a1fd73e208d5e": { - "balance": "1000000000000000000000" + "0x2c5df866666a194b26cebb407e4a1fd73e208d5e": { + "balance": "0x3635c9adc5dea00000" }, - "529e824fa072582b4032683ac7eecc1c04b4cac1": { - "balance": "2000000000000000000000" + "0x529e824fa072582b4032683ac7eecc1c04b4cac1": { + "balance": "0x6c6b935b8bbd400000" }, - "78634371e17304cbf339b1452a4ce438dc764cce": { - "balance": "10000000000000000000000" + "0x78634371e17304cbf339b1452a4ce438dc764cce": { + "balance": "0x21e19e0c9bab2400000" }, - "e172dfc8f80cd1f8cd8539dc26082014f5a8e3e8": { - "balance": "3000000000000000000000" + "0xe172dfc8f80cd1f8cd8539dc26082014f5a8e3e8": { + "balance": "0xa2a15d09519be00000" }, - "b07618328a901307a1b7a0d058fcd5786e9e72fe": { - "balance": "30239500000000000000000" + "0xb07618328a901307a1b7a0d058fcd5786e9e72fe": { + "balance": "0x667495d4a4330ce0000" }, - "b0571153db1c4ed7acaefe13ecdfdb72e7e4f06a": { - "balance": "80520000000000000000000" + "0xb0571153db1c4ed7acaefe13ecdfdb72e7e4f06a": { + "balance": "0x110cff796ac195200000" }, - "ad910a23d6850613654af786337ad2a70868ac6d": { - "balance": "1999800000000000000000" + "0xad910a23d6850613654af786337ad2a70868ac6d": { + "balance": "0x6c68ccd09b022c0000" }, - "4da5edc688b0cb62e1403d1700d9dcb99ffe3fd3": { - "balance": "2000000000000000000000" + "0x4da5edc688b0cb62e1403d1700d9dcb99ffe3fd3": { + "balance": "0x6c6b935b8bbd400000" }, - "be2471a67f6047918772d0e36839255ed9d691ae": { - "balance": "4000000000000000000000" + "0xbe2471a67f6047918772d0e36839255ed9d691ae": { + "balance": "0xd8d726b7177a800000" }, - "28868324337e11ba106cb481da962f3a8453808d": { - "balance": "2000000000000000000000" + "0x28868324337e11ba106cb481da962f3a8453808d": { + "balance": "0x6c6b935b8bbd400000" }, - "d8f94579496725b5cb53d7985c989749aff849c0": { - "balance": "17000000000000000000000" + "0xd8f94579496725b5cb53d7985c989749aff849c0": { + "balance": "0x39992648a23c8a00000" }, - "4981c5ff66cc4e9680251fc4cd2ff907cb327865": { - "balance": "750000000000000000000" + "0x4981c5ff66cc4e9680251fc4cd2ff907cb327865": { + "balance": "0x28a857425466f80000" }, - "fd2872d19e57853cfa16effe93d0b1d47b4f93fb": { - "balance": "4000000000000000000000" + "0xfd2872d19e57853cfa16effe93d0b1d47b4f93fb": { + "balance": "0xd8d726b7177a800000" }, - "63c8dfde0b8e01dadc2e748c824cc0369df090b3": { - "balance": "3880000000000000000000" + "0x63c8dfde0b8e01dadc2e748c824cc0369df090b3": { + "balance": "0xd255d112e103a00000" }, - "c4dd048bfb840e2bc85cb53fcb75abc443c7e90f": { - "balance": "3716000000000000000000" + "0xc4dd048bfb840e2bc85cb53fcb75abc443c7e90f": { + "balance": "0xc971dc07c9c7900000" }, - "f579714a45eb8f52c3d57bbdefd2c15b2e2f11df": { - "balance": "1560000000000000000000" + "0xf579714a45eb8f52c3d57bbdefd2c15b2e2f11df": { + "balance": "0x54915956c409600000" }, - "cc7b0481cc32e6faef2386a07022bcb6d2c3b4fc": { - "balance": "3160000000000000000000" + "0xcc7b0481cc32e6faef2386a07022bcb6d2c3b4fc": { + "balance": "0xab4dcf399a3a600000" }, - "a0aa5f0201f04d3bbeb898132f7c11679466d901": { - "balance": "36600000000000000000" + "0xa0aa5f0201f04d3bbeb898132f7c11679466d901": { + "balance": "0x1fbed5215bb4c0000" }, - "f3df63a97199933330383b3ed7570b96c4812334": { - "balance": "2000000000000000000000" + "0xf3df63a97199933330383b3ed7570b96c4812334": { + "balance": "0x6c6b935b8bbd400000" }, - "42732d8ef49ffda04b19780fd3c18469fb374106": { - "balance": "425068000000000000000" + "0x42732d8ef49ffda04b19780fd3c18469fb374106": { + "balance": "0x170b00e5e4a9be0000" }, - "6f92d6e4548c78996509ee684b2ee29ba3c532b4": { - "balance": "1000000000000000000000" + "0x6f92d6e4548c78996509ee684b2ee29ba3c532b4": { + "balance": "0x3635c9adc5dea00000" }, - "fff4bad596633479a2a29f9a8b3f78eefd07e6ee": { - "balance": "100000000000000000000" + "0xfff4bad596633479a2a29f9a8b3f78eefd07e6ee": { + "balance": "0x56bc75e2d63100000" }, - "ac4460a76e6db2b9fcd152d9c7718d9ac6ed8c6f": { - "balance": "200000000000000000000" + "0xac4460a76e6db2b9fcd152d9c7718d9ac6ed8c6f": { + "balance": "0xad78ebc5ac6200000" }, - "553b6b1c57050e88cf0c31067b8d4cd1ff80cb09": { - "balance": "400000000000000000000" + "0x553b6b1c57050e88cf0c31067b8d4cd1ff80cb09": { + "balance": "0x15af1d78b58c400000" }, - "84b6b6adbe2f5b3e2d682c66af1bc4905340c3ed": { - "balance": "619333000000000000000" + "0x84b6b6adbe2f5b3e2d682c66af1bc4905340c3ed": { + "balance": "0x2192f8d22215008000" }, - "9f4a7195ac7c151ca258cafda0cab083e049c602": { - "balance": "1537100000000000000000" + "0x9f4a7195ac7c151ca258cafda0cab083e049c602": { + "balance": "0x53538c32185cee0000" }, - "2955c357fd8f75d5159a3dfa69c5b87a359dea8c": { - "balance": "2000000000000000000000" + "0x2955c357fd8f75d5159a3dfa69c5b87a359dea8c": { + "balance": "0x6c6b935b8bbd400000" }, - "11d7844a471ef89a8d877555583ceebd1439ea26": { - "balance": "10098000000000000000000" + "0x11d7844a471ef89a8d877555583ceebd1439ea26": { + "balance": "0x22369e6ba80c6880000" }, - "34b454416e9fb4274e6addf853428a0198d62ee1": { - "balance": "407000000000000000000" + "0x34b454416e9fb4274e6addf853428a0198d62ee1": { + "balance": "0x161042779f1ffc0000" }, - "308dd21cebe755126704b48c0f0dc234c60ba9b1": { - "balance": "200000000000000000000" + "0x308dd21cebe755126704b48c0f0dc234c60ba9b1": { + "balance": "0xad78ebc5ac6200000" }, - "381db4c8465df446a4ce15bf81d47e2f17c980bf": { - "balance": "32000000000000000000000" + "0x381db4c8465df446a4ce15bf81d47e2f17c980bf": { + "balance": "0x6c6b935b8bbd4000000" }, - "1abc4e253b080aeb437984ab05bca0979aa43e1c": { - "balance": "1000000000000000000000" + "0x1abc4e253b080aeb437984ab05bca0979aa43e1c": { + "balance": "0x3635c9adc5dea00000" }, - "53e35b12231f19c3fd774c88fec8cbeedf1408b2": { - "balance": "512000000000000000000" + "0x53e35b12231f19c3fd774c88fec8cbeedf1408b2": { + "balance": "0x1bc16d674ec8000000" }, - "69e2e2e704307ccc5b5ca3f164fece2ea7b2e512": { - "balance": "7000000000000000000000" + "0x69e2e2e704307ccc5b5ca3f164fece2ea7b2e512": { + "balance": "0x17b7883c06916600000" }, - "1914f1eb95d1277e93b6e61b668b7d77f13a11a1": { - "balance": "970000000000000000000" + "0x1914f1eb95d1277e93b6e61b668b7d77f13a11a1": { + "balance": "0x34957444b840e80000" }, - "50e13023bd9ca96ad4c53fdfd410cb6b1f420bdf": { - "balance": "200000000000000000000" + "0x50e13023bd9ca96ad4c53fdfd410cb6b1f420bdf": { + "balance": "0xad78ebc5ac6200000" }, - "46224f32f4ece5c8867090d4409d55e50b18432d": { - "balance": "6000000000000000000000" + "0x46224f32f4ece5c8867090d4409d55e50b18432d": { + "balance": "0x14542ba12a337c00000" }, - "ff83855051ee8ffb70b4817dba3211ed2355869d": { - "balance": "400000000000000000000" + "0xff83855051ee8ffb70b4817dba3211ed2355869d": { + "balance": "0x15af1d78b58c400000" }, - "fb39189af876e762c71d6c3e741893df226cedd6": { - "balance": "4000000000000000000000" + "0xfb39189af876e762c71d6c3e741893df226cedd6": { + "balance": "0xd8d726b7177a800000" }, - "9875623495a46cdbf259530ff838a1799ec38991": { - "balance": "2000000000000000000000" + "0x9875623495a46cdbf259530ff838a1799ec38991": { + "balance": "0x6c6b935b8bbd400000" }, - "e1b39b88d9900dbc4a6cdc481e1060080a8aec3c": { - "balance": "2000000000000000000000" + "0xe1b39b88d9900dbc4a6cdc481e1060080a8aec3c": { + "balance": "0x6c6b935b8bbd400000" }, - "5baf6d749620803e8348af3710e5c4fbf20fc894": { - "balance": "5003680000000000000000" + "0x5baf6d749620803e8348af3710e5c4fbf20fc894": { + "balance": "0x10f4002615dfe900000" }, - "9c54e4ed479a856829c6bb42da9f0b692a75f728": { - "balance": "7520000000000000000000" + "0x9c54e4ed479a856829c6bb42da9f0b692a75f728": { + "balance": "0x197a8f6dd5519800000" }, - "486a6c8583a84484e3df43a123837f8c7e2317d0": { - "balance": "323378000000000000000" + "0x486a6c8583a84484e3df43a123837f8c7e2317d0": { + "balance": "0x1187c571ab80450000" }, - "d235d15cb5eceebb61299e0e827fa82748911d89": { - "balance": "4000000000000000000000" + "0xd235d15cb5eceebb61299e0e827fa82748911d89": { + "balance": "0xd8d726b7177a800000" }, - "47d792a756779aedf1343e8883a6619c6c281184": { - "balance": "2000000000000000000000" + "0x47d792a756779aedf1343e8883a6619c6c281184": { + "balance": "0x6c6b935b8bbd400000" }, - "70c213488a020c3cfb39014ef5ba6404724bcaa3": { - "balance": "1940000000000000000000" + "0x70c213488a020c3cfb39014ef5ba6404724bcaa3": { + "balance": "0x692ae8897081d00000" }, - "133c490fa5bf7f372888e607d958fab7f955bae1": { - "balance": "1580000000000000000000" + "0x133c490fa5bf7f372888e607d958fab7f955bae1": { + "balance": "0x55a6e79ccd1d300000" }, - "a9e194661aac704ee9dea043974e9692ded84a5d": { - "balance": "482400000000000000000" + "0xa9e194661aac704ee9dea043974e9692ded84a5d": { + "balance": "0x1a26a51422a0700000" }, - "bc6b58364bf7f1951c309e0cba0595201cd73f9a": { - "balance": "1812400000000000000000" + "0xbc6b58364bf7f1951c309e0cba0595201cd73f9a": { + "balance": "0x62401a457e45f80000" }, - "2309d34091445b3232590bd70f4f10025b2c9509": { - "balance": "10000000000000000000000" + "0x2309d34091445b3232590bd70f4f10025b2c9509": { + "balance": "0x21e19e0c9bab2400000" }, - "d89bc271b27ba3ab6962c94a559006ae38d5f56a": { - "balance": "2000000000000000000000" + "0xd89bc271b27ba3ab6962c94a559006ae38d5f56a": { + "balance": "0x6c6b935b8bbd400000" }, - "ff0e2fec304207467e1e3307f64cbf30af8fd9cd": { - "balance": "2000000000000000000000" + "0xff0e2fec304207467e1e3307f64cbf30af8fd9cd": { + "balance": "0x6c6b935b8bbd400000" }, - "c0b0b7a8a6e1acdd05e47f94c09688aa16c7ad8d": { - "balance": "64234000000000000000" + "0xc0b0b7a8a6e1acdd05e47f94c09688aa16c7ad8d": { + "balance": "0x37b6d02ac76710000" }, - "b66f92124b5e63035859e390628869dbdea9485e": { - "balance": "9850000000000000000000" + "0xb66f92124b5e63035859e390628869dbdea9485e": { + "balance": "0x215f835bc769da80000" }, - "a9e6e25e656b762558619f147a21985b8874edfe": { - "balance": "2000000000000000000000" + "0xa9e6e25e656b762558619f147a21985b8874edfe": { + "balance": "0x6c6b935b8bbd400000" }, - "a43e1947a9242b355561c30a829dfeeca2815af8": { - "balance": "3878255000000000000000" + "0xa43e1947a9242b355561c30a829dfeeca2815af8": { + "balance": "0xd23d99969fd6918000" }, - "8b20ad3b94656dbdc0dd21a393d8a7d9e02138cb": { - "balance": "3000000000000000000000" + "0x8b20ad3b94656dbdc0dd21a393d8a7d9e02138cb": { + "balance": "0xa2a15d09519be00000" }, - "aca2a838330b17302da731d30db48a04f0f207c1": { - "balance": "1337000000000000000000" + "0xaca2a838330b17302da731d30db48a04f0f207c1": { + "balance": "0x487a9a304539440000" }, - "fa60868aafd4ff4c5c57914b8ed58b425773dfa9": { - "balance": "8557400000000000000000" + "0xfa60868aafd4ff4c5c57914b8ed58b425773dfa9": { + "balance": "0x1cfe5c808f39fbc0000" }, - "1848003c25bfd4aa90e7fcb5d7b16bcd0cffc0d8": { - "balance": "1000000000000000000000" + "0x1848003c25bfd4aa90e7fcb5d7b16bcd0cffc0d8": { + "balance": "0x3635c9adc5dea00000" }, - "b4b185d943ee2b58631e33dff5af6854c17993ac": { - "balance": "1000000000000000000000" + "0xb4b185d943ee2b58631e33dff5af6854c17993ac": { + "balance": "0x3635c9adc5dea00000" }, - "7719888795ad745924c75760ddb1827dffd8cda8": { - "balance": "1999980000000000000000" + "0x7719888795ad745924c75760ddb1827dffd8cda8": { + "balance": "0x6c6b4c4da6ddbe0000" }, - "ccd521132d986cb96869842622a7dda26c3ed057": { - "balance": "2000000000000000000000" + "0xccd521132d986cb96869842622a7dda26c3ed057": { + "balance": "0x6c6b935b8bbd400000" }, - "253e32b74ea4490ab92606fda0aa257bf23dcb8b": { - "balance": "10000000000000000000000" + "0x253e32b74ea4490ab92606fda0aa257bf23dcb8b": { + "balance": "0x21e19e0c9bab2400000" }, - "3712367e5e55a96d5a19168f6eb2bc7e9971f869": { - "balance": "1000000000000000000000" + "0x3712367e5e55a96d5a19168f6eb2bc7e9971f869": { + "balance": "0x3635c9adc5dea00000" }, - "8f29a14a845ad458f2d108b568d813166bcdf477": { - "balance": "10000000000000000000000" + "0x8f29a14a845ad458f2d108b568d813166bcdf477": { + "balance": "0x21e19e0c9bab2400000" }, - "51a8c2163602a32ee24cf4aa97fd9ea414516941": { - "balance": "62904000000000000000" + "0x51a8c2163602a32ee24cf4aa97fd9ea414516941": { + "balance": "0x368f7e6b8672c0000" }, - "61cea71fa464d62a07063f920b0cc917539733d8": { - "balance": "1670000000000000000000" + "0x61cea71fa464d62a07063f920b0cc917539733d8": { + "balance": "0x5a87e7d7f5f6580000" }, - "6f81f3abb1f933b1df396b8e9cc723a89b7c9806": { - "balance": "280000000000000000000" + "0x6f81f3abb1f933b1df396b8e9cc723a89b7c9806": { + "balance": "0xf2dc7d47f15600000" }, - "61b1b8c012cd4c78f698e470f90256e6a30f48dd": { - "balance": "200000000000000000000" + "0x61b1b8c012cd4c78f698e470f90256e6a30f48dd": { + "balance": "0xad78ebc5ac6200000" }, - "4f3f2c673069ac97c2023607152981f5cd6063a0": { - "balance": "600000000000000000000" + "0x4f3f2c673069ac97c2023607152981f5cd6063a0": { + "balance": "0x2086ac351052600000" }, - "e2efa5fca79538ce6068bf31d2c516d4d53c08e5": { - "balance": "131200000000000000000" + "0xe2efa5fca79538ce6068bf31d2c516d4d53c08e5": { + "balance": "0x71cc408df63400000" }, - "2383c222e67e969190d3219ef14da37850e26c55": { - "balance": "2000000000000000000000" + "0x2383c222e67e969190d3219ef14da37850e26c55": { + "balance": "0x6c6b935b8bbd400000" }, - "eac3af5784927fe9a598fc4eec38b8102f37bc58": { - "balance": "1000000000000000000000" + "0xeac3af5784927fe9a598fc4eec38b8102f37bc58": { + "balance": "0x3635c9adc5dea00000" }, - "4fe56ab3bae1b0a44433458333c4b05a248f8241": { - "balance": "2180000000000000000000" + "0x4fe56ab3bae1b0a44433458333c4b05a248f8241": { + "balance": "0x762d93d1dd6f900000" }, - "fe9cfc3bb293ddb285e625f3582f74a6b0a5a6cd": { - "balance": "1970000000000000000000" + "0xfe9cfc3bb293ddb285e625f3582f74a6b0a5a6cd": { + "balance": "0x6acb3df27e1f880000" }, - "f48e1f13f6af4d84b371d7de4b273d03a263278e": { - "balance": "600000000000000000000" + "0xf48e1f13f6af4d84b371d7de4b273d03a263278e": { + "balance": "0x2086ac351052600000" }, - "1ba9228d388727f389150ea03b73c82de8eb2e09": { - "balance": "7258000000000000000000" + "0x1ba9228d388727f389150ea03b73c82de8eb2e09": { + "balance": "0x18974fbe177c9280000" }, - "37a7a6ff4ea3d60ec307ca516a48d3053bb79cbb": { - "balance": "2000000000000000000000" + "0x37a7a6ff4ea3d60ec307ca516a48d3053bb79cbb": { + "balance": "0x6c6b935b8bbd400000" }, - "e33840d8bca7da98a6f3d096d83de78b70b71ef8": { - "balance": "2000000000000000000000" + "0xe33840d8bca7da98a6f3d096d83de78b70b71ef8": { + "balance": "0x6c6b935b8bbd400000" }, - "8e7fd23848f4db07906a7d10c04b21803bb08227": { - "balance": "1000000000000000000000" + "0x8e7fd23848f4db07906a7d10c04b21803bb08227": { + "balance": "0x3635c9adc5dea00000" }, - "07d4334ec385e8aa54eedaeadb30022f0cdfa4ab": { - "balance": "2629946000000000000000" + "0x07d4334ec385e8aa54eedaeadb30022f0cdfa4ab": { + "balance": "0x8e91d520f2eb790000" }, - "d4b085fb086f3d0d68bf12926b1cc3142cae8770": { - "balance": "3700000000000000000000" + "0xd4b085fb086f3d0d68bf12926b1cc3142cae8770": { + "balance": "0xc893d09c8f51500000" }, - "5a87f034e6f68f4e74ffe60c64819436036cf7d7": { - "balance": "20000000000000000000" + "0x5a87f034e6f68f4e74ffe60c64819436036cf7d7": { + "balance": "0x1158e460913d00000" }, - "c00ab080b643e1c2bae363e0d195de2efffc1c44": { - "balance": "500000000000000000000" + "0xc00ab080b643e1c2bae363e0d195de2efffc1c44": { + "balance": "0x1b1ae4d6e2ef500000" }, - "22f3c779dd79023ea92a78b65c1a1780f62d5c4a": { - "balance": "1970000000000000000000" + "0x22f3c779dd79023ea92a78b65c1a1780f62d5c4a": { + "balance": "0x6acb3df27e1f880000" }, - "c7d5c7054081e918ec687b5ab36e973d18132935": { - "balance": "182000000000000000000" + "0xc7d5c7054081e918ec687b5ab36e973d18132935": { + "balance": "0x9ddc1e3b901180000" }, - "9662ee021926682b31c5f200ce457abea76c6ce9": { - "balance": "670500000000000000000" + "0x9662ee021926682b31c5f200ce457abea76c6ce9": { + "balance": "0x24590e8589eb6a0000" }, - "116a09df66cb150e97578e297fb06e13040c893c": { - "balance": "2000000000000000000000" + "0x116a09df66cb150e97578e297fb06e13040c893c": { + "balance": "0x6c6b935b8bbd400000" }, - "b7240af2af90b33c08ae9764103e35dce3638428": { - "balance": "8464547000000000000000" + "0xb7240af2af90b33c08ae9764103e35dce3638428": { + "balance": "0x1cadd2fe9686e638000" }, - "e8b28acda971725769db8f563d28666d41ddab6c": { - "balance": "10000000000000000000000" + "0xe8b28acda971725769db8f563d28666d41ddab6c": { + "balance": "0x21e19e0c9bab2400000" }, - "17d4918dfac15d77c47f9ed400a850190d64f151": { - "balance": "2000000000000000000000" + "0x17d4918dfac15d77c47f9ed400a850190d64f151": { + "balance": "0x6c6b935b8bbd400000" }, - "c42250b0fe42e6b7dcd5c890a6f0c88f5f5fb574": { - "balance": "149800000000000000000" + "0xc42250b0fe42e6b7dcd5c890a6f0c88f5f5fb574": { + "balance": "0x81ee4825359840000" }, - "5da2a9a4c2c0a4a924cbe0a53ab9d0c627a1cfa0": { - "balance": "733202000000000000000" + "0x5da2a9a4c2c0a4a924cbe0a53ab9d0c627a1cfa0": { + "balance": "0x27bf38c6544df50000" }, - "5869fb867d71f1387f863b698d09fdfb87c49b5c": { - "balance": "3666000000000000000000" + "0x5869fb867d71f1387f863b698d09fdfb87c49b5c": { + "balance": "0xc6bbf858b316080000" }, - "d49a75bb933fca1fca9aa1303a64b6cb44ea30e1": { - "balance": "10000000000000000000000" + "0xd49a75bb933fca1fca9aa1303a64b6cb44ea30e1": { + "balance": "0x21e19e0c9bab2400000" }, - "76331e30796ce664b2700e0d4153700edc869777": { - "balance": "2000000000000000000000" + "0x76331e30796ce664b2700e0d4153700edc869777": { + "balance": "0x6c6b935b8bbd400000" }, - "8a5fb75793d043f1bcd43885e037bd30a528c927": { - "balance": "356500000000000000000" + "0x8a5fb75793d043f1bcd43885e037bd30a528c927": { + "balance": "0x13536e6d2e9ac20000" }, - "fc0ee6f7c2b3714ae9916c45566605b656f32441": { - "balance": "1760000000000000000000" + "0xfc0ee6f7c2b3714ae9916c45566605b656f32441": { + "balance": "0x5f68e8131ecf800000" }, - "bf50ce2e264b9fe2b06830617aedf502b2351b45": { - "balance": "1000000000000000000000" + "0xbf50ce2e264b9fe2b06830617aedf502b2351b45": { + "balance": "0x3635c9adc5dea00000" }, - "0f6000de1578619320aba5e392706b131fb1de6f": { - "balance": "499986000000000000000" + "0x0f6000de1578619320aba5e392706b131fb1de6f": { + "balance": "0x1b1ab319f5ec750000" }, - "c953f934c0eb2d0f144bdab00483fd8194865ce7": { - "balance": "2000000000000000000000" + "0xc953f934c0eb2d0f144bdab00483fd8194865ce7": { + "balance": "0x6c6b935b8bbd400000" }, - "24fd9a6c874c2fab3ff36e9afbf8ce0d32c7de92": { - "balance": "1337000000000000000000" + "0x24fd9a6c874c2fab3ff36e9afbf8ce0d32c7de92": { + "balance": "0x487a9a304539440000" }, - "c6cd68ec35362c5ad84c82ad4edc232125912d99": { - "balance": "27750000000000000000000" + "0xc6cd68ec35362c5ad84c82ad4edc232125912d99": { + "balance": "0x5e0549c9632e1d80000" }, - "2a67660a1368efcd626ef36b2b1b601980941c05": { - "balance": "133700000000000000000" + "0x2a67660a1368efcd626ef36b2b1b601980941c05": { + "balance": "0x73f75d1a085ba0000" }, - "9deb39027af877992b89f2ec4a1f822ecdf12693": { - "balance": "2000000000000000000000" + "0x9deb39027af877992b89f2ec4a1f822ecdf12693": { + "balance": "0x6c6b935b8bbd400000" }, - "c12f881fa112b8199ecbc73ec4185790e614a20f": { - "balance": "2000000000000000000000" + "0xc12f881fa112b8199ecbc73ec4185790e614a20f": { + "balance": "0x6c6b935b8bbd400000" }, - "d58a52e078a805596b0d56ea4ae1335af01c66eb": { - "balance": "267400000000000000000" + "0xd58a52e078a805596b0d56ea4ae1335af01c66eb": { + "balance": "0xe7eeba3410b740000" }, - "4d7cfaa84cb33106800a8c802fb8aa463896c599": { - "balance": "1790000000000000000000" + "0x4d7cfaa84cb33106800a8c802fb8aa463896c599": { + "balance": "0x61093d7c2c6d380000" }, - "0ee391f03c765b11d69026fd1ab35395dc3802a0": { - "balance": "200000000000000000000" + "0x0ee391f03c765b11d69026fd1ab35395dc3802a0": { + "balance": "0xad78ebc5ac6200000" }, - "a192f06ab052d5fd7f94eea8318e827815fe677a": { - "balance": "131400000000000000000" + "0xa192f06ab052d5fd7f94eea8318e827815fe677a": { + "balance": "0x71f8a93d01e540000" }, - "8f0ab894bd3f4e697dbcfb859d497a9ba195994a": { - "balance": "39501652000000000000000" + "0x8f0ab894bd3f4e697dbcfb859d497a9ba195994a": { + "balance": "0x85d638b65472aa20000" }, - "387eeafd6b4009deaf8bd5b85a72983a8dcc3487": { - "balance": "4000000000000000000000" + "0x387eeafd6b4009deaf8bd5b85a72983a8dcc3487": { + "balance": "0xd8d726b7177a800000" }, - "03b0f17cd4469ddccfb7da697e82a91a5f9e7774": { - "balance": "20000000000000000000" + "0x03b0f17cd4469ddccfb7da697e82a91a5f9e7774": { + "balance": "0x1158e460913d00000" }, - "11172b278ddd44eea2fdf4cb1d16962391c453d9": { - "balance": "935900000000000000000000" + "0x11172b278ddd44eea2fdf4cb1d16962391c453d9": { + "balance": "0xc62f3d9bfd4895f00000" }, - "33d172ab075c51db1cd40a8ca8dbff0d93b843bb": { - "balance": "5727139000000000000000" + "0x33d172ab075c51db1cd40a8ca8dbff0d93b843bb": { + "balance": "0x136780510d12de38000" }, - "909b5e763a39dcc795223d73a1dbb7d94ca75ac8": { - "balance": "2000000000000000000000" + "0x909b5e763a39dcc795223d73a1dbb7d94ca75ac8": { + "balance": "0x6c6b935b8bbd400000" }, - "0ca12ab0b9666cf0cec6671a15292f2653476ab2": { - "balance": "210000600000000000000000" + "0x0ca12ab0b9666cf0cec6671a15292f2653476ab2": { + "balance": "0x2c7827c42d22d07c0000" }, - "6b5ae7bf78ec75e90cb503c778ccd3b24b4f1aaf": { - "balance": "800000000000000000000" + "0x6b5ae7bf78ec75e90cb503c778ccd3b24b4f1aaf": { + "balance": "0x2b5e3af16b18800000" }, - "d9e3857efd1e202a441770a777a49dcc45e2e0d3": { - "balance": "223500000000000000000" + "0xd9e3857efd1e202a441770a777a49dcc45e2e0d3": { + "balance": "0xc1daf81d8a3ce0000" }, - "d703c6a4f11d60194579d58c2766a7ef16c30a29": { - "balance": "2000000000000000000000" + "0xd703c6a4f11d60194579d58c2766a7ef16c30a29": { + "balance": "0x6c6b935b8bbd400000" }, - "838bd565f99fde48053f7917fe333cf84ad548ab": { - "balance": "200000000000000000000" + "0x838bd565f99fde48053f7917fe333cf84ad548ab": { + "balance": "0xad78ebc5ac6200000" }, - "8168edce7f2961cf295b9fcd5a45c06cdeda6ef5": { - "balance": "200000000000000000000" + "0x8168edce7f2961cf295b9fcd5a45c06cdeda6ef5": { + "balance": "0xad78ebc5ac6200000" }, - "de50868eb7e3c71937ec73fa89dd8b9ee10d45aa": { - "balance": "1000000000000000000000" + "0xde50868eb7e3c71937ec73fa89dd8b9ee10d45aa": { + "balance": "0x3635c9adc5dea00000" }, - "087498c0464668f31150f4d3c4bcdda5221ba102": { - "balance": "20000000000000000000" + "0x087498c0464668f31150f4d3c4bcdda5221ba102": { + "balance": "0x1158e460913d00000" }, - "613fab44b16bbe554d44afd178ab1d02f37aeaa5": { - "balance": "2000000000000000000000" + "0x613fab44b16bbe554d44afd178ab1d02f37aeaa5": { + "balance": "0x6c6b935b8bbd400000" }, - "e2ee691f237ee6529b6557f2fcdd3dcf0c59ec63": { - "balance": "5450048000000000000000" + "0xe2ee691f237ee6529b6557f2fcdd3dcf0c59ec63": { + "balance": "0x127729c14687c200000" }, - "a9ed377b7d6ec25971c1a597a3b0f3bead57c98f": { - "balance": "400000000000000000000" + "0xa9ed377b7d6ec25971c1a597a3b0f3bead57c98f": { + "balance": "0x15af1d78b58c400000" }, - "175feeea2aa4e0efda12e1588d2f483290ede81a": { - "balance": "200000000000000000000" + "0x175feeea2aa4e0efda12e1588d2f483290ede81a": { + "balance": "0xad78ebc5ac6200000" }, - "b51ddcb4dd4e8ae6be336dd9654971d9fec86b41": { - "balance": "421133000000000000000" + "0xb51ddcb4dd4e8ae6be336dd9654971d9fec86b41": { + "balance": "0x16d464f83de2948000" }, - "92c0f573eccf62c54810ee6ba8d1f113542b301b": { - "balance": "3384000000000000000000" + "0x92c0f573eccf62c54810ee6ba8d1f113542b301b": { + "balance": "0xb7726f16ccb1e00000" }, - "a109e18bb0a39c9ef82fa19597fc5ed8e9eb6d58": { - "balance": "1640000000000000000000" + "0xa109e18bb0a39c9ef82fa19597fc5ed8e9eb6d58": { + "balance": "0x58e7926ee858a00000" }, - "f74e6e145382b4db821fe0f2d98388f45609c69f": { - "balance": "100000000000000000000" + "0xf74e6e145382b4db821fe0f2d98388f45609c69f": { + "balance": "0x56bc75e2d63100000" }, - "378f37243f3ff0bef5e1dc85eb4308d9340c29f9": { - "balance": "2000200000000000000000" + "0x378f37243f3ff0bef5e1dc85eb4308d9340c29f9": { + "balance": "0x6c6e59e67c78540000" }, - "84e9949680bece6841b9a7e5250d08acd87d16cd": { - "balance": "200000000000000000000" + "0x84e9949680bece6841b9a7e5250d08acd87d16cd": { + "balance": "0xad78ebc5ac6200000" }, - "882bd3a2e9d74110b24961c53777f22f1f46dc5d": { - "balance": "13370000000000000000000" + "0x882bd3a2e9d74110b24961c53777f22f1f46dc5d": { + "balance": "0x2d4ca05e2b43ca80000" }, - "acce01e0a70610dc70bb91e9926fa9957f372fba": { - "balance": "537000000000000000000" + "0xacce01e0a70610dc70bb91e9926fa9957f372fba": { + "balance": "0x1d1c5f3eda20c40000" }, - "c5f687717246da8a200d20e5e9bcac60b67f3861": { - "balance": "28650000000000000000" + "0xc5f687717246da8a200d20e5e9bcac60b67f3861": { + "balance": "0x18d993f34aef10000" }, - "e14617f6022501e97e7b3e2d8836aa61f0ff2dba": { - "balance": "200000000000000000000" + "0xe14617f6022501e97e7b3e2d8836aa61f0ff2dba": { + "balance": "0xad78ebc5ac6200000" }, - "076ee99d3548623a03b5f99859d2d785a1778d48": { - "balance": "200000000000000000000" + "0x076ee99d3548623a03b5f99859d2d785a1778d48": { + "balance": "0xad78ebc5ac6200000" }, - "2c424ee47f583cdce07ae318b6fad462381d4d2b": { - "balance": "4000000000000000000000" + "0x2c424ee47f583cdce07ae318b6fad462381d4d2b": { + "balance": "0xd8d726b7177a800000" }, - "f98250730c4c61c57f129835f2680894794542f3": { - "balance": "4000000000000000000000" + "0xf98250730c4c61c57f129835f2680894794542f3": { + "balance": "0xd8d726b7177a800000" }, - "ed1b24b6912d51b334ac0de6e771c7c0454695ea": { - "balance": "40000000000000000000" + "0xed1b24b6912d51b334ac0de6e771c7c0454695ea": { + "balance": "0x22b1c8c1227a00000" }, - "ffd5170fd1a8118d558e7511e364b24906c4f6b3": { - "balance": "60085000000000000000" + "0xffd5170fd1a8118d558e7511e364b24906c4f6b3": { + "balance": "0x341d8cd27f1588000" }, - "bf49c14898316567d8b709c2e50594b366c6d38c": { - "balance": "733202000000000000000" + "0xbf49c14898316567d8b709c2e50594b366c6d38c": { + "balance": "0x27bf38c6544df50000" }, - "65ea26eabbe2f64ccccfe06829c25d4637520225": { - "balance": "700000000000000000000" + "0x65ea26eabbe2f64ccccfe06829c25d4637520225": { + "balance": "0x25f273933db5700000" }, - "5c5419565c3aad4e714e0739328e3521c98f05cc": { - "balance": "528000000000000000000" + "0x5c5419565c3aad4e714e0739328e3521c98f05cc": { + "balance": "0x1c9f78d2893e400000" }, - "c53b50fd3b2b72bc6c430baf194a515585d3986d": { - "balance": "20000000000000000000" + "0xc53b50fd3b2b72bc6c430baf194a515585d3986d": { + "balance": "0x1158e460913d00000" }, - "2b74c373d04bfb0fd60a18a01a88fbe84770e58c": { - "balance": "40000000000000000000" + "0x2b74c373d04bfb0fd60a18a01a88fbe84770e58c": { + "balance": "0x22b1c8c1227a00000" }, - "d97f4526dea9b163f8e8e33a6bcf92fb907de6ec": { - "balance": "284000000000000000000" + "0xd97f4526dea9b163f8e8e33a6bcf92fb907de6ec": { + "balance": "0xf654aaf4db2f00000" }, - "a4a49f0bc8688cc9e6dc04e1e08d521026e65574": { - "balance": "200000000000000000000" + "0xa4a49f0bc8688cc9e6dc04e1e08d521026e65574": { + "balance": "0xad78ebc5ac6200000" }, - "575c00c2818210c28555a0ff29010289d3f82309": { - "balance": "10000000000000000000000" + "0x575c00c2818210c28555a0ff29010289d3f82309": { + "balance": "0x21e19e0c9bab2400000" }, - "3f1233714f204de9de4ee96d073b368d8197989f": { - "balance": "38606000000000000000" + "0x3f1233714f204de9de4ee96d073b368d8197989f": { + "balance": "0x217c41074e6bb0000" }, - "f964d98d281730ba35b2e3a314796e7b42fedf67": { - "balance": "1543800000000000000000" + "0xf964d98d281730ba35b2e3a314796e7b42fedf67": { + "balance": "0x53b0876098d80c0000" }, - "1deec01abe5c0d952de9106c3dc30639d85005d6": { - "balance": "2000000000000000000000" + "0x1deec01abe5c0d952de9106c3dc30639d85005d6": { + "balance": "0x6c6b935b8bbd400000" }, - "12d60d65b7d9fc48840be5f891c745ce76ee501e": { - "balance": "21359400000000000000000" + "0x12d60d65b7d9fc48840be5f891c745ce76ee501e": { + "balance": "0x485e5388d0c76840000" }, - "5c6136e218de0a61a137b2b3962d2a6112b809d7": { - "balance": "294273000000000000000" + "0x5c6136e218de0a61a137b2b3962d2a6112b809d7": { + "balance": "0xff3dbb65ff4868000" }, - "cd43258b7392a930839a51b2ef8ad23412f75a9f": { - "balance": "2000000000000000000000" + "0xcd43258b7392a930839a51b2ef8ad23412f75a9f": { + "balance": "0x6c6b935b8bbd400000" }, - "db3f258ab2a3c2cf339c4499f75a4bd1d3472e9e": { - "balance": "1500000000000000000000" + "0xdb3f258ab2a3c2cf339c4499f75a4bd1d3472e9e": { + "balance": "0x5150ae84a8cdf00000" }, - "0edd4b580ff10fe06c4a03116239ef96622bae35": { - "balance": "197000000000000000000" + "0x0edd4b580ff10fe06c4a03116239ef96622bae35": { + "balance": "0xaadec983fcff40000" }, - "1d157c5876c5cad553c912caf6ce2d5277e05c73": { - "balance": "2000000000000000000000" + "0x1d157c5876c5cad553c912caf6ce2d5277e05c73": { + "balance": "0x6c6b935b8bbd400000" }, - "cda1b886e3a795c9ba77914e0a2fe5676f0f5ccf": { - "balance": "106024000000000000000" + "0xcda1b886e3a795c9ba77914e0a2fe5676f0f5ccf": { + "balance": "0x5bf60ea42c2040000" }, - "f50cbafd397edd556c0678988cb2af5c2617e0a2": { - "balance": "716000000000000000000" + "0xf50cbafd397edd556c0678988cb2af5c2617e0a2": { + "balance": "0x26d07efe782bb00000" }, - "327bb49e754f6fb4f733c6e06f3989b4f65d4bee": { - "balance": "20000000000000000000" + "0x327bb49e754f6fb4f733c6e06f3989b4f65d4bee": { + "balance": "0x1158e460913d00000" }, - "c44bdec8c36c5c68baa2ddf1d431693229726c43": { - "balance": "100000000000000000000000" + "0xc44bdec8c36c5c68baa2ddf1d431693229726c43": { + "balance": "0x152d02c7e14af6800000" }, - "34e2849bea583ab0cc37975190f322b395055582": { - "balance": "7780340000000000000000" + "0x34e2849bea583ab0cc37975190f322b395055582": { + "balance": "0x1a5c5e857fdf2b20000" }, - "9221c9ce01232665741096ac07235903ad1fe2fc": { - "balance": "126489000000000000000" + "0x9221c9ce01232665741096ac07235903ad1fe2fc": { + "balance": "0x6db63335522628000" }, - "ff3ded7a40d3aff0d7a8c45fa6136aa0433db457": { - "balance": "1999800000000000000000" + "0xff3ded7a40d3aff0d7a8c45fa6136aa0433db457": { + "balance": "0x6c68ccd09b022c0000" }, - "10b5b34d1248fcf017f8c8ffc408ce899ceef92f": { - "balance": "267400000000000000000" + "0x10b5b34d1248fcf017f8c8ffc408ce899ceef92f": { + "balance": "0xe7eeba3410b740000" }, - "f1a1f320407964fd3c8f2e2cc8a4580da94f01ea": { - "balance": "2000040000000000000000" + "0xf1a1f320407964fd3c8f2e2cc8a4580da94f01ea": { + "balance": "0x6c6c2177557c440000" }, - "6c800d4b49ba07250460f993b8cbe00b266a2553": { - "balance": "492500000000000000000" + "0x6c800d4b49ba07250460f993b8cbe00b266a2553": { + "balance": "0x1ab2cf7c9f87e20000" }, - "f827d56ed2d32720d4abf103d6d0ef4d3bcd559b": { - "balance": "26265000000000000000" + "0xf827d56ed2d32720d4abf103d6d0ef4d3bcd559b": { + "balance": "0x16c80065791a28000" }, - "ffb9c7217e66743031eb377af65c77db7359dcda": { - "balance": "40000000000000000000" + "0xffb9c7217e66743031eb377af65c77db7359dcda": { + "balance": "0x22b1c8c1227a00000" }, - "530319db0a8f93e5bb7d4dbf4816314fbed8361b": { - "balance": "2000000000000000000000" + "0x530319db0a8f93e5bb7d4dbf4816314fbed8361b": { + "balance": "0x6c6b935b8bbd400000" }, - "9c28a2c4086091cb5da226a657ce3248e8ea7b6f": { - "balance": "280000000000000000000" + "0x9c28a2c4086091cb5da226a657ce3248e8ea7b6f": { + "balance": "0xf2dc7d47f15600000" }, - "db23a6fef1af7b581e772cf91882deb2516fc0a7": { - "balance": "200000000000000000000" + "0xdb23a6fef1af7b581e772cf91882deb2516fc0a7": { + "balance": "0xad78ebc5ac6200000" }, - "6636d7ac637a48f61d38b14cfd4865d36d142805": { - "balance": "500000000000000000000" + "0x6636d7ac637a48f61d38b14cfd4865d36d142805": { + "balance": "0x1b1ae4d6e2ef500000" }, - "b3c260609b9df4095e6c5dff398eeb5e2df49985": { - "balance": "254030000000000000000" + "0xb3c260609b9df4095e6c5dff398eeb5e2df49985": { + "balance": "0xdc55fdb17647b0000" }, - "58e5c9e344c806650dacfc904d33edba5107b0de": { - "balance": "19100000000000000000" + "0x58e5c9e344c806650dacfc904d33edba5107b0de": { + "balance": "0x10910d4cdc9f60000" }, - "4f67396d2553f998785f704e07a639197dd1948d": { - "balance": "300080000000000000000" + "0x4f67396d2553f998785f704e07a639197dd1948d": { + "balance": "0x104472521ba7380000" }, - "510d8159cc945768c7450790ba073ec0d9f89e30": { - "balance": "2560000000000000000000" + "0x510d8159cc945768c7450790ba073ec0d9f89e30": { + "balance": "0x8ac7230489e8000000" }, - "593c48935beaff0fde19b04d309cd530a28e52ce": { - "balance": "4000000000000000000000" + "0x593c48935beaff0fde19b04d309cd530a28e52ce": { + "balance": "0xd8d726b7177a800000" }, - "c27f4e08099d8cf39ee11601838ef9fc06d7fc41": { - "balance": "1790000000000000000000" + "0xc27f4e08099d8cf39ee11601838ef9fc06d7fc41": { + "balance": "0x61093d7c2c6d380000" }, - "07723e3c30e8b731ee456a291ee0e798b0204a77": { - "balance": "2000000000000000000000" + "0x07723e3c30e8b731ee456a291ee0e798b0204a77": { + "balance": "0x6c6b935b8bbd400000" }, - "0a652e2a8b77bd97a790d0e91361c98890dbb04e": { - "balance": "1000000000000000000000" + "0x0a652e2a8b77bd97a790d0e91361c98890dbb04e": { + "balance": "0x3635c9adc5dea00000" }, - "671015b97670b10d5e583f3d62a61c1c79c5143f": { - "balance": "400000000000000000000" + "0x671015b97670b10d5e583f3d62a61c1c79c5143f": { + "balance": "0x15af1d78b58c400000" }, - "7cc24a6a958c20c7d1249660f7586226950b0d9a": { - "balance": "1970000000000000000000" + "0x7cc24a6a958c20c7d1249660f7586226950b0d9a": { + "balance": "0x6acb3df27e1f880000" }, - "6ef9e8c9b6217d56769af97dbb1c8e1b8be799d2": { - "balance": "182000000000000000000" + "0x6ef9e8c9b6217d56769af97dbb1c8e1b8be799d2": { + "balance": "0x9ddc1e3b901180000" }, - "5c4368918ace6409c79eca80cdaae4391d2b624e": { - "balance": "4000000000000000000000" + "0x5c4368918ace6409c79eca80cdaae4391d2b624e": { + "balance": "0xd8d726b7177a800000" }, - "043707071e2ae21eed977891dc79cd5d8ee1c2da": { - "balance": "2000000000000000000000" + "0x043707071e2ae21eed977891dc79cd5d8ee1c2da": { + "balance": "0x6c6b935b8bbd400000" }, - "39bfd978689bec048fc776aa15247f5e1d7c39a2": { - "balance": "20000000000000000000000" + "0x39bfd978689bec048fc776aa15247f5e1d7c39a2": { + "balance": "0x43c33c1937564800000" }, - "05915d4e225a668162aee7d6c25fcfc6ed18db03": { - "balance": "66348000000000000000" + "0x05915d4e225a668162aee7d6c25fcfc6ed18db03": { + "balance": "0x398c37279259e0000" }, - "3f551ba93cd54693c183fb9ad60d65e1609673c9": { - "balance": "2000000000000000000000" + "0x3f551ba93cd54693c183fb9ad60d65e1609673c9": { + "balance": "0x6c6b935b8bbd400000" }, - "a8c0b02faf02cb5519dda884de7bbc8c88a2da81": { - "balance": "16700000000000000000" + "0xa8c0b02faf02cb5519dda884de7bbc8c88a2da81": { + "balance": "0xe7c2518505060000" }, - "bd0c5cd799ebc48642ef97d74e8e429064fee492": { - "balance": "326000000000000000000" + "0xbd0c5cd799ebc48642ef97d74e8e429064fee492": { + "balance": "0x11ac28a8c729580000" }, - "0a931b449ea8f12cdbd5e2c8cc76bad2c27c0639": { - "balance": "23031000000000000000" + "0x0a931b449ea8f12cdbd5e2c8cc76bad2c27c0639": { + "balance": "0x13f9e8c79fe058000" }, - "2ea5fee63f337a376e4b918ea82148f94d48a626": { - "balance": "1864242000000000000000" + "0x2ea5fee63f337a376e4b918ea82148f94d48a626": { + "balance": "0x650f8e0dd293c50000" }, - "cc6c2df00e86eca40f21ffda1a67a1690f477c65": { - "balance": "3160000000000000000000" + "0xcc6c2df00e86eca40f21ffda1a67a1690f477c65": { + "balance": "0xab4dcf399a3a600000" }, - "e5e37e19408f2cfbec83349dd48153a4a795a08f": { - "balance": "4200000000000000000000" + "0xe5e37e19408f2cfbec83349dd48153a4a795a08f": { + "balance": "0xe3aeb5737240a00000" }, - "f555a27bb1e2fd4e2cc784caee92939fc06e2fc9": { - "balance": "2000000000000000000000" + "0xf555a27bb1e2fd4e2cc784caee92939fc06e2fc9": { + "balance": "0x6c6b935b8bbd400000" }, - "dcf9719be87c6f46756db4891db9b611d2469c50": { - "balance": "1000000000000000000000" + "0xdcf9719be87c6f46756db4891db9b611d2469c50": { + "balance": "0x3635c9adc5dea00000" }, - "8e2f9034c9254719c38e50c9aa64305ed696df1e": { - "balance": "4728000000000000000000" + "0x8e2f9034c9254719c38e50c9aa64305ed696df1e": { + "balance": "0x1004e2e45fb7ee00000" }, - "a01f12d70f44aa7b113b285c22dcdb45873454a7": { - "balance": "18200000000000000000" + "0xa01f12d70f44aa7b113b285c22dcdb45873454a7": { + "balance": "0xfc936392801c0000" }, - "bce40475d345b0712dee703d87cd7657fc7f3b62": { - "balance": "7750000000000000000000" + "0xbce40475d345b0712dee703d87cd7657fc7f3b62": { + "balance": "0x1a420db02bd7d580000" }, - "bb19bf91cbad74cceb5f811db27e411bc2ea0656": { - "balance": "17600000000000000000" + "0xbb19bf91cbad74cceb5f811db27e411bc2ea0656": { + "balance": "0xf43fc2c04ee00000" }, - "acc062702c59615d3444ef6214b8862b009a02ed": { - "balance": "1499936000000000000000" + "0xacc062702c59615d3444ef6214b8862b009a02ed": { + "balance": "0x514fcb24ff9c500000" }, - "449ac4fbe383e36738855e364a57f471b2bfa131": { - "balance": "197000000000000000000000" + "0x449ac4fbe383e36738855e364a57f471b2bfa131": { + "balance": "0x29b76432b94451200000" }, - "ad59a78eb9a74a7fbdaefafa82eada8475f07f95": { - "balance": "500000000000000000000" + "0xad59a78eb9a74a7fbdaefafa82eada8475f07f95": { + "balance": "0x1b1ae4d6e2ef500000" }, - "6b6577f3909a4d6de0f411522d4570386400345c": { - "balance": "1880000000000000000000" + "0x6b6577f3909a4d6de0f411522d4570386400345c": { + "balance": "0x65ea3db75546600000" }, - "79bf2f7b6e328aaf26e0bb093fa22da29ef2f471": { - "balance": "1790000000000000000000" + "0x79bf2f7b6e328aaf26e0bb093fa22da29ef2f471": { + "balance": "0x61093d7c2c6d380000" }, - "940f715140509ffabf974546fab39022a41952d2": { - "balance": "1400000000000000000000" + "0x940f715140509ffabf974546fab39022a41952d2": { + "balance": "0x4be4e7267b6ae00000" }, - "1d572edd2d87ca271a6714c15a3b37761dcca005": { - "balance": "127674000000000000000" + "0x1d572edd2d87ca271a6714c15a3b37761dcca005": { + "balance": "0x6ebd52a8ddd390000" }, - "d78ecd25adc86bc2051d96f65364866b42a426b7": { - "balance": "3877300000000000000000" + "0xd78ecd25adc86bc2051d96f65364866b42a426b7": { + "balance": "0xd23058bf2f26120000" }, - "f9729d48282c9e87166d5eef2d01eda9dbf78821": { - "balance": "99981000000000000000" + "0xf9729d48282c9e87166d5eef2d01eda9dbf78821": { + "balance": "0x56b83ddc728548000" }, - "17762560e82a93b3f522e0e524adb8612c3a7470": { - "balance": "1000000000000000000000" + "0x17762560e82a93b3f522e0e524adb8612c3a7470": { + "balance": "0x3635c9adc5dea00000" }, - "d500e4d1c9824ba9f5b635cfa3a8c2c38bbd4ced": { - "balance": "400000000000000000000" + "0xd500e4d1c9824ba9f5b635cfa3a8c2c38bbd4ced": { + "balance": "0x15af1d78b58c400000" }, - "a11effab6cf0f5972cffe4d56596e98968144a8f": { - "balance": "1670000000000000000000" + "0xa11effab6cf0f5972cffe4d56596e98968144a8f": { + "balance": "0x5a87e7d7f5f6580000" }, - "f64ecf2117931c6d535a311e4ffeaef9d49405b8": { - "balance": "2674000000000000000000" + "0xf64ecf2117931c6d535a311e4ffeaef9d49405b8": { + "balance": "0x90f534608a72880000" }, - "229cc4711b62755ea296445ac3b77fc633821cf2": { - "balance": "39481000000000000000" + "0x229cc4711b62755ea296445ac3b77fc633821cf2": { + "balance": "0x223e8b05219328000" }, - "fc989cb487bf1a7d17e4c1b7c4b7aafdda6b0a8d": { - "balance": "20000000000000000000" + "0xfc989cb487bf1a7d17e4c1b7c4b7aafdda6b0a8d": { + "balance": "0x1158e460913d00000" }, - "ea8527febfa1ade29e26419329d393b940bbb7dc": { - "balance": "1999944000000000000000" + "0xea8527febfa1ade29e26419329d393b940bbb7dc": { + "balance": "0x6c6acc67d7b1d40000" }, - "bce13e22322acfb355cd21fd0df60cf93add26c6": { - "balance": "200000000000000000000" + "0xbce13e22322acfb355cd21fd0df60cf93add26c6": { + "balance": "0xad78ebc5ac6200000" }, - "19ff244fcfe3d4fa2f4fd99f87e55bb315b81eb6": { - "balance": "200000000000000000000" + "0x19ff244fcfe3d4fa2f4fd99f87e55bb315b81eb6": { + "balance": "0xad78ebc5ac6200000" }, - "d2581a55ce23ab10d8ad8c44378f59079bd6f658": { - "balance": "8800000000000000000000" + "0xd2581a55ce23ab10d8ad8c44378f59079bd6f658": { + "balance": "0x1dd0c885f9a0d800000" }, - "4073fa49b87117cb908cf1ab512da754a932d477": { - "balance": "1970000000000000000000" + "0x4073fa49b87117cb908cf1ab512da754a932d477": { + "balance": "0x6acb3df27e1f880000" }, - "b6a82933c9eadabd981e5d6d60a6818ff806e36b": { - "balance": "400000000000000000000" + "0xb6a82933c9eadabd981e5d6d60a6818ff806e36b": { + "balance": "0x15af1d78b58c400000" }, - "c79806032bc7d828f19ac6a640c68e3d820fa442": { - "balance": "20000000000000000000" + "0xc79806032bc7d828f19ac6a640c68e3d820fa442": { + "balance": "0x1158e460913d00000" }, - "577b2d073c590c50306f5b1195a4b2ba9ecda625": { - "balance": "373600000000000000000" + "0x577b2d073c590c50306f5b1195a4b2ba9ecda625": { + "balance": "0x1440bdd49515f00000" }, - "7f13d760498d7193ca6859bc95c901386423d76c": { - "balance": "5000000000000000000000" + "0x7f13d760498d7193ca6859bc95c901386423d76c": { + "balance": "0x10f0cf064dd59200000" }, - "416784af609630b070d49a8bcd12235c6428a408": { - "balance": "20000000000000000000000" + "0x416784af609630b070d49a8bcd12235c6428a408": { + "balance": "0x43c33c1937564800000" }, - "fbe71622bcbd31c1a36976e7e5f670c07ffe16de": { - "balance": "400000000000000000000" + "0xfbe71622bcbd31c1a36976e7e5f670c07ffe16de": { + "balance": "0x15af1d78b58c400000" }, - "a5698035391e67a49013c0002079593114feb353": { - "balance": "240000000000000000000" + "0xa5698035391e67a49013c0002079593114feb353": { + "balance": "0xd02ab486cedc00000" }, - "ab2871e507c7be3965498e8fb462025a1a1c4264": { - "balance": "775000000000000000000" + "0xab2871e507c7be3965498e8fb462025a1a1c4264": { + "balance": "0x2a034919dfbfbc0000" }, - "9c78fbb4df769ce2c156920cfedfda033a0e254a": { - "balance": "1970000000000000000000" + "0x9c78fbb4df769ce2c156920cfedfda033a0e254a": { + "balance": "0x6acb3df27e1f880000" }, - "95e6f93dac228bc7585a25735ac2d076cc3a4017": { - "balance": "6000000000000000000000" + "0x95e6f93dac228bc7585a25735ac2d076cc3a4017": { + "balance": "0x14542ba12a337c00000" }, - "3c1f91f301f4b565bca24751aa1f761322709ddd": { - "balance": "1790000000000000000000" + "0x3c1f91f301f4b565bca24751aa1f761322709ddd": { + "balance": "0x61093d7c2c6d380000" }, - "f77f9587ff7a2d7295f1f571c886bd33926a527c": { - "balance": "1999800000000000000000" + "0xf77f9587ff7a2d7295f1f571c886bd33926a527c": { + "balance": "0x6c68ccd09b022c0000" }, - "755f587e5efff773a220726a13d0f2130d9f896b": { - "balance": "1000000000000000000000" + "0x755f587e5efff773a220726a13d0f2130d9f896b": { + "balance": "0x3635c9adc5dea00000" }, - "8c6aa882ee322ca848578c06cb0fa911d3608305": { - "balance": "600000000000000000000" + "0x8c6aa882ee322ca848578c06cb0fa911d3608305": { + "balance": "0x2086ac351052600000" }, - "492cb5f861b187f9df21cd4485bed90b50ffe22d": { - "balance": "499928000000000000000" + "0x492cb5f861b187f9df21cd4485bed90b50ffe22d": { + "balance": "0x1b19e50b44977c0000" }, - "95a577dc2eb3ae6cb9dfc77af697d7efdfe89a01": { - "balance": "136000000000000000000" + "0x95a577dc2eb3ae6cb9dfc77af697d7efdfe89a01": { + "balance": "0x75f610f70ed200000" }, - "4173419d5c9f6329551dc4d3d0ceac1b701b869e": { - "balance": "88000000000000000000" + "0x4173419d5c9f6329551dc4d3d0ceac1b701b869e": { + "balance": "0x4c53ecdc18a600000" }, - "456ae0aca48ebcfae166060250525f63965e760f": { - "balance": "300000000000000000000" + "0x456ae0aca48ebcfae166060250525f63965e760f": { + "balance": "0x1043561a8829300000" }, - "81f8de2c283d5fd4afbda85dedf9760eabbbb572": { - "balance": "3000000000000000000000" + "0x81f8de2c283d5fd4afbda85dedf9760eabbbb572": { + "balance": "0xa2a15d09519be00000" }, - "cd0af3474e22f069ec3407870dd770443d5b12b0": { - "balance": "2626262000000000000000" + "0xcd0af3474e22f069ec3407870dd770443d5b12b0": { + "balance": "0x8e5eb4ee77b2ef0000" }, - "283c2314283c92d4b064f0aef9bb5246a7007f39": { - "balance": "200000000000000000000" + "0x283c2314283c92d4b064f0aef9bb5246a7007f39": { + "balance": "0xad78ebc5ac6200000" }, - "29b3f561ee7a6e25941e98a5325b78adc79785f3": { - "balance": "100000000000000000000" + "0x29b3f561ee7a6e25941e98a5325b78adc79785f3": { + "balance": "0x56bc75e2d63100000" }, - "cd4306d7f6947ac1744d4e13b8ef32cb657e1c00": { - "balance": "499986000000000000000" + "0xcd4306d7f6947ac1744d4e13b8ef32cb657e1c00": { + "balance": "0x1b1ab319f5ec750000" }, - "d9ec2efe99ff5cf00d03a8317b92a24aef441f7e": { - "balance": "2000000000000000000000" + "0xd9ec2efe99ff5cf00d03a8317b92a24aef441f7e": { + "balance": "0x6c6b935b8bbd400000" }, - "83dbf8a12853b40ac61996f8bf1dc8fdbaddd329": { - "balance": "970000000000000000000" + "0x83dbf8a12853b40ac61996f8bf1dc8fdbaddd329": { + "balance": "0x34957444b840e80000" }, - "9d93fab6e22845f8f45a07496f11de71530debc7": { - "balance": "1998000000000000000000" + "0x9d93fab6e22845f8f45a07496f11de71530debc7": { + "balance": "0x6c4fd1ee246e780000" }, - "fd204f4f4aba2525ba728afdf78792cbdeb735ae": { - "balance": "2000000000000000000000" + "0xfd204f4f4aba2525ba728afdf78792cbdeb735ae": { + "balance": "0x6c6b935b8bbd400000" }, - "99fad50038d0d9d4c3fbb4bce05606ecadcd5121": { - "balance": "2000000000000000000000" + "0x99fad50038d0d9d4c3fbb4bce05606ecadcd5121": { + "balance": "0x6c6b935b8bbd400000" }, - "d206aaddb336d45e7972e93cb075471d15897b5d": { - "balance": "600000000000000000000" + "0xd206aaddb336d45e7972e93cb075471d15897b5d": { + "balance": "0x2086ac351052600000" }, - "428a1ee0ed331d7952ccbe1c7974b2852bd1938a": { - "balance": "2208370000000000000000" + "0x428a1ee0ed331d7952ccbe1c7974b2852bd1938a": { + "balance": "0x77b74a4e8de5650000" }, - "690228e4bb12a8d4b5e0a797b0c5cf2a7509131e": { - "balance": "1880000000000000000000" + "0x690228e4bb12a8d4b5e0a797b0c5cf2a7509131e": { + "balance": "0x65ea3db75546600000" }, - "fa3a1aa4488b351aa7560cf5ee630a2fd45c3222": { - "balance": "878850000000000000000" + "0xfa3a1aa4488b351aa7560cf5ee630a2fd45c3222": { + "balance": "0x2fa47e6aa7340d0000" }, - "0372e852582e0934344a0fed2178304df25d4628": { - "balance": "20000000000000000000000" + "0x0372e852582e0934344a0fed2178304df25d4628": { + "balance": "0x43c33c1937564800000" }, - "35ea2163a38cdf9a123f82a5ec00258dae0bc767": { - "balance": "4000000000000000000000" + "0x35ea2163a38cdf9a123f82a5ec00258dae0bc767": { + "balance": "0xd8d726b7177a800000" }, - "d1fed0aee6f5dfd7e25769254c3cfad15adeccaa": { - "balance": "730000000000000000000" + "0xd1fed0aee6f5dfd7e25769254c3cfad15adeccaa": { + "balance": "0x2792c8fc4b53280000" }, - "c05b740620f173f16e52471dc38b9c514a0b1526": { - "balance": "140000000000000000000" + "0xc05b740620f173f16e52471dc38b9c514a0b1526": { + "balance": "0x796e3ea3f8ab00000" }, - "87e3062b2321e9dfb0875ce3849c9b2e3522d50a": { - "balance": "10000000000000000000000" + "0x87e3062b2321e9dfb0875ce3849c9b2e3522d50a": { + "balance": "0x21e19e0c9bab2400000" }, - "303fbaebbe46b35b6e5b74946a5f99bc1585cae7": { - "balance": "878148000000000000000" + "0x303fbaebbe46b35b6e5b74946a5f99bc1585cae7": { + "balance": "0x2f9ac0695f5bba0000" }, - "e7a8e471eafb798f4554cc6e526730fd56e62c7d": { - "balance": "1000000000000000000000" + "0xe7a8e471eafb798f4554cc6e526730fd56e62c7d": { + "balance": "0x3635c9adc5dea00000" }, - "ad7dd053859edff1cb6f9d2acbed6dd5e332426f": { - "balance": "1970000000000000000000" + "0xad7dd053859edff1cb6f9d2acbed6dd5e332426f": { + "balance": "0x6acb3df27e1f880000" }, - "dc4345d6812e870ae90c568c67d2c567cfb4f03c": { - "balance": "6700000000000000000000" + "0xdc4345d6812e870ae90c568c67d2c567cfb4f03c": { + "balance": "0x16b352da5e0ed300000" }, - "a6a08252c8595177cc2e60fc27593e2379c81fb1": { - "balance": "20055000000000000000" + "0xa6a08252c8595177cc2e60fc27593e2379c81fb1": { + "balance": "0x11651ac3e7a758000" }, - "a9af21acbe482f8131896a228036ba51b19453c3": { - "balance": "49999000000000000000" + "0xa9af21acbe482f8131896a228036ba51b19453c3": { + "balance": "0x2b5e021980cc18000" }, - "86e3fe86e93da486b14266eadf056cbfa4d91443": { - "balance": "2000000000000000000000" + "0x86e3fe86e93da486b14266eadf056cbfa4d91443": { + "balance": "0x6c6b935b8bbd400000" }, - "744b03bba8582ae5498e2dc22d19949467ab53fc": { - "balance": "500000000000000000000" + "0x744b03bba8582ae5498e2dc22d19949467ab53fc": { + "balance": "0x1b1ae4d6e2ef500000" }, - "d3118ea3c83505a9d893bb67e2de142d537a3ee7": { - "balance": "20000000000000000000" + "0xd3118ea3c83505a9d893bb67e2de142d537a3ee7": { + "balance": "0x1158e460913d00000" }, - "b32f1c2689a5ce79f1bc970b31584f1bcf2283e7": { - "balance": "20000000000000000000" + "0xb32f1c2689a5ce79f1bc970b31584f1bcf2283e7": { + "balance": "0x1158e460913d00000" }, - "4828e4cbe34e1510afb72c2beeac8a4513eaebd9": { - "balance": "3940000000000000000000" + "0x4828e4cbe34e1510afb72c2beeac8a4513eaebd9": { + "balance": "0xd5967be4fc3f100000" }, - "b07bcc085ab3f729f24400416837b69936ba8873": { - "balance": "2000140000000000000000" + "0xb07bcc085ab3f729f24400416837b69936ba8873": { + "balance": "0x6c6d84bccdd9ce0000" }, - "bdc74873af922b9df474853b0fa7ff0bf8c82695": { - "balance": "3999000000000000000000" + "0xbdc74873af922b9df474853b0fa7ff0bf8c82695": { + "balance": "0xd8c9460063d31c0000" }, - "15ebd1c7cad2aff19275c657c4d808d010efa0f5": { - "balance": "200550000000000000000" + "0x15ebd1c7cad2aff19275c657c4d808d010efa0f5": { + "balance": "0xadf30ba70c8970000" }, - "cbc04b4d8b82caf670996f160c362940d66fcf1a": { - "balance": "6000000000000000000000" + "0xcbc04b4d8b82caf670996f160c362940d66fcf1a": { + "balance": "0x14542ba12a337c00000" }, - "8197948121732e63d9c148194ecad46e30b749c8": { - "balance": "4000000000000000000000" + "0x8197948121732e63d9c148194ecad46e30b749c8": { + "balance": "0xd8d726b7177a800000" }, - "69797bfb12c9bed682b91fbc593591d5e4023728": { - "balance": "10000000000000000000000" + "0x69797bfb12c9bed682b91fbc593591d5e4023728": { + "balance": "0x21e19e0c9bab2400000" }, - "be9b8c34b78ee947ff81472eda7af9d204bc8466": { - "balance": "150000000000000000000" + "0xbe9b8c34b78ee947ff81472eda7af9d204bc8466": { + "balance": "0x821ab0d4414980000" }, - "df3f57b8ee6434d047223def74b20f63f9e4f955": { - "balance": "250500000000000000000" + "0xdf3f57b8ee6434d047223def74b20f63f9e4f955": { + "balance": "0xd9462c6cb4b5a0000" }, - "a3ae1879007d801cb5f352716a4dd8ba2721de3d": { - "balance": "200000000000000000000000" + "0xa3ae1879007d801cb5f352716a4dd8ba2721de3d": { + "balance": "0x2a5a058fc295ed000000" }, - "cb4bb1c623ba28dc42bdaaa6e74e1d2aa1256c2a": { - "balance": "1999944000000000000000" + "0xcb4bb1c623ba28dc42bdaaa6e74e1d2aa1256c2a": { + "balance": "0x6c6acc67d7b1d40000" }, - "e03c00d00388ecbf4f263d0ac778bb41a57a40d9": { - "balance": "1000072000000000000000" + "0xe03c00d00388ecbf4f263d0ac778bb41a57a40d9": { + "balance": "0x3636c9796436740000" }, - "fc2c1f88961d019c3e9ea33009152e0693fbf88a": { - "balance": "8000000000000000000000" + "0xfc2c1f88961d019c3e9ea33009152e0693fbf88a": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "8599cbd5a6a9dcd4b966be387d69775da5e33c6f": { - "balance": "58180000000000000000000" + "0x8599cbd5a6a9dcd4b966be387d69775da5e33c6f": { + "balance": "0xc51f1b1d52622900000" }, - "b7a31a7c38f3db09322eae11d2272141ea229902": { - "balance": "2000000000000000000000" + "0xb7a31a7c38f3db09322eae11d2272141ea229902": { + "balance": "0x6c6b935b8bbd400000" }, - "231a15acc199c89fa9cb22441cc70330bdcce617": { - "balance": "500000000000000000000" + "0x231a15acc199c89fa9cb22441cc70330bdcce617": { + "balance": "0x1b1ae4d6e2ef500000" }, - "3fbed6e7e0ca9c84fbe9ebcf9d4ef9bb49428165": { - "balance": "2000000000000000000000" + "0x3fbed6e7e0ca9c84fbe9ebcf9d4ef9bb49428165": { + "balance": "0x6c6b935b8bbd400000" }, - "92cfd60188efdfb2f8c2e7b1698abb9526c1511f": { - "balance": "2000000000000000000000" + "0x92cfd60188efdfb2f8c2e7b1698abb9526c1511f": { + "balance": "0x6c6b935b8bbd400000" }, - "5c936f3b9d22c403db5e730ff177d74eef42dbbf": { - "balance": "75000000000000000000" + "0x5c936f3b9d22c403db5e730ff177d74eef42dbbf": { + "balance": "0x410d586a20a4c0000" }, - "931fe712f64207a2fd5022728843548bfb8cbb05": { - "balance": "2000000000000000000000" + "0x931fe712f64207a2fd5022728843548bfb8cbb05": { + "balance": "0x6c6b935b8bbd400000" }, - "08d54e83ad486a934cfaeae283a33efd227c0e99": { - "balance": "1039000000000000000000" + "0x08d54e83ad486a934cfaeae283a33efd227c0e99": { + "balance": "0x38530583245edc0000" }, - "a339a3d8ca280e27d2415b26d1fc793228b66043": { - "balance": "1013600000000000000000" + "0xa339a3d8ca280e27d2415b26d1fc793228b66043": { + "balance": "0x36f28695b78ff00000" }, - "581f34b523e5b41c09c87c298e299cbc0e29d066": { - "balance": "1131607000000000000000" + "0x581f34b523e5b41c09c87c298e299cbc0e29d066": { + "balance": "0x3d5833aafd39758000" }, - "caaa68ee6cdf0d34454a769b0da148a1faaa1865": { - "balance": "7216000000000000000000" + "0xcaaa68ee6cdf0d34454a769b0da148a1faaa1865": { + "balance": "0x1872e1de7fe52c00000" }, - "0838a7768d9c2aca8ba279adfee4b1f491e326f1": { - "balance": "200000000000000000000" + "0x0838a7768d9c2aca8ba279adfee4b1f491e326f1": { + "balance": "0xad78ebc5ac6200000" }, - "dde77a4740ba08e7f73fbe3a1674912931742eeb": { - "balance": "19867021000000000000000" + "0xdde77a4740ba08e7f73fbe3a1674912931742eeb": { + "balance": "0x434fe4d4382f1d48000" }, - "cbe810fe0fecc964474a1db97728bc87e973fcbd": { - "balance": "10000000000000000000000" + "0xcbe810fe0fecc964474a1db97728bc87e973fcbd": { + "balance": "0x21e19e0c9bab2400000" }, - "86c28b5678af37d727ec05e4447790f15f71f2ea": { - "balance": "200000000000000000000" + "0x86c28b5678af37d727ec05e4447790f15f71f2ea": { + "balance": "0xad78ebc5ac6200000" }, - "dd6c062193eac23d2fdbf997d5063a346bb3b470": { - "balance": "20000000000000000000" + "0xdd6c062193eac23d2fdbf997d5063a346bb3b470": { + "balance": "0x1158e460913d00000" }, - "5975b9528f23af1f0e2ec08ac8ebaa786a2cb8e0": { - "balance": "345827000000000000000" + "0x5975b9528f23af1f0e2ec08ac8ebaa786a2cb8e0": { + "balance": "0x12bf50503ae3038000" }, - "e29d8ae452dcf3b6ac645e630409385551faae0a": { - "balance": "80276000000000000000" + "0xe29d8ae452dcf3b6ac645e630409385551faae0a": { + "balance": "0x45a0da4adf5420000" }, - "2fbc85798a583598b522166d6e9dda121d627dbc": { - "balance": "200000000000000000000" + "0x2fbc85798a583598b522166d6e9dda121d627dbc": { + "balance": "0xad78ebc5ac6200000" }, - "7a36aba5c31ea0ca7e277baa32ec46ce93cf7506": { - "balance": "20000000000000000000000" + "0x7a36aba5c31ea0ca7e277baa32ec46ce93cf7506": { + "balance": "0x43c33c1937564800000" }, - "dbcbcd7a57ea9db2349b878af34b1ad642a7f1d1": { - "balance": "200000000000000000000" + "0xdbcbcd7a57ea9db2349b878af34b1ad642a7f1d1": { + "balance": "0xad78ebc5ac6200000" }, - "92aae59768eddff83cfe60bb512e730a05a161d7": { - "balance": "1708015000000000000000" + "0x92aae59768eddff83cfe60bb512e730a05a161d7": { + "balance": "0x5c9778410c76d18000" }, - "a5e93b49ea7c509de7c44d6cfeddef5910deaaf2": { - "balance": "2000000000000000000000" + "0xa5e93b49ea7c509de7c44d6cfeddef5910deaaf2": { + "balance": "0x6c6b935b8bbd400000" }, - "e33d980220fab259af6a1f4b38cf0ef3c6e2ea1a": { - "balance": "2000000000000000000000" + "0xe33d980220fab259af6a1f4b38cf0ef3c6e2ea1a": { + "balance": "0x6c6b935b8bbd400000" }, - "8ed0af11ff2870da0681004afe18b013f7bd3882": { - "balance": "4000000000000000000000" + "0x8ed0af11ff2870da0681004afe18b013f7bd3882": { + "balance": "0xd8d726b7177a800000" }, - "f23e5c633221a8f7363e65870c9f287424d2a960": { - "balance": "1380000000000000000000" + "0xf23e5c633221a8f7363e65870c9f287424d2a960": { + "balance": "0x4acf58e07257100000" }, - "96334bfe04fffa590213eab36514f338b864b736": { - "balance": "400000000000000000000" + "0x96334bfe04fffa590213eab36514f338b864b736": { + "balance": "0x15af1d78b58c400000" }, - "fa1f1971a775c3504fef5079f640c2c4bce7ac05": { - "balance": "2000000000000000000000" + "0xfa1f1971a775c3504fef5079f640c2c4bce7ac05": { + "balance": "0x6c6b935b8bbd400000" }, - "df44c47fc303ac76e74f97194cca67b5bb3c023f": { - "balance": "591000000000000000000" + "0xdf44c47fc303ac76e74f97194cca67b5bb3c023f": { + "balance": "0x2009c5c8bf6fdc0000" }, - "4b74f5e58e2edf76daf70151964a0b8f1de0663c": { - "balance": "324020000000000000000" + "0x4b74f5e58e2edf76daf70151964a0b8f1de0663c": { + "balance": "0x1190ae4944ba120000" }, - "e38b91b35190b6d9deed021c30af094b953fdcaa": { - "balance": "33340000000000000000" + "0xe38b91b35190b6d9deed021c30af094b953fdcaa": { + "balance": "0x1ceaf795b6b860000" }, - "6b38de841fad7f53fe02da115bd86aaf662466bd": { - "balance": "1730000000000000000000" + "0x6b38de841fad7f53fe02da115bd86aaf662466bd": { + "balance": "0x5dc892aa1131c80000" }, - "11675a25554607a3b6c92a9ee8f36f75edd3e336": { - "balance": "159800000000000000000" + "0x11675a25554607a3b6c92a9ee8f36f75edd3e336": { + "balance": "0x8a9aba557e36c0000" }, - "0ba8705bf55cf219c0956b5e3fc01c4474a6cdc1": { - "balance": "94963000000000000000" + "0x0ba8705bf55cf219c0956b5e3fc01c4474a6cdc1": { + "balance": "0x525e0595d4d6b8000" }, - "0f05f120c89e9fbc93d4ab0c5e2b4a0df092b424": { - "balance": "30000000000000000000000" + "0x0f05f120c89e9fbc93d4ab0c5e2b4a0df092b424": { + "balance": "0x65a4da25d3016c00000" }, - "fdd1195f797d4f35717d15e6f9810a9a3ff55460": { - "balance": "18200000000000000000" + "0xfdd1195f797d4f35717d15e6f9810a9a3ff55460": { + "balance": "0xfc936392801c0000" }, - "63a61dc30a8e3b30a763c4213c801cbf98738178": { - "balance": "1000000000000000000000" + "0x63a61dc30a8e3b30a763c4213c801cbf98738178": { + "balance": "0x3635c9adc5dea00000" }, - "e5bdf34f4ccc483e4ca530cc7cf2bb18febe92b3": { - "balance": "126260000000000000000" + "0xe5bdf34f4ccc483e4ca530cc7cf2bb18febe92b3": { + "balance": "0x6d835a10bbcd20000" }, - "d6e09e98fe1300332104c1ca34fbfac554364ed9": { - "balance": "2000000000000000000000" + "0xd6e09e98fe1300332104c1ca34fbfac554364ed9": { + "balance": "0x6c6b935b8bbd400000" }, - "5bd6862d517d4de4559d4eec0a06cad05e2f946e": { - "balance": "200000000000000000000" + "0x5bd6862d517d4de4559d4eec0a06cad05e2f946e": { + "balance": "0xad78ebc5ac6200000" }, - "7294ec9da310bc6b4bbdf543b0ef45abfc3e1b4d": { - "balance": "22000000000000000000000" + "0x7294ec9da310bc6b4bbdf543b0ef45abfc3e1b4d": { + "balance": "0x4a89f54ef0121c00000" }, - "ae34861d342253194ffc6652dfde51ab44cad3fe": { - "balance": "466215000000000000000" + "0xae34861d342253194ffc6652dfde51ab44cad3fe": { + "balance": "0x194608686316bd8000" }, - "f50ae7fab4cfb5a646ee04ceadf9bf9dd5a8e540": { - "balance": "3999952000000000000000" + "0xf50ae7fab4cfb5a646ee04ceadf9bf9dd5a8e540": { + "balance": "0xd8d67c2f5895480000" }, - "dd2bdfa917c1f310e6fa35aa8af16939c233cd7d": { - "balance": "400000000000000000000" + "0xdd2bdfa917c1f310e6fa35aa8af16939c233cd7d": { + "balance": "0x15af1d78b58c400000" }, - "e0060462c47ff9679baef07159cae08c29f274a9": { - "balance": "2000000000000000000000" + "0xe0060462c47ff9679baef07159cae08c29f274a9": { + "balance": "0x6c6b935b8bbd400000" }, - "b7d12e84a2e4c4a6345af1dd1da9f2504a2a996e": { - "balance": "200000000000000000000" + "0xb7d12e84a2e4c4a6345af1dd1da9f2504a2a996e": { + "balance": "0xad78ebc5ac6200000" }, - "f5500178cb998f126417831a08c2d7abfff6ab5f": { - "balance": "1308923000000000000000" + "0xf5500178cb998f126417831a08c2d7abfff6ab5f": { + "balance": "0x46f4f4a5875a9f8000" }, - "fd377a385272900cb436a3bb7962cdffe93f5dad": { - "balance": "2000000000000000000000" + "0xfd377a385272900cb436a3bb7962cdffe93f5dad": { + "balance": "0x6c6b935b8bbd400000" }, - "a4a83a0738799b971bf2de708c2ebf911ca79eb2": { - "balance": "600000000000000000000" + "0xa4a83a0738799b971bf2de708c2ebf911ca79eb2": { + "balance": "0x2086ac351052600000" }, - "52a5e4de4393eeccf0581ac11b52c683c76ea15d": { - "balance": "19999800000000000000000" + "0x52a5e4de4393eeccf0581ac11b52c683c76ea15d": { + "balance": "0x43c30fb0884a96c0000" }, - "b07fdeaff91d4460fe6cd0e8a1b0bd8d22a62e87": { - "balance": "5260000000000000000000" + "0xb07fdeaff91d4460fe6cd0e8a1b0bd8d22a62e87": { + "balance": "0x11d2529f3535ab00000" }, - "35f5860149e4bbc04b8ac5b272be55ad1aca58e0": { - "balance": "200000000000000000000" + "0x35f5860149e4bbc04b8ac5b272be55ad1aca58e0": { + "balance": "0xad78ebc5ac6200000" }, - "fb135eb15a8bac72b69915342a60bbc06b7e077c": { - "balance": "20000000000000000000000" + "0xfb135eb15a8bac72b69915342a60bbc06b7e077c": { + "balance": "0x43c33c1937564800000" }, - "02d4a30968a39e2b3498c3a6a4ed45c1c6646822": { - "balance": "2000000000000000000000" + "0x02d4a30968a39e2b3498c3a6a4ed45c1c6646822": { + "balance": "0x6c6b935b8bbd400000" }, - "e44b7264dd836bee8e87970340ed2b9aed8ed0a5": { - "balance": "5772100000000000000000" + "0xe44b7264dd836bee8e87970340ed2b9aed8ed0a5": { + "balance": "0x138e7faa01a803a0000" }, - "e90a354cec04d69e5d96ddc0c5138d3d33150aa0": { - "balance": "499971000000000000000" + "0xe90a354cec04d69e5d96ddc0c5138d3d33150aa0": { + "balance": "0x1b1a7dcf8a44d38000" }, - "693d83be09459ef8390b2e30d7f7c28de4b4284e": { - "balance": "2000000000000000000000" + "0x693d83be09459ef8390b2e30d7f7c28de4b4284e": { + "balance": "0x6c6b935b8bbd400000" }, - "87bf7cd5d8a929e1c785f9e5449106ac232463c9": { - "balance": "77800000000000000000" + "0x87bf7cd5d8a929e1c785f9e5449106ac232463c9": { + "balance": "0x437b11fcc45640000" }, - "e5f8ef6d970636b0dcaa4f200ffdc9e75af1741c": { - "balance": "2000000000000000000000" + "0xe5f8ef6d970636b0dcaa4f200ffdc9e75af1741c": { + "balance": "0x6c6b935b8bbd400000" }, - "fef09d70243f39ed8cd800bf9651479e8f4aca3c": { - "balance": "200000000000000000000" + "0xfef09d70243f39ed8cd800bf9651479e8f4aca3c": { + "balance": "0xad78ebc5ac6200000" }, - "e98c91cadd924c92579e11b41217b282956cdaa1": { - "balance": "135800000000000000000" + "0xe98c91cadd924c92579e11b41217b282956cdaa1": { + "balance": "0x75c9a8480320c0000" }, - "c2836188d9a29253e0cbda6571b058c289a0bb32": { - "balance": "2000000000000000000000" + "0xc2836188d9a29253e0cbda6571b058c289a0bb32": { + "balance": "0x6c6b935b8bbd400000" }, - "afa6946effd5ff53154f82010253df47ae280ccc": { - "balance": "1970000000000000000000" + "0xafa6946effd5ff53154f82010253df47ae280ccc": { + "balance": "0x6acb3df27e1f880000" }, - "43c7ebc5b3e7af16f47dc5617ab10e0f39b4afbb": { - "balance": "1910000000000000000000" + "0x43c7ebc5b3e7af16f47dc5617ab10e0f39b4afbb": { + "balance": "0x678a932062e4180000" }, - "097ecda22567c2d91cb03f8c5215c22e9dcda949": { - "balance": "20055000000000000000" + "0x097ecda22567c2d91cb03f8c5215c22e9dcda949": { + "balance": "0x11651ac3e7a758000" }, - "3e66b84769566ab67945d5fa81373556bcc3a1fa": { - "balance": "152000000000000000000" + "0x3e66b84769566ab67945d5fa81373556bcc3a1fa": { + "balance": "0x83d6c7aab63600000" }, - "56373daab46316fd7e1576c61e6affcb6559ddd7": { - "balance": "215340000000000000000" + "0x56373daab46316fd7e1576c61e6affcb6559ddd7": { + "balance": "0xbac715d146c9e0000" }, - "faaeba8fc0bbda553ca72e30ef3d732e26e82041": { - "balance": "1338337000000000000000" + "0xfaaeba8fc0bbda553ca72e30ef3d732e26e82041": { + "balance": "0x488d282aafc9f68000" }, - "f54c19d9ef3873bfd1f7a622d02d86249a328f06": { - "balance": "44284729000000000000000" + "0xf54c19d9ef3873bfd1f7a622d02d86249a328f06": { + "balance": "0x960ae127af32fb28000" }, - "825309a7d45d1812f51e6e8df5a7b96f6c908887": { - "balance": "2365000000000000000000" + "0x825309a7d45d1812f51e6e8df5a7b96f6c908887": { + "balance": "0x8034f7d9b166d40000" }, - "89009e3c6488bd5e570d1da34eabe28ed024de1b": { - "balance": "20000000000000000000000" + "0x89009e3c6488bd5e570d1da34eabe28ed024de1b": { + "balance": "0x43c33c1937564800000" }, - "63977cad7d0dcdc52b9ac9f2ffa136e8642882b8": { - "balance": "75000000000000000000" + "0x63977cad7d0dcdc52b9ac9f2ffa136e8642882b8": { + "balance": "0x410d586a20a4c0000" }, - "c239abdfae3e9af5457f52ed2b91fd0ab4d9c700": { - "balance": "2000000000000000000000" + "0xc239abdfae3e9af5457f52ed2b91fd0ab4d9c700": { + "balance": "0x6c6b935b8bbd400000" }, - "1a4ec6a0ae7f5a9427d23db9724c0d0cffb2ab2f": { - "balance": "179000000000000000000" + "0x1a4ec6a0ae7f5a9427d23db9724c0d0cffb2ab2f": { + "balance": "0x9b41fbf9e0aec0000" }, - "a12a6c2d985daf0e4f5f207ae851aaf729b332cd": { - "balance": "100000000000000000000000" + "0xa12a6c2d985daf0e4f5f207ae851aaf729b332cd": { + "balance": "0x152d02c7e14af6800000" }, - "cbe52fc533d7dd608c92a260b37c3f45deb4eb33": { - "balance": "1000000000000000000000" + "0xcbe52fc533d7dd608c92a260b37c3f45deb4eb33": { + "balance": "0x3635c9adc5dea00000" }, - "abb2e6a72a40ba6ed908cdbcec3c5612583132fe": { - "balance": "1460000000000000000000" + "0xabb2e6a72a40ba6ed908cdbcec3c5612583132fe": { + "balance": "0x4f2591f896a6500000" }, - "6503860b191008c15583bfc88158099301762828": { - "balance": "1000000000000000000000" + "0x6503860b191008c15583bfc88158099301762828": { + "balance": "0x3635c9adc5dea00000" }, - "a0228240f99e1de9cb32d82c0f2fa9a3d44b0bf3": { - "balance": "1600000000000000000000" + "0xa0228240f99e1de9cb32d82c0f2fa9a3d44b0bf3": { + "balance": "0x56bc75e2d631000000" }, - "e154daeadb545838cbc6aa0c55751902f528682a": { - "balance": "4925000000000000000000" + "0xe154daeadb545838cbc6aa0c55751902f528682a": { + "balance": "0x10afc1ade3b4ed40000" }, - "8e92aba38e72a098170b92959246537a2e5556c0": { - "balance": "267400000000000000000" + "0x8e92aba38e72a098170b92959246537a2e5556c0": { + "balance": "0xe7eeba3410b740000" }, - "d23d7affacdc3e9f3dae7afcb4006f58f8a44600": { - "balance": "3600000000000000000000" + "0xd23d7affacdc3e9f3dae7afcb4006f58f8a44600": { + "balance": "0xc328093e61ee400000" }, - "00d78d89b35f472716eceafebf600527d3a1f969": { - "balance": "27750000000000000000000" + "0x00d78d89b35f472716eceafebf600527d3a1f969": { + "balance": "0x5e0549c9632e1d80000" }, - "120f9de6e0af7ec02a07c609ca8447f157e6344c": { - "balance": "267400000000000000000" + "0x120f9de6e0af7ec02a07c609ca8447f157e6344c": { + "balance": "0xe7eeba3410b740000" }, - "e0352fdf819ba265f14c06a6315c4ac1fe131b2e": { - "balance": "1000000000000000000000" + "0xe0352fdf819ba265f14c06a6315c4ac1fe131b2e": { + "balance": "0x3635c9adc5dea00000" }, - "8f47328ee03201c9d35ed2b5412b25decc859362": { - "balance": "2000000000000000000000" + "0x8f47328ee03201c9d35ed2b5412b25decc859362": { + "balance": "0x6c6b935b8bbd400000" }, - "453e359a3397944c5a275ab1a2f70a5e5a3f6989": { - "balance": "240000000000000000000" + "0x453e359a3397944c5a275ab1a2f70a5e5a3f6989": { + "balance": "0xd02ab486cedc00000" }, - "9bf58efbea0784eb068adecfa0bb215084c73a35": { - "balance": "5800000000000000000000" + "0x9bf58efbea0784eb068adecfa0bb215084c73a35": { + "balance": "0x13a6b2b564871a00000" }, - "21bfe1b45cacde6274fd8608d9a178bf3eeb6edc": { - "balance": "2009400000000000000000" + "0x21bfe1b45cacde6274fd8608d9a178bf3eeb6edc": { + "balance": "0x6cee06ddbe15ec0000" }, - "d1d5b17ffe2d7bbb79cc7d7930bcb2e518fb1bbf": { - "balance": "3000000000000000000000" + "0xd1d5b17ffe2d7bbb79cc7d7930bcb2e518fb1bbf": { + "balance": "0xa2a15d09519be00000" }, - "20a29c5079e26b3f18318bb2e50e8e8b346e5be8": { - "balance": "499986000000000000000" + "0x20a29c5079e26b3f18318bb2e50e8e8b346e5be8": { + "balance": "0x1b1ab319f5ec750000" }, - "7d392852f3abd92ff4bb5bb26cb60874f2be6795": { - "balance": "1000070000000000000000" + "0x7d392852f3abd92ff4bb5bb26cb60874f2be6795": { + "balance": "0x3636c25e66ece70000" }, - "55852943492970f8d629a15366cdda06a94f4513": { - "balance": "2000000000000000000000" + "0x55852943492970f8d629a15366cdda06a94f4513": { + "balance": "0x6c6b935b8bbd400000" }, - "ab5dfc1ea21adc42cf8c3f6e361e243fd0da61e5": { - "balance": "300000000000000000000" + "0xab5dfc1ea21adc42cf8c3f6e361e243fd0da61e5": { + "balance": "0x1043561a8829300000" }, - "9d2bfc36106f038250c01801685785b16c86c60d": { - "balance": "380000000000000000000000" + "0x9d2bfc36106f038250c01801685785b16c86c60d": { + "balance": "0x5077d75df1b675800000" }, - "6e60aee1a78f8eda8b424c73e353354ae67c3042": { - "balance": "3490300000000000000000" + "0x6e60aee1a78f8eda8b424c73e353354ae67c3042": { + "balance": "0xbd35a48d9919e60000" }, - "7e29290038493559194e946d4e460b96fc38a156": { - "balance": "309072000000000000000" + "0x7e29290038493559194e946d4e460b96fc38a156": { + "balance": "0x10c13c527763880000" }, - "6006e36d929bf45d8f16231b126a011ae283d925": { - "balance": "176000000000000000000" + "0x6006e36d929bf45d8f16231b126a011ae283d925": { + "balance": "0x98a7d9b8314c00000" }, - "d6d03572a45245dbd4368c4f82c95714bd2167e2": { - "balance": "1162200000000000000000" + "0xd6d03572a45245dbd4368c4f82c95714bd2167e2": { + "balance": "0x3f00c3d66686fc0000" }, - "d1432538e35b7664956ae495a32abdf041a7a21c": { - "balance": "19700000000000000000000" + "0xd1432538e35b7664956ae495a32abdf041a7a21c": { + "balance": "0x42bf06b78ed3b500000" }, - "2276264bec8526c0c0f270677abaf4f0e441e167": { - "balance": "1000000000000000000000" + "0x2276264bec8526c0c0f270677abaf4f0e441e167": { + "balance": "0x3635c9adc5dea00000" }, - "c8814e34523e38e1f927a7dce8466a447a093603": { - "balance": "10000000000000000000000" + "0xc8814e34523e38e1f927a7dce8466a447a093603": { + "balance": "0x21e19e0c9bab2400000" }, - "688a569e965524eb1d0ac3d3733eab909fb3d61e": { - "balance": "1320000000000000000000" + "0x688a569e965524eb1d0ac3d3733eab909fb3d61e": { + "balance": "0x478eae0e571ba00000" }, - "90dc09f717fc2a5b69fd60ba08ebf40bf4e8246c": { - "balance": "4000086000000000000000" + "0x90dc09f717fc2a5b69fd60ba08ebf40bf4e8246c": { + "balance": "0xd8d8583fa2d52f0000" }, - "239a733e6b855ac592d663156186a8a174d2449e": { - "balance": "1637020000000000000000" + "0x239a733e6b855ac592d663156186a8a174d2449e": { + "balance": "0x58be3758b241f60000" }, - "bcdfacb9d9023c3417182e9100e8ea1d373393a3": { - "balance": "59100000000000000000" + "0xbcdfacb9d9023c3417182e9100e8ea1d373393a3": { + "balance": "0x3342d60dff1960000" }, - "ba6440aeb3737b8ef0f1af9b0c15f4c214ffc7cf": { - "balance": "1000000000000000000000" + "0xba6440aeb3737b8ef0f1af9b0c15f4c214ffc7cf": { + "balance": "0x3635c9adc5dea00000" }, - "322e5c43b0f524389655a9b3ff24f2d4db3da10f": { - "balance": "4650000000000000000000" + "0x322e5c43b0f524389655a9b3ff24f2d4db3da10f": { + "balance": "0xfc13b69b3e7e680000" }, - "be5a60689998639ad75bc105a371743eef0f7940": { - "balance": "501700000000000000000" + "0xbe5a60689998639ad75bc105a371743eef0f7940": { + "balance": "0x1b327c73e1257a0000" }, - "b727a9fc82e1cffc5c175fa1485a9befa2cdbdd1": { - "balance": "999000000000000000000" + "0xb727a9fc82e1cffc5c175fa1485a9befa2cdbdd1": { + "balance": "0x3627e8f712373c0000" }, - "a3883a24f7f166205f1a6a9949076c26a76e7178": { - "balance": "1820000000000000000000" + "0xa3883a24f7f166205f1a6a9949076c26a76e7178": { + "balance": "0x62a992e53a0af00000" }, - "5e95fe5ffcf998f9f9ac0e9a81dab83ead77003d": { - "balance": "539766000000000000000" + "0x5e95fe5ffcf998f9f9ac0e9a81dab83ead77003d": { + "balance": "0x1d42c20d32797f0000" }, - "e60955dc0bc156f6c41849f6bd776ba44b0ef0a1": { - "balance": "299982000000000000000" + "0xe60955dc0bc156f6c41849f6bd776ba44b0ef0a1": { + "balance": "0x10431627a0933b0000" }, - "af203e229d7e6d419df4378ea98715515f631485": { - "balance": "1970000000000000000000" + "0xaf203e229d7e6d419df4378ea98715515f631485": { + "balance": "0x6acb3df27e1f880000" }, - "86499a1228ff2d7ee307759364506f8e8c8307a5": { - "balance": "1970000000000000000000" + "0x86499a1228ff2d7ee307759364506f8e8c8307a5": { + "balance": "0x6acb3df27e1f880000" }, - "1a04cec420ad432215246d77fe178d339ed0b595": { - "balance": "316000000000000000000" + "0x1a04cec420ad432215246d77fe178d339ed0b595": { + "balance": "0x11216185c29f700000" }, - "cc2b5f448f3528d3fe41cc7d1fa9c0dc76f1b776": { - "balance": "60000000000000000000" + "0xcc2b5f448f3528d3fe41cc7d1fa9c0dc76f1b776": { + "balance": "0x340aad21b3b700000" }, - "cb50587412822304ebcba07dab3a0f09fffee486": { - "balance": "1370000000000000000000" + "0xcb50587412822304ebcba07dab3a0f09fffee486": { + "balance": "0x4a4491bd6dcd280000" }, - "4ae2a04d3909ef454e544ccfd614bfefa71089ae": { - "balance": "442800000000000000000" + "0x4ae2a04d3909ef454e544ccfd614bfefa71089ae": { + "balance": "0x1801159df1eef80000" }, - "c8a2c4e59e1c7fc54805580438aed3e44afdf00e": { - "balance": "44000000000000000000" + "0xc8a2c4e59e1c7fc54805580438aed3e44afdf00e": { + "balance": "0x2629f66e0c5300000" }, - "5792814f59a33a1843faa01baa089eb02ffb5cf1": { - "balance": "499986000000000000000" + "0x5792814f59a33a1843faa01baa089eb02ffb5cf1": { + "balance": "0x1b1ab319f5ec750000" }, - "a1f2854050f872658ed82e52b0ad7bbc1cb921f6": { - "balance": "2010918000000000000000" + "0xa1f2854050f872658ed82e52b0ad7bbc1cb921f6": { + "balance": "0x6d0317e2b326f70000" }, - "92dca5e102b3b81b60f1a504634947c374a88ccb": { - "balance": "2000000000000000000000" + "0x92dca5e102b3b81b60f1a504634947c374a88ccb": { + "balance": "0x6c6b935b8bbd400000" }, - "732fead60f7bfdd6a9dec48125e3735db1b6654f": { - "balance": "20000000000000000000" + "0x732fead60f7bfdd6a9dec48125e3735db1b6654f": { + "balance": "0x1158e460913d00000" }, - "6bf7b3c065f2c1e7c6eb092ba0d15066f393d1b8": { - "balance": "400000000000000000000" + "0x6bf7b3c065f2c1e7c6eb092ba0d15066f393d1b8": { + "balance": "0x15af1d78b58c400000" }, - "cde36d81d128c59da145652193eec2bfd96586ef": { - "balance": "4000000000000000000000" + "0xcde36d81d128c59da145652193eec2bfd96586ef": { + "balance": "0xd8d726b7177a800000" }, - "40eddb448d690ed72e05c225d34fc8350fa1e4c5": { - "balance": "7000000000000000000000" + "0x40eddb448d690ed72e05c225d34fc8350fa1e4c5": { + "balance": "0x17b7883c06916600000" }, - "454b61b344c0ef965179238155f277c3829d0b38": { - "balance": "2000000000000000000000" + "0x454b61b344c0ef965179238155f277c3829d0b38": { + "balance": "0x6c6b935b8bbd400000" }, - "ac3da526cfce88297302f34c49ca520dc271f9b2": { - "balance": "800000000000000000000" + "0xac3da526cfce88297302f34c49ca520dc271f9b2": { + "balance": "0x2b5e3af16b18800000" }, - "c989eec307e8839b9d7237cfda08822962abe487": { - "balance": "400000000000000000000" + "0xc989eec307e8839b9d7237cfda08822962abe487": { + "balance": "0x15af1d78b58c400000" }, - "e99de258a4173ce9ac38ede26c0b3bea3c0973d5": { - "balance": "1656800000000000000000" + "0xe99de258a4173ce9ac38ede26c0b3bea3c0973d5": { + "balance": "0x59d0b805e5bb300000" }, - "ff0cb06c42e3d88948e45bd7b0d4e291aefeea51": { - "balance": "1910000000000000000000" + "0xff0cb06c42e3d88948e45bd7b0d4e291aefeea51": { + "balance": "0x678a932062e4180000" }, - "0990e81cd785599ea236bd1966cf526302c35b9c": { - "balance": "1000000000000000000000" + "0x0990e81cd785599ea236bd1966cf526302c35b9c": { + "balance": "0x3635c9adc5dea00000" }, - "6da0ed8f1d69339f059f2a0e02471cb44fb8c3bb": { - "balance": "935900000000000000000" + "0x6da0ed8f1d69339f059f2a0e02471cb44fb8c3bb": { + "balance": "0x32bc38bb63a8160000" }, - "5d958a9bd189c2985f86c58a8c69a7a78806e8da": { - "balance": "10200000000000000000000" + "0x5d958a9bd189c2985f86c58a8c69a7a78806e8da": { + "balance": "0x228f16f861578600000" }, - "98be696d51e390ff1c501b8a0f6331b628ddc5ad": { - "balance": "2000000000000000000000" + "0x98be696d51e390ff1c501b8a0f6331b628ddc5ad": { + "balance": "0x6c6b935b8bbd400000" }, - "09d0b8cd077c69d9f32d9cca43b3c208a21ed48b": { - "balance": "150011000000000000000" + "0x09d0b8cd077c69d9f32d9cca43b3c208a21ed48b": { + "balance": "0x821d221b5291f8000" }, - "96e7c0c9d5bf10821bf140c558a145b7cac21397": { - "balance": "1056000000000000000000" + "0x96e7c0c9d5bf10821bf140c558a145b7cac21397": { + "balance": "0x393ef1a5127c800000" }, - "5b736eb18353629bde9676dadd165034ce5ecc68": { - "balance": "1970000000000000000000" + "0x5b736eb18353629bde9676dadd165034ce5ecc68": { + "balance": "0x6acb3df27e1f880000" }, - "e5a365343cc4eb1e770368e1f1144a77b832d7e0": { - "balance": "20000000000000000000" + "0xe5a365343cc4eb1e770368e1f1144a77b832d7e0": { + "balance": "0x1158e460913d00000" }, - "4cf5537b85842f89cfee359eae500fc449d2118f": { - "balance": "1000000000000000000000" + "0x4cf5537b85842f89cfee359eae500fc449d2118f": { + "balance": "0x3635c9adc5dea00000" }, - "c71f1d75873f33dcb2dd4b3987a12d0791a5ce27": { - "balance": "1015200000000000000000" + "0xc71f1d75873f33dcb2dd4b3987a12d0791a5ce27": { + "balance": "0x3708baed3d68900000" }, - "9bf703b41c3624e15f4054962390bcba3052f0fd": { - "balance": "6055000000000000000000" + "0x9bf703b41c3624e15f4054962390bcba3052f0fd": { + "balance": "0x1483e01533c2e3c0000" }, - "145e1de0147911ccd880875fbbea61f6a142d11d": { - "balance": "4000000000000000000000" + "0x145e1de0147911ccd880875fbbea61f6a142d11d": { + "balance": "0xd8d726b7177a800000" }, - "68419c6dd2d3ce6fcbb3c73e2fa079f06051bde6": { - "balance": "1970000000000000000000" + "0x68419c6dd2d3ce6fcbb3c73e2fa079f06051bde6": { + "balance": "0x6acb3df27e1f880000" }, - "d8eb78503ec31a54a90136781ae109004c743257": { - "balance": "1000000000000000000000" + "0xd8eb78503ec31a54a90136781ae109004c743257": { + "balance": "0x3635c9adc5dea00000" }, - "f25e4c70bc465632c89e5625a832a7722f6bffab": { - "balance": "4488000000000000000000" + "0xf25e4c70bc465632c89e5625a832a7722f6bffab": { + "balance": "0xf34b82fd8e91200000" }, - "7b4d2a38269069c18557770d591d24c5121f5e83": { - "balance": "700000000000000000000" + "0x7b4d2a38269069c18557770d591d24c5121f5e83": { + "balance": "0x25f273933db5700000" }, - "27d158ac3d3e1109ab6e570e90e85d3892cd7680": { - "balance": "100000000000000000000" + "0x27d158ac3d3e1109ab6e570e90e85d3892cd7680": { + "balance": "0x56bc75e2d63100000" }, - "d3679a47df2d99a49b01c98d1c3e0c987ce1e158": { - "balance": "280000000000000000000" + "0xd3679a47df2d99a49b01c98d1c3e0c987ce1e158": { + "balance": "0xf2dc7d47f15600000" }, - "095b949de3333a377d5019d893754a5e4656ff97": { - "balance": "340000000000000000000" + "0x095b949de3333a377d5019d893754a5e4656ff97": { + "balance": "0x126e72a69a50d00000" }, - "6b17598a8ef54f797ae515ccb6517d1859bf8011": { - "balance": "100000000000000000000" + "0x6b17598a8ef54f797ae515ccb6517d1859bf8011": { + "balance": "0x56bc75e2d63100000" }, - "3eaf0879b5b6db159b589f84578b6a74f6c10357": { - "balance": "7253657000000000000000" + "0x3eaf0879b5b6db159b589f84578b6a74f6c10357": { + "balance": "0x18938b671fa65a28000" }, - "40d45d9d7625d15156c932b771ca7b0527130958": { - "balance": "100000000000000000000000" + "0x40d45d9d7625d15156c932b771ca7b0527130958": { + "balance": "0x152d02c7e14af6800000" }, - "0392549a727f81655429cb928b529f25df4d1385": { - "balance": "26248000000000000000" + "0x0392549a727f81655429cb928b529f25df4d1385": { + "balance": "0x16c43a0eea0740000" }, - "c5b009baeaf788a276bd35813ad65b400b849f3b": { - "balance": "1000000000000000000000" + "0xc5b009baeaf788a276bd35813ad65b400b849f3b": { + "balance": "0x3635c9adc5dea00000" }, - "6ed884459f809dfa1016e770edaf3e9fef46fa30": { - "balance": "3400170000000000000000" + "0x6ed884459f809dfa1016e770edaf3e9fef46fa30": { + "balance": "0xb852d6782093f10000" }, - "439d2f2f5110a4d58b1757935015408740fec7f8": { - "balance": "3830421000000000000000" + "0x439d2f2f5110a4d58b1757935015408740fec7f8": { + "balance": "0xcfa5c5150f4c888000" }, - "dc46c13325cd8edf0230d068896486f007bf4ef1": { - "balance": "1337000000000000000000" + "0xdc46c13325cd8edf0230d068896486f007bf4ef1": { + "balance": "0x487a9a304539440000" }, - "8c54c7f8b9896e75d7d5f5c760258699957142ad": { - "balance": "40000000000000000000" + "0x8c54c7f8b9896e75d7d5f5c760258699957142ad": { + "balance": "0x22b1c8c1227a00000" }, - "61c8f1fa43bf846999ecf47b2b324dfb6b63fe3a": { - "balance": "800000000000000000000" + "0x61c8f1fa43bf846999ecf47b2b324dfb6b63fe3a": { + "balance": "0x2b5e3af16b18800000" }, - "935069444a6a984de2084e46692ab99f671fc727": { - "balance": "9000000000000000000000" + "0x935069444a6a984de2084e46692ab99f671fc727": { + "balance": "0x1e7e4171bf4d3a00000" }, - "fc49c1439a41d6b3cf26bb67e0365224e5e38f5f": { - "balance": "1000076000000000000000" + "0xfc49c1439a41d6b3cf26bb67e0365224e5e38f5f": { + "balance": "0x3636d7af5ec98e0000" }, - "e1dfb5cc890ee8b2877e885d267c256187d019e6": { - "balance": "100000000000000000000" + "0xe1dfb5cc890ee8b2877e885d267c256187d019e6": { + "balance": "0x56bc75e2d63100000" }, - "ee7c3ded7c28f459c92fe13b4d95bafbab02367d": { - "balance": "700000000000000000000" + "0xee7c3ded7c28f459c92fe13b4d95bafbab02367d": { + "balance": "0x25f273933db5700000" }, - "a5874d754635a762b381a5c4c792483af8f23d1d": { - "balance": "50000000000000000000" + "0xa5874d754635a762b381a5c4c792483af8f23d1d": { + "balance": "0x2b5e3af16b1880000" }, - "cfbb32b7d024350e3321fa20c9a914035372ffc6": { - "balance": "401100000000000000000" + "0xcfbb32b7d024350e3321fa20c9a914035372ffc6": { + "balance": "0x15be6174e1912e0000" }, - "2bc429d618a66a4cf82dbb2d824e9356effa126a": { - "balance": "1999944000000000000000" + "0x2bc429d618a66a4cf82dbb2d824e9356effa126a": { + "balance": "0x6c6acc67d7b1d40000" }, - "db244f97d9c44b158a40ed9606d9f7bd38913331": { - "balance": "102000000000000000000" + "0xdb244f97d9c44b158a40ed9606d9f7bd38913331": { + "balance": "0x58788cb94b1d80000" }, - "55e220876262c218af4f56784798c7e55da09e91": { - "balance": "133566000000000000000" + "0x55e220876262c218af4f56784798c7e55da09e91": { + "balance": "0x73d99c15645d30000" }, - "ca41ccac30172052d522cd2f2f957d248153409f": { - "balance": "1970000000000000000000" + "0xca41ccac30172052d522cd2f2f957d248153409f": { + "balance": "0x6acb3df27e1f880000" }, - "b11fa7fb270abcdf5a2eab95aa30c4b53636efbf": { - "balance": "800000000000000000000" + "0xb11fa7fb270abcdf5a2eab95aa30c4b53636efbf": { + "balance": "0x2b5e3af16b18800000" }, - "0ffea06d7113fb6aec2869f4a9dfb09007facef4": { - "balance": "225416000000000000000" + "0x0ffea06d7113fb6aec2869f4a9dfb09007facef4": { + "balance": "0xc384681b1e1740000" }, - "646628a53c2c4193da88359ce718dadd92b7a48d": { - "balance": "200032000000000000000" + "0x646628a53c2c4193da88359ce718dadd92b7a48d": { + "balance": "0xad8006c2f5ef00000" }, - "ca8409083e01b397cf12928a05b68455ce6201df": { - "balance": "1600000000000000000000" + "0xca8409083e01b397cf12928a05b68455ce6201df": { + "balance": "0x56bc75e2d631000000" }, - "dbbcbb79bf479a42ad71dbcab77b5adfaa872c58": { - "balance": "1730000000000000000000" + "0xdbbcbb79bf479a42ad71dbcab77b5adfaa872c58": { + "balance": "0x5dc892aa1131c80000" }, - "db7d4037081f6c65f9476b0687d97f1e044d0a1d": { - "balance": "660000000000000000000" + "0xdb7d4037081f6c65f9476b0687d97f1e044d0a1d": { + "balance": "0x23c757072b8dd00000" }, - "4be90d412129d5a4d0424361d6649d4e47a62316": { - "balance": "1015200000000000000000" + "0x4be90d412129d5a4d0424361d6649d4e47a62316": { + "balance": "0x3708baed3d68900000" }, - "e3ab3ca9b870e3f548517306bba4de2591afafc2": { - "balance": "1200062000000000000000" + "0xe3ab3ca9b870e3f548517306bba4de2591afafc2": { + "balance": "0x410e34aecc8cd30000" }, - "5c61ab79b408dd3229f662593705d72f1e147bb8": { - "balance": "22729000000000000000000" + "0x5c61ab79b408dd3229f662593705d72f1e147bb8": { + "balance": "0x4d0243d3498cd840000" }, - "4f177f9d56953ded71a5611f393322c30279895c": { - "balance": "246000000000000000000" + "0x4f177f9d56953ded71a5611f393322c30279895c": { + "balance": "0xd55ef90a2da180000" }, - "e6cb260b716d4c0ab726eeeb07c8707204e276ae": { - "balance": "1000000000000000000000" + "0xe6cb260b716d4c0ab726eeeb07c8707204e276ae": { + "balance": "0x3635c9adc5dea00000" }, - "44355253b27748e3f34fe9cae1fb718c8f249529": { - "balance": "200000000000000000000" + "0x44355253b27748e3f34fe9cae1fb718c8f249529": { + "balance": "0xad78ebc5ac6200000" }, - "a309df54cabce70c95ec3033149cd6678a6fd4cf": { - "balance": "223600000000000000000" + "0xa309df54cabce70c95ec3033149cd6678a6fd4cf": { + "balance": "0xc1f12c75101580000" }, - "ec4867d2175ab5b9469361595546554684cda460": { - "balance": "3000000000000000000000" + "0xec4867d2175ab5b9469361595546554684cda460": { + "balance": "0xa2a15d09519be00000" }, - "8d06e464245cad614939e0af0845e6d730e20374": { - "balance": "200359000000000000000" + "0x8d06e464245cad614939e0af0845e6d730e20374": { + "balance": "0xadc8a28f3d87d8000" }, - "9810e34a94db6ed156d0389a0e2b80f4fd6b0a8a": { - "balance": "2000000000000000000000" + "0x9810e34a94db6ed156d0389a0e2b80f4fd6b0a8a": { + "balance": "0x6c6b935b8bbd400000" }, - "dcfff3e8d23c2a34b56bd1b3bd45c79374432239": { - "balance": "5000000000000000000000" + "0xdcfff3e8d23c2a34b56bd1b3bd45c79374432239": { + "balance": "0x10f0cf064dd59200000" }, - "7d7dd5ee614dbb6fbfbcd26305247a058c41faa1": { - "balance": "2000000000000000000000" + "0x7d7dd5ee614dbb6fbfbcd26305247a058c41faa1": { + "balance": "0x6c6b935b8bbd400000" }, - "8a9eca9c5aba8e139f8003edf1163afb70aa3aa9": { - "balance": "660000000000000000000" + "0x8a9eca9c5aba8e139f8003edf1163afb70aa3aa9": { + "balance": "0x23c757072b8dd00000" }, - "d942de4784f7a48716c0fd4b9d54a6e54c5f2f3e": { - "balance": "20000000000000000000000" + "0xd942de4784f7a48716c0fd4b9d54a6e54c5f2f3e": { + "balance": "0x43c33c1937564800000" }, - "07dae622630d1136381933d2ad6b22b839d82102": { - "balance": "200000000000000000000" + "0x07dae622630d1136381933d2ad6b22b839d82102": { + "balance": "0xad78ebc5ac6200000" }, - "abf12fa19e82f76c718f01bdca0003674523ef30": { - "balance": "2000000000000000000000" + "0xabf12fa19e82f76c718f01bdca0003674523ef30": { + "balance": "0x6c6b935b8bbd400000" }, - "411c831cc6f44f1965ec5757ab4e5b3ca4cffd1f": { - "balance": "425000000000000000000" + "0x411c831cc6f44f1965ec5757ab4e5b3ca4cffd1f": { + "balance": "0x170a0f5040e5040000" }, - "99129d5b3c0cde47ea0def4dfc070d1f4a599527": { - "balance": "2000000000000000000000" + "0x99129d5b3c0cde47ea0def4dfc070d1f4a599527": { + "balance": "0x6c6b935b8bbd400000" }, - "c5cdcee0e85d117dabbf536a3f4069bf443f54e7": { - "balance": "1969606000000000000000" + "0xc5cdcee0e85d117dabbf536a3f4069bf443f54e7": { + "balance": "0x6ac5c62d9486070000" }, - "f218bd848ee7f9d38bfdd1c4eb2ed2496ae4305f": { - "balance": "500000000000000000000" + "0xf218bd848ee7f9d38bfdd1c4eb2ed2496ae4305f": { + "balance": "0x1b1ae4d6e2ef500000" }, - "fe549bbfe64740189892932538daaf46d2b61d4f": { - "balance": "40000000000000000000" + "0xfe549bbfe64740189892932538daaf46d2b61d4f": { + "balance": "0x22b1c8c1227a00000" }, - "dc3f0e7672f71fe7525ba30b9755183a20b9166a": { - "balance": "9603617000000000000000" + "0xdc3f0e7672f71fe7525ba30b9755183a20b9166a": { + "balance": "0x2089cf57b5b3e968000" }, - "0e83b850481ab44d49e0a229a2e464902c69539b": { - "balance": "100000000000000000000" + "0x0e83b850481ab44d49e0a229a2e464902c69539b": { + "balance": "0x56bc75e2d63100000" }, - "07ddd0422c86ef65bf0c7fc3452862b1228b08b8": { - "balance": "2065302000000000000000" + "0x07ddd0422c86ef65bf0c7fc3452862b1228b08b8": { + "balance": "0x6ff5d2aa8f9fcf0000" }, - "a68c313445c22d919ee46cc2d0cdff043a755825": { - "balance": "75189000000000000000" + "0xa68c313445c22d919ee46cc2d0cdff043a755825": { + "balance": "0x41374fd21b0d88000" }, - "a9e9dbce7a2cb03694799897bed7c54d155fdaa8": { - "balance": "197559000000000000000" + "0xa9e9dbce7a2cb03694799897bed7c54d155fdaa8": { + "balance": "0xab5ae8fc99d658000" }, - "18fccf62d2c3395453b7587b9e26f5cff9eb7482": { - "balance": "1000000000000000000000" + "0x18fccf62d2c3395453b7587b9e26f5cff9eb7482": { + "balance": "0x3635c9adc5dea00000" }, - "ff41d9e1b4effe18d8b0d1f63fc4255fb4e06c3d": { - "balance": "1337000000000000000000" + "0xff41d9e1b4effe18d8b0d1f63fc4255fb4e06c3d": { + "balance": "0x487a9a304539440000" }, - "8f69eafd0233cadb4059ab779c46edf2a0506e48": { - "balance": "1788210000000000000000" + "0x8f69eafd0233cadb4059ab779c46edf2a0506e48": { + "balance": "0x60f06620a849450000" }, - "9aa48c66e4fb4ad099934e32022e827427f277ba": { - "balance": "10000000000000000000000" + "0x9aa48c66e4fb4ad099934e32022e827427f277ba": { + "balance": "0x21e19e0c9bab2400000" }, - "f46980e3a4a9d29a6a6e90604537a3114bcb2897": { - "balance": "500000000000000000000" + "0xf46980e3a4a9d29a6a6e90604537a3114bcb2897": { + "balance": "0x1b1ae4d6e2ef500000" }, - "801732a481c380e57ed62d6c29de998af3fa3b13": { - "balance": "100000000000000000000" + "0x801732a481c380e57ed62d6c29de998af3fa3b13": { + "balance": "0x56bc75e2d63100000" }, - "0cd6a141918d126b106d9f2ebf69e102de4d3277": { - "balance": "20000000000000000000" + "0x0cd6a141918d126b106d9f2ebf69e102de4d3277": { + "balance": "0x1158e460913d00000" }, - "17589a6c006a54cad70103123aae0a82135fdeb4": { - "balance": "4000000000000000000000" + "0x17589a6c006a54cad70103123aae0a82135fdeb4": { + "balance": "0xd8d726b7177a800000" }, - "8725e8c753b3acbfdca55f3c62dfe1a59454968a": { - "balance": "1000090000000000000000" + "0x8725e8c753b3acbfdca55f3c62dfe1a59454968a": { + "balance": "0x3637096c4bcc690000" }, - "d20dcb0b78682b94bc3000281448d557a20bfc83": { - "balance": "895000000000000000000" + "0xd20dcb0b78682b94bc3000281448d557a20bfc83": { + "balance": "0x30849ebe16369c0000" }, - "e84f8076a0f2969ecd333eef8de41042986291f2": { - "balance": "432000000000000000000" + "0xe84f8076a0f2969ecd333eef8de41042986291f2": { + "balance": "0x176b344f2a78c00000" }, - "b3145b74506d1a8d047cdcdc55392a7b5350799a": { - "balance": "129314663000000000000000" + "0xb3145b74506d1a8d047cdcdc55392a7b5350799a": { + "balance": "0x1b6229741c0d3d5d8000" }, - "0d9a825ff2bcd397cbad5b711d9dcc95f1cc112d": { - "balance": "12800000000000000000000" + "0x0d9a825ff2bcd397cbad5b711d9dcc95f1cc112d": { + "balance": "0x2b5e3af16b188000000" }, - "0ca670eb2c8b96cba379217f5929c2b892f39ef6": { - "balance": "2000000000000000000000" + "0x0ca670eb2c8b96cba379217f5929c2b892f39ef6": { + "balance": "0x6c6b935b8bbd400000" }, - "25cfc4e25c35c13b69f7e77dbfb08baf58756b8d": { - "balance": "40000000000000000000000" + "0x25cfc4e25c35c13b69f7e77dbfb08baf58756b8d": { + "balance": "0x878678326eac9000000" }, - "182db85293f606e88988c3704cb3f0c0bbbfca5a": { - "balance": "133700000000000000000" + "0x182db85293f606e88988c3704cb3f0c0bbbfca5a": { + "balance": "0x73f75d1a085ba0000" }, - "bd73c3cbc26a175062ea0320dd84b253bce64358": { - "balance": "394000000000000000000" + "0xbd73c3cbc26a175062ea0320dd84b253bce64358": { + "balance": "0x155bd9307f9fe80000" }, - "2680713d40808e2a50ed013150a2a694b96a7f1d": { - "balance": "1790000000000000000000" + "0x2680713d40808e2a50ed013150a2a694b96a7f1d": { + "balance": "0x61093d7c2c6d380000" }, - "51e32f14f4ca5e287cdac057a7795ea9e0439953": { - "balance": "500000000000000000000" + "0x51e32f14f4ca5e287cdac057a7795ea9e0439953": { + "balance": "0x1b1ae4d6e2ef500000" }, - "b1e9c5f1d21e61757a6b2ee75913fc5a1a4101c3": { - "balance": "2000000000000000000000" + "0xb1e9c5f1d21e61757a6b2ee75913fc5a1a4101c3": { + "balance": "0x6c6b935b8bbd400000" }, - "d4c4d1a7c3c74984f6857b2f5f07e8face68056d": { - "balance": "2000000000000000000000" + "0xd4c4d1a7c3c74984f6857b2f5f07e8face68056d": { + "balance": "0x6c6b935b8bbd400000" }, - "4651dc420e08c3293b27d2497890eb50223ae2f4": { - "balance": "20000000000000000000000" + "0x4651dc420e08c3293b27d2497890eb50223ae2f4": { + "balance": "0x43c33c1937564800000" }, - "c74a3995f807de1db01a2eb9c62e97d0548f696f": { - "balance": "1000000000000000000000" + "0xc74a3995f807de1db01a2eb9c62e97d0548f696f": { + "balance": "0x3635c9adc5dea00000" }, - "0505a08e22a109015a22f685305354662a5531d5": { - "balance": "2600000000000000000000" + "0x0505a08e22a109015a22f685305354662a5531d5": { + "balance": "0x8cf23f909c0fa00000" }, - "39c773367c8825d3596c686f42bf0d14319e3f84": { - "balance": "133700000000000000000" + "0x39c773367c8825d3596c686f42bf0d14319e3f84": { + "balance": "0x73f75d1a085ba0000" }, - "0f929cf895db017af79f3ead2216b1bd69c37dc7": { - "balance": "2000000000000000000000" + "0x0f929cf895db017af79f3ead2216b1bd69c37dc7": { + "balance": "0x6c6b935b8bbd400000" }, - "bdd3254e1b3a6dc6cc2c697d45711aca21d516b2": { - "balance": "2000000000000000000000" + "0xbdd3254e1b3a6dc6cc2c697d45711aca21d516b2": { + "balance": "0x6c6b935b8bbd400000" }, - "ae5d221afcd3d29355f508eadfca408ce33ca903": { - "balance": "100000000000000000000000" + "0xae5d221afcd3d29355f508eadfca408ce33ca903": { + "balance": "0x152d02c7e14af6800000" }, - "916cf17d71412805f4afc3444a0b8dd1d9339d16": { - "balance": "14300000000000000000" + "0x916cf17d71412805f4afc3444a0b8dd1d9339d16": { + "balance": "0xc673ce3c40160000" }, - "4319263f75402c0b5325f263be4a5080651087f0": { - "balance": "983086000000000000000" + "0x4319263f75402c0b5325f263be4a5080651087f0": { + "balance": "0x354b0f14631bab0000" }, - "0f1c249cd962b00fd114a9349f6a6cc778d76c4d": { - "balance": "2000000000000000000000" + "0x0f1c249cd962b00fd114a9349f6a6cc778d76c4d": { + "balance": "0x6c6b935b8bbd400000" }, - "54febcce20fe7a9098a755bd90988602a48c089e": { - "balance": "640000000000000000000" + "0x54febcce20fe7a9098a755bd90988602a48c089e": { + "balance": "0x22b1c8c1227a000000" }, - "2c1800f35fa02d3eb6ff5b25285f5e4add13b38d": { - "balance": "906400000000000000000" + "0x2c1800f35fa02d3eb6ff5b25285f5e4add13b38d": { + "balance": "0x3122d3adafde100000" }, - "72b904440e90e720d6ac1c2ad79c321dcc1c1a86": { - "balance": "1550000000000000000000" + "0x72b904440e90e720d6ac1c2ad79c321dcc1c1a86": { + "balance": "0x54069233bf7f780000" }, - "b0aa00950c0e81fa3210173e729aaf163a27cd71": { - "balance": "40000000000000000000000" + "0xb0aa00950c0e81fa3210173e729aaf163a27cd71": { + "balance": "0x878678326eac9000000" }, - "663604b0503046e624cd26a8b6fb4742dce02a6f": { - "balance": "65400000000000000000" + "0x663604b0503046e624cd26a8b6fb4742dce02a6f": { + "balance": "0x38b9b797ef68c0000" }, - "3c98594bf68b57351e8814ae9e6dfd2d254aa06f": { - "balance": "300000000000000000000" + "0x3c98594bf68b57351e8814ae9e6dfd2d254aa06f": { + "balance": "0x1043561a8829300000" }, - "9c45202a25f6ad0011f115a5a72204f2f2198866": { - "balance": "5014000000000000000000" + "0x9c45202a25f6ad0011f115a5a72204f2f2198866": { + "balance": "0x10fcf3a62b080980000" }, - "b02d062873334545cea29218e4057760590f7423": { - "balance": "3186000000000000000000" + "0xb02d062873334545cea29218e4057760590f7423": { + "balance": "0xacb6a1c7d93a880000" }, - "7bddb2ee98de19ee4c91f661ee8e67a91d054b97": { - "balance": "1000000000000000000000" + "0x7bddb2ee98de19ee4c91f661ee8e67a91d054b97": { + "balance": "0x3635c9adc5dea00000" }, - "9cf2928beef09a40f9bfc953be06a251116182fb": { - "balance": "6000000000000000000000" + "0x9cf2928beef09a40f9bfc953be06a251116182fb": { + "balance": "0x14542ba12a337c00000" }, - "51b4758e9e1450e7af4268c3c7b1e7bd6f5c7550": { - "balance": "1000000000000000000000" + "0x51b4758e9e1450e7af4268c3c7b1e7bd6f5c7550": { + "balance": "0x3635c9adc5dea00000" }, - "eb570dba975227b1c42d6e8dea2c56c9ad960670": { - "balance": "2000000000000000000000" + "0xeb570dba975227b1c42d6e8dea2c56c9ad960670": { + "balance": "0x6c6b935b8bbd400000" }, - "970d8b8a0016d143054f149fb3b8e550dc0797c7": { - "balance": "1000000000000000000000" + "0x970d8b8a0016d143054f149fb3b8e550dc0797c7": { + "balance": "0x3635c9adc5dea00000" }, - "c7b39b060451000ca1049ba154bcfa00ff8af262": { - "balance": "100000000000000000000000" + "0xc7b39b060451000ca1049ba154bcfa00ff8af262": { + "balance": "0x152d02c7e14af6800000" }, - "945e18769d7ee727c7013f92de24d117967ff317": { - "balance": "2000000000000000000000" + "0x945e18769d7ee727c7013f92de24d117967ff317": { + "balance": "0x6c6b935b8bbd400000" }, - "d18eb9e1d285dabe93e5d4bae76beefe43b521e8": { - "balance": "668500000000000000000" + "0xd18eb9e1d285dabe93e5d4bae76beefe43b521e8": { + "balance": "0x243d4d18229ca20000" }, - "c618521321abaf5b26513a4a9528086f220adc6f": { - "balance": "27000000000000000000" + "0xc618521321abaf5b26513a4a9528086f220adc6f": { + "balance": "0x176b344f2a78c0000" }, - "dd65f6e17163b5d203641f51cc7b24b00f02c8fb": { - "balance": "200000000000000000000" + "0xdd65f6e17163b5d203641f51cc7b24b00f02c8fb": { + "balance": "0xad78ebc5ac6200000" }, - "131faed12561bb7aee04e5185af802b1c3438d9b": { - "balance": "219000000000000000000" + "0x131faed12561bb7aee04e5185af802b1c3438d9b": { + "balance": "0xbdf3c4bb0328c0000" }, - "1ced6715f862b1ff86058201fcce5082b36e62b2": { - "balance": "6684522000000000000000" + "0x1ced6715f862b1ff86058201fcce5082b36e62b2": { + "balance": "0x16a5e60bee273b10000" }, - "a0ff5b4cf016027e8323497d4428d3e5a83b8795": { - "balance": "6596500000000000000000" + "0xa0ff5b4cf016027e8323497d4428d3e5a83b8795": { + "balance": "0x16598d3c83ec0420000" }, - "02e816afc1b5c0f39852131959d946eb3b07b5ad": { - "balance": "1000000000000000000000" + "0x02e816afc1b5c0f39852131959d946eb3b07b5ad": { + "balance": "0x3635c9adc5dea00000" }, - "153cf2842cb9de876c276fa64767d1a8ecf573bb": { - "balance": "2000000000000000000000" + "0x153cf2842cb9de876c276fa64767d1a8ecf573bb": { + "balance": "0x6c6b935b8bbd400000" }, - "3bc6e3ee7a56ce8f14a37532590f63716b9966e8": { - "balance": "2000000000000000000000" + "0x3bc6e3ee7a56ce8f14a37532590f63716b9966e8": { + "balance": "0x6c6b935b8bbd400000" }, - "f6d25d3f3d846d239f525fa8cac97bc43578dbac": { - "balance": "896000000000000000000" + "0xf6d25d3f3d846d239f525fa8cac97bc43578dbac": { + "balance": "0x30927f74c9de000000" }, - "2066774d822793ff25f1760909479cf62491bf88": { - "balance": "55160000000000000000000" + "0x2066774d822793ff25f1760909479cf62491bf88": { + "balance": "0xbae3ac685cb72e00000" }, - "46779a5656ff00d73eac3ad0c38b6c853094fb40": { - "balance": "230752000000000000000" + "0x46779a5656ff00d73eac3ad0c38b6c853094fb40": { + "balance": "0xc8253c96c6af00000" }, - "22eed327f8eb1d1338a3cb7b0f8a4baa5907cd95": { - "balance": "23445000000000000000" + "0x22eed327f8eb1d1338a3cb7b0f8a4baa5907cd95": { + "balance": "0x1455d5f4877088000" }, - "ff88ebacc41b3687f39e4b59e159599b80cba33f": { - "balance": "400000000000000000000" + "0xff88ebacc41b3687f39e4b59e159599b80cba33f": { + "balance": "0x15af1d78b58c400000" }, - "2874f3e2985d5f7b406627e17baa772b01abcc9e": { - "balance": "6014000000000000000000" + "0x2874f3e2985d5f7b406627e17baa772b01abcc9e": { + "balance": "0x146050410765f380000" }, - "eb10458daca79e4a6b24b29a8a8ada711b7f2eb6": { - "balance": "3998000000000000000000" + "0xeb10458daca79e4a6b24b29a8a8ada711b7f2eb6": { + "balance": "0xd8bb6549b02bb80000" }, - "541060fc58c750c40512f83369c0a63340c122b6": { - "balance": "1970000000000000000000" + "0x541060fc58c750c40512f83369c0a63340c122b6": { + "balance": "0x6acb3df27e1f880000" }, - "fd2757cc3551a095878d97875615fe0c6a32aa8a": { - "balance": "598200000000000000000" + "0xfd2757cc3551a095878d97875615fe0c6a32aa8a": { + "balance": "0x206db15299beac0000" }, - "be659d85e7c34f8833ea7f488de1fbb5d4149bef": { - "balance": "9072500000000000000000" + "0xbe659d85e7c34f8833ea7f488de1fbb5d4149bef": { + "balance": "0x1ebd23ad9d5bb720000" }, - "e149b5726caf6d5eb5bf2acc41d4e2dc328de182": { - "balance": "1940000000000000000000" + "0xe149b5726caf6d5eb5bf2acc41d4e2dc328de182": { + "balance": "0x692ae8897081d00000" }, - "2fe0cc424b53a31f0916be08ec81c50bf8eab0c1": { - "balance": "600000000000000000000" + "0x2fe0cc424b53a31f0916be08ec81c50bf8eab0c1": { + "balance": "0x2086ac351052600000" }, - "e3712701619ca7623c55db3a0ad30e867db0168b": { - "balance": "20000000000000000000" + "0xe3712701619ca7623c55db3a0ad30e867db0168b": { + "balance": "0x1158e460913d00000" }, - "f8ca336c8e91bd20e314c20b2dd4608b9c8b9459": { - "balance": "846000000000000000000" + "0xf8ca336c8e91bd20e314c20b2dd4608b9c8b9459": { + "balance": "0x2ddc9bc5b32c780000" }, - "68acdaa9fb17d3c309911a77b05f5391fa034ee9": { - "balance": "8950000000000000000000" + "0x68acdaa9fb17d3c309911a77b05f5391fa034ee9": { + "balance": "0x1e52e336cde22180000" }, - "e77d7deab296c8b4fa07ca3be184163d5a6d606c": { - "balance": "92538000000000000000" + "0xe77d7deab296c8b4fa07ca3be184163d5a6d606c": { + "balance": "0x5043904b671190000" }, - "e6b9545f7ed086e552924639f9a9edbbd5540b3e": { - "balance": "3760000000000000000000" + "0xe6b9545f7ed086e552924639f9a9edbbd5540b3e": { + "balance": "0xcbd47b6eaa8cc00000" }, - "2866b81decb02ee70ae250cee5cdc77b59d7b679": { - "balance": "2000000000000000000000" + "0x2866b81decb02ee70ae250cee5cdc77b59d7b679": { + "balance": "0x6c6b935b8bbd400000" }, - "60e3cc43bcdb026aad759c7066f555bbf2ac66f5": { - "balance": "2000000000000000000000" + "0x60e3cc43bcdb026aad759c7066f555bbf2ac66f5": { + "balance": "0x6c6b935b8bbd400000" }, - "fcbd85feea6a754fcf3449449e37ff9784f7773c": { - "balance": "3086000000000000000000" + "0xfcbd85feea6a754fcf3449449e37ff9784f7773c": { + "balance": "0xa74ada69abd7780000" }, - "38a744efa6d5c2137defef8ef9187b649eee1c78": { - "balance": "4000000000000000000000" + "0x38a744efa6d5c2137defef8ef9187b649eee1c78": { + "balance": "0xd8d726b7177a800000" }, - "9d7655e9f3e5ba5d6e87e412aebe9ee0d49247ee": { - "balance": "2620100000000000000000" + "0x9d7655e9f3e5ba5d6e87e412aebe9ee0d49247ee": { + "balance": "0x8e09311c1d80fa0000" }, - "2020b81ae53926ace9f7d7415a050c031d585f20": { - "balance": "341200000000000000000" + "0x2020b81ae53926ace9f7d7415a050c031d585f20": { + "balance": "0x127f19e83eb3480000" }, - "4244f1331158b9ce26bbe0b9236b9203ca351434": { - "balance": "10000000000000000000000" + "0x4244f1331158b9ce26bbe0b9236b9203ca351434": { + "balance": "0x21e19e0c9bab2400000" }, - "99c236141daec837ece04fdaee1d90cf8bbdc104": { - "balance": "2184000000000000000000" + "0x99c236141daec837ece04fdaee1d90cf8bbdc104": { + "balance": "0x766516acac0d200000" }, - "943d37864a4a537d35c8d99723cd6406ce2562e6": { - "balance": "2000000000000000000000" + "0x943d37864a4a537d35c8d99723cd6406ce2562e6": { + "balance": "0x6c6b935b8bbd400000" }, - "d79483f6a8444f2549d611afe02c432d15e11051": { - "balance": "20000000000000000000" + "0xd79483f6a8444f2549d611afe02c432d15e11051": { + "balance": "0x1158e460913d00000" }, - "9fd64373f2fbcd9c0faca60547cad62e26d9851f": { - "balance": "1000000000000000000000" + "0x9fd64373f2fbcd9c0faca60547cad62e26d9851f": { + "balance": "0x3635c9adc5dea00000" }, - "b89c036ed7c492879921be41e10ca1698198a74c": { - "balance": "1820000000000000000000" + "0xb89c036ed7c492879921be41e10ca1698198a74c": { + "balance": "0x62a992e53a0af00000" }, - "7462c89caa9d8d7891b2545def216f7464d5bb21": { - "balance": "109162000000000000000" + "0x7462c89caa9d8d7891b2545def216f7464d5bb21": { + "balance": "0x5eaed54a28b310000" }, - "bb0366a7cfbd3445a70db7fe5ae34885754fd468": { - "balance": "6160000000000000000000" + "0xbb0366a7cfbd3445a70db7fe5ae34885754fd468": { + "balance": "0x14def2c42ebd6400000" }, - "6c52cf0895bb35e656161e4dc46ae0e96dd3e62c": { - "balance": "4000086000000000000000" + "0x6c52cf0895bb35e656161e4dc46ae0e96dd3e62c": { + "balance": "0xd8d8583fa2d52f0000" }, - "b9cf71b226583e3a921103a5316f855a65779d1b": { - "balance": "24000000000000000000000" + "0xb9cf71b226583e3a921103a5316f855a65779d1b": { + "balance": "0x5150ae84a8cdf000000" }, - "016b60bb6d67928c29fd0313c666da8f1698d9c5": { - "balance": "2000000000000000000000" + "0x016b60bb6d67928c29fd0313c666da8f1698d9c5": { + "balance": "0x6c6b935b8bbd400000" }, - "9454b3a8bff9709fd0e190877e6cb6c89974dbd6": { - "balance": "2674000000000000000000" + "0x9454b3a8bff9709fd0e190877e6cb6c89974dbd6": { + "balance": "0x90f534608a72880000" }, - "84aac7fa197ff85c30e03b7a5382b957f41f3afb": { - "balance": "157600000000000000000" + "0x84aac7fa197ff85c30e03b7a5382b957f41f3afb": { + "balance": "0x88b23acffd9900000" }, - "db6e560c9bc620d4bea3a94d47f7880bf47f2d5f": { - "balance": "89500000000000000000" + "0xdb6e560c9bc620d4bea3a94d47f7880bf47f2d5f": { + "balance": "0x4da0fdfcf05760000" }, - "eefd05b0e3c417d55b3343060486cdd5e92aa7a6": { - "balance": "1430000000000000000000" + "0xeefd05b0e3c417d55b3343060486cdd5e92aa7a6": { + "balance": "0x4d853c8f8908980000" }, - "3a59a08246a8206f8d58f70bb1f0d35c5bcc71bd": { - "balance": "185000000000000000000" + "0x3a59a08246a8206f8d58f70bb1f0d35c5bcc71bd": { + "balance": "0xa076407d3f7440000" }, - "9bfff50db36a785555f07652a153b0c42b1b8b76": { - "balance": "2000000000000000000000" + "0x9bfff50db36a785555f07652a153b0c42b1b8b76": { + "balance": "0x6c6b935b8bbd400000" }, - "d44f5edf2bcf2433f211dadd0cc450db1b008e14": { - "balance": "267400000000000000000" + "0xd44f5edf2bcf2433f211dadd0cc450db1b008e14": { + "balance": "0xe7eeba3410b740000" }, - "2378fd4382511e968ed192106737d324f454b535": { - "balance": "1000000000000000000000" + "0x2378fd4382511e968ed192106737d324f454b535": { + "balance": "0x3635c9adc5dea00000" }, - "c94089553ae4c22ca09fbc98f57075cf2ec59504": { - "balance": "4000000000000000000000" + "0xc94089553ae4c22ca09fbc98f57075cf2ec59504": { + "balance": "0xd8d726b7177a800000" }, - "08ef3fa4c43ccdc57b22a4b9b2331a82e53818f2": { - "balance": "4000000000000000000000" + "0x08ef3fa4c43ccdc57b22a4b9b2331a82e53818f2": { + "balance": "0xd8d726b7177a800000" }, - "e48e65125421880d42bdf1018ab9778d96928f3f": { - "balance": "4200000000000000000000" + "0xe48e65125421880d42bdf1018ab9778d96928f3f": { + "balance": "0xe3aeb5737240a00000" }, - "67518e5d02b205180f0463a32004471f753c523e": { - "balance": "1984289000000000000000" + "0x67518e5d02b205180f0463a32004471f753c523e": { + "balance": "0x6b918aac494b168000" }, - "0da7401262384e2e8b4b26dd154799b55145efa0": { - "balance": "300000000000000000000" + "0x0da7401262384e2e8b4b26dd154799b55145efa0": { + "balance": "0x1043561a8829300000" }, - "0b6920a64b363b8d5d90802494cf564b547c430d": { - "balance": "1200000000000000000000" + "0x0b6920a64b363b8d5d90802494cf564b547c430d": { + "balance": "0x410d586a20a4c00000" }, - "a5ab4bd3588f46cb272e56e93deed386ba8b753d": { - "balance": "1332989000000000000000" + "0xa5ab4bd3588f46cb272e56e93deed386ba8b753d": { + "balance": "0x4842f04105872c8000" }, - "1788da9b57fd05edc4ff99e7fef301519c8a0a1e": { - "balance": "2000000000000000000000" + "0x1788da9b57fd05edc4ff99e7fef301519c8a0a1e": { + "balance": "0x6c6b935b8bbd400000" }, - "17b2d6cf65c6f4a347ddc6572655354d8a412b29": { - "balance": "2000000000000000000000" + "0x17b2d6cf65c6f4a347ddc6572655354d8a412b29": { + "balance": "0x6c6b935b8bbd400000" }, - "d0319139fbab2e8e2accc1d924d4b11df6696c5a": { - "balance": "200000000000000000000" + "0xd0319139fbab2e8e2accc1d924d4b11df6696c5a": { + "balance": "0xad78ebc5ac6200000" }, - "4c377bb03ab52c4cb79befa1dd114982924c4ae9": { - "balance": "1827814000000000000000" + "0x4c377bb03ab52c4cb79befa1dd114982924c4ae9": { + "balance": "0x631603ccd38dd70000" }, - "fb949c647fdcfd2514c7d58e31f28a532d8c5833": { - "balance": "20000000000000000000000" + "0xfb949c647fdcfd2514c7d58e31f28a532d8c5833": { + "balance": "0x43c33c1937564800000" }, - "70e5e9da735ff077249dcb9aaf3db2a48d9498c0": { - "balance": "1000000000000000000000" + "0x70e5e9da735ff077249dcb9aaf3db2a48d9498c0": { + "balance": "0x3635c9adc5dea00000" }, - "fe6f5f42b6193b1ad16206e4afb5239d4d7db45e": { - "balance": "1730000000000000000000" + "0xfe6f5f42b6193b1ad16206e4afb5239d4d7db45e": { + "balance": "0x5dc892aa1131c80000" }, - "bda4be317e7e4bed84c0495eee32d607ec38ca52": { - "balance": "2309457000000000000000" + "0xbda4be317e7e4bed84c0495eee32d607ec38ca52": { + "balance": "0x7d32277978ef4e8000" }, - "5910106debd291a1cd80b0fbbb8d8d9e93a7cc1e": { - "balance": "2000000000000000000000" + "0x5910106debd291a1cd80b0fbbb8d8d9e93a7cc1e": { + "balance": "0x6c6b935b8bbd400000" }, - "ba42f9aace4c184504abf5425762aca26f71fbdc": { - "balance": "37400000000000000000" + "0xba42f9aace4c184504abf5425762aca26f71fbdc": { + "balance": "0x207077dd8a79c0000" }, - "beb4fd315559436045dcb99d49dcec03f40c42dc": { - "balance": "2000000000000000000000" + "0xbeb4fd315559436045dcb99d49dcec03f40c42dc": { + "balance": "0x6c6b935b8bbd400000" }, - "452b64db8ef7d6df87c788639c2290be8482d575": { - "balance": "8000000000000000000000" + "0x452b64db8ef7d6df87c788639c2290be8482d575": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "66e09427c1e63deed7e12b8c55a6a19320ef4b6a": { - "balance": "170000000000000000000" + "0x66e09427c1e63deed7e12b8c55a6a19320ef4b6a": { + "balance": "0x93739534d28680000" }, - "faad905d847c7b23418aeecbe3addb8dd3f8924a": { - "balance": "1970000000000000000000" + "0xfaad905d847c7b23418aeecbe3addb8dd3f8924a": { + "balance": "0x6acb3df27e1f880000" }, - "a29319e81069e5d60df00f3de5adee3505ecd5fb": { - "balance": "2000000000000000000000" + "0xa29319e81069e5d60df00f3de5adee3505ecd5fb": { + "balance": "0x6c6b935b8bbd400000" }, - "cf348f2fe47b7e413c077a7baf3a75fbf8428692": { - "balance": "2000000000000000000000" + "0xcf348f2fe47b7e413c077a7baf3a75fbf8428692": { + "balance": "0x6c6b935b8bbd400000" }, - "e1e8c50b80a352b240ce7342bbfdf5690cc8cb14": { - "balance": "394000000000000000000" + "0xe1e8c50b80a352b240ce7342bbfdf5690cc8cb14": { + "balance": "0x155bd9307f9fe80000" }, - "131c792c197d18bd045d7024937c1f84b60f4438": { - "balance": "4000000000000000000000" + "0x131c792c197d18bd045d7024937c1f84b60f4438": { + "balance": "0xd8d726b7177a800000" }, - "e49af4f34adaa2330b0e49dc74ec18ab2f92f827": { - "balance": "2000000000000000000000" + "0xe49af4f34adaa2330b0e49dc74ec18ab2f92f827": { + "balance": "0x6c6b935b8bbd400000" }, - "f2e99f5cbb836b7ad36247571a302cbe4b481c69": { - "balance": "1970000000000000000000" + "0xf2e99f5cbb836b7ad36247571a302cbe4b481c69": { + "balance": "0x6acb3df27e1f880000" }, - "c93fbde8d46d2bcc0fa9b33bd8ba7f8042125565": { - "balance": "1400000000000000000000" + "0xc93fbde8d46d2bcc0fa9b33bd8ba7f8042125565": { + "balance": "0x4be4e7267b6ae00000" }, - "038779ca2dbe663e63db3fe75683ea0ec62e2383": { - "balance": "1670000000000000000000" + "0x038779ca2dbe663e63db3fe75683ea0ec62e2383": { + "balance": "0x5a87e7d7f5f6580000" }, - "a33cb450f95bb46e25afb50fe05feee6fb8cc8ea": { - "balance": "776000000000000000000" + "0xa33cb450f95bb46e25afb50fe05feee6fb8cc8ea": { + "balance": "0x2a1129d09367200000" }, - "40ab66fe213ea56c3afb12c75be33f8e32fd085d": { - "balance": "4000000000000000000000" + "0x40ab66fe213ea56c3afb12c75be33f8e32fd085d": { + "balance": "0xd8d726b7177a800000" }, - "6403d062549690c8e8b63eae41d6c109476e2588": { - "balance": "2000000000000000000000" + "0x6403d062549690c8e8b63eae41d6c109476e2588": { + "balance": "0x6c6b935b8bbd400000" }, - "bfb0ea02feb61dec9e22a5070959330299c43072": { - "balance": "20000000000000000000000" + "0xbfb0ea02feb61dec9e22a5070959330299c43072": { + "balance": "0x43c33c1937564800000" }, - "99c475bf02e8b9214ada5fad02fdfd15ba365c0c": { - "balance": "591000000000000000000" + "0x99c475bf02e8b9214ada5fad02fdfd15ba365c0c": { + "balance": "0x2009c5c8bf6fdc0000" }, - "904966cc2213b5b8cb5bd6089ef9cddbef7edfcc": { - "balance": "2000000000000000000000" + "0x904966cc2213b5b8cb5bd6089ef9cddbef7edfcc": { + "balance": "0x6c6b935b8bbd400000" }, - "767a03655af360841e810d83f5e61fb40f4cd113": { - "balance": "985000000000000000000" + "0x767a03655af360841e810d83f5e61fb40f4cd113": { + "balance": "0x35659ef93f0fc40000" }, - "ab209fdca979d0a647010af9a8b52fc7d20d8cd1": { - "balance": "9129000000000000000000" + "0xab209fdca979d0a647010af9a8b52fc7d20d8cd1": { + "balance": "0x1eee2532c7c2d040000" }, - "6294eae6e420a3d5600a39c4141f838ff8e7cc48": { - "balance": "2955000000000000000000" + "0x6294eae6e420a3d5600a39c4141f838ff8e7cc48": { + "balance": "0xa030dcebbd2f4c0000" }, - "9777cc61cf756be3b3c20cd4491c69d275e7a120": { - "balance": "10000000000000000000000" + "0x9777cc61cf756be3b3c20cd4491c69d275e7a120": { + "balance": "0x21e19e0c9bab2400000" }, - "bcbf6ba166e2340db052ea23d28029b0de6aa380": { - "balance": "3880000000000000000000" + "0xbcbf6ba166e2340db052ea23d28029b0de6aa380": { + "balance": "0xd255d112e103a00000" }, - "9f10f2a0463b65ae30b070b3df18cf46f51e89bd": { - "balance": "1910000000000000000000" + "0x9f10f2a0463b65ae30b070b3df18cf46f51e89bd": { + "balance": "0x678a932062e4180000" }, - "8d9952d0bb4ebfa0efd01a3aa9e8e87f0525742e": { - "balance": "3460000000000000000000" + "0x8d9952d0bb4ebfa0efd01a3aa9e8e87f0525742e": { + "balance": "0xbb9125542263900000" }, - "4f23b6b817ffa5c664acdad79bb7b726d30af0f9": { - "balance": "1760000000000000000000" + "0x4f23b6b817ffa5c664acdad79bb7b726d30af0f9": { + "balance": "0x5f68e8131ecf800000" }, - "b4c20040ccd9a1a3283da4d4a2f365820843d7e2": { - "balance": "1000000000000000000000" + "0xb4c20040ccd9a1a3283da4d4a2f365820843d7e2": { + "balance": "0x3635c9adc5dea00000" }, - "7f49e7a4269882bd8722d4a6f566347629624079": { - "balance": "2000000000000000000000" + "0x7f49e7a4269882bd8722d4a6f566347629624079": { + "balance": "0x6c6b935b8bbd400000" }, - "33629bd52f0e107bc071176c64df108f64777d49": { - "balance": "33425000000000000000" + "0x33629bd52f0e107bc071176c64df108f64777d49": { + "balance": "0x1cfdd7468216e8000" }, - "6a7b2e0d88867ff15d207c222bebf94fa6ce8397": { - "balance": "60000000000000000000000" + "0x6a7b2e0d88867ff15d207c222bebf94fa6ce8397": { + "balance": "0xcb49b44ba602d800000" }, - "b7ce684b09abda53389a875369f71958aeac3bdd": { - "balance": "2000000000000000000000" + "0xb7ce684b09abda53389a875369f71958aeac3bdd": { + "balance": "0x6c6b935b8bbd400000" }, - "ffbc3da0381ec339c1c049eb1ed9ee34fdcea6ca": { - "balance": "4000000000000000000000" + "0xffbc3da0381ec339c1c049eb1ed9ee34fdcea6ca": { + "balance": "0xd8d726b7177a800000" }, - "849ab80790b28ff1ffd6ba394efc7463105c36f7": { - "balance": "34600000000000000000" + "0x849ab80790b28ff1ffd6ba394efc7463105c36f7": { + "balance": "0x1e02be4ae6c840000" }, - "b0b36af9aeeedf97b6b02280f114f13984ea3260": { - "balance": "985000000000000000000" + "0xb0b36af9aeeedf97b6b02280f114f13984ea3260": { + "balance": "0x35659ef93f0fc40000" }, - "4d57e716876c0c95ef5eaebd35c8f41b069b6bfe": { - "balance": "2000000000000000000000" + "0x4d57e716876c0c95ef5eaebd35c8f41b069b6bfe": { + "balance": "0x6c6b935b8bbd400000" }, - "2d2b032359b363964fc11a518263bfd05431e867": { - "balance": "149600000000000000000" + "0x2d2b032359b363964fc11a518263bfd05431e867": { + "balance": "0x81c1df7629e700000" }, - "2ccc1f1cb5f4a8002e186b20885d9dbc030c0894": { - "balance": "2000000000000000000000" + "0x2ccc1f1cb5f4a8002e186b20885d9dbc030c0894": { + "balance": "0x6c6b935b8bbd400000" }, - "016c85e1613b900fa357b8283b120e65aefcdd08": { - "balance": "799954000000000000000" + "0x016c85e1613b900fa357b8283b120e65aefcdd08": { + "balance": "0x2b5d9784a97cd50000" }, - "710b0274d712c77e08a5707d6f3e70c0ce3d92cf": { - "balance": "6400000000000000000000" + "0x710b0274d712c77e08a5707d6f3e70c0ce3d92cf": { + "balance": "0x15af1d78b58c4000000" }, - "3cd3a6e93579c56d494171fc533e7a90e6f59464": { - "balance": "2000000000000000000000" + "0x3cd3a6e93579c56d494171fc533e7a90e6f59464": { + "balance": "0x6c6b935b8bbd400000" }, - "fe0e30e214290d743dd30eb082f1f0a5225ade61": { - "balance": "200000000000000000000" + "0xfe0e30e214290d743dd30eb082f1f0a5225ade61": { + "balance": "0xad78ebc5ac6200000" }, - "d0718520eae0a4d62d70de1be0ca431c5eea2482": { - "balance": "2000000000000000000000" + "0xd0718520eae0a4d62d70de1be0ca431c5eea2482": { + "balance": "0x6c6b935b8bbd400000" }, - "af7f79cb415a1fb8dbbd094607ee8d41fb7c5a3b": { - "balance": "10000000000000000000000" + "0xaf7f79cb415a1fb8dbbd094607ee8d41fb7c5a3b": { + "balance": "0x21e19e0c9bab2400000" }, - "b7d252ee9402b0eef144295f0e69f0db586c0871": { - "balance": "660000000000000000000" + "0xb7d252ee9402b0eef144295f0e69f0db586c0871": { + "balance": "0x23c757072b8dd00000" }, - "c3b928a76fad6578f04f0555e63952cd21d1520a": { - "balance": "2000000000000000000000" + "0xc3b928a76fad6578f04f0555e63952cd21d1520a": { + "balance": "0x6c6b935b8bbd400000" }, - "a7a517d7ad35820b09d497fa7e5540cde9495853": { - "balance": "2000000000000000000000" + "0xa7a517d7ad35820b09d497fa7e5540cde9495853": { + "balance": "0x6c6b935b8bbd400000" }, - "e6e886317b6a66a5b4f81bf164c538c264351765": { - "balance": "2000000000000000000000" + "0xe6e886317b6a66a5b4f81bf164c538c264351765": { + "balance": "0x6c6b935b8bbd400000" }, - "0770b43dbae4b1f35a927b4fa8124d3866caf97b": { - "balance": "1016390000000000000000" + "0x0770b43dbae4b1f35a927b4fa8124d3866caf97b": { + "balance": "0x37193ea7ef5b470000" }, - "52b4257cf41b6e28878d50d57b99914ffa89873a": { - "balance": "3930150000000000000000" + "0x52b4257cf41b6e28878d50d57b99914ffa89873a": { + "balance": "0xd50dc9aa2c41770000" }, - "e08bc29c2b48b169ff2bdc16714c586e6cb85ccf": { - "balance": "20000000000000000000" + "0xe08bc29c2b48b169ff2bdc16714c586e6cb85ccf": { + "balance": "0x1158e460913d00000" }, - "2372c4c1c9939f7aaf6cfac04090f00474840a09": { - "balance": "10000000000000000000000" + "0x2372c4c1c9939f7aaf6cfac04090f00474840a09": { + "balance": "0x21e19e0c9bab2400000" }, - "ab6b65eab8dfc917ec0251b9db0ecfa0fa032849": { - "balance": "500000000000000000000" + "0xab6b65eab8dfc917ec0251b9db0ecfa0fa032849": { + "balance": "0x1b1ae4d6e2ef500000" }, - "582e7cc46f1d7b4e6e9d95868bfd370573178f4c": { - "balance": "2000000000000000000000" + "0x582e7cc46f1d7b4e6e9d95868bfd370573178f4c": { + "balance": "0x6c6b935b8bbd400000" }, - "f167f5868dcf4233a7830609682caf2df4b1b807": { - "balance": "2396150000000000000000" + "0xf167f5868dcf4233a7830609682caf2df4b1b807": { + "balance": "0x81e542e1a7383f0000" }, - "ec82f50d06475f684df1b392e00da341aa145444": { - "balance": "2000000000000000000000" + "0xec82f50d06475f684df1b392e00da341aa145444": { + "balance": "0x6c6b935b8bbd400000" }, - "0968ee5a378f8cadb3bafdbed1d19aaacf936711": { - "balance": "1000000000000000000000" + "0x0968ee5a378f8cadb3bafdbed1d19aaacf936711": { + "balance": "0x3635c9adc5dea00000" }, - "a86613e6c4a4c9c55f5c10bcda32175dcbb4af60": { - "balance": "10696140000000000000000" + "0xa86613e6c4a4c9c55f5c10bcda32175dcbb4af60": { + "balance": "0x243d6c2e36be6ae0000" }, - "a5cd123992194b34c4781314303b03c54948f4b9": { - "balance": "2010462000000000000000" + "0xa5cd123992194b34c4781314303b03c54948f4b9": { + "balance": "0x6cfcc3d91da5630000" }, - "52f058d46147e9006d29bf2c09304ad1cddd6e15": { - "balance": "1500000000000000000000" + "0x52f058d46147e9006d29bf2c09304ad1cddd6e15": { + "balance": "0x5150ae84a8cdf00000" }, - "160226efe7b53a8af462d117a0108089bdecc2d1": { - "balance": "200550000000000000000" + "0x160226efe7b53a8af462d117a0108089bdecc2d1": { + "balance": "0xadf30ba70c8970000" }, - "256292a191bdda34c4da6b6bd69147bf75e2a9ab": { - "balance": "14051000000000000000" + "0x256292a191bdda34c4da6b6bd69147bf75e2a9ab": { + "balance": "0xc2ff2e0dfb038000" }, - "1b8aa0160cd79f005f88510a714913d70ad3be33": { - "balance": "201760000000000000000" + "0x1b8aa0160cd79f005f88510a714913d70ad3be33": { + "balance": "0xaeffb83079ad00000" }, - "d4b2ff3bae1993ffea4d3b180231da439f7502a2": { - "balance": "2000000000000000000000" + "0xd4b2ff3bae1993ffea4d3b180231da439f7502a2": { + "balance": "0x6c6b935b8bbd400000" }, - "e408aa99835307eea4a6c5eb801fe694117f707d": { - "balance": "500000000000000000000" + "0xe408aa99835307eea4a6c5eb801fe694117f707d": { + "balance": "0x1b1ae4d6e2ef500000" }, - "e60a55f2df996dc3aedb696c08dde039b2641de8": { - "balance": "2000000000000000000000" + "0xe60a55f2df996dc3aedb696c08dde039b2641de8": { + "balance": "0x6c6b935b8bbd400000" }, - "73df3c3e7955f4f2d859831be38000b1076b3884": { - "balance": "1970000000000000000000" + "0x73df3c3e7955f4f2d859831be38000b1076b3884": { + "balance": "0x6acb3df27e1f880000" }, - "6228ade95e8bb17d1ae23bfb0518414d497e0eb8": { - "balance": "400000000000000000000" + "0x6228ade95e8bb17d1ae23bfb0518414d497e0eb8": { + "balance": "0x15af1d78b58c400000" }, - "0f46c81db780c1674ac73d314f06539ee56ebc83": { - "balance": "9850000000000000000000" + "0x0f46c81db780c1674ac73d314f06539ee56ebc83": { + "balance": "0x215f835bc769da80000" }, - "762d6f30dab99135e4eca51d5243d6c8621102d5": { - "balance": "282000000000000000000" + "0x762d6f30dab99135e4eca51d5243d6c8621102d5": { + "balance": "0xf498941e664280000" }, - "4ba0d9e89601772b496847a2bb4340186787d265": { - "balance": "1000000000000000000000" + "0x4ba0d9e89601772b496847a2bb4340186787d265": { + "balance": "0x3635c9adc5dea00000" }, - "ca747576446a4c8f30b08340fee198de63ec92cf": { - "balance": "7020000000000000000000" + "0xca747576446a4c8f30b08340fee198de63ec92cf": { + "balance": "0x17c8e1206722a300000" }, - "99c31fe748583787cdd3e525b281b218961739e3": { - "balance": "1015200000000000000000" + "0x99c31fe748583787cdd3e525b281b218961739e3": { + "balance": "0x3708baed3d68900000" }, - "1210f80bdb826c175462ab0716e69e46c24ad076": { - "balance": "100000000000000000000" + "0x1210f80bdb826c175462ab0716e69e46c24ad076": { + "balance": "0x56bc75e2d63100000" }, - "3f75ae61cc1d8042653b5baec4443e051c5e7abd": { - "balance": "95500000000000000000" + "0x3f75ae61cc1d8042653b5baec4443e051c5e7abd": { + "balance": "0x52d542804f1ce0000" }, - "5c4892907a0720df6fd3413e63ff767d6b398023": { - "balance": "13189467000000000000000" + "0x5c4892907a0720df6fd3413e63ff767d6b398023": { + "balance": "0x2cb009fd3b5790f8000" }, - "17f14632a7e2820be6e8f6df823558283dadab2d": { - "balance": "2000000000000000000000" + "0x17f14632a7e2820be6e8f6df823558283dadab2d": { + "balance": "0x6c6b935b8bbd400000" }, - "1dc7f7dad85df53f1271152403f4e1e4fdb3afa0": { - "balance": "200000000000000000000" + "0x1dc7f7dad85df53f1271152403f4e1e4fdb3afa0": { + "balance": "0xad78ebc5ac6200000" }, - "5a30feac37ac9f72d7b4af0f2bc73952c74fd5c3": { - "balance": "2000000000000000000000" + "0x5a30feac37ac9f72d7b4af0f2bc73952c74fd5c3": { + "balance": "0x6c6b935b8bbd400000" }, - "136d4b662bbd1080cfe4445b0fa213864435b7f1": { - "balance": "4000000000000000000000" + "0x136d4b662bbd1080cfe4445b0fa213864435b7f1": { + "balance": "0xd8d726b7177a800000" }, - "c1ec81dd123d4b7c2dd9b4d438a7072c11dc874c": { - "balance": "2000000000000000000000" + "0xc1ec81dd123d4b7c2dd9b4d438a7072c11dc874c": { + "balance": "0x6c6b935b8bbd400000" }, - "09f9575be57d004793c7a4eb84b71587f97cbb6a": { - "balance": "200000000000000000000" + "0x09f9575be57d004793c7a4eb84b71587f97cbb6a": { + "balance": "0xad78ebc5ac6200000" }, - "2c4b470307a059854055d91ec3794d80b53d0f4a": { - "balance": "20000000000000000000000" + "0x2c4b470307a059854055d91ec3794d80b53d0f4a": { + "balance": "0x43c33c1937564800000" }, - "6af6c7ee99df271ba15bf384c0b764adcb4da182": { - "balance": "999972000000000000000" + "0x6af6c7ee99df271ba15bf384c0b764adcb4da182": { + "balance": "0x36356633ebd8ea0000" }, - "0dae3ee5b915b36487f9161f19846d101433318a": { - "balance": "1910000000000000000000" + "0x0dae3ee5b915b36487f9161f19846d101433318a": { + "balance": "0x678a932062e4180000" }, - "0dcf9d8c9804459f647c14138ed50fad563b4154": { - "balance": "173000000000000000000" + "0x0dcf9d8c9804459f647c14138ed50fad563b4154": { + "balance": "0x960db77681e940000" }, - "bfa8c858df102cb12421008b0a31c4c7190ad560": { - "balance": "200000000000000000000" + "0xbfa8c858df102cb12421008b0a31c4c7190ad560": { + "balance": "0xad78ebc5ac6200000" }, - "c2fd0bf7c725ef3e047e5ae1c29fe18f12a7299c": { - "balance": "1337000000000000000000" + "0xc2fd0bf7c725ef3e047e5ae1c29fe18f12a7299c": { + "balance": "0x487a9a304539440000" }, - "d70a612bd6dda9eab0dddcff4aaf4122d38feae4": { - "balance": "540000000000000000000" + "0xd70a612bd6dda9eab0dddcff4aaf4122d38feae4": { + "balance": "0x1d460162f516f00000" }, - "e07137ae0d116d033533c4eab496f8a9fb09569c": { - "balance": "1400000000000000000000" + "0xe07137ae0d116d033533c4eab496f8a9fb09569c": { + "balance": "0x4be4e7267b6ae00000" }, - "7f49f20726471ac1c7a83ef106e9775ceb662566": { - "balance": "5910000000000000000000" + "0x7f49f20726471ac1c7a83ef106e9775ceb662566": { + "balance": "0x14061b9d77a5e980000" }, - "1e706655e284dcf0bb37fe075d613a18dc12ff4a": { - "balance": "4376760000000000000000" + "0x1e706655e284dcf0bb37fe075d613a18dc12ff4a": { + "balance": "0xed43bf1eee82ac0000" }, - "03af7ad9d5223cf7c8c13f20df67ebe5ffc5bb41": { - "balance": "200000000000000000000" + "0x03af7ad9d5223cf7c8c13f20df67ebe5ffc5bb41": { + "balance": "0xad78ebc5ac6200000" }, - "228242f8336eecd8242e1f000f41937e71dffbbf": { - "balance": "5000000000000000000000" + "0x228242f8336eecd8242e1f000f41937e71dffbbf": { + "balance": "0x10f0cf064dd59200000" }, - "e8ed51bbb3ace69e06024b33f86844c47348db9e": { - "balance": "165170600000000000000000" + "0xe8ed51bbb3ace69e06024b33f86844c47348db9e": { + "balance": "0x22f9ea89f4a7d6c40000" }, - "3b566a8afad19682dc2ce8679a3ce444a5b0fd4f": { - "balance": "2000000000000000000000" + "0x3b566a8afad19682dc2ce8679a3ce444a5b0fd4f": { + "balance": "0x6c6b935b8bbd400000" }, - "dc738fb217cead2f69594c08170de1af10c419e3": { - "balance": "100000000000000000000000" + "0xdc738fb217cead2f69594c08170de1af10c419e3": { + "balance": "0x152d02c7e14af6800000" }, - "13032446e7d610aa00ec8c56c9b574d36ca1c016": { - "balance": "2000000000000000000000" + "0x13032446e7d610aa00ec8c56c9b574d36ca1c016": { + "balance": "0x6c6b935b8bbd400000" }, - "6ca6a132ce1cd288bee30ec7cfeffb85c1f50a54": { - "balance": "2000000000000000000000" + "0x6ca6a132ce1cd288bee30ec7cfeffb85c1f50a54": { + "balance": "0x6c6b935b8bbd400000" }, - "b85f26dd0e72d9c29ebaf697a8af77472c2b58b5": { - "balance": "11900000000000000000000" + "0xb85f26dd0e72d9c29ebaf697a8af77472c2b58b5": { + "balance": "0x28519acc7190c700000" }, - "055bd02caf19d6202bbcdc836d187bd1c01cf261": { - "balance": "100000000000000000000" + "0x055bd02caf19d6202bbcdc836d187bd1c01cf261": { + "balance": "0x56bc75e2d63100000" }, - "3c322e611fdb820d47c6f8fc64b6fad74ca95f5e": { - "balance": "242514000000000000000" + "0x3c322e611fdb820d47c6f8fc64b6fad74ca95f5e": { + "balance": "0xd258ece1b13150000" }, - "8daddf52efbd74da95b969a5476f4fbbb563bfd2": { - "balance": "835000000000000000000" + "0x8daddf52efbd74da95b969a5476f4fbbb563bfd2": { + "balance": "0x2d43f3ebfafb2c0000" }, - "c63ac417992e9f9b60386ed953e6d7dff2b090e8": { - "balance": "4000086000000000000000" + "0xc63ac417992e9f9b60386ed953e6d7dff2b090e8": { + "balance": "0xd8d8583fa2d52f0000" }, - "27f03cf1abc5e1b51dbc444b289e542c9ddfb0e6": { - "balance": "5000000000000000000000" + "0x27f03cf1abc5e1b51dbc444b289e542c9ddfb0e6": { + "balance": "0x10f0cf064dd59200000" }, - "d8f4bae6f84d910d6d7d5ac914b1e68372f94135": { - "balance": "100000000000000000000" + "0xd8f4bae6f84d910d6d7d5ac914b1e68372f94135": { + "balance": "0x56bc75e2d63100000" }, - "9f83a293c324d4106c18faa8888f64d299054ca0": { - "balance": "200000000000000000000" + "0x9f83a293c324d4106c18faa8888f64d299054ca0": { + "balance": "0xad78ebc5ac6200000" }, - "39ee4fe00fbced647068d4f57c01cb22a80bccd1": { - "balance": "6000000000000000000000" + "0x39ee4fe00fbced647068d4f57c01cb22a80bccd1": { + "balance": "0x14542ba12a337c00000" }, - "404100db4c5d0eec557823b58343758bcc2c8083": { - "balance": "20000000000000000000" + "0x404100db4c5d0eec557823b58343758bcc2c8083": { + "balance": "0x1158e460913d00000" }, - "02751dc68cb5bd737027abf7ddb77390cd77c16b": { - "balance": "20000000000000000000" + "0x02751dc68cb5bd737027abf7ddb77390cd77c16b": { + "balance": "0x1158e460913d00000" }, - "d10302faa1929a326904d376bf0b8dc93ad04c4c": { - "balance": "1790000000000000000000" + "0xd10302faa1929a326904d376bf0b8dc93ad04c4c": { + "balance": "0x61093d7c2c6d380000" }, - "cc419fd9912b85135659e77a93bc3df182d45115": { - "balance": "10000000000000000000000" + "0xcc419fd9912b85135659e77a93bc3df182d45115": { + "balance": "0x21e19e0c9bab2400000" }, - "10097198b4e7ee91ff82cc2f3bd95fed73c540c0": { - "balance": "2000000000000000000000" + "0x10097198b4e7ee91ff82cc2f3bd95fed73c540c0": { + "balance": "0x6c6b935b8bbd400000" }, - "7e24d9e22ce1da3ce19f219ccee523376873f367": { - "balance": "5900150000000000000000" + "0x7e24d9e22ce1da3ce19f219ccee523376873f367": { + "balance": "0x13fd9079caa60ff0000" }, - "2e4ee1ae996aa0a1d92428d06652a6bea6d2d15d": { - "balance": "2000000000000000000000" + "0x2e4ee1ae996aa0a1d92428d06652a6bea6d2d15d": { + "balance": "0x6c6b935b8bbd400000" }, - "91a4149a2c7b1b3a67ea28aff34725e0bf8d7524": { - "balance": "1940000000000000000000" + "0x91a4149a2c7b1b3a67ea28aff34725e0bf8d7524": { + "balance": "0x692ae8897081d00000" }, - "ead65262ed5d122df2b2751410f98c32d1238f51": { - "balance": "101680000000000000000" + "0xead65262ed5d122df2b2751410f98c32d1238f51": { + "balance": "0x58317ed46b9b80000" }, - "e20954d0f4108c82d4dcb2148d26bbd924f6dd24": { - "balance": "10000000000000000000000" + "0xe20954d0f4108c82d4dcb2148d26bbd924f6dd24": { + "balance": "0x21e19e0c9bab2400000" }, - "ebb7d2e11bc6b58f0a8d45c2f6de3010570ac891": { - "balance": "26740000000000000000" + "0xebb7d2e11bc6b58f0a8d45c2f6de3010570ac891": { + "balance": "0x1731790534df20000" }, - "ef115252b1b845cd857f002d630f1b6fa37a4e50": { - "balance": "1970000000000000000000" + "0xef115252b1b845cd857f002d630f1b6fa37a4e50": { + "balance": "0x6acb3df27e1f880000" }, - "01a818135a414210c37c62b625aca1a54611ac36": { - "balance": "260000000000000000000" + "0x01a818135a414210c37c62b625aca1a54611ac36": { + "balance": "0xe18398e7601900000" }, - "ea1ea0c599afb9cd36caacbbb52b5bbb97597377": { - "balance": "1069600000000000000000" + "0xea1ea0c599afb9cd36caacbbb52b5bbb97597377": { + "balance": "0x39fbae8d042dd00000" }, - "7a7a4f807357a4bbe68e1aa806393210c411ccb3": { - "balance": "30000000000000000000000" + "0x7a7a4f807357a4bbe68e1aa806393210c411ccb3": { + "balance": "0x65a4da25d3016c00000" }, - "6d40ca27826d97731b3e86effcd7b92a4161fe89": { - "balance": "2000000000000000000000" + "0x6d40ca27826d97731b3e86effcd7b92a4161fe89": { + "balance": "0x6c6b935b8bbd400000" }, - "8431277d7bdd10457dc017408c8dbbbd414a8df3": { - "balance": "39400000000000000000" + "0x8431277d7bdd10457dc017408c8dbbbd414a8df3": { + "balance": "0x222c8eb3ff6640000" }, - "69b81d5981141ec7a7141060dfcf8f3599ffc63e": { - "balance": "5000000000000000000000" + "0x69b81d5981141ec7a7141060dfcf8f3599ffc63e": { + "balance": "0x10f0cf064dd59200000" }, - "47688410ff25d654d72eb2bc06e4ad24f833b094": { - "balance": "160440000000000000000" + "0x47688410ff25d654d72eb2bc06e4ad24f833b094": { + "balance": "0x8b28d61f3d3ac0000" }, - "6c101205b323d77544d6dc52af37aca3cec6f7f1": { - "balance": "10000000000000000000000" + "0x6c101205b323d77544d6dc52af37aca3cec6f7f1": { + "balance": "0x21e19e0c9bab2400000" }, - "fb685c15e439965ef626bf0d834cd1a89f2b5695": { - "balance": "3940000000000000000000" + "0xfb685c15e439965ef626bf0d834cd1a89f2b5695": { + "balance": "0xd5967be4fc3f100000" }, - "673706b1b0e4dc7a949a7a796258a5b83bb5aa83": { - "balance": "16100000000000000000000" + "0x673706b1b0e4dc7a949a7a796258a5b83bb5aa83": { + "balance": "0x368c8623a8b4d100000" }, - "ecdaf93229b45ee672f65db506fb5eca00f7fce6": { - "balance": "1605009000000000000000" + "0xecdaf93229b45ee672f65db506fb5eca00f7fce6": { + "balance": "0x5701f96dcc40ee8000" }, - "ec6904bae1f69790591709b0609783733f2573e3": { - "balance": "500000000000000000000" + "0xec6904bae1f69790591709b0609783733f2573e3": { + "balance": "0x1b1ae4d6e2ef500000" }, - "812ea7a3b2c86eed32ff4f2c73514cc63bacfbce": { - "balance": "1000000000000000000000" + "0x812ea7a3b2c86eed32ff4f2c73514cc63bacfbce": { + "balance": "0x3635c9adc5dea00000" }, - "196c02210a450ab0b36370655f717aa87bd1c004": { - "balance": "259456000000000000000" + "0x196c02210a450ab0b36370655f717aa87bd1c004": { + "balance": "0xe10ace157dbc00000" }, - "d96ac2507409c7a383ab2eee1822a5d738b36b56": { - "balance": "200000000000000000000" + "0xd96ac2507409c7a383ab2eee1822a5d738b36b56": { + "balance": "0xad78ebc5ac6200000" }, - "ae2f9c19ac76136594432393b0471d08902164d3": { - "balance": "698600000000000000000" + "0xae2f9c19ac76136594432393b0471d08902164d3": { + "balance": "0x25df05c6a897e40000" }, - "9d32962ea99700d93228e9dbdad2cc37bb99f07e": { - "balance": "3327560000000000000000" + "0x9d32962ea99700d93228e9dbdad2cc37bb99f07e": { + "balance": "0xb4632bedd4ded40000" }, - "17e584e810e567702c61d55d434b34cdb5ee30f6": { - "balance": "5000000000000000000000" + "0x17e584e810e567702c61d55d434b34cdb5ee30f6": { + "balance": "0x10f0cf064dd59200000" }, - "a3a93ef9dbea2636263d06d8492f6a41de907c22": { - "balance": "60000000000000000000" + "0xa3a93ef9dbea2636263d06d8492f6a41de907c22": { + "balance": "0x340aad21b3b700000" }, - "2b5016e2457387956562587115aa8759d8695fdf": { - "balance": "200000000000000000000000" + "0x2b5016e2457387956562587115aa8759d8695fdf": { + "balance": "0x2a5a058fc295ed000000" }, - "140129eaa766b5a29f5b3af2574e4409f8f6d3f1": { - "balance": "6400000000000000000000" + "0x140129eaa766b5a29f5b3af2574e4409f8f6d3f1": { + "balance": "0x15af1d78b58c4000000" }, - "7025965d2b88da197d4459be3dc9386344cc1f31": { - "balance": "2005500000000000000000" + "0x7025965d2b88da197d4459be3dc9386344cc1f31": { + "balance": "0x6cb7e74867d5e60000" }, - "388bdcdae794fc44082e667501344118ea96cd96": { - "balance": "1670000000000000000000" + "0x388bdcdae794fc44082e667501344118ea96cd96": { + "balance": "0x5a87e7d7f5f6580000" }, - "eee9d0526eda01e43116a395322dda8970578f39": { - "balance": "9999980000000000000000" + "0xeee9d0526eda01e43116a395322dda8970578f39": { + "balance": "0x21e1999bbd5d2be0000" }, - "6ec89b39f9f5276a553e8da30e6ec17aa47eefc7": { - "balance": "447500000000000000000" + "0x6ec89b39f9f5276a553e8da30e6ec17aa47eefc7": { + "balance": "0x18424f5f0b1b4e0000" }, - "7e236666b2d06e63ea4e2ab84357e2dfc977e50e": { - "balance": "999972000000000000000" + "0x7e236666b2d06e63ea4e2ab84357e2dfc977e50e": { + "balance": "0x36356633ebd8ea0000" }, - "68df947c495bebaeb8e889b3f953d533874bf106": { - "balance": "546000000000000000000" + "0x68df947c495bebaeb8e889b3f953d533874bf106": { + "balance": "0x1d9945ab2b03480000" }, - "d40ed66ab3ceff24ca05ecd471efb492c15f5ffa": { - "balance": "500000000000000000000" + "0xd40ed66ab3ceff24ca05ecd471efb492c15f5ffa": { + "balance": "0x1b1ae4d6e2ef500000" }, - "f0c70d0d6dab7663aa9ed9ceea567ee2c6b02765": { - "balance": "2089349000000000000000" + "0xf0c70d0d6dab7663aa9ed9ceea567ee2c6b02765": { + "balance": "0x71438ac5a791a08000" }, - "b589676d15a04448344230d4ff27c95edf122c49": { - "balance": "1000000000000000000000" + "0xb589676d15a04448344230d4ff27c95edf122c49": { + "balance": "0x3635c9adc5dea00000" }, - "a0347f0a98776390165c166d32963bf74dcd0a2f": { - "balance": "1000000000000000000000" + "0xa0347f0a98776390165c166d32963bf74dcd0a2f": { + "balance": "0x3635c9adc5dea00000" }, - "d47d8685faee147c520fd986709175bf2f886bef": { - "balance": "2000000000000000000000" + "0xd47d8685faee147c520fd986709175bf2f886bef": { + "balance": "0x6c6b935b8bbd400000" }, - "a1dcd0e5b05a977c9623e5ae2f59b9ada2f33e31": { - "balance": "100000000000000000000" + "0xa1dcd0e5b05a977c9623e5ae2f59b9ada2f33e31": { + "balance": "0x56bc75e2d63100000" }, - "4979194ec9e97db9bee8343b7c77d9d7f3f1dc9f": { - "balance": "20000000000000000000" + "0x4979194ec9e97db9bee8343b7c77d9d7f3f1dc9f": { + "balance": "0x1158e460913d00000" }, - "7cd20eccb518b60cab095b720f571570caaa447e": { - "balance": "500000000000000000000" + "0x7cd20eccb518b60cab095b720f571570caaa447e": { + "balance": "0x1b1ae4d6e2ef500000" }, - "2ff830cf55fb00d5a0e03514fecd44314bd6d9f1": { - "balance": "10000000000000000000000" + "0x2ff830cf55fb00d5a0e03514fecd44314bd6d9f1": { + "balance": "0x21e19e0c9bab2400000" }, - "0bb25ca7d188e71e4d693d7b170717d6f8f0a70a": { - "balance": "336870000000000000000" + "0x0bb25ca7d188e71e4d693d7b170717d6f8f0a70a": { + "balance": "0x124302a82fadd70000" }, - "e9a2b4914e8553bf0d7c00ca532369b879f931bf": { - "balance": "2000000000000000000000" + "0xe9a2b4914e8553bf0d7c00ca532369b879f931bf": { + "balance": "0x6c6b935b8bbd400000" }, - "720e6b22bf430966fa32b6acb9a506eebf662c61": { - "balance": "152000000000000000000" + "0x720e6b22bf430966fa32b6acb9a506eebf662c61": { + "balance": "0x83d6c7aab63600000" }, - "7ade5d66b944bb860c0efdc86276d58f4653f711": { - "balance": "2000000000000000000000" + "0x7ade5d66b944bb860c0efdc86276d58f4653f711": { + "balance": "0x6c6b935b8bbd400000" }, - "2eaff9f8f8113064d3957ac6d6e11eee42c8195d": { - "balance": "1970000000000000000000" + "0x2eaff9f8f8113064d3957ac6d6e11eee42c8195d": { + "balance": "0x6acb3df27e1f880000" }, - "0c8fd7775e54a6d9c9a3bf890e761f6577693ff0": { - "balance": "9850000000000000000000" + "0x0c8fd7775e54a6d9c9a3bf890e761f6577693ff0": { + "balance": "0x215f835bc769da80000" }, - "290a56d41f6e9efbdcea0342e0b7929a8cdfcb05": { - "balance": "344000000000000000000" + "0x290a56d41f6e9efbdcea0342e0b7929a8cdfcb05": { + "balance": "0x12a5f58168ee600000" }, - "d73ed2d985b5f21b55b274643bc6da031d8edd8d": { - "balance": "49250000000000000000000" + "0xd73ed2d985b5f21b55b274643bc6da031d8edd8d": { + "balance": "0xa6dd90cae5114480000" }, - "80156d10efa8b230c99410630d37e269d4093cea": { - "balance": "2000000000000000000000" + "0x80156d10efa8b230c99410630d37e269d4093cea": { + "balance": "0x6c6b935b8bbd400000" }, - "0989c200440b878991b69d6095dfe69e33a22e70": { - "balance": "1910000000000000000000" + "0x0989c200440b878991b69d6095dfe69e33a22e70": { + "balance": "0x678a932062e4180000" }, - "ec8014efc7cbe5b0ce50f3562cf4e67f8593cd32": { - "balance": "17300000000000000000" + "0xec8014efc7cbe5b0ce50f3562cf4e67f8593cd32": { + "balance": "0xf015f25736420000" }, - "de612d0724e84ea4a7feaa3d2142bd5ee82d3201": { - "balance": "20000000000000000000" + "0xde612d0724e84ea4a7feaa3d2142bd5ee82d3201": { + "balance": "0x1158e460913d00000" }, - "0f832a93df9d7f74cd0fb8546b7198bf5377d925": { - "balance": "143000000000000000000" + "0x0f832a93df9d7f74cd0fb8546b7198bf5377d925": { + "balance": "0x7c0860e5a80dc0000" }, - "aa2c670096d3f939305325427eb955a8a60db3c5": { - "balance": "2003010000000000000000" + "0xaa2c670096d3f939305325427eb955a8a60db3c5": { + "balance": "0x6c95590699232d0000" }, - "25287b815f5c82380a73b0b13fbaf982be24c4d3": { - "balance": "40000000000000000000" + "0x25287b815f5c82380a73b0b13fbaf982be24c4d3": { + "balance": "0x22b1c8c1227a00000" }, - "e75c3b38a58a3f33d55690a5a59766be185e0284": { - "balance": "500000000000000000000" + "0xe75c3b38a58a3f33d55690a5a59766be185e0284": { + "balance": "0x1b1ae4d6e2ef500000" }, - "1940dc9364a852165f47414e27f5002445a4f143": { - "balance": "10850000000000000000000" + "0x1940dc9364a852165f47414e27f5002445a4f143": { + "balance": "0x24c2dff6a3c7c480000" }, - "e5b826196c0e1bc1119b021cf6d259a610c99670": { - "balance": "200000000000000000000" + "0xe5b826196c0e1bc1119b021cf6d259a610c99670": { + "balance": "0xad78ebc5ac6200000" }, - "82a15cef1d6c8260eaf159ea3f0180d8677dce1c": { - "balance": "2000000000000000000000" + "0x82a15cef1d6c8260eaf159ea3f0180d8677dce1c": { + "balance": "0x6c6b935b8bbd400000" }, - "da06044e293c652c467fe74146bf185b21338a1c": { - "balance": "1000000000000000000000" + "0xda06044e293c652c467fe74146bf185b21338a1c": { + "balance": "0x3635c9adc5dea00000" }, - "f815c10a032d13c34b8976fa6e3bd2c9131a8ba9": { - "balance": "1337000000000000000000" + "0xf815c10a032d13c34b8976fa6e3bd2c9131a8ba9": { + "balance": "0x487a9a304539440000" }, - "cd95fa423d6fc120274aacde19f4eeb766f10420": { - "balance": "200000000000000000000" + "0xcd95fa423d6fc120274aacde19f4eeb766f10420": { + "balance": "0xad78ebc5ac6200000" }, - "e3a4f83c39f85af9c8b1b312bfe5fc3423afa634": { - "balance": "28650000000000000000" + "0xe3a4f83c39f85af9c8b1b312bfe5fc3423afa634": { + "balance": "0x18d993f34aef10000" }, - "768ce0daa029b7ded022e5fc574d11cde3ecb517": { - "balance": "322000000000000000000" + "0x768ce0daa029b7ded022e5fc574d11cde3ecb517": { + "balance": "0x1174a5cdf88bc80000" }, - "e3ec18a74ed43855409a26ade7830de8e42685ef": { - "balance": "19700000000000000000" + "0xe3ec18a74ed43855409a26ade7830de8e42685ef": { + "balance": "0x11164759ffb320000" }, - "b2bdbedf95908476d7148a370cc693743628057f": { - "balance": "4000000000000000000000" + "0xb2bdbedf95908476d7148a370cc693743628057f": { + "balance": "0xd8d726b7177a800000" }, - "bbb8ffe43f98de8eae184623ae5264e424d0b8d7": { - "balance": "107600000000000000000" + "0xbbb8ffe43f98de8eae184623ae5264e424d0b8d7": { + "balance": "0x5d53ffde928080000" }, - "090cebef292c3eb081a05fd8aaf7d39bf07b89d4": { - "balance": "4000000000000000000000" + "0x090cebef292c3eb081a05fd8aaf7d39bf07b89d4": { + "balance": "0xd8d726b7177a800000" }, - "dd2a233adede66fe1126d6c16823b62a021feddb": { - "balance": "2000000000000000000000" + "0xdd2a233adede66fe1126d6c16823b62a021feddb": { + "balance": "0x6c6b935b8bbd400000" }, - "d8cd64e0284eec53aa4639afc4750810b97fab56": { - "balance": "20000000000000000000" + "0xd8cd64e0284eec53aa4639afc4750810b97fab56": { + "balance": "0x1158e460913d00000" }, - "e5953fea497104ef9ad2d4e5841c271f073519c2": { - "balance": "704000000000000000000" + "0xe5953fea497104ef9ad2d4e5841c271f073519c2": { + "balance": "0x2629f66e0c53000000" }, - "967d4142af770515dd7062af93498dbfdff29f20": { - "balance": "20200000000000000000" + "0x967d4142af770515dd7062af93498dbfdff29f20": { + "balance": "0x11854d0f9cee40000" }, - "fd191a35157d781373fb411bf9f25290047c5eef": { - "balance": "1000000000000000000000" + "0xfd191a35157d781373fb411bf9f25290047c5eef": { + "balance": "0x3635c9adc5dea00000" }, - "8967d7b9bdb7b4aed22e65a15dc803cb7a213f10": { - "balance": "400000000000000000000" + "0x8967d7b9bdb7b4aed22e65a15dc803cb7a213f10": { + "balance": "0x15af1d78b58c400000" }, - "51e43fe0d25c782860af81ea89dd793c13f0cbb1": { - "balance": "60000000000000000000" + "0x51e43fe0d25c782860af81ea89dd793c13f0cbb1": { + "balance": "0x340aad21b3b700000" }, - "a38476691d34942eea6b2f76889223047db4617a": { - "balance": "2000000000000000000000" + "0xa38476691d34942eea6b2f76889223047db4617a": { + "balance": "0x6c6b935b8bbd400000" }, - "1321ccf29739b974e5a516f18f3a843671e39642": { - "balance": "4000000000000000000000" + "0x1321ccf29739b974e5a516f18f3a843671e39642": { + "balance": "0xd8d726b7177a800000" }, - "4d71a6eb3d7f327e1834278e280b039eddd31c2f": { - "balance": "6000000000000000000000" + "0x4d71a6eb3d7f327e1834278e280b039eddd31c2f": { + "balance": "0x14542ba12a337c00000" }, - "dc2d15a69f6bb33b246aef40450751c2f6756ad2": { - "balance": "1996000000000000000000" + "0xdc2d15a69f6bb33b246aef40450751c2f6756ad2": { + "balance": "0x6c341080bd1fb00000" }, - "ec89f2b678a1a15b9134ec5eb70c6a62071fbaf9": { - "balance": "200000000000000000000" + "0xec89f2b678a1a15b9134ec5eb70c6a62071fbaf9": { + "balance": "0xad78ebc5ac6200000" }, - "27bf943c1633fe32f8bcccdb6302b407a5724e44": { - "balance": "940229000000000000000" + "0x27bf943c1633fe32f8bcccdb6302b407a5724e44": { + "balance": "0x32f84c6df408c08000" }, - "d0a6c6f9e9c4b383d716b31de78d56414de8fa91": { - "balance": "300000000000000000000" + "0xd0a6c6f9e9c4b383d716b31de78d56414de8fa91": { + "balance": "0x1043561a8829300000" }, - "7b6175ec9befc738249535ddde34688cd36edf25": { - "balance": "10000000000000000000000" + "0x7b6175ec9befc738249535ddde34688cd36edf25": { + "balance": "0x21e19e0c9bab2400000" }, - "41ce79950935cff55bf78e4ccec2fe631785db95": { - "balance": "2000000000000000000000" + "0x41ce79950935cff55bf78e4ccec2fe631785db95": { + "balance": "0x6c6b935b8bbd400000" }, - "5598b3a79a48f32b1f5fc915b87b645d805d1afe": { - "balance": "500000000000000000000" + "0x5598b3a79a48f32b1f5fc915b87b645d805d1afe": { + "balance": "0x1b1ae4d6e2ef500000" }, - "5c4881165cb42bb82e97396c8ef44adbf173fb99": { - "balance": "110600000000000000000" + "0x5c4881165cb42bb82e97396c8ef44adbf173fb99": { + "balance": "0x5fee222041e340000" }, - "25b0533b81d02a617b9229c7ec5d6f2f672e5b5a": { - "balance": "1000000000000000000000" + "0x25b0533b81d02a617b9229c7ec5d6f2f672e5b5a": { + "balance": "0x3635c9adc5dea00000" }, - "015f097d9acddcddafaf2a107eb93a40fc94b04c": { - "balance": "20000000000000000000000" + "0x015f097d9acddcddafaf2a107eb93a40fc94b04c": { + "balance": "0x43c33c1937564800000" }, - "b84b53d0bb125656cddc52eb852ab71d7259f3d5": { - "balance": "16000000000000000000000" + "0xb84b53d0bb125656cddc52eb852ab71d7259f3d5": { + "balance": "0x3635c9adc5dea000000" }, - "1a79c7f4039c67a39d7513884cdc0e2c34222490": { - "balance": "20000000000000000000" + "0x1a79c7f4039c67a39d7513884cdc0e2c34222490": { + "balance": "0x1158e460913d00000" }, - "926209b7fda54e8ddb9d9e4d3d19ebdc8e88c29f": { - "balance": "2000000000000000000000" + "0x926209b7fda54e8ddb9d9e4d3d19ebdc8e88c29f": { + "balance": "0x6c6b935b8bbd400000" }, - "c2fe7d75731f636dcd09dbda0671393ba0c82a7d": { - "balance": "2200000000000000000000" + "0xc2fe7d75731f636dcd09dbda0671393ba0c82a7d": { + "balance": "0x77432217e683600000" }, - "30248d58e414b20fed3a6c482b59d9d8f5a4b7e2": { - "balance": "60000000000000000000" + "0x30248d58e414b20fed3a6c482b59d9d8f5a4b7e2": { + "balance": "0x340aad21b3b700000" }, - "d0e194f34b1db609288509ccd2e73b6131a2538b": { - "balance": "999972000000000000000" + "0xd0e194f34b1db609288509ccd2e73b6131a2538b": { + "balance": "0x36356633ebd8ea0000" }, - "e8f29969e75c65e01ce3d86154207d0a9e7c76f2": { - "balance": "2991807000000000000000" + "0xe8f29969e75c65e01ce3d86154207d0a9e7c76f2": { + "balance": "0xa22fa9a73a27198000" }, - "cb93199b9c90bc4915bd859e3d42866dc8c18749": { - "balance": "231800000000000000000" + "0xcb93199b9c90bc4915bd859e3d42866dc8c18749": { + "balance": "0xc90df07def78c0000" }, - "e6fe0afb9dcedd37b2e22c451ba6feab67348033": { - "balance": "10000000000000000000000" + "0xe6fe0afb9dcedd37b2e22c451ba6feab67348033": { + "balance": "0x21e19e0c9bab2400000" }, - "82f854c9c2f087dffa985ac8201e626ca5467686": { - "balance": "100000000000000000000000" + "0x82f854c9c2f087dffa985ac8201e626ca5467686": { + "balance": "0x152d02c7e14af6800000" }, - "63bb664f9117037628594da7e3c5089fd618b5b5": { - "balance": "20000000000000000000" + "0x63bb664f9117037628594da7e3c5089fd618b5b5": { + "balance": "0x1158e460913d00000" }, - "f8d17424c767bea31205739a2b57a7277214eebe": { - "balance": "42000000000000000000" + "0xf8d17424c767bea31205739a2b57a7277214eebe": { + "balance": "0x246ddf97976680000" }, - "4ca8db4a5efefc80f4cd9bbcccb03265931332b6": { - "balance": "200000000000000000000" + "0x4ca8db4a5efefc80f4cd9bbcccb03265931332b6": { + "balance": "0xad78ebc5ac6200000" }, - "c56e6b62ba6e40e52aab167d21df025d0055754b": { - "balance": "2000000000000000000000" + "0xc56e6b62ba6e40e52aab167d21df025d0055754b": { + "balance": "0x6c6b935b8bbd400000" }, - "0d8c40a79e18994ff99ec251ee10d088c3912e80": { - "balance": "114600000000000000000" + "0x0d8c40a79e18994ff99ec251ee10d088c3912e80": { + "balance": "0x63664fcd2bbc40000" }, - "40a331195b977325c2aa28fa2f42cb25ec3c253c": { - "balance": "2000000000000000000000" + "0x40a331195b977325c2aa28fa2f42cb25ec3c253c": { + "balance": "0x6c6b935b8bbd400000" }, - "a2c5854ff1599f98892c5725d262be1da98aadac": { - "balance": "314315000000000000000" + "0xa2c5854ff1599f98892c5725d262be1da98aadac": { + "balance": "0x1109ff333010e78000" }, - "23ab09e73f87aa0f3be0139df0c8eb6be5634f95": { - "balance": "8000000000000000000000" + "0x23ab09e73f87aa0f3be0139df0c8eb6be5634f95": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "b8040536958d5998ce4bec0cfc9c2204989848e9": { - "balance": "24472420000000000000000" + "0xb8040536958d5998ce4bec0cfc9c2204989848e9": { + "balance": "0x52ea70d498fd50a0000" }, - "42d6b263d9e9f4116c411424fc9955783c763030": { - "balance": "2000000000000000000000" + "0x42d6b263d9e9f4116c411424fc9955783c763030": { + "balance": "0x6c6b935b8bbd400000" }, - "c496cbb0459a6a01600fc589a55a32b454217f9d": { - "balance": "274000000000000000000" + "0xc496cbb0459a6a01600fc589a55a32b454217f9d": { + "balance": "0xeda838c4929080000" }, - "48302c311ef8e5dc664158dd583c81194d6e0d58": { - "balance": "3364760000000000000000" + "0x48302c311ef8e5dc664158dd583c81194d6e0d58": { + "balance": "0xb6676ce0bccb5c0000" }, - "d5b284040130abf7c1d163712371cc7e28ad66da": { - "balance": "1970000000000000000000" + "0xd5b284040130abf7c1d163712371cc7e28ad66da": { + "balance": "0x6acb3df27e1f880000" }, - "d22f0ca4cd479e661775053bcc49e390f670dd8a": { - "balance": "1000000000000000000000" + "0xd22f0ca4cd479e661775053bcc49e390f670dd8a": { + "balance": "0x3635c9adc5dea00000" }, - "e597f083a469c4591c3d2b1d2c772787befe27b2": { - "balance": "280000000000000000000" + "0xe597f083a469c4591c3d2b1d2c772787befe27b2": { + "balance": "0xf2dc7d47f15600000" }, - "668b6ba8ab08eace39c502ef672bd5ccb6a67a20": { - "balance": "31135320000000000000000" + "0x668b6ba8ab08eace39c502ef672bd5ccb6a67a20": { + "balance": "0x697d95d4201333c0000" }, - "a3bff1dfa9971668360c0d82828432e27bf54e67": { - "balance": "200000000000000000000" + "0xa3bff1dfa9971668360c0d82828432e27bf54e67": { + "balance": "0xad78ebc5ac6200000" }, - "ee655bb4ee0e8d5478526fb9f15e4064e09ff3dd": { - "balance": "200000000000000000000" + "0xee655bb4ee0e8d5478526fb9f15e4064e09ff3dd": { + "balance": "0xad78ebc5ac6200000" }, - "121f855b70149ac83473b9706fb44d47828b983b": { - "balance": "1400000000000000000000" + "0x121f855b70149ac83473b9706fb44d47828b983b": { + "balance": "0x4be4e7267b6ae00000" }, - "20a15256d50ce058bf0eac43aa533aa16ec9b380": { - "balance": "20000000000000000000" + "0x20a15256d50ce058bf0eac43aa533aa16ec9b380": { + "balance": "0x1158e460913d00000" }, - "69bcfc1d43b4ba19de7b274bdffb35139412d3d7": { - "balance": "985000000000000000000" + "0x69bcfc1d43b4ba19de7b274bdffb35139412d3d7": { + "balance": "0x35659ef93f0fc40000" }, - "db288f80ffe232c2ba47cc94c763cf6fc9b82b0d": { - "balance": "85000000000000000000" + "0xdb288f80ffe232c2ba47cc94c763cf6fc9b82b0d": { + "balance": "0x49b9ca9a694340000" }, - "e1cb83ec5eb6f1eeb85e99b2fc63812fde957184": { - "balance": "20000000000000000000000" + "0xe1cb83ec5eb6f1eeb85e99b2fc63812fde957184": { + "balance": "0x43c33c1937564800000" }, - "a419a984142363267575566089340eea0ea20819": { - "balance": "1999944000000000000000" + "0xa419a984142363267575566089340eea0ea20819": { + "balance": "0x6c6acc67d7b1d40000" }, - "8489f6ad1d9a94a297789156899db64154f1dbb5": { - "balance": "358849000000000000000" + "0x8489f6ad1d9a94a297789156899db64154f1dbb5": { + "balance": "0x137407c03c8c268000" }, - "d609bf4f146eea6b0dc8e06ddcf4448a1fccc9fa": { - "balance": "2000000000000000000000" + "0xd609bf4f146eea6b0dc8e06ddcf4448a1fccc9fa": { + "balance": "0x6c6b935b8bbd400000" }, - "df1fa2e20e31985ebe2c0f0c93b54c0fb67a264b": { - "balance": "200000000000000000000" + "0xdf1fa2e20e31985ebe2c0f0c93b54c0fb67a264b": { + "balance": "0xad78ebc5ac6200000" }, - "efe8ff87fc260e0767638dd5d02fc4672e0ec06d": { - "balance": "2000000000000000000000" + "0xefe8ff87fc260e0767638dd5d02fc4672e0ec06d": { + "balance": "0x6c6b935b8bbd400000" }, - "eef1bbb1e5a83fde8248f88ee3018afa2d1332eb": { - "balance": "200000000000000000000" + "0xeef1bbb1e5a83fde8248f88ee3018afa2d1332eb": { + "balance": "0xad78ebc5ac6200000" }, - "4b3aab335ebbfaa870cc4d605e7d2e74c668369f": { - "balance": "60000000000000000000000" + "0x4b3aab335ebbfaa870cc4d605e7d2e74c668369f": { + "balance": "0xcb49b44ba602d800000" }, - "8f4fb1aea7cd0f570ea5e61b40a4f4510b6264e4": { - "balance": "4000000000000000000000" + "0x8f4fb1aea7cd0f570ea5e61b40a4f4510b6264e4": { + "balance": "0xd8d726b7177a800000" }, - "0b0b3862112aeec3a03492b1b05f440eca54256e": { - "balance": "4000000000000000000000" + "0x0b0b3862112aeec3a03492b1b05f440eca54256e": { + "balance": "0xd8d726b7177a800000" }, - "dff4007931786593b229efe5959f3a4e219e51af": { - "balance": "4925000000000000000000" + "0xdff4007931786593b229efe5959f3a4e219e51af": { + "balance": "0x10afc1ade3b4ed40000" }, - "fec14e5485de2b3eef5e74c46146db8e454e0335": { - "balance": "179000000000000000000" + "0xfec14e5485de2b3eef5e74c46146db8e454e0335": { + "balance": "0x9b41fbf9e0aec0000" }, - "ac21c1e5a3d7e0b50681679dd6c792dbca87decb": { - "balance": "100000000000000000000000" + "0xac21c1e5a3d7e0b50681679dd6c792dbca87decb": { + "balance": "0x152d02c7e14af6800000" }, - "796ebbf49b3e36d67694ad79f8ff36767ac6fab0": { - "balance": "60800000000000000000" + "0x796ebbf49b3e36d67694ad79f8ff36767ac6fab0": { + "balance": "0x34bc4fdde27c00000" }, - "ae7739124ed153052503fc101410d1ffd8cd13b7": { - "balance": "999942000000000000000" + "0xae7739124ed153052503fc101410d1ffd8cd13b7": { + "balance": "0x3634fb9f1489a70000" }, - "86026cad3fe4ea1ce7fca260d3d45eb09ea6a364": { - "balance": "200000000000000000000" + "0x86026cad3fe4ea1ce7fca260d3d45eb09ea6a364": { + "balance": "0xad78ebc5ac6200000" }, - "b2fc84a3e50a50af02f94da0383ed59f71ff01d7": { - "balance": "30000000000000000000000" + "0xb2fc84a3e50a50af02f94da0383ed59f71ff01d7": { + "balance": "0x65a4da25d3016c00000" }, - "bbab000b0408ed015a37c04747bc461ab14e151b": { - "balance": "6000000000000000000000" + "0xbbab000b0408ed015a37c04747bc461ab14e151b": { + "balance": "0x14542ba12a337c00000" }, - "c4ff6fbb1f09bd9e102ba033d636ac1c4c0f5304": { - "balance": "1000000000000000000000" + "0xc4ff6fbb1f09bd9e102ba033d636ac1c4c0f5304": { + "balance": "0x3635c9adc5dea00000" }, - "cc606f511397a38fc7872bd3b0bd03c71bbd768b": { - "balance": "1000000000000000000000" + "0xcc606f511397a38fc7872bd3b0bd03c71bbd768b": { + "balance": "0x3635c9adc5dea00000" }, - "f346d7de92741c08fc58a64db55b062dde012d14": { - "balance": "295106000000000000000" + "0xf346d7de92741c08fc58a64db55b062dde012d14": { + "balance": "0xfff6b1f761e6d0000" }, - "33f15223310d44de8b6636685f3a4c3d9c5655a5": { - "balance": "250500000000000000000" + "0x33f15223310d44de8b6636685f3a4c3d9c5655a5": { + "balance": "0xd9462c6cb4b5a0000" }, - "3c860e2e663f46db53427b29fe3ea5e5bf62bbcc": { - "balance": "98500000000000000000" + "0x3c860e2e663f46db53427b29fe3ea5e5bf62bbcc": { + "balance": "0x556f64c1fe7fa0000" }, - "acb94338554bc488cc88ae2d9d94080d6bdf8410": { - "balance": "1000000000000000000000" + "0xacb94338554bc488cc88ae2d9d94080d6bdf8410": { + "balance": "0x3635c9adc5dea00000" }, - "9c5cc111092c122116f1a85f4ee31408741a7d2f": { - "balance": "492500000000000000000" + "0x9c5cc111092c122116f1a85f4ee31408741a7d2f": { + "balance": "0x1ab2cf7c9f87e20000" }, - "5f76f0a306269c78306b3d650dc3e9c37084db61": { - "balance": "2400000000000000000000" + "0x5f76f0a306269c78306b3d650dc3e9c37084db61": { + "balance": "0x821ab0d44149800000" }, - "2c0cc3f951482cc8a2925815684eb9f94e060200": { - "balance": "6000000000000000000000" + "0x2c0cc3f951482cc8a2925815684eb9f94e060200": { + "balance": "0x14542ba12a337c00000" }, - "b74372dbfa181dc9242f39bf1d3731dffe2bdacf": { - "balance": "2000000000000000000000" + "0xb74372dbfa181dc9242f39bf1d3731dffe2bdacf": { + "balance": "0x6c6b935b8bbd400000" }, - "3bab4b01a7c84ba13feea9b0bb191b77a3aadca3": { - "balance": "200000000000000000000" + "0x3bab4b01a7c84ba13feea9b0bb191b77a3aadca3": { + "balance": "0xad78ebc5ac6200000" }, - "39aa05e56d7d32385421cf9336e90d3d15a9f859": { - "balance": "26000000000000000000" + "0x39aa05e56d7d32385421cf9336e90d3d15a9f859": { + "balance": "0x168d28e3f00280000" }, - "4a52bad20357228faa1e996bed790c93674ba7d0": { - "balance": "1337000000000000000000" + "0x4a52bad20357228faa1e996bed790c93674ba7d0": { + "balance": "0x487a9a304539440000" }, - "ff128f4b355be1dc4a6f94fa510d7f15d53c2aff": { - "balance": "2720000000000000000000" + "0xff128f4b355be1dc4a6f94fa510d7f15d53c2aff": { + "balance": "0x93739534d286800000" }, - "92793ac5b37268774a7130de2bbd330405661773": { - "balance": "40110000000000000000" + "0x92793ac5b37268774a7130de2bbd330405661773": { + "balance": "0x22ca3587cf4eb0000" }, - "db19a3982230368f0177219cb10cb259cdb2257c": { - "balance": "2000000000000000000000" + "0xdb19a3982230368f0177219cb10cb259cdb2257c": { + "balance": "0x6c6b935b8bbd400000" }, - "8d1794da509cb297053661a14aa892333231e3c1": { - "balance": "199600000000000000000" + "0x8d1794da509cb297053661a14aa892333231e3c1": { + "balance": "0xad201a6794ff80000" }, - "9b7c8810cc7cc89e804e6d3e38121850472877fe": { - "balance": "2000000000000000000000" + "0x9b7c8810cc7cc89e804e6d3e38121850472877fe": { + "balance": "0x6c6b935b8bbd400000" }, - "ed3cbc3782cebd67989b305c4133b2cde32211eb": { - "balance": "400000000000000000000" + "0xed3cbc3782cebd67989b305c4133b2cde32211eb": { + "balance": "0x15af1d78b58c400000" }, - "8532490897bbb4ce8b7f6b837e4cba848fbe9976": { - "balance": "100000000000000000000" + "0x8532490897bbb4ce8b7f6b837e4cba848fbe9976": { + "balance": "0x56bc75e2d63100000" }, - "c384ac6ee27c39e2f278c220bdfa5baed626d9d3": { - "balance": "600000000000000000000" + "0xc384ac6ee27c39e2f278c220bdfa5baed626d9d3": { + "balance": "0x2086ac351052600000" }, - "b1459285863ea2db3759e546ceb3fb3761f5909c": { - "balance": "1122309000000000000000" + "0xb1459285863ea2db3759e546ceb3fb3761f5909c": { + "balance": "0x3cd72a894087e08000" }, - "634efc24371107b4cbf03f79a93dfd93e431d5fd": { - "balance": "1221341000000000000000" + "0x634efc24371107b4cbf03f79a93dfd93e431d5fd": { + "balance": "0x423582e08edc5c8000" }, - "ef9f59aeda418c1494682d941aab4924b5f4929a": { - "balance": "100000000000000000000000" + "0xef9f59aeda418c1494682d941aab4924b5f4929a": { + "balance": "0x152d02c7e14af6800000" }, - "e7311c9533f0092c7248c9739b5b2c864a34b1ce": { - "balance": "2803436000000000000000" + "0xe7311c9533f0092c7248c9739b5b2c864a34b1ce": { + "balance": "0x97f97d6cc26dfe0000" }, - "e6e621eaab01f20ef0836b7cad47464cb5fd3c96": { - "balance": "316014000000000000000" + "0xe6e621eaab01f20ef0836b7cad47464cb5fd3c96": { + "balance": "0x11219342afa24b0000" }, - "cd102cd6db3df14ad6af0f87c72479861bfc3d24": { - "balance": "2000000000000000000000" + "0xcd102cd6db3df14ad6af0f87c72479861bfc3d24": { + "balance": "0x6c6b935b8bbd400000" }, - "005a9c03f69d17d66cbb8ad721008a9ebbb836fb": { - "balance": "2000000000000000000000" + "0x005a9c03f69d17d66cbb8ad721008a9ebbb836fb": { + "balance": "0x6c6b935b8bbd400000" }, - "a072cebe62a9e9f61cc3fbf88a9efbfe3e9a8d70": { - "balance": "400000000000000000000" + "0xa072cebe62a9e9f61cc3fbf88a9efbfe3e9a8d70": { + "balance": "0x15af1d78b58c400000" }, - "f2ab1161750244d0ecd048ee0d3e51abb143a2fd": { - "balance": "1235800000000000000000" + "0xf2ab1161750244d0ecd048ee0d3e51abb143a2fd": { + "balance": "0x42fe2b907373bc0000" }, - "f686785b89720b61145fea80978d6acc8e0bc196": { - "balance": "4000000000000000000000" + "0xf686785b89720b61145fea80978d6acc8e0bc196": { + "balance": "0xd8d726b7177a800000" }, - "0a2b4fc5d81ace67dc4bba03f7b455413d46fe3d": { - "balance": "197000000000000000000" + "0x0a2b4fc5d81ace67dc4bba03f7b455413d46fe3d": { + "balance": "0xaadec983fcff40000" }, - "c32ec7e42ad16ce3e2555ad4c54306eda0b26758": { - "balance": "2000000000000000000000" + "0xc32ec7e42ad16ce3e2555ad4c54306eda0b26758": { + "balance": "0x6c6b935b8bbd400000" }, - "f3fa723552a5d0512e2b62f48dca7b2b8105305b": { - "balance": "137000000000000000000" + "0xf3fa723552a5d0512e2b62f48dca7b2b8105305b": { + "balance": "0x76d41c62494840000" }, - "6dc3f92baa1d21dab7382b893261a0356fa7c187": { - "balance": "1730000000000000000000" + "0x6dc3f92baa1d21dab7382b893261a0356fa7c187": { + "balance": "0x5dc892aa1131c80000" }, - "4627c606842671abde8295ee5dd94c7f549534f4": { - "balance": "286600000000000000000" + "0x4627c606842671abde8295ee5dd94c7f549534f4": { + "balance": "0xf895fbd8732f40000" }, - "e39e46e15d22ce56e0c32f1877b7d1a264cf94f3": { - "balance": "20000000000000000000000" + "0xe39e46e15d22ce56e0c32f1877b7d1a264cf94f3": { + "balance": "0x43c33c1937564800000" }, - "d7d157e4c0a96437a6d285741dd23ec4361fa36b": { - "balance": "2000000000000000000000" + "0xd7d157e4c0a96437a6d285741dd23ec4361fa36b": { + "balance": "0x6c6b935b8bbd400000" }, - "68f8f45155e98c5029a4ebc5b527a92e9fa83120": { - "balance": "4436101000000000000000" + "0x68f8f45155e98c5029a4ebc5b527a92e9fa83120": { + "balance": "0xf07b44b40793208000" }, - "9aba2b5e27ff78baaab5cdc988b7be855cebbdce": { - "balance": "9999000000000000000000" + "0x9aba2b5e27ff78baaab5cdc988b7be855cebbdce": { + "balance": "0x21e0c0013070adc0000" }, - "66b39837cb3cac8a802afe3f12a258bbca62dacd": { - "balance": "400000000000000000000" + "0x66b39837cb3cac8a802afe3f12a258bbca62dacd": { + "balance": "0x15af1d78b58c400000" }, - "d39b7cbc94003fc948f0cde27b100db8ccd6e063": { - "balance": "400000000000000000000" + "0xd39b7cbc94003fc948f0cde27b100db8ccd6e063": { + "balance": "0x15af1d78b58c400000" }, - "3db9ed7f024c7e26372feacf2b050803445e3810": { - "balance": "1285600000000000000000" + "0x3db9ed7f024c7e26372feacf2b050803445e3810": { + "balance": "0x45b148b4996a300000" }, - "3fbc1e4518d73400c6d046359439fb68ea1a49f4": { - "balance": "16400000000000000000000" + "0x3fbc1e4518d73400c6d046359439fb68ea1a49f4": { + "balance": "0x3790bb8551376400000" }, - "e3da4f3240844c9b6323b4996921207122454399": { - "balance": "11539639000000000000000" + "0xe3da4f3240844c9b6323b4996921207122454399": { + "balance": "0x27190a952df4be58000" }, - "09afa73bc047ef46b977fd9763f87286a6be68c6": { - "balance": "501500000000000000000" + "0x09afa73bc047ef46b977fd9763f87286a6be68c6": { + "balance": "0x1b2fb5e8f06a660000" }, - "1dbe8e1c2b8a009f85f1ad3ce80d2e05350ee39c": { - "balance": "135400000000000000000" + "0x1dbe8e1c2b8a009f85f1ad3ce80d2e05350ee39c": { + "balance": "0x7570d6e9ebbe40000" }, - "2c5a2d0abda03bbe215781b4ff296c8c61bdbaf6": { - "balance": "30617000000000000000" + "0x2c5a2d0abda03bbe215781b4ff296c8c61bdbaf6": { + "balance": "0x1a8e56f48c0228000" }, - "9a9d1dc0baa77d6e20c3d849c78862dd1c054c87": { - "balance": "880000000000000000000" + "0x9a9d1dc0baa77d6e20c3d849c78862dd1c054c87": { + "balance": "0x2fb474098f67c00000" }, - "3ccef88679573947e94997798a1e327e08603a65": { - "balance": "807700000000000000000" + "0x3ccef88679573947e94997798a1e327e08603a65": { + "balance": "0x2bc916d69f3b020000" }, - "850b9db18ff84bf0c7da49ea3781d92090ad7e64": { - "balance": "2600000000000000000000" + "0x850b9db18ff84bf0c7da49ea3781d92090ad7e64": { + "balance": "0x8cf23f909c0fa00000" }, - "361c75931696bc3d427d93e76c77fd13b241f6f4": { - "balance": "549212000000000000000" + "0x361c75931696bc3d427d93e76c77fd13b241f6f4": { + "balance": "0x1dc5d8fc266dd60000" }, - "c8f2b320e6dfd70906c597bad2f9501312c78259": { - "balance": "1504800000000000000000" + "0xc8f2b320e6dfd70906c597bad2f9501312c78259": { + "balance": "0x51934b8b3a57d00000" }, - "8dc1d5111d09af25fdfcac455c7cec283e6d6775": { - "balance": "2000000000000000000000" + "0x8dc1d5111d09af25fdfcac455c7cec283e6d6775": { + "balance": "0x6c6b935b8bbd400000" }, - "cd7ece086b4b619b3b369352ee38b71ddb06439a": { - "balance": "200000000000000000000" + "0xcd7ece086b4b619b3b369352ee38b71ddb06439a": { + "balance": "0xad78ebc5ac6200000" }, - "f607c2150d3e1b99f24fa1c7d540add35c4ebe1e": { - "balance": "3098020000000000000000" + "0xf607c2150d3e1b99f24fa1c7d540add35c4ebe1e": { + "balance": "0xa7f1aa07fc8faa0000" }, - "32485c818728c197fea487fbb6e829159eba8370": { - "balance": "1053893000000000000000" + "0x32485c818728c197fea487fbb6e829159eba8370": { + "balance": "0x3921b413bc4ec08000" }, - "8e670815fb67aeaea57b86534edc00cdf564fee5": { - "balance": "3300000000000000000000" + "0x8e670815fb67aeaea57b86534edc00cdf564fee5": { + "balance": "0xb2e4b323d9c5100000" }, - "10df681506e34930ac7a5c67a54c3e89ce92b981": { - "balance": "2153800000000000000000" + "0x10df681506e34930ac7a5c67a54c3e89ce92b981": { + "balance": "0x74c1fab8adb4540000" }, - "1cf2eb7a8ccac2adeaef0ee87347d535d3b94058": { - "balance": "2000000000000000000000" + "0x1cf2eb7a8ccac2adeaef0ee87347d535d3b94058": { + "balance": "0x6c6b935b8bbd400000" }, - "f0dc43f205619127507b2b1c1cfdf32d28310920": { - "balance": "301973000000000000000" + "0xf0dc43f205619127507b2b1c1cfdf32d28310920": { + "balance": "0x105eb79b9417088000" }, - "f2c2904e9fa664a11ee25656d8fd2cc0d9a522a0": { - "balance": "13370000000000000000" + "0xf2c2904e9fa664a11ee25656d8fd2cc0d9a522a0": { + "balance": "0xb98bc829a6f90000" }, - "70670fbb05d33014444b8d1e8e7700258b8caa6d": { - "balance": "2000000000000000000000" + "0x70670fbb05d33014444b8d1e8e7700258b8caa6d": { + "balance": "0x6c6b935b8bbd400000" }, - "5160ed612e1b48e73f3fc15bc4321b8f23b8a24b": { - "balance": "562800000000000000000" + "0x5160ed612e1b48e73f3fc15bc4321b8f23b8a24b": { + "balance": "0x1e826b422865d80000" }, - "54a62bf9233e146ffec3876e45f20ee8414adeba": { - "balance": "10000000000000000000000" + "0x54a62bf9233e146ffec3876e45f20ee8414adeba": { + "balance": "0x21e19e0c9bab2400000" }, - "26d4ec17d5ceb2c894bdc59d0a6a695dad2b43cc": { - "balance": "2935300000000000000000" + "0x26d4ec17d5ceb2c894bdc59d0a6a695dad2b43cc": { + "balance": "0x9f1f78761d341a0000" }, - "205fc843e19a4913d1881eb69b69c0fa3be5c50b": { - "balance": "9700000000000000000000" + "0x205fc843e19a4913d1881eb69b69c0fa3be5c50b": { + "balance": "0x20dd68aaf3289100000" }, - "e001aba77c02e172086c1950fffbcaa30b83488f": { - "balance": "1970000000000000000000" + "0xe001aba77c02e172086c1950fffbcaa30b83488f": { + "balance": "0x6acb3df27e1f880000" }, - "21efbca09b3580b98e73f5b2f7f4dc0bf02c529c": { - "balance": "2000000000000000000000" + "0x21efbca09b3580b98e73f5b2f7f4dc0bf02c529c": { + "balance": "0x6c6b935b8bbd400000" }, - "c4d916574e68c49f7ef9d3d82d1638b2b7ee0985": { - "balance": "1580000000000000000000" + "0xc4d916574e68c49f7ef9d3d82d1638b2b7ee0985": { + "balance": "0x55a6e79ccd1d300000" }, - "cab0d32cf3767fa6b3537c84328baa9f50458136": { - "balance": "8960000000000000000000" + "0xcab0d32cf3767fa6b3537c84328baa9f50458136": { + "balance": "0x1e5b8fa8fe2ac000000" }, - "7ce4686446f1949ebed67215eb0d5a1dd72c11b8": { - "balance": "2217776000000000000000" + "0x7ce4686446f1949ebed67215eb0d5a1dd72c11b8": { + "balance": "0x7839d321b81ab80000" }, - "7837fcb876da00d1eb3b88feb3df3fa4042fac82": { - "balance": "1760000000000000000000" + "0x7837fcb876da00d1eb3b88feb3df3fa4042fac82": { + "balance": "0x5f68e8131ecf800000" }, - "71e38ff545f30fe14ca863d4f5297fd48c73a5ce": { - "balance": "3580000000000000000000" + "0x71e38ff545f30fe14ca863d4f5297fd48c73a5ce": { + "balance": "0xc2127af858da700000" }, - "e528a0e5a267d667e9393a6584e19b34dc9be973": { - "balance": "5600000000000000000000" + "0xe528a0e5a267d667e9393a6584e19b34dc9be973": { + "balance": "0x12f939c99edab800000" }, - "c5374928cdf193705443b14cc20da423473cd9cf": { - "balance": "138139000000000000000" + "0xc5374928cdf193705443b14cc20da423473cd9cf": { + "balance": "0x77d10509bb3af8000" }, - "e406f5dd72cab66d8a6ecbd6bfb494a7b6b09afe": { - "balance": "100000000000000000000" + "0xe406f5dd72cab66d8a6ecbd6bfb494a7b6b09afe": { + "balance": "0x56bc75e2d63100000" }, - "d7ef340e66b0d7afcce20a19cb7bfc81da33d94e": { - "balance": "3000000000000000000000" + "0xd7ef340e66b0d7afcce20a19cb7bfc81da33d94e": { + "balance": "0xa2a15d09519be00000" }, - "e012db453827a58e16c1365608d36ed658720507": { - "balance": "2000000000000000000000" + "0xe012db453827a58e16c1365608d36ed658720507": { + "balance": "0x6c6b935b8bbd400000" }, - "d59638d3c5faa7711bf085745f9d5bdc23d498d8": { - "balance": "2000000000000000000000" + "0xd59638d3c5faa7711bf085745f9d5bdc23d498d8": { + "balance": "0x6c6b935b8bbd400000" }, - "008fc7cbadffbd0d7fe44f8dfd60a79d721a1c9c": { - "balance": "1000000000000000000000" + "0x008fc7cbadffbd0d7fe44f8dfd60a79d721a1c9c": { + "balance": "0x3635c9adc5dea00000" }, - "8a3470282d5e2a2aefd7a75094c822c4f5aeef8a": { - "balance": "242743000000000000000" + "0x8a3470282d5e2a2aefd7a75094c822c4f5aeef8a": { + "balance": "0xd28bc606478a58000" }, - "38b3965c21fa893931079beacfffaf153678b6eb": { - "balance": "170374000000000000000" + "0x38b3965c21fa893931079beacfffaf153678b6eb": { + "balance": "0x93c6a0a51e2670000" }, - "57dd9471cbfa262709f5f486bcb774c5f527b8f8": { - "balance": "197000000000000000000" + "0x57dd9471cbfa262709f5f486bcb774c5f527b8f8": { + "balance": "0xaadec983fcff40000" }, - "5a60c924162873fc7ea4da7f972e350167376031": { - "balance": "83583000000000000000" + "0x5a60c924162873fc7ea4da7f972e350167376031": { + "balance": "0x487f277a885798000" }, - "b9013c51bd078a098fae05bf2ace0849c6be17a5": { - "balance": "80000000000000000000" + "0xb9013c51bd078a098fae05bf2ace0849c6be17a5": { + "balance": "0x4563918244f400000" }, - "dc23b260fcc26e7d10f4bd044af794579460d9da": { - "balance": "500038000000000000000" + "0xdc23b260fcc26e7d10f4bd044af794579460d9da": { + "balance": "0x1b1b6bd7af64c70000" }, - "45db03bccfd6a5f4d0266b82a22a368792c77d83": { - "balance": "8000000000000000000000" + "0x45db03bccfd6a5f4d0266b82a22a368792c77d83": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "3e0cbe6a6dcb61f110c45ba2aa361d7fcad3da73": { - "balance": "8022000000000000000000" + "0x3e0cbe6a6dcb61f110c45ba2aa361d7fcad3da73": { + "balance": "0x1b2df9d219f57980000" }, - "42d3a5a901f2f6bd9356f112a70180e5a1550b60": { - "balance": "925000000000000000000" + "0x42d3a5a901f2f6bd9356f112a70180e5a1550b60": { + "balance": "0x3224f42723d4540000" }, - "47219229e8cd56659a65c2a943e2dd9a8f4bfd89": { - "balance": "1520000000000000000000" + "0x47219229e8cd56659a65c2a943e2dd9a8f4bfd89": { + "balance": "0x52663ccab1e1c00000" }, - "a20d071b1b003063497d7990e1249dabf36c35f7": { - "balance": "1000000000000000000000" + "0xa20d071b1b003063497d7990e1249dabf36c35f7": { + "balance": "0x3635c9adc5dea00000" }, - "6835c8e8b74a2ca2ae3f4a8d0f6b954a3e2a8392": { - "balance": "60140000000000000000" + "0x6835c8e8b74a2ca2ae3f4a8d0f6b954a3e2a8392": { + "balance": "0x3429c335d57fe0000" }, - "0c2d5c920538e953caaf24f0737f554cc6927742": { - "balance": "1000000000000000000000" + "0x0c2d5c920538e953caaf24f0737f554cc6927742": { + "balance": "0x3635c9adc5dea00000" }, - "eedf6c4280e6eb05b934ace428e11d4231b5905b": { - "balance": "200000000000000000000" + "0xeedf6c4280e6eb05b934ace428e11d4231b5905b": { + "balance": "0xad78ebc5ac6200000" }, - "ffa696ecbd787e66abae4fe87b635f07ca57d848": { - "balance": "1337000000000000000000" + "0xffa696ecbd787e66abae4fe87b635f07ca57d848": { + "balance": "0x487a9a304539440000" }, - "3e81772175237eb4cbe0fe2dcafdadffeb6a1999": { - "balance": "8800000000000000000000" + "0x3e81772175237eb4cbe0fe2dcafdadffeb6a1999": { + "balance": "0x1dd0c885f9a0d800000" }, - "b44783c8e57b480793cbd69a45d90c7b4f0c48ac": { - "balance": "20000000000000000000" + "0xb44783c8e57b480793cbd69a45d90c7b4f0c48ac": { + "balance": "0x1158e460913d00000" }, - "f84f090adf3f8db7e194b350fbb77500699f66fd": { - "balance": "1970000000000000000000" + "0xf84f090adf3f8db7e194b350fbb77500699f66fd": { + "balance": "0x6acb3df27e1f880000" }, - "2e9824b5c132111bca24ddfba7e575a5cd7296c1": { - "balance": "17201900000000000000000" + "0x2e9824b5c132111bca24ddfba7e575a5cd7296c1": { + "balance": "0x3a484516e6d7ffe0000" }, - "5cce72d068c7c3f55b1d2819545e77317cae8240": { - "balance": "1940000000000000000000" + "0x5cce72d068c7c3f55b1d2819545e77317cae8240": { + "balance": "0x692ae8897081d00000" }, - "d815e1d9f4e2b5e57e34826b7cfd8881b8546890": { - "balance": "17300000000000000000" + "0xd815e1d9f4e2b5e57e34826b7cfd8881b8546890": { + "balance": "0xf015f25736420000" }, - "f901c00fc1db88b69c4bc3252b5ca70ea6ee5cf6": { - "balance": "400000000000000000000" + "0xf901c00fc1db88b69c4bc3252b5ca70ea6ee5cf6": { + "balance": "0x15af1d78b58c400000" }, - "a960b1cadd3b5c1a8e6cb3abcaf52ee7c3d9fa88": { - "balance": "1522704000000000000000" + "0xa960b1cadd3b5c1a8e6cb3abcaf52ee7c3d9fa88": { + "balance": "0x528bc3545e52680000" }, - "f7e45a12aa711c709acefe95f33b78612d2ad22a": { - "balance": "66230000000000000000000" + "0xf7e45a12aa711c709acefe95f33b78612d2ad22a": { + "balance": "0xe0655e2f26bc9180000" }, - "c332df50b13c013490a5d7c75dbfa366da87b6d6": { - "balance": "4000000000000000000000" + "0xc332df50b13c013490a5d7c75dbfa366da87b6d6": { + "balance": "0xd8d726b7177a800000" }, - "d467cf064c0871989b90d8b2eb14ccc63b360823": { - "balance": "200000000000000000000" + "0xd467cf064c0871989b90d8b2eb14ccc63b360823": { + "balance": "0xad78ebc5ac6200000" }, - "b9144b677c2dc614ceefdf50985f1183208ea64c": { - "balance": "2000000000000000000000" + "0xb9144b677c2dc614ceefdf50985f1183208ea64c": { + "balance": "0x6c6b935b8bbd400000" }, - "ea7c4d6dc729cd6b157c03ad237ca19a209346c3": { - "balance": "2000000000000000000000" + "0xea7c4d6dc729cd6b157c03ad237ca19a209346c3": { + "balance": "0x6c6b935b8bbd400000" }, - "9c9de44724a4054da0eaa605abcc802668778bea": { - "balance": "200020000000000000000" + "0x9c9de44724a4054da0eaa605abcc802668778bea": { + "balance": "0xad7d5ca3fa5a20000" }, - "d7140c8e5a4307fab0cc27badd9295018bf87970": { - "balance": "109600000000000000000" + "0xd7140c8e5a4307fab0cc27badd9295018bf87970": { + "balance": "0x5f1016b5076d00000" }, - "c33acdb3ba1aab27507b86b15d67faf91ecf6293": { - "balance": "2000000000000000000000" + "0xc33acdb3ba1aab27507b86b15d67faf91ecf6293": { + "balance": "0x6c6b935b8bbd400000" }, - "db2a0c9ab64df58ddfb1dbacf8ba0d89c85b31b4": { - "balance": "4000000000000000000000" + "0xdb2a0c9ab64df58ddfb1dbacf8ba0d89c85b31b4": { + "balance": "0xd8d726b7177a800000" }, - "bfcb9730246304700da90b4153e71141622e1c41": { - "balance": "1000000000000000000000" + "0xbfcb9730246304700da90b4153e71141622e1c41": { + "balance": "0x3635c9adc5dea00000" }, - "07dc8c8b927adbedfa8f5d639b4352351f2f36d2": { - "balance": "314382000000000000000" + "0x07dc8c8b927adbedfa8f5d639b4352351f2f36d2": { + "balance": "0x110aed3b5530db0000" }, - "2d5391e938b34858cf965b840531d5efda410b09": { - "balance": "1400000000000000000000" + "0x2d5391e938b34858cf965b840531d5efda410b09": { + "balance": "0x4be4e7267b6ae00000" }, - "0b5e2011ebc25a007f21362960498afb8af280fb": { - "balance": "2000000000000000000000" + "0x0b5e2011ebc25a007f21362960498afb8af280fb": { + "balance": "0x6c6b935b8bbd400000" }, - "ed9fb1f5af2fbf7ffc5029cee42b70ff5c275bf5": { - "balance": "280000000000000000000" + "0xed9fb1f5af2fbf7ffc5029cee42b70ff5c275bf5": { + "balance": "0xf2dc7d47f15600000" }, - "a3232d068d50064903c9ebc563b515acc8b7b097": { - "balance": "2002000000000000000000" + "0xa3232d068d50064903c9ebc563b515acc8b7b097": { + "balance": "0x6c8754c8f30c080000" }, - "66274fea82cd30b6c29b23350e4f4f3d310a5899": { - "balance": "2070000000000000000000" + "0x66274fea82cd30b6c29b23350e4f4f3d310a5899": { + "balance": "0x70370550ab82980000" }, - "dbfb1bb464b8a58e500d2ed8de972c45f5f1c0fb": { - "balance": "1600000000000000000000" + "0xdbfb1bb464b8a58e500d2ed8de972c45f5f1c0fb": { + "balance": "0x56bc75e2d631000000" }, - "a1f8d8bcf90e777f19b3a649759ad95027abdfc3": { - "balance": "200000000000000000000" + "0xa1f8d8bcf90e777f19b3a649759ad95027abdfc3": { + "balance": "0xad78ebc5ac6200000" }, - "5bd23547477f6d09d7b2a005c5ee650c510c56d7": { - "balance": "10000000000000000000000" + "0x5bd23547477f6d09d7b2a005c5ee650c510c56d7": { + "balance": "0x21e19e0c9bab2400000" }, - "ec3b8b58a12703e581ce5ffd7e21c57d1e5c663f": { - "balance": "1700000000000000000000" + "0xec3b8b58a12703e581ce5ffd7e21c57d1e5c663f": { + "balance": "0x5c283d410394100000" }, - "54310b3aa88703a725dfa57de6e646935164802c": { - "balance": "1910000000000000000000" + "0x54310b3aa88703a725dfa57de6e646935164802c": { + "balance": "0x678a932062e4180000" }, - "8f41b1fbf54298f5d0bc2d122f4eb95da4e5cd3d": { - "balance": "354200000000000000000" + "0x8f41b1fbf54298f5d0bc2d122f4eb95da4e5cd3d": { + "balance": "0x1333832f5e335c0000" }, - "c80b36d1beafba5fcc644d60ac6e46ed2927e7dc": { - "balance": "13370000000000000000" + "0xc80b36d1beafba5fcc644d60ac6e46ed2927e7dc": { + "balance": "0xb98bc829a6f90000" }, - "1ea492bce1ad107e337f4bd4a7ac9a7babcccdab": { - "balance": "100000000000000000000" + "0x1ea492bce1ad107e337f4bd4a7ac9a7babcccdab": { + "balance": "0x56bc75e2d63100000" }, - "aaf023fef290a49bb78bb7abc95d669c50d528b0": { - "balance": "200000000000000000000" + "0xaaf023fef290a49bb78bb7abc95d669c50d528b0": { + "balance": "0xad78ebc5ac6200000" }, - "80b79f338390d1ba1b3737a29a0257e5d91e0731": { - "balance": "20000000000000000000" + "0x80b79f338390d1ba1b3737a29a0257e5d91e0731": { + "balance": "0x1158e460913d00000" }, - "f382e4c20410b951089e19ba96a2fee3d91cce7e": { - "balance": "5054000000000000000000" + "0xf382e4c20410b951089e19ba96a2fee3d91cce7e": { + "balance": "0x111fa56eec2a8380000" }, - "0748713145ef83c3f0ef4d31d823786f7e9cc689": { - "balance": "4500000000000000000000" + "0x0748713145ef83c3f0ef4d31d823786f7e9cc689": { + "balance": "0xf3f20b8dfa69d00000" }, - "21e219c89ca8ac14ae4cba6130eeb77d9e6d3962": { - "balance": "789580000000000000000" + "0x21e219c89ca8ac14ae4cba6130eeb77d9e6d3962": { + "balance": "0x2acd9faaa038ee0000" }, - "ca9a042a6a806ffc92179500d24429e8ab528117": { - "balance": "1100000000000000000000" + "0xca9a042a6a806ffc92179500d24429e8ab528117": { + "balance": "0x3ba1910bf341b00000" }, - "bcc9593b2da6df6a34d71b1aa38dacf876f95b88": { - "balance": "20000000000000000000" + "0xbcc9593b2da6df6a34d71b1aa38dacf876f95b88": { + "balance": "0x1158e460913d00000" }, - "d1438267231704fc7280d563adf4763844a80722": { - "balance": "200000000000000000000" + "0xd1438267231704fc7280d563adf4763844a80722": { + "balance": "0xad78ebc5ac6200000" }, - "4989e1ab5e7cd00746b3938ef0f0d064a2025ba5": { - "balance": "2000000000000000000000" + "0x4989e1ab5e7cd00746b3938ef0f0d064a2025ba5": { + "balance": "0x6c6b935b8bbd400000" }, - "bd4b60faec740a21e3071391f96aa534f7c1f44e": { - "balance": "182000000000000000000" + "0xbd4b60faec740a21e3071391f96aa534f7c1f44e": { + "balance": "0x9ddc1e3b901180000" }, - "8c7cb4e48b25031aa1c4f92925d631a8c3edc761": { - "balance": "1000000000000000000000" + "0x8c7cb4e48b25031aa1c4f92925d631a8c3edc761": { + "balance": "0x3635c9adc5dea00000" }, - "322788b5e29bf4f5f55ae1ddb32085fda91b8ebe": { - "balance": "200000000000000000000" + "0x322788b5e29bf4f5f55ae1ddb32085fda91b8ebe": { + "balance": "0xad78ebc5ac6200000" }, - "f15e182c4fbbad79bd93342242d4dccf2be58925": { - "balance": "1940000000000000000000" + "0xf15e182c4fbbad79bd93342242d4dccf2be58925": { + "balance": "0x692ae8897081d00000" }, - "1548b770a5118ede87dba2f690337f616de683ab": { - "balance": "527558000000000000000" + "0x1548b770a5118ede87dba2f690337f616de683ab": { + "balance": "0x1c995685e0bf870000" }, - "69c2d835f13ee90580408e6a3283c8cca6a434a2": { - "balance": "656000000000000000000" + "0x69c2d835f13ee90580408e6a3283c8cca6a434a2": { + "balance": "0x238fd42c5cf0400000" }, - "a1e4380a3b1f749673e270229993ee55f35663b4": { - "balance": "2000000000000000000000" + "0xa1e4380a3b1f749673e270229993ee55f35663b4": { + "balance": "0x6c6b935b8bbd400000" }, - "c7675e5647b9d8daf4d3dff1e552f6b07154ac38": { - "balance": "180000000000000000000" + "0xc7675e5647b9d8daf4d3dff1e552f6b07154ac38": { + "balance": "0x9c2007651b2500000" }, - "a02c1e34064f0475f7fa831ccb25014c3aa31ca2": { - "balance": "60000000000000000000" + "0xa02c1e34064f0475f7fa831ccb25014c3aa31ca2": { + "balance": "0x340aad21b3b700000" }, - "517c75430de401c341032686112790f46d4d369e": { - "balance": "388000000000000000000" + "0x517c75430de401c341032686112790f46d4d369e": { + "balance": "0x150894e849b3900000" }, - "29681d9912ddd07eaabb88d05d90f766e862417d": { - "balance": "1000000000000000000000" + "0x29681d9912ddd07eaabb88d05d90f766e862417d": { + "balance": "0x3635c9adc5dea00000" }, - "544dda421dc1eb73bb24e3e56a248013b87c0f44": { - "balance": "1970000000000000000000" + "0x544dda421dc1eb73bb24e3e56a248013b87c0f44": { + "balance": "0x6acb3df27e1f880000" }, - "2ab97e8d59eee648ab6caf8696f89937143864d6": { - "balance": "3820000000000000000000" + "0x2ab97e8d59eee648ab6caf8696f89937143864d6": { + "balance": "0xcf152640c5c8300000" }, - "79c130c762b8765b19d2abc9a083ab8f3aad7940": { - "balance": "3940000000000000000000" + "0x79c130c762b8765b19d2abc9a083ab8f3aad7940": { + "balance": "0xd5967be4fc3f100000" }, - "f9650d6989f199ab1cc479636ded30f241021f65": { - "balance": "850000000000000000000" + "0xf9650d6989f199ab1cc479636ded30f241021f65": { + "balance": "0x2e141ea081ca080000" }, - "d1c96e70f05ae0e6cd6021b2083750a7717cde56": { - "balance": "500000000000000000000" + "0xd1c96e70f05ae0e6cd6021b2083750a7717cde56": { + "balance": "0x1b1ae4d6e2ef500000" }, - "88106c27d20b74b4b98ca62b232bd5c97411171f": { - "balance": "197000000000000000000" + "0x88106c27d20b74b4b98ca62b232bd5c97411171f": { + "balance": "0xaadec983fcff40000" }, - "37ab66083a4fa23848b886f9e66d79cdc150cc70": { - "balance": "88510000000000000000000" + "0x37ab66083a4fa23848b886f9e66d79cdc150cc70": { + "balance": "0x12be22ffb5ec00380000" }, - "8e6156336be2cdbe32140df08a2ba55fd0a58463": { - "balance": "74480000000000000000" + "0x8e6156336be2cdbe32140df08a2ba55fd0a58463": { + "balance": "0x4099e1d6357180000" }, - "2982d76a15f847dd41f1922af368fe678d0e681e": { - "balance": "100000000000000000000" + "0x2982d76a15f847dd41f1922af368fe678d0e681e": { + "balance": "0x56bc75e2d63100000" }, - "209e8e29d33beae8fb6baa783d133e1d9ec1bc0b": { - "balance": "835000000000000000000" + "0x209e8e29d33beae8fb6baa783d133e1d9ec1bc0b": { + "balance": "0x2d43f3ebfafb2c0000" }, - "b325674c01e3f7290d5226339fbeac67d221279f": { - "balance": "2800000000000000000000" + "0xb325674c01e3f7290d5226339fbeac67d221279f": { + "balance": "0x97c9ce4cf6d5c00000" }, - "f20c9a99b74759d782f25c1ceca802a27e0b436c": { - "balance": "1670000000000000000000" + "0xf20c9a99b74759d782f25c1ceca802a27e0b436c": { + "balance": "0x5a87e7d7f5f6580000" }, - "61bf84d5ab026f58c873f86ff0dfca82b55733ae": { - "balance": "2000000000000000000000" + "0x61bf84d5ab026f58c873f86ff0dfca82b55733ae": { + "balance": "0x6c6b935b8bbd400000" }, - "0734a0a81c9562f4d9e9e10a8503da15db46d76e": { - "balance": "18200000000000000000" + "0x0734a0a81c9562f4d9e9e10a8503da15db46d76e": { + "balance": "0xfc936392801c0000" }, - "0521bc3a9f8711fecb10f50797d71083e341eb9d": { - "balance": "20000000000000000000" + "0x0521bc3a9f8711fecb10f50797d71083e341eb9d": { + "balance": "0x1158e460913d00000" }, - "3301d9ca2f3bfe026279cd6819f79a293d98156e": { - "balance": "50000000000000000000000" + "0x3301d9ca2f3bfe026279cd6819f79a293d98156e": { + "balance": "0xa968163f0a57b400000" }, - "549d51af29f724c967f59423b85b2681e7b15136": { - "balance": "3760000000000000000000" + "0x549d51af29f724c967f59423b85b2681e7b15136": { + "balance": "0xcbd47b6eaa8cc00000" }, - "2053ac97548a0c4e8b80bc72590cd6a098fe7516": { - "balance": "187000000000000000000" + "0x2053ac97548a0c4e8b80bc72590cd6a098fe7516": { + "balance": "0xa2325753b460c0000" }, - "aa321fdbd449180db8ddd34f0fe906ec18ee0914": { - "balance": "685000000000000000000" + "0xaa321fdbd449180db8ddd34f0fe906ec18ee0914": { + "balance": "0x252248deb6e6940000" }, - "697f55536bf85ada51841f0287623a9f0ed09a17": { - "balance": "10000000000000000000000" + "0x697f55536bf85ada51841f0287623a9f0ed09a17": { + "balance": "0x21e19e0c9bab2400000" }, - "df57353aaff2aadb0a04f9014e8da7884e86589c": { - "balance": "152800000000000000000" + "0xdf57353aaff2aadb0a04f9014e8da7884e86589c": { + "balance": "0x84886a66e4fb00000" }, - "6807ddc88db489b033e6b2f9a81553571ab3c805": { - "balance": "29944000000000000000" + "0x6807ddc88db489b033e6b2f9a81553571ab3c805": { + "balance": "0x19f8e7559924c0000" }, - "90057af9aa66307ec9f033b29724d3b2f41eb6f9": { - "balance": "121930000000000000000000" + "0x90057af9aa66307ec9f033b29724d3b2f41eb6f9": { + "balance": "0x19d1d6aadb2c52e80000" }, - "3ff836b6f57b901b440c30e4dbd065cf37d3d48c": { - "balance": "200000000000000000000" + "0x3ff836b6f57b901b440c30e4dbd065cf37d3d48c": { + "balance": "0xad78ebc5ac6200000" }, - "91051764af6b808e4212c77e30a5572eaa317070": { - "balance": "1000000000000000000000" + "0x91051764af6b808e4212c77e30a5572eaa317070": { + "balance": "0x3635c9adc5dea00000" }, - "7faa30c31519b584e97250ed2a3cf3385ed5fd50": { - "balance": "2000000000000000000000" + "0x7faa30c31519b584e97250ed2a3cf3385ed5fd50": { + "balance": "0x6c6b935b8bbd400000" }, - "fb842ca2c5ef133917a236a0d4ac40690110b038": { - "balance": "306000000000000000000" + "0xfb842ca2c5ef133917a236a0d4ac40690110b038": { + "balance": "0x10969a62be15880000" }, - "aa167026d39ab7a85635944ed9edb2bfeba11850": { - "balance": "8298000000000000000000" + "0xaa167026d39ab7a85635944ed9edb2bfeba11850": { + "balance": "0x1c1d5e21b4fcf680000" }, - "57beea716cbd81700a73d67f9ff039529c2d9025": { - "balance": "200000000000000000000" + "0x57beea716cbd81700a73d67f9ff039529c2d9025": { + "balance": "0xad78ebc5ac6200000" }, - "654b7e808799a83d7287c67706f2abf49a496404": { - "balance": "1970000000000000000000" + "0x654b7e808799a83d7287c67706f2abf49a496404": { + "balance": "0x6acb3df27e1f880000" }, - "dde8f0c31b7415511dced1cd7d46323e4bd12232": { - "balance": "1610000000000000000000" + "0xdde8f0c31b7415511dced1cd7d46323e4bd12232": { + "balance": "0x57473d05dabae80000" }, - "8667fa1155fed732cfb8dca5a0d765ce0d0705ed": { - "balance": "81770000000000000000" + "0x8667fa1155fed732cfb8dca5a0d765ce0d0705ed": { + "balance": "0x46ec965c393b10000" }, - "905526568ac123afc0e84aa715124febe83dc87c": { - "balance": "17900000000000000000" + "0x905526568ac123afc0e84aa715124febe83dc87c": { + "balance": "0xf8699329677e0000" }, - "8e98766524b0cf2747c50dd43b9567594d9731de": { - "balance": "1997200000000000000000" + "0x8e98766524b0cf2747c50dd43b9567594d9731de": { + "balance": "0x6c44b7c26182280000" }, - "c6df2075ebd240d44869c2be6bdf82e63d4ef1f5": { - "balance": "20000000000000000000" + "0xc6df2075ebd240d44869c2be6bdf82e63d4ef1f5": { + "balance": "0x1158e460913d00000" }, - "2ff5cab12c0d957fd333f382eeb75107a64cb8e8": { - "balance": "10000000000000000000000" + "0x2ff5cab12c0d957fd333f382eeb75107a64cb8e8": { + "balance": "0x21e19e0c9bab2400000" }, - "3055efd26029e0d11b930df4f53b162c8c3fd2ce": { - "balance": "499938000000000000000" + "0x3055efd26029e0d11b930df4f53b162c8c3fd2ce": { + "balance": "0x1b1a089237073d0000" }, - "b2c53efa33fe4a3a1a80205c73ec3b1dbcad0602": { - "balance": "1918595000000000000000" + "0xb2c53efa33fe4a3a1a80205c73ec3b1dbcad0602": { + "balance": "0x6801dab35918938000" }, - "766b3759e8794e926dac473d913a8fb61ad0c2c9": { - "balance": "86500000000000000000" + "0x766b3759e8794e926dac473d913a8fb61ad0c2c9": { + "balance": "0x4b06dbbb40f4a0000" }, - "882aa798bf41df179f85520130f15ccdf59b5e58": { - "balance": "2000000000000000000000" + "0x882aa798bf41df179f85520130f15ccdf59b5e58": { + "balance": "0x6c6b935b8bbd400000" }, - "80b23d380b825c46e0393899a85556462da0e18c": { - "balance": "2000000000000000000000" + "0x80b23d380b825c46e0393899a85556462da0e18c": { + "balance": "0x6c6b935b8bbd400000" }, - "51f4663ab44ff79345f427a0f6f8a6c8a53ff234": { - "balance": "20000000000000000000000" + "0x51f4663ab44ff79345f427a0f6f8a6c8a53ff234": { + "balance": "0x43c33c1937564800000" }, - "8d5ef172bf77315ea64e85d0061986c794c6f519": { - "balance": "3940000000000000000000" + "0x8d5ef172bf77315ea64e85d0061986c794c6f519": { + "balance": "0xd5967be4fc3f100000" }, - "75ac547017134c04ae1e11d60e63ec04d18db4ef": { - "balance": "6000000000000000000000" + "0x75ac547017134c04ae1e11d60e63ec04d18db4ef": { + "balance": "0x14542ba12a337c00000" }, - "ce1b0cb46aaecfd79b880cad0f2dda8a8dedd0b1": { - "balance": "20000000000000000000" + "0xce1b0cb46aaecfd79b880cad0f2dda8a8dedd0b1": { + "balance": "0x1158e460913d00000" }, - "21408b4d7a2c0e6eca4143f2cacdbbccba121bd8": { - "balance": "20000000000000000000000" + "0x21408b4d7a2c0e6eca4143f2cacdbbccba121bd8": { + "balance": "0x43c33c1937564800000" }, - "9c526a140683edf1431cfaa128a935e2b614d88b": { - "balance": "111000000000000000000" + "0x9c526a140683edf1431cfaa128a935e2b614d88b": { + "balance": "0x6046f37e5945c0000" }, - "599728a78618d1a17b9e34e0fed8e857d5c40622": { - "balance": "14000000000000000000000" + "0x599728a78618d1a17b9e34e0fed8e857d5c40622": { + "balance": "0x2f6f10780d22cc00000" }, - "6ac4d4be2db0d99da3faaaf7525af282051d6a90": { - "balance": "80185000000000000000" + "0x6ac4d4be2db0d99da3faaaf7525af282051d6a90": { + "balance": "0x458ca58a962b28000" }, - "785c8ea774d73044a734fa790a1b1e743e77ed7c": { - "balance": "238750000000000000000" + "0x785c8ea774d73044a734fa790a1b1e743e77ed7c": { + "balance": "0xcf152640c5c830000" }, - "ff2726294148b86c78a9372497e459898ed3fee3": { - "balance": "1970000000000000000000" + "0xff2726294148b86c78a9372497e459898ed3fee3": { + "balance": "0x6acb3df27e1f880000" }, - "68a86c402388fddc59028fec7021e98cbf830eac": { - "balance": "19100000000000000000" + "0x68a86c402388fddc59028fec7021e98cbf830eac": { + "balance": "0x10910d4cdc9f60000" }, - "6121af398a5b2da69f65c6381aec88ce9cc6441f": { - "balance": "640000000000000000000" + "0x6121af398a5b2da69f65c6381aec88ce9cc6441f": { + "balance": "0x22b1c8c1227a000000" }, - "5a6686b0f17e07edfc59b759c77d5bef164d3879": { - "balance": "1490000000000000000000" + "0x5a6686b0f17e07edfc59b759c77d5bef164d3879": { + "balance": "0x50c5e761a444080000" }, - "a2d38de1c73906f6a7ca6efeb97cf6f69cc421be": { - "balance": "1000000000000000000000" + "0xa2d38de1c73906f6a7ca6efeb97cf6f69cc421be": { + "balance": "0x3635c9adc5dea00000" }, - "ae3f98a443efe00f3e711d525d9894dc9a61157b": { - "balance": "295500000000000000000" + "0xae3f98a443efe00f3e711d525d9894dc9a61157b": { + "balance": "0x1004e2e45fb7ee0000" }, - "5f1c8a04c90d735b8a152909aeae636fb0ce1665": { - "balance": "6999974000000000000000" + "0x5f1c8a04c90d735b8a152909aeae636fb0ce1665": { + "balance": "0x17b7827618c5a370000" }, - "d687cec0059087fdc713d4d2d65e77daefedc15f": { - "balance": "60000000000000000000" + "0xd687cec0059087fdc713d4d2d65e77daefedc15f": { + "balance": "0x340aad21b3b700000" }, - "845203750f7148a9aa262921e86d43bf641974fd": { - "balance": "100000000000000000000" + "0x845203750f7148a9aa262921e86d43bf641974fd": { + "balance": "0x56bc75e2d63100000" }, - "64464a6805b462412a901d2db8174b06c22deea6": { - "balance": "475600000000000000000" + "0x64464a6805b462412a901d2db8174b06c22deea6": { + "balance": "0x19c846a029c7c80000" }, - "053471cd9a41925b3904a5a8ffca3659e034be23": { - "balance": "199600000000000000000" + "0x053471cd9a41925b3904a5a8ffca3659e034be23": { + "balance": "0xad201a6794ff80000" }, - "911ff233e1a211c0172c92b46cf997030582c83a": { - "balance": "1970000000000000000000" + "0x911ff233e1a211c0172c92b46cf997030582c83a": { + "balance": "0x6acb3df27e1f880000" }, - "d930b27a78876485d0f48b70dd5336549679ca8f": { - "balance": "40000000000000000000" + "0xd930b27a78876485d0f48b70dd5336549679ca8f": { + "balance": "0x22b1c8c1227a00000" }, - "6ba9b21b35106be159d1c1c2657ac56cd29ffd44": { - "balance": "4480000000000000000000" + "0x6ba9b21b35106be159d1c1c2657ac56cd29ffd44": { + "balance": "0xf2dc7d47f156000000" }, - "ebac2b4408ef5431a13b8508e86250982114e145": { - "balance": "4000000000000000000000" + "0xebac2b4408ef5431a13b8508e86250982114e145": { + "balance": "0xd8d726b7177a800000" }, - "931df34d1225bcd4224e63680d5c4c09bce735a6": { - "balance": "68000000000000000000" + "0x931df34d1225bcd4224e63680d5c4c09bce735a6": { + "balance": "0x3afb087b876900000" }, - "23eb6fd85671a9063ab7678ebe265a20f61a02b3": { - "balance": "2000000000000000000000" + "0x23eb6fd85671a9063ab7678ebe265a20f61a02b3": { + "balance": "0x6c6b935b8bbd400000" }, - "b32af3d3e8d075344926546f2e32887bf93b16bd": { - "balance": "200000000000000000000" + "0xb32af3d3e8d075344926546f2e32887bf93b16bd": { + "balance": "0xad78ebc5ac6200000" }, - "8261fa230c901d43ff579f4780d399f31e6076bc": { - "balance": "2000000000000000000000" + "0x8261fa230c901d43ff579f4780d399f31e6076bc": { + "balance": "0x6c6b935b8bbd400000" }, - "84a74ceecff65cb93b2f949d773ef1ad7fb4a245": { - "balance": "92998000000000000000" + "0x84a74ceecff65cb93b2f949d773ef1ad7fb4a245": { + "balance": "0x50a9b444685c70000" }, - "da982e9643ffece723075a40fe776e5ace04b29b": { - "balance": "160884000000000000000" + "0xda982e9643ffece723075a40fe776e5ace04b29b": { + "balance": "0x8b8b6c9999bf20000" }, - "ba70e8b4759c0c3c82cc00ac4e9a94dd5bafb2b8": { - "balance": "890342000000000000000" + "0xba70e8b4759c0c3c82cc00ac4e9a94dd5bafb2b8": { + "balance": "0x3043fa33c412d70000" }, - "82f2e991fd324c5f5d17768e9f61335db6319d6c": { - "balance": "500000000000000000000" + "0x82f2e991fd324c5f5d17768e9f61335db6319d6c": { + "balance": "0x1b1ae4d6e2ef500000" }, - "3e84b35c5b2265507061d30b6f12da033fe6f8b9": { - "balance": "1790000000000000000000" + "0x3e84b35c5b2265507061d30b6f12da033fe6f8b9": { + "balance": "0x61093d7c2c6d380000" }, - "2895e80999d406ad592e2b262737d35f7db4b699": { - "balance": "1940000000000000000000" + "0x2895e80999d406ad592e2b262737d35f7db4b699": { + "balance": "0x692ae8897081d00000" }, - "65f534346d2ffb787fa9cf185d745ba42986bd6e": { - "balance": "500000000000000000000" + "0x65f534346d2ffb787fa9cf185d745ba42986bd6e": { + "balance": "0x1b1ae4d6e2ef500000" }, - "c7368b9709a5c1b51c0adf187a65df14e12b7dba": { - "balance": "9489681000000000000000" + "0xc7368b9709a5c1b51c0adf187a65df14e12b7dba": { + "balance": "0x2026fc77f03e5ae8000" }, - "ba176dbe3249e345cd4fa967c0ed13b24c47e586": { - "balance": "399990000000000000000" + "0xba176dbe3249e345cd4fa967c0ed13b24c47e586": { + "balance": "0x15aef9f1c31c7f0000" }, - "cff6a6fe3e9a922a12f21faa038156918c4fcb9c": { - "balance": "78800000000000000000" + "0xcff6a6fe3e9a922a12f21faa038156918c4fcb9c": { + "balance": "0x44591d67fecc80000" }, - "bcbd31252ec288f91e298cd812c92160e738331a": { - "balance": "1975802000000000000000" + "0xbcbd31252ec288f91e298cd812c92160e738331a": { + "balance": "0x6b1bc2cac09a590000" }, - "5543dd6d169eec8a213bbf7a8af9ffd15d4ff759": { - "balance": "18200000000000000000" + "0x5543dd6d169eec8a213bbf7a8af9ffd15d4ff759": { + "balance": "0xfc936392801c0000" }, - "b65bd780c7434115162027565223f44e5498ff8c": { - "balance": "19999800000000000000000" + "0xb65bd780c7434115162027565223f44e5498ff8c": { + "balance": "0x43c30fb0884a96c0000" }, - "4cadf573ce4ceec78b8e1b21b0ed78eb113b2c0e": { - "balance": "2000000000000000000000" + "0x4cadf573ce4ceec78b8e1b21b0ed78eb113b2c0e": { + "balance": "0x6c6b935b8bbd400000" }, - "04aafc8ae5ce6f4903c89d7fac9cb19512224777": { - "balance": "500000000000000000000" + "0x04aafc8ae5ce6f4903c89d7fac9cb19512224777": { + "balance": "0x1b1ae4d6e2ef500000" }, - "fdc4d4765a942f5bf96931a9e8cc7ab8b757ff4c": { - "balance": "87000000000000000000000" + "0xfdc4d4765a942f5bf96931a9e8cc7ab8b757ff4c": { + "balance": "0x126c478a0e3ea8600000" }, - "38c7851f5ffd4cee98df30f3b25597af8a6ca263": { - "balance": "2631920000000000000000" + "0x38c7851f5ffd4cee98df30f3b25597af8a6ca263": { + "balance": "0x8ead3a2f7d7e180000" }, - "0e320219838e859b2f9f18b72e3d4073ca50b37d": { - "balance": "2000000000000000000000" + "0x0e320219838e859b2f9f18b72e3d4073ca50b37d": { + "balance": "0x6c6b935b8bbd400000" }, - "bbbf39b1b67995a42241504f9703d2a14a515696": { - "balance": "1580000000000000000000" + "0xbbbf39b1b67995a42241504f9703d2a14a515696": { + "balance": "0x55a6e79ccd1d300000" }, - "5b800bfd1b3ed4a57d875aed26d42f1a7708d72a": { - "balance": "6392000000000000000000" + "0x5b800bfd1b3ed4a57d875aed26d42f1a7708d72a": { + "balance": "0x15a82d1d5bb88e00000" }, - "5b85e60e2af0544f2f01c64e2032900ebd38a3c7": { - "balance": "2000000000000000000000" + "0x5b85e60e2af0544f2f01c64e2032900ebd38a3c7": { + "balance": "0x6c6b935b8bbd400000" }, - "c9ac01c3fb0929033f0ccc7e1acfeaaba7945d47": { - "balance": "12459235000000000000000" + "0xc9ac01c3fb0929033f0ccc7e1acfeaaba7945d47": { + "balance": "0x2a36a9e9ca4d2038000" }, - "f355d3ec0cfb907d8dbb1bf3464e458128190bac": { - "balance": "4925600000000000000000" + "0xf355d3ec0cfb907d8dbb1bf3464e458128190bac": { + "balance": "0x10b046e7f0d80100000" }, - "69c08d744754de709ce96e15ae0d1d395b3a2263": { - "balance": "1000000000000000000000" + "0x69c08d744754de709ce96e15ae0d1d395b3a2263": { + "balance": "0x3635c9adc5dea00000" }, - "cef77451dfa2c643e00b156d6c6ff84e2373eb66": { - "balance": "188000000000000000000" + "0xcef77451dfa2c643e00b156d6c6ff84e2373eb66": { + "balance": "0xa31062beeed700000" }, - "f3034367f87d24d3077fa9a2e38a8b0ccb1104ef": { - "balance": "1000000000000000000000" + "0xf3034367f87d24d3077fa9a2e38a8b0ccb1104ef": { + "balance": "0x3635c9adc5dea00000" }, - "73473e72115110d0c3f11708f86e77be2bb0983c": { - "balance": "20000000000000000000" + "0x73473e72115110d0c3f11708f86e77be2bb0983c": { + "balance": "0x1158e460913d00000" }, - "761e6caec189c230a162ec006530193e67cf9d19": { - "balance": "2000000000000000000000" + "0x761e6caec189c230a162ec006530193e67cf9d19": { + "balance": "0x6c6b935b8bbd400000" }, - "e9caf827be9d607915b365c83f0d3b7ea8c79b50": { - "balance": "3000000000000000000000" + "0xe9caf827be9d607915b365c83f0d3b7ea8c79b50": { + "balance": "0xa2a15d09519be00000" }, - "eda4b2fa59d684b27a810df8978a73df308a63c2": { - "balance": "4000000000000000000000" + "0xeda4b2fa59d684b27a810df8978a73df308a63c2": { + "balance": "0xd8d726b7177a800000" }, - "065ff575fd9c16d3cb6fd68ffc8f483fc32ec835": { - "balance": "200000000000000000000" + "0x065ff575fd9c16d3cb6fd68ffc8f483fc32ec835": { + "balance": "0xad78ebc5ac6200000" }, - "a72ee666c4b35e82a506808b443cebd5c632c7dd": { - "balance": "800000000000000000000" + "0xa72ee666c4b35e82a506808b443cebd5c632c7dd": { + "balance": "0x2b5e3af16b18800000" }, - "5b30608c678e1ac464a8994c3b33e5cdf3497112": { - "balance": "400000000000000000000" + "0x5b30608c678e1ac464a8994c3b33e5cdf3497112": { + "balance": "0x15af1d78b58c400000" }, - "b0c7ce4c0dc3c2bbb99cc1857b8a455f611711ce": { - "balance": "4000000000000000000000" + "0xb0c7ce4c0dc3c2bbb99cc1857b8a455f611711ce": { + "balance": "0xd8d726b7177a800000" }, - "d7274d50804d9c77da93fa480156efe57ba501de": { - "balance": "1940000000000000000000" + "0xd7274d50804d9c77da93fa480156efe57ba501de": { + "balance": "0x692ae8897081d00000" }, - "a609c26dd350c235e44b2b9c1dddccd0a9d9f837": { - "balance": "1000000000000000000000" + "0xa609c26dd350c235e44b2b9c1dddccd0a9d9f837": { + "balance": "0x3635c9adc5dea00000" }, - "bddfa34d0ebf1b04af53b99b82494a9e3d8aa100": { - "balance": "12000000000000000000000" + "0xbddfa34d0ebf1b04af53b99b82494a9e3d8aa100": { + "balance": "0x28a857425466f800000" }, - "fd40242bb34a70855ef0fd90f3802dec2136b327": { - "balance": "1930600000000000000000" + "0xfd40242bb34a70855ef0fd90f3802dec2136b327": { + "balance": "0x68a875073e29240000" }, - "58aed6674affd9f64233272a578dd9386b99c263": { - "balance": "3400000000000000000000" + "0x58aed6674affd9f64233272a578dd9386b99c263": { + "balance": "0xb8507a820728200000" }, - "24434a3e32e54ecf272fe3470b5f6f512f675520": { - "balance": "5910000000000000000000" + "0x24434a3e32e54ecf272fe3470b5f6f512f675520": { + "balance": "0x14061b9d77a5e980000" }, - "a379a5070c503d2fac89b8b3afa080fd45ed4bec": { - "balance": "19700000000000000000000" + "0xa379a5070c503d2fac89b8b3afa080fd45ed4bec": { + "balance": "0x42bf06b78ed3b500000" }, - "37e169a93808d8035698f815c7235613c1e659f2": { - "balance": "1000000000000000000000" + "0x37e169a93808d8035698f815c7235613c1e659f2": { + "balance": "0x3635c9adc5dea00000" }, - "849b116f596301c5d8bb62e0e97a8248126e39f3": { - "balance": "300000000000000000000" + "0x849b116f596301c5d8bb62e0e97a8248126e39f3": { + "balance": "0x1043561a8829300000" }, - "fe7011b698bf3371132d7445b19eb5b094356aee": { - "balance": "2000000000000000000000" + "0xfe7011b698bf3371132d7445b19eb5b094356aee": { + "balance": "0x6c6b935b8bbd400000" }, - "f16de1891d8196461395f9b136265b3b9546f6ef": { - "balance": "31313000000000000000" + "0xf16de1891d8196461395f9b136265b3b9546f6ef": { + "balance": "0x1b28e1f98bbce8000" }, - "6c6564e5c9c24eaaa744c9c7c968c9e2c9f1fbae": { - "balance": "1357800000000000000000" + "0x6c6564e5c9c24eaaa744c9c7c968c9e2c9f1fbae": { + "balance": "0x499b42a21139640000" }, - "8bb0212f3295e029cab1d961b04133a1809e7b91": { - "balance": "2000000000000000000000" + "0x8bb0212f3295e029cab1d961b04133a1809e7b91": { + "balance": "0x6c6b935b8bbd400000" }, - "408a69a40715e1b313e1354e600800a1e6dc02a5": { - "balance": "35144000000000000000" + "0x408a69a40715e1b313e1354e600800a1e6dc02a5": { + "balance": "0x1e7b891cc92540000" }, - "ddf0cce1fe996d917635f00712f4052091dff9ea": { - "balance": "2000000000000000000000" + "0xddf0cce1fe996d917635f00712f4052091dff9ea": { + "balance": "0x6c6b935b8bbd400000" }, - "50fef296955588caae74c62ec32a23a454e09ab8": { - "balance": "1201200000000000000000" + "0x50fef296955588caae74c62ec32a23a454e09ab8": { + "balance": "0x411dffabc507380000" }, - "d913f0771949753c4726acaa2bd3619c5c20ff77": { - "balance": "3000000000000000000000" + "0xd913f0771949753c4726acaa2bd3619c5c20ff77": { + "balance": "0xa2a15d09519be00000" }, - "9d6ecfa03af2c6e144b7c4692a86951e902e9e1f": { - "balance": "3000310000000000000000" + "0x9d6ecfa03af2c6e144b7c4692a86951e902e9e1f": { + "balance": "0xa2a5aa60ad243f0000" }, - "ecbe5e1c9ad2b1dccf0a305fc9522f4669dd3ae7": { - "balance": "5000000000000000000000" + "0xecbe5e1c9ad2b1dccf0a305fc9522f4669dd3ae7": { + "balance": "0x10f0cf064dd59200000" }, - "33e9b71823952e1f66958c278fc28b1196a6c5a4": { - "balance": "100000000000000000000" + "0x33e9b71823952e1f66958c278fc28b1196a6c5a4": { + "balance": "0x56bc75e2d63100000" }, - "9de20bc37e7f48a80ffd7ad84ffbf1a1abe1738c": { - "balance": "200000000000000000000" + "0x9de20bc37e7f48a80ffd7ad84ffbf1a1abe1738c": { + "balance": "0xad78ebc5ac6200000" }, - "16f313cf8ad000914a0a176dc6a4342b79ec2538": { - "balance": "2000000000000000000000" + "0x16f313cf8ad000914a0a176dc6a4342b79ec2538": { + "balance": "0x6c6b935b8bbd400000" }, - "991ac7ca7097115f26205eee0ef7d41eb4e311ae": { - "balance": "20000000000000000000" + "0x991ac7ca7097115f26205eee0ef7d41eb4e311ae": { + "balance": "0x1158e460913d00000" }, - "ddfafdbc7c90f1320e54b98f374617fbd01d109f": { - "balance": "13370000000000000000" + "0xddfafdbc7c90f1320e54b98f374617fbd01d109f": { + "balance": "0xb98bc829a6f90000" }, - "26b11d066588ce74a572a85a6328739212aa8b40": { - "balance": "2000000000000000000000" + "0x26b11d066588ce74a572a85a6328739212aa8b40": { + "balance": "0x6c6b935b8bbd400000" }, - "ef2c34bb487d3762c3cca782ccdd7a8fbb0a9931": { - "balance": "180000000000000000000" + "0xef2c34bb487d3762c3cca782ccdd7a8fbb0a9931": { + "balance": "0x9c2007651b2500000" }, - "a9be88ad1e518b0bbb024ab1d8f0e73f790e0c76": { - "balance": "2800000000000000000000" + "0xa9be88ad1e518b0bbb024ab1d8f0e73f790e0c76": { + "balance": "0x97c9ce4cf6d5c00000" }, - "4a7494cce44855cc80582842be958a0d1c0072ee": { - "balance": "2400000000000000000000" + "0x4a7494cce44855cc80582842be958a0d1c0072ee": { + "balance": "0x821ab0d44149800000" }, - "23569542c97d566018c907acfcf391d14067e87e": { - "balance": "2000000000000000000000" + "0x23569542c97d566018c907acfcf391d14067e87e": { + "balance": "0x6c6b935b8bbd400000" }, - "d252960b0bf6b2848fdead80136db5f507f8be02": { - "balance": "2000000000000000000000" + "0xd252960b0bf6b2848fdead80136db5f507f8be02": { + "balance": "0x6c6b935b8bbd400000" }, - "2c0f5b9df43625798e7e03c1a5fd6a6d091af82b": { - "balance": "31200000000000000000" + "0x2c0f5b9df43625798e7e03c1a5fd6a6d091af82b": { + "balance": "0x1b0fcaab200300000" }, - "a7c9d388ebd873e66b1713448397d0f37f8bd3a8": { - "balance": "5000000000000000000000" + "0xa7c9d388ebd873e66b1713448397d0f37f8bd3a8": { + "balance": "0x10f0cf064dd59200000" }, - "3259bd2fddfbbc6fbad3b6e874f0bbc02cda18b5": { - "balance": "11886645000000000000000" + "0x3259bd2fddfbbc6fbad3b6e874f0bbc02cda18b5": { + "balance": "0x2846056495b0d188000" }, - "f287ff52f461117adb3e1daa71932d1493c65f2e": { - "balance": "3640000000000000000000" + "0xf287ff52f461117adb3e1daa71932d1493c65f2e": { + "balance": "0xc55325ca7415e00000" }, - "c852428d2b586497acd30c56aa13fb5582f84402": { - "balance": "945600000000000000000" + "0xc852428d2b586497acd30c56aa13fb5582f84402": { + "balance": "0x3342d60dff19600000" }, - "296f00de1dc3bb01d47a8ccd1e5d1dd9a1eb7791": { - "balance": "1000000000000000000000" + "0x296f00de1dc3bb01d47a8ccd1e5d1dd9a1eb7791": { + "balance": "0x3635c9adc5dea00000" }, - "817493cd9bc623702a24a56f9f82e3fd48f3cd31": { - "balance": "2920000000000000000000" + "0x817493cd9bc623702a24a56f9f82e3fd48f3cd31": { + "balance": "0x9e4b23f12d4ca00000" }, - "7adfedb06d91f3cc7390450b85550270883c7bb7": { - "balance": "322312000000000000000" + "0x7adfedb06d91f3cc7390450b85550270883c7bb7": { + "balance": "0x1178fa40515db40000" }, - "8d544c32c07fd0842c761d53a897d6c950bb7599": { - "balance": "200000000000000000000" + "0x8d544c32c07fd0842c761d53a897d6c950bb7599": { + "balance": "0xad78ebc5ac6200000" }, - "86297d730fe0f7a9ee24e08fb1087b31adb306a7": { - "balance": "2000000000000000000000" + "0x86297d730fe0f7a9ee24e08fb1087b31adb306a7": { + "balance": "0x6c6b935b8bbd400000" }, - "f64fe0939a8d1eea2a0ecd9a9730fd7958e33109": { - "balance": "20600000000000000000" + "0xf64fe0939a8d1eea2a0ecd9a9730fd7958e33109": { + "balance": "0x11de1e6db450c0000" }, - "b06eab09a610c6a53d56a946b2c43487ac1d5b2d": { - "balance": "1000000000000000000000" + "0xb06eab09a610c6a53d56a946b2c43487ac1d5b2d": { + "balance": "0x3635c9adc5dea00000" }, - "bae9b82f7299631408659dd74e891cb8f3860fe5": { - "balance": "1970000000000000000000" + "0xbae9b82f7299631408659dd74e891cb8f3860fe5": { + "balance": "0x6acb3df27e1f880000" }, - "0eda80f4ed074aea697aeddf283b63dbca3dc4da": { - "balance": "2000000000000000000000" + "0x0eda80f4ed074aea697aeddf283b63dbca3dc4da": { + "balance": "0x6c6b935b8bbd400000" }, - "ea686c5057093c171c66db99e01b0ececb308683": { - "balance": "384907000000000000000" + "0xea686c5057093c171c66db99e01b0ececb308683": { + "balance": "0x14dda85d2ce1478000" }, - "425725c0f08f0811f5f006eec91c5c5c126b12ae": { - "balance": "150000000000000000000" + "0x425725c0f08f0811f5f006eec91c5c5c126b12ae": { + "balance": "0x821ab0d4414980000" }, - "b18e67a5050a1dc9fb190919a33da838ef445014": { - "balance": "20000000000000000000" + "0xb18e67a5050a1dc9fb190919a33da838ef445014": { + "balance": "0x1158e460913d00000" }, - "8dd484ff8a307364eb66c525a571aac701c5c318": { - "balance": "4000000000000000000000" + "0x8dd484ff8a307364eb66c525a571aac701c5c318": { + "balance": "0xd8d726b7177a800000" }, - "6671b182c9f741a0cd3c356c73c23126d4f9e6f4": { - "balance": "200000000000000000000" + "0x6671b182c9f741a0cd3c356c73c23126d4f9e6f4": { + "balance": "0xad78ebc5ac6200000" }, - "ba0249e01d945bef93ee5ec61925e03c5ca509fd": { - "balance": "4000000000000000000000" + "0xba0249e01d945bef93ee5ec61925e03c5ca509fd": { + "balance": "0xd8d726b7177a800000" }, - "b2968f7d35f208871631c6687b3f3daeabc6616c": { - "balance": "156060000000000000000" + "0xb2968f7d35f208871631c6687b3f3daeabc6616c": { + "balance": "0x875c47f289f760000" }, - "a6f62b8a3d7f11220701ab9ffffcb327959a2785": { - "balance": "506000000000000000000" + "0xa6f62b8a3d7f11220701ab9ffffcb327959a2785": { + "balance": "0x1b6e291f18dba80000" }, - "c885a18aabf4541b7b7b7ecd30f6fae6869d9569": { - "balance": "2000000000000000000000" + "0xc885a18aabf4541b7b7b7ecd30f6fae6869d9569": { + "balance": "0x6c6b935b8bbd400000" }, - "33fb577a4d214fe010d32cca7c3eeda63f87ceef": { - "balance": "1000000000000000000000" + "0x33fb577a4d214fe010d32cca7c3eeda63f87ceef": { + "balance": "0x3635c9adc5dea00000" }, - "be86d0b0438419ceb1a038319237ba5206d72e46": { - "balance": "999942000000000000000" + "0xbe86d0b0438419ceb1a038319237ba5206d72e46": { + "balance": "0x3634fb9f1489a70000" }, - "466292f0e80d43a78774277590a9eb45961214f4": { - "balance": "970000000000000000000" + "0x466292f0e80d43a78774277590a9eb45961214f4": { + "balance": "0x34957444b840e80000" }, - "b33c0323fbf9c26c1d8ac44ef74391d0804696da": { - "balance": "20000000000000000000" + "0xb33c0323fbf9c26c1d8ac44ef74391d0804696da": { + "balance": "0x1158e460913d00000" }, - "f7bc4c44910d5aedd66ed2355538a6b193c361ec": { - "balance": "96980000000000000000" + "0xf7bc4c44910d5aedd66ed2355538a6b193c361ec": { + "balance": "0x541de2c2d8d620000" }, - "d0f04f52109aebec9a7b1e9332761e9fe2b97bb5": { - "balance": "4000000000000000000000" + "0xd0f04f52109aebec9a7b1e9332761e9fe2b97bb5": { + "balance": "0xd8d726b7177a800000" }, - "cb4a914d2bb029f32e5fef5c234c4fec2d2dd577": { - "balance": "1800000000000000000000" + "0xcb4a914d2bb029f32e5fef5c234c4fec2d2dd577": { + "balance": "0x6194049f30f7200000" }, - "2e619f57abc1e987aa936ae3a2264962e7eb2d9a": { - "balance": "756000000000000000000" + "0x2e619f57abc1e987aa936ae3a2264962e7eb2d9a": { + "balance": "0x28fb9b8a8a53500000" }, - "166bf6dab22d841b486c38e7ba6ab33a1487ed8c": { - "balance": "20000000000000000000000" + "0x166bf6dab22d841b486c38e7ba6ab33a1487ed8c": { + "balance": "0x43c33c1937564800000" }, - "c3a046e3d2b2bf681488826e32d9c061518cfe8c": { - "balance": "2600000000000000000000" + "0xc3a046e3d2b2bf681488826e32d9c061518cfe8c": { + "balance": "0x8cf23f909c0fa00000" }, - "d082275f745a2cac0276fbdb02d4b2a3ab1711fe": { - "balance": "30000000000000000000" + "0xd082275f745a2cac0276fbdb02d4b2a3ab1711fe": { + "balance": "0x1a055690d9db80000" }, - "a701df79f594901afe1444485e6b20c3bda2b9b3": { - "balance": "1000000000000000000000" + "0xa701df79f594901afe1444485e6b20c3bda2b9b3": { + "balance": "0x3635c9adc5dea00000" }, - "dec3eec2640a752c466e2b7e7ee685afe9ac41f4": { - "balance": "1324245000000000000000" + "0xdec3eec2640a752c466e2b7e7ee685afe9ac41f4": { + "balance": "0x47c99753596b288000" }, - "8134dd1c9df0d6c8a5812426bb55c761ca831f08": { - "balance": "122360000000000000000" + "0x8134dd1c9df0d6c8a5812426bb55c761ca831f08": { + "balance": "0x6a2160bb57ccc0000" }, - "bfc57aa666fae28e9f107a49cb5089a4e22151dd": { - "balance": "1000000000000000000000" + "0xbfc57aa666fae28e9f107a49cb5089a4e22151dd": { + "balance": "0x3635c9adc5dea00000" }, - "c3c2297329a6fd99117e54fc6af379b4d556547e": { - "balance": "6000000000000000000000" + "0xc3c2297329a6fd99117e54fc6af379b4d556547e": { + "balance": "0x14542ba12a337c00000" }, - "40585200683a403901372912a89834aadcb55fdb": { - "balance": "2000000000000000000000" + "0x40585200683a403901372912a89834aadcb55fdb": { + "balance": "0x6c6b935b8bbd400000" }, - "cd49bf185e70d04507999f92a4de4455312827d0": { - "balance": "1000000000000000000000" + "0xcd49bf185e70d04507999f92a4de4455312827d0": { + "balance": "0x3635c9adc5dea00000" }, - "9c6bc9a46b03ae5404f043dfcf21883e4110cc33": { - "balance": "200000000000000000000" + "0x9c6bc9a46b03ae5404f043dfcf21883e4110cc33": { + "balance": "0xad78ebc5ac6200000" }, - "1f49b86d0d3945590698a6aaf1673c37755ca80d": { - "balance": "700000000000000000000" + "0x1f49b86d0d3945590698a6aaf1673c37755ca80d": { + "balance": "0x25f273933db5700000" }, - "efeb1997aad277cc33430e6111ed0943594048b8": { - "balance": "2000000000000000000000" + "0xefeb1997aad277cc33430e6111ed0943594048b8": { + "balance": "0x6c6b935b8bbd400000" }, - "7c0883054c2d02bc7a852b1f86c42777d0d5c856": { - "balance": "500000000000000000000" + "0x7c0883054c2d02bc7a852b1f86c42777d0d5c856": { + "balance": "0x1b1ae4d6e2ef500000" }, - "ff49a775814ec00051a795a875de24592ea400d4": { - "balance": "200000000000000000000000" + "0xff49a775814ec00051a795a875de24592ea400d4": { + "balance": "0x2a5a058fc295ed000000" }, - "f039683d7b3d225bc7d8dfadef63163441be41e2": { - "balance": "34380000000000000000" + "0xf039683d7b3d225bc7d8dfadef63163441be41e2": { + "balance": "0x1dd1e4bd8d1ee0000" }, - "a3ba0d3a3617b1e31b4e422ce269e873828d5d69": { - "balance": "850000000000000000000" + "0xa3ba0d3a3617b1e31b4e422ce269e873828d5d69": { + "balance": "0x2e141ea081ca080000" }, - "d116f3dcd5db744bd008887687aa0ec9fd7292aa": { - "balance": "1000000000000000000000" + "0xd116f3dcd5db744bd008887687aa0ec9fd7292aa": { + "balance": "0x3635c9adc5dea00000" }, - "5719f49b720da68856f4b9e708f25645bdbc4b41": { - "balance": "640000000000000000000" + "0x5719f49b720da68856f4b9e708f25645bdbc4b41": { + "balance": "0x22b1c8c1227a000000" }, - "870796abc0db84af82da52a0ed68734de7e636f5": { - "balance": "300000000000000000000" + "0x870796abc0db84af82da52a0ed68734de7e636f5": { + "balance": "0x1043561a8829300000" }, - "68b6854788a7c6496cdbf5f84b9ec5ef392b78bb": { - "balance": "19700000000000000000000" + "0x68b6854788a7c6496cdbf5f84b9ec5ef392b78bb": { + "balance": "0x42bf06b78ed3b500000" }, - "8c2fbeee8eacc5c5d77c16abd462ee9c8145f34b": { - "balance": "1940000000000000000000" + "0x8c2fbeee8eacc5c5d77c16abd462ee9c8145f34b": { + "balance": "0x692ae8897081d00000" }, - "421684baa9c0b4b5f55338e6f6e7c8e146d41cb7": { - "balance": "1500000000000000000000" + "0x421684baa9c0b4b5f55338e6f6e7c8e146d41cb7": { + "balance": "0x5150ae84a8cdf00000" }, - "dd26b429fd43d84ec179825324bad5bfb916b360": { - "balance": "5142000000000000000000" + "0xdd26b429fd43d84ec179825324bad5bfb916b360": { + "balance": "0x116bf95bc8432980000" }, - "3821862493242c0aeb84b90de05d250c1e50c074": { - "balance": "322200000000000000000" + "0x3821862493242c0aeb84b90de05d250c1e50c074": { + "balance": "0x11776c58e946dc0000" }, - "68a7425fe09eb28cf86eb1793e41b211e57bd68d": { - "balance": "668500000000000000000" + "0x68a7425fe09eb28cf86eb1793e41b211e57bd68d": { + "balance": "0x243d4d18229ca20000" }, - "da875e4e2f3cabe4f37e0eaed7d1f6dcc6ffef43": { - "balance": "2000000000000000000000" + "0xda875e4e2f3cabe4f37e0eaed7d1f6dcc6ffef43": { + "balance": "0x6c6b935b8bbd400000" }, - "c2663f8145dbfec6c646fc5c49961345de1c9f11": { - "balance": "690000000000000000000" + "0xc2663f8145dbfec6c646fc5c49961345de1c9f11": { + "balance": "0x2567ac70392b880000" }, - "e89c22f1a4e1d4746ecfaa59ed386fee12d51e37": { - "balance": "44932000000000000000" + "0xe89c22f1a4e1d4746ecfaa59ed386fee12d51e37": { + "balance": "0x26f8e87f0a7da0000" }, - "eff86b5123bcdc17ed4ce8e05b7e12e51393a1f7": { - "balance": "500000000000000000000" + "0xeff86b5123bcdc17ed4ce8e05b7e12e51393a1f7": { + "balance": "0x1b1ae4d6e2ef500000" }, - "6c3d18704126aa99ee3342ce60f5d4c85f1867cd": { - "balance": "50000000000000000000" + "0x6c3d18704126aa99ee3342ce60f5d4c85f1867cd": { + "balance": "0x2b5e3af16b1880000" }, - "b8d531a964bcea13829620c0ced72422dadb4cca": { - "balance": "169990000000000000000" + "0xb8d531a964bcea13829620c0ced72422dadb4cca": { + "balance": "0x93715cc5ab8a70000" }, - "7c29d47d57a733f56b9b217063b513dc3b315923": { - "balance": "4000000000000000000000" + "0x7c29d47d57a733f56b9b217063b513dc3b315923": { + "balance": "0xd8d726b7177a800000" }, - "bc1e80c181616342ebb3fb3992072f1b28b802c6": { - "balance": "4000000000000000000000" + "0xbc1e80c181616342ebb3fb3992072f1b28b802c6": { + "balance": "0xd8d726b7177a800000" }, - "31313ffd635bf2f3324841a88c07ed146144ceeb": { - "balance": "1970000000000000000000" + "0x31313ffd635bf2f3324841a88c07ed146144ceeb": { + "balance": "0x6acb3df27e1f880000" }, - "cc4feb72df98ff35a138e01761d1203f9b7edf0a": { - "balance": "7000000000000000000000" + "0xcc4feb72df98ff35a138e01761d1203f9b7edf0a": { + "balance": "0x17b7883c06916600000" }, - "741693c30376508513082020cc2b63e9fa92131b": { - "balance": "1200000000000000000000" + "0x741693c30376508513082020cc2b63e9fa92131b": { + "balance": "0x410d586a20a4c00000" }, - "aa3135cb54f102cbefe09e96103a1a796718ff54": { - "balance": "57800000000000000000" + "0xaa3135cb54f102cbefe09e96103a1a796718ff54": { + "balance": "0x32222d9c331940000" }, - "ef61155ba009dcdebef10b28d9da3d1bc6c9ced4": { - "balance": "59100000000000000000" + "0xef61155ba009dcdebef10b28d9da3d1bc6c9ced4": { + "balance": "0x3342d60dff1960000" }, - "b3c94811e7175b148b281c1a845bfc9bb6fbc115": { - "balance": "200000000000000000000" + "0xb3c94811e7175b148b281c1a845bfc9bb6fbc115": { + "balance": "0xad78ebc5ac6200000" }, - "96d9cca8f55eea0040ec6eb348a1774b95d93ef4": { - "balance": "4000000000000000000000" + "0x96d9cca8f55eea0040ec6eb348a1774b95d93ef4": { + "balance": "0xd8d726b7177a800000" }, - "ce62125adec3370ac52110953a4e760be9451e3b": { - "balance": "152000000000000000000" + "0xce62125adec3370ac52110953a4e760be9451e3b": { + "balance": "0x83d6c7aab63600000" }, - "aca1e6bc64cc3180f620e94dc5b1bcfd8158e45d": { - "balance": "2000000000000000000000" + "0xaca1e6bc64cc3180f620e94dc5b1bcfd8158e45d": { + "balance": "0x6c6b935b8bbd400000" }, - "bc237148d30c13836ffa2cad520ee4d2e5c4eeff": { - "balance": "1970000000000000000000" + "0xbc237148d30c13836ffa2cad520ee4d2e5c4eeff": { + "balance": "0x6acb3df27e1f880000" }, - "0e024e7f029c6aaf3a8b910f5e080873b85795aa": { - "balance": "1000000000000000000000" + "0x0e024e7f029c6aaf3a8b910f5e080873b85795aa": { + "balance": "0x3635c9adc5dea00000" }, - "7283cd4675da58c496556151dafd80c7f995d318": { - "balance": "760000000000000000000" + "0x7283cd4675da58c496556151dafd80c7f995d318": { + "balance": "0x29331e6558f0e00000" }, - "39b299327490d72f9a9edff11b83afd0e9d3c450": { - "balance": "200000000000000000000" + "0x39b299327490d72f9a9edff11b83afd0e9d3c450": { + "balance": "0xad78ebc5ac6200000" }, - "5f333a3b2310765a0d1832b9be4c0a03704c1c09": { - "balance": "1000000000000000000000" + "0x5f333a3b2310765a0d1832b9be4c0a03704c1c09": { + "balance": "0x3635c9adc5dea00000" }, - "5aaf1c31254a6e005fba7f5ab0ec79d7fc2b630e": { - "balance": "5910000000000000000000" + "0x5aaf1c31254a6e005fba7f5ab0ec79d7fc2b630e": { + "balance": "0x14061b9d77a5e980000" }, - "833db42c14163c7be4cab86ac593e06266d699d5": { - "balance": "174212000000000000000000" + "0x833db42c14163c7be4cab86ac593e06266d699d5": { + "balance": "0x24e40d2b6943ef900000" }, - "f32d25eb0ea2b8b3028a4c7a155dc1aae865784d": { - "balance": "5710684000000000000000" + "0xf32d25eb0ea2b8b3028a4c7a155dc1aae865784d": { + "balance": "0x13593a9297fdad60000" }, - "1fa2319fed8c2d462adf2e17feec6a6f30516e95": { - "balance": "125300000000000000000" + "0x1fa2319fed8c2d462adf2e17feec6a6f30516e95": { + "balance": "0x6cae30621d4720000" }, - "c49cfaa967f3afbf55031061fc4cef88f85da584": { - "balance": "2000000000000000000000" + "0xc49cfaa967f3afbf55031061fc4cef88f85da584": { + "balance": "0x6c6b935b8bbd400000" }, - "43db7ff95a086d28ebbfb82fb8fb5f230a5ebccd": { - "balance": "16100000000000000000" + "0x43db7ff95a086d28ebbfb82fb8fb5f230a5ebccd": { + "balance": "0xdf6eb0b2d3ca0000" }, - "cf3f9128b07203a3e10d7d5755c0c4abc6e2cac2": { - "balance": "5000000000000000000000" + "0xcf3f9128b07203a3e10d7d5755c0c4abc6e2cac2": { + "balance": "0x10f0cf064dd59200000" }, - "8f4d1e7e4561284a34fef9673c0d34e12af4aa03": { - "balance": "2000000000000000000000" + "0x8f4d1e7e4561284a34fef9673c0d34e12af4aa03": { + "balance": "0x6c6b935b8bbd400000" }, - "934af21b7ebfa467e2ced65aa34edd3a0ec71332": { - "balance": "35420000000000000000000" + "0x934af21b7ebfa467e2ced65aa34edd3a0ec71332": { + "balance": "0x7801f3e80cc0ff00000" }, - "5d231a70c1dfeb360abd97f616e2d10d39f3cab5": { - "balance": "400000000000000000000" + "0x5d231a70c1dfeb360abd97f616e2d10d39f3cab5": { + "balance": "0x15af1d78b58c400000" }, - "2d5d7335acb0362b47dfa3a8a4d3f5949544d380": { - "balance": "200000000000000000000" + "0x2d5d7335acb0362b47dfa3a8a4d3f5949544d380": { + "balance": "0xad78ebc5ac6200000" }, - "d1e1f2b9c16c309874dee7fac32675aff129c398": { - "balance": "72800000000000000000" + "0xd1e1f2b9c16c309874dee7fac32675aff129c398": { + "balance": "0x3f24d8e4a00700000" }, - "a43b6da6cb7aac571dff27f09d39f846f53769b1": { - "balance": "380000000000000000000" + "0xa43b6da6cb7aac571dff27f09d39f846f53769b1": { + "balance": "0x14998f32ac78700000" }, - "779274bf1803a336e4d3b00ddd93f2d4f5f4a62e": { - "balance": "1000000000000000000000" + "0x779274bf1803a336e4d3b00ddd93f2d4f5f4a62e": { + "balance": "0x3635c9adc5dea00000" }, - "a644ed922cc237a3e5c4979a995477f36e50bc62": { - "balance": "583900000000000000000" + "0xa644ed922cc237a3e5c4979a995477f36e50bc62": { + "balance": "0x1fa73d845d7e960000" }, - "ee6c03429969ca1262cb3f0a4a54afa7d348d7f5": { - "balance": "256100000000000000000" + "0xee6c03429969ca1262cb3f0a4a54afa7d348d7f5": { + "balance": "0xde219f91fc18a0000" }, - "4f06246b8d4bd29661f43e93762201d286935ab1": { - "balance": "4818730000000000000000" + "0x4f06246b8d4bd29661f43e93762201d286935ab1": { + "balance": "0x105394ffc4636110000" }, - "e04972a83ca4112bc871c72d4ae1616c2f0728db": { - "balance": "267606000000000000000" + "0xe04972a83ca4112bc871c72d4ae1616c2f0728db": { + "balance": "0xe81c77f29a32f0000" }, - "df098f5e4e3dffa51af237bda8652c4f73ed9ca6": { - "balance": "502000000000000000000" + "0xdf098f5e4e3dffa51af237bda8652c4f73ed9ca6": { + "balance": "0x1b36a6444a3e180000" }, - "dfded2574b27d1613a7d98b715159b0d00baab28": { - "balance": "20000000000000000000000" + "0xdfded2574b27d1613a7d98b715159b0d00baab28": { + "balance": "0x43c33c1937564800000" }, - "17d931d4c56294dcbe77c8655be4695f006d4a3c": { - "balance": "2000000000000000000000" + "0x17d931d4c56294dcbe77c8655be4695f006d4a3c": { + "balance": "0x6c6b935b8bbd400000" }, - "3ccb71aa6880cb0b84012d90e60740ec06acd78f": { - "balance": "2000000000000000000000" + "0x3ccb71aa6880cb0b84012d90e60740ec06acd78f": { + "balance": "0x6c6b935b8bbd400000" }, - "e57d2995b0ebdf3f3ca6c015eb04260dbb98b7c6": { - "balance": "2000000000000000000000" + "0xe57d2995b0ebdf3f3ca6c015eb04260dbb98b7c6": { + "balance": "0x6c6b935b8bbd400000" }, - "fb3860f4121c432ebdc8ec6a0331b1b709792e90": { - "balance": "600400000000000000000" + "0xfb3860f4121c432ebdc8ec6a0331b1b709792e90": { + "balance": "0x208c394af1c8880000" }, - "fa00c376e89c05e887817a9dd0748d96f341aa89": { - "balance": "300700000000000000000" + "0xfa00c376e89c05e887817a9dd0748d96f341aa89": { + "balance": "0x104d0d00d2b7f60000" }, - "c7a018f0968a51d1f6603c5c49dc545bcb0ff293": { - "balance": "4000000000000000000000" + "0xc7a018f0968a51d1f6603c5c49dc545bcb0ff293": { + "balance": "0xd8d726b7177a800000" }, - "7d73863038ccca22f96affda10496e51e1e6cd48": { - "balance": "20000000000000000000" + "0x7d73863038ccca22f96affda10496e51e1e6cd48": { + "balance": "0x1158e460913d00000" }, - "38ea6f5b5a7b88417551b4123dc127dfe9342da6": { - "balance": "400000000000000000000" + "0x38ea6f5b5a7b88417551b4123dc127dfe9342da6": { + "balance": "0x15af1d78b58c400000" }, - "014b7f67b14f5d983d87014f570c8b993b9872b5": { - "balance": "200000000000000000000" + "0x014b7f67b14f5d983d87014f570c8b993b9872b5": { + "balance": "0xad78ebc5ac6200000" }, - "8ac89bd9b8301e6b0677fa25fcf0f58f0cc7b611": { - "balance": "20000000000000000000" + "0x8ac89bd9b8301e6b0677fa25fcf0f58f0cc7b611": { + "balance": "0x1158e460913d00000" }, - "7eb4b0185c92b6439a08e7322168cb353c8a774a": { - "balance": "10165988000000000000000" + "0x7eb4b0185c92b6439a08e7322168cb353c8a774a": { + "balance": "0x227196ca04983ca0000" }, - "d29dc08efbb3d72e263f78ab7610d0226de76b00": { - "balance": "12000000000000000000000" + "0xd29dc08efbb3d72e263f78ab7610d0226de76b00": { + "balance": "0x28a857425466f800000" }, - "72a8260826294726a75bf39cd9aa9e07a3ea14cd": { - "balance": "2000000000000000000000" + "0x72a8260826294726a75bf39cd9aa9e07a3ea14cd": { + "balance": "0x6c6b935b8bbd400000" }, - "4cb5c6cd713ca447b848ae2f56b761ca14d7ad57": { - "balance": "267400000000000000000" + "0x4cb5c6cd713ca447b848ae2f56b761ca14d7ad57": { + "balance": "0xe7eeba3410b740000" }, - "49185dd7c23632f46c759473ebae966008cd3598": { - "balance": "254030000000000000000" + "0x49185dd7c23632f46c759473ebae966008cd3598": { + "balance": "0xdc55fdb17647b0000" }, - "13d67a7e25f2b12cdb85585009f8acc49b967301": { - "balance": "1999944000000000000000" + "0x13d67a7e25f2b12cdb85585009f8acc49b967301": { + "balance": "0x6c6acc67d7b1d40000" }, - "9d913b5d339c95d87745562563fea98b23c60cc4": { - "balance": "170718000000000000000" + "0x9d913b5d339c95d87745562563fea98b23c60cc4": { + "balance": "0x941302c7f4d230000" }, - "abdc9f1bcf4d19ee96591030e772c334302f7d83": { - "balance": "40110000000000000000000" + "0xabdc9f1bcf4d19ee96591030e772c334302f7d83": { + "balance": "0x87e5e11a81cb5f80000" }, - "e9a5ae3c9e05977dd1069e9fd9d3aefbae04b8df": { - "balance": "1970000000000000000000" + "0xe9a5ae3c9e05977dd1069e9fd9d3aefbae04b8df": { + "balance": "0x6acb3df27e1f880000" }, - "1fd296be03ad737c92f9c6869e8d80a71c5714aa": { - "balance": "13370000000000000000" + "0x1fd296be03ad737c92f9c6869e8d80a71c5714aa": { + "balance": "0xb98bc829a6f90000" }, - "2f13657526b177cad547c3908c840eff647b45d9": { - "balance": "1170685000000000000000" + "0x2f13657526b177cad547c3908c840eff647b45d9": { + "balance": "0x3f76849cf1ee2c8000" }, - "e69fcc26ed225f7b2e379834c524d70c1735e5bc": { - "balance": "2000000000000000000000" + "0xe69fcc26ed225f7b2e379834c524d70c1735e5bc": { + "balance": "0x6c6b935b8bbd400000" }, - "bade43599e02f84f4c3014571c976b13a36c65ab": { - "balance": "4000000000000000000000" + "0xbade43599e02f84f4c3014571c976b13a36c65ab": { + "balance": "0xd8d726b7177a800000" }, - "184a4f0beb71ffd558a6b6e8f228b78796c4cf3e": { - "balance": "12000000000000000000000" + "0x184a4f0beb71ffd558a6b6e8f228b78796c4cf3e": { + "balance": "0x28a857425466f800000" }, - "d1de5aad3a5fd803f1b1aeb6103cb8e14fe723b7": { - "balance": "20000000000000000000" + "0xd1de5aad3a5fd803f1b1aeb6103cb8e14fe723b7": { + "balance": "0x1158e460913d00000" }, - "0bd67dbde07a856ebd893b5edc4f3a5be4202616": { - "balance": "2000000000000000000000" + "0x0bd67dbde07a856ebd893b5edc4f3a5be4202616": { + "balance": "0x6c6b935b8bbd400000" }, - "6b30f1823910b86d3acb5a6afc9defb6f3a30bf8": { - "balance": "4200000000000000000000" + "0x6b30f1823910b86d3acb5a6afc9defb6f3a30bf8": { + "balance": "0xe3aeb5737240a00000" }, - "9a63d185a79129fdab19b58bb631ea36a420544e": { - "balance": "42000000000000000000" + "0x9a63d185a79129fdab19b58bb631ea36a420544e": { + "balance": "0x246ddf97976680000" }, - "df660a91dab9f730f6190d50c8390561500756ca": { - "balance": "2000000000000000000000" + "0xdf660a91dab9f730f6190d50c8390561500756ca": { + "balance": "0x6c6b935b8bbd400000" }, - "a1a1f0fa6d20b50a794f02ef52085c9d036aa6ca": { - "balance": "1000000000000000000000" + "0xa1a1f0fa6d20b50a794f02ef52085c9d036aa6ca": { + "balance": "0x3635c9adc5dea00000" }, - "4ec768295eeabafc42958415e22be216cde77618": { - "balance": "59600000000000000000" + "0x4ec768295eeabafc42958415e22be216cde77618": { + "balance": "0x33b1dbc39c5480000" }, - "c348fc5a461323b57be303cb89361b991913df28": { - "balance": "100000000000000000000000" + "0xc348fc5a461323b57be303cb89361b991913df28": { + "balance": "0x152d02c7e14af6800000" }, - "3a7db224acae17de7798797d82cdf8253017dfa8": { - "balance": "5000000000000000000000" + "0x3a7db224acae17de7798797d82cdf8253017dfa8": { + "balance": "0x10f0cf064dd59200000" }, - "8bea40379347a5c891d59a6363315640f5a7e07a": { - "balance": "1999992000000000000000" + "0x8bea40379347a5c891d59a6363315640f5a7e07a": { + "balance": "0x6c6b76ef96970c0000" }, - "2257fca16a6e5c2a647c3c29f36ce229ab93b17e": { - "balance": "4000000000000000000000" + "0x2257fca16a6e5c2a647c3c29f36ce229ab93b17e": { + "balance": "0xd8d726b7177a800000" }, - "e492818aa684e5a676561b725d42f3cc56ae5198": { - "balance": "800000000000000000000" + "0xe492818aa684e5a676561b725d42f3cc56ae5198": { + "balance": "0x2b5e3af16b18800000" }, - "c841884fa4785fb773b28e9715fae99a5134305d": { - "balance": "2000000000000000000000" + "0xc841884fa4785fb773b28e9715fae99a5134305d": { + "balance": "0x6c6b935b8bbd400000" }, - "0d9443a79468a5bbf7c13c6e225d1de91aee07df": { - "balance": "70000000000000000000" + "0x0d9443a79468a5bbf7c13c6e225d1de91aee07df": { + "balance": "0x3cb71f51fc5580000" }, - "6d4008b4a888a826f248ee6a0b0dfde9f93210b9": { - "balance": "5460000000000000000000" + "0x6d4008b4a888a826f248ee6a0b0dfde9f93210b9": { + "balance": "0x127fcb8afae20d00000" }, - "884980eb4565c1048317a8f47fdbb461965be481": { - "balance": "3999922000000000000000" + "0x884980eb4565c1048317a8f47fdbb461965be481": { + "balance": "0xd8d6119a8146050000" }, - "985d70d207892bed398590024e2421b1cc119359": { - "balance": "20000000000000000000000" + "0x985d70d207892bed398590024e2421b1cc119359": { + "balance": "0x43c33c1937564800000" }, - "d9ec8fe69b7716c0865af888a11b2b12f720ed33": { - "balance": "4000000000000000000000" + "0xd9ec8fe69b7716c0865af888a11b2b12f720ed33": { + "balance": "0xd8d726b7177a800000" }, - "49b74e169265f01a89ec4c9072c5a4cd72e4e835": { - "balance": "16100000000000000000000" + "0x49b74e169265f01a89ec4c9072c5a4cd72e4e835": { + "balance": "0x368c8623a8b4d100000" }, - "4c3e95cc3957d252ce0bf0c87d5b4f2234672e70": { - "balance": "2500000000000000000000" + "0x4c3e95cc3957d252ce0bf0c87d5b4f2234672e70": { + "balance": "0x878678326eac900000" }, - "d9ff115d01266c9f73b063c1c238ef3565e63b36": { - "balance": "680000000000000000000" + "0xd9ff115d01266c9f73b063c1c238ef3565e63b36": { + "balance": "0x24dce54d34a1a00000" }, - "48c5c6970b9161bb1c7b7adfed9cdede8a1ba864": { - "balance": "4000000000000000000000" + "0x48c5c6970b9161bb1c7b7adfed9cdede8a1ba864": { + "balance": "0xd8d726b7177a800000" }, - "ea6afe2cc928ac8391eb1e165fc40040e37421e7": { - "balance": "2997569000000000000000" + "0xea6afe2cc928ac8391eb1e165fc40040e37421e7": { + "balance": "0xa27fa063b2e2e68000" }, - "08ccda50e4b26a0ffc0ef92e9205310706bec2c7": { - "balance": "6077440000000000000000" + "0x08ccda50e4b26a0ffc0ef92e9205310706bec2c7": { + "balance": "0x149756c3857c6000000" }, - "e6e9a39d750fe994394eb68286e5ea62a6997882": { - "balance": "600000000000000000000" + "0xe6e9a39d750fe994394eb68286e5ea62a6997882": { + "balance": "0x2086ac351052600000" }, - "4b58101f44f7e389e12d471d1635b71614fdd605": { - "balance": "160000000000000000000" + "0x4b58101f44f7e389e12d471d1635b71614fdd605": { + "balance": "0x8ac7230489e800000" }, - "8d93dac785f88f1a84bf927d53652b45a154ccdd": { - "balance": "158000000000000000000" + "0x8d93dac785f88f1a84bf927d53652b45a154ccdd": { + "balance": "0x890b0c2e14fb80000" }, - "415d096ab06293183f3c033d25f6cf7178ac3bc7": { - "balance": "40000000000000000000" + "0x415d096ab06293183f3c033d25f6cf7178ac3bc7": { + "balance": "0x22b1c8c1227a00000" }, - "c3e387b03ce95ccfd7fa51dd840183bc43532809": { - "balance": "2000000000000000000000" + "0xc3e387b03ce95ccfd7fa51dd840183bc43532809": { + "balance": "0x6c6b935b8bbd400000" }, - "da34b2eae30bafe8daeccde819a794cd89e09549": { - "balance": "2000000000000000000000" + "0xda34b2eae30bafe8daeccde819a794cd89e09549": { + "balance": "0x6c6b935b8bbd400000" }, - "fa279bfd8767f956bf7fa0bd5660168da75686bd": { - "balance": "2674000000000000000000" + "0xfa279bfd8767f956bf7fa0bd5660168da75686bd": { + "balance": "0x90f534608a72880000" }, - "b98ca31785ef06be49a1e47e864f60d076ca472e": { - "balance": "4000000000000000000000" + "0xb98ca31785ef06be49a1e47e864f60d076ca472e": { + "balance": "0xd8d726b7177a800000" }, - "b768b5234eba3a9968b34d6ddb481c8419b3655d": { - "balance": "14974000000000000000" + "0xb768b5234eba3a9968b34d6ddb481c8419b3655d": { + "balance": "0xcfce55aa12b30000" }, - "31047d703f63b93424fbbd6e2f1f9e74de13e709": { - "balance": "2850123000000000000000" + "0x31047d703f63b93424fbbd6e2f1f9e74de13e709": { + "balance": "0x9a8166f7e6b2a78000" }, - "9a24ce8d485cc4c86e49deb39022f92c7430e67e": { - "balance": "1300000000000000000000" + "0x9a24ce8d485cc4c86e49deb39022f92c7430e67e": { + "balance": "0x46791fc84e07d00000" }, - "e62f9d7c64e8e2635aeb883dd73ba684ee7c1079": { - "balance": "8000000000000000000000" + "0xe62f9d7c64e8e2635aeb883dd73ba684ee7c1079": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "f15d9d5a21b1929e790371a17f16d95f0c69655c": { - "balance": "2000000000000000000000" + "0xf15d9d5a21b1929e790371a17f16d95f0c69655c": { + "balance": "0x6c6b935b8bbd400000" }, - "285ae51b9500c58d541365d97569f14bb2a3709b": { - "balance": "2000000000000000000000" + "0x285ae51b9500c58d541365d97569f14bb2a3709b": { + "balance": "0x6c6b935b8bbd400000" }, - "09c177f1ae442411ddacf187d46db956148360e7": { - "balance": "8950000000000000000000" + "0x09c177f1ae442411ddacf187d46db956148360e7": { + "balance": "0x1e52e336cde22180000" }, - "12173074980153aeaa4b0dcbc7132eadcec21b64": { - "balance": "240000000000000000000" + "0x12173074980153aeaa4b0dcbc7132eadcec21b64": { + "balance": "0xd02ab486cedc00000" }, - "351f16e5e0735af56751b0e225b2421171394090": { - "balance": "13370000000000000000000" + "0x351f16e5e0735af56751b0e225b2421171394090": { + "balance": "0x2d4ca05e2b43ca80000" }, - "ac52b77e15664814f39e4f271be641308d91d6cc": { - "balance": "220000000000000000000" + "0xac52b77e15664814f39e4f271be641308d91d6cc": { + "balance": "0xbed1d0263d9f00000" }, - "99c883258546cc7e4e971f522e389918da5ea63a": { - "balance": "4000000000000000000000" + "0x99c883258546cc7e4e971f522e389918da5ea63a": { + "balance": "0xd8d726b7177a800000" }, - "aa16269aac9c0d803068d82fc79151dadd334b66": { - "balance": "4000000000000000000000" + "0xaa16269aac9c0d803068d82fc79151dadd334b66": { + "balance": "0xd8d726b7177a800000" }, - "7c9a110cb11f2598b2b20e2ca400325e41e9db33": { - "balance": "26000000000000000000000" + "0x7c9a110cb11f2598b2b20e2ca400325e41e9db33": { + "balance": "0x581767ba6189c400000" }, - "583e83ba55e67e13e0e76f8392d873cd21fbf798": { - "balance": "20000000000000000000" + "0x583e83ba55e67e13e0e76f8392d873cd21fbf798": { + "balance": "0x1158e460913d00000" }, - "555ebe84daa42ba256ea789105cec4b693f12f18": { - "balance": "100000000000000000000" + "0x555ebe84daa42ba256ea789105cec4b693f12f18": { + "balance": "0x56bc75e2d63100000" }, - "978c430ce4359b06bc2cdf5c2985fc950e50d5c8": { - "balance": "480000000000000000000" + "0x978c430ce4359b06bc2cdf5c2985fc950e50d5c8": { + "balance": "0x1a055690d9db800000" }, - "dc1eb9b6e64351f56424509645f83e79eee76cf4": { - "balance": "4000000000000000000000" + "0xdc1eb9b6e64351f56424509645f83e79eee76cf4": { + "balance": "0xd8d726b7177a800000" }, - "5b290c01967c812e4dc4c90b174c1b4015bae71e": { - "balance": "149946000000000000000" + "0x5b290c01967c812e4dc4c90b174c1b4015bae71e": { + "balance": "0x820eb348d52b90000" }, - "e7d213947fcb904ad738480b1eed2f5c329f27e8": { - "balance": "18718000000000000000" + "0xe7d213947fcb904ad738480b1eed2f5c329f27e8": { + "balance": "0x103c3b1d3e9c30000" }, - "c517d0315c878813c717e18cafa1eab2654e01da": { - "balance": "10000000000000000000000" + "0xc517d0315c878813c717e18cafa1eab2654e01da": { + "balance": "0x21e19e0c9bab2400000" }, - "7e972a8a7c2a44c93b21436c38d21b9252c345fe": { - "balance": "1790000000000000000000" + "0x7e972a8a7c2a44c93b21436c38d21b9252c345fe": { + "balance": "0x61093d7c2c6d380000" }, - "9cb28ac1a20a106f7f373692c5ce4c73f13732a1": { - "balance": "1000000000000000000000" + "0x9cb28ac1a20a106f7f373692c5ce4c73f13732a1": { + "balance": "0x3635c9adc5dea00000" }, - "14ab164b3b524c82d6abfbc0de831126ae8d1375": { - "balance": "2000000000000000000000" + "0x14ab164b3b524c82d6abfbc0de831126ae8d1375": { + "balance": "0x6c6b935b8bbd400000" }, - "d46f8223452982a1eea019a8816efc2d6fc00768": { - "balance": "137000000000000000000" + "0xd46f8223452982a1eea019a8816efc2d6fc00768": { + "balance": "0x76d41c62494840000" }, - "5cdc4708f14f40dcc15a795f7dc8cb0b7faa9e6e": { - "balance": "537000000000000000000" + "0x5cdc4708f14f40dcc15a795f7dc8cb0b7faa9e6e": { + "balance": "0x1d1c5f3eda20c40000" }, - "66fdc9fee351fa1538eb0d87d819fcf09e7c106a": { - "balance": "6016500000000000000000" + "0x66fdc9fee351fa1538eb0d87d819fcf09e7c106a": { + "balance": "0x14627b5d93781b20000" }, - "e7be82c6593c1eeddd2ae0b15001ff201ab57b2f": { - "balance": "19100000000000000000" + "0xe7be82c6593c1eeddd2ae0b15001ff201ab57b2f": { + "balance": "0x10910d4cdc9f60000" }, - "47d20e6ae4cad3f829eac07e5ac97b66fdd56cf5": { - "balance": "1000000000000000000000" + "0x47d20e6ae4cad3f829eac07e5ac97b66fdd56cf5": { + "balance": "0x3635c9adc5dea00000" }, - "0f2d8daf04b5414a0261f549ff6477b80f2f1d07": { - "balance": "200000000000000000000000" + "0x0f2d8daf04b5414a0261f549ff6477b80f2f1d07": { + "balance": "0x2a5a058fc295ed000000" }, - "84bfcef0491a0ae0694b37ceac024584f2aa0467": { - "balance": "1999944000000000000000" + "0x84bfcef0491a0ae0694b37ceac024584f2aa0467": { + "balance": "0x6c6acc67d7b1d40000" }, - "ec5feafe210c12bfc9a5d05925a123f1e73fbef8": { - "balance": "456000000000000000000000" + "0xec5feafe210c12bfc9a5d05925a123f1e73fbef8": { + "balance": "0x608fcf3d88748d000000" }, - "7023c70956e04a92d70025aad297b539af355869": { - "balance": "2000000000000000000000" + "0x7023c70956e04a92d70025aad297b539af355869": { + "balance": "0x6c6b935b8bbd400000" }, - "d66ddf1159cf22fd8c7a4bc8d5807756d433c43e": { - "balance": "2200000000000000000000" + "0xd66ddf1159cf22fd8c7a4bc8d5807756d433c43e": { + "balance": "0x77432217e683600000" }, - "d0638ea57189a6a699024ad78c71d939c1c2ff8c": { - "balance": "2632000000000000000000" + "0xd0638ea57189a6a699024ad78c71d939c1c2ff8c": { + "balance": "0x8eae566710fc200000" }, - "70d25ed2c8ada59c088cf70dd22bf2db93acc18a": { - "balance": "1056600000000000000000" + "0x70d25ed2c8ada59c088cf70dd22bf2db93acc18a": { + "balance": "0x39474545e4adbc0000" }, - "a4875928458ec2005dbb578c5cd33580f0cf1452": { - "balance": "1000000000000000000000" + "0xa4875928458ec2005dbb578c5cd33580f0cf1452": { + "balance": "0x3635c9adc5dea00000" }, - "b5ad5157dda921e6bafacd9086ae73ae1f611d3f": { - "balance": "2000000000000000000000" + "0xb5ad5157dda921e6bafacd9086ae73ae1f611d3f": { + "balance": "0x6c6b935b8bbd400000" }, - "c493489e56c3bdd829007dc2f956412906f76bfa": { - "balance": "48968000000000000000" + "0xc493489e56c3bdd829007dc2f956412906f76bfa": { + "balance": "0x2a791488e71540000" }, - "c57612de91110c482e6f505bcd23f3c5047d1d61": { - "balance": "3580000000000000000000" + "0xc57612de91110c482e6f505bcd23f3c5047d1d61": { + "balance": "0xc2127af858da700000" }, - "9b18478655a4851cc906e660feac61f7f4c8bffc": { - "balance": "4174120000000000000000" + "0x9b18478655a4851cc906e660feac61f7f4c8bffc": { + "balance": "0xe2478d38907d840000" }, - "b21b7979bf7c5ca01fa82dd640b41c39e6c6bc75": { - "balance": "1999944000000000000000" + "0xb21b7979bf7c5ca01fa82dd640b41c39e6c6bc75": { + "balance": "0x6c6acc67d7b1d40000" }, - "a9d4a2bcbe5b9e0869d70f0fe2e1d6aacd45edc5": { - "balance": "198800000000000000000" + "0xa9d4a2bcbe5b9e0869d70f0fe2e1d6aacd45edc5": { + "balance": "0xac6e77ab663a80000" }, - "6f29bb375be5ed34ed999bb830ee2957dde76d16": { - "balance": "2000000000000000000000" + "0x6f29bb375be5ed34ed999bb830ee2957dde76d16": { + "balance": "0x6c6b935b8bbd400000" }, - "a006268446643ec5e81e7acb3f17f1c351ee2ed9": { - "balance": "4000000000000000000000" + "0xa006268446643ec5e81e7acb3f17f1c351ee2ed9": { + "balance": "0xd8d726b7177a800000" }, - "42ddd014dc52bfbcc555325a40b516f4866a1dd3": { - "balance": "2000000000000000000000" + "0x42ddd014dc52bfbcc555325a40b516f4866a1dd3": { + "balance": "0x6c6b935b8bbd400000" }, - "d6d6776958ee23143a81adadeb08382009e996c2": { - "balance": "3000000000000000000000" + "0xd6d6776958ee23143a81adadeb08382009e996c2": { + "balance": "0xa2a15d09519be00000" }, - "d34e03d36a2bd4d19a5fa16218d1d61e3ffa0b15": { - "balance": "320000000000000000000" + "0xd34e03d36a2bd4d19a5fa16218d1d61e3ffa0b15": { + "balance": "0x1158e460913d000000" }, - "dac0c177f11c5c3e3e78f2efd663d13221488574": { - "balance": "1000000000000000000000" + "0xdac0c177f11c5c3e3e78f2efd663d13221488574": { + "balance": "0x3635c9adc5dea00000" }, - "814135da8f9811075783bf1ab67062af8d3e9f40": { - "balance": "20000000000000000000" + "0x814135da8f9811075783bf1ab67062af8d3e9f40": { + "balance": "0x1158e460913d00000" }, - "7c3eb713c4c9e0381cd8154c7c9a7db8645cde17": { - "balance": "200000000000000000000" + "0x7c3eb713c4c9e0381cd8154c7c9a7db8645cde17": { + "balance": "0xad78ebc5ac6200000" }, - "f49c47b3efd86b6e6a5bc9418d1f9fec814b69ef": { - "balance": "20000000000000000000000" + "0xf49c47b3efd86b6e6a5bc9418d1f9fec814b69ef": { + "balance": "0x43c33c1937564800000" }, - "35f1da127b83376f1b88c82a3359f67a5e67dd50": { - "balance": "1910000000000000000000" + "0x35f1da127b83376f1b88c82a3359f67a5e67dd50": { + "balance": "0x678a932062e4180000" }, - "44dfba50b829becc5f4f14d1b04aab3320a295e5": { - "balance": "1000000000000000000000" + "0x44dfba50b829becc5f4f14d1b04aab3320a295e5": { + "balance": "0x3635c9adc5dea00000" }, - "0b924df007e9c0878417cfe63b976ea1a382a897": { - "balance": "40000000000000000000" + "0x0b924df007e9c0878417cfe63b976ea1a382a897": { + "balance": "0x22b1c8c1227a00000" }, - "82438fd2b32a9bdd674b49d8cc5fa2eff9781847": { - "balance": "20000000000000000000" + "0x82438fd2b32a9bdd674b49d8cc5fa2eff9781847": { + "balance": "0x1158e460913d00000" }, - "794529d09d017271359730027075b87ad83dae6e": { - "balance": "310000000000000000000" + "0x794529d09d017271359730027075b87ad83dae6e": { + "balance": "0x10ce1d3d8cb3180000" }, - "f4b49100757772f33c177b9a76ba95226c8f3dd8": { - "balance": "6700000000000000000000" + "0xf4b49100757772f33c177b9a76ba95226c8f3dd8": { + "balance": "0x16b352da5e0ed300000" }, - "8563c49361b625e768771c96151dbfbd1c906976": { - "balance": "2000000000000000000000" + "0x8563c49361b625e768771c96151dbfbd1c906976": { + "balance": "0x6c6b935b8bbd400000" }, - "0b9df80fbe232009dacf0aa8cac59376e2476203": { - "balance": "2000000000000000000000" + "0x0b9df80fbe232009dacf0aa8cac59376e2476203": { + "balance": "0x6c6b935b8bbd400000" }, - "149b6dbde632c19f5af47cb493114bebd9b03c1f": { - "balance": "12000000000000000000000" + "0x149b6dbde632c19f5af47cb493114bebd9b03c1f": { + "balance": "0x28a857425466f800000" }, - "d7a1431ee453d1e49a0550d1256879b4f5d10201": { - "balance": "1670000000000000000000" + "0xd7a1431ee453d1e49a0550d1256879b4f5d10201": { + "balance": "0x5a87e7d7f5f6580000" }, - "1d37616b793f94911838ac8e19ee9449df921ec4": { - "balance": "1500000000000000000000" + "0x1d37616b793f94911838ac8e19ee9449df921ec4": { + "balance": "0x5150ae84a8cdf00000" }, - "d6670c036df754be43dadd8f50feea289d061fd6": { - "balance": "5988459000000000000000" + "0xd6670c036df754be43dadd8f50feea289d061fd6": { + "balance": "0x144a2903448cef78000" }, - "02778e390fa17510a3428af2870c4273547d386c": { - "balance": "16163700000000000000000" + "0x02778e390fa17510a3428af2870c4273547d386c": { + "balance": "0x36c3c66170c0d720000" }, - "b89f4632df5909e58b2a9964f74feb9a3b01e0c5": { - "balance": "21406707000000000000000" + "0xb89f4632df5909e58b2a9964f74feb9a3b01e0c5": { + "balance": "0x48875bcc6e7cbeb8000" }, - "76c27535bcb59ce1fa2d8c919cabeb4a6bba01d1": { - "balance": "2000000000000000000000" + "0x76c27535bcb59ce1fa2d8c919cabeb4a6bba01d1": { + "balance": "0x6c6b935b8bbd400000" }, - "36bf43ff35df90908824336c9b31ce33067e2f50": { - "balance": "346837200000000000000000" + "0x36bf43ff35df90908824336c9b31ce33067e2f50": { + "balance": "0x49721510c1c1e9480000" }, - "b53bcb174c2518348b818aece020364596466ba3": { - "balance": "2000000000000000000000" + "0xb53bcb174c2518348b818aece020364596466ba3": { + "balance": "0x6c6b935b8bbd400000" }, - "b4dd460cd016725a64b22ea4f8e06e06674e033e": { - "balance": "5370000000000000000000" + "0xb4dd460cd016725a64b22ea4f8e06e06674e033e": { + "balance": "0x1231bb8748547a80000" }, - "cda1741109c0265b3fb2bf8d5ec9c2b8a3346b63": { - "balance": "20000000000000000000" + "0xcda1741109c0265b3fb2bf8d5ec9c2b8a3346b63": { + "balance": "0x1158e460913d00000" }, - "feb8b8e2af716ae41fc7c04bcf29540156461e6b": { - "balance": "1555396000000000000000" + "0xfeb8b8e2af716ae41fc7c04bcf29540156461e6b": { + "balance": "0x545174a528a77a0000" }, - "a49f523aa51364cbc7d995163d34eb590ded2f08": { - "balance": "2659160000000000000000" + "0xa49f523aa51364cbc7d995163d34eb590ded2f08": { + "balance": "0x9027421b2a9fbc0000" }, - "a7e74f0bdb278ff0a805a648618ec52b166ff1be": { - "balance": "100000000000000000000" + "0xa7e74f0bdb278ff0a805a648618ec52b166ff1be": { + "balance": "0x56bc75e2d63100000" }, - "5ead29037a12896478b1296ab714e9cb95428c81": { - "balance": "71500000000000000000" + "0x5ead29037a12896478b1296ab714e9cb95428c81": { + "balance": "0x3e043072d406e0000" }, - "cdecf5675433cdb0c2e55a68db5d8bbe78419dd2": { - "balance": "20000000000000000000" + "0xcdecf5675433cdb0c2e55a68db5d8bbe78419dd2": { + "balance": "0x1158e460913d00000" }, - "c24ccebc2344cce56417fb684cf81613f0f4b9bd": { - "balance": "1550000000000000000000" + "0xc24ccebc2344cce56417fb684cf81613f0f4b9bd": { + "balance": "0x54069233bf7f780000" }, - "5a70106f20d63f875265e48e0d35f00e17d02bc9": { - "balance": "20000000000000000000" + "0x5a70106f20d63f875265e48e0d35f00e17d02bc9": { + "balance": "0x1158e460913d00000" }, - "2606c3b3b4ca1b091498602cb1978bf3b95221c0": { - "balance": "400000000000000000000" + "0x2606c3b3b4ca1b091498602cb1978bf3b95221c0": { + "balance": "0x15af1d78b58c400000" }, - "1ad4563ea5786be1159935abb0f1d5879c3e7372": { - "balance": "6000000000000000000000" + "0x1ad4563ea5786be1159935abb0f1d5879c3e7372": { + "balance": "0x14542ba12a337c00000" }, - "b782bfd1e2de70f467646f9bc09ea5b1fcf450af": { - "balance": "267400000000000000000" + "0xb782bfd1e2de70f467646f9bc09ea5b1fcf450af": { + "balance": "0xe7eeba3410b740000" }, - "649a2b9879cd8fb736e6703b0c7747849796f10f": { - "balance": "7358102000000000000000" + "0x649a2b9879cd8fb736e6703b0c7747849796f10f": { + "balance": "0x18ee22da01ad34f0000" }, - "1cc1d3c14f0fb8640e36724dc43229d2ea7a1e48": { - "balance": "1700000000000000000000" + "0x1cc1d3c14f0fb8640e36724dc43229d2ea7a1e48": { + "balance": "0x5c283d410394100000" }, - "824b3c3c443e19295d7ef6faa7f374a4798486a8": { - "balance": "20000000000000000000" + "0x824b3c3c443e19295d7ef6faa7f374a4798486a8": { + "balance": "0x1158e460913d00000" }, - "a7758cecb60e8f614cce96137ef72b4fbd07774a": { - "balance": "500000000000000000000" + "0xa7758cecb60e8f614cce96137ef72b4fbd07774a": { + "balance": "0x1b1ae4d6e2ef500000" }, - "981f712775c0dad97518ffedcb47b9ad1d6c2762": { - "balance": "6685000000000000000000" + "0x981f712775c0dad97518ffedcb47b9ad1d6c2762": { + "balance": "0x16a6502f15a1e540000" }, - "26e801b62c827191dd68d31a011990947fd0ebe0": { - "balance": "20000000000000000000" + "0x26e801b62c827191dd68d31a011990947fd0ebe0": { + "balance": "0x1158e460913d00000" }, - "95447046313b2f3a5e19b948fd3b8bedc82c717c": { - "balance": "500000000000000000000" + "0x95447046313b2f3a5e19b948fd3b8bedc82c717c": { + "balance": "0x1b1ae4d6e2ef500000" }, - "0b701101a4109f9cb360dc57b77442673d5e5983": { - "balance": "2000000000000000000000" + "0x0b701101a4109f9cb360dc57b77442673d5e5983": { + "balance": "0x6c6b935b8bbd400000" }, - "5b25cae86dcafa2a60e7723631fc5fa49c1ad87d": { - "balance": "2491200000000000000000" + "0x5b25cae86dcafa2a60e7723631fc5fa49c1ad87d": { + "balance": "0x870c58510e85200000" }, - "f73ac46c203be1538111b151ec8220c786d84144": { - "balance": "294515000000000000000" + "0xf73ac46c203be1538111b151ec8220c786d84144": { + "balance": "0xff7377817b82b8000" }, - "e8c3d3b0e17f97d1e756e684f94e1470f99c95a1": { - "balance": "400000000000000000000" + "0xe8c3d3b0e17f97d1e756e684f94e1470f99c95a1": { + "balance": "0x15af1d78b58c400000" }, - "8c900a8236b08c2b65405d39d75f20062a7561fd": { - "balance": "1640000000000000000000" + "0x8c900a8236b08c2b65405d39d75f20062a7561fd": { + "balance": "0x58e7926ee858a00000" }, - "43898c49a34d509bfed4f76041ee91caf3aa6aa5": { - "balance": "300000000000000000000" + "0x43898c49a34d509bfed4f76041ee91caf3aa6aa5": { + "balance": "0x1043561a8829300000" }, - "c85325eab2a59b3ed863c86a5f2906a04229ffa9": { - "balance": "465600000000000000000" + "0xc85325eab2a59b3ed863c86a5f2906a04229ffa9": { + "balance": "0x193d7f7d253de00000" }, - "4a430170152de5172633dd8262d107a0afd96a0f": { - "balance": "3160000000000000000000" + "0x4a430170152de5172633dd8262d107a0afd96a0f": { + "balance": "0xab4dcf399a3a600000" }, - "6e0ee70612c976287d499ddfa6c0dcc12c06deea": { - "balance": "129980000000000000000" + "0x6e0ee70612c976287d499ddfa6c0dcc12c06deea": { + "balance": "0x70bd5b95621460000" }, - "21c07380484f6cbc8724ad32bc864c3b5ad500b7": { - "balance": "1000000000000000000000" + "0x21c07380484f6cbc8724ad32bc864c3b5ad500b7": { + "balance": "0x3635c9adc5dea00000" }, - "ff5162f2354dc492c75fd6e3a107268660eecb47": { - "balance": "1700000000000000000000" + "0xff5162f2354dc492c75fd6e3a107268660eecb47": { + "balance": "0x5c283d410394100000" }, - "8845e9f90e96336bac3c616be9d88402683e004c": { - "balance": "2000000000000000000000" + "0x8845e9f90e96336bac3c616be9d88402683e004c": { + "balance": "0x6c6b935b8bbd400000" }, - "f23c7b0cb8cd59b82bd890644a57daf40c85e278": { - "balance": "50038000000000000000" + "0xf23c7b0cb8cd59b82bd890644a57daf40c85e278": { + "balance": "0x2b66aafe326ff0000" }, - "1784948bf99848c89e445638504dd698271b5924": { - "balance": "6037580000000000000000" + "0x1784948bf99848c89e445638504dd698271b5924": { + "balance": "0x1474c410d87baee0000" }, - "b39f4c00b2630cab7db7295ef43d47d501e17fd7": { - "balance": "4000000000000000000000" + "0xb39f4c00b2630cab7db7295ef43d47d501e17fd7": { + "balance": "0xd8d726b7177a800000" }, - "3fb7d197b3ba4fe045efc23d50a14585f558d9b2": { - "balance": "20000000000000000000" + "0x3fb7d197b3ba4fe045efc23d50a14585f558d9b2": { + "balance": "0x1158e460913d00000" }, - "bd043b67c63e60f841ccca15b129cdfe6590c8e3": { - "balance": "200000000000000000000" + "0xbd043b67c63e60f841ccca15b129cdfe6590c8e3": { + "balance": "0xad78ebc5ac6200000" }, - "86ca0145957e6b0dfe36875fbe7a0dec55e17a28": { - "balance": "10000000000000000000000" + "0x86ca0145957e6b0dfe36875fbe7a0dec55e17a28": { + "balance": "0x21e19e0c9bab2400000" }, - "dae7201eab8c063302930d693929d07f95e71962": { - "balance": "2687370000000000000000" + "0xdae7201eab8c063302930d693929d07f95e71962": { + "balance": "0x91aec028b419810000" }, - "cc034985d3f28c2d39b1a34bced4d3b2b6ca234e": { - "balance": "182000000000000000000" + "0xcc034985d3f28c2d39b1a34bced4d3b2b6ca234e": { + "balance": "0x9ddc1e3b901180000" }, - "40e0dbf3efef9084ea1cd7e503f40b3b4a8443f6": { - "balance": "4000000000000000000000" + "0x40e0dbf3efef9084ea1cd7e503f40b3b4a8443f6": { + "balance": "0xd8d726b7177a800000" }, - "b1896a37e5d8825a2d01765ae5de629977de8352": { - "balance": "200000000000000000000" + "0xb1896a37e5d8825a2d01765ae5de629977de8352": { + "balance": "0xad78ebc5ac6200000" }, - "d9f547f2c1de0ed98a53d161df57635dd21a00bd": { - "balance": "98500000000000000000" + "0xd9f547f2c1de0ed98a53d161df57635dd21a00bd": { + "balance": "0x556f64c1fe7fa0000" }, - "2fea1b2f834f02fc54333f8a809f0438e5870aa9": { - "balance": "20200000000000000000" + "0x2fea1b2f834f02fc54333f8a809f0438e5870aa9": { + "balance": "0x11854d0f9cee40000" }, - "68b31836a30a016ada157b638ac15da73f18cfde": { - "balance": "26000000000000000000" + "0x68b31836a30a016ada157b638ac15da73f18cfde": { + "balance": "0x168d28e3f00280000" }, - "bc967fe4418c18b99858966d870678dca2b88879": { - "balance": "8740000000000000000000" + "0xbc967fe4418c18b99858966d870678dca2b88879": { + "balance": "0x1d9cbdd8d7ed2100000" }, - "16bae5d24eff91778cd98b4d3a1cc3162f44aa77": { - "balance": "401100000000000000000" + "0x16bae5d24eff91778cd98b4d3a1cc3162f44aa77": { + "balance": "0x15be6174e1912e0000" }, - "f476e1267f86247cc908816f2e7ad5388c952db0": { - "balance": "4000000000000000000000" + "0xf476e1267f86247cc908816f2e7ad5388c952db0": { + "balance": "0xd8d726b7177a800000" }, - "0203ae01d4c41cae1865e04b1f5b53cdfaecae31": { - "balance": "1006054000000000000000" + "0x0203ae01d4c41cae1865e04b1f5b53cdfaecae31": { + "balance": "0x3689cdceb28cd70000" }, - "bd4bd5b122d8ef7b7c8f0667450320db2116142e": { - "balance": "600000000000000000000" + "0xbd4bd5b122d8ef7b7c8f0667450320db2116142e": { + "balance": "0x2086ac351052600000" }, - "a394ad4fd9e6530e6f5c53faecbede81cb172da1": { - "balance": "5600000000000000000000" + "0xa394ad4fd9e6530e6f5c53faecbede81cb172da1": { + "balance": "0x12f939c99edab800000" }, - "3a9960266df6492063538a99f487c950a3a5ec9e": { - "balance": "24000000000000000000000" + "0x3a9960266df6492063538a99f487c950a3a5ec9e": { + "balance": "0x5150ae84a8cdf000000" }, - "d8069f84b521493f4715037f3226b25f33b60586": { - "balance": "1910000000000000000000" + "0xd8069f84b521493f4715037f3226b25f33b60586": { + "balance": "0x678a932062e4180000" }, - "136c834bf111326d207395295b2e583ea7f33572": { - "balance": "100000000000000000000" + "0x136c834bf111326d207395295b2e583ea7f33572": { + "balance": "0x56bc75e2d63100000" }, - "c5c73d61cce7c8fe4c8fce29f39092cd193e0fff": { - "balance": "8000000000000000000000" + "0xc5c73d61cce7c8fe4c8fce29f39092cd193e0fff": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "3cfbf066565970639e130df2a7d16b0e14d6091c": { - "balance": "1700000000000000000000" + "0x3cfbf066565970639e130df2a7d16b0e14d6091c": { + "balance": "0x5c283d410394100000" }, - "61b905de663fc17386523b3a28e2f7d037a655cd": { - "balance": "500000000000000000000" + "0x61b905de663fc17386523b3a28e2f7d037a655cd": { + "balance": "0x1b1ae4d6e2ef500000" }, - "fda0ce15330707f10bce3201172d2018b9ddea74": { - "balance": "51900000000000000000" + "0xfda0ce15330707f10bce3201172d2018b9ddea74": { + "balance": "0x2d041d705a2c60000" }, - "f7fc45abf76f5088e2e5b5a8d132f28a4d4ec1c0": { - "balance": "2000000000000000000000" + "0xf7fc45abf76f5088e2e5b5a8d132f28a4d4ec1c0": { + "balance": "0x6c6b935b8bbd400000" }, - "c3db9fb6f46c480af34465d79753b4e2b74a67ce": { - "balance": "20000000000000000000000" + "0xc3db9fb6f46c480af34465d79753b4e2b74a67ce": { + "balance": "0x43c33c1937564800000" }, - "ebe46cc3c34c32f5add6c3195bb486c4713eb918": { - "balance": "1000000000000000000000" + "0xebe46cc3c34c32f5add6c3195bb486c4713eb918": { + "balance": "0x3635c9adc5dea00000" }, - "91d2a9ee1a6db20f5317cca7fbe2313895db8ef8": { - "balance": "8499600000000000000000" + "0x91d2a9ee1a6db20f5317cca7fbe2313895db8ef8": { + "balance": "0x1ccc3a52f306e280000" }, - "c4cc45a2b63c27c0b4429e58cd42da59be739bd6": { - "balance": "1000000000000000000000" + "0xc4cc45a2b63c27c0b4429e58cd42da59be739bd6": { + "balance": "0x3635c9adc5dea00000" }, - "a43b81f99356c0af141a03010d77bd042c71c1ee": { - "balance": "2000000000000000000000" + "0xa43b81f99356c0af141a03010d77bd042c71c1ee": { + "balance": "0x6c6b935b8bbd400000" }, - "4c45d4c9a725d11112bfcbca00bf31186ccaadb7": { - "balance": "400000000000000000000" + "0x4c45d4c9a725d11112bfcbca00bf31186ccaadb7": { + "balance": "0x15af1d78b58c400000" }, - "bf9f271f7a7e12e36dd2fe9facebf385fe6142bd": { - "balance": "62760000000000000000" + "0xbf9f271f7a7e12e36dd2fe9facebf385fe6142bd": { + "balance": "0x366f84f7bb7840000" }, - "e0ce80a461b648a501fd0b824690c8868b0e4de8": { - "balance": "500000000000000000000" + "0xe0ce80a461b648a501fd0b824690c8868b0e4de8": { + "balance": "0x1b1ae4d6e2ef500000" }, - "a1f7dde1d738d8cd679ea1ee965bee224be7d04d": { - "balance": "1127000000000000000000" + "0xa1f7dde1d738d8cd679ea1ee965bee224be7d04d": { + "balance": "0x3d184450e5e93c0000" }, - "7f1c81ee1697fc144b7c0be5493b5615ae7fddca": { - "balance": "500200000000000000000" + "0x7f1c81ee1697fc144b7c0be5493b5615ae7fddca": { + "balance": "0x1b1dab61d3aa640000" }, - "b508f987b2de34ae4cf193de85bff61389621f88": { - "balance": "6000000000000000000000" + "0xb508f987b2de34ae4cf193de85bff61389621f88": { + "balance": "0x14542ba12a337c00000" }, - "5f26cf34599bc36ea67b9e7a9f9b4330c9d542a3": { - "balance": "1000000000000000000000" + "0x5f26cf34599bc36ea67b9e7a9f9b4330c9d542a3": { + "balance": "0x3635c9adc5dea00000" }, - "d02108d2ae3cab10cbcf1657af223e027c8210f6": { - "balance": "2000140000000000000000" + "0xd02108d2ae3cab10cbcf1657af223e027c8210f6": { + "balance": "0x6c6d84bccdd9ce0000" }, - "952183cfd38e352e579d36decec5b18450f7fba0": { - "balance": "2000000000000000000000" + "0x952183cfd38e352e579d36decec5b18450f7fba0": { + "balance": "0x6c6b935b8bbd400000" }, - "eb90c793b3539761e1c814a29671148692193eb4": { - "balance": "12000000000000000000000" + "0xeb90c793b3539761e1c814a29671148692193eb4": { + "balance": "0x28a857425466f800000" }, - "1076212d4f758c8ec7121c1c7d74254926459284": { - "balance": "35000056000000000000000" + "0x1076212d4f758c8ec7121c1c7d74254926459284": { + "balance": "0x7695b59b5c17b4c0000" }, - "f05ceeab65410564709951773c8445ad9f4ec797": { - "balance": "299982000000000000000" + "0xf05ceeab65410564709951773c8445ad9f4ec797": { + "balance": "0x10431627a0933b0000" }, - "05361d8eb6941d4e90fb7e1418a95a32d5257732": { - "balance": "20000000000000000000" + "0x05361d8eb6941d4e90fb7e1418a95a32d5257732": { + "balance": "0x1158e460913d00000" }, - "a5783bf33432ff82ac498985d7d460ae67ec3673": { - "balance": "1820000000000000000000" + "0xa5783bf33432ff82ac498985d7d460ae67ec3673": { + "balance": "0x62a992e53a0af00000" }, - "b1cd4bdfd104489a026ec99d597307a04279f173": { - "balance": "20000000000000000000000" + "0xb1cd4bdfd104489a026ec99d597307a04279f173": { + "balance": "0x43c33c1937564800000" }, - "876c3f218b4776df3ca9dbfb270de152d94ed252": { - "balance": "100000000000000000000" + "0x876c3f218b4776df3ca9dbfb270de152d94ed252": { + "balance": "0x56bc75e2d63100000" }, - "8a36869ad478997cbf6d8924d20a3c8018e9855b": { - "balance": "20000000000000000000" + "0x8a36869ad478997cbf6d8924d20a3c8018e9855b": { + "balance": "0x1158e460913d00000" }, - "fb3fe09bb836861529d7518da27635f538505615": { - "balance": "1399904000000000000000" + "0xfb3fe09bb836861529d7518da27635f538505615": { + "balance": "0x4be39216fda0700000" }, - "d093e829819fd2e25b973800bb3d5841dd152d05": { - "balance": "4000000000000000000000" + "0xd093e829819fd2e25b973800bb3d5841dd152d05": { + "balance": "0xd8d726b7177a800000" }, - "126d91f7ad86debb0557c612ca276eb7f96d00a1": { - "balance": "100000000000000000000" + "0x126d91f7ad86debb0557c612ca276eb7f96d00a1": { + "balance": "0x56bc75e2d63100000" }, - "2a81d27cb6d4770ff4f3c4a3ba18e5e57f07517c": { - "balance": "2000000000000000000000" + "0x2a81d27cb6d4770ff4f3c4a3ba18e5e57f07517c": { + "balance": "0x6c6b935b8bbd400000" }, - "c4f7b13ac6d4eb4db3d4e6a252af8a07bd5957da": { - "balance": "200000000000000000000" + "0xc4f7b13ac6d4eb4db3d4e6a252af8a07bd5957da": { + "balance": "0xad78ebc5ac6200000" }, - "305d26c10bdc103f6b9c21272eb7cb2d9108c47e": { - "balance": "500000000000000000000" + "0x305d26c10bdc103f6b9c21272eb7cb2d9108c47e": { + "balance": "0x1b1ae4d6e2ef500000" }, - "d0d0a2ad45f59a9dccc695d85f25ca46ed31a5a3": { - "balance": "840000000000000000000" + "0xd0d0a2ad45f59a9dccc695d85f25ca46ed31a5a3": { + "balance": "0x2d89577d7d40200000" }, - "522323aad71dbc96d85af90f084b99c3f09decb7": { - "balance": "6000000000000000000000" + "0x522323aad71dbc96d85af90f084b99c3f09decb7": { + "balance": "0x14542ba12a337c00000" }, - "f43da3a4e3f5fab104ca9bc1a0f7f3bb4a56f351": { - "balance": "1999944000000000000000" + "0xf43da3a4e3f5fab104ca9bc1a0f7f3bb4a56f351": { + "balance": "0x6c6acc67d7b1d40000" }, - "a2dc65ee256b59a5bd7929774f904b358df3ada1": { - "balance": "21319600000000000000000" + "0xa2dc65ee256b59a5bd7929774f904b358df3ada1": { + "balance": "0x483bce28beb09f80000" }, - "f382df583155d8548f3f93440cd5f68cb79d6026": { - "balance": "266619800000000000000000" + "0xf382df583155d8548f3f93440cd5f68cb79d6026": { + "balance": "0x38757d027fc1fd5c0000" }, - "0c967e3061b87a753e84507eb60986782c8f3013": { - "balance": "100000000000000000000" + "0x0c967e3061b87a753e84507eb60986782c8f3013": { + "balance": "0x56bc75e2d63100000" }, - "a3a262afd2936819230892fde84f2d5a594ab283": { - "balance": "1880000000000000000000" + "0xa3a262afd2936819230892fde84f2d5a594ab283": { + "balance": "0x65ea3db75546600000" }, - "93868ddb2a794d02ebda2fa4807c76e3609858dc": { - "balance": "2027851000000000000000" + "0x93868ddb2a794d02ebda2fa4807c76e3609858dc": { + "balance": "0x6dee15fc7c24a78000" }, - "cd35ff010ec501a721a1b2f07a9ca5877dfcf95a": { - "balance": "4011000000000000000000" + "0xcd35ff010ec501a721a1b2f07a9ca5877dfcf95a": { + "balance": "0xd96fce90cfabcc0000" }, - "5824a7e22838277134308c5f4b50dab65e43bb31": { - "balance": "6000000000000000000000" + "0x5824a7e22838277134308c5f4b50dab65e43bb31": { + "balance": "0x14542ba12a337c00000" }, - "7f7a3a21b3f5a65d81e0fcb7d52dd00a1aa36dba": { - "balance": "100000000000000000000" + "0x7f7a3a21b3f5a65d81e0fcb7d52dd00a1aa36dba": { + "balance": "0x56bc75e2d63100000" }, - "30513fca9f36fd788cfea7a340e86df98294a244": { - "balance": "447000000000000000000" + "0x30513fca9f36fd788cfea7a340e86df98294a244": { + "balance": "0x183b5f03b1479c0000" }, - "283e6252b4efcf4654391acb75f903c59b78c5fb": { - "balance": "12000000000000000000000" + "0x283e6252b4efcf4654391acb75f903c59b78c5fb": { + "balance": "0x28a857425466f800000" }, - "eddbaafbc21be8f25562f1ed6d05d6afb58f02c2": { - "balance": "2000000000000000000000" + "0xeddbaafbc21be8f25562f1ed6d05d6afb58f02c2": { + "balance": "0x6c6b935b8bbd400000" }, - "0dcfe837ea1cf28c65fccec3bef1f84e59d150c0": { - "balance": "200000000000000000000" + "0x0dcfe837ea1cf28c65fccec3bef1f84e59d150c0": { + "balance": "0xad78ebc5ac6200000" }, - "828ba651cb930ed9787156299a3de44cd08b7212": { - "balance": "1337000000000000000000" + "0x828ba651cb930ed9787156299a3de44cd08b7212": { + "balance": "0x487a9a304539440000" }, - "cfd47493c9f89fe680bda5754dd7c9cfe7cb5bbe": { - "balance": "54508000000000000000" + "0xcfd47493c9f89fe680bda5754dd7c9cfe7cb5bbe": { + "balance": "0x2f473513448fe0000" }, - "0e89eddd3fa0d71d8ab0ff8da5580686e3d4f74f": { - "balance": "2000000000000000000000" + "0x0e89eddd3fa0d71d8ab0ff8da5580686e3d4f74f": { + "balance": "0x6c6b935b8bbd400000" }, - "205f5166f12440d85762c967d3ae86184f8f4d98": { - "balance": "432500000000000000000" + "0x205f5166f12440d85762c967d3ae86184f8f4d98": { + "balance": "0x177224aa844c720000" }, - "25dad495a11a86b9eeece1eeec805e57f157faff": { - "balance": "16000000000000000000000" + "0x25dad495a11a86b9eeece1eeec805e57f157faff": { + "balance": "0x3635c9adc5dea000000" }, - "6c84cba77c6db4f7f90ef13d5ee21e8cfc7f8314": { - "balance": "2000000000000000000000" + "0x6c84cba77c6db4f7f90ef13d5ee21e8cfc7f8314": { + "balance": "0x6c6b935b8bbd400000" }, - "91a787bc5196f34857fe0c372f4df376aaa76613": { - "balance": "2000000000000000000000" + "0x91a787bc5196f34857fe0c372f4df376aaa76613": { + "balance": "0x6c6b935b8bbd400000" }, - "b0d3c9872b85056ea0c0e6d1ecf7a77e3ce6ab85": { - "balance": "4999711000000000000000" + "0xb0d3c9872b85056ea0c0e6d1ecf7a77e3ce6ab85": { + "balance": "0x10f08eda8e555098000" }, - "6e4d2e39c8836629e5b487b1918a669aebdd9536": { - "balance": "1000000000000000000000" + "0x6e4d2e39c8836629e5b487b1918a669aebdd9536": { + "balance": "0x3635c9adc5dea00000" }, - "dc703a5f3794c84d6cb3544918cae14a35c3bd4f": { - "balance": "1850000000000000000000" + "0xdc703a5f3794c84d6cb3544918cae14a35c3bd4f": { + "balance": "0x6449e84e47a8a80000" }, - "47beb20f759100542aa93d41118b3211d664920e": { - "balance": "2000000000000000000000" + "0x47beb20f759100542aa93d41118b3211d664920e": { + "balance": "0x6c6b935b8bbd400000" }, - "5a7735007d70b06844da9901cdfadb11a2582c2f": { - "balance": "6000000000000000000000" + "0x5a7735007d70b06844da9901cdfadb11a2582c2f": { + "balance": "0x14542ba12a337c00000" }, - "aff107960b7ec34ed690b665024d60838c190f70": { - "balance": "500000000000000000000" + "0xaff107960b7ec34ed690b665024d60838c190f70": { + "balance": "0x1b1ae4d6e2ef500000" }, - "563a03ab9c56b600f6d25b660c21e16335517a75": { - "balance": "1000000000000000000000" + "0x563a03ab9c56b600f6d25b660c21e16335517a75": { + "balance": "0x3635c9adc5dea00000" }, - "a106465bbd19e1b6bce50d1b1157dc59095a3630": { - "balance": "2000000000000000000000" + "0xa106465bbd19e1b6bce50d1b1157dc59095a3630": { + "balance": "0x6c6b935b8bbd400000" }, - "ca9dec02841adf5cc920576a5187edd2bd434a18": { - "balance": "500000000000000000000" + "0xca9dec02841adf5cc920576a5187edd2bd434a18": { + "balance": "0x1b1ae4d6e2ef500000" }, - "572ac1aba0de23ae41a7cae1dc0842d8abfc103b": { - "balance": "1910000000000000000000" + "0x572ac1aba0de23ae41a7cae1dc0842d8abfc103b": { + "balance": "0x678a932062e4180000" }, - "5f74ed0e24ff80d9b2c4a44baa9975428cd6b935": { - "balance": "2980000000000000000000" + "0x5f74ed0e24ff80d9b2c4a44baa9975428cd6b935": { + "balance": "0xa18bcec34888100000" }, - "f2049532fd458a83ca1bff2eebacb6d5ca63f4a4": { - "balance": "3625693000000000000000" + "0xf2049532fd458a83ca1bff2eebacb6d5ca63f4a4": { + "balance": "0xc48c991dc1545c8000" }, - "cee699c0707a7836252b292f047ce8ad289b2f55": { - "balance": "324700000000000000000" + "0xcee699c0707a7836252b292f047ce8ad289b2f55": { + "balance": "0x119a1e21aa69560000" }, - "8b3696f3c60de32432a2e4c395ef0303b7e81e75": { - "balance": "30000000000000000000000" + "0x8b3696f3c60de32432a2e4c395ef0303b7e81e75": { + "balance": "0x65a4da25d3016c00000" }, - "13dee03e3799952d0738843d4be8fc0a803fb20e": { - "balance": "2000000000000000000000" + "0x13dee03e3799952d0738843d4be8fc0a803fb20e": { + "balance": "0x6c6b935b8bbd400000" }, - "c853215b9b9f2d2cd0741e585e987b5fb80c212e": { - "balance": "1550000000000000000000" + "0xc853215b9b9f2d2cd0741e585e987b5fb80c212e": { + "balance": "0x54069233bf7f780000" }, - "851c0d62be4635d4777e8035e37e4ba8517c6132": { - "balance": "500000000000000000000" + "0x851c0d62be4635d4777e8035e37e4ba8517c6132": { + "balance": "0x1b1ae4d6e2ef500000" }, - "a76b743f981b693072a131b22ba510965c2fefd7": { - "balance": "18200000000000000000" + "0xa76b743f981b693072a131b22ba510965c2fefd7": { + "balance": "0xfc936392801c0000" }, - "69bd25ade1a3346c59c4e930db2a9d715ef0a27a": { - "balance": "4000000000000000000000" + "0x69bd25ade1a3346c59c4e930db2a9d715ef0a27a": { + "balance": "0xd8d726b7177a800000" }, - "0fec4ee0d7ca180290b6bd20f9992342f60ff68d": { - "balance": "334383000000000000000" + "0x0fec4ee0d7ca180290b6bd20f9992342f60ff68d": { + "balance": "0x12207f0edce9718000" }, - "ccfd725760a68823ff1e062f4cc97e1360e8d997": { - "balance": "399800000000000000000" + "0xccfd725760a68823ff1e062f4cc97e1360e8d997": { + "balance": "0x15ac56edc4d12c0000" }, - "9f017706b830fb9c30efb0a09f506b9157457534": { - "balance": "2000000000000000000000" + "0x9f017706b830fb9c30efb0a09f506b9157457534": { + "balance": "0x6c6b935b8bbd400000" }, - "420fb86e7d2b51401fc5e8c72015decb4ef8fc2e": { - "balance": "1000000000000000000000" + "0x420fb86e7d2b51401fc5e8c72015decb4ef8fc2e": { + "balance": "0x3635c9adc5dea00000" }, - "cb7d2b8089e9312cc9aeaa2773f35308ec6c2a7b": { - "balance": "10000000000000000000000" + "0xcb7d2b8089e9312cc9aeaa2773f35308ec6c2a7b": { + "balance": "0x21e19e0c9bab2400000" }, - "6c822029218ac8e98a260c1e064029348839875b": { - "balance": "5010000000000000000000" + "0x6c822029218ac8e98a260c1e064029348839875b": { + "balance": "0x10f97b787e1e3080000" }, - "1c68a66138783a63c98cc675a9ec77af4598d35e": { - "balance": "50100000000000000000" + "0x1c68a66138783a63c98cc675a9ec77af4598d35e": { + "balance": "0x2b746f48f0f120000" }, - "f270792576f05d514493ffd1f5e84bec4b2df810": { - "balance": "1000000000000000000000" + "0xf270792576f05d514493ffd1f5e84bec4b2df810": { + "balance": "0x3635c9adc5dea00000" }, - "9191f94698210516cf6321a142070e20597674ed": { - "balance": "17194000000000000000" + "0x9191f94698210516cf6321a142070e20597674ed": { + "balance": "0xee9d5be6fc110000" }, - "c0ca3277942e7445874be31ceb902972714f1823": { - "balance": "250000000000000000000" + "0xc0ca3277942e7445874be31ceb902972714f1823": { + "balance": "0xd8d726b7177a80000" }, - "35e096120deaa5c1ecb1645e2ccb8b4edbd9299a": { - "balance": "500000000000000000000" + "0x35e096120deaa5c1ecb1645e2ccb8b4edbd9299a": { + "balance": "0x1b1ae4d6e2ef500000" }, - "e2bbf84641e3541f6c33e6ed683a635a70bde2ec": { - "balance": "502763000000000000000" + "0xe2bbf84641e3541f6c33e6ed683a635a70bde2ec": { + "balance": "0x1b413cfcbf59b78000" }, - "d12d77ae01a92d35117bac705aacd982d02e74c1": { - "balance": "1000000000000000000000" + "0xd12d77ae01a92d35117bac705aacd982d02e74c1": { + "balance": "0x3635c9adc5dea00000" }, - "dabb0889fc042926b05ef57b2520910abc4b4149": { - "balance": "2000000000000000000000" + "0xdabb0889fc042926b05ef57b2520910abc4b4149": { + "balance": "0x6c6b935b8bbd400000" }, - "5a1a336962d6e0c63031cc83c6a5c6a6f4478ecb": { - "balance": "1000000000000000000000" + "0x5a1a336962d6e0c63031cc83c6a5c6a6f4478ecb": { + "balance": "0x3635c9adc5dea00000" }, - "abd154903513b8da4f019f68284b0656a1d0169b": { - "balance": "1000000000000000000000" + "0xabd154903513b8da4f019f68284b0656a1d0169b": { + "balance": "0x3635c9adc5dea00000" }, - "ad377cd25eb53e83ae091a0a1d2b4516f484afde": { - "balance": "1940000000000000000000" + "0xad377cd25eb53e83ae091a0a1d2b4516f484afde": { + "balance": "0x692ae8897081d00000" }, - "08c2f236ac4adcd3fda9fbc6e4532253f9da3bec": { - "balance": "20000000000000000000" + "0x08c2f236ac4adcd3fda9fbc6e4532253f9da3bec": { + "balance": "0x1158e460913d00000" }, - "71135d8f05963c905a4a07922909235a896a52ea": { - "balance": "3000000000000000000000" + "0x71135d8f05963c905a4a07922909235a896a52ea": { + "balance": "0xa2a15d09519be00000" }, - "080546508a3d2682c8b9884f13637b8847b44db3": { - "balance": "2000000000000000000000" + "0x080546508a3d2682c8b9884f13637b8847b44db3": { + "balance": "0x6c6b935b8bbd400000" }, - "2d61bfc56873923c2b00095dc3eaa0f590d8ae0f": { - "balance": "20760000000000000000000" + "0x2d61bfc56873923c2b00095dc3eaa0f590d8ae0f": { + "balance": "0x46566dff8ce55600000" }, - "cbfa6af6c283b046e2772c6063b0b21553c40106": { - "balance": "2000000000000000000000" + "0xcbfa6af6c283b046e2772c6063b0b21553c40106": { + "balance": "0x6c6b935b8bbd400000" }, - "ccabc6048a53464424fcf76eeb9e6e1801fa23d4": { - "balance": "49250000000000000000" + "0xccabc6048a53464424fcf76eeb9e6e1801fa23d4": { + "balance": "0x2ab7b260ff3fd0000" }, - "60cc3d445ebdf76a7d7ae571c6971dff68cc8585": { - "balance": "1000000000000000000000" + "0x60cc3d445ebdf76a7d7ae571c6971dff68cc8585": { + "balance": "0x3635c9adc5dea00000" }, - "fff33a3bd36abdbd412707b8e310d6011454a7ae": { - "balance": "8000000000000000000000" + "0xfff33a3bd36abdbd412707b8e310d6011454a7ae": { + "balance": "0x1b1ae4d6e2ef5000000" }, - "d2dbebe89b0357aea98bbe8e496338debb28e805": { - "balance": "4000000000000000000000" + "0xd2dbebe89b0357aea98bbe8e496338debb28e805": { + "balance": "0xd8d726b7177a800000" }, - "5f521282e9b278dc8c034c72af53ee29e5443d78": { - "balance": "6520000000000000000000" + "0x5f521282e9b278dc8c034c72af53ee29e5443d78": { + "balance": "0x161732d2f8f3ae00000" }, - "c5a48a8500f9b4e22f0eb16c6f4649687674267d": { - "balance": "812721000000000000000" + "0xc5a48a8500f9b4e22f0eb16c6f4649687674267d": { + "balance": "0x2c0ec50385043e8000" }, - "8cb3aa3fcd212854d7578fcc30fdede6742a312a": { - "balance": "300000000000000000000" + "0x8cb3aa3fcd212854d7578fcc30fdede6742a312a": { + "balance": "0x1043561a8829300000" }, - "90d2809ae1d1ffd8f63eda01de49dd552df3d1bc": { - "balance": "3998000000000000000000" + "0x90d2809ae1d1ffd8f63eda01de49dd552df3d1bc": { + "balance": "0xd8bb6549b02bb80000" }, - "96a55f00dff405dc4de5e58c57f6f6f0cac55d2f": { - "balance": "1962711000000000000000" + "0x96a55f00dff405dc4de5e58c57f6f6f0cac55d2f": { + "balance": "0x6a6616379c87b58000" }, - "ae842e81858ecfedf6506c686dc204ac15bf8b24": { - "balance": "40000000000000000000" + "0xae842e81858ecfedf6506c686dc204ac15bf8b24": { + "balance": "0x22b1c8c1227a00000" }, - "0be6a09e4307fe48d412b8d1a1a8284dce486261": { - "balance": "19180000000000000000000" + "0x0be6a09e4307fe48d412b8d1a1a8284dce486261": { + "balance": "0x40fbff85c0138300000" }, - "c9c7ac0bdd9342b5ead4360923f68c72a6ba633a": { - "balance": "500000000000000000000" + "0xc9c7ac0bdd9342b5ead4360923f68c72a6ba633a": { + "balance": "0x1b1ae4d6e2ef500000" }, - "ea8f30b6e4c5e65290fb9864259bc5990fa8ee8a": { - "balance": "20000000000000000000" + "0xea8f30b6e4c5e65290fb9864259bc5990fa8ee8a": { + "balance": "0x1158e460913d00000" }, - "74d37a51747bf8b771bfbf43943933d100d21483": { - "balance": "1000000000000000000000" + "0x74d37a51747bf8b771bfbf43943933d100d21483": { + "balance": "0x3635c9adc5dea00000" }, - "1a04d5389eb006f9ce880c30d15353f8d11c4b31": { - "balance": "17072800000000000000000" + "0x1a04d5389eb006f9ce880c30d15353f8d11c4b31": { + "balance": "0x39d84b2186dc9100000" }, - "726a14c90e3f84144c765cffacba3e0df11b48be": { - "balance": "10000000000000000000000" + "0x726a14c90e3f84144c765cffacba3e0df11b48be": { + "balance": "0x21e19e0c9bab2400000" }, - "86b7bd563ceab686f96244f9ddc02ad7b0b14bc2": { - "balance": "10000000000000000000000" + "0x86b7bd563ceab686f96244f9ddc02ad7b0b14bc2": { + "balance": "0x21e19e0c9bab2400000" }, - "2bbe672a1857508f630f2a5edb563d9e9de92815": { - "balance": "2000000000000000000000" + "0x2bbe672a1857508f630f2a5edb563d9e9de92815": { + "balance": "0x6c6b935b8bbd400000" }, - "a17070c2e9c5a940a4ec0e4954c4d7d643be8f49": { - "balance": "1999965000000000000000" + "0xa17070c2e9c5a940a4ec0e4954c4d7d643be8f49": { + "balance": "0x6c6b17033b361c8000" }, - "f2d1b7357724ec4c03185b879b63f57e26589153": { - "balance": "6000000000000000000000" + "0xf2d1b7357724ec4c03185b879b63f57e26589153": { + "balance": "0x14542ba12a337c00000" }, - "d6a7ac4de7b510f0e8de519d973fa4c01ba83400": { - "balance": "1880000000000000000000" + "0xd6a7ac4de7b510f0e8de519d973fa4c01ba83400": { + "balance": "0x65ea3db75546600000" }, - "593b45a1864ac5c7e8f0caaeba0d873cd5d113b2": { - "balance": "6000000000000000000000" + "0x593b45a1864ac5c7e8f0caaeba0d873cd5d113b2": { + "balance": "0x14542ba12a337c00000" }, - "0837539b5f6a522a482cdcd3a9bb7043af39bdd2": { - "balance": "6000000000000000000000" + "0x0837539b5f6a522a482cdcd3a9bb7043af39bdd2": { + "balance": "0x14542ba12a337c00000" }, - "b927abd2d28aaaa24db31778d27419df8e1b04bb": { - "balance": "27531000000000000000" + "0xb927abd2d28aaaa24db31778d27419df8e1b04bb": { + "balance": "0x17e11c2a26f478000" }, - "b2e085fddd1468ba07415b274e734e11237fb2a9": { - "balance": "100000000000000000000" + "0xb2e085fddd1468ba07415b274e734e11237fb2a9": { + "balance": "0x56bc75e2d63100000" }, - "970938522afb5e8f994873c9fbdc26e3b37e314c": { - "balance": "1000000000000000000000" + "0x970938522afb5e8f994873c9fbdc26e3b37e314c": { + "balance": "0x3635c9adc5dea00000" }, - "f3de5f26ef6aded6f06d3b911346ee70401da4a0": { - "balance": "354718000000000000000" + "0xf3de5f26ef6aded6f06d3b911346ee70401da4a0": { + "balance": "0x133ab37d9f9d030000" }, - "bffb6929241f788693273e7022e60e3eab1fe84f": { - "balance": "2000000000000000000000" + "0xbffb6929241f788693273e7022e60e3eab1fe84f": { + "balance": "0x6c6b935b8bbd400000" }, - "b56ad2aec6c8c3f19e1515bbb7dd91285256b639": { - "balance": "1000000000000000000000" + "0xb56ad2aec6c8c3f19e1515bbb7dd91285256b639": { + "balance": "0x3635c9adc5dea00000" }, - "47730f5f8ebf89ac72ef80e46c12195038ecdc49": { - "balance": "3160000000000000000000" + "0x47730f5f8ebf89ac72ef80e46c12195038ecdc49": { + "balance": "0xab4dcf399a3a600000" }, - "f39a9d7aa3581df07ee4279ae6c312ef21033658": { - "balance": "4000000000000000000000" + "0xf39a9d7aa3581df07ee4279ae6c312ef21033658": { + "balance": "0xd8d726b7177a800000" }, - "36227cdfa0fd3b9d7e6a744685f5be9aa366a7f0": { - "balance": "198479000000000000000" + "0x36227cdfa0fd3b9d7e6a744685f5be9aa366a7f0": { + "balance": "0xac2730ee9c6c18000" }, - "89e3b59a15864737d493c1d23cc53dbf8dcb1362": { - "balance": "4000000000000000000000" + "0x89e3b59a15864737d493c1d23cc53dbf8dcb1362": { + "balance": "0xd8d726b7177a800000" }, - "bd08e0cddec097db7901ea819a3d1fd9de8951a2": { - "balance": "20000000000000000000" + "0xbd08e0cddec097db7901ea819a3d1fd9de8951a2": { + "balance": "0x1158e460913d00000" }, - "533444584082eba654e1ad30e149735c6f7ba922": { - "balance": "1730000000000000000000" + "0x533444584082eba654e1ad30e149735c6f7ba922": { + "balance": "0x5dc892aa1131c80000" }, - "6a8a4317c45faa0554ccdb482548183e295a24b9": { - "balance": "1000000000000000000000" + "0x6a8a4317c45faa0554ccdb482548183e295a24b9": { + "balance": "0x3635c9adc5dea00000" }, - "22ce349159eeb144ef06ff2636588aef79f62832": { - "balance": "188000000000000000000" + "0x22ce349159eeb144ef06ff2636588aef79f62832": { + "balance": "0xa31062beeed700000" }, - "3cd1d9731bd548c1dd6fcea61beb75d91754f7d3": { - "balance": "5130285000000000000000" + "0x3cd1d9731bd548c1dd6fcea61beb75d91754f7d3": { + "balance": "0x1161d01b215cae48000" }, - "8b7056f6abf3b118d026e944d5c073433ca451d7": { - "balance": "999999000000000000000" + "0x8b7056f6abf3b118d026e944d5c073433ca451d7": { + "balance": "0x3635c6204739d98000" }, - "15f1b352110d68901d8f67aac46a6cfafe031477": { - "balance": "200000000000000000000" + "0x15f1b352110d68901d8f67aac46a6cfafe031477": { + "balance": "0xad78ebc5ac6200000" }, - "0f789e30397c53bf256fc364e6ef39f853504114": { - "balance": "3640000000000000000000" + "0x0f789e30397c53bf256fc364e6ef39f853504114": { + "balance": "0xc55325ca7415e00000" }, - "750bbb8c06bbbf240843cc75782ee02f08a97453": { - "balance": "835000000000000000000" + "0x750bbb8c06bbbf240843cc75782ee02f08a97453": { + "balance": "0x2d43f3ebfafb2c0000" }, - "fff7ac99c8e4feb60c9750054bdc14ce1857f181": { - "balance": "1000000000000000000000" + "0xfff7ac99c8e4feb60c9750054bdc14ce1857f181": { + "balance": "0x3635c9adc5dea00000" }, - "5c6f36af90ab1a656c6ec8c7d521512762bba3e1": { - "balance": "1999800000000000000000" + "0x5c6f36af90ab1a656c6ec8c7d521512762bba3e1": { + "balance": "0x6c68ccd09b022c0000" }, - "6811b54cd19663b11b94da1de2448285cd9f68d9": { - "balance": "1100000000000000000000" + "0x6811b54cd19663b11b94da1de2448285cd9f68d9": { + "balance": "0x3ba1910bf341b00000" }, - "6f50929777824c291a49c46dc854f379a6bea080": { - "balance": "360000000000000000000" + "0x6f50929777824c291a49c46dc854f379a6bea080": { + "balance": "0x138400eca364a00000" }, - "e83604e4ff6be7f96f6018d3ec3072ec525dff6b": { - "balance": "182000000000000000000" + "0xe83604e4ff6be7f96f6018d3ec3072ec525dff6b": { + "balance": "0x9ddc1e3b901180000" }, - "d731bb6b5f3c37395e09ceaccd14a918a6060789": { - "balance": "3940000000000000000000" + "0xd731bb6b5f3c37395e09ceaccd14a918a6060789": { + "balance": "0xd5967be4fc3f100000" }, - "372e453a6b629f27678cc8aeb5e57ce85ec0aef9": { - "balance": "200000000000000000000" + "0x372e453a6b629f27678cc8aeb5e57ce85ec0aef9": { + "balance": "0xad78ebc5ac6200000" }, - "86924fb211aad23cf5ce600e0aae806396444087": { - "balance": "10000000000000000000000" + "0x86924fb211aad23cf5ce600e0aae806396444087": { + "balance": "0x21e19e0c9bab2400000" }, - "18c6723a6753299cb914477d04a3bd218df8c775": { - "balance": "1000000000000000000000" + "0x18c6723a6753299cb914477d04a3bd218df8c775": { + "balance": "0x3635c9adc5dea00000" }, - "e00484788db50fc6a48e379d123e508b0f6e5ab1": { - "balance": "1000000000000000000000" + "0xe00484788db50fc6a48e379d123e508b0f6e5ab1": { + "balance": "0x3635c9adc5dea00000" }, - "150e3dbcbcfc84ccf89b73427763a565c23e60d0": { - "balance": "40000000000000000000" + "0x150e3dbcbcfc84ccf89b73427763a565c23e60d0": { + "balance": "0x22b1c8c1227a00000" }, - "8ffa062122ac307418821adb9311075a3703bfa3": { - "balance": "1000000000000000000000" + "0x8ffa062122ac307418821adb9311075a3703bfa3": { + "balance": "0x3635c9adc5dea00000" }, - "21206ce22ea480e85940d31314e0d64f4e4d3a04": { - "balance": "1000000000000000000000" + "0x21206ce22ea480e85940d31314e0d64f4e4d3a04": { + "balance": "0x3635c9adc5dea00000" }, - "ac024f594f9558f04943618eb0e6b2ee501dc272": { - "balance": "2000000000000000000000" + "0xac024f594f9558f04943618eb0e6b2ee501dc272": { + "balance": "0x6c6b935b8bbd400000" }, - "b2b7cdb4ff4b61d5b7ce0b2270bbb5269743ec04": { - "balance": "2000000000000000000000" + "0xb2b7cdb4ff4b61d5b7ce0b2270bbb5269743ec04": { + "balance": "0x6c6b935b8bbd400000" }, - "abc74706964960dfe0dca3dca79e9216056f1cf4": { - "balance": "40000000000000000000000" + "0xabc74706964960dfe0dca3dca79e9216056f1cf4": { + "balance": "0x878678326eac9000000" }, - "d7eb903162271c1afa35fe69e37322c8a4d29b11": { - "balance": "10000000000000000000000" + "0xd7eb903162271c1afa35fe69e37322c8a4d29b11": { + "balance": "0x21e19e0c9bab2400000" }, - "d7c6265dea11876c903b718e4cd8ab24fe265bde": { - "balance": "2000000000000000000000" + "0xd7c6265dea11876c903b718e4cd8ab24fe265bde": { + "balance": "0x6c6b935b8bbd400000" }, - "cba288cd3c1eb4d59ddb06a6421c14c345a47b24": { - "balance": "4000000000000000000000" + "0xcba288cd3c1eb4d59ddb06a6421c14c345a47b24": { + "balance": "0xd8d726b7177a800000" }, - "8c22426055b76f11f0a2de1a7f819a619685fe60": { - "balance": "1980000000000000000000" + "0x8c22426055b76f11f0a2de1a7f819a619685fe60": { + "balance": "0x6b56051582a9700000" }, - "f463a90cb3f13e1f0643423636beab84c123b06d": { - "balance": "40000000000000000000" + "0xf463a90cb3f13e1f0643423636beab84c123b06d": { + "balance": "0x22b1c8c1227a00000" }, - "2b5ced9987c0765f900e49cf9da2d9f9c1138855": { - "balance": "400000000000000000000" + "0x2b5ced9987c0765f900e49cf9da2d9f9c1138855": { + "balance": "0x15af1d78b58c400000" }, - "9bb760d5c289a3e1db18db095345ca413b9a43c2": { - "balance": "197000000000000000000" + "0x9bb760d5c289a3e1db18db095345ca413b9a43c2": { + "balance": "0xaadec983fcff40000" }, - "d66ab79294074c8b627d842dab41e17dd70c5de5": { - "balance": "1000000000000000000000" + "0xd66ab79294074c8b627d842dab41e17dd70c5de5": { + "balance": "0x3635c9adc5dea00000" }, - "0bdd58b96e7c916dd2fb30356f2aebfaaf1d8630": { - "balance": "2000000000000000000000" + "0x0bdd58b96e7c916dd2fb30356f2aebfaaf1d8630": { + "balance": "0x6c6b935b8bbd400000" }, - "d612597bc31743c78633f633f239b1e9426bd925": { - "balance": "76000000000000000000000" + "0xd612597bc31743c78633f633f239b1e9426bd925": { + "balance": "0x1017f7df96be17800000" }, - "140518a3194bad1350b8949e650565debe6db315": { - "balance": "2000000000000000000000" + "0x140518a3194bad1350b8949e650565debe6db315": { + "balance": "0x6c6b935b8bbd400000" }, - "daedd4ad107b271e89486cbf80ebd621dd974578": { - "balance": "2000000000000000000000" + "0xdaedd4ad107b271e89486cbf80ebd621dd974578": { + "balance": "0x6c6b935b8bbd400000" }, - "c36c0b63bfd75c2f8efb060883d868cccd6cbdb4": { - "balance": "3000000000000000000000" + "0xc36c0b63bfd75c2f8efb060883d868cccd6cbdb4": { + "balance": "0xa2a15d09519be00000" }, - "e646665872e40b0d7aa2ff82729caaba5bc3e89e": { - "balance": "400000000000000000000" + "0xe646665872e40b0d7aa2ff82729caaba5bc3e89e": { + "balance": "0x15af1d78b58c400000" }, - "b5fb7ea2ddc1598b667a9d57dd39e85a38f35d56": { - "balance": "500000000000000000000" + "0xb5fb7ea2ddc1598b667a9d57dd39e85a38f35d56": { + "balance": "0x1b1ae4d6e2ef500000" }, - "e51421f8ee2210c71ed870fe618276c8954afbe9": { - "balance": "1337000000000000000000" + "0xe51421f8ee2210c71ed870fe618276c8954afbe9": { + "balance": "0x487a9a304539440000" }, - "08a9a44e1f41de3dbba7a363a3ab412c124cd15e": { - "balance": "200000000000000000000" + "0x08a9a44e1f41de3dbba7a363a3ab412c124cd15e": { + "balance": "0xad78ebc5ac6200000" }, - "562bced38ab2ab6c080f3b0541b8456e70824b3f": { - "balance": "641760000000000000000" + "0x562bced38ab2ab6c080f3b0541b8456e70824b3f": { + "balance": "0x22ca3587cf4eb00000" }, - "1e484d0621f0f5331b35d5408d9aae4eb1acf21e": { - "balance": "20000000000000000000" + "0x1e484d0621f0f5331b35d5408d9aae4eb1acf21e": { + "balance": "0x1158e460913d00000" }, - "3a476bd2c9e664c63ab266aa4c6e4a4825f516c3": { - "balance": "200000000000000000000" + "0x3a476bd2c9e664c63ab266aa4c6e4a4825f516c3": { + "balance": "0xad78ebc5ac6200000" }, - "8d6df209484d7b94702b03a53e56b9fb0660f6f0": { - "balance": "2000000000000000000000" + "0x8d6df209484d7b94702b03a53e56b9fb0660f6f0": { + "balance": "0x6c6b935b8bbd400000" }, - "5970fb1b144dd751e4ce2eca7caa20e363dc4da3": { - "balance": "10000000000000000000000" + "0x5970fb1b144dd751e4ce2eca7caa20e363dc4da3": { + "balance": "0x21e19e0c9bab2400000" }, - "d1dd79fb158160e5b4e8e23f312e6a907fbc4d4e": { - "balance": "500000000000000000000" + "0xd1dd79fb158160e5b4e8e23f312e6a907fbc4d4e": { + "balance": "0x1b1ae4d6e2ef500000" }, - "7ee5ca805dce23af89c2d444e7e40766c54c7404": { - "balance": "240660000000000000000" + "0x7ee5ca805dce23af89c2d444e7e40766c54c7404": { + "balance": "0xd0bd412edbd820000" }, - "93e0f37ecdfb0086e3e862a97034447b1e4dec1a": { - "balance": "30000000000000000000" + "0x93e0f37ecdfb0086e3e862a97034447b1e4dec1a": { + "balance": "0x1a055690d9db80000" }, - "e10ac19c546fc2547c61c139f5d1f45a6666d5b0": { - "balance": "4775000000000000000000" + "0xe10ac19c546fc2547c61c139f5d1f45a6666d5b0": { + "balance": "0x102da6fd0f73a3c0000" }, - "1c73d00b6e25d8eb9c1ff4ad827b6b9e9cf6d20c": { - "balance": "200000000000000000000" + "0x1c73d00b6e25d8eb9c1ff4ad827b6b9e9cf6d20c": { + "balance": "0xad78ebc5ac6200000" }, - "d771d9e0ca8a08a113775731434eb3270599c40d": { - "balance": "20000000000000000000" + "0xd771d9e0ca8a08a113775731434eb3270599c40d": { + "balance": "0x1158e460913d00000" }, - "e69d1c378b771e0feff051db69d966ac6779f4ed": { - "balance": "553000000000000000000" + "0xe69d1c378b771e0feff051db69d966ac6779f4ed": { + "balance": "0x1dfa6aaa1497040000" }, - "0ef85b49d08a75198692914eddb4b22cf5fa4450": { - "balance": "2004800000000000000000" + "0x0ef85b49d08a75198692914eddb4b22cf5fa4450": { + "balance": "0x6cae30621d47200000" }, - "ed70a37cdd1cbda9746d939658ae2a6181288578": { - "balance": "9600000000000000000000" + "0xed70a37cdd1cbda9746d939658ae2a6181288578": { + "balance": "0x2086ac3510526000000" }, - "eee761847e33fd61d99387ee14628694d1bfd525": { - "balance": "2000000000000000000000" + "0xeee761847e33fd61d99387ee14628694d1bfd525": { + "balance": "0x6c6b935b8bbd400000" }, - "271d3d481cb88e7671ad216949b6365e06303de0": { - "balance": "4000000000000000000000" + "0x271d3d481cb88e7671ad216949b6365e06303de0": { + "balance": "0xd8d726b7177a800000" }, - "5255dc69155a45b970c604d30047e2f530690e7f": { - "balance": "20000000000000000000" + "0x5255dc69155a45b970c604d30047e2f530690e7f": { + "balance": "0x1158e460913d00000" }, - "cabab6274ed15089737e287be878b757934864e2": { - "balance": "20000000000000000000000" + "0xcabab6274ed15089737e287be878b757934864e2": { + "balance": "0x43c33c1937564800000" }, - "9defe56a0ff1a1947dba0923f7dd258d8f12fa45": { - "balance": "26880000000000000000000" + "0x9defe56a0ff1a1947dba0923f7dd258d8f12fa45": { + "balance": "0x5b12aefafa804000000" }, - "b7a2c103728b7305b5ae6e961c94ee99c9fe8e2b": { - "balance": "50000000000000000000000" + "0xb7a2c103728b7305b5ae6e961c94ee99c9fe8e2b": { + "balance": "0xa968163f0a57b400000" }, - "b498bb0f520005b6216a4425b75aa9adc52d622b": { - "balance": "4000000000000000000000" + "0xb498bb0f520005b6216a4425b75aa9adc52d622b": { + "balance": "0xd8d726b7177a800000" }, - "c1132878235c5ddba5d9f3228b5236e47020dc6f": { - "balance": "1000000000000000000000" + "0xc1132878235c5ddba5d9f3228b5236e47020dc6f": { + "balance": "0x3635c9adc5dea00000" }, - "f81622e55757daea6675975dd93538da7d16991e": { - "balance": "2000000000000000000000" + "0xf81622e55757daea6675975dd93538da7d16991e": { + "balance": "0x6c6b935b8bbd400000" }, - "ce2deab51c0a9ae09cd212c4fa4cc52b53cc0dec": { - "balance": "2000000000000000000000" + "0xce2deab51c0a9ae09cd212c4fa4cc52b53cc0dec": { + "balance": "0x6c6b935b8bbd400000" }, - "86a1eadeeb30461345d9ef6bd05216fa247c0d0c": { - "balance": "2000000000000000000000" + "0x86a1eadeeb30461345d9ef6bd05216fa247c0d0c": { + "balance": "0x6c6b935b8bbd400000" }, - "7b1fe1ab4dfd0088cdd7f60163ef59ec2aee06f5": { - "balance": "2000000000000000000000" + "0x7b1fe1ab4dfd0088cdd7f60163ef59ec2aee06f5": { + "balance": "0x6c6b935b8bbd400000" }, - "6bbc3f358a668dd1a11f0380f3f73108426abd4a": { - "balance": "4000000000000000000000" + "0x6bbc3f358a668dd1a11f0380f3f73108426abd4a": { + "balance": "0xd8d726b7177a800000" }, - "b1e6e810c24ab0488de9e01e574837829f7c77d0": { - "balance": "400000000000000000000" + "0xb1e6e810c24ab0488de9e01e574837829f7c77d0": { + "balance": "0x15af1d78b58c400000" }, - "03eb3cb860f6028da554d344a2bb5a500ae8b86f": { - "balance": "2000000000000000000000" + "0x03eb3cb860f6028da554d344a2bb5a500ae8b86f": { + "balance": "0x6c6b935b8bbd400000" }, - "e5481a7fed42b901bbed20789bd4ade50d5f83b9": { - "balance": "2000000000000000000000" + "0xe5481a7fed42b901bbed20789bd4ade50d5f83b9": { + "balance": "0x6c6b935b8bbd400000" }, - "1f3da68fe87eaf43a829ab6d7ec5a6e009b204fb": { - "balance": "554988000000000000000" + "0x1f3da68fe87eaf43a829ab6d7ec5a6e009b204fb": { + "balance": "0x1e1601758c2c7e0000" }, - "30037988702671acbe892c03fe5788aa98af287a": { - "balance": "2800000000000000000000" + "0x30037988702671acbe892c03fe5788aa98af287a": { + "balance": "0x97c9ce4cf6d5c00000" }, - "edb473353979a206879de144c10a3c51d7d7081a": { - "balance": "6000000000000000000000" + "0xedb473353979a206879de144c10a3c51d7d7081a": { + "balance": "0x14542ba12a337c00000" }, - "22bdffc240a88ff7431af3bff50e14da37d5183e": { - "balance": "1000000000000000000000" + "0x22bdffc240a88ff7431af3bff50e14da37d5183e": { + "balance": "0x3635c9adc5dea00000" }, - "9374869d4a9911ee1eaf558bc4c2b63ec63acfdd": { - "balance": "1000000000000000000000" + "0x9374869d4a9911ee1eaf558bc4c2b63ec63acfdd": { + "balance": "0x3635c9adc5dea00000" }, - "b756ad52f3bf74a7d24c67471e0887436936504c": { - "balance": "20000000000000000000000" + "0xb756ad52f3bf74a7d24c67471e0887436936504c": { + "balance": "0x43c33c1937564800000" }, - "8bd0b65a50ef5cef84fec420be7b89ed1470ceb9": { - "balance": "11999000000000000000000" + "0x8bd0b65a50ef5cef84fec420be7b89ed1470ceb9": { + "balance": "0x28a77936e92c81c0000" }, - "af26f7c6bf453e2078f08953e4b28004a2c1e209": { - "balance": "100000000000000000000" + "0xaf26f7c6bf453e2078f08953e4b28004a2c1e209": { + "balance": "0x56bc75e2d63100000" }, - "7c532db9e0c06c26fd40acc56ac55c1ee92d3c3a": { - "balance": "300000000000000000000000" + "0x7c532db9e0c06c26fd40acc56ac55c1ee92d3c3a": { + "balance": "0x3f870857a3e0e3800000" }, - "dde670d01639667576a22dd05d3246d61f06e083": { - "balance": "26740000000000000000" + "0xdde670d01639667576a22dd05d3246d61f06e083": { + "balance": "0x1731790534df20000" }, - "5cf44e10540d65716423b1bcb542d21ff83a94cd": { - "balance": "10000000000000000000000" + "0x5cf44e10540d65716423b1bcb542d21ff83a94cd": { + "balance": "0x21e19e0c9bab2400000" }, - "f96b4c00766f53736a8574f822e6474c2f21da2d": { - "balance": "400000000000000000000" + "0xf96b4c00766f53736a8574f822e6474c2f21da2d": { + "balance": "0x15af1d78b58c400000" }, - "8d89170b92b2be2c08d57c48a7b190a2f146720f": { - "balance": "19700000000000000000000" + "0x8d89170b92b2be2c08d57c48a7b190a2f146720f": { + "balance": "0x42bf06b78ed3b500000" }, - "142b87c5043ffb5a91df18c2e109ced6fe4a71db": { - "balance": "200000000000000000000" + "0x142b87c5043ffb5a91df18c2e109ced6fe4a71db": { + "balance": "0xad78ebc5ac6200000" }, - "42d34940edd2e7005d46e2188e4cfece8311d74d": { - "balance": "158000000000000000000" + "0x42d34940edd2e7005d46e2188e4cfece8311d74d": { + "balance": "0x890b0c2e14fb80000" }, - "562105e82b099735de49f62692cc87cd38a8edcd": { - "balance": "6000000000000000000000" + "0x562105e82b099735de49f62692cc87cd38a8edcd": { + "balance": "0x14542ba12a337c00000" }, - "457bcef37dd3d60b2dd019e3fe61d46b3f1e7252": { - "balance": "20000000000000000000" + "0x457bcef37dd3d60b2dd019e3fe61d46b3f1e7252": { + "balance": "0x1158e460913d00000" }, - "cf8882359c0fb23387f5674074d8b17ade512f98": { - "balance": "6000000000000000000000" + "0xcf8882359c0fb23387f5674074d8b17ade512f98": { + "balance": "0x14542ba12a337c00000" }, - "f0c081da52a9ae36642adf5e08205f05c54168a6": { - "balance": "111000000000000000000" + "0xf0c081da52a9ae36642adf5e08205f05c54168a6": { + "balance": "0x6046f37e5945c0000" }, - "551e7784778ef8e048e495df49f2614f84a4f1dc": { - "balance": "600000000000000000000" + "0x551e7784778ef8e048e495df49f2614f84a4f1dc": { + "balance": "0x2086ac351052600000" }, - "3c869c09696523ced824a070414605bb76231ff2": { - "balance": "1000000000000000000000" + "0x3c869c09696523ced824a070414605bb76231ff2": { + "balance": "0x3635c9adc5dea00000" }, - "7e7f18a02eccaa5d61ab8fbf030343c434a25ef7": { - "balance": "66850000000000000000" + "0x7e7f18a02eccaa5d61ab8fbf030343c434a25ef7": { + "balance": "0x39fbae8d042dd0000" }, - "9328d55ccb3fce531f199382339f0e576ee840a3": { - "balance": "4000000000000000000000" + "0x9328d55ccb3fce531f199382339f0e576ee840a3": { + "balance": "0xd8d726b7177a800000" }, - "9d0f347e826b7dceaad279060a35c0061ecf334b": { - "balance": "4000000000000000000000" + "0x9d0f347e826b7dceaad279060a35c0061ecf334b": { + "balance": "0xd8d726b7177a800000" }, - "680640838bd07a447b168d6d923b90cf6c43cdca": { - "balance": "1730000000000000000000" + "0x680640838bd07a447b168d6d923b90cf6c43cdca": { + "balance": "0x5dc892aa1131c80000" }, - "c951900c341abbb3bafbf7ee2029377071dbc36a": { - "balance": "327600000000000000000" + "0xc951900c341abbb3bafbf7ee2029377071dbc36a": { + "balance": "0x11c25d004d01f80000" }, - "ddf5810a0eb2fb2e32323bb2c99509ab320f24ac": { - "balance": "17900000000000000000000" + "0xddf5810a0eb2fb2e32323bb2c99509ab320f24ac": { + "balance": "0x3ca5c66d9bc44300000" }, - "2489ac126934d4d6a94df08743da7b7691e9798e": { - "balance": "1000000000000000000000" + "0x2489ac126934d4d6a94df08743da7b7691e9798e": { + "balance": "0x3635c9adc5dea00000" }, - "f42f905231c770f0a406f2b768877fb49eee0f21": { - "balance": "197000000000000000000" + "0xf42f905231c770f0a406f2b768877fb49eee0f21": { + "balance": "0xaadec983fcff40000" }, - "756f45e3fa69347a9a973a725e3c98bc4db0b5a0": { - "balance": "200000000000000000000" + "0x756f45e3fa69347a9a973a725e3c98bc4db0b5a0": { + "balance": "0xad78ebc5ac6200000" } } } diff --git a/ethcore/res/ethereum/kovan.json b/ethcore/res/ethereum/kovan.json index 532bc88d6a1..ac86ebe7aa1 100644 --- a/ethcore/res/ethereum/kovan.json +++ b/ethcore/res/ethereum/kovan.json @@ -1,12 +1,12 @@ { - "name": "Kovan", + "name": "Kovan Testnet", "dataDir": "kovan", "engine": { "authorityRound": { "params": { - "stepDuration": "4", + "stepDuration": "0x4", "blockReward": "0x4563918244F40000", - "validators" : { + "validators": { "list": [ "0x00D6Cc1BA9cf89BD2e58009741f4F7325BAdc0ED", "0x00427feae2419c15b89d1c21af10d1b6650a4d3d", @@ -19,38 +19,39 @@ "0x00a0a24b9f0e5ec7aa4c7389b8302fd0123194de" ] }, - "validateScoreTransition": 4301764, - "validateStepTransition": 1500000, - "maximumUncleCountTransition": 5067000, - "maximumUncleCount": 0 + "validateScoreTransition": "0x41a3c4", + "validateStepTransition": "0x16e360", + "maximumUncleCountTransition": "0x4d50f8", + "maximumUncleCount": "0x0" } } }, "params": { "gasLimitBoundDivisor": "0x400", - "registrar" : "0xfAb104398BBefbd47752E7702D9fE23047E1Bca3", + "registrar": "0xfAb104398BBefbd47752E7702D9fE23047E1Bca3", "maximumExtraDataSize": "0x20", "minGasLimit": "0x1388", - "networkID" : "0x2A", - "forkBlock": 4297256, - "forkCanonHash": "0x0a66d93c2f727dca618fabaf70c39b37018c73d78b939d8b11efbbd09034778f", - "eip155Transition": 1000000, - "maxCodeSize": 24576, - "maxCodeSizeTransition": 6600000, - "validateChainIdTransition": 1000000, - "validateReceiptsTransition" : 1000000, - "eip98Transition": 0, - "eip140Transition": 5067000, - "eip211Transition": 5067000, - "eip214Transition": 5067000, - "eip658Transition": 5067000, - "wasmActivationTransition": 6600000, - "eip145Transition": 9200000, - "eip1014Transition": 9200000, - "eip1052Transition": 9200000, - "eip1283Transition": 9200000, - "kip4Transition": 9200000, - "kip6Transition": 9200000 + "networkID": "0x2A", + "forkBlock": "0x9766dc", + "forkCanonHash": "0xf2fa4bcc417ad374100c2035aa865ff60fb568a83db1b6f6cb8fb52cfebc28b5", + "eip155Transition": "0xf4240", + "maxCodeSize": "0x6000", + "maxCodeSizeTransition": "0x64b540", + "validateChainIdTransition": "0xf4240", + "validateReceiptsTransition": "0xf4240", + "eip98Transition": "0x0", + "eip140Transition": "0x4d50f8", + "eip211Transition": "0x4d50f8", + "eip214Transition": "0x4d50f8", + "eip658Transition": "0x4d50f8", + "wasmActivationTransition": "0x64b540", + "eip145Transition": "0x8c6180", + "eip1014Transition": "0x8c6180", + "eip1052Transition": "0x8c6180", + "eip1283Transition": "0x8c6180", + "eip1283DisableTransition": "0x9c7b61", + "kip4Transition": "0x8c6180", + "kip6Transition": "0x8c6180" }, "genesis": { "seal": { @@ -63,8 +64,8 @@ "gasLimit": "0x5B8D80" }, "hardcodedSync": { - "header": "f90247a0434ba1ebe3bc9d9d12886f616afee0eb785dd00d78aa64502045b249c8a3cc33a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940010f94b296a852aaac52ea6c5ac72e03afd032da0d1c1137be913218840c44bdb8f5709a59d8608b05be0dc2401402e11ff1bf2ada0eb50a864e57e19bd4c8499725a6a3841f706ff5d743e64f1d06db903aca62eaba0d4d77727f7253c109e6f048fa5b1583b6c2911ad77f7d59d8947d38a96a67729b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090fffffffffffffffffffffffffffffffe838ee001837a120083013502845bea4f689fde830200088f5061726974792d457468657265756d86312e32392e30826c698416fa93dab841c80b3e34bacdc91e01f6a76c64a920a65edfea86b84e0fd59c6d8dbd7758f2dc4e3cb446de8dc07f3d8cb71375a6315f401cd1ce54c56694e4e01f7e774555e701", - "totalDifficulty": "3135776192732436705400032023148164213445066062", + "header": "f90247a03dc1f4ed47c057717131ce81535d06194d990be6969334e9b8034e0c875f9dffa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940010f94b296a852aaac52ea6c5ac72e03afd032da0fd1833e970c207ca16e1e74d937c9d8e01a1f719643fb25963028427295fc2cca00d9d5e376ebe3558b412402702d34a93256bb03a61df9f17ae234f0a70f95b20a0129c38f28acd251820f96305d217511a725a1fae1a434d77034bd7efef1f9f5ab901000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000080000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000090fffffffffffffffffffffffffffffffa839f3801837a1200834bb5f3845c7361249fde8302020a8f5061726974792d457468657265756d86312e33322e30826c6984171cd849b841d077cf579661ac8634ee865b5cc67918223aed686d6ba189624a6f6c0dfc5249418b25423e30e072a79d5377e01845d5234ff5e0b9b0207b1bf2515f805b47e300", + "totalDifficulty": "3500253997070921577369506418666760871805116639", "CHTs": [ "0xdb9557458495268ddd69409fc1f66631ed5ff9bf6c479be6eabe5d83a460acac", "0xd413800c22172be6e0b7a36348c90098955991f119ddad32c5b928e8db4deb02", @@ -4637,25 +4638,637 @@ "0x8b4f8964062d0f00e40a41d21852a2e22abba1f4cf75f594797e368e4df21f7d", "0x916993123d91b181d145e2668efed6eae3845fd76d4765df3a04d8adde8c7142", "0x21b91051b5c5fbd22164a655de8485cfc2a9eff58ed09d6fbbb454560898daed", - "0xb52ca76065bcf43f06335977ab87d6c809dcf4e6cdfc452ac2018b77c64089a5" + "0xb52ca76065bcf43f06335977ab87d6c809dcf4e6cdfc452ac2018b77c64089a5", + "0x9437d47e7f7fb4c95aacd5e1322a9c7b457888dbfb1e485142cb16ba805b5ded", + "0xb7cb3f7394fef7de5884e165c8441d441c98c1080865b604dd21766759f7fffa", + "0xfaff33c1aae8882f3a9d84678b55b8945b037b1f05785f2874079da71caf4aa5", + "0xe032d77db9e882bfb3d5adc89d9a9812fb9775f98c03765ffdf0c40d0dbf11f8", + "0xc9c4ded5821040df911b23d92d8270fc83164531c9d631c4d8e228a71e189ba1", + "0xa27f4dd47059fdd4afe78ce8c9029c9a7c0916d10cc7dba1ce011c886d2275bb", + "0x6dd0d3b0e07535d8350cb888c75ca355c4abb07bfc6ceba3eae02095324679a0", + "0xee4a3c6125a5e69848457d35f9614705b651c68857b03968bc5420a809d1d9b8", + "0xc14947239d0a7061d796313aca233659059b13740e63f967f8bd4806feb895ff", + "0x36d9ad9d6ad2e1a1aca489524303aaa8534b137c5e9ef708d589b7a75cbf6500", + "0x497c4cf7509b12ebd34d5c0520a24ae1b6e1c5c050bb3412d7d1a702c48d07d3", + "0xac81f9bcce95283b7f188f16eb68d22adb22dc1cff0853739c46f27523a653b7", + "0x2f0818ee594d2d1fbfe9a6a03cf4ae08dee69fbb9c289c2789d792f14a3e4e7d", + "0x9beb888d86489512a9d1d8d6461490e23599c1595aa5b4d4b113d18c0eb99697", + "0x7708aa2a88f9b41cde9f338da6d2f9dde2b57f1538f7aeefb66a0e9dce488ff3", + "0x548a59ae0782fc5202431a472a8dc5e21ac83b68dc88afb2b0afd56cd3e880dc", + "0x271397f861034f73fe228e3921d835a313041c260a6c2ca3d0c28d407d17ba89", + "0x732b95d3ebdf035182863a540bc002cef70f98b91f90ee8dcef2285a970ade6b", + "0x605d419ecbcdaa05d6f09c9734469847f52164df26417d7807f959986b843869", + "0xdc56e2800a637475662632ac37e9eec90d9f3962a454d6f32ee7f56426ab9f42", + "0xdcd35988aa6982f14b3a2834f841c755ad42dcc61eb0dc6122f2aa9db65fcf92", + "0x659b06e2aa0359e3743f59d2b128cf85bfabc20ac9d8c42a89d9cdda2bef7697", + "0x45377222c3910f95b3f5d0adef823dc4184189cab9eed54b9997d2b30fdbae43", + "0x15d66d0b9347f12bf9c408910edf41623f460244f309076d55cf969dc158b36e", + "0xe5de2158113351c0ea314eb12b28f9502c307decf883ed480c53c1310c9f7c11", + "0xc7342c08dd73fbe5801cc6c8764c53f924d6a77cd5a5b8bdbb22d2b6d3e0336e", + "0xf10486dc44a10f7eec6739dd56e0f7519507777e78e3974d974ee0bd931f03d0", + "0x5985752f0b3849e9cc6a5d38b65617be10b52b8fd0c2642c328b864d59a23f9f", + "0xce899213bc8a178cbf2a8eb86f045f59895530b0af5e209b60553869000070f4", + "0x724dd7b5e5d0e93017a62faffd534e423610c494ef0b5689304bc80a68df0e46", + "0x318073daf925850c412d6a1f2db2d2093268896a88c49e822ccae4070b406408", + "0x74fd03921ea801d4618fa7c2375c4369a15c7774564dfb0373b5913bdc9a6df8", + "0xb10896436461c2660cfe36a60c433b32ef8a1e772f3f9c16ae243840a1aa3aa8", + "0xecfc10478a368b186e4299447ec9d3ce27ca8386274c545f3edac3608ad6cd0d", + "0x288c697b29a0d2c5d45b9507aaf62bc4bfecca1b34e1a5ce13a17711af0df3cd", + "0x429fc79b89ad00887096417282a571de77fe73dbfd1564c13bec5830b38890cd", + "0x4d859982815d597e31d0e5374d7077b59a4b9beec01040608bad05c6a9d0be2a", + "0x1addc6e300b6120cd196bcb7340ca163879ac55f7c9069be77947aa01e778cf9", + "0x2e648a4eefda9d35e26b148028a0b336ef7d75809454e36795edb9d3fdeff550", + "0x814e65df8c720e8c9c7d64c76b6b9554328d6c780b5f3dff96aa3e29506e7e49", + "0x4841c38f2a920bb1a072b9a7853dd7d2e44dcbc35e2737aa2f3cf6652dabfdd2", + "0xdc63afe7974211db82b2602c26d6ace8d93f34736c0fa68eac3bd5d2c1af7484", + "0x2052d12d3534c5d7693d420c8e080bcee99ce10ccebc7451272b7ef08f8a3dc2", + "0x4985769df508ccc2add583d187095a8af4ca73a5be2506a506146e23dbc67d55", + "0x4a6744d48fc2d85cc99e419483ec1111ccb6fc7ab13e4eba28a29269acb30952", + "0x527b0514dd83336c0524add1f01799512517378b2045c4ed43ccc0e977553bac", + "0xfc33e6a20033fff41a9b885dc5bbaa848a0f244fe89b4a1af261d382c544fbaa", + "0xadce691a1b4224bd56682784ec106dc93af89185721db8b427eab6b0ff22776c", + "0x0fdef2a9525541c1e96172c8a33ccc08ed759dc024d437b82126ff03b65e1684", + "0x7aa9e8c1e9da3c68080f099281b367de26838ec7bcd474590ae101fcd68a7116", + "0x7eb70f0a4c42726f5b3a67ab12bdf5b4e6bf5e4c347b6c32f6fd3a04c4a003e5", + "0x546f5f3c2e44b7a61d6d0dafd802fcc114db7acb7f887f0dd0b1878979fd3eac", + "0x5c5294fd77081b1a23037c34170b568358011be2fdc0e3ffa2230b1a017ec5b9", + "0x6c854d3de1f2a28dd8f6320a534b915b032078377e3b880eaa8e9a3775768e2c", + "0xc2be1a4c7a5351063084c5907f19e63f25e048f3e27648a6d9056d3d4b635c19", + "0x5d0673ecaecd00cc8847827bbda1dd7bb21f537e5e10f10d8b5944496b55e9e6", + "0x8a1bfbf9dd51b727c17e8920019caae599f53d37563935c584c84cbdebf942e2", + "0x75649056bcd2a520811d8f9d5c0c629f492e93fcdcd298c0657a8c857fdf2cc6", + "0x71421a3eb42eeba485fb90918511b0a430311856c27a968e52096c6cdaf0cce1", + "0xdf19c2d595ec81bacaabd39217e100e6731f8bd7c3d6c5bfd987b27f89be146d", + "0x573839677ae138670609c499107217fcae5de5fa9905c78a21b07f7a906a0a53", + "0x1e8db73865049c1cde4004c2a60945edd9ce9847c360a2feb36205e1f1cbd5da", + "0x52a602e7c2f462a39288465c733d2133b7f77a7a77d7e60e214d4d4eff917258", + "0xdc30b1767c78f2ac953c5046e6440b7de488933cdece18fa3566f00d8a96c92f", + "0xfc0baf76004e7d87b36ea52de7d886c9b3be44bb8063549bba31b63b87ac3f92", + "0x3426c56db720ccd184f2e49385e96e5a37fd378cd486de8fadcc7d5e727aebb8", + "0x39fc1cbf20cab093c75b42931fc6371e9851cc4357badb6961359e07b9d97fca", + "0x6b3725ada81d881bbe245d4b55c7be12926b42d0e58dfc8fa38d54f68ff79ee4", + "0x69bbab0d123bbf03499984698c162f9dfb81375f6bf9f2e643badcc8e0281ef8", + "0x101cf365b31d4b37910433ffa265e1a978d4f80c478936809e1bcca7baff59b1", + "0x65d26a27a34ca4ca98c2b5f609e4596344514698f2137547e815dfcf91f5bb36", + "0x3b8598589a6ef43efe0b7a64832360ab02e150c4b4ec02f2a028d2522f4c0ba7", + "0xd8776563bb522b42a25cb2714f9ea294fffa4c4fb5ad040a9458e10637861f34", + "0xb1b85b8c9bea99a2bde16ab99b2d7e42571ba15dfeaf28a2897322bb444171b1", + "0x803cc4e5c23bd3842736b36a425364416dc69a3efb95f3c7fdbf7782d6de7edc", + "0xf5803ed2a130a19600ca887ad06813482b678ac0eee049cbb2e56e39a90d9867", + "0xd3f6125b061023531cbd3d625c9382631e2fecc75945dd6f78f883353ec98962", + "0x7b1d59f8c9869a9c73a09385c82762b86fcc995e75db00bda388e1423be19df4", + "0x2b7a8289bf9f93c589866af1a224c34943433b6a5a571df7dc4524bcf2adde42", + "0x9199d73dd306fc9038b36212c3ed7706d8b0f30cfcf3359408a8e6fd8ebab0a7", + "0x0cc8446d21ccc31bee04addd48b50f394390ef3340745555f9d7ccc3c13eefbe", + "0x80052b2097d7f836090ba9f94ad7c33066453d8ee62a2e215a82003ed92568f1", + "0x231c2d4e6a6039342ac03f766fac9f0a587ef6828d071e63a1e3f660fff13263", + "0xcfa0cae426e4b6b9422d72a687d50139654fc3351993b5d38ea4fc6f8944e662", + "0x9dc837a60a2c18493fd3b40083996f18a44f37a7a762ca649bc5d8c8b272aaca", + "0x30b4651c3496efed5997116b7a12f9cdc24040a4e110478f1a2330fbba48fbec", + "0x99567d98d73fe92c81c69aa465bd62b02492839519f0380686349da64caaf758", + "0x9618fd333f89357a22bb3101cc386003c2745f8a24b5affd2be9cc3c26a93e34", + "0xe539d1a4de2a57dd65cea42302fac83aed570f2fd7a318c6d226dea58d5f94c1", + "0xe69e3ef5d9d8cf08d3a354da7179d5bab9c68b4b6ea6a7e5a58cae9d901b5f35", + "0x97cd995441161fe4f50a339c6323020db6f56b9221b549194a93b9895a043e59", + "0x803e04ee8a22299e779491a6749b7d57973a59fe714d080f03749bccde30d5c6", + "0xace95a4dc00b3fef757aa76445b1edc582246eeebb7c2bdc71fa648e06428485", + "0x1c8bd27b857dd8dd5a671fb4aa6cec3c41ca1c747c9f86edca8f389ac637e09f", + "0x554b4d1bbe92718dd1aba2a9d10f48f803287d2c26108bf3cab2574a91375511", + "0xd5856bc0794ddc23049639fc438c360d66e4b3eb1f96516ba0c02c46cda8fb49", + "0x25a4c78e490c1d5fc6c1252b2ba13ca9ad5113a5c64e02220969146c5bbe9730", + "0xa8dd024efc7f03b61ff9926421107b54c42f5f9c936d956e9b6c6eb36f9b242b", + "0x26d488bff06eff3fe1912ce985ced65325e09e1c01a95bc16d0df22481690640", + "0x01b89e65f1a82ea7e456e96e2ddf29be42dced7c7ea9b12e841bd973506dcc25", + "0xf0f5d3392e3fb73697e44755d38c84bd99394ec2ef9dec841049baf8166e6d55", + "0x91c4f65d698130b132d0a33e44c27ea55f477cfb134224139ba0264b5737ed42", + "0x1d2295b21e1bb810d35471fe17adc80e59c6c57b5037de90c88e99021ac78b24", + "0x667cc89337d382967727f0740819a2f6298dd5f2b7b5e82dc45e3f1c15c5e998", + "0x908ac480019af2d3c3017c413077a73905e27ec01721aa499c24fa7e13bf8ad9", + "0xbeb7ebf8ffae71221e5ff149e3333fdefe6b11780d439b45a874129b2c25d71d", + "0x235c2ed0e3fd286df5cabca5f0f61bfe356ad0d7c8bb9c642814d01f2fd26699", + "0x22fc5189fb1945ae98d89e50b258514baaf525e8137e9581c99339e1097e33c1", + "0x148256253b74711fc61f8af7d4efcf8694752426715a0a4c788556feb68c1a2d", + "0x26ad59543cfd91bbe37cd8fd1995b81d0f095ac4e02cda0b4f5f40c9db6d320f", + "0xee340b0f25450c23a5c9b16cd5aa59657a9992c1c341172bcc8c9038eb6789fe", + "0x5da22a0b434f041d76be1d53ef63ae24031861dce1ff4baa3511d67664060bbd", + "0x6009815cd4da0162884d0be4cfe6936f1b251f50e9c89d9fdc2f0af430012e11", + "0x9342474f10ce871dfeb70fde89b181075b18e973d4806364d52f83f6be4d69f1", + "0x3c4c598faaf3c9fa8b9c1bf856872e65e3d53435177992b29a7674198e7df000", + "0xdf0d952cca28797dbb503cb8c7192e811a7dfc0797379391f839341e210078ee", + "0xdd48052c8e9a9ec62a58a580abe1c420b89393bfffe53fbe6b7f9079b5ec4d3c", + "0x028846c41592546d1d11375d00c1d10a18c06ee5f968b2ce8e8c42bee7aa263d", + "0x4aa08dc77484d15f8423a1fb2df0fb0c67729de1d48e61831884e49d7697674d", + "0x084c72f0f0fb1cdd4ff80ebc9379c9d29c8d1e35cc45901a67b231ac201ff9b4", + "0xe904eec627d475fcb3e61b2db0366a24ebcc286ccda2b1614049fa17ae9a9d85", + "0xc3fb5ed46f30f566b1d5547d5e00c4c999960dcbd1b60f0b337bff8da30c054d", + "0x1503b399ce9dd9f1cd8005036006e4bae2b3f05fbb1393b8f5d868332605c98b", + "0x70de442d35565513b92d8cdb95c6537f72d7e099e217af7c260fdf92499ecfae", + "0xc6b86174c627fdb002d187feada8c72b9bc6b1fa5d11785988c72b06480ef1c8", + "0x06212692407b9b701ed1b115a8ae1cf07668cd7498cbd7c5c58e9b52a0a0093e", + "0xfdc722f761f07d5c52d36c147ab8e80a666af5aa77fdefa37e86c7b2518aca12", + "0x7396bd40c5677c5f4388d956ec437071cd4352cac44b7b97eecebb6c5c99b507", + "0xf634b80145415b2086d4a20746bef5c7d34034ac6601487792889be39bac54c8", + "0xfb8cbee41b441d5424cbd12b064b04f5618f0b360b1c2ae5ffb90a0194e61106", + "0xf77c56810755fe69822c1250295092fb8e7c88d789706d6769d0cbdeb386137b", + "0x9e0f084e1184804e850784a4e376b8acbf58f4235a3829d49217c888e4e5d535", + "0x6b39d6de64090febb49dc6f6a31eb606d8e278b7ff4fa9e1a9774d3d9dc71f81", + "0xb5d9e67fd6cdd93c74536e5a74dac8eb8ea6914c2315c22e079d61eaecb18c29", + "0xac3dbb4fa1da752bff5884154e02ab975e993201e69ef9ca532c8b1e00b1628b", + "0x747b42a7005c41ae222f8c2ecd4bf7000c274366237e68b2e95a64cef3799ef2", + "0x8f06b121d921274a0d8da269d19ffd6a417cec988f0018647966960ac822fd60", + "0x13451d3ecba978d3c0d88c2dd4068cf060e949889ea514306c23a7a1ec574ca2", + "0x737f8bd85cce3a392da15c8e68c3ea9748a6523ab92dba8d1c6c8081311c3ef7", + "0x83cca9d97f8c4b2776b96d887c5ab1e8e6172970d6d237da98dd5c6ce07db7f3", + "0xb5bb3dd88ecfe2e4ac4e4be2b605cc7c5e79024782628a95df33c4967dc8251a", + "0x640c6050e63c965742cdfc6d3217eca459a24b3acf3a5ec64eed9bd7bbcefaad", + "0xe74478890f186d41b5157dbcef1f2754a35a5af332095dd25d34caf01580062c", + "0xfaabbc9703e049e49d1d22da051cfe6cae0697e7e728e954bd5abc40d0e2014c", + "0x8aa4a19c4ec50a68a6541ecc11d4473cf02773a0ba7bb4012ccd76ae11ce8bf9", + "0x01abdedb1886ec8220a4f6ce6a43863ab77215f03e8116b03f3efe44bee658b7", + "0x18e44060426a05d3d9500b7d6ae6d99133109bac39942ab825ae81c551c0ef39", + "0x19a60001bc92289e73d3a8320f7601eae1bcf70f65c3a43ff6af1b2c2c17355f", + "0x2dbc82c8ba30fe69aa00c7abf129cd1a65e8fb9398b2ebca0843e526e001ce1b", + "0xec773bb4cf7d35feb70ea19cb53cd64af2cd34c1e4f1e282bd3cd0b39720bd2e", + "0xc966e10e5568661e0930bbff1561e2de413f9f89d984b46224ced75d57213401", + "0x29658e4a7e4dec3e9a449902af34ab93fe760c6a1695c1a97e0a093e3d187782", + "0x98b0b147d3f6a8a21dd9e3fe01082dc9031c193dec4def76e53ad1c13269c3d7", + "0x288b646ad44d5f4ea299917a9b69c9c07b5ddc50e93d03fc1c1ed653599d7a7d", + "0x87c26362fb801ef77354375eadedc1489a4fc39401521cb06b604fd9288e4d82", + "0xa5cf4098a62d2dcc87e589c8269dc712e2ac2be5adf07ca33c520556d4da0cc1", + "0x4f253c49f87e135e4a0941409fe70ec6b29f6b0d9aed3f654f5eee7f4eb0a486", + "0x5370ae8dfa2a982dab86dfb45950a50ffd29039781b2b065ef5057f7b43b84d2", + "0x044f950f82d97f0fa164ec4174c238203d15f4cf32dd739931c3e291e0902ed4", + "0x792c3af8c8808b95f38d6e21979450e3ebeae129f0a9a9d0cf2951252801dd7d", + "0x141e09e2ca0a96d50e7c12aae794ed0f22c0441fcc51d1c4e179f891cb06ee1e", + "0xc475b7c5293efed9c9f0a5e1d8800e4dd10810bc7dd33c406da131b15524ee48", + "0x0018d2c2e814bff6fa8f5e162de402db71dd9eea45d320f60e280a00aadafc2a", + "0xc68336fc8904777bf8ec4d5a61f79f2e847c028889bce39ae0f307d11efad818", + "0xd6439bee30ae288496a022e04f5c21b9b047edbb370ea3e33ed236a217c6ca0c", + "0x03e096d6ce43823e4543ddbfd8f55528d49c38b5c701c520e95a51547b5b193b", + "0xfb80f18124198c12b6359ea7805f110f9f25a6686e7a917c110ad511554e634b", + "0xcf9a0aa896f5c54982a827e07314a81b58beb3de97fdf112ee1539ee47158f59", + "0x948cb5dcc88a5502d82a292e7337d5d010055ae4964c09b2c6d55b0401e1781b", + "0xb91614b49ef967aef3b113983cea703a60097e0cd4c0d9cf1ad6f36d594750a9", + "0xe29abd32597fbfcffb8d185931986a8519fcabca73abfc5be6e42bc8b6439374", + "0x9ebbe1b1037327c4f2f3c9b6191b6f28aaf9b04dc58f3314ec2c16ac1eaba9b7", + "0x098529aee4331ef9ee00ee624912ed1a7cd8d63ebf27a96059f56e60ab9a95b2", + "0xcab9578772277f3e1f7a6920b96df6ce3e6d7f60c42925b7bb1ac1d71d733718", + "0x43cb7ebd27e7207228ecee10cfb11aefe077bf03053877b53c42a41e4f39f607", + "0x12ef0a09e0f5dc9d89b01cfd66b34182e80821f0f9d86c80327086a9960ab9f8", + "0x30bafa474c54d2912897a13911cd1df20988be102333bcb9fc54905789f87718", + "0x383205a3e0b07e359127b28c3ad1b451564091893edc87d3d92e081111dd20e7", + "0x74382d6b160ac8b1e7b86abf22cb943b43afc4480be4b09c87c8b796f22eafe9", + "0xe84cbe2ed5a30d7b25ec540b1934577387626fb894e4248c719d417ff1b0f171", + "0x068dd7e31af946d3427dd6822c22577886c32a7f1e3a3bc61ee061be7c456751", + "0xff5309cf09f24f3666205ae09e542634bb848c47031ebc10079d96819095b60a", + "0x82991fe8d442572aafde5e2f6d2c0ba0823ae72110c2f4b65a0d39244db460a0", + "0xb86d9c8e378420595feae0f728e00736f5b72ffe37e289088c03235b3ae8f556", + "0xd678cbfb25960efc5a64d48f2ada784a5b43123da5db8636804c2ab7d1a6cc36", + "0x1ceacf6ae9acb6e7438e6971b133aa7a8ba7b648c130962c3f60b7449266f3ff", + "0xe81d2bbf5efd047428040f86caa351a8785a0ee864e74760569318c997b25116", + "0xde530285d36c4a50d0f91d48a42e9b85de919e51246b6aa54a55eb2041b17289", + "0xd5b86ba5c24729d199007133a8000314476135cc5b84dbc49de41a7d9f3060c7", + "0x95b2fc8a95f67d4d67cba712a98bb3b35fc4b92581f5eab9e737f2555592bf3d", + "0x9808b933e2c732a2b4d6229467430cd73715ac93d1000c470dbe403d0f14b6ce", + "0x8a708bd8ec41b6aeb1f822ed4892c4d685ae3fd1a752a0b79a10a6cf288c8a26", + "0x689c7f32af0a20de771b9c03efeb6304b08a421cbc2f178b63cd284f3d74407f", + "0x0375180a004265f4a38946353455c221785c3f6da1dcbde2c09c373fa42c434c", + "0x764f8f063124e8226a65af4823b260354924781b339a93f6eeb0622e10333741", + "0xd0a28ce8c50017ad2e0bf1c1f8193792228b879688f01354552e656272bd7936", + "0x20b12fa78b655cce826e87bd18cf938917d37c306cb620afef671b0548b1e1d0", + "0xc94540910d93236aff53413af46597dcb51c02508f14bf81817966ef32799c00", + "0xeeda2d6df1baa5dd3cf904c4402e4e99aaaaa16b6f3a0832bffad5492fd9e725", + "0x74de84a1158dfb1af0c1478cf0b048ae8b0ae00139588e91d37a6874b524522b", + "0xe9c92a1b7b298d7222890fffbd5ae4d2f8a8e0c5519cd06c3e34fd94b1f12767", + "0x18261f839aab59220f72e4e4bfa7a8dde2d3c5cd8c0179d2ff32a151f7af92c2", + "0x35fd53473534a3bdbf0ada29529991bfe6ac1865cc6786306b92dc26a6aa8116", + "0x6f40f093a08a00eefae4cb848462ba663b62f089005acb49a8f5ee3f1a767375", + "0xb0d49e32ac2ddef6bf0729ce9212c4bcc053aaa7cf8dd6649247749bab68cfac", + "0xb616c68f680b5cc9be3fc5bca40621514109dbc1316b848f1f3ce18b05e76d33", + "0x3ac8fe2f016f98eaa25451e36ce4fcfcbd160c0306c57f2edea049cdf541538a", + "0xb45e54eca70d4943eecaebfef3dc2219e79bdc71bddaec6adf53a1d058a65a30", + "0x74284120c5fa1ddcb7c294533eedd0b1ca2703626b7361543cb8e2a922177aae", + "0x8b15208a8b5d6ddfbe8b09148d497a5e3fc267b8f1d24272814d72f4826f8e88", + "0x3f9d4dcd96d5c902d4ef5655c10620c3e5a25edfa6fa093b0546d05c7c724d8c", + "0xf91ef06068659865a7c94e955f9c01ba4794214ebab33c9ec7030b2dfa47604a", + "0xadd5bb3d2f06ada2edb35754833e1bf1e317edff3e33535e135e67b4e4c5fdca", + "0x5aeb51beab2c98d3f77f2f04a39c2dfaed3ff759de9f5c16d4d88692a95eca60", + "0xeab1ab2c49609df8e29041ffefea082f92941aefae697fd915b9aeee8665c57b", + "0xbcf847e97f7f6fa5a16075ea54a67254e21fadeaa38d7aa42d16f223fd179faa", + "0x07f25413e56e9dfbd9bedf4b0676755f0cdbbf10b8f13ac7ef360bef7ac905d1", + "0x373e2f4dca323c9c4b4cd0cf4a1eb04ce7fd4d7548078200d9ffde2e3fa4cee7", + "0x5b9fd47a0d9cb386ccdcb2755934bfb8b27be896e52afaf18a0d130bcdff5432", + "0x1050a77797e0fc3a98c1d172496b8a3bbb2b045ebaa6b8b4af4e1542180f464c", + "0xea29629a5b08050c92412a25506d4d6dd8ea0f6bd8c962422d8f4913090a6d2c", + "0x1cc76b2b9f505bc358df15e285ac7cdde0009a2a19de9fcb5a44156ff76c5585", + "0x03cbbc18173700023643a8d6d7ff57cb0503336794c5fbe0b705a95034b7af80", + "0x9e2a5b70615a5c057d2956ac21838616ffd5cfb26fdf7398c4ad988a8cbc27ed", + "0xb2ef5e7c15e169ad2ec00e254415f4fa6c1f0635f728a98724dca4335e1c7801", + "0x50f9e432ed8c0c999685735ad95a4c2b3e0c0002d1159056392ed541ddca9b11", + "0x40ecd3140c4c8b02ce66489b39842d92ca64d05c30a9eddbfe675dded3fb6f3f", + "0xa1417d5ef7d185323ae3452fd99d54d5336f69ff866cfba06838da5efe273ebc", + "0x93b51cb9e7c9ca4e5f67fae55992ef6b0869c8c2effc8d244791cd2275f5f136", + "0xd9889fbd8c71e14316b5dfd46a6d049ec05127e5d3db6f0a31a935cb86b42d0f", + "0x384e1275612d71431d80d155015010e22b8b14a0648328bf1b32f92b1673308b", + "0x5eeac9b703836463fc0019c1b6f4be32282f4ade6778f897f6cf9d4c33e16085", + "0x2bdd040915ac28a0a604b727f062cf49fd413c44bcfaa2cc5eaaa9224248ef51", + "0xd7c85280a461c43df6c82f6ef60a973f2581c428394996191eeaa0d06a4b6473", + "0xe57d7c71a989601a066f8447a5be928ad0ce47d5413eceb709761654a30667e4", + "0xe1514ee44d1db8307cc08177a343887b5bd843cc510c5153b7f251aa10704f87", + "0x2898a69c885bb4cfcffa45a8aa63a8e81a40d4e3a7e1ff218ca3b4c70b836e08", + "0x27b66b51bb80e11582319b2fe176490daff05f0ce72a9dbfe79691676a455e0c", + "0x321d7bade5b8a1adee64bb0362620d99a5528831cdc0f1bd0258c9d66e4515f1", + "0x0a5443109753ff0845752dc998e82148d1de44d8347e51accd03cdbdcf405acd", + "0x1ef3a558361ee68b83346d40624b13d3170519e10dd18f60b6c5d7804f3c2d1b", + "0xf81fadde2aa798e6c151b35f764009d754f01aa0d8dacdd1a8f3109bd5d711d7", + "0x1af5b4d637429fab034b33b5fb3add567b5896608bcdc9e8d86a7d7ce762b4c2", + "0x8dcae50013fcabdc708c7b99c46fb4a68c75971775c135b7f7727bdf8db645a2", + "0x74dd3719b6229c2f675e41bae47aa0de9587608e8ad76e9dd911d695cbe3727a", + "0xca02fb569c275518e1cb95018a3b67dde118e82ade5cc9a43e118afa8da5e3d4", + "0xd5a890bef2beb2920a7ac22be90d0ed203dcf6b37ed0b3d2cea1fcc8f68c6d98", + "0x917c9cc04ac1f8afae96f0dc9b49161c352ed4e1da970e17d52fca31b8c1978a", + "0x009f16eb012717beb87fcc2b4417c8096a621fddc2421d02d84d0bfe92cd3587", + "0xe5ff9e2a1ffbcf1f53cf716b7caaa1317151ed8b81bd641bcf41eeadcdb0790f", + "0x2dfd67dc149772d4aa52588315df62edbc8a9340f2b3afb367f7f1564c1b8503", + "0x830df571a176933f6a72ac634933d61e602f744d1e3a046b7b639c9d2110580c", + "0xb2a030fd70ad2290c69e9b41220c14800d9adc33d7f8af049120fc6526a654d4", + "0x8a013c2432c60aa6315b1adc7155dd022df24129106cccbdf463273051ee0efc", + "0x55040dc6b554877d752f2f0bf0d97f71b34583b3d939587106affdacaf5d7c0a", + "0x251817e5c81aba6d675d47d688f19d5cb6957cea13ef3e15c66a6573b84af432", + "0x708cc1d141308870ea3ac36e5781cbfa3b5af327c565231123496354b5a9e74b", + "0x4efb2006e58b45c648d27654d45f1f797d4798217b2d0b54958fc576f115d81c", + "0x7d1bc87fd32a1b2ce74fe3784be5c0fe2e625ceac523ad55da7ebcd3cd1cb94f", + "0x575cc8bf8070ea53a54d027cb7d42eec9dffb85489013634350a96a434cb498b", + "0xc69812969e85bcd2e7e048b4323a726691c78d1902c1f1dbdd3893c11b9df8f6", + "0x6193928c0a4e47c9409c1af5d945a8c92c9e28a76570dfaaecfdda8071d6558d", + "0xb8982114b6b5da8849c27ee7d23280e15aa780248ebd36e5d364f2a05ae1fe45", + "0x49577950e5a3d4a06629686f9353adecdad6670fc9f4e6d3eaf6735296cc6775", + "0x6444155176ebe3b62f028ad79f058271d5b317360c0b97b7fe8c2a642da88229", + "0x9a3f0adf9c7b9380f60baf1d524590bec23b4d3790b3909ec8da3e79303252c7", + "0x591f122777ae7a313b6c4ba8c052d483f2aa3a687b5d85ed39e19d7e0c0e6de2", + "0xe3d68466d0747ab6245e5d8620eaae080a0f3c2aa34a56defe8adaef56d5474a", + "0x8d0f53bb5f7610133f04a763263815e092e43b0016369866e959d22eca466d85", + "0x8c8f0fff76977593112a64826f15ec0e909d9a1f1589e121a37f73d881e6b696", + "0x9ab1411e7ef5b295ab1a9dfe4ee1cd1a740af5b7e4b0a0e9c4a5f37e803c7c94", + "0x7a842e2c606aba52515ed7f114116bc782810bdade34b582077c57844e6af18d", + "0x40b14c755b9cecf8264622d80dcb5864241c0f41e9665908ef3683e83d33e9f1", + "0xd0faf39bcb44f583ded1cffebc93a8acb49a10b3bb2b0c9ed794b8aa4bd9e30c", + "0xe1eb93e1abdc400b49eda22b5818fcf61c56309f10d5e3cf3794bcd7760c4c0c", + "0xededdd50db9028797406a8559fd824a3e024b2362bb24f708c4f8423c657b31a", + "0x20f6ed1b586555773ded5606e711a4b9bc47b84f45bdb97653de8eb4c9aa40b7", + "0x77ade166b067475ddc450b0d6991b5a8de93c3b60d76d2b6a3f15ace449ea6d7", + "0x766c057ee18d96d84ac85caff6e0ff4954d3add40ed9488987ec5f4865f06ea3", + "0xe5dc0692cb0da1b9778ac99fb26b01ee7da45da56996dc7e5191f28e60a83bba", + "0xb86ddaab167daf9b8d4827e12f19201cb7ba2fdc7767aa7054f478650360b5a0", + "0x570f60bd9224065c7ac611e89e9737354b3186440dd328efa7ee0078850fc296", + "0x0438822dca67b58f7c5ede70758f24ad164e1c0e3f6628274535101c13121201", + "0x709382d302a6e5b21823af6ed14f22dfa79d7632b8649c67cff749fd9cad1d54", + "0xd42c07bf201d8025e9202ce752e25207cae1804877149a756536348853478dfb", + "0x82944c59acd3d43c731cc820a38f4b9ea4fafb3c5a5cc474ca0612c2e50f88a1", + "0xe9c2665ac57f450a47b8f5407dbfa7575ef4fd3bc4c90a1e64e7e0f597c6c4f2", + "0x862decca6c5c15a52cfc88a629237dc1740d533dea40a0850d8d0cff47672c43", + "0xeb453cbb85db88ed6ab19e57fc0b90c045c3c0dd6aca67f3be579c6e75e6a1ab", + "0x8f32d04dacbfaf1bdcde08205fe539f24a5e453c686257d5e39217ecf17e2a01", + "0x81f1d7ed305f8981fd6ef9adc7374a3bab51b9f5d042c35e7cb16c7eadaf37ed", + "0x8301660b9f830042d66b7197ca95eda84e9220d74f48ccef41aabcd8bec18c57", + "0x07c00b7b9e698074ac994f5a96cfbfbc6f3e8ba34bdd727deb60aa3ab9f0f1ff", + "0x44c59c12a76078144f62fc9646f8a37ac38a0db2db3cb002712834c0bf2a1bbe", + "0xb3abeacf4280e9fa9357fcdd9b4e866938c37513e0f8a31b9f8c5733c48498f5", + "0x72dd15a76cc64e9091fca937497027b77517334012d71b47502ec28f4cf31433", + "0x0f86404545ab226dda8789da56d1d67edaf201062dc4f3268e0a4c3314ca6628", + "0xf2c60e7441c1cd8b448b9d93fcc7e5f5a107d3b502454fb2f6b8607c49e12a01", + "0xc272b28ebdd6cb2cc76cc255f68602e731579bc79ee8c9f6a3471474f14febcf", + "0xed87c1f9b73e4f757d822e5161c6299aee52be1465ca389f0ce008eab6f51c17", + "0xcec988f7b79b0b5b9f4b1e43466b56dcae86823e45997fe208e7f2cbe4604947", + "0x0583ed42e92bf0cc3a54a4b80edde80606aa9a16d6254fe89b809faa0c7c5f46", + "0xc61e76957a49acc14fe008c525de69838370fdb7c3063bc04dd98b031b12eb92", + "0x5495eb0d9ac61871a364a5bd697628f4e480b8eea4c454cb583b0b11e59373ce", + "0x3ee00540b8bc71257573acbf77c97969e0af184589df1decccc5490858b1399b", + "0x6c10a21b5e7a430ed342bf38a88522919f217fb7a087576d7040f71b7d6a8e0f", + "0xc0410a1981bbae319921e5af78c1e80e4539e1ba9140adb9139ff40816255910", + "0x300f10eb6ba9d4ebd662710a91bfccde83a561b0dad7e14256a7b62e8b720662", + "0x9f5de17b88d3bbc6efbab33a7b2d8f2c120643b3844f8e37d19e10f1526195f8", + "0x2918baee5948882cfbbb57f6ba18a0434d2a0c3928eaea3d1b12de0054c00b5f", + "0xf5cb3b2a6d29bf9a0988877cbe22a01726883159a787a324bf1e685b92ab8018", + "0x08a9570f38daac2ca30d32e582f9f8f3a80e82020668b5020b29bf0456779b9a", + "0xf807d91faee554d99a4a728b219d285834f231129a6225a5a4340bd74693b133", + "0x7798ef990ab47b908f703dccfcc0d5507dcb7afaa9e5b98841825f7d2ac6b655", + "0xe5d3b714c47a7f5b8bc95dacec03facff800774c72f4379051a1c574b919bfee", + "0x5c5f6fdd4dc6d353865ee1edd5893b634f7239b327840b4973509027c8622f74", + "0xf713adae992084b0593ac33894fea127fd73a6439533cc94d07b89c50b071fc0", + "0x548d8bfbc57c4773fa2918dd13efd1f55a68d4a86b526f4560abcf48665ed637", + "0xf47bdfe91932a9b4e968e64ad23690b7c3421137b44030000ffdd78ac798b3bf", + "0x4ec25256a43c957c1cef4be253a69fc771889ad563ae677fe3e5ea6936cd760e", + "0x9b8a28041d701c32f976fada9ce9a73fcf5dad79587c9e02b5abd7a299d74292", + "0xc7c6285cea2145104924ab507bbd5aef09403f61e90ad04e0fa8a67e2abb140e", + "0x2e839dc3048ebe96490dacdf688b017f388288954704c9a99cdf25f9203fddce", + "0x37e37dbf1f4cb8b825cd5b68ea18a80a0bcbed46cbdb54c5ebb136ba4e88ff95", + "0xcdebce72ebb15b5fe081d0f3290cd8412c56e93269541af2461598fa2a05cd1e", + "0x37716cf58953f21168a83613bfb13db775fc96175384aee35f76e82095d19716", + "0x7f7ed8d8526f0586f08dcfba6a279689d0f7aebfb0b11e627c7cd0a31ea99256", + "0x1066be85b9d156b32227a7b74cd23b330f3c80e62f8b671b1dd03d2fbaf038b5", + "0x53b3ba2bf9f02a52c7caf9ef6b46df80d9fa1ab12437774b2f2d073e886dfd5b", + "0xad963410b3f77f2399b7ab925c7ef5cff512534c2e12e7e3e9573152f197f28d", + "0xa3b75316cb456a516d1e26ad8df52a0a2894f26ff3a2938f9e09cbd9354981d7", + "0x522ee88e34308bbdff564080e665cde9b3b4ae4a61afe558e5609996c1b2f855", + "0xd7d377a1ea94fdab72ce796d3e62cffa96b2b2226bbc9fcea51817414fc367a0", + "0x2ad4691181f4947c25d521a9d593e25c5e67c0b6150b3d9e27515c7808223633", + "0xf76442cc901ec7207c33840e6a029e3655d279394261b8e2fc350547f2fd4cd0", + "0x39688b8d86b6cacfea5d71e7311b01e2009a939c6531eb8af8e88b1d1b7a04a9", + "0xcc35ca75b97530d9c19199827d373210bc9624fa0ef572f7c3aaf2672918da58", + "0x85a6af5bf38ef40d2be7a529f3f370f56f380406fb8c5165f5bdff75a182b2ec", + "0x54296a0ca61a8a80d4ce9333c985983f953975f6bd7eb6beec593c149a3359cf", + "0xaa1f116c6fad9512afa8329eb499f197c5716a53ee283f06c417f45d9ce2fcf8", + "0xb9799045a8f20c5885649ec1a632eacd44a72b794dc7492469f8c1abff3edb24", + "0xd86348fcec2db2efc3deafcc18ca121de0176b1e89698a3c5244f377792784e7", + "0x7267a4a5e59e848f1c3c9e4c6f43e7aa128b73261adb296a89a7abccdfd16cd9", + "0x817a39c73cf85997721cb067b4e00812ab7fcde3e4506e37e6514c8c4e87846f", + "0xb8e7a1c1aa51637ee68590a2d5be7a8124fae067cb3b0ab3898f5c45fb275010", + "0x43f77794f4bb485488cf082b416885292a7b254057e7a75e331f4641c1ea2839", + "0x9bf3050d09ec32ddf7c40fb96ae136085587c3a4ef6cd413f73dd42615327218", + "0x069923933c215e6c60c8285f0afb83de8d4d9911a2c6417178f5f149388af874", + "0x01e1fb2dcd7bdf5e30e5569a677f39e9356d70ad5e7c30cbc8c73eec66bba5dc", + "0x39fcb505c1365111a0837993dfdf527a716a441628f248aeda785b32e04eeac4", + "0x7837393e026631af009ee2f61e1a39037f97f77f98690ce92fcdd934b80d3ddc", + "0x7695c9c3257358c759fd8c9018b2834ff56c42abecebaae806a281c03b887aa6", + "0x0446616edf3b74a68fbe0c22029b61d16b67c300022211e013572b90815b6050", + "0x274d5faf73eac9078b9d9c870bf07103aa749b0273871fa8e166932e3c0c1556", + "0x34fa06554a8bf6a2305d7ad293d1617f5295c046cd6de60689af2af9d44decc5", + "0xb641c3b6baa2370b85fb8bbb8c054fd9e7d44425a095778e859915f5b3931006", + "0xd4db8f0bebfa97e5ba93fe7aa444eb74782a98f03735720482b5080a4d3d980d", + "0x4261a0741221a7bcfa4d8bd1d6e8a62fe47ded969cc2b1446a7a76da9a23e844", + "0x6664826f16716dd01d707896f892a24b29aa9b78b2a162bfd01aade882314815", + "0xd9cacec24e60731fffc19e6fe8bf0241499ca78c51f38f841f6c1d91cb4f686d", + "0x57755fffef02b43c1be01eed12caee89bf5cb4ffa8b823aaed947083cde2d0ee", + "0x5d9bfb52ffa30989655e77512a3f40db66c790311c9cfb10d161b62b7542e334", + "0x302296acbdbd6737cdb060223f289ddd71516c8c42cc5128bdd545de6df02bb6", + "0xee1c6c48a63232e8dba59646f8d50dd6eded16ab310f39548300249efeaf7b45", + "0x60d151e272c9e6874c9c9bd90e8b241c0ec1e978b5b1db2d6632542f9b02488c", + "0x71c8d8c3da03c317eb14b12b5d403581432b3f0cea447da99dde8b60c9dc9cb7", + "0x9fd4de13da3b68bc5682debfae937d4ba4fb67f87cbc30677941ca53f5029945", + "0x2fb70f11714902235b3ca78b281c8ec80aab89f77e3fc59136bfbba44a2c46e2", + "0x30109aa2d8e89ef3669e4abb89870c77c5acf5a34bf273fd56b925d1a4fca03c", + "0x8d5c57cfcf34f5cd277a7d51c5a2fd1405b26231646db44043e735b8aae78478", + "0xaf961653148c2e6007d011e20d008c25a2c842f5dea15e2fefa76b3f324424ba", + "0xb4cc2c774796dd0c44923ecb3904e8f0c64839d32b7afd0c7f87eb0ba5e52949", + "0xf4c16b1aeaf622d35b4f897c5b9c96358af2fde5ede56d377132a6e57549565e", + "0x15c2a9f6eddc424c3ff3f91ebe6ac55d98442923267c80f59023d18b9d29cd9c", + "0x65abebec89e4a4d6e674a29f3e5ee304050da861a3a3c91ebe79a3a8aa159db5", + "0x46030219478d3c508cdbfe4cf76ce3924942cfbeb9ec6ac9e83dd5414cc8714a", + "0x4712aadd9407b29cdd5d3f0747374fea712eb3202fd2c13795268d498dd0843e", + "0xdc5ed31d4a9c4fce3f91f75102feef6da9a190638bf1f090df64175b531b1cc1", + "0x077992451f048591ea0bb7b46818c602b6fb1d535ddfab2dfbdaa6731745fb66", + "0x889307e6b877b390b86024c2f48afa3df0c9b375512e38ef778dde91dc950f55", + "0xc6127728eccce59452504b58e10c29ab854712f248d6c90b43360c2786f38647", + "0x76516eefb0f149ab9fbf2dace9fbdd4d435e583b3bb19820f45801abbb8309c8", + "0xa3771e4be252fc17bac8dd8cb9cce1168e531061b59be4fc9115838af2d3217e", + "0x1a0218061cd1c34a080b3a70cbb0c9f66420816a21a2f18f67e5fca6ce62b3f7", + "0x42751bae5dfa6d27b92cb15bf0c490d8184b97fb647563bbb4a7612f31369473", + "0x03bf5030aed483c4d07ba6a5be51ff968ce869decc37fe264b98661bccc55668", + "0xaf604a8c41a8a2fb37e317b2a565afa4e25c289a17b3e7030106849094d517ed", + "0xdbf8ed6fc0f94eddd863c883c17c974dd91f679194d4cc74316092327eb6bb42", + "0x27624ca6ec82b25f6bcaae3b0159c79803228ef5a5e4443498e39e7ca8280195", + "0x19338a8eb7d6884c8e6614b408ff2e5d44ed84e208673910f10fed7f1bf95c37", + "0xb612ba1448b74093a5be0f2ba8d330ca56647eaa2c84c3a1e3d2ef765f430126", + "0x523a7f824cb76717e0985ea2cabb23de5751c67ea03d6b569c30552d8bc9caf2", + "0xdc4f2e1b704ed39f818c36b26df95184c39927246f52a74772be1eebbddc78a7", + "0x4b5e3bc7c2e4f098b829f59ed096527216ea84bf9041d2a3c53c00cb7b5e7a56", + "0x3cec3a6e9f95bb0e2a63194ac6353ac6fe9a12fad00e8f603703454638e8d819", + "0x29b860f98a7239c9fe3994b68019ae8fd4d4009c07a088d23cd70ae6033fc727", + "0xa8d1900bc2c3156c6bc8a41378c0d2c646f0328d4f8b8963f52ac0dd506731ed", + "0xd9f8c709f2a6cbcda62ceae4c5244554af106e7f7fa0837d8887e23887d32e31", + "0xea7c17fa8dbc43b3680741957d5a020cf0df2d491aebd6955bf6027a63f75dd9", + "0xf764705990e0a12e1a97ea2cfe3d5fc0c28a601d1bb6c1bca0d24e61175d7403", + "0xbd5d6454bb6824df5a458fbd1a29476e76c645564c42064eb6cad79237e17a99", + "0x39e99ee5f716670380fcba0312b8b9d902dc3fe4e49e19bceaa4b2f3c2041366", + "0xbdb6860183ab7aa4362223c519791e7a0b63379b87ef4c30739e57515aae764e", + "0xbf6e060baab8b162bdf78e1996e30cdf4d6dd60b5daef909a5e7fada00090928", + "0x1ddc651ab0d26eda2c160911e4be92c8ef843ef510ee28f1d0b8356760c595f3", + "0xdfc38ad4e3225dcdd2dcadf32b024f754236601cb60c7aaec61a692a9f367acf", + "0x326cd0b07c68ed36049ef9ce9af1db0593a26193d9988d21d8ab05f7ffd91adf", + "0xfd76ef987cf758c89c04a221c10e50794132d3866bbf4e739e288a9b3014a9e8", + "0x590f03df3ea2123eac0957d2a84a4a0e0184be0eb75851643c0b876f364942cc", + "0x0fc92d4be9d7f7d5c49f3552d89203090fb7f4a4d34ac1a9925036c84d5d0d97", + "0xd90702e78e72b71a3f7db3510c25d0b26d098da80003cfa4abe3c525e3212d2b", + "0xec682fda87e3e66fc89855bd1ec01a80b515d6dda5f4b2d207cc5b2ac840532d", + "0xa75c0c5ae9cc31a14badd2f0cd66b9c081aa541e4f862ef0ee5aa8a692baa89c", + "0x9c237fd14d83ea449bc37922861be5fe81531264bb802d6a07c149b6883c826f", + "0xab2240195acb14c2cb5f3e6bdd352c4c36765ba6d2d3042bf15b3942b50471d7", + "0xe56052f2729f3d7d08b7958c0630b9c3ca2c6fcd9fd5655314bd1d5ca94e7852", + "0xd774822e8bd746a6b253e9c71f80fa6d6f9ad95bdffad3310eecb98785c549d6", + "0x4e478c8d5034a0e51e1e760fe258afc0c1f56cfa145f89bf34156426ea837b0e", + "0xf84cba0083c61307c45e7caa3844053ca78e2a1ce181edf17041130f314f4d00", + "0x24db4dc31929f9c0521a63d1b6ffd14939130c7d25df7a0827513a6ff0b28159", + "0x969f5efaeff2db44bcebbe23b9ff916a15087a313e814dd9f8140388fa62a48d", + "0xbdf6deadf158fbbe80670ae75744a419b999b747cc0804ec2a81b9082b5a4ccb", + "0xd25da9760de21e6483493f5f781cf526527aa0bc17ee9c9abefebda4e8bc5b71", + "0x83d5382a1a2132d7fa2bd48e06e59243f6ec71ee50626b65a84a7e5d3543f8f7", + "0xa5720e9755e2d04563583af4a2581a8a1761e82eb769dc7695b1f9654e36f753", + "0x97ceee5cb98a9e917223523650405aaa2e71cb12e568319baae1ee75df592fd8", + "0x1e1e8d3d81ae5be21cb8445833d9b8928b6c9a6b9217532b15ce0ba6cefa64e4", + "0x1c3ca12af63f1121e93b5fb602ab8c8ab1773d07bab5a60e78cb8e70e190bd4d", + "0xb343c9f8dbe3e65462838749865a748d4a5eeebe5b6622b56325e2e6680626ef", + "0x04eda02f974da35a3f4308d6b6be16b602d9317256209bf674f3282b2bda878a", + "0x0f85c864e5ac359d9a0ff54a4e0b44a31109c57d7c2171185138dee5638c627f", + "0x476f9f649f2365455d4756f541e8b8f8e34b32f8c67196a06fff2f71abddf5e5", + "0x185b523fa66564ed0e4cafadabe1c04a399b51114f5fb743136fcb2a0a53e477", + "0xc87106d70447c962f367b567b37281e4d840fc16d7b97dd349ecd073d0419cc6", + "0xc0e624f73d54230b99169c8919c965319ab2a93a31923bd22b50350bf0d25798", + "0xd78f2ea276fce38b53569cc64a6ce7ccec2fdf4f1a295106a1f2c54330a0db40", + "0x4a1c2807ccd57ecd989a2b0d4ed2d3ec609449e15c5652cff515ba5506cfb745", + "0x453e4ded943f491b41f0522188e88b28667172202b8a015f113171c29de193b2", + "0x9ea9a96b93c19a00f2238e15bb3c74409eca441e6d0ecb47b574fa8fe7390c67", + "0x9833f04cfbab3190d2d831116f1f0e1871018d862cc2389511bc266756963540", + "0x48ccbadc3d160d322bfc61d44962628b088da09d045c43d028b1b9fb979462bf", + "0x33d90a0c09d27087c15b01228250cac34fd4307d45593e7239096bb77822f6cc", + "0x545e2a8e511ef59a5fd7f183b0bed449d59788e4e377350b56bdb387e82ad4f8", + "0xe7e31fa668cee51a20ad4f2bbd459016639bcd47421836cc1bb3e0e2a4705998", + "0xaf6e1ffeaea0bcb61d5d90fb6d6146bf4f6102f49c3e5f653e1bcd6b043ab3ab", + "0x98bee111ed4d2cbd72725011d5a565b1873c86b8f3e17f16389ee009dfe3c6e3", + "0x2107b120a64b8fe21702af4bd26e8d981fec6d0051c83046bfa5dd05354ad05a", + "0xc982a8ce403f43557d0a812b8be06827d88e2410f6e7920971972fb205bc8a4c", + "0x5d58c764a39ccd3edc5e1b37f3ec73ddcfafde249e066c6185712c0d566b2e33", + "0x9afff9b16248767858ce0520877d7f414764eae8ad77d9810d615540c119e476", + "0x6154b7412dc1fabb80fd7ee43a3b91651e07b62d15afba8c004611d8ce2a88a9", + "0xfa859b6679bd6a2b283ad4ba43b8b3d96b19292d017e933cb307100e0e2a9c36", + "0xf32a85527d705fa439494f314800609a6c5f6657b205b0127b64cd595aa2c31c", + "0x02d1fe3725fad05e13189d6d9e078af8c825bccb5775dd1a6c90be3b57081d02", + "0xb003929860e22e0a4bebf5be75be8ac86a511e3f9e9b421aa9a99fe0fa4d9144", + "0x583341c3a9526d29c43bf22619df050676fc5e56974a8588a91bfef7409818f4", + "0xb94ebbab275786dbeff9189ca740bf324f916c76b800da87e6e507d546128ca9", + "0x5f26114f75c4f839fd6776b3a67b1a74fe6afe5fee1d3053fc5b09b38a2f31f5", + "0x053d6e94968bde9f906aa52065c0626810d138908f1645f2e563d3aca9660276", + "0x458fdb60ca1d0b7ffd846744ee6fc7219ce6700b4e5cd97603c4885563a0d14b", + "0xdc09316757c1ed63b9d984647db8fb69fc9e8e6153424a6e99016f868dea613c", + "0x409e2e26caddccbabf10754bf500262fca5aeaf6ebc937062e1d59b087873a70", + "0x288ee1a1e4b4437ac97c7130d4260bb0298ed2038b57c801fcf2389762a8dbe9", + "0xb82f496c7c8c8d2847ea7434e15c61883f4510e3151f56636394d88e902e19de", + "0x5fe701b2ac79e258c7201cadcf7892cd37e76bf9f7f9b9b46d39ba0fd359076c", + "0x32a841cf4e27eb60b5a6825665cc257fd1db222d501b42b5c6a814cdcddc1038", + "0x5b76c42acd108597e0f0ea8c92acb039a047dccc7f294205d1e404981bcffe0c", + "0x7084da3532f91d33a42701d9c580905f4cbc4137f33db33a579aec2ce5db1c53", + "0x11e58ad87c481e2d1b1583bed5b6e71ffbc1114bed29b7ac14a75d852a4741b2", + "0xdbbe146f3e58fa32d465a175205d757f18929cea4870bccbaa2698c58cd32f6c", + "0xf1dacbb951e0663d5db612046e090c04f18bbe31271d3d786f20deffd44b4205", + "0xa11dd2266cbe0af5b7f1f7955c28fc43a88abb8d82ac18e835723c85e8fd2d22", + "0x716ed679abca531ed520deed7b6d955e1c07c5ea483cb57a2322ed8c7a5a31e1", + "0xca4e5b466b978777d7a60a8bd841271da8643bdf0085379677131bf4b3604f33", + "0xe3ab5b13f5cb1bd8dc38c5182a7f16c02abdcae7a310d6c0233b96070d9d30f7", + "0x5f29236e49036d429f283d25a2e4cd6ee8f01b314201a34713b50871ac1ab628", + "0xf1e41d548090c62f207208b575e0bb7b4eb08c30abe40525effbcbb8b5511482", + "0x088fcad31ede2ffe1cb9e67becae368ba3be97a02d4837be59bef650f4b90e4c", + "0x4f4cadc003d445a2014dd5f819a2b67e67620a21af8302469f9ec264cee75e2a", + "0x23b331796e1c5c95a701a1f791ca392da953a7a9d5d2a834d0cc941ef6567250", + "0xb147414487aa60ae8ef7aef8577ce50b4a750b0ab77175aaa39fe78ca5d2e12c", + "0xa2250e2b126ef24cb732c79cf87afc5186b88402b70e0c9b7d3139205c7dfd09", + "0x5c40cffeb999c74452e77145e22c3c1d1080deadf4f49e40cd5184c683f628d8", + "0xe2f8ad15a61579535dc9afc59d9ad16308b80e409fed46af55b7938856485c33", + "0xec81eb466fd503be4a807bad9b2d0b6ccc24d1dce3f82f69adc99dc81d69a3b5", + "0xb87d20dbc44c1a473048e96a2957a4b9fb2ea606cf7b3de9d44937d18695f0d9", + "0xbf0dd81b0e07b07b22deb6b97d5cbd1d03a2726a1e7bf9f795c8104d1ff1c458", + "0x6aeed28f1590a1c96f1085a1867a4957673cbb8e4251e5876a43182e7b40e4ec", + "0x24df74cf385560d990f59f8c59d3545662f71b42736bbd1c1361b5a1c45d2b47", + "0x881647b453a1e3ff0b6e64a3667db62add41599f003f9032418576323a5ce1f2", + "0x9fb9c9bdcfcf35e02f0029f74b86d131be7cb49f409055cc075008e9ae33bff5", + "0x5f17c4c7b4d1b0cfd3929eadb46bf1060b8394f6bd5c0095623f73de5f8acf03", + "0x63c4b4aa80474a3cf70243f3a2d891266760f6f54693f4f189c0aa9b3d6302ec", + "0x97921aed12f6d78f6052050f7401caca6bd07cd643fd7a30f681a72a45b64a0c", + "0x82e6c73da95617192ccbc9374bbdec4c4323f8f63a27197cdb52a0d73b88e16d", + "0x3e24fcbe6a8d8ba769994150cc7a17dbb38d2248af14bc8328f729f4e01fe173", + "0x8390ef908e1dd84308347bdecd7f7e1f176551e291c6b8851c1f90d0ee4d87a3", + "0x016143668addb39c55a8c5397cf097567faeec1787643a89f8feaf817ea10d5b", + "0xde78935eace5f67e88d141d650c35b2b0c5144b12833a3c4bb64441aca1afc23", + "0x129345fd67f04b97d9e76fc9758c80b0616a68710f51decc61f85fed9250396a", + "0xcf6625191fe20056831cfa3839cd3f8fe60d17e6e4248dc46ecd35401986770a", + "0xda56c24559455221d6e465dc3385bb8fe8b547f96952e07647e46e10127873fb", + "0x85045ce82b529f7055bb8496f4084283edc86b6b79f0f1fa060ed9050419c542", + "0x4b94dbf2a96a4749a04d47fe563644b7f396f4c81753d8ec3a70e5065df0a3b9", + "0x4b025b46575b54136db392c9075b5973a421fb521ab37d8760a04f90b4f8526b", + "0xcfdf125601a1939cca129c4d38dc89a6157cf0a51400bfd8cbc1ea9a3ac5e859", + "0xbb9b417a9d9c975a1707778fa83950a2a6f6c7c20620e623e913509cc256c26c", + "0xc2dc9b5d9413508462391fbac33d1d4ac2fc4b3167d152d0888c5ef9b18a9bf8", + "0x918d35dede6db7175e5a11d9c26ed38fe8198da231d3955b1eee020ad32fa3d3", + "0x12515f32629d7e71e2f1ef0de1a08ab2ed2cf9cb2ffea11aeab06e7dab64eec8", + "0x3484f89e98c0436f603319b8c5d5e324f3e2cb6995be3334641e14a21e998b21", + "0xb045c079ca13a4a6760bae38dccad8b35503437c4643b1180f99b2bef15b9eff", + "0xf81cb06b474d642ef15ae0382f3d792071862d4a00a967ed352fcf5fc55529b0", + "0x2edc394894bdc21c9827c789cd1f1226459e5489f7a87dd941efdcee56d0be78", + "0x7a1993168a29b0869fbb337144031dd0bc47520ab9498c9065b71fc90a100294", + "0x1963f11d488f5db4ea7f6e99b0bfe5006702e911930a7a95fab8a45ea1c4c955", + "0x7e12d33b54970a2fba8539d57c02b8318fab2f22ceb8b0ef69b6cc9ccfbd0658", + "0x32655b99bb59604c91af6270b15834688de512ca3088544785c0f0304d1faa20", + "0xec8984da3bc415604c9facb5cec0238f162b3da22fc4d20bcfed387c647728fe", + "0x7ba1756f8fa6637d8cb6cc588a679f6366827bc2044865744837c63e8a5aadcc", + "0xfc1a94a88f1e52bb78a0862eea4b996444f0264a3b301c1a31e59744d0216de8", + "0x79472bc4de84a0c430f15bcf8569486cddd2de985409ceb8e48abec8aa3e3fe7", + "0x02bc578dcc715304c651a43d8dcb4a761d2073a93cca2c39da3ee513f0c6d415" ] }, "accounts": { - "0x0000000000000000000000000000000000000001": { "balance": "1", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } }, - "0x0000000000000000000000000000000000000002": { "balance": "1", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } }, - "0x0000000000000000000000000000000000000003": { "balance": "1", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } }, - "0x0000000000000000000000000000000000000004": { "balance": "1", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } }, - "0x0000000000000000000000000000000000000005": { "builtin": { "name": "modexp", "activate_at": 5067000, "pricing": { "modexp": { "divisor": 20 } } } }, - "0x0000000000000000000000000000000000000006": { "builtin": { "name": "alt_bn128_add", "activate_at": 5067000, "pricing": { "linear": { "base": 500, "word": 0 } } } }, - "0x0000000000000000000000000000000000000007": { "builtin": { "name": "alt_bn128_mul", "activate_at": 5067000, "pricing": { "linear": { "base": 40000, "word": 0 } } } }, - "0x0000000000000000000000000000000000000008": { "builtin": { "name": "alt_bn128_pairing", "activate_at": 5067000, "pricing": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 } } } }, - "0x00521965e7bd230323c423d96c657db5b79d099f": { "balance": "1606938044258990275541962092341162602522202993782792835301376" } + "0x0000000000000000000000000000000000000001": { + "balance": "0x1", + "builtin": { + "name": "ecrecover", + "pricing": { + "linear": { + "base": 3000, + "word": 0 + } + } + } + }, + "0x0000000000000000000000000000000000000002": { + "balance": "0x1", + "builtin": { + "name": "sha256", + "pricing": { + "linear": { + "base": 60, + "word": 12 + } + } + } + }, + "0x0000000000000000000000000000000000000003": { + "balance": "0x1", + "builtin": { + "name": "ripemd160", + "pricing": { + "linear": { + "base": 600, + "word": 120 + } + } + } + }, + "0x0000000000000000000000000000000000000004": { + "balance": "0x1", + "builtin": { + "name": "identity", + "pricing": { + "linear": { + "base": 15, + "word": 3 + } + } + } + }, + "0x0000000000000000000000000000000000000005": { + "builtin": { + "name": "modexp", + "activate_at": "0x4d50f8", + "pricing": { + "modexp": { + "divisor": 20 + } + } + } + }, + "0x0000000000000000000000000000000000000006": { + "builtin": { + "name": "alt_bn128_add", + "activate_at": "0x4d50f8", + "pricing": { + "linear": { + "base": 500, + "word": 0 + } + } + } + }, + "0x0000000000000000000000000000000000000007": { + "builtin": { + "name": "alt_bn128_mul", + "activate_at": "0x4d50f8", + "pricing": { + "linear": { + "base": 40000, + "word": 0 + } + } + } + }, + "0x0000000000000000000000000000000000000008": { + "builtin": { + "name": "alt_bn128_pairing", + "activate_at": "0x4d50f8", + "pricing": { + "alt_bn128_pairing": { + "base": 100000, + "pair": 80000 + } + } + } + }, + "0x00521965e7bd230323c423d96c657db5b79d099f": { + "balance": "1606938044258990275541962092341162602522202993782792835301376" + } }, "nodes": [ "enode://56abaf065581a5985b8c5f4f88bd202526482761ba10be9bfdcd14846dd01f652ec33fde0f8c0fd1db19b59a4c04465681fcef50e11380ca88d25996191c52de@40.71.221.215:30303", "enode://d07827483dc47b368eaf88454fb04b41b7452cf454e194e2bd4c14f98a3278fed5d819dbecd0d010407fc7688d941ee1e58d4f9c6354d3da3be92f55c17d7ce3@52.166.117.77:30303", - "enode://8fa162563a8e5a05eef3e1cd5abc5828c71344f7277bb788a395cce4a0e30baf2b34b92fe0b2dbbba2313ee40236bae2aab3c9811941b9f5a7e8e90aaa27ecba@52.165.239.18:30303", - "enode://7e2e7f00784f516939f94e22bdc6cf96153603ca2b5df1c7cc0f90a38e7a2f218ffb1c05b156835e8b49086d11fdd1b3e2965be16baa55204167aa9bf536a4d9@52.243.47.56:30303", - "enode://0518a3d35d4a7b3e8c433e7ffd2355d84a1304ceb5ef349787b556197f0c87fad09daed760635b97d52179d645d3e6d16a37d2cc0a9945c2ddf585684beb39ac@40.68.248.100:30303" + "enode://38e6e7fd416293ed120d567a2675fe078c0205ab0671abf16982ce969823bd1f3443d590c18b321dfae7dcbe1f6ba98ef8702f255c3c9822a188abb82c53adca@51.77.66.187:30303", + "enode://6f289111f7c77c68651b0f4803c3a47bcec801f9c618bb41231a1a24a6dbb9c76f2fdb63ba7a21357c41ebb7f6922c17397c1b5c8f71f7d3ef7965505d4945de@144.217.72.209:30303", + "enode://b6340eb94c3db1362ee517801389fe21cce6354275376b1006f8ce84f8a5cfa2b836268b3727be9db7cd3e581f356f39da39418c4ec1d63d959abc235d99cd86@145.239.7.213:30303" ] } diff --git a/ethcore/res/ethereum/poacore.json b/ethcore/res/ethereum/poacore.json index 115108f27bb..9fc34d22a2b 100644 --- a/ethcore/res/ethereum/poacore.json +++ b/ethcore/res/ethereum/poacore.json @@ -50,12 +50,10 @@ "enode://6e3d1b39cbd2a9c4f053a27e68fd90d0bac83691dfdc4a13c59f2555078a71e63c5daaee5a82aa6db500512760a5456f86076bf8bbe8011c27c82ed7d6f5fb26@45.77.140.210:30303", "enode://f4698ad485a027497e1cc992bb5f7cecee2b32a44c47202738d8d0eecfab719541988d0cbcbc5ea94c6c959e5cddeb85fc6ae75fb63dc3bf87cdbe9e6f615e9d@206.156.242.64:30303", "enode://31dffed97f8fed1f34fe66453280a89cbeeda60cf28f6fbb212ebbefd7c7566a02c1c7d5c00bbbb49b9fa8a49f157e0f786f379ca9bcbf2fea24de70d70a22b6@206.156.242.61:30303", - "enode://efe1a701595b7bfc20cc71a70dcdf1d731a5ca618cbc1bd0059edc6658d5958a2b243cc88112c7ded48f3d331a26a6a76b4d3f4a51260b5fb5d13f798e5786f0@206.156.242.62:30303", "enode://6bdc7553ab2e4914cb47774c1e6d8c8f47ac7c3981891f85f65d06f208ea1bc4d3bf982b330950e0a0cd127efd7145c4df7113159a1d4a06ed722e6c16d0ac6c@45.32.215.190:30303", "enode://872d82a24144bc007658fb6fac0dcdfb9b63aeb05ef563a06d0186f2d1e5ffbfc5c4f1244891a8a86ef70682b9d24382e654b305224883698862e2df647a4d23@45.76.236.247:30303", "enode://b11fbc6cde81c80be69508aca8ffea8460680a25a9c151b683293f8617282062b8e8e139bf91e88cedf60068a3cf927b0d48832fda5169b58a8f7ce442de6fb4@206.189.76.132:30303", - "enode://96678da10ac83769ab3f63114a41b57b700476c5ac02719b878fa89909a936551bb7609aa09b068bf89903206fa03f23e1b5b9117ca278de304c2570b87dcb27@18.208.191.114:30303", - "enode://47ee6bc6312210caa0087a5754221f7666e37ab2d5c10cfe386ecdf9e5f935fc55726b37d10f0eaf493f762a270445d3e6d569891c328759b8baeb39f6f6ed2d@34.224.215.151:30303" + "enode://96678da10ac83769ab3f63114a41b57b700476c5ac02719b878fa89909a936551bb7609aa09b068bf89903206fa03f23e1b5b9117ca278de304c2570b87dcb27@35.175.15.164:30303" ], "accounts": { "0000000000000000000000000000000000000005": { "builtin": { "name": "modexp", "activate_at": "0x0", "pricing": { "modexp": { "divisor": 20 } } } }, diff --git a/ethcore/res/ethereum/poasokol.json b/ethcore/res/ethereum/poasokol.json index c6d51a9c8a6..8ee91c90c06 100644 --- a/ethcore/res/ethereum/poasokol.json +++ b/ethcore/res/ethereum/poasokol.json @@ -37,7 +37,12 @@ "eip140Transition": "0x0", "eip211Transition": "0x0", "eip214Transition": "0x0", - "eip658Transition": "0x0" + "eip658Transition": "0x0", + "eip145Transition": 6464300, + "eip1014Transition": 6464300, + "eip1052Transition": 6464300, + "eip1283Transition": 6464300, + "eip1283DisableTransition": 7026400 }, "genesis": { "seal": { @@ -51,19 +56,12 @@ }, "nodes": [ "enode://8e0af07c86ec36590bb6368e7ad0c45b6dc658f5fb66ec68889a614affddda5e021bd513bcf4fb2fae4a3bbe08cf0de84f037cd58478a89665dfce1ded2595c7@34.236.37.74:30303", - "enode://0171db265a569636372566e86cb7a69306fe5c15a8e2ed5bed4010012fa1d146ae4918a688cf1bd3fd98e8c2d5c3705d68ff941c88ab974ff52c7fc8606ce2f8@35.168.201.160:30303", - "enode://9a4a3788471af17a8346da7fc41057f037da692d4fad0ac5023fc0c88cf64666d74ee9f6396012eec98cd6bc772418b42dddd823a38e359bbfdc4fc93ba38de8@34.229.128.189:30303", - "enode://881e56dc71472376b65ddaad5e42ee73084c96eb368c1e219b4fbcd73ffa339703cca168b6620cb1eabb7b8dcfe72e563117670c7ce94298c20d04b709c65697@165.227.111.36:30303", - "enode://8e3733fe1606b17dd743e7d4fdb7ec1e0b909aab3c5289beabcb36e9d3175ca05bb36a52589090d4899c85a9219622ea4cbb9541057b722be65241db557b51a8@52.201.214.63:30303", + "enode://f1a5100a81cb73163ae450c584d06b1f644aa4fad4486c6aeb4c384b343c54bb66c744aa5f133af66ea1b25f0f4a454f04878f3e96ee4cd2390c047396d6357b@209.97.158.4:30303", "enode://0d1e0372f63a3f0b82d66635ea101ecc0f6797788a078805cc933dd93e6a22f7c9fa51ab4e2d21da02d04480ef19f3bbb9a2b41dd1c262085d295a354bb8b0f9@18.217.47.209:30303", "enode://ab083db73da15b3995ac9c68035cdb32901835a823cb848fccb672e43dd21f14428706118d6fe5b921d8e741f122f35aad0255bc86807b1d17bcfa1e86e40a14@165.227.37.104:30303", - "enode://a2a8545ccceaa1152721a213e6aca912c6d89a37bc6eea73999fdb08a95c6f07a79057f7f41c75c128f58ed77a13985e5c33c8c50d6a3d60b50c43f5f69c1fcd@52.170.16.34:30303", "enode://8e0af07c86ec36590bb6368e7ad0c45b6dc658f5fb66ec68889a614affddda5e021bd513bcf4fb2fae4a3bbe08cf0de84f037cd58478a89665dfce1ded2595c7@34.236.37.74:30303", "enode://182ee200ca134dc4d6390f3d5aadbcd80df0f7f24335830335d142573eacce4eeb919d30e82c5df588034e167e6ba6dd11187502ac9264a71005127f6b146a99@159.203.95.241:30303", - "enode://b022ff70b5fcaf9596ae5efed99a8198b4ae0578ee9d17b733609d803a75cef95d3a2a18e50dca9a7c3b26139f158c59eaf8b5fb8d1d331c9a46934a78acabe8@206.189.76.128:30303", - "enode://4a16c9a597dad00c000523fc2f4302bb8bb7f05949ec0ea4a516f0c6de9e191662f650ab55ea2a05f5af0f0eeee879800074f7263328f09181c7156059b7b6b7@18.221.62.190:30303", - "enode://6527003feb6b534a7fac297b92d2f368bdf679d8f489639006c78640bf3ead3cdbf88a88a7bec29e6e29510122f279adf094d1b1b6e9e5005c4584aeb482c4a0@35.172.215.190:30303", - "enode://99f335f9dffe978f7a925590f011909f2db1a2b28b05a0dc10da47e285e3d20b2d827caee258607c707c5261d9ba5f7f5b899dd025315c0afbfd5536a91ccf73@18.209.18.86:30303" + "enode://b022ff70b5fcaf9596ae5efed99a8198b4ae0578ee9d17b733609d803a75cef95d3a2a18e50dca9a7c3b26139f158c59eaf8b5fb8d1d331c9a46934a78acabe8@206.189.76.128:30303" ], "accounts": { "0000000000000000000000000000000000000005": { "builtin": { "name": "modexp", "activate_at": "0x0", "pricing": { "modexp": { "divisor": 20 } } } }, diff --git a/ethcore/res/ethereum/ropsten.json b/ethcore/res/ethereum/ropsten.json index f21463b1f31..953e7fdb421 100644 --- a/ethcore/res/ethereum/ropsten.json +++ b/ethcore/res/ethereum/ropsten.json @@ -1,50 +1,51 @@ { - "name": "Ropsten", - "dataDir": "test", + "name": "Ropsten Testnet", + "dataDir": "ropsten", "engine": { "Ethash": { "params": { - "minimumDifficulty": "0x020000", - "difficultyBoundDivisor": "0x0800", - "durationLimit": "0x0d", + "minimumDifficulty": "0x20000", + "difficultyBoundDivisor": "0x800", + "durationLimit": "0xd", "blockReward": { - "0": "0x4563918244F40000", - "1700000": "0x29A2241AF62C0000", - "4230000": "0x1BC16D674EC80000" + "0x0": "0x4563918244F40000", + "0x19f0a0": "0x29A2241AF62C0000", + "0x408b70": "0x1BC16D674EC80000" }, - "homesteadTransition": 0, - "eip100bTransition": 1700000, + "homesteadTransition": "0x0", + "eip100bTransition": "0x19f0a0", "difficultyBombDelays": { - "1700000": 3000000, - "4230000": 2000000 + "0x19f0a0": "0x2dc6c0", + "0x408b70": "0x1e8480" } } } }, "params": { - "gasLimitBoundDivisor": "0x0400", + "gasLimitBoundDivisor": "0x400", "registrar": "0x81a4b044831c4f12ba601adb9274516939e9b8a2", "accountStartNonce": "0x0", "maximumExtraDataSize": "0x20", "minGasLimit": "0x1388", - "networkID" : "0x3", + "networkID": "0x3", "forkBlock": "0x40E80F", "forkCanonHash": "0x3e12d5c0f8d63fbc5831cc7f7273bd824fa4d0a9a4102d65d99a7ea5604abc00", - "maxCodeSize": 24576, - "maxCodeSizeTransition": 10, - "eip150Transition": 0, - "eip160Transition": 10, - "eip161abcTransition": 10, - "eip161dTransition": 10, - "eip155Transition": 10, - "eip140Transition": 1700000, - "eip211Transition": 1700000, - "eip214Transition": 1700000, - "eip658Transition": 1700000, - "eip145Transition": 4230000, - "eip1014Transition": 4230000, - "eip1052Transition": 4230000, - "eip1283Transition": 4230000 + "maxCodeSize": "0x6000", + "maxCodeSizeTransition": "0xa", + "eip150Transition": "0x0", + "eip160Transition": "0xa", + "eip161abcTransition": "0xa", + "eip161dTransition": "0xa", + "eip155Transition": "0xa", + "eip140Transition": "0x19f0a0", + "eip211Transition": "0x19f0a0", + "eip214Transition": "0x19f0a0", + "eip658Transition": "0x19f0a0", + "eip145Transition": "0x408b70", + "eip1014Transition": "0x408b70", + "eip1052Transition": "0x408b70", + "eip1283Transition": "0x408b70", + "eip1283DisableTransition": "0x4b5e82" }, "genesis": { "seal": { @@ -55,14 +56,14 @@ }, "difficulty": "0x100000", "author": "0x0000000000000000000000000000000000000000", - "timestamp": "0x00", + "timestamp": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x3535353535353535353535353535353535353535353535353535353535353535", "gasLimit": "0x1000000" }, - "hardcodedSync":{ - "header": "f90205a0cd611d63e443c91cba1dc259c71fdb96bb70a1b78639166f7aa2a09b36843f7da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940d85c541489b4c67df516b86898e1ed59c8d639aa039cdbfba9ee1e91d15fead004292a7df0865204ee878daab2375683cc527df2ca0ebf5b5fe0ef82be8bda42e6767ad7881269cefe650c3a899f38f5ed1c05cad8da0578f443c4b0d0bd89e42a855436258f1b19d1a018f6769c5be7aca0679ce6008b90100000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000008000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000800000000000000008501856ef4de83436801837a121d830e1038845bea0191864b564f544845a08dcfeee7d79d54276d8bc35765ade21a51d277540a3d7a8e17fc26b6324487e488d70f2a90307e2ae3", - "totalDifficulty": "14549054591321060", + "hardcodedSync": { + "header": "f90217a058893ba2a7f3d1625239b0ffab5b58219412b5fb51a608fc6ae7ff012496db9ba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942b126e450158f14add6770739a2e6b4037526817a0a46d5b8474c625b4efd3d1d2864d7790770737587aa926fb223945d55a1d0da8a04ff0c821428157d6a4ace26e17d775eac4f42cc7d777898ded413780207fda11a0777f1c1c378807634128348e4f0eeca6a0e7f516ea411690ca04266323f671a4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000844737e14e834dd801837a1200830186a0845c76311499d883010816846765746888676f312e31312e35856c696e7578a0676e77abeb493056c28a2d8fcd1238da73a29c9d915441fd8b5e36f6e910fa5d8803afeb22c339444f", + "totalDifficulty": "18334236703652990", "CHTs": [ "0x614648fc0a459451850bdfe353a932b5ff824e1b568478394f78b3ed5427e37a", "0x1eae561c582dbb7f4e041998e084e165d0332c915d3a6da367638a8d24f3fafc", @@ -2220,7 +2221,341 @@ "0x294a3fd73f102c7017c9208857dfb91ec7c323916dd1bb3c9f1fac2c7d952b4b", "0x3a9fe3685814b6cff7a918e514a9d5375a1fc8268a48d5b78da93dfda115332f", "0xc033a1836983d485e28e5a0825c953a76d4c7f4a8ec5f7eb0b11baf5ae2beb79", - "0xb088df91127cad5d72f8db96d7ea86dfdef55374bf982222a45df7d2b631ceb6" + "0xb088df91127cad5d72f8db96d7ea86dfdef55374bf982222a45df7d2b631ceb6", + "0x1b949204d4713d568d40effb39002052a6d3a568bc81aeeea6d1253d198f1be8", + "0x12a2ca58e35fba0e6807cd6342ec56b3694a463f49804926349f4539be68d438", + "0x100b99dedfaec985e782b9b35858100eea3912b9aaf55fe7a8a767c93898546d", + "0x13d52bcec2eb86e2362570e1660726c03ab838fd5a00e75db7708941b4eb7f78", + "0x593965331b69f02f8ff23ff0530448376ea605ea05cfc28cf39e9db21b412521", + "0x0253f2a3b472affd04d8da76383653ad987d0cb533fd4bdde32a346ce441d74d", + "0xb43ab0c15315108cfcebbbb139eac536205a8fbde0b92e32937ef799d664127c", + "0xc4cb2191f244ba3720fbafe44d13c0d1a3a2e32f80a98363ef748731f54f180d", + "0xb28508b83729ac435202a034701f560fb4fc26e95b4a359da21309c66c082e7c", + "0x4826172b9fc3571e8b6193668e47ae6fd0c44a6a0cef1135333ac0213241f0d8", + "0xb5447c4fd18da34ffec6774325b3b486b625890aa5a383dd5f5ab4e4dc455523", + "0x92d2150387bc841a0a335417e3abe535a1fb00389ca22c22c68f82c8d4e78d7b", + "0x46a6298ee531dd085c8744359fa14217337e9dab9c28a22272185031198feb90", + "0x70cc7e64749cd76006b7553a3bd6a6d3da7840bb5544a27bf281563a82ad1d7c", + "0x727ca0fbafc16b0d88921b72ede2ba344988eb34339e0beb319906e94b99a50d", + "0x83f40d526191f18869fa9a3b4110f402d2304e4061cf90ef807ffdda90569bae", + "0x4267c3eda8a33a7de851bd9793c7ad5287b16204939a367f6139fcc63ed906e1", + "0xda06431a6cde3975a8d2279a1397714d898550e8e40506fa2b14cad7446745e3", + "0x841648c4d39e19e486d139799bdc0cf70976cdb455d581623c7a78dd3a681f82", + "0x88cf67a8dc5788f2c2423f9ba1a183114e58d51abc359f43a14691b14a49b35d", + "0x52caae2977f3bb88aeb21c8ed26821b69409d9de0356ecb042b39863df018dd3", + "0x2c993df9d2e2d312481f8e2fa518e1e49fbc01e70b1b82aaf3c7450d66b4b6b7", + "0x7fc40087df9f67f334d5b38845bd9a38d28e63f7ecd8ce72bbcf5e40954cfbfb", + "0x7ddcc5b059d9740b3692bdfc5734c024c54657bc0fcb06995455b72821e203c5", + "0x136ea4817f923a3f67706f0c2cfa69ef3dce06fd133206281e8eeca484c349d0", + "0xab84a618b9fd1f69deeb2fdccb86cf43be4d2e207e70928b29cd9c25d219c931", + "0x02408b3f518474db68ee4c1bf09d6f03e96df2628631b1bbc0614652851077d9", + "0x03d20cdf5fc553b833b5a09bc0c1aaef7de687815db28bc72ba0245ec266f818", + "0x6ef4844c3615faa2e9116e1a3413205c0100df07510b94ff889ae00ad7a6b735", + "0xce3ec8047d2051701d0adfbecb07eb72a95b37f7b87f01f8900391b543be9a5a", + "0xf461948fe25cfb681d9be95c34980f19e529ae0e2d958bfbf5034ca3626e6cd8", + "0x9cb75fef2a2f75204c125438c1841af419e92f0b490c7c6fccffe5e89f3f97b1", + "0x7132ee9c9db9faed4ade82b126b3b32ebc755114203a6eac2584fd720f9f86d9", + "0xaf1d9e8cf0734fda38af74ba1425fdf2121c3c597be9f3dd39e22d80e301e52e", + "0xc0ac3a2304310466215b8ac6c423719ef4da871d71fb774e180dd8712be96101", + "0x5fb5fbd3db4e37f637286e9cb2f07e5b878d482569d763549d4954c43215db32", + "0x34de5161e1b351e4e125a0235b7b9844f74b51a467f36e89641381f6fce5a7e4", + "0x606782a845f84ac4107a51b9c24209841173aa3f8e9cc2e51c57bfe72e332633", + "0x058d394d8a87c1e70b4ea57fce960eda9ace177d321b52fc90944ade4407022b", + "0xcf8f4925c630c8021aa1e00a1a001a05642f2adc2465dd52bb7a9a80991e84d2", + "0x0dae85d04c42da27288bdae0c6c8e564ec13f23e85da729cdc510bdc04934f55", + "0xc5b9dd7e2d0e55074e96b8b63159126a9c8ab43d42f56af3e5a326f042786b2c", + "0x9c1989e9163d7cb4710d82a708eb1d46b9cb7a9dcbaf1816f71e37090e94f836", + "0xe8d5dc22434014023f70461aa1c011c880a0f846255575353106b52df595509d", + "0x760d3fdc3d34548004d1aecedd84fb248467975572eb87f782009dc7c7c2d277", + "0x6b93dce72d74101a95b6b00d084972f4e35abce76ee4a58b6c260835f9a28c01", + "0xb6e8237d3d8a290f379f08e38f82f18be7e2d480ddc4f44df3e5f3f6c971cc81", + "0x77ebbde0737b668b3d16d764d055d29ccfac7ece19ba2e8d861f937f54df328e", + "0xa8c044ed1d2d77991561677ad8f9e58c07f2dd2caf110717bbd4cdba4cb60b84", + "0x86dd579810c664218ec61784006191f8511374db0078bc8782f52cc618ee4669", + "0x823fc59a1257302917fb1b53ac9dcb4056958ba764c2811b27db4691538d1a0d", + "0x5cc49ee5c1999eb52922e4be082eee8919bdee082d797a50c1ffa29b6ae4edc8", + "0x4a2e06ce47577ed442cbc35c5b232877793372091fc6efd6d60b77ab26bfb985", + "0x30b8c3227529b8da9c3e9ca74d67b62a594743b0fed7c2d66a9a04c9c2e05847", + "0x3c698f90a3cb7c32c3d909df5e2a6f3bc733ee415b95cc40edc52eab95345239", + "0x1210c6ae4167486def5fd9cf2b7042c7b35066e633145b4ba01413329d80095f", + "0xd5baa536453f7d6062dffb1dd1ee1eb1eaa8449e4a8091351a69d6222022b694", + "0x914297de69e782a4292254de92b5e754a1de92a841da73401eacd62404ef4fd8", + "0x0f052f1b2f73c32c032cd52589c08dd365503f2602bc41afbe143790ba86d89c", + "0x7f492b234cfe8681cf41cde74b479fbe8aa81dd47499cc27b07d9a06007af152", + "0x88bb5da748c6f96f3743edba77c172d061489ec2d8da82bc7f858660ae32c319", + "0x9d5db583ead51d5ed207f9b4aa7c0dc45b64517dc14906b9de0b01adea464bbf", + "0x92b9d0d7883b433d65cf3e2ef5af4c817216692816e1f8a3b27a079b622e251b", + "0x6bde93b8499664d61aedd67898071d1711e565f0565db89df8c2dfc2c7f1c08c", + "0x8bc8bbd4e865d6c446c4840ddbde800f3de2725fdeab0cce5e6e0e1acc23eb09", + "0x66e1fe40cbfede3b8791913b327c391f6a5d81137c5da5367cfeeaea5e6e1a8d", + "0xf2f87039b7beb30d4358b651b8566d509caca0fa4f50148b80b44cace72bd058", + "0x25dedfa2522ec37b9b607ccc7f8a260c5d8fe34b12771028524507bde815f004", + "0xf5808873db2b2b21c719ffa31382d0017ba9c4cc408148bd39ef161ab87307b2", + "0xb979dc5a24b39e9c4272c69d858bc1ee8ec49ae5259cb600b146ad8f27756397", + "0x60c3fa777a9c5d91775a173e137a79ca785989c5c3d71fd163bdda852ddc0cc8", + "0xb5ced19b8f2025e69f79511988f634c2ab0abb37dbce6dbd1e3df5cc58063a62", + "0xcc9d411691a188855b529bd49bf00b08689099b31fbb16e6420282c54167d3ac", + "0xc3d8398954555c2e1c7aff2f5908170892769035889ed3c64bcc842c87ba7499", + "0x8ed00b0d107969f06692868cf8d5bee85be943d417198b44e7c95962a1ddd7a4", + "0xf38a2c1e2179a3739fe8b53812d1ddef8acca6df5389050113992a10652f471f", + "0xf32225385feb683115b88285204d56922bdf59e0f58e332949d0f93aeaace4b5", + "0xc4559a00cd9b5b801c21278ed7a2b2a8e4884fd6baaad9fc986ce8cf85019edb", + "0x328bc1a550b6a9a9732e39ef04917f11a5c88f99a9b1f36009d339313159b0a3", + "0x322ce0bfe3aa6729e20ad2548aaed69e54ea1b94ee99dd7c2ef200677e5198ca", + "0x5b758330b7fc118ca6b36ab6b3dee1cae8dc315cdcebb3cd757d25be9718e2c1", + "0x3969413a5efff28ed9f4187ae712dbafe74ae712d801c15644a3961824e5fa2e", + "0xfcd6eb558bd44c5073aaf04f8c1d2a937a338ae6b75cc6d59d35b40dc707f151", + "0x27e43e27370c02660c742c83b6e8976358cc5e01ed04ec82ae087b5519345f86", + "0xf47ec3250d2cbd2f82e5ad70f93630e17d14ff43c791ddaf1c86715e03ebd5c6", + "0x308aa120dff142e89c16ffe5fd7d2204993ff3657b6ab0aa0dbb0d83d14b2afc", + "0x98fe524716333ba24337ca9d6d913a0cfba21362ea50b6e7285bd71956faa75d", + "0x938cd945ef8deed0eb2703d9875ce64712de9a78900578b85a0de6995323e3c9", + "0xbc31b5581f994b3017d6552a6934ca9c52553a4d42a8100af941edbdb2e91a9d", + "0x7327f0976fe152ac14e7d7d3fe9cc2a6a75b968a265e7e0172c0f350d3e152eb", + "0x6c2479beead9c745fe1060956af733766cc80da7188d2988bdc1340d6cd284d0", + "0x5fed2cf969c6cb9028a4e9bc7648022cc4a4f87522a553af1ab21928cdc55daf", + "0x7e8edab36495ede01b8705c5fdcaf89463371ebe10f57173ea857a9fa2192937", + "0xfb58d0ccbeaaacb3b4519c805255fb590596b54e4fc4430a6ec6c5c7fc9766ce", + "0x937a1898488e374bee45ca21d771793526f6a52b30199040760da726247f7cc3", + "0x6e85be1630192947170547f83f5f5278812841c1097decb2cdd7e7438643053f", + "0x12b0b60b027afc8a39e6c32b65aa828e12a7f9df6c8c1e970f08e18fca430513", + "0xf7037c53bc45bc06d8670e846f84824d109578068eec905054f666ee5510fc2b", + "0xc047b653ccbdd24a41214add8b7076bef8916bb040d47d5345e54d7b8438a099", + "0xee03d8ffcf729e8a46f817143763bdb98d646b9945eb573ee52997622e08bdc7", + "0x1adbbab8b4d4df3914a0dbbe70b6815a8c773f7000fef03b55665939d29a2d4f", + "0x475f1fbb7642240b7abff801b13dd369733c45f3103c836106e99cdd43c0caa8", + "0x2aaad3b7050cd04da0f9e613cadf75862c7e8250ed59163ae113e77d63818992", + "0xcbe88d935e66909bd168057b1601b1abfdd68db2a0c0e4ca61fdcf1dc0408774", + "0x576d6f60f196a7736d9197bca8bf9c82fafa9c934cf8988446e5c86859d89f43", + "0x5ec11602479ff16704b3413fcaf368cd8a6a87ff9f5a3a075ceadea2badeab05", + "0x6be482890a8e1b9de9d3d5d93a75fb3fec750c1b8440f7c9ab072c699ea35351", + "0x621797956f53edc280890b015baf2d0b73db85d3b186498e7e9f40fa3408a1d7", + "0xa622bc30127840cc1c1b83bfcba8410bde851070517b39f73fa0753e39f818ba", + "0x8f2c09f74bfbadbfd75ffa2af29e8ad6f6a67d3891ef8ae8d4d785e99af75757", + "0x2fea6a50503eaa6dff3275ec99f56e67e6125307697e4bdc2c489a3cb69029bf", + "0xe5bf069d84493e9f8fe20682f6241a99dfbce8e0580d26014245b28a15b63a51", + "0x5ccc1e2e1cc064acea0ee9299bf1c9469199bd2bd0c6769dd764a065e1d911ff", + "0xb912bad85e4c8b295e3ba2d68c8c5e0d45ba25d756ab24b0626257de8225ab49", + "0x7477d10d6c663d64dd03ad5051f7482fd5a6e5d320e9740041b13cf555e6a227", + "0xe7e04c26dedb78211e39660347214cf4751f19eedb86bb59f4b56855cbd0d2bf", + "0x61e04f4540f1db5e6acbda2b6b20fa5931a1f19607fa4717239acd737490e7d1", + "0x172a7fdf55b224b2bcd76c248216cea3e45a25f1783ac02150759495288297e5", + "0x304a01bca8244bc1ac8568fac49ebe00c83ac93df08362d3fd80f86dadbb779d", + "0xd495196cb5d83bdb3f962d3222d010e95949e2192f914ca256f25755e36b5bc8", + "0x5f4036ef1381adbdc0ae7a0647ca9051d21d5705a8c5c4753aacced054a86796", + "0xb6b2823ac77073022924ef5eccce0fafbf20cda23ba8ca9cca3972c6adcf772b", + "0xb3b34c3b6f3f3e96b4aa487a2bbfb5cf2b906bf3ab9ec411b6a1ebe19bc38364", + "0xc0c9826164bfacbe623f858bb51fefe867511023a8250c187d3520792d4972a2", + "0x1537fdcf26b6705f4585fe555151a59a557c672b91f39567762076d22de0d9bc", + "0x593d8b50367c9d3daafc403a38950e9c13ee3d3e38367f8ee6f0298cf41d8d5a", + "0xfa22314c812f3f8cf6d91c16a81fdbf93aa8606cf7010dd4711099ae87a3b81f", + "0x6ba7db726fc78312ab135893a5691db6efba59fc92efb206405ca863f289d721", + "0x8a13d09d91065c4d13fa532b0eafe3311ecc8a35b18092b042d7bd4df77b7e72", + "0x7d0afb3306161abe2a76e966d8ed01816930633c11d9caad92e7f45d195f0dd3", + "0xc8ed07d535b55af4ccaeb9c78a330fd051efb34b3d70f81a96f8221ea500efc5", + "0x4b1a35a1d95c3a6a2694938b071810412e6bdaa3681ef263efed5d1f4c93b55a", + "0x457cee6b8d1778eb00415c76c239966559e04b86b0ac597daf918f269b41b082", + "0x27177d9985954a57f90b6ca8b4592e285fec13196c3e2e01407fd3e123b6b516", + "0xdea7e638ca66b09790d12fb6fc8f6d6177aca1a209e090de296b9ecb3e0213d7", + "0x98e7e5327a7d2543822260ea2ed427d4f332dfa691d4547b4acef272010e90a8", + "0xc86428edf6c0b39db083970f80a7c2b04954cd572c49336772aaf27dd87b9849", + "0x17db87fad8a68694ca810bc2e5cefdf7c0f695004e4450d0cede7dbb2f7cf753", + "0xcc2face264b38e98ccb2bfb504675f599091617ac7430d25bbc5fc9481abc8b3", + "0x0495d951e99119e7e66f2372007269a6d76341cc0670acc196fa59df089c0af7", + "0x1a105f9a0ceb3b4ee2205b5626ff63335a9ad16f9abd16bc77b7a782f6769c77", + "0x685745060da6f81b54f0d74dbff6169e00a4fa4e28357d18745246e39c9e6220", + "0x3b5cc9eed80730746770c803eda7737854f0bc15a5adad1eaf4dc1e079613aae", + "0x050bc98e087c86272a5ab2eae1b81a37969c9762a36fb069a5751ff2fa1a1a5d", + "0xfc6f6cee79d69ed119a23bd2111ebe1bf9eb984b6d42440a31e2e9331cb3cb1e", + "0x24fe575b0aeaec871d13bfec4c00e3b48b023008e3c29e193e33c3fa267e6efd", + "0x1764cae60df974607c2da7058b73edf4071603722f32676e7c6d577995d6b37f", + "0xd9aa22b7c733a78ba533536250bb0e5837fc9a38fa73fd7f888b8ce0da88c954", + "0xf3e78ee05410dcd0f991c3ab1bf4a3637e61c54648c3d04cb594965f3463f645", + "0x21c2b2f3635984f79a1798d5705301736928c705bac8627045d4dbca46270e5c", + "0x6869195743c986a275e717728f0b35f5badddadcd4723864f2ccb7752edccf2d", + "0x41d7d273d54fb5bc454c69e8328130064472e89408a313befedcbd0dd5e1fb6c", + "0xf0fba130c22ca0753ee1e4424e767bc6d3fd2bbfa68ba85b195979def650bd88", + "0x1d4da114f9132fbe49907afe713a80866710ca533ff5c4a993ee598b2a17bac3", + "0x172165a85ca4100bcad3fe3082c59fdf3aaf0bed23a938b4b326694f64f7e349", + "0x12cf00d3b11cbfaf2038ca1e9de63e4dff65a3352da5824043978ba8fe7e08cf", + "0xd64011bda551b01b0b33e1065b0069fd1fe103e2e68c50fc5bdf1f99b4ab5e0f", + "0x3e3bef8f3d76d1f410327cfd8f4453e0fb9ed392da173e26ffaaed662411f7af", + "0x435816db536c536e0470a3fbfa32fcd6adab877831ffa66417e19bfaa2c9c62b", + "0x19d27119d0c702eb7735d70b30c26567d6ae4c5d204870a036f2273f027a80a9", + "0xd48c41e8365e9872d953b89e2b3dd0fa762b3360958ec9928124f54c79df5f19", + "0x7da805659d8b9e3f6b14aab3a5bd8d25e9d2d960076b4baf6c394a02fc763d12", + "0x5491cc6940517e3a790bf6e32437537e0241c9fcb3302a3bf94133ceb65b8862", + "0x0568a4d9b4e91fd1046fda2cb8a718ba57ba1526610013f465be7777e94356c1", + "0x0831b1ce49717503b49502ffe6b854ab2eb2c4db30f5ea5033c011f5e5e3d309", + "0xabd50d7ea56144421474763563ecdb591ec1df8645ccba4e28990d8b9b8ed16e", + "0xfe4ceb9425449bde581ef04b46c1fc7bdbd8f422c43d64b2d1bbbe3ff4dd7a26", + "0x489137c52ef8c71e620220d8e9e842c2a5befa812b70b0a709ab4603a729047d", + "0x8fa480e08230c6b9d964bca0bc5d5a246e4eac6c8d45c75a4cfac8c4601f455d", + "0xe5cde020c71c0ad3e7f9a789247e5518bc1b824b4c6297e12d09a42e265e4bef", + "0xd4c0b9e39b70ef4f229884817c317f20f53386969f8c1e2ddc69cfa57b1014f9", + "0x75b91e206eb0a2fa7752da4d6421fc294a4cd7d6d06dbdeb7b7df50e157ae99e", + "0xa650044c8fb1c0d98b1e671d576f389b0b7be37e946b7623ff6203ca72c574aa", + "0xe6dd07898de5688be966dbc612764a9956ef1105a7a02695ea269b6e40ccb077", + "0xd1c7d40ae3558d4b42cbf6bce332e718ed8f9b7026b81195beea713ea9fe81da", + "0xdfd6c816adcdd1a588db0bbb4c09050527a107bcc47d76be91c7e309a54dec92", + "0xa67e60d39fad4b6389908ced2c0b6fc4d0b1ae78379de0452963589cde410618", + "0x88a629bbfd9f5ec014580d47210562cc0ba162fc2e7f609dcc34babef9d2f89a", + "0x685dcd734516a666b7e9018a420cc1ed6f1cd13d13f54dc782d3d2529bafd375", + "0x00adf1bec319f440e54009e1ffc45d58f38a120644a111239aef09d1f91c20ed", + "0x0ec349f19c0374334a6f9463b349e97c6a6696984c7779cf29bf048a6317224e", + "0x0f190a67c3804e6aa618106b554578687d0f3983c8350709362fb7e4728adace", + "0x7af75c91424ed2a01f0b796ea4772780395cf77d4051c91552fcb962a384a04c", + "0xa43e2914fa364effea580b8d8ae6d7c5480acf7b9330b226438c12fb5e478ea2", + "0x38deda38720cb7918d43b4b7296fa0168d77ffefee1217bbe198b382fefade22", + "0x40e97169e2871117267eedd1095f76d97719f6e9dec56b3423a9258bb09815d7", + "0x3368d112a868cabf7d21ea1c5c851fe0a37551c03d72cfd6b235e3a904eb5889", + "0xaa25f4d9f97ca1cdbda79c61f1ab84883a037eed60d9ec2301cdd5c404c9805b", + "0x21132089753a085a0a982388817137c591a9a34d2cd9e6651c57c76a8b80b716", + "0xdf0c2df6ca5680424ac369b411ce78031614632c5fe44e2d8af1ddac30cd729a", + "0x4f55598eecadc5136e90d15fcb9f87e1eec65ce18121127b49cd159c69c94098", + "0x8a6b7276e3def38187b0cf9156aec251bab76637505f97583dc4d426ec86be50", + "0xe8a516509c5bcb7e81372ce88f7d51982e092ea93f895e5dc666ddaea58edd54", + "0x3edb18c971bd2f867ab6dbb3d63228aa94ed0d0eb9f603af71ebfb201095b836", + "0x0e7de89c28113289c1f84ed91c289328b9cac13495b289ce11cd1c5942be1188", + "0x2610da85e8fb400db625442fecb8cbe20435e8736fedf3bbf715501697ae6be0", + "0x5668c3a61683c91b17467e48b2f27c7e377010eaee64c69d53ecb1ab89dee1e1", + "0x58bb1cf79609e7223f1883dcc6d80538e278e514b1e11c6c2871db55dcdd9914", + "0xfd8faec518007958057845c7b9f204c8dd473db5dc19ad5f2460802b1fae2693", + "0x304b287a3513bf02a35fa61a8cb6aeb214d453d9d53213f458c207d2e15a537e", + "0x7b8f9c4775a775637d9e3274068df7c5330096a52750d604e6f3818c4a7f0b15", + "0xaac892295bff6dc1d99e51a4114857a5fffbc3c8b2b24bd057156c91a5e3bf7a", + "0x34266cdb180c5227ebae64b8ddbecec44a6144214b9412d723924a92fb4a93c4", + "0x1ed56966b89b57904056fcec5d2a23ca5a5d809a7f5c889c5123e3994d660398", + "0xb44dde8ad3b29068b5d3b3551bef7082d8f09366ac622e57f6b494bd594c7a03", + "0xabebaf98aa2e70020b83e45d5ab56164dcc58a4493264cdd6dfff3e921b395aa", + "0xdf26e98e5499f58665912d987eaebe8234eec92c9cb4e788b274b9e9cc8b527d", + "0xdb1f809c70c5633bac0f1642ad929984ff56154b16e0d81b8fa6b10706336c3e", + "0xecc6cfaadef8dab02149f15d1f39932e53b3fcf25fdb1d0379ef9b933222c018", + "0x17351e250078e53f17a144aad0933172ddc648a8f2fc530f0d4468623328b43a", + "0xb832ca94746ea0be489afd60548e74d654278b8a08bffdda83f87e58459769c8", + "0xbe1d486c25ec6042a110acb68d2fb9daeafb830f1d739506213b5a0de51887b5", + "0x560e8231a58aa914a6b82977734a8ce364d970af688f014e8957933ca3026d66", + "0x76b6b1959f5e0579fef78f6549b171028811c2fd64265bafd701e0a2de9d64b4", + "0xba8ee49b308ea0c0475cd30b90252f4909063b86119e4d1cd53dcf6b4671b0bb", + "0x168bfb6c2fd68fd7194561d6b0f6f76e733dfa092d550de243a2a7c0e6b14fa0", + "0x8d5dbd6b82c31c1237d84256a837ff86e005033d83622531bb00de243da0e5f4", + "0xd12f68a021b6f806c9d75468486f2c4fbad295ec51c0f507c445fc535a0caa81", + "0xdbe40f0f8ee88a80512e2f9162776abf02218c6dfb61a36042ba973ab55aad3a", + "0x6cf853351f1371aacafc02da272b304b246176c2867377185b349c5f5880257f", + "0x3f37a65caa18187a3552e300aab18b27d4a2b2a25c049f29e5d8d7a2c57af78f", + "0xad59d1d4be0ce243a38e94ffee6b21fe073b28b0bee9b0249f560219e9bf604d", + "0xe28ca7ade73017341acecc09a647c6c0e638f6ebdf1566b534dd27d5e9ad67ce", + "0xe3577a39c6d3670d2fcee9f36bfb4e79bcbea5695013ae037a7a7b4c5302979a", + "0x56a8566c6bb04d61331e9950a97248e152742d6f0408a77258c102efde79a0bd", + "0xf199dbb8b24df16441c45f5db31af6597172dcff5bcb84306a3f8ee9e7ebdea1", + "0x85a9e253bae3c1c5064f320911e7f964c7315602e83374f5df7ba532cd2acefc", + "0x80ce75ad1b2de3054cc12adc1774ef8e37f3123387d06daeb545953b7a2bb044", + "0xb26d9c8ece65562068826bc872a6fd93e76634b8b7b598769d3df142ed5d17d2", + "0xa43a1662961c4bd1bfa93fdf911067aca94460c733f5a9e296f9e47740b6f8a2", + "0xf84716d76638301b784430585722e4c112375a69329ac03fb8e98882fbbd2fb3", + "0xbdb1551fc7d0e24f2096586ea482b83b8603db1642ba6aa12d8369214af5e4c4", + "0x8f8f8de670e0dc95346e2b14b82bf8a63d9a2a4eca385b1fafc19964cf98f710", + "0x6d3f91249ce7f7f852a4ffab23b7e949117df088f2e2aa3db0fb386755a16c92", + "0xeb9c005485707baed2b7ab034e68597bb8be65bd6f8283b690cd338bf7d1826b", + "0xcaa884959fbea1f5110d7cc4360c24b2ede43d32f8cba522d28946ffd2d900fa", + "0xa561dbe805f8ba3cb6d3d1524c4b3bcbc95ac330e6d71d33642412f8f0a1a2a3", + "0xf158b9329dbbb90083c88982656840cb134713ba122e7e39b287bca4b0605dd4", + "0xee3ce79371c0f0a1ac399a3a722a1c7515f6b02d2e03118e3fb6d521e245ab6e", + "0x1083d6dba68c10cb19935b627e5576b5bc4e7904c8ff59657ced1c8397468017", + "0xa893338e4a49166bd36f4361799c7cccaaee211b512e0c8821136cdb823e8ac8", + "0x1327e2948ee57993f1b721e9fedc8f7d2e91f041b3e01340375bcbbdead83bfc", + "0x6bc88c663e475911e9fbdfb9a33931c34bcfff5e533e82059d33cd69ee414d94", + "0x81d95020affda45f536e01b1a4b840eb72afe2e82633d81de11acdeada45d93b", + "0x91e59cb7e3729c776c4dd441c3377659b37fd881760b9e70c73d5288e99bfa0a", + "0xbf69325ef2072cd5e3d2e93b8e6e2abbaa03434212e1ba4d36459a0f064a64ba", + "0x11f4a2d21c3145af81ba0edb80a9c27cf1e2d53b1a43a42b58b49d4340ce4fa2", + "0x8c366dac642346ca05e2fc047999f9adcab3b8166482854b06c77c2439e0655d", + "0xdcae4952619f997d791aa6a973f1c8c1d3a0c21859b0c37bec64533a6f7c0630", + "0x5300c16e42bf43e34c9e59fc5748c3e05d38437943956eb80ae91cebb4e33d87", + "0x40ec29594f14d9d9a76b13342face2565914b050cc5e5eb96299c51ec92a529d", + "0xa7da6ccf5a72ad5b8cfb6d00aed5f9f7e2bd70670c57873735ce976249fdd5d9", + "0x177a1ca473ae2fb06ed39e180567da24fd14faffa062edbdcb0cffe4520045b9", + "0xea7c63d98ea30c23e0f4df53566214eda57c96f9449aab5a02c165ddb8e61bd7", + "0x6bf4bac02febf1f9459a433d08b373143f44c0beabd3f7bce4218259e8d91311", + "0x6883559d2ed97c78d0aea12c0d14f0dbc911db36a3bd9e3f8a7142e1083e118f", + "0x999416083ffc7371c9b95b6d1bea32da9c2b00827e1f0e1f615354dfe76dd5aa", + "0x82873c88efa3041aae1d36c2a787e592a7af56c3d86f321b1dc619b974c88ff6", + "0x6bfb4371b0a7b9eb9e3fb1f6987854d6e4210286b98bf8dfe6f71f12014ffe59", + "0x5502ec7d23c5559afca6ac2d6178c1f2c778e4dca22a6bc8b16619082cafdc00", + "0x97307b650b949382bc80b6ea446b629c0fbd37bb65a36ac1b33b1e4ac310c056", + "0xe33b1569d06b2b5d05065c11a0dc4f22d214a7a4e4003c1888f7469094330a8d", + "0x691870ffdeabba194cbc10492332d51702d75c40681662fcbd5489753bd5fcaf", + "0xd9676a94b8e3eeac02389ca8c0a6d730e2718c0cfc3a5bab3110aa170d64bbf5", + "0xf558d9d27beca0657bd8ca7e82d1788b1777dbe06b474b7598acdfd46e8030cf", + "0x381d766d66669a50d13a141535c441887cad897984d7b2bd52e9bf33c385669c", + "0xacbc99a6cf54ca6fcc9ad8f844f8bbd7639791b663956cda2ac59fed34027024", + "0x04e5b5dfedaa9369bed72fe0ce827e3c16e7a07a274661d76ec92347baa8deda", + "0x2a905b1aa12a30fb04f56b2d9a26a38ce10cc2e9dc910f213ec3c6b368b15bf0", + "0x0f40416a8bc6d699c404972d27c9b69093b387a78f22295cb0a6001cd437a4fa", + "0x05a52a1501ff0d2c044f0c1932e5eb217aa734cabd527d865796fdd120fd8856", + "0x36c70cc55f4b571882ecab711522e4bffd3ae8f6873d940a0e4626ade7797612", + "0x4a7af1b12b32d3bb38ec4aa0cda6535cd96043466a56f0641253c7b21abe9205", + "0xf637f992df45cd4b58d2db4d5c8360a65cf05a11f14dba70638e50b5bf70bff4", + "0x5b271fd0d5a0adaa16218fab9f75e0599d85c093233761a76c03ba060d5b7948", + "0x8e3554617c506afbd2eed41a4c8e2ecc1bf619b163843a983411c884e5b07320", + "0x96c35e763be9f9a95f76c81fbe1659d22715f5cdc0cb36c168c67a1062818914", + "0x1d1235e2789d0d283a3d4c06e391a1e38869c788255facbaca7e23c4e76e5ba4", + "0x25246df476679b7364020ebe600ff596b6eb17b23c68ab05885a02616bd2e5f5", + "0x0a516b13c9e864bcaabf531c43ed3ca725d4521c9d34ee08280fd13500cdcfb5", + "0x15b0defb12ba7d05f4c5b387efbcf5eb41e325ece9a0b83619a5b7e19283b677", + "0x5000d5c4cad2ef87de73eb2f10d6733a840d069200cb30d4221031381e8c8f36", + "0x15e98f25d14ef227fbca0b760e2d436e291d3668498f486611a6a3118f5a8556", + "0xdc0d786b90d673f30f84706d29643bf0c392464f30ea66052b153ec28ee4b7cb", + "0xe4da2a6b7a254b85df06dbe8f2bf24b4ca3ef6d5c3b0fc8c17e0ebd32d5d69ac", + "0xe2e6fe80f327eded1c263684cbc525e27839bc816b237588b902c66623c38eb7", + "0x1b8c963829103769fab68bdf45dfe4d6130abc9560590871665f23b190e959e6", + "0x5d2e7cb7a42acaadbc832fb8974756f9473b18263ea50aa281fbcfe217a15762", + "0xcf46e1381d84a33aa488d4674b3ac43a1b6afb102c7a425fcc1447769ef5e6f9", + "0x00532839fe3e0691e406d230c8d384b6bc562923048ea0d89f1be054252eee58", + "0xa68d5545328145a3dabe1b143a57a13057d14866c6b9c9da8b4781f4efed4945", + "0x5223699aa191c964875eb16507aacefde636e88c0f0093d92bc38be221fb3792", + "0xa9b807ba38a8434b3befcc91f6b93427dc81f365354f62d5ee69730e319ce5d9", + "0xfd0dd9977372d780c38981010a339dd6552e8f81fc7654362590e7c6b9fd1f6f", + "0xca3900d2a87a6e0b04d679bb87dc81bd1ac11e79e4f0355e314c7e41d76de4e3", + "0x78ee224a33ce3b2629f7640392846f17c228288b89d6c2d9db42726cf64225cb", + "0x48a4acdd0758838c9ce2b322bc77459c1cc0fdca3d588d60697c8a5aa3035273", + "0x6eb8aeeda5a4b26e73ac2bd7f838c974b5bc45de138d14ba58b51bfb6d51cf93", + "0xd6895877c885791db924b0ab1a1d666c06a10e6d210e02cf9c2f29726d3c565b", + "0xcffa80c70e6246e7b17173c071384a7b46dfdd5ab4b4b524c88871ca02c7e658", + "0xbf64411370653f8e08373438b03ccff7fc6ae1d70385cd26a7e73b57da07dd75", + "0xd9a39f3b774d208608c7d1d9d1fcdacf0c0ff6e8cb7915bca57e8056a8b914c9", + "0xd6a1f8fae6440d4ba8b2e392dbd07f6dd6290651a221b3749cd2dd6b0f39ba0c", + "0xa1ad925960651423f598ab111a0f2bcc5d3fc7f62fc72eb2753815277183a4ac", + "0xf3f6feaa55dcb3eb9c572404a0da1cf7dbb53983a98873b3f0398aad91773b69", + "0xdb902ac0d33bba7b0bcfbbe3b5533b970d07381fb00a973b4dd92c8f7af7bcb8", + "0x5f97ac6dd3f55bbf179eafc50c64042f2daccfcb3bae9c4305045b709cf19ae2", + "0x7061adfb4514170759ff4ddf3922b10f2c85c1a65c361936e504ec77df84b703", + "0x07ae6b39e66142978d35c4c2a517c55c23ec47ae341557e8cbe8a0d001df0f6f", + "0x0e6b9fc3fec4e75d812128fbbae0946dc48b511b198a5301833992e763423da3", + "0x7e1da14382f9908299fe46dedaf1878a6d01e9070554f1436514d320e0a4ebc8", + "0xdb6cdc7239c51386bb9eb371765cccb84e4e4de38acc5ad7e5503bd0f60a31a4", + "0xcd0069c9fb9ba8d136a2020580827799eac95f613f7b75bce8322fe67ecdc2e0", + "0x06932b0dc851ffb7ce68ed9083cecb5ba074716f188c5bb4df94de8e7e057046", + "0x3a2e83e02240263c4e416898f9d54bd0b579ddb0076537b58c47c3a17df15208", + "0x61b166d6dee81bdf6d101f23bf8ca40b74c2eb3f47561b4ef024d30f410f88a7", + "0x7a9e85a9000cb7308a5c57c7b1421b22f63e64f48630a79e449e7a207cf586a1", + "0xd573fcbaafb3882fdb1985c1b939961d35dd7bcbd5865be82276d0cea1afc7a8", + "0x697152abd7502169e0d801346a41c815d8bd8e75e55845d4a4b251def64a9583", + "0x77e5cfae8dc5913c4bbd4f4d84a797bf8919a0c21a4eab4f5dfb42fe8c5019d3", + "0x6e7af8bd163f679b81489d3ec3cc4948cc57ccb3e0c8cbc80e387783bb87641d", + "0x4bd5ece25cfda291179b8977a84369ab1590c9d4d5b45a24865ca010e5ffa676", + "0x6331f61c715be1fe8e0c90740cb89c0a7cee24524be2258ad49542959f845477", + "0x0af729bb18715399a1b07ffe2e0d562f71c27ee2bc01921c25327d421165bef7", + "0x98ee97e5bbeaa0715143a39f38ac56736f54fe5b971584b4061c58721c051a3f", + "0xd06e19176339b1fb5cf469b1f0ee4350a416d20aaa9c1be50bdd26687b2424bc", + "0x2385cde28be71e40f64ba5db5bd1a8e5f4b767a9a17c21a96fd2642ead428394", + "0x3d2ef2f0e4bae5c2ca6fb9fcfa1a9ffc435471a7a533b3b7df2b28402d335f58", + "0x2ecc6ed70661e692248c80735650c253dfe6b3c2213bfc259ebc70c898ee8e6e", + "0x8a68b3eb663796ca2189e49b9fe5902e36615d03d28ac34c01f63a135b930f0b", + "0x563d7efb4175fc12dab431175b5097186c2379a5aca1901e39d641d02865d426", + "0x1a55cf9842f9008e0730ae9fc6af9f288edba323803d0ae787fc0fdda99be8c9", + "0xccdf47cee7142cad27bbf224f0afd1a6e5178345cab510f2f8ee27115ab27ff7", + "0xc5b3582937ad993c5c234d059e6cd3b98f2fa4e3fe4ad591ecb6ae710b51fee9" ] }, "nodes": [ @@ -2231,262 +2566,859 @@ "enode://691907d5a7dee24884b791e799183e5db01f4fe0b6e9b795ffaf5cf85a3023a637f2abadc82fc0da168405092df869126377c5f190794cd2d1c067245ae2b1ce@13.125.237.43:30303" ], "accounts": { - "0000000000000000000000000000000000000000": { "balance": "1" }, - "0000000000000000000000000000000000000001": { "balance": "1", "nonce": "0", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } }, - "0000000000000000000000000000000000000002": { "balance": "1", "nonce": "0", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } }, - "0000000000000000000000000000000000000003": { "balance": "1", "nonce": "0", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } }, - "0000000000000000000000000000000000000004": { "balance": "1", "nonce": "0", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } }, - "0000000000000000000000000000000000000005": { "balance": "1", "nonce": "0", "builtin": { "name": "modexp", "activate_at": 1700000, "pricing": { "modexp": { "divisor": 20 } } } }, - "0000000000000000000000000000000000000006": { "balance": "1", "nonce": "0", "builtin": { "name": "alt_bn128_add", "activate_at": 1700000, "pricing": { "linear": { "base": 500, "word": 0 } } } }, - "0000000000000000000000000000000000000007": { "balance": "1", "nonce": "0", "builtin": { "name": "alt_bn128_mul", "activate_at": 1700000, "pricing": { "linear": { "base": 40000, "word": 0 } } } }, - "0000000000000000000000000000000000000008": { "balance": "1", "nonce": "0", "builtin": { "name": "alt_bn128_pairing", "activate_at": 1700000, "pricing": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 } } } }, - "0000000000000000000000000000000000000009": { "balance": "1" }, - "000000000000000000000000000000000000000a": { "balance": "0" }, - "000000000000000000000000000000000000000b": { "balance": "0" }, - "000000000000000000000000000000000000000c": { "balance": "0" }, - "000000000000000000000000000000000000000d": { "balance": "0" }, - "000000000000000000000000000000000000000e": { "balance": "0" }, - "000000000000000000000000000000000000000f": { "balance": "0" }, - "0000000000000000000000000000000000000010": { "balance": "0" }, - "0000000000000000000000000000000000000011": { "balance": "0" }, - "0000000000000000000000000000000000000012": { "balance": "0" }, - "0000000000000000000000000000000000000013": { "balance": "0" }, - "0000000000000000000000000000000000000014": { "balance": "0" }, - "0000000000000000000000000000000000000015": { "balance": "0" }, - "0000000000000000000000000000000000000016": { "balance": "0" }, - "0000000000000000000000000000000000000017": { "balance": "0" }, - "0000000000000000000000000000000000000018": { "balance": "0" }, - "0000000000000000000000000000000000000019": { "balance": "0" }, - "000000000000000000000000000000000000001a": { "balance": "0" }, - "000000000000000000000000000000000000001b": { "balance": "0" }, - "000000000000000000000000000000000000001c": { "balance": "0" }, - "000000000000000000000000000000000000001d": { "balance": "0" }, - "000000000000000000000000000000000000001e": { "balance": "0" }, - "000000000000000000000000000000000000001f": { "balance": "0" }, - "0000000000000000000000000000000000000020": { "balance": "0" }, - "0000000000000000000000000000000000000021": { "balance": "0" }, - "0000000000000000000000000000000000000022": { "balance": "0" }, - "0000000000000000000000000000000000000023": { "balance": "0" }, - "0000000000000000000000000000000000000024": { "balance": "0" }, - "0000000000000000000000000000000000000025": { "balance": "0" }, - "0000000000000000000000000000000000000026": { "balance": "0" }, - "0000000000000000000000000000000000000027": { "balance": "0" }, - "0000000000000000000000000000000000000028": { "balance": "0" }, - "0000000000000000000000000000000000000029": { "balance": "0" }, - "000000000000000000000000000000000000002a": { "balance": "0" }, - "000000000000000000000000000000000000002b": { "balance": "0" }, - "000000000000000000000000000000000000002c": { "balance": "0" }, - "000000000000000000000000000000000000002d": { "balance": "0" }, - "000000000000000000000000000000000000002e": { "balance": "0" }, - "000000000000000000000000000000000000002f": { "balance": "0" }, - "0000000000000000000000000000000000000030": { "balance": "0" }, - "0000000000000000000000000000000000000031": { "balance": "0" }, - "0000000000000000000000000000000000000032": { "balance": "0" }, - "0000000000000000000000000000000000000033": { "balance": "0" }, - "0000000000000000000000000000000000000034": { "balance": "0" }, - "0000000000000000000000000000000000000035": { "balance": "0" }, - "0000000000000000000000000000000000000036": { "balance": "0" }, - "0000000000000000000000000000000000000037": { "balance": "0" }, - "0000000000000000000000000000000000000038": { "balance": "0" }, - "0000000000000000000000000000000000000039": { "balance": "0" }, - "000000000000000000000000000000000000003a": { "balance": "0" }, - "000000000000000000000000000000000000003b": { "balance": "0" }, - "000000000000000000000000000000000000003c": { "balance": "0" }, - "000000000000000000000000000000000000003d": { "balance": "0" }, - "000000000000000000000000000000000000003e": { "balance": "0" }, - "000000000000000000000000000000000000003f": { "balance": "0" }, - "0000000000000000000000000000000000000040": { "balance": "0" }, - "0000000000000000000000000000000000000041": { "balance": "0" }, - "0000000000000000000000000000000000000042": { "balance": "0" }, - "0000000000000000000000000000000000000043": { "balance": "0" }, - "0000000000000000000000000000000000000044": { "balance": "0" }, - "0000000000000000000000000000000000000045": { "balance": "0" }, - "0000000000000000000000000000000000000046": { "balance": "0" }, - "0000000000000000000000000000000000000047": { "balance": "0" }, - "0000000000000000000000000000000000000048": { "balance": "0" }, - "0000000000000000000000000000000000000049": { "balance": "0" }, - "000000000000000000000000000000000000004a": { "balance": "0" }, - "000000000000000000000000000000000000004b": { "balance": "0" }, - "000000000000000000000000000000000000004c": { "balance": "0" }, - "000000000000000000000000000000000000004d": { "balance": "0" }, - "000000000000000000000000000000000000004e": { "balance": "0" }, - "000000000000000000000000000000000000004f": { "balance": "0" }, - "0000000000000000000000000000000000000050": { "balance": "0" }, - "0000000000000000000000000000000000000051": { "balance": "0" }, - "0000000000000000000000000000000000000052": { "balance": "0" }, - "0000000000000000000000000000000000000053": { "balance": "0" }, - "0000000000000000000000000000000000000054": { "balance": "0" }, - "0000000000000000000000000000000000000055": { "balance": "0" }, - "0000000000000000000000000000000000000056": { "balance": "0" }, - "0000000000000000000000000000000000000057": { "balance": "0" }, - "0000000000000000000000000000000000000058": { "balance": "0" }, - "0000000000000000000000000000000000000059": { "balance": "0" }, - "000000000000000000000000000000000000005a": { "balance": "0" }, - "000000000000000000000000000000000000005b": { "balance": "0" }, - "000000000000000000000000000000000000005c": { "balance": "0" }, - "000000000000000000000000000000000000005d": { "balance": "0" }, - "000000000000000000000000000000000000005e": { "balance": "0" }, - "000000000000000000000000000000000000005f": { "balance": "0" }, - "0000000000000000000000000000000000000060": { "balance": "0" }, - "0000000000000000000000000000000000000061": { "balance": "0" }, - "0000000000000000000000000000000000000062": { "balance": "0" }, - "0000000000000000000000000000000000000063": { "balance": "0" }, - "0000000000000000000000000000000000000064": { "balance": "0" }, - "0000000000000000000000000000000000000065": { "balance": "0" }, - "0000000000000000000000000000000000000066": { "balance": "0" }, - "0000000000000000000000000000000000000067": { "balance": "0" }, - "0000000000000000000000000000000000000068": { "balance": "0" }, - "0000000000000000000000000000000000000069": { "balance": "0" }, - "000000000000000000000000000000000000006a": { "balance": "0" }, - "000000000000000000000000000000000000006b": { "balance": "0" }, - "000000000000000000000000000000000000006c": { "balance": "0" }, - "000000000000000000000000000000000000006d": { "balance": "0" }, - "000000000000000000000000000000000000006e": { "balance": "0" }, - "000000000000000000000000000000000000006f": { "balance": "0" }, - "0000000000000000000000000000000000000070": { "balance": "0" }, - "0000000000000000000000000000000000000071": { "balance": "0" }, - "0000000000000000000000000000000000000072": { "balance": "0" }, - "0000000000000000000000000000000000000073": { "balance": "0" }, - "0000000000000000000000000000000000000074": { "balance": "0" }, - "0000000000000000000000000000000000000075": { "balance": "0" }, - "0000000000000000000000000000000000000076": { "balance": "0" }, - "0000000000000000000000000000000000000077": { "balance": "0" }, - "0000000000000000000000000000000000000078": { "balance": "0" }, - "0000000000000000000000000000000000000079": { "balance": "0" }, - "000000000000000000000000000000000000007a": { "balance": "0" }, - "000000000000000000000000000000000000007b": { "balance": "0" }, - "000000000000000000000000000000000000007c": { "balance": "0" }, - "000000000000000000000000000000000000007d": { "balance": "0" }, - "000000000000000000000000000000000000007e": { "balance": "0" }, - "000000000000000000000000000000000000007f": { "balance": "0" }, - "0000000000000000000000000000000000000080": { "balance": "0" }, - "0000000000000000000000000000000000000081": { "balance": "0" }, - "0000000000000000000000000000000000000082": { "balance": "0" }, - "0000000000000000000000000000000000000083": { "balance": "0" }, - "0000000000000000000000000000000000000084": { "balance": "0" }, - "0000000000000000000000000000000000000085": { "balance": "0" }, - "0000000000000000000000000000000000000086": { "balance": "0" }, - "0000000000000000000000000000000000000087": { "balance": "0" }, - "0000000000000000000000000000000000000088": { "balance": "0" }, - "0000000000000000000000000000000000000089": { "balance": "0" }, - "000000000000000000000000000000000000008a": { "balance": "0" }, - "000000000000000000000000000000000000008b": { "balance": "0" }, - "000000000000000000000000000000000000008c": { "balance": "0" }, - "000000000000000000000000000000000000008d": { "balance": "0" }, - "000000000000000000000000000000000000008e": { "balance": "0" }, - "000000000000000000000000000000000000008f": { "balance": "0" }, - "0000000000000000000000000000000000000090": { "balance": "0" }, - "0000000000000000000000000000000000000091": { "balance": "0" }, - "0000000000000000000000000000000000000092": { "balance": "0" }, - "0000000000000000000000000000000000000093": { "balance": "0" }, - "0000000000000000000000000000000000000094": { "balance": "0" }, - "0000000000000000000000000000000000000095": { "balance": "0" }, - "0000000000000000000000000000000000000096": { "balance": "0" }, - "0000000000000000000000000000000000000097": { "balance": "0" }, - "0000000000000000000000000000000000000098": { "balance": "0" }, - "0000000000000000000000000000000000000099": { "balance": "0" }, - "000000000000000000000000000000000000009a": { "balance": "0" }, - "000000000000000000000000000000000000009b": { "balance": "0" }, - "000000000000000000000000000000000000009c": { "balance": "0" }, - "000000000000000000000000000000000000009d": { "balance": "0" }, - "000000000000000000000000000000000000009e": { "balance": "0" }, - "000000000000000000000000000000000000009f": { "balance": "0" }, - "00000000000000000000000000000000000000a0": { "balance": "0" }, - "00000000000000000000000000000000000000a1": { "balance": "0" }, - "00000000000000000000000000000000000000a2": { "balance": "0" }, - "00000000000000000000000000000000000000a3": { "balance": "0" }, - "00000000000000000000000000000000000000a4": { "balance": "0" }, - "00000000000000000000000000000000000000a5": { "balance": "0" }, - "00000000000000000000000000000000000000a6": { "balance": "0" }, - "00000000000000000000000000000000000000a7": { "balance": "0" }, - "00000000000000000000000000000000000000a8": { "balance": "0" }, - "00000000000000000000000000000000000000a9": { "balance": "0" }, - "00000000000000000000000000000000000000aa": { "balance": "0" }, - "00000000000000000000000000000000000000ab": { "balance": "0" }, - "00000000000000000000000000000000000000ac": { "balance": "0" }, - "00000000000000000000000000000000000000ad": { "balance": "0" }, - "00000000000000000000000000000000000000ae": { "balance": "0" }, - "00000000000000000000000000000000000000af": { "balance": "0" }, - "00000000000000000000000000000000000000b0": { "balance": "0" }, - "00000000000000000000000000000000000000b1": { "balance": "0" }, - "00000000000000000000000000000000000000b2": { "balance": "0" }, - "00000000000000000000000000000000000000b3": { "balance": "0" }, - "00000000000000000000000000000000000000b4": { "balance": "0" }, - "00000000000000000000000000000000000000b5": { "balance": "0" }, - "00000000000000000000000000000000000000b6": { "balance": "0" }, - "00000000000000000000000000000000000000b7": { "balance": "0" }, - "00000000000000000000000000000000000000b8": { "balance": "0" }, - "00000000000000000000000000000000000000b9": { "balance": "0" }, - "00000000000000000000000000000000000000ba": { "balance": "0" }, - "00000000000000000000000000000000000000bb": { "balance": "0" }, - "00000000000000000000000000000000000000bc": { "balance": "0" }, - "00000000000000000000000000000000000000bd": { "balance": "0" }, - "00000000000000000000000000000000000000be": { "balance": "0" }, - "00000000000000000000000000000000000000bf": { "balance": "0" }, - "00000000000000000000000000000000000000c0": { "balance": "0" }, - "00000000000000000000000000000000000000c1": { "balance": "0" }, - "00000000000000000000000000000000000000c2": { "balance": "0" }, - "00000000000000000000000000000000000000c3": { "balance": "0" }, - "00000000000000000000000000000000000000c4": { "balance": "0" }, - "00000000000000000000000000000000000000c5": { "balance": "0" }, - "00000000000000000000000000000000000000c6": { "balance": "0" }, - "00000000000000000000000000000000000000c7": { "balance": "0" }, - "00000000000000000000000000000000000000c8": { "balance": "0" }, - "00000000000000000000000000000000000000c9": { "balance": "0" }, - "00000000000000000000000000000000000000ca": { "balance": "0" }, - "00000000000000000000000000000000000000cb": { "balance": "0" }, - "00000000000000000000000000000000000000cc": { "balance": "0" }, - "00000000000000000000000000000000000000cd": { "balance": "0" }, - "00000000000000000000000000000000000000ce": { "balance": "0" }, - "00000000000000000000000000000000000000cf": { "balance": "0" }, - "00000000000000000000000000000000000000d0": { "balance": "0" }, - "00000000000000000000000000000000000000d1": { "balance": "0" }, - "00000000000000000000000000000000000000d2": { "balance": "0" }, - "00000000000000000000000000000000000000d3": { "balance": "0" }, - "00000000000000000000000000000000000000d4": { "balance": "0" }, - "00000000000000000000000000000000000000d5": { "balance": "0" }, - "00000000000000000000000000000000000000d6": { "balance": "0" }, - "00000000000000000000000000000000000000d7": { "balance": "0" }, - "00000000000000000000000000000000000000d8": { "balance": "0" }, - "00000000000000000000000000000000000000d9": { "balance": "0" }, - "00000000000000000000000000000000000000da": { "balance": "0" }, - "00000000000000000000000000000000000000db": { "balance": "0" }, - "00000000000000000000000000000000000000dc": { "balance": "0" }, - "00000000000000000000000000000000000000dd": { "balance": "0" }, - "00000000000000000000000000000000000000de": { "balance": "0" }, - "00000000000000000000000000000000000000df": { "balance": "0" }, - "00000000000000000000000000000000000000e0": { "balance": "0" }, - "00000000000000000000000000000000000000e1": { "balance": "0" }, - "00000000000000000000000000000000000000e2": { "balance": "0" }, - "00000000000000000000000000000000000000e3": { "balance": "0" }, - "00000000000000000000000000000000000000e4": { "balance": "0" }, - "00000000000000000000000000000000000000e5": { "balance": "0" }, - "00000000000000000000000000000000000000e6": { "balance": "0" }, - "00000000000000000000000000000000000000e7": { "balance": "0" }, - "00000000000000000000000000000000000000e8": { "balance": "0" }, - "00000000000000000000000000000000000000e9": { "balance": "0" }, - "00000000000000000000000000000000000000ea": { "balance": "0" }, - "00000000000000000000000000000000000000eb": { "balance": "0" }, - "00000000000000000000000000000000000000ec": { "balance": "0" }, - "00000000000000000000000000000000000000ed": { "balance": "0" }, - "00000000000000000000000000000000000000ee": { "balance": "0" }, - "00000000000000000000000000000000000000ef": { "balance": "0" }, - "00000000000000000000000000000000000000f0": { "balance": "0" }, - "00000000000000000000000000000000000000f1": { "balance": "0" }, - "00000000000000000000000000000000000000f2": { "balance": "0" }, - "00000000000000000000000000000000000000f3": { "balance": "0" }, - "00000000000000000000000000000000000000f4": { "balance": "0" }, - "00000000000000000000000000000000000000f5": { "balance": "0" }, - "00000000000000000000000000000000000000f6": { "balance": "0" }, - "00000000000000000000000000000000000000f7": { "balance": "0" }, - "00000000000000000000000000000000000000f8": { "balance": "0" }, - "00000000000000000000000000000000000000f9": { "balance": "0" }, - "00000000000000000000000000000000000000fa": { "balance": "0" }, - "00000000000000000000000000000000000000fb": { "balance": "0" }, - "00000000000000000000000000000000000000fc": { "balance": "0" }, - "00000000000000000000000000000000000000fd": { "balance": "0" }, - "00000000000000000000000000000000000000fe": { "balance": "0" }, - "00000000000000000000000000000000000000ff": { "balance": "0" }, - "874b54a8bd152966d63f706bae1ffeb0411921e5": { "balance": "1000000000000000000000000000000" } + "0x0000000000000000000000000000000000000000": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000001": { + "balance": "0x1", + "nonce": "0x0", + "builtin": { + "name": "ecrecover", + "pricing": { + "linear": { + "base": 3000, + "word": 0 + } + } + } + }, + "0x0000000000000000000000000000000000000002": { + "balance": "0x1", + "nonce": "0x0", + "builtin": { + "name": "sha256", + "pricing": { + "linear": { + "base": 60, + "word": 12 + } + } + } + }, + "0x0000000000000000000000000000000000000003": { + "balance": "0x1", + "nonce": "0x0", + "builtin": { + "name": "ripemd160", + "pricing": { + "linear": { + "base": 600, + "word": 120 + } + } + } + }, + "0x0000000000000000000000000000000000000004": { + "balance": "0x1", + "nonce": "0x0", + "builtin": { + "name": "identity", + "pricing": { + "linear": { + "base": 15, + "word": 3 + } + } + } + }, + "0x0000000000000000000000000000000000000005": { + "balance": "0x1", + "nonce": "0x0", + "builtin": { + "name": "modexp", + "activate_at": "0x19f0a0", + "pricing": { + "modexp": { + "divisor": 20 + } + } + } + }, + "0x0000000000000000000000000000000000000006": { + "balance": "0x1", + "nonce": "0x0", + "builtin": { + "name": "alt_bn128_add", + "activate_at": "0x19f0a0", + "pricing": { + "linear": { + "base": 500, + "word": 0 + } + } + } + }, + "0x0000000000000000000000000000000000000007": { + "balance": "0x1", + "nonce": "0x0", + "builtin": { + "name": "alt_bn128_mul", + "activate_at": "0x19f0a0", + "pricing": { + "linear": { + "base": 40000, + "word": 0 + } + } + } + }, + "0x0000000000000000000000000000000000000008": { + "balance": "0x1", + "nonce": "0x0", + "builtin": { + "name": "alt_bn128_pairing", + "activate_at": "0x19f0a0", + "pricing": { + "alt_bn128_pairing": { + "base": 100000, + "pair": 80000 + } + } + } + }, + "0x0000000000000000000000000000000000000009": { + "balance": "0x1" + }, + "0x000000000000000000000000000000000000000a": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000000b": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000000c": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000000d": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000000e": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000000f": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000010": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000011": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000012": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000013": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000014": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000015": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000016": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000017": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000018": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000019": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000001a": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000001b": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000001c": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000001d": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000001e": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000001f": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000020": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000021": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000022": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000023": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000024": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000025": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000026": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000027": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000028": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000029": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000002a": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000002b": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000002c": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000002d": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000002e": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000002f": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000030": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000031": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000032": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000033": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000034": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000035": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000036": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000037": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000038": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000039": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000003a": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000003b": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000003c": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000003d": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000003e": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000003f": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000040": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000041": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000042": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000043": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000044": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000045": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000046": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000047": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000048": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000049": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000004a": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000004b": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000004c": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000004d": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000004e": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000004f": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000050": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000051": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000052": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000053": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000054": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000055": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000056": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000057": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000058": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000059": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000005a": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000005b": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000005c": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000005d": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000005e": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000005f": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000060": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000061": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000062": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000063": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000064": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000065": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000066": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000067": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000068": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000069": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000006a": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000006b": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000006c": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000006d": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000006e": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000006f": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000070": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000071": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000072": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000073": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000074": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000075": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000076": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000077": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000078": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000079": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000007a": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000007b": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000007c": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000007d": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000007e": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000007f": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000080": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000081": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000082": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000083": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000084": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000085": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000086": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000087": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000088": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000089": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000008a": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000008b": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000008c": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000008d": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000008e": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000008f": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000090": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000091": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000092": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000093": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000094": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000095": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000096": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000097": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000098": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000000099": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000009a": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000009b": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000009c": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000009d": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000009e": { + "balance": "0x0" + }, + "0x000000000000000000000000000000000000009f": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000a0": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000a1": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000a2": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000a3": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000a4": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000a5": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000a6": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000a7": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000a8": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000a9": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000aa": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000ab": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000ac": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000ad": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000ae": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000af": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000b0": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000b1": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000b2": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000b3": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000b4": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000b5": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000b6": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000b7": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000b8": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000b9": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000ba": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000bb": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000bc": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000bd": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000be": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000bf": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000c0": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000c1": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000c2": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000c3": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000c4": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000c5": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000c6": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000c7": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000c8": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000c9": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000ca": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000cb": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000cc": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000cd": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000ce": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000cf": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000d0": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000d1": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000d2": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000d3": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000d4": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000d5": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000d6": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000d7": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000d8": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000d9": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000da": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000db": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000dc": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000dd": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000de": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000df": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000e0": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000e1": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000e2": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000e3": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000e4": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000e5": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000e6": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000e7": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000e8": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000e9": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000ea": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000eb": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000ec": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000ed": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000ee": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000ef": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000f0": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000f1": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000f2": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000f3": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000f4": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000f5": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000f6": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000f7": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000f8": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000f9": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000fa": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000fb": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000fc": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000fd": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000fe": { + "balance": "0x0" + }, + "0x00000000000000000000000000000000000000ff": { + "balance": "0x0" + }, + "0x874b54a8bd152966d63f706bae1ffeb0411921e5": { + "balance": "0xc9f2c9cd04674edea40000000" + } } } diff --git a/ethcore/res/ethereum/st_peters_test.json b/ethcore/res/ethereum/st_peters_test.json new file mode 100644 index 00000000000..ee88008f668 --- /dev/null +++ b/ethcore/res/ethereum/st_peters_test.json @@ -0,0 +1,65 @@ +{ + "name": "St. Peter's (test)", + "engine": { + "Ethash": { + "params": { + "minimumDifficulty": "0x020000", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "blockReward": "0x1BC16D674EC80000", + "homesteadTransition": "0x0", + "eip100bTransition": "0x0", + "difficultyBombDelays": { + "0": 5000000 + } + } + } + }, + "params": { + "gasLimitBoundDivisor": "0x0400", + "registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b", + "accountStartNonce": "0x00", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0x1388", + "networkID" : "0x1", + "maxCodeSize": 24576, + "maxCodeSizeTransition": "0x0", + "eip150Transition": "0x0", + "eip160Transition": "0x0", + "eip161abcTransition": "0x0", + "eip161dTransition": "0x0", + "eip140Transition": "0x0", + "eip211Transition": "0x0", + "eip214Transition": "0x0", + "eip155Transition": "0x0", + "eip658Transition": "0x0", + "eip145Transition": "0x0", + "eip1014Transition": "0x0", + "eip1052Transition": "0x0", + "eip1283DisableTransition": "0x0" + }, + "genesis": { + "seal": { + "ethereum": { + "nonce": "0x0000000000000042", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "difficulty": "0x400000000", + "author": "0x0000000000000000000000000000000000000000", + "timestamp": "0x00", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0x1388" + }, + "accounts": { + "0000000000000000000000000000000000000001": { "balance": "1", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } }, + "0000000000000000000000000000000000000002": { "balance": "1", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } }, + "0000000000000000000000000000000000000003": { "balance": "1", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } }, + "0000000000000000000000000000000000000004": { "balance": "1", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } }, + "0000000000000000000000000000000000000005": { "builtin": { "name": "modexp", "activate_at": "0x00", "pricing": { "modexp": { "divisor": 20 } } } }, + "0000000000000000000000000000000000000006": { "builtin": { "name": "alt_bn128_add", "activate_at": "0x00", "pricing": { "linear": { "base": 500, "word": 0 } } } }, + "0000000000000000000000000000000000000007": { "builtin": { "name": "alt_bn128_mul", "activate_at": "0x00", "pricing": { "linear": { "base": 40000, "word": 0 } } } }, + "0000000000000000000000000000000000000008": { "builtin": { "name": "alt_bn128_pairing", "activate_at": "0x00", "pricing": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 } } } } + } +} diff --git a/ethcore/res/ethereum/tests b/ethcore/res/ethereum/tests index 2cd62aeec11..725dbc73a54 160000 --- a/ethcore/res/ethereum/tests +++ b/ethcore/res/ethereum/tests @@ -1 +1 @@ -Subproject commit 2cd62aeec11da29766b30d500f2b9a96f1f28cf0 +Subproject commit 725dbc73a54649e22a00330bd0f4d6699a5060e5 diff --git a/ethcore/res/ethereum/tests-issues/currents.json b/ethcore/res/ethereum/tests-issues/currents.json index 2ece034d098..d4d3f5e3aae 100644 --- a/ethcore/res/ethereum/tests-issues/currents.json +++ b/ethcore/res/ethereum/tests-issues/currents.json @@ -1,42 +1,4 @@ -{ "block": - [ - { - "reference": "None", - "comment": "This failing test is deemed skippable. Could not happen on a mainnet.", - "failing": "GeneralStateTest_stCreate2", - "subtests": ["RevertInCreateInInitCreate2_d0g0v0_Constantinople"] - }, - { - "reference": "None", - "comment": "This failing test is deemed skippable. Could not happen on a mainnet.", - "failing": "GeneralStateTest_stRevertTest", - "subtests": ["RevertInCreateInInit_d0g0v0_Constantinople"] - } - ], - "state": - [ - { - "reference": "None", - "comment": "This failing test is deemed skippable. Could not happen on a mainnet.", - "failing": "stCreate2Test", - "subtests": { - "RevertInCreateInInitCreate2": { - "subnumbers": ["1"], - "chain": "Constantinople (test)" - } - } - }, - { - "reference": "None", - "comment": "This failing test is deemed skippable. Could not happen on a mainnet.", - "failing": "stRevertTest", - "subtests": { - "RevertInCreateInInit": { - "subnumbers": ["1"], - "chain": "Constantinople (test)" - } - } - } - - ] +{ + "block": [], + "state": [] } diff --git a/ethcore/res/ethereum/tobalaba.json b/ethcore/res/ethereum/tobalaba.json index 5dfaada0318..043367cc72d 100644 --- a/ethcore/res/ethereum/tobalaba.json +++ b/ethcore/res/ethereum/tobalaba.json @@ -66,9 +66,15 @@ }, "nodes": [ - "enode://eda34244538d72f42605a6fc8b8a34b15714c683989e8b29dc9e7a2b2088da490a5b32f2c149bec5a5c482bf03ec2c4f38b833ae31e36fcb26fb05fd094b2a88@18.197.33.9:30303", - "enode://12e903e900137b02b22e01f7918bd6e7310773c313e4e577281f35597e394a3e0b54c7314a8970a9776c5a3e5dc4daee289215dea3897bcb6d5cf0bb1dd2d356@18.197.31.231:30303", - "enode://423fdb91b37ec0714af0c19f625ec4af3ada2844367a36e45a05703577a84f7f0e9483585d4950a35c9e3738dba8c6abd7e1ce278d9a1f3f28065bc009f409cd@52.221.203.209:30303", - "enode://a9327d37d07799817d4a3e13d49fb4f5cc1486d4adf3ec8a6b98be62c4d7a5453914a5139dbe124809a388514cb0be37f9fa799539abe2250672f6d3d778b821@18.191.209.251:30303" + "enode://a9327d37d07799817d4a3e13d49fb4f5cc1486d4adf3ec8a6b98be62c4d7a5453914a5139dbe124809a388514cb0be37f9fa799539abe2250672f6d3d778b821@18.191.209.251:30303", + "enode://8185e15b0e269e19b9051ba2c3bab9160f0e52a8e5e2cef626013142d957c4256f0b18e80965a9fa9acabdb2ba07890c995ad354cbda0fa812ded5a5ce878321@3.121.61.202:30303", + "enode://38fab1370b042170b37ebd758d07c17b7aa4fd4ff21db8e8f120ade9cf17835ae67fd014a047ee171952fba2a05a90505fedbe98c883b20e4501d437aec8b831@3.122.42.125:30303", + "enode://d2fdbd9efe681080410775dbe986014e21a6a096b6dfd7d2c499f3b893951adf3aae0164392404f6269d231192735bd0c8da3d022639e8a36d8d17299daa632a@3.122.18.27:30303", + "enode://9745ffa93cde2a0e22528fbd4a4f8b5102035ab8c7a781918c9ef92dee6e5a21635dfd106ccfbcf24f4fdd52e8fb513b7f3f55ced90c9b61f2cd756bccd7f660@18.210.141.224:30303", + "enode://4c36427e744783bcbc595a7fbbe785951130d8d4fe9f2206c78538fcf43fb19172df8a577c4ae0c91b7627b057bdf148666a7e4e428650e677f9c443e59479e4@3.86.127.87:30303", + "enode://b447c1eaad456996ae4ce965a01d543b8f4b0d7e78e23d2cc2d328fe0e0b87dac55eaebe9a27ae24fb879cf056b52b11d967d37a731f5f5987ec4fc0dfb4d908@34.236.121.163:30303", + "enode://916dba32ba88b7a5554d862b5a01b5eddf805788545f2ba6ee682f1cfe08eac132b71a4d725bc73c7b687496e525bf414e7d90cd223dacebe1946e3bb464bca0@18.136.95.237:30303", + "enode://a46393687ee9fbe798aba517d8f92443e45ed7e5ea85aa996c62998088607d57b000001945063045584861652802325d93828cef29a9eb966772f75521dff8c6@3.0.157.214:30303", + "enode://94b92761837031a7afbbc7e6a4363baf6c5f04c7766ab63f4f5b47c98be30faef6e5e91d30cc08dd682a6dc16cdd4f85ec6843f4ac9f18887d4da20b04878ea6@52.220.46.9:30303" ] } diff --git a/ethcore/service/Cargo.toml b/ethcore/service/Cargo.toml index 4eb4c940ccb..7db0ad2770b 100644 --- a/ethcore/service/Cargo.toml +++ b/ethcore/service/Cargo.toml @@ -7,16 +7,17 @@ authors = ["Parity Technologies "] ansi_term = "0.10" error-chain = { version = "0.12", default-features = false } ethcore = { path = ".." } +ethcore-blockchain = { path = "../blockchain" } ethcore-io = { path = "../../util/io" } ethcore-private-tx = { path = "../private-tx" } ethcore-sync = { path = "../sync" } ethereum-types = "0.4" kvdb = "0.1" log = "0.4" -stop-guard = { path = "../../util/stop-guard" } trace-time = "0.1" [dev-dependencies] +ethcore-db = { path = "../db" } ethcore = { path = "..", features = ["test-helpers"] } tempdir = "0.3" kvdb-rocksdb = "0.1.3" diff --git a/ethcore/service/src/error.rs b/ethcore/service/src/error.rs index bb403d0bfc0..d46abe1d95c 100644 --- a/ethcore/service/src/error.rs +++ b/ethcore/service/src/error.rs @@ -1,18 +1,22 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . + +// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` +// https://github.com/paritytech/parity-ethereum/issues/10302 +#![allow(deprecated)] use ethcore; use io; diff --git a/ethcore/service/src/lib.rs b/ethcore/service/src/lib.rs index 7ded2af79ef..7828fff8b44 100644 --- a/ethcore/service/src/lib.rs +++ b/ethcore/service/src/lib.rs @@ -1,42 +1,43 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate ansi_term; extern crate ethcore; +extern crate ethcore_blockchain as blockchain; extern crate ethcore_io as io; extern crate ethcore_private_tx; extern crate ethcore_sync as sync; extern crate ethereum_types; extern crate kvdb; -extern crate stop_guard; #[macro_use] extern crate error_chain; - #[macro_use] extern crate log; - #[macro_use] extern crate trace_time; +#[cfg(test)] +extern crate ethcore_db; #[cfg(test)] extern crate tempdir; mod error; mod service; +mod stop_guard; #[cfg(test)] extern crate kvdb_rocksdb; diff --git a/ethcore/service/src/service.rs b/ethcore/service/src/service.rs index 77429a4e56e..c16a071892b 100644 --- a/ethcore/service/src/service.rs +++ b/ethcore/service/src/service.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Creates and registers client and network services. @@ -26,15 +26,14 @@ use io::{IoContext, TimerToken, IoHandler, IoService, IoError}; use stop_guard::StopGuard; use sync::PrivateTxHandler; -use ethcore::{BlockChainDB, BlockChainDBHandler}; +use blockchain::{BlockChainDB, BlockChainDBHandler}; use ethcore::client::{Client, ClientConfig, ChainNotify, ClientIoMessage}; use ethcore::miner::Miner; use ethcore::snapshot::service::{Service as SnapshotService, ServiceParams as SnapServiceParams}; use ethcore::snapshot::{SnapshotService as _SnapshotService, RestorationStatus}; use ethcore::spec::Spec; -use ethcore::account_provider::AccountProvider; -use ethcore_private_tx::{self, Importer}; +use ethcore_private_tx::{self, Importer, Signer}; use Error; pub struct PrivateTxService { @@ -96,9 +95,10 @@ impl ClientService { restoration_db_handler: Box, _ipc_path: &Path, miner: Arc, - account_provider: Arc, + signer: Arc, encryptor: Box, private_tx_conf: ethcore_private_tx::ProviderConfig, + private_encryptor_conf: ethcore_private_tx::EncryptorConfig, ) -> Result { let io_service = IoService::::start()?; @@ -127,13 +127,18 @@ impl ClientService { }; let snapshot = Arc::new(SnapshotService::new(snapshot_params)?); + let private_keys = Arc::new(ethcore_private_tx::SecretStoreKeys::new( + client.clone(), + private_encryptor_conf.key_server_account, + )); let provider = Arc::new(ethcore_private_tx::Provider::new( - client.clone(), - miner, - account_provider, - encryptor, - private_tx_conf, - io_service.channel(), + client.clone(), + miner, + signer, + encryptor, + private_tx_conf, + io_service.channel(), + private_keys, )); let private_tx = Arc::new(PrivateTxService::new(provider)); @@ -275,11 +280,10 @@ mod tests { use tempdir::TempDir; - use ethcore::account_provider::AccountProvider; + use ethcore_db::NUM_COLUMNS; use ethcore::client::ClientConfig; use ethcore::miner::Miner; use ethcore::spec::Spec; - use ethcore::db::NUM_COLUMNS; use ethcore::test_helpers; use kvdb_rocksdb::{DatabaseConfig, CompactionProfile}; use super::*; @@ -311,9 +315,10 @@ mod tests { restoration_db_handler, tempdir.path(), Arc::new(Miner::new_for_tests(&spec, None)), - Arc::new(AccountProvider::transient_provider()), + Arc::new(ethcore_private_tx::DummySigner), Box::new(ethcore_private_tx::NoopEncryptor), Default::default(), + Default::default(), ); assert!(service.is_ok()); drop(service.unwrap()); diff --git a/util/stop-guard/src/lib.rs b/ethcore/service/src/stop_guard.rs similarity index 68% rename from util/stop-guard/src/lib.rs rename to ethcore/service/src/stop_guard.rs index 208b57c6d90..168219520a1 100644 --- a/util/stop-guard/src/lib.rs +++ b/ethcore/service/src/stop_guard.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Stop guard mod @@ -31,11 +31,6 @@ impl StopGuard { flag: Arc::new(AtomicBool::new(false)) } } - - /// Share stop guard between the threads - pub fn share(&self) -> Arc { - self.flag.clone() - } } impl Drop for StopGuard { diff --git a/ethcore/src/account_db.rs b/ethcore/src/account_db.rs index c028beeb1cf..a389c009bf7 100644 --- a/ethcore/src/account_db.rs +++ b/ethcore/src/account_db.rs @@ -1,27 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! DB backend wrapper for Account trie use ethereum_types::H256; use hash::{KECCAK_NULL_RLP, keccak}; -use hashdb::{HashDB, AsHashDB}; +use hash_db::{HashDB, AsHashDB}; use keccak_hasher::KeccakHasher; use kvdb::DBValue; use rlp::NULL_RLP; -use std::collections::HashMap; #[cfg(test)] use ethereum_types::Address; @@ -99,15 +98,11 @@ impl<'db> AccountDB<'db> { } impl<'db> AsHashDB for AccountDB<'db> { - fn as_hashdb(&self) -> &HashDB { self } - fn as_hashdb_mut(&mut self) -> &mut HashDB { self } + fn as_hash_db(&self) -> &HashDB { self } + fn as_hash_db_mut(&mut self) -> &mut HashDB { self } } impl<'db> HashDB for AccountDB<'db> { - fn keys(&self) -> HashMap { - unimplemented!() - } - fn get(&self, key: &H256) -> Option { if key == &KECCAK_NULL_RLP { return Some(DBValue::from_slice(&NULL_RLP)); @@ -163,10 +158,6 @@ impl<'db> AccountDBMut<'db> { } impl<'db> HashDB for AccountDBMut<'db>{ - fn keys(&self) -> HashMap { - unimplemented!() - } - fn get(&self, key: &H256) -> Option { if key == &KECCAK_NULL_RLP { return Some(DBValue::from_slice(&NULL_RLP)); @@ -209,22 +200,18 @@ impl<'db> HashDB for AccountDBMut<'db>{ } impl<'db> AsHashDB for AccountDBMut<'db> { - fn as_hashdb(&self) -> &HashDB { self } - fn as_hashdb_mut(&mut self) -> &mut HashDB { self } + fn as_hash_db(&self) -> &HashDB { self } + fn as_hash_db_mut(&mut self) -> &mut HashDB { self } } struct Wrapping<'db>(&'db HashDB); impl<'db> AsHashDB for Wrapping<'db> { - fn as_hashdb(&self) -> &HashDB { self } - fn as_hashdb_mut(&mut self) -> &mut HashDB { self } + fn as_hash_db(&self) -> &HashDB { self } + fn as_hash_db_mut(&mut self) -> &mut HashDB { self } } impl<'db> HashDB for Wrapping<'db> { - fn keys(&self) -> HashMap { - unimplemented!() - } - fn get(&self, key: &H256) -> Option { if key == &KECCAK_NULL_RLP { return Some(DBValue::from_slice(&NULL_RLP)); @@ -254,15 +241,11 @@ impl<'db> HashDB for Wrapping<'db> { struct WrappingMut<'db>(&'db mut HashDB); impl<'db> AsHashDB for WrappingMut<'db> { - fn as_hashdb(&self) -> &HashDB { self } - fn as_hashdb_mut(&mut self) -> &mut HashDB { self } + fn as_hash_db(&self) -> &HashDB { self } + fn as_hash_db_mut(&mut self) -> &mut HashDB { self } } impl<'db> HashDB for WrappingMut<'db>{ - fn keys(&self) -> HashMap { - unimplemented!() - } - fn get(&self, key: &H256) -> Option { if key == &KECCAK_NULL_RLP { return Some(DBValue::from_slice(&NULL_RLP)); diff --git a/ethcore/src/block.rs b/ethcore/src/block.rs index 00da9fa9f99..e5fcb451617 100644 --- a/ethcore/src/block.rs +++ b/ethcore/src/block.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Base data structure of this module is `Block`. //! @@ -36,59 +36,58 @@ use std::collections::HashSet; use std::sync::Arc; use bytes::Bytes; +use ethereum_types::{H256, U256, Address, Bloom}; + use engines::EthEngine; use error::{Error, BlockError}; -use ethereum_types::{H256, U256, Address, Bloom}; use factory::Factories; -use hash::keccak; -use header::{Header, ExtendedHeader}; -use receipt::{Receipt, TransactionOutcome}; -use rlp::{Rlp, RlpStream, Encodable, Decodable, DecoderError, encode_list}; use state_db::StateDB; use state::State; use trace::Tracing; -use transaction::{UnverifiedTransaction, SignedTransaction, Error as TransactionError}; use triehash::ordered_trie_root; use unexpected::{Mismatch, OutOfBounds}; use verification::PreverifiedBlock; use vm::{EnvInfo, LastHashes}; -/// A block, encoded as it is on the block chain. -#[derive(Default, Debug, Clone, PartialEq)] -pub struct Block { - /// The header of this block. - pub header: Header, - /// The transactions in this block. - pub transactions: Vec, - /// The uncles of this block. - pub uncles: Vec
, +use hash::keccak; +use rlp::{RlpStream, Encodable, encode_list}; +use types::transaction::{SignedTransaction, Error as TransactionError}; +use types::block::Block; +use types::header::{Header, ExtendedHeader}; +use types::receipt::{Receipt, TransactionOutcome}; + +/// Block that is ready for transactions to be added. +/// +/// It's a bit like a Vec, except that whenever a transaction is pushed, we execute it and +/// maintain the system `state()`. We also archive execution receipts in preparation for later block creation. +pub struct OpenBlock<'x> { + block: ExecutedBlock, + engine: &'x EthEngine, } -impl Block { - /// Get the RLP-encoding of the block with the seal. - pub fn rlp_bytes(&self) -> Bytes { - let mut block_rlp = RlpStream::new_list(3); - block_rlp.append(&self.header); - block_rlp.append_list(&self.transactions); - block_rlp.append_list(&self.uncles); - block_rlp.out() - } +/// Just like `OpenBlock`, except that we've applied `Engine::on_close_block`, finished up the non-seal header fields, +/// and collected the uncles. +/// +/// There is no function available to push a transaction. +#[derive(Clone)] +pub struct ClosedBlock { + block: ExecutedBlock, + unclosed_state: State, } -impl Decodable for Block { - fn decode(rlp: &Rlp) -> Result { - if rlp.as_raw().len() != rlp.payload_info()?.total() { - return Err(DecoderError::RlpIsTooBig); - } - if rlp.item_count()? != 3 { - return Err(DecoderError::RlpIncorrectListLen); - } - Ok(Block { - header: rlp.val_at(0)?, - transactions: rlp.list_at(1)?, - uncles: rlp.list_at(2)?, - }) - } +/// Just like `ClosedBlock` except that we can't reopen it and it's faster. +/// +/// We actually store the post-`Engine::on_close_block` state, unlike in `ClosedBlock` where it's the pre. +#[derive(Clone)] +pub struct LockedBlock { + block: ExecutedBlock, +} + +/// A block that has a valid seal. +/// +/// The block's header has valid seal arguments. The block cannot be reversed into a `ClosedBlock` or `OpenBlock`. +pub struct SealedBlock { + block: ExecutedBlock, } /// An internal type for a block's common elements. @@ -216,40 +215,6 @@ impl ::parity_machine::Transactions for ExecutedBlock { } } -/// Block that is ready for transactions to be added. -/// -/// It's a bit like a Vec, except that whenever a transaction is pushed, we execute it and -/// maintain the system `state()`. We also archive execution receipts in preparation for later block creation. -pub struct OpenBlock<'x> { - block: ExecutedBlock, - engine: &'x EthEngine, -} - -/// Just like `OpenBlock`, except that we've applied `Engine::on_close_block`, finished up the non-seal header fields, -/// and collected the uncles. -/// -/// There is no function available to push a transaction. -#[derive(Clone)] -pub struct ClosedBlock { - block: ExecutedBlock, - unclosed_state: State, -} - -/// Just like `ClosedBlock` except that we can't reopen it and it's faster. -/// -/// We actually store the post-`Engine::on_close_block` state, unlike in `ClosedBlock` where it's the pre. -#[derive(Clone)] -pub struct LockedBlock { - block: ExecutedBlock, -} - -/// A block that has a valid seal. -/// -/// The block's header has valid seal arguments. The block cannot be reversed into a `ClosedBlock` or `OpenBlock`. -pub struct SealedBlock { - block: ExecutedBlock, -} - impl<'x> OpenBlock<'x> { /// Create a new `OpenBlock` ready for transaction pushing. pub fn new<'a>( @@ -630,14 +595,15 @@ mod tests { use engines::EthEngine; use vm::LastHashes; use error::Error; - use header::Header; use factory::Factories; use state_db::StateDB; - use views::BlockView; use ethereum_types::Address; use std::sync::Arc; - use transaction::SignedTransaction; use verification::queue::kind::blocks::Unverified; + use types::transaction::SignedTransaction; + use types::header::Header; + use types::view; + use types::views::BlockView; /// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header fn enact_bytes( diff --git a/ethcore/src/builtin.rs b/ethcore/src/builtin.rs index 0257f8fe787..499e3c8f6cc 100644 --- a/ethcore/src/builtin.rs +++ b/ethcore/src/builtin.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Standard built-in contracts. diff --git a/ethcore/src/client/ancient_import.rs b/ethcore/src/client/ancient_import.rs index 4586a04eed2..2a0a970cd69 100644 --- a/ethcore/src/client/ancient_import.rs +++ b/ethcore/src/client/ancient_import.rs @@ -1,30 +1,30 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Helper for ancient block import. use std::sync::Arc; -use blockchain::BlockChain; use engines::{EthEngine, EpochVerifier}; -use header::Header; use machine::EthereumMachine; -use rand::Rng; +use blockchain::BlockChain; use parking_lot::RwLock; +use rand::Rng; +use types::header::Header; // do "heavy" verification on ~1/50 blocks, randomly sampled. const HEAVY_VERIFY_RATE: f32 = 0.02; diff --git a/ethcore/src/client/bad_blocks.rs b/ethcore/src/client/bad_blocks.rs index e003066721d..6af24cc4093 100644 --- a/ethcore/src/client/bad_blocks.rs +++ b/ethcore/src/client/bad_blocks.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Stores recently seen bad blocks. diff --git a/ethcore/src/client/chain_notify.rs b/ethcore/src/client/chain_notify.rs index 47a77397d0f..5f9b8ed314c 100644 --- a/ethcore/src/client/chain_notify.rs +++ b/ethcore/src/client/chain_notify.rs @@ -1,22 +1,22 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use bytes::Bytes; use ethereum_types::{H256, U256}; -use transaction::UnverifiedTransaction; +use types::transaction::UnverifiedTransaction; use blockchain::ImportRoute; use std::time::Duration; use std::collections::HashMap; diff --git a/ethcore/src/client/client.rs b/ethcore/src/client/client.rs index 1b49d009225..d40fc30330a 100644 --- a/ethcore/src/client/client.rs +++ b/ethcore/src/client/client.rs @@ -1,45 +1,58 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use std::collections::{HashSet, BTreeMap, VecDeque}; use std::cmp; +use std::collections::{HashSet, BTreeMap, VecDeque}; use std::str::FromStr; use std::sync::atomic::{AtomicUsize, AtomicBool, Ordering as AtomicOrdering}; use std::sync::{Arc, Weak}; use std::time::{Instant, Duration}; -// util -use hash::keccak; +use blockchain::{BlockReceipts, BlockChain, BlockChainDB, BlockProvider, TreeRoute, ImportRoute, TransactionAddress, ExtrasInsert, BlockNumberKey}; use bytes::Bytes; +use call_contract::{CallContract, RegistryInfo}; +use ethcore_miner::pool::VerifiedTransaction; +use ethcore_miner::service_transaction_checker::ServiceTransactionChecker; +use ethereum_types::{H256, Address, U256}; +use evm::Schedule; +use hash::keccak; +use io::IoChannel; use itertools::Itertools; use journaldb; -use trie::{TrieSpec, TrieFactory, Trie}; use kvdb::{DBValue, KeyValueDB, DBTransaction}; +use parking_lot::{Mutex, RwLock}; +use rand::OsRng; +use types::transaction::{self, LocalizedTransaction, UnverifiedTransaction, SignedTransaction, Action}; +use trie::{TrieSpec, TrieFactory, Trie}; +use types::ancestry_action::AncestryAction; +use types::encoded; +use types::filter::Filter; +use types::log_entry::LocalizedLogEntry; +use types::receipt::{Receipt, LocalizedReceipt}; +use types::{BlockNumber, header::{Header, ExtendedHeader}}; +use vm::{EnvInfo, LastHashes}; -// other -use ethereum_types::{H256, Address, U256}; use block::{IsBlock, LockedBlock, Drain, ClosedBlock, OpenBlock, enact_verified, SealedBlock}; -use blockchain::{BlockReceipts, BlockChain, BlockChainDB, BlockProvider, TreeRoute, ImportRoute, TransactionAddress, ExtrasInsert}; use client::ancient_import::AncientVerifier; use client::{ - Nonce, Balance, ChainInfo, BlockInfo, CallContract, TransactionInfo, - RegistryInfo, ReopenBlock, PrepareOpenBlock, ScheduleInfo, ImportSealedBlock, + Nonce, Balance, ChainInfo, BlockInfo, TransactionInfo, + ReopenBlock, PrepareOpenBlock, ScheduleInfo, ImportSealedBlock, BroadcastProposalBlock, ImportBlock, StateOrBlock, StateInfo, StateClient, Call, AccountData, BlockChain as BlockChainTrait, BlockProducer, SealedBlockImporter, - ClientIoMessage, + ClientIoMessage, BlockChainReset }; use client::{ BlockId, TransactionId, UncleId, TraceId, ClientConfig, BlockChainClient, @@ -48,43 +61,33 @@ use client::{ IoClient, BadBlocks, }; use client::bad_blocks; -use encoded; -use engines::{EthEngine, EpochTransition, ForkChoice}; +use engines::{EthEngine, EpochTransition, ForkChoice, EngineError}; +use engines::epoch::PendingTransition; use error::{ ImportErrorKind, ExecutionError, CallError, BlockError, QueueError, QueueErrorKind, Error as EthcoreError, EthcoreResult, ErrorKind as EthcoreErrorKind }; -use vm::{EnvInfo, LastHashes}; -use evm::Schedule; use executive::{Executive, Executed, TransactOptions, contract_address}; use factory::{Factories, VmFactory}; -use header::{BlockNumber, Header, ExtendedHeader}; -use io::IoChannel; -use log_entry::LocalizedLogEntry; use miner::{Miner, MinerService}; -use ethcore_miner::pool::VerifiedTransaction; -use parking_lot::{Mutex, RwLock}; -use rand::OsRng; -use receipt::{Receipt, LocalizedReceipt}; use snapshot::{self, io as snapshot_io, SnapshotClient}; use spec::Spec; -use state_db::StateDB; use state::{self, State}; -use trace; -use trace::{TraceDB, ImportRequest as TraceImportRequest, LocalizedTrace, Database as TraceDatabase}; -use transaction::{self, LocalizedTransaction, UnverifiedTransaction, SignedTransaction, Transaction, Action}; -use types::filter::Filter; -use types::ancestry_action::AncestryAction; -use verification; -use verification::{PreverifiedBlock, Verifier, BlockQueue}; -use verification::queue::kind::blocks::Unverified; +use state_db::StateDB; +use trace::{self, TraceDB, ImportRequest as TraceImportRequest, LocalizedTrace, Database as TraceDatabase}; +use transaction_ext::Transaction; use verification::queue::kind::BlockLike; +use verification::queue::kind::blocks::Unverified; +use verification::{PreverifiedBlock, Verifier, BlockQueue}; +use verification; +use ansi_term::Colour; // re-export pub use types::blockchain_info::BlockChainInfo; pub use types::block_status::BlockStatus; pub use blockchain::CacheSize as BlockChainCacheSize; pub use verification::QueueInfo as BlockQueueInfo; +use db::Writable; use_contract!(registry, "res/contracts/registrar.json"); @@ -293,8 +296,8 @@ impl Importer { continue; } - match self.check_and_lock_block(block, client) { - Ok(closed_block) => { + match self.check_and_lock_block(&bytes, block, client) { + Ok((closed_block, pending)) => { if self.engine.is_proposal(&header) { self.block_queue.mark_as_good(&[hash]); proposed_blocks.push(bytes); @@ -303,7 +306,7 @@ impl Importer { let transactions_len = closed_block.transactions().len(); - let route = self.commit_block(closed_block, &header, encoded::Block::new(bytes), client); + let route = self.commit_block(closed_block, &header, encoded::Block::new(bytes), pending, client); import_results.push(route); client.report.write().accrue_block(&header, transactions_len); @@ -355,7 +358,7 @@ impl Importer { imported } - fn check_and_lock_block(&self, block: PreverifiedBlock, client: &Client) -> EthcoreResult { + fn check_and_lock_block(&self, bytes: &[u8], block: PreverifiedBlock, client: &Client) -> EthcoreResult<(LockedBlock, Option)> { let engine = &*self.engine; let header = block.header.clone(); @@ -439,7 +442,15 @@ impl Importer { bail!(e); } - Ok(locked_block) + let pending = self.check_epoch_end_signal( + &header, + bytes, + locked_block.receipts(), + locked_block.state().db(), + client + )?; + + Ok((locked_block, pending)) } /// Import a block with transaction receipts. @@ -471,7 +482,8 @@ impl Importer { // it is for reconstructing the state transition. // // The header passed is from the original block data and is sealed. - fn commit_block(&self, block: B, header: &Header, block_data: encoded::Block, client: &Client) -> ImportRoute where B: Drain { + // TODO: should return an error if ImportRoute is none, issue #9910 + fn commit_block(&self, block: B, header: &Header, block_data: encoded::Block, pending: Option, client: &Client) -> ImportRoute where B: Drain { let hash = &header.hash(); let number = header.number(); let parent = header.parent_hash(); @@ -526,15 +538,9 @@ impl Importer { // check epoch end signal, potentially generating a proof on the current // state. - self.check_epoch_end_signal( - &header, - block_data.raw(), - &receipts, - &state, - &chain, - &mut batch, - client - ); + if let Some(pending) = pending { + chain.insert_pending_transition(&mut batch, header.hash(), pending); + } state.journal_under(&mut batch, number, hash).expect("DB commit failed"); @@ -589,10 +595,8 @@ impl Importer { block_bytes: &[u8], receipts: &[Receipt], state_db: &StateDB, - chain: &BlockChain, - batch: &mut DBTransaction, client: &Client, - ) { + ) -> EthcoreResult> { use engines::EpochChange; let hash = header.hash(); @@ -603,7 +607,6 @@ impl Importer { match self.engine.signals_epoch_end(header, auxiliary) { EpochChange::Yes(proof) => { - use engines::epoch::PendingTransition; use engines::Proof; let proof = match proof { @@ -621,7 +624,7 @@ impl Importer { let call = move |addr, data| { let mut state_db = state_db.boxed_clone(); - let backend = ::state::backend::Proving::new(state_db.as_hashdb_mut()); + let backend = ::state::backend::Proving::new(state_db.as_hash_db_mut()); let transaction = client.contract_call_tx(BlockId::Hash(*header.parent_hash()), addr, data); @@ -640,11 +643,9 @@ impl Importer { .transact(&transaction, options); let res = match res { - Err(ExecutionError::Internal(e)) => - Err(format!("Internal error: {}", e)), Err(e) => { trace!(target: "client", "Proved call failed: {}", e); - Ok((Vec::new(), state.drop().1.extract_proof())) + Err(e.to_string()) } Ok(res) => Ok((res.output, state.drop().1.extract_proof())), }; @@ -657,7 +658,7 @@ impl Importer { Err(e) => { warn!(target: "client", "Failed to generate transition proof for block {}: {}", hash, e); warn!(target: "client", "Snapshots produced by this client may be incomplete"); - Vec::new() + return Err(EngineError::FailedSystemCall(e).into()) } } } @@ -665,13 +666,13 @@ impl Importer { debug!(target: "client", "Block {} signals epoch end.", hash); - let pending = PendingTransition { proof: proof }; - chain.insert_pending_transition(batch, hash, pending); + Ok(Some(PendingTransition { proof: proof })) }, - EpochChange::No => {}, + EpochChange::No => Ok(None), EpochChange::Unsure(_) => { warn!(target: "client", "Detected invalid engine implementation."); warn!(target: "client", "Engine claims to require more block data, but everything provided."); + Err(EngineError::InvalidEngine.into()) } } } @@ -1175,7 +1176,7 @@ impl Client { }; let processing_threads = self.config.snapshot.processing_threads; - snapshot::take_snapshot(&*self.engine, &self.chain.read(), start_hash, db.as_hashdb(), writer, p, processing_threads)?; + snapshot::take_snapshot(&*self.engine, &self.chain.read(), start_hash, db.as_hash_db(), writer, p, processing_threads)?; Ok(()) } @@ -1231,7 +1232,7 @@ impl Client { // from the null sender, with 50M gas. fn contract_call_tx(&self, block_id: BlockId, address: Address, data: Bytes) -> SignedTransaction { let from = Address::default(); - Transaction { + transaction::Transaction { nonce: self.nonce(&from, block_id).unwrap_or_else(|| self.engine.account_start_nonce(0)), action: Action::Call(address), gas: U256::from(50_000_000), @@ -1330,6 +1331,48 @@ impl snapshot::DatabaseRestore for Client { } } +impl BlockChainReset for Client { + fn reset(&self, num: u32) -> Result<(), String> { + if num as u64 > self.pruning_history() { + return Err("Attempting to reset to block with pruned state".into()) + } + + let (blocks_to_delete, best_block_hash) = self.chain.read() + .block_headers_from_best_block(num) + .ok_or("Attempted to reset past genesis block")?; + + let mut db_transaction = DBTransaction::with_capacity((num + 1) as usize); + + for hash in &blocks_to_delete { + db_transaction.delete(::db::COL_HEADERS, &hash.hash()); + db_transaction.delete(::db::COL_BODIES, &hash.hash()); + db_transaction.delete(::db::COL_EXTRA, &hash.hash()); + Writable::delete:: + (&mut db_transaction, ::db::COL_EXTRA, &hash.number()); + } + + // update the new best block hash + db_transaction.put(::db::COL_EXTRA, b"best", &*best_block_hash); + + self.db.read() + .key_value() + .write(db_transaction) + .map_err(|err| format!("could not complete reset operation; io error occured: {}", err))?; + + let hashes = blocks_to_delete.iter().map(|b| b.hash()).collect::>(); + + info!("Deleting block hashes {}", + Colour::Red + .bold() + .paint(format!("{:#?}", hashes)) + ); + + info!("New best block hash {}", Colour::Green.bold().paint(format!("{:?}", best_block_hash))); + + Ok(()) + } +} + impl Nonce for Client { fn nonce(&self, address: &Address, id: BlockId) -> Option { self.state_at(id).and_then(|s| s.nonce(address).ok()) @@ -1738,7 +1781,8 @@ impl BlockChainClient for Client { }; let (root, db) = state.drop(); - let trie = match self.factories.trie.readonly(db.as_hashdb(), &root) { + let db = &db.as_hash_db(); + let trie = match self.factories.trie.readonly(db, &root) { Ok(trie) => trie, _ => { trace!(target: "fatdb", "list_accounts: Couldn't open the DB"); @@ -1784,8 +1828,9 @@ impl BlockChainClient for Client { }; let (_, db) = state.drop(); - let account_db = self.factories.accountdb.readonly(db.as_hashdb(), keccak(account)); - let trie = match self.factories.trie.readonly(account_db.as_hashdb(), &root) { + let account_db = &self.factories.accountdb.readonly(db.as_hash_db(), keccak(account)); + let account_db = &account_db.as_hash_db(); + let trie = match self.factories.trie.readonly(account_db, &root) { Ok(trie) => trie, _ => { trace!(target: "fatdb", "list_storage: Couldn't open the DB"); @@ -2112,11 +2157,16 @@ impl BlockChainClient for Client { fn transact_contract(&self, address: Address, data: Bytes) -> Result<(), transaction::Error> { let authoring_params = self.importer.miner.authoring_params(); - let transaction = Transaction { + let service_transaction_checker = ServiceTransactionChecker::default(); + let gas_price = match service_transaction_checker.check_address(self, authoring_params.author) { + Ok(true) => U256::zero(), + _ => self.importer.miner.sensible_gas_price(), + }; + let transaction = transaction::Transaction { nonce: self.latest_nonce(&authoring_params.author), action: Action::Call(address), gas: self.importer.miner.sensible_gas_limit(), - gas_price: self.importer.miner.sensible_gas_price(), + gas_price, value: U256::zero(), data: data, }; @@ -2167,11 +2217,8 @@ impl IoClient for Client { // NOTE To prevent race condition with import, make sure to check queued blocks first // (and attempt to acquire lock) let is_parent_pending = self.queued_ancient_blocks.read().0.contains(&parent_hash); - if !is_parent_pending { - let status = self.block_status(BlockId::Hash(parent_hash)); - if status == BlockStatus::Unknown { - bail!(EthcoreErrorKind::Block(BlockError::UnknownParent(parent_hash))); - } + if !is_parent_pending && !self.chain.read().is_known(&parent_hash) { + bail!(EthcoreErrorKind::Block(BlockError::UnknownParent(parent_hash))); } } @@ -2201,6 +2248,10 @@ impl IoClient for Client { ); if let Err(e) = result { error!(target: "client", "Error importing ancient block: {}", e); + + let mut queued = queued.write(); + queued.0.clear(); + queued.1.clear(); } // remove from pending queued.write().0.remove(&hash); @@ -2329,7 +2380,20 @@ impl ImportSealedBlock for Client { let block_data = block.rlp_bytes(); - let route = self.importer.commit_block(block, &header, encoded::Block::new(block_data), self); + let pending = self.importer.check_epoch_end_signal( + &header, + &block_data, + block.receipts(), + block.state().db(), + self + )?; + let route = self.importer.commit_block( + block, + &header, + encoded::Block::new(block_data), + pending, + self + ); trace!(target: "client", "Imported sealed block #{} ({})", header.number(), hash); self.state_db.write().sync_cache(&route.enacted, &route.retracted, false); route @@ -2411,7 +2475,7 @@ impl super::traits::EngineClient for Client { BlockChainClient::block_number(self, id) } - fn block_header(&self, id: BlockId) -> Option<::encoded::Header> { + fn block_header(&self, id: BlockId) -> Option { BlockChainClient::block_header(self, id) } } @@ -2437,7 +2501,7 @@ impl ProvingBlockChainClient for Client { let mut jdb = self.state_db.read().journal_db().boxed_clone(); state::prove_transaction_virtual( - jdb.as_hashdb_mut(), + jdb.as_hash_db_mut(), header.state_root().clone(), &transaction, self.engine.machine(), @@ -2520,7 +2584,7 @@ mod tests { use std::sync::atomic::{AtomicBool, Ordering}; use kvdb::DBTransaction; use blockchain::ExtrasInsert; - use encoded; + use types::encoded; let client = generate_dummy_client(0); let genesis = client.chain_info().best_block_hash; @@ -2566,7 +2630,6 @@ mod tests { assert_eq!(receipts[1].cumulative_gas_used, 106_000.into()); assert_eq!(receipts[1].gas_used, 53_000.into()); - let receipt = client.transaction_receipt(TransactionId::Hash(receipts[0].transaction_hash)); assert_eq!(receipt, Some(receipts[0].clone())); @@ -2579,9 +2642,9 @@ mod tests { use hash::keccak; use super::transaction_receipt; use ethkey::KeyPair; - use log_entry::{LogEntry, LocalizedLogEntry}; - use receipt::{Receipt, LocalizedReceipt, TransactionOutcome}; - use transaction::{Transaction, LocalizedTransaction, Action}; + use types::log_entry::{LogEntry, LocalizedLogEntry}; + use types::receipt::{Receipt, LocalizedReceipt, TransactionOutcome}; + use types::transaction::{Transaction, LocalizedTransaction, Action}; // given let key = KeyPair::from_secret_slice(&keccak("test")).unwrap(); diff --git a/ethcore/src/client/config.rs b/ethcore/src/client/config.rs index 8710ec9fb7b..59fc4f8135e 100644 --- a/ethcore/src/client/config.rs +++ b/ethcore/src/client/config.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::str::FromStr; use std::fmt::{Display, Formatter, Error as FmtError}; diff --git a/ethcore/src/client/evm_test_client.rs b/ethcore/src/client/evm_test_client.rs index 67e18724488..d6c03e65a90 100644 --- a/ethcore/src/client/evm_test_client.rs +++ b/ethcore/src/client/evm_test_client.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Simple Client used for EVM tests. @@ -21,7 +21,8 @@ use std::sync::Arc; use ethereum_types::{H256, U256, H160}; use {factory, journaldb, trie, kvdb_memorydb}; use kvdb::{self, KeyValueDB}; -use {state, state_db, client, executive, trace, transaction, db, spec, pod_state, log_entry, receipt}; +use {state, state_db, client, executive, trace, db, spec, pod_state}; +use types::{log_entry, receipt, transaction}; use factory::Factories; use evm::{VMType, FinalizationResult}; use vm::{self, ActionParams}; @@ -92,6 +93,7 @@ impl<'a> EvmTestClient<'a> { ForkSpec::EIP158 => Some(ethereum::new_eip161_test()), ForkSpec::Byzantium => Some(ethereum::new_byzantium_test()), ForkSpec::Constantinople => Some(ethereum::new_constantinople_test()), + ForkSpec::ConstantinopleFix => Some(ethereum::new_constantinople_fix_test()), ForkSpec::EIP158ToByzantiumAt5 => Some(ethereum::new_transition_test()), ForkSpec::FrontierToHomesteadAt5 | ForkSpec::HomesteadToDaoAt5 | ForkSpec::HomesteadToEIP150At5 => None, } @@ -239,16 +241,17 @@ impl<'a> EvmTestClient<'a> { transaction: transaction::SignedTransaction, tracer: T, vm_tracer: V, - ) -> TransactResult { + ) -> std::result::Result, TransactErr> { let initial_gas = transaction.gas; // Verify transaction let is_ok = transaction.verify_basic(true, None, false); if let Err(error) = is_ok { - return TransactResult::Err { - state_root: *self.state.root(), - error: error.into(), - end_state: (self.dump_state)(&self.state), - }; + return Err( + TransactErr{ + state_root: *self.state.root(), + error: error.into(), + end_state: (self.dump_state)(&self.state), + }); } // Apply transaction @@ -281,7 +284,7 @@ impl<'a> EvmTestClient<'a> { match result { Ok(result) => { - TransactResult::Ok { + Ok(TransactSuccess { state_root, gas_left: initial_gas - result.receipt.gas_used, outcome: result.receipt.outcome, @@ -296,47 +299,48 @@ impl<'a> EvmTestClient<'a> { }, end_state, } - }, - Err(error) => TransactResult::Err { + )}, + Err(error) => Err(TransactErr { state_root, error, end_state, - }, + }), } } } -/// A result of applying transaction to the state. -#[derive(Debug)] -pub enum TransactResult { - /// Successful execution - Ok { - /// State root - state_root: H256, - /// Amount of gas left - gas_left: U256, - /// Output - output: Vec, - /// Traces - trace: Vec, - /// VM Traces - vm_trace: Option, - /// Created contract address (if any) - contract_address: Option, - /// Generated logs - logs: Vec, - /// outcome - outcome: receipt::TransactionOutcome, - /// end state if needed - end_state: Option, - }, - /// Transaction failed to run - Err { - /// State root - state_root: H256, - /// Execution error - error: ::error::Error, - /// end state if needed - end_state: Option, - }, +/// To be returned inside a std::result::Result::Ok after a successful +/// transaction completed. +#[allow(dead_code)] +pub struct TransactSuccess { + /// State root + pub state_root: H256, + /// Amount of gas left + pub gas_left: U256, + /// Output + pub output: Vec, + /// Traces + pub trace: Vec, + /// VM Traces + pub vm_trace: Option, + /// Created contract address (if any) + pub contract_address: Option, + /// Generated logs + pub logs: Vec, + /// outcome + pub outcome: receipt::TransactionOutcome, + /// end state if needed + pub end_state: Option, +} + +/// To be returned inside a std::result::Result::Err after a failed +/// transaction. +#[allow(dead_code)] +pub struct TransactErr { + /// State root + pub state_root: H256, + /// Execution error + pub error: ::error::Error, + /// end state if needed + pub end_state: Option, } diff --git a/ethcore/src/client/io_message.rs b/ethcore/src/client/io_message.rs index d388f5ed44c..92e2d3e258e 100644 --- a/ethcore/src/client/io_message.rs +++ b/ethcore/src/client/io_message.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use bytes::Bytes; diff --git a/ethcore/src/client/mod.rs b/ethcore/src/client/mod.rs index bbbbbea8b33..51b4f53db84 100644 --- a/ethcore/src/client/mod.rs +++ b/ethcore/src/client/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain database client. @@ -30,14 +30,15 @@ mod trace; pub use self::client::*; pub use self::config::{Mode, ClientConfig, DatabaseCompactionProfile, BlockChainConfig, VMType}; #[cfg(any(test, feature = "test-helpers"))] -pub use self::evm_test_client::{EvmTestClient, EvmTestError, TransactResult}; +pub use self::evm_test_client::{EvmTestClient, EvmTestError, TransactErr, TransactSuccess}; pub use self::io_message::ClientIoMessage; #[cfg(any(test, feature = "test-helpers"))] pub use self::test_client::{TestBlockChainClient, EachBlockWith}; pub use self::chain_notify::{ChainNotify, NewBlocks, ChainRoute, ChainRouteType, ChainMessageType}; pub use self::traits::{ - Nonce, Balance, ChainInfo, BlockInfo, ReopenBlock, PrepareOpenBlock, CallContract, TransactionInfo, RegistryInfo, ScheduleInfo, ImportSealedBlock, BroadcastProposalBlock, ImportBlock, + Nonce, Balance, ChainInfo, BlockInfo, ReopenBlock, PrepareOpenBlock, TransactionInfo, ScheduleInfo, ImportSealedBlock, BroadcastProposalBlock, ImportBlock, StateOrBlock, StateClient, Call, EngineInfo, AccountData, BlockChain, BlockProducer, SealedBlockImporter, BadBlocks, + BlockChainReset }; pub use state::StateInfo; pub use self::traits::{BlockChainClient, EngineClient, ProvingBlockChainClient, IoClient}; diff --git a/ethcore/src/client/private_notify.rs b/ethcore/src/client/private_notify.rs index d1fde555c98..4be18387327 100644 --- a/ethcore/src/client/private_notify.rs +++ b/ethcore/src/client/private_notify.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use error::TransactionImportError; diff --git a/ethcore/src/client/test_client.rs b/ethcore/src/client/test_client.rs index 3c422c49a58..5236f7cd409 100644 --- a/ethcore/src/client/test_client.rs +++ b/ethcore/src/client/test_client.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Test client. @@ -20,52 +20,56 @@ use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering as AtomicOrder}; use std::sync::Arc; use std::collections::{HashMap, BTreeMap}; use std::mem; -use itertools::Itertools; -use rustc_hex::FromHex; -use hash::keccak; + +use blockchain::{TreeRoute, BlockReceipts}; +use bytes::Bytes; +use db::{NUM_COLUMNS, COL_STATE}; +use ethcore_miner::pool::VerifiedTransaction; use ethereum_types::{H256, U256, Address}; -use parking_lot::RwLock; -use journaldb; +use ethkey::{Generator, Random}; +use ethtrie; +use hash::keccak; +use itertools::Itertools; use kvdb::DBValue; use kvdb_memorydb; -use bytes::Bytes; +use parking_lot::RwLock; use rlp::{Rlp, RlpStream}; -use ethkey::{Generator, Random}; -use ethcore_miner::pool::VerifiedTransaction; -use transaction::{self, Transaction, LocalizedTransaction, SignedTransaction, Action}; -use blockchain::{TreeRoute, BlockReceipts}; +use rustc_hex::FromHex; +use types::transaction::{self, Transaction, LocalizedTransaction, SignedTransaction, Action}; +use types::BlockNumber; +use types::basic_account::BasicAccount; +use types::encoded; +use types::filter::Filter; +use types::header::Header; +use types::log_entry::LocalizedLogEntry; +use types::pruning_info::PruningInfo; +use types::receipt::{Receipt, LocalizedReceipt, TransactionOutcome}; +use types::view; +use types::views::BlockView; +use vm::Schedule; + +use block::{OpenBlock, SealedBlock, ClosedBlock}; +use call_contract::{CallContract, RegistryInfo}; use client::{ - Nonce, Balance, ChainInfo, BlockInfo, ReopenBlock, CallContract, TransactionInfo, RegistryInfo, + Nonce, Balance, ChainInfo, BlockInfo, ReopenBlock, TransactionInfo, PrepareOpenBlock, BlockChainClient, BlockChainInfo, BlockStatus, BlockId, Mode, TransactionId, UncleId, TraceId, TraceFilter, LastHashes, CallAnalytics, ProvingBlockChainClient, ScheduleInfo, ImportSealedBlock, BroadcastProposalBlock, ImportBlock, StateOrBlock, Call, StateClient, EngineInfo, AccountData, BlockChain, BlockProducer, SealedBlockImporter, IoClient, BadBlocks, }; -use db::{NUM_COLUMNS, COL_STATE}; -use header::{Header as BlockHeader, BlockNumber}; -use filter::Filter; -use log_entry::LocalizedLogEntry; -use receipt::{Receipt, LocalizedReceipt, TransactionOutcome}; +use engines::EthEngine; use error::{Error, EthcoreResult}; -use vm::Schedule; +use executed::CallError; +use executive::Executed; +use journaldb; use miner::{self, Miner, MinerService}; use spec::Spec; -use types::basic_account::BasicAccount; -use types::pruning_info::PruningInfo; +use state::StateInfo; +use state_db::StateDB; +use trace::LocalizedTrace; use verification::queue::QueueInfo; use verification::queue::kind::blocks::Unverified; -use block::{OpenBlock, SealedBlock, ClosedBlock}; -use executive::Executed; -use error::CallError; -use trace::LocalizedTrace; -use state_db::StateDB; -use header::Header; -use encoded; -use engines::EthEngine; -use ethtrie; -use state::StateInfo; -use views::BlockView; /// Test client. pub struct TestBlockChainClient { @@ -126,6 +130,8 @@ pub enum EachBlockWith { Uncle, /// Block with a transaction. Transaction, + /// Block with multiple transactions. + Transactions(usize), /// Block with an uncle and transaction. UncleAndTransaction } @@ -244,11 +250,11 @@ impl TestBlockChainClient { /// Add a block to test client. pub fn add_block(&self, with: EachBlockWith, hook: F) - where F: Fn(BlockHeader) -> BlockHeader + where F: Fn(Header) -> Header { let n = self.numbers.read().len(); - let mut header = BlockHeader::new(); + let mut header = Header::new(); header.set_difficulty(From::from(n)); header.set_parent_hash(self.last_hash.read().clone()); header.set_number(n as BlockNumber); @@ -260,7 +266,7 @@ impl TestBlockChainClient { let uncles = match with { EachBlockWith::Uncle | EachBlockWith::UncleAndTransaction => { let mut uncles = RlpStream::new_list(1); - let mut uncle_header = BlockHeader::new(); + let mut uncle_header = Header::new(); uncle_header.set_difficulty(From::from(n)); uncle_header.set_parent_hash(self.last_hash.read().clone()); uncle_header.set_number(n as BlockNumber); @@ -271,21 +277,31 @@ impl TestBlockChainClient { _ => RlpStream::new_list(0) }; let txs = match with { - EachBlockWith::Transaction | EachBlockWith::UncleAndTransaction => { - let mut txs = RlpStream::new_list(1); - let keypair = Random.generate().unwrap(); - // Update nonces value - self.nonces.write().insert(keypair.address(), U256::one()); - let tx = Transaction { - action: Action::Create, - value: U256::from(100), - data: "3331600055".from_hex().unwrap(), - gas: U256::from(100_000), - gas_price: U256::from(200_000_000_000u64), - nonce: U256::zero() + EachBlockWith::Transaction | EachBlockWith::UncleAndTransaction | EachBlockWith::Transactions(_) => { + let num_transactions = match with { + EachBlockWith::Transactions(num) => num, + _ => 1, }; - let signed_tx = tx.sign(keypair.secret(), None); - txs.append(&signed_tx); + let mut txs = RlpStream::new_list(num_transactions); + let keypair = Random.generate().unwrap(); + let mut nonce = U256::zero(); + + for _ in 0..num_transactions { + // Update nonces value + let tx = Transaction { + action: Action::Create, + value: U256::from(100), + data: "3331600055".from_hex().unwrap(), + gas: U256::from(100_000), + gas_price: U256::from(200_000_000_000u64), + nonce: nonce + }; + let signed_tx = tx.sign(keypair.secret(), None); + txs.append(&signed_tx); + nonce += U256::one(); + } + + self.nonces.write().insert(keypair.address(), nonce); txs.out() }, _ => ::rlp::EMPTY_LIST_RLP.to_vec() @@ -309,7 +325,7 @@ impl TestBlockChainClient { /// Make a bad block by setting invalid parent hash. pub fn corrupt_block_parent(&self, n: BlockNumber) { let hash = self.block_hash(BlockId::Number(n)).unwrap(); - let mut header: BlockHeader = self.block_header(BlockId::Number(n)).unwrap().decode().expect("decoding failed"); + let mut header: Header = self.block_header(BlockId::Number(n)).unwrap().decode().expect("decoding failed"); header.set_parent_hash(H256::from(42)); let mut rlp = RlpStream::new_list(3); rlp.append(&header); @@ -935,7 +951,7 @@ impl super::traits::EngineClient for TestBlockChainClient { BlockChainClient::block_number(self, id) } - fn block_header(&self, id: BlockId) -> Option<::encoded::Header> { + fn block_header(&self, id: BlockId) -> Option { BlockChainClient::block_header(self, id) } } diff --git a/ethcore/src/client/trace.rs b/ethcore/src/client/trace.rs index 5f1b6c4f4de..73563a1d0f6 100644 --- a/ethcore/src/client/trace.rs +++ b/ethcore/src/client/trace.rs @@ -1,26 +1,25 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Bridge between Tracedb and Blockchain. +use blockchain::{BlockChain, BlockProvider, TransactionAddress}; use ethereum_types::H256; -use header::BlockNumber; use trace::DatabaseExtras as TraceDatabaseExtras; -use blockchain::{BlockChain, BlockProvider, TransactionAddress}; -pub use types::trace_filter::Filter; +use types::BlockNumber; impl TraceDatabaseExtras for BlockChain { fn block_hash(&self, block_number: BlockNumber) -> Option { diff --git a/ethcore/src/client/traits.rs b/ethcore/src/client/traits.rs index 55d527013ec..2bc7026220d 100644 --- a/ethcore/src/client/traits.rs +++ b/ethcore/src/client/traits.rs @@ -1,56 +1,56 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::BTreeMap; use std::sync::Arc; +use blockchain::{BlockReceipts, TreeRoute}; +use bytes::Bytes; +use call_contract::{CallContract, RegistryInfo}; +use ethcore_miner::pool::VerifiedTransaction; +use ethereum_types::{H256, U256, Address}; +use evm::Schedule; use itertools::Itertools; +use kvdb::DBValue; +use types::transaction::{self, LocalizedTransaction, SignedTransaction}; +use types::BlockNumber; +use types::basic_account::BasicAccount; +use types::block_status::BlockStatus; +use types::blockchain_info::BlockChainInfo; +use types::call_analytics::CallAnalytics; +use types::encoded; +use types::filter::Filter; +use types::header::Header; +use types::ids::*; +use types::log_entry::LocalizedLogEntry; +use types::pruning_info::PruningInfo; +use types::receipt::LocalizedReceipt; +use types::trace_filter::Filter as TraceFilter; +use vm::LastHashes; use block::{OpenBlock, SealedBlock, ClosedBlock}; -use blockchain::{BlockReceipts, TreeRoute}; use client::Mode; -use encoded; -use vm::LastHashes; -use error::{Error, CallError, EthcoreResult}; -use evm::Schedule; +use engines::EthEngine; +use error::{Error, EthcoreResult}; +use executed::CallError; use executive::Executed; -use filter::Filter; -use header::{BlockNumber}; -use log_entry::LocalizedLogEntry; -use receipt::LocalizedReceipt; +use state::StateInfo; use trace::LocalizedTrace; -use transaction::{self, LocalizedTransaction, SignedTransaction}; use verification::queue::QueueInfo as BlockQueueInfo; use verification::queue::kind::blocks::Unverified; -use state::StateInfo; -use header::Header; -use engines::EthEngine; - -use ethereum_types::{H256, U256, Address}; -use ethcore_miner::pool::VerifiedTransaction; -use bytes::Bytes; -use kvdb::DBValue; - -use types::ids::*; -use types::basic_account::BasicAccount; -use types::trace_filter::Filter as TraceFilter; -use types::call_analytics::CallAnalytics; -use types::blockchain_info::BlockChainInfo; -use types::block_status::BlockStatus; -use types::pruning_info::PruningInfo; /// State information to be used during client query pub enum StateOrBlock { @@ -158,12 +158,6 @@ pub trait StateClient { /// Provides various blockchain information, like block header, chain state etc. pub trait BlockChain: ChainInfo + BlockInfo + TransactionInfo {} -/// Provides information on a blockchain service and it's registry -pub trait RegistryInfo { - /// Get the address of a particular blockchain service, if available. - fn registry_address(&self, name: String, block: BlockId) -> Option
; -} - // FIXME Why these methods belong to BlockChainClient and not MiningBlockChainClient? /// Provides methods to import block into blockchain pub trait ImportBlock { @@ -171,12 +165,6 @@ pub trait ImportBlock { fn import_block(&self, block: Unverified) -> EthcoreResult; } -/// Provides `call_contract` method -pub trait CallContract { - /// Like `call`, but with various defaults. Designed to be used for calling contracts. - fn call_contract(&self, id: BlockId, address: Address, data: Bytes) -> Result; -} - /// Provides `call` and `call_many` methods pub trait Call { /// Type representing chain state @@ -483,3 +471,9 @@ pub trait ProvingBlockChainClient: BlockChainClient { /// Get an epoch change signal by block hash. fn epoch_signal(&self, hash: H256) -> Option>; } + +/// resets the blockchain +pub trait BlockChainReset { + /// reset to best_block - n + fn reset(&self, num: u32) -> Result<(), String>; +} diff --git a/ethcore/src/engines/authority_round/finality.rs b/ethcore/src/engines/authority_round/finality.rs index 3a8be04156d..af57278c9f3 100644 --- a/ethcore/src/engines/authority_round/finality.rs +++ b/ethcore/src/engines/authority_round/finality.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Finality proof generation and checking. diff --git a/ethcore/src/engines/authority_round/mod.rs b/ethcore/src/engines/authority_round/mod.rs index 6cf7f409128..2a42acfe23f 100644 --- a/ethcore/src/engines/authority_round/mod.rs +++ b/ethcore/src/engines/authority_round/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! A blockchain engine that supports a non-instant BFT proof-of-authority. @@ -24,7 +24,6 @@ use std::sync::atomic::{AtomicUsize, AtomicBool, Ordering as AtomicOrdering}; use std::sync::{Weak, Arc}; use std::time::{UNIX_EPOCH, SystemTime, Duration}; -use account_provider::AccountProvider; use block::*; use client::EngineClient; use engines::{Engine, Seal, EngineError, ConstructedVerifier}; @@ -34,16 +33,17 @@ use error::{Error, ErrorKind, BlockError}; use ethjson; use machine::{AuxiliaryData, Call, EthereumMachine}; use hash::keccak; -use header::{Header, BlockNumber, ExtendedHeader}; use super::signer::EngineSigner; use super::validator_set::{ValidatorSet, SimpleList, new_validator_set}; use self::finality::RollingFinality; -use ethkey::{self, Password, Signature}; +use ethkey::{self, Signature}; use io::{IoContext, IoHandler, TimerToken, IoService}; use itertools::{self, Itertools}; use rlp::{encode, Decodable, DecoderError, Encodable, RlpStream, Rlp}; use ethereum_types::{H256, H520, Address, U128, U256}; use parking_lot::{Mutex, RwLock}; +use types::BlockNumber; +use types::header::{Header, ExtendedHeader}; use types::ancestry_action::AncestryAction; use unexpected::{Mismatch, OutOfBounds}; @@ -411,7 +411,7 @@ pub struct AuthorityRound { transition_service: IoService<()>, step: Arc, client: Arc>>>, - signer: RwLock, + signer: RwLock>>, validators: Box, validate_score_transition: u64, validate_step_transition: u64, @@ -664,7 +664,7 @@ impl AuthorityRound { can_propose: AtomicBool::new(true), }), client: Arc::new(RwLock::new(None)), - signer: Default::default(), + signer: RwLock::new(None), validators: our_params.validators, validate_score_transition: our_params.validate_score_transition, validate_step_transition: our_params.validate_step_transition, @@ -787,7 +787,7 @@ impl AuthorityRound { return; } - if let (true, Some(me)) = (current_step > parent_step + 1, self.signer.read().address()) { + if let (true, Some(me)) = (current_step > parent_step + 1, self.signer.read().as_ref().map(|s| s.address())) { debug!(target: "engine", "Author {} built block with step gap. current step: {}, parent step: {}", header.author(), current_step, parent_step); let mut reported = HashSet::new(); @@ -1421,16 +1421,21 @@ impl Engine for AuthorityRound { let mut finality_proof: Vec<_> = itertools::repeat_call(move || { chain(hash).and_then(|header| { hash = *header.parent_hash(); - if header.number() == 0 { return None } - else { return Some(header) } + if header.number() == 0 { None } + else { Some(header) } }) }) .while_some() .take_while(|h| h.hash() != *finalized_hash) .collect(); - let finalized_header = chain(*finalized_hash) - .expect("header is finalized; finalized headers must exist in the chain; qed"); + let finalized_header = if *finalized_hash == chain_head.hash() { + // chain closure only stores ancestry, but the chain head is also unfinalized. + chain_head.clone() + } else { + chain(*finalized_hash) + .expect("header is finalized; finalized headers must exist in the chain; qed") + }; let signal_number = finalized_header.number(); info!(target: "engine", "Applying validator set change signalled at block {}", signal_number); @@ -1486,12 +1491,16 @@ impl Engine for AuthorityRound { self.validators.register_client(client); } - fn set_signer(&self, ap: Arc, address: Address, password: Password) { - self.signer.write().set(ap, address, password); + fn set_signer(&self, signer: Box) { + *self.signer.write() = Some(signer); } fn sign(&self, hash: H256) -> Result { - Ok(self.signer.read().sign(hash)?) + Ok(self.signer.read() + .as_ref() + .ok_or(ethkey::Error::InvalidAddress)? + .sign(hash)? + ) } fn snapshot_components(&self) -> Option> { @@ -1526,18 +1535,18 @@ mod tests { use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering as AtomicOrdering}; use hash::keccak; + use accounts::AccountProvider; use ethereum_types::{Address, H520, H256, U256}; use ethkey::Signature; - use header::Header; + use types::header::Header; use rlp::encode; use block::*; use test_helpers::{ - generate_dummy_client_with_spec_and_accounts, get_temp_state_db, + generate_dummy_client_with_spec, get_temp_state_db, TestNotify }; - use account_provider::AccountProvider; use spec::Spec; - use transaction::{Action, Transaction}; + use types::transaction::{Action, Transaction}; use engines::{Seal, Engine, EngineError, EthEngine}; use engines::validator_set::{TestSet, SimpleList}; use error::{Error, ErrorKind}; @@ -1614,14 +1623,14 @@ mod tests { let b2 = OpenBlock::new(engine, Default::default(), false, db2, &genesis_header, last_hashes, addr2, (3141562.into(), 31415620.into()), vec![], false, &mut Vec::new().into_iter()).unwrap(); let b2 = b2.close_and_lock().unwrap(); - engine.set_signer(tap.clone(), addr1, "1".into()); + engine.set_signer(Box::new((tap.clone(), addr1, "1".into()))); if let Seal::Regular(seal) = engine.generate_seal(b1.block(), &genesis_header) { assert!(b1.clone().try_seal(engine, seal).is_ok()); // Second proposal is forbidden. assert!(engine.generate_seal(b1.block(), &genesis_header) == Seal::None); } - engine.set_signer(tap, addr2, "2".into()); + engine.set_signer(Box::new((tap, addr2, "2".into()))); if let Seal::Regular(seal) = engine.generate_seal(b2.block(), &genesis_header) { assert!(b2.clone().try_seal(engine, seal).is_ok()); // Second proposal is forbidden. @@ -1648,13 +1657,13 @@ mod tests { let b2 = OpenBlock::new(engine, Default::default(), false, db2, &genesis_header, last_hashes, addr2, (3141562.into(), 31415620.into()), vec![], false, &mut Vec::new().into_iter()).unwrap(); let b2 = b2.close_and_lock().unwrap(); - engine.set_signer(tap.clone(), addr1, "1".into()); + engine.set_signer(Box::new((tap.clone(), addr1, "1".into()))); match engine.generate_seal(b1.block(), &genesis_header) { Seal::None | Seal::Proposal(_) => panic!("wrong seal"), Seal::Regular(_) => { engine.step(); - engine.set_signer(tap.clone(), addr2, "0".into()); + engine.set_signer(Box::new((tap.clone(), addr2, "0".into()))); match engine.generate_seal(b2.block(), &genesis_header) { Seal::Regular(_) | Seal::Proposal(_) => panic!("sealed despite wrong difficulty"), Seal::None => {} @@ -1762,7 +1771,7 @@ mod tests { assert!(aura.verify_block_family(&header, &parent_header).is_ok()); assert_eq!(last_benign.load(AtomicOrdering::SeqCst), 0); - aura.set_signer(Arc::new(AccountProvider::transient_provider()), Default::default(), "".into()); + aura.set_signer(Box::new((Arc::new(AccountProvider::transient_provider()), Default::default(), "".into()))); // Do not report on steps skipped between genesis and first block. header.set_number(1); @@ -1872,12 +1881,12 @@ mod tests { let last_hashes = Arc::new(vec![genesis_header.hash()]); - let client = generate_dummy_client_with_spec_and_accounts(Spec::new_test_round_empty_steps, None); + let client = generate_dummy_client_with_spec(Spec::new_test_round_empty_steps); let notify = Arc::new(TestNotify::default()); client.add_notify(notify.clone()); engine.register_client(Arc::downgrade(&client) as _); - engine.set_signer(tap.clone(), addr1, "1".into()); + engine.set_signer(Box::new((tap.clone(), addr1, "1".into()))); let b1 = OpenBlock::new(engine, Default::default(), false, db1, &genesis_header, last_hashes.clone(), addr1, (3141562.into(), 31415620.into()), vec![], false, &mut Vec::new().into_iter()).unwrap(); let b1 = b1.close_and_lock().unwrap(); @@ -1911,7 +1920,7 @@ mod tests { let last_hashes = Arc::new(vec![genesis_header.hash()]); - let client = generate_dummy_client_with_spec_and_accounts(Spec::new_test_round_empty_steps, None); + let client = generate_dummy_client_with_spec(Spec::new_test_round_empty_steps); let notify = Arc::new(TestNotify::default()); client.add_notify(notify.clone()); engine.register_client(Arc::downgrade(&client) as _); @@ -1921,7 +1930,7 @@ mod tests { let b1 = b1.close_and_lock().unwrap(); // since the block is empty it isn't sealed and we generate empty steps - engine.set_signer(tap.clone(), addr1, "1".into()); + engine.set_signer(Box::new((tap.clone(), addr1, "1".into()))); assert_eq!(engine.generate_seal(b1.block(), &genesis_header), Seal::None); engine.step(); @@ -1938,9 +1947,9 @@ mod tests { let b2 = b2.close_and_lock().unwrap(); // we will now seal a block with 1tx and include the accumulated empty step message - engine.set_signer(tap.clone(), addr2, "0".into()); + engine.set_signer(Box::new((tap.clone(), addr2, "0".into()))); if let Seal::Regular(seal) = engine.generate_seal(b2.block(), &genesis_header) { - engine.set_signer(tap.clone(), addr1, "1".into()); + engine.set_signer(Box::new((tap.clone(), addr1, "1".into()))); let empty_step2 = sealed_empty_step(engine, 2, &genesis_header.hash()); let empty_steps = ::rlp::encode_list(&vec![empty_step2]); @@ -1964,7 +1973,7 @@ mod tests { let last_hashes = Arc::new(vec![genesis_header.hash()]); - let client = generate_dummy_client_with_spec_and_accounts(Spec::new_test_round_empty_steps, None); + let client = generate_dummy_client_with_spec(Spec::new_test_round_empty_steps); let notify = Arc::new(TestNotify::default()); client.add_notify(notify.clone()); engine.register_client(Arc::downgrade(&client) as _); @@ -1974,14 +1983,14 @@ mod tests { let b1 = b1.close_and_lock().unwrap(); // since the block is empty it isn't sealed and we generate empty steps - engine.set_signer(tap.clone(), addr1, "1".into()); + engine.set_signer(Box::new((tap.clone(), addr1, "1".into()))); assert_eq!(engine.generate_seal(b1.block(), &genesis_header), Seal::None); engine.step(); // step 3 let b2 = OpenBlock::new(engine, Default::default(), false, db2, &genesis_header, last_hashes.clone(), addr2, (3141562.into(), 31415620.into()), vec![], false, &mut Vec::new().into_iter()).unwrap(); let b2 = b2.close_and_lock().unwrap(); - engine.set_signer(tap.clone(), addr2, "0".into()); + engine.set_signer(Box::new((tap.clone(), addr2, "0".into()))); assert_eq!(engine.generate_seal(b2.block(), &genesis_header), Seal::None); engine.step(); @@ -1990,10 +1999,10 @@ mod tests { let b3 = OpenBlock::new(engine, Default::default(), false, db3, &genesis_header, last_hashes.clone(), addr1, (3141562.into(), 31415620.into()), vec![], false, &mut Vec::new().into_iter()).unwrap(); let b3 = b3.close_and_lock().unwrap(); - engine.set_signer(tap.clone(), addr1, "1".into()); + engine.set_signer(Box::new((tap.clone(), addr1, "1".into()))); if let Seal::Regular(seal) = engine.generate_seal(b3.block(), &genesis_header) { let empty_step2 = sealed_empty_step(engine, 2, &genesis_header.hash()); - engine.set_signer(tap.clone(), addr2, "0".into()); + engine.set_signer(Box::new((tap.clone(), addr2, "0".into()))); let empty_step3 = sealed_empty_step(engine, 3, &genesis_header.hash()); let empty_steps = ::rlp::encode_list(&vec![empty_step2, empty_step3]); @@ -2016,7 +2025,7 @@ mod tests { let last_hashes = Arc::new(vec![genesis_header.hash()]); - let client = generate_dummy_client_with_spec_and_accounts(Spec::new_test_round_empty_steps, None); + let client = generate_dummy_client_with_spec(Spec::new_test_round_empty_steps); engine.register_client(Arc::downgrade(&client) as _); // step 2 @@ -2024,7 +2033,7 @@ mod tests { let b1 = b1.close_and_lock().unwrap(); // since the block is empty it isn't sealed and we generate empty steps - engine.set_signer(tap.clone(), addr1, "1".into()); + engine.set_signer(Box::new((tap.clone(), addr1, "1".into()))); assert_eq!(engine.generate_seal(b1.block(), &genesis_header), Seal::None); engine.step(); @@ -2078,7 +2087,7 @@ mod tests { ); // empty step with valid signature from incorrect proposer for step - engine.set_signer(tap.clone(), addr1, "1".into()); + engine.set_signer(Box::new((tap.clone(), addr1, "1".into()))); let empty_steps = vec![sealed_empty_step(engine, 1, &parent_header.hash())]; set_empty_steps_seal(&mut header, 2, &signature, &empty_steps); @@ -2088,9 +2097,9 @@ mod tests { ); // valid empty steps - engine.set_signer(tap.clone(), addr1, "1".into()); + engine.set_signer(Box::new((tap.clone(), addr1, "1".into()))); let empty_step2 = sealed_empty_step(engine, 2, &parent_header.hash()); - engine.set_signer(tap.clone(), addr2, "0".into()); + engine.set_signer(Box::new((tap.clone(), addr2, "0".into()))); let empty_step3 = sealed_empty_step(engine, 3, &parent_header.hash()); let empty_steps = vec![empty_step2, empty_step3]; @@ -2115,10 +2124,7 @@ mod tests { let last_hashes = Arc::new(vec![genesis_header.hash()]); - let client = generate_dummy_client_with_spec_and_accounts( - Spec::new_test_round_block_reward_contract, - None, - ); + let client = generate_dummy_client_with_spec(Spec::new_test_round_block_reward_contract); engine.register_client(Arc::downgrade(&client) as _); // step 2 @@ -2138,7 +2144,7 @@ mod tests { let b1 = b1.close_and_lock().unwrap(); // since the block is empty it isn't sealed and we generate empty steps - engine.set_signer(tap.clone(), addr1, "1".into()); + engine.set_signer(Box::new((tap.clone(), addr1, "1".into()))); assert_eq!(engine.generate_seal(b1.block(), &genesis_header), Seal::None); engine.step(); @@ -2176,7 +2182,7 @@ mod tests { let engine = &*spec.engine; let addr1 = accounts[0]; - engine.set_signer(tap.clone(), addr1, "1".into()); + engine.set_signer(Box::new((tap.clone(), addr1, "1".into()))); let mut header: Header = Header::default(); let empty_step = empty_step(engine, 1, &header.parent_hash()); @@ -2257,7 +2263,7 @@ mod tests { header.set_author(accounts[0]); // when - engine.set_signer(tap.clone(), accounts[1], "0".into()); + engine.set_signer(Box::new((tap.clone(), accounts[1], "0".into()))); let empty_steps = vec![ sealed_empty_step(&*engine, 1, &parent.hash()), sealed_empty_step(&*engine, 1, &parent.hash()), @@ -2294,9 +2300,9 @@ mod tests { header.set_author(accounts[0]); // when - engine.set_signer(tap.clone(), accounts[1], "0".into()); + engine.set_signer(Box::new((tap.clone(), accounts[1], "0".into()))); let es1 = sealed_empty_step(&*engine, 1, &parent.hash()); - engine.set_signer(tap.clone(), accounts[0], "1".into()); + engine.set_signer(Box::new((tap.clone(), accounts[0], "1".into()))); let es2 = sealed_empty_step(&*engine, 2, &parent.hash()); let mut empty_steps = vec![es2, es1]; diff --git a/ethcore/src/engines/basic_authority.rs b/ethcore/src/engines/basic_authority.rs index 034d79107bd..1a4bdb55a90 100644 --- a/ethcore/src/engines/basic_authority.rs +++ b/ethcore/src/engines/basic_authority.rs @@ -1,34 +1,33 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! A blockchain engine that supports a basic, non-BFT proof-of-authority. -use std::sync::{Weak, Arc}; -use ethereum_types::{H256, H520, Address}; +use std::sync::Weak; +use ethereum_types::{H256, H520}; use parking_lot::RwLock; -use ethkey::{self, Password, Signature}; -use account_provider::AccountProvider; +use ethkey::{self, Signature}; use block::*; use engines::{Engine, Seal, ConstructedVerifier, EngineError}; +use engines::signer::EngineSigner; use error::{BlockError, Error}; use ethjson; -use header::{Header, ExtendedHeader}; use client::EngineClient; use machine::{AuxiliaryData, Call, EthereumMachine}; -use super::signer::EngineSigner; +use types::header::{Header, ExtendedHeader}; use super::validator_set::{ValidatorSet, SimpleList, new_validator_set}; /// `BasicAuthority` params. @@ -76,7 +75,7 @@ fn verify_external(header: &Header, validators: &ValidatorSet) -> Result<(), Err /// Engine using `BasicAuthority`, trivial proof-of-authority consensus. pub struct BasicAuthority { machine: EthereumMachine, - signer: RwLock, + signer: RwLock>>, validators: Box, } @@ -85,7 +84,7 @@ impl BasicAuthority { pub fn new(our_params: BasicAuthorityParams, machine: EthereumMachine) -> Self { BasicAuthority { machine: machine, - signer: Default::default(), + signer: RwLock::new(None), validators: new_validator_set(our_params.validators), } } @@ -190,12 +189,16 @@ impl Engine for BasicAuthority { self.validators.register_client(client); } - fn set_signer(&self, ap: Arc, address: Address, password: Password) { - self.signer.write().set(ap, address, password); + fn set_signer(&self, signer: Box) { + *self.signer.write() = Some(signer); } fn sign(&self, hash: H256) -> Result { - Ok(self.signer.read().sign(hash)?) + Ok(self.signer.read() + .as_ref() + .ok_or_else(|| ethkey::Error::InvalidAddress)? + .sign(hash)? + ) } fn snapshot_components(&self) -> Option> { @@ -214,8 +217,8 @@ mod tests { use ethereum_types::H520; use block::*; use test_helpers::get_temp_state_db; - use account_provider::AccountProvider; - use header::Header; + use accounts::AccountProvider; + use types::header::Header; use spec::Spec; use engines::Seal; use tempdir::TempDir; @@ -257,7 +260,7 @@ mod tests { let spec = new_test_authority(); let engine = &*spec.engine; - engine.set_signer(Arc::new(tap), addr, "".into()); + engine.set_signer(Box::new((Arc::new(tap), addr, "".into()))); let genesis_header = spec.genesis_header(); let db = spec.ensure_db_good(get_temp_state_db(), &Default::default()).unwrap(); let last_hashes = Arc::new(vec![genesis_header.hash()]); @@ -275,7 +278,7 @@ mod tests { let engine = new_test_authority().engine; assert!(!engine.seals_internally().unwrap()); - engine.set_signer(Arc::new(tap), authority, "".into()); + engine.set_signer(Box::new((Arc::new(tap), authority, "".into()))); assert!(engine.seals_internally().unwrap()); } } diff --git a/ethcore/src/engines/block_reward.rs b/ethcore/src/engines/block_reward.rs index becb776b8ba..a95e3820ef7 100644 --- a/ethcore/src/engines/block_reward.rs +++ b/ethcore/src/engines/block_reward.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! A module with types for declaring block rewards and a client interface for interacting with a //! block reward contract. @@ -25,7 +25,7 @@ use std::sync::Arc; use hash::keccak; use error::Error; use machine::WithRewards; -use parity_machine::{Machine, WithBalances}; +use parity_machine::Machine; use trace; use types::BlockNumber; use super::{SystemOrCodeCall, SystemOrCodeCallKind}; @@ -152,7 +152,7 @@ impl BlockRewardContract { /// Applies the given block rewards, i.e. adds the given balance to each beneficiary' address. /// If tracing is enabled the operations are recorded. -pub fn apply_block_rewards( +pub fn apply_block_rewards( rewards: &[(Address, RewardKind, U256)], block: &mut M::LiveBlock, machine: &M, @@ -170,17 +170,14 @@ mod test { use client::PrepareOpenBlock; use ethereum_types::U256; use spec::Spec; - use test_helpers::generate_dummy_client_with_spec_and_accounts; + use test_helpers::generate_dummy_client_with_spec; use engines::SystemOrCodeCallKind; use super::{BlockRewardContract, RewardKind}; #[test] fn block_reward_contract() { - let client = generate_dummy_client_with_spec_and_accounts( - Spec::new_test_round_block_reward_contract, - None, - ); + let client = generate_dummy_client_with_spec(Spec::new_test_round_block_reward_contract); let machine = Spec::new_test_machine(); diff --git a/ethcore/src/engines/instant_seal.rs b/ethcore/src/engines/instant_seal.rs index 5a4eaa642ef..595805c1997 100644 --- a/ethcore/src/engines/instant_seal.rs +++ b/ethcore/src/engines/instant_seal.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use engines::{Engine, Seal}; use parity_machine::{Machine, Transactions, TotalScoredHeader}; @@ -95,7 +95,7 @@ mod tests { use ethereum_types::{H520, Address}; use test_helpers::get_temp_state_db; use spec::Spec; - use header::Header; + use types::header::Header; use block::*; use engines::Seal; diff --git a/ethcore/src/engines/mod.rs b/ethcore/src/engines/mod.rs index 2d47002d171..9cced0a0da9 100644 --- a/ethcore/src/engines/mod.rs +++ b/ethcore/src/engines/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Consensus engine specification and basic implementations. @@ -20,34 +20,36 @@ mod authority_round; mod basic_authority; mod instant_seal; mod null_engine; -mod signer; mod validator_set; pub mod block_reward; -pub mod epoch; +pub mod signer; pub use self::authority_round::AuthorityRound; pub use self::basic_authority::BasicAuthority; pub use self::epoch::{EpochVerifier, Transition as EpochTransition}; pub use self::instant_seal::{InstantSeal, InstantSealParams}; pub use self::null_engine::NullEngine; +pub use self::signer::EngineSigner; + +// TODO [ToDr] Remove re-export (#10130) +pub use types::engines::ForkChoice; +pub use types::engines::epoch; use std::sync::{Weak, Arc}; use std::collections::{BTreeMap, HashMap}; use std::{fmt, error}; -use self::epoch::PendingTransition; - -use account_provider::AccountProvider; use builtin::Builtin; use vm::{EnvInfo, Schedule, CreateContractAddress, CallType, ActionValue}; use error::Error; -use header::{Header, BlockNumber}; +use types::BlockNumber; +use types::header::Header; use snapshot::SnapshotComponents; use spec::CommonParams; -use transaction::{self, UnverifiedTransaction, SignedTransaction}; +use types::transaction::{self, UnverifiedTransaction, SignedTransaction}; -use ethkey::{Password, Signature}; +use ethkey::{Signature}; use parity_machine::{Machine, LocalizedMachine as Localized, TotalScoredHeader}; use ethereum_types::{H256, U256, Address}; use unexpected::{Mismatch, OutOfBounds}; @@ -58,15 +60,6 @@ use types::ancestry_action::AncestryAction; /// As defined in https://github.com/ethereum/EIPs/pull/210 pub const DEFAULT_BLOCKHASH_CONTRACT: &'static str = "73fffffffffffffffffffffffffffffffffffffffe33141561006a5760014303600035610100820755610100810715156100455760003561010061010083050761010001555b6201000081071515610064576000356101006201000083050761020001555b5061013e565b4360003512151561008457600060405260206040f361013d565b61010060003543031315156100a857610100600035075460605260206060f361013c565b6101006000350715156100c55762010000600035430313156100c8565b60005b156100ea576101006101006000350507610100015460805260206080f361013b565b620100006000350715156101095763010000006000354303131561010c565b60005b1561012f57610100620100006000350507610200015460a052602060a0f361013a565b600060c052602060c0f35b5b5b5b5b"; -/// Fork choice. -#[derive(Debug, PartialEq, Eq)] -pub enum ForkChoice { - /// Choose the new block. - New, - /// Choose the current best block. - Old, -} - /// Voting errors. #[derive(Debug)] pub enum EngineError { @@ -88,6 +81,8 @@ pub enum EngineError { MalformedMessage(String), /// Requires client ref, but none registered. RequiresClient, + /// Invalid engine specification or implementation. + InvalidEngine, } impl fmt::Display for EngineError { @@ -103,6 +98,7 @@ impl fmt::Display for EngineError { FailedSystemCall(ref msg) => format!("Failed to make system call: {}", msg), MalformedMessage(ref msg) => format!("Received malformed consensus message: {}", msg), RequiresClient => format!("Call requires client but none registered"), + InvalidEngine => format!("Invalid engine specification or implementation"), }; f.write_fmt(format_args!("Engine error ({})", msg)) @@ -175,7 +171,7 @@ pub fn default_system_or_code_call<'a>(machine: &'a ::machine::EthereumMachine, pub type Headers<'a, H> = Fn(H256) -> Option + 'a; /// Type alias for a function we can query pending transitions by block hash through. -pub type PendingTransitionStore<'a> = Fn(H256) -> Option + 'a; +pub type PendingTransitionStore<'a> = Fn(H256) -> Option + 'a; /// Proof dependent on state. pub trait StateDependentProof: Send + Sync { @@ -384,8 +380,8 @@ pub trait Engine: Sync + Send { /// Takes a header of a fully verified block. fn is_proposal(&self, _verified_header: &M::Header) -> bool { false } - /// Register an account which signs consensus messages. - fn set_signer(&self, _account_provider: Arc, _address: Address, _password: Password) {} + /// Register a component which signs consensus messages. + fn set_signer(&self, _signer: Box) {} /// Sign using the EngineSigner, to be used for consensus tx signing. fn sign(&self, _hash: H256) -> Result { unimplemented!() } diff --git a/ethcore/src/engines/null_engine.rs b/ethcore/src/engines/null_engine.rs index af5aedaac37..4a2610259c4 100644 --- a/ethcore/src/engines/null_engine.rs +++ b/ethcore/src/engines/null_engine.rs @@ -1,25 +1,25 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use ethereum_types::U256; use engines::Engine; use engines::block_reward::{self, RewardKind}; -use header::BlockNumber; +use ethereum_types::U256; use machine::WithRewards; -use parity_machine::{Header, LiveBlock, WithBalances, TotalScoredHeader}; +use parity_machine::{Machine, Header, LiveBlock, TotalScoredHeader}; +use types::BlockNumber; /// Params for a null engine. #[derive(Clone, Default)] @@ -58,7 +58,7 @@ impl Default for NullEngine { } } -impl Engine for NullEngine +impl Engine for NullEngine where M::ExtendedHeader: TotalScoredHeader, ::Value: Ord { diff --git a/ethcore/src/engines/signer.rs b/ethcore/src/engines/signer.rs index c28e44451c5..bccaca19153 100644 --- a/ethcore/src/engines/signer.rs +++ b/ethcore/src/engines/signer.rs @@ -1,64 +1,83 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! A signer used by Engines which need to sign messages. -use std::sync::Arc; use ethereum_types::{H256, Address}; -use ethkey::{Password, Signature}; -use account_provider::{self, AccountProvider}; +use ethkey::{self, Signature}; /// Everything that an Engine needs to sign messages. -pub struct EngineSigner { - account_provider: Arc, - address: Option
, - password: Option, +pub trait EngineSigner: Send + Sync { + /// Sign a consensus message hash. + fn sign(&self, hash: H256) -> Result; + + /// Signing address + fn address(&self) -> Address; } -impl Default for EngineSigner { - fn default() -> Self { - EngineSigner { - account_provider: Arc::new(AccountProvider::transient_provider()), - address: Default::default(), - password: Default::default(), - } - } +/// Creates a new `EngineSigner` from given key pair. +pub fn from_keypair(keypair: ethkey::KeyPair) -> Box { + Box::new(Signer(keypair)) } -impl EngineSigner { - /// Set up the signer to sign with given address and password. - pub fn set(&mut self, ap: Arc, address: Address, password: Password) { - self.account_provider = ap; - self.address = Some(address); - self.password = Some(password); - debug!(target: "poa", "Setting Engine signer to {}", address); - } +struct Signer(ethkey::KeyPair); - /// Sign a consensus message hash. - pub fn sign(&self, hash: H256) -> Result { - self.account_provider.sign(self.address.unwrap_or_else(Default::default), self.password.clone(), hash) +impl EngineSigner for Signer { + fn sign(&self, hash: H256) -> Result { + ethkey::sign(self.0.secret(), &hash) } - /// Signing address. - pub fn address(&self) -> Option
{ - self.address.clone() + fn address(&self) -> Address { + self.0.address() } +} - /// Check if the signing address was set. - pub fn is_some(&self) -> bool { - self.address.is_some() +#[cfg(test)] +mod test_signer { + use std::sync::Arc; + + use ethkey::Password; + use accounts::{self, AccountProvider, SignError}; + + use super::*; + + impl EngineSigner for (Arc, Address, Password) { + fn sign(&self, hash: H256) -> Result { + match self.0.sign(self.1, Some(self.2.clone()), hash) { + Err(SignError::NotUnlocked) => unreachable!(), + Err(SignError::NotFound) => Err(ethkey::Error::InvalidAddress), + Err(SignError::Hardware(err)) => { + warn!("Error using hardware wallet for engine: {:?}", err); + Err(ethkey::Error::InvalidSecret) + }, + Err(SignError::SStore(accounts::Error::EthKey(err))) => Err(err), + Err(SignError::SStore(accounts::Error::EthKeyCrypto(err))) => { + warn!("Low level crypto error: {:?}", err); + Err(ethkey::Error::InvalidSecret) + }, + Err(SignError::SStore(err)) => { + warn!("Error signing for engine: {:?}", err); + Err(ethkey::Error::InvalidSignature) + }, + Ok(ok) => Ok(ok), + } + } + + fn address(&self) -> Address { + self.1 + } } } diff --git a/ethcore/src/engines/validator_set/contract.rs b/ethcore/src/engines/validator_set/contract.rs index 80cc690ab37..f0064a8c206 100644 --- a/ethcore/src/engines/validator_set/contract.rs +++ b/ethcore/src/engines/validator_set/contract.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . /// Validator set maintained in a contract, updated using `getValidators` method. /// It can also report validators for misbehaviour with two levels: `reportMalicious` and `reportBenign`. @@ -21,11 +21,12 @@ use std::sync::Weak; use bytes::Bytes; use ethereum_types::{H256, Address}; +use machine::{AuxiliaryData, Call, EthereumMachine}; use parking_lot::RwLock; +use types::BlockNumber; +use types::header::Header; use client::EngineClient; -use header::{Header, BlockNumber}; -use machine::{AuxiliaryData, Call, EthereumMachine}; use super::{ValidatorSet, SimpleList, SystemCall}; use super::safe_contract::ValidatorSafeContract; @@ -67,7 +68,7 @@ impl ValidatorContract { } impl ValidatorSet for ValidatorContract { - fn default_caller(&self, id: ::ids::BlockId) -> Box { + fn default_caller(&self, id: ::types::ids::BlockId) -> Box { self.validators.default_caller(id) } @@ -139,18 +140,19 @@ mod tests { use bytes::ToPretty; use rlp::encode; use spec::Spec; - use header::Header; - use account_provider::AccountProvider; - use miner::MinerService; + use types::header::Header; + use accounts::AccountProvider; + use miner::{self, MinerService}; use types::ids::BlockId; - use test_helpers::generate_dummy_client_with_spec_and_accounts; - use client::{BlockChainClient, ChainInfo, BlockInfo, CallContract}; + use test_helpers::generate_dummy_client_with_spec; + use call_contract::CallContract; + use client::{BlockChainClient, ChainInfo, BlockInfo}; use super::super::ValidatorSet; use super::ValidatorContract; #[test] fn fetches_validators() { - let client = generate_dummy_client_with_spec_and_accounts(Spec::new_validator_contract, None); + let client = generate_dummy_client_with_spec(Spec::new_validator_contract); let vc = Arc::new(ValidatorContract::new("0000000000000000000000000000000000000005".parse::
().unwrap())); vc.register_client(Arc::downgrade(&client) as _); let last_hash = client.best_block_header().hash(); @@ -162,13 +164,14 @@ mod tests { fn reports_validators() { let tap = Arc::new(AccountProvider::transient_provider()); let v1 = tap.insert_account(keccak("1").into(), &"".into()).unwrap(); - let client = generate_dummy_client_with_spec_and_accounts(Spec::new_validator_contract, Some(tap.clone())); + let client = generate_dummy_client_with_spec(Spec::new_validator_contract); client.engine().register_client(Arc::downgrade(&client) as _); let validator_contract = "0000000000000000000000000000000000000005".parse::
().unwrap(); // Make sure reporting can be done. client.miner().set_gas_range_target((1_000_000.into(), 1_000_000.into())); - client.miner().set_author(v1, Some("".into())).unwrap(); + let signer = Box::new((tap.clone(), v1, "".into())); + client.miner().set_author(miner::Author::Sealer(signer)); // Check a block that is a bit in future, reject it but don't report the validator. let mut header = Header::default(); diff --git a/ethcore/src/engines/validator_set/mod.rs b/ethcore/src/engines/validator_set/mod.rs index d7018d14e9a..915a3f9a15d 100644 --- a/ethcore/src/engines/validator_set/mod.rs +++ b/ethcore/src/engines/validator_set/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . /// Validator lists. @@ -24,13 +24,16 @@ mod contract; mod multi; use std::sync::Weak; -use ids::BlockId; -use ethereum_types::{H256, Address}; + use bytes::Bytes; +use ethereum_types::{H256, Address}; use ethjson::spec::ValidatorSet as ValidatorSpec; -use client::EngineClient; -use header::{Header, BlockNumber}; use machine::{AuxiliaryData, Call, EthereumMachine}; +use types::BlockNumber; +use types::header::Header; +use types::ids::BlockId; + +use client::EngineClient; #[cfg(test)] pub use self::test::TestSet; diff --git a/ethcore/src/engines/validator_set/multi.rs b/ethcore/src/engines/validator_set/multi.rs index 24fb2d890bd..8aa7aa3deed 100644 --- a/ethcore/src/engines/validator_set/multi.rs +++ b/ethcore/src/engines/validator_set/multi.rs @@ -1,28 +1,31 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . /// Validator set changing at fork blocks. use std::collections::BTreeMap; use std::sync::Weak; + +use bytes::Bytes; use ethereum_types::{H256, Address}; use parking_lot::RwLock; -use bytes::Bytes; -use ids::BlockId; -use header::{BlockNumber, Header}; +use types::BlockNumber; +use types::header::Header; +use types::ids::BlockId; + use client::EngineClient; use machine::{AuxiliaryData, Call, EthereumMachine}; use super::{SystemCall, ValidatorSet}; @@ -147,15 +150,15 @@ mod tests { use std::sync::Arc; use std::collections::BTreeMap; use hash::keccak; - use account_provider::AccountProvider; + use accounts::AccountProvider; use client::{BlockChainClient, ChainInfo, BlockInfo, ImportBlock}; use engines::EpochChange; use engines::validator_set::ValidatorSet; use ethkey::Secret; - use header::Header; - use miner::MinerService; + use types::header::Header; + use miner::{self, MinerService}; use spec::Spec; - use test_helpers::{generate_dummy_client_with_spec_and_accounts, generate_dummy_client_with_spec_and_data}; + use test_helpers::{generate_dummy_client_with_spec, generate_dummy_client_with_spec_and_data}; use types::ids::BlockId; use ethereum_types::Address; use verification::queue::kind::blocks::Unverified; @@ -168,26 +171,29 @@ mod tests { let s0: Secret = keccak("0").into(); let v0 = tap.insert_account(s0.clone(), &"".into()).unwrap(); let v1 = tap.insert_account(keccak("1").into(), &"".into()).unwrap(); - let client = generate_dummy_client_with_spec_and_accounts(Spec::new_validator_multi, Some(tap)); + let client = generate_dummy_client_with_spec(Spec::new_validator_multi); client.engine().register_client(Arc::downgrade(&client) as _); // Make sure txs go through. client.miner().set_gas_range_target((1_000_000.into(), 1_000_000.into())); // Wrong signer for the first block. - client.miner().set_author(v1, Some("".into())).unwrap(); + let signer = Box::new((tap.clone(), v1, "".into())); + client.miner().set_author(miner::Author::Sealer(signer)); client.transact_contract(Default::default(), Default::default()).unwrap(); ::client::EngineClient::update_sealing(&*client); assert_eq!(client.chain_info().best_block_number, 0); // Right signer for the first block. - client.miner().set_author(v0, Some("".into())).unwrap(); + let signer = Box::new((tap.clone(), v0, "".into())); + client.miner().set_author(miner::Author::Sealer(signer)); ::client::EngineClient::update_sealing(&*client); assert_eq!(client.chain_info().best_block_number, 1); // This time v0 is wrong. client.transact_contract(Default::default(), Default::default()).unwrap(); ::client::EngineClient::update_sealing(&*client); assert_eq!(client.chain_info().best_block_number, 1); - client.miner().set_author(v1, Some("".into())).unwrap(); + let signer = Box::new((tap.clone(), v1, "".into())); + client.miner().set_author(miner::Author::Sealer(signer)); ::client::EngineClient::update_sealing(&*client); assert_eq!(client.chain_info().best_block_number, 2); // v1 is still good. diff --git a/ethcore/src/engines/validator_set/safe_contract.rs b/ethcore/src/engines/validator_set/safe_contract.rs index 91083c05607..49d539df3f3 100644 --- a/ethcore/src/engines/validator_set/safe_contract.rs +++ b/ethcore/src/engines/validator_set/safe_contract.rs @@ -1,39 +1,41 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . /// Validator set maintained in a contract, updated using `getValidators` method. +use std::sync::{Weak, Arc}; + use bytes::Bytes; -use client::EngineClient; +use ethabi::FunctionOutputDecoder; use ethereum_types::{H256, U256, Address, Bloom}; use hash::keccak; -use header::Header; -use ids::BlockId; use kvdb::DBValue; -use log_entry::LogEntry; -use machine::{AuxiliaryData, Call, EthereumMachine, AuxiliaryRequest}; use memory_cache::MemoryLruCache; use parking_lot::RwLock; -use receipt::Receipt; use rlp::{Rlp, RlpStream}; -use std::sync::{Weak, Arc}; +use types::header::Header; +use types::ids::BlockId; +use types::log_entry::LogEntry; +use types::receipt::Receipt; +use unexpected::Mismatch; + +use client::EngineClient; +use machine::{AuxiliaryData, Call, EthereumMachine, AuxiliaryRequest}; use super::{SystemCall, ValidatorSet}; use super::simple_list::SimpleList; -use unexpected::Mismatch; -use ethabi::FunctionOutputDecoder; use_contract!(validator_set, "res/contracts/validator_set.json"); @@ -91,7 +93,7 @@ fn encode_first_proof(header: &Header, state_items: &[Vec]) -> Bytes { fn check_first_proof(machine: &EthereumMachine, contract_address: Address, old_header: Header, state_items: &[DBValue]) -> Result, String> { - use transaction::{Action, Transaction}; + use types::transaction::{Action, Transaction}; // TODO: match client contract_call_tx more cleanly without duplication. const PROVIDED_GAS: u64 = 50_000_000; @@ -343,7 +345,7 @@ impl ValidatorSet for ValidatorSafeContract { } } - fn epoch_set(&self, first: bool, machine: &EthereumMachine, _number: ::header::BlockNumber, proof: &[u8]) + fn epoch_set(&self, first: bool, machine: &EthereumMachine, _number: ::types::BlockNumber, proof: &[u8]) -> Result<(SimpleList, Option), ::error::Error> { let rlp = Rlp::new(proof); @@ -443,19 +445,19 @@ mod tests { use ethereum_types::Address; use types::ids::BlockId; use spec::Spec; - use account_provider::AccountProvider; - use transaction::{Transaction, Action}; + use accounts::AccountProvider; + use types::transaction::{Transaction, Action}; use client::{ChainInfo, BlockInfo, ImportBlock}; use ethkey::Secret; - use miner::MinerService; - use test_helpers::{generate_dummy_client_with_spec_and_accounts, generate_dummy_client_with_spec_and_data}; + use miner::{self, MinerService}; + use test_helpers::{generate_dummy_client_with_spec, generate_dummy_client_with_spec_and_data}; use super::super::ValidatorSet; use super::{ValidatorSafeContract, EVENT_NAME_HASH}; use verification::queue::kind::blocks::Unverified; #[test] fn fetches_validators() { - let client = generate_dummy_client_with_spec_and_accounts(Spec::new_validator_safe_contract, None); + let client = generate_dummy_client_with_spec(Spec::new_validator_safe_contract); let vc = Arc::new(ValidatorSafeContract::new("0000000000000000000000000000000000000005".parse::
().unwrap())); vc.register_client(Arc::downgrade(&client) as _); let last_hash = client.best_block_header().hash(); @@ -470,11 +472,12 @@ mod tests { let v0 = tap.insert_account(s0.clone(), &"".into()).unwrap(); let v1 = tap.insert_account(keccak("0").into(), &"".into()).unwrap(); let chain_id = Spec::new_validator_safe_contract().chain_id(); - let client = generate_dummy_client_with_spec_and_accounts(Spec::new_validator_safe_contract, Some(tap)); + let client = generate_dummy_client_with_spec(Spec::new_validator_safe_contract); client.engine().register_client(Arc::downgrade(&client) as _); let validator_contract = "0000000000000000000000000000000000000005".parse::
().unwrap(); + let signer = Box::new((tap.clone(), v1, "".into())); - client.miner().set_author(v1, Some("".into())).unwrap(); + client.miner().set_author(miner::Author::Sealer(signer)); // Remove "1" validator. let tx = Transaction { nonce: 0.into(), @@ -502,11 +505,13 @@ mod tests { assert_eq!(client.chain_info().best_block_number, 1); // Switch to the validator that is still there. - client.miner().set_author(v0, Some("".into())).unwrap(); + let signer = Box::new((tap.clone(), v0, "".into())); + client.miner().set_author(miner::Author::Sealer(signer)); ::client::EngineClient::update_sealing(&*client); assert_eq!(client.chain_info().best_block_number, 2); // Switch back to the added validator, since the state is updated. - client.miner().set_author(v1, Some("".into())).unwrap(); + let signer = Box::new((tap.clone(), v1, "".into())); + client.miner().set_author(miner::Author::Sealer(signer)); let tx = Transaction { nonce: 2.into(), gas_price: 0.into(), @@ -532,12 +537,12 @@ mod tests { #[test] fn detects_bloom() { - use header::Header; use engines::EpochChange; use machine::AuxiliaryRequest; - use log_entry::LogEntry; + use types::header::Header; + use types::log_entry::LogEntry; - let client = generate_dummy_client_with_spec_and_accounts(Spec::new_validator_safe_contract, None); + let client = generate_dummy_client_with_spec(Spec::new_validator_safe_contract); let engine = client.engine().clone(); let validator_contract = "0000000000000000000000000000000000000005".parse::
().unwrap(); @@ -571,10 +576,10 @@ mod tests { #[test] fn initial_contract_is_signal() { - use header::Header; + use types::header::Header; use engines::{EpochChange, Proof}; - let client = generate_dummy_client_with_spec_and_accounts(Spec::new_validator_safe_contract, None); + let client = generate_dummy_client_with_spec(Spec::new_validator_safe_contract); let engine = client.engine().clone(); let mut new_header = Header::default(); diff --git a/ethcore/src/engines/validator_set/simple_list.rs b/ethcore/src/engines/validator_set/simple_list.rs index dc269600d00..0a0294be966 100644 --- a/ethcore/src/engines/validator_set/simple_list.rs +++ b/ethcore/src/engines/validator_set/simple_list.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . /// Preconfigured validator list. @@ -20,7 +20,8 @@ use heapsize::HeapSizeOf; use ethereum_types::{H256, Address}; use machine::{AuxiliaryData, Call, EthereumMachine}; -use header::{BlockNumber, Header}; +use types::BlockNumber; +use types::header::Header; use super::ValidatorSet; /// Validator set containing a known set of addresses. @@ -64,7 +65,7 @@ impl HeapSizeOf for SimpleList { } impl ValidatorSet for SimpleList { - fn default_caller(&self, _block_id: ::ids::BlockId) -> Box { + fn default_caller(&self, _block_id: ::types::ids::BlockId) -> Box { Box::new(|_, _| Err("Simple list doesn't require calls.".into())) } diff --git a/ethcore/src/engines/validator_set/test.rs b/ethcore/src/engines/validator_set/test.rs index 9650526e577..c66ff14ad4e 100644 --- a/ethcore/src/engines/validator_set/test.rs +++ b/ethcore/src/engines/validator_set/test.rs @@ -1,30 +1,32 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . /// Used for Engine testing. use std::str::FromStr; use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering as AtomicOrdering}; -use heapsize::HeapSizeOf; -use ethereum_types::{H256, Address}; + use bytes::Bytes; +use ethereum_types::{H256, Address}; +use heapsize::HeapSizeOf; +use types::BlockNumber; +use types::header::Header; use machine::{AuxiliaryData, Call, EthereumMachine}; -use header::{Header, BlockNumber}; use super::{ValidatorSet, SimpleList}; /// Set used for testing with a single validator. @@ -57,7 +59,7 @@ impl HeapSizeOf for TestSet { } impl ValidatorSet for TestSet { - fn default_caller(&self, _block_id: ::ids::BlockId) -> Box { + fn default_caller(&self, _block_id: ::types::ids::BlockId) -> Box { Box::new(|_, _| Err("Test set doesn't require calls.".into())) } diff --git a/ethcore/src/error.rs b/ethcore/src/error.rs index 02268747aef..c3ffc904386 100644 --- a/ethcore/src/error.rs +++ b/ethcore/src/error.rs @@ -1,35 +1,39 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! General error types for use in ethcore. +// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` +// https://github.com/paritytech/parity-ethereum/issues/10302 +#![allow(deprecated)] + use std::{fmt, error}; use std::time::SystemTime; + use ethereum_types::{H256, U256, Address, Bloom}; -use snappy::InvalidInput; -use unexpected::{Mismatch, OutOfBounds}; +use ethkey::Error as EthkeyError; use ethtrie::TrieError; -use io::*; -use header::BlockNumber; +use rlp; +use snappy::InvalidInput; use snapshot::Error as SnapshotError; +use types::BlockNumber; +use types::transaction::Error as TransactionError; +use unexpected::{Mismatch, OutOfBounds}; + use engines::EngineError; -use ethkey::Error as EthkeyError; -use account_provider::SignError as AccountsError; -use transaction::Error as TransactionError; -use rlp; pub use executed::{ExecutionError, CallError}; @@ -89,6 +93,8 @@ pub enum BlockError { InvalidNumber(Mismatch), /// Block number isn't sensible. RidiculousNumber(OutOfBounds), + /// Timestamp header overflowed + TimestampOverflow, /// Too many transactions from a particular address. TooManyTransactions(Address), /// Parent given is unknown. @@ -138,6 +144,7 @@ impl fmt::Display for BlockError { UnknownParent(ref hash) => format!("Unknown parent: {}", hash), UnknownUncleParent(ref hash) => format!("Unknown uncle parent: {}", hash), UnknownEpochTransition(ref num) => format!("Unknown transition to epoch number: {}", num), + TimestampOverflow => format!("Timestamp overflow"), TooManyTransactions(ref address) => format!("Too many transactions from: {}", address), }; @@ -165,7 +172,7 @@ error_chain! { } foreign_links { - Channel(IoError) #[doc = "Io channel error"]; + Channel(::io::IoError) #[doc = "Io channel error"]; } } @@ -224,7 +231,7 @@ error_chain! { } foreign_links { - Io(IoError) #[doc = "Io create error"]; + Io(::io::IoError) #[doc = "Io create error"]; StdIo(::std::io::Error) #[doc = "Error concerning the Rust standard library's IO subsystem."]; Trie(TrieError) #[doc = "Error concerning TrieDBs."]; Execution(ExecutionError) #[doc = "Error concerning EVM code execution."]; @@ -243,12 +250,6 @@ error_chain! { display("Snapshot error {}", err) } - #[doc = "Account Provider error"] - AccountProvider(err: AccountsError) { - description("Accounts Provider error") - display("Accounts Provider error {}", err) - } - #[doc = "PoW hash is invalid or out of date."] PowHashInvalid { description("PoW hash is invalid or out of date.") @@ -269,12 +270,6 @@ error_chain! { } } -impl From for Error { - fn from(err: AccountsError) -> Error { - ErrorKind::AccountProvider(err).into() - } -} - impl From for Error { fn from(err: SnapshotError) -> Error { match err { diff --git a/ethcore/src/ethereum/denominations.rs b/ethcore/src/ethereum/denominations.rs index 4c51932543c..3bf4878c7c5 100644 --- a/ethcore/src/ethereum/denominations.rs +++ b/ethcore/src/ethereum/denominations.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethereum_types::U256; diff --git a/ethcore/src/ethereum/ethash.rs b/ethcore/src/ethereum/ethash.rs index f705f33ef9f..293009fdecf 100644 --- a/ethcore/src/ethereum/ethash.rs +++ b/ethcore/src/ethereum/ethash.rs @@ -1,34 +1,37 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use std::path::Path; use std::cmp; use std::collections::BTreeMap; +use std::path::Path; use std::sync::Arc; -use hash::{KECCAK_EMPTY_LIST_RLP}; -use engines::block_reward::{self, BlockRewardContract, RewardKind}; -use ethash::{self, quick_get_difficulty, slow_hash_block_number, EthashManager, OptimizeFor}; + use ethereum_types::{H256, H64, U256}; -use unexpected::{OutOfBounds, Mismatch}; -use block::*; -use error::{BlockError, Error}; -use header::{Header, BlockNumber, ExtendedHeader}; -use engines::{self, Engine}; use ethjson; +use hash::{KECCAK_EMPTY_LIST_RLP}; use rlp::Rlp; +use types::header::{Header, ExtendedHeader}; +use types::BlockNumber; +use unexpected::{OutOfBounds, Mismatch}; + +use block::ExecutedBlock; +use engines::block_reward::{self, BlockRewardContract, RewardKind}; +use engines::{self, Engine}; +use error::{BlockError, Error}; +use ethash::{self, quick_get_difficulty, slow_hash_block_number, EthashManager, OptimizeFor}; use machine::EthereumMachine; /// Number of blocks in an ethash snapshot. @@ -110,6 +113,8 @@ pub struct EthashParams { pub block_reward_contract: Option, /// Difficulty bomb delays. pub difficulty_bomb_delays: BTreeMap, + /// Block to transition to progpow + pub progpow_transition: u64, } impl From for EthashParams { @@ -150,6 +155,7 @@ impl From for EthashParams { }), expip2_transition: p.expip2_transition.map_or(u64::max_value(), Into::into), expip2_duration_limit: p.expip2_duration_limit.map_or(30, Into::into), + progpow_transition: p.progpow_transition.map_or(u64::max_value(), Into::into), block_reward_contract_transition: p.block_reward_contract_transition.map_or(0, Into::into), block_reward_contract: match (p.block_reward_contract_code, p.block_reward_contract_address) { (Some(code), _) => Some(BlockRewardContract::new_from_code(Arc::new(code.into()))), @@ -179,10 +185,12 @@ impl Ethash { machine: EthereumMachine, optimize_for: T, ) -> Arc { + let progpow_transition = ethash_params.progpow_transition; + Arc::new(Ethash { ethash_params, machine, - pow: EthashManager::new(cache_dir.as_ref(), optimize_for.into()), + pow: EthashManager::new(cache_dir.as_ref(), optimize_for.into(), progpow_transition), }) } } @@ -317,7 +325,8 @@ impl Engine for Arc { let difficulty = ethash::boundary_to_difficulty(&H256(quick_get_difficulty( &header.bare_hash().0, seal.nonce.low_u64(), - &seal.mix_hash.0 + &seal.mix_hash.0, + header.number() >= self.ethash_params.progpow_transition ))); if &difficulty < header.difficulty() { @@ -482,7 +491,7 @@ mod tests { use block::*; use test_helpers::get_temp_state_db; use error::{BlockError, Error, ErrorKind}; - use header::Header; + use types::header::Header; use spec::Spec; use engines::Engine; use super::super::{new_morden, new_mcip3_test, new_homestead_test_machine}; @@ -520,6 +529,7 @@ mod tests { block_reward_contract: None, block_reward_contract_transition: 0, difficulty_bomb_delays: BTreeMap::new(), + progpow_transition: u64::max_value(), } } diff --git a/ethcore/src/ethereum/mod.rs b/ethcore/src/ethereum/mod.rs index 467b978d279..b7c60789a3d 100644 --- a/ethcore/src/ethereum/mod.rs +++ b/ethcore/src/ethereum/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Ethereum protocol module. //! @@ -148,6 +148,9 @@ pub fn new_byzantium_test() -> Spec { load(None, include_bytes!("../../res/ether /// Create a new Foundation Constantinople era spec. pub fn new_constantinople_test() -> Spec { load(None, include_bytes!("../../res/ethereum/constantinople_test.json")) } +/// Create a new Foundation St. Peter's (Contantinople Fix) era spec. +pub fn new_constantinople_fix_test() -> Spec { load(None, include_bytes!("../../res/ethereum/st_peters_test.json")) } + /// Create a new Musicoin-MCIP3-era spec. pub fn new_mcip3_test() -> Spec { load(None, include_bytes!("../../res/ethereum/mcip3_test.json")) } @@ -168,6 +171,9 @@ pub fn new_byzantium_test_machine() -> EthereumMachine { load_machine(include_by /// Create a new Foundation Constantinople era spec. pub fn new_constantinople_test_machine() -> EthereumMachine { load_machine(include_bytes!("../../res/ethereum/constantinople_test.json")) } +/// Create a new Foundation St. Peter's (Contantinople Fix) era spec. +pub fn new_constantinople_fix_test_machine() -> EthereumMachine { load_machine(include_bytes!("../../res/ethereum/st_peters_test.json")) } + /// Create a new Musicoin-MCIP3-era spec. pub fn new_mcip3_test_machine() -> EthereumMachine { load_machine(include_bytes!("../../res/ethereum/mcip3_test.json")) } @@ -180,7 +186,8 @@ mod tests { use state::*; use super::*; use test_helpers::get_temp_state_db; - use views::BlockView; + use types::view; + use types::views::BlockView; #[test] fn ensure_db_good() { diff --git a/ethcore/src/executed.rs b/ethcore/src/executed.rs index 2dc0c041be1..f9be002ff85 100644 --- a/ethcore/src/executed.rs +++ b/ethcore/src/executed.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Transaction execution format module. @@ -21,8 +21,8 @@ use bytes::Bytes; use ethtrie; use vm; use trace::{VMTrace, FlatTrace}; -use log_entry::LogEntry; -use state_diff::StateDiff; +use types::state_diff::StateDiff; +use types::log_entry::LogEntry; use std::{fmt, error}; diff --git a/ethcore/src/executive.rs b/ethcore/src/executive.rs index bfc4e46fa59..68d4edc7948 100644 --- a/ethcore/src/executive.rs +++ b/ethcore/src/executive.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Transaction Execution environment. use std::cmp; @@ -21,7 +21,7 @@ use hash::keccak; use ethereum_types::{H256, U256, U512, Address}; use bytes::{Bytes, BytesRef}; use state::{Backend as StateBackend, State, Substate, CleanupMode}; -use error::ExecutionError; +use executed::ExecutionError; use machine::EthereumMachine as Machine; use evm::{CallType, Finalize, FinalizationResult}; use vm::{ @@ -31,7 +31,8 @@ use vm::{ use factory::VmFactory; use externalities::*; use trace::{self, Tracer, VMTracer}; -use transaction::{Action, SignedTransaction}; +use types::transaction::{Action, SignedTransaction}; +use transaction_ext::Transaction; use crossbeam; pub use executed::{Executed, ExecutionResult}; @@ -311,7 +312,7 @@ impl<'a> CallCreateExecutive<'a> { let prev_bal = state.balance(¶ms.address)?; if let ActionValue::Transfer(val) = params.value { state.sub_balance(¶ms.sender, &val, &mut substate.to_cleanup_mode(&schedule))?; - state.new_contract(¶ms.address, val + prev_bal, nonce_offset)?; + state.new_contract(¶ms.address, val.saturating_add(prev_bal), nonce_offset)?; } else { state.new_contract(¶ms.address, prev_bal, nonce_offset)?; } @@ -1102,9 +1103,13 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { let refunded = cmp::min(refunds_bound, (t.gas - gas_left_prerefund) >> 1); let gas_left = gas_left_prerefund + refunded; - let gas_used = t.gas - gas_left; - let refund_value = gas_left * t.gas_price; - let fees_value = gas_used * t.gas_price; + let gas_used = t.gas.saturating_sub(gas_left); + let (refund_value, overflow_1) = gas_left.overflowing_mul(t.gas_price); + let (fees_value, overflow_2) = gas_used.overflowing_mul(t.gas_price); + if overflow_1 || overflow_2 { + return Err(ExecutionError::TransactionMalformed("U256 Overflow".to_string())); + } + trace!("exec::finalize: t.gas={}, sstore_refunds={}, suicide_refunds={}, refunds_bound={}, gas_left_prerefund={}, refunded={}, gas_left={}, gas_used={}, refund_value={}, fees_value={}\n", t.gas, sstore_refunds, suicide_refunds, refunds_bound, gas_left_prerefund, refunded, gas_left, gas_used, refund_value, fees_value); @@ -1122,7 +1127,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { } // perform garbage-collection - let min_balance = if schedule.kill_dust != CleanDustMode::Off { Some(U256::from(schedule.tx_gas) * t.gas_price) } else { None }; + let min_balance = if schedule.kill_dust != CleanDustMode::Off { Some(U256::from(schedule.tx_gas).overflowing_mul(t.gas_price).0) } else { None }; self.state.kill_garbage(&substate.touched, schedule.kill_empty, &min_balance, schedule.kill_dust == CleanDustMode::WithCodeAndStorage)?; match result { @@ -1179,7 +1184,7 @@ mod tests { use trace::trace; use trace::{FlatTrace, Tracer, NoopTracer, ExecutiveTracer}; use trace::{VMTrace, VMOperation, VMExecutedOperation, MemoryDiff, StorageDiff, VMTracer, NoopVMTracer, ExecutiveVMTracer}; - use transaction::{Action, Transaction}; + use types::transaction::{Action, Transaction}; fn make_frontier_machine(max_depth: usize) -> EthereumMachine { let mut machine = ::ethereum::new_frontier_test_machine(); diff --git a/ethcore/src/externalities.rs b/ethcore/src/externalities.rs index 778ef5cc746..a2f35b6ded8 100644 --- a/ethcore/src/externalities.rs +++ b/ethcore/src/externalities.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Transaction Execution environment. use std::cmp; @@ -27,7 +27,7 @@ use vm::{ Ext, ContractCreateResult, MessageCallResult, CreateContractAddress, ReturnData, TrapKind }; -use transaction::UNSIGNED_SENDER; +use types::transaction::UNSIGNED_SENDER; use trace::{Tracer, VMTracer}; /// Policy for handling output data on `RETURN` opcode. @@ -116,7 +116,12 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B> where T: Tracer, V: VMTracer, B: StateBackend { fn initial_storage_at(&self, key: &H256) -> vm::Result { - self.state.checkpoint_storage_at(0, &self.origin_info.address, key).map(|v| v.unwrap_or(H256::zero())).map_err(Into::into) + if self.state.is_base_storage_root_unchanged(&self.origin_info.address)? { + self.state.checkpoint_storage_at(0, &self.origin_info.address, key).map(|v| v.unwrap_or(H256::zero())).map_err(Into::into) + } else { + warn!(target: "externalities", "Detected existing account {:#x} where a forced contract creation happened.", self.origin_info.address); + Ok(H256::zero()) + } } fn storage_at(&self, key: &H256) -> vm::Result { @@ -340,7 +345,7 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B> } fn log(&mut self, topics: Vec, data: &[u8]) -> vm::Result<()> { - use log_entry::LogEntry; + use types::log_entry::LogEntry; if self.static_flag { return Err(vm::Error::MutableCallInStaticContext); diff --git a/ethcore/src/factory.rs b/ethcore/src/factory.rs index 9a69e0cf0e8..06b77da9aa1 100644 --- a/ethcore/src/factory.rs +++ b/ethcore/src/factory.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use trie::TrieFactory; use ethtrie::RlpCodec; diff --git a/ethcore/src/json_tests/chain.rs b/ethcore/src/json_tests/chain.rs index 3f3957a1ff4..4488d0f326e 100644 --- a/ethcore/src/json_tests/chain.rs +++ b/ethcore/src/json_tests/chain.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::path::Path; use std::sync::Arc; @@ -42,7 +42,7 @@ fn skip_test(name: &String) -> bool { } pub fn json_chain_test(json_data: &[u8], start_stop_hook: &mut H) -> Vec { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let tests = ethjson::blockchain::Test::load(json_data).unwrap(); let mut failed = Vec::new(); diff --git a/ethcore/src/json_tests/difficulty.rs b/ethcore/src/json_tests/difficulty.rs index 23a85594552..bf3a48fff19 100644 --- a/ethcore/src/json_tests/difficulty.rs +++ b/ethcore/src/json_tests/difficulty.rs @@ -1,28 +1,28 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethjson; -use header::Header; +use types::header::Header; use ethereum_types::U256; use spec::Spec; use super::HookType; pub fn json_difficulty_test(json_data: &[u8], spec: Spec, start_stop_hook: &mut H) -> Vec { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let tests = ethjson::test::DifficultyTest::load(json_data).unwrap(); let engine = &spec.engine; @@ -110,4 +110,3 @@ mod difficulty_test_homestead { difficulty_json_test_nopath!(new_homestead_test); declare_test!{DifficultyTests_difficultyHomestead, "BasicTests/difficultyHomestead.json"} } - diff --git a/ethcore/src/json_tests/executive.rs b/ethcore/src/json_tests/executive.rs index 1999ee4d6c4..cd9e8f2aece 100644 --- a/ethcore/src/json_tests/executive.rs +++ b/ethcore/src/json_tests/executive.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::path::Path; use std::sync::Arc; diff --git a/ethcore/src/json_tests/mod.rs b/ethcore/src/json_tests/mod.rs index 35d5034806a..99cbdb21eec 100644 --- a/ethcore/src/json_tests/mod.rs +++ b/ethcore/src/json_tests/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Helpers and tests for operating on jsontests. @@ -29,7 +29,6 @@ mod skip; #[cfg(test)] mod difficulty; - pub use self::test_common::HookType; pub use self::transaction::run_test_path as run_transaction_test_path; diff --git a/ethcore/src/json_tests/skip.rs b/ethcore/src/json_tests/skip.rs index 784e2975d73..b6ef9795f69 100644 --- a/ethcore/src/json_tests/skip.rs +++ b/ethcore/src/json_tests/skip.rs @@ -1,27 +1,24 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! State tests to skip. use ethjson; -#[cfg(all(not(test), feature = "ci-skip-tests"))] -compile_error!("ci-skip-tests can only be enabled for testing builds."); - -#[cfg(feature="ci-skip-issue")] +#[cfg(feature="ci-skip-tests")] lazy_static!{ pub static ref SKIP_TEST_STATE: ethjson::test::SkipStates = { let skip_data = include_bytes!("../../res/ethereum/tests-issues/currents.json"); @@ -29,7 +26,7 @@ lazy_static!{ }; } -#[cfg(not(feature="ci-skip-issue"))] +#[cfg(not(feature="ci-skip-tests"))] lazy_static!{ pub static ref SKIP_TEST_STATE: ethjson::test::SkipStates = { ethjson::test::SkipStates::empty() diff --git a/ethcore/src/json_tests/state.rs b/ethcore/src/json_tests/state.rs index 733e268028f..c51a2c361c2 100644 --- a/ethcore/src/json_tests/state.rs +++ b/ethcore/src/json_tests/state.rs @@ -1,26 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::path::Path; use super::test_common::*; use pod_state::PodState; use trace; -use client::{EvmTestClient, EvmTestError, TransactResult}; +use client::{EvmTestClient, EvmTestError, TransactErr, TransactSuccess}; use ethjson; -use transaction::SignedTransaction; +use types::transaction::SignedTransaction; use vm::EnvInfo; use super::SKIP_TEST_STATE; use super::HookType; @@ -48,7 +48,7 @@ fn skip_test(subname: &str, chain: &String, number: usize) -> bool { } pub fn json_chain_test(json_data: &[u8], start_stop_hook: &mut H) -> Vec { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let tests = ethjson::state::test::Test::load(json_data).unwrap(); let mut failed = Vec::new(); @@ -90,18 +90,18 @@ pub fn json_chain_test(json_data: &[u8], start_stop_ho flushln!("{} fail", info); failed.push(name.clone()); }, - Ok(TransactResult::Ok { state_root, .. }) if state_root != post_root => { + Ok(Ok(TransactSuccess { state_root, .. })) if state_root != post_root => { println!("{} !!! State mismatch (got: {}, expect: {}", info, state_root, post_root); flushln!("{} fail", info); failed.push(name.clone()); }, - Ok(TransactResult::Err { state_root, ref error, .. }) if state_root != post_root => { + Ok(Err(TransactErr { state_root, ref error, .. })) if state_root != post_root => { println!("{} !!! State mismatch (got: {}, expect: {}", info, state_root, post_root); println!("{} !!! Execution error: {:?}", info, error); flushln!("{} fail", info); failed.push(name.clone()); }, - Ok(TransactResult::Err { error, .. }) => { + Ok(Err(TransactErr { error, .. })) => { flushln!("{} ok ({:?})", info, error); }, Ok(_) => { @@ -165,6 +165,7 @@ mod state_tests { declare_test!{GeneralStateTest_stRefundTest, "GeneralStateTests/stRefundTest/"} declare_test!{GeneralStateTest_stReturnDataTest, "GeneralStateTests/stReturnDataTest/"} declare_test!{GeneralStateTest_stRevertTest, "GeneralStateTests/stRevertTest/"} + declare_test!{GeneralStateTest_stSStoreTest, "GeneralStateTests/stSStoreTest/"} declare_test!{GeneralStateTest_stShift, "GeneralStateTests/stShift/"} declare_test!{GeneralStateTest_stSolidityTest, "GeneralStateTests/stSolidityTest/"} declare_test!{GeneralStateTest_stSpecialTest, "GeneralStateTests/stSpecialTest/"} @@ -177,7 +178,6 @@ mod state_tests { declare_test!{GeneralStateTest_stZeroCallsRevert, "GeneralStateTests/stZeroCallsRevert/"} declare_test!{GeneralStateTest_stZeroCallsTest, "GeneralStateTests/stZeroCallsTest/"} declare_test!{GeneralStateTest_stZeroKnowledge, "GeneralStateTests/stZeroKnowledge/"} - declare_test!{GeneralStateTest_stSStoreTest, "GeneralStateTests/stSStoreTest/"} // Attempts to send a transaction that requires more than current balance: // Tx: diff --git a/ethcore/src/json_tests/test_common.rs b/ethcore/src/json_tests/test_common.rs index ce16395d228..7e3842ecb75 100644 --- a/ethcore/src/json_tests/test_common.rs +++ b/ethcore/src/json_tests/test_common.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::HashSet; use std::io::Read; diff --git a/ethcore/src/json_tests/transaction.rs b/ethcore/src/json_tests/transaction.rs index 70021c9e985..febc61404da 100644 --- a/ethcore/src/json_tests/transaction.rs +++ b/ethcore/src/json_tests/transaction.rs @@ -1,26 +1,27 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::path::Path; use super::test_common::*; use client::EvmTestClient; -use header::Header; use ethjson; use rlp::Rlp; -use transaction::UnverifiedTransaction; +use types::header::Header; +use types::transaction::UnverifiedTransaction; +use transaction_ext::Transaction; /// Run transaction jsontests on a given folder. pub fn run_test_path(p: &Path, skip: &[&'static str], h: &mut H) { @@ -67,7 +68,7 @@ fn do_json_test(json_data: &[u8], start_stop_hook: &mu let minimal = t.gas_required(&spec.engine.schedule(header.number())).into(); if t.gas < minimal { - return Err(::transaction::Error::InsufficientGas { + return Err(::types::transaction::Error::InsufficientGas { minimal, got: t.gas, }.into()); } @@ -109,4 +110,3 @@ declare_test!{TransactionTests_ttSignature, "TransactionTests/ttSignature"} declare_test!{TransactionTests_ttValue, "TransactionTests/ttValue"} declare_test!{TransactionTests_ttVValue, "TransactionTests/ttVValue"} declare_test!{TransactionTests_ttWrongRLP, "TransactionTests/ttWrongRLP"} - diff --git a/ethcore/src/json_tests/trie.rs b/ethcore/src/json_tests/trie.rs index 2d1f8d1fec3..d56490ec7e8 100644 --- a/ethcore/src/json_tests/trie.rs +++ b/ethcore/src/json_tests/trie.rs @@ -1,26 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethjson; use trie::{TrieFactory, TrieSpec}; use ethtrie::RlpCodec; use ethereum_types::H256; -use memorydb::MemoryDB; -use keccak_hasher::KeccakHasher; -use kvdb::DBValue; use super::HookType; @@ -37,7 +34,7 @@ fn test_trie(json: &[u8], trie: TrieSpec, start_stop_h for (name, test) in tests.into_iter() { start_stop_hook(&name, HookType::OnStart); - let mut memdb = MemoryDB::::new(); + let mut memdb = journaldb::new_memory_db(); let mut root = H256::default(); let mut t = factory.create(&mut memdb, &mut root); diff --git a/ethcore/src/lib.rs b/ethcore/src/lib.rs index 344f1fcc64a..5ba6a26d013 100644 --- a/ethcore/src/lib.rs +++ b/ethcore/src/lib.rs @@ -1,20 +1,20 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -#![warn(missing_docs)] +#![warn(missing_docs, unused_extern_crates)] //! Ethcore library //! @@ -57,68 +57,69 @@ // error_chain foreign_links. #![recursion_limit="128"] -extern crate blooms_db; +extern crate ansi_term; extern crate bn; extern crate byteorder; -extern crate crossbeam; extern crate common_types as types; +extern crate crossbeam; +extern crate ethabi; extern crate ethash; +extern crate ethcore_blockchain as blockchain; extern crate ethcore_bloom_journal as bloom_journal; -extern crate parity_crypto; +extern crate ethcore_call_contract as call_contract; +extern crate ethcore_db as db; extern crate ethcore_io as io; -extern crate parity_bytes as bytes; -extern crate ethcore_logger; extern crate ethcore_miner; -#[cfg(feature = "stratum")] -extern crate ethcore_stratum; -extern crate ethcore_transaction as transaction; extern crate ethereum_types; extern crate ethjson; extern crate ethkey; - -extern crate hashdb; +extern crate hash_db; +extern crate heapsize; extern crate itertools; +extern crate journaldb; +extern crate keccak_hash as hash; +extern crate keccak_hasher; extern crate kvdb; extern crate kvdb_memorydb; -extern crate kvdb_rocksdb; +extern crate len_caching_lock; extern crate lru_cache; -extern crate num_cpus; +extern crate memory_cache; +extern crate memory_db; extern crate num; +extern crate num_cpus; +extern crate parity_bytes as bytes; +extern crate parity_crypto; extern crate parity_machine; +extern crate parity_snappy as snappy; extern crate parking_lot; +extern crate trie_db as trie; +extern crate patricia_trie_ethereum as ethtrie; extern crate rand; extern crate rayon; extern crate rlp; -extern crate rlp_compress; -extern crate keccak_hash as hash; -extern crate keccak_hasher; -extern crate heapsize; -extern crate memorydb; -extern crate patricia_trie as trie; -extern crate patricia_trie_ethereum as ethtrie; -extern crate triehash_ethereum as triehash; -extern crate ansi_term; -extern crate unexpected; -extern crate parity_snappy as snappy; -extern crate ethabi; extern crate rustc_hex; +extern crate serde; extern crate stats; -extern crate stop_guard; +extern crate triehash_ethereum as triehash; +extern crate unexpected; extern crate using_queue; extern crate vm; extern crate wasm; -extern crate memory_cache; -extern crate journaldb; -extern crate serde; -#[cfg(any(test, feature = "json-tests", feature = "test-helpers"))] -extern crate tempdir; -extern crate len_caching_lock; - -#[cfg(any(target_os = "linux", target_os = "macos", target_os = "windows", target_os = "android"))] -extern crate hardware_wallet; -#[cfg(not(any(target_os = "linux", target_os = "macos", target_os = "windows", target_os = "android")))] -extern crate fake_hardware_wallet as hardware_wallet; +#[cfg(test)] +extern crate ethcore_accounts as accounts; +#[cfg(feature = "stratum")] +extern crate ethcore_stratum; +#[cfg(any(test, feature = "tempdir"))] +extern crate tempdir; +#[cfg(any(test, feature = "kvdb-rocksdb"))] +extern crate kvdb_rocksdb; +#[cfg(any(test, feature = "blooms-db"))] +extern crate blooms_db; +#[cfg(any(test, feature = "env_logger"))] +extern crate env_logger; +#[cfg(test)] +extern crate rlp_compress; #[macro_use] extern crate ethabi_derive; @@ -142,26 +143,20 @@ extern crate serde_derive; #[cfg_attr(test, macro_use)] extern crate evm; -#[cfg(test)] -extern crate env_logger; - -pub extern crate ethstore; +#[cfg(all(test, feature = "price-info"))] +extern crate fetch; -#[macro_use] -pub mod views; +#[cfg(all(test, feature = "price-info"))] +extern crate parity_runtime; -pub mod account_provider; pub mod block; pub mod builtin; pub mod client; -pub mod db; -pub mod encoded; pub mod engines; pub mod error; pub mod ethereum; pub mod executed; pub mod executive; -pub mod header; pub mod machine; pub mod miner; pub mod pod_state; @@ -171,12 +166,11 @@ pub mod spec; pub mod state; pub mod state_db; pub mod trace; +pub mod transaction_ext; pub mod verification; -mod cache_manager; mod account_db; mod externalities; -mod blockchain; mod factory; mod tx_filter; @@ -187,8 +181,6 @@ pub mod json_tests; #[cfg(any(test, feature = "test-helpers"))] pub mod test_helpers; -pub use types::*; pub use executive::contract_address; pub use evm::CreateContractAddress; -pub use blockchain::{BlockChainDB, BlockChainDBHandler}; pub use trie::TrieSpec; diff --git a/ethcore/src/machine.rs b/ethcore/src/machine.rs index 47cea85059b..a14cb3bd296 100644 --- a/ethcore/src/machine.rs +++ b/ethcore/src/machine.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Ethereum-like state machine definition. @@ -20,23 +20,25 @@ use std::collections::{BTreeMap, HashMap}; use std::cmp; use std::sync::Arc; +use ethereum_types::{U256, H256, Address}; +use rlp::Rlp; +use types::transaction::{self, SYSTEM_ADDRESS, UNSIGNED_SENDER, UnverifiedTransaction, SignedTransaction}; +use types::BlockNumber; +use types::header::{Header, ExtendedHeader}; +use vm::{CallType, ActionParams, ActionValue, ParamsType}; +use vm::{EnvInfo, Schedule, CreateContractAddress}; + use block::{ExecutedBlock, IsBlock}; use builtin::Builtin; -use client::{BlockInfo, CallContract}; +use call_contract::CallContract; +use client::BlockInfo; use error::Error; use executive::Executive; -use header::{BlockNumber, Header, ExtendedHeader}; use spec::CommonParams; use state::{CleanupMode, Substate}; use trace::{NoopTracer, NoopVMTracer, Tracer, ExecutiveTracer, RewardType, Tracing}; -use transaction::{self, SYSTEM_ADDRESS, UNSIGNED_SENDER, UnverifiedTransaction, SignedTransaction}; use tx_filter::TransactionFilter; -use ethereum_types::{U256, H256, Address}; -use rlp::Rlp; -use vm::{CallType, ActionParams, ActionValue, ParamsType}; -use vm::{EnvInfo, Schedule, CreateContractAddress}; - /// Parity tries to round block.gas_limit to multiple of this constant pub const PARITY_GAS_LIMIT_DETERMINANT: U256 = U256([37, 0, 0, 0]); @@ -408,7 +410,7 @@ pub struct AuxiliaryData<'a> { /// The full block bytes, including the header. pub bytes: Option<&'a [u8]>, /// The block receipts. - pub receipts: Option<&'a [::receipt::Receipt]>, + pub receipts: Option<&'a [::types::receipt::Receipt]>, } /// Type alias for a function we can make calls through synchronously. @@ -436,14 +438,7 @@ impl ::parity_machine::Machine for EthereumMachine { type AncestryAction = ::types::ancestry_action::AncestryAction; type Error = Error; -} -impl<'a> ::parity_machine::LocalizedMachine<'a> for EthereumMachine { - type StateContext = Call<'a>; - type AuxiliaryData = AuxiliaryData<'a>; -} - -impl ::parity_machine::WithBalances for EthereumMachine { fn balance(&self, live: &ExecutedBlock, address: &Address) -> Result { live.state().balance(address).map_err(Into::into) } @@ -453,6 +448,11 @@ impl ::parity_machine::WithBalances for EthereumMachine { } } +impl<'a> ::parity_machine::LocalizedMachine<'a> for EthereumMachine { + type StateContext = Call<'a>; + type AuxiliaryData = AuxiliaryData<'a>; +} + /// A state machine that uses block rewards. pub trait WithRewards: ::parity_machine::Machine { /// Note block rewards, traces each reward storing information about benefactor, amount and type @@ -526,7 +526,7 @@ mod tests { Default::default(), ethparams, ); - let mut header = ::header::Header::new(); + let mut header = ::types::header::Header::new(); header.set_number(15); let res = machine.verify_transaction_basic(&transaction, &header); @@ -546,8 +546,8 @@ mod tests { ethparams, ); - let mut parent = ::header::Header::new(); - let mut header = ::header::Header::new(); + let mut parent = ::types::header::Header::new(); + let mut header = ::types::header::Header::new(); header.set_number(1); // this test will work for this constant only diff --git a/ethcore/src/miner/miner.rs b/ethcore/src/miner/miner.rs index c73887800c8..7d6bcbe496d 100644 --- a/ethcore/src/miner/miner.rs +++ b/ethcore/src/miner/miner.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::cmp; use std::time::{Instant, Duration}; @@ -21,39 +21,42 @@ use std::sync::Arc; use ansi_term::Colour; use bytes::Bytes; -use engines::{EthEngine, Seal}; -use error::{Error, ErrorKind, ExecutionError}; +use call_contract::CallContract; use ethcore_miner::gas_pricer::GasPricer; +use ethcore_miner::local_accounts::LocalAccounts; use ethcore_miner::pool::{self, TransactionQueue, VerifiedTransaction, QueueStatus, PrioritizationStrategy}; #[cfg(feature = "work-notify")] use ethcore_miner::work_notify::NotifyWork; use ethereum_types::{H256, U256, Address}; use io::IoChannel; +use miner::pool_client::{PoolClient, CachedNonceClient, NonceCache}; +use miner; use parking_lot::{Mutex, RwLock}; use rayon::prelude::*; -use transaction::{ +use types::transaction::{ self, Action, UnverifiedTransaction, SignedTransaction, PendingTransaction, }; +use types::BlockNumber; +use types::block::Block; +use types::header::Header; +use types::receipt::RichReceipt; use using_queue::{UsingQueue, GetAction}; -use account_provider::{AccountProvider, SignError as AccountError}; -use block::{ClosedBlock, IsBlock, Block, SealedBlock}; +use block::{ClosedBlock, IsBlock, SealedBlock}; use client::{ - BlockChain, ChainInfo, CallContract, BlockProducer, SealedBlockImporter, Nonce, TransactionInfo, TransactionId + BlockChain, ChainInfo, BlockProducer, SealedBlockImporter, Nonce, TransactionInfo, TransactionId }; use client::{BlockId, ClientIoMessage}; +use engines::{EthEngine, Seal, EngineSigner}; +use error::{Error, ErrorKind}; +use executed::ExecutionError; use executive::contract_address; -use header::{Header, BlockNumber}; -use miner; -use miner::pool_client::{PoolClient, CachedNonceClient, NonceCache}; -use receipt::RichReceipt; use spec::Spec; use state::State; -use ethkey::Password; /// Different possible definitions for pending transaction set. #[derive(Debug, PartialEq)] @@ -193,6 +196,25 @@ pub struct AuthoringParams { pub extra_data: Bytes, } +/// Block sealing mechanism +pub enum Author { + /// Sealing block is external and we only need a reward beneficiary (i.e. PoW) + External(Address), + /// Sealing is done internally, we need a way to create signatures to seal block (i.e. PoA) + Sealer(Box), +} + +impl Author { + /// Get author's address. + pub fn address(&self) -> Address { + match *self { + Author::External(address) => address, + Author::Sealer(ref sealer) => sealer.address(), + } + } +} + + struct SealingWork { queue: UsingQueue, enabled: bool, @@ -223,7 +245,7 @@ pub struct Miner { // TODO [ToDr] Arc is only required because of price updater transaction_queue: Arc, engine: Arc, - accounts: Option>, + accounts: Arc, io_channel: RwLock>>, } @@ -241,11 +263,11 @@ impl Miner { } /// Creates new instance of miner Arc. - pub fn new( + pub fn new( options: MinerOptions, gas_pricer: GasPricer, spec: &Spec, - accounts: Option>, + accounts: A, ) -> Self { let limits = options.pool_limits.clone(); let verifier_options = options.pool_verification_options.clone(); @@ -268,7 +290,7 @@ impl Miner { nonce_cache: NonceCache::new(nonce_cache_size), options, transaction_queue: Arc::new(TransactionQueue::new(limits, verifier_options, tx_queue_strategy)), - accounts, + accounts: Arc::new(accounts), engine: spec.engine.clone(), io_channel: RwLock::new(None), } @@ -277,7 +299,7 @@ impl Miner { /// Creates new instance of miner with given spec and accounts. /// /// NOTE This should be only used for tests. - pub fn new_for_tests(spec: &Spec, accounts: Option>) -> Miner { + pub fn new_for_tests(spec: &Spec, accounts: Option>) -> Miner { let minimal_gas_price = 0.into(); Miner::new(MinerOptions { pool_verification_options: pool::verifier::Options { @@ -288,7 +310,7 @@ impl Miner { }, reseal_min_period: Duration::from_secs(0), ..Default::default() - }, GasPricer::new_fixed(minimal_gas_price), spec, accounts) + }, GasPricer::new_fixed(minimal_gas_price), spec, accounts.unwrap_or_default()) } /// Sets `IoChannel` @@ -355,7 +377,7 @@ impl Miner { chain, &self.nonce_cache, &*self.engine, - self.accounts.as_ref().map(|x| &**x), + &*self.accounts, self.options.refuse_service_transactions, ) } @@ -823,14 +845,11 @@ impl miner::MinerService for Miner { self.params.write().extra_data = extra_data; } - fn set_author(&self, address: Address, password: Option) -> Result<(), AccountError> { - self.params.write().author = address; + fn set_author(&self, author: Author) { + self.params.write().author = author.address(); - if self.engine.seals_internally().is_some() && password.is_some() { - if let Some(ref ap) = self.accounts { - let password = password.unwrap_or_else(|| Password::from(String::new())); - // Sign test message - ap.sign(address.clone(), Some(password.clone()), Default::default())?; + if let Author::Sealer(signer) = author { + if self.engine.seals_internally().is_some() { // Enable sealing self.sealing.lock().enabled = true; // -------------------------------------------------------------------------- @@ -838,14 +857,10 @@ impl miner::MinerService for Miner { // | (some `Engine`s call `EngineClient.update_sealing()`) | // | Make sure to release the locks before calling that method. | // -------------------------------------------------------------------------- - self.engine.set_signer(ap.clone(), address, password); - Ok(()) + self.engine.set_signer(signer); } else { - warn!(target: "miner", "No account provider"); - Err(AccountError::NotFound) + warn!("Setting an EngineSigner while Engine does not require one."); } - } else { - Ok(()) } } @@ -858,6 +873,32 @@ impl miner::MinerService for Miner { self.params.read().gas_range_target.0 / 5 } + fn set_minimal_gas_price(&self, new_price: U256) -> Result { + match *self.gas_pricer.lock() { + // Binding the gas pricer to `gp` here to prevent + // a deadlock when calling recalibrate() + ref mut gp @ GasPricer::Fixed(_) => { + trace!(target: "miner", "minimal_gas_price: recalibrating fixed..."); + *gp = GasPricer::new_fixed(new_price); + + let txq = self.transaction_queue.clone(); + let mut options = self.options.pool_verification_options.clone(); + gp.recalibrate(move |gas_price| { + debug!(target: "miner", "minimal_gas_price: Got gas price! {}", gas_price); + options.minimal_gas_price = gas_price; + txq.set_verifier_options(options); + }); + + Ok(true) + }, + #[cfg(feature = "price-info")] + GasPricer::Calibrated(_) => { + let error_msg = "Can't update fixed gas price while automatic gas calibration is enabled."; + return Err(error_msg); + }, + } + } + fn import_external_transactions( &self, chain: &C, @@ -913,11 +954,12 @@ impl miner::MinerService for Miner { pending: PendingTransaction, trusted: bool ) -> Result<(), transaction::Error> { - // treat the tx as local if the option is enabled, or if we have the account + // treat the tx as local if the option is enabled, if we have the account, or if + // the account is specified as a Prioritized Local Addresses let sender = pending.sender(); let treat_as_local = trusted || !self.options.tx_queue_no_unfamiliar_locals - || self.accounts.as_ref().map(|accts| accts.has_account(sender)).unwrap_or(false); + || self.accounts.is_local(&sender); if treat_as_local { self.import_own_transaction(chain, pending) @@ -1192,7 +1234,6 @@ impl miner::MinerService for Miner { let gas_limit = *chain.best_block_header().gas_limit(); self.update_transaction_queue_limits(gas_limit); - // Then import all transactions from retracted blocks. let client = self.pool_client(chain); { @@ -1247,7 +1288,7 @@ impl miner::MinerService for Miner { chain, &nonce_cache, &*engine, - accounts.as_ref().map(|x| &**x), + &*accounts, refuse_service_transactions, ); queue.cull(client); @@ -1281,16 +1322,19 @@ impl miner::MinerService for Miner { #[cfg(test)] mod tests { + use std::iter::FromIterator; + use super::*; + use accounts::AccountProvider; use ethkey::{Generator, Random}; use hash::keccak; - use header::BlockNumber; use rustc_hex::FromHex; + use types::BlockNumber; use client::{TestBlockChainClient, EachBlockWith, ChainInfo, ImportSealedBlock}; use miner::{MinerService, PendingOrdering}; - use test_helpers::{generate_dummy_client, generate_dummy_client_with_spec_and_accounts}; - use transaction::{Transaction}; + use test_helpers::{generate_dummy_client, generate_dummy_client_with_spec}; + use types::transaction::{Transaction}; #[test] fn should_prepare_block_to_seal() { @@ -1352,7 +1396,7 @@ mod tests { }, GasPricer::new_fixed(0u64.into()), &Spec::new_test(), - None, // accounts provider + ::std::collections::HashSet::new(), // local accounts ) } @@ -1465,8 +1509,8 @@ mod tests { // given let keypair = Random.generate().unwrap(); let client = TestBlockChainClient::default(); - let account_provider = AccountProvider::transient_provider(); - account_provider.insert_account(keypair.secret().clone(), &"".into()).expect("can add accounts to the provider we just created"); + let mut local_accounts = ::std::collections::HashSet::new(); + local_accounts.insert(keypair.address()); let miner = Miner::new( MinerOptions { @@ -1475,7 +1519,7 @@ mod tests { }, GasPricer::new_fixed(0u64.into()), &Spec::new_test(), - Some(Arc::new(account_provider)), + local_accounts, ); let transaction = transaction(); let best_block = 0; @@ -1507,6 +1551,32 @@ mod tests { assert_eq!(miner.prepare_pending_block(&client), BlockPreparationStatus::NotPrepared); } + #[test] + fn should_prioritize_locals() { + let client = TestBlockChainClient::default(); + let transaction = transaction(); + let miner = Miner::new( + MinerOptions { + tx_queue_no_unfamiliar_locals: true, // should work even with this enabled + ..miner().options + }, + GasPricer::new_fixed(0u64.into()), + &Spec::new_test(), + HashSet::from_iter(vec![transaction.sender()].into_iter()), + ); + let best_block = 0; + + // Miner with sender as a known local address should prioritize transactions from that address + let res2 = miner.import_claimed_local_transaction(&client, PendingTransaction::new(transaction, None), false); + + // check to make sure the prioritized transaction is pending + assert_eq!(res2.unwrap(), ()); + assert_eq!(miner.pending_transactions(best_block).unwrap().len(), 1); + assert_eq!(miner.pending_receipts(best_block).unwrap().len(), 1); + assert_eq!(miner.ready_transactions(&client, 10, PendingOrdering::Priority).len(), 1); + assert_eq!(miner.prepare_pending_block(&client), BlockPreparationStatus::NotPrepared); + } + #[test] fn should_not_seal_unless_enabled() { let miner = miner(); @@ -1544,12 +1614,19 @@ mod tests { } #[test] - fn should_fail_setting_engine_signer_without_account_provider() { - let spec = Spec::new_instant; + fn should_not_fail_setting_engine_signer_without_account_provider() { + let spec = Spec::new_test_round; let tap = Arc::new(AccountProvider::transient_provider()); let addr = tap.insert_account(keccak("1").into(), &"".into()).unwrap(); - let client = generate_dummy_client_with_spec_and_accounts(spec, None); - assert!(match client.miner().set_author(addr, Some("".into())) { Err(AccountError::NotFound) => true, _ => false }); + let client = generate_dummy_client_with_spec(spec); + let engine_signer = Box::new((tap.clone(), addr, "".into())); + let msg = Default::default(); + assert!(client.engine().sign(msg).is_err()); + + // should set engine signer and miner author + client.miner().set_author(Author::Sealer(engine_signer)); + assert_eq!(client.miner().authoring_params().author, addr); + assert!(client.engine().sign(msg).is_ok()); } #[test] @@ -1603,4 +1680,60 @@ mod tests { assert!(miner.is_currently_sealing()); } + + #[test] + fn should_set_new_minimum_gas_price() { + // Creates a new GasPricer::Fixed behind the scenes + let miner = Miner::new_for_tests(&Spec::new_test(), None); + + let expected_minimum_gas_price: U256 = 0x1337.into(); + miner.set_minimal_gas_price(expected_minimum_gas_price).unwrap(); + + let txq_options = miner.transaction_queue.status().options; + let current_minimum_gas_price = txq_options.minimal_gas_price; + + assert!(current_minimum_gas_price == expected_minimum_gas_price); + } + + #[cfg(feature = "price-info")] + fn dynamic_gas_pricer() -> GasPricer { + use std::time::Duration; + use parity_runtime::Executor; + use fetch::Client as FetchClient; + use ethcore_miner::gas_price_calibrator::{GasPriceCalibrator, GasPriceCalibratorOptions}; + + // Don't really care about any of these settings since + // the gas pricer is never actually going to be used + let fetch = FetchClient::new(1).unwrap(); + let p = Executor::new_sync(); + + GasPricer::new_calibrated( + GasPriceCalibrator::new( + GasPriceCalibratorOptions { + usd_per_tx: 0.0, + recalibration_period: Duration::from_secs(0), + }, + fetch, + p, + ) + ) + } + + #[test] + #[cfg(feature = "price-info")] + fn should_fail_to_set_new_minimum_gas_price() { + // We get a fixed gas pricer by default, need to change that + let miner = Miner::new_for_tests(&Spec::new_test(), None); + let calibrated_gas_pricer = dynamic_gas_pricer(); + *miner.gas_pricer.lock() = calibrated_gas_pricer; + + let expected_minimum_gas_price: U256 = 0x1337.into(); + let result = miner.set_minimal_gas_price(expected_minimum_gas_price); + assert!(result.is_err()); + + let received_error_msg = result.unwrap_err(); + let expected_error_msg = "Can't update fixed gas price while automatic gas calibration is enabled."; + + assert!(received_error_msg == expected_error_msg); + } } diff --git a/ethcore/src/miner/mod.rs b/ethcore/src/miner/mod.rs index cca6e8c30f4..fd7ab96513c 100644 --- a/ethcore/src/miner/mod.rs +++ b/ethcore/src/miner/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . #![warn(missing_docs)] @@ -20,34 +20,36 @@ //! Keeps track of transactions and currently sealed pending block. mod miner; -mod service_transaction_checker; pub mod pool_client; #[cfg(feature = "stratum")] pub mod stratum; -pub use self::miner::{Miner, MinerOptions, Penalization, PendingSet, AuthoringParams}; +pub use self::miner::{Miner, MinerOptions, Penalization, PendingSet, AuthoringParams, Author}; +pub use ethcore_miner::local_accounts::LocalAccounts; pub use ethcore_miner::pool::PendingOrdering; use std::sync::Arc; use std::collections::{BTreeSet, BTreeMap}; use bytes::Bytes; -use ethereum_types::{H256, U256, Address}; use ethcore_miner::pool::{VerifiedTransaction, QueueStatus, local_transactions}; - -use block::{Block, SealedBlock}; +use ethereum_types::{H256, U256, Address}; +use types::transaction::{self, UnverifiedTransaction, SignedTransaction, PendingTransaction}; +use types::BlockNumber; +use types::block::Block; +use types::header::Header; +use types::receipt::RichReceipt; + +use block::SealedBlock; +use call_contract::{CallContract, RegistryInfo}; use client::{ - CallContract, RegistryInfo, ScheduleInfo, + ScheduleInfo, BlockChain, BlockProducer, SealedBlockImporter, ChainInfo, AccountData, Nonce, }; use error::Error; -use header::{BlockNumber, Header}; -use receipt::RichReceipt; -use transaction::{self, UnverifiedTransaction, SignedTransaction, PendingTransaction}; use state::StateInfo; -use ethkey::Password; /// Provides methods to verify incoming external transactions pub trait TransactionVerifierClient: Send + Sync @@ -128,8 +130,8 @@ pub trait MinerService : Send + Sync { /// Set info necessary to sign consensus messages and block authoring. /// - /// On PoW password is optional. - fn set_author(&self, address: Address, password: Option) -> Result<(), ::account_provider::SignError>; + /// On chains where sealing is done externally (e.g. PoW) we provide only reward beneficiary. + fn set_author(&self, author: Author); // Transaction Pool @@ -203,4 +205,8 @@ pub trait MinerService : Send + Sync { /// Suggested gas limit. fn sensible_gas_limit(&self) -> U256; + + /// Set a new minimum gas limit. + /// Will not work if dynamic gas calibration is set. + fn set_minimal_gas_price(&self, gas_price: U256) -> Result; } diff --git a/ethcore/src/miner/pool_client.rs b/ethcore/src/miner/pool_client.rs index 25d9a809cdb..df364d44646 100644 --- a/ethcore/src/miner/pool_client.rs +++ b/ethcore/src/miner/pool_client.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain access for transaction pool. @@ -23,21 +23,23 @@ use std::{ }; use ethereum_types::{H256, U256, Address}; +use ethcore_miner::local_accounts::LocalAccounts; use ethcore_miner::pool; use ethcore_miner::pool::client::NonceClient; -use transaction::{ +use ethcore_miner::service_transaction_checker::ServiceTransactionChecker; +use types::transaction::{ self, UnverifiedTransaction, SignedTransaction, }; +use types::header::Header; use parking_lot::RwLock; -use account_provider::AccountProvider; -use client::{TransactionId, BlockInfo, CallContract, Nonce}; +use call_contract::CallContract; +use client::{TransactionId, BlockInfo, Nonce}; use engines::EthEngine; -use header::Header; use miner; -use miner::service_transaction_checker::ServiceTransactionChecker; +use transaction_ext::Transaction; /// Cache for state nonces. #[derive(Debug, Clone)] @@ -71,7 +73,7 @@ pub struct PoolClient<'a, C: 'a> { chain: &'a C, cached_nonces: CachedNonceClient<'a, C>, engine: &'a EthEngine, - accounts: Option<&'a AccountProvider>, + accounts: &'a LocalAccounts, best_block_header: Header, service_transaction_checker: Option, } @@ -90,14 +92,14 @@ impl<'a, C: 'a> Clone for PoolClient<'a, C> { } impl<'a, C: 'a> PoolClient<'a, C> where -C: BlockInfo + CallContract, + C: BlockInfo + CallContract, { /// Creates new client given chain, nonce cache, accounts and service transaction verifier. pub fn new( chain: &'a C, cache: &'a NonceCache, engine: &'a EthEngine, - accounts: Option<&'a AccountProvider>, + accounts: &'a LocalAccounts, refuse_service_transactions: bool, ) -> Self { let best_block_header = chain.best_block_header(); @@ -149,7 +151,7 @@ impl<'a, C: 'a> pool::client::Client for PoolClient<'a, C> where pool::client::AccountDetails { nonce: self.cached_nonces.account_nonce(address), balance: self.chain.latest_balance(address), - is_local: self.accounts.map_or(false, |accounts| accounts.has_account(*address)), + is_local: self.accounts.is_local(address), } } diff --git a/ethcore/src/miner/stratum.rs b/ethcore/src/miner/stratum.rs index 65dc7d21358..71862225ab5 100644 --- a/ethcore/src/miner/stratum.rs +++ b/ethcore/src/miner/stratum.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Client-side stratum job dispatcher and mining notifier handler diff --git a/ethcore/src/pod_account.rs b/ethcore/src/pod_account.rs index c4d05cca5cd..39dce6e36da 100644 --- a/ethcore/src/pod_account.rs +++ b/ethcore/src/pod_account.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Account system expressed in Plain Old Data. @@ -21,7 +21,7 @@ use std::collections::BTreeMap; use itertools::Itertools; use hash::{keccak}; use ethereum_types::{H256, U256}; -use hashdb::HashDB; +use hash_db::HashDB; use kvdb::DBValue; use keccak_hasher::KeccakHasher; use triehash::sec_trie_root; diff --git a/ethcore/src/pod_state.rs b/ethcore/src/pod_state.rs index 76d6495c55d..c1130faa726 100644 --- a/ethcore/src/pod_state.rs +++ b/ethcore/src/pod_state.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! State of all accounts in the system expressed in Plain Old Data. diff --git a/ethcore/src/snapshot/account.rs b/ethcore/src/snapshot/account.rs index 2ccf910f773..ed56e2435b8 100644 --- a/ethcore/src/snapshot/account.rs +++ b/ethcore/src/snapshot/account.rs @@ -1,28 +1,28 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Account state encoding and decoding use account_db::{AccountDB, AccountDBMut}; -use basic_account::BasicAccount; +use types::basic_account::BasicAccount; use bytes::Bytes; use ethereum_types::{H256, U256}; use ethtrie::{TrieDB, TrieDBMut}; use hash::{KECCAK_EMPTY, KECCAK_NULL_RLP}; -use hashdb::HashDB; +use hash_db::HashDB; use rlp::{RlpStream, Rlp}; use snapshot::Error; use std::collections::HashSet; @@ -66,7 +66,8 @@ impl CodeState { // account address hash, account properties and the storage. Each item contains at most `max_storage_items` // storage records split according to snapshot format definition. pub fn to_fat_rlps(account_hash: &H256, acc: &BasicAccount, acct_db: &AccountDB, used_code: &mut HashSet, first_chunk_size: usize, max_chunk_size: usize) -> Result, Error> { - let db = TrieDB::new(acct_db, &acc.storage_root)?; + let db = &(acct_db as &HashDB<_,_>); + let db = TrieDB::new(db, &acc.storage_root)?; let mut chunks = Vec::new(); let mut db_iter = db.iter()?; let mut target_chunk_size = first_chunk_size; @@ -77,7 +78,7 @@ pub fn to_fat_rlps(account_hash: &H256, acc: &BasicAccount, acct_db: &AccountDB, account_stream.begin_list(5); account_stream.append(&acc.nonce) - .append(&acc.balance); + .append(&acc.balance); // [has_code, code_hash]. if acc.code_hash == KECCAK_EMPTY { @@ -187,7 +188,7 @@ pub fn from_fat_rlp( }; let pairs = rlp.at(4)?; for pair_rlp in pairs.iter() { - let k: Bytes = pair_rlp.val_at(0)?; + let k: Bytes = pair_rlp.val_at(0)?; let v: Bytes = pair_rlp.val_at(1)?; storage_trie.insert(&k, &v)?; @@ -207,13 +208,13 @@ pub fn from_fat_rlp( #[cfg(test)] mod tests { use account_db::{AccountDB, AccountDBMut}; - use basic_account::BasicAccount; + use types::basic_account::BasicAccount; use test_helpers::get_temp_state_db; use snapshot::tests::helpers::fill_storage; use hash::{KECCAK_EMPTY, KECCAK_NULL_RLP, keccak}; use ethereum_types::{H256, Address}; - use hashdb::HashDB; + use hash_db::HashDB; use kvdb::DBValue; use rlp::Rlp; @@ -236,9 +237,9 @@ mod tests { let thin_rlp = ::rlp::encode(&account); assert_eq!(::rlp::decode::(&thin_rlp).unwrap(), account); - let fat_rlps = to_fat_rlps(&keccak(&addr), &account, &AccountDB::new(db.as_hashdb(), &addr), &mut Default::default(), usize::max_value(), usize::max_value()).unwrap(); + let fat_rlps = to_fat_rlps(&keccak(&addr), &account, &AccountDB::new(db.as_hash_db(), &addr), &mut Default::default(), usize::max_value(), usize::max_value()).unwrap(); let fat_rlp = Rlp::new(&fat_rlps[0]).at(1).unwrap(); - assert_eq!(from_fat_rlp(&mut AccountDBMut::new(db.as_hashdb_mut(), &addr), fat_rlp, H256::zero()).unwrap().0, account); + assert_eq!(from_fat_rlp(&mut AccountDBMut::new(db.as_hash_db_mut(), &addr), fat_rlp, H256::zero()).unwrap().0, account); } #[test] @@ -247,7 +248,7 @@ mod tests { let addr = Address::random(); let account = { - let acct_db = AccountDBMut::new(db.as_hashdb_mut(), &addr); + let acct_db = AccountDBMut::new(db.as_hash_db_mut(), &addr); let mut root = KECCAK_NULL_RLP; fill_storage(acct_db, &mut root, &mut H256::zero()); BasicAccount { @@ -261,9 +262,9 @@ mod tests { let thin_rlp = ::rlp::encode(&account); assert_eq!(::rlp::decode::(&thin_rlp).unwrap(), account); - let fat_rlp = to_fat_rlps(&keccak(&addr), &account, &AccountDB::new(db.as_hashdb(), &addr), &mut Default::default(), usize::max_value(), usize::max_value()).unwrap(); + let fat_rlp = to_fat_rlps(&keccak(&addr), &account, &AccountDB::new(db.as_hash_db(), &addr), &mut Default::default(), usize::max_value(), usize::max_value()).unwrap(); let fat_rlp = Rlp::new(&fat_rlp[0]).at(1).unwrap(); - assert_eq!(from_fat_rlp(&mut AccountDBMut::new(db.as_hashdb_mut(), &addr), fat_rlp, H256::zero()).unwrap().0, account); + assert_eq!(from_fat_rlp(&mut AccountDBMut::new(db.as_hash_db_mut(), &addr), fat_rlp, H256::zero()).unwrap().0, account); } #[test] @@ -272,7 +273,7 @@ mod tests { let addr = Address::random(); let account = { - let acct_db = AccountDBMut::new(db.as_hashdb_mut(), &addr); + let acct_db = AccountDBMut::new(db.as_hash_db_mut(), &addr); let mut root = KECCAK_NULL_RLP; fill_storage(acct_db, &mut root, &mut H256::zero()); BasicAccount { @@ -286,12 +287,12 @@ mod tests { let thin_rlp = ::rlp::encode(&account); assert_eq!(::rlp::decode::(&thin_rlp).unwrap(), account); - let fat_rlps = to_fat_rlps(&keccak(addr), &account, &AccountDB::new(db.as_hashdb(), &addr), &mut Default::default(), 500, 1000).unwrap(); + let fat_rlps = to_fat_rlps(&keccak(addr), &account, &AccountDB::new(db.as_hash_db(), &addr), &mut Default::default(), 500, 1000).unwrap(); let mut root = KECCAK_NULL_RLP; let mut restored_account = None; for rlp in fat_rlps { let fat_rlp = Rlp::new(&rlp).at(1).unwrap(); - restored_account = Some(from_fat_rlp(&mut AccountDBMut::new(db.as_hashdb_mut(), &addr), fat_rlp, root).unwrap().0); + restored_account = Some(from_fat_rlp(&mut AccountDBMut::new(db.as_hash_db_mut(), &addr), fat_rlp, root).unwrap().0); root = restored_account.as_ref().unwrap().storage_root.clone(); } assert_eq!(restored_account, Some(account)); @@ -305,12 +306,12 @@ mod tests { let addr2 = Address::random(); let code_hash = { - let mut acct_db = AccountDBMut::new(db.as_hashdb_mut(), &addr1); + let mut acct_db = AccountDBMut::new(db.as_hash_db_mut(), &addr1); acct_db.insert(b"this is definitely code") }; { - let mut acct_db = AccountDBMut::new(db.as_hashdb_mut(), &addr2); + let mut acct_db = AccountDBMut::new(db.as_hash_db_mut(), &addr2); acct_db.emplace(code_hash.clone(), DBValue::from_slice(b"this is definitely code")); } @@ -330,18 +331,18 @@ mod tests { let mut used_code = HashSet::new(); - let fat_rlp1 = to_fat_rlps(&keccak(&addr1), &account1, &AccountDB::new(db.as_hashdb(), &addr1), &mut used_code, usize::max_value(), usize::max_value()).unwrap(); - let fat_rlp2 = to_fat_rlps(&keccak(&addr2), &account2, &AccountDB::new(db.as_hashdb(), &addr2), &mut used_code, usize::max_value(), usize::max_value()).unwrap(); + let fat_rlp1 = to_fat_rlps(&keccak(&addr1), &account1, &AccountDB::new(db.as_hash_db(), &addr1), &mut used_code, usize::max_value(), usize::max_value()).unwrap(); + let fat_rlp2 = to_fat_rlps(&keccak(&addr2), &account2, &AccountDB::new(db.as_hash_db(), &addr2), &mut used_code, usize::max_value(), usize::max_value()).unwrap(); assert_eq!(used_code.len(), 1); let fat_rlp1 = Rlp::new(&fat_rlp1[0]).at(1).unwrap(); let fat_rlp2 = Rlp::new(&fat_rlp2[0]).at(1).unwrap(); - let (acc, maybe_code) = from_fat_rlp(&mut AccountDBMut::new(db.as_hashdb_mut(), &addr2), fat_rlp2, H256::zero()).unwrap(); + let (acc, maybe_code) = from_fat_rlp(&mut AccountDBMut::new(db.as_hash_db_mut(), &addr2), fat_rlp2, H256::zero()).unwrap(); assert!(maybe_code.is_none()); assert_eq!(acc, account2); - let (acc, maybe_code) = from_fat_rlp(&mut AccountDBMut::new(db.as_hashdb_mut(), &addr1), fat_rlp1, H256::zero()).unwrap(); + let (acc, maybe_code) = from_fat_rlp(&mut AccountDBMut::new(db.as_hash_db_mut(), &addr1), fat_rlp1, H256::zero()).unwrap(); assert_eq!(maybe_code, Some(b"this is definitely code".to_vec())); assert_eq!(acc, account1); } @@ -349,6 +350,6 @@ mod tests { #[test] fn encoding_empty_acc() { let mut db = get_temp_state_db(); - assert_eq!(from_fat_rlp(&mut AccountDBMut::new(db.as_hashdb_mut(), &Address::default()), Rlp::new(&::rlp::NULL_RLP), H256::zero()).unwrap(), (ACC_EMPTY, None)); + assert_eq!(from_fat_rlp(&mut AccountDBMut::new(db.as_hash_db_mut(), &Address::default()), Rlp::new(&::rlp::NULL_RLP), H256::zero()).unwrap(), (ACC_EMPTY, None)); } } diff --git a/ethcore/src/snapshot/block.rs b/ethcore/src/snapshot/block.rs index 3a18015e0c5..0fc590763c6 100644 --- a/ethcore/src/snapshot/block.rs +++ b/ethcore/src/snapshot/block.rs @@ -1,29 +1,29 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Block RLP compression. -use block::Block; -use header::Header; +use bytes::Bytes; +use ethereum_types::H256; use hash::keccak; -use views::BlockView; use rlp::{DecoderError, RlpStream, Rlp}; -use ethereum_types::H256; -use bytes::Bytes; use triehash::ordered_trie_root; +use types::block::Block; +use types::header::Header; +use types::views::BlockView; const HEADER_FIELDS: usize = 8; const BLOCK_FIELDS: usize = 2; @@ -132,13 +132,14 @@ impl AbridgedBlock { #[cfg(test)] mod tests { - use views::BlockView; - use block::Block; use super::AbridgedBlock; - use transaction::{Action, Transaction}; - use ethereum_types::{H256, U256, Address}; use bytes::Bytes; + use ethereum_types::{H256, U256, Address}; + use types::transaction::{Action, Transaction}; + use types::block::Block; + use types::view; + use types::views::BlockView; fn encode_block(b: &Block) -> Bytes { b.rlp_bytes() diff --git a/ethcore/src/snapshot/consensus/authority.rs b/ethcore/src/snapshot/consensus/authority.rs index 1e21d6fccee..909e00281c2 100644 --- a/ethcore/src/snapshot/consensus/authority.rs +++ b/ethcore/src/snapshot/consensus/authority.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Secondary chunk creation and restoration, implementation for proof-of-authority //! based engines. @@ -24,21 +24,20 @@ use super::{SnapshotComponents, Rebuilder, ChunkSink}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; -use blockchain::{BlockChain, BlockChainDB, BlockProvider}; use engines::{EthEngine, EpochVerifier, EpochTransition}; use machine::EthereumMachine; -use ids::BlockId; -use header::Header; -use receipt::Receipt; use snapshot::{Error, ManifestData, Progress}; -use itertools::{Position, Itertools}; -use rlp::{RlpStream, Rlp}; +use blockchain::{BlockChain, BlockChainDB, BlockProvider}; +use bytes::Bytes; use ethereum_types::{H256, U256}; +use itertools::{Position, Itertools}; use kvdb::KeyValueDB; -use bytes::Bytes; -use encoded; - +use rlp::{RlpStream, Rlp}; +use types::encoded; +use types::header::Header; +use types::ids::BlockId; +use types::receipt::Receipt; /// Snapshot creation and restoration for PoA chains. /// Chunk format: @@ -319,7 +318,7 @@ impl Rebuilder for ChunkRebuilder { } if is_last_chunk { - use block::Block; + use types::block::Block; let last_rlp = rlp.at(num_items - 1)?; let block = Block { diff --git a/ethcore/src/snapshot/consensus/mod.rs b/ethcore/src/snapshot/consensus/mod.rs index ec14b2188d3..907e9c520bb 100644 --- a/ethcore/src/snapshot/consensus/mod.rs +++ b/ethcore/src/snapshot/consensus/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Secondary chunk creation and restoration, implementations for different consensus //! engines. diff --git a/ethcore/src/snapshot/consensus/work.rs b/ethcore/src/snapshot/consensus/work.rs index b287ae9bb5f..0293d1a2fd4 100644 --- a/ethcore/src/snapshot/consensus/work.rs +++ b/ethcore/src/snapshot/consensus/work.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Secondary chunk creation and restoration, implementation for proof-of-work //! chains. @@ -35,7 +35,7 @@ use kvdb::KeyValueDB; use bytes::Bytes; use rlp::{RlpStream, Rlp}; use rand::OsRng; -use encoded; +use types::encoded; /// Snapshot creation and restoration for PoW chains. /// This includes blocks from the head of the chain as a @@ -250,7 +250,7 @@ impl Rebuilder for PowRebuilder { let pair = rlp.at(idx)?; let abridged_rlp = pair.at(0)?.as_raw().to_owned(); let abridged_block = AbridgedBlock::from_raw(abridged_rlp); - let receipts: Vec<::receipt::Receipt> = pair.list_at(1)?; + let receipts: Vec<::types::receipt::Receipt> = pair.list_at(1)?; let receipts_root = ordered_trie_root(pair.at(1)?.iter().map(|r| r.as_raw())); let block = abridged_block.to_block(parent_hash, cur_number, receipts_root)?; diff --git a/ethcore/src/snapshot/error.rs b/ethcore/src/snapshot/error.rs index eb1a16278b0..b71f79f8054 100644 --- a/ethcore/src/snapshot/error.rs +++ b/ethcore/src/snapshot/error.rs @@ -1,24 +1,24 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Snapshot-related errors. use std::fmt; -use ids::BlockId; +use types::ids::BlockId; use ethereum_types::H256; use ethtrie::TrieError; diff --git a/ethcore/src/snapshot/io.rs b/ethcore/src/snapshot/io.rs index 7d2cbcf92cf..c5f178cd329 100644 --- a/ethcore/src/snapshot/io.rs +++ b/ethcore/src/snapshot/io.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Snapshot i/o. //! Ways of writing and reading snapshots. This module supports writing and reading diff --git a/ethcore/src/snapshot/mod.rs b/ethcore/src/snapshot/mod.rs index d52bf55cdb9..c05d0de6a3a 100644 --- a/ethcore/src/snapshot/mod.rs +++ b/ethcore/src/snapshot/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Snapshot creation, restoration, and network service. //! @@ -28,11 +28,11 @@ use hash::{keccak, KECCAK_NULL_RLP, KECCAK_EMPTY}; use account_db::{AccountDB, AccountDBMut}; use blockchain::{BlockChain, BlockProvider}; use engines::EthEngine; -use header::Header; -use ids::BlockId; +use types::header::Header; +use types::ids::BlockId; use ethereum_types::{H256, U256}; -use hashdb::HashDB; +use hash_db::HashDB; use keccak_hasher::KeccakHasher; use snappy; use bytes::Bytes; @@ -322,7 +322,7 @@ impl<'a> StateChunker<'a> { /// Returns a list of hashes of chunks created, or any error it may /// have encountered. pub fn chunk_state<'a>(db: &HashDB, root: &H256, writer: &Mutex, progress: &'a Progress, part: Option) -> Result, Error> { - let account_trie = TrieDB::new(db, &root)?; + let account_trie = TrieDB::new(&db, &root)?; let mut chunker = StateChunker { hashes: Vec::new(), @@ -414,7 +414,7 @@ impl StateRebuilder { pairs.resize(rlp.item_count()?, (H256::new(), Vec::new())); let status = rebuild_accounts( - self.db.as_hashdb_mut(), + self.db.as_hash_db_mut(), rlp, &mut pairs, &self.known_code, @@ -429,7 +429,7 @@ impl StateRebuilder { // patch up all missing code. must be done after collecting all new missing code entries. for (code_hash, code, first_with) in status.new_code { for addr_hash in self.missing_code.remove(&code_hash).unwrap_or_else(Vec::new) { - let mut db = AccountDBMut::from_hash(self.db.as_hashdb_mut(), addr_hash); + let mut db = AccountDBMut::from_hash(self.db.as_hash_db_mut(), addr_hash); db.emplace(code_hash, DBValue::from_slice(&code)); } @@ -441,9 +441,9 @@ impl StateRebuilder { // batch trie writes { let mut account_trie = if self.state_root != KECCAK_NULL_RLP { - TrieDBMut::from_existing(self.db.as_hashdb_mut(), &mut self.state_root)? + TrieDBMut::from_existing(self.db.as_hash_db_mut(), &mut self.state_root)? } else { - TrieDBMut::new(self.db.as_hashdb_mut(), &mut self.state_root) + TrieDBMut::new(self.db.as_hash_db_mut(), &mut self.state_root) }; for (hash, thin_rlp) in pairs { diff --git a/ethcore/src/snapshot/service.rs b/ethcore/src/snapshot/service.rs index f547faab1e0..4b3f196cb12 100644 --- a/ethcore/src/snapshot/service.rs +++ b/ethcore/src/snapshot/service.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Snapshot network service implementation. @@ -33,7 +33,7 @@ use engines::EthEngine; use error::{Error, ErrorKind as SnapshotErrorKind}; use snapshot::{Error as SnapshotError}; use hash::keccak; -use ids::BlockId; +use types::ids::BlockId; use io::IoChannel; @@ -340,7 +340,7 @@ impl Service { // replace one the client's database with our own. fn replace_client_db(&self) -> Result<(), Error> { let migrated_blocks = self.migrate_blocks()?; - trace!(target: "snapshot", "Migrated {} ancient blocks", migrated_blocks); + info!(target: "snapshot", "Migrated {} ancient blocks", migrated_blocks); let rest_db = self.restoration_db(); self.client.restore_db(&*rest_db.to_string_lossy())?; @@ -424,7 +424,7 @@ impl Service { } if block_number % 10_000 == 0 { - trace!(target: "snapshot", "Block restoration at #{}", block_number); + info!(target: "snapshot", "Block restoration at #{}", block_number); } } diff --git a/ethcore/src/snapshot/tests/helpers.rs b/ethcore/src/snapshot/tests/helpers.rs index 1bcbdb9f483..817e0249986 100644 --- a/ethcore/src/snapshot/tests/helpers.rs +++ b/ethcore/src/snapshot/tests/helpers.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Snapshot test helpers. These are used to build blockchains and state tries //! which can be queried before and after a full snapshot/restore cycle. @@ -23,7 +23,7 @@ use std::sync::Arc; use hash::{KECCAK_NULL_RLP}; use account_db::AccountDBMut; -use basic_account::BasicAccount; +use types::basic_account::BasicAccount; use blockchain::{BlockChain, BlockChainDB}; use client::{Client, ChainInfo}; use engines::EthEngine; @@ -35,7 +35,7 @@ use rand::Rng; use kvdb::DBValue; use ethereum_types::H256; -use hashdb::HashDB; +use hash_db::HashDB; use keccak_hasher::KeccakHasher; use journaldb; use trie::{TrieMut, Trie}; @@ -65,7 +65,7 @@ impl StateProducer { pub fn tick(&mut self, rng: &mut R, db: &mut HashDB) { // modify existing accounts. let mut accounts_to_modify: Vec<_> = { - let trie = TrieDB::new(&*db, &self.state_root).unwrap(); + let trie = TrieDB::new(&db, &self.state_root).unwrap(); let temp = trie.iter().unwrap() // binding required due to complicated lifetime stuff .filter(|_| rng.gen::() < ACCOUNT_CHURN) .map(Result::unwrap) @@ -130,19 +130,10 @@ pub fn fill_storage(mut db: AccountDBMut, root: &mut H256, seed: &mut H256) { } } -/// Compare two state dbs. -pub fn compare_dbs(one: &HashDB, two: &HashDB) { - let keys = one.keys(); - - for key in keys.keys() { - assert_eq!(one.get(&key).unwrap(), two.get(&key).unwrap()); - } -} - /// Take a snapshot from the given client into a temporary file. /// Return a snapshot reader for it. pub fn snap(client: &Client) -> (Box, TempDir) { - use ids::BlockId; + use types::ids::BlockId; let tempdir = TempDir::new("").unwrap(); let path = tempdir.path().join("file"); diff --git a/ethcore/src/snapshot/tests/mod.rs b/ethcore/src/snapshot/tests/mod.rs index c09f2b965c7..f25fd03b258 100644 --- a/ethcore/src/snapshot/tests/mod.rs +++ b/ethcore/src/snapshot/tests/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Snapshot tests. diff --git a/ethcore/src/snapshot/tests/proof_of_authority.rs b/ethcore/src/snapshot/tests/proof_of_authority.rs index d8c721518bb..f1610e6ccda 100644 --- a/ethcore/src/snapshot/tests/proof_of_authority.rs +++ b/ethcore/src/snapshot/tests/proof_of_authority.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! PoA block chunker and rebuilder tests. @@ -20,13 +20,13 @@ use std::cell::RefCell; use std::sync::Arc; use std::str::FromStr; -use account_provider::AccountProvider; +use accounts::AccountProvider; use client::{Client, BlockChainClient, ChainInfo}; use ethkey::Secret; use snapshot::tests::helpers as snapshot_helpers; use spec::Spec; -use test_helpers::generate_dummy_client_with_spec_and_accounts; -use transaction::{Transaction, Action, SignedTransaction}; +use test_helpers::generate_dummy_client_with_spec; +use types::transaction::{Transaction, Action, SignedTransaction}; use tempdir::TempDir; use ethereum_types::Address; @@ -88,8 +88,7 @@ enum Transition { // create a chain with the given transitions and some blocks beyond that transition. fn make_chain(accounts: Arc, blocks_beyond: usize, transitions: Vec) -> Arc { - let client = generate_dummy_client_with_spec_and_accounts( - spec_fixed_to_contract, Some(accounts.clone())); + let client = generate_dummy_client_with_spec(spec_fixed_to_contract); let mut cur_signers = vec![*RICH_ADDR]; { @@ -100,13 +99,14 @@ fn make_chain(accounts: Arc, blocks_beyond: usize, transitions: { // push a block with given number, signed by one of the signers, with given transactions. let push_block = |signers: &[Address], n, txs: Vec| { - use miner::MinerService; + use miner::{self, MinerService}; let idx = n as usize % signers.len(); trace!(target: "snapshot", "Pushing block #{}, {} txs, author={}", n, txs.len(), signers[idx]); - client.miner().set_author(signers[idx], Some(PASS.into())).unwrap(); + let signer = Box::new((accounts.clone(), signers[idx], PASS.into())); + client.miner().set_author(miner::Author::Sealer(signer)); client.miner().import_external_transactions(&*client, txs.into_iter().map(Into::into).collect()); diff --git a/ethcore/src/snapshot/tests/proof_of_work.rs b/ethcore/src/snapshot/tests/proof_of_work.rs index 2572699682f..d970da406cb 100644 --- a/ethcore/src/snapshot/tests/proof_of_work.rs +++ b/ethcore/src/snapshot/tests/proof_of_work.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! PoW block chunker and rebuilder tests. diff --git a/ethcore/src/snapshot/tests/service.rs b/ethcore/src/snapshot/tests/service.rs index fd070eab86c..37a10048abf 100644 --- a/ethcore/src/snapshot/tests/service.rs +++ b/ethcore/src/snapshot/tests/service.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Tests for the snapshot service. @@ -22,7 +22,7 @@ use std::sync::Arc; use tempdir::TempDir; use blockchain::BlockProvider; use client::{Client, ClientConfig, ImportBlock, BlockInfo}; -use ids::BlockId; +use types::ids::BlockId; use snapshot::io::{PackedReader, PackedWriter, SnapshotReader, SnapshotWriter}; use snapshot::service::{Service, ServiceParams}; use snapshot::{chunk_state, chunk_secondary, ManifestData, Progress, SnapshotService, RestorationStatus}; @@ -36,8 +36,7 @@ use verification::queue::kind::blocks::Unverified; #[test] fn restored_is_equivalent() { - use ::ethcore_logger::init_log; - init_log(); + let _ = ::env_logger::try_init(); const NUM_BLOCKS: u32 = 400; const TX_PER: usize = 5; @@ -100,7 +99,6 @@ fn restored_is_equivalent() { } } - // on windows the guards deletion (remove_dir_all) // is not happening (error directory is not empty). // So the test is disabled until windows api behave. @@ -153,7 +151,7 @@ fn guards_delete_folders() { #[test] fn keep_ancient_blocks() { - ::env_logger::init().ok(); + let _ = ::env_logger::try_init(); // Test variables const NUM_BLOCKS: u64 = 500; @@ -186,7 +184,7 @@ fn keep_ancient_blocks() { let start_header = bc.block_header_data(&best_hash).unwrap(); let state_root = start_header.state_root(); let state_hashes = chunk_state( - state_db.as_hashdb(), + state_db.as_hash_db(), &state_root, &writer, &Progress::default(), @@ -272,7 +270,7 @@ fn keep_ancient_blocks() { #[test] fn recover_aborted_recovery() { - ::env_logger::init().ok(); + let _ = ::env_logger::try_init(); const NUM_BLOCKS: u32 = 400; let gas_prices = vec![1.into(), 2.into(), 3.into(), 999.into()]; diff --git a/ethcore/src/snapshot/tests/state.rs b/ethcore/src/snapshot/tests/state.rs index 82cee2af088..fa7df6b6195 100644 --- a/ethcore/src/snapshot/tests/state.rs +++ b/ethcore/src/snapshot/tests/state.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! State snapshotting tests. @@ -20,11 +20,11 @@ use std::sync::Arc; use std::sync::atomic::AtomicBool; use hash::{KECCAK_NULL_RLP, keccak}; -use basic_account::BasicAccount; +use types::basic_account::BasicAccount; use snapshot::account; use snapshot::{chunk_state, Error as SnapshotError, Progress, StateRebuilder, SNAPSHOT_SUBPARTS}; use snapshot::io::{PackedReader, PackedWriter, SnapshotReader, SnapshotWriter}; -use super::helpers::{compare_dbs, StateProducer}; +use super::helpers::StateProducer; use error::{Error, ErrorKind}; @@ -32,15 +32,15 @@ use rand::{XorShiftRng, SeedableRng}; use ethereum_types::H256; use journaldb::{self, Algorithm}; use kvdb_rocksdb::{Database, DatabaseConfig}; -use memorydb::MemoryDB; use parking_lot::Mutex; use tempdir::TempDir; #[test] fn snap_and_restore() { + use hash_db::HashDB; let mut producer = StateProducer::new(); let mut rng = XorShiftRng::from_seed([1, 2, 3, 4]); - let mut old_db = MemoryDB::new(); + let mut old_db = journaldb::new_memory_db(); let db_cfg = DatabaseConfig::with_columns(::db::NUM_COLUMNS); for _ in 0..150 { @@ -91,8 +91,11 @@ fn snap_and_restore() { let new_db = journaldb::new(db, Algorithm::OverlayRecent, ::db::COL_STATE); assert_eq!(new_db.earliest_era(), Some(1000)); + let keys = old_db.keys(); - compare_dbs(&old_db, new_db.as_hashdb()); + for key in keys.keys() { + assert_eq!(old_db.get(&key).unwrap(), new_db.as_hash_db().get(&key).unwrap()); + } } #[test] @@ -100,7 +103,7 @@ fn get_code_from_prev_chunk() { use std::collections::HashSet; use rlp::RlpStream; use ethereum_types::{H256, U256}; - use hashdb::HashDB; + use hash_db::HashDB; use account_db::{AccountDBMut, AccountDB}; @@ -121,7 +124,7 @@ fn get_code_from_prev_chunk() { let acc: BasicAccount = ::rlp::decode(&thin_rlp).expect("error decoding basic account"); let mut make_chunk = |acc, hash| { - let mut db = MemoryDB::new(); + let mut db = journaldb::new_memory_db(); AccountDBMut::from_hash(&mut db, hash).insert(&code[..]); let fat_rlp = account::to_fat_rlps(&hash, &acc, &AccountDB::from_hash(&db, hash), &mut used_code, usize::max_value(), usize::max_value()).unwrap(); @@ -155,7 +158,7 @@ fn get_code_from_prev_chunk() { fn checks_flag() { let mut producer = StateProducer::new(); let mut rng = XorShiftRng::from_seed([5, 6, 7, 8]); - let mut old_db = MemoryDB::new(); + let mut old_db = journaldb::new_memory_db(); let db_cfg = DatabaseConfig::with_columns(::db::NUM_COLUMNS); for _ in 0..10 { diff --git a/ethcore/src/snapshot/traits.rs b/ethcore/src/snapshot/traits.rs index eec629ba6e6..bb4ab3b3964 100644 --- a/ethcore/src/snapshot/traits.rs +++ b/ethcore/src/snapshot/traits.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use super::{ManifestData, RestorationStatus}; use ethereum_types::H256; diff --git a/ethcore/src/snapshot/watcher.rs b/ethcore/src/snapshot/watcher.rs index 0eee7133b1c..5c4712cff9c 100644 --- a/ethcore/src/snapshot/watcher.rs +++ b/ethcore/src/snapshot/watcher.rs @@ -1,24 +1,24 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Watcher for snapshot-related chain events. use parking_lot::Mutex; use client::{BlockInfo, Client, ChainNotify, NewBlocks, ClientIoMessage}; -use ids::BlockId; +use types::ids::BlockId; use io::IoChannel; use ethereum_types::H256; diff --git a/ethcore/src/spec/genesis.rs b/ethcore/src/spec/genesis.rs index fbfd2cbc427..96a42178dd4 100644 --- a/ethcore/src/spec/genesis.rs +++ b/ethcore/src/spec/genesis.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethereum_types::{H256, U256, Address}; use ethjson; diff --git a/ethcore/src/spec/mod.rs b/ethcore/src/spec/mod.rs index 35705f4a8e5..5d90b5fbf89 100644 --- a/ethcore/src/spec/mod.rs +++ b/ethcore/src/spec/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain params. diff --git a/ethcore/src/spec/seal.rs b/ethcore/src/spec/seal.rs index 0ed41acc846..ed70ac8b545 100644 --- a/ethcore/src/spec/seal.rs +++ b/ethcore/src/spec/seal.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Spec seal. diff --git a/ethcore/src/spec/spec.rs b/ethcore/src/spec/spec.rs index 2b1804caa15..4bd46b2bb63 100644 --- a/ethcore/src/spec/spec.rs +++ b/ethcore/src/spec/spec.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parameters for a block chain. @@ -25,14 +25,15 @@ use bytes::Bytes; use ethereum_types::{H256, Bloom, U256, Address}; use ethjson; use hash::{KECCAK_NULL_RLP, keccak}; -use memorydb::MemoryDB; use parking_lot::RwLock; use rlp::{Rlp, RlpStream}; use rustc_hex::{FromHex, ToHex}; +use types::BlockNumber; +use types::encoded; +use types::header::Header; use vm::{EnvInfo, CallType, ActionValue, ActionParams, ParamsType}; use builtin::Builtin; -use encoded; use engines::{ EthEngine, NullEngine, InstantSeal, InstantSealParams, BasicAuthority, AuthorityRound, DEFAULT_BLOCKHASH_CONTRACT @@ -40,7 +41,6 @@ use engines::{ use error::Error; use executive::Executive; use factory::Factories; -use header::{BlockNumber, Header}; use machine::EthereumMachine; use pod_state::PodState; use spec::Genesis; @@ -120,6 +120,8 @@ pub struct CommonParams { pub eip1052_transition: BlockNumber, /// Number of first block where EIP-1283 rules begin. pub eip1283_transition: BlockNumber, + /// Number of first block where EIP-1283 rules end. + pub eip1283_disable_transition: BlockNumber, /// Number of first block where EIP-1014 rules begin. pub eip1014_transition: BlockNumber, /// Number of first block where dust cleanup rules (EIP-168 and EIP169) begin. @@ -188,7 +190,7 @@ impl CommonParams { schedule.have_return_data = block_number >= self.eip211_transition; schedule.have_bitwise_shifting = block_number >= self.eip145_transition; schedule.have_extcodehash = block_number >= self.eip1052_transition; - schedule.eip1283 = block_number >= self.eip1283_transition; + schedule.eip1283 = block_number >= self.eip1283_transition && !(block_number >= self.eip1283_disable_transition); if block_number >= self.eip210_transition { schedule.blockhash_gas = 800; } @@ -299,6 +301,10 @@ impl From for CommonParams { BlockNumber::max_value, Into::into, ), + eip1283_disable_transition: p.eip1283_disable_transition.map_or_else( + BlockNumber::max_value, + Into::into, + ), eip1014_transition: p.eip1014_transition.map_or_else( BlockNumber::max_value, Into::into, @@ -549,7 +555,7 @@ fn load_from(spec_params: SpecParams, s: ethjson::spec::Spec) -> Result { let _ = s.run_constructors( &Default::default(), - BasicBackend(MemoryDB::new()), + BasicBackend(journaldb::new_memory_db()), )?; } } @@ -617,7 +623,7 @@ impl Spec { // basic accounts in spec. { - let mut t = factories.trie.create(db.as_hashdb_mut(), &mut root); + let mut t = factories.trie.create(db.as_hash_db_mut(), &mut root); for (address, account) in self.genesis_state.get().iter() { t.insert(&**address, &account.rlp())?; @@ -628,7 +634,7 @@ impl Spec { db.note_non_null_account(address); account.insert_additional( &mut *factories.accountdb.create( - db.as_hashdb_mut(), + db.as_hash_db_mut(), keccak(address), ), &factories.trie, @@ -785,7 +791,7 @@ impl Spec { self.genesis_state = s; let _ = self.run_constructors( &Default::default(), - BasicBackend(MemoryDB::new()), + BasicBackend(journaldb::new_memory_db()), )?; Ok(()) @@ -806,7 +812,7 @@ impl Spec { /// Ensure that the given state DB has the trie nodes in for the genesis state. pub fn ensure_db_good(&self, db: T, factories: &Factories) -> Result { - if db.as_hashdb().contains(&self.state_root()) { + if db.as_hash_db().contains(&self.state_root()) { return Ok(db); } @@ -840,7 +846,7 @@ impl Spec { /// initialize genesis epoch data, using in-memory database for /// constructor. pub fn genesis_epoch_data(&self) -> Result, String> { - use transaction::{Action, Transaction}; + use types::transaction::{Action, Transaction}; use journaldb; use kvdb_memorydb; @@ -853,7 +859,7 @@ impl Spec { None, ); - self.ensure_db_good(BasicBackend(db.as_hashdb_mut()), &factories) + self.ensure_db_good(BasicBackend(db.as_hash_db_mut()), &factories) .map_err(|e| format!("Unable to initialize genesis state: {}", e))?; let call = |a, d| { @@ -879,7 +885,7 @@ impl Spec { }.fake_sign(from); let res = ::state::prove_transaction_virtual( - db.as_hashdb_mut(), + db.as_hash_db_mut(), *genesis.state_root(), &tx, self.engine.machine(), @@ -989,8 +995,9 @@ mod tests { use super::*; use state::State; use test_helpers::get_temp_state_db; - use views::BlockView; use tempdir::TempDir; + use types::view; + use types::views::BlockView; // https://github.com/paritytech/parity-ethereum/issues/1840 #[test] @@ -1016,7 +1023,7 @@ mod tests { #[test] fn genesis_constructor() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let spec = Spec::new_test_constructor(); let db = spec.ensure_db_good(get_temp_state_db(), &Default::default()) .unwrap(); diff --git a/ethcore/src/state/account.rs b/ethcore/src/state/account.rs index 91254787759..fea9444b1cc 100644 --- a/ethcore/src/state/account.rs +++ b/ethcore/src/state/account.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Single account in the system. @@ -22,7 +22,7 @@ use std::collections::{HashMap, BTreeMap}; use hash::{KECCAK_EMPTY, KECCAK_NULL_RLP, keccak}; use ethereum_types::{H256, U256, Address}; use error::Error; -use hashdb::HashDB; +use hash_db::HashDB; use keccak_hasher::KeccakHasher; use kvdb::DBValue; use bytes::{Bytes, ToPretty}; @@ -31,7 +31,7 @@ use ethtrie::{TrieFactory, TrieDB, SecTrieDB, Result as TrieResult}; use pod_account::*; use rlp::{RlpStream, encode}; use lru_cache::LruCache; -use basic_account::BasicAccount; +use types::basic_account::BasicAccount; use std::cell::{RefCell, Cell}; @@ -253,7 +253,7 @@ impl Account { } fn get_and_cache_storage(storage_root: &H256, storage_cache: &mut LruCache, db: &HashDB, key: &H256) -> TrieResult { - let db = SecTrieDB::new(db, storage_root)?; + let db = SecTrieDB::new(&db, storage_root)?; let panicky_decoder = |bytes:&[u8]| ::rlp::decode(&bytes).expect("decoding db value failed"); let item: U256 = db.get_with(key, panicky_decoder)?.unwrap_or_else(U256::zero); let value: H256 = item.into(); @@ -451,6 +451,11 @@ impl Account { } } + /// Whether the base storage root of this account is unchanged. + pub fn is_base_storage_root_unchanged(&self) -> bool { + self.original_storage_cache.is_none() + } + /// Storage root where the account changes are based upon. pub fn base_storage_root(&self) -> H256 { self.storage_root @@ -461,12 +466,12 @@ impl Account { /// Increment the nonce of the account by one. pub fn inc_nonce(&mut self) { - self.nonce = self.nonce + U256::from(1u8); + self.nonce = self.nonce.saturating_add(U256::from(1u8)); } /// Increase account balance. pub fn add_balance(&mut self, x: &U256) { - self.balance = self.balance + *x; + self.balance = self.balance.saturating_add(*x); } /// Decrease account balance. @@ -586,7 +591,7 @@ impl Account { pub fn prove_storage(&self, db: &HashDB, storage_key: H256) -> TrieResult<(Vec, H256)> { let mut recorder = Recorder::new(); - let trie = TrieDB::new(db, &self.storage_root)?; + let trie = TrieDB::new(&db, &self.storage_root)?; let item: U256 = { let panicky_decoder = |bytes:&[u8]| ::rlp::decode(bytes).expect("decoding db value failed"); let query = (&mut recorder, panicky_decoder); @@ -612,7 +617,7 @@ impl fmt::Debug for Account { mod tests { use rlp_compress::{compress, decompress, snapshot_swapper}; use ethereum_types::{H256, Address}; - use memorydb::MemoryDB; + use journaldb::new_memory_db; use bytes::Bytes; use super::*; use account_db::*; @@ -628,7 +633,7 @@ mod tests { #[test] fn storage_at() { - let mut db = MemoryDB::new(); + let mut db = new_memory_db(); let mut db = AccountDBMut::new(&mut db, &Address::new()); let rlp = { let mut a = Account::new_contract(69.into(), 0.into(), KECCAK_NULL_RLP); @@ -647,7 +652,7 @@ mod tests { #[test] fn note_code() { - let mut db = MemoryDB::new(); + let mut db = new_memory_db(); let mut db = AccountDBMut::new(&mut db, &Address::new()); let rlp = { @@ -667,7 +672,7 @@ mod tests { #[test] fn commit_storage() { let mut a = Account::new_contract(69.into(), 0.into(), KECCAK_NULL_RLP); - let mut db = MemoryDB::new(); + let mut db = new_memory_db(); let mut db = AccountDBMut::new(&mut db, &Address::new()); a.set_storage(0.into(), 0x1234.into()); assert_eq!(a.storage_root(), None); @@ -678,7 +683,7 @@ mod tests { #[test] fn commit_remove_commit_storage() { let mut a = Account::new_contract(69.into(), 0.into(), KECCAK_NULL_RLP); - let mut db = MemoryDB::new(); + let mut db = new_memory_db(); let mut db = AccountDBMut::new(&mut db, &Address::new()); a.set_storage(0.into(), 0x1234.into()); a.commit_storage(&Default::default(), &mut db).unwrap(); @@ -692,7 +697,7 @@ mod tests { #[test] fn commit_code() { let mut a = Account::new_contract(69.into(), 0.into(), KECCAK_NULL_RLP); - let mut db = MemoryDB::new(); + let mut db = new_memory_db(); let mut db = AccountDBMut::new(&mut db, &Address::new()); a.init_code(vec![0x55, 0x44, 0xffu8]); assert_eq!(a.code_filth, Filth::Dirty); @@ -704,7 +709,7 @@ mod tests { #[test] fn reset_code() { let mut a = Account::new_contract(69.into(), 0.into(), KECCAK_NULL_RLP); - let mut db = MemoryDB::new(); + let mut db = new_memory_db(); let mut db = AccountDBMut::new(&mut db, &Address::new()); a.init_code(vec![0x55, 0x44, 0xffu8]); assert_eq!(a.code_filth, Filth::Dirty); @@ -736,11 +741,4 @@ mod tests { assert_eq!(a.code_hash(), KECCAK_EMPTY); assert_eq!(a.storage_root().unwrap(), KECCAK_NULL_RLP); } - - #[test] - fn create_account() { - let a = Account::new(69u8.into(), 0u8.into(), HashMap::new(), Bytes::new()); - assert_eq!(a.rlp().to_hex(), "f8448045a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"); - } - } diff --git a/ethcore/src/state/backend.rs b/ethcore/src/state/backend.rs index df364af9235..11e73edb3ab 100644 --- a/ethcore/src/state/backend.rs +++ b/ethcore/src/state/backend.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! A minimal "state backend" trait: an abstraction over the sources of data //! a blockchain state may draw upon. @@ -27,18 +27,19 @@ use std::sync::Arc; use state::Account; use parking_lot::Mutex; use ethereum_types::{Address, H256}; -use memorydb::MemoryDB; -use hashdb::{AsHashDB, HashDB}; +use memory_db::MemoryDB; +use hash_db::{AsHashDB, HashDB}; use kvdb::DBValue; use keccak_hasher::KeccakHasher; +use journaldb::AsKeyedHashDB; /// State backend. See module docs for more details. pub trait Backend: Send { /// Treat the backend as a read-only hashdb. - fn as_hashdb(&self) -> &HashDB; + fn as_hash_db(&self) -> &HashDB; /// Treat the backend as a writeable hashdb. - fn as_hashdb_mut(&mut self) -> &mut HashDB; + fn as_hash_db_mut(&mut self) -> &mut HashDB; /// Add an account entry to the cache. fn add_to_account_cache(&mut self, addr: Address, data: Option, modified: bool); @@ -82,14 +83,17 @@ pub struct ProofCheck(MemoryDB); impl ProofCheck { /// Create a new `ProofCheck` backend from the given state items. pub fn new(proof: &[DBValue]) -> Self { - let mut db = MemoryDB::::new(); + let mut db = journaldb::new_memory_db(); for item in proof { db.insert(item); } ProofCheck(db) } } -impl HashDB for ProofCheck { +impl journaldb::KeyedHashDB for ProofCheck { fn keys(&self) -> HashMap { self.0.keys() } +} + +impl HashDB for ProofCheck { fn get(&self, key: &H256) -> Option { self.0.get(key) } @@ -110,13 +114,13 @@ impl HashDB for ProofCheck { } impl AsHashDB for ProofCheck { - fn as_hashdb(&self) -> &HashDB { self } - fn as_hashdb_mut(&mut self) -> &mut HashDB { self } + fn as_hash_db(&self) -> &HashDB { self } + fn as_hash_db_mut(&mut self) -> &mut HashDB { self } } impl Backend for ProofCheck { - fn as_hashdb(&self) -> &HashDB { self } - fn as_hashdb_mut(&mut self) -> &mut HashDB { self } + fn as_hash_db(&self) -> &HashDB { self } + fn as_hash_db_mut(&mut self) -> &mut HashDB { self } fn add_to_account_cache(&mut self, _addr: Address, _data: Option, _modified: bool) {} fn cache_code(&self, _hash: H256, _code: Arc>) {} fn get_cached_account(&self, _addr: &Address) -> Option> { None } @@ -135,26 +139,32 @@ impl Backend for ProofCheck { /// The proof-of-execution can be extracted with `extract_proof`. /// /// This doesn't cache anything or rely on the canonical state caches. -pub struct Proving> { +pub struct Proving { base: H, // state we're proving values from. changed: MemoryDB, // changed state via insertions. proof: Mutex>, } +impl AsKeyedHashDB for Proving { + fn as_keyed_hash_db(&self) -> &journaldb::KeyedHashDB { self } +} + impl + Send + Sync> AsHashDB for Proving { - fn as_hashdb(&self) -> &HashDB { self } - fn as_hashdb_mut(&mut self) -> &mut HashDB { self } + fn as_hash_db(&self) -> &HashDB { self } + fn as_hash_db_mut(&mut self) -> &mut HashDB { self } } -impl + Send + Sync> HashDB for Proving { +impl journaldb::KeyedHashDB for Proving { fn keys(&self) -> HashMap { - let mut keys = self.base.as_hashdb().keys(); + let mut keys = self.base.as_keyed_hash_db().keys(); keys.extend(self.changed.keys()); keys } +} +impl + Send + Sync> HashDB for Proving { fn get(&self, key: &H256) -> Option { - match self.base.as_hashdb().get(key) { + match self.base.as_hash_db().get(key) { Some(val) => { self.proof.lock().insert(val.clone()); Some(val) @@ -184,9 +194,9 @@ impl + Send + Sync> HashDB + Send + Sync> Backend for Proving { - fn as_hashdb(&self) -> &HashDB { self } + fn as_hash_db(&self) -> &HashDB { self } - fn as_hashdb_mut(&mut self) -> &mut HashDB { self } + fn as_hash_db_mut(&mut self) -> &mut HashDB { self } fn add_to_account_cache(&mut self, _: Address, _: Option, _: bool) { } @@ -211,7 +221,7 @@ impl> Proving { pub fn new(base: H) -> Self { Proving { base: base, - changed: MemoryDB::::new(), + changed: journaldb::new_memory_db(), proof: Mutex::new(HashSet::new()), } } @@ -238,12 +248,12 @@ impl + Clone> Clone for Proving { pub struct Basic(pub H); impl + Send + Sync> Backend for Basic { - fn as_hashdb(&self) -> &HashDB { - self.0.as_hashdb() + fn as_hash_db(&self) -> &HashDB { + self.0.as_hash_db() } - fn as_hashdb_mut(&mut self) -> &mut HashDB { - self.0.as_hashdb_mut() + fn as_hash_db_mut(&mut self) -> &mut HashDB { + self.0.as_hash_db_mut() } fn add_to_account_cache(&mut self, _: Address, _: Option, _: bool) { } diff --git a/ethcore/src/state/mod.rs b/ethcore/src/state/mod.rs index b2c52e58369..c670ed89e3e 100644 --- a/ethcore/src/state/mod.rs +++ b/ethcore/src/state/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! A mutable state representation suitable to execute transactions. //! Generic over a `Backend`. Deals with `Account`s. @@ -26,7 +26,7 @@ use std::fmt; use std::sync::Arc; use hash::{KECCAK_NULL_RLP, KECCAK_EMPTY}; -use receipt::{Receipt, TransactionOutcome}; +use types::receipt::{Receipt, TransactionOutcome}; use machine::EthereumMachine as Machine; use vm::EnvInfo; use error::Error; @@ -38,12 +38,12 @@ use pod_state::{self, PodState}; use types::basic_account::BasicAccount; use executed::{Executed, ExecutionError}; use types::state_diff::StateDiff; -use transaction::SignedTransaction; +use types::transaction::SignedTransaction; use state_db::StateDB; use factory::VmFactory; use ethereum_types::{H256, U256, Address}; -use hashdb::{HashDB, AsHashDB}; +use hash_db::{HashDB, AsHashDB}; use keccak_hasher::KeccakHasher; use kvdb::DBValue; use bytes::Bytes; @@ -366,7 +366,7 @@ impl State { let mut root = H256::new(); { // init trie and reset root to null - let _ = factories.trie.create(db.as_hashdb_mut(), &mut root); + let _ = factories.trie.create(db.as_hash_db_mut(), &mut root); } State { @@ -381,7 +381,7 @@ impl State { /// Creates new state with existing state root pub fn from_existing(db: B, root: H256, account_start_nonce: U256, factories: Factories) -> TrieResult> { - if !db.as_hashdb().contains(&root) { + if !db.as_hash_db().contains(&root) { return Err(Box::new(TrieError::InvalidStateRoot(root))); } @@ -500,7 +500,12 @@ impl State { /// it will have its code reset, ready for `init_code()`. pub fn new_contract(&mut self, contract: &Address, balance: U256, nonce_offset: U256) -> TrieResult<()> { let original_storage_root = self.original_storage_root(contract)?; - self.insert_cache(contract, AccountEntry::new_dirty(Some(Account::new_contract(balance, self.account_start_nonce + nonce_offset, original_storage_root)))); + let (nonce, overflow) = self.account_start_nonce.overflowing_add(nonce_offset); + if overflow { + return Err(Box::new(TrieError::DecoderError(H256::from(contract), + rlp::DecoderError::Custom("Nonce overflow".into())))); + } + self.insert_cache(contract, AccountEntry::new_dirty(Some(Account::new_contract(balance, nonce, original_storage_root)))); Ok(()) } @@ -539,6 +544,13 @@ impl State { |a| a.as_ref().map_or(self.account_start_nonce, |account| *account.nonce())) } + /// Whether the base storage root of an account remains unchanged. + pub fn is_base_storage_root_unchanged(&self, a: &Address) -> TrieResult { + Ok(self.ensure_cached(a, RequireCache::None, true, + |a| a.as_ref().map(|account| account.is_base_storage_root_unchanged()))? + .unwrap_or(true)) + } + /// Get the storage root of account `a`. pub fn storage_root(&self, a: &Address) -> TrieResult> { self.ensure_cached(a, RequireCache::None, true, @@ -653,8 +665,8 @@ impl State { let trie_res = self.db.get_cached(address, |acc| match acc { None => Ok(H256::new()), Some(a) => { - let account_db = self.factories.accountdb.readonly(self.db.as_hashdb(), a.address_hash(address)); - f_at(a, account_db.as_hashdb(), key) + let account_db = self.factories.accountdb.readonly(self.db.as_hash_db(), a.address_hash(address)); + f_at(a, account_db.as_hash_db(), key) } }); @@ -665,8 +677,8 @@ impl State { // otherwise cache the account localy and cache storage key there. if let Some(ref mut acc) = local_account { if let Some(ref account) = acc.account { - let account_db = self.factories.accountdb.readonly(self.db.as_hashdb(), account.address_hash(address)); - return f_at(account, account_db.as_hashdb(), key) + let account_db = self.factories.accountdb.readonly(self.db.as_hash_db(), account.address_hash(address)); + return f_at(account, account_db.as_hash_db(), key) } else { return Ok(H256::new()) } @@ -677,12 +689,13 @@ impl State { if self.db.is_known_null(address) { return Ok(H256::zero()) } // account is not found in the global cache, get from the DB and insert into local - let db = self.factories.trie.readonly(self.db.as_hashdb(), &self.root).expect(SEC_TRIE_DB_UNWRAP_STR); + let db = &self.db.as_hash_db(); + let db = self.factories.trie.readonly(db, &self.root).expect(SEC_TRIE_DB_UNWRAP_STR); let from_rlp = |b: &[u8]| Account::from_rlp(b).expect("decoding db value failed"); let maybe_acc = db.get_with(address, from_rlp)?; let r = maybe_acc.as_ref().map_or(Ok(H256::new()), |a| { - let account_db = self.factories.accountdb.readonly(self.db.as_hashdb(), a.address_hash(address)); - f_at(a, account_db.as_hashdb(), key) + let account_db = self.factories.accountdb.readonly(self.db.as_hash_db(), a.address_hash(address)); + f_at(a, account_db.as_hash_db(), key) }); self.insert_cache(address, AccountEntry::new_clean(maybe_acc)); r @@ -875,9 +888,9 @@ impl State { if let Some(ref mut account) = a.account { let addr_hash = account.address_hash(address); { - let mut account_db = self.factories.accountdb.create(self.db.as_hashdb_mut(), addr_hash); - account.commit_storage(&self.factories.trie, account_db.as_hashdb_mut())?; - account.commit_code(account_db.as_hashdb_mut()); + let mut account_db = self.factories.accountdb.create(self.db.as_hash_db_mut(), addr_hash); + account.commit_storage(&self.factories.trie, account_db.as_hash_db_mut())?; + account.commit_code(account_db.as_hash_db_mut()); } if !account.is_empty() { self.db.note_non_null_account(address); @@ -886,7 +899,7 @@ impl State { } { - let mut trie = self.factories.trie.from_existing(self.db.as_hashdb_mut(), &mut self.root)?; + let mut trie = self.factories.trie.from_existing(self.db.as_hash_db_mut(), &mut self.root)?; for (address, ref mut a) in accounts.iter_mut().filter(|&(_, ref a)| a.is_dirty()) { a.state = AccountState::Committed; match a.account { @@ -969,7 +982,8 @@ impl State { let mut result = BTreeMap::new(); - let trie = self.factories.trie.readonly(self.db.as_hashdb(), &self.root)?; + let db = &self.db.as_hash_db(); + let trie = self.factories.trie.readonly(db, &self.root)?; // put trie in cache for item in trie.iter()? { @@ -999,13 +1013,14 @@ impl State { fn account_to_pod_account(&self, account: &Account, address: &Address) -> Result { let mut pod_storage = BTreeMap::new(); let addr_hash = account.address_hash(address); - let accountdb = self.factories.accountdb.readonly(self.db.as_hashdb(), addr_hash); + let accountdb = self.factories.accountdb.readonly(self.db.as_hash_db(), addr_hash); let root = account.base_storage_root(); - let trie = self.factories.trie.readonly(accountdb.as_hashdb(), &root)?; + let accountdb = &accountdb.as_hash_db(); + let trie = self.factories.trie.readonly(accountdb, &root)?; for o_kv in trie.iter()? { if let Ok((key, val)) = o_kv { - pod_storage.insert(key[..].into(), U256::from(&val[..]).into()); + pod_storage.insert(key[..].into(), rlp::decode::(&val[..]).expect("Decoded from trie which was encoded from the same type; qed").into()); } } @@ -1016,7 +1031,6 @@ impl State { Ok(pod_account) } - /// Populate a PodAccount map from this state, with another state as the account and storage query. fn to_pod_diff(&mut self, query: &State) -> TrieResult { assert!(self.checkpoints.borrow().is_empty()); @@ -1123,8 +1137,8 @@ impl State { // check local cache first if let Some(ref mut maybe_acc) = self.cache.borrow_mut().get_mut(a) { if let Some(ref mut account) = maybe_acc.account { - let accountdb = self.factories.accountdb.readonly(self.db.as_hashdb(), account.address_hash(a)); - if Self::update_account_cache(require, account, &self.db, accountdb.as_hashdb()) { + let accountdb = self.factories.accountdb.readonly(self.db.as_hash_db(), account.address_hash(a)); + if Self::update_account_cache(require, account, &self.db, accountdb.as_hash_db()) { return Ok(f(Some(account))); } else { return Err(Box::new(TrieError::IncompleteDatabase(H256::from(a)))); @@ -1135,8 +1149,8 @@ impl State { // check global cache let result = self.db.get_cached(a, |mut acc| { if let Some(ref mut account) = acc { - let accountdb = self.factories.accountdb.readonly(self.db.as_hashdb(), account.address_hash(a)); - if !Self::update_account_cache(require, account, &self.db, accountdb.as_hashdb()) { + let accountdb = self.factories.accountdb.readonly(self.db.as_hash_db(), account.address_hash(a)); + if !Self::update_account_cache(require, account, &self.db, accountdb.as_hash_db()) { return Err(Box::new(TrieError::IncompleteDatabase(H256::from(a)))); } } @@ -1149,12 +1163,13 @@ impl State { if check_null && self.db.is_known_null(a) { return Ok(f(None)); } // not found in the global cache, get from the DB and insert into local - let db = self.factories.trie.readonly(self.db.as_hashdb(), &self.root)?; + let db = &self.db.as_hash_db(); + let db = self.factories.trie.readonly(db, &self.root)?; let from_rlp = |b: &[u8]| Account::from_rlp(b).expect("decoding db value failed"); let mut maybe_acc = db.get_with(a, from_rlp)?; if let Some(ref mut account) = maybe_acc.as_mut() { - let accountdb = self.factories.accountdb.readonly(self.db.as_hashdb(), account.address_hash(a)); - if !Self::update_account_cache(require, account, &self.db, accountdb.as_hashdb()) { + let accountdb = self.factories.accountdb.readonly(self.db.as_hash_db(), account.address_hash(a)); + if !Self::update_account_cache(require, account, &self.db, accountdb.as_hash_db()) { return Err(Box::new(TrieError::IncompleteDatabase(H256::from(a)))); } } @@ -1181,7 +1196,8 @@ impl State { Some(acc) => self.insert_cache(a, AccountEntry::new_clean_cached(acc)), None => { let maybe_acc = if !self.db.is_known_null(a) { - let db = self.factories.trie.readonly(self.db.as_hashdb(), &self.root)?; + let db = &self.db.as_hash_db(); + let db = self.factories.trie.readonly(db, &self.root)?; let from_rlp = |b:&[u8]| { Account::from_rlp(b).expect("decoding db value failed") }; AccountEntry::new_clean(db.get_with(a, from_rlp)?) } else { @@ -1209,9 +1225,9 @@ impl State { if require_code { let addr_hash = account.address_hash(a); - let accountdb = self.factories.accountdb.readonly(self.db.as_hashdb(), addr_hash); + let accountdb = self.factories.accountdb.readonly(self.db.as_hash_db(), addr_hash); - if !Self::update_account_cache(RequireCache::Code, &mut account, &self.db, accountdb.as_hashdb()) { + if !Self::update_account_cache(RequireCache::Code, &mut account, &self.db, accountdb.as_hash_db()) { return Err(Box::new(TrieError::IncompleteDatabase(H256::from(a)))) } } @@ -1234,7 +1250,8 @@ impl State { /// `account_key` == keccak(address) pub fn prove_account(&self, account_key: H256) -> TrieResult<(Vec, BasicAccount)> { let mut recorder = Recorder::new(); - let trie = TrieDB::new(self.db.as_hashdb(), &self.root)?; + let db = &self.db.as_hash_db(); + let trie = TrieDB::new(db, &self.root)?; let maybe_account: Option = { let panicky_decoder = |bytes: &[u8]| { ::rlp::decode(bytes).expect(&format!("prove_account, could not query trie for account key={}", &account_key)) @@ -1260,15 +1277,16 @@ impl State { pub fn prove_storage(&self, account_key: H256, storage_key: H256) -> TrieResult<(Vec, H256)> { // TODO: probably could look into cache somehow but it's keyed by // address, not keccak(address). - let trie = TrieDB::new(self.db.as_hashdb(), &self.root)?; + let db = &self.db.as_hash_db(); + let trie = TrieDB::new(db, &self.root)?; let from_rlp = |b: &[u8]| Account::from_rlp(b).expect("decoding db value failed"); let acc = match trie.get_with(&account_key, from_rlp)? { Some(acc) => acc, None => return Ok((Vec::new(), H256::new())), }; - let account_db = self.factories.accountdb.readonly(self.db.as_hashdb(), account_key); - acc.prove_storage(account_db.as_hashdb(), storage_key) + let account_db = self.factories.accountdb.readonly(self.db.as_hash_db(), account_key); + acc.prove_storage(account_db.as_hash_db(), storage_key) } } @@ -1278,6 +1296,13 @@ impl fmt::Debug for State { } } +impl State { + /// Get a reference to the underlying state DB. + pub fn db(&self) -> &StateDB { + &self.db + } +} + // TODO: cloning for `State` shouldn't be possible in general; Remove this and use // checkpoints where possible. impl Clone for State { @@ -1316,8 +1341,7 @@ mod tests { use machine::EthereumMachine; use vm::EnvInfo; use spec::*; - use transaction::*; - use ethcore_logger::init_log; + use types::transaction::*; use trace::{FlatTrace, TraceError, trace}; use evm::CallType; @@ -1333,7 +1357,7 @@ mod tests { #[test] fn should_apply_create_transaction() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -1373,7 +1397,7 @@ mod tests { #[test] fn should_work_when_cloned() { - init_log(); + let _ = env_logger::try_init(); let a = Address::zero(); @@ -1391,7 +1415,7 @@ mod tests { #[test] fn should_trace_failed_create_transaction() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -1427,7 +1451,7 @@ mod tests { #[test] fn should_trace_call_transaction() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -1469,7 +1493,7 @@ mod tests { #[test] fn should_trace_basic_call_transaction() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -1510,7 +1534,7 @@ mod tests { #[test] fn should_trace_call_transaction_to_builtin() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -1551,7 +1575,7 @@ mod tests { #[test] fn should_not_trace_subcall_transaction_to_builtin() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -1593,7 +1617,7 @@ mod tests { #[test] fn should_trace_callcode_properly() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -1651,7 +1675,7 @@ mod tests { #[test] fn should_trace_delegatecall_properly() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -1710,7 +1734,7 @@ mod tests { #[test] fn should_trace_failed_call_transaction() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -1749,7 +1773,7 @@ mod tests { #[test] fn should_trace_call_with_subcall_transaction() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -1808,7 +1832,7 @@ mod tests { #[test] fn should_trace_call_with_basic_subcall_transaction() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -1862,7 +1886,7 @@ mod tests { #[test] fn should_not_trace_call_with_invalid_basic_subcall_transaction() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -1904,7 +1928,7 @@ mod tests { #[test] fn should_trace_failed_subcall_transaction() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -1959,7 +1983,7 @@ mod tests { #[test] fn should_trace_call_with_subcall_with_subcall_transaction() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -2033,7 +2057,7 @@ mod tests { #[test] fn should_trace_failed_subcall_with_subcall_transaction() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -2105,7 +2129,7 @@ mod tests { #[test] fn should_trace_suicide() { - init_log(); + let _ = env_logger::try_init(); let mut state = get_temp_state(); @@ -2738,7 +2762,6 @@ mod tests { let dump = state.to_pod_full().unwrap(); assert_eq!(get_pod_state_val(&dump, &a, storage_address.clone()), H256::from(&U256::from(0u64))); - } } diff --git a/ethcore/src/state/substate.rs b/ethcore/src/state/substate.rs index 5565c8f91ee..86f6e37f8d5 100644 --- a/ethcore/src/state/substate.rs +++ b/ethcore/src/state/substate.rs @@ -1,23 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Execution environment substate. use std::collections::HashSet; use ethereum_types::Address; -use log_entry::LogEntry; +use types::log_entry::LogEntry; use evm::{Schedule, CleanDustMode}; use super::CleanupMode; @@ -69,7 +69,7 @@ impl Substate { #[cfg(test)] mod tests { use super::Substate; - use log_entry::LogEntry; + use types::log_entry::LogEntry; #[test] fn created() { diff --git a/ethcore/src/state_db.rs b/ethcore/src/state_db.rs index d103f1081aa..066a4f6162e 100644 --- a/ethcore/src/state_db.rs +++ b/ethcore/src/state_db.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! State database abstraction. For more info, see the doc for `StateDB` @@ -25,14 +25,15 @@ use byteorder::{LittleEndian, ByteOrder}; use db::COL_ACCOUNT_BLOOM; use ethereum_types::{H256, Address}; use hash::keccak; -use hashdb::HashDB; -use keccak_hasher::KeccakHasher; -use header::BlockNumber; +use hash_db::HashDB; use journaldb::JournalDB; +use keccak_hasher::KeccakHasher; use kvdb::{KeyValueDB, DBTransaction, DBValue}; use lru_cache::LruCache; use memory_cache::MemoryLruCache; use parking_lot::Mutex; +use types::BlockNumber; + use state::{self, Account}; /// Value used to initialize bloom bitmap size. @@ -312,13 +313,13 @@ impl StateDB { } /// Conversion method to interpret self as `HashDB` reference - pub fn as_hashdb(&self) -> &HashDB { - self.db.as_hashdb() + pub fn as_hash_db(&self) -> &HashDB { + self.db.as_hash_db() } /// Conversion method to interpret self as mutable `HashDB` reference - pub fn as_hashdb_mut(&mut self) -> &mut HashDB { - self.db.as_hashdb_mut() + pub fn as_hash_db_mut(&mut self) -> &mut HashDB { + self.db.as_hash_db_mut() } /// Clone the database. @@ -378,14 +379,7 @@ impl StateDB { /// Check if the account can be returned from cache by matching current block parent hash against canonical /// state and filtering out account modified in later blocks. - fn is_allowed(addr: &Address, parent_hash: &Option, modifications: &VecDeque) -> bool { - let mut parent = match *parent_hash { - None => { - trace!("Cache lookup skipped for {:?}: no parent hash", addr); - return false; - } - Some(ref parent) => parent, - }; + fn is_allowed(addr: &Address, parent_hash: &H256, modifications: &VecDeque) -> bool { if modifications.is_empty() { return true; } @@ -394,6 +388,7 @@ impl StateDB { // We search for our parent in that list first and then for // all its parent until we hit the canonical block, // checking against all the intermediate modifications. + let mut parent = parent_hash; for m in modifications { if &m.hash == parent { if m.is_canon { @@ -412,10 +407,10 @@ impl StateDB { } impl state::Backend for StateDB { - fn as_hashdb(&self) -> &HashDB { self.db.as_hashdb() } + fn as_hash_db(&self) -> &HashDB { self.db.as_hash_db() } - fn as_hashdb_mut(&mut self) -> &mut HashDB { - self.db.as_hashdb_mut() + fn as_hash_db_mut(&mut self) -> &mut HashDB { + self.db.as_hash_db_mut() } fn add_to_account_cache(&mut self, addr: Address, data: Option, modified: bool) { @@ -433,20 +428,25 @@ impl state::Backend for StateDB { } fn get_cached_account(&self, addr: &Address) -> Option> { - let mut cache = self.account_cache.lock(); - if !Self::is_allowed(addr, &self.parent_hash, &cache.modifications) { - return None; - } - cache.accounts.get_mut(addr).map(|a| a.as_ref().map(|a| a.clone_basic())) + self.parent_hash.as_ref().and_then(|parent_hash| { + let mut cache = self.account_cache.lock(); + if !Self::is_allowed(addr, parent_hash, &cache.modifications) { + return None; + } + cache.accounts.get_mut(addr).map(|a| a.as_ref().map(|a| a.clone_basic())) + }) } fn get_cached(&self, a: &Address, f: F) -> Option - where F: FnOnce(Option<&mut Account>) -> U { - let mut cache = self.account_cache.lock(); - if !Self::is_allowed(a, &self.parent_hash, &cache.modifications) { - return None; - } - cache.accounts.get_mut(a).map(|c| f(c.as_mut())) + where F: FnOnce(Option<&mut Account>) -> U + { + self.parent_hash.as_ref().and_then(|parent_hash| { + let mut cache = self.account_cache.lock(); + if !Self::is_allowed(a, parent_hash, &cache.modifications) { + return None; + } + cache.accounts.get_mut(a).map(|c| f(c.as_mut())) + }) } fn get_cached_code(&self, hash: &H256) -> Option>> { @@ -482,11 +482,10 @@ mod tests { use kvdb::DBTransaction; use test_helpers::get_temp_state_db; use state::{Account, Backend}; - use ethcore_logger::init_log; #[test] fn state_db_smoke() { - init_log(); + let _ = ::env_logger::try_init(); let state_db = get_temp_state_db(); let root_parent = H256::random(); diff --git a/ethcore/src/test_helpers.rs b/ethcore/src/test_helpers.rs index 9f00f9662ce..ae4968080bc 100644 --- a/ethcore/src/test_helpers.rs +++ b/ethcore/src/test_helpers.rs @@ -1,50 +1,52 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Set of different helpers for client tests use std::path::Path; use std::sync::Arc; use std::{fs, io}; -use account_provider::AccountProvider; -use ethereum_types::{H256, U256, Address}; -use block::{OpenBlock, Drain}; + use blockchain::{BlockChain, BlockChainDB, BlockChainDBHandler, Config as BlockChainConfig, ExtrasInsert}; +use blooms_db; use bytes::Bytes; -use client::{Client, ClientConfig, ChainInfo, ImportBlock, ChainNotify, ChainMessageType, PrepareOpenBlock}; +use ethereum_types::{H256, U256, Address}; use ethkey::KeyPair; use evm::Factory as EvmFactory; -use factory::Factories; use hash::keccak; -use header::Header; -use io::*; -use miner::Miner; +use io::IoChannel; +use kvdb::KeyValueDB; +use kvdb_rocksdb::{self, Database, DatabaseConfig}; use parking_lot::RwLock; use rlp::{self, RlpStream}; +use tempdir::TempDir; +use types::transaction::{Action, Transaction, SignedTransaction}; +use types::encoded; +use types::header::Header; +use types::view; +use types::views::BlockView; + +use block::{OpenBlock, Drain}; +use client::{Client, ClientConfig, ChainInfo, ImportBlock, ChainNotify, ChainMessageType, PrepareOpenBlock}; +use factory::Factories; +use miner::Miner; use spec::Spec; -use state_db::StateDB; use state::*; -use transaction::{Action, Transaction, SignedTransaction}; -use views::BlockView; -use blooms_db; -use kvdb::KeyValueDB; -use kvdb_rocksdb::{self, Database, DatabaseConfig}; -use tempdir::TempDir; +use state_db::StateDB; use verification::queue::kind::blocks::Unverified; -use encoded; /// Creates test block with corresponding header pub fn create_test_block(header: &Header) -> Bytes { @@ -106,18 +108,15 @@ pub fn generate_dummy_client_with_data(block_number: u32, txs_per_block: usize, generate_dummy_client_with_spec_and_data(Spec::new_null, block_number, txs_per_block, tx_gas_prices) } -/// Generates dummy client (not test client) with corresponding amount of blocks, txs per block and spec -pub fn generate_dummy_client_with_spec_and_data(test_spec: F, block_number: u32, txs_per_block: usize, tx_gas_prices: &[U256]) -> Arc where F: Fn()->Spec { - generate_dummy_client_with_spec_accounts_and_data(test_spec, None, block_number, txs_per_block, tx_gas_prices) -} - /// Generates dummy client (not test client) with corresponding spec and accounts -pub fn generate_dummy_client_with_spec_and_accounts(test_spec: F, accounts: Option>) -> Arc where F: Fn()->Spec { - generate_dummy_client_with_spec_accounts_and_data(test_spec, accounts, 0, 0, &[]) +pub fn generate_dummy_client_with_spec(test_spec: F) -> Arc where F: Fn()->Spec { + generate_dummy_client_with_spec_and_data(test_spec, 0, 0, &[]) } -/// Generates dummy client (not test client) with corresponding blocks, accounts and spec -pub fn generate_dummy_client_with_spec_accounts_and_data(test_spec: F, accounts: Option>, block_number: u32, txs_per_block: usize, tx_gas_prices: &[U256]) -> Arc where F: Fn()->Spec { +/// Generates dummy client (not test client) with corresponding amount of blocks, txs per block and spec +pub fn generate_dummy_client_with_spec_and_data(test_spec: F, block_number: u32, txs_per_block: usize, tx_gas_prices: &[U256]) -> Arc where + F: Fn() -> Spec +{ let test_spec = test_spec(); let client_db = new_db(); @@ -125,7 +124,7 @@ pub fn generate_dummy_client_with_spec_accounts_and_data(test_spec: F, accoun ClientConfig::default(), &test_spec, client_db, - Arc::new(Miner::new_for_tests(&test_spec, accounts)), + Arc::new(Miner::new_for_tests(&test_spec, None)), IoChannel::disconnected(), ).unwrap(); let test_engine = &*test_spec.engine; diff --git a/ethcore/src/tests/blockchain.rs b/ethcore/src/tests/blockchain.rs new file mode 100644 index 00000000000..9f2cdbdb9cb --- /dev/null +++ b/ethcore/src/tests/blockchain.rs @@ -0,0 +1,60 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +use blockchain::BlockProvider; + +use test_helpers::{ + generate_dummy_blockchain, + generate_dummy_blockchain_with_extra, + generate_dummy_empty_blockchain, +}; + +#[test] +fn can_contain_arbitrary_block_sequence() { + let bc = generate_dummy_blockchain(50); + assert_eq!(bc.best_block_number(), 49); +} + +#[test] +fn can_collect_garbage() { + let bc = generate_dummy_blockchain(3000); + + assert_eq!(bc.best_block_number(), 2999); + let best_hash = bc.best_block_hash(); + let mut block_header = bc.block_header_data(&best_hash); + + while !block_header.is_none() { + block_header = bc.block_header_data(&block_header.unwrap().parent_hash()); + } + assert!(bc.cache_size().blocks > 1024 * 1024); + + for _ in 0..2 { + bc.collect_garbage(); + } + assert!(bc.cache_size().blocks < 1024 * 1024); +} + +#[test] +fn can_contain_arbitrary_block_sequence_with_extra() { + let bc = generate_dummy_blockchain_with_extra(25); + assert_eq!(bc.best_block_number(), 24); +} + +#[test] +fn can_contain_only_genesis_block() { + let bc = generate_dummy_empty_blockchain(); + assert_eq!(bc.best_block_number(), 0); +} diff --git a/ethcore/src/tests/client.rs b/ethcore/src/tests/client.rs index 8f598a6c207..60ea5e1f0e9 100644 --- a/ethcore/src/tests/client.rs +++ b/ethcore/src/tests/client.rs @@ -1,42 +1,44 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::str::FromStr; use std::sync::Arc; + +use ethereum_types::{U256, Address}; +use ethkey::KeyPair; use hash::keccak; use io::IoChannel; +use tempdir::TempDir; +use types::transaction::{PendingTransaction, Transaction, Action, Condition}; +use types::filter::Filter; +use types::view; +use types::views::BlockView; + +use block::IsBlock; use client::{BlockChainClient, Client, ClientConfig, BlockId, ChainInfo, BlockInfo, PrepareOpenBlock, ImportSealedBlock, ImportBlock}; -use state::{self, State, CleanupMode}; -use executive::{Executive, TransactOptions}; use ethereum; -use block::IsBlock; +use executive::{Executive, TransactOptions}; +use miner::{Miner, PendingOrdering, MinerService}; +use spec::Spec; +use state::{self, State, CleanupMode}; use test_helpers::{ + self, generate_dummy_client, push_blocks_to_client, get_test_client_with_blocks, get_good_dummy_block_seq, generate_dummy_client_with_data, get_good_dummy_block, get_bad_state_dummy_block }; -use types::filter::Filter; -use ethereum_types::{U256, Address}; -use miner::{Miner, PendingOrdering}; -use spec::Spec; -use views::BlockView; -use ethkey::KeyPair; -use transaction::{PendingTransaction, Transaction, Action, Condition}; -use miner::MinerService; -use tempdir::TempDir; -use test_helpers; use verification::queue::kind::blocks::Unverified; #[test] diff --git a/ethcore/src/tests/evm.rs b/ethcore/src/tests/evm.rs index 25ca8afd09e..ec0b1dd8e6a 100644 --- a/ethcore/src/tests/evm.rs +++ b/ethcore/src/tests/evm.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Tests of EVM integration with transaction execution. @@ -24,7 +24,7 @@ use executive::Executive; use state::Substate; use test_helpers::get_temp_state_with_factory; use trace::{NoopVMTracer, NoopTracer}; -use transaction::SYSTEM_ADDRESS; +use types::transaction::SYSTEM_ADDRESS; use rustc_hex::FromHex; diff --git a/ethcore/src/tests/mod.rs b/ethcore/src/tests/mod.rs index d1d5b6ef7fe..ee45c73856f 100644 --- a/ethcore/src/tests/mod.rs +++ b/ethcore/src/tests/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . mod client; +mod blockchain; mod evm; mod trace; diff --git a/ethcore/src/tests/trace.rs b/ethcore/src/tests/trace.rs index 24ef3780043..f687aac127f 100644 --- a/ethcore/src/tests/trace.rs +++ b/ethcore/src/tests/trace.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Client tests of tracing @@ -26,14 +26,15 @@ use client::*; use test_helpers::get_temp_state_db; use client::{BlockChainClient, Client, ClientConfig}; use std::sync::Arc; -use header::Header; use miner::Miner; -use transaction::{Action, Transaction}; -use views::BlockView; +use types::transaction::{Action, Transaction}; use trace::{RewardType, LocalizedTrace}; use trace::trace::Action::Reward; use test_helpers; use verification::queue::kind::blocks::Unverified; +use types::header::Header; +use types::view; +use types::views::BlockView; #[test] fn can_trace_block_and_uncle_reward() { diff --git a/ethcore/src/trace/config.rs b/ethcore/src/trace/config.rs index 2e667f07f2a..72fc1765511 100644 --- a/ethcore/src/trace/config.rs +++ b/ethcore/src/trace/config.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Traces config. diff --git a/ethcore/src/trace/db.rs b/ethcore/src/trace/db.rs index 12e62826951..8dbd38449f7 100644 --- a/ethcore/src/trace/db.rs +++ b/ethcore/src/trace/db.rs @@ -1,32 +1,34 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Trace database. use std::collections::HashMap; use std::sync::Arc; -use blockchain::{BlockChainDB}; -use heapsize::HeapSizeOf; + +use blockchain::BlockChainDB; +use db::cache_manager::CacheManager; +use db::{self, Key, Writable, Readable, CacheUpdatePolicy}; use ethereum_types::{H256, H264}; +use heapsize::HeapSizeOf; use kvdb::{DBTransaction}; use parking_lot::RwLock; -use header::BlockNumber; +use types::BlockNumber; + use trace::{LocalizedTrace, Config, Filter, Database as TraceDatabase, ImportRequest, DatabaseExtras}; -use db::{self, Key, Writable, Readable, CacheUpdatePolicy}; -use super::flat::{FlatTrace, FlatBlockTraces, FlatTransactionTraces}; -use cache_manager::CacheManager; +use trace::flat::{FlatTrace, FlatBlockTraces, FlatTransactionTraces}; const TRACE_DB_VER: &'static [u8] = b"1.0"; @@ -333,7 +335,7 @@ mod tests { use std::sync::Arc; use ethereum_types::{H256, U256, Address}; use kvdb::{DBTransaction}; - use header::BlockNumber; + use types::BlockNumber; use trace::{Config, TraceDB, Database as TraceDatabase, DatabaseExtras, ImportRequest}; use trace::{Filter, LocalizedTrace, AddressesFilter, TraceError}; use trace::trace::{Call, Action, Res}; diff --git a/ethcore/src/trace/executive_tracer.rs b/ethcore/src/trace/executive_tracer.rs index 789f40bd3e3..015deaea038 100644 --- a/ethcore/src/trace/executive_tracer.rs +++ b/ethcore/src/trace/executive_tracer.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Simple executive tracer. diff --git a/ethcore/src/trace/import.rs b/ethcore/src/trace/import.rs index b720b0b86a9..e9ec9c77bad 100644 --- a/ethcore/src/trace/import.rs +++ b/ethcore/src/trace/import.rs @@ -1,22 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Traces import request. use ethereum_types::H256; -use header::BlockNumber; +use types::BlockNumber; + use trace::FlatBlockTraces; /// Traces import request. diff --git a/ethcore/src/trace/mod.rs b/ethcore/src/trace/mod.rs index 87e14f4dfeb..d3586614754 100644 --- a/ethcore/src/trace/mod.rs +++ b/ethcore/src/trace/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Tracing @@ -39,7 +39,7 @@ pub use self::types::filter::{Filter, AddressesFilter}; use ethereum_types::{H256, U256, Address}; use kvdb::DBTransaction; use vm::{Error as VmError, ActionParams}; -use header::BlockNumber; +use types::BlockNumber; /// This trait is used by executive to build traces. pub trait Tracer: Send { diff --git a/ethcore/src/trace/noop_tracer.rs b/ethcore/src/trace/noop_tracer.rs index 0752f003be7..62cce8e0111 100644 --- a/ethcore/src/trace/noop_tracer.rs +++ b/ethcore/src/trace/noop_tracer.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Nonoperative tracer. diff --git a/ethcore/src/trace/types/error.rs b/ethcore/src/trace/types/error.rs index a934443c5db..5c775dcb6ec 100644 --- a/ethcore/src/trace/types/error.rs +++ b/ethcore/src/trace/types/error.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Trace errors. diff --git a/ethcore/src/trace/types/filter.rs b/ethcore/src/trace/types/filter.rs index 0bfdc10da3d..d7b8fcc1808 100644 --- a/ethcore/src/trace/types/filter.rs +++ b/ethcore/src/trace/types/filter.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Trace filters type definitions @@ -106,7 +106,7 @@ impl Filter { let to_matches = match trace.result { Res::Create(ref create_result) => self.to_address.matches(&create_result.address), - _ => false + _ => self.to_address.matches_all(), }; from_matches && to_matches @@ -385,4 +385,44 @@ mod tests { assert!(f1.matches(&trace)); assert!(f2.matches(&trace)); } + + #[test] + fn filter_match_failed_contract_creation_fix_9822() { + + let f0 = Filter { + range: (0..0), + from_address: vec![1.into()].into(), + to_address: vec![].into(), + }; + + let f1 = Filter { + range: (0..0), + from_address: vec![].into(), + to_address: vec![].into(), + }; + + let f2 = Filter { + range: (0..0), + from_address: vec![].into(), + to_address: vec![2.into()].into(), + }; + + let trace = FlatTrace { + action: Action::Create(Create { + from: 1.into(), + gas: 4.into(), + init: vec![0x5], + value: 3.into(), + }), + result: Res::FailedCall(TraceError::BadInstruction), + trace_address: vec![].into_iter().collect(), + subtraces: 0 + }; + + assert!(f0.matches(&trace)); + assert!(f1.matches(&trace)); + assert!(!f2.matches(&trace)); + } + } + diff --git a/ethcore/src/trace/types/flat.rs b/ethcore/src/trace/types/flat.rs index f4cbba665ab..cb3e1229b71 100644 --- a/ethcore/src/trace/types/flat.rs +++ b/ethcore/src/trace/types/flat.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Flat trace module diff --git a/ethcore/src/trace/types/localized.rs b/ethcore/src/trace/types/localized.rs index 816eccc9379..330d23a7289 100644 --- a/ethcore/src/trace/types/localized.rs +++ b/ethcore/src/trace/types/localized.rs @@ -1,24 +1,24 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Localized traces type definitions use ethereum_types::H256; use super::trace::{Action, Res}; -use header::BlockNumber; +use types::BlockNumber; /// Localized trace. #[derive(Debug, PartialEq, Clone)] diff --git a/ethcore/src/trace/types/mod.rs b/ethcore/src/trace/types/mod.rs index 0e019ac552d..c1ef3ac1a55 100644 --- a/ethcore/src/trace/types/mod.rs +++ b/ethcore/src/trace/types/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Types used in the public api diff --git a/ethcore/src/trace/types/trace.rs b/ethcore/src/trace/types/trace.rs index 446fffb3af0..18ec24a84f0 100644 --- a/ethcore/src/trace/types/trace.rs +++ b/ethcore/src/trace/types/trace.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Tracing datatypes. diff --git a/ethcore/src/transaction_ext.rs b/ethcore/src/transaction_ext.rs new file mode 100644 index 00000000000..fefcd91a341 --- /dev/null +++ b/ethcore/src/transaction_ext.rs @@ -0,0 +1,43 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +//! Ethereum transaction + +use evm::Schedule; +use types::transaction::{self, Action}; + +/// Extends transaction with gas verification method. +pub trait Transaction { + /// Get the transaction cost in gas for this transaction. + fn gas_required(&self, schedule: &Schedule) -> u64; +} + +impl Transaction for transaction::Transaction { + fn gas_required(&self, schedule: &Schedule) -> u64 { + gas_required_for(match self.action { + Action::Create => true, + Action::Call(_) => false + }, &self.data, schedule) + } +} + +/// Get the transaction cost in gas for the given params. +fn gas_required_for(is_create: bool, data: &[u8], schedule: &Schedule) -> u64 { + data.iter().fold( + (if is_create {schedule.tx_create_gas} else {schedule.tx_gas}) as u64, + |g, b| g + (match *b { 0 => schedule.tx_data_zero_gas, _ => schedule.tx_data_non_zero_gas }) as u64 + ) +} diff --git a/ethcore/src/tx_filter.rs b/ethcore/src/tx_filter.rs index 4a80c259b60..3f32ab365a8 100644 --- a/ethcore/src/tx_filter.rs +++ b/ethcore/src/tx_filter.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Smart contract based transaction filter. @@ -20,10 +20,11 @@ use ethereum_types::{H256, U256, Address}; use lru_cache::LruCache; use ethabi::FunctionOutputDecoder; -use client::{BlockInfo, CallContract, BlockId}; +use call_contract::CallContract; +use client::{BlockInfo, BlockId}; use parking_lot::Mutex; use spec::CommonParams; -use transaction::{Action, SignedTransaction}; +use types::transaction::{Action, SignedTransaction}; use types::BlockNumber; use hash::KECCAK_EMPTY; @@ -149,7 +150,7 @@ mod test { use io::IoChannel; use ethkey::{Secret, KeyPair}; use super::TransactionFilter; - use transaction::{Transaction, Action}; + use types::transaction::{Transaction, Action}; use tempdir::TempDir; use test_helpers; diff --git a/ethcore/src/verification/canon_verifier.rs b/ethcore/src/verification/canon_verifier.rs index 0ace8987e0b..03a1c7155f8 100644 --- a/ethcore/src/verification/canon_verifier.rs +++ b/ethcore/src/verification/canon_verifier.rs @@ -1,25 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Canonical verifier. -use client::{BlockInfo, CallContract}; +use call_contract::CallContract; +use client::BlockInfo; use engines::EthEngine; use error::Error; -use header::Header; +use types::header::Header; use super::Verifier; use super::verification; diff --git a/ethcore/src/verification/mod.rs b/ethcore/src/verification/mod.rs index fdb04df8647..5546bd60c91 100644 --- a/ethcore/src/verification/mod.rs +++ b/ethcore/src/verification/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Block verification utilities. @@ -28,7 +28,8 @@ pub use self::canon_verifier::CanonVerifier; pub use self::noop_verifier::NoopVerifier; pub use self::queue::{BlockQueue, Config as QueueConfig, VerificationQueue, QueueInfo}; -use client::{BlockInfo, CallContract}; +use call_contract::CallContract; +use client::BlockInfo; /// Verifier type. #[derive(Debug, PartialEq, Clone)] diff --git a/ethcore/src/verification/noop_verifier.rs b/ethcore/src/verification/noop_verifier.rs index d04eec9b113..d68f1eb8856 100644 --- a/ethcore/src/verification/noop_verifier.rs +++ b/ethcore/src/verification/noop_verifier.rs @@ -1,25 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! No-op verifier. -use client::{BlockInfo, CallContract}; +use call_contract::CallContract; +use client::BlockInfo; use engines::EthEngine; use error::Error; -use header::Header; +use types::header::Header; use super::{verification, Verifier}; /// A no-op verifier -- this will verify everything it's given immediately. diff --git a/ethcore/src/verification/queue/kind.rs b/ethcore/src/verification/queue/kind.rs index 5333cc7e311..dd9798c092b 100644 --- a/ethcore/src/verification/queue/kind.rs +++ b/ethcore/src/verification/queue/kind.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Definition of valid items for the verification queue. @@ -70,9 +70,9 @@ pub mod blocks { use engines::EthEngine; use error::{Error, ErrorKind, BlockError}; - use header::Header; + use types::header::Header; use verification::{PreverifiedBlock, verify_block_basic, verify_block_unordered}; - use transaction::UnverifiedTransaction; + use types::transaction::UnverifiedTransaction; use heapsize::HeapSizeOf; use ethereum_types::{H256, U256}; @@ -190,7 +190,7 @@ pub mod headers { use engines::EthEngine; use error::Error; - use header::Header; + use types::header::Header; use verification::verify_header_params; use ethereum_types::{H256, U256}; diff --git a/ethcore/src/verification/queue/mod.rs b/ethcore/src/verification/queue/mod.rs index b1ab7a13008..423121eefa9 100644 --- a/ethcore/src/verification/queue/mod.rs +++ b/ethcore/src/verification/queue/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! A queue of blocks. Sits between network or other I/O and the `BlockChain`. //! Sorts them ready for blockchain insertion. @@ -117,9 +117,9 @@ pub enum Status { Unknown, } -impl Into<::block_status::BlockStatus> for Status { - fn into(self) -> ::block_status::BlockStatus { - use ::block_status::BlockStatus; +impl Into<::types::block_status::BlockStatus> for Status { + fn into(self) -> ::types::block_status::BlockStatus { + use ::types::block_status::BlockStatus; match self { Status::Queued => BlockStatus::Queued, Status::Bad => BlockStatus::Bad, @@ -585,10 +585,12 @@ impl VerificationQueue { } /// Returns true if there is nothing currently in the queue. - /// TODO [ToDr] Optimize to avoid locking pub fn is_empty(&self) -> bool { let v = &self.verification; - v.unverified.lock().is_empty() && v.verifying.lock().is_empty() && v.verified.lock().is_empty() + + v.unverified.load_len() == 0 + && v.verifying.load_len() == 0 + && v.verified.load_len() == 0 } /// Get queue status. @@ -742,8 +744,9 @@ mod tests { use super::kind::blocks::Unverified; use test_helpers::{get_good_dummy_block_seq, get_good_dummy_block}; use error::*; - use views::BlockView; use bytes::Bytes; + use types::view; + use types::views::BlockView; // create a test block queue. // auto_scaling enables verifier adjustment. diff --git a/ethcore/src/verification/verification.rs b/ethcore/src/verification/verification.rs index 3bfe30a4495..3f5008a2b86 100644 --- a/ethcore/src/verification/verification.rs +++ b/ethcore/src/verification/verification.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Block and transaction verification functions //! @@ -32,13 +32,33 @@ use triehash::ordered_trie_root; use unexpected::{Mismatch, OutOfBounds}; use blockchain::*; -use client::{BlockInfo, CallContract}; +use call_contract::CallContract; +use client::BlockInfo; use engines::EthEngine; use error::{BlockError, Error}; -use header::{BlockNumber, Header}; -use transaction::SignedTransaction; +use types::{BlockNumber, header::Header}; +use types::transaction::SignedTransaction; use verification::queue::kind::blocks::Unverified; + +/// Returns `Ok` when the result less or equal to `i32::max_value` to prevent `SystemTime` to panic because +/// it is platform specific, may be i32 or i64. +/// +/// `Err Result { + let d1 = sys.duration_since(UNIX_EPOCH).map_err(|_| BlockError::TimestampOverflow)?; + let total_time = d1.checked_add(d2).ok_or(BlockError::TimestampOverflow)?; + + if total_time.as_secs() <= i32::max_value() as u64 { + Ok(sys + d2) + } else { + Err(BlockError::TimestampOverflow) + } +} + /// Preprocessed block data gathered in `verify_block_unordered` call pub struct PreverifiedBlock { /// Populated block header @@ -305,7 +325,7 @@ pub fn verify_header_params(header: &Header, engine: &EthEngine, is_full: bool, const ACCEPTABLE_DRIFT: Duration = Duration::from_secs(15); let max_time = SystemTime::now() + ACCEPTABLE_DRIFT; let invalid_threshold = max_time + ACCEPTABLE_DRIFT * 9; - let timestamp = UNIX_EPOCH + Duration::from_secs(header.timestamp()); + let timestamp = timestamp_checked_add(UNIX_EPOCH, Duration::from_secs(header.timestamp()))?; if timestamp > invalid_threshold { return Err(From::from(BlockError::InvalidTimestamp(OutOfBounds { max: Some(max_time), min: None, found: timestamp }))) @@ -327,8 +347,8 @@ fn verify_parent(header: &Header, parent: &Header, engine: &EthEngine) -> Result let gas_limit_divisor = engine.params().gas_limit_bound_divisor; if !engine.is_timestamp_valid(header.timestamp(), parent.timestamp()) { - let min = SystemTime::now() + Duration::from_secs(parent.timestamp() + 1); - let found = SystemTime::now() + Duration::from_secs(header.timestamp()); + let min = timestamp_checked_add(SystemTime::now(), Duration::from_secs(parent.timestamp().saturating_add(1)))?; + let found = timestamp_checked_add(SystemTime::now(), Duration::from_secs(header.timestamp()))?; return Err(From::from(BlockError::InvalidTimestamp(OutOfBounds { max: None, min: Some(min), found }))) } if header.number() != parent.number() + 1 { @@ -378,7 +398,7 @@ mod tests { use std::time::{SystemTime, UNIX_EPOCH}; use ethereum_types::{H256, BloomRef, U256}; use blockchain::{BlockDetails, TransactionAddress, BlockReceipts}; - use encoded; + use types::encoded; use hash::keccak; use engines::EthEngine; use error::BlockError::*; @@ -386,7 +406,7 @@ mod tests { use ethkey::{Random, Generator}; use spec::{CommonParams, Spec}; use test_helpers::{create_test_block_with_data, create_test_block}; - use transaction::{SignedTransaction, Transaction, UnverifiedTransaction, Action}; + use types::transaction::{SignedTransaction, Transaction, UnverifiedTransaction, Action}; use types::log_entry::{LogEntry, LocalizedLogEntry}; use rlp; use triehash::ordered_trie_root; @@ -638,14 +658,18 @@ mod tests { good_uncle1.set_parent_hash(parent8.hash()); good_uncle1.set_difficulty(parent8.difficulty().clone() + diff_inc); good_uncle1.set_timestamp(parent8.timestamp() + 10); - good_uncle1.extra_data_mut().push(1u8); + let mut ex = good_uncle1.extra_data().to_vec(); + ex.push(1u8); + good_uncle1.set_extra_data(ex); let mut good_uncle2 = good.clone(); good_uncle2.set_number(8); good_uncle2.set_parent_hash(parent7.hash()); good_uncle2.set_difficulty(parent7.difficulty().clone() + diff_inc); good_uncle2.set_timestamp(parent7.timestamp() + 10); - good_uncle2.extra_data_mut().push(2u8); + let mut ex = good_uncle2.extra_data().to_vec(); + ex.push(2u8); + good_uncle2.set_extra_data(ex); let good_uncles = vec![ good_uncle1.clone(), good_uncle2.clone() ]; let mut uncles_rlp = RlpStream::new(); @@ -702,12 +726,16 @@ mod tests { TooMuchGasUsed(OutOfBounds { max: Some(header.gas_limit().clone()), min: None, found: header.gas_used().clone() })); header = good.clone(); - header.extra_data_mut().resize(engine.maximum_extra_data_size() + 1, 0u8); + let mut ex = header.extra_data().to_vec(); + ex.resize(engine.maximum_extra_data_size() + 1, 0u8); + header.set_extra_data(ex); check_fail(basic_test(&create_test_block(&header), engine), ExtraDataOutOfBounds(OutOfBounds { max: Some(engine.maximum_extra_data_size()), min: None, found: header.extra_data().len() })); header = good.clone(); - header.extra_data_mut().resize(engine.maximum_extra_data_size() + 1, 0u8); + let mut ex = header.extra_data().to_vec(); + ex.resize(engine.maximum_extra_data_size() + 1, 0u8); + header.set_extra_data(ex); check_fail(basic_test(&create_test_block(&header), engine), ExtraDataOutOfBounds(OutOfBounds { max: Some(engine.maximum_extra_data_size()), min: None, found: header.extra_data().len() })); @@ -734,7 +762,8 @@ mod tests { check_fail_timestamp(family_test(&create_test_block_with_data(&header, &good_transactions, &good_uncles), engine, &bc), false); header = good.clone(); - header.set_timestamp(2450000000); + // will return `BlockError::TimestampOverflow` when timestamp > `i32::max_value()` + header.set_timestamp(i32::max_value() as u64); check_fail_timestamp(basic_test(&create_test_block_with_data(&header, &good_transactions, &good_uncles), engine), false); header = good.clone(); @@ -778,7 +807,7 @@ mod tests { #[test] fn dust_protection() { use ethkey::{Generator, Random}; - use transaction::{Transaction, Action}; + use types::transaction::{Transaction, Action}; use machine::EthereumMachine; use engines::NullEngine; @@ -806,4 +835,11 @@ mod tests { check_fail(unordered_test(&create_test_block_with_data(&header, &bad_transactions, &[]), &engine), TooManyTransactions(keypair.address())); unordered_test(&create_test_block_with_data(&header, &good_transactions, &[]), &engine).unwrap(); } + + #[test] + fn checked_add_systime_dur() { + assert!(timestamp_checked_add(UNIX_EPOCH, Duration::new(i32::max_value() as u64 + 1, 0)).is_err()); + assert!(timestamp_checked_add(UNIX_EPOCH, Duration::new(i32::max_value() as u64, 0)).is_ok()); + assert!(timestamp_checked_add(UNIX_EPOCH, Duration::new(i32::max_value() as u64 - 1, 1_000_000_000)).is_ok()); + } } diff --git a/ethcore/src/verification/verifier.rs b/ethcore/src/verification/verifier.rs index 188254b4317..76eb60b9a18 100644 --- a/ethcore/src/verification/verifier.rs +++ b/ethcore/src/verification/verifier.rs @@ -1,25 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! A generic verifier trait. -use client::{BlockInfo, CallContract}; +use call_contract::CallContract; +use client::BlockInfo; use engines::EthEngine; use error::Error; -use header::Header; +use types::header::Header; use super::verification; /// Should be used to verify blocks. diff --git a/ethcore/stratum/Cargo.toml b/ethcore/stratum/Cargo.toml deleted file mode 100644 index 72fd2379155..00000000000 --- a/ethcore/stratum/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -description = "Ethcore stratum lib" -name = "ethcore-stratum" -version = "1.12.0" -license = "GPL-3.0" -authors = ["Parity Technologies "] - -[dependencies] -ethereum-types = "0.4" -keccak-hash = "0.1" -jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -jsonrpc-macros = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -jsonrpc-tcp-server = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -log = "0.4" -parking_lot = "0.7" - -[dev-dependencies] -env_logger = "0.5" -tokio = "0.1" -tokio-io = "0.1" -ethcore-logger = { path = "../../logger" } diff --git a/ethcore/sync/Cargo.toml b/ethcore/sync/Cargo.toml index 234caf5ee78..bc7a80e6700 100644 --- a/ethcore/sync/Cargo.toml +++ b/ethcore/sync/Cargo.toml @@ -9,33 +9,34 @@ authors = ["Parity Technologies "] [dependencies] common-types = { path = "../types" } -parity-bytes = "0.1" -ethcore-network = { path = "../../util/network" } -ethcore-network-devp2p = { path = "../../util/network-devp2p" } +enum_primitive = "0.1.1" +ethcore = { path = ".." } ethcore-io = { path = "../../util/io" } ethcore-light = { path = "../light" } -ethcore-transaction = { path = "../transaction" } -ethcore = { path = ".." } +ethcore-network = { path = "../../util/network" } +ethcore-network-devp2p = { path = "../../util/network-devp2p" } ethereum-types = "0.4" -hashdb = "0.3.0" +ethkey = { path = "../../accounts/ethkey" } +ethstore = { path = "../../accounts/ethstore" } fastmap = { path = "../../util/fastmap" } -rlp = { version = "0.3.0", features = ["ethereum"] } +hash-db = "0.11.0" +heapsize = "0.4" keccak-hash = "0.1" keccak-hasher = { path = "../../util/keccak-hasher" } -triehash-ethereum = {version = "0.2", path = "../../util/triehash-ethereum" } kvdb = "0.1" -macros = { path = "../../util/macros" } log = "0.4" -env_logger = "0.5" -rand = "0.4" -heapsize = "0.4" +macros = { path = "../../util/macros" } +parity-bytes = "0.1" parking_lot = "0.7" +rand = "0.4" +rlp = { version = "0.3.0", features = ["ethereum"] } trace-time = "0.1" +triehash-ethereum = {version = "0.2", path = "../../util/triehash-ethereum" } [dev-dependencies] +env_logger = "0.5" +ethcore = { path = "..", features = ["test-helpers"] } ethcore-io = { path = "../../util/io", features = ["mio"] } -ethkey = { path = "../../ethkey" } -kvdb-memorydb = "0.1" ethcore-private-tx = { path = "../private-tx" } -ethcore = { path = "..", features = ["test-helpers"] } +kvdb-memorydb = "0.1" rustc-hex = "1.0" diff --git a/ethcore/sync/src/api.rs b/ethcore/sync/src/api.rs index 7d7a1afc701..4a66f468d59 100644 --- a/ethcore/sync/src/api.rs +++ b/ethcore/sync/src/api.rs @@ -1,45 +1,46 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::{Arc, mpsc, atomic}; use std::collections::{HashMap, BTreeMap}; use std::io; -use std::ops::Range; +use std::ops::RangeInclusive; use std::time::Duration; use bytes::Bytes; use devp2p::NetworkService; use network::{NetworkProtocolHandler, NetworkContext, PeerId, ProtocolId, NetworkConfiguration as BasicNetworkConfiguration, NonReservedPeerMode, Error, ErrorKind, ConnectionFilter}; +use network::client_version::ClientVersion; use types::pruning_info::PruningInfo; use ethereum_types::{H256, H512, U256}; use io::{TimerToken}; -use ethcore::ethstore::ethkey::Secret; +use ethkey::Secret; use ethcore::client::{BlockChainClient, ChainNotify, NewBlocks, ChainMessageType}; use ethcore::snapshot::SnapshotService; -use ethcore::header::BlockNumber; +use types::BlockNumber; use sync_io::NetSyncIo; use chain::{ChainSyncApi, SyncStatus as EthSyncStatus}; use std::net::{SocketAddr, AddrParseError}; use std::str::FromStr; use parking_lot::{RwLock, Mutex}; use chain::{ETH_PROTOCOL_VERSION_63, ETH_PROTOCOL_VERSION_62, - PAR_PROTOCOL_VERSION_1, PAR_PROTOCOL_VERSION_2, PAR_PROTOCOL_VERSION_3, - PRIVATE_TRANSACTION_PACKET, SIGNED_PRIVATE_TRANSACTION_PACKET}; + PAR_PROTOCOL_VERSION_1, PAR_PROTOCOL_VERSION_2, PAR_PROTOCOL_VERSION_3}; +use chain::sync_packet::SyncPacket::{PrivateTransactionPacket, SignedPrivateTransactionPacket}; use light::client::AsLightClient; use light::Provider; use light::net::{ @@ -48,7 +49,9 @@ use light::net::{ }; use network::IpFilter; use private_tx::PrivateTxHandler; -use transaction::UnverifiedTransaction; +use types::transaction::UnverifiedTransaction; + +use super::light_sync::SyncInfo; /// Parity sync protocol pub const WARP_SYNC_PROTOCOL_ID: ProtocolId = *b"par"; @@ -158,7 +161,7 @@ pub struct PeerInfo { /// Public node id pub id: Option, /// Node client ID - pub client_version: String, + pub client_version: ClientVersion, /// Capabilities pub capabilities: Vec, /// Remote endpoint address @@ -268,7 +271,7 @@ pub struct Params { /// Snapshot service. pub snapshot_service: Arc, /// Private tx service. - pub private_tx_handler: Arc, + pub private_tx_handler: Option>, /// Light data provider. pub provider: Arc<::light::Provider>, /// Network layer configuration. @@ -349,7 +352,7 @@ impl EthSync { let sync = ChainSyncApi::new( params.config, &*params.chain, - params.private_tx_handler.clone(), + params.private_tx_handler.as_ref().cloned(), priority_tasks_rx, ); let service = NetworkService::new(params.network_config.clone().into_basic()?, connection_filter)?; @@ -576,9 +579,9 @@ impl ChainNotify for EthSync { match message_type { ChainMessageType::Consensus(message) => self.eth_handler.sync.write().propagate_consensus_packet(&mut sync_io, message), ChainMessageType::PrivateTransaction(transaction_hash, message) => - self.eth_handler.sync.write().propagate_private_transaction(&mut sync_io, transaction_hash, PRIVATE_TRANSACTION_PACKET, message), + self.eth_handler.sync.write().propagate_private_transaction(&mut sync_io, transaction_hash, PrivateTransactionPacket, message), ChainMessageType::SignedPrivateTransaction(transaction_hash, message) => - self.eth_handler.sync.write().propagate_private_transaction(&mut sync_io, transaction_hash, SIGNED_PRIVATE_TRANSACTION_PACKET, message), + self.eth_handler.sync.write().propagate_private_transaction(&mut sync_io, transaction_hash, SignedPrivateTransactionPacket, message), } }); } @@ -594,7 +597,7 @@ impl ChainNotify for EthSync { struct TxRelay(Arc); impl LightHandler for TxRelay { - fn on_transactions(&self, ctx: &EventContext, relay: &[::transaction::UnverifiedTransaction]) { + fn on_transactions(&self, ctx: &EventContext, relay: &[::types::transaction::UnverifiedTransaction]) { trace!(target: "pip", "Relaying {} transactions from peer {}", relay.len(), ctx.peer()); self.0.queue_transactions(relay.iter().map(|tx| ::rlp::encode(tx)).collect(), ctx.peer()) } @@ -615,9 +618,7 @@ pub trait ManageNetwork : Send + Sync { /// Stop network fn stop_network(&self); /// Returns the minimum and maximum peers. - /// Note that `range.end` is *exclusive*. - // TODO: Range should be changed to RangeInclusive once stable (https://github.com/rust-lang/rust/pull/50758) - fn num_peers_range(&self) -> Range; + fn num_peers_range(&self) -> RangeInclusive; /// Get network context for protocol. fn with_proto_context(&self, proto: ProtocolId, f: &mut FnMut(&NetworkContext)); } @@ -656,7 +657,7 @@ impl ManageNetwork for EthSync { self.stop(); } - fn num_peers_range(&self) -> Range { + fn num_peers_range(&self) -> RangeInclusive { self.network.num_peers_range() } @@ -805,6 +806,24 @@ pub trait LightSyncProvider { fn transactions_stats(&self) -> BTreeMap; } +/// Wrapper around `light_sync::SyncInfo` to expose those methods without the concrete type `LightSync` +pub trait LightSyncInfo: Send + Sync { + /// Get the highest block advertised on the network. + fn highest_block(&self) -> Option; + + /// Get the block number at the time of sync start. + fn start_block(&self) -> u64; + + /// Whether major sync is underway. + fn is_major_importing(&self) -> bool; +} + +/// Execute a closure with a protocol context. +pub trait LightNetworkDispatcher { + /// Execute a closure with a protocol context. + fn with_context(&self, f: F) -> Option where F: FnOnce(&::light::net::BasicContext) -> T; +} + /// Configuration for the light sync. pub struct LightSyncParams { /// Network configuration. @@ -824,7 +843,7 @@ pub struct LightSyncParams { /// Service for light synchronization. pub struct LightSync { proto: Arc, - sync: Arc<::light_sync::SyncInfo + Sync + Send>, + sync: Arc, attached_protos: Vec, network: NetworkService, subprotocol_name: [u8; 3], @@ -875,15 +894,6 @@ impl LightSync { }) } - /// Execute a closure with a protocol context. - pub fn with_context(&self, f: F) -> Option - where F: FnOnce(&::light::net::BasicContext) -> T - { - self.network.with_context_eval( - self.subprotocol_name, - move |ctx| self.proto.with_context(&ctx, f), - ) - } } impl ::std::ops::Deref for LightSync { @@ -892,6 +902,16 @@ impl ::std::ops::Deref for LightSync { fn deref(&self) -> &Self::Target { &*self.sync } } + +impl LightNetworkDispatcher for LightSync { + fn with_context(&self, f: F) -> Option where F: FnOnce(&::light::net::BasicContext) -> T { + self.network.with_context_eval( + self.subprotocol_name, + move |ctx| self.proto.with_context(&ctx, f), + ) + } +} + impl ManageNetwork for LightSync { fn accept_unreserved_peers(&self) { self.network.set_non_reserved_mode(NonReservedPeerMode::Accept); @@ -935,7 +955,7 @@ impl ManageNetwork for LightSync { self.network.stop(); } - fn num_peers_range(&self) -> Range { + fn num_peers_range(&self) -> RangeInclusive { self.network.num_peers_range() } @@ -948,12 +968,12 @@ impl LightSyncProvider for LightSync { fn peer_numbers(&self) -> PeerNumbers { let (connected, active) = self.proto.peer_count(); let peers_range = self.num_peers_range(); - debug_assert!(peers_range.end > peers_range.start); + debug_assert!(peers_range.end() >= peers_range.start()); PeerNumbers { connected: connected, active: active, - max: peers_range.end as usize - 1, - min: peers_range.start as usize, + max: *peers_range.end() as usize, + min: *peers_range.start() as usize, } } @@ -992,3 +1012,17 @@ impl LightSyncProvider for LightSync { Default::default() // TODO } } + +impl LightSyncInfo for LightSync { + fn highest_block(&self) -> Option { + (*self.sync).highest_block() + } + + fn start_block(&self) -> u64 { + (*self.sync).start_block() + } + + fn is_major_importing(&self) -> bool { + (*self.sync).is_major_importing() + } +} diff --git a/ethcore/sync/src/block_sync.rs b/ethcore/sync/src/block_sync.rs index 149e312245d..04ffa5f18dd 100644 --- a/ethcore/sync/src/block_sync.rs +++ b/ethcore/sync/src/block_sync.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . /// /// Blockchain downloader @@ -23,16 +23,19 @@ use std::cmp; use heapsize::HeapSizeOf; use ethereum_types::H256; use rlp::{self, Rlp}; -use ethcore::header::BlockNumber; +use types::BlockNumber; use ethcore::client::{BlockStatus, BlockId}; use ethcore::error::{ImportErrorKind, QueueErrorKind, BlockError, Error as EthcoreError, ErrorKind as EthcoreErrorKind}; use sync_io::SyncIo; use blocks::{BlockCollection, SyncBody, SyncHeader}; use chain::BlockSet; +use network::PeerId; +use network::client_version::ClientCapabilities; const MAX_HEADERS_TO_REQUEST: usize = 128; -const MAX_BODIES_TO_REQUEST: usize = 32; -const MAX_RECEPITS_TO_REQUEST: usize = 128; +const MAX_BODIES_TO_REQUEST_LARGE: usize = 128; +const MAX_BODIES_TO_REQUEST_SMALL: usize = 32; // Size request for parity clients prior to 2.4.0 +const MAX_RECEPITS_TO_REQUEST: usize = 256; const SUBCHAIN_SIZE: u64 = 256; const MAX_ROUND_PARENTS: usize = 16; const MAX_PARALLEL_SUBCHAIN_DOWNLOAD: usize = 5; @@ -464,12 +467,12 @@ impl BlockDownloader { } /// Find some headers or blocks to download for a peer. - pub fn request_blocks(&mut self, io: &mut SyncIo, num_active_peers: usize) -> Option { + pub fn request_blocks(&mut self, peer_id: PeerId, io: &mut SyncIo, num_active_peers: usize) -> Option { match self.state { State::Idle => { self.start_sync_round(io); if self.state == State::ChainHead { - return self.request_blocks(io, num_active_peers); + return self.request_blocks(peer_id, io, num_active_peers); } }, State::ChainHead => { @@ -487,7 +490,15 @@ impl BlockDownloader { }, State::Blocks => { // check to see if we need to download any block bodies first - let needed_bodies = self.blocks.needed_bodies(MAX_BODIES_TO_REQUEST, false); + let client_version = io.peer_version(peer_id); + + let number_of_bodies_to_request = if client_version.can_handle_large_requests() { + MAX_BODIES_TO_REQUEST_LARGE + } else { + MAX_BODIES_TO_REQUEST_SMALL + }; + + let needed_bodies = self.blocks.needed_bodies(number_of_bodies_to_request, false); if !needed_bodies.is_empty() { return Some(BlockRequest::Bodies { hashes: needed_bodies, @@ -621,7 +632,6 @@ fn all_expected(values: &[A], expected_values: &[B], is_expected: F) -> mod tests { use super::*; use ethcore::client::TestBlockChainClient; - use ethcore::header::Header as BlockHeader; use ethcore::spec::Spec; use ethkey::{Generator,Random}; use hash::keccak; @@ -629,8 +639,9 @@ mod tests { use rlp::{encode_list,RlpStream}; use tests::helpers::TestIo; use tests::snapshot::TestSnapshotService; - use transaction::{Transaction,SignedTransaction}; + use types::transaction::{Transaction,SignedTransaction}; use triehash_ethereum::ordered_trie_root; + use types::header::Header as BlockHeader; fn dummy_header(number: u64, parent_hash: H256) -> BlockHeader { let mut header = BlockHeader::new(); diff --git a/ethcore/sync/src/blocks.rs b/ethcore/sync/src/blocks.rs index 5f0f6a0c23d..125c8d0b9c5 100644 --- a/ethcore/sync/src/blocks.rs +++ b/ethcore/sync/src/blocks.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::{HashSet, HashMap, hash_map}; use hash::{keccak, KECCAK_NULL_RLP, KECCAK_EMPTY_LIST_RLP}; @@ -22,9 +22,9 @@ use triehash_ethereum::ordered_trie_root; use bytes::Bytes; use rlp::{Rlp, RlpStream, DecoderError}; use network; -use ethcore::header::Header as BlockHeader; use ethcore::verification::queue::kind::blocks::Unverified; -use transaction::UnverifiedTransaction; +use types::transaction::UnverifiedTransaction; +use types::header::Header as BlockHeader; known_heap_size!(0, HeaderId); @@ -571,7 +571,7 @@ impl BlockCollection { mod test { use super::{BlockCollection, SyncHeader}; use ethcore::client::{TestBlockChainClient, EachBlockWith, BlockId, BlockChainClient}; - use ethcore::header::BlockNumber; + use types::BlockNumber; use ethcore::verification::queue::kind::blocks::Unverified; use rlp::*; diff --git a/ethcore/sync/src/chain/handler.rs b/ethcore/sync/src/chain/handler.rs index e1518d4f522..63ab8916139 100644 --- a/ethcore/sync/src/chain/handler.rs +++ b/ethcore/sync/src/chain/handler.rs @@ -1,36 +1,52 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use api::WARP_SYNC_PROTOCOL_ID; use block_sync::{BlockDownloaderImportError as DownloaderImportError, DownloadAction}; use bytes::Bytes; -use ethcore::client::{BlockId, BlockStatus}; +use enum_primitive::FromPrimitive; use ethcore::error::{Error as EthcoreError, ErrorKind as EthcoreErrorKind, ImportErrorKind, BlockError}; -use ethcore::header::BlockNumber; use ethcore::snapshot::{ManifestData, RestorationStatus}; use ethcore::verification::queue::kind::blocks::Unverified; use ethereum_types::{H256, U256}; use hash::keccak; use network::PeerId; +use network::client_version::ClientVersion; use rlp::Rlp; use snapshot::ChunkType; -use std::cmp; -use std::mem; use std::time::Instant; +use std::{mem, cmp}; use sync_io::SyncIo; +use types::BlockNumber; +use types::block_status::BlockStatus; +use types::ids::BlockId; + +use super::sync_packet::{PacketInfo, SyncPacket}; +use super::sync_packet::SyncPacket::{ + StatusPacket, + NewBlockHashesPacket, + BlockHeadersPacket, + BlockBodiesPacket, + NewBlockPacket, + ReceiptsPacket, + SnapshotManifestPacket, + SnapshotDataPacket, + PrivateTransactionPacket, + SignedPrivateTransactionPacket, +}; use super::{ BlockSet, @@ -47,16 +63,6 @@ use super::{ MAX_NEW_HASHES, PAR_PROTOCOL_VERSION_1, PAR_PROTOCOL_VERSION_3, - BLOCK_BODIES_PACKET, - BLOCK_HEADERS_PACKET, - NEW_BLOCK_HASHES_PACKET, - NEW_BLOCK_PACKET, - PRIVATE_TRANSACTION_PACKET, - RECEIPTS_PACKET, - SIGNED_PRIVATE_TRANSACTION_PACKET, - SNAPSHOT_DATA_PACKET, - SNAPSHOT_MANIFEST_PACKET, - STATUS_PACKET, }; /// The Chain Sync Handler: handles responses from peers @@ -66,36 +72,40 @@ impl SyncHandler { /// Handle incoming packet from peer pub fn on_packet(sync: &mut ChainSync, io: &mut SyncIo, peer: PeerId, packet_id: u8, data: &[u8]) { let rlp = Rlp::new(data); - let result = match packet_id { - STATUS_PACKET => SyncHandler::on_peer_status(sync, io, peer, &rlp), - BLOCK_HEADERS_PACKET => SyncHandler::on_peer_block_headers(sync, io, peer, &rlp), - BLOCK_BODIES_PACKET => SyncHandler::on_peer_block_bodies(sync, io, peer, &rlp), - RECEIPTS_PACKET => SyncHandler::on_peer_block_receipts(sync, io, peer, &rlp), - NEW_BLOCK_PACKET => SyncHandler::on_peer_new_block(sync, io, peer, &rlp), - NEW_BLOCK_HASHES_PACKET => SyncHandler::on_peer_new_hashes(sync, io, peer, &rlp), - SNAPSHOT_MANIFEST_PACKET => SyncHandler::on_snapshot_manifest(sync, io, peer, &rlp), - SNAPSHOT_DATA_PACKET => SyncHandler::on_snapshot_data(sync, io, peer, &rlp), - PRIVATE_TRANSACTION_PACKET => SyncHandler::on_private_transaction(sync, io, peer, &rlp), - SIGNED_PRIVATE_TRANSACTION_PACKET => SyncHandler::on_signed_private_transaction(sync, io, peer, &rlp), - _ => { - debug!(target: "sync", "{}: Unknown packet {}", peer, packet_id); - Ok(()) - } - }; + if let Some(packet_id) = SyncPacket::from_u8(packet_id) { + let result = match packet_id { + StatusPacket => SyncHandler::on_peer_status(sync, io, peer, &rlp), + BlockHeadersPacket => SyncHandler::on_peer_block_headers(sync, io, peer, &rlp), + BlockBodiesPacket => SyncHandler::on_peer_block_bodies(sync, io, peer, &rlp), + ReceiptsPacket => SyncHandler::on_peer_block_receipts(sync, io, peer, &rlp), + NewBlockPacket => SyncHandler::on_peer_new_block(sync, io, peer, &rlp), + NewBlockHashesPacket => SyncHandler::on_peer_new_hashes(sync, io, peer, &rlp), + SnapshotManifestPacket => SyncHandler::on_snapshot_manifest(sync, io, peer, &rlp), + SnapshotDataPacket => SyncHandler::on_snapshot_data(sync, io, peer, &rlp), + PrivateTransactionPacket => SyncHandler::on_private_transaction(sync, io, peer, &rlp), + SignedPrivateTransactionPacket => SyncHandler::on_signed_private_transaction(sync, io, peer, &rlp), + _ => { + debug!(target: "sync", "{}: Unknown packet {}", peer, packet_id.id()); + Ok(()) + } + }; - match result { - Err(DownloaderImportError::Invalid) => { - debug!(target:"sync", "{} -> Invalid packet {}", peer, packet_id); - io.disable_peer(peer); - sync.deactivate_peer(io, peer); - }, - Err(DownloaderImportError::Useless) => { - sync.deactivate_peer(io, peer); - }, - Ok(()) => { - // give a task to the same peer first - sync.sync_peer(io, peer, false); - }, + match result { + Err(DownloaderImportError::Invalid) => { + debug!(target:"sync", "{} -> Invalid packet {}", peer, packet_id.id()); + io.disable_peer(peer); + sync.deactivate_peer(io, peer); + }, + Err(DownloaderImportError::Useless) => { + sync.deactivate_peer(io, peer); + }, + Ok(()) => { + // give a task to the same peer first + sync.sync_peer(io, peer, false); + }, + } + } else { + debug!(target: "sync", "{}: Unknown packet {}", peer, packet_id); } } @@ -107,7 +117,7 @@ impl SyncHandler { /// Called by peer when it is disconnecting pub fn on_peer_aborting(sync: &mut ChainSync, io: &mut SyncIo, peer_id: PeerId) { - trace!(target: "sync", "== Disconnecting {}: {}", peer_id, io.peer_info(peer_id)); + trace!(target: "sync", "== Disconnecting {}: {}", peer_id, io.peer_version(peer_id)); sync.handshaking_peers.remove(&peer_id); if sync.peers.contains_key(&peer_id) { debug!(target: "sync", "Disconnected {}", peer_id); @@ -133,7 +143,7 @@ impl SyncHandler { /// Called when a new peer is connected pub fn on_peer_connected(sync: &mut ChainSync, io: &mut SyncIo, peer: PeerId) { - trace!(target: "sync", "== Connected {}: {}", peer, io.peer_info(peer)); + trace!(target: "sync", "== Connected {}: {}", peer, io.peer_version(peer)); if let Err(e) = sync.send_status(io, peer) { debug!(target:"sync", "Error sending status request: {:?}", e); io.disconnect_peer(peer); @@ -557,7 +567,9 @@ impl SyncHandler { fn on_peer_status(sync: &mut ChainSync, io: &mut SyncIo, peer_id: PeerId, r: &Rlp) -> Result<(), DownloaderImportError> { sync.handshaking_peers.remove(&peer_id); let protocol_version: u8 = r.val_at(0)?; - let warp_protocol = io.protocol_version(&WARP_SYNC_PROTOCOL_ID, peer_id) != 0; + let warp_protocol_version = io.protocol_version(&WARP_SYNC_PROTOCOL_ID, peer_id); + let warp_protocol = warp_protocol_version != 0; + let private_tx_protocol = warp_protocol_version >= PAR_PROTOCOL_VERSION_3.0; let peer = PeerInfo { protocol_version: protocol_version, network_id: r.val_at(1)?, @@ -576,17 +588,34 @@ impl SyncHandler { snapshot_hash: if warp_protocol { Some(r.val_at(5)?) } else { None }, snapshot_number: if warp_protocol { Some(r.val_at(6)?) } else { None }, block_set: None, + private_tx_enabled: if private_tx_protocol { r.val_at(7).unwrap_or(false) } else { false }, + client_version: ClientVersion::from(io.peer_version(peer_id)), }; - trace!(target: "sync", "New peer {} (protocol: {}, network: {:?}, difficulty: {:?}, latest:{}, genesis:{}, snapshot:{:?})", - peer_id, peer.protocol_version, peer.network_id, peer.difficulty, peer.latest_hash, peer.genesis, peer.snapshot_number); + trace!(target: "sync", "New peer {} (\ + protocol: {}, \ + network: {:?}, \ + difficulty: {:?}, \ + latest:{}, \ + genesis:{}, \ + snapshot:{:?}, \ + private_tx_enabled:{})", + peer_id, + peer.protocol_version, + peer.network_id, + peer.difficulty, + peer.latest_hash, + peer.genesis, + peer.snapshot_number, + peer.private_tx_enabled + ); if io.is_expired() { - trace!(target: "sync", "Status packet from expired session {}:{}", peer_id, io.peer_info(peer_id)); + trace!(target: "sync", "Status packet from expired session {}:{}", peer_id, io.peer_version(peer_id)); return Ok(()); } if sync.peers.contains_key(&peer_id) { - debug!(target: "sync", "Unexpected status packet from {}:{}", peer_id, io.peer_info(peer_id)); + debug!(target: "sync", "Unexpected status packet from {}:{}", peer_id, io.peer_version(peer_id)); return Ok(()); } let chain_info = io.chain().chain_info(); @@ -615,7 +644,7 @@ impl SyncHandler { // Don't activate peer immediatelly when searching for common block. // Let the current sync round complete first. sync.active_peers.insert(peer_id.clone()); - debug!(target: "sync", "Connected {}:{}", peer_id, io.peer_info(peer_id)); + debug!(target: "sync", "Connected {}:{}", peer_id, io.peer_version(peer_id)); if let Some((fork_block, _)) = sync.fork_block { SyncRequester::request_fork_header(sync, io, peer_id, fork_block); @@ -654,9 +683,15 @@ impl SyncHandler { trace!(target: "sync", "{} Ignoring packet from unconfirmed/unknown peer", peer_id); return Ok(()); } - + let private_handler = match sync.private_tx_handler { + Some(ref handler) => handler, + None => { + trace!(target: "sync", "{} Ignoring private tx packet from peer", peer_id); + return Ok(()); + } + }; trace!(target: "sync", "Received signed private transaction packet from {:?}", peer_id); - match sync.private_tx_handler.import_signed_private_transaction(r.as_raw()) { + match private_handler.import_signed_private_transaction(r.as_raw()) { Ok(transaction_hash) => { //don't send the packet back if let Some(ref mut peer) = sync.peers.get_mut(&peer_id) { @@ -676,10 +711,15 @@ impl SyncHandler { trace!(target: "sync", "{} Ignoring packet from unconfirmed/unknown peer", peer_id); return Ok(()); } - + let private_handler = match sync.private_tx_handler { + Some(ref handler) => handler, + None => { + trace!(target: "sync", "{} Ignoring private tx packet from peer", peer_id); + return Ok(()); + } + }; trace!(target: "sync", "Received private transaction packet from {:?}", peer_id); - - match sync.private_tx_handler.import_private_transaction(r.as_raw()) { + match private_handler.import_private_transaction(r.as_raw()) { Ok(transaction_hash) => { //don't send the packet back if let Some(ref mut peer) = sync.peers.get_mut(&peer_id) { diff --git a/ethcore/sync/src/chain/mod.rs b/ethcore/sync/src/chain/mod.rs index a01b25528f0..81f1ccffe94 100644 --- a/ethcore/sync/src/chain/mod.rs +++ b/ethcore/sync/src/chain/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! `BlockChain` synchronization strategy. //! Syncs to peers and keeps up to date. @@ -88,6 +88,7 @@ //! All other messages are ignored. mod handler; +pub mod sync_packet; mod propagator; mod requester; mod supplier; @@ -104,7 +105,7 @@ use parking_lot::{Mutex, RwLock, RwLockWriteGuard}; use bytes::Bytes; use rlp::{RlpStream, DecoderError}; use network::{self, PeerId, PacketId}; -use ethcore::header::{BlockNumber}; +use network::client_version::ClientVersion; use ethcore::client::{BlockChainClient, BlockStatus, BlockId, BlockChainInfo, BlockQueueInfo}; use ethcore::snapshot::{RestorationStatus}; use sync_io::SyncIo; @@ -115,9 +116,16 @@ use snapshot::{Snapshot}; use api::{EthProtocolInfo as PeerInfoDigest, WARP_SYNC_PROTOCOL_ID, PriorityTask}; use private_tx::PrivateTxHandler; use transactions_stats::{TransactionsStats, Stats as TransactionStats}; -use transaction::UnverifiedTransaction; +use types::transaction::UnverifiedTransaction; +use types::BlockNumber; use self::handler::SyncHandler; +use self::sync_packet::{PacketInfo, SyncPacket}; +use self::sync_packet::SyncPacket::{ + NewBlockPacket, + StatusPacket, +}; + use self::propagator::SyncPropagator; use self::requester::SyncRequester; pub(crate) use self::supplier::SyncSupplier; @@ -140,7 +148,6 @@ pub const PAR_PROTOCOL_VERSION_3: (u8, u8) = (3, 0x18); pub const MAX_BODIES_TO_SEND: usize = 256; pub const MAX_HEADERS_TO_SEND: usize = 512; pub const MAX_NODE_DATA_TO_SEND: usize = 1024; -pub const MAX_RECEIPTS_TO_SEND: usize = 1024; pub const MAX_RECEIPTS_HEADERS_TO_SEND: usize = 256; const MIN_PEERS_PROPAGATION: usize = 4; const MAX_PEERS_PROPAGATION: usize = 128; @@ -154,28 +161,6 @@ const MAX_TRANSACTION_PACKET_SIZE: usize = 5 * 1024 * 1024; const SNAPSHOT_RESTORE_THRESHOLD: BlockNumber = 30000; const SNAPSHOT_MIN_PEERS: usize = 3; -const STATUS_PACKET: u8 = 0x00; -const NEW_BLOCK_HASHES_PACKET: u8 = 0x01; -const TRANSACTIONS_PACKET: u8 = 0x02; -pub const GET_BLOCK_HEADERS_PACKET: u8 = 0x03; -pub const BLOCK_HEADERS_PACKET: u8 = 0x04; -pub const GET_BLOCK_BODIES_PACKET: u8 = 0x05; -const BLOCK_BODIES_PACKET: u8 = 0x06; -const NEW_BLOCK_PACKET: u8 = 0x07; - -pub const GET_NODE_DATA_PACKET: u8 = 0x0d; -pub const NODE_DATA_PACKET: u8 = 0x0e; -pub const GET_RECEIPTS_PACKET: u8 = 0x0f; -pub const RECEIPTS_PACKET: u8 = 0x10; - -pub const GET_SNAPSHOT_MANIFEST_PACKET: u8 = 0x11; -pub const SNAPSHOT_MANIFEST_PACKET: u8 = 0x12; -pub const GET_SNAPSHOT_DATA_PACKET: u8 = 0x13; -pub const SNAPSHOT_DATA_PACKET: u8 = 0x14; -pub const CONSENSUS_DATA_PACKET: u8 = 0x15; -pub const PRIVATE_TRANSACTION_PACKET: u8 = 0x16; -pub const SIGNED_PRIVATE_TRANSACTION_PACKET: u8 = 0x17; - const MAX_SNAPSHOT_CHUNKS_DOWNLOAD_AHEAD: usize = 3; const WAIT_PEERS_TIMEOUT: Duration = Duration::from_secs(5); @@ -333,6 +318,8 @@ pub struct PeerInfo { last_sent_private_transactions: H256FastSet, /// Pending request is expired and result should be ignored expired: bool, + /// Private transactions enabled + private_tx_enabled: bool, /// Peer fork confirmation status confirmation: ForkConfirmation, /// Best snapshot hash @@ -341,6 +328,8 @@ pub struct PeerInfo { snapshot_number: Option, /// Block set requested block_set: Option, + /// Version of the software the peer is running + client_version: ClientVersion, } impl PeerInfo { @@ -395,7 +384,7 @@ impl ChainSyncApi { pub fn new( config: SyncConfig, chain: &BlockChainClient, - private_tx_handler: Arc, + private_tx_handler: Option>, priority_tasks: mpsc::Receiver, ) -> Self { ChainSyncApi { @@ -480,7 +469,7 @@ impl ChainSyncApi { for peers in sync.get_peers(&chain_info, PeerState::SameBlock).chunks(10) { check_deadline(deadline)?; for peer in peers { - SyncPropagator::send_packet(io, *peer, NEW_BLOCK_PACKET, rlp.clone()); + SyncPropagator::send_packet(io, *peer, NewBlockPacket, rlp.clone()); if let Some(ref mut peer) = sync.peers.get_mut(peer) { peer.latest_hash = hash; } @@ -626,7 +615,7 @@ pub struct ChainSync { /// Enable ancient block downloading download_old_blocks: bool, /// Shared private tx service. - private_tx_handler: Arc, + private_tx_handler: Option>, /// Enable warp sync. warp_sync: WarpSync, } @@ -636,7 +625,7 @@ impl ChainSync { pub fn new( config: SyncConfig, chain: &BlockChainClient, - private_tx_handler: Arc, + private_tx_handler: Option>, ) -> Self { let chain_info = chain.chain_info(); let best_block = chain.chain_info().best_block_number; @@ -963,7 +952,7 @@ impl ChainSync { if !have_latest && (higher_difficulty || force || self.state == SyncState::NewBlocks) { // check if got new blocks to download trace!(target: "sync", "Syncing with peer {}, force={}, td={:?}, our td={}, state={:?}", peer_id, force, peer_difficulty, syncing_difficulty, self.state); - if let Some(request) = self.new_blocks.request_blocks(io, num_active_peers) { + if let Some(request) = self.new_blocks.request_blocks(peer_id, io, num_active_peers) { SyncRequester::request_blocks(self, io, peer_id, request, BlockSet::NewBlocks); if self.state == SyncState::Idle { self.state = SyncState::Blocks; @@ -976,7 +965,7 @@ impl ChainSync { let equal_or_higher_difficulty = peer_difficulty.map_or(false, |pd| pd >= syncing_difficulty); if force || equal_or_higher_difficulty { - if let Some(request) = self.old_blocks.as_mut().and_then(|d| d.request_blocks(io, num_active_peers)) { + if let Some(request) = self.old_blocks.as_mut().and_then(|d| d.request_blocks(peer_id, io, num_active_peers)) { SyncRequester::request_blocks(self, io, peer_id, request, BlockSet::OldBlocks); return; } @@ -1120,9 +1109,11 @@ impl ChainSync { fn send_status(&mut self, io: &mut SyncIo, peer: PeerId) -> Result<(), network::Error> { let warp_protocol_version = io.protocol_version(&WARP_SYNC_PROTOCOL_ID, peer); let warp_protocol = warp_protocol_version != 0; + let private_tx_protocol = warp_protocol_version >= PAR_PROTOCOL_VERSION_3.0; let protocol = if warp_protocol { warp_protocol_version } else { ETH_PROTOCOL_VERSION_63.0 }; trace!(target: "sync", "Sending status to {}, protocol version {}", peer, protocol); - let mut packet = RlpStream::new_list(if warp_protocol { 7 } else { 5 }); + let mut packet = RlpStream::new(); + packet.begin_unbounded_list(); let chain = io.chain().chain_info(); packet.append(&(protocol as u32)); packet.append(&self.network_id); @@ -1135,8 +1126,12 @@ impl ChainSync { let manifest_hash = manifest.map_or(H256::new(), |m| keccak(m.into_rlp())); packet.append(&manifest_hash); packet.append(&block_number); + if private_tx_protocol { + packet.append(&self.private_tx_handler.is_some()); + } } - io.respond(STATUS_PACKET, packet.out()) + packet.complete_unbounded_list(); + io.respond(StatusPacket.id(), packet.out()) } pub fn maintain_peers(&mut self, io: &mut SyncIo) { @@ -1246,7 +1241,8 @@ impl ChainSync { fn get_private_transaction_peers(&self, transaction_hash: &H256) -> Vec { self.peers.iter().filter_map( |(id, p)| if p.protocol_version >= PAR_PROTOCOL_VERSION_3.0 - && !p.last_sent_private_transactions.contains(transaction_hash) { + && !p.last_sent_private_transactions.contains(transaction_hash) + && p.private_tx_enabled { Some(*id) } else { None @@ -1320,7 +1316,7 @@ impl ChainSync { } /// Broadcast private transaction message to peers. - pub fn propagate_private_transaction(&mut self, io: &mut SyncIo, transaction_hash: H256, packet_id: PacketId, packet: Bytes) { + pub fn propagate_private_transaction(&mut self, io: &mut SyncIo, transaction_hash: H256, packet_id: SyncPacket, packet: Bytes) { SyncPropagator::propagate_private_transaction(self, io, transaction_hash, packet_id, packet); } } @@ -1339,10 +1335,9 @@ pub mod tests { use super::*; use ::SyncConfig; use super::{PeerInfo, PeerAsking}; - use ethcore::header::*; use ethcore::client::{BlockChainClient, EachBlockWith, TestBlockChainClient, ChainInfo, BlockInfo}; use ethcore::miner::{MinerService, PendingOrdering}; - use private_tx::NoopPrivateTxHandler; + use types::header::Header; pub fn get_dummy_block(order: u32, parent_hash: H256) -> Bytes { let mut header = Header::new(); @@ -1426,7 +1421,7 @@ pub mod tests { } pub fn dummy_sync_with_peer(peer_latest_hash: H256, client: &BlockChainClient) -> ChainSync { - let mut sync = ChainSync::new(SyncConfig::default(), client, Arc::new(NoopPrivateTxHandler)); + let mut sync = ChainSync::new(SyncConfig::default(), client, None); insert_dummy_peer(&mut sync, 0, peer_latest_hash); sync } @@ -1446,11 +1441,13 @@ pub mod tests { last_sent_transactions: Default::default(), last_sent_private_transactions: Default::default(), expired: false, + private_tx_enabled: false, confirmation: super::ForkConfirmation::Confirmed, snapshot_number: None, snapshot_hash: None, asking_snapshot_data: None, block_set: None, + client_version: ClientVersion::from(""), }); } @@ -1599,4 +1596,3 @@ pub mod tests { assert_eq!(status.status.transaction_count, 0); } } - diff --git a/ethcore/sync/src/chain/propagator.rs b/ethcore/sync/src/chain/propagator.rs index 689ccfc02b1..c3654553ffd 100644 --- a/ethcore/sync/src/chain/propagator.rs +++ b/ethcore/sync/src/chain/propagator.rs @@ -1,31 +1,41 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . + +use std::cmp; +use std::collections::HashSet; use bytes::Bytes; use ethereum_types::H256; -use ethcore::client::BlockChainInfo; -use ethcore::header::BlockNumber; use fastmap::H256FastSet; -use network::{PeerId, PacketId}; +use network::client_version::ClientCapabilities; +use network::PeerId; use rand::Rng; use rlp::{Encodable, RlpStream}; use sync_io::SyncIo; -use std::cmp; -use std::collections::HashSet; -use transaction::SignedTransaction; +use types::transaction::SignedTransaction; +use types::BlockNumber; +use types::blockchain_info::BlockChainInfo; + +use super::sync_packet::SyncPacket; +use super::sync_packet::SyncPacket::{ + NewBlockHashesPacket, + TransactionsPacket, + NewBlockPacket, + ConsensusDataPacket, +}; use super::{ random, @@ -34,35 +44,8 @@ use super::{ MAX_PEER_LAG_PROPAGATION, MAX_PEERS_PROPAGATION, MIN_PEERS_PROPAGATION, - CONSENSUS_DATA_PACKET, - NEW_BLOCK_HASHES_PACKET, - NEW_BLOCK_PACKET, - TRANSACTIONS_PACKET, }; -/// Checks if peer is able to process service transactions -fn accepts_service_transaction(client_id: &str) -> bool { - // Parity versions starting from this will accept service-transactions - const SERVICE_TRANSACTIONS_VERSION: (u32, u32) = (1u32, 6u32); - // Parity client string prefix - const LEGACY_CLIENT_ID_PREFIX: &'static str = "Parity/v"; - const PARITY_CLIENT_ID_PREFIX: &'static str = "Parity-Ethereum/v"; - - let splitted = if client_id.starts_with(LEGACY_CLIENT_ID_PREFIX) { - client_id[LEGACY_CLIENT_ID_PREFIX.len()..].split('.') - } else if client_id.starts_with(PARITY_CLIENT_ID_PREFIX) { - client_id[PARITY_CLIENT_ID_PREFIX.len()..].split('.') - } else { - return false; - }; - - let ver: Vec = splitted - .take(2) - .filter_map(|s| s.parse().ok()) - .collect(); - ver.len() == 2 && (ver[0] > SERVICE_TRANSACTIONS_VERSION.0 || (ver[0] == SERVICE_TRANSACTIONS_VERSION.0 && ver[1] >= SERVICE_TRANSACTIONS_VERSION.1)) -} - /// The Chain Sync Propagator: propagates data to peers pub struct SyncPropagator; @@ -73,7 +56,8 @@ impl SyncPropagator { let sent = peers.len(); let mut send_packet = |io: &mut SyncIo, rlp: Bytes| { for peer_id in peers { - SyncPropagator::send_packet(io, *peer_id, NEW_BLOCK_PACKET, rlp.clone()); + SyncPropagator::send_packet(io, *peer_id, NewBlockPacket, rlp.clone()); + if let Some(ref mut peer) = sync.peers.get_mut(peer_id) { peer.latest_hash = chain_info.best_block_hash.clone(); } @@ -108,7 +92,7 @@ impl SyncPropagator { if let Some(ref mut peer) = sync.peers.get_mut(peer_id) { peer.latest_hash = best_block_hash; } - SyncPropagator::send_packet(io, *peer_id, NEW_BLOCK_HASHES_PACKET, rlp.clone()); + SyncPropagator::send_packet(io, *peer_id, NewBlockHashesPacket, rlp.clone()); } sent } @@ -145,7 +129,7 @@ impl SyncPropagator { // most of times service_transactions will be empty // => there's no need to merge packets if !service_transactions.is_empty() { - let service_transactions_peers = SyncPropagator::select_peers_for_transactions(sync, |peer_id| accepts_service_transaction(&io.peer_info(*peer_id))); + let service_transactions_peers = SyncPropagator::select_peers_for_transactions(sync, |peer_id| io.peer_version(*peer_id).accepts_service_transaction()); let service_transactions_affected_peers = SyncPropagator::propagate_transactions_to_peers( sync, io, service_transactions_peers, service_transactions, &mut should_continue ); @@ -176,7 +160,7 @@ impl SyncPropagator { let send_packet = |io: &mut SyncIo, peer_id: PeerId, sent: usize, rlp: Bytes| { let size = rlp.len(); - SyncPropagator::send_packet(io, peer_id, TRANSACTIONS_PACKET, rlp); + SyncPropagator::send_packet(io, peer_id, TransactionsPacket, rlp); trace!(target: "sync", "{:02} <- Transactions ({} entries; {} bytes)", peer_id, sent, size); }; @@ -295,7 +279,7 @@ impl SyncPropagator { io.chain().chain_info().total_difficulty ); for peer_id in &peers { - SyncPropagator::send_packet(io, *peer_id, NEW_BLOCK_PACKET, rlp.clone()); + SyncPropagator::send_packet(io, *peer_id, NewBlockPacket, rlp.clone()); } } } @@ -305,19 +289,23 @@ impl SyncPropagator { let lucky_peers = ChainSync::select_random_peers(&sync.get_consensus_peers()); trace!(target: "sync", "Sending consensus packet to {:?}", lucky_peers); for peer_id in lucky_peers { - SyncPropagator::send_packet(io, peer_id, CONSENSUS_DATA_PACKET, packet.clone()); + SyncPropagator::send_packet(io, peer_id, ConsensusDataPacket, packet.clone()); } } /// Broadcast private transaction message to peers. - pub fn propagate_private_transaction(sync: &mut ChainSync, io: &mut SyncIo, transaction_hash: H256, packet_id: PacketId, packet: Bytes) { + pub fn propagate_private_transaction(sync: &mut ChainSync, io: &mut SyncIo, transaction_hash: H256, packet_id: SyncPacket, packet: Bytes) { let lucky_peers = ChainSync::select_random_peers(&sync.get_private_transaction_peers(&transaction_hash)); - trace!(target: "sync", "Sending private transaction packet to {:?}", lucky_peers); - for peer_id in lucky_peers { - if let Some(ref mut peer) = sync.peers.get_mut(&peer_id) { - peer.last_sent_private_transactions.insert(transaction_hash); + if lucky_peers.is_empty() { + error!(target: "privatetx", "Cannot propagate the packet, no peers with private tx enabled connected"); + } else { + trace!(target: "privatetx", "Sending private transaction packet to {:?}", lucky_peers); + for peer_id in lucky_peers { + if let Some(ref mut peer) = sync.peers.get_mut(&peer_id) { + peer.last_sent_private_transactions.insert(transaction_hash); + } + SyncPropagator::send_packet(io, peer_id, packet_id, packet.clone()); } - SyncPropagator::send_packet(io, peer_id, packet_id, packet.clone()); } } @@ -337,7 +325,7 @@ impl SyncPropagator { } /// Generic packet sender - pub fn send_packet(sync: &mut SyncIo, peer_id: PeerId, packet_id: PacketId, packet: Bytes) { + pub fn send_packet(sync: &mut SyncIo, peer_id: PeerId, packet_id: SyncPacket, packet: Bytes) { if let Err(e) = sync.send(peer_id, packet_id, packet) { debug!(target:"sync", "Error sending packet: {:?}", e); sync.disconnect_peer(peer_id); @@ -349,7 +337,6 @@ impl SyncPropagator { mod tests { use ethcore::client::{BlockInfo, ChainInfo, EachBlockWith, TestBlockChainClient}; use parking_lot::RwLock; - use private_tx::NoopPrivateTxHandler; use rlp::{Rlp}; use std::collections::{VecDeque}; use tests::helpers::{TestIo}; @@ -425,7 +412,7 @@ mod tests { client.add_blocks(2, EachBlockWith::Uncle); let queue = RwLock::new(VecDeque::new()); let block = client.block(BlockId::Latest).unwrap().into_inner(); - let mut sync = ChainSync::new(SyncConfig::default(), &client, Arc::new(NoopPrivateTxHandler)); + let mut sync = ChainSync::new(SyncConfig::default(), &client, None); sync.peers.insert(0, PeerInfo { // Messaging protocol @@ -441,11 +428,13 @@ mod tests { last_sent_transactions: Default::default(), last_sent_private_transactions: Default::default(), expired: false, + private_tx_enabled: false, confirmation: ForkConfirmation::Confirmed, snapshot_number: None, snapshot_hash: None, asking_snapshot_data: None, block_set: None, + client_version: ClientVersion::from(""), }); let ss = TestSnapshotService::new(); let mut io = TestIo::new(&mut client, &ss, &queue, None); @@ -513,7 +502,7 @@ mod tests { client.add_blocks(100, EachBlockWith::Uncle); client.insert_transaction_to_queue(); // Sync with no peers - let mut sync = ChainSync::new(SyncConfig::default(), &client, Arc::new(NoopPrivateTxHandler)); + let mut sync = ChainSync::new(SyncConfig::default(), &client, None); let queue = RwLock::new(VecDeque::new()); let ss = TestSnapshotService::new(); let mut io = TestIo::new(&mut client, &ss, &queue, None); @@ -583,7 +572,7 @@ mod tests { let mut client = TestBlockChainClient::new(); client.insert_transaction_with_gas_price_to_queue(U256::zero()); let block_hash = client.block_hash_delta_minus(1); - let mut sync = ChainSync::new(SyncConfig::default(), &client, Arc::new(NoopPrivateTxHandler)); + let mut sync = ChainSync::new(SyncConfig::default(), &client, None); let queue = RwLock::new(VecDeque::new()); let ss = TestSnapshotService::new(); let mut io = TestIo::new(&mut client, &ss, &queue, None); @@ -593,20 +582,17 @@ mod tests { io.peers_info.insert(1, "Geth".to_owned()); // and peer#2 is Parity, accepting service transactions insert_dummy_peer(&mut sync, 2, block_hash); - io.peers_info.insert(2, "Parity-Ethereum/v2.6".to_owned()); - // and peer#3 is Parity, discarding service transactions + io.peers_info.insert(2, "Parity-Ethereum/v2.6.0/linux/rustc".to_owned()); + // and peer#3 is Parity, accepting service transactions insert_dummy_peer(&mut sync, 3, block_hash); - io.peers_info.insert(3, "Parity/v1.5".to_owned()); - // and peer#4 is Parity, accepting service transactions - insert_dummy_peer(&mut sync, 4, block_hash); - io.peers_info.insert(4, "Parity-Ethereum/v2.7.3-ABCDEFGH".to_owned()); + io.peers_info.insert(3, "Parity-Ethereum/ABCDEFGH/v2.7.3/linux/rustc".to_owned()); // and new service transaction is propagated to peers SyncPropagator::propagate_new_transactions(&mut sync, &mut io, || true); - // peer#2 && peer#4 are receiving service transaction + // peer#2 && peer#3 are receiving service transaction assert!(io.packets.iter().any(|p| p.packet_id == 0x02 && p.recipient == 2)); // TRANSACTIONS_PACKET - assert!(io.packets.iter().any(|p| p.packet_id == 0x02 && p.recipient == 4)); // TRANSACTIONS_PACKET + assert!(io.packets.iter().any(|p| p.packet_id == 0x02 && p.recipient == 3)); // TRANSACTIONS_PACKET assert_eq!(io.packets.len(), 2); } @@ -616,14 +602,14 @@ mod tests { let tx1_hash = client.insert_transaction_to_queue(); let tx2_hash = client.insert_transaction_with_gas_price_to_queue(U256::zero()); let block_hash = client.block_hash_delta_minus(1); - let mut sync = ChainSync::new(SyncConfig::default(), &client, Arc::new(NoopPrivateTxHandler)); + let mut sync = ChainSync::new(SyncConfig::default(), &client, None); let queue = RwLock::new(VecDeque::new()); let ss = TestSnapshotService::new(); let mut io = TestIo::new(&mut client, &ss, &queue, None); // when peer#1 is Parity, accepting service transactions insert_dummy_peer(&mut sync, 1, block_hash); - io.peers_info.insert(1, "Parity-Ethereum/v2.6".to_owned()); + io.peers_info.insert(1, "Parity-Ethereum/v2.6.0/linux/rustc".to_owned()); // and service + non-service transactions are propagated to peers SyncPropagator::propagate_new_transactions(&mut sync, &mut io, || true); diff --git a/ethcore/sync/src/chain/requester.rs b/ethcore/sync/src/chain/requester.rs index a85874d2927..31d3ce59006 100644 --- a/ethcore/sync/src/chain/requester.rs +++ b/ethcore/sync/src/chain/requester.rs @@ -1,39 +1,41 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use api::WARP_SYNC_PROTOCOL_ID; use block_sync::BlockRequest; use bytes::Bytes; -use ethcore::header::BlockNumber; use ethereum_types::H256; -use network::{PeerId, PacketId}; +use network::{PeerId}; use rlp::RlpStream; use std::time::Instant; use sync_io::SyncIo; +use types::BlockNumber; + +use super::sync_packet::SyncPacket; +use super::sync_packet::SyncPacket::{ + GetBlockHeadersPacket, + GetBlockBodiesPacket, + GetReceiptsPacket, + GetSnapshotManifestPacket, + GetSnapshotDataPacket, +}; use super::{ BlockSet, ChainSync, PeerAsking, - ETH_PROTOCOL_VERSION_63, - GET_BLOCK_BODIES_PACKET, - GET_BLOCK_HEADERS_PACKET, - GET_RECEIPTS_PACKET, - GET_SNAPSHOT_DATA_PACKET, - GET_SNAPSHOT_MANIFEST_PACKET, }; /// The Chain Sync Requester: requesting data to other peers @@ -62,7 +64,7 @@ impl SyncRequester { for h in &hashes { rlp.append(&h.clone()); } - SyncRequester::send_request(sync, io, peer_id, PeerAsking::BlockBodies, GET_BLOCK_BODIES_PACKET, rlp.out()); + SyncRequester::send_request(sync, io, peer_id, PeerAsking::BlockBodies, GetBlockBodiesPacket, rlp.out()); let peer = sync.peers.get_mut(&peer_id).expect("peer_id may originate either from on_packet, where it is already validated or from enumerating self.peers. qed"); peer.asking_blocks = hashes; peer.block_set = Some(set); @@ -76,7 +78,7 @@ impl SyncRequester { rlp.append(&1u32); rlp.append(&0u32); rlp.append(&0u32); - SyncRequester::send_request(sync, io, peer_id, PeerAsking::ForkHeader, GET_BLOCK_HEADERS_PACKET, rlp.out()); + SyncRequester::send_request(sync, io, peer_id, PeerAsking::ForkHeader, GetBlockHeadersPacket, rlp.out()); } /// Find some headers or blocks to download for a peer. @@ -94,7 +96,7 @@ impl SyncRequester { pub fn request_snapshot_manifest(sync: &mut ChainSync, io: &mut SyncIo, peer_id: PeerId) { trace!(target: "sync", "{} <- GetSnapshotManifest", peer_id); let rlp = RlpStream::new_list(0); - SyncRequester::send_request(sync, io, peer_id, PeerAsking::SnapshotManifest, GET_SNAPSHOT_MANIFEST_PACKET, rlp.out()); + SyncRequester::send_request(sync, io, peer_id, PeerAsking::SnapshotManifest, GetSnapshotManifestPacket, rlp.out()); } /// Request headers from a peer by block hash @@ -105,7 +107,7 @@ impl SyncRequester { rlp.append(&count); rlp.append(&skip); rlp.append(&if reverse {1u32} else {0u32}); - SyncRequester::send_request(sync, io, peer_id, PeerAsking::BlockHeaders, GET_BLOCK_HEADERS_PACKET, rlp.out()); + SyncRequester::send_request(sync, io, peer_id, PeerAsking::BlockHeaders, GetBlockHeadersPacket, rlp.out()); let peer = sync.peers.get_mut(&peer_id).expect("peer_id may originate either from on_packet, where it is already validated or from enumerating self.peers. qed"); peer.asking_hash = Some(h.clone()); peer.block_set = Some(set); @@ -118,7 +120,7 @@ impl SyncRequester { for h in &hashes { rlp.append(&h.clone()); } - SyncRequester::send_request(sync, io, peer_id, PeerAsking::BlockReceipts, GET_RECEIPTS_PACKET, rlp.out()); + SyncRequester::send_request(sync, io, peer_id, PeerAsking::BlockReceipts, GetReceiptsPacket, rlp.out()); let peer = sync.peers.get_mut(&peer_id).expect("peer_id may originate either from on_packet, where it is already validated or from enumerating self.peers. qed"); peer.asking_blocks = hashes; peer.block_set = Some(set); @@ -129,23 +131,20 @@ impl SyncRequester { trace!(target: "sync", "{} <- GetSnapshotData {:?}", peer_id, chunk); let mut rlp = RlpStream::new_list(1); rlp.append(chunk); - SyncRequester::send_request(sync, io, peer_id, PeerAsking::SnapshotData, GET_SNAPSHOT_DATA_PACKET, rlp.out()); + SyncRequester::send_request(sync, io, peer_id, PeerAsking::SnapshotData, GetSnapshotDataPacket, rlp.out()); } /// Generic request sender - fn send_request(sync: &mut ChainSync, io: &mut SyncIo, peer_id: PeerId, asking: PeerAsking, packet_id: PacketId, packet: Bytes) { + fn send_request(sync: &mut ChainSync, io: &mut SyncIo, peer_id: PeerId, asking: PeerAsking, packet_id: SyncPacket, packet: Bytes) { if let Some(ref mut peer) = sync.peers.get_mut(&peer_id) { if peer.asking != PeerAsking::Nothing { warn!(target:"sync", "Asking {:?} while requesting {:?}", peer.asking, asking); } peer.asking = asking; peer.ask_time = Instant::now(); - // TODO [ToDr] This seems quite fragile. Be careful when protocol is updated. - let result = if packet_id >= ETH_PROTOCOL_VERSION_63.1 { - io.send_protocol(WARP_SYNC_PROTOCOL_ID, peer_id, packet_id, packet) - } else { - io.send(peer_id, packet_id, packet) - }; + + let result = io.send(peer_id, packet_id, packet); + if let Err(e) = result { debug!(target:"sync", "Error sending request: {:?}", e); io.disconnect_peer(peer_id); diff --git a/ethcore/sync/src/chain/supplier.rs b/ethcore/sync/src/chain/supplier.rs index eaee584cad0..7e71e6aeec7 100644 --- a/ethcore/sync/src/chain/supplier.rs +++ b/ethcore/sync/src/chain/supplier.rs @@ -1,55 +1,59 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use bytes::Bytes; -use ethcore::client::BlockId; -use ethcore::header::BlockNumber; +use enum_primitive::FromPrimitive; use ethereum_types::H256; use network::{self, PeerId}; use parking_lot::RwLock; use rlp::{Rlp, RlpStream}; use std::cmp; +use types::BlockNumber; +use types::ids::BlockId; use sync_io::SyncIo; +use super::sync_packet::{PacketInfo, SyncPacket}; +use super::sync_packet::SyncPacket::{ + StatusPacket, + TransactionsPacket, + GetBlockHeadersPacket, + BlockHeadersPacket, + GetBlockBodiesPacket, + BlockBodiesPacket, + GetNodeDataPacket, + NodeDataPacket, + GetReceiptsPacket, + ReceiptsPacket, + GetSnapshotManifestPacket, + SnapshotManifestPacket, + GetSnapshotDataPacket, + SnapshotDataPacket, + ConsensusDataPacket, +}; + use super::{ ChainSync, SyncHandler, RlpResponseResult, PacketDecodeError, - BLOCK_BODIES_PACKET, - BLOCK_HEADERS_PACKET, - CONSENSUS_DATA_PACKET, - GET_BLOCK_BODIES_PACKET, - GET_BLOCK_HEADERS_PACKET, - GET_NODE_DATA_PACKET, - GET_RECEIPTS_PACKET, - GET_SNAPSHOT_DATA_PACKET, - GET_SNAPSHOT_MANIFEST_PACKET, MAX_BODIES_TO_SEND, MAX_HEADERS_TO_SEND, MAX_NODE_DATA_TO_SEND, MAX_RECEIPTS_HEADERS_TO_SEND, - MAX_RECEIPTS_TO_SEND, - NODE_DATA_PACKET, - RECEIPTS_PACKET, - SNAPSHOT_DATA_PACKET, - SNAPSHOT_MANIFEST_PACKET, - STATUS_PACKET, - TRANSACTIONS_PACKET, }; /// The Chain Sync Supplier: answers requests from peers with available data @@ -57,76 +61,88 @@ pub struct SyncSupplier; impl SyncSupplier { /// Dispatch incoming requests and responses + // Take a u8 and not a SyncPacketId because this is the entry point + // to chain sync from the outside world. pub fn dispatch_packet(sync: &RwLock, io: &mut SyncIo, peer: PeerId, packet_id: u8, data: &[u8]) { let rlp = Rlp::new(data); - let result = match packet_id { - GET_BLOCK_BODIES_PACKET => SyncSupplier::return_rlp(io, &rlp, peer, - SyncSupplier::return_block_bodies, - |e| format!("Error sending block bodies: {:?}", e)), - - GET_BLOCK_HEADERS_PACKET => SyncSupplier::return_rlp(io, &rlp, peer, - SyncSupplier::return_block_headers, - |e| format!("Error sending block headers: {:?}", e)), - - GET_RECEIPTS_PACKET => SyncSupplier::return_rlp(io, &rlp, peer, - SyncSupplier::return_receipts, - |e| format!("Error sending receipts: {:?}", e)), - - GET_NODE_DATA_PACKET => SyncSupplier::return_rlp(io, &rlp, peer, - SyncSupplier::return_node_data, - |e| format!("Error sending nodes: {:?}", e)), - - GET_SNAPSHOT_MANIFEST_PACKET => SyncSupplier::return_rlp(io, &rlp, peer, - SyncSupplier::return_snapshot_manifest, - |e| format!("Error sending snapshot manifest: {:?}", e)), - - GET_SNAPSHOT_DATA_PACKET => SyncSupplier::return_rlp(io, &rlp, peer, - SyncSupplier::return_snapshot_data, - |e| format!("Error sending snapshot data: {:?}", e)), - - STATUS_PACKET => { - sync.write().on_packet(io, peer, packet_id, data); - Ok(()) - }, - // Packets that require the peer to be confirmed - _ => { - if !sync.read().peers.contains_key(&peer) { - debug!(target:"sync", "Unexpected packet {} from unregistered peer: {}:{}", packet_id, peer, io.peer_info(peer)); - return; - } - debug!(target: "sync", "{} -> Dispatching packet: {}", peer, packet_id); - - match packet_id { - CONSENSUS_DATA_PACKET => { - SyncHandler::on_consensus_packet(io, peer, &rlp) - }, - TRANSACTIONS_PACKET => { - let res = { - let sync_ro = sync.read(); - SyncHandler::on_peer_transactions(&*sync_ro, io, peer, &rlp) - }; - if res.is_err() { - // peer sent invalid data, disconnect. - io.disable_peer(peer); - sync.write().deactivate_peer(io, peer); + if let Some(id) = SyncPacket::from_u8(packet_id) { + let result = match id { + GetBlockBodiesPacket => SyncSupplier::return_rlp( + io, &rlp, peer, + SyncSupplier::return_block_bodies, + |e| format!("Error sending block bodies: {:?}", e)), + + GetBlockHeadersPacket => SyncSupplier::return_rlp( + io, &rlp, peer, + SyncSupplier::return_block_headers, + |e| format!("Error sending block headers: {:?}", e)), + + GetReceiptsPacket => SyncSupplier::return_rlp( + io, &rlp, peer, + SyncSupplier::return_receipts, + |e| format!("Error sending receipts: {:?}", e)), + + GetNodeDataPacket => SyncSupplier::return_rlp( + io, &rlp, peer, + SyncSupplier::return_node_data, + |e| format!("Error sending nodes: {:?}", e)), + + GetSnapshotManifestPacket => SyncSupplier::return_rlp( + io, &rlp, peer, + SyncSupplier::return_snapshot_manifest, + |e| format!("Error sending snapshot manifest: {:?}", e)), + + GetSnapshotDataPacket => SyncSupplier::return_rlp( + io, &rlp, peer, + SyncSupplier::return_snapshot_data, + |e| format!("Error sending snapshot data: {:?}", e)), + + StatusPacket => { + sync.write().on_packet(io, peer, packet_id, data); + Ok(()) + }, + // Packets that require the peer to be confirmed + _ => { + if !sync.read().peers.contains_key(&peer) { + debug!(target:"sync", "Unexpected packet {} from unregistered peer: {}:{}", packet_id, peer, io.peer_version(peer)); + return; + } + debug!(target: "sync", "{} -> Dispatching packet: {}", peer, packet_id); + + match id { + ConsensusDataPacket => { + SyncHandler::on_consensus_packet(io, peer, &rlp) + }, + TransactionsPacket => { + let res = { + let sync_ro = sync.read(); + SyncHandler::on_peer_transactions(&*sync_ro, io, peer, &rlp) + }; + if res.is_err() { + // peer sent invalid data, disconnect. + io.disable_peer(peer); + sync.write().deactivate_peer(io, peer); + } + }, + _ => { + sync.write().on_packet(io, peer, packet_id, data); } - }, - _ => { - sync.write().on_packet(io, peer, packet_id, data); } + + Ok(()) } + }; - Ok(()) - } - }; - result.unwrap_or_else(|e| { - debug!(target:"sync", "{} -> Malformed packet {} : {}", peer, packet_id, e); - }) + result.unwrap_or_else(|e| { + debug!(target:"sync", "{} -> Malformed packet {} : {}", peer, packet_id, e); + }) + } } /// Respond to GetBlockHeaders request fn return_block_headers(io: &SyncIo, r: &Rlp, peer_id: PeerId) -> RlpResponseResult { + let payload_soft_limit = io.payload_soft_limit(); // Packet layout: // [ block: { P , B_32 }, maxHeaders: P, skip: P, reverse: P in { 0 , 1 } ] let max_headers: usize = r.val_at(1)?; @@ -148,11 +164,11 @@ impl SyncSupplier { trace!(target:"sync", "Returning single header: {:?}", hash); let mut rlp = RlpStream::new_list(1); rlp.append_raw(&hdr.into_inner(), 1); - return Ok(Some((BLOCK_HEADERS_PACKET, rlp))); + return Ok(Some((BlockHeadersPacket.id(), rlp))); } number } - None => return Ok(Some((BLOCK_HEADERS_PACKET, RlpStream::new_list(0)))) //no such header, return nothing + None => return Ok(Some((BlockHeadersPacket.id(), RlpStream::new_list(0)))) //no such header, return nothing } } else { let number = r.val_at::(0)?; @@ -182,6 +198,10 @@ impl SyncSupplier { } else if let Some(hdr) = io.chain().block_header(BlockId::Number(number)) { data.append(&mut hdr.into_inner()); count += 1; + // Check that the packet won't be oversized + if data.len() > payload_soft_limit { + break; + } } else { // No required block. break; @@ -198,11 +218,12 @@ impl SyncSupplier { let mut rlp = RlpStream::new_list(count as usize); rlp.append_raw(&data, count as usize); trace!(target: "sync", "{} -> GetBlockHeaders: returned {} entries", peer_id, count); - Ok(Some((BLOCK_HEADERS_PACKET, rlp))) + Ok(Some((BlockHeadersPacket.id(), rlp))) } /// Respond to GetBlockBodies request fn return_block_bodies(io: &SyncIo, r: &Rlp, peer_id: PeerId) -> RlpResponseResult { + let payload_soft_limit = io.payload_soft_limit(); let mut count = r.item_count().unwrap_or(0); if count == 0 { debug!(target: "sync", "Empty GetBlockBodies request, ignoring."); @@ -215,16 +236,21 @@ impl SyncSupplier { if let Some(body) = io.chain().block_body(BlockId::Hash(r.val_at::(i)?)) { data.append(&mut body.into_inner()); added += 1; + // Check that the packet won't be oversized + if data.len() > payload_soft_limit { + break; + } } } let mut rlp = RlpStream::new_list(added); rlp.append_raw(&data, added); trace!(target: "sync", "{} -> GetBlockBodies: returned {} entries", peer_id, added); - Ok(Some((BLOCK_BODIES_PACKET, rlp))) + Ok(Some((BlockBodiesPacket.id(), rlp))) } /// Respond to GetNodeData request fn return_node_data(io: &SyncIo, r: &Rlp, peer_id: PeerId) -> RlpResponseResult { + let payload_soft_limit = io.payload_soft_limit(); let mut count = r.item_count().unwrap_or(0); trace!(target: "sync", "{} -> GetNodeData: {} entries", peer_id, count); if count == 0 { @@ -234,8 +260,14 @@ impl SyncSupplier { count = cmp::min(count, MAX_NODE_DATA_TO_SEND); let mut added = 0usize; let mut data = Vec::new(); + let mut total_bytes = 0; for i in 0..count { if let Some(node) = io.chain().state_data(&r.val_at::(i)?) { + total_bytes += node.len(); + // Check that the packet won't be oversized + if total_bytes > payload_soft_limit { + break; + } data.push(node); added += 1; } @@ -245,10 +277,11 @@ impl SyncSupplier { for d in data { rlp.append(&d); } - Ok(Some((NODE_DATA_PACKET, rlp))) + Ok(Some((NodeDataPacket.id(), rlp))) } fn return_receipts(io: &SyncIo, rlp: &Rlp, peer_id: PeerId) -> RlpResponseResult { + let payload_soft_limit = io.payload_soft_limit(); let mut count = rlp.item_count().unwrap_or(0); trace!(target: "sync", "{} -> GetReceipts: {} entries", peer_id, count); if count == 0 { @@ -257,20 +290,20 @@ impl SyncSupplier { } count = cmp::min(count, MAX_RECEIPTS_HEADERS_TO_SEND); let mut added_headers = 0usize; - let mut added_receipts = 0usize; let mut data = Bytes::new(); + let mut total_bytes = 0; for i in 0..count { if let Some(receipts) = io.chain().block_receipts(&rlp.val_at::(i)?) { let mut receipts_bytes = ::rlp::encode(&receipts); + total_bytes += receipts_bytes.len(); + if total_bytes > payload_soft_limit { break; } data.append(&mut receipts_bytes); - added_receipts += receipts_bytes.len(); added_headers += 1; - if added_receipts > MAX_RECEIPTS_TO_SEND { break; } } } let mut rlp_result = RlpStream::new_list(added_headers); rlp_result.append_raw(&data, added_headers); - Ok(Some((RECEIPTS_PACKET, rlp_result))) + Ok(Some((ReceiptsPacket.id(), rlp_result))) } /// Respond to GetSnapshotManifest request @@ -293,7 +326,7 @@ impl SyncSupplier { RlpStream::new_list(0) } }; - Ok(Some((SNAPSHOT_MANIFEST_PACKET, rlp))) + Ok(Some((SnapshotManifestPacket.id(), rlp))) } /// Respond to GetSnapshotData request @@ -312,7 +345,7 @@ impl SyncSupplier { RlpStream::new_list(0) } }; - Ok(Some((SNAPSHOT_DATA_PACKET, rlp))) + Ok(Some((SnapshotDataPacket.id(), rlp))) } fn return_rlp(io: &mut SyncIo, rlp: &Rlp, peer: PeerId, rlp_func: FRlp, error_func: FError) -> Result<(), PacketDecodeError> @@ -410,6 +443,42 @@ mod test { assert_eq!(to_header_vec(result), vec![headers[50].clone(), headers[44].clone(), headers[38].clone()]); } + #[test] + fn respect_packet_limit() { + let small_num_blocks = 10; + let large_num_blocks = 50; + let tx_per_block = 100; + + let mut client = TestBlockChainClient::new(); + client.add_blocks(large_num_blocks, EachBlockWith::Transactions(tx_per_block)); + + let mut small_rlp_request = RlpStream::new_list(small_num_blocks); + let mut large_rlp_request = RlpStream::new_list(large_num_blocks); + + for i in 0..small_num_blocks { + let hash: H256 = client.block_hash(BlockId::Number(i as u64)).unwrap(); + small_rlp_request.append(&hash); + large_rlp_request.append(&hash); + } + + for i in small_num_blocks..large_num_blocks { + let hash: H256 = client.block_hash(BlockId::Number(i as u64)).unwrap(); + large_rlp_request.append(&hash); + } + + let queue = RwLock::new(VecDeque::new()); + let ss = TestSnapshotService::new(); + let io = TestIo::new(&mut client, &ss, &queue, None); + + let small_result = SyncSupplier::return_block_bodies(&io, &Rlp::new(&small_rlp_request.out()), 0); + let small_result = small_result.unwrap().unwrap().1; + assert_eq!(Rlp::new(&small_result.out()).item_count().unwrap(), small_num_blocks); + + let large_result = SyncSupplier::return_block_bodies(&io, &Rlp::new(&large_rlp_request.out()), 0); + let large_result = large_result.unwrap().unwrap().1; + assert!(Rlp::new(&large_result.out()).item_count().unwrap() < large_num_blocks); + } + #[test] fn return_nodes() { let mut client = TestBlockChainClient::new(); @@ -438,7 +507,7 @@ mod test { io.sender = Some(2usize); - SyncSupplier::dispatch_packet(&RwLock::new(sync), &mut io, 0usize, GET_NODE_DATA_PACKET, &node_request); + SyncSupplier::dispatch_packet(&RwLock::new(sync), &mut io, 0usize, GetNodeDataPacket.id(), &node_request); assert_eq!(1, io.packets.len()); } @@ -480,7 +549,7 @@ mod test { assert_eq!(603, rlp_result.unwrap().1.out().len()); io.sender = Some(2usize); - SyncSupplier::dispatch_packet(&RwLock::new(sync), &mut io, 0usize, GET_RECEIPTS_PACKET, &receipts_request); + SyncSupplier::dispatch_packet(&RwLock::new(sync), &mut io, 0usize, GetReceiptsPacket.id(), &receipts_request); assert_eq!(1, io.packets.len()); } } diff --git a/ethcore/sync/src/chain/sync_packet.rs b/ethcore/sync/src/chain/sync_packet.rs new file mode 100644 index 00000000000..3891090f65e --- /dev/null +++ b/ethcore/sync/src/chain/sync_packet.rs @@ -0,0 +1,141 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +//! When sending packets over p2p we specify both which subprotocol +//! to use and what kind of packet we are sending (through a packet id). +//! Likewise when receiving packets from other peers we decode the +//! subprotocol and the packet id. This module helps coupling both +//! pieces of information together and provides an easy mechanism +//! to convert to/from the packet id values transmitted over the +//! wire. + +use api::{ETH_PROTOCOL, WARP_SYNC_PROTOCOL_ID}; +use network::{PacketId, ProtocolId}; + +/// An enum that defines all known packet ids in the context of +/// synchronization and provides a mechanism to convert from +/// packet ids (of type PacketId or u8) directly read from the network +/// to enum variants. This implicitly provides a mechanism to +/// check whether a given packet id is known, and to prevent +/// packet id clashes when defining new ids. +enum_from_primitive! { +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum SyncPacket { + StatusPacket = 0x00, + NewBlockHashesPacket = 0x01, + TransactionsPacket = 0x02, + GetBlockHeadersPacket = 0x03, + BlockHeadersPacket = 0x04, + GetBlockBodiesPacket = 0x05, + BlockBodiesPacket = 0x06, + NewBlockPacket = 0x07, + + GetNodeDataPacket = 0x0d, + NodeDataPacket = 0x0e, + GetReceiptsPacket = 0x0f, + ReceiptsPacket = 0x10, + + GetSnapshotManifestPacket = 0x11, + SnapshotManifestPacket = 0x12, + GetSnapshotDataPacket = 0x13, + SnapshotDataPacket = 0x14, + ConsensusDataPacket = 0x15, + PrivateTransactionPacket = 0x16, + SignedPrivateTransactionPacket = 0x17, +} +} + +use self::SyncPacket::*; + +/// Provide both subprotocol and packet id information within the +/// same object. +pub trait PacketInfo { + fn id(&self) -> PacketId; + fn protocol(&self) -> ProtocolId; +} + +// The mechanism to match packet ids and protocol may be improved +// through some macro magic, but for now this works. +impl PacketInfo for SyncPacket { + fn protocol(&self) -> ProtocolId { + match self { + StatusPacket | + NewBlockHashesPacket | + TransactionsPacket | + GetBlockHeadersPacket | + BlockHeadersPacket | + GetBlockBodiesPacket | + BlockBodiesPacket | + NewBlockPacket | + + GetNodeDataPacket| + NodeDataPacket | + GetReceiptsPacket | + ReceiptsPacket + + => ETH_PROTOCOL, + + GetSnapshotManifestPacket| + SnapshotManifestPacket | + GetSnapshotDataPacket | + SnapshotDataPacket | + ConsensusDataPacket | + PrivateTransactionPacket | + SignedPrivateTransactionPacket + + => WARP_SYNC_PROTOCOL_ID, + } + } + + fn id(&self) -> PacketId { + (*self) as PacketId + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + use enum_primitive::FromPrimitive; + + #[test] + fn packet_ids_from_u8_when_from_primitive_zero_then_equals_status_packet() { + assert_eq!(SyncPacket::from_u8(0x00), Some(StatusPacket)); + } + + #[test] + fn packet_ids_from_u8_when_from_primitive_eleven_then_equals_get_snapshot_manifest_packet() { + assert_eq!(SyncPacket::from_u8(0x11), Some(GetSnapshotManifestPacket)); + } + + #[test] + fn packet_ids_from_u8_when_invalid_packet_id_then_none() { + assert!(SyncPacket::from_u8(0x99).is_none()); + } + + #[test] + fn when_status_packet_then_id_and_protocol_match() { + assert_eq!(StatusPacket.id(), StatusPacket as PacketId); + assert_eq!(StatusPacket.protocol(), ETH_PROTOCOL); + } + + #[test] + fn when_consensus_data_packet_then_id_and_protocol_match() { + assert_eq!(ConsensusDataPacket.id(), ConsensusDataPacket as PacketId); + assert_eq!(ConsensusDataPacket.protocol(), WARP_SYNC_PROTOCOL_ID); + } +} diff --git a/ethcore/sync/src/lib.rs b/ethcore/sync/src/lib.rs index 294ba0cd781..8a1e19569a4 100644 --- a/ethcore/sync/src/lib.rs +++ b/ethcore/sync/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . #![warn(missing_docs)] @@ -22,28 +22,30 @@ //! extern crate common_types as types; +extern crate ethcore; +extern crate ethcore_io as io; extern crate ethcore_network as network; extern crate ethcore_network_devp2p as devp2p; -extern crate parity_bytes as bytes; -extern crate ethcore_io as io; -extern crate ethcore_transaction as transaction; -extern crate ethcore; extern crate ethereum_types; -extern crate env_logger; +extern crate ethkey; +extern crate ethstore; extern crate fastmap; -extern crate rand; +extern crate keccak_hash as hash; +extern crate parity_bytes as bytes; extern crate parking_lot; +extern crate rand; extern crate rlp; -extern crate keccak_hash as hash; extern crate triehash_ethereum; extern crate ethcore_light as light; -#[cfg(test)] extern crate ethkey; +#[cfg(test)] extern crate env_logger; +#[cfg(test)] extern crate ethcore_private_tx; #[cfg(test)] extern crate kvdb_memorydb; #[cfg(test)] extern crate rustc_hex; -#[cfg(test)] extern crate ethcore_private_tx; +#[macro_use] +extern crate enum_primitive; #[macro_use] extern crate macros; #[macro_use] diff --git a/ethcore/sync/src/light_sync/mod.rs b/ethcore/sync/src/light_sync/mod.rs index cda250f12ea..dae05c3188a 100644 --- a/ethcore/sync/src/light_sync/mod.rs +++ b/ethcore/sync/src/light_sync/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Light client synchronization. //! @@ -38,7 +38,7 @@ use std::ops::Deref; use std::sync::Arc; use std::time::{Instant, Duration}; -use ethcore::encoded; +use types::encoded; use light::client::{AsLightClient, LightChainClient}; use light::net::{ PeerStatus, Announcement, Handler, BasicContext, diff --git a/ethcore/sync/src/light_sync/response.rs b/ethcore/sync/src/light_sync/response.rs index c3175d6e9d0..96d2a8822e9 100644 --- a/ethcore/sync/src/light_sync/response.rs +++ b/ethcore/sync/src/light_sync/response.rs @@ -1,22 +1,22 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Helpers for decoding and verifying responses for headers. -use ethcore::{encoded, header::Header}; +use types::{encoded, header::Header}; use ethereum_types::H256; use light::request::{HashOrNumber, CompleteHeadersRequest as HeadersRequest}; use rlp::DecoderError; @@ -153,8 +153,8 @@ impl Constraint for Max { #[cfg(test)] mod tests { - use ethcore::encoded; - use ethcore::header::Header; + use types::encoded; + use types::header::Header; use light::request::CompleteHeadersRequest as HeadersRequest; use super::*; diff --git a/ethcore/sync/src/light_sync/sync_round.rs b/ethcore/sync/src/light_sync/sync_round.rs index 71c4cdb5bdd..7c2a2bc0169 100644 --- a/ethcore/sync/src/light_sync/sync_round.rs +++ b/ethcore/sync/src/light_sync/sync_round.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Header download state machine. @@ -20,8 +20,8 @@ use std::cmp::Ordering; use std::collections::{BinaryHeap, HashMap, HashSet, VecDeque}; use std::fmt; -use ethcore::encoded; -use ethcore::header::Header; +use types::encoded; +use types::header::Header; use light::net::ReqId; use light::request::CompleteHeadersRequest as HeadersRequest; diff --git a/ethcore/sync/src/light_sync/tests/mod.rs b/ethcore/sync/src/light_sync/tests/mod.rs index e3d46188a65..9bfb99ed0d9 100644 --- a/ethcore/sync/src/light_sync/tests/mod.rs +++ b/ethcore/sync/src/light_sync/tests/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use tests::helpers::TestNet; diff --git a/ethcore/sync/src/light_sync/tests/test_net.rs b/ethcore/sync/src/light_sync/tests/test_net.rs index e843e97dd0c..74567c11925 100644 --- a/ethcore/sync/src/light_sync/tests/test_net.rs +++ b/ethcore/sync/src/light_sync/tests/test_net.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! TestNet peer definition. diff --git a/ethcore/sync/src/private_tx.rs b/ethcore/sync/src/private_tx.rs index 03928c22d6f..c9396af5b4b 100644 --- a/ethcore/sync/src/private_tx.rs +++ b/ethcore/sync/src/private_tx.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use parking_lot::Mutex; use ethereum_types::H256; diff --git a/ethcore/sync/src/snapshot.rs b/ethcore/sync/src/snapshot.rs index c7f0d284f39..64e463c7b25 100644 --- a/ethcore/sync/src/snapshot.rs +++ b/ethcore/sync/src/snapshot.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethcore::snapshot::{ManifestData, SnapshotService}; use ethereum_types::H256; diff --git a/ethcore/sync/src/sync_io.rs b/ethcore/sync/src/sync_io.rs index a5e9f7b2f44..56bf98ab2ee 100644 --- a/ethcore/sync/src/sync_io.rs +++ b/ethcore/sync/src/sync_io.rs @@ -1,24 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::HashMap; +use chain::sync_packet::{PacketInfo, SyncPacket}; use network::{NetworkContext, PeerId, PacketId, Error, SessionInfo, ProtocolId}; +use network::client_version::ClientVersion; use bytes::Bytes; use ethcore::client::BlockChainClient; -use ethcore::header::BlockNumber; +use types::BlockNumber; use ethcore::snapshot::SnapshotService; use parking_lot::RwLock; @@ -32,17 +34,15 @@ pub trait SyncIo { fn disconnect_peer(&mut self, peer_id: PeerId); /// Respond to current request with a packet. Can be called from an IO handler for incoming packet. fn respond(&mut self, packet_id: PacketId, data: Vec) -> Result<(), Error>; - /// Send a packet to a peer. - fn send(&mut self, peer_id: PeerId, packet_id: PacketId, data: Vec) -> Result<(), Error>; /// Send a packet to a peer using specified protocol. - fn send_protocol(&mut self, protocol: ProtocolId, peer_id: PeerId, packet_id: PacketId, data: Vec) -> Result<(), Error>; + fn send(&mut self, peer_id: PeerId, packet_id: SyncPacket, data: Vec) -> Result<(), Error>; /// Get the blockchain fn chain(&self) -> &BlockChainClient; /// Get the snapshot service. fn snapshot_service(&self) -> &SnapshotService; - /// Returns peer identifier string - fn peer_info(&self, peer_id: PeerId) -> String { - peer_id.to_string() + /// Returns peer version identifier + fn peer_version(&self, peer_id: PeerId) -> ClientVersion { + ClientVersion::from(peer_id.to_string()) } /// Returns information on p2p session fn peer_session_info(&self, peer_id: PeerId) -> Option; @@ -58,6 +58,8 @@ pub trait SyncIo { fn is_expired(&self) -> bool; /// Return sync overlay fn chain_overlay(&self) -> &RwLock>; + /// Returns the size the payload shouldn't exceed + fn payload_soft_limit(&self) -> usize; } /// Wraps `NetworkContext` and the blockchain client @@ -96,12 +98,8 @@ impl<'s> SyncIo for NetSyncIo<'s> { self.network.respond(packet_id, data) } - fn send(&mut self, peer_id: PeerId, packet_id: PacketId, data: Vec) -> Result<(), Error>{ - self.network.send(peer_id, packet_id, data) - } - - fn send_protocol(&mut self, protocol: ProtocolId, peer_id: PeerId, packet_id: PacketId, data: Vec) -> Result<(), Error>{ - self.network.send_protocol(protocol, peer_id, packet_id, data) + fn send(&mut self, peer_id: PeerId, packet_id: SyncPacket, data: Vec) -> Result<(), Error>{ + self.network.send_protocol(packet_id.protocol(), peer_id, packet_id.id(), data) } fn chain(&self) -> &BlockChainClient { @@ -132,7 +130,11 @@ impl<'s> SyncIo for NetSyncIo<'s> { self.network.protocol_version(*protocol, peer_id).unwrap_or(0) } - fn peer_info(&self, peer_id: PeerId) -> String { + fn peer_version(&self, peer_id: PeerId) -> ClientVersion { self.network.peer_client_version(peer_id) } + + fn payload_soft_limit(&self) -> usize { + self.network.payload_soft_limit() + } } diff --git a/ethcore/sync/src/tests/chain.rs b/ethcore/sync/src/tests/chain.rs index 06118df66b5..d81a876d7a8 100644 --- a/ethcore/sync/src/tests/chain.rs +++ b/ethcore/sync/src/tests/chain.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use ethcore::client::{TestBlockChainClient, BlockChainClient, BlockId, EachBlockWith, ChainInfo, BlockInfo}; diff --git a/ethcore/sync/src/tests/consensus.rs b/ethcore/sync/src/tests/consensus.rs index 4a6871d16b3..df093663383 100644 --- a/ethcore/sync/src/tests/consensus.rs +++ b/ethcore/sync/src/tests/consensus.rs @@ -1,29 +1,29 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use hash::keccak; use ethereum_types::{U256, Address}; use io::{IoHandler, IoChannel}; use ethcore::client::{ChainInfo, ClientIoMessage}; +use ethcore::engines; use ethcore::spec::Spec; -use ethcore::miner::MinerService; -use ethcore::account_provider::AccountProvider; +use ethcore::miner::{self, MinerService}; use ethkey::{KeyPair, Secret}; -use transaction::{Action, PendingTransaction, Transaction}; +use types::transaction::{Action, PendingTransaction, Transaction}; use super::helpers::*; use SyncConfig; @@ -43,17 +43,14 @@ fn new_tx(secret: &Secret, nonce: U256, chain_id: u64) -> PendingTransaction { fn authority_round() { let s0 = KeyPair::from_secret_slice(&keccak("1")).unwrap(); let s1 = KeyPair::from_secret_slice(&keccak("0")).unwrap(); - let ap = Arc::new(AccountProvider::transient_provider()); - ap.insert_account(s0.secret().clone(), &"".into()).unwrap(); - ap.insert_account(s1.secret().clone(), &"".into()).unwrap(); let chain_id = Spec::new_test_round().chain_id(); - let mut net = TestNet::with_spec_and_accounts(2, SyncConfig::default(), Spec::new_test_round, Some(ap)); + let mut net = TestNet::with_spec(2, SyncConfig::default(), Spec::new_test_round); let io_handler0: Arc> = Arc::new(TestIoHandler::new(net.peer(0).chain.clone())); let io_handler1: Arc> = Arc::new(TestIoHandler::new(net.peer(1).chain.clone())); // Push transaction to both clients. Only one of them gets lucky to produce a block. - net.peer(0).miner.set_author(s0.address(), Some("".into())).unwrap(); - net.peer(1).miner.set_author(s1.address(), Some("".into())).unwrap(); + net.peer(0).miner.set_author(miner::Author::Sealer(engines::signer::from_keypair(s0.clone()))); + net.peer(1).miner.set_author(miner::Author::Sealer(engines::signer::from_keypair(s1.clone()))); net.peer(0).chain.engine().register_client(Arc::downgrade(&net.peer(0).chain) as _); net.peer(1).chain.engine().register_client(Arc::downgrade(&net.peer(1).chain) as _); net.peer(0).chain.set_io_channel(IoChannel::to_handler(Arc::downgrade(&io_handler1))); diff --git a/ethcore/sync/src/tests/helpers.rs b/ethcore/sync/src/tests/helpers.rs index cc4a8ba08d4..8bc4b542e28 100644 --- a/ethcore/sync/src/tests/helpers.rs +++ b/ethcore/sync/src/tests/helpers.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::{VecDeque, HashSet, HashMap}; use std::sync::Arc; @@ -20,21 +20,24 @@ use ethereum_types::H256; use parking_lot::{RwLock, Mutex}; use bytes::Bytes; use network::{self, PeerId, ProtocolId, PacketId, SessionInfo}; +use network::client_version::ClientVersion; use tests::snapshot::*; use ethcore::client::{TestBlockChainClient, BlockChainClient, Client as EthcoreClient, ClientConfig, ChainNotify, NewBlocks, ChainMessageType, ClientIoMessage}; -use ethcore::header::BlockNumber; use ethcore::snapshot::SnapshotService; use ethcore::spec::Spec; -use ethcore::account_provider::AccountProvider; use ethcore::miner::Miner; use ethcore::test_helpers; use sync_io::SyncIo; use io::{IoChannel, IoContext, IoHandler}; use api::WARP_SYNC_PROTOCOL_ID; -use chain::{ChainSync, ETH_PROTOCOL_VERSION_63, PAR_PROTOCOL_VERSION_3, PRIVATE_TRANSACTION_PACKET, SIGNED_PRIVATE_TRANSACTION_PACKET, SyncSupplier}; +use chain::{ChainSync, SyncSupplier, ETH_PROTOCOL_VERSION_63, PAR_PROTOCOL_VERSION_3}; +use chain::sync_packet::{PacketInfo, SyncPacket}; +use chain::sync_packet::SyncPacket::{PrivateTransactionPacket, SignedPrivateTransactionPacket}; + use SyncConfig; use private_tx::SimplePrivateTxHandler; +use types::BlockNumber; pub trait FlushingBlockChainClient: BlockChainClient { fn flush(&self) {} @@ -102,27 +105,25 @@ impl<'p, C> SyncIo for TestIo<'p, C> where C: FlushingBlockChainClient, C: 'p { Ok(()) } - fn send(&mut self, peer_id: PeerId, packet_id: PacketId, data: Vec) -> Result<(), network::Error> { + fn send(&mut self,peer_id: PeerId, packet_id: SyncPacket, data: Vec) -> Result<(), network::Error> { self.packets.push(TestPacket { data: data, - packet_id: packet_id, + packet_id: packet_id.id(), recipient: peer_id, }); Ok(()) } - fn send_protocol(&mut self, _protocol: ProtocolId, peer_id: PeerId, packet_id: PacketId, data: Vec) -> Result<(), network::Error> { - self.send(peer_id, packet_id, data) - } - fn chain(&self) -> &BlockChainClient { &*self.chain } - fn peer_info(&self, peer_id: PeerId) -> String { - self.peers_info.get(&peer_id) + fn peer_version(&self, peer_id: PeerId) -> ClientVersion { + let client_id = self.peers_info.get(&peer_id) .cloned() - .unwrap_or_else(|| peer_id.to_string()) + .unwrap_or_else(|| peer_id.to_string()); + + ClientVersion::from(client_id) } fn snapshot_service(&self) -> &SnapshotService { @@ -144,6 +145,10 @@ impl<'p, C> SyncIo for TestIo<'p, C> where C: FlushingBlockChainClient, C: 'p { fn chain_overlay(&self) -> &RwLock> { &self.overlay } + + fn payload_soft_limit(&self) -> usize { + 100_000 + } } /// Mock for emulution of async run of new blocks @@ -230,9 +235,9 @@ impl EthPeer where C: FlushingBlockChainClient { match message { ChainMessageType::Consensus(data) => self.sync.write().propagate_consensus_packet(&mut io, data), ChainMessageType::PrivateTransaction(transaction_hash, data) => - self.sync.write().propagate_private_transaction(&mut io, transaction_hash, PRIVATE_TRANSACTION_PACKET, data), + self.sync.write().propagate_private_transaction(&mut io, transaction_hash, PrivateTransactionPacket, data), ChainMessageType::SignedPrivateTransaction(transaction_hash, data) => - self.sync.write().propagate_private_transaction(&mut io, transaction_hash, SIGNED_PRIVATE_TRANSACTION_PACKET, data), + self.sync.write().propagate_private_transaction(&mut io, transaction_hash, SignedPrivateTransactionPacket, data), } } @@ -341,7 +346,7 @@ impl TestNet> { let chain = TestBlockChainClient::new(); let ss = Arc::new(TestSnapshotService::new()); let private_tx_handler = Arc::new(SimplePrivateTxHandler::default()); - let sync = ChainSync::new(config.clone(), &chain, private_tx_handler.clone()); + let sync = ChainSync::new(config.clone(), &chain, Some(private_tx_handler.clone())); net.peers.push(Arc::new(EthPeer { sync: RwLock::new(sync), snapshot_service: ss, @@ -363,11 +368,10 @@ impl TestNet> { } impl TestNet> { - pub fn with_spec_and_accounts( + pub fn with_spec( n: usize, config: SyncConfig, spec_factory: F, - accounts: Option> ) -> Self where F: Fn() -> Spec { @@ -377,14 +381,14 @@ impl TestNet> { disconnect_events: Vec::new(), }; for _ in 0..n { - net.add_peer_with_private_config(config.clone(), spec_factory(), accounts.clone()); + net.add_peer_with_private_config(config.clone(), spec_factory()); } net } - pub fn add_peer_with_private_config(&mut self, config: SyncConfig, spec: Spec, accounts: Option>) { + pub fn add_peer_with_private_config(&mut self, config: SyncConfig, spec: Spec) { let channel = IoChannel::disconnected(); - let miner = Arc::new(Miner::new_for_tests(&spec, accounts.clone())); + let miner = Arc::new(Miner::new_for_tests(&spec, None)); let client = EthcoreClient::new( ClientConfig::default(), &spec, @@ -395,7 +399,7 @@ impl TestNet> { let private_tx_handler = Arc::new(SimplePrivateTxHandler::default()); let ss = Arc::new(TestSnapshotService::new()); - let sync = ChainSync::new(config, &*client, private_tx_handler.clone()); + let sync = ChainSync::new(config, &*client, Some(private_tx_handler.clone())); let peer = Arc::new(EthPeer { sync: RwLock::new(sync), snapshot_service: ss, diff --git a/ethcore/sync/src/tests/mod.rs b/ethcore/sync/src/tests/mod.rs index 0168913aa16..34e04d19607 100644 --- a/ethcore/sync/src/tests/mod.rs +++ b/ethcore/sync/src/tests/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . pub mod helpers; pub mod snapshot; diff --git a/ethcore/sync/src/tests/private.rs b/ethcore/sync/src/tests/private.rs index 9b39aed76d7..24de14d936d 100644 --- a/ethcore/sync/src/tests/private.rs +++ b/ethcore/sync/src/tests/private.rs @@ -1,32 +1,33 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use hash::keccak; use io::{IoHandler, IoChannel}; -use ethcore::client::{BlockChainClient, BlockId, ClientIoMessage}; -use ethcore::spec::Spec; -use ethcore::miner::MinerService; +use types::transaction::{Transaction, Action}; +use types::ids::BlockId; use ethcore::CreateContractAddress; -use transaction::{Transaction, Action}; +use ethcore::client::{ClientIoMessage, BlockChainClient}; use ethcore::executive::{contract_address}; +use ethcore::engines; +use ethcore::miner::{self, MinerService}; +use ethcore::spec::Spec; use ethcore::test_helpers::{push_block_with_transactions}; -use ethcore_private_tx::{Provider, ProviderConfig, NoopEncryptor, Importer, SignedPrivateTransaction}; -use ethcore::account_provider::AccountProvider; -use ethkey::{KeyPair}; +use ethcore_private_tx::{Provider, ProviderConfig, NoopEncryptor, Importer, SignedPrivateTransaction, StoringKeyProvider}; +use ethkey::KeyPair; use tests::helpers::{TestNet, TestIoHandler}; use rustc_hex::FromHex; use rlp::Rlp; @@ -42,18 +43,17 @@ fn send_private_transaction() { // Setup two clients let s0 = KeyPair::from_secret_slice(&keccak("1")).unwrap(); let s1 = KeyPair::from_secret_slice(&keccak("0")).unwrap(); - let ap = Arc::new(AccountProvider::transient_provider()); - ap.insert_account(s0.secret().clone(), &"".into()).unwrap(); - ap.insert_account(s1.secret().clone(), &"".into()).unwrap(); - let mut net = TestNet::with_spec_and_accounts(2, SyncConfig::default(), seal_spec, Some(ap.clone())); + let signer = Arc::new(ethcore_private_tx::KeyPairSigner(vec![s0.clone(), s1.clone()])); + + let mut net = TestNet::with_spec(2, SyncConfig::default(), seal_spec); let client0 = net.peer(0).chain.clone(); let client1 = net.peer(1).chain.clone(); let io_handler0: Arc> = Arc::new(TestIoHandler::new(net.peer(0).chain.clone())); let io_handler1: Arc> = Arc::new(TestIoHandler::new(net.peer(1).chain.clone())); - net.peer(0).miner.set_author(s0.address(), Some("".into())).unwrap(); - net.peer(1).miner.set_author(s1.address(), Some("".into())).unwrap(); + net.peer(0).miner.set_author(miner::Author::Sealer(engines::signer::from_keypair(s0.clone()))); + net.peer(1).miner.set_author(miner::Author::Sealer(engines::signer::from_keypair(s1.clone()))); net.peer(0).chain.engine().register_client(Arc::downgrade(&net.peer(0).chain) as _); net.peer(1).chain.engine().register_client(Arc::downgrade(&net.peer(1).chain) as _); net.peer(0).chain.set_io_channel(IoChannel::to_handler(Arc::downgrade(&io_handler0))); @@ -69,32 +69,34 @@ fn send_private_transaction() { let validator_config = ProviderConfig{ validator_accounts: vec![s1.address()], signer_account: None, - passwords: vec!["".into()], }; let signer_config = ProviderConfig{ validator_accounts: Vec::new(), signer_account: Some(s0.address()), - passwords: vec!["".into()], }; + let private_keys = Arc::new(StoringKeyProvider::default()); + let pm0 = Arc::new(Provider::new( client0.clone(), net.peer(0).miner.clone(), - ap.clone(), + signer.clone(), Box::new(NoopEncryptor::default()), signer_config, IoChannel::to_handler(Arc::downgrade(&io_handler0)), + private_keys.clone(), )); pm0.add_notify(net.peers[0].clone()); let pm1 = Arc::new(Provider::new( client1.clone(), net.peer(1).miner.clone(), - ap.clone(), + signer.clone(), Box::new(NoopEncryptor::default()), validator_config, IoChannel::to_handler(Arc::downgrade(&io_handler1)), + private_keys.clone(), )); pm1.add_notify(net.peers[1].clone()); diff --git a/ethcore/sync/src/tests/rpc.rs b/ethcore/sync/src/tests/rpc.rs index 99e95959be6..3e0523931e1 100644 --- a/ethcore/sync/src/tests/rpc.rs +++ b/ethcore/sync/src/tests/rpc.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use super::super::NetworkConfiguration; use network::NetworkConfiguration as BasicNetworkConfiguration; diff --git a/ethcore/sync/src/tests/snapshot.rs b/ethcore/sync/src/tests/snapshot.rs index 2316745c1bc..a3aa77d36d6 100644 --- a/ethcore/sync/src/tests/snapshot.rs +++ b/ethcore/sync/src/tests/snapshot.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::HashMap; use std::sync::Arc; @@ -21,8 +21,8 @@ use ethereum_types::H256; use parking_lot::Mutex; use bytes::Bytes; use ethcore::snapshot::{SnapshotService, ManifestData, RestorationStatus}; -use ethcore::header::BlockNumber; use ethcore::client::EachBlockWith; +use types::BlockNumber; use super::helpers::*; use {SyncConfig, WarpSync}; diff --git a/ethcore/sync/src/transactions_stats.rs b/ethcore/sync/src/transactions_stats.rs index 7d5e2ca4a86..91094fa5fd2 100644 --- a/ethcore/sync/src/transactions_stats.rs +++ b/ethcore/sync/src/transactions_stats.rs @@ -1,27 +1,27 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use api::TransactionStats; use std::hash::BuildHasher; use std::collections::{HashSet, HashMap}; use ethereum_types::{H256, H512}; use fastmap::H256FastMap; +use types::BlockNumber; type NodeId = H512; -type BlockNumber = u64; #[derive(Debug, PartialEq, Clone)] pub struct Stats { diff --git a/ethcore/transaction/Cargo.toml b/ethcore/transaction/Cargo.toml deleted file mode 100644 index 1481f87160c..00000000000 --- a/ethcore/transaction/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "ethcore-transaction" -description = "Transaction type" -version = "0.1.0" -authors = ["Parity Technologies "] - -[dependencies] -ethjson = { path = "../../json" } -ethkey = { path = "../../ethkey" } -evm = { path = "../evm" } -heapsize = "0.4" -keccak-hash = "0.1" -rlp = { version = "0.3.0", features = ["ethereum"] } -unexpected = { path = "../../util/unexpected" } -ethereum-types = "0.4" - -[dev-dependencies] -rustc-hex= "1.0" - -[features] -json-tests = [] diff --git a/ethcore/transaction/src/lib.rs b/ethcore/transaction/src/lib.rs deleted file mode 100644 index 829613cf9c7..00000000000 --- a/ethcore/transaction/src/lib.rs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -//! Ethereum Transactions - -extern crate ethereum_types; -extern crate ethjson; -extern crate ethkey; -extern crate evm; -extern crate heapsize; -extern crate keccak_hash as hash; -extern crate rlp; -extern crate unexpected; - -#[cfg(test)] -extern crate rustc_hex; - -mod error; -mod transaction; - -pub use error::Error; -pub use transaction::*; diff --git a/ethcore/types/Cargo.toml b/ethcore/types/Cargo.toml index 1833db871ce..855fd717287 100644 --- a/ethcore/types/Cargo.toml +++ b/ethcore/types/Cargo.toml @@ -5,13 +5,16 @@ version = "0.1.0" authors = ["Parity Technologies "] [dependencies] -rlp = { version = "0.3.0", features = ["ethereum"] } -rlp_derive = { path = "../../util/rlp_derive" } -parity-bytes = "0.1" ethereum-types = "0.4" ethjson = { path = "../../json" } -keccak-hash = "0.1" +ethkey = { path = "../../accounts/ethkey" } heapsize = "0.4" +keccak-hash = "0.1" +parity-bytes = "0.1" +parity-machine = { path = "../../machine" } +rlp = { version = "0.3.0", features = ["ethereum"] } +rlp_derive = { path = "../../util/rlp-derive" } +unexpected = { path = "../../util/unexpected" } [dev-dependencies] rustc-hex= "1.0" diff --git a/ethcore/types/src/account_diff.rs b/ethcore/types/src/account_diff.rs index 9633ffeb078..09751ba4554 100644 --- a/ethcore/types/src/account_diff.rs +++ b/ethcore/types/src/account_diff.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Diff between two accounts. diff --git a/ethcore/types/src/ancestry_action.rs b/ethcore/types/src/ancestry_action.rs index d9915cfee42..39b73ef99ea 100644 --- a/ethcore/types/src/ancestry_action.rs +++ b/ethcore/types/src/ancestry_action.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Actions on ancestry blocks when working on a new block. diff --git a/ethcore/types/src/basic_account.rs b/ethcore/types/src/basic_account.rs index 94157977bc7..039dbac9493 100644 --- a/ethcore/types/src/basic_account.rs +++ b/ethcore/types/src/basic_account.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Basic account type -- the decoded RLP from the state trie. diff --git a/ethcore/types/src/block.rs b/ethcore/types/src/block.rs new file mode 100644 index 00000000000..a423fb1ed1b --- /dev/null +++ b/ethcore/types/src/block.rs @@ -0,0 +1,76 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +//! Base data structure of this module is `Block`. +//! +//! Blocks can be produced by a local node or they may be received from the network. +//! +//! To create a block locally, we start with an `OpenBlock`. This block is mutable +//! and can be appended to with transactions and uncles. +//! +//! When ready, `OpenBlock` can be closed and turned into a `ClosedBlock`. A `ClosedBlock` can +//! be reopend again by a miner under certain circumstances. On block close, state commit is +//! performed. +//! +//! `LockedBlock` is a version of a `ClosedBlock` that cannot be reopened. It can be sealed +//! using an engine. +//! +//! `ExecutedBlock` is an underlaying data structure used by all structs above to store block +//! related info. + +use bytes::Bytes; + +use header::Header; +use rlp::{Rlp, RlpStream, Decodable, DecoderError}; +use transaction::UnverifiedTransaction; + +/// A block, encoded as it is on the block chain. +#[derive(Default, Debug, Clone, PartialEq)] +pub struct Block { + /// The header of this block. + pub header: Header, + /// The transactions in this block. + pub transactions: Vec, + /// The uncles of this block. + pub uncles: Vec
, +} + +impl Block { + /// Get the RLP-encoding of the block with the seal. + pub fn rlp_bytes(&self) -> Bytes { + let mut block_rlp = RlpStream::new_list(3); + block_rlp.append(&self.header); + block_rlp.append_list(&self.transactions); + block_rlp.append_list(&self.uncles); + block_rlp.out() + } +} + +impl Decodable for Block { + fn decode(rlp: &Rlp) -> Result { + if rlp.as_raw().len() != rlp.payload_info()?.total() { + return Err(DecoderError::RlpIsTooBig); + } + if rlp.item_count()? != 3 { + return Err(DecoderError::RlpIncorrectListLen); + } + Ok(Block { + header: rlp.val_at(0)?, + transactions: rlp.list_at(1)?, + uncles: rlp.list_at(2)?, + }) + } +} diff --git a/ethcore/types/src/block_status.rs b/ethcore/types/src/block_status.rs index 460fdc29772..0460fcbe6d1 100644 --- a/ethcore/types/src/block_status.rs +++ b/ethcore/types/src/block_status.rs @@ -1,18 +1,20 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . + +//! General block status /// General block status #[derive(Debug, Eq, PartialEq)] diff --git a/ethcore/types/src/blockchain_info.rs b/ethcore/types/src/blockchain_info.rs index b82582bda09..42158638dae 100644 --- a/ethcore/types/src/blockchain_info.rs +++ b/ethcore/types/src/blockchain_info.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockhain info type definition diff --git a/ethcore/types/src/call_analytics.rs b/ethcore/types/src/call_analytics.rs index ae53e6911e1..902c75e56a7 100644 --- a/ethcore/types/src/call_analytics.rs +++ b/ethcore/types/src/call_analytics.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Call analytics related types diff --git a/ethcore/src/encoded.rs b/ethcore/types/src/encoded.rs similarity index 96% rename from ethcore/src/encoded.rs rename to ethcore/types/src/encoded.rs index 9573bb5d16c..4680f95af50 100644 --- a/ethcore/src/encoded.rs +++ b/ethcore/types/src/encoded.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Lazily-decoded owning views of RLP-encoded blockchain objects. //! These views are meant to contain _trusted_ data -- without encoding @@ -26,11 +26,12 @@ use block::Block as FullBlock; use ethereum_types::{H256, Bloom, U256, Address}; use hash::keccak; -use header::{BlockNumber, Header as FullHeader}; +use header::{Header as FullHeader}; use heapsize::HeapSizeOf; use rlp::{self, Rlp, RlpStream}; use transaction::UnverifiedTransaction; use views::{self, BlockView, HeaderView, BodyView}; +use BlockNumber; /// Owning header view. #[derive(Debug, Clone, PartialEq, Eq)] diff --git a/ethcore/src/engines/epoch.rs b/ethcore/types/src/engines/epoch.rs similarity index 89% rename from ethcore/src/engines/epoch.rs rename to ethcore/types/src/engines/epoch.rs index 53b540cabd1..34054a193fc 100644 --- a/ethcore/src/engines/epoch.rs +++ b/ethcore/types/src/engines/epoch.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Epoch verifiers and transitions. diff --git a/ethcore/types/src/engines/mod.rs b/ethcore/types/src/engines/mod.rs new file mode 100644 index 00000000000..cc622bbe65b --- /dev/null +++ b/ethcore/types/src/engines/mod.rs @@ -0,0 +1,28 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +//! Engine-specific types. + +pub mod epoch; + +/// Fork choice. +#[derive(Debug, PartialEq, Eq)] +pub enum ForkChoice { + /// Choose the new block. + New, + /// Choose the current best block. + Old, +} diff --git a/ethcore/types/src/filter.rs b/ethcore/types/src/filter.rs index c32551473d1..71e8d394414 100644 --- a/ethcore/types/src/filter.rs +++ b/ethcore/types/src/filter.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain filter diff --git a/ethcore/src/header.rs b/ethcore/types/src/header.rs similarity index 96% rename from ethcore/src/header.rs rename to ethcore/types/src/header.rs index 100210b70bc..829776f013e 100644 --- a/ethcore/src/header.rs +++ b/ethcore/types/src/header.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Block header. @@ -22,8 +22,7 @@ use heapsize::HeapSizeOf; use ethereum_types::{H256, U256, Address, Bloom}; use bytes::Bytes; use rlp::{Rlp, RlpStream, Encodable, DecoderError, Decodable}; - -pub use types::BlockNumber; +use BlockNumber; /// Semantic boolean for when a seal/signature is included. #[derive(Debug, Clone, Copy)] @@ -192,13 +191,6 @@ impl Header { }).collect() } - /// Get a mutable reference to extra_data - #[cfg(test)] - pub fn extra_data_mut(&mut self) -> &mut Bytes { - self.hash = None; - &mut self.extra_data - } - /// Set the number field of the header. pub fn set_parent_hash(&mut self, a: H256) { change_field(&mut self.hash, &mut self.parent_hash, a); diff --git a/ethcore/types/src/ids.rs b/ethcore/types/src/ids.rs index d1457832c01..dccb240d94b 100644 --- a/ethcore/types/src/ids.rs +++ b/ethcore/types/src/ids.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Unique identifiers. diff --git a/ethcore/types/src/lib.rs b/ethcore/types/src/lib.rs index f375fec13c9..4ca5c80dcf5 100644 --- a/ethcore/types/src/lib.rs +++ b/ethcore/types/src/lib.rs @@ -1,39 +1,68 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Types used in the public API +//! +//! This crate stores Parity Etherem specific types that are +//! COMMONLY used across different separate modules of the codebase. +//! It should only focus on data structures, not any logic that relates to them. +//! +//! The interaction between modules should be possible by +//! implementing a required trait that potentially uses some of the data +//! structures from that crate. +//! +//! NOTE If you can specify your data type in the same crate as your trait, please do that. +//! Don't treat this crate as a bag for any types that we use in Parity Ethereum. +//! This one is reserved for types that are shared heavily (like transactions), +//! historically this contains types extracted from `ethcore` crate, if possible +//! we should try to dissolve that crate in favour of more fine-grained crates, +//! by moving the types closer to where they are actually required. + +#![warn(missing_docs, unused_extern_crates)] extern crate ethereum_types; -extern crate parity_bytes as bytes; extern crate ethjson; +extern crate ethkey; +extern crate heapsize; +extern crate keccak_hash as hash; +extern crate parity_bytes as bytes; +extern crate parity_machine; extern crate rlp; +extern crate unexpected; + #[macro_use] extern crate rlp_derive; -extern crate keccak_hash as hash; -extern crate heapsize; #[cfg(test)] extern crate rustc_hex; +#[macro_use] +pub mod views; + pub mod account_diff; +pub mod ancestry_action; pub mod basic_account; +pub mod block; pub mod block_status; pub mod blockchain_info; pub mod call_analytics; +pub mod encoded; +pub mod engines; pub mod filter; +pub mod header; pub mod ids; pub mod log_entry; pub mod pruning_info; @@ -43,9 +72,9 @@ pub mod security_level; pub mod snapshot_manifest; pub mod state_diff; pub mod trace_filter; +pub mod transaction; pub mod tree_route; pub mod verification_queue_info; -pub mod ancestry_action; /// Type for block number. pub type BlockNumber = u64; diff --git a/ethcore/types/src/log_entry.rs b/ethcore/types/src/log_entry.rs index 0b7455df496..a5087b2a003 100644 --- a/ethcore/types/src/log_entry.rs +++ b/ethcore/types/src/log_entry.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Log entry type definition. diff --git a/ethcore/types/src/pruning_info.rs b/ethcore/types/src/pruning_info.rs index fcf4a774a20..76f775cb7e4 100644 --- a/ethcore/types/src/pruning_info.rs +++ b/ethcore/types/src/pruning_info.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Information about portions of the state and chain which the client may serve. //! diff --git a/ethcore/types/src/receipt.rs b/ethcore/types/src/receipt.rs index ec3b3c66f55..aedb208a78b 100644 --- a/ethcore/types/src/receipt.rs +++ b/ethcore/types/src/receipt.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Receipt diff --git a/ethcore/types/src/restoration_status.rs b/ethcore/types/src/restoration_status.rs index ec15bf4809f..dea342a3104 100644 --- a/ethcore/types/src/restoration_status.rs +++ b/ethcore/types/src/restoration_status.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Restoration status type definition diff --git a/ethcore/types/src/security_level.rs b/ethcore/types/src/security_level.rs index 59175847046..eb87317e7ff 100644 --- a/ethcore/types/src/security_level.rs +++ b/ethcore/types/src/security_level.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Indication of how secure the chain is. diff --git a/ethcore/types/src/snapshot_manifest.rs b/ethcore/types/src/snapshot_manifest.rs index 40ff4c532f7..8ed19fcfc20 100644 --- a/ethcore/types/src/snapshot_manifest.rs +++ b/ethcore/types/src/snapshot_manifest.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Snapshot manifest type definition diff --git a/ethcore/types/src/state_diff.rs b/ethcore/types/src/state_diff.rs index 4cc85fff93f..5605719f015 100644 --- a/ethcore/types/src/state_diff.rs +++ b/ethcore/types/src/state_diff.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! State diff module. diff --git a/ethcore/types/src/trace_filter.rs b/ethcore/types/src/trace_filter.rs index 69a37870277..8b1d715b42f 100644 --- a/ethcore/types/src/trace_filter.rs +++ b/ethcore/types/src/trace_filter.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Trace filter related types diff --git a/ethcore/transaction/src/error.rs b/ethcore/types/src/transaction/error.rs similarity index 92% rename from ethcore/transaction/src/error.rs rename to ethcore/types/src/transaction/error.rs index 0efd18ae6b3..ab10636643f 100644 --- a/ethcore/transaction/src/error.rs +++ b/ethcore/types/src/transaction/error.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::{fmt, error}; diff --git a/devtools/src/lib.rs b/ethcore/types/src/transaction/mod.rs similarity index 50% rename from devtools/src/lib.rs rename to ethcore/types/src/transaction/mod.rs index 6fdbc8d8902..4b26b7dc144 100644 --- a/devtools/src/lib.rs +++ b/ethcore/types/src/transaction/mod.rs @@ -1,19 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -//! dev-tools +//! Ethereum Transactions -pub mod http_client; +mod error; +mod transaction; + +pub use self::error::Error; +pub use self::transaction::*; diff --git a/ethcore/transaction/src/transaction.rs b/ethcore/types/src/transaction/transaction.rs similarity index 95% rename from ethcore/transaction/src/transaction.rs rename to ethcore/types/src/transaction/transaction.rs index ee37f68524d..248bc264629 100644 --- a/ethcore/transaction/src/transaction.rs +++ b/ethcore/types/src/transaction/transaction.rs @@ -1,31 +1,32 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Transaction data structure. use std::ops::Deref; + use ethereum_types::{H256, H160, Address, U256}; -use error; use ethjson; use ethkey::{self, Signature, Secret, Public, recover, public_to_address}; -use evm::Schedule; use hash::keccak; use heapsize::HeapSizeOf; use rlp::{self, RlpStream, Rlp, DecoderError, Encodable}; +use transaction::error; + type Bytes = Vec; type BlockNumber = u64; @@ -251,19 +252,6 @@ impl Transaction { public: None, } } - - /// Get the transaction cost in gas for the given params. - pub fn gas_required_for(is_create: bool, data: &[u8], schedule: &Schedule) -> u64 { - data.iter().fold( - (if is_create {schedule.tx_create_gas} else {schedule.tx_gas}) as u64, - |g, b| g + (match *b { 0 => schedule.tx_data_zero_gas, _ => schedule.tx_data_non_zero_gas }) as u64 - ) - } - - /// Get the transaction cost in gas for this transaction. - pub fn gas_required(&self, schedule: &Schedule) -> u64 { - Self::gas_required_for(match self.action{Action::Create=>true, Action::Call(_)=>false}, &self.data, schedule) - } } /// Signed transaction information without verified signature. @@ -355,6 +343,7 @@ impl UnverifiedTransaction { &self.unsigned } + /// Returns standardized `v` value (0, 1 or 4 (invalid)) pub fn standard_v(&self) -> u8 { signature::check_replay_protection(self.v) } /// The `v` value that appears in the RLP. diff --git a/ethcore/types/src/tree_route.rs b/ethcore/types/src/tree_route.rs index 9c84052be35..0386472b858 100644 --- a/ethcore/types/src/tree_route.rs +++ b/ethcore/types/src/tree_route.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Tree route info type definition diff --git a/ethcore/types/src/verification_queue_info.rs b/ethcore/types/src/verification_queue_info.rs index bc280b15bfe..a855fee6a17 100644 --- a/ethcore/types/src/verification_queue_info.rs +++ b/ethcore/types/src/verification_queue_info.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Verification queue info types diff --git a/ethcore/src/views/block.rs b/ethcore/types/src/views/block.rs similarity index 94% rename from ethcore/src/views/block.rs rename to ethcore/types/src/views/block.rs index 2a7c2ebd531..9ad67ddd66b 100644 --- a/ethcore/src/views/block.rs +++ b/ethcore/types/src/views/block.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! View onto block rlp. @@ -37,9 +37,9 @@ impl<'a> BlockView<'a> { /// /// ``` /// #[macro_use] - /// extern crate ethcore; + /// extern crate common_types as types; /// - /// use ethcore::views::{BlockView}; + /// use types::views::{BlockView}; /// /// fn main() { /// let bytes : &[u8] = &[]; diff --git a/ethcore/src/views/body.rs b/ethcore/types/src/views/body.rs similarity index 87% rename from ethcore/src/views/body.rs rename to ethcore/types/src/views/body.rs index f1a30949b32..1ea4999b8bc 100644 --- a/ethcore/src/views/body.rs +++ b/ethcore/types/src/views/body.rs @@ -1,28 +1,29 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! View onto block body rlp. use bytes::Bytes; use ethereum_types::H256; use hash::keccak; -use header::{Header, BlockNumber}; +use header::Header; use transaction::{LocalizedTransaction, UnverifiedTransaction}; use views::{TransactionView, HeaderView}; use super::ViewRlp; +use BlockNumber; /// View onto block rlp. pub struct BodyView<'a> { @@ -37,9 +38,9 @@ impl<'a> BodyView<'a> { /// /// ``` /// #[macro_use] - /// extern crate ethcore; + /// extern crate common_types as types; /// - /// use ethcore::views::{BodyView}; + /// use types::views::{BodyView}; /// /// fn main() { /// let bytes : &[u8] = &[]; @@ -149,15 +150,25 @@ impl<'a> BodyView<'a> { #[cfg(test)] mod tests { + use bytes::Bytes; + use rlp::RlpStream; use rustc_hex::FromHex; use super::BodyView; - use blockchain::BlockChain; + use views::BlockView; + + fn block_to_body(block: &[u8]) -> Bytes { + let mut body = RlpStream::new_list(2); + let block_view = view!(BlockView, block); + body.append_raw(block_view.transactions_rlp().as_raw(), 1); + body.append_raw(block_view.uncles_rlp().as_raw(), 1); + body.out() + } #[test] fn test_block_view() { // that's rlp of block created with ethash engine. let rlp = "f90261f901f9a0d405da4e66f1445d455195229624e133f5baafe72b5cf7b3c36c12c8146e98b7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a05fb2b4bfdef7b314451cb138a534d225c922fc0e5fbe25e451142732c3e25c25a088d2ec6b9860aae1a2c3b299f72b6a5d70d7f7ba4722c78f2c49ba96273c2158a007c6fdfa8eea7e86b81f5b0fc0f78f90cc19f4aa60d323151e0cac660199e9a1b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefba82524d84568e932a80a0a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd88ab4e252a7e8c2a23f862f86002018304cb2f94ec0e71ad0a90ffe1909d27dac207f7680abba42d01801ba03a347e72953c860f32b1eb2c78a680d8734b2ea08085d949d729479796f218d5a047ea6239d9e31ccac8af3366f5ca37184d26e7646e3191a3aeb81c4cf74de500c0".from_hex().unwrap(); - let body = BlockChain::block_to_body(&rlp); + let body = block_to_body(&rlp); let view = view!(BodyView, &body); assert_eq!(view.transactions_count(), 1); assert_eq!(view.uncles_count(), 0); diff --git a/ethcore/src/views/header.rs b/ethcore/types/src/views/header.rs similarity index 92% rename from ethcore/src/views/header.rs rename to ethcore/types/src/views/header.rs index 4b7b1225d02..4009892910f 100644 --- a/ethcore/src/views/header.rs +++ b/ethcore/types/src/views/header.rs @@ -1,27 +1,27 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! View onto block header rlp use bytes::Bytes; use ethereum_types::{H256, Bloom, U256, Address}; use hash::keccak; -use header::BlockNumber; use rlp::{self}; use super::ViewRlp; +use BlockNumber; /// View onto block header rlp. pub struct HeaderView<'a> { @@ -36,10 +36,10 @@ impl<'a> HeaderView<'a> { /// /// ``` /// #[macro_use] - /// extern crate ethcore; - /// - /// use ethcore::views::{HeaderView}; - /// + /// extern crate common_types as types; + /// + /// use types::views::{HeaderView}; + /// /// fn main() { /// let bytes : &[u8] = &[]; /// let tx_view = view!(HeaderView, bytes); diff --git a/ethcore/src/views/mod.rs b/ethcore/types/src/views/mod.rs similarity index 74% rename from ethcore/src/views/mod.rs rename to ethcore/types/src/views/mod.rs index 407807ab9b9..f5c2eab9411 100644 --- a/ethcore/src/views/mod.rs +++ b/ethcore/types/src/views/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Block oriented views onto rlp. diff --git a/ethcore/src/views/transaction.rs b/ethcore/types/src/views/transaction.rs similarity index 87% rename from ethcore/src/views/transaction.rs rename to ethcore/types/src/views/transaction.rs index 911fde944e3..b7d412f6ce8 100644 --- a/ethcore/src/views/transaction.rs +++ b/ethcore/types/src/views/transaction.rs @@ -1,24 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! View onto transaction rlp use bytes::Bytes; use ethereum_types::{H256, U256}; use hash::keccak; -// use rlp::{Rlp, Decodable}; use super::ViewRlp; /// View onto transaction rlp. @@ -34,10 +33,10 @@ impl<'a> TransactionView<'a> { /// /// ``` /// #[macro_use] - /// extern crate ethcore; - /// - /// use ethcore::views::{TransactionView}; - /// + /// extern crate common_types as types; + /// + /// use types::views::{TransactionView}; + /// /// fn main() { /// let bytes : &[u8] = &[]; /// let tx_view = view!(TransactionView, bytes); diff --git a/ethcore/src/views/view_rlp.rs b/ethcore/types/src/views/view_rlp.rs similarity index 91% rename from ethcore/src/views/view_rlp.rs rename to ethcore/types/src/views/view_rlp.rs index 2dd1b33a946..a6c789de989 100644 --- a/ethcore/src/views/view_rlp.rs +++ b/ethcore/types/src/views/view_rlp.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Wrapper for view rlp expected to be valid with debug info diff --git a/ethcore/vm/Cargo.toml b/ethcore/vm/Cargo.toml index 20bbea09aec..19b84a6ecc2 100644 --- a/ethcore/vm/Cargo.toml +++ b/ethcore/vm/Cargo.toml @@ -7,10 +7,9 @@ authors = ["Parity Technologies "] byteorder = "1.0" parity-bytes = "0.1" ethereum-types = "0.4" -patricia-trie = "0.3.0" +trie-db = "0.11.0" patricia-trie-ethereum = { path = "../../util/patricia-trie-ethereum" } log = "0.4" -common-types = { path = "../types" } ethjson = { path = "../../json" } rlp = { version = "0.3.0", features = ["ethereum"] } keccak-hash = "0.1" diff --git a/ethcore/vm/src/action_params.rs b/ethcore/vm/src/action_params.rs index 481f6373104..0d4959c1899 100644 --- a/ethcore/vm/src/action_params.rs +++ b/ethcore/vm/src/action_params.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Evm input params. use ethereum_types::{U256, H256, Address}; diff --git a/ethcore/vm/src/call_type.rs b/ethcore/vm/src/call_type.rs index 0e58d76bbd2..e5245c8c142 100644 --- a/ethcore/vm/src/call_type.rs +++ b/ethcore/vm/src/call_type.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! EVM call types. diff --git a/ethcore/vm/src/env_info.rs b/ethcore/vm/src/env_info.rs index bb1c9ecd91f..e5bd3f64e34 100644 --- a/ethcore/vm/src/env_info.rs +++ b/ethcore/vm/src/env_info.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Environment information for transaction execution. @@ -20,9 +20,10 @@ use std::cmp; use std::sync::Arc; use hash::keccak; use ethereum_types::{U256, H256, Address}; -use types::BlockNumber; use ethjson; +type BlockNumber = u64; + /// Simple vector of hashes, should be at most 256 items large, can be smaller if being used /// for a block whose number is less than 257. pub type LastHashes = Vec; diff --git a/ethcore/vm/src/error.rs b/ethcore/vm/src/error.rs index fb4444104ce..33400563359 100644 --- a/ethcore/vm/src/error.rs +++ b/ethcore/vm/src/error.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! VM errors module diff --git a/ethcore/vm/src/ext.rs b/ethcore/vm/src/ext.rs index a437da53e14..9b499fcab48 100644 --- a/ethcore/vm/src/ext.rs +++ b/ethcore/vm/src/ext.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Interface for Evm externalities. diff --git a/ethcore/vm/src/lib.rs b/ethcore/vm/src/lib.rs index b48eb1d849f..f239e405680 100644 --- a/ethcore/vm/src/lib.rs +++ b/ethcore/vm/src/lib.rs @@ -1,29 +1,28 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Virtual machines support library extern crate ethereum_types; extern crate parity_bytes as bytes; -extern crate common_types as types; extern crate ethjson; extern crate rlp; extern crate keccak_hash as hash; extern crate patricia_trie_ethereum as ethtrie; -extern crate patricia_trie as trie; +extern crate trie_db as trie; mod action_params; mod call_type; diff --git a/ethcore/vm/src/return_data.rs b/ethcore/vm/src/return_data.rs index 24191ec55f6..85fdb361db5 100644 --- a/ethcore/vm/src/return_data.rs +++ b/ethcore/vm/src/return_data.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Return data structures diff --git a/ethcore/vm/src/schedule.rs b/ethcore/vm/src/schedule.rs index 462e96b3250..d1dc3b5aad7 100644 --- a/ethcore/vm/src/schedule.rs +++ b/ethcore/vm/src/schedule.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Cost schedule and other parameterisations for the EVM. diff --git a/ethcore/vm/src/tests.rs b/ethcore/vm/src/tests.rs index 00c986af107..306ad871da9 100644 --- a/ethcore/vm/src/tests.rs +++ b/ethcore/vm/src/tests.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::collections::{HashMap, HashSet}; diff --git a/ethcore/wasm/Cargo.toml b/ethcore/wasm/Cargo.toml index 93571be6275..02aa978d7b6 100644 --- a/ethcore/wasm/Cargo.toml +++ b/ethcore/wasm/Cargo.toml @@ -9,7 +9,9 @@ ethereum-types = "0.4" log = "0.4" parity-wasm = "0.31" libc = "0.2" -pwasm-utils = "0.2.2" +pwasm-utils = "0.6.1" vm = { path = "../vm" } -ethcore-logger = { path = "../../logger" } wasmi = "0.3.0" + +[dev-dependencies] +env_logger = "0.5" diff --git a/ethcore/wasm/run/Cargo.toml b/ethcore/wasm/run/Cargo.toml index 6c5c27dfc76..9260d1eee83 100644 --- a/ethcore/wasm/run/Cargo.toml +++ b/ethcore/wasm/run/Cargo.toml @@ -12,7 +12,7 @@ ethjson = { path = "../../../json" } vm = { path = "../../vm" } wasm = { path = "../" } clap = "2.24" -ethcore-logger = { path = "../../../logger" } +env_logger = "0.5" rustc-hex = "1" [features] diff --git a/ethcore/wasm/run/src/fixture.rs b/ethcore/wasm/run/src/fixture.rs index de6044a8f3c..42117d6dfd3 100644 --- a/ethcore/wasm/run/src/fixture.rs +++ b/ethcore/wasm/run/src/fixture.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::borrow::Cow; use ethjson::uint::Uint; diff --git a/ethcore/wasm/run/src/main.rs b/ethcore/wasm/run/src/main.rs index d2a3a0ff506..0773f9b42af 100644 --- a/ethcore/wasm/run/src/main.rs +++ b/ethcore/wasm/run/src/main.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate serde; extern crate serde_json; @@ -22,8 +22,8 @@ extern crate ethjson; extern crate wasm; extern crate vm; extern crate clap; -extern crate ethcore_logger; extern crate rustc_hex; +extern crate env_logger; mod fixture; mod runner; @@ -33,7 +33,7 @@ use clap::{App, Arg}; use std::fs; fn main() { - ::ethcore_logger::init_log(); + ::env_logger::init(); let matches = App::new("pwasm-run-test") .arg(Arg::with_name("target") diff --git a/ethcore/wasm/run/src/runner.rs b/ethcore/wasm/run/src/runner.rs index b04ec29a482..a69fe6bf674 100644 --- a/ethcore/wasm/run/src/runner.rs +++ b/ethcore/wasm/run/src/runner.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use fixture::{Fixture, Assert, CallLocator, Source}; use wasm::WasmInterpreter; diff --git a/ethcore/wasm/src/env.rs b/ethcore/wasm/src/env.rs index fb9e93e0fd0..b996ea000a0 100644 --- a/ethcore/wasm/src/env.rs +++ b/ethcore/wasm/src/env.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Env module glue for wasmi interpreter diff --git a/ethcore/wasm/src/lib.rs b/ethcore/wasm/src/lib.rs index 73fe4fff88e..1e6129ba13c 100644 --- a/ethcore/wasm/src/lib.rs +++ b/ethcore/wasm/src/lib.rs @@ -1,23 +1,22 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Wasm Interpreter extern crate byteorder; -extern crate ethcore_logger; extern crate ethereum_types; #[macro_use] extern crate log; extern crate libc; @@ -26,12 +25,17 @@ extern crate vm; extern crate pwasm_utils as wasm_utils; extern crate wasmi; -mod runtime; #[cfg(test)] -mod tests; +extern crate env_logger; + mod env; mod panic_payload; mod parser; +mod runtime; + +#[cfg(test)] +mod tests; + use vm::{GasLeft, ReturnData, ActionParams}; use wasmi::{Error as InterpreterError, Trap}; diff --git a/ethcore/wasm/src/panic_payload.rs b/ethcore/wasm/src/panic_payload.rs index 36aa6c5f585..a484daf7123 100644 --- a/ethcore/wasm/src/panic_payload.rs +++ b/ethcore/wasm/src/panic_payload.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use byteorder::{LittleEndian, ReadBytesExt}; use std::io::{self, Read}; diff --git a/ethcore/wasm/src/parser.rs b/ethcore/wasm/src/parser.rs index 656ebb30191..ca730e71886 100644 --- a/ethcore/wasm/src/parser.rs +++ b/ethcore/wasm/src/parser.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! ActionParams parser for wasm diff --git a/ethcore/wasm/src/runtime.rs b/ethcore/wasm/src/runtime.rs index b6de43e9f91..8466c3b8d90 100644 --- a/ethcore/wasm/src/runtime.rs +++ b/ethcore/wasm/src/runtime.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::cmp; use ethereum_types::{U256, H256, Address}; diff --git a/ethcore/wasm/src/tests.rs b/ethcore/wasm/src/tests.rs index 01f35d6c983..9ed7053da18 100644 --- a/ethcore/wasm/src/tests.rs +++ b/ethcore/wasm/src/tests.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::collections::HashMap; @@ -35,7 +35,7 @@ macro_rules! reqrep_test { }; ($name: expr, $input: expr, $info: expr, $block_hashes: expr) => { { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let code = load_sample!($name); let mut params = ActionParams::default(); @@ -94,7 +94,7 @@ fn empty() { // logger.wasm writes all these provided fixed header fields to some arbitrary storage keys. #[test] fn logger() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let code = load_sample!("logger.wasm"); let address: Address = "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6".parse().unwrap(); @@ -148,7 +148,7 @@ fn logger() { // if it has any result. #[test] fn identity() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let code = load_sample!("identity.wasm"); let sender: Address = "01030507090b0d0f11131517191b1d1f21232527".parse().unwrap(); @@ -182,7 +182,7 @@ fn identity() { // This also tests byte-perfect memory allocation and in/out ptr lifecycle. #[test] fn dispersion() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let code = load_sample!("dispersion.wasm"); @@ -240,7 +240,7 @@ fn suicide_not() { #[test] fn suicide() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let code = load_sample!("suicidal.wasm"); @@ -272,7 +272,7 @@ fn suicide() { #[test] fn create() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let mut params = ActionParams::default(); params.gas = U256::from(100_000); @@ -328,7 +328,7 @@ fn create() { #[test] fn call_msg() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let sender: Address = "01030507090b0d0f11131517191b1d1f21232527".parse().unwrap(); let receiver: Address = "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6".parse().unwrap(); @@ -375,7 +375,7 @@ fn call_msg() { // value as `gas` argument to the inner pwasm_ethereum::call #[test] fn call_msg_gasleft() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let sender: Address = "01030507090b0d0f11131517191b1d1f21232527".parse().unwrap(); let receiver: Address = "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6".parse().unwrap(); @@ -421,7 +421,7 @@ fn call_msg_gasleft() { #[test] fn call_code() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let sender: Address = "01030507090b0d0f11131517191b1d1f21232527".parse().unwrap(); let receiver: Address = "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6".parse().unwrap(); @@ -467,7 +467,7 @@ fn call_code() { #[test] fn call_static() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let sender: Address = "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6".parse().unwrap(); let receiver: Address = "01030507090b0d0f11131517191b1d1f21232527".parse().unwrap(); @@ -563,7 +563,7 @@ fn alloc() { // Test prepopulates address into storage, than executes a contract which read that address from storage and write this address into result #[test] fn storage_read() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let code = load_sample!("storage_read.wasm"); let address: Address = "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6".parse().unwrap(); @@ -591,7 +591,7 @@ fn storage_read() { // keccak.wasm runs wasm-std::keccak function on data param and returns hash #[test] fn keccak() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let code = load_sample!("keccak.wasm"); let mut params = ActionParams::default(); @@ -730,7 +730,7 @@ fn math_div() { #[test] fn storage_metering() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); // #1 let mut ext = FakeExt::new().with_wasm(); @@ -866,7 +866,7 @@ fn externs() { // This test checks the ability of wasm contract to invoke gasleft #[test] fn gasleft() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let mut params = ActionParams::default(); params.gas = U256::from(100_000); @@ -891,7 +891,7 @@ fn gasleft() { // ext.schedule.wasm.as_mut().unwrap().have_gasleft = false; #[test] fn gasleft_fail() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let mut params = ActionParams::default(); params.gas = U256::from(100_000); @@ -906,7 +906,7 @@ fn gasleft_fail() { #[test] fn embedded_keccak() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let mut code = load_sample!("keccak.wasm"); code.extend_from_slice(b"something"); @@ -935,7 +935,7 @@ fn embedded_keccak() { /// and reversed input as a data #[test] fn events() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let code = load_sample!("events.wasm"); let mut params = ActionParams::default(); @@ -967,7 +967,7 @@ fn events() { #[test] fn recursive() { - ::ethcore_logger::init_log(); + let _ = ::env_logger::try_init(); let code = load_sample!("recursive.wasm"); let mut params = ActionParams::default(); diff --git a/evmbin/Cargo.toml b/evmbin/Cargo.toml index b75890f61e6..95b532366cd 100644 --- a/evmbin/Cargo.toml +++ b/evmbin/Cargo.toml @@ -9,15 +9,15 @@ name = "parity-evm" path = "./src/main.rs" [dependencies] +common-types = { path = "../ethcore/types" } docopt = "1.0" env_logger = "0.5" ethcore = { path = "../ethcore", features = ["test-helpers", "json-tests", "to-pod-full"] } -ethjson = { path = "../json" } -parity-bytes = "0.1" -ethcore-transaction = { path = "../ethcore/transaction" } ethereum-types = "0.4" +ethjson = { path = "../json" } evm = { path = "../ethcore/evm" } -panic_hook = { path = "../util/panic_hook" } +panic_hook = { path = "../util/panic-hook" } +parity-bytes = "0.1" rustc-hex = "1.0" serde = "1.0" serde_derive = "1.0" diff --git a/evmbin/README.md b/evmbin/README.md index 49e76176137..e0a8c9d9669 100644 --- a/evmbin/README.md +++ b/evmbin/README.md @@ -6,7 +6,7 @@ EVM implementation for Parity. ``` EVM implementation for Parity. - Copyright 2015-2018 Parity Technologies (UK) Ltd. + Copyright 2015-2019 Parity Technologies (UK) Ltd. Usage: parity-evm state-test [--json --std-json --std-dump-json --only NAME --chain CHAIN --std-out-only --std-err-only] @@ -50,6 +50,6 @@ _This project is a part of the Parity Ethereum toolchain._ - [evmbin](https://github.com/paritytech/parity-ethereum/blob/master/evmbin/) - EVM implementation for Parity Ethereum. - [ethabi](https://github.com/paritytech/ethabi) - Parity Ethereum function calls encoding. -- [ethstore](https://github.com/paritytech/parity-ethereum/blob/master/ethstore/) - Parity Ethereum key management. -- [ethkey](https://github.com/paritytech/parity-ethereum/blob/master/ethkey/) - Parity Ethereum keys generator. +- [ethstore](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethstore) - Parity Ethereum key management. +- [ethkey](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethkey) - Parity Ethereum keys generator. - [whisper](https://github.com/paritytech/parity-ethereum/blob/master/whisper/) - Implementation of Whisper-v2 PoC. diff --git a/evmbin/benches/mod.rs b/evmbin/benches/mod.rs index 8fdd5e9cfe1..d8872b5100e 100644 --- a/evmbin/benches/mod.rs +++ b/evmbin/benches/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! benchmarking for EVM //! should be started with: diff --git a/evmbin/src/display/json.rs b/evmbin/src/display/json.rs index 09d0a78f83b..eec5131c7b0 100644 --- a/evmbin/src/display/json.rs +++ b/evmbin/src/display/json.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! JSON VM output. diff --git a/evmbin/src/display/mod.rs b/evmbin/src/display/mod.rs index a8eb20d9e6c..32b45c56922 100644 --- a/evmbin/src/display/mod.rs +++ b/evmbin/src/display/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! VM Output display utils. diff --git a/evmbin/src/display/simple.rs b/evmbin/src/display/simple.rs index 9bfe86f0751..58d4a704585 100644 --- a/evmbin/src/display/simple.rs +++ b/evmbin/src/display/simple.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Simple VM output. diff --git a/evmbin/src/display/std_json.rs b/evmbin/src/display/std_json.rs index 87f515e8ea4..a0071b174fa 100644 --- a/evmbin/src/display/std_json.rs +++ b/evmbin/src/display/std_json.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Standardized JSON VM output. @@ -117,7 +117,6 @@ impl Informant { } } - } impl vm::Informant for Informant { diff --git a/evmbin/src/info.rs b/evmbin/src/info.rs index 67df1d28464..74ea3175a68 100644 --- a/evmbin/src/info.rs +++ b/evmbin/src/info.rs @@ -1,27 +1,27 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! VM runner. use std::time::{Instant, Duration}; use ethereum_types::{H256, U256}; -use ethcore::client::{self, EvmTestClient, EvmTestError, TransactResult}; +use ethcore::client::{self, EvmTestClient, EvmTestError, TransactErr, TransactSuccess}; use ethcore::{state, state_db, trace, spec, pod_state, TrieSpec}; use ethjson; -use transaction; +use types::transaction; use vm::ActionParams; /// VM execution informant @@ -130,7 +130,7 @@ pub fn run_transaction( let result = run(&spec, trie_spec, transaction.gas, pre_state, |mut client| { let result = client.transact(env_info, transaction, trace::NoopTracer, informant); match result { - TransactResult::Ok { state_root, gas_left, output, vm_trace, end_state, .. } => { + Ok(TransactSuccess { state_root, gas_left, output, vm_trace, end_state, .. }) => { if state_root != post_root { (Err(EvmTestError::PostCondition(format!( "State root mismatch (got: {:#x}, expected: {:#x})", @@ -141,7 +141,7 @@ pub fn run_transaction( (Ok(output), state_root, end_state, Some(gas_left), vm_trace) } }, - TransactResult::Err { state_root, error, end_state } => { + Err(TransactErr { state_root, error, end_state }) => { (Err(EvmTestError::PostCondition(format!( "Unexpected execution error: {:?}", error ))), state_root, end_state, None, None) diff --git a/evmbin/src/main.rs b/evmbin/src/main.rs index 41bfbe1bd3e..6e1260189e1 100644 --- a/evmbin/src/main.rs +++ b/evmbin/src/main.rs @@ -1,23 +1,24 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity EVM interpreter binary. #![warn(missing_docs)] +extern crate common_types as types; extern crate ethcore; extern crate ethjson; extern crate rustc_hex; @@ -27,7 +28,6 @@ extern crate serde_derive; #[macro_use] extern crate serde_json; extern crate docopt; -extern crate ethcore_transaction as transaction; extern crate parity_bytes as bytes; extern crate ethereum_types; extern crate vm; @@ -59,7 +59,7 @@ use info::Informant; const USAGE: &'static str = r#" EVM implementation for Parity. - Copyright 2015-2018 Parity Technologies (UK) Ltd. + Copyright 2015-2019 Parity Technologies (UK) Ltd. Usage: parity-evm state-test [--json --std-json --std-dump-json --only NAME --chain CHAIN --std-out-only --std-err-only] diff --git a/ipfs/Cargo.toml b/ipfs/Cargo.toml index 23ada21ea13..23dc8d68987 100644 --- a/ipfs/Cargo.toml +++ b/ipfs/Cargo.toml @@ -9,8 +9,8 @@ authors = ["Parity Technologies "] ethcore = { path = "../ethcore" } parity-bytes = "0.1" ethereum-types = "0.4" -jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -jsonrpc-http-server = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } +jsonrpc-core = "10.0.1" +jsonrpc-http-server = "10.0.1" rlp = { version = "0.3.0", features = ["ethereum"] } cid = "0.3" multihash = "0.8" diff --git a/ipfs/src/error.rs b/ipfs/src/error.rs index 60b2d564f13..a9a584985a7 100644 --- a/ipfs/src/error.rs +++ b/ipfs/src/error.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use {multihash, cid, http}; use route::Out; @@ -30,7 +30,6 @@ pub enum ServerError { InvalidInterface } - /// Handle IO errors (ports taken when starting the server). impl From<::std::io::Error> for ServerError { fn from(err: ::std::io::Error) -> ServerError { @@ -107,4 +106,4 @@ impl From for Error { fn from(_: multihash::Error) -> Error { Error::CidParsingFailed } -} \ No newline at end of file +} diff --git a/ipfs/src/lib.rs b/ipfs/src/lib.rs index e3974c2c50b..0ba6a86d029 100644 --- a/ipfs/src/lib.rs +++ b/ipfs/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate multihash; extern crate cid; diff --git a/ipfs/src/route.rs b/ipfs/src/route.rs index b004c8ebfcb..f4a730338bd 100644 --- a/ipfs/src/route.rs +++ b/ipfs/src/route.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use {rlp, multihash, IpfsHandler}; use error::{Error, Result}; diff --git a/json/src/blockchain/account.rs b/json/src/blockchain/account.rs index 38a0b1fa9cd..aa6f6f8bf26 100644 --- a/json/src/blockchain/account.rs +++ b/json/src/blockchain/account.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain test account deserializer. diff --git a/json/src/blockchain/block.rs b/json/src/blockchain/block.rs index 1d2755d4064..23ba5300dc2 100644 --- a/json/src/blockchain/block.rs +++ b/json/src/blockchain/block.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain test block deserializer. diff --git a/json/src/blockchain/blockchain.rs b/json/src/blockchain/blockchain.rs index 0564ff004eb..b92336f793a 100644 --- a/json/src/blockchain/blockchain.rs +++ b/json/src/blockchain/blockchain.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain deserialization. diff --git a/json/src/blockchain/header.rs b/json/src/blockchain/header.rs index ba06d7cb2be..8de5b16edb6 100644 --- a/json/src/blockchain/header.rs +++ b/json/src/blockchain/header.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain test header deserializer. diff --git a/json/src/blockchain/mod.rs b/json/src/blockchain/mod.rs index 0114216453a..0a3b162e95f 100644 --- a/json/src/blockchain/mod.rs +++ b/json/src/blockchain/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain test deserialization. diff --git a/json/src/blockchain/state.rs b/json/src/blockchain/state.rs index e23a31efa03..e108c937f8a 100644 --- a/json/src/blockchain/state.rs +++ b/json/src/blockchain/state.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain test state deserializer. diff --git a/json/src/blockchain/test.rs b/json/src/blockchain/test.rs index 792303dc7e4..d773aa3b510 100644 --- a/json/src/blockchain/test.rs +++ b/json/src/blockchain/test.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain test deserializer. diff --git a/json/src/blockchain/transaction.rs b/json/src/blockchain/transaction.rs index c46ff722147..4e519f394ee 100644 --- a/json/src/blockchain/transaction.rs +++ b/json/src/blockchain/transaction.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain test transaction deserialization. diff --git a/json/src/bytes.rs b/json/src/bytes.rs index 3eb1f541526..3fbdee2380f 100644 --- a/json/src/bytes.rs +++ b/json/src/bytes.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Lenient bytes json deserialization for test json files. diff --git a/json/src/hash.rs b/json/src/hash.rs index 8dac3f6e736..a025dc45414 100644 --- a/json/src/hash.rs +++ b/json/src/hash.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Lenient hash json deserialization for test json files. diff --git a/json/src/lib.rs b/json/src/lib.rs index 5d31cd6c97d..af5d93edfa6 100644 --- a/json/src/lib.rs +++ b/json/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate rustc_hex; extern crate serde; @@ -30,5 +30,4 @@ pub mod vm; pub mod maybe; pub mod state; pub mod transaction; -pub mod misc; pub mod test; diff --git a/json/src/maybe.rs b/json/src/maybe.rs index 1f77a98ef1d..4fd2ca60e49 100644 --- a/json/src/maybe.rs +++ b/json/src/maybe.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Deserializer of empty string values into optionals. diff --git a/json/src/misc/account_meta.rs b/json/src/misc/account_meta.rs deleted file mode 100644 index cb6ed1c877a..00000000000 --- a/json/src/misc/account_meta.rs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -//! Misc deserialization. - -use hash; - -/// Collected account metadata -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct AccountMeta { - /// The name of the account. - pub name: String, - /// The rest of the metadata of the account. - pub meta: String, - /// The 128-bit Uuid of the account, if it has one (brain-wallets don't). - pub uuid: Option, -} - -impl_serialization!(hash::Address => AccountMeta); diff --git a/json/src/misc/mod.rs b/json/src/misc/mod.rs deleted file mode 100644 index ae7dd80e1fa..00000000000 --- a/json/src/misc/mod.rs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -//! Misc deserialization. - -macro_rules! impl_serialization { - ($key: ty => $name: ty) => { - impl $name { - /// Read a hash map of DappId -> $name - pub fn read(reader: R) -> Result<::std::collections::HashMap, ::serde_json::Error> where - R: ::std::io::Read, - D: From<$key> + ::std::hash::Hash + Eq, - S: From<$name> + Clone, - { - ::serde_json::from_reader(reader).map(|ok: ::std::collections::HashMap<$key, $name>| - ok.into_iter().map(|(a, m)| (a.into(), m.into())).collect() - ) - } - - /// Write a hash map of DappId -> $name - pub fn write(m: &::std::collections::HashMap, writer: &mut W) -> Result<(), ::serde_json::Error> where - W: ::std::io::Write, - D: Into<$key> + ::std::hash::Hash + Eq + Clone, - S: Into<$name> + Clone, - { - ::serde_json::to_writer( - writer, - &m.iter() - .map(|(a, m)| (a.clone().into(), m.clone().into())) - .collect::<::std::collections::HashMap<$key, $name>>() - ) - } - } - } -} - -mod account_meta; - -pub use self::account_meta::AccountMeta; diff --git a/json/src/spec/account.rs b/json/src/spec/account.rs index 9a593db0cb2..3d18ecd6c24 100644 --- a/json/src/spec/account.rs +++ b/json/src/spec/account.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Spec account deserialization. diff --git a/json/src/spec/authority_round.rs b/json/src/spec/authority_round.rs index a1adbef128e..61936a5f9a2 100644 --- a/json/src/spec/authority_round.rs +++ b/json/src/spec/authority_round.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Authority params deserialization. diff --git a/json/src/spec/basic_authority.rs b/json/src/spec/basic_authority.rs index 1d2b963600e..195b89bebb6 100644 --- a/json/src/spec/basic_authority.rs +++ b/json/src/spec/basic_authority.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Authority params deserialization. diff --git a/json/src/spec/builtin.rs b/json/src/spec/builtin.rs index 38da42f1d60..930e0bc9a1b 100644 --- a/json/src/spec/builtin.rs +++ b/json/src/spec/builtin.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Spec builtin deserialization. diff --git a/json/src/spec/engine.rs b/json/src/spec/engine.rs index 2c3ff362493..8941f89e14e 100644 --- a/json/src/spec/engine.rs +++ b/json/src/spec/engine.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Engine deserialization. @@ -77,7 +77,6 @@ mod tests { _ => panic!(), }; - let s = r#"{ "Ethash": { "params": { diff --git a/json/src/spec/ethash.rs b/json/src/spec/ethash.rs index fc61c3e8dd8..6051ac90d8a 100644 --- a/json/src/spec/ethash.rs +++ b/json/src/spec/ethash.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Ethash params deserialization. @@ -95,6 +95,9 @@ pub struct EthashParams { pub expip2_transition: Option, /// EXPIP-2 duration limit pub expip2_duration_limit: Option, + /// Block to transition to progpow + #[serde(rename="progpowTransition")] + pub progpow_transition: Option, } /// Ethash engine deserialization. @@ -200,6 +203,7 @@ mod tests { ecip1017_era_rounds: None, expip2_transition: None, expip2_duration_limit: None, + progpow_transition: None, difficulty_bomb_delays: None, } }); @@ -239,6 +243,7 @@ mod tests { ecip1017_era_rounds: None, expip2_transition: None, expip2_duration_limit: None, + progpow_transition: None, difficulty_bomb_delays: None, } }); diff --git a/json/src/spec/genesis.rs b/json/src/spec/genesis.rs index 3cbfd060c10..1452bea0c17 100644 --- a/json/src/spec/genesis.rs +++ b/json/src/spec/genesis.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Spec genesis deserialization. diff --git a/json/src/spec/hardcoded_sync.rs b/json/src/spec/hardcoded_sync.rs index 078e0e76a6f..381cd1f1acc 100644 --- a/json/src/spec/hardcoded_sync.rs +++ b/json/src/spec/hardcoded_sync.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Spec hardcoded synchronization deserialization for the light client. diff --git a/json/src/spec/instant_seal.rs b/json/src/spec/instant_seal.rs index c15da8db4ee..2f1ad33e9bc 100644 --- a/json/src/spec/instant_seal.rs +++ b/json/src/spec/instant_seal.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Instant seal engine params deserialization. diff --git a/json/src/spec/mod.rs b/json/src/spec/mod.rs index fb08f9bb00e..1d6815d37c1 100644 --- a/json/src/spec/mod.rs +++ b/json/src/spec/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Spec deserialization. diff --git a/json/src/spec/null_engine.rs b/json/src/spec/null_engine.rs index 946d1882d79..bf75749808c 100644 --- a/json/src/spec/null_engine.rs +++ b/json/src/spec/null_engine.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Null engine params deserialization. diff --git a/json/src/spec/params.rs b/json/src/spec/params.rs index 139e74b0f24..765384a6b91 100644 --- a/json/src/spec/params.rs +++ b/json/src/spec/params.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Spec params deserialization. @@ -89,6 +89,9 @@ pub struct Params { pub eip1052_transition: Option, /// See `CommonParams` docs. pub eip1283_transition: Option, + /// See `CommonParams` docs. + pub eip1283_disable_transition: Option, + /// See `CommonParams` docs. pub eip1014_transition: Option, /// See `CommonParams` docs. pub dust_protection_transition: Option, diff --git a/json/src/spec/seal.rs b/json/src/spec/seal.rs index 69c9077255e..e716a05bc26 100644 --- a/json/src/spec/seal.rs +++ b/json/src/spec/seal.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Spec seal deserialization. diff --git a/json/src/spec/spec.rs b/json/src/spec/spec.rs index 9a5589d84f0..68824cad99b 100644 --- a/json/src/spec/spec.rs +++ b/json/src/spec/spec.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Spec deserialization. @@ -30,6 +30,7 @@ pub enum ForkSpec { Homestead, Byzantium, Constantinople, + ConstantinopleFix, EIP158ToByzantiumAt5, FrontierToHomesteadAt5, HomesteadToDaoAt5, diff --git a/json/src/spec/state.rs b/json/src/spec/state.rs index 6227750e1f7..e8a8663672e 100644 --- a/json/src/spec/state.rs +++ b/json/src/spec/state.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blockchain test state deserializer. diff --git a/json/src/spec/validator_set.rs b/json/src/spec/validator_set.rs index babbb8a4760..e7e82282c7a 100644 --- a/json/src/spec/validator_set.rs +++ b/json/src/spec/validator_set.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Validator set deserialization. diff --git a/json/src/state/log.rs b/json/src/state/log.rs index 1e07d9ed1ea..1a0dda5295a 100644 --- a/json/src/state/log.rs +++ b/json/src/state/log.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! State test log deserialization. use hash::{Address, H256, Bloom}; diff --git a/json/src/state/mod.rs b/json/src/state/mod.rs index 6037ca514d0..8c2ac287535 100644 --- a/json/src/state/mod.rs +++ b/json/src/state/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! State test deserialization. diff --git a/json/src/state/state.rs b/json/src/state/state.rs index 22a2e3f9e4f..f25dabec798 100644 --- a/json/src/state/state.rs +++ b/json/src/state/state.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! State test deserialization. diff --git a/json/src/state/test.rs b/json/src/state/test.rs index 2609ad1d21e..3521c797785 100644 --- a/json/src/state/test.rs +++ b/json/src/state/test.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! General test deserialization. diff --git a/json/src/state/transaction.rs b/json/src/state/transaction.rs index bdbe3030fdc..693b976994e 100644 --- a/json/src/state/transaction.rs +++ b/json/src/state/transaction.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! State test transaction deserialization. diff --git a/json/src/test/mod.rs b/json/src/test/mod.rs index 97d66bbd0a8..355d30d69fc 100644 --- a/json/src/test/mod.rs +++ b/json/src/test/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Additional test structures deserialization. diff --git a/json/src/transaction/mod.rs b/json/src/transaction/mod.rs index 8ebab3f1c2b..f845fe3340a 100644 --- a/json/src/transaction/mod.rs +++ b/json/src/transaction/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Transaction test deserialization. diff --git a/json/src/transaction/test.rs b/json/src/transaction/test.rs index 2c5f39f13cf..ee9d4110f1f 100644 --- a/json/src/transaction/test.rs +++ b/json/src/transaction/test.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! TransactionTest test deserializer. diff --git a/json/src/transaction/transaction.rs b/json/src/transaction/transaction.rs index bc36743b18d..718d3080bd2 100644 --- a/json/src/transaction/transaction.rs +++ b/json/src/transaction/transaction.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Transaction test transaction deserialization. diff --git a/json/src/transaction/txtest.rs b/json/src/transaction/txtest.rs index 2be035b4fe9..e72e5f60bfa 100644 --- a/json/src/transaction/txtest.rs +++ b/json/src/transaction/txtest.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Transaction test deserialization. diff --git a/json/src/trie/input.rs b/json/src/trie/input.rs index e1c46ac537e..4c56c10d7cd 100644 --- a/json/src/trie/input.rs +++ b/json/src/trie/input.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Trie test input deserialization. diff --git a/json/src/trie/mod.rs b/json/src/trie/mod.rs index 5dc52cb21d4..68fec087617 100644 --- a/json/src/trie/mod.rs +++ b/json/src/trie/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Trie test deserialization. diff --git a/json/src/trie/test.rs b/json/src/trie/test.rs index c6cd99c25e8..39876da0a16 100644 --- a/json/src/trie/test.rs +++ b/json/src/trie/test.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! TransactionTest test deserializer. diff --git a/json/src/trie/trie.rs b/json/src/trie/trie.rs index 24a3418c79d..756e54f4351 100644 --- a/json/src/trie/trie.rs +++ b/json/src/trie/trie.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Trie test deserialization. diff --git a/json/src/uint.rs b/json/src/uint.rs index 25c5049c45b..3f1d02f03e7 100644 --- a/json/src/uint.rs +++ b/json/src/uint.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Lenient uint json deserialization for test json files. diff --git a/json/src/vm/call.rs b/json/src/vm/call.rs index f37a80b57d8..aa75862f0dd 100644 --- a/json/src/vm/call.rs +++ b/json/src/vm/call.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Vm call deserialization. diff --git a/json/src/vm/env.rs b/json/src/vm/env.rs index cd301aa02bc..e06812c0a87 100644 --- a/json/src/vm/env.rs +++ b/json/src/vm/env.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Vm environment. use hash::Address; diff --git a/json/src/vm/mod.rs b/json/src/vm/mod.rs index 29b12d4805d..d8f99e20021 100644 --- a/json/src/vm/mod.rs +++ b/json/src/vm/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Vm test loader. diff --git a/json/src/vm/test.rs b/json/src/vm/test.rs index 10b4aae54f8..9dfe814ae82 100644 --- a/json/src/vm/test.rs +++ b/json/src/vm/test.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Vm test deserializer. diff --git a/json/src/vm/transaction.rs b/json/src/vm/transaction.rs index f21ed7aceff..4a9374531d5 100644 --- a/json/src/vm/transaction.rs +++ b/json/src/vm/transaction.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Executed transaction. use hash::Address; diff --git a/json/src/vm/vm.rs b/json/src/vm/vm.rs index 016ea256de2..1fbb937cb7f 100644 --- a/json/src/vm/vm.rs +++ b/json/src/vm/vm.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Vm execution env. diff --git a/license_header b/license_header index c83bb0d90a4..2fc672e4f1f 100644 --- a/license_header +++ b/license_header @@ -1,4 +1,4 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. // This file is part of Parity Ethereum. // Parity Ethereum is free software: you can redistribute it and/or modify diff --git a/machine/src/lib.rs b/machine/src/lib.rs index a3f640fe577..b7054ca038e 100644 --- a/machine/src/lib.rs +++ b/machine/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Generalization of a state machine for a consensus engine. //! This will define traits for the header, block, and state of a blockchain. @@ -112,6 +112,13 @@ pub trait Machine: for<'a> LocalizedMachine<'a> { /// Errors which can occur when querying or interacting with the machine. type Error; + + /// Get the balance, in base units, associated with an account. + /// Extracts data from the live block. + fn balance(&self, live: &Self::LiveBlock, address: &Address) -> Result; + + /// Increment the balance of an account in the state of the live block. + fn add_balance(&self, live: &mut Self::LiveBlock, address: &Address, amount: &U256) -> Result<(), Self::Error>; } /// Machine-related types localized to a specific lifetime. @@ -123,13 +130,3 @@ pub trait LocalizedMachine<'a>: Sync + Send { /// Generally also provides verifiable proofs. type StateContext: ?Sized + 'a; } - -/// A state machine that uses balances. -pub trait WithBalances: Machine { - /// Get the balance, in base units, associated with an account. - /// Extracts data from the live block. - fn balance(&self, live: &Self::LiveBlock, address: &Address) -> Result; - - /// Increment the balance of an account in the state of the live block. - fn add_balance(&self, live: &mut Self::LiveBlock, address: &Address, amount: &U256) -> Result<(), Self::Error>; -} diff --git a/miner/Cargo.toml b/miner/Cargo.toml index 29841c37555..02e64ad4f8d 100644 --- a/miner/Cargo.toml +++ b/miner/Cargo.toml @@ -15,24 +15,28 @@ url = { version = "1", optional = true } # Miner ansi_term = "0.10" +common-types = { path = "../ethcore/types" } error-chain = "0.12" -ethcore-transaction = { path = "../ethcore/transaction" } +ethabi = "6.0" +ethabi-derive = "6.0" +ethabi-contract = "6.0" +ethcore-call-contract = { path = "../ethcore/call-contract" } ethereum-types = "0.4" futures = "0.1" -parity-runtime = { path = "../util/runtime" } heapsize = "0.4" keccak-hash = "0.1" linked-hash-map = "0.5" log = "0.4" +parity-runtime = { path = "../util/runtime" } parking_lot = "0.7" -price-info = { path = "../price-info", optional = true } +price-info = { path = "./price-info", optional = true } rlp = { version = "0.3.0", features = ["ethereum"] } trace-time = "0.1" transaction-pool = "1.13" [dev-dependencies] env_logger = "0.5" -ethkey = { path = "../ethkey" } +ethkey = { path = "../accounts/ethkey" } rustc-hex = "1.0" [features] diff --git a/local-store/Cargo.toml b/miner/local-store/Cargo.toml similarity index 60% rename from local-store/Cargo.toml rename to miner/local-store/Cargo.toml index b92ba4cc43f..d16c6440719 100644 --- a/local-store/Cargo.toml +++ b/miner/local-store/Cargo.toml @@ -5,9 +5,8 @@ version = "0.1.0" authors = ["Parity Technologies "] [dependencies] -ethcore = { path = "../ethcore" } -ethcore-io = { path = "../util/io" } -ethcore-transaction = { path = "../ethcore/transaction" } +common-types = { path = "../../ethcore/types" } +ethcore-io = { path = "../../util/io" } kvdb = "0.1" log = "0.4" rlp = { version = "0.3.0", features = ["ethereum"] } @@ -16,6 +15,5 @@ serde_derive = "1.0" serde_json = "1.0" [dev-dependencies] -ethcore = { path = "../ethcore", features = ["test-helpers"] } -ethkey = { path = "../ethkey" } +ethkey = { path = "../../accounts/ethkey" } kvdb-memorydb = "0.1" diff --git a/local-store/src/lib.rs b/miner/local-store/src/lib.rs similarity index 92% rename from local-store/src/lib.rs rename to miner/local-store/src/lib.rs index aa75ada8fc0..56c573b06ff 100644 --- a/local-store/src/lib.rs +++ b/miner/local-store/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Manages local node data: pending local transactions, sync security level @@ -20,17 +20,15 @@ use std::sync::Arc; use std::fmt; use std::time::Duration; -use transaction::{ +use types::transaction::{ SignedTransaction, PendingTransaction, UnverifiedTransaction, Condition as TransactionCondition }; -use ethcore::client::ClientIoMessage; use io::IoHandler; use rlp::Rlp; use kvdb::KeyValueDB; -extern crate ethcore; -extern crate ethcore_transaction as transaction; +extern crate common_types as types; extern crate ethcore_io as io; extern crate rlp; extern crate serde_json; @@ -73,7 +71,7 @@ impl fmt::Display for Error { #[derive(Serialize, Deserialize)] enum Condition { - Number(::ethcore::header::BlockNumber), + Number(types::BlockNumber), Timestamp(u64), } @@ -204,14 +202,14 @@ impl LocalDataStore { } } -impl IoHandler for LocalDataStore { - fn initialize(&self, io: &::io::IoContext) { +impl IoHandler for LocalDataStore { + fn initialize(&self, io: &::io::IoContext) { if let Err(e) = io.register_timer(UPDATE_TIMER, UPDATE_TIMEOUT) { warn!(target: "local_store", "Error registering local store update timer: {}", e); } } - fn timeout(&self, _io: &::io::IoContext, timer: ::io::TimerToken) { + fn timeout(&self, _io: &::io::IoContext, timer: ::io::TimerToken) { if let UPDATE_TIMER = timer { if let Err(e) = self.update() { debug!(target: "local_store", "Error updating local store: {}", e); @@ -233,7 +231,7 @@ mod tests { use super::NodeInfo; use std::sync::Arc; - use transaction::{Transaction, Condition, PendingTransaction}; + use types::transaction::{Transaction, Condition, PendingTransaction}; use ethkey::{Brain, Generator}; // we want to test: round-trip of good transactions. diff --git a/price-info/Cargo.toml b/miner/price-info/Cargo.toml similarity index 68% rename from price-info/Cargo.toml rename to miner/price-info/Cargo.toml index d1eef9e53be..0b72fd37b37 100644 --- a/price-info/Cargo.toml +++ b/miner/price-info/Cargo.toml @@ -7,12 +7,12 @@ version = "1.12.0" authors = ["Parity Technologies "] [dependencies] -fetch = { path = "../util/fetch" } +fetch = { path = "../../util/fetch" } futures = "0.1" -parity-runtime = { path = "../util/runtime" } +parity-runtime = { path = "../../util/runtime" } log = "0.4" serde_json = "1.0" [dev-dependencies] parking_lot = "0.7" -fake-fetch = { path = "../util/fake-fetch" } +fake-fetch = { path = "../../util/fake-fetch" } diff --git a/price-info/src/lib.rs b/miner/price-info/src/lib.rs similarity index 94% rename from price-info/src/lib.rs rename to miner/price-info/src/lib.rs index ef6fafff654..4117f84c525 100644 --- a/price-info/src/lib.rs +++ b/miner/price-info/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . #![warn(missing_docs)] diff --git a/ethcore/res/contracts/service_transaction.json b/miner/res/contracts/service_transaction.json similarity index 100% rename from ethcore/res/contracts/service_transaction.json rename to miner/res/contracts/service_transaction.json diff --git a/miner/src/external.rs b/miner/src/external.rs index a56be42f021..f68e065abd0 100644 --- a/miner/src/external.rs +++ b/miner/src/external.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! External Miner hashrate tracker. diff --git a/miner/src/gas_price_calibrator.rs b/miner/src/gas_price_calibrator.rs index db22e07b114..7a0943640cf 100644 --- a/miner/src/gas_price_calibrator.rs +++ b/miner/src/gas_price_calibrator.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Auto-updates minimal gas price requirement from a price-info source. diff --git a/miner/src/gas_pricer.rs b/miner/src/gas_pricer.rs index 32877836529..c4e04442f19 100644 --- a/miner/src/gas_pricer.rs +++ b/miner/src/gas_pricer.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Auto-updates minimal gas price requirement. @@ -45,7 +45,7 @@ impl GasPricer { /// Recalibrate current gas price. pub fn recalibrate(&mut self, set_price: F) { match *self { - GasPricer::Fixed(ref max) => set_price(max.clone()), + GasPricer::Fixed(ref curr) => set_price(curr.clone()), #[cfg(feature = "price-info")] GasPricer::Calibrated(ref mut cal) => cal.recalibrate(set_price), } diff --git a/miner/src/lib.rs b/miner/src/lib.rs index 2288d1db180..55091093aca 100644 --- a/miner/src/lib.rs +++ b/miner/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . #![warn(missing_docs)] @@ -20,19 +20,25 @@ //! Keeps track of transactions and mined block. extern crate ansi_term; -extern crate ethcore_transaction as transaction; +extern crate common_types as types; +extern crate ethabi; +extern crate ethcore_call_contract as call_contract; extern crate ethereum_types; extern crate futures; -extern crate parity_runtime; extern crate heapsize; extern crate keccak_hash as hash; extern crate linked_hash_map; +extern crate parity_runtime; extern crate parking_lot; #[cfg(feature = "price-info")] extern crate price_info; extern crate rlp; extern crate transaction_pool as txpool; +#[macro_use] +extern crate ethabi_contract; +#[macro_use] +extern crate ethabi_derive; #[macro_use] extern crate error_chain; #[macro_use] @@ -51,6 +57,8 @@ pub mod external; #[cfg(feature = "price-info")] pub mod gas_price_calibrator; pub mod gas_pricer; +pub mod local_accounts; pub mod pool; +pub mod service_transaction_checker; #[cfg(feature = "work-notify")] pub mod work_notify; diff --git a/miner/src/local_accounts.rs b/miner/src/local_accounts.rs new file mode 100644 index 00000000000..23bcf814425 --- /dev/null +++ b/miner/src/local_accounts.rs @@ -0,0 +1,43 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +//! Local Accounts checker + +use std::collections::HashSet; + +use ethereum_types::Address; + +/// Local accounts checker +pub trait LocalAccounts: Send + Sync { + /// Returns true if given address should be considered local account. + fn is_local(&self, &Address) -> bool; +} + +impl LocalAccounts for HashSet
{ + fn is_local(&self, address: &Address) -> bool { + self.contains(address) + } +} + +impl LocalAccounts for (A, B) where + A: LocalAccounts, + B: LocalAccounts, +{ + fn is_local(&self, address: &Address) -> bool { + self.0.is_local(address) || self.1.is_local(address) + } +} + diff --git a/miner/src/pool/client.rs b/miner/src/pool/client.rs index bdf57312eec..bcd2b968954 100644 --- a/miner/src/pool/client.rs +++ b/miner/src/pool/client.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Transaction Pool state client. //! @@ -23,7 +23,7 @@ use std::fmt; use ethereum_types::{U256, H256, H160 as Address}; -use transaction; +use types::transaction; /// Account Details #[derive(Debug, Clone)] diff --git a/miner/src/pool/listener.rs b/miner/src/pool/listener.rs index f5e76e15d52..fac98b0a17c 100644 --- a/miner/src/pool/listener.rs +++ b/miner/src/pool/listener.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Notifier for new transaction hashes. @@ -120,7 +120,7 @@ impl txpool::Listener for Logger { mod tests { use super::*; use parking_lot::Mutex; - use transaction; + use types::transaction; use txpool::Listener; #[test] diff --git a/miner/src/pool/local_transactions.rs b/miner/src/pool/local_transactions.rs index a71d9244cd6..c805484d1ce 100644 --- a/miner/src/pool/local_transactions.rs +++ b/miner/src/pool/local_transactions.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Local Transactions List. @@ -236,7 +236,7 @@ mod tests { use super::*; use ethereum_types::U256; use ethkey::{Random, Generator}; - use transaction; + use types::transaction; use txpool::Listener; use pool; diff --git a/miner/src/pool/mod.rs b/miner/src/pool/mod.rs index ccfbba7f800..561b85f4bc5 100644 --- a/miner/src/pool/mod.rs +++ b/miner/src/pool/mod.rs @@ -1,24 +1,24 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Transaction Pool use ethereum_types::{U256, H256, Address}; use heapsize::HeapSizeOf; -use transaction; +use types::transaction; use txpool; mod listener; diff --git a/miner/src/pool/queue.rs b/miner/src/pool/queue.rs index 612ec1af080..51c46ad823c 100644 --- a/miner/src/pool/queue.rs +++ b/miner/src/pool/queue.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Ethereum Transaction Queue @@ -23,8 +23,8 @@ use std::collections::{BTreeMap, BTreeSet, HashMap}; use ethereum_types::{H256, U256, Address}; use parking_lot::RwLock; -use transaction; use txpool::{self, Verifier}; +use types::transaction; use pool::{ self, scoring, verifier, client, ready, listener, @@ -474,7 +474,7 @@ impl TransactionQueue { self.pool.read().pending_from_sender(state_readiness, address) .last() - .map(|tx| tx.signed().nonce + 1) + .map(|tx| tx.signed().nonce.saturating_add(U256::from(1))) } /// Retrieve a transaction from the pool. diff --git a/miner/src/pool/ready.rs b/miner/src/pool/ready.rs index 26ea35dd47e..3accba13903 100644 --- a/miner/src/pool/ready.rs +++ b/miner/src/pool/ready.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Transaction Readiness indicator //! @@ -42,8 +42,8 @@ use std::cmp; use std::collections::HashMap; use ethereum_types::{U256, H160 as Address}; -use transaction; use txpool::{self, VerifiedTransaction as PoolVerifiedTransaction}; +use types::transaction; use super::client::NonceClient; use super::VerifiedTransaction; @@ -95,7 +95,7 @@ impl txpool::Ready for State { }, cmp::Ordering::Less => txpool::Readiness::Stale, cmp::Ordering::Equal => { - *nonce = *nonce + 1; + *nonce = nonce.saturating_add(U256::from(1)); txpool::Readiness::Ready }, } @@ -159,7 +159,7 @@ impl Option> txpool::Ready for Opt cmp::Ordering::Greater => txpool::Readiness::Future, cmp::Ordering::Less => txpool::Readiness::Stale, cmp::Ordering::Equal => { - *nonce = *nonce + 1; + *nonce = nonce.saturating_add(U256::from(1)); txpool::Readiness::Ready }, } diff --git a/miner/src/pool/scoring.rs b/miner/src/pool/scoring.rs index 61fcf4e418a..aff7ac49ef4 100644 --- a/miner/src/pool/scoring.rs +++ b/miner/src/pool/scoring.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Transaction Scoring and Ordering //! @@ -123,15 +123,16 @@ impl

txpool::Scoring

for NonceAndGasPrice where P: ScoredTransaction + txp } fn should_replace(&self, old: &P, new: &P) -> scoring::Choice { + let both_local = old.priority().is_local() && new.priority().is_local(); if old.sender() == new.sender() { // prefer earliest transaction match new.nonce().cmp(&old.nonce()) { + cmp::Ordering::Equal => self.choose(old, new), + _ if both_local => scoring::Choice::InsertNew, cmp::Ordering::Less => scoring::Choice::ReplaceOld, cmp::Ordering::Greater => scoring::Choice::RejectNew, - cmp::Ordering::Equal => self.choose(old, new), } - } else if old.priority().is_local() && new.priority().is_local() { - // accept local transactions over the limit + } else if both_local { scoring::Choice::InsertNew } else { let old_score = (old.priority(), old.gas_price()); @@ -141,7 +142,7 @@ impl

txpool::Scoring

for NonceAndGasPrice where P: ScoredTransaction + txp } else { scoring::Choice::RejectNew } - } + } } fn should_ignore_sender_limit(&self, new: &P) -> bool { @@ -154,11 +155,66 @@ mod tests { use super::*; use std::sync::Arc; - use ethkey::{Random, Generator}; + use ethkey::{Random, Generator, KeyPair}; use pool::tests::tx::{Tx, TxExt}; use txpool::Scoring; use txpool::scoring::Choice::*; + fn local_tx_verified(tx: Tx, keypair: &KeyPair) -> VerifiedTransaction { + let mut verified_tx = tx.unsigned().sign(keypair.secret(), None).verified(); + verified_tx.priority = ::pool::Priority::Local; + verified_tx + } + + #[test] + fn should_always_accept_local_transactions_unless_same_sender_and_nonce() { + let scoring = NonceAndGasPrice(PrioritizationStrategy::GasPriceOnly); + + // same sender txs + let keypair = Random.generate().unwrap(); + + let same_sender_tx1 = local_tx_verified(Tx { + nonce: 1, + gas_price: 1, + ..Default::default() + }, &keypair); + + let same_sender_tx2 = local_tx_verified(Tx { + nonce: 2, + gas_price: 100, + ..Default::default() + }, &keypair); + + let same_sender_tx3 = local_tx_verified(Tx { + nonce: 2, + gas_price: 200, + ..Default::default() + }, &keypair); + + // different sender txs + let different_sender_tx1 = local_tx_verified(Tx { + nonce: 2, + gas_price: 1, + ..Default::default() + }, &Random.generate().unwrap()); + + let different_sender_tx2 = local_tx_verified(Tx { + nonce: 1, + gas_price: 10, + ..Default::default() + }, &Random.generate().unwrap()); + + assert_eq!(scoring.should_replace(&same_sender_tx1, &same_sender_tx2), InsertNew); + assert_eq!(scoring.should_replace(&same_sender_tx2, &same_sender_tx1), InsertNew); + + assert_eq!(scoring.should_replace(&different_sender_tx1, &different_sender_tx2), InsertNew); + assert_eq!(scoring.should_replace(&different_sender_tx2, &different_sender_tx1), InsertNew); + + // txs with same sender and nonce + assert_eq!(scoring.should_replace(&same_sender_tx2, &same_sender_tx3), ReplaceOld); + assert_eq!(scoring.should_replace(&same_sender_tx3, &same_sender_tx2), RejectNew); + } + #[test] fn should_replace_same_sender_by_nonce() { let scoring = NonceAndGasPrice(PrioritizationStrategy::GasPriceOnly); diff --git a/miner/src/pool/tests/client.rs b/miner/src/pool/tests/client.rs index 08b43f12adf..4735fbd64d4 100644 --- a/miner/src/pool/tests/client.rs +++ b/miner/src/pool/tests/client.rs @@ -1,24 +1,24 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::{atomic, Arc}; use ethereum_types::{U256, H256, Address}; use rlp::Rlp; -use transaction::{self, Transaction, SignedTransaction, UnverifiedTransaction}; +use types::transaction::{self, Transaction, SignedTransaction, UnverifiedTransaction}; use pool; use pool::client::AccountDetails; diff --git a/miner/src/pool/tests/mod.rs b/miner/src/pool/tests/mod.rs index 2fc68d0ac71..0eb223dba00 100644 --- a/miner/src/pool/tests/mod.rs +++ b/miner/src/pool/tests/mod.rs @@ -1,21 +1,21 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethereum_types::U256; -use transaction::{self, PendingTransaction}; +use types::transaction::{self, PendingTransaction}; use txpool; use pool::{verifier, TransactionQueue, PrioritizationStrategy, PendingSettings, PendingOrdering}; @@ -30,7 +30,7 @@ use self::client::TestClient; // to the global use allocator, the value is currently // set to reflect malloc usage. // 50 was enough when using jmalloc. -const TEST_QUEUE_MAX_MEM: usize = 80; +const TEST_QUEUE_MAX_MEM: usize = 100; fn new_queue() -> TransactionQueue { TransactionQueue::new( @@ -97,7 +97,7 @@ fn should_return_correct_nonces_when_dropped_because_of_limit() { Ok(()) ]); assert_eq!(txq.status().status.transaction_count, 3); - // tx2 transacton got dropped because of limit + // tx2 transaction got dropped because of limit // tx1 and tx1' are kept, because they have lower insertion_ids so they are preferred. assert_eq!(txq.next_nonce(TestClient::new(), &sender), None); } @@ -1037,7 +1037,6 @@ fn should_reject_early_in_case_gas_price_is_less_than_min_effective() { assert_eq!(txq.status().status.transaction_count, 1); } - #[test] fn should_not_reject_early_in_case_gas_price_is_less_than_min_effective() { // given diff --git a/miner/src/pool/tests/tx.rs b/miner/src/pool/tests/tx.rs index 78cd8502456..b8f6dca676d 100644 --- a/miner/src/pool/tests/tx.rs +++ b/miner/src/pool/tests/tx.rs @@ -1,23 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethereum_types::{U256, H256}; use ethkey::{Random, Generator}; use rustc_hex::FromHex; -use transaction::{self, Transaction, SignedTransaction, UnverifiedTransaction}; +use types::transaction::{self, Transaction, SignedTransaction, UnverifiedTransaction}; use pool::{verifier, VerifiedTransaction}; diff --git a/miner/src/pool/verifier.rs b/miner/src/pool/verifier.rs index eaa13b3da1f..1fded37630e 100644 --- a/miner/src/pool/verifier.rs +++ b/miner/src/pool/verifier.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Transaction Verifier //! @@ -28,8 +28,8 @@ use std::sync::atomic::{self, AtomicUsize}; use ethereum_types::{U256, H256}; use rlp::Encodable; -use transaction; use txpool; +use types::transaction; use super::client::{Client, TransactionType}; use super::VerifiedTransaction; @@ -283,7 +283,19 @@ impl txpool::Verifier for Verifier. +// along with Parity Ethereum. If not, see . //! A service transactions contract checker. -use client::{RegistryInfo, CallContract, BlockId}; -use transaction::SignedTransaction; +use call_contract::{CallContract, RegistryInfo}; +use types::ids::BlockId; +use types::transaction::SignedTransaction; use ethabi::FunctionOutputDecoder; +use ethereum_types::Address; use_contract!(service_transaction, "res/contracts/service_transaction.json"); @@ -29,23 +31,24 @@ const SERVICE_TRANSACTION_CONTRACT_REGISTRY_NAME: &'static str = "service_transa pub struct ServiceTransactionChecker; impl ServiceTransactionChecker { - /// Checks if given address is whitelisted to send service transactions. + /// Checks if given address in tx is whitelisted to send service transactions. pub fn check(&self, client: &C, tx: &SignedTransaction) -> Result { let sender = tx.sender(); - let hash = tx.hash(); - // Skip checking the contract if the transaction does not have zero gas price if !tx.gas_price.is_zero() { return Ok(false) } - let address = client.registry_address(SERVICE_TRANSACTION_CONTRACT_REGISTRY_NAME.to_owned(), BlockId::Latest) - .ok_or_else(|| "contract is not configured")?; - - trace!(target: "txqueue", "[{:?}] Checking service transaction checker contract from {}", hash, sender); + self.check_address(client, sender) + } + /// Checks if given address is whitelisted to send service transactions. + pub fn check_address(&self, client: &C, sender: Address) -> Result { + let contract_address = client.registry_address(SERVICE_TRANSACTION_CONTRACT_REGISTRY_NAME.to_owned(), BlockId::Latest) + .ok_or_else(|| "contract is not configured")?; + trace!(target: "txqueue", "Checking service transaction checker contract from {}", sender); let (data, decoder) = service_transaction::functions::certified::call(sender); - let value = client.call_contract(BlockId::Latest, address, data)?; + let value = client.call_contract(BlockId::Latest, contract_address, data)?; decoder.decode(&value).map_err(|e| e.to_string()) } } diff --git a/miner/src/work_notify.rs b/miner/src/work_notify.rs index e23db64bfde..367990f2255 100644 --- a/miner/src/work_notify.rs +++ b/miner/src/work_notify.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Sends HTTP notifications to a list of URLs every time new work is available. diff --git a/miner/stratum/Cargo.toml b/miner/stratum/Cargo.toml new file mode 100644 index 00000000000..a7e13ef681c --- /dev/null +++ b/miner/stratum/Cargo.toml @@ -0,0 +1,19 @@ +[package] +description = "Ethcore stratum lib" +name = "ethcore-stratum" +version = "1.12.0" +license = "GPL-3.0" +authors = ["Parity Technologies "] + +[dependencies] +ethereum-types = "0.4" +keccak-hash = "0.1" +jsonrpc-core = "10.0.1" +jsonrpc-tcp-server = "10.0.1" +log = "0.4" +parking_lot = "0.7" + +[dev-dependencies] +env_logger = "0.5" +tokio = "0.1" +tokio-io = "0.1" diff --git a/ethcore/stratum/src/lib.rs b/miner/stratum/src/lib.rs similarity index 96% rename from ethcore/stratum/src/lib.rs rename to miner/stratum/src/lib.rs index 7a8234ced4a..5ee0296dacf 100644 --- a/ethcore/stratum/src/lib.rs +++ b/miner/stratum/src/lib.rs @@ -1,24 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Stratum protocol implementation for parity ethereum/bitcoin clients extern crate jsonrpc_tcp_server; extern crate jsonrpc_core; -extern crate jsonrpc_macros; extern crate ethereum_types; extern crate keccak_hash as hash; extern crate parking_lot; @@ -27,7 +26,7 @@ extern crate parking_lot; #[cfg(test)] extern crate tokio; #[cfg(test)] extern crate tokio_io; -#[cfg(test)] extern crate ethcore_logger; +#[cfg(test)] extern crate env_logger; mod traits; @@ -39,8 +38,7 @@ use jsonrpc_tcp_server::{ Server as JsonRpcServer, ServerBuilder as JsonRpcServerBuilder, RequestContext, MetaExtractor, Dispatcher, PushMessageError, }; -use jsonrpc_core::{MetaIoHandler, Params, to_value, Value, Metadata, Compatibility}; -use jsonrpc_macros::IoDelegate; +use jsonrpc_core::{MetaIoHandler, Params, to_value, Value, Metadata, Compatibility, IoDelegate}; use std::sync::Arc; use std::net::SocketAddr; @@ -329,8 +327,6 @@ mod tests { use tokio::{io, runtime::Runtime, timer::timeout::{self, Timeout}, net::TcpStream}; use jsonrpc_core::futures::{Future, future}; - use ethcore_logger::init_log; - pub struct VoidManager; impl JobDispatcher for VoidManager { @@ -369,7 +365,7 @@ mod tests { #[test] fn records_subscriber() { - init_log(); + let _ = ::env_logger::try_init(); let addr = "127.0.0.1:19985".parse().unwrap(); let stratum = Stratum::start(&addr, Arc::new(VoidManager), None).unwrap(); @@ -443,7 +439,7 @@ mod tests { #[test] fn can_push_work() { - init_log(); + let _ = ::env_logger::try_init(); let addr = "127.0.0.1:19995".parse().unwrap(); let stratum = Stratum::start( diff --git a/ethcore/stratum/src/traits.rs b/miner/stratum/src/traits.rs similarity index 86% rename from ethcore/stratum/src/traits.rs rename to miner/stratum/src/traits.rs index d1bb9a4da73..36b95a0169e 100644 --- a/ethcore/stratum/src/traits.rs +++ b/miner/stratum/src/traits.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std; use std::error::Error as StdError; diff --git a/util/using_queue/Cargo.toml b/miner/using-queue/Cargo.toml similarity index 100% rename from util/using_queue/Cargo.toml rename to miner/using-queue/Cargo.toml diff --git a/util/using_queue/src/lib.rs b/miner/using-queue/src/lib.rs similarity index 96% rename from util/using_queue/src/lib.rs rename to miner/using-queue/src/lib.rs index 42fe1a33ad7..56e99879db7 100644 --- a/util/using_queue/src/lib.rs +++ b/miner/using-queue/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Queue-like datastructure including notion of usage. diff --git a/parity-clib-examples/cpp/main.cpp b/parity-clib-examples/cpp/main.cpp deleted file mode 100644 index c5e83d06492..00000000000 --- a/parity-clib-examples/cpp/main.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -#include -#include -#include -#include -#include -#include - -void on_restart(void*, const char*, size_t) {} - -int main() { - ParityParams cfg = { 0 }; - cfg.on_client_restart_cb = on_restart; - - const char* args[] = {"--no-ipc"}; - size_t str_lens[] = {8}; - if (parity_config_from_cli(args, str_lens, 1, &cfg.configuration) != 0) { - return 1; - } - - void* parity; - if (parity_start(&cfg, &parity) != 0) { - return 1; - } - - const char* rpc = "{\"method\":\"parity_versionInfo\",\"params\":[],\"id\":1,\"jsonrpc\":\"2.0\"}"; - size_t out_len = 256; - char* out = (char*)malloc(out_len + 1); - if (parity_rpc(parity, rpc, strlen(rpc), out, &out_len)) { - return 1; - } - out[out_len] = '\0'; - printf("RPC output: %s", out); - free(out); - - sleep(5); - if (parity != NULL) { - parity_destroy(parity); - } - - return 0; -} diff --git a/parity-clib/Cargo.toml b/parity-clib/Cargo.toml index e603ca2de06..f57e503dea6 100644 --- a/parity-clib/Cargo.toml +++ b/parity-clib/Cargo.toml @@ -10,9 +10,12 @@ name = "parity" crate-type = ["cdylib", "staticlib"] [dependencies] -panic_hook = { path = "../util/panic_hook" } +futures = "0.1.6" +jni = { version = "0.11", optional = true } +panic_hook = { path = "../util/panic-hook" } parity-ethereum = { path = "../", default-features = false } -jni = { version = "0.10.1", optional = true } +tokio = "0.1.11" +tokio-current-thread = "0.1.3" [features] default = [] diff --git a/parity-clib/Parity.java b/parity-clib/Parity.java index 7e70917ae36..3885cfb1e68 100644 --- a/parity-clib/Parity.java +++ b/parity-clib/Parity.java @@ -1,4 +1,4 @@ -// Copyright 2018 Parity Technologies (UK) Ltd. +// Copyright 2018-2019 Parity Technologies (UK) Ltd. // This file is part of Parity. // Parity is free software: you can redistribute it and/or modify @@ -20,44 +20,67 @@ * Interface to the Parity client. */ public class Parity { - /** - * Starts the Parity client with the CLI options passed as an array of strings. - * - * Each space-delimited option corresponds to an array entry. - * For example: `["--port", "12345"]` - * - * @param options The CLI options to start Parity with - */ - public Parity(String[] options) { - long config = configFromCli(options); - inner = build(config); - } - - /** Performs a synchronous RPC query. - * - * Note that this will block the current thread until the query is finished. You are - * encouraged to create a background thread if you don't want to block. - * - * @param query The JSON-encoded RPC query to perform - * @return A JSON-encoded result - */ - public String rpcQuery(String query) { - return rpcQueryNative(inner, query); - } - - @Override - protected void finalize​() { - destroy(inner); - } - - static { - System.loadLibrary("parity"); - } - - private static native long configFromCli(String[] cliOptions); - private static native long build(long config); - private static native void destroy(long inner); - private static native String rpcQueryNative(long inner, String rpc); - - private long inner; + /** + * Starts the Parity client with the CLI options passed as an array of strings. + * + * Each space-delimited option corresponds to an array entry. + * For example: `["--port", "12345"]` + * + * @param options The CLI options to start Parity with + */ + public Parity(String[] options, String loggerMode, String loggerFile) { + long config = configFromCli(options); + inner = build(config, loggerMode, loggerFile); + } + + /** Performs an asynchronous RPC query by spawning a background thread that is executed until + * either a response is received or the timeout has been expired. + * + * @param query The JSON-encoded RPC query to perform + * @param timeoutMillis The maximum time in milliseconds that the query will run + * @param callback An instance of class which must have a instance method named `callback` that will be + * invoke when the result is ready + */ + public void rpcQuery(String query, long timeoutMillis, Object callback) { + rpcQueryNative(inner, query, timeoutMillis, callback); + } + + /** Subscribes to a specific WebSocket event that will run in a background thread until it is canceled. + * + * @param query The JSON-encoded RPC query to perform + * @param callback An instance of class which must have a instance method named `callback` that will be invoked + * when the result is ready + * + * @return A pointer to the current sessions which can be used to terminate the session later + */ + public long subscribeWebSocket(String query, Object callback) { + return subscribeWebSocketNative(inner, query, callback); + } + + /** Unsubscribes to a specific WebSocket event + * + * @param session Pointer the the session to terminate + */ + public void unsubscribeWebSocket(long session) { + unsubscribeWebSocketNative(session); + } + + // FIXME: `finalize` is deprecated - https://github.com/paritytech/parity-ethereum/issues/10066 + @Override + protected void finalize​() { + destroy(inner); + } + + static { + System.loadLibrary("parity"); + } + + private static native long configFromCli(String[] cliOptions); + private static native long build(long config, String loggerMode, String loggerFile); + private static native void destroy(long inner); + private static native void rpcQueryNative(long inner, String rpc, long timeoutMillis, Object callback); + private static native long subscribeWebSocketNative(long inner, String rpc, Object callback); + private static native void unsubscribeWebSocketNative(long session); + + private long inner; } diff --git a/parity-clib-examples/cpp/CMakeLists.txt b/parity-clib/examples/cpp/CMakeLists.txt similarity index 65% rename from parity-clib-examples/cpp/CMakeLists.txt rename to parity-clib/examples/cpp/CMakeLists.txt index ed62290617e..8cc6aef8f5c 100644 --- a/parity-clib-examples/cpp/CMakeLists.txt +++ b/parity-clib/examples/cpp/CMakeLists.txt @@ -1,8 +1,7 @@ cmake_minimum_required(VERSION 3.5) include(ExternalProject) - -include_directories("${CMAKE_SOURCE_DIR}/../../parity-clib") - +include_directories("${CMAKE_SOURCE_DIR}/../..") +set (CMAKE_CXX_STANDARD 11) # Enfore C++11 add_executable(parity-example main.cpp) ExternalProject_Add( @@ -11,9 +10,9 @@ ExternalProject_Add( CONFIGURE_COMMAND "" BUILD_COMMAND "" COMMAND cargo build -p parity-clib # Note: use --release in a real project - BINARY_DIR "${CMAKE_SOURCE_DIR}/../../target" + BINARY_DIR "${CMAKE_SOURCE_DIR}/../../../target" INSTALL_COMMAND "" LOG_BUILD ON) add_dependencies(parity-example libparity) -target_link_libraries(parity-example "${CMAKE_SOURCE_DIR}/../../target/debug/libparity.so") +target_link_libraries(parity-example "${CMAKE_SOURCE_DIR}/../../../target/debug/${CMAKE_SHARED_LIBRARY_PREFIX}parity${CMAKE_SHARED_LIBRARY_SUFFIX}") diff --git a/parity-clib/examples/cpp/main.cpp b/parity-clib/examples/cpp/main.cpp new file mode 100644 index 00000000000..43b31d793fa --- /dev/null +++ b/parity-clib/examples/cpp/main.cpp @@ -0,0 +1,185 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +#include +#include +#include +#include +#include + +void* parity_run(std::vector); +int parity_subscribe_to_websocket(void*); +int parity_rpc_queries(void*); + +const int SUBSCRIPTION_ID_LEN = 18; +const size_t TIMEOUT_ONE_MIN_AS_MILLIS = 60 * 1000; +const unsigned int CALLBACK_RPC = 1; +const unsigned int CALLBACK_WS = 2; + +struct Callback { + unsigned int type; + long unsigned int counter; +}; + +// list of rpc queries +const std::vector rpc_queries { + "{\"method\":\"parity_versionInfo\",\"params\":[],\"id\":1,\"jsonrpc\":\"2.0\"}", + "{\"method\":\"eth_getTransactionReceipt\",\"params\":[\"0x444172bef57ad978655171a8af2cfd89baa02a97fcb773067aef7794d6913fff\"],\"id\":1,\"jsonrpc\":\"2.0\"}", + "{\"method\":\"eth_estimateGas\",\"params\":[{\"from\":\"0x0066Dc48bb833d2B59f730F33952B3c29fE926F5\"}],\"id\":1,\"jsonrpc\":\"2.0\"}", + "{\"method\":\"eth_getBalance\",\"params\":[\"0x0066Dc48bb833d2B59f730F33952B3c29fE926F5\"],\"id\":1,\"jsonrpc\":\"2.0\"}" +}; + +// list of subscriptions +const std::vector ws_subscriptions { + "{\"method\":\"parity_subscribe\",\"params\":[\"eth_getBalance\",[\"0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826\",\"latest\"]],\"id\":1,\"jsonrpc\":\"2.0\"}", + "{\"method\":\"parity_subscribe\",\"params\":[\"parity_netPeers\"],\"id\":1,\"jsonrpc\":\"2.0\"}", + "{\"method\":\"eth_subscribe\",\"params\":[\"newHeads\"],\"id\":1,\"jsonrpc\":\"2.0\"}" +}; + +// callback that gets invoked upon an event +void callback(void* user_data, const char* response, size_t _len) { + Callback* cb = static_cast(user_data); + if (cb->type == CALLBACK_RPC) { + cb->counter -= 1; + } else if (cb->type == CALLBACK_WS) { + std::regex is_subscription ("\\{\"jsonrpc\":\"2.0\",\"result\":\"0[xX][a-fA-F0-9]{16}\",\"id\":1\\}"); + if (std::regex_match(response, is_subscription) == true) { + cb->counter -= 1; + } + } +} + +int main() { + // run full-client + { + std::vector config = {"--no-ipc" , "--jsonrpc-apis=all", "--chain", "kovan"}; + void* parity = parity_run(config); + if (parity_rpc_queries(parity)) { + printf("rpc_queries failed\r\n"); + return 1; + } + + if (parity_subscribe_to_websocket(parity)) { + printf("ws_queries failed\r\n"); + return 1; + } + + if (parity != nullptr) { + parity_destroy(parity); + } + } + + // run light-client + { + std::vector light_config = {"--no-ipc", "--light", "--jsonrpc-apis=all", "--chain", "kovan"}; + void* parity = parity_run(light_config); + + if (parity_rpc_queries(parity)) { + printf("rpc_queries failed\r\n"); + return 1; + } + + if (parity_subscribe_to_websocket(parity)) { + printf("ws_queries failed\r\n"); + return 1; + } + + if (parity != nullptr) { + parity_destroy(parity); + } + } + return 0; +} + +int parity_rpc_queries(void* parity) { + if (!parity) { + return 1; + } + + Callback cb { .type = CALLBACK_RPC, .counter = rpc_queries.size() }; + + for (auto query : rpc_queries) { + if (parity_rpc(parity, query.c_str(), query.length(), TIMEOUT_ONE_MIN_AS_MILLIS, callback, &cb) != 0) { + return 1; + } + } + + while(cb.counter != 0); + return 0; +} + + +int parity_subscribe_to_websocket(void* parity) { + if (!parity) { + return 1; + } + + std::vector sessions; + + Callback cb { .type = CALLBACK_WS, .counter = ws_subscriptions.size() }; + + for (auto sub : ws_subscriptions) { + void *const session = parity_subscribe_ws(parity, sub.c_str(), sub.length(), callback, &cb); + if (!session) { + return 1; + } + sessions.push_back(session); + } + + while(cb.counter != 0); + std::this_thread::sleep_for(std::chrono::seconds(60)); + for (auto session : sessions) { + parity_unsubscribe_ws(session); + } + return 0; +} + +void* parity_run(std::vector args) { + ParityParams cfg = { + .configuration = nullptr, + .on_client_restart_cb = callback, + .on_client_restart_cb_custom = nullptr, + .logger = nullptr + }; + + std::vector str_lens; + + for (auto arg: args) { + str_lens.push_back(std::strlen(arg)); + } + + // make sure no out-of-range access happens here + if (args.empty()) { + if (parity_config_from_cli(nullptr, nullptr, 0, &cfg.configuration) != 0) { + return nullptr; + } + } else { + if (parity_config_from_cli(&args[0], &str_lens[0], args.size(), &cfg.configuration) != 0) { + return nullptr; + } + } + + // enable logging but only the `rpc module` and don't write it to a file + char log_mode [] = "rpc=trace"; + parity_set_logger(log_mode, strlen(log_mode), nullptr, 0, &cfg.logger); + + void *parity = nullptr; + if (parity_start(&cfg, &parity) != 0) { + return nullptr; + } + + return parity; +} diff --git a/parity-clib/examples/java/Main.java b/parity-clib/examples/java/Main.java new file mode 100644 index 00000000000..c20b9e34d6f --- /dev/null +++ b/parity-clib/examples/java/Main.java @@ -0,0 +1,105 @@ +// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import java.util.Vector; +import java.util.concurrent.atomic.AtomicInteger; +import io.parity.ethereum.Parity; + +class Main { + public static final int ONE_MINUTE_AS_MILLIS = 60 * 1000; + + public static final String[] rpc_queries = { + "{\"method\":\"parity_versionInfo\",\"params\":[],\"id\":1,\"jsonrpc\":\"2.0\"}", + "{\"method\":\"eth_getTransactionReceipt\",\"params\":[\"0x444172bef57ad978655171a8af2cfd89baa02a97fcb773067aef7794d6913fff\"],\"id\":1,\"jsonrpc\":\"2.0\"}", + "{\"method\":\"eth_estimateGas\",\"params\":[{\"from\":\"0x0066Dc48bb833d2B59f730F33952B3c29fE926F5\"}],\"id\":1,\"jsonrpc\":\"2.0\"}", + "{\"method\":\"eth_getBalance\",\"params\":[\"0x0066Dc48bb833d2B59f730F33952B3c29fE926F5\"],\"id\":1,\"jsonrpc\":\"2.0\"}" + }; + + public static final String[] ws_queries = { + "{\"method\":\"parity_subscribe\",\"params\":[\"eth_getBalance\",[\"0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826\",\"latest\"]],\"id\":1,\"jsonrpc\":\"2.0\"}", + "{\"method\":\"parity_subscribe\",\"params\":[\"parity_netPeers\"],\"id\":1,\"jsonrpc\":\"2.0\"}", + "{\"method\":\"eth_subscribe\",\"params\":[\"newHeads\"],\"id\":1,\"jsonrpc\":\"2.0\"}" + }; + + public static void runParity(String[] config) { + String loggerMode = "rpc=trace"; + String loggerFile = "foo.log"; + Parity parity = new Parity(config, loggerMode, loggerFile); + + Callback rpcCallback = new Callback(1); + Callback webSocketCallback = new Callback(2); + + for (String query : rpc_queries) { + parity.rpcQuery(query, ONE_MINUTE_AS_MILLIS, rpcCallback); + } + + while (rpcCallback.getNumCallbacks() != 4); + + Vector sessions = new Vector(); + + for (String ws : ws_queries) { + long session = parity.subscribeWebSocket(ws, webSocketCallback); + sessions.add(session); + } + + try { + Thread.sleep(ONE_MINUTE_AS_MILLIS); + } catch (Exception e) { + System.out.println(e); + } + + for (long session : sessions) { + parity.unsubscribeWebSocket(session); + } + + // Force GC to destroy parity + parity = null; + System.gc(); + } + + public static void main(String[] args) { + String[] full = {"--no-ipc" , "--jsonrpc-apis=all", "--chain", "kovan"}; + String[] light = {"--no-ipc", "--light", "--jsonrpc-apis=all", "--chain", "kovan"}; + + runParity(full); + + try { + Thread.sleep(ONE_MINUTE_AS_MILLIS); + } catch (Exception e) { + System.out.println(e); + } + + runParity(light); + } +} + +class Callback { + private AtomicInteger counter; + private final int callbackType; + + public Callback(int type) { + counter = new AtomicInteger(); + callbackType = type; + } + + public void callback(Object response) { + counter.getAndIncrement(); + } + + public int getNumCallbacks() { + return counter.intValue(); + } +} diff --git a/parity-clib/examples/java/README.md b/parity-clib/examples/java/README.md new file mode 100644 index 00000000000..ec83905bf2b --- /dev/null +++ b/parity-clib/examples/java/README.md @@ -0,0 +1,9 @@ +parity-clib: Java example +=================================== + +An example Java application to demonstrate how to use `jni` bindings to parity-ethereum. Note, that the example is built in debug-mode to reduce the build time. If you want to use it in real project use release-mode instead to facilitate all compiler optimizations. + +## How to compile and run + +1. Make sure you have installed [JDK](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) +2. Run `run.sh` \ No newline at end of file diff --git a/parity-clib/examples/java/run.sh b/parity-clib/examples/java/run.sh new file mode 100755 index 00000000000..428a7dc751f --- /dev/null +++ b/parity-clib/examples/java/run.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +FLAGS="-Xlint:deprecation" +PARITY_JAVA="../../Parity.java" +# parity-clib must be built with feature `jni` in debug-mode to work +PARITY_LIB=".:../../../target/debug/" + +# build +cd .. +cargo build --features jni +cd - +javac $FLAGS -d $PWD $PARITY_JAVA +javac $FLAGS *.java +# Setup the path `libparity.so` and run +java -Djava.library.path=$PARITY_LIB Main diff --git a/parity-clib/parity.h b/parity-clib/parity.h index 9be077b4d30..7bba08e4337 100644 --- a/parity-clib/parity.h +++ b/parity-clib/parity.h @@ -1,4 +1,4 @@ -// Copyright 2018 Parity Technologies (UK) Ltd. +// Copyright 2018-2019 Parity Technologies (UK) Ltd. // This file is part of Parity. // Parity is free software: you can redistribute it and/or modify @@ -35,6 +35,9 @@ struct ParityParams { /// Custom parameter passed to the `on_client_restart_cb` callback as first parameter. void *on_client_restart_cb_custom; + + /// Logger object which must be created by the `parity_config_logger` function + void *logger; }; #ifdef __cplusplus @@ -57,12 +60,39 @@ extern "C" { /// const char *args[] = {"--light", "--can-restart"}; /// size_t str_lens[] = {7, 13}; /// if (parity_config_from_cli(args, str_lens, 2, &cfg) != 0) { -/// return 1; +/// return 1; /// } /// ``` /// int parity_config_from_cli(char const* const* args, size_t const* arg_lens, size_t len, void** out); +/// Builds a new logger object which should be a member of the `ParityParams struct` +/// +/// - log_mode : String representing the log mode according to `Rust LOG` or nullptr to disable logging. +/// See module documentation for `ethcore-logger` for more info. +/// - log_mode_len : Length of the log_mode or zero to disable logging +/// - log_file : String respresenting the file name to write to log to or nullptr to disable logging to a file +/// - log_mode_len : Length of the log_file or zero to disable logging to a file +/// - logger : Pointer to point to the created `Logger` object + +/// **Important**: This function must only be called exactly once otherwise it will panic. If you want to disable a +/// logging mode or logging to a file make sure that you pass the `length` as zero +/// +/// # Example +/// +/// ```no_run +/// void* cfg; +/// const char *args[] = {"--light", "--can-restart"}; +/// size_t str_lens[] = {7, 13}; +/// if (parity_config_from_cli(args, str_lens, 2, &cfg) != 0) { +/// return 1; +/// } +/// char[] logger_mode = "rpc=trace"; +/// parity_set_logger(logger_mode, strlen(logger_mode), nullptr, 0, &cfg.logger); +/// ``` +/// +int parity_set_logger(const char* log_mode, size_t log_mode_len, const char* log_file, size_t log_file_len, void** logger); + /// Destroys a configuration object created earlier. /// /// **Important**: You probably don't need to call this function. Calling `parity_start` destroys @@ -86,21 +116,44 @@ int parity_start(const ParityParams* params, void** out); /// must not call this function. void parity_destroy(void* parity); -/// Performs an RPC request. +/// Performs an asynchronous RPC request running in a background thread for at most X milliseconds +/// +/// - parity : Reference to the running parity client +/// - rpc_query : JSON encoded string representing the RPC request. +/// - len : Length of the RPC query +/// - timeout_ms : Maximum time that request is waiting for a response +/// - response : Callback to invoke when the query gets answered. It will respond with a JSON encoded the string +/// with the result both on success and error. +/// - ud : Specific user defined data that can used in the callback /// -/// Blocks the current thread until the request is finished. You are therefore encouraged to spawn -/// a new thread for each RPC request that requires accessing the blockchain. +/// - On success : The function returns 0 +/// - On error : The function returns 1 /// -/// - `rpc` and `len` must contain the JSON string representing the RPC request. -/// - `out_str` and `out_len` point to a buffer where the output JSON result will be stored. If the -/// buffer is not large enough, the function fails. -/// - `out_len` will receive the final length of the string. -/// - On success, the function returns 0. On failure, it returns 1. +int parity_rpc(const void *const parity, const char* rpc_query, size_t rpc_len, size_t timeout_ms, + void (*subscribe)(void* ud, const char* response, size_t len), void* ud); + + +/// Subscribes to a specific websocket event that will run until it is canceled +/// +/// - parity : Reference to the running parity client +/// - ws_query : JSON encoded string representing the websocket event to subscribe to +/// - len : Length of the query +/// - response : Callback to invoke when a websocket event occurs +/// - ud : Specific user defined data that can used in the callback +/// +/// - On success : The function returns an object to the current session +/// which can be used cancel the subscription +/// - On error : The function returns a null pointer +/// +void* parity_subscribe_ws(const void *const parity, const char* ws_query, size_t len, + void (*subscribe)(void* ud, const char* response, size_t len), void* ud); + +/// Unsubscribes from a websocket subscription. Caution this function consumes the session object and must only be +/// used exactly once per session. /// -/// **Important**: Keep in mind that this function doesn't write any null terminator on the output -/// string. +/// - session : Pointer to the session to unsubscribe from /// -int parity_rpc(void* parity, const char* rpc, size_t len, char* out_str, size_t* out_len); +int parity_unsubscribe_ws(const void *const session); /// Sets a callback to call when a panic happens in the Rust code. /// diff --git a/parity-clib/src/java.rs b/parity-clib/src/java.rs new file mode 100644 index 00000000000..98969b1d10e --- /dev/null +++ b/parity-clib/src/java.rs @@ -0,0 +1,186 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +use std::{mem, ptr}; +use std::ffi::c_void; +use std::sync::Arc; + +use {Callback, parity_config_from_cli, parity_destroy, parity_rpc_worker, parity_start, parity_set_logger, + parity_unsubscribe_ws, parity_ws_worker, ParityParams}; + +use jni::{JavaVM, JNIEnv}; +use jni::objects::{JClass, JString, JObject, JValue, GlobalRef}; +use jni::sys::{jlong, jobjectArray, va_list}; +use parity_ethereum::RunningClient; + +type CheckedQuery<'a> = (&'a RunningClient, String, JavaVM, GlobalRef); + +// Creates a Java callback to a static method named `void callback(Object)` +struct JavaCallback<'a> { + jvm: JavaVM, + callback: GlobalRef, + method_name: &'a str, + method_descriptor: &'a str, +} + +impl<'a> JavaCallback<'a> { + fn new(jvm: JavaVM, callback: GlobalRef) -> Self { + Self { + jvm, + callback, + method_name: "callback", + method_descriptor: "(Ljava/lang/Object;)V", + } + } +} + +impl<'a> Callback for JavaCallback<'a> { + fn call(&self, msg: &str) { + let env = self.jvm.attach_current_thread().expect("JavaVM should have an environment; qed"); + let java_str = env.new_string(msg.to_string()).expect("Rust String is valid JString; qed"); + let val = &[JValue::Object(JObject::from(java_str))]; + env.call_method(self.callback.as_obj(), self.method_name, self.method_descriptor, val).expect( + "The callback must be an instance method and be named \"void callback(Object)\"; qed)"); + } +} + +#[no_mangle] +pub unsafe extern "system" fn Java_io_parity_ethereum_Parity_configFromCli(env: JNIEnv, _: JClass, cli: jobjectArray) -> jlong { + let cli_len = env.get_array_length(cli).expect("invalid Java bindings") as usize; + + let mut jni_strings = Vec::with_capacity(cli_len); + let mut opts = Vec::with_capacity(cli_len); + let mut opts_lens = Vec::with_capacity(cli_len); + + for n in 0..cli_len as i32 { + let elem = env.get_object_array_element(cli, n).expect("invalid Java bindings"); + let elem_str: JString = elem.into(); + match env.get_string(elem_str) { + Ok(s) => { + opts.push(s.as_ptr()); + opts_lens.push(s.to_bytes().len()); + jni_strings.push(s); + } + Err(err) => { + let _ = env.throw_new("java/lang/Exception", err.to_string()); + return 0 + } + }; + } + + let mut out = ptr::null_mut(); + match parity_config_from_cli(opts.as_ptr(), opts_lens.as_ptr(), cli_len, &mut out) { + 0 => out as jlong, + _ => { + let _ = env.throw_new("java/lang/Exception", "failed to create config object"); + 0 + }, + } +} + +#[no_mangle] +pub unsafe extern "system" fn Java_io_parity_ethereum_Parity_build( + env: JNIEnv, + _: JClass, + config: va_list, + logger_mode: JString, + logger_file: JString +) -> jlong { + let mut params = ParityParams { + configuration: config, + .. mem::zeroed() + }; + + let logger_mode: String = env.get_string(logger_mode).expect("valid JString; qed").into(); + let logger_file: String = env.get_string(logger_file).expect("valid JString; qed").into(); + + parity_set_logger(logger_mode.as_ptr(), logger_mode.as_bytes().len(), logger_file.as_ptr(), + logger_file.as_bytes().len(), &mut params.logger); + + let mut out = ptr::null_mut(); + match parity_start(¶ms, &mut out) { + 0 => out as jlong, + _ => { + let _ = env.throw_new("java/lang/Exception", "failed to start Parity"); + 0 + } + } +} + +#[no_mangle] +pub unsafe extern "system" fn Java_io_parity_ethereum_Parity_destroy(_env: JNIEnv, _: JClass, parity: va_list) { + parity_destroy(parity); +} + +unsafe fn java_query_checker<'a>(client: va_list, rpc: JString, callback: JObject, env: &JNIEnv<'a>) +-> Result, String> { + let query: String = env.get_string(rpc) + .map(Into::into) + .map_err(|e| e.to_string())?; + + let client: &RunningClient = &*(client as *const RunningClient); + let jvm = env.get_java_vm().map_err(|e| e.to_string())?; + let global_ref = env.new_global_ref(callback).map_err(|e| e.to_string())?; + Ok((client, query, jvm, global_ref)) +} + +#[no_mangle] +pub unsafe extern "system" fn Java_io_parity_ethereum_Parity_rpcQueryNative( + env: JNIEnv, + _: JClass, + parity: va_list, + rpc: JString, + timeout_ms: jlong, + callback: JObject, + ) +{ + let _ = java_query_checker(parity, rpc, callback, &env) + .map(|(client, query, jvm, global_ref)| { + let callback = Arc::new(JavaCallback::new(jvm, global_ref)); + parity_rpc_worker(client, &query, callback, timeout_ms as u64); + }) + .map_err(|e| { + let _ = env.throw_new("java/lang/Exception", e); + }); +} + +#[no_mangle] +pub unsafe extern "system" fn Java_io_parity_ethereum_Parity_subscribeWebSocketNative( + env: JNIEnv, + _: JClass, + parity: va_list, + rpc: JString, + callback: JObject, + ) -> va_list { + + java_query_checker(parity, rpc, callback, &env) + .map(move |(client, query, jvm, global_ref)| { + let callback = Arc::new(JavaCallback::new(jvm, global_ref)); + parity_ws_worker(client, &query, callback) as va_list + }) + .unwrap_or_else(|e| { + let _ = env.throw_new("java/lang/Exception", e); + ptr::null_mut() + }) +} + +#[no_mangle] +pub unsafe extern "system" fn Java_io_parity_ethereum_Parity_unsubscribeWebSocketNative( + _: JNIEnv, + _: JClass, + session: va_list) { + parity_unsubscribe_ws(session as *const c_void); +} diff --git a/parity-clib/src/lib.rs b/parity-clib/src/lib.rs index 7791f97bd5e..bbb60ec2d26 100644 --- a/parity-clib/src/lib.rs +++ b/parity-clib/src/lib.rs @@ -1,47 +1,91 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Note that all the structs and functions here are documented in `parity.h`, to avoid //! duplicating documentation. -#[cfg(feature = "jni")] -extern crate jni; -extern crate parity_ethereum; +extern crate futures; extern crate panic_hook; - -use std::os::raw::{c_char, c_void, c_int}; -use std::panic; -use std::ptr; -use std::slice; -use std::str; +extern crate parity_ethereum; +extern crate tokio; +extern crate tokio_current_thread; #[cfg(feature = "jni")] -use std::mem; +extern crate jni; + #[cfg(feature = "jni")] -use jni::{JNIEnv, objects::JClass, objects::JString, sys::jlong, sys::jobjectArray}; +mod java; + +use std::ffi::CString; +use std::os::raw::{c_char, c_void, c_int}; +use std::{panic, ptr, slice, str, thread}; +use std::sync::Arc; +use std::time::Duration; + +use futures::{Future, Stream}; +use futures::sync::mpsc; +use parity_ethereum::{PubSubSession, RunningClient}; +use tokio_current_thread::CurrentThread; + +type CCallback = Option; +type CheckedQuery<'a> = (&'a RunningClient, &'static str); + +pub mod error { + pub const EMPTY: &str = r#"{"jsonrpc":"2.0","result":"null","id":1}"#; + pub const TIMEOUT: &str = r#"{"jsonrpc":"2.0","result":"timeout","id":1}"#; + pub const SUBSCRIBE: &str = r#"{"jsonrpc":"2.0","result":"subcribe_fail","id":1}"#; +} #[repr(C)] pub struct ParityParams { pub configuration: *mut c_void, - pub on_client_restart_cb: Option, + pub on_client_restart_cb: CCallback, pub on_client_restart_cb_custom: *mut c_void, + pub logger: *mut c_void +} + +/// Trait representing a callback that passes a string +pub(crate) trait Callback: Send + Sync { + fn call(&self, msg: &str); +} + +// Internal structure for handling callbacks that get passed a string. +struct CallbackStr { + user_data: *mut c_void, + function: CCallback, +} + +unsafe impl Send for CallbackStr {} +unsafe impl Sync for CallbackStr {} +impl Callback for CallbackStr { + fn call(&self, msg: &str) { + if let Some(ref cb) = self.function { + let cstr = CString::new(msg).expect("valid string with no nul bytes in the middle; qed").into_raw(); + cb(self.user_data, cstr, msg.len()) + } + } } #[no_mangle] -pub unsafe extern fn parity_config_from_cli(args: *const *const c_char, args_lens: *const usize, len: usize, output: *mut *mut c_void) -> c_int { +pub unsafe extern fn parity_config_from_cli( + args: *const *const c_char, + args_lens: *const usize, + len: usize, + output: *mut *mut c_void +) -> c_int { panic::catch_unwind(|| { *output = ptr::null_mut(); @@ -59,7 +103,6 @@ pub unsafe extern fn parity_config_from_cli(args: *const *const c_char, args_len Err(_) => return 1, }; } - args }; @@ -91,15 +134,18 @@ pub unsafe extern fn parity_start(cfg: *const ParityParams, output: *mut *mut c_ panic::catch_unwind(|| { *output = ptr::null_mut(); let cfg: &ParityParams = &*cfg; - + let logger = Arc::from_raw(cfg.logger as *mut parity_ethereum::RotatingLogger); let config = Box::from_raw(cfg.configuration as *mut parity_ethereum::Configuration); let on_client_restart_cb = { - let cb = CallbackStr(cfg.on_client_restart_cb, cfg.on_client_restart_cb_custom); + let cb = CallbackStr { + user_data: cfg.on_client_restart_cb_custom, + function: cfg.on_client_restart_cb, + }; move |new_chain: String| { cb.call(&new_chain); } }; - let action = match parity_ethereum::start(*config, on_client_restart_cb, || {}) { + let action = match parity_ethereum::start(*config, logger, on_client_restart_cb, || {}) { Ok(action) => action, Err(_) => return 1, }; @@ -108,7 +154,7 @@ pub unsafe extern fn parity_start(cfg: *const ParityParams, output: *mut *mut c_ parity_ethereum::ExecutionAction::Instant(Some(s)) => { println!("{}", s); 0 }, parity_ethereum::ExecutionAction::Instant(None) => 0, parity_ethereum::ExecutionAction::Running(client) => { - *output = Box::into_raw(Box::::new(client)) as *mut c_void; + *output = Box::into_raw(Box::new(client)) as *mut c_void; 0 } } @@ -118,32 +164,24 @@ pub unsafe extern fn parity_start(cfg: *const ParityParams, output: *mut *mut c_ #[no_mangle] pub unsafe extern fn parity_destroy(client: *mut c_void) { let _ = panic::catch_unwind(|| { - let client = Box::from_raw(client as *mut parity_ethereum::RunningClient); + let client = Box::from_raw(client as *mut RunningClient); client.shutdown(); }); } #[no_mangle] -pub unsafe extern fn parity_rpc(client: *mut c_void, query: *const c_char, len: usize, out_str: *mut c_char, out_len: *mut usize) -> c_int { +pub unsafe extern fn parity_rpc( + client: *const c_void, + query: *const c_char, + len: usize, + timeout_ms: usize, + callback: CCallback, + user_data: *mut c_void, +) -> c_int { panic::catch_unwind(|| { - let client: &mut parity_ethereum::RunningClient = &mut *(client as *mut parity_ethereum::RunningClient); - - let query_str = { - let string = slice::from_raw_parts(query as *const u8, len); - match str::from_utf8(string) { - Ok(a) => a, - Err(_) => return 1, - } - }; - - if let Some(output) = client.rpc_query_sync(query_str) { - let q_out_len = output.as_bytes().len(); - if *out_len < q_out_len { - return 1; - } - - ptr::copy_nonoverlapping(output.as_bytes().as_ptr(), out_str as *mut u8, q_out_len); - *out_len = q_out_len; + if let Some((client, query)) = parity_rpc_query_checker(client, query, len) { + let callback = Arc::new(CallbackStr {user_data, function: callback} ); + parity_rpc_worker(client, query, callback, timeout_ms as u64); 0 } else { 1 @@ -152,116 +190,115 @@ pub unsafe extern fn parity_rpc(client: *mut c_void, query: *const c_char, len: } #[no_mangle] -pub unsafe extern fn parity_set_panic_hook(callback: extern "C" fn(*mut c_void, *const c_char, usize), param: *mut c_void) { - let cb = CallbackStr(Some(callback), param); +pub unsafe extern fn parity_subscribe_ws( + client: *const c_void, + query: *const c_char, + len: usize, + callback: CCallback, + user_data: *mut c_void, +) -> *const c_void { + panic::catch_unwind(|| { + if let Some((client, query)) = parity_rpc_query_checker(client, query, len) { + let callback = Arc::new(CallbackStr { user_data, function: callback}); + parity_ws_worker(client, query, callback) + } else { + ptr::null() + } + }) + .unwrap_or(ptr::null()) +} + +#[no_mangle] +pub unsafe extern fn parity_unsubscribe_ws(session: *const c_void) { + let _ = panic::catch_unwind(|| { + let _session = Arc::from_raw(session as *const PubSubSession); + }); +} + +#[no_mangle] +pub extern fn parity_set_panic_hook(callback: CCallback, param: *mut c_void) { + let cb = CallbackStr {user_data: param, function: callback}; panic_hook::set_with(move |panic_msg| { cb.call(panic_msg); }); } -// Internal structure for handling callbacks that get passed a string. -struct CallbackStr(Option, *mut c_void); -unsafe impl Send for CallbackStr {} -unsafe impl Sync for CallbackStr {} -impl CallbackStr { - fn call(&self, new_chain: &str) { - if let Some(ref cb) = self.0 { - cb(self.1, new_chain.as_bytes().as_ptr() as *const _, new_chain.len()) - } +#[no_mangle] +pub unsafe extern fn parity_set_logger( + logger_mode: *const u8, + logger_mode_len: usize, + log_file: *const u8, + log_file_len: usize, + logger: *mut *mut c_void) { + + let mut logger_cfg = parity_ethereum::LoggerConfig::default(); + logger_cfg.mode = String::from_utf8(slice::from_raw_parts(logger_mode, logger_mode_len).to_owned()).ok(); + + // Make sure an empty string is not constructed as file name (to prevent panic) + if log_file_len != 0 && !log_file.is_null() { + logger_cfg.file = String::from_utf8(slice::from_raw_parts(log_file, log_file_len).to_owned()).ok(); } + + *logger = Arc::into_raw(parity_ethereum::setup_log(&logger_cfg).expect("Logger initialized only once; qed")) as *mut _; } -#[cfg(feature = "jni")] -#[no_mangle] -pub unsafe extern "system" fn Java_io_parity_ethereum_Parity_configFromCli(env: JNIEnv, _: JClass, cli: jobjectArray) -> jlong { - let cli_len = env.get_array_length(cli).expect("invalid Java bindings"); - - let mut jni_strings = Vec::with_capacity(cli_len as usize); - let mut opts = Vec::with_capacity(cli_len as usize); - let mut opts_lens = Vec::with_capacity(cli_len as usize); - - for n in 0 .. cli_len { - let elem = env.get_object_array_element(cli, n).expect("invalid Java bindings"); - let elem_str: JString = elem.into(); - match env.get_string(elem_str) { - Ok(s) => { - opts.push(s.as_ptr()); - opts_lens.push(s.to_bytes().len()); - jni_strings.push(s); - }, - Err(err) => { - let _ = env.throw_new("java/lang/Exception", err.to_string()); - return 0 +// WebSocket event loop +fn parity_ws_worker(client: &RunningClient, query: &str, callback: Arc) -> *const c_void { + let (tx, mut rx) = mpsc::channel(1); + let session = Arc::new(PubSubSession::new(tx)); + let query_future = client.rpc_query(query, Some(session.clone())); + let weak_session = Arc::downgrade(&session); + let _handle = thread::Builder::new() + .name("ws-subscriber".into()) + .spawn(move || { + // Wait for subscription ID + // Note this may block forever and be can't destroyed using the session object + // However, this will likely timeout or be catched the RPC layer + if let Ok(Some(response)) = query_future.wait() { + callback.call(&response); + } else { + callback.call(error::SUBSCRIBE); + return; } - }; - } - let mut out = ptr::null_mut(); - match parity_config_from_cli(opts.as_ptr(), opts_lens.as_ptr(), cli_len as usize, &mut out) { - 0 => out as usize as jlong, - _ => { - let _ = env.throw_new("java/lang/Exception", "failed to create config object"); - 0 - }, - } + while weak_session.upgrade().map_or(0, |session| Arc::strong_count(&session)) > 1 { + for response in rx.by_ref().wait() { + if let Ok(r) = response { + callback.call(&r); + } + } + } + }) + .expect("rpc-subscriber thread shouldn't fail; qed"); + Arc::into_raw(session) as *const c_void } -#[cfg(feature = "jni")] -#[no_mangle] -pub unsafe extern "system" fn Java_io_parity_ethereum_Parity_build(env: JNIEnv, _: JClass, config: jlong) -> jlong { - let params = ParityParams { - configuration: config as usize as *mut c_void, - .. mem::zeroed() - }; - - let mut out = ptr::null_mut(); - match parity_start(¶ms, &mut out) { - 0 => out as usize as jlong, - _ => { - let _ = env.throw_new("java/lang/Exception", "failed to start Parity"); - 0 - }, - } -} +// RPC event loop that runs for at most `timeout_ms` +fn parity_rpc_worker(client: &RunningClient, query: &str, callback: Arc, timeout_ms: u64) { + let cb = callback.clone(); + let query = client.rpc_query(query, None).map(move |response| { + let response = response.unwrap_or_else(|| error::EMPTY.to_string()); + callback.call(&response); + }); -#[cfg(feature = "jni")] -#[no_mangle] -pub unsafe extern "system" fn Java_io_parity_ethereum_Parity_destroy(_env: JNIEnv, _: JClass, parity: jlong) { - let parity = parity as usize as *mut c_void; - parity_destroy(parity); + let _handle = thread::Builder::new() + .name("rpc_query".to_string()) + .spawn(move || { + let mut current_thread = CurrentThread::new(); + current_thread.spawn(query); + let _ = current_thread + .run_timeout(Duration::from_millis(timeout_ms)) + .map_err(|_e| { + cb.call(error::TIMEOUT); + }); + }) + .expect("rpc-query thread shouldn't fail; qed"); } -#[cfg(feature = "jni")] -#[no_mangle] -pub unsafe extern "system" fn Java_io_parity_ethereum_Parity_rpcQueryNative<'a>(env: JNIEnv<'a>, _: JClass, parity: jlong, rpc: JString) -> JString<'a> { - let parity = parity as usize as *mut c_void; - - let rpc = match env.get_string(rpc) { - Ok(s) => s, - Err(err) => { - let _ = env.throw_new("java/lang/Exception", err.to_string()); - return env.new_string("").expect("Creating an empty string never fails"); - }, - }; - - let mut out_len = 255; - let mut out = [0u8; 256]; - - match parity_rpc(parity, rpc.as_ptr(), rpc.to_bytes().len(), out.as_mut_ptr() as *mut c_char, &mut out_len) { - 0 => (), - _ => { - let _ = env.throw_new("java/lang/Exception", "failed to perform RPC query"); - return env.new_string("").expect("Creating an empty string never fails"); - }, - } - - let out = str::from_utf8(&out[..out_len]) - .expect("parity always generates an UTF-8 RPC response"); - match env.new_string(out) { - Ok(s) => s, - Err(err) => { - let _ = env.throw_new("java/lang/Exception", err.to_string()); - return env.new_string("").expect("Creating an empty string never fails"); - } - } +unsafe fn parity_rpc_query_checker<'a>(client: *const c_void, query: *const c_char, len: usize) + -> Option> +{ + let query_str = str::from_utf8(slice::from_raw_parts(query as *const u8, len)).ok()?; + let client: &RunningClient = &*(client as *const RunningClient); + Some((client, query_str)) } diff --git a/parity/account.rs b/parity/account.rs index e09667379fa..118c06fddab 100644 --- a/parity/account.rs +++ b/parity/account.rs @@ -1,25 +1,20 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -use std::path::PathBuf; -use ethcore::ethstore::{EthStore, SecretStore, import_account, import_accounts, read_geth_accounts}; -use ethcore::ethstore::accounts_dir::RootDiskDirectory; -use ethcore::ethstore::SecretVaultRef; -use ethcore::account_provider::{AccountProvider, AccountProviderSettings}; -use helpers::{password_prompt, password_from_file}; +// along with Parity Ethereum. If not, see . + +use std::num::NonZeroU32; use params::SpecType; #[derive(Debug, PartialEq)] @@ -38,7 +33,7 @@ pub struct ListAccounts { #[derive(Debug, PartialEq)] pub struct NewAccount { - pub iterations: u32, + pub iterations: NonZeroU32, pub path: String, pub spec: SpecType, pub password_file: Option, @@ -61,83 +56,102 @@ pub struct ImportFromGethAccounts { pub spec: SpecType, } -pub fn execute(cmd: AccountCmd) -> Result { - match cmd { - AccountCmd::New(new_cmd) => new(new_cmd), - AccountCmd::List(list_cmd) => list(list_cmd), - AccountCmd::Import(import_cmd) => import(import_cmd), - AccountCmd::ImportFromGeth(import_geth_cmd) => import_geth(import_geth_cmd) - } -} -fn keys_dir(path: String, spec: SpecType) -> Result { - let spec = spec.spec(&::std::env::temp_dir())?; - let mut path = PathBuf::from(&path); - path.push(spec.data_dir); - RootDiskDirectory::create(path).map_err(|e| format!("Could not open keys directory: {}", e)) +#[cfg(not(feature = "accounts"))] +pub fn execute(_cmd: AccountCmd) -> Result { + Err("Account management is deprecated. Please see #9997 for alternatives:\nhttps://github.com/paritytech/parity-ethereum/issues/9997".into()) } -fn secret_store(dir: Box, iterations: Option) -> Result { - match iterations { - Some(i) => EthStore::open_with_iterations(dir, i), - _ => EthStore::open(dir) - }.map_err(|e| format!("Could not open keys store: {}", e)) -} +#[cfg(feature = "accounts")] +mod command { + use super::*; + use std::path::PathBuf; + use accounts::{AccountProvider, AccountProviderSettings}; + use ethstore::{EthStore, SecretStore, SecretVaultRef, import_account, import_accounts, read_geth_accounts}; + use ethstore::accounts_dir::RootDiskDirectory; + use helpers::{password_prompt, password_from_file}; + + pub fn execute(cmd: AccountCmd) -> Result { + match cmd { + AccountCmd::New(new_cmd) => new(new_cmd), + AccountCmd::List(list_cmd) => list(list_cmd), + AccountCmd::Import(import_cmd) => import(import_cmd), + AccountCmd::ImportFromGeth(import_geth_cmd) => import_geth(import_geth_cmd) + } + } -fn new(n: NewAccount) -> Result { - let password = match n.password_file { - Some(file) => password_from_file(file)?, - None => password_prompt()?, - }; - - let dir = Box::new(keys_dir(n.path, n.spec)?); - let secret_store = Box::new(secret_store(dir, Some(n.iterations))?); - let acc_provider = AccountProvider::new(secret_store, AccountProviderSettings::default()); - let new_account = acc_provider.new_account(&password).map_err(|e| format!("Could not create new account: {}", e))?; - Ok(format!("0x{:x}", new_account)) -} + fn keys_dir(path: String, spec: SpecType) -> Result { + let spec = spec.spec(&::std::env::temp_dir())?; + let mut path = PathBuf::from(&path); + path.push(spec.data_dir); + RootDiskDirectory::create(path).map_err(|e| format!("Could not open keys directory: {}", e)) + } -fn list(list_cmd: ListAccounts) -> Result { - let dir = Box::new(keys_dir(list_cmd.path, list_cmd.spec)?); - let secret_store = Box::new(secret_store(dir, None)?); - let acc_provider = AccountProvider::new(secret_store, AccountProviderSettings::default()); - let accounts = acc_provider.accounts().map_err(|e| format!("{}", e))?; - let result = accounts.into_iter() - .map(|a| format!("0x{:x}", a)) - .collect::>() - .join("\n"); - - Ok(result) -} + fn secret_store(dir: Box, iterations: Option) -> Result { + match iterations { + Some(i) => EthStore::open_with_iterations(dir, i), + _ => EthStore::open(dir) + }.map_err(|e| format!("Could not open keys store: {}", e)) + } -fn import(i: ImportAccounts) -> Result { - let to = keys_dir(i.to, i.spec)?; - let mut imported = 0; - - for path in &i.from { - let path = PathBuf::from(path); - if path.is_dir() { - let from = RootDiskDirectory::at(&path); - imported += import_accounts(&from, &to).map_err(|e| format!("Importing accounts from {:?} failed: {}", path, e))?.len(); - } else if path.is_file() { - import_account(&path, &to).map_err(|e| format!("Importing account from {:?} failed: {}", path, e))?; - imported += 1; - } + fn new(n: NewAccount) -> Result { + let password = match n.password_file { + Some(file) => password_from_file(file)?, + None => password_prompt()?, + }; + + let dir = Box::new(keys_dir(n.path, n.spec)?); + let secret_store = Box::new(secret_store(dir, Some(n.iterations))?); + let acc_provider = AccountProvider::new(secret_store, AccountProviderSettings::default()); + let new_account = acc_provider.new_account(&password).map_err(|e| format!("Could not create new account: {}", e))?; + Ok(format!("0x{:x}", new_account)) } - Ok(format!("{} account(s) imported", imported)) -} + fn list(list_cmd: ListAccounts) -> Result { + let dir = Box::new(keys_dir(list_cmd.path, list_cmd.spec)?); + let secret_store = Box::new(secret_store(dir, None)?); + let acc_provider = AccountProvider::new(secret_store, AccountProviderSettings::default()); + let accounts = acc_provider.accounts().map_err(|e| format!("{}", e))?; + let result = accounts.into_iter() + .map(|a| format!("0x{:x}", a)) + .collect::>() + .join("\n"); + + Ok(result) + } + + fn import(i: ImportAccounts) -> Result { + let to = keys_dir(i.to, i.spec)?; + let mut imported = 0; + + for path in &i.from { + let path = PathBuf::from(path); + if path.is_dir() { + let from = RootDiskDirectory::at(&path); + imported += import_accounts(&from, &to).map_err(|e| format!("Importing accounts from {:?} failed: {}", path, e))?.len(); + } else if path.is_file() { + import_account(&path, &to).map_err(|e| format!("Importing account from {:?} failed: {}", path, e))?; + imported += 1; + } + } -fn import_geth(i: ImportFromGethAccounts) -> Result { - use std::io::ErrorKind; - use ethcore::ethstore::Error; - - let dir = Box::new(keys_dir(i.to, i.spec)?); - let secret_store = Box::new(secret_store(dir, None)?); - let geth_accounts = read_geth_accounts(i.testnet); - match secret_store.import_geth_accounts(SecretVaultRef::Root, geth_accounts, i.testnet) { - Ok(v) => Ok(format!("Successfully imported {} account(s) from geth.", v.len())), - Err(Error::Io(ref io_err)) if io_err.kind() == ErrorKind::NotFound => Err("Failed to find geth keys folder.".into()), - Err(err) => Err(format!("Import geth accounts failed. {}", err)) + Ok(format!("{} account(s) imported", imported)) + } + + fn import_geth(i: ImportFromGethAccounts) -> Result { + use std::io::ErrorKind; + use ethstore::Error; + + let dir = Box::new(keys_dir(i.to, i.spec)?); + let secret_store = Box::new(secret_store(dir, None)?); + let geth_accounts = read_geth_accounts(i.testnet); + match secret_store.import_geth_accounts(SecretVaultRef::Root, geth_accounts, i.testnet) { + Ok(v) => Ok(format!("Successfully imported {} account(s) from geth.", v.len())), + Err(Error::Io(ref io_err)) if io_err.kind() == ErrorKind::NotFound => Err("Failed to find geth keys folder.".into()), + Err(err) => Err(format!("Import geth accounts failed. {}", err)) + } } } + +#[cfg(feature = "accounts")] +pub use self::command::execute; diff --git a/parity/account_utils.rs b/parity/account_utils.rs new file mode 100644 index 00000000000..6c11ae23b34 --- /dev/null +++ b/parity/account_utils.rs @@ -0,0 +1,244 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::sync::Arc; + +use dir::Directories; +use ethereum_types::Address; +use ethkey::Password; + +use params::{SpecType, AccountsConfig}; + +#[cfg(not(feature = "accounts"))] +mod accounts { + use super::*; + + /// Dummy AccountProvider + pub struct AccountProvider; + + impl ::ethcore::miner::LocalAccounts for AccountProvider { + fn is_local(&self, _address: &Address) -> bool { + false + } + } + + pub fn prepare_account_provider(_spec: &SpecType, _dirs: &Directories, _data_dir: &str, _cfg: AccountsConfig, _passwords: &[Password]) -> Result { + warn!("Note: Your instance of Parity Ethereum is running without account support. Some CLI options are ignored."); + Ok(AccountProvider) + } + + pub fn miner_local_accounts(_: Arc) -> AccountProvider { + AccountProvider + } + + pub fn miner_author(_spec: &SpecType, _dirs: &Directories, _account_provider: &Arc, _engine_signer: Address, _passwords: &[Password]) -> Result, String> { + Ok(None) + } + + pub fn private_tx_signer(_account_provider: Arc, _passwords: &[Password]) -> Result, String> { + Ok(Arc::new(::ethcore_private_tx::DummySigner)) + } + + pub fn accounts_list(_account_provider: Arc) -> Arc Vec

+ Send + Sync> { + Arc::new(|| vec![]) + } +} + +#[cfg(feature = "accounts")] +mod accounts { + use super::*; + use upgrade::upgrade_key_location; + + pub use accounts::AccountProvider; + + /// Pops along with error messages when a password is missing or invalid. + const VERIFY_PASSWORD_HINT: &str = "Make sure valid password is present in files passed using `--password` or in the configuration file."; + + /// Initialize account provider + pub fn prepare_account_provider(spec: &SpecType, dirs: &Directories, data_dir: &str, cfg: AccountsConfig, passwords: &[Password]) -> Result { + use ethstore::EthStore; + use ethstore::accounts_dir::RootDiskDirectory; + use accounts::AccountProviderSettings; + + let path = dirs.keys_path(data_dir); + upgrade_key_location(&dirs.legacy_keys_path(cfg.testnet), &path); + let dir = Box::new(RootDiskDirectory::create(&path).map_err(|e| format!("Could not open keys directory: {}", e))?); + let account_settings = AccountProviderSettings { + enable_hardware_wallets: cfg.enable_hardware_wallets, + hardware_wallet_classic_key: spec == &SpecType::Classic, + unlock_keep_secret: cfg.enable_fast_unlock, + blacklisted_accounts: match *spec { + SpecType::Morden | SpecType::Ropsten | SpecType::Kovan | SpecType::Sokol | SpecType::Dev => vec![], + _ => vec![ + "00a329c0648769a73afac7f9381e08fb43dbea72".into() + ], + }, + }; + + let ethstore = EthStore::open_with_iterations(dir, cfg.iterations).map_err(|e| format!("Could not open keys directory: {}", e))?; + if cfg.refresh_time > 0 { + ethstore.set_refresh_time(::std::time::Duration::from_secs(cfg.refresh_time)); + } + let account_provider = AccountProvider::new( + Box::new(ethstore), + account_settings, + ); + + // Add development account if running dev chain: + if let SpecType::Dev = *spec { + insert_dev_account(&account_provider); + } + + for a in cfg.unlocked_accounts { + // Check if the account exists + if !account_provider.has_account(a) { + return Err(format!("Account {} not found for the current chain. {}", a, build_create_account_hint(spec, &dirs.keys))); + } + + // Check if any passwords have been read from the password file(s) + if passwords.is_empty() { + return Err(format!("No password found to unlock account {}. {}", a, VERIFY_PASSWORD_HINT)); + } + + if !passwords.iter().any(|p| account_provider.unlock_account_permanently(a, (*p).clone()).is_ok()) { + return Err(format!("No valid password to unlock account {}. {}", a, VERIFY_PASSWORD_HINT)); + } + } + + Ok(account_provider) + } + + pub struct LocalAccounts(Arc); + impl ::ethcore::miner::LocalAccounts for LocalAccounts { + fn is_local(&self, address: &Address) -> bool { + self.0.has_account(*address) + } + } + + pub fn miner_local_accounts(account_provider: Arc) -> LocalAccounts { + LocalAccounts(account_provider) + } + + pub fn miner_author(spec: &SpecType, dirs: &Directories, account_provider: &Arc, engine_signer: Address, passwords: &[Password]) -> Result, String> { + use ethcore::engines::EngineSigner; + + // Check if engine signer exists + if !account_provider.has_account(engine_signer) { + return Err(format!("Consensus signer account not found for the current chain. {}", build_create_account_hint(spec, &dirs.keys))); + } + + // Check if any passwords have been read from the password file(s) + if passwords.is_empty() { + return Err(format!("No password found for the consensus signer {}. {}", engine_signer, VERIFY_PASSWORD_HINT)); + } + + let mut author = None; + for password in passwords { + let signer = parity_rpc::signer::EngineSigner::new( + account_provider.clone(), + engine_signer, + password.clone(), + ); + if signer.sign(Default::default()).is_ok() { + author = Some(::ethcore::miner::Author::Sealer(Box::new(signer))); + } + } + if author.is_none() { + return Err(format!("No valid password for the consensus signer {}. {}", engine_signer, VERIFY_PASSWORD_HINT)); + } + + Ok(author) + } + + + mod private_tx { + use super::*; + use ethkey::{Signature, Message}; + use ethcore_private_tx::{Error}; + + pub struct AccountSigner { + pub accounts: Arc, + pub passwords: Vec, + } + + impl ::ethcore_private_tx::Signer for AccountSigner { + fn decrypt(&self, account: Address, shared_mac: &[u8], payload: &[u8]) -> Result, Error> { + let password = self.find_account_password(&account); + Ok(self.accounts.decrypt(account, password, shared_mac, payload).map_err(|e| e.to_string())?) + } + + fn sign(&self, account: Address, hash: Message) -> Result { + let password = self.find_account_password(&account); + Ok(self.accounts.sign(account, password, hash).map_err(|e| e.to_string())?) + } + } + + impl AccountSigner { + /// Try to unlock account using stored password, return found password if any + fn find_account_password(&self, account: &Address) -> Option { + for password in &self.passwords { + if let Ok(true) = self.accounts.test_password(account, password) { + return Some(password.clone()); + } + } + None + } + } + } + + pub fn private_tx_signer(accounts: Arc, passwords: &[Password]) -> Result, String> { + Ok(Arc::new(self::private_tx::AccountSigner { + accounts, + passwords: passwords.to_vec(), + })) + } + + pub fn accounts_list(account_provider: Arc) -> Arc Vec
+ Send + Sync> { + Arc::new(move || account_provider.accounts().unwrap_or_default()) + } + + fn insert_dev_account(account_provider: &AccountProvider) { + let secret: ethkey::Secret = "4d5db4107d237df6a3d58ee5f70ae63d73d7658d4026f2eefd2f204c81682cb7".into(); + let dev_account = ethkey::KeyPair::from_secret(secret.clone()).expect("Valid secret produces valid key;qed"); + if !account_provider.has_account(dev_account.address()) { + match account_provider.insert_account(secret, &Password::from(String::new())) { + Err(e) => warn!("Unable to add development account: {}", e), + Ok(address) => { + let _ = account_provider.set_account_name(address.clone(), "Development Account".into()); + let _ = account_provider.set_account_meta(address, ::serde_json::to_string(&(vec![ + ("description", "Never use this account outside of development chain!"), + ("passwordHint","Password is empty string"), + ].into_iter().collect::<::std::collections::HashMap<_,_>>())).expect("Serialization of hashmap does not fail.")); + }, + } + } + } + + // Construct an error `String` with an adaptive hint on how to create an account. + fn build_create_account_hint(spec: &SpecType, keys: &str) -> String { + format!("You can create an account via RPC, UI or `parity account new --chain {} --keys-path {}`.", spec, keys) + } +} + +pub use self::accounts::{ + AccountProvider, + prepare_account_provider, + miner_local_accounts, + miner_author, + private_tx_signer, + accounts_list, +}; + diff --git a/parity/blockchain.rs b/parity/blockchain.rs index d0146eb3e1f..262b98ae2c5 100644 --- a/parity/blockchain.rs +++ b/parity/blockchain.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::str::{FromStr, from_utf8}; use std::{io, fs}; @@ -25,8 +25,9 @@ use hash::{keccak, KECCAK_NULL_RLP}; use ethereum_types::{U256, H256, Address}; use bytes::ToPretty; use rlp::PayloadInfo; -use ethcore::account_provider::AccountProvider; -use ethcore::client::{Mode, DatabaseCompactionProfile, VMType, Nonce, Balance, BlockChainClient, BlockId, BlockInfo, ImportBlock}; +use ethcore::client::{ + Mode, DatabaseCompactionProfile, VMType, Nonce, Balance, BlockChainClient, BlockId, BlockInfo, ImportBlock, BlockChainReset +}; use ethcore::error::{ImportErrorKind, ErrorKind as EthcoreErrorKind, Error as EthcoreError}; use ethcore::miner::Miner; use ethcore::verification::queue::VerifierSettings; @@ -40,6 +41,7 @@ use dir::Directories; use user_defaults::UserDefaults; use ethcore_private_tx; use db; +use ansi_term::Colour; #[derive(Debug, PartialEq)] pub enum DataFormat { @@ -71,6 +73,21 @@ pub enum BlockchainCmd { Import(ImportBlockchain), Export(ExportBlockchain), ExportState(ExportState), + Reset(ResetBlockchain) +} + +#[derive(Debug, PartialEq)] +pub struct ResetBlockchain { + pub dirs: Directories, + pub spec: SpecType, + pub pruning: Pruning, + pub pruning_history: u64, + pub pruning_memory: usize, + pub tracing: Switch, + pub fat_db: Switch, + pub compaction: DatabaseCompactionProfile, + pub cache_config: CacheConfig, + pub num: u32, } #[derive(Debug, PartialEq)] @@ -153,6 +170,7 @@ pub fn execute(cmd: BlockchainCmd) -> Result<(), String> { } BlockchainCmd::Export(export_cmd) => execute_export(export_cmd), BlockchainCmd::ExportState(export_cmd) => execute_export_state(export_cmd), + BlockchainCmd::Reset(reset_cmd) => execute_reset(reset_cmd), } } @@ -196,7 +214,7 @@ fn execute_import_light(cmd: ImportBlockchain) -> Result<(), String> { let mut config = LightClientConfig { queue: Default::default(), - chain_column: ::ethcore::db::COL_LIGHT_CHAIN, + chain_column: ethcore_db::COL_LIGHT_CHAIN, verify_full: true, check_seal: cmd.check_seal, no_hardcoded_sync: true, @@ -244,7 +262,7 @@ fn execute_import_light(cmd: ImportBlockchain) -> Result<(), String> { let do_import = |bytes: Vec| { while client.queue_info().is_full() { sleep(Duration::from_secs(1)); } - let header: ::ethcore::header::Header = ::rlp::Rlp::new(&bytes).val_at(0) + let header: ::types::header::Header = ::rlp::Rlp::new(&bytes).val_at(0) .map_err(|e| format!("Bad block: {}", e))?; if client.best_block_header().number() >= header.number() { return Ok(()) } @@ -377,9 +395,10 @@ fn execute_import(cmd: ImportBlockchain) -> Result<(), String> { // TODO [ToDr] don't use test miner here // (actually don't require miner at all) Arc::new(Miner::new_for_tests(&spec, None)), - Arc::new(AccountProvider::transient_provider()), + Arc::new(ethcore_private_tx::DummySigner), Box::new(ethcore_private_tx::NoopEncryptor), Default::default(), + Default::default(), ).map_err(|e| format!("Client service error: {:?}", e))?; // free up the spec in memory. @@ -568,9 +587,10 @@ fn start_client( // It's fine to use test version here, // since we don't care about miner parameters at all Arc::new(Miner::new_for_tests(&spec, None)), - Arc::new(AccountProvider::transient_provider()), + Arc::new(ethcore_private_tx::DummySigner), Box::new(ethcore_private_tx::NoopEncryptor), Default::default(), + Default::default(), ).map_err(|e| format!("Client service error: {:?}", e))?; drop(spec); @@ -709,6 +729,28 @@ fn execute_export_state(cmd: ExportState) -> Result<(), String> { Ok(()) } +fn execute_reset(cmd: ResetBlockchain) -> Result<(), String> { + let service = start_client( + cmd.dirs, + cmd.spec, + cmd.pruning, + cmd.pruning_history, + cmd.pruning_memory, + cmd.tracing, + cmd.fat_db, + cmd.compaction, + cmd.cache_config, + false, + 0, + )?; + + let client = service.client(); + client.reset(cmd.num)?; + info!("{}", Colour::Green.bold().paint("Successfully reset db!")); + + Ok(()) +} + pub fn kill_db(cmd: KillBlockchain) -> Result<(), String> { let spec = cmd.spec.spec(&cmd.dirs.cache)?; let genesis_hash = spec.genesis_header().hash(); diff --git a/parity/cache.rs b/parity/cache.rs index 5848e404c2a..d6487221b35 100644 --- a/parity/cache.rs +++ b/parity/cache.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::cmp::max; diff --git a/parity/cli/mod.rs b/parity/cli/mod.rs index e18e141d2b2..c372e9bff4e 100644 --- a/parity/cli/mod.rs +++ b/parity/cli/mod.rs @@ -1,23 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . #[macro_use] mod usage; mod presets; +use std::collections::HashSet; +use super::helpers; + usage! { { // CLI subcommands @@ -217,6 +220,15 @@ usage! { CMD cmd_db_kill { "Clean the database of the given --chain (default: mainnet)", } + + CMD cmd_db_reset { + "Removes NUM latests blocks from the db", + + ARG arg_db_reset_num: (u32) = 10u32, + "", + "Number of blocks to revert", + } + } CMD cmd_export_hardcoded_sync @@ -309,7 +321,7 @@ usage! { ["Convenience Options"] FLAG flag_unsafe_expose: (bool) = false, or |c: &Config| c.misc.as_ref()?.unsafe_expose, "--unsafe-expose", - "All servers will listen on external interfaces and will be remotely accessible. It's equivalent with setting the following: --[ws,jsonrpc,ui,ipfs-api,secretstore,stratum,dapps,secretstore-http]-interface=all --*-hosts=all This option is UNSAFE and should be used with great care!", + "All servers will listen on external interfaces and will be remotely accessible. It's equivalent with setting the following: --[ws,jsonrpc,ipfs-api,secretstore,stratum,dapps,secretstore-http]-interface=all --*-hosts=all This option is UNSAFE and should be used with great care!", ARG arg_config: (String) = "$BASE/config.toml", or |_| None, "-c, --config=[CONFIG]", @@ -461,7 +473,6 @@ usage! { Ok(()) }, - ["API and Console Options – HTTP JSON-RPC"] FLAG flag_jsonrpc_allow_missing_blocks: (bool) = false, or |c: &Config| c.rpc.as_ref()?.allow_missing_blocks.clone(), "--jsonrpc-allow-missing-blocks", @@ -761,6 +772,10 @@ usage! { "--tx-queue-per-sender=[LIMIT]", "Maximum number of transactions per sender in the queue. By default it's 1% of the entire queue, but not less than 16.", + ARG arg_tx_queue_locals: (Option) = None, or |c: &Config| helpers::join_set(c.mining.as_ref()?.tx_queue_locals.as_ref()), + "--tx-queue-locals=[ACCOUNTS]", + "Specify local accounts for which transactions are prioritized in the queue. ACCOUNTS is a comma-delimited list of addresses.", + ARG arg_tx_queue_strategy: (String) = "gas_price", or |c: &Config| c.mining.as_ref()?.tx_queue_strategy.clone(), "--tx-queue-strategy=[S]", "Prioritization strategy used to order transactions in the queue. S may be: gas_price - Prioritize txs with high gas price", @@ -900,7 +915,7 @@ usage! { ["Snapshot Options"] FLAG flag_no_periodic_snapshot: (bool) = false, or |c: &Config| c.snapshots.as_ref()?.disable_periodic.clone(), "--no-periodic-snapshot", - "Disable automated snapshots which usually occur once every 10000 blocks.", + "Disable automated snapshots which usually occur once every 5000 blocks.", ARG arg_snapshot_threads: (Option) = None, or |c: &Config| c.snapshots.as_ref()?.processing_threads, "--snapshot-threads=[NUM]", @@ -1348,6 +1363,7 @@ struct Mining { tx_queue_size: Option, tx_queue_per_sender: Option, tx_queue_mem_limit: Option, + tx_queue_locals: Option>, tx_queue_strategy: Option, tx_queue_ban_count: Option, tx_queue_ban_time: Option, @@ -1613,6 +1629,7 @@ mod tests { cmd_tools_hash: false, cmd_db: false, cmd_db_kill: false, + cmd_db_reset: false, cmd_export_hardcoded_sync: false, // Arguments @@ -1632,6 +1649,7 @@ mod tests { arg_dapp_path: None, arg_account_import_path: None, arg_wallet_import_path: None, + arg_db_reset_num: 10, // -- Operating Options arg_mode: "last".into(), @@ -1789,6 +1807,7 @@ mod tests { arg_tx_queue_size: 8192usize, arg_tx_queue_per_sender: None, arg_tx_queue_mem_limit: 4u32, + arg_tx_queue_locals: Some("0xdeadbeefcafe0000000000000000000000000000".into()), arg_tx_queue_strategy: "gas_factor".into(), arg_tx_queue_ban_count: Some(1u16), arg_tx_queue_ban_time: Some(180u16), @@ -2062,6 +2081,7 @@ mod tests { tx_queue_size: Some(8192), tx_queue_per_sender: None, tx_queue_mem_limit: None, + tx_queue_locals: None, tx_queue_strategy: None, tx_queue_ban_count: None, tx_queue_ban_time: None, diff --git a/parity/cli/presets/mod.rs b/parity/cli/presets/mod.rs index 125ab510c3c..25bccf41b83 100644 --- a/parity/cli/presets/mod.rs +++ b/parity/cli/presets/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io::{Error, ErrorKind}; diff --git a/parity/cli/tests/config.full.toml b/parity/cli/tests/config.full.toml index 99603954c87..34dd39058b7 100644 --- a/parity/cli/tests/config.full.toml +++ b/parity/cli/tests/config.full.toml @@ -129,6 +129,7 @@ price_update_period = "hourly" gas_floor_target = "8000000" gas_cap = "10000000" tx_queue_size = 8192 +tx_queue_locals = ["0xdeadbeefcafe0000000000000000000000000000"] tx_queue_strategy = "gas_factor" tx_queue_ban_count = 1 tx_queue_ban_time = 180 #s diff --git a/parity/cli/usage.rs b/parity/cli/usage.rs index caacd364f2c..8b06f4f1f68 100644 --- a/parity/cli/usage.rs +++ b/parity/cli/usage.rs @@ -1,25 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -macro_rules! println_stderr( - ($($arg:tt)*) => { { - let r = writeln!(&mut ::std::io::stderr(), $($arg)*); - r.expect("failed printing to stderr"); - } } -); +// along with Parity Ethereum. If not, see . macro_rules! return_if_parse_error { ($e:expr) => ( @@ -143,7 +136,7 @@ macro_rules! usage { ) => { use toml; use std::{fs, io, process, cmp}; - use std::io::{Read, Write}; + use std::io::Read; use parity_version::version; use clap::{Arg, App, SubCommand, AppSettings, ArgSettings, Error as ClapError, ErrorKind as ClapErrorKind}; use dir::helpers::replace_home; @@ -172,17 +165,17 @@ macro_rules! usage { match self { ArgsError::Clap(e) => e.exit(), ArgsError::Decode(e) => { - println_stderr!("You might have supplied invalid parameters in config file."); - println_stderr!("{}", e); + eprintln!("You might have supplied invalid parameters in config file."); + eprintln!("{}", e); process::exit(2) }, ArgsError::Config(path, e) => { - println_stderr!("There was an error reading your config file at: {}", path); - println_stderr!("{}", e); + eprintln!("There was an error reading your config file at: {}", path); + eprintln!("{}", e); process::exit(2) }, ArgsError::PeerConfiguration => { - println_stderr!("You have supplied `min_peers` > `max_peers`"); + eprintln!("You have supplied `min_peers` > `max_peers`"); process::exit(2) } } @@ -332,7 +325,7 @@ macro_rules! usage { let args = match (fs::File::open(&config_file), raw_args.arg_config.clone()) { // Load config file (Ok(mut file), _) => { - println_stderr!("Loading config file from {}", &config_file); + eprintln!("Loading config file from {}", &config_file); let mut config = String::new(); file.read_to_string(&mut config).map_err(|e| ArgsError::Config(config_file, e))?; Ok(raw_args.into_args(Self::parse_config(&config)?)) diff --git a/parity/cli/usage_header.txt b/parity/cli/usage_header.txt index 82a6d58b245..eaf88670013 100644 --- a/parity/cli/usage_header.txt +++ b/parity/cli/usage_header.txt @@ -1,3 +1,3 @@ Parity Ethereum Client. By Wood/Paronyan/Kotewicz/Drwięga/Volf et al. - Copyright 2015-2018 Parity Technologies (UK) Ltd. + Copyright 2015-2019 Parity Technologies (UK) Ltd. diff --git a/parity/cli/version.txt b/parity/cli/version.txt index 480fe5469ca..85ef190f124 100644 --- a/parity/cli/version.txt +++ b/parity/cli/version.txt @@ -1,6 +1,6 @@ Parity Ethereum version {} -Copyright 2015-2018 Parity Technologies (UK) Ltd. +Copyright 2015-2019 Parity Technologies (UK) Ltd. License GPLv3+: GNU GPL version 3 or later . This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. diff --git a/parity/configuration.rs b/parity/configuration.rs index 5644e4dac91..198a58c3f99 100644 --- a/parity/configuration.rs +++ b/parity/configuration.rs @@ -1,24 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::time::Duration; use std::io::Read; use std::net::SocketAddr; +use std::num::NonZeroU32; use std::path::PathBuf; -use std::collections::BTreeMap; +use std::collections::{HashSet, BTreeMap}; +use std::iter::FromIterator; use std::cmp; use cli::{Args, ArgsError}; use hash::keccak; @@ -27,7 +29,7 @@ use parity_version::{version_data, version}; use bytes::Bytes; use ansi_term::Colour; use sync::{NetworkConfiguration, validate_node_url, self}; -use ethcore::ethstore::ethkey::{Secret, Public}; +use ethkey::{Secret, Public}; use ethcore::client::{VMType}; use ethcore::miner::{stratum, MinerOptions}; use ethcore::snapshot::SnapshotConfiguration; @@ -38,7 +40,7 @@ use num_cpus; use rpc::{IpcConfiguration, HttpConfiguration, WsConfiguration}; use parity_rpc::NetworkSettings; use cache::CacheConfig; -use helpers::{to_duration, to_mode, to_block_id, to_u256, to_pending_set, to_price, geth_ipc_path, parity_ipc_path, to_bootnodes, to_addresses, to_address, to_queue_strategy, to_queue_penalization, passwords_from_files}; +use helpers::{to_duration, to_mode, to_block_id, to_u256, to_pending_set, to_price, geth_ipc_path, parity_ipc_path, to_bootnodes, to_addresses, to_address, to_queue_strategy, to_queue_penalization}; use dir::helpers::{replace_home, replace_home_and_local}; use params::{ResealPolicy, AccountsConfig, GasPricerConfig, MinerExtras, SpecType}; use ethcore_logger::Config as LogConfig; @@ -48,7 +50,7 @@ use ethcore_private_tx::{ProviderConfig, EncryptorConfig}; use secretstore::{NodeSecretKey, Configuration as SecretStoreConfiguration, ContractAddress as SecretStoreContractAddress}; use updater::{UpdatePolicy, UpdateFilter, ReleaseTrack}; use run::RunCmd; -use blockchain::{BlockchainCmd, ImportBlockchain, ExportBlockchain, KillBlockchain, ExportState, DataFormat}; +use blockchain::{BlockchainCmd, ImportBlockchain, ExportBlockchain, KillBlockchain, ExportState, DataFormat, ResetBlockchain}; use export_hardcoded_sync::ExportHsyncCmd; use presale::ImportWallet; use account::{AccountCmd, NewAccount, ListAccounts, ImportAccounts, ImportFromGethAccounts}; @@ -142,6 +144,8 @@ impl Configuration { let ipfs_conf = self.ipfs_config(); let secretstore_conf = self.secretstore_config()?; let format = self.format()?; + let keys_iterations = NonZeroU32::new(self.args.arg_keys_iterations) + .ok_or_else(|| "--keys-iterations must be non-zero")?; let cmd = if self.args.flag_version { Cmd::Version @@ -176,6 +180,19 @@ impl Configuration { } } else if self.args.cmd_tools && self.args.cmd_tools_hash { Cmd::Hash(self.args.arg_tools_hash_file) + } else if self.args.cmd_db && self.args.cmd_db_reset { + Cmd::Blockchain(BlockchainCmd::Reset(ResetBlockchain { + dirs, + spec, + pruning, + pruning_history, + pruning_memory: self.args.arg_pruning_memory, + tracing, + fat_db, + compaction, + cache_config, + num: self.args.arg_db_reset_num, + })) } else if self.args.cmd_db && self.args.cmd_db_kill { Cmd::Blockchain(BlockchainCmd::Kill(KillBlockchain { spec: spec, @@ -185,7 +202,7 @@ impl Configuration { } else if self.args.cmd_account { let account_cmd = if self.args.cmd_account_new { let new_acc = NewAccount { - iterations: self.args.arg_keys_iterations, + iterations: keys_iterations, path: dirs.keys, spec: spec, password_file: self.accounts_config()?.password_files.first().map(|x| x.to_owned()), @@ -219,7 +236,7 @@ impl Configuration { Cmd::Account(account_cmd) } else if self.args.cmd_wallet { let presale_cmd = ImportWallet { - iterations: self.args.arg_keys_iterations, + iterations: keys_iterations, path: dirs.keys, spec: spec, wallet_path: self.args.arg_wallet_import_path.clone().unwrap(), @@ -425,6 +442,7 @@ impl Configuration { gas_range_target: (floor, ceil), engine_signer: self.engine_signer()?, work_notify: self.work_notify(), + local_accounts: HashSet::from_iter(to_addresses(&self.args.arg_tx_queue_locals)?.into_iter()), }; Ok(extras) @@ -459,7 +477,8 @@ impl Configuration { } } - fn logger_config(&self) -> LogConfig { + /// returns logger config + pub fn logger_config(&self) -> LogConfig { LogConfig { mode: self.args.arg_logging.clone(), color: !self.args.flag_no_color && !cfg!(windows), @@ -513,8 +532,10 @@ impl Configuration { } fn accounts_config(&self) -> Result { + let keys_iterations = NonZeroU32::new(self.args.arg_keys_iterations) + .ok_or_else(|| "--keys-iterations must be non-zero")?; let cfg = AccountsConfig { - iterations: self.args.arg_keys_iterations, + iterations: keys_iterations, refresh_time: self.args.arg_accounts_refresh, testnet: self.args.flag_testnet, password_files: self.args.arg_password.iter().map(|s| replace_home(&self.directories().base, s)).collect(), @@ -895,20 +916,12 @@ impl Configuration { let provider_conf = ProviderConfig { validator_accounts: to_addresses(&self.args.arg_private_validators)?, signer_account: self.args.arg_private_signer.clone().and_then(|account| to_address(Some(account)).ok()), - passwords: match self.args.arg_private_passwords.clone() { - Some(file) => passwords_from_files(&vec![file].as_slice())?, - None => Vec::new(), - }, }; let encryptor_conf = EncryptorConfig { base_url: self.args.arg_private_sstore_url.clone(), threshold: self.args.arg_private_sstore_threshold.unwrap_or(0), key_server_account: self.args.arg_private_account.clone().and_then(|account| to_address(Some(account)).ok()), - passwords: match self.args.arg_private_passwords.clone() { - Some(file) => passwords_from_files(&vec![file].as_slice())?, - None => Vec::new(), - }, }; Ok((provider_conf, encryptor_conf, self.args.flag_private_enabled)) @@ -1049,6 +1062,7 @@ impl Configuration { match self.args.arg_secretstore_secret { Some(ref s) if s.len() == 64 => Ok(Some(NodeSecretKey::Plain(s.parse() .map_err(|e| format!("Invalid secret store secret: {}. Error: {:?}", s, e))?))), + #[cfg(feature = "accounts")] Some(ref s) if s.len() == 40 => Ok(Some(NodeSecretKey::KeyStore(s.parse() .map_err(|e| format!("Invalid secret store secret address: {}. Error: {:?}", s, e))?))), Some(_) => Err(format!("Invalid secret store secret. Must be either existing account address, or hex-encoded private key")), @@ -1196,6 +1210,10 @@ mod tests { use super::*; + lazy_static! { + static ref ITERATIONS: NonZeroU32 = NonZeroU32::new(10240).expect("10240 > 0; qed"); + } + #[derive(Debug, PartialEq)] struct TestPasswordReader(&'static str); @@ -1217,7 +1235,7 @@ mod tests { let args = vec!["parity", "account", "new"]; let conf = parse(&args); assert_eq!(conf.into_command().unwrap().cmd, Cmd::Account(AccountCmd::New(NewAccount { - iterations: 10240, + iterations: *ITERATIONS, path: Directories::default().keys, password_file: None, spec: SpecType::default(), @@ -1252,7 +1270,7 @@ mod tests { let args = vec!["parity", "wallet", "import", "my_wallet.json", "--password", "pwd"]; let conf = parse(&args); assert_eq!(conf.into_command().unwrap().cmd, Cmd::ImportPresaleWallet(ImportWallet { - iterations: 10240, + iterations: *ITERATIONS, path: Directories::default().keys, wallet_path: "my_wallet.json".into(), password_file: Some("pwd".into()), diff --git a/parity/db/mod.rs b/parity/db/mod.rs index a5d66339826..9b46624425b 100644 --- a/parity/db/mod.rs +++ b/parity/db/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Database-related operations. diff --git a/parity/db/rocksdb/blooms.rs b/parity/db/rocksdb/blooms.rs index 5c71fe95667..eea913bea49 100644 --- a/parity/db/rocksdb/blooms.rs +++ b/parity/db/rocksdb/blooms.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Blooms migration from rocksdb to blooms-db diff --git a/parity/db/rocksdb/helpers.rs b/parity/db/rocksdb/helpers.rs index 1b7f05c1a14..9829cb5a62c 100644 --- a/parity/db/rocksdb/helpers.rs +++ b/parity/db/rocksdb/helpers.rs @@ -1,21 +1,21 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::path::Path; -use ethcore::db::NUM_COLUMNS; +use ethcore_db::NUM_COLUMNS; use ethcore::client::{ClientConfig, DatabaseCompactionProfile}; use super::kvdb_rocksdb::{CompactionProfile, DatabaseConfig}; diff --git a/parity/db/rocksdb/migration.rs b/parity/db/rocksdb/migration.rs index c6489116b5d..eec43d23362 100644 --- a/parity/db/rocksdb/migration.rs +++ b/parity/db/rocksdb/migration.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fs; use std::io::{Read, Write, Error as IoError, ErrorKind}; @@ -21,7 +21,7 @@ use std::fmt::{Display, Formatter, Error as FmtError}; use super::migration_rocksdb::{Manager as MigrationManager, Config as MigrationConfig, ChangeColumns}; use super::kvdb_rocksdb::{CompactionProfile, DatabaseConfig}; use ethcore::client::DatabaseCompactionProfile; -use ethcore::{self, db}; +use ethcore; use super::helpers; use super::blooms::migrate_blooms; @@ -217,7 +217,7 @@ pub fn migrate(path: &Path, compaction_profile: &DatabaseCompactionProfile) -> R max_open_files: 64, memory_budget: None, compaction: compaction_profile, - columns: db::NUM_COLUMNS, + columns: ethcore_db::NUM_COLUMNS, }; migrate_blooms(&db_path, &db_config).map_err(Error::BloomsDB)?; diff --git a/parity/db/rocksdb/mod.rs b/parity/db/rocksdb/mod.rs index 91160f9218a..c7aa0a5344d 100644 --- a/parity/db/rocksdb/mod.rs +++ b/parity/db/rocksdb/mod.rs @@ -1,30 +1,31 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate kvdb_rocksdb; extern crate migration_rocksdb; +extern crate ethcore_blockchain; use std::{io, fs}; use std::sync::Arc; use std::path::Path; use blooms_db; -use ethcore::{BlockChainDBHandler, BlockChainDB}; -use ethcore::db::NUM_COLUMNS; +use ethcore_db::NUM_COLUMNS; use ethcore::client::{ClientConfig, DatabaseCompactionProfile}; use kvdb::KeyValueDB; +use self::ethcore_blockchain::{BlockChainDBHandler, BlockChainDB}; use self::kvdb_rocksdb::{Database, DatabaseConfig}; use cache::CacheConfig; diff --git a/parity/deprecated.rs b/parity/deprecated.rs index 91a872e2202..49155225aa0 100644 --- a/parity/deprecated.rs +++ b/parity/deprecated.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use cli::Args; diff --git a/parity/export_hardcoded_sync.rs b/parity/export_hardcoded_sync.rs index b3121f08616..0e527b3413b 100644 --- a/parity/export_hardcoded_sync.rs +++ b/parity/export_hardcoded_sync.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::time::Duration; @@ -77,7 +77,7 @@ pub fn execute(cmd: ExportHsyncCmd) -> Result { // start client and create transaction queue. let mut config = light_client::Config { queue: Default::default(), - chain_column: ::ethcore::db::COL_LIGHT_CHAIN, + chain_column: ::ethcore_db::COL_LIGHT_CHAIN, verify_full: true, check_seal: true, no_hardcoded_sync: true, diff --git a/parity/helpers.rs b/parity/helpers.rs index 0a378a34f19..b68d854d1a9 100644 --- a/parity/helpers.rs +++ b/parity/helpers.rs @@ -1,23 +1,24 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io; use std::io::{Write, BufReader, BufRead}; use std::time::Duration; use std::fs::File; +use std::collections::HashSet; use ethereum_types::{U256, clean_0x, Address}; use journaldb::Algorithm; use ethcore::client::{Mode, BlockId, VMType, DatabaseCompactionProfile, ClientConfig, VerifierType}; @@ -134,6 +135,13 @@ pub fn to_price(s: &str) -> Result { s.parse::().map_err(|_| format!("Invalid transaciton price 's' given. Must be a decimal number.")) } +pub fn join_set(set: Option<&HashSet>) -> Option { + match set { + Some(s) => Some(s.iter().map(|s| s.as_str()).collect::>().join(",")), + None => None + } +} + /// Flush output buffer. pub fn flush_stdout() { io::stdout().flush().expect("stdout is flushable; qed"); @@ -327,12 +335,13 @@ mod tests { use std::time::Duration; use std::fs::File; use std::io::Write; + use std::collections::HashSet; use tempdir::TempDir; use ethereum_types::U256; use ethcore::client::{Mode, BlockId}; use ethcore::miner::PendingSet; use ethkey::Password; - use super::{to_duration, to_mode, to_block_id, to_u256, to_pending_set, to_address, to_addresses, to_price, geth_ipc_path, to_bootnodes, password_from_file}; + use super::{to_duration, to_mode, to_block_id, to_u256, to_pending_set, to_address, to_addresses, to_price, geth_ipc_path, to_bootnodes, join_set, password_from_file}; #[test] fn test_to_duration() { @@ -472,4 +481,20 @@ but the first password is trimmed assert_eq!(to_bootnodes(&Some(one_bootnode.into())), Ok(vec![one_bootnode.into()])); assert_eq!(to_bootnodes(&Some(two_bootnodes.into())), Ok(vec![one_bootnode.into(), one_bootnode.into()])); } + + #[test] + fn test_join_set() { + let mut test_set = HashSet::new(); + test_set.insert("0x1111111111111111111111111111111111111111".to_string()); + test_set.insert("0x0000000000000000000000000000000000000000".to_string()); + + + let res = join_set(Some(&test_set)).unwrap(); + + assert!( + res == "0x1111111111111111111111111111111111111111,0x0000000000000000000000000000000000000000" + || + res == "0x0000000000000000000000000000000000000000,0x1111111111111111111111111111111111111111" + ); + } } diff --git a/parity/informant.rs b/parity/informant.rs index 5209a855156..78d055686b9 100644 --- a/parity/informant.rs +++ b/parity/informant.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate ansi_term; use self::ansi_term::Colour::{White, Yellow, Green, Cyan, Blue}; @@ -27,7 +27,7 @@ use ethcore::client::{ BlockId, BlockChainClient, ChainInfo, BlockInfo, BlockChainInfo, BlockQueueInfo, ChainNotify, NewBlocks, ClientReport, Client, ClientIoMessage }; -use ethcore::header::BlockNumber; +use types::BlockNumber; use ethcore::snapshot::{RestorationStatus, SnapshotService as SS}; use ethcore::snapshot::service::Service as SnapshotService; use sync::{LightSyncProvider, LightSync, SyncProvider, ManageNetwork}; @@ -146,7 +146,7 @@ impl InformantData for FullNodeInformantData { (Some(sync), Some(net)) => { let status = sync.status(); let num_peers_range = net.num_peers_range(); - debug_assert!(num_peers_range.end > num_peers_range.start); + debug_assert!(num_peers_range.end() >= num_peers_range.start()); cache_sizes.insert("sync", status.mem_used); @@ -154,7 +154,7 @@ impl InformantData for FullNodeInformantData { last_imported_block_number: status.last_imported_block_number.unwrap_or(chain_info.best_block_number), last_imported_old_block_number: status.last_imported_old_block_number, num_peers: status.num_peers, - max_peers: status.current_max_peers(num_peers_range.start, num_peers_range.end - 1), + max_peers: status.current_max_peers(*num_peers_range.start(), *num_peers_range.end()), snapshot_sync: status.is_snapshot_syncing(), }) } diff --git a/parity/ipfs.rs b/parity/ipfs.rs index 2cc2effca5f..0923a1e7d40 100644 --- a/parity/ipfs.rs +++ b/parity/ipfs.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use parity_ipfs_api::{self, AccessControlAllowOrigin, Host, Listening}; diff --git a/parity/lib.rs b/parity/lib.rs index c885b43bb7b..9141bdcadee 100644 --- a/parity/lib.rs +++ b/parity/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Ethcore client application. @@ -23,7 +23,6 @@ extern crate docopt; #[macro_use] extern crate clap; extern crate dir; -extern crate env_logger; extern crate futures; extern crate atty; extern crate jsonrpc_core; @@ -42,8 +41,11 @@ extern crate serde_derive; extern crate toml; extern crate blooms_db; +extern crate cli_signer; +extern crate common_types as types; extern crate ethcore; -extern crate parity_bytes as bytes; +extern crate ethcore_call_contract as call_contract; +extern crate ethcore_db; extern crate ethcore_io as io; extern crate ethcore_light as light; extern crate ethcore_logger; @@ -52,28 +54,31 @@ extern crate ethcore_network as network; extern crate ethcore_private_tx; extern crate ethcore_service; extern crate ethcore_sync as sync; -extern crate ethcore_transaction as transaction; extern crate ethereum_types; extern crate ethkey; +extern crate ethstore; +extern crate journaldb; +extern crate keccak_hash as hash; extern crate kvdb; +extern crate node_filter; +extern crate parity_bytes as bytes; extern crate parity_hash_fetch as hash_fetch; extern crate parity_ipfs_api; extern crate parity_local_store as local_store; -extern crate parity_runtime; +extern crate parity_path as path; extern crate parity_rpc; +extern crate parity_runtime; extern crate parity_updater as updater; extern crate parity_version; extern crate parity_whisper; -extern crate parity_path as path; -extern crate rpc_cli; -extern crate node_filter; -extern crate keccak_hash as hash; -extern crate journaldb; extern crate registrar; #[macro_use] extern crate log as rlog; +#[cfg(feature = "ethcore-accounts")] +extern crate ethcore_accounts as accounts; + #[cfg(feature = "secretstore")] extern crate ethcore_secretstore; @@ -84,7 +89,12 @@ extern crate pretty_assertions; #[cfg(test)] extern crate tempdir; +#[cfg(test)] +#[macro_use] +extern crate lazy_static; + mod account; +mod account_utils; mod blockchain; mod cache; mod cli; @@ -109,18 +119,22 @@ mod user_defaults; mod whisper; mod db; -use std::io::BufReader; use std::fs::File; -use hash::keccak_buffer; +use std::io::BufReader; +use std::sync::Arc; + use cli::Args; use configuration::{Cmd, Execute}; use deprecated::find_deprecated; -use ethcore_logger::setup_log; +use hash::keccak_buffer; + #[cfg(feature = "memory_profiling")] use std::alloc::System; pub use self::configuration::Configuration; pub use self::run::RunningClient; +pub use parity_rpc::PubSubSession; +pub use ethcore_logger::{Config as LoggerConfig, setup_log, RotatingLogger}; #[cfg(feature = "memory_profiling")] #[global_allocator] @@ -165,7 +179,6 @@ fn run_deadlock_detection_thread() { }); } - /// Action that Parity performed when running `start`. pub enum ExecutionAction { /// The execution didn't require starting a node, and thus has finished. @@ -178,14 +191,13 @@ pub enum ExecutionAction { Running(RunningClient), } -fn execute(command: Execute, on_client_rq: Cr, on_updater_rq: Rr) -> Result +fn execute( + command: Execute, + logger: Arc, + on_client_rq: Cr, on_updater_rq: Rr) -> Result where Cr: Fn(String) + 'static + Send, Rr: Fn() + 'static + Send { - // TODO: move this to `main()` and expose in the C API so that users can setup logging the way - // they want - let logger = setup_log(&command.logger).expect("Logger is initialized only once; qed"); - #[cfg(feature = "deadlock_detection")] run_deadlock_detection_thread(); @@ -200,9 +212,9 @@ fn execute(command: Execute, on_client_rq: Cr, on_updater_rq: Rr) -> Res Cmd::ImportPresaleWallet(presale_cmd) => presale::execute(presale_cmd).map(|s| ExecutionAction::Instant(Some(s))), Cmd::Blockchain(blockchain_cmd) => blockchain::execute(blockchain_cmd).map(|_| ExecutionAction::Instant(None)), Cmd::SignerToken(ws_conf, logger_config) => signer::execute(ws_conf, logger_config).map(|s| ExecutionAction::Instant(Some(s))), - Cmd::SignerSign { id, pwfile, port, authfile } => rpc_cli::signer_sign(id, pwfile, port, authfile).map(|s| ExecutionAction::Instant(Some(s))), - Cmd::SignerList { port, authfile } => rpc_cli::signer_list(port, authfile).map(|s| ExecutionAction::Instant(Some(s))), - Cmd::SignerReject { id, port, authfile } => rpc_cli::signer_reject(id, port, authfile).map(|s| ExecutionAction::Instant(Some(s))), + Cmd::SignerSign { id, pwfile, port, authfile } => cli_signer::signer_sign(id, pwfile, port, authfile).map(|s| ExecutionAction::Instant(Some(s))), + Cmd::SignerList { port, authfile } => cli_signer::signer_list(port, authfile).map(|s| ExecutionAction::Instant(Some(s))), + Cmd::SignerReject { id, port, authfile } => cli_signer::signer_reject(id, port, authfile).map(|s| ExecutionAction::Instant(Some(s))), Cmd::Snapshot(snapshot_cmd) => snapshot::execute(snapshot_cmd).map(|s| ExecutionAction::Instant(Some(s))), Cmd::ExportHardcodedSync(export_hs_cmd) => export_hardcoded_sync::execute(export_hs_cmd).map(|s| ExecutionAction::Instant(Some(s))), } @@ -219,14 +231,21 @@ fn execute(command: Execute, on_client_rq: Cr, on_updater_rq: Rr) -> Res /// binary. /// /// On error, returns what to print on stderr. -pub fn start(conf: Configuration, on_client_rq: Cr, on_updater_rq: Rr) -> Result - where Cr: Fn(String) + 'static + Send, - Rr: Fn() + 'static + Send +// FIXME: totally independent logging capability, see https://github.com/paritytech/parity-ethereum/issues/10252 +pub fn start( + conf: Configuration, + logger: Arc, + on_client_rq: Cr, + on_updater_rq: Rr +) -> Result + where + Cr: Fn(String) + 'static + Send, + Rr: Fn() + 'static + Send { let deprecated = find_deprecated(&conf.args); for d in deprecated { println!("{}", d); } - execute(conf.into_command()?, on_client_rq, on_updater_rq) + execute(conf.into_command()?, logger, on_client_rq, on_updater_rq) } diff --git a/parity/light_helpers/epoch_fetch.rs b/parity/light_helpers/epoch_fetch.rs index a7d8f4171fb..01e74059ea5 100644 --- a/parity/light_helpers/epoch_fetch.rs +++ b/parity/light_helpers/epoch_fetch.rs @@ -1,27 +1,27 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::{Arc, Weak}; -use ethcore::encoded; use ethcore::engines::{EthEngine, StateDependentProof}; -use ethcore::header::Header; use ethcore::machine::EthereumMachine; -use ethcore::receipt::Receipt; -use sync::LightSync; +use sync::{LightSync, LightNetworkDispatcher}; +use types::encoded; +use types::header::Header; +use types::receipt::Receipt; use futures::{future, Future}; use futures::future::Either; diff --git a/parity/light_helpers/mod.rs b/parity/light_helpers/mod.rs index c30b62da55e..9a9bbf2cd87 100644 --- a/parity/light_helpers/mod.rs +++ b/parity/light_helpers/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Utilities and helpers for the light client. diff --git a/parity/light_helpers/queue_cull.rs b/parity/light_helpers/queue_cull.rs index ee056607599..ec1ca612b80 100644 --- a/parity/light_helpers/queue_cull.rs +++ b/parity/light_helpers/queue_cull.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Service for culling the light client's transaction queue. @@ -20,7 +20,7 @@ use std::sync::Arc; use std::time::Duration; use ethcore::client::ClientIoMessage; -use sync::LightSync; +use sync::{LightSync, LightNetworkDispatcher}; use io::{IoContext, IoHandler, TimerToken}; use light::client::LightChainClient; diff --git a/logger/Cargo.toml b/parity/logger/Cargo.toml similarity index 100% rename from logger/Cargo.toml rename to parity/logger/Cargo.toml diff --git a/logger/src/lib.rs b/parity/logger/src/lib.rs similarity index 91% rename from logger/src/lib.rs rename to parity/logger/src/lib.rs index c78c24b29ea..a2e3de176aa 100644 --- a/logger/src/lib.rs +++ b/parity/logger/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Logger for parity executables @@ -94,7 +94,7 @@ pub fn setup_log(config: &Config) -> Result, String> { let maybe_file = match config.file.as_ref() { Some(f) => Some(open_options .append(true).create(true).open(f) - .map_err(|_| format!("Cannot write to log file given: {}", f))?), + .map_err(|e| format!("Cannot write to log file given: {}, {}", f, e))?), None => None, }; diff --git a/logger/src/rotating.rs b/parity/logger/src/rotating.rs similarity index 88% rename from logger/src/rotating.rs rename to parity/logger/src/rotating.rs index e8fde50d446..2745e95bf62 100644 --- a/logger/src/rotating.rs +++ b/parity/logger/src/rotating.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Common log helper functions diff --git a/parity/main.rs b/parity/main.rs index 1254c34727b..066061cbafd 100644 --- a/parity/main.rs +++ b/parity/main.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Ethcore client application. @@ -26,21 +26,27 @@ extern crate log; extern crate panic_hook; extern crate parity_ethereum; extern crate parking_lot; +extern crate parity_daemonize; +extern crate ansi_term; #[cfg(windows)] extern crate winapi; +extern crate ethcore_logger; use std::ffi::OsString; use std::fs::{remove_file, metadata, File, create_dir_all}; -use std::io::{self as stdio, Read, Write}; +use std::io::{Read, Write}; use std::path::PathBuf; use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; use std::{process, env}; +use ansi_term::Colour; use ctrlc::CtrlC; use dir::default_hypervisor_path; use fdlimit::raise_fd_limit; +use ethcore_logger::setup_log; use parity_ethereum::{start, ExecutionAction}; +use parity_daemonize::AsHandle; use parking_lot::{Condvar, Mutex}; const PLEASE_RESTART_EXIT_CODE: i32 = 69; @@ -184,11 +190,36 @@ fn main_direct(force_can_restart: bool) -> i32 { parity_ethereum::Configuration::parse_cli(&args).unwrap_or_else(|e| e.exit()) }; + let logger = setup_log(&conf.logger_config()).unwrap_or_else(|e| { + eprintln!("{}", e); + process::exit(2) + }); + if let Some(spec_override) = take_spec_name_override() { conf.args.flag_testnet = false; conf.args.arg_chain = spec_override; } + // FIXME: `pid_file` shouldn't need to cloned here + // see: `https://github.com/paritytech/parity-daemonize/pull/13` for more info + let handle = if let Some(pid) = conf.args.arg_daemon_pid_file.clone() { + info!("{}", Colour::Blue.paint("starting in daemon mode").to_string()); + let _ = std::io::stdout().flush(); + + match parity_daemonize::daemonize(pid) { + Ok(h) => Some(h), + Err(e) => { + error!( + "{}", + Colour::Red.paint(format!("{}", e)) + ); + return 1; + } + } + } else { + None + }; + let can_restart = force_can_restart || conf.args.flag_can_restart; // increase max number of open files @@ -208,6 +239,7 @@ fn main_direct(force_can_restart: bool) -> i32 { let exec = if can_restart { start( conf, + logger, { let e = exit.clone(); let exiting = exiting.clone(); @@ -239,10 +271,9 @@ fn main_direct(force_can_restart: bool) -> i32 { } } ) - } else { trace!(target: "mode", "Not hypervised: not setting exit handlers."); - start(conf, move |_| {}, move || {}) + start(conf, logger, move |_| {}, move || {}) }; let res = match exec { @@ -254,7 +285,7 @@ fn main_direct(force_can_restart: bool) -> i32 { let e = exit.clone(); let exiting = exiting.clone(); move |panic_msg| { - let _ = stdio::stderr().write_all(panic_msg.as_bytes()); + eprintln!("{}", panic_msg); if !exiting.swap(true, Ordering::SeqCst) { *e.0.lock() = ExitStatus { panicking: true, @@ -283,6 +314,12 @@ fn main_direct(force_can_restart: bool) -> i32 { } }); + // so the client has started successfully + // if this is a daemon, detach from the parent process + if let Some(mut handle) = handle { + handle.detach() + } + // Wait for signal let mut lock = exit.0.lock(); if !lock.should_exit { @@ -306,7 +343,12 @@ fn main_direct(force_can_restart: bool) -> i32 { }, }, Err(err) => { - writeln!(&mut stdio::stderr(), "{}", err).expect("StdErr available; qed"); + // error occured during start up + // if this is a daemon, detach from the parent process + if let Some(mut handle) = handle { + handle.detach_with_msg(format!("{}", Colour::Red.paint(&err))) + } + eprintln!("{}", err); 1 }, }; @@ -321,7 +363,6 @@ fn println_trace_main(s: String) { } } -#[macro_export] macro_rules! trace_main { ($arg:expr) => (println_trace_main($arg.into())); ($($arg:tt)*) => (println_trace_main(format!("{}", format_args!($($arg)*)))); diff --git a/parity/modules.rs b/parity/modules.rs index ac84aea5f21..9f5d25a11e2 100644 --- a/parity/modules.rs +++ b/parity/modules.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::{Arc, mpsc}; @@ -37,7 +37,7 @@ pub fn sync( network_config: NetworkConfiguration, chain: Arc, snapshot_service: Arc, - private_tx_handler: Arc, + private_tx_handler: Option>, provider: Arc, _log_settings: &LogConfig, attached_protos: Vec, diff --git a/parity/params.rs b/parity/params.rs index 1d384687550..a916d05a78e 100644 --- a/parity/params.rs +++ b/parity/params.rs @@ -1,21 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use std::{str, fs, fmt}; +use std::collections::HashSet; use std::time::Duration; +use std::{str, fs, fmt}; +use std::num::NonZeroU32; use ethcore::client::Mode; use ethcore::ethereum; @@ -214,7 +216,7 @@ impl str::FromStr for ResealPolicy { #[derive(Debug, PartialEq)] pub struct AccountsConfig { - pub iterations: u32, + pub iterations: NonZeroU32, pub refresh_time: u64, pub testnet: bool, pub password_files: Vec, @@ -226,7 +228,7 @@ pub struct AccountsConfig { impl Default for AccountsConfig { fn default() -> Self { AccountsConfig { - iterations: 10240, + iterations: NonZeroU32::new(10240).expect("10240 > 0; qed"), refresh_time: 5, testnet: false, password_files: Vec::new(), @@ -282,6 +284,7 @@ pub struct MinerExtras { pub extra_data: Vec, pub gas_range_target: (U256, U256), pub work_notify: Vec, + pub local_accounts: HashSet
, } impl Default for MinerExtras { @@ -292,6 +295,7 @@ impl Default for MinerExtras { extra_data: version_data(), gas_range_target: (8_000_000.into(), 10_000_000.into()), work_notify: Default::default(), + local_accounts: Default::default(), } } } diff --git a/parity/presale.rs b/parity/presale.rs index 16af2fb8231..162d149b544 100644 --- a/parity/presale.rs +++ b/parity/presale.rs @@ -1,28 +1,29 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use ethcore::ethstore::{PresaleWallet, EthStore}; -use ethcore::ethstore::accounts_dir::RootDiskDirectory; -use ethcore::account_provider::{AccountProvider, AccountProviderSettings}; + +use ethkey::Password; +use ethstore::PresaleWallet; use helpers::{password_prompt, password_from_file}; use params::SpecType; +use std::num::NonZeroU32; #[derive(Debug, PartialEq)] pub struct ImportWallet { - pub iterations: u32, + pub iterations: NonZeroU32, pub path: String, pub spec: SpecType, pub wallet_path: String, @@ -30,16 +31,29 @@ pub struct ImportWallet { } pub fn execute(cmd: ImportWallet) -> Result { - let password = match cmd.password_file { + let password = match cmd.password_file.clone() { Some(file) => password_from_file(file)?, None => password_prompt()?, }; - let dir = Box::new(RootDiskDirectory::create(cmd.path).unwrap()); - let secret_store = Box::new(EthStore::open_with_iterations(dir, cmd.iterations).unwrap()); - let acc_provider = AccountProvider::new(secret_store, AccountProviderSettings::default()); - let wallet = PresaleWallet::open(cmd.wallet_path).map_err(|_| "Unable to open presale wallet.")?; + let wallet = PresaleWallet::open(cmd.wallet_path.clone()).map_err(|_| "Unable to open presale wallet.")?; let kp = wallet.decrypt(&password).map_err(|_| "Invalid password.")?; - let address = acc_provider.insert_account(kp.secret().clone(), &password).unwrap(); + let address = kp.address(); + import_account(&cmd, kp, password); Ok(format!("{:?}", address)) } + +#[cfg(feature = "accounts")] +pub fn import_account(cmd: &ImportWallet, kp: ethkey::KeyPair, password: Password) { + use accounts::{AccountProvider, AccountProviderSettings}; + use ethstore::EthStore; + use ethstore::accounts_dir::RootDiskDirectory; + + let dir = Box::new(RootDiskDirectory::create(cmd.path.clone()).unwrap()); + let secret_store = Box::new(EthStore::open_with_iterations(dir, cmd.iterations).unwrap()); + let acc_provider = AccountProvider::new(secret_store, AccountProviderSettings::default()); + acc_provider.insert_account(kp.secret().clone(), &password).unwrap(); +} + +#[cfg(not(feature = "accounts"))] +pub fn import_account(_cmd: &ImportWallet, _kp: ethkey::KeyPair, _password: Password) {} diff --git a/parity/rpc.rs b/parity/rpc.rs index d77bc6d6d99..b07ca3f3e48 100644 --- a/parity/rpc.rs +++ b/parity/rpc.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io; use std::sync::Arc; @@ -151,7 +151,7 @@ pub fn new_ws( let url = format!("{}:{}", conf.interface, conf.port); let addr = url.parse().map_err(|_| format!("Invalid WebSockets listen host/port given: {}", url))?; - let full_handler = setup_apis(rpc_apis::ApiSet::SafeContext, deps); + let full_handler = setup_apis(rpc_apis::ApiSet::All, deps); let handler = { let mut handler = MetaIoHandler::with_middleware(( rpc::WsDispatcher::new(full_handler), diff --git a/parity/rpc_apis.rs b/parity/rpc_apis.rs index 660ec66289f..4413e6a779a 100644 --- a/parity/rpc_apis.rs +++ b/parity/rpc_apis.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::cmp::PartialEq; use std::collections::{BTreeMap, HashSet}; @@ -21,7 +21,7 @@ use std::sync::{Arc, Weak}; pub use parity_rpc::signer::SignerService; -use ethcore::account_provider::AccountProvider; +use account_utils::{self, AccountProvider}; use ethcore::client::Client; use ethcore::miner::Miner; use ethcore::snapshot::SnapshotService; @@ -113,11 +113,9 @@ impl FromStr for Api { #[derive(Debug, Clone)] pub enum ApiSet { - // Safe context (like token-protected WS interface) - SafeContext, // Unsafe context (like jsonrpc over http) UnsafeContext, - // All possible APIs + // All possible APIs (safe context like token-protected WS interface) All, // Local "unsafe" context and accounts access IpcContext, @@ -197,6 +195,26 @@ fn to_modules(apis: &HashSet) -> BTreeMap { modules } +macro_rules! add_signing_methods { + ($namespace:ident, $handler:expr, $deps:expr, $dispatch:expr) => {{ + let deps = &$deps; + let (dispatcher, accounts) = $dispatch; + if deps.signer_service.is_enabled() { + $handler.extend_with($namespace::to_delegate(SigningQueueClient::new( + &deps.signer_service, + dispatcher.clone(), + deps.executor.clone(), + accounts, + ))) + } else { + $handler.extend_with($namespace::to_delegate(SigningUnsafeClient::new( + accounts, + dispatcher.clone(), + ))) + } + }}; +} + /// RPC dependencies can be used to initialize RPC endpoints from APIs. pub trait Dependencies { type Notifier: ActivityNotifier; @@ -217,7 +235,7 @@ pub struct FullDependencies { pub snapshot: Arc, pub sync: Arc, pub net: Arc, - pub secret_store: Arc, + pub accounts: Arc, pub private_tx_service: Option>, pub miner: Arc, pub external_miner: Arc, @@ -247,31 +265,6 @@ impl FullDependencies { { use parity_rpc::v1::*; - macro_rules! add_signing_methods { - ($namespace:ident, $handler:expr, $deps:expr, $nonces:expr) => {{ - let deps = &$deps; - let dispatcher = FullDispatcher::new( - deps.client.clone(), - deps.miner.clone(), - $nonces, - deps.gas_price_percentile, - ); - if deps.signer_service.is_enabled() { - $handler.extend_with($namespace::to_delegate(SigningQueueClient::new( - &deps.signer_service, - dispatcher, - deps.executor.clone(), - &deps.secret_store, - ))) - } else { - $handler.extend_with($namespace::to_delegate(SigningUnsafeClient::new( - &deps.secret_store, - dispatcher, - ))) - } - }}; - } - let nonces = Arc::new(Mutex::new(dispatch::Reservations::new( self.executor.clone(), ))); @@ -281,6 +274,9 @@ impl FullDependencies { nonces.clone(), self.gas_price_percentile, ); + let account_signer = Arc::new(dispatch::Signer::new(self.accounts.clone())) as _; + let accounts = account_utils::accounts_list(self.accounts.clone()); + for api in apis { match *api { Api::Debug => { @@ -297,7 +293,7 @@ impl FullDependencies { &self.client, &self.snapshot, &self.sync, - &self.secret_store, + &accounts, &self.miner, &self.external_miner, EthClientOptions { @@ -319,7 +315,7 @@ impl FullDependencies { ); handler.extend_with(filter_client.to_delegate()); - add_signing_methods!(EthSigning, handler, self, nonces.clone()); + add_signing_methods!(EthSigning, handler, self, (&dispatcher, &account_signer)); } } Api::EthPubSub => { @@ -341,9 +337,10 @@ impl FullDependencies { } } Api::Personal => { + #[cfg(feature = "accounts")] handler.extend_with( PersonalClient::new( - &self.secret_store, + &self.accounts, dispatcher.clone(), self.geth_compatibility, self.experimental_rpcs, @@ -353,7 +350,7 @@ impl FullDependencies { Api::Signer => { handler.extend_with( SignerClient::new( - &self.secret_store, + account_signer.clone(), dispatcher.clone(), &self.signer_service, self.executor.clone(), @@ -372,7 +369,6 @@ impl FullDependencies { self.sync.clone(), self.updater.clone(), self.net_service.clone(), - self.secret_store.clone(), self.logger.clone(), self.settings.clone(), signer, @@ -380,9 +376,11 @@ impl FullDependencies { self.snapshot.clone().into(), ).to_delegate(), ); + #[cfg(feature = "accounts")] + handler.extend_with(ParityAccountsInfo::to_delegate(ParityAccountsClient::new(&self.accounts))); if !for_generic_pubsub { - add_signing_methods!(ParitySigning, handler, self, nonces.clone()); + add_signing_methods!(ParitySigning, handler, self, (&dispatcher, &account_signer)); } } Api::ParityPubSub => { @@ -398,25 +396,35 @@ impl FullDependencies { } } Api::ParityAccounts => { - handler - .extend_with(ParityAccountsClient::new(&self.secret_store).to_delegate()); + #[cfg(feature = "accounts")] + handler.extend_with(ParityAccounts::to_delegate(ParityAccountsClient::new(&self.accounts))); + } + Api::ParitySet => { + handler.extend_with( + ParitySetClient::new( + &self.client, + &self.miner, + &self.updater, + &self.net_service, + self.fetch.clone(), + ).to_delegate(), + ); + #[cfg(feature = "accounts")] + handler.extend_with( + ParitySetAccountsClient::new( + &self.accounts, + &self.miner, + ).to_delegate(), + ); } - Api::ParitySet => handler.extend_with( - ParitySetClient::new( - &self.client, - &self.miner, - &self.updater, - &self.net_service, - self.fetch.clone(), - ).to_delegate(), - ), Api::Traces => handler.extend_with(TracesClient::new(&self.client).to_delegate()), Api::Rpc => { let modules = to_modules(&apis); handler.extend_with(RpcClient::new(modules).to_delegate()); } Api::SecretStore => { - handler.extend_with(SecretStoreClient::new(&self.secret_store).to_delegate()); + #[cfg(feature = "accounts")] + handler.extend_with(SecretStoreClient::new(&self.accounts).to_delegate()); } Api::Whisper => { if let Some(ref whisper_rpc) = self.whisper_rpc { @@ -475,7 +483,7 @@ pub struct LightDependencies { pub client: Arc, pub sync: Arc, pub net: Arc, - pub secret_store: Arc, + pub accounts: Arc, pub logger: Arc, pub settings: Arc, pub on_demand: Arc<::light::on_demand::OnDemand>, @@ -512,27 +520,8 @@ impl LightDependencies { ))), self.gas_price_percentile, ); - - macro_rules! add_signing_methods { - ($namespace:ident, $handler:expr, $deps:expr) => {{ - let deps = &$deps; - let dispatcher = dispatcher.clone(); - let secret_store = deps.secret_store.clone(); - if deps.signer_service.is_enabled() { - $handler.extend_with($namespace::to_delegate(SigningQueueClient::new( - &deps.signer_service, - dispatcher, - deps.executor.clone(), - &secret_store, - ))) - } else { - $handler.extend_with($namespace::to_delegate(SigningUnsafeClient::new( - &secret_store, - dispatcher, - ))) - } - }}; - } + let account_signer = Arc::new(dispatch::Signer::new(self.accounts.clone())) as _; + let accounts = account_utils::accounts_list(self.accounts.clone()); for api in apis { match *api { @@ -551,7 +540,7 @@ impl LightDependencies { self.client.clone(), self.on_demand.clone(), self.transaction_queue.clone(), - self.secret_store.clone(), + accounts.clone(), self.cache.clone(), self.gas_price_percentile, self.poll_lifetime, @@ -560,7 +549,7 @@ impl LightDependencies { if !for_generic_pubsub { handler.extend_with(EthFilter::to_delegate(client)); - add_signing_methods!(EthSigning, handler, self); + add_signing_methods!(EthSigning, handler, self, (&dispatcher, &account_signer)); } } Api::EthPubSub => { @@ -584,9 +573,10 @@ impl LightDependencies { handler.extend_with(EthPubSub::to_delegate(client)); } Api::Personal => { + #[cfg(feature = "accounts")] handler.extend_with( PersonalClient::new( - &self.secret_store, + &self.accounts, dispatcher.clone(), self.geth_compatibility, self.experimental_rpcs, @@ -596,7 +586,7 @@ impl LightDependencies { Api::Signer => { handler.extend_with( SignerClient::new( - &self.secret_store, + account_signer.clone(), dispatcher.clone(), &self.signer_service, self.executor.clone(), @@ -611,7 +601,6 @@ impl LightDependencies { handler.extend_with( light::ParityClient::new( Arc::new(dispatcher.clone()), - self.secret_store.clone(), self.logger.clone(), self.settings.clone(), signer, @@ -619,9 +608,13 @@ impl LightDependencies { self.gas_price_percentile, ).to_delegate(), ); + #[cfg(feature = "accounts")] + handler.extend_with( + ParityAccountsInfo::to_delegate(ParityAccountsClient::new(&self.accounts)) + ); if !for_generic_pubsub { - add_signing_methods!(ParitySigning, handler, self); + add_signing_methods!(ParitySigning, handler, self, (&dispatcher, &account_signer)); } } Api::ParityPubSub => { @@ -637,8 +630,8 @@ impl LightDependencies { } } Api::ParityAccounts => { - handler - .extend_with(ParityAccountsClient::new(&self.secret_store).to_delegate()); + #[cfg(feature = "accounts")] + handler.extend_with(ParityAccounts::to_delegate(ParityAccountsClient::new(&self.accounts))); } Api::ParitySet => handler.extend_with( light::ParitySetClient::new(self.sync.clone(), self.fetch.clone()) @@ -650,7 +643,8 @@ impl LightDependencies { handler.extend_with(RpcClient::new(modules).to_delegate()); } Api::SecretStore => { - handler.extend_with(SecretStoreClient::new(&self.secret_store).to_delegate()); + #[cfg(feature = "accounts")] + handler.extend_with(SecretStoreClient::new(&self.accounts).to_delegate()); } Api::Whisper => { if let Some(ref whisper_rpc) = self.whisper_rpc { @@ -727,16 +721,6 @@ impl ApiSet { public_list.insert(Api::ParityAccounts); public_list } - ApiSet::SafeContext => { - public_list.insert(Api::Debug); - public_list.insert(Api::Traces); - public_list.insert(Api::ParityPubSub); - public_list.insert(Api::ParityAccounts); - public_list.insert(Api::ParitySet); - public_list.insert(Api::Signer); - public_list.insert(Api::SecretStore); - public_list - } ApiSet::All => { public_list.insert(Api::Debug); public_list.insert(Api::Traces); @@ -842,33 +826,6 @@ mod test { assert_eq!(ApiSet::IpcContext.list_apis(), expected); } - #[test] - fn test_api_set_safe_context() { - let expected = vec![ - // safe - Api::Web3, - Api::Net, - Api::Eth, - Api::EthPubSub, - Api::Parity, - Api::ParityPubSub, - Api::Traces, - Api::Rpc, - Api::SecretStore, - Api::Whisper, - Api::WhisperPubSub, - Api::Private, - // semi-safe - Api::ParityAccounts, - // Unsafe - Api::ParitySet, - Api::Signer, - Api::Debug, - ].into_iter() - .collect(); - assert_eq!(ApiSet::SafeContext.list_apis(), expected); - } - #[test] fn test_all_apis() { assert_eq!( diff --git a/parity/run.rs b/parity/run.rs index 28536ea6a45..13e93c1e215 100644 --- a/parity/run.rs +++ b/parity/run.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::any::Any; use std::sync::{Arc, Weak, atomic}; @@ -21,27 +21,28 @@ use std::thread; use ansi_term::Colour; use bytes::Bytes; -use ethcore::account_provider::{AccountProvider, AccountProviderSettings}; -use ethcore::client::{BlockId, CallContract, Client, Mode, DatabaseCompactionProfile, VMType, BlockChainClient, BlockInfo}; -use ethcore::ethstore::ethkey; -use ethcore::miner::{stratum, Miner, MinerService, MinerOptions}; +use call_contract::CallContract; +use ethcore::client::{BlockId, Client, Mode, DatabaseCompactionProfile, VMType, BlockChainClient, BlockInfo}; +use ethcore::miner::{self, stratum, Miner, MinerService, MinerOptions}; use ethcore::snapshot::{self, SnapshotConfiguration}; use ethcore::spec::{SpecParams, OptimizeFor}; use ethcore::verification::queue::VerifierSettings; use ethcore_logger::{Config as LogConfig, RotatingLogger}; use ethcore_service::ClientService; use ethereum_types::Address; -use sync::{self, SyncConfig}; -use miner::work_notify::WorkPoster; use futures::IntoFuture; use hash_fetch::{self, fetch}; use informant::{Informant, LightNodeInformantData, FullNodeInformantData}; use journaldb::Algorithm; use light::Cache as LightDataCache; use miner::external::ExternalMiner; +use miner::work_notify::WorkPoster; use node_filter::NodeFilter; use parity_runtime::Runtime; -use parity_rpc::{Origin, Metadata, NetworkSettings, informant, is_major_importing}; +use sync::{self, SyncConfig, PrivateTxHandler}; +use parity_rpc::{ + Origin, Metadata, NetworkSettings, informant, is_major_importing, PubSubSession, FutureResult, FutureResponse, FutureOutput +}; use updater::{UpdatePolicy, Updater}; use parity_version::version; use ethcore_private_tx::{ProviderConfig, EncryptorConfig, SecretStoreEncryptor}; @@ -49,8 +50,8 @@ use params::{ SpecType, Pruning, AccountsConfig, GasPricerConfig, MinerExtras, Switch, tracing_switch_to_bool, fatdb_switch_to_bool, mode_switch_to_bool }; +use account_utils; use helpers::{to_client_config, execute_upgrades, passwords_from_files}; -use upgrade::upgrade_key_location; use dir::{Directories, DatabaseDirectories}; use cache::CacheConfig; use user_defaults::UserDefaults; @@ -63,7 +64,6 @@ use rpc_apis; use secretstore; use signer; use db; -use ethkey::Password; // how often to take periodic snapshots. const SNAPSHOT_PERIOD: u64 = 5000; @@ -75,9 +75,6 @@ const SNAPSHOT_HISTORY: u64 = 100; // Light client only. const GAS_CORPUS_EXPIRATION_MINUTES: u64 = 60 * 6; -// Pops along with error messages when a password is missing or invalid. -const VERIFY_PASSWORD_HINT: &str = "Make sure valid password is present in files passed using `--password` or in the configuration file."; - // Full client number of DNS threads const FETCH_FULL_NUM_DNS_THREADS: usize = 4; @@ -149,7 +146,7 @@ struct FullNodeInfo { } impl ::local_store::NodeInfo for FullNodeInfo { - fn pending_transactions(&self) -> Vec<::transaction::PendingTransaction> { + fn pending_transactions(&self) -> Vec<::types::transaction::PendingTransaction> { let miner = match self.miner.as_ref() { Some(m) => m, None => return Vec::new(), @@ -209,7 +206,7 @@ fn execute_light_impl(cmd: RunCmd, logger: Arc) -> Result) -> Result) -> Result) -> Result(cmd: RunCmd, logger: Arc, on_client_rq: let passwords = passwords_from_files(&cmd.acc_conf.password_files)?; - // Run in daemon mode. - // Note, that it should be called before we leave any file descriptor open, - // since `daemonize` will close them. - if let Some(pid_file) = cmd.daemon { - info!("Running as a daemon process!"); - daemonize(pid_file)?; - } - // prepare account provider - let account_provider = Arc::new(prepare_account_provider(&cmd.spec, &cmd.dirs, &spec.data_dir, cmd.acc_conf, &passwords)?); + let account_provider = Arc::new(account_utils::prepare_account_provider(&cmd.spec, &cmd.dirs, &spec.data_dir, cmd.acc_conf, &passwords)?); // spin up event loop let runtime = Runtime::with_default_thread_count(); @@ -509,9 +498,12 @@ fn execute_impl(cmd: RunCmd, logger: Arc, on_client_rq: cmd.miner_options, cmd.gas_pricer_conf.to_gas_pricer(fetch.clone(), runtime.executor()), &spec, - Some(account_provider.clone()), + ( + cmd.miner_extras.local_accounts, + account_utils::miner_local_accounts(account_provider.clone()), + ) )); - miner.set_author(cmd.miner_extras.author, None).expect("Fails only if password is Some; password is None; qed"); + miner.set_author(miner::Author::External(cmd.miner_extras.author)); miner.set_gas_range_target(cmd.miner_extras.gas_range_target); miner.set_extra_data(cmd.miner_extras.extra_data); @@ -523,19 +515,8 @@ fn execute_impl(cmd: RunCmd, logger: Arc, on_client_rq: let engine_signer = cmd.miner_extras.engine_signer; if engine_signer != Default::default() { - // Check if engine signer exists - if !account_provider.has_account(engine_signer) { - return Err(format!("Consensus signer account not found for the current chain. {}", build_create_account_hint(&cmd.spec, &cmd.dirs.keys))); - } - - // Check if any passwords have been read from the password file(s) - if passwords.is_empty() { - return Err(format!("No password found for the consensus signer {}. {}", engine_signer, VERIFY_PASSWORD_HINT)); - } - - // Attempt to sign in the engine signer. - if !passwords.iter().any(|p| miner.set_author(engine_signer, Some(p.to_owned())).is_ok()) { - return Err(format!("No valid password for the consensus signer {}. {}", engine_signer, VERIFY_PASSWORD_HINT)); + if let Some(author) = account_utils::miner_author(&cmd.spec, &cmd.dirs, &account_provider, engine_signer, &passwords)? { + miner.set_author(author); } } @@ -578,6 +559,8 @@ fn execute_impl(cmd: RunCmd, logger: Arc, on_client_rq: let client_db = restoration_db_handler.open(&client_path) .map_err(|e| format!("Failed to open database {:?}", e))?; + let private_tx_signer = account_utils::private_tx_signer(account_provider.clone(), &passwords)?; + // create client service. let service = ClientService::start( client_config, @@ -587,9 +570,10 @@ fn execute_impl(cmd: RunCmd, logger: Arc, on_client_rq: restoration_db_handler, &cmd.dirs.ipc_path(), miner.clone(), - account_provider.clone(), - Box::new(SecretStoreEncryptor::new(cmd.private_encryptor_conf, fetch.clone()).map_err(|e| e.to_string())?), + private_tx_signer.clone(), + Box::new(SecretStoreEncryptor::new(cmd.private_encryptor_conf.clone(), fetch.clone(), private_tx_signer).map_err(|e| e.to_string())?), cmd.private_provider_conf, + cmd.private_encryptor_conf, ).map_err(|e| format!("Client service error: {:?}", e))?; let connection_filter_address = spec.params().node_permission_contract; @@ -617,7 +601,7 @@ fn execute_impl(cmd: RunCmd, logger: Arc, on_client_rq: } }; - let store = ::local_store::create(db.key_value().clone(), ::ethcore::db::COL_NODE_INFO, node_info); + let store = ::local_store::create(db.key_value().clone(), ::ethcore_db::COL_NODE_INFO, node_info); if cmd.no_persistent_txqueue { info!("Running without a persistent transaction queue."); @@ -665,13 +649,18 @@ fn execute_impl(cmd: RunCmd, logger: Arc, on_client_rq: None }; + let private_tx_sync: Option> = match cmd.private_tx_enabled { + true => Some(private_tx_service.clone() as Arc), + false => None, + }; + // create sync object let (sync_provider, manage_network, chain_notify, priority_tasks) = modules::sync( sync_config, net_conf.clone().into(), client.clone(), snapshot_service.clone(), - private_tx_service.clone(), + private_tx_sync, client.clone(), &cmd.logger_config, attached_protos, @@ -743,7 +732,7 @@ fn execute_impl(cmd: RunCmd, logger: Arc, on_client_rq: client: client.clone(), sync: sync_provider.clone(), net: manage_network.clone(), - secret_store: secret_store, + accounts: secret_store, miner: miner.clone(), external_miner: external_miner.clone(), logger: logger.clone(), @@ -779,7 +768,7 @@ fn execute_impl(cmd: RunCmd, logger: Arc, on_client_rq: client: client.clone(), sync: sync_provider.clone(), miner: miner.clone(), - account_provider: account_provider, + account_provider, accounts_passwords: &passwords, }; let secretstore_key_server = secretstore::start(cmd.secretstore_conf.clone(), secretstore_deps, runtime.executor())?; @@ -875,21 +864,19 @@ enum RunningClientInner { } impl RunningClient { - /// Performs a synchronous RPC query. - /// Blocks execution until the result is ready. - pub fn rpc_query_sync(&self, request: &str) -> Option { + /// Performs an asynchronous RPC query. + // FIXME: [tomaka] This API should be better, with for example a Future + pub fn rpc_query(&self, request: &str, session: Option>) + -> FutureResult + { let metadata = Metadata { origin: Origin::CApi, - session: None, + session, }; match self.inner { - RunningClientInner::Light { ref rpc, .. } => { - rpc.handle_request_sync(request, metadata) - }, - RunningClientInner::Full { ref rpc, .. } => { - rpc.handle_request_sync(request, metadata) - }, + RunningClientInner::Light { ref rpc, .. } => rpc.handle_request(request, metadata), + RunningClientInner::Full { ref rpc, .. } => rpc.handle_request(request, metadata), } } @@ -949,103 +936,12 @@ pub fn execute(cmd: RunCmd, logger: Arc, } } -#[cfg(not(windows))] -fn daemonize(pid_file: String) -> Result<(), String> { - extern crate daemonize; - - daemonize::Daemonize::new() - .pid_file(pid_file) - .chown_pid_file(true) - .start() - .map(|_| ()) - .map_err(|e| format!("Couldn't daemonize; {}", e)) -} - -#[cfg(windows)] -fn daemonize(_pid_file: String) -> Result<(), String> { - Err("daemon is no supported on windows".into()) -} - fn print_running_environment(data_dir: &str, dirs: &Directories, db_dirs: &DatabaseDirectories) { info!("Starting {}", Colour::White.bold().paint(version())); info!("Keys path {}", Colour::White.bold().paint(dirs.keys_path(data_dir).to_string_lossy().into_owned())); info!("DB path {}", Colour::White.bold().paint(db_dirs.db_root_path().to_string_lossy().into_owned())); } -fn prepare_account_provider(spec: &SpecType, dirs: &Directories, data_dir: &str, cfg: AccountsConfig, passwords: &[Password]) -> Result { - use ethcore::ethstore::EthStore; - use ethcore::ethstore::accounts_dir::RootDiskDirectory; - - let path = dirs.keys_path(data_dir); - upgrade_key_location(&dirs.legacy_keys_path(cfg.testnet), &path); - let dir = Box::new(RootDiskDirectory::create(&path).map_err(|e| format!("Could not open keys directory: {}", e))?); - let account_settings = AccountProviderSettings { - enable_hardware_wallets: cfg.enable_hardware_wallets, - hardware_wallet_classic_key: spec == &SpecType::Classic, - unlock_keep_secret: cfg.enable_fast_unlock, - blacklisted_accounts: match *spec { - SpecType::Morden | SpecType::Ropsten | SpecType::Kovan | SpecType::Sokol | SpecType::Dev => vec![], - _ => vec![ - "00a329c0648769a73afac7f9381e08fb43dbea72".into() - ], - }, - }; - - let ethstore = EthStore::open_with_iterations(dir, cfg.iterations).map_err(|e| format!("Could not open keys directory: {}", e))?; - if cfg.refresh_time > 0 { - ethstore.set_refresh_time(::std::time::Duration::from_secs(cfg.refresh_time)); - } - let account_provider = AccountProvider::new( - Box::new(ethstore), - account_settings, - ); - - // Add development account if running dev chain: - if let SpecType::Dev = *spec { - insert_dev_account(&account_provider); - } - - for a in cfg.unlocked_accounts { - // Check if the account exists - if !account_provider.has_account(a) { - return Err(format!("Account {} not found for the current chain. {}", a, build_create_account_hint(spec, &dirs.keys))); - } - - // Check if any passwords have been read from the password file(s) - if passwords.is_empty() { - return Err(format!("No password found to unlock account {}. {}", a, VERIFY_PASSWORD_HINT)); - } - - if !passwords.iter().any(|p| account_provider.unlock_account_permanently(a, (*p).clone()).is_ok()) { - return Err(format!("No valid password to unlock account {}. {}", a, VERIFY_PASSWORD_HINT)); - } - } - - Ok(account_provider) -} - -fn insert_dev_account(account_provider: &AccountProvider) { - let secret: ethkey::Secret = "4d5db4107d237df6a3d58ee5f70ae63d73d7658d4026f2eefd2f204c81682cb7".into(); - let dev_account = ethkey::KeyPair::from_secret(secret.clone()).expect("Valid secret produces valid key;qed"); - if !account_provider.has_account(dev_account.address()) { - match account_provider.insert_account(secret, &Password::from(String::new())) { - Err(e) => warn!("Unable to add development account: {}", e), - Ok(address) => { - let _ = account_provider.set_account_name(address.clone(), "Development Account".into()); - let _ = account_provider.set_account_meta(address, ::serde_json::to_string(&(vec![ - ("description", "Never use this account outside of development chain!"), - ("passwordHint","Password is empty string"), - ].into_iter().collect::<::std::collections::HashMap<_,_>>())).expect("Serialization of hashmap does not fail.")); - }, - } - } -} - -// Construct an error `String` with an adaptive hint on how to create an account. -fn build_create_account_hint(spec: &SpecType, keys: &str) -> String { - format!("You can create an account via RPC, UI or `parity account new --chain {} --keys-path {}`.", spec, keys) -} - fn wait_for_drop(w: Weak) { let sleep_duration = Duration::from_secs(1); let warn_timeout = Duration::from_secs(60); @@ -1069,3 +965,4 @@ fn wait_for_drop(w: Weak) { warn!("Shutdown timeout reached, exiting uncleanly."); } + diff --git a/parity/secretstore.rs b/parity/secretstore.rs index 80a3c76f8d9..d9075edec80 100644 --- a/parity/secretstore.rs +++ b/parity/secretstore.rs @@ -1,27 +1,27 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::BTreeMap; use std::sync::Arc; +use account_utils::AccountProvider; use dir::default_data_path; use dir::helpers::replace_home; -use ethcore::account_provider::AccountProvider; use ethcore::client::Client; use ethcore::miner::Miner; -use ethkey::{Secret, Public}; +use ethkey::{Secret, Public, Password}; use sync::SyncProvider; use ethereum_types::Address; use parity_runtime::Executor; @@ -32,6 +32,7 @@ pub enum NodeSecretKey { /// Stored as plain text in configuration file. Plain(Secret), /// Stored as account in key store. + #[cfg(feature = "accounts")] KeyStore(Address), } @@ -141,6 +142,7 @@ mod server { let self_secret: Arc = match conf.self_secret.take() { Some(NodeSecretKey::Plain(secret)) => Arc::new(ethcore_secretstore::PlainNodeKeyPair::new( KeyPair::from_secret(secret).map_err(|e| format!("invalid secret: {}", e))?)), + #[cfg(feature = "accounts")] Some(NodeSecretKey::KeyStore(account)) => { // Check if account exists if !deps.account_provider.has_account(account.clone()) { @@ -209,7 +211,6 @@ mod server { } pub use self::server::KeyServer; -use ethkey::Password; impl Default for Configuration { fn default() -> Self { diff --git a/parity/signer.rs b/parity/signer.rs index e9a636bf8bc..98f2b8cc6b6 100644 --- a/parity/signer.rs +++ b/parity/signer.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io; use std::path::{Path, PathBuf}; diff --git a/parity/snapshot.rs b/parity/snapshot.rs index 5f30caad7ec..70957762f5a 100644 --- a/parity/snapshot.rs +++ b/parity/snapshot.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Snapshot and restoration commands. @@ -21,14 +21,13 @@ use std::path::{Path, PathBuf}; use std::sync::Arc; use hash::keccak; -use ethcore::account_provider::AccountProvider; use ethcore::snapshot::{Progress, RestorationStatus, SnapshotConfiguration, SnapshotService as SS}; use ethcore::snapshot::io::{SnapshotReader, PackedReader, PackedWriter}; use ethcore::snapshot::service::Service as SnapshotService; use ethcore::client::{Mode, DatabaseCompactionProfile, VMType}; use ethcore::miner::Miner; -use ethcore::ids::BlockId; use ethcore_service::ClientService; +use types::ids::BlockId; use cache::CacheConfig; use params::{SpecType, Pruning, Switch, tracing_switch_to_bool, fatdb_switch_to_bool}; @@ -199,9 +198,10 @@ impl SnapshotCommand { // TODO [ToDr] don't use test miner here // (actually don't require miner at all) Arc::new(Miner::new_for_tests(&spec, None)), - Arc::new(AccountProvider::transient_provider()), + Arc::new(ethcore_private_tx::DummySigner), Box::new(ethcore_private_tx::NoopEncryptor), Default::default(), + Default::default(), ).map_err(|e| format!("Client service error: {:?}", e))?; Ok(service) diff --git a/parity/stratum.rs b/parity/stratum.rs index efaa6b307ce..a74f60d852a 100644 --- a/parity/stratum.rs +++ b/parity/stratum.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity sync service diff --git a/parity/upgrade.rs b/parity/upgrade.rs index 1db2e77bdf6..ecd9beff16d 100644 --- a/parity/upgrade.rs +++ b/parity/upgrade.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity upgrade logic @@ -28,9 +28,9 @@ use journaldb::Algorithm; #[derive(Debug)] pub enum Error { - CannotCreateConfigPath, - CannotWriteVersionFile, - CannotUpdateVersionFile, + CannotCreateConfigPath(io::Error), + CannotWriteVersionFile(io::Error), + CannotUpdateVersionFile(io::Error), SemVer(SemVerError), } @@ -105,7 +105,7 @@ fn with_locked_version(db_path: &str, script: F) -> Result where F: Fn(&Version) -> Result { let mut path = PathBuf::from(db_path); - create_dir_all(&path).map_err(|_| Error::CannotCreateConfigPath)?; + create_dir_all(&path).map_err(Error::CannotCreateConfigPath)?; path.push("ver.lock"); let version = @@ -118,11 +118,11 @@ fn with_locked_version(db_path: &str, script: F) -> Result }) .unwrap_or(Version::new(0, 9, 0)); - let mut lock = File::create(&path).map_err(|_| Error::CannotWriteVersionFile)?; + let mut lock = File::create(&path).map_err(Error::CannotWriteVersionFile)?; let result = script(&version); let written_version = Version::parse(CURRENT_VERSION)?; - lock.write_all(written_version.to_string().as_bytes()).map_err(|_| Error::CannotUpdateVersionFile)?; + lock.write_all(written_version.to_string().as_bytes()).map_err(Error::CannotUpdateVersionFile)?; result } @@ -139,6 +139,7 @@ fn file_exists(path: &Path) -> bool { } } +#[cfg(any(test, feature = "accounts"))] pub fn upgrade_key_location(from: &PathBuf, to: &PathBuf) { match fs::create_dir_all(&to).and_then(|()| fs::read_dir(from)) { Ok(entries) => { diff --git a/parity/user_defaults.rs b/parity/user_defaults.rs index 5df50dd99d3..bdd5d9efb33 100644 --- a/parity/user_defaults.rs +++ b/parity/user_defaults.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fs::File; use std::io::Write; diff --git a/parity/whisper.rs b/parity/whisper.rs index c3c8854dcb6..e9a744b5469 100644 --- a/parity/whisper.rs +++ b/parity/whisper.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::io; diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index a315691bd71..c6c59dc15a4 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -27,53 +27,52 @@ tokio-timer = "0.1" transient-hashmap = "0.4" itertools = "0.5" -jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -jsonrpc-http-server = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -jsonrpc-ws-server = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -jsonrpc-ipc-server = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -jsonrpc-macros = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -jsonrpc-pubsub = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } +jsonrpc-core = "10.0.1" +jsonrpc-derive = "10.0.2" +jsonrpc-http-server = "10.0.1" +jsonrpc-ws-server = "10.0.1" +jsonrpc-ipc-server = "10.0.1" +jsonrpc-pubsub = "10.0.1" +common-types = { path = "../ethcore/types" } ethash = { path = "../ethash" } ethcore = { path = "../ethcore", features = ["test-helpers"] } -parity-bytes = "0.1" -parity-crypto = "0.2" -fastmap = { path = "../util/fastmap" } -ethcore-devtools = { path = "../devtools" } +ethcore-accounts = { path = "../accounts", optional = true } ethcore-io = { path = "../util/io" } ethcore-light = { path = "../ethcore/light" } -ethcore-logger = { path = "../logger" } +ethcore-logger = { path = "../parity/logger" } ethcore-miner = { path = "../miner" } +ethcore-network = { path = "../util/network" } ethcore-private-tx = { path = "../ethcore/private-tx" } ethcore-sync = { path = "../ethcore/sync" } -ethcore-transaction = { path = "../ethcore/transaction" } ethereum-types = "0.4" +fastmap = { path = "../util/fastmap" } +parity-bytes = "0.1" +parity-crypto = "0.3.0" +eip-712 = { path = "../util/EIP-712" } ethjson = { path = "../json" } -ethkey = { path = "../ethkey" } -ethstore = { path = "../ethstore" } +ethkey = { path = "../accounts/ethkey" } +ethstore = { path = "../accounts/ethstore" } fetch = { path = "../util/fetch" } keccak-hash = "0.1.2" parity-runtime = { path = "../util/runtime" } parity-updater = { path = "../updater" } parity-version = { path = "../util/version" } -patricia-trie = "0.3.0" +trie-db = "0.11.0" rlp = { version = "0.3.0", features = ["ethereum"] } -eip712 = { path = "../util/EIP-712" } stats = { path = "../util/stats" } vm = { path = "../ethcore/vm" } -[target.'cfg(any(target_os = "linux", target_os = "macos", target_os = "windows", target_os = "android"))'.dependencies] -hardware-wallet = { path = "../hw" } - -[target.'cfg(not(any(target_os = "linux", target_os = "macos", target_os = "windows", target_os = "android")))'.dependencies] -fake-hardware-wallet = { path = "../util/fake-hardware-wallet" } - [dev-dependencies] ethcore = { path = "../ethcore", features = ["test-helpers"] } +ethcore-accounts = { path = "../accounts" } ethcore-network = { path = "../util/network" } fake-fetch = { path = "../util/fake-fetch" } kvdb-memorydb = "0.1" macros = { path = "../util/macros" } pretty_assertions = "0.1" transaction-pool = "1.13" + +[features] +accounts = ["ethcore-accounts"] diff --git a/rpc/src/authcodes.rs b/rpc/src/authcodes.rs index 8fd47d553fc..976ce1a3fb9 100644 --- a/rpc/src/authcodes.rs +++ b/rpc/src/authcodes.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io::{self, Read, Write}; use std::path::Path; diff --git a/rpc/src/http_common.rs b/rpc/src/http_common.rs index 0e720a7917f..517bbbf7608 100644 --- a/rpc/src/http_common.rs +++ b/rpc/src/http_common.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Transport-specific metadata extractors. diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs index b87515c622d..4a90fbe6939 100644 --- a/rpc/src/lib.rs +++ b/rpc/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity RPC. @@ -37,23 +37,24 @@ extern crate tokio_timer; extern crate transient_hashmap; extern crate jsonrpc_core; +extern crate jsonrpc_derive; extern crate jsonrpc_http_server as http; extern crate jsonrpc_ipc_server as ipc; extern crate jsonrpc_pubsub; +extern crate common_types as types; extern crate ethash; extern crate ethcore; extern crate fastmap; extern crate parity_bytes as bytes; extern crate parity_crypto as crypto; -extern crate ethcore_devtools as devtools; extern crate ethcore_io as io; extern crate ethcore_light as light; extern crate ethcore_logger; extern crate ethcore_miner as miner; +extern crate ethcore_network as network; extern crate ethcore_private_tx; extern crate ethcore_sync as sync; -extern crate ethcore_transaction as transaction; extern crate ethereum_types; extern crate ethkey; extern crate ethstore; @@ -62,22 +63,18 @@ extern crate keccak_hash as hash; extern crate parity_runtime; extern crate parity_updater as updater; extern crate parity_version as version; -extern crate patricia_trie as trie; -extern crate eip712; +extern crate trie_db as trie; +extern crate eip_712; extern crate rlp; extern crate stats; extern crate vm; -#[cfg(any(target_os = "linux", target_os = "macos", target_os = "windows", target_os = "android"))] -extern crate hardware_wallet; -#[cfg(not(any(target_os = "linux", target_os = "macos", target_os = "windows", target_os = "android")))] -extern crate fake_hardware_wallet as hardware_wallet; +#[cfg(any(test, feature = "ethcore-accounts"))] +extern crate ethcore_accounts as accounts; #[macro_use] extern crate log; #[macro_use] -extern crate jsonrpc_macros; -#[macro_use] extern crate serde_derive; #[cfg(test)] @@ -109,12 +106,13 @@ pub mod v1; pub mod tests; +pub use jsonrpc_core::{FutureOutput, FutureResult, FutureResponse, FutureRpcResult}; pub use jsonrpc_pubsub::Session as PubSubSession; pub use ipc::{Server as IpcServer, MetaExtractor as IpcMetaExtractor, RequestContext as IpcRequestContext}; pub use http::{ hyper, RequestMiddleware, RequestMiddlewareAction, - AccessControlAllowOrigin, Host, DomainsValidation + AccessControlAllowOrigin, Host, DomainsValidation, cors::AccessControlAllowHeaders }; pub use v1::{NetworkSettings, Metadata, Origin, informant, dispatch, signer}; @@ -151,6 +149,7 @@ pub fn start_http( .cors(cors_domains.into()) .allowed_hosts(allowed_hosts.into()) .health_api(("/api/health", "parity_nodeStatus")) + .cors_allow_headers(AccessControlAllowHeaders::Any) .max_request_body_size(max_payload * 1024 * 1024) .start_http(addr)?) } @@ -180,6 +179,7 @@ pub fn start_http_with_middleware( .threads(threads) .cors(cors_domains.into()) .allowed_hosts(allowed_hosts.into()) + .cors_allow_headers(AccessControlAllowHeaders::Any) .max_request_body_size(max_payload * 1024 * 1024) .request_middleware(middleware) .start_http(addr)?) diff --git a/rpc/src/tests/helpers.rs b/rpc/src/tests/helpers.rs index 73c75924aa7..fe04906d4a9 100644 --- a/rpc/src/tests/helpers.rs +++ b/rpc/src/tests/helpers.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::ops::{Deref, DerefMut}; use std::path::PathBuf; diff --git a/devtools/src/http_client.rs b/rpc/src/tests/http_client.rs similarity index 92% rename from devtools/src/http_client.rs rename to rpc/src/tests/http_client.rs index e2f33d4257f..7720f4254be 100644 --- a/devtools/src/http_client.rs +++ b/rpc/src/tests/http_client.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::thread; use std::time::Duration; diff --git a/rpc/src/tests/mod.rs b/rpc/src/tests/mod.rs index 6ecab3299ae..a73d69096da 100644 --- a/rpc/src/tests/mod.rs +++ b/rpc/src/tests/mod.rs @@ -1,21 +1,22 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! RPC integration tests. mod helpers; +mod http_client; #[cfg(test)] mod rpc; pub mod ws; diff --git a/rpc/src/tests/rpc.rs b/rpc/src/tests/rpc.rs index 656811d676d..99498c3e5d4 100644 --- a/rpc/src/tests/rpc.rs +++ b/rpc/src/tests/rpc.rs @@ -1,25 +1,25 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use devtools::http_client; use jsonrpc_core::MetaIoHandler; use http::{self, hyper}; use {HttpServer}; use tests::helpers::Server; +use tests::http_client; use v1::{extractors, Metadata}; fn serve(handler: Option>) -> Server { @@ -116,4 +116,31 @@ mod tests { res.assert_status("HTTP/1.1 200 OK"); assert_eq!(res.body, expected); } + + #[test] + fn should_respond_valid_to_any_requested_header() { + // given + let (server, address) = serve(); + let headers = "Something, Anything, Xyz, 123, _?"; + + // when + let res = request(server, + &format!("\ + OPTIONS / HTTP/1.1\r\n\ + Host: {}\r\n\ + Origin: http://parity.io\r\n\ + Content-Length: 0\r\n\ + Content-Type: application/json\r\n\ + Connection: close\r\n\ + Access-Control-Request-Headers: {}\r\n\ + \r\n\ + ", address, headers) + ); + + // then + assert_eq!(res.status, "HTTP/1.1 200 OK".to_owned()); + let expected = format!("access-control-allow-headers: {}", headers); + assert!(res.headers.contains(&expected), "Headers missing in {:?}", res.headers); + } + } diff --git a/rpc/src/tests/ws.rs b/rpc/src/tests/ws.rs index 06757356240..7bb0b00894b 100644 --- a/rpc/src/tests/ws.rs +++ b/rpc/src/tests/ws.rs @@ -1,29 +1,29 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! WebSockets server tests. use std::sync::Arc; -use devtools::http_client; use jsonrpc_core::MetaIoHandler; use ws; use v1::{extractors, informant}; use tests::helpers::{GuardedAuthCodes, Server}; +use tests::http_client; /// Setup a mock signer for tests pub fn serve() -> (Server, usize, GuardedAuthCodes) { @@ -56,8 +56,7 @@ pub fn request(server: Server, request: &str) -> http_client::Respon mod testing { use std::time; use hash::keccak; - use devtools::http_client; - use super::{serve, request}; + use super::{serve, request, http_client}; #[test] fn should_not_redirect_to_parity_host() { @@ -76,7 +75,7 @@ mod testing { ); // then - assert_eq!(response.status, "HTTP/1.1 200 Ok".to_owned()); + assert_eq!(response.status, "HTTP/1.1 200 OK".to_owned()); } #[test] diff --git a/rpc/src/v1/extractors.rs b/rpc/src/v1/extractors.rs index a7c1c40b1ea..2620125e0dc 100644 --- a/rpc/src/v1/extractors.rs +++ b/rpc/src/v1/extractors.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity-specific metadata extractors. @@ -98,17 +98,16 @@ impl ws::RequestMiddleware for WsExtractor { fn process(&self, req: &ws::ws::Request) -> ws::MiddlewareAction { use self::ws::ws::Response; - // Reply with 200 Ok to HEAD requests. + // Reply with 200 OK to HEAD requests. if req.method() == "HEAD" { - let mut response = Response::new(200, "Ok"); + let mut response = Response::new(200, "OK", vec![]); add_security_headers(&mut response); return Some(response).into(); } // Display WS info. if req.header("sec-websocket-key").is_none() { - let mut response = Response::new(200, "Ok"); - response.set_body("WebSocket interface is active. Open WS connection to access RPC."); + let mut response = Response::new(200, "OK", b"WebSocket interface is active. Open WS connection to access RPC.".to_vec()); add_security_headers(&mut response); return Some(response).into(); } @@ -123,7 +122,7 @@ impl ws::RequestMiddleware for WsExtractor { "Blocked connection from {} using invalid token.", req.header("origin").and_then(|e| ::std::str::from_utf8(e).ok()).unwrap_or("Unknown Origin") ); - let mut response = Response::new(403, "Forbidden"); + let mut response = Response::new(403, "Forbidden", vec![]); add_security_headers(&mut response); return Some(response).into(); } diff --git a/rpc/src/v1/helpers/accounts.rs b/rpc/src/v1/helpers/accounts.rs deleted file mode 100644 index 4268bf2f99f..00000000000 --- a/rpc/src/v1/helpers/accounts.rs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -use std::sync::Arc; -use ethcore::account_provider::AccountProvider; -use jsonrpc_core::Error; -use v1::helpers::errors; - -pub fn unwrap_provider(provider: &Option>) -> Result, Error> { - match *provider { - Some(ref arc) => Ok(arc.clone()), - None => Err(errors::public_unsupported(None)), - } -} diff --git a/rpc/src/v1/helpers/block_import.rs b/rpc/src/v1/helpers/block_import.rs index 50a4ed8e006..3fd5d9fff7d 100644 --- a/rpc/src/v1/helpers/block_import.rs +++ b/rpc/src/v1/helpers/block_import.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Block import analysis functions. diff --git a/rpc/src/v1/helpers/deprecated.rs b/rpc/src/v1/helpers/deprecated.rs new file mode 100644 index 00000000000..eb754c01ac1 --- /dev/null +++ b/rpc/src/v1/helpers/deprecated.rs @@ -0,0 +1,111 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Deprecation notice for RPC methods. +//! +//! Displays a warning but avoids spamming the log. + +use std::{ + collections::HashMap, + time::{Duration, Instant}, +}; + +use parking_lot::RwLock; + +/// Deprecation messages +pub mod msgs { + pub const ACCOUNTS: Option<&str> = Some("Account management is being phased out see #9997 for alternatives."); +} + +type MethodName = &'static str; + +const PRINT_INTERVAL: Duration = Duration::from_secs(60); + +/// Displays a deprecation notice without spamming the log. +pub struct DeprecationNotice Instant> { + now: T, + next_warning_at: RwLock>, + printer: Box) + Send + Sync>, +} + +impl Default for DeprecationNotice { + fn default() -> Self { + Self::new(Instant::now, |method, more| { + let more = more.map(|x| format!(": {}", x)).unwrap_or_else(|| ".".into()); + warn!(target: "rpc", "{} is deprecated and will be removed in future versions{}", method, more); + }) + } +} + +impl Instant> DeprecationNotice { + /// Create new deprecation notice printer with custom display and interval. + pub fn new(now: N, printer: T) -> Self where + T: Fn(MethodName, Option<&str>) + Send + Sync + 'static, + { + DeprecationNotice { + now, + next_warning_at: Default::default(), + printer: Box::new(printer), + } + } + + /// Print deprecation notice for given method and with some additional details (explanations). + pub fn print<'a, T: Into>>(&self, method: MethodName, details: T) { + let now = (self.now)(); + match self.next_warning_at.read().get(method) { + Some(next) if next > &now => return, + _ => {}, + } + + self.next_warning_at.write().insert(method.to_owned(), now + PRINT_INTERVAL); + (self.printer)(method, details.into()); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use std::sync::Arc; + + #[test] + fn should_throttle_printing() { + let saved = Arc::new(RwLock::new(None)); + let s = saved.clone(); + let printer = move |method: MethodName, more: Option<&str>| { + *s.write() = Some((method, more.map(|s| s.to_owned()))); + }; + + let now = Arc::new(RwLock::new(Instant::now())); + let n = now.clone(); + let get_now = || n.read().clone(); + let notice = DeprecationNotice::new(get_now, printer); + + let details = Some("See issue #123456"); + notice.print("eth_test", details.clone()); + // printer shouldn't be called + notice.print("eth_test", None); + assert_eq!(saved.read().clone().unwrap(), ("eth_test", details.as_ref().map(|x| x.to_string()))); + // but calling a different method is fine + notice.print("eth_test2", None); + assert_eq!(saved.read().clone().unwrap(), ("eth_test2", None)); + + // wait and call again + *now.write() = Instant::now() + PRINT_INTERVAL; + notice.print("eth_test", None); + assert_eq!(saved.read().clone().unwrap(), ("eth_test", None)); + } +} diff --git a/rpc/src/v1/helpers/dispatch.rs b/rpc/src/v1/helpers/dispatch.rs deleted file mode 100644 index 67f3c9fd490..00000000000 --- a/rpc/src/v1/helpers/dispatch.rs +++ /dev/null @@ -1,799 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -//! Utilities and helpers for transaction dispatch. - -use std::fmt::Debug; -use std::ops::Deref; -use std::sync::Arc; - -use light::cache::Cache as LightDataCache; -use light::client::LightChainClient; -use light::on_demand::{request, OnDemand}; -use light::TransactionQueue as LightTransactionQueue; -use hash::keccak; -use ethereum_types::{H256, H520, Address, U256}; -use bytes::Bytes; -use parking_lot::{Mutex, RwLock}; -use stats::Corpus; - -use crypto::DEFAULT_MAC; -use ethcore::account_provider::AccountProvider; -use ethcore::basic_account::BasicAccount; -use ethcore::client::BlockChainClient; -use ethcore::ids::BlockId; -use ethcore::miner::{self, MinerService}; -use ethkey::{Password, Signature}; -use sync::LightSync; -use transaction::{Action, SignedTransaction, PendingTransaction, Transaction, Error as TransactionError}; - -use jsonrpc_core::{BoxFuture, Result, Error}; -use jsonrpc_core::futures::{future, Future, Poll, Async}; -use jsonrpc_core::futures::future::Either; -use v1::helpers::{errors, nonce, TransactionRequest, FilledTransactionRequest, ConfirmationPayload}; -use v1::types::{ - H256 as RpcH256, H520 as RpcH520, Bytes as RpcBytes, - RichRawTransaction as RpcRichRawTransaction, - ConfirmationPayload as RpcConfirmationPayload, - ConfirmationResponse, - EthSignRequest as RpcEthSignRequest, - EIP191SignRequest as RpcSignRequest, - DecryptRequest as RpcDecryptRequest, -}; -use rlp; - -pub use self::nonce::Reservations; - -/// Has the capability to dispatch, sign, and decrypt. -/// -/// Requires a clone implementation, with the implication that it be cheap; -/// usually just bumping a reference count or two. -pub trait Dispatcher: Send + Sync + Clone { - // TODO: when ATC exist, use zero-cost - // type Out: IntoFuture - - /// Fill optional fields of a transaction request, fetching gas price but not nonce. - fn fill_optional_fields(&self, request: TransactionRequest, default_sender: Address, force_nonce: bool) - -> BoxFuture; - - /// Sign the given transaction request without dispatching, fetching appropriate nonce. - fn sign(&self, accounts: Arc, filled: FilledTransactionRequest, password: SignWith) - -> BoxFuture>; - - /// Converts a `SignedTransaction` into `RichRawTransaction` - fn enrich(&self, SignedTransaction) -> RpcRichRawTransaction; - - /// "Dispatch" a local transaction. - fn dispatch_transaction(&self, signed_transaction: PendingTransaction) - -> Result; -} - -/// A dispatcher which uses references to a client and miner in order to sign -/// requests locally. -#[derive(Debug)] -pub struct FullDispatcher { - client: Arc, - miner: Arc, - nonces: Arc>, - gas_price_percentile: usize, -} - -impl FullDispatcher { - /// Create a `FullDispatcher` from Arc references to a client and miner. - pub fn new( - client: Arc, - miner: Arc, - nonces: Arc>, - gas_price_percentile: usize, - ) -> Self { - FullDispatcher { - client, - miner, - nonces, - gas_price_percentile, - } - } -} - -impl Clone for FullDispatcher { - fn clone(&self) -> Self { - FullDispatcher { - client: self.client.clone(), - miner: self.miner.clone(), - nonces: self.nonces.clone(), - gas_price_percentile: self.gas_price_percentile, - } - } -} - -impl FullDispatcher { - fn state_nonce(&self, from: &Address) -> U256 { - self.miner.next_nonce(&*self.client, from) - } - - /// Imports transaction to the miner's queue. - pub fn dispatch_transaction(client: &C, miner: &M, signed_transaction: PendingTransaction, trusted: bool) -> Result { - let hash = signed_transaction.transaction.hash(); - - // use `import_claimed_local_transaction` so we can decide (based on config flags) if we want to treat - // it as local or not. Nodes with public RPC interfaces will want these transactions to be treated like - // external transactions. - miner.import_claimed_local_transaction(client, signed_transaction, trusted) - .map_err(errors::transaction) - .map(|_| hash) - } -} - -impl Dispatcher for FullDispatcher { - fn fill_optional_fields(&self, request: TransactionRequest, default_sender: Address, force_nonce: bool) - -> BoxFuture - { - let request = request; - let from = request.from.unwrap_or(default_sender); - let nonce = if force_nonce { - request.nonce.or_else(|| Some(self.state_nonce(&from))) - } else { - request.nonce - }; - - Box::new(future::ok(FilledTransactionRequest { - from, - used_default_from: request.from.is_none(), - to: request.to, - nonce, - gas_price: request.gas_price.unwrap_or_else(|| { - default_gas_price(&*self.client, &*self.miner, self.gas_price_percentile) - }), - gas: request.gas.unwrap_or_else(|| self.miner.sensible_gas_limit()), - value: request.value.unwrap_or_else(|| 0.into()), - data: request.data.unwrap_or_else(Vec::new), - condition: request.condition, - })) - } - - fn sign(&self, accounts: Arc, filled: FilledTransactionRequest, password: SignWith) - -> BoxFuture> - { - let chain_id = self.client.signing_chain_id(); - - if let Some(nonce) = filled.nonce { - return Box::new(future::done(sign_transaction(&*accounts, filled, chain_id, nonce, password))); - } - - let state = self.state_nonce(&filled.from); - let reserved = self.nonces.lock().reserve(filled.from, state); - - Box::new(ProspectiveSigner::new(accounts, filled, chain_id, reserved, password)) - } - - fn enrich(&self, signed_transaction: SignedTransaction) -> RpcRichRawTransaction { - RpcRichRawTransaction::from_signed(signed_transaction) - } - - fn dispatch_transaction(&self, signed_transaction: PendingTransaction) -> Result { - Self::dispatch_transaction(&*self.client, &*self.miner, signed_transaction, true) - } -} - -/// Get a recent gas price corpus. -// TODO: this could be `impl Trait`. -pub fn fetch_gas_price_corpus( - sync: Arc, - client: Arc, - on_demand: Arc, - cache: Arc>, -) -> BoxFuture> { - const GAS_PRICE_SAMPLE_SIZE: usize = 100; - - if let Some(cached) = { cache.lock().gas_price_corpus() } { - return Box::new(future::ok(cached)) - } - - let cache = cache.clone(); - let eventual_corpus = sync.with_context(|ctx| { - // get some recent headers with gas used, - // and request each of the blocks from the network. - let block_requests = client.ancestry_iter(BlockId::Latest) - .filter(|hdr| hdr.gas_used() != U256::default()) - .take(GAS_PRICE_SAMPLE_SIZE) - .map(|hdr| request::Body(hdr.into())) - .collect::>(); - - // when the blocks come in, collect gas prices into a vector - on_demand.request(ctx, block_requests) - .expect("no back-references; therefore all back-references are valid; qed") - .map(|bodies| { - bodies.into_iter().fold(Vec::new(), |mut v, block| { - for t in block.transaction_views().iter() { - v.push(t.gas_price()) - } - v - }) - }) - .map(move |prices| { - // produce a corpus from the vector and cache it. - // It's later used to get a percentile for default gas price. - let corpus: ::stats::Corpus<_> = prices.into(); - cache.lock().set_gas_price_corpus(corpus.clone()); - corpus - }) - }); - - match eventual_corpus { - Some(corp) => Box::new(corp.map_err(|_| errors::no_light_peers())), - None => Box::new(future::err(errors::network_disabled())), - } -} - -/// Returns a eth_sign-compatible hash of data to sign. -/// The data is prepended with special message to prevent -/// malicious DApps from using the function to sign forged transactions. -pub fn eth_data_hash(mut data: Bytes) -> H256 { - let mut message_data = - format!("\x19Ethereum Signed Message:\n{}", data.len()) - .into_bytes(); - message_data.append(&mut data); - keccak(message_data) -} - -/// Dispatcher for light clients -- fetches default gas price, next nonce, etc. from network. -#[derive(Clone)] -pub struct LightDispatcher { - /// Sync service. - pub sync: Arc, - /// Header chain client. - pub client: Arc, - /// On-demand request service. - pub on_demand: Arc, - /// Data cache. - pub cache: Arc>, - /// Transaction queue. - pub transaction_queue: Arc>, - /// Nonce reservations - pub nonces: Arc>, - /// Gas Price percentile value used as default gas price. - pub gas_price_percentile: usize, -} - -impl LightDispatcher { - /// Create a new `LightDispatcher` from its requisite parts. - /// - /// For correct operation, the OnDemand service is assumed to be registered as a network handler, - pub fn new( - sync: Arc, - client: Arc, - on_demand: Arc, - cache: Arc>, - transaction_queue: Arc>, - nonces: Arc>, - gas_price_percentile: usize, - ) -> Self { - LightDispatcher { - sync, - client, - on_demand, - cache, - transaction_queue, - nonces, - gas_price_percentile, - } - } - - /// Get a recent gas price corpus. - // TODO: this could be `impl Trait`. - pub fn gas_price_corpus(&self) -> BoxFuture> { - fetch_gas_price_corpus( - self.sync.clone(), - self.client.clone(), - self.on_demand.clone(), - self.cache.clone(), - ) - } - - /// Get an account's state - fn account(&self, addr: Address) -> BoxFuture> { - let best_header = self.client.best_block_header(); - let account_future = self.sync.with_context(|ctx| self.on_demand.request(ctx, request::Account { - header: best_header.into(), - address: addr, - }).expect("no back-references; therefore all back-references valid; qed")); - - match account_future { - Some(response) => Box::new(response.map_err(|_| errors::no_light_peers())), - None => Box::new(future::err(errors::network_disabled())), - } - } - - /// Get an account's next nonce. - pub fn next_nonce(&self, addr: Address) -> BoxFuture { - let account_start_nonce = self.client.engine().account_start_nonce(self.client.best_block_header().number()); - Box::new(self.account(addr) - .and_then(move |maybe_account| { - future::ok(maybe_account.map_or(account_start_nonce, |account| account.nonce)) - }) - ) - } -} - -impl Dispatcher for LightDispatcher { - // Ignore the `force_nonce` flag in order to always query the network when fetching the nonce and - // the account state. If the nonce is specified in the transaction use that nonce instead but do the - // network request anyway to the account state (balance) - fn fill_optional_fields(&self, request: TransactionRequest, default_sender: Address, _force_nonce: bool) - -> BoxFuture - { - const DEFAULT_GAS_PRICE: U256 = U256([0, 0, 0, 21_000_000]); - - let gas_limit = self.client.best_block_header().gas_limit(); - let request_gas_price = request.gas_price.clone(); - let from = request.from.unwrap_or(default_sender); - - let with_gas_price = move |gas_price| { - let request = request; - FilledTransactionRequest { - from: from.clone(), - used_default_from: request.from.is_none(), - to: request.to, - nonce: request.nonce, - gas_price: gas_price, - gas: request.gas.unwrap_or_else(|| gas_limit / 3), - value: request.value.unwrap_or_else(|| 0.into()), - data: request.data.unwrap_or_else(Vec::new), - condition: request.condition, - } - }; - - // fast path for known gas price. - let gas_price_percentile = self.gas_price_percentile; - let gas_price = match request_gas_price { - Some(gas_price) => Either::A(future::ok(with_gas_price(gas_price))), - None => Either::B(fetch_gas_price_corpus( - self.sync.clone(), - self.client.clone(), - self.on_demand.clone(), - self.cache.clone() - ).and_then(move |corp| match corp.percentile(gas_price_percentile) { - Some(percentile) => Ok(*percentile), - None => Ok(DEFAULT_GAS_PRICE), // fall back to default on error. - }).map(with_gas_price)) - }; - - let future_account = self.account(from); - - Box::new(gas_price.and_then(move |mut filled| { - future_account - .and_then(move |maybe_account| { - let cost = filled.value.saturating_add(filled.gas.saturating_mul(filled.gas_price)); - match maybe_account { - Some(ref account) if cost > account.balance => { - Err(errors::transaction(TransactionError::InsufficientBalance { - balance: account.balance, - cost, - })) - } - Some(account) => { - if filled.nonce.is_none() { - filled.nonce = Some(account.nonce); - } - Ok(filled) - } - None => Err(errors::account("Account not found", "")), - } - }) - })) - } - - fn sign(&self, accounts: Arc, filled: FilledTransactionRequest, password: SignWith) - -> BoxFuture> - { - let chain_id = self.client.signing_chain_id(); - let nonce = filled.nonce.expect("nonce is always provided; qed"); - Box::new(future::done(sign_transaction(&*accounts, filled, chain_id, nonce, password))) - } - - fn enrich(&self, signed_transaction: SignedTransaction) -> RpcRichRawTransaction { - RpcRichRawTransaction::from_signed(signed_transaction) - } - - fn dispatch_transaction(&self, signed_transaction: PendingTransaction) -> Result { - let hash = signed_transaction.transaction.hash(); - - self.transaction_queue.write().import(signed_transaction) - .map_err(errors::transaction) - .map(|_| hash) - } -} - -fn sign_transaction( - accounts: &AccountProvider, - filled: FilledTransactionRequest, - chain_id: Option, - nonce: U256, - password: SignWith, -) -> Result> { - let t = Transaction { - nonce: nonce, - action: filled.to.map_or(Action::Create, Action::Call), - gas: filled.gas, - gas_price: filled.gas_price, - value: filled.value, - data: filled.data, - }; - - if accounts.is_hardware_address(&filled.from) { - return hardware_signature(accounts, filled.from, t, chain_id).map(WithToken::No) - } - - let hash = t.hash(chain_id); - let signature = signature(accounts, filled.from, hash, password)?; - - Ok(signature.map(|sig| { - SignedTransaction::new(t.with_signature(sig, chain_id)) - .expect("Transaction was signed by AccountsProvider; it never produces invalid signatures; qed") - })) -} - -#[derive(Debug, Clone, Copy)] -enum ProspectiveSignerState { - TryProspectiveSign, - WaitForNonce, - Finish, -} - -struct ProspectiveSigner { - accounts: Arc, - filled: FilledTransactionRequest, - chain_id: Option, - reserved: nonce::Reserved, - password: SignWith, - state: ProspectiveSignerState, - prospective: Option>>, - ready: Option, -} - -impl ProspectiveSigner { - pub fn new( - accounts: Arc, - filled: FilledTransactionRequest, - chain_id: Option, - reserved: nonce::Reserved, - password: SignWith, - ) -> Self { - // If the account is permanently unlocked we can try to sign - // using prospective nonce. This should speed up sending - // multiple subsequent transactions in multi-threaded RPC environment. - let is_unlocked_permanently = accounts.is_unlocked_permanently(&filled.from); - let has_password = password.is_password(); - - ProspectiveSigner { - accounts, - filled, - chain_id, - reserved, - password, - state: if is_unlocked_permanently || has_password { - ProspectiveSignerState::TryProspectiveSign - } else { - ProspectiveSignerState::WaitForNonce - }, - prospective: None, - ready: None, - } - } - - fn sign(&self, nonce: &U256) -> Result> { - sign_transaction( - &*self.accounts, - self.filled.clone(), - self.chain_id, - *nonce, - self.password.clone() - ) - } - - fn poll_reserved(&mut self) -> Poll { - self.reserved.poll().map_err(|_| errors::internal("Nonce reservation failure", "")) - } -} - -impl Future for ProspectiveSigner { - type Item = WithToken; - type Error = Error; - - fn poll(&mut self) -> Poll { - use self::ProspectiveSignerState::*; - - loop { - match self.state { - TryProspectiveSign => { - // Try to poll reserved, it might be ready. - match self.poll_reserved()? { - Async::NotReady => { - self.state = WaitForNonce; - self.prospective = Some(self.sign(self.reserved.prospective_value())); - }, - Async::Ready(nonce) => { - self.state = Finish; - self.prospective = Some(self.sign(nonce.value())); - self.ready = Some(nonce); - }, - } - }, - WaitForNonce => { - let nonce = try_ready!(self.poll_reserved()); - let result = match (self.prospective.take(), nonce.matches_prospective()) { - (Some(prospective), true) => prospective, - _ => self.sign(nonce.value()), - }; - self.state = Finish; - self.prospective = Some(result); - self.ready = Some(nonce); - }, - Finish => { - if let (Some(result), Some(nonce)) = (self.prospective.take(), self.ready.take()) { - // Mark nonce as used on successful signing - return result.map(move |tx| { - nonce.mark_used(); - Async::Ready(tx) - }) - } else { - panic!("Poll after ready."); - } - } - } - } - } -} - -/// Single-use account token. -pub type AccountToken = Password; - -/// Values used to unlock accounts for signing. -#[derive(Clone, PartialEq)] -pub enum SignWith { - /// Nothing -- implies the account is already unlocked. - Nothing, - /// Unlock with password. - Password(Password), - /// Unlock with single-use token. - Token(AccountToken), -} - -impl SignWith { - fn is_password(&self) -> bool { - if let SignWith::Password(_) = *self { - true - } else { - false - } - } -} - -/// A value, potentially accompanied by a signing token. -pub enum WithToken { - /// No token. - No(T), - /// With token. - Yes(T, AccountToken), -} - -impl Deref for WithToken { - type Target = T; - - fn deref(&self) -> &Self::Target { - match *self { - WithToken::No(ref v) => v, - WithToken::Yes(ref v, _) => v, - } - } -} - -impl WithToken { - /// Map the value with the given closure, preserving the token. - pub fn map(self, f: F) -> WithToken where - S: Debug, - F: FnOnce(T) -> S, - { - match self { - WithToken::No(v) => WithToken::No(f(v)), - WithToken::Yes(v, token) => WithToken::Yes(f(v), token), - } - } - - /// Convert into inner value, ignoring possible token. - pub fn into_value(self) -> T { - match self { - WithToken::No(v) => v, - WithToken::Yes(v, _) => v, - } - } - - /// Convert the `WithToken` into a tuple. - pub fn into_tuple(self) -> (T, Option) { - match self { - WithToken::No(v) => (v, None), - WithToken::Yes(v, token) => (v, Some(token)) - } - } -} - -impl From<(T, AccountToken)> for WithToken { - fn from(tuple: (T, AccountToken)) -> Self { - WithToken::Yes(tuple.0, tuple.1) - } -} - -impl From<(T, Option)> for WithToken { - fn from(tuple: (T, Option)) -> Self { - match tuple.1 { - Some(token) => WithToken::Yes(tuple.0, token), - None => WithToken::No(tuple.0), - } - } -} - -/// Execute a confirmation payload. -pub fn execute( - dispatcher: D, - accounts: Arc, - payload: ConfirmationPayload, - pass: SignWith -) -> BoxFuture> { - match payload { - ConfirmationPayload::SendTransaction(request) => { - let condition = request.condition.clone().map(Into::into); - Box::new(dispatcher.sign(accounts, request, pass) - .map(move |v| v.map(move |tx| PendingTransaction::new(tx, condition))) - .map(WithToken::into_tuple) - .map(|(tx, token)| (tx, token, dispatcher)) - .and_then(|(tx, tok, dispatcher)| { - dispatcher.dispatch_transaction(tx) - .map(RpcH256::from) - .map(ConfirmationResponse::SendTransaction) - .map(move |h| WithToken::from((h, tok))) - })) - }, - ConfirmationPayload::SignTransaction(request) => { - Box::new(dispatcher.sign(accounts, request, pass) - .map(move |result| result - .map(move |tx| dispatcher.enrich(tx)) - .map(ConfirmationResponse::SignTransaction) - )) - }, - ConfirmationPayload::EthSignMessage(address, data) => { - if accounts.is_hardware_address(&address) { - let signature = accounts.sign_message_with_hardware(&address, &data) - .map(|s| H520(s.into_electrum())) - .map(RpcH520::from) - .map(ConfirmationResponse::Signature) - // TODO: is this correct? I guess the `token` is the wallet in this context - .map(WithToken::No) - .map_err(|e| errors::account("Error signing message with hardware_wallet", e)); - - return Box::new(future::done(signature)); - } - let hash = eth_data_hash(data); - let res = signature(&accounts, address, hash, pass) - .map(|result| result - .map(|rsv| H520(rsv.into_electrum())) - .map(RpcH520::from) - .map(ConfirmationResponse::Signature) - ); - Box::new(future::done(res)) - }, - ConfirmationPayload::SignMessage(address, data) => { - if accounts.is_hardware_address(&address) { - return Box::new(future::err(errors::account("Error signing message with hardware_wallet", - "Message signing is unsupported"))); - } - let res = signature(&accounts, address, data, pass) - .map(|result| result - .map(|rsv| H520(rsv.into_electrum())) - .map(RpcH520::from) - .map(ConfirmationResponse::Signature) - ); - Box::new(future::done(res)) - }, - ConfirmationPayload::Decrypt(address, data) => { - if accounts.is_hardware_address(&address) { - return Box::new(future::err(errors::unsupported("Decrypting via hardware wallets is not supported.", None))); - } - let res = decrypt(&accounts, address, data, pass) - .map(|result| result - .map(RpcBytes) - .map(ConfirmationResponse::Decrypt) - ); - Box::new(future::done(res)) - }, - } -} - -fn signature(accounts: &AccountProvider, address: Address, hash: H256, password: SignWith) -> Result> { - match password.clone() { - SignWith::Nothing => accounts.sign(address, None, hash).map(WithToken::No), - SignWith::Password(pass) => accounts.sign(address, Some(pass), hash).map(WithToken::No), - SignWith::Token(token) => accounts.sign_with_token(address, token, hash).map(Into::into), - }.map_err(|e| match password { - SignWith::Nothing => errors::signing(e), - _ => errors::password(e), - }) -} - -// obtain a hardware signature from the given account. -fn hardware_signature(accounts: &AccountProvider, address: Address, t: Transaction, chain_id: Option) - -> Result -{ - debug_assert!(accounts.is_hardware_address(&address)); - - let mut stream = rlp::RlpStream::new(); - t.rlp_append_unsigned_transaction(&mut stream, chain_id); - let signature = accounts.sign_transaction_with_hardware(&address, &t, chain_id, &stream.as_raw()) - .map_err(|e| { - debug!(target: "miner", "Error signing transaction with hardware wallet: {}", e); - errors::account("Error signing transaction with hardware wallet", e) - })?; - - SignedTransaction::new(t.with_signature(signature, chain_id)) - .map_err(|e| { - debug!(target: "miner", "Hardware wallet has produced invalid signature: {}", e); - errors::account("Invalid signature generated", e) - }) -} - -fn decrypt(accounts: &AccountProvider, address: Address, msg: Bytes, password: SignWith) -> Result> { - match password.clone() { - SignWith::Nothing => accounts.decrypt(address, None, &DEFAULT_MAC, &msg).map(WithToken::No), - SignWith::Password(pass) => accounts.decrypt(address, Some(pass), &DEFAULT_MAC, &msg).map(WithToken::No), - SignWith::Token(token) => accounts.decrypt_with_token(address, token, &DEFAULT_MAC, &msg).map(Into::into), - }.map_err(|e| match password { - SignWith::Nothing => errors::signing(e), - _ => errors::password(e), - }) -} - -/// Extract the default gas price from a client and miner. -pub fn default_gas_price(client: &C, miner: &M, percentile: usize) -> U256 where - C: BlockChainClient, - M: MinerService, -{ - client.gas_price_corpus(100).percentile(percentile).cloned().unwrap_or_else(|| miner.sensible_gas_price()) -} - -/// Convert RPC confirmation payload to signer confirmation payload. -/// May need to resolve in the future to fetch things like gas price. -pub fn from_rpc(payload: RpcConfirmationPayload, default_account: Address, dispatcher: &D) -> BoxFuture - where D: Dispatcher -{ - match payload { - RpcConfirmationPayload::SendTransaction(request) => { - Box::new(dispatcher.fill_optional_fields(request.into(), default_account, false) - .map(ConfirmationPayload::SendTransaction)) - }, - RpcConfirmationPayload::SignTransaction(request) => { - Box::new(dispatcher.fill_optional_fields(request.into(), default_account, false) - .map(ConfirmationPayload::SignTransaction)) - }, - RpcConfirmationPayload::Decrypt(RpcDecryptRequest { address, msg }) => { - Box::new(future::ok(ConfirmationPayload::Decrypt(address.into(), msg.into()))) - }, - RpcConfirmationPayload::EthSignMessage(RpcEthSignRequest { address, data }) => { - Box::new(future::ok(ConfirmationPayload::EthSignMessage(address.into(), data.into()))) - }, - RpcConfirmationPayload::EIP191SignMessage(RpcSignRequest { address, data }) => { - Box::new(future::ok(ConfirmationPayload::SignMessage(address.into(), data.into()))) - }, - } -} diff --git a/rpc/src/v1/helpers/dispatch/full.rs b/rpc/src/v1/helpers/dispatch/full.rs new file mode 100644 index 00000000000..d958416cbf2 --- /dev/null +++ b/rpc/src/v1/helpers/dispatch/full.rs @@ -0,0 +1,151 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +use std::sync::Arc; + +use ethcore::client::BlockChainClient; +use ethcore::miner::{self, MinerService}; +use ethereum_types::{H256, U256, Address}; +use types::transaction::{SignedTransaction, PendingTransaction}; +use parking_lot::Mutex; + +use jsonrpc_core::{BoxFuture, Result}; +use jsonrpc_core::futures::{future, Future, IntoFuture}; +use v1::helpers::{errors, nonce, TransactionRequest, FilledTransactionRequest}; +use v1::types::{RichRawTransaction as RpcRichRawTransaction}; + +use super::prospective_signer::ProspectiveSigner; +use super::{Dispatcher, Accounts, SignWith, PostSign, default_gas_price}; + +/// A dispatcher which uses references to a client and miner in order to sign +/// requests locally. +#[derive(Debug)] +pub struct FullDispatcher { + client: Arc, + miner: Arc, + nonces: Arc>, + gas_price_percentile: usize, +} + +impl FullDispatcher { + /// Create a `FullDispatcher` from Arc references to a client and miner. + pub fn new( + client: Arc, + miner: Arc, + nonces: Arc>, + gas_price_percentile: usize, + ) -> Self { + FullDispatcher { + client, + miner, + nonces, + gas_price_percentile, + } + } +} + +impl Clone for FullDispatcher { + fn clone(&self) -> Self { + FullDispatcher { + client: self.client.clone(), + miner: self.miner.clone(), + nonces: self.nonces.clone(), + gas_price_percentile: self.gas_price_percentile, + } + } +} + +impl FullDispatcher { + fn state_nonce(&self, from: &Address) -> U256 { + self.miner.next_nonce(&*self.client, from) + } + + /// Post transaction to the network. + /// + /// If transaction is trusted we are more likely to assume it is coming from a local account. + pub fn dispatch_transaction(client: &C, miner: &M, signed_transaction: PendingTransaction, trusted: bool) -> Result { + let hash = signed_transaction.transaction.hash(); + + // use `import_claimed_local_transaction` so we can decide (based on config flags) if we want to treat + // it as local or not. Nodes with public RPC interfaces will want these transactions to be treated like + // external transactions. + miner.import_claimed_local_transaction(client, signed_transaction, trusted) + .map_err(errors::transaction) + .map(|_| hash) + } +} + +impl Dispatcher for FullDispatcher { + fn fill_optional_fields(&self, request: TransactionRequest, default_sender: Address, force_nonce: bool) + -> BoxFuture + { + let request = request; + let from = request.from.unwrap_or(default_sender); + let nonce = if force_nonce { + request.nonce.or_else(|| Some(self.state_nonce(&from))) + } else { + request.nonce + }; + + Box::new(future::ok(FilledTransactionRequest { + from, + used_default_from: request.from.is_none(), + to: request.to, + nonce, + gas_price: request.gas_price.unwrap_or_else(|| { + default_gas_price(&*self.client, &*self.miner, self.gas_price_percentile) + }), + gas: request.gas.unwrap_or_else(|| self.miner.sensible_gas_limit()), + value: request.value.unwrap_or_else(|| 0.into()), + data: request.data.unwrap_or_else(Vec::new), + condition: request.condition, + })) + } + + fn sign

( + &self, + filled: FilledTransactionRequest, + signer: &Arc, + password: SignWith, + post_sign: P, + ) -> BoxFuture + where + P: PostSign + 'static, + ::Future: Send, + { + let chain_id = self.client.signing_chain_id(); + + if let Some(nonce) = filled.nonce { + let future = signer.sign_transaction(filled, chain_id, nonce, password) + .into_future() + .and_then(move |signed| post_sign.execute(signed)); + Box::new(future) + } else { + let state = self.state_nonce(&filled.from); + let reserved = self.nonces.lock().reserve(filled.from, state); + + Box::new(ProspectiveSigner::new(signer.clone(), filled, chain_id, reserved, password, post_sign)) + } + } + + fn enrich(&self, signed_transaction: SignedTransaction) -> RpcRichRawTransaction { + RpcRichRawTransaction::from_signed(signed_transaction) + } + + fn dispatch_transaction(&self, signed_transaction: PendingTransaction) -> Result { + Self::dispatch_transaction(&*self.client, &*self.miner, signed_transaction, true) + } +} diff --git a/rpc/src/v1/helpers/dispatch/light.rs b/rpc/src/v1/helpers/dispatch/light.rs new file mode 100644 index 00000000000..2913e52c85c --- /dev/null +++ b/rpc/src/v1/helpers/dispatch/light.rs @@ -0,0 +1,288 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +use std::sync::Arc; + +use ethereum_types::{H256, Address, U256}; +use light::TransactionQueue as LightTransactionQueue; +use light::cache::Cache as LightDataCache; +use light::client::LightChainClient; +use light::on_demand::{request, OnDemand}; +use parking_lot::{Mutex, RwLock}; +use stats::Corpus; +use sync::{LightSyncProvider, LightNetworkDispatcher, ManageNetwork}; +use types::basic_account::BasicAccount; +use types::ids::BlockId; +use types::transaction::{SignedTransaction, PendingTransaction, Error as TransactionError}; + +use jsonrpc_core::{BoxFuture, Result}; +use jsonrpc_core::futures::{future, Future, IntoFuture}; +use jsonrpc_core::futures::future::Either; +use v1::helpers::{errors, nonce, TransactionRequest, FilledTransactionRequest}; +use v1::types::{RichRawTransaction as RpcRichRawTransaction,}; + +use super::{Dispatcher, Accounts, SignWith, PostSign}; + +/// Dispatcher for light clients -- fetches default gas price, next nonce, etc. from network. +pub struct LightDispatcher { + /// Sync service. + pub sync: Arc, + /// Header chain client. + pub client: Arc, + /// On-demand request service. + pub on_demand: Arc, + /// Data cache. + pub cache: Arc>, + /// Transaction queue. + pub transaction_queue: Arc>, + /// Nonce reservations + pub nonces: Arc>, + /// Gas Price percentile value used as default gas price. + pub gas_price_percentile: usize, +} + +impl LightDispatcher +where + S: LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ + /// Create a new `LightDispatcher` from its requisite parts. + /// + /// For correct operation, the OnDemand service is assumed to be registered as a network handler, + pub fn new( + sync: Arc, + client: Arc, + on_demand: Arc, + cache: Arc>, + transaction_queue: Arc>, + nonces: Arc>, + gas_price_percentile: usize, + ) -> Self { + LightDispatcher { + sync, + client, + on_demand, + cache, + transaction_queue, + nonces, + gas_price_percentile, + } + } + + /// Get a recent gas price corpus. + // TODO: this could be `impl Trait`. + pub fn gas_price_corpus(&self) -> BoxFuture> { + fetch_gas_price_corpus( + self.sync.clone(), + self.client.clone(), + self.on_demand.clone(), + self.cache.clone(), + ) + } + + /// Get an account's state + fn account(&self, addr: Address) -> BoxFuture> { + let best_header = self.client.best_block_header(); + let account_future = self.sync.with_context(|ctx| self.on_demand.request(ctx, request::Account { + header: best_header.into(), + address: addr, + }).expect("no back-references; therefore all back-references valid; qed")); + + match account_future { + Some(response) => Box::new(response.map_err(|_| errors::no_light_peers())), + None => Box::new(future::err(errors::network_disabled())), + } + } + + /// Get an account's next nonce. + pub fn next_nonce(&self, addr: Address) -> BoxFuture { + let account_start_nonce = self.client.engine().account_start_nonce(self.client.best_block_header().number()); + Box::new(self.account(addr) + .and_then(move |maybe_account| { + future::ok(maybe_account.map_or(account_start_nonce, |account| account.nonce)) + }) + ) + } +} + +impl Clone for LightDispatcher +where + S: LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ + fn clone(&self) -> Self { + Self { + sync: self.sync.clone(), + client: self.client.clone(), + on_demand: self.on_demand.clone(), + cache: self.cache.clone(), + transaction_queue: self.transaction_queue.clone(), + nonces: self.nonces.clone(), + gas_price_percentile: self.gas_price_percentile + } + } +} + +impl Dispatcher for LightDispatcher +where + S: LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ + // Ignore the `force_nonce` flag in order to always query the network when fetching the nonce and + // the account state. If the nonce is specified in the transaction use that nonce instead but do the + // network request anyway to the account state (balance) + fn fill_optional_fields(&self, request: TransactionRequest, default_sender: Address, _force_nonce: bool) + -> BoxFuture + { + const DEFAULT_GAS_PRICE: U256 = U256([0, 0, 0, 21_000_000]); + + let gas_limit = self.client.best_block_header().gas_limit(); + let request_gas_price = request.gas_price.clone(); + let from = request.from.unwrap_or(default_sender); + + let with_gas_price = move |gas_price| { + let request = request; + FilledTransactionRequest { + from: from.clone(), + used_default_from: request.from.is_none(), + to: request.to, + nonce: request.nonce, + gas_price: gas_price, + gas: request.gas.unwrap_or_else(|| gas_limit / 3), + value: request.value.unwrap_or_else(|| 0.into()), + data: request.data.unwrap_or_else(Vec::new), + condition: request.condition, + } + }; + + // fast path for known gas price. + let gas_price_percentile = self.gas_price_percentile; + let gas_price = match request_gas_price { + Some(gas_price) => Either::A(future::ok(with_gas_price(gas_price))), + None => Either::B(fetch_gas_price_corpus( + self.sync.clone(), + self.client.clone(), + self.on_demand.clone(), + self.cache.clone() + ).and_then(move |corp| match corp.percentile(gas_price_percentile) { + Some(percentile) => Ok(*percentile), + None => Ok(DEFAULT_GAS_PRICE), // fall back to default on error. + }).map(with_gas_price)) + }; + + let future_account = self.account(from); + + Box::new(gas_price.and_then(move |mut filled| { + future_account + .and_then(move |maybe_account| { + let cost = filled.value.saturating_add(filled.gas.saturating_mul(filled.gas_price)); + match maybe_account { + Some(ref account) if cost > account.balance => { + Err(errors::transaction(TransactionError::InsufficientBalance { + balance: account.balance, + cost, + })) + } + Some(account) => { + if filled.nonce.is_none() { + filled.nonce = Some(account.nonce); + } + Ok(filled) + } + None => Err(errors::account("Account not found", "")), + } + }) + })) + } + + fn sign

( + &self, + filled: FilledTransactionRequest, + signer: &Arc, + password: SignWith, + post_sign: P + ) -> BoxFuture + where + P: PostSign + 'static, + ::Future: Send, + { + let chain_id = self.client.signing_chain_id(); + let nonce = filled.nonce.expect("nonce is always provided; qed"); + let future = signer.sign_transaction(filled, chain_id, nonce, password) + .into_future() + .and_then(move |signed| post_sign.execute(signed)); + Box::new(future) + } + + fn enrich(&self, signed_transaction: SignedTransaction) -> RpcRichRawTransaction { + RpcRichRawTransaction::from_signed(signed_transaction) + } + + fn dispatch_transaction(&self, signed_transaction: PendingTransaction) -> Result { + let hash = signed_transaction.transaction.hash(); + + self.transaction_queue.write().import(signed_transaction) + .map_err(errors::transaction) + .map(|_| hash) + } +} + +/// Get a recent gas price corpus. +// TODO: this could be `impl Trait`. +pub fn fetch_gas_price_corpus( + sync: Arc, + client: Arc, + on_demand: Arc, + cache: Arc>, +) -> BoxFuture> { + const GAS_PRICE_SAMPLE_SIZE: usize = 100; + + if let Some(cached) = { cache.lock().gas_price_corpus() } { + return Box::new(future::ok(cached)) + } + + let cache = cache.clone(); + let eventual_corpus = sync.with_context(|ctx| { + // get some recent headers with gas used, + // and request each of the blocks from the network. + let block_requests = client.ancestry_iter(BlockId::Latest) + .filter(|hdr| hdr.gas_used() != U256::default()) + .take(GAS_PRICE_SAMPLE_SIZE) + .map(|hdr| request::Body(hdr.into())) + .collect::>(); + + // when the blocks come in, collect gas prices into a vector + on_demand.request(ctx, block_requests) + .expect("no back-references; therefore all back-references are valid; qed") + .map(|bodies| { + bodies.into_iter().fold(Vec::new(), |mut v, block| { + for t in block.transaction_views().iter() { + v.push(t.gas_price()) + } + v + }) + }) + .map(move |prices| { + // produce a corpus from the vector and cache it. + // It's later used to get a percentile for default gas price. + let corpus: ::stats::Corpus<_> = prices.into(); + cache.lock().set_gas_price_corpus(corpus.clone()); + corpus + }) + }); + + match eventual_corpus { + Some(corp) => Box::new(corp.map_err(|_| errors::no_light_peers())), + None => Box::new(future::err(errors::network_disabled())), + } +} diff --git a/rpc/src/v1/helpers/dispatch/mod.rs b/rpc/src/v1/helpers/dispatch/mod.rs new file mode 100644 index 00000000000..8877209723d --- /dev/null +++ b/rpc/src/v1/helpers/dispatch/mod.rs @@ -0,0 +1,380 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +//! Utilities and helpers for transaction dispatch. + +pub(crate) mod light; +mod full; +mod prospective_signer; + +#[cfg(any(test, feature = "accounts"))] +mod signing; +#[cfg(not(any(test, feature = "accounts")))] +mod signing { + use super::*; + use v1::helpers::errors; + + /// Dummy signer implementation + #[derive(Debug, Clone)] + pub struct Signer; + + impl Signer { + /// Create new instance of dummy signer (accept any AccountProvider) + pub fn new(_ap: T) -> Self { + Signer + } + } + + impl super::Accounts for Signer { + fn sign_transaction(&self, _filled: FilledTransactionRequest, _chain_id: Option, _nonce: U256, _password: SignWith) -> Result> { + Err(errors::account("Signing unsupported", "See #9997")) + } + + fn sign_message(&self, _address: Address, _password: SignWith, _hash: SignMessage) -> Result> { + Err(errors::account("Signing unsupported", "See #9997")) + } + + fn decrypt(&self, _address: Address, _password: SignWith, _data: Bytes) -> Result> { + Err(errors::account("Signing unsupported", "See #9997")) + } + + fn supports_prospective_signing(&self, _address: &Address, _password: &SignWith) -> bool { + false + } + + fn default_account(&self) -> Address { + Default::default() + } + + fn is_unlocked(&self, _address: &Address) -> bool { + false + } + } +} + +pub use self::light::LightDispatcher; +pub use self::full::FullDispatcher; +pub use self::signing::Signer; +pub use v1::helpers::nonce::Reservations; + +use std::fmt::Debug; +use std::ops::Deref; +use std::sync::Arc; + +use bytes::Bytes; +use ethcore::client::BlockChainClient; +use ethcore::miner::MinerService; +use ethereum_types::{H520, H256, U256, Address}; +use ethkey::{Password, Signature}; +use hash::keccak; +use types::transaction::{SignedTransaction, PendingTransaction}; + +use jsonrpc_core::{BoxFuture, Result, Error}; +use jsonrpc_core::futures::{future, Future, IntoFuture}; +use v1::helpers::{TransactionRequest, FilledTransactionRequest, ConfirmationPayload}; +use v1::types::{ + Bytes as RpcBytes, + RichRawTransaction as RpcRichRawTransaction, + ConfirmationPayload as RpcConfirmationPayload, + ConfirmationResponse, + EthSignRequest as RpcEthSignRequest, + EIP191SignRequest as RpcSignRequest, + DecryptRequest as RpcDecryptRequest, +}; + +/// Has the capability to dispatch, sign, and decrypt. +/// +/// Requires a clone implementation, with the implication that it be cheap; +/// usually just bumping a reference count or two. +pub trait Dispatcher: Send + Sync + Clone { + // TODO: when ATC exist, use zero-cost + // type Out: IntoFuture + + /// Fill optional fields of a transaction request, fetching gas price but not nonce. + fn fill_optional_fields(&self, request: TransactionRequest, default_sender: Address, force_nonce: bool) + -> BoxFuture; + + /// Sign the given transaction request without dispatching, fetching appropriate nonce. + fn sign

( + &self, + filled: FilledTransactionRequest, + signer: &Arc, + password: SignWith, + post_sign: P, + ) -> BoxFuture where + P: PostSign + 'static, + ::Future: Send; + + /// Converts a `SignedTransaction` into `RichRawTransaction` + fn enrich(&self, SignedTransaction) -> RpcRichRawTransaction; + + /// "Dispatch" a local transaction. + fn dispatch_transaction(&self, signed_transaction: PendingTransaction) -> Result; +} + +/// Payload to sign +pub enum SignMessage { + /// Eth-sign kind data (requires prefixing) + Data(Bytes), + /// Prefixed data hash + Hash(H256), +} + +/// Abstract transaction signer. +/// +/// NOTE This signer is semi-correct, it's a temporary measure to avoid moving too much code. +/// If accounts are ultimately removed all password-dealing endpoints will be wiped out. +pub trait Accounts: Send + Sync { + /// Sign given filled transaction request for the specified chain_id. + fn sign_transaction(&self, filled: FilledTransactionRequest, chain_id: Option, nonce: U256, password: SignWith) -> Result>; + + /// Sign given message. + fn sign_message(&self, address: Address, password: SignWith, hash: SignMessage) -> Result>; + + /// Decrypt given message. + fn decrypt(&self, address: Address, password: SignWith, data: Bytes) -> Result>; + + /// Returns `true` if the accounts can sign multiple times. + fn supports_prospective_signing(&self, address: &Address, password: &SignWith) -> bool; + + /// Returns default account. + fn default_account(&self) -> Address; + + /// Returns true if account is unlocked (i.e. can sign without a password) + fn is_unlocked(&self, address: &Address) -> bool; +} + +/// action to execute after signing +/// e.g importing a transaction into the chain +pub trait PostSign: Send { + /// item that this PostSign returns + type Item: Send; + /// incase you need to perform async PostSign actions + type Out: IntoFuture + Send; + /// perform an action with the signed transaction + fn execute(self, signer: WithToken) -> Self::Out; +} + +impl PostSign for () { + type Item = WithToken; + type Out = Result; + fn execute(self, signed: WithToken) -> Self::Out { + Ok(signed) + } +} + +impl PostSign for F + where F: FnOnce(WithToken) -> Result +{ + type Item = T; + type Out = Result; + fn execute(self, signed: WithToken) -> Self::Out { + (self)(signed) + } +} + +/// Single-use account token. +pub type AccountToken = Password; + +/// Values used to unlock accounts for signing. +#[derive(Clone, PartialEq)] +pub enum SignWith { + /// Nothing -- implies the account is already unlocked. + Nothing, + /// Unlock with password. + Password(Password), + /// Unlock with single-use token. + Token(AccountToken), +} + +impl SignWith { + #[cfg(any(test, feature = "accounts"))] + fn is_password(&self) -> bool { + if let SignWith::Password(_) = *self { + true + } else { + false + } + } +} + +/// A value, potentially accompanied by a signing token. +pub enum WithToken { + /// No token. + No(T), + /// With token. + Yes(T, AccountToken), +} + +impl Deref for WithToken { + type Target = T; + + fn deref(&self) -> &Self::Target { + match *self { + WithToken::No(ref v) => v, + WithToken::Yes(ref v, _) => v, + } + } +} + +impl WithToken { + /// Map the value with the given closure, preserving the token. + pub fn map(self, f: F) -> WithToken where + S: Debug, + F: FnOnce(T) -> S, + { + match self { + WithToken::No(v) => WithToken::No(f(v)), + WithToken::Yes(v, token) => WithToken::Yes(f(v), token), + } + } + + /// Convert into inner value, ignoring possible token. + pub fn into_value(self) -> T { + match self { + WithToken::No(v) => v, + WithToken::Yes(v, _) => v, + } + } + + /// Convert the `WithToken` into a tuple. + pub fn into_tuple(self) -> (T, Option) { + match self { + WithToken::No(v) => (v, None), + WithToken::Yes(v, token) => (v, Some(token)) + } + } +} + +impl From<(T, AccountToken)> for WithToken { + fn from(tuple: (T, AccountToken)) -> Self { + WithToken::Yes(tuple.0, tuple.1) + } +} + +impl From<(T, Option)> for WithToken { + fn from(tuple: (T, Option)) -> Self { + match tuple.1 { + Some(token) => WithToken::Yes(tuple.0, token), + None => WithToken::No(tuple.0), + } + } +} + +/// Execute a confirmation payload. +pub fn execute( + dispatcher: D, + signer: &Arc, + payload: ConfirmationPayload, + pass: SignWith +) -> BoxFuture> { + match payload { + ConfirmationPayload::SendTransaction(request) => { + let condition = request.condition.clone().map(Into::into); + let cloned_dispatcher = dispatcher.clone(); + let post_sign = move |with_token_signed: WithToken| { + let (signed, token) = with_token_signed.into_tuple(); + let signed_transaction = PendingTransaction::new(signed, condition); + cloned_dispatcher.dispatch_transaction(signed_transaction) + .map(|hash| (hash, token)) + }; + + Box::new( + dispatcher.sign(request, &signer, pass, post_sign).map(|(hash, token)| { + WithToken::from((ConfirmationResponse::SendTransaction(hash.into()), token)) + }) + ) + }, + ConfirmationPayload::SignTransaction(request) => { + Box::new(dispatcher.sign(request, &signer, pass, ()) + .map(move |result| result + .map(move |tx| dispatcher.enrich(tx)) + .map(ConfirmationResponse::SignTransaction) + )) + }, + ConfirmationPayload::EthSignMessage(address, data) => { + let res = signer.sign_message(address, pass, SignMessage::Data(data)) + .map(|result| result + .map(|s| H520(s.into_electrum())) + .map(ConfirmationResponse::Signature) + ); + + Box::new(future::done(res)) + }, + ConfirmationPayload::SignMessage(address, data) => { + let res = signer.sign_message(address, pass, SignMessage::Hash(data)) + .map(|result| result + .map(|rsv| H520(rsv.into_electrum())) + .map(ConfirmationResponse::Signature) + ); + + Box::new(future::done(res)) + }, + ConfirmationPayload::Decrypt(address, data) => { + let res = signer.decrypt(address, pass, data) + .map(|result| result + .map(RpcBytes) + .map(ConfirmationResponse::Decrypt) + ); + Box::new(future::done(res)) + }, + } +} + +/// Returns a eth_sign-compatible hash of data to sign. +/// The data is prepended with special message to prevent +/// malicious DApps from using the function to sign forged transactions. +pub fn eth_data_hash(mut data: Bytes) -> H256 { + let mut message_data = + format!("\x19Ethereum Signed Message:\n{}", data.len()) + .into_bytes(); + message_data.append(&mut data); + keccak(message_data) +} + +/// Extract the default gas price from a client and miner. +pub fn default_gas_price(client: &C, miner: &M, percentile: usize) -> U256 where + C: BlockChainClient, + M: MinerService, +{ + client.gas_price_corpus(100).percentile(percentile).cloned().unwrap_or_else(|| miner.sensible_gas_price()) +} + +/// Convert RPC confirmation payload to signer confirmation payload. +/// May need to resolve in the future to fetch things like gas price. +pub fn from_rpc(payload: RpcConfirmationPayload, default_account: Address, dispatcher: &D) -> BoxFuture + where D: Dispatcher +{ + match payload { + RpcConfirmationPayload::SendTransaction(request) => { + Box::new(dispatcher.fill_optional_fields(request.into(), default_account, false) + .map(ConfirmationPayload::SendTransaction)) + }, + RpcConfirmationPayload::SignTransaction(request) => { + Box::new(dispatcher.fill_optional_fields(request.into(), default_account, false) + .map(ConfirmationPayload::SignTransaction)) + }, + RpcConfirmationPayload::Decrypt(RpcDecryptRequest { address, msg }) => { + Box::new(future::ok(ConfirmationPayload::Decrypt(address.into(), msg.into()))) + }, + RpcConfirmationPayload::EthSignMessage(RpcEthSignRequest { address, data }) => { + Box::new(future::ok(ConfirmationPayload::EthSignMessage(address.into(), data.into()))) + }, + RpcConfirmationPayload::EIP191SignMessage(RpcSignRequest { address, data }) => { + Box::new(future::ok(ConfirmationPayload::SignMessage(address.into(), data.into()))) + }, + } +} diff --git a/rpc/src/v1/helpers/dispatch/prospective_signer.rs b/rpc/src/v1/helpers/dispatch/prospective_signer.rs new file mode 100644 index 00000000000..034d19dc659 --- /dev/null +++ b/rpc/src/v1/helpers/dispatch/prospective_signer.rs @@ -0,0 +1,152 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +use std::sync::Arc; + +use ethereum_types::U256; +use jsonrpc_core::{Result, Error}; +use jsonrpc_core::futures::{Future, Poll, Async, IntoFuture}; +use types::transaction::SignedTransaction; + +use v1::helpers::{errors, nonce, FilledTransactionRequest}; +use super::{Accounts, SignWith, WithToken, PostSign}; + +#[derive(Debug, Clone, Copy)] +enum ProspectiveSignerState { + TryProspectiveSign, + WaitForPostSign, + WaitForNonce, +} + +pub struct ProspectiveSigner { + signer: Arc, + filled: FilledTransactionRequest, + chain_id: Option, + reserved: nonce::Reserved, + password: SignWith, + state: ProspectiveSignerState, + prospective: Option>, + ready: Option, + post_sign: Option

, + post_sign_future: Option<::Future> +} + +impl ProspectiveSigner

{ + pub fn new( + signer: Arc, + filled: FilledTransactionRequest, + chain_id: Option, + reserved: nonce::Reserved, + password: SignWith, + post_sign: P + ) -> Self { + let supports_prospective = signer.supports_prospective_signing(&filled.from, &password); + + ProspectiveSigner { + signer, + filled, + chain_id, + reserved, + password, + state: if supports_prospective { + ProspectiveSignerState::TryProspectiveSign + } else { + ProspectiveSignerState::WaitForNonce + }, + prospective: None, + ready: None, + post_sign: Some(post_sign), + post_sign_future: None + } + } + + fn sign(&self, nonce: &U256) -> Result> { + self.signer.sign_transaction( + self.filled.clone(), + self.chain_id, + *nonce, + self.password.clone() + ) + } + + fn poll_reserved(&mut self) -> Poll { + self.reserved.poll().map_err(|_| errors::internal("Nonce reservation failure", "")) + } +} + +impl Future for ProspectiveSigner

{ + type Item = P::Item; + type Error = Error; + + fn poll(&mut self) -> Poll { + use self::ProspectiveSignerState::*; + + loop { + match self.state { + TryProspectiveSign => { + // Try to poll reserved, it might be ready. + match self.poll_reserved()? { + Async::NotReady => { + self.state = WaitForNonce; + self.prospective = Some(self.sign(self.reserved.prospective_value())?); + }, + Async::Ready(nonce) => { + self.state = WaitForPostSign; + self.post_sign_future = Some( + self.post_sign.take() + .expect("post_sign is set on creation; qed") + .execute(self.sign(nonce.value())?) + .into_future() + ); + self.ready = Some(nonce); + }, + } + }, + WaitForNonce => { + let nonce = try_ready!(self.poll_reserved()); + let prospective = match (self.prospective.take(), nonce.matches_prospective()) { + (Some(prospective), true) => prospective, + _ => self.sign(nonce.value())?, + }; + self.ready = Some(nonce); + self.state = WaitForPostSign; + self.post_sign_future = Some(self.post_sign.take() + .expect("post_sign is set on creation; qed") + .execute(prospective) + .into_future()); + }, + WaitForPostSign => { + if let Some(mut fut) = self.post_sign_future.as_mut() { + match fut.poll()? { + Async::Ready(item) => { + let nonce = self.ready + .take() + .expect("nonce is set before state transitions to WaitForPostSign; qed"); + nonce.mark_used(); + return Ok(Async::Ready(item)) + }, + Async::NotReady => { + return Ok(Async::NotReady) + } + } + } else { + panic!("Poll after ready."); + } + } + } + } + } +} diff --git a/rpc/src/v1/helpers/dispatch/signing.rs b/rpc/src/v1/helpers/dispatch/signing.rs new file mode 100644 index 00000000000..8243dcbdf81 --- /dev/null +++ b/rpc/src/v1/helpers/dispatch/signing.rs @@ -0,0 +1,156 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +use std::sync::Arc; + +use accounts::AccountProvider; +use bytes::Bytes; +use crypto::DEFAULT_MAC; +use ethereum_types::{H256, U256, Address}; +use ethkey::{Signature}; +use types::transaction::{Transaction, Action, SignedTransaction}; + +use jsonrpc_core::Result; +use v1::helpers::{errors, FilledTransactionRequest}; + +use super::{eth_data_hash, WithToken, SignWith, SignMessage}; + +/// Account-aware signer +pub struct Signer { + accounts: Arc, +} + +impl Signer { + /// Create new instance of signer + pub fn new(accounts: Arc) -> Self { + Signer { accounts } + } +} + +impl super::Accounts for Signer { + fn sign_transaction(&self, filled: FilledTransactionRequest, chain_id: Option, nonce: U256, password: SignWith) -> Result> { + let t = Transaction { + nonce: nonce, + action: filled.to.map_or(Action::Create, Action::Call), + gas: filled.gas, + gas_price: filled.gas_price, + value: filled.value, + data: filled.data, + }; + + if self.accounts.is_hardware_address(&filled.from) { + return hardware_signature(&*self.accounts, filled.from, t, chain_id).map(WithToken::No) + } + + let hash = t.hash(chain_id); + let signature = signature(&*self.accounts, filled.from, hash, password)?; + + Ok(signature.map(|sig| { + SignedTransaction::new(t.with_signature(sig, chain_id)) + .expect("Transaction was signed by AccountsProvider; it never produces invalid signatures; qed") + })) + } + + fn sign_message(&self, address: Address, password: SignWith, hash: SignMessage) -> Result> { + if self.accounts.is_hardware_address(&address) { + return if let SignMessage::Data(data) = hash { + let signature = self.accounts.sign_message_with_hardware(&address, &data) + // TODO: is this correct? I guess the `token` is the wallet in this context + .map(WithToken::No) + .map_err(|e| errors::account("Error signing message with hardware_wallet", e)); + + signature + } else { + Err(errors::account("Error signing message with hardware_wallet", "Message signing is unsupported")) + } + } + + match hash { + SignMessage::Data(data) => { + let hash = eth_data_hash(data); + signature(&self.accounts, address, hash, password) + }, + SignMessage::Hash(hash) => { + signature(&self.accounts, address, hash, password) + } + } + } + + fn decrypt(&self, address: Address, password: SignWith, data: Bytes) -> Result> { + if self.accounts.is_hardware_address(&address) { + return Err(errors::unsupported("Decrypting via hardware wallets is not supported.", None)); + } + + match password.clone() { + SignWith::Nothing => self.accounts.decrypt(address, None, &DEFAULT_MAC, &data).map(WithToken::No), + SignWith::Password(pass) => self.accounts.decrypt(address, Some(pass), &DEFAULT_MAC, &data).map(WithToken::No), + SignWith::Token(token) => self.accounts.decrypt_with_token(address, token, &DEFAULT_MAC, &data).map(Into::into), + }.map_err(|e| match password { + SignWith::Nothing => errors::signing(e), + _ => errors::password(e), + }) + } + + fn supports_prospective_signing(&self, address: &Address, password: &SignWith) -> bool { + // If the account is permanently unlocked we can try to sign + // using prospective nonce. This should speed up sending + // multiple subsequent transactions in multi-threaded RPC environment. + let is_unlocked_permanently = self.accounts.is_unlocked_permanently(address); + let has_password = password.is_password(); + + is_unlocked_permanently || has_password + } + + fn default_account(&self) -> Address { + self.accounts.default_account().ok().unwrap_or_default() + } + + fn is_unlocked(&self, address: &Address) -> bool { + self.accounts.is_unlocked(address) + } +} + +fn signature(accounts: &AccountProvider, address: Address, hash: H256, password: SignWith) -> Result> { + match password.clone() { + SignWith::Nothing => accounts.sign(address, None, hash).map(WithToken::No), + SignWith::Password(pass) => accounts.sign(address, Some(pass), hash).map(WithToken::No), + SignWith::Token(token) => accounts.sign_with_token(address, token, hash).map(Into::into), + }.map_err(|e| match password { + SignWith::Nothing => errors::signing(e), + _ => errors::password(e), + }) +} + +// obtain a hardware signature from the given account. +fn hardware_signature(accounts: &AccountProvider, address: Address, t: Transaction, chain_id: Option) + -> Result +{ + debug_assert!(accounts.is_hardware_address(&address)); + + let mut stream = rlp::RlpStream::new(); + t.rlp_append_unsigned_transaction(&mut stream, chain_id); + let signature = accounts.sign_transaction_with_hardware(&address, &t, chain_id, &stream.as_raw()) + .map_err(|e| { + debug!(target: "miner", "Error signing transaction with hardware wallet: {}", e); + errors::account("Error signing transaction with hardware wallet", e) + })?; + + SignedTransaction::new(t.with_signature(signature, chain_id)) + .map_err(|e| { + debug!(target: "miner", "Hardware wallet has produced invalid signature: {}", e); + errors::account("Invalid signature generated", e) + }) +} diff --git a/rpc/src/v1/helpers/eip191.rs b/rpc/src/v1/helpers/eip191.rs index 56ceba5f28d..938ab81dc4e 100644 --- a/rpc/src/v1/helpers/eip191.rs +++ b/rpc/src/v1/helpers/eip191.rs @@ -1,22 +1,22 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! EIP-191 compliant decoding + hashing use v1::types::{EIP191Version, Bytes, PresignedTransaction}; -use eip712::{hash_structured_data, EIP712}; +use eip_712::{hash_structured_data, EIP712}; use serde_json::{Value, from_value}; use v1::helpers::errors; use jsonrpc_core::Error; diff --git a/rpc/src/v1/helpers/engine_signer.rs b/rpc/src/v1/helpers/engine_signer.rs new file mode 100644 index 00000000000..f993d15f230 --- /dev/null +++ b/rpc/src/v1/helpers/engine_signer.rs @@ -0,0 +1,51 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::sync::Arc; + +use accounts::AccountProvider; +use ethkey::{self, Address, Password}; + +/// An implementation of EngineSigner using internal account management. +pub struct EngineSigner { + accounts: Arc, + address: Address, + password: Password, +} + +impl EngineSigner { + /// Creates new `EngineSigner` given account manager and account details. + pub fn new(accounts: Arc, address: Address, password: Password) -> Self { + EngineSigner { accounts, address, password } + } +} + +impl ethcore::engines::EngineSigner for EngineSigner { + fn sign(&self, message: ethkey::Message) -> Result { + match self.accounts.sign(self.address, Some(self.password.clone()), message) { + Ok(ok) => Ok(ok), + Err(e) => { + warn!("Unable to sign consensus message: {:?}", e); + Err(ethkey::Error::InvalidSecret) + }, + } + } + + fn address(&self) -> Address { + self.address + } +} + diff --git a/rpc/src/v1/helpers/errors.rs b/rpc/src/v1/helpers/errors.rs index d75887d8f4d..eebd76dbe3c 100644 --- a/rpc/src/v1/helpers/errors.rs +++ b/rpc/src/v1/helpers/errors.rs @@ -1,34 +1,33 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! RPC Error codes and error objects use std::fmt; -use ethcore::account_provider::SignError as AccountError; use ethcore::error::{Error as EthcoreError, ErrorKind, CallError}; use ethcore::client::BlockId; use jsonrpc_core::{futures, Result as RpcResult, Error, ErrorCode, Value}; use rlp::DecoderError; -use transaction::Error as TransactionError; +use types::transaction::Error as TransactionError; use ethcore_private_tx::Error as PrivateTransactionError; use vm::Error as VMError; use light::on_demand::error::{Error as OnDemandError, ErrorKind as OnDemandErrorKind}; use ethcore::client::BlockChainClient; -use ethcore::blockchain_info::BlockChainInfo; +use types::blockchain_info::BlockChainInfo; use v1::types::BlockNumber; mod codes { @@ -44,7 +43,9 @@ mod codes { pub const EXECUTION_ERROR: i64 = -32015; pub const EXCEPTION_ERROR: i64 = -32016; pub const DATABASE_ERROR: i64 = -32017; + #[cfg(any(test, feature = "accounts"))] pub const ACCOUNT_LOCKED: i64 = -32020; + #[cfg(any(test, feature = "accounts"))] pub const PASSWORD_INVALID: i64 = -32021; pub const ACCOUNT_ERROR: i64 = -32023; pub const PRIVATE_ERROR: i64 = -32024; @@ -337,14 +338,7 @@ pub fn fetch(error: T) -> Error { } } -pub fn signing(error: AccountError) -> Error { - Error { - code: ErrorCode::ServerError(codes::ACCOUNT_LOCKED), - message: "Your account is locked. Unlock the account via CLI, personal_unlockAccount or use Trusted Signer.".into(), - data: Some(Value::String(format!("{:?}", error))), - } -} - +#[cfg(any(test, feature = "accounts"))] pub fn invalid_call_data(error: T) -> Error { Error { code: ErrorCode::ServerError(codes::ENCODING_ERROR), @@ -353,7 +347,17 @@ pub fn invalid_call_data(error: T) -> Error { } } -pub fn password(error: AccountError) -> Error { +#[cfg(any(test, feature = "accounts"))] +pub fn signing(error: ::accounts::SignError) -> Error { + Error { + code: ErrorCode::ServerError(codes::ACCOUNT_LOCKED), + message: "Your account is locked. Unlock the account via CLI, personal_unlockAccount or use Trusted Signer.".into(), + data: Some(Value::String(format!("{:?}", error))), + } +} + +#[cfg(any(test, feature = "accounts"))] +pub fn password(error: ::accounts::SignError) -> Error { Error { code: ErrorCode::ServerError(codes::PASSWORD_INVALID), message: "Account password is invalid or account does not exist.".into(), diff --git a/rpc/src/v1/helpers/signer.rs b/rpc/src/v1/helpers/external_signer/mod.rs similarity index 60% rename from rpc/src/v1/helpers/signer.rs rename to rpc/src/v1/helpers/external_signer/mod.rs index 0ee14bad1b9..49bbaafe596 100644 --- a/rpc/src/v1/helpers/signer.rs +++ b/rpc/src/v1/helpers/external_signer/mod.rs @@ -1,36 +1,35 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . + +//! An list of requests to be confirmed or signed by an external approver/signer. use std::sync::Arc; use std::ops::Deref; -use http::Origin; -use parking_lot::Mutex; -use transient_hashmap::TransientHashMap; - -use ethstore::random_string; -use v1::helpers::signing_queue::{ConfirmationsQueue}; +mod oneshot; +mod signing_queue; -const TOKEN_LIFETIME_SECS: u32 = 3600; +pub use self::signing_queue::{SigningQueue, ConfirmationsQueue, ConfirmationReceiver, ConfirmationResult}; +#[cfg(test)] +pub use self::signing_queue::QueueEvent; /// Manages communication with Signer crate pub struct SignerService { is_enabled: bool, queue: Arc, - web_proxy_tokens: Mutex>, generate_new_token: Box Result + Send + Sync + 'static>, } @@ -40,26 +39,11 @@ impl SignerService { where F: Fn() -> Result + Send + Sync + 'static { SignerService { queue: Arc::new(ConfirmationsQueue::default()), - web_proxy_tokens: Mutex::new(TransientHashMap::new(TOKEN_LIFETIME_SECS)), generate_new_token: Box::new(new_token), is_enabled: is_enabled, } } - /// Checks if the token is valid web proxy access token. - pub fn web_proxy_access_token_domain(&self, token: &String) -> Option { - self.web_proxy_tokens.lock().get(token).cloned() - } - - /// Generates a new web proxy access token. - pub fn generate_web_proxy_access_token(&self, domain: Origin) -> String { - let token = random_string(16); - let mut tokens = self.web_proxy_tokens.lock(); - tokens.prune(); - tokens.insert(token.clone(), domain); - token - } - /// Generates new signer authorization token. pub fn generate_token(&self) -> Result { (self.generate_new_token)() diff --git a/rpc/src/v1/helpers/oneshot.rs b/rpc/src/v1/helpers/external_signer/oneshot.rs similarity index 83% rename from rpc/src/v1/helpers/oneshot.rs rename to rpc/src/v1/helpers/external_signer/oneshot.rs index 5ede0ae912f..623691d3998 100644 --- a/rpc/src/v1/helpers/oneshot.rs +++ b/rpc/src/v1/helpers/external_signer/oneshot.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use jsonrpc_core::Error; use jsonrpc_core::futures::{self, Future}; diff --git a/rpc/src/v1/helpers/signing_queue.rs b/rpc/src/v1/helpers/external_signer/signing_queue.rs similarity index 91% rename from rpc/src/v1/helpers/signing_queue.rs rename to rpc/src/v1/helpers/external_signer/signing_queue.rs index 9f31628a319..9bbc778ece1 100644 --- a/rpc/src/v1/helpers/signing_queue.rs +++ b/rpc/src/v1/helpers/external_signer/signing_queue.rs @@ -1,42 +1,33 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::BTreeMap; -use ethereum_types::{U256, Address}; + +use ethereum_types::U256; use parking_lot::{Mutex, RwLock}; -use v1::helpers::{ConfirmationRequest, ConfirmationPayload, oneshot, errors}; -use v1::types::{ConfirmationResponse, H160 as RpcH160, Origin}; +use super::oneshot; +use v1::helpers::errors; +use v1::helpers::requests::{ConfirmationRequest, ConfirmationPayload}; +use v1::types::{ConfirmationResponse, Origin}; use jsonrpc_core::Error; /// Result that can be returned from JSON RPC. pub type ConfirmationResult = Result; -/// Type of default account -pub enum DefaultAccount { - /// Default account is known - Provided(Address), -} - -impl From for DefaultAccount { - fn from(address: RpcH160) -> Self { - DefaultAccount::Provided(address.into()) - } -} - /// Possible events happening in the queue that can be listened to. #[derive(Debug, PartialEq, Clone)] pub enum QueueEvent { @@ -225,9 +216,8 @@ mod test { use ethereum_types::{U256, Address}; use parking_lot::Mutex; use jsonrpc_core::futures::Future; - use v1::helpers::{ - SigningQueue, ConfirmationsQueue, QueueEvent, FilledTransactionRequest, ConfirmationPayload, - }; + use v1::helpers::external_signer::{SigningQueue, ConfirmationsQueue, QueueEvent}; + use v1::helpers::{FilledTransactionRequest, ConfirmationPayload}; use v1::types::ConfirmationResponse; fn request() -> ConfirmationPayload { @@ -299,3 +289,4 @@ mod test { assert_eq!(el.payload, request); } } + diff --git a/rpc/src/v1/helpers/fake_sign.rs b/rpc/src/v1/helpers/fake_sign.rs index e9ee9b161cd..76d37aab2fb 100644 --- a/rpc/src/v1/helpers/fake_sign.rs +++ b/rpc/src/v1/helpers/fake_sign.rs @@ -1,20 +1,20 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use transaction::{Transaction, SignedTransaction, Action}; +use types::transaction::{Transaction, SignedTransaction, Action}; use ethereum_types::U256; use jsonrpc_core::Error; diff --git a/rpc/src/v1/helpers/ipfs.rs b/rpc/src/v1/helpers/ipfs.rs index 12980d3f418..928362cf89f 100644 --- a/rpc/src/v1/helpers/ipfs.rs +++ b/rpc/src/v1/helpers/ipfs.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! IPFS utility functions diff --git a/rpc/src/v1/helpers/light_fetch.rs b/rpc/src/v1/helpers/light_fetch.rs index 0473ff4c858..3ac17c2fd8d 100644 --- a/rpc/src/v1/helpers/light_fetch.rs +++ b/rpc/src/v1/helpers/light_fetch.rs @@ -1,35 +1,35 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Helpers for fetching blockchain data either from the light client or the network. use std::cmp; +use std::clone::Clone; use std::sync::Arc; -use ethcore::basic_account::BasicAccount; -use ethcore::encoded; -use ethcore::filter::Filter as EthcoreFilter; -use ethcore::ids::BlockId; -use ethcore::receipt::Receipt; +use types::basic_account::BasicAccount; +use types::encoded; +use types::filter::Filter as EthcoreFilter; +use types::ids::BlockId; +use types::receipt::Receipt; use ethcore::executed::ExecutionError; use jsonrpc_core::{Result, Error}; use jsonrpc_core::futures::{future, Future}; use jsonrpc_core::futures::future::Either; -use jsonrpc_macros::Trailing; use light::cache::Cache; use light::client::LightChainClient; @@ -41,22 +41,26 @@ use light::on_demand::{ use light::on_demand::error::Error as OnDemandError; use light::request::Field; -use sync::LightSync; + +use sync::{LightNetworkDispatcher, ManageNetwork, LightSyncProvider}; + use ethereum_types::{U256, Address}; use hash::H256; use parking_lot::Mutex; use fastmap::H256FastMap; use std::collections::BTreeMap; -use transaction::{Action, Transaction as EthTransaction, PendingTransaction, SignedTransaction, LocalizedTransaction}; +use types::transaction::{Action, Transaction as EthTransaction, PendingTransaction, SignedTransaction, LocalizedTransaction}; use v1::helpers::{CallRequest as CallRequestHelper, errors, dispatch}; use v1::types::{BlockNumber, CallRequest, Log, Transaction}; const NO_INVALID_BACK_REFS_PROOF: &str = "Fails only on invalid back-references; back-references here known to be valid; qed"; - const WRONG_RESPONSE_AMOUNT_TYPE_PROOF: &str = "responses correspond directly with requests in amount and type; qed"; -pub fn light_all_transactions(dispatch: &Arc) -> impl Iterator { +pub fn light_all_transactions(dispatch: &Arc>) -> impl Iterator +where + S: LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ let txq = dispatch.transaction_queue.read(); let chain_info = dispatch.client.chain_info(); @@ -67,20 +71,36 @@ pub fn light_all_transactions(dispatch: &Arc) -> impl /// Helper for fetching blockchain data either from the light client or the network /// as necessary. -#[derive(Clone)] -pub struct LightFetch { +pub struct LightFetch +{ /// The light client. pub client: Arc, /// The on-demand request service. pub on_demand: Arc, /// Handle to the network. - pub sync: Arc, + pub sync: Arc, /// The light data cache. pub cache: Arc>, /// Gas Price percentile pub gas_price_percentile: usize, } +impl Clone for LightFetch +where + S: LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ + fn clone(&self) -> Self { + Self { + client: self.client.clone(), + on_demand: self.on_demand.clone(), + sync: self.sync.clone(), + cache: self.cache.clone(), + gas_price_percentile: self.gas_price_percentile + } + } +} + + /// Extract a transaction at given index. pub fn extract_transaction_at_index(block: encoded::Block, index: usize) -> Option { block.transactions().into_iter().nth(index) @@ -116,7 +136,10 @@ fn extract_header(res: &[OnDemandResponse], header: HeaderRef) -> Option LightFetch +where + S: LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ // push the necessary requests onto the request chain to get the header by the given ID. // yield a header reference which other requests can use. fn make_header_requests(&self, id: BlockId, reqs: &mut Vec) -> Result { @@ -202,7 +225,7 @@ impl LightFetch { } /// Helper for getting proved execution. - pub fn proved_read_only_execution(&self, req: CallRequest, num: Trailing) -> impl Future + Send { + pub fn proved_read_only_execution(&self, req: CallRequest, num: Option) -> impl Future + Send { const DEFAULT_GAS_PRICE: u64 = 21_000; // (21000 G_transaction + 32000 G_create + some marginal to allow a few operations) const START_GAS: u64 = 60_000; @@ -232,7 +255,7 @@ impl LightFetch { let gas_price_percentile = self.gas_price_percentile; let gas_price_fut = match req.gas_price { Some(price) => Either::A(future::ok(price)), - None => Either::B(dispatch::fetch_gas_price_corpus( + None => Either::B(dispatch::light::fetch_gas_price_corpus( self.sync.clone(), self.client.clone(), self.on_demand.clone(), @@ -377,7 +400,6 @@ impl LightFetch { }) } - /// Get transaction logs pub fn logs(&self, filter: EthcoreFilter) -> impl Future, Error = Error> + Send { use jsonrpc_core::futures::stream::{self, Stream}; @@ -637,20 +659,42 @@ impl LightFetch { } } -#[derive(Clone)] -struct ExecuteParams { +struct ExecuteParams +where + S: LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ from: Address, tx: EthTransaction, hdr: encoded::Header, env_info: ::vm::EnvInfo, engine: Arc<::ethcore::engines::EthEngine>, on_demand: Arc, - sync: Arc, + sync: Arc, +} + +impl Clone for ExecuteParams +where + S: LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ + fn clone(&self) -> Self { + Self { + from: self.from.clone(), + tx: self.tx.clone(), + hdr: self.hdr.clone(), + env_info: self.env_info.clone(), + engine: self.engine.clone(), + on_demand: self.on_demand.clone(), + sync: self.sync.clone() + } + } } // Has a peer execute the transaction with given params. If `gas_known` is false, this will set the `gas value` to the // `required gas value` unless it exceeds the block gas limit -fn execute_read_only_tx(gas_known: bool, params: ExecuteParams) -> impl Future + Send { +fn execute_read_only_tx(gas_known: bool, params: ExecuteParams) -> impl Future + Send +where + S: LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ if !gas_known { Box::new(future::loop_fn(params, |mut params| { execute_read_only_tx(true, params.clone()).and_then(move |res| { diff --git a/rpc/src/v1/helpers/mod.rs b/rpc/src/v1/helpers/mod.rs index c770836fb47..8a25f93056a 100644 --- a/rpc/src/v1/helpers/mod.rs +++ b/rpc/src/v1/helpers/mod.rs @@ -1,38 +1,41 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . #[macro_use] pub mod errors; pub mod block_import; +pub mod deprecated; pub mod dispatch; +#[cfg(any(test, feature = "accounts"))] +pub mod eip191; +#[cfg(any(test, feature = "accounts"))] +pub mod engine_signer; +pub mod external_signer; pub mod fake_sign; pub mod ipfs; pub mod light_fetch; pub mod nonce; -pub mod oneshot; +#[cfg(any(test, feature = "accounts"))] pub mod secretstore; -pub mod eip191; mod network_settings; mod poll_filter; mod poll_manager; mod requests; -mod signer; -mod signing_queue; mod subscribers; mod subscription_manager; mod work; @@ -46,12 +49,6 @@ pub use self::poll_filter::{PollFilter, SyncPollFilter, limit_logs}; pub use self::requests::{ TransactionRequest, FilledTransactionRequest, ConfirmationRequest, ConfirmationPayload, CallRequest, }; -pub use self::signing_queue::{ - ConfirmationsQueue, ConfirmationReceiver, ConfirmationResult, ConfirmationSender, - SigningQueue, QueueEvent, DefaultAccount, - QUEUE_LIMIT as SIGNING_QUEUE_LIMIT, -}; -pub use self::signer::SignerService; pub use self::subscribers::Subscribers; pub use self::subscription_manager::GenericPollManager; pub use self::work::submit_work_detail; diff --git a/rpc/src/v1/helpers/network_settings.rs b/rpc/src/v1/helpers/network_settings.rs index eddb2abe067..ed515e471a9 100644 --- a/rpc/src/v1/helpers/network_settings.rs +++ b/rpc/src/v1/helpers/network_settings.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Structure to hold network settings configured from CLI diff --git a/rpc/src/v1/helpers/nonce.rs b/rpc/src/v1/helpers/nonce.rs index 110d8decb46..25ec89f01b0 100644 --- a/rpc/src/v1/helpers/nonce.rs +++ b/rpc/src/v1/helpers/nonce.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::{cmp, mem}; use std::collections::HashMap; diff --git a/rpc/src/v1/helpers/poll_filter.rs b/rpc/src/v1/helpers/poll_filter.rs index 033c8327088..2d7eb956683 100644 --- a/rpc/src/v1/helpers/poll_filter.rs +++ b/rpc/src/v1/helpers/poll_filter.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Helper type with all filter state data. @@ -22,8 +22,8 @@ use std::{ }; use ethereum_types::H256; use parking_lot::Mutex; -use ethcore::filter::Filter; use v1::types::Log; +use types::filter::Filter; pub type BlockNumber = u64; diff --git a/rpc/src/v1/helpers/poll_manager.rs b/rpc/src/v1/helpers/poll_manager.rs index 03387a70939..a0f1684395d 100644 --- a/rpc/src/v1/helpers/poll_manager.rs +++ b/rpc/src/v1/helpers/poll_manager.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Indexes all rpc poll requests. diff --git a/rpc/src/v1/helpers/requests.rs b/rpc/src/v1/helpers/requests.rs index 90fb42f50c0..e71d104449c 100644 --- a/rpc/src/v1/helpers/requests.rs +++ b/rpc/src/v1/helpers/requests.rs @@ -1,24 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use ethereum_types::{U256, Address}; +use ethereum_types::{U256, H256, Address}; use bytes::Bytes; use v1::types::{Origin, TransactionCondition}; -use ethereum_types::H256; /// Transaction request coming from RPC #[derive(Debug, Clone, Default, Eq, PartialEq, Hash)] diff --git a/rpc/src/v1/helpers/secretstore.rs b/rpc/src/v1/helpers/secretstore.rs index f23222824fb..6e1cbca45de 100644 --- a/rpc/src/v1/helpers/secretstore.rs +++ b/rpc/src/v1/helpers/secretstore.rs @@ -1,27 +1,28 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::BTreeSet; use rand::{Rng, OsRng}; +use ethereum_types::{H256, H512}; use ethkey::{self, Public, Secret, Random, Generator, math}; use crypto; use bytes::Bytes; use jsonrpc_core::Error; use v1::helpers::errors; -use v1::types::{H256, H512, EncryptedDocumentKey}; +use v1::types::EncryptedDocumentKey; use tiny_keccak::Keccak; /// Initialization vector length. diff --git a/rpc/src/v1/helpers/signature.rs b/rpc/src/v1/helpers/signature.rs index 47664fc74bf..32827ea1e11 100644 --- a/rpc/src/v1/helpers/signature.rs +++ b/rpc/src/v1/helpers/signature.rs @@ -1,22 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethkey::{recover, public_to_address, Signature}; +use ethereum_types::{H256, U64}; use jsonrpc_core::Result; -use v1::types::{Bytes, RecoveredAccount, H256, U64}; +use v1::types::{Bytes, RecoveredAccount}; use v1::helpers::errors; use v1::helpers::dispatch::eth_data_hash; use hash::keccak; @@ -35,7 +36,7 @@ pub fn verify_signature( } else { keccak(message.0) }; - let v: u64 = v.into(); + let v = v.as_u64(); let is_valid_for_current_chain = match (chain_id, v) { (None, v) if v == 0 || v == 1 => true, (Some(chain_id), v) if v >= 35 => (v - 35) / 2 == chain_id, @@ -53,9 +54,8 @@ pub fn verify_signature( #[cfg(test)] mod tests { use super::*; - use std::sync::Arc; - use ethcore::account_provider::AccountProvider; - use v1::types::H160; + use ethkey::Generator; + use ethereum_types::{H160, U64}; pub fn add_chain_replay_protection(v: u64, chain_id: Option) -> u64 { v + if let Some(n) = chain_id { 35 + n * 2 } else { 0 } @@ -71,9 +71,9 @@ mod tests { /// mocked signer fn sign(should_prefix: bool, data: Vec, signing_chain_id: Option) -> (H160, [u8; 32], [u8; 32], U64) { let hash = if should_prefix { eth_data_hash(data) } else { keccak(data) }; - let accounts = Arc::new(AccountProvider::transient_provider()); - let address = accounts.new_account(&"password123".into()).unwrap(); - let sig = accounts.sign(address, Some("password123".into()), hash).unwrap(); + let account = ethkey::Random.generate().unwrap(); + let address = account.address(); + let sig = ethkey::sign(account.secret(), &hash).unwrap(); let (r, s, v) = (sig.r(), sig.s(), sig.v()); let v = add_chain_replay_protection(v as u64, signing_chain_id); let (r_buf, s_buf) = { diff --git a/rpc/src/v1/helpers/subscribers.rs b/rpc/src/v1/helpers/subscribers.rs index 68712076438..9483d8e3216 100644 --- a/rpc/src/v1/helpers/subscribers.rs +++ b/rpc/src/v1/helpers/subscribers.rs @@ -1,26 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! A map of subscribers. use std::{ops, str}; use std::collections::HashMap; -use jsonrpc_macros::pubsub::{Subscriber, Sink, SubscriptionId}; +use jsonrpc_pubsub::{typed::{Subscriber, Sink}, SubscriptionId}; +use ethereum_types::H64; use rand::{Rng, StdRng}; -use v1::types::H64; #[derive(Debug, Clone, Hash, Eq, PartialEq)] pub struct Id(H64); @@ -36,8 +36,9 @@ impl str::FromStr for Id { } } impl Id { + // TODO: replace `format!` see [#10412](https://github.com/paritytech/parity-ethereum/issues/10412) pub fn as_string(&self) -> String { - format!("0x{:?}", self.0) + format!("{:?}", self.0) } } diff --git a/rpc/src/v1/helpers/subscription_manager.rs b/rpc/src/v1/helpers/subscription_manager.rs index 0641ca2b02f..4f50cad4235 100644 --- a/rpc/src/v1/helpers/subscription_manager.rs +++ b/rpc/src/v1/helpers/subscription_manager.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Generic poll manager for Pub-Sub. diff --git a/rpc/src/v1/helpers/work.rs b/rpc/src/v1/helpers/work.rs index 18047e546dc..661b4cab8b8 100644 --- a/rpc/src/v1/helpers/work.rs +++ b/rpc/src/v1/helpers/work.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Helpers for submit a POW work. @@ -20,17 +20,13 @@ use std::sync::Arc; use rlp; use ethcore::miner::{BlockChainClient, MinerService}; -use ethereum_types::{H64 as EthcoreH64, H256 as EthcoreH256}; +use ethereum_types::{H64, H256}; use jsonrpc_core::Error; -use v1::types::{H64, H256}; use v1::helpers::errors; // Submit a POW work and return the block's hash pub fn submit_work_detail(client: &Arc, miner: &Arc, nonce: H64, pow_hash: H256, mix_hash: H256) -> Result { // TODO [ToDr] Should disallow submissions in case of PoA? - let nonce: EthcoreH64 = nonce.into(); - let pow_hash: EthcoreH256 = pow_hash.into(); - let mix_hash: EthcoreH256 = mix_hash.into(); trace!(target: "miner", "submit_work_detail: Decoded: nonce={}, pow_hash={}, mix_hash={}", nonce, pow_hash, mix_hash); let seal = vec![rlp::encode(&mix_hash), rlp::encode(&nonce)]; let import = miner.submit_seal(pow_hash, seal) diff --git a/rpc/src/v1/impls/debug.rs b/rpc/src/v1/impls/debug.rs index 60d9dcdc834..abec9b1f87c 100644 --- a/rpc/src/v1/impls/debug.rs +++ b/rpc/src/v1/impls/debug.rs @@ -1,25 +1,25 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Debug APIs RPC implementation use std::sync::Arc; use ethcore::client::BlockChainClient; -use transaction::LocalizedTransaction; +use types::transaction::LocalizedTransaction; use jsonrpc_core::Result; use v1::traits::Debug; diff --git a/rpc/src/v1/impls/eth.rs b/rpc/src/v1/impls/eth.rs index 8cf5104fde1..31b8be10c29 100644 --- a/rpc/src/v1/impls/eth.rs +++ b/rpc/src/v1/impls/eth.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Eth rpc implementation. @@ -21,35 +21,33 @@ use std::time::{Instant, Duration, SystemTime, UNIX_EPOCH}; use std::sync::Arc; use rlp::Rlp; -use ethereum_types::{U256, H256, H160, Address}; +use ethereum_types::{Address, H64, H160, H256, U64, U256}; use parking_lot::Mutex; use ethash::{self, SeedHashCompute}; -use ethcore::account_provider::AccountProvider; use ethcore::client::{BlockChainClient, BlockId, TransactionId, UncleId, StateOrBlock, StateClient, StateInfo, Call, EngineInfo, ProvingBlockChainClient}; -use ethcore::filter::Filter as EthcoreFilter; -use ethcore::header::{BlockNumber as EthBlockNumber}; use ethcore::miner::{self, MinerService}; use ethcore::snapshot::SnapshotService; -use ethcore::encoded; -use sync::SyncProvider; -use miner::external::ExternalMinerService; -use transaction::{SignedTransaction, LocalizedTransaction}; use hash::keccak; +use miner::external::ExternalMinerService; +use sync::SyncProvider; +use types::transaction::{SignedTransaction, LocalizedTransaction}; +use types::BlockNumber as EthBlockNumber; +use types::encoded; +use types::filter::Filter as EthcoreFilter; use jsonrpc_core::{BoxFuture, Result}; use jsonrpc_core::futures::future; -use jsonrpc_macros::Trailing; use v1::helpers::{self, errors, limit_logs, fake_sign}; +use v1::helpers::deprecated::{self, DeprecationNotice}; use v1::helpers::dispatch::{FullDispatcher, default_gas_price}; use v1::helpers::block_import::is_major_importing; use v1::traits::Eth; use v1::types::{ RichBlock, Block, BlockTransactions, BlockNumber, Bytes, SyncStatus, SyncInfo, Transaction, CallRequest, Index, Filter, Log, Receipt, Work, EthAccount, StorageProof, - H64 as RpcH64, H256 as RpcH256, H160 as RpcH160, U256 as RpcU256, block_number_to_id, - U64 as RpcU64, + block_number_to_id }; use v1::metadata::Metadata; @@ -106,11 +104,12 @@ pub struct EthClient where client: Arc, snapshot: Arc, sync: Arc, - accounts: Arc, + accounts: Arc Vec

+ Send + Sync>, miner: Arc, external_miner: Arc, seed_compute: Mutex, options: EthClientOptions, + deprecation_notice: DeprecationNotice, } #[derive(Debug)] @@ -185,7 +184,7 @@ impl EthClient, snapshot: &Arc, sync: &Arc, - accounts: &Arc, + accounts: &Arc Vec
+ Send + Sync>, miner: &Arc, em: &Arc, options: EthClientOptions @@ -199,6 +198,7 @@ impl EthClient(miner: &M, best_block: EthBlockNumber, filter: &EthcoreFi } fn check_known(client: &C, number: BlockNumber) -> Result<()> where C: BlockChainClient { - use ethcore::block_status::BlockStatus; + use types::block_status::BlockStatus; let id = match number { BlockNumber::Pending => return Ok(()), @@ -529,16 +529,16 @@ impl Eth for EthClient< } } - fn author(&self) -> Result { + fn author(&self) -> Result { let miner = self.miner.authoring_params().author; if miner == 0.into() { - self.accounts.accounts() - .ok() - .and_then(|a| a.first().cloned()) + (self.accounts)() + .first() + .cloned() .map(From::from) .ok_or_else(|| errors::account("No accounts were found", "")) } else { - Ok(RpcH160::from(miner)) + Ok(H160::from(miner)) } } @@ -546,31 +546,30 @@ impl Eth for EthClient< Ok(self.miner.is_currently_sealing()) } - fn chain_id(&self) -> Result> { - Ok(self.client.signing_chain_id().map(RpcU64::from)) + fn chain_id(&self) -> Result> { + Ok(self.client.signing_chain_id().map(U64::from)) } - fn hashrate(&self) -> Result { - Ok(RpcU256::from(self.external_miner.hashrate())) + fn hashrate(&self) -> Result { + Ok(U256::from(self.external_miner.hashrate())) } - fn gas_price(&self) -> Result { - Ok(RpcU256::from(default_gas_price(&*self.client, &*self.miner, self.options.gas_price_percentile))) + fn gas_price(&self) -> Result { + Ok(U256::from(default_gas_price(&*self.client, &*self.miner, self.options.gas_price_percentile))) } - fn accounts(&self) -> Result> { - let accounts = self.accounts.accounts() - .map_err(|e| errors::account("Could not fetch accounts.", e))?; + fn accounts(&self) -> Result> { + self.deprecation_notice.print("eth_accounts", deprecated::msgs::ACCOUNTS); + + let accounts = (self.accounts)(); Ok(accounts.into_iter().map(Into::into).collect()) } - fn block_number(&self) -> Result { - Ok(RpcU256::from(self.client.chain_info().best_block_number)) + fn block_number(&self) -> Result { + Ok(U256::from(self.client.chain_info().best_block_number)) } - fn balance(&self, address: RpcH160, num: Trailing) -> BoxFuture { - let address = address.into(); - + fn balance(&self, address: H160, num: Option) -> BoxFuture { let num = num.unwrap_or_default(); try_bf!(check_known(&*self.client, num.clone())); @@ -582,11 +581,10 @@ impl Eth for EthClient< Box::new(future::done(res)) } - fn proof(&self, address: RpcH160, values: Vec, num: Trailing) -> BoxFuture { + fn proof(&self, address: H160, values: Vec, num: Option) -> BoxFuture { try_bf!(errors::require_experimental(self.options.allow_experimental_rpcs, "1186")); - let a: H160 = address.clone().into(); - let key1 = keccak(a); + let key1 = keccak(address); let num = num.unwrap_or_default(); let id = match num { @@ -594,14 +592,14 @@ impl Eth for EthClient< BlockNumber::Earliest => BlockId::Earliest, BlockNumber::Latest => BlockId::Latest, BlockNumber::Pending => { - warn!("`Pending` is deprecated and may be removed in future versions. Falling back to `Latest`"); + self.deprecation_notice.print("`Pending`", Some("falling back to `Latest`")); BlockId::Latest } }; try_bf!(check_known(&*self.client, num.clone())); let res = match self.client.prove_account(key1, id) { - Some((proof,account)) => Ok(EthAccount { + Some((proof, account)) => Ok(EthAccount { address: address, balance: account.balance.into(), nonce: account.nonce.into(), @@ -625,11 +623,8 @@ impl Eth for EthClient< Box::new(future::done(res)) } - - fn storage_at(&self, address: RpcH160, pos: RpcU256, num: Trailing) -> BoxFuture { - let address: Address = RpcH160::into(address); - let position: U256 = RpcU256::into(pos); - + fn storage_at(&self, address: H160, position: U256, num: Option) -> BoxFuture { + let address: Address = address.into(); let num = num.unwrap_or_default(); try_bf!(check_known(&*self.client, num.clone())); @@ -641,8 +636,8 @@ impl Eth for EthClient< Box::new(future::done(res)) } - fn transaction_count(&self, address: RpcH160, num: Trailing) -> BoxFuture { - let address: Address = RpcH160::into(address); + fn transaction_count(&self, address: H160, num: Option) -> BoxFuture { + let address: Address = address.into(); let res = match num.unwrap_or_default() { BlockNumber::Pending if self.options.pending_nonce_from_queue => { @@ -675,7 +670,7 @@ impl Eth for EthClient< Box::new(future::done(res)) } - fn block_transaction_count_by_hash(&self, hash: RpcH256) -> BoxFuture> { + fn block_transaction_count_by_hash(&self, hash: H256) -> BoxFuture> { let trx_count = self.client.block(BlockId::Hash(hash.into())) .map(|block| block.transactions_count().into()); let result = Ok(trx_count) @@ -683,7 +678,7 @@ impl Eth for EthClient< Box::new(future::done(result)) } - fn block_transaction_count_by_number(&self, num: BlockNumber) -> BoxFuture> { + fn block_transaction_count_by_number(&self, num: BlockNumber) -> BoxFuture> { Box::new(future::done(match num { BlockNumber::Pending => Ok(Some(self.miner.pending_transaction_hashes(&*self.client).len().into())), @@ -700,7 +695,7 @@ impl Eth for EthClient< })) } - fn block_uncles_count_by_hash(&self, hash: RpcH256) -> BoxFuture> { + fn block_uncles_count_by_hash(&self, hash: H256) -> BoxFuture> { let uncle_count = self.client.block(BlockId::Hash(hash.into())) .map(|block| block.uncles_count().into()); let result = Ok(uncle_count) @@ -708,7 +703,7 @@ impl Eth for EthClient< Box::new(future::done(result)) } - fn block_uncles_count_by_number(&self, num: BlockNumber) -> BoxFuture> { + fn block_uncles_count_by_number(&self, num: BlockNumber) -> BoxFuture> { Box::new(future::done(match num { BlockNumber::Pending => Ok(Some(0.into())), _ => { @@ -724,8 +719,8 @@ impl Eth for EthClient< })) } - fn code_at(&self, address: RpcH160, num: Trailing) -> BoxFuture { - let address: Address = RpcH160::into(address); + fn code_at(&self, address: H160, num: Option) -> BoxFuture { + let address: Address = H160::into(address); let num = num.unwrap_or_default(); try_bf!(check_known(&*self.client, num.clone())); @@ -738,7 +733,7 @@ impl Eth for EthClient< Box::new(future::done(res)) } - fn block_by_hash(&self, hash: RpcH256, include_txs: bool) -> BoxFuture> { + fn block_by_hash(&self, hash: H256, include_txs: bool) -> BoxFuture> { let result = self.rich_block(BlockId::Hash(hash.into()).into(), include_txs) .and_then(errors::check_block_gap(&*self.client, self.options.allow_missing_blocks)); Box::new(future::done(result)) @@ -750,8 +745,7 @@ impl Eth for EthClient< Box::new(future::done(result)) } - fn transaction_by_hash(&self, hash: RpcH256) -> BoxFuture> { - let hash: H256 = hash.into(); + fn transaction_by_hash(&self, hash: H256) -> BoxFuture> { let tx = try_bf!(self.transaction(PendingTransactionId::Hash(hash))).or_else(|| { self.miner.transaction(&hash) .map(|t| Transaction::from_pending(t.pending().clone())) @@ -761,7 +755,7 @@ impl Eth for EthClient< Box::new(future::done(result)) } - fn transaction_by_block_hash_and_index(&self, hash: RpcH256, index: Index) -> BoxFuture> { + fn transaction_by_block_hash_and_index(&self, hash: H256, index: Index) -> BoxFuture> { let id = PendingTransactionId::Location(PendingOrBlock::Block(BlockId::Hash(hash.into())), index.value()); let result = self.transaction(id).and_then( errors::check_block_gap(&*self.client, self.options.allow_missing_blocks)); @@ -782,9 +776,7 @@ impl Eth for EthClient< Box::new(future::done(result)) } - fn transaction_receipt(&self, hash: RpcH256) -> BoxFuture> { - let hash: H256 = hash.into(); - + fn transaction_receipt(&self, hash: H256) -> BoxFuture> { if self.options.allow_pending_receipt_query { let best_block = self.client.chain_info().best_block_number; if let Some(receipt) = self.miner.pending_receipt(best_block, &hash) { @@ -798,7 +790,7 @@ impl Eth for EthClient< Box::new(future::done(result)) } - fn uncle_by_block_hash_and_index(&self, hash: RpcH256, index: Index) -> BoxFuture> { + fn uncle_by_block_hash_and_index(&self, hash: H256, index: Index) -> BoxFuture> { let result = self.uncle(PendingUncleId { id: PendingOrBlock::Block(BlockId::Hash(hash.into())), position: index.value() @@ -833,7 +825,7 @@ impl Eth for EthClient< base_logs(&*self.client, &*self.miner, filter.into()) } - fn work(&self, no_new_work_timeout: Trailing) -> Result { + fn work(&self, no_new_work_timeout: Option) -> Result { let no_new_work_timeout = no_new_work_timeout.unwrap_or_default(); // check if we're still syncing and return empty strings in that case @@ -888,19 +880,19 @@ impl Eth for EthClient< } } - fn submit_work(&self, nonce: RpcH64, pow_hash: RpcH256, mix_hash: RpcH256) -> Result { + fn submit_work(&self, nonce: H64, pow_hash: H256, mix_hash: H256) -> Result { match helpers::submit_work_detail(&self.client, &self.miner, nonce, pow_hash, mix_hash) { Ok(_) => Ok(true), Err(_) => Ok(false), } } - fn submit_hashrate(&self, rate: RpcU256, id: RpcH256) -> Result { + fn submit_hashrate(&self, rate: U256, id: H256) -> Result { self.external_miner.submit_hashrate(rate.into(), id.into()); Ok(true) } - fn send_raw_transaction(&self, raw: Bytes) -> Result { + fn send_raw_transaction(&self, raw: Bytes) -> Result { Rlp::new(&raw.into_vec()).as_val() .map_err(errors::rlp) .and_then(|tx| SignedTransaction::new(tx).map_err(errors::transaction)) @@ -915,11 +907,11 @@ impl Eth for EthClient< .map(Into::into) } - fn submit_transaction(&self, raw: Bytes) -> Result { + fn submit_transaction(&self, raw: Bytes) -> Result { self.send_raw_transaction(raw) } - fn call(&self, request: CallRequest, num: Trailing) -> BoxFuture { + fn call(&self, request: CallRequest, num: Option) -> BoxFuture { let request = CallRequest::into(request); let signed = try_bf!(fake_sign::sign_call(request)); @@ -959,7 +951,7 @@ impl Eth for EthClient< )) } - fn estimate_gas(&self, request: CallRequest, num: Trailing) -> BoxFuture { + fn estimate_gas(&self, request: CallRequest, num: Option) -> BoxFuture { let request = CallRequest::into(request); let signed = try_bf!(fake_sign::sign_call(request)); let num = num.unwrap_or_default(); diff --git a/rpc/src/v1/impls/eth_filter.rs b/rpc/src/v1/impls/eth_filter.rs index 2245100f082..f8d4d290221 100644 --- a/rpc/src/v1/impls/eth_filter.rs +++ b/rpc/src/v1/impls/eth_filter.rs @@ -1,35 +1,35 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Eth Filter RPC implementation use std::sync::Arc; use std::collections::{BTreeSet, VecDeque}; -use ethcore::miner::{self, MinerService}; -use ethcore::filter::Filter as EthcoreFilter; use ethcore::client::{BlockChainClient, BlockId}; -use ethereum_types::H256; +use ethcore::miner::{self, MinerService}; +use ethereum_types::{H256, U256}; use parking_lot::Mutex; +use types::filter::Filter as EthcoreFilter; use jsonrpc_core::{BoxFuture, Result}; use jsonrpc_core::futures::{future, Future}; use jsonrpc_core::futures::future::Either; use v1::traits::EthFilter; -use v1::types::{BlockNumber, Index, Filter, FilterChanges, Log, H256 as RpcH256, U256 as RpcU256}; +use v1::types::{BlockNumber, Index, Filter, FilterChanges, Log}; use v1::helpers::{errors, SyncPollFilter, PollFilter, PollManager, limit_logs}; use v1::impls::eth::pending_logs; @@ -137,7 +137,7 @@ impl Filterable for EthFilterClient where } impl EthFilter for T { - fn new_filter(&self, filter: Filter) -> Result { + fn new_filter(&self, filter: Filter) -> Result { let mut polls = self.polls().lock(); let block_number = self.best_block_number(); let include_pending = filter.to_block == Some(BlockNumber::Pending); @@ -150,7 +150,7 @@ impl EthFilter for T { Ok(id.into()) } - fn new_block_filter(&self) -> Result { + fn new_block_filter(&self) -> Result { let mut polls = self.polls().lock(); // +1, since we don't want to include the current block let id = polls.create_poll(SyncPollFilter::new(PollFilter::Block { @@ -160,7 +160,7 @@ impl EthFilter for T { Ok(id.into()) } - fn new_pending_transaction_filter(&self) -> Result { + fn new_pending_transaction_filter(&self) -> Result { let mut polls = self.polls().lock(); let pending_transactions = self.pending_transaction_hashes(); let id = polls.create_poll(SyncPollFilter::new(PollFilter::PendingTransaction(pending_transactions))); @@ -191,7 +191,7 @@ impl EthFilter for T { match self.block_hash(block_number) { Some(hash) => { *last_block_number = n; - hashes.push(RpcH256::from(hash)); + hashes.push(H256::from(hash)); // Only keep the most recent history if recent_reported_hashes.len() >= PollFilter::MAX_BLOCK_HISTORY_SIZE { recent_reported_hashes.pop_back(); diff --git a/rpc/src/v1/impls/eth_pubsub.rs b/rpc/src/v1/impls/eth_pubsub.rs index 0e39f4e314f..b4baf5aa4d7 100644 --- a/rpc/src/v1/impls/eth_pubsub.rs +++ b/rpc/src/v1/impls/eth_pubsub.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Eth PUB-SUB rpc implementation. @@ -21,9 +21,7 @@ use std::collections::BTreeMap; use jsonrpc_core::{BoxFuture, Result, Error}; use jsonrpc_core::futures::{self, Future, IntoFuture}; -use jsonrpc_macros::Trailing; -use jsonrpc_macros::pubsub::{Sink, Subscriber}; -use jsonrpc_pubsub::SubscriptionId; +use jsonrpc_pubsub::{SubscriptionId, typed::{Sink, Subscriber}}; use v1::helpers::{errors, limit_logs, Subscribers}; use v1::helpers::light_fetch::LightFetch; @@ -31,17 +29,19 @@ use v1::metadata::Metadata; use v1::traits::EthPubSub; use v1::types::{pubsub, RichHeader, Log}; -use ethcore::encoded; -use ethcore::filter::Filter as EthFilter; use ethcore::client::{BlockChainClient, ChainNotify, NewBlocks, ChainRouteType, BlockId}; -use sync::LightSync; +use ethereum_types::H256; use light::cache::Cache; -use light::on_demand::OnDemand; use light::client::{LightChainClient, LightChainNotify}; +use light::on_demand::OnDemand; use parity_runtime::Executor; -use ethereum_types::H256; use parking_lot::{RwLock, Mutex}; +use sync::{LightSyncProvider, LightNetworkDispatcher, ManageNetwork}; + +use types::encoded; +use types::filter::Filter as EthFilter; + type Client = Sink; /// Eth PubSub implementation. @@ -89,12 +89,15 @@ impl EthPubSubClient { } } -impl EthPubSubClient { +impl EthPubSubClient> +where + S: LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ /// Creates a new `EthPubSubClient` for `LightClient`. pub fn light( client: Arc, on_demand: Arc, - sync: Arc, + sync: Arc, cache: Arc>, executor: Executor, gas_price_percentile: usize, @@ -191,7 +194,10 @@ pub trait LightClient: Send + Sync { fn logs(&self, filter: EthFilter) -> BoxFuture>; } -impl LightClient for LightFetch { +impl LightClient for LightFetch +where + S: LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ fn block_header(&self, id: BlockId) -> Option { self.client.block_header(id) } @@ -202,10 +208,7 @@ impl LightClient for LightFetch { } impl LightChainNotify for ChainNotificationHandler { - fn new_headers( - &self, - enacted: &[H256], - ) { + fn new_headers(&self, enacted: &[H256]) { let headers = enacted .iter() .filter_map(|hash| self.client.block_header(BlockId::Hash(*hash))) @@ -262,7 +265,7 @@ impl EthPubSub for EthPubSubClient { _meta: Metadata, subscriber: Subscriber, kind: pubsub::Kind, - params: Trailing, + params: Option, ) { let error = match (kind, params.into()) { (pubsub::Kind::NewHeads, None) => { @@ -299,7 +302,7 @@ impl EthPubSub for EthPubSubClient { let _ = subscriber.reject(error); } - fn unsubscribe(&self, id: SubscriptionId) -> Result { + fn unsubscribe(&self, _: Option, id: SubscriptionId) -> Result { let res = self.heads_subscribers.write().remove(&id).is_some(); let res2 = self.logs_subscribers.write().remove(&id).is_some(); let res3 = self.transactions_subscribers.write().remove(&id).is_some(); diff --git a/rpc/src/v1/impls/light/eth.rs b/rpc/src/v1/impls/light/eth.rs index dffb88abf05..909d4c24439 100644 --- a/rpc/src/v1/impls/light/eth.rs +++ b/rpc/src/v1/impls/light/eth.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Eth RPC interface for the light client. @@ -22,53 +22,55 @@ use std::sync::Arc; use jsonrpc_core::{Result, BoxFuture}; use jsonrpc_core::futures::{future, Future}; use jsonrpc_core::futures::future::Either; -use jsonrpc_macros::Trailing; use light::cache::Cache as LightDataCache; use light::client::LightChainClient; use light::{cht, TransactionQueue}; use light::on_demand::{request, OnDemand}; -use ethcore::account_provider::AccountProvider; -use ethcore::encoded; -use ethcore::filter::Filter as EthcoreFilter; -use ethcore::ids::BlockId; -use sync::LightSync; +use ethereum_types::{Address, H64, H160, H256, U64, U256}; use hash::{KECCAK_NULL_RLP, KECCAK_EMPTY_LIST_RLP}; -use ethereum_types::U256; use parking_lot::{RwLock, Mutex}; use rlp::Rlp; -use transaction::SignedTransaction; +use types::transaction::SignedTransaction; +use types::encoded; +use types::filter::Filter as EthcoreFilter; +use types::ids::BlockId; use v1::impls::eth_filter::Filterable; use v1::helpers::{errors, limit_logs}; use v1::helpers::{SyncPollFilter, PollManager}; +use v1::helpers::deprecated::{self, DeprecationNotice}; use v1::helpers::light_fetch::{self, LightFetch}; use v1::traits::Eth; use v1::types::{ - RichBlock, Block, BlockTransactions, BlockNumber, LightBlockNumber, Bytes, SyncStatus, SyncInfo, - Transaction, CallRequest, Index, Filter, Log, Receipt, Work, EthAccount, - H64 as RpcH64, H256 as RpcH256, H160 as RpcH160, U256 as RpcU256, - U64 as RpcU64, + RichBlock, Block, BlockTransactions, BlockNumber, LightBlockNumber, Bytes, SyncStatus as RpcSyncStatus, + SyncInfo as RpcSyncInfo, Transaction, CallRequest, Index, Filter, Log, Receipt, Work, EthAccount }; use v1::metadata::Metadata; +use sync::{LightSyncInfo, LightSyncProvider, LightNetworkDispatcher, ManageNetwork}; + const NO_INVALID_BACK_REFS: &str = "Fails only on invalid back-references; back-references here known to be valid; qed"; /// Light client `ETH` (and filter) RPC. -pub struct EthClient { - sync: Arc, - client: Arc, +pub struct EthClient { + sync: Arc, + client: Arc, on_demand: Arc, transaction_queue: Arc>, - accounts: Arc, + accounts: Arc Vec
+ Send + Sync>, cache: Arc>, polls: Mutex>, poll_lifetime: u32, gas_price_percentile: usize, + deprecation_notice: DeprecationNotice, } -impl Clone for EthClient { +impl Clone for EthClient +where + S: LightSyncProvider + LightNetworkDispatcher + 'static +{ fn clone(&self) -> Self { // each instance should have its own poll manager. EthClient { @@ -81,19 +83,24 @@ impl Clone for EthClient { polls: Mutex::new(PollManager::new(self.poll_lifetime)), poll_lifetime: self.poll_lifetime, gas_price_percentile: self.gas_price_percentile, + deprecation_notice: Default::default(), } } } -impl EthClient { +impl EthClient +where + C: LightChainClient + 'static, + S: LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ /// Create a new `EthClient` with a handle to the light sync instance, client, /// and on-demand request service, which is assumed to be attached as a handler. pub fn new( - sync: Arc, - client: Arc, + sync: Arc, + client: Arc, on_demand: Arc, transaction_queue: Arc>, - accounts: Arc, + accounts: Arc Vec
+ Send + Sync>, cache: Arc>, gas_price_percentile: usize, poll_lifetime: u32 @@ -108,11 +115,13 @@ impl EthClient { polls: Mutex::new(PollManager::new(poll_lifetime)), poll_lifetime, gas_price_percentile, + deprecation_notice: Default::default(), } } /// Create a light data fetcher instance. - fn fetcher(&self) -> LightFetch { + fn fetcher(&self) -> LightFetch + { LightFetch { client: self.client.clone(), on_demand: self.on_demand.clone(), @@ -209,21 +218,25 @@ impl EthClient { } } -impl Eth for EthClient { +impl Eth for EthClient +where + C: LightChainClient + 'static, + S: LightSyncInfo + LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ type Metadata = Metadata; fn protocol_version(&self) -> Result { Ok(format!("{}", ::light::net::MAX_PROTOCOL_VERSION)) } - fn syncing(&self) -> Result { + fn syncing(&self) -> Result { if self.sync.is_major_importing() { let chain_info = self.client.chain_info(); let current_block = U256::from(chain_info.best_block_number); let highest_block = self.sync.highest_block().map(U256::from) .unwrap_or_else(|| current_block); - Ok(SyncStatus::Info(SyncInfo { + Ok(RpcSyncStatus::Info(RpcSyncInfo { starting_block: U256::from(self.sync.start_block()).into(), current_block: current_block.into(), highest_block: highest_block.into(), @@ -231,14 +244,14 @@ impl Eth for EthClient { warp_chunks_processed: None, })) } else { - Ok(SyncStatus::None) + Ok(RpcSyncStatus::None) } } - fn author(&self) -> Result { - self.accounts.accounts() - .ok() - .and_then(|a| a.first().cloned()) + fn author(&self) -> Result { + (self.accounts)() + .first() + .cloned() .map(From::from) .ok_or_else(|| errors::account("No accounts were found", "")) } @@ -247,41 +260,44 @@ impl Eth for EthClient { Ok(false) } - fn chain_id(&self) -> Result> { - Ok(self.client.signing_chain_id().map(RpcU64::from)) + fn chain_id(&self) -> Result> { + Ok(self.client.signing_chain_id().map(U64::from)) } - fn hashrate(&self) -> Result { + fn hashrate(&self) -> Result { Ok(Default::default()) } - fn gas_price(&self) -> Result { + fn gas_price(&self) -> Result { Ok(self.cache.lock().gas_price_corpus() .and_then(|c| c.percentile(self.gas_price_percentile).cloned()) - .map(RpcU256::from) + .map(U256::from) .unwrap_or_else(Default::default)) } - fn accounts(&self) -> Result> { - self.accounts.accounts() - .map_err(|e| errors::account("Could not fetch accounts.", e)) - .map(|accs| accs.into_iter().map(Into::::into).collect()) + fn accounts(&self) -> Result> { + self.deprecation_notice.print("eth_accounts", deprecated::msgs::ACCOUNTS); + + Ok((self.accounts)() + .into_iter() + .map(Into::into) + .collect()) } - fn block_number(&self) -> Result { + fn block_number(&self) -> Result { Ok(self.client.chain_info().best_block_number.into()) } - fn balance(&self, address: RpcH160, num: Trailing) -> BoxFuture { + fn balance(&self, address: H160, num: Option) -> BoxFuture { Box::new(self.fetcher().account(address.into(), num.unwrap_or_default().to_block_id()) .map(|acc| acc.map_or(0.into(), |a| a.balance).into())) } - fn storage_at(&self, _address: RpcH160, _key: RpcU256, _num: Trailing) -> BoxFuture { + fn storage_at(&self, _address: H160, _key: U256, _num: Option) -> BoxFuture { Box::new(future::err(errors::unimplemented(None))) } - fn block_by_hash(&self, hash: RpcH256, include_txs: bool) -> BoxFuture> { + fn block_by_hash(&self, hash: H256, include_txs: bool) -> BoxFuture> { Box::new(self.rich_block(BlockId::Hash(hash.into()), include_txs).map(Some)) } @@ -289,12 +305,12 @@ impl Eth for EthClient { Box::new(self.rich_block(num.to_block_id(), include_txs).map(Some)) } - fn transaction_count(&self, address: RpcH160, num: Trailing) -> BoxFuture { + fn transaction_count(&self, address: H160, num: Option) -> BoxFuture { Box::new(self.fetcher().account(address.into(), num.unwrap_or_default().to_block_id()) .map(|acc| acc.map_or(0.into(), |a| a.nonce).into())) } - fn block_transaction_count_by_hash(&self, hash: RpcH256) -> BoxFuture> { + fn block_transaction_count_by_hash(&self, hash: H256) -> BoxFuture> { let (sync, on_demand) = (self.sync.clone(), self.on_demand.clone()); Box::new(self.fetcher().header(BlockId::Hash(hash.into())).and_then(move |hdr| { @@ -310,7 +326,7 @@ impl Eth for EthClient { })) } - fn block_transaction_count_by_number(&self, num: BlockNumber) -> BoxFuture> { + fn block_transaction_count_by_number(&self, num: BlockNumber) -> BoxFuture> { let (sync, on_demand) = (self.sync.clone(), self.on_demand.clone()); Box::new(self.fetcher().header(num.to_block_id()).and_then(move |hdr| { @@ -326,7 +342,7 @@ impl Eth for EthClient { })) } - fn block_uncles_count_by_hash(&self, hash: RpcH256) -> BoxFuture> { + fn block_uncles_count_by_hash(&self, hash: H256) -> BoxFuture> { let (sync, on_demand) = (self.sync.clone(), self.on_demand.clone()); Box::new(self.fetcher().header(BlockId::Hash(hash.into())).and_then(move |hdr| { @@ -342,7 +358,7 @@ impl Eth for EthClient { })) } - fn block_uncles_count_by_number(&self, num: BlockNumber) -> BoxFuture> { + fn block_uncles_count_by_number(&self, num: BlockNumber) -> BoxFuture> { let (sync, on_demand) = (self.sync.clone(), self.on_demand.clone()); Box::new(self.fetcher().header(num.to_block_id()).and_then(move |hdr| { @@ -358,11 +374,11 @@ impl Eth for EthClient { })) } - fn code_at(&self, address: RpcH160, num: Trailing) -> BoxFuture { + fn code_at(&self, address: H160, num: Option) -> BoxFuture { Box::new(self.fetcher().code(address.into(), num.unwrap_or_default().to_block_id()).map(Into::into)) } - fn send_raw_transaction(&self, raw: Bytes) -> Result { + fn send_raw_transaction(&self, raw: Bytes) -> Result { let best_header = self.client.best_block_header().decode().map_err(errors::decode)?; Rlp::new(&raw.into_vec()).as_val() @@ -381,11 +397,11 @@ impl Eth for EthClient { .map(Into::into) } - fn submit_transaction(&self, raw: Bytes) -> Result { + fn submit_transaction(&self, raw: Bytes) -> Result { self.send_raw_transaction(raw) } - fn call(&self, req: CallRequest, num: Trailing) -> BoxFuture { + fn call(&self, req: CallRequest, num: Option) -> BoxFuture { Box::new(self.fetcher().proved_read_only_execution(req, num).and_then(|res| { match res { Ok(exec) => Ok(exec.output.into()), @@ -394,7 +410,7 @@ impl Eth for EthClient { })) } - fn estimate_gas(&self, req: CallRequest, num: Trailing) -> BoxFuture { + fn estimate_gas(&self, req: CallRequest, num: Option) -> BoxFuture { // TODO: binary chop for more accurate estimates. Box::new(self.fetcher().proved_read_only_execution(req, num).and_then(|res| { match res { @@ -404,7 +420,7 @@ impl Eth for EthClient { })) } - fn transaction_by_hash(&self, hash: RpcH256) -> BoxFuture> { + fn transaction_by_hash(&self, hash: H256) -> BoxFuture> { let hash = hash.into(); { @@ -419,7 +435,7 @@ impl Eth for EthClient { Box::new(self.fetcher().transaction_by_hash(hash).map(|x| x.map(|(tx, _)| tx))) } - fn transaction_by_block_hash_and_index(&self, hash: RpcH256, idx: Index) -> BoxFuture> { + fn transaction_by_block_hash_and_index(&self, hash: H256, idx: Index) -> BoxFuture> { Box::new(self.fetcher().block(BlockId::Hash(hash.into())).map(move |block| { light_fetch::extract_transaction_at_index(block, idx.value()) })) @@ -431,9 +447,9 @@ impl Eth for EthClient { })) } - fn transaction_receipt(&self, hash: RpcH256) -> BoxFuture> { + fn transaction_receipt(&self, hash: H256) -> BoxFuture> { let fetcher = self.fetcher(); - Box::new(fetcher.transaction_by_hash(hash.clone().into()).and_then(move |tx| { + Box::new(fetcher.transaction_by_hash(hash.into()).and_then(move |tx| { // the block hash included in the transaction object here has // already been checked for canonicality and whether it contains // the transaction. @@ -461,7 +477,7 @@ impl Eth for EthClient { })) } - fn uncle_by_block_hash_and_index(&self, hash: RpcH256, idx: Index) -> BoxFuture> { + fn uncle_by_block_hash_and_index(&self, hash: H256, idx: Index) -> BoxFuture> { let client = self.client.clone(); Box::new(self.fetcher().block(BlockId::Hash(hash.into())).map(move |block| { extract_uncle_at_index(block, idx, client) @@ -475,7 +491,7 @@ impl Eth for EthClient { })) } - fn proof(&self, _address: RpcH160, _values:Vec, _num: Trailing) -> BoxFuture { + fn proof(&self, _address: H160, _values:Vec, _num: Option) -> BoxFuture { Box::new(future::err(errors::unimplemented(None))) } @@ -505,28 +521,32 @@ impl Eth for EthClient { }).map(move |logs| limit_logs(logs, limit))) } - fn work(&self, _timeout: Trailing) -> Result { + fn work(&self, _timeout: Option) -> Result { Err(errors::light_unimplemented(None)) } - fn submit_work(&self, _nonce: RpcH64, _pow_hash: RpcH256, _mix_hash: RpcH256) -> Result { + fn submit_work(&self, _nonce: H64, _pow_hash: H256, _mix_hash: H256) -> Result { Err(errors::light_unimplemented(None)) } - fn submit_hashrate(&self, _rate: RpcU256, _id: RpcH256) -> Result { + fn submit_hashrate(&self, _rate: U256, _id: H256) -> Result { Err(errors::light_unimplemented(None)) } } // This trait implementation triggers a blanked impl of `EthFilter`. -impl Filterable for EthClient { +impl Filterable for EthClient +where + C: LightChainClient + 'static, + S: LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ fn best_block_number(&self) -> u64 { self.client.chain_info().best_block_number } - fn block_hash(&self, id: BlockId) -> Option<::ethereum_types::H256> { + fn block_hash(&self, id: BlockId) -> Option { self.client.block_hash(id) } - fn pending_transaction_hashes(&self) -> BTreeSet<::ethereum_types::H256> { + fn pending_transaction_hashes(&self) -> BTreeSet { BTreeSet::new() } diff --git a/rpc/src/v1/impls/light/mod.rs b/rpc/src/v1/impls/light/mod.rs index 40f1df89907..c159514582b 100644 --- a/rpc/src/v1/impls/light/mod.rs +++ b/rpc/src/v1/impls/light/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! RPC implementations for the light client. //! diff --git a/rpc/src/v1/impls/light/net.rs b/rpc/src/v1/impls/light/net.rs index 4dbc9d19085..3f73e010b93 100644 --- a/rpc/src/v1/impls/light/net.rs +++ b/rpc/src/v1/impls/light/net.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Net rpc implementation. use std::sync::Arc; diff --git a/rpc/src/v1/impls/light/parity.rs b/rpc/src/v1/impls/light/parity.rs index 397167ad3eb..da7425e1f4c 100644 --- a/rpc/src/v1/impls/light/parity.rs +++ b/rpc/src/v1/impls/light/parity.rs @@ -1,55 +1,54 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity-specific rpc implementation. use std::sync::Arc; -use std::collections::{BTreeMap, HashSet}; +use std::collections::BTreeMap; use version::version_data; use crypto::DEFAULT_MAC; use ethkey::{crypto::ecies, Brain, Generator}; use ethstore::random_phrase; -use sync::LightSyncProvider; -use ethcore::account_provider::AccountProvider; +use sync::{LightSyncInfo, LightSyncProvider, LightNetworkDispatcher, ManageNetwork}; +use ethereum_types::{H64, H160, H256, H512, U64, U256}; use ethcore_logger::RotatingLogger; use jsonrpc_core::{Result, BoxFuture}; use jsonrpc_core::futures::{future, Future}; -use jsonrpc_macros::Trailing; -use v1::helpers::{self, errors, ipfs, SigningQueue, SignerService, NetworkSettings, verify_signature}; +use v1::helpers::{self, errors, ipfs, NetworkSettings, verify_signature}; +use v1::helpers::external_signer::{SignerService, SigningQueue}; use v1::helpers::dispatch::LightDispatcher; use v1::helpers::light_fetch::{LightFetch, light_all_transactions}; use v1::metadata::Metadata; use v1::traits::Parity; use v1::types::{ - Bytes, U256, U64, H64, H160, H256, H512, CallRequest, + Bytes, CallRequest, Peers, Transaction, RpcSettings, Histogram, TransactionStats, LocalTransactionStatus, LightBlockNumber, ChainStatus, Receipt, BlockNumber, ConsensusCapability, VersionInfo, - OperationsInfo, AccountInfo, HwAccountInfo, Header, RichHeader, RecoveredAccount, + OperationsInfo, Header, RichHeader, RecoveredAccount, Log, Filter, }; use Host; /// Parity implementation for light client. -pub struct ParityClient { - light_dispatch: Arc, - accounts: Arc, +pub struct ParityClient { + light_dispatch: Arc>, logger: Arc, settings: Arc, signer: Option>, @@ -57,11 +56,13 @@ pub struct ParityClient { gas_price_percentile: usize, } -impl ParityClient { +impl ParityClient +where + S: LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ /// Creates new `ParityClient`. pub fn new( - light_dispatch: Arc, - accounts: Arc, + light_dispatch: Arc>, logger: Arc, settings: Arc, signer: Option>, @@ -70,7 +71,6 @@ impl ParityClient { ) -> Self { ParityClient { light_dispatch, - accounts, logger, settings, signer, @@ -80,7 +80,8 @@ impl ParityClient { } /// Create a light blockchain data fetcher. - fn fetcher(&self) -> LightFetch { + fn fetcher(&self) -> LightFetch + { LightFetch { client: self.light_dispatch.client.clone(), on_demand: self.light_dispatch.on_demand.clone(), @@ -91,52 +92,12 @@ impl ParityClient { } } -impl Parity for ParityClient { +impl Parity for ParityClient +where + S: LightSyncInfo + LightSyncProvider + LightNetworkDispatcher + ManageNetwork + 'static +{ type Metadata = Metadata; - fn accounts_info(&self) -> Result> { - let store = &self.accounts; - let dapp_accounts = store - .accounts() - .map_err(|e| errors::account("Could not fetch accounts.", e))? - .into_iter().collect::>(); - - let info = store.accounts_info().map_err(|e| errors::account("Could not fetch account info.", e))?; - let other = store.addresses_info(); - - Ok(info - .into_iter() - .chain(other.into_iter()) - .filter(|&(ref a, _)| dapp_accounts.contains(a)) - .map(|(a, v)| (H160::from(a), AccountInfo { name: v.name })) - .collect() - ) - } - - fn hardware_accounts_info(&self) -> Result> { - let store = &self.accounts; - let info = store.hardware_accounts_info().map_err(|e| errors::account("Could not fetch account info.", e))?; - Ok(info - .into_iter() - .map(|(a, v)| (H160::from(a), HwAccountInfo { name: v.name, manufacturer: v.meta })) - .collect() - ) - } - - fn locked_hardware_accounts_info(&self) -> Result> { - let store = &self.accounts; - Ok(store.locked_hardware_accounts().map_err(|e| errors::account("Error communicating with hardware wallet.", e))?) - } - - fn default_account(&self) -> Result { - Ok(self.accounts - .accounts() - .ok() - .and_then(|accounts| accounts.get(0).cloned()) - .map(|acc| acc.into()) - .unwrap_or_default()) - } - fn transactions_limit(&self) -> Result { Ok(usize::max_value()) } @@ -232,11 +193,11 @@ impl Parity for ParityClient { Ok(Brain::new(phrase).generate().unwrap().address().into()) } - fn list_accounts(&self, _: u64, _: Option, _: Trailing) -> Result>> { + fn list_accounts(&self, _: u64, _: Option, _: Option) -> Result>> { Err(errors::light_unimplemented(None)) } - fn list_storage_keys(&self, _: H160, _: u64, _: Option, _: Trailing) -> Result>> { + fn list_storage_keys(&self, _: H160, _: u64, _: Option, _: Option) -> Result>> { Err(errors::light_unimplemented(None)) } @@ -246,7 +207,7 @@ impl Parity for ParityClient { .map(Into::into) } - fn pending_transactions(&self, limit: Trailing) -> Result> { + fn pending_transactions(&self, limit: Option) -> Result> { let txq = self.light_dispatch.transaction_queue.read(); let chain_info = self.light_dispatch.client.chain_info(); Ok( @@ -365,8 +326,8 @@ impl Parity for ParityClient { }) } - fn block_header(&self, number: Trailing) -> BoxFuture { - use ethcore::encoded; + fn block_header(&self, number: Option) -> BoxFuture { + use types::encoded; let engine = self.light_dispatch.client.engine().clone(); let from_encoded = move |encoded: encoded::Header| { @@ -399,7 +360,7 @@ impl Parity for ParityClient { Box::new(self.fetcher().header(id).and_then(from_encoded)) } - fn block_receipts(&self, number: Trailing) -> BoxFuture> { + fn block_receipts(&self, number: Option) -> BoxFuture> { let id = number.unwrap_or_default().to_block_id(); Box::new(self.fetcher().receipts(id).and_then(|receipts| Ok(receipts.into_iter().map(Into::into).collect()))) } @@ -408,7 +369,7 @@ impl Parity for ParityClient { ipfs::cid(content) } - fn call(&self, _requests: Vec, _block: Trailing) -> Result> { + fn call(&self, _requests: Vec, _block: Option) -> Result> { Err(errors::light_unimplemented(None)) } @@ -418,7 +379,7 @@ impl Parity for ParityClient { fn status(&self) -> Result<()> { let has_peers = self.settings.is_dev_chain || self.light_dispatch.sync.peer_numbers().connected > 0; - let is_importing = self.light_dispatch.sync.is_major_importing(); + let is_importing = (*self.light_dispatch.sync).is_major_importing(); if has_peers && !is_importing { Ok(()) diff --git a/rpc/src/v1/impls/light/parity_set.rs b/rpc/src/v1/impls/light/parity_set.rs index ca4eb60cb45..080e9402a1b 100644 --- a/rpc/src/v1/impls/light/parity_set.rs +++ b/rpc/src/v1/impls/light/parity_set.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity-specific rpc interface for operations altering the settings. //! Implementation for light client. @@ -20,15 +20,16 @@ use std::io; use std::sync::Arc; -use sync::ManageNetwork; +use ethereum_types::{H160, H256, U256}; use fetch::{self, Fetch}; use hash::keccak_buffer; +use sync::ManageNetwork; use jsonrpc_core::{Result, BoxFuture}; use jsonrpc_core::futures::Future; use v1::helpers::errors; use v1::traits::ParitySet; -use v1::types::{Bytes, H160, H256, U256, ReleaseInfo, Transaction}; +use v1::types::{Bytes, ReleaseInfo, Transaction}; /// Parity-specific rpc interface for operations altering the settings. pub struct ParitySetClient { @@ -67,7 +68,7 @@ impl ParitySet for ParitySetClient { Err(errors::light_unimplemented(None)) } - fn set_engine_signer(&self, _address: H160, _password: String) -> Result { + fn set_engine_signer_secret(&self, _secret: H256) -> Result { Err(errors::light_unimplemented(None)) } diff --git a/rpc/src/v1/impls/light/trace.rs b/rpc/src/v1/impls/light/trace.rs index 483b193653c..a560f980e78 100644 --- a/rpc/src/v1/impls/light/trace.rs +++ b/rpc/src/v1/impls/light/trace.rs @@ -1,27 +1,28 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Traces api implementation. +use ethereum_types::H256; use jsonrpc_core::Result; -use jsonrpc_macros::Trailing; use v1::Metadata; use v1::traits::Traces; use v1::helpers::errors; -use v1::types::{TraceFilter, LocalizedTrace, BlockNumber, Index, CallRequest, Bytes, TraceResults, TraceResultsWithTransactionHash, TraceOptions, H256}; +use v1::types::{TraceFilter, LocalizedTrace, BlockNumber, Index, CallRequest, Bytes, TraceResults, + TraceResultsWithTransactionHash, TraceOptions}; /// Traces api implementation. // TODO: all calling APIs should be possible w. proved remote TX execution. @@ -46,15 +47,15 @@ impl Traces for TracesClient { Err(errors::light_unimplemented(None)) } - fn call(&self, _request: CallRequest, _flags: TraceOptions, _block: Trailing) -> Result { + fn call(&self, _request: CallRequest, _flags: TraceOptions, _block: Option) -> Result { Err(errors::light_unimplemented(None)) } - fn call_many(&self, _request: Vec<(CallRequest, TraceOptions)>, _block: Trailing) -> Result> { + fn call_many(&self, _request: Vec<(CallRequest, TraceOptions)>, _block: Option) -> Result> { Err(errors::light_unimplemented(None)) } - fn raw_transaction(&self, _raw_transaction: Bytes, _flags: TraceOptions, _block: Trailing) -> Result { + fn raw_transaction(&self, _raw_transaction: Bytes, _flags: TraceOptions, _block: Option) -> Result { Err(errors::light_unimplemented(None)) } diff --git a/rpc/src/v1/impls/mod.rs b/rpc/src/v1/impls/mod.rs index 44bc62883a3..ba1cc100e8a 100644 --- a/rpc/src/v1/impls/mod.rs +++ b/rpc/src/v1/impls/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Ethereum rpc interface implementation. @@ -22,12 +22,15 @@ mod eth_filter; mod eth_pubsub; mod net; mod parity; +#[cfg(any(test, feature = "accounts"))] mod parity_accounts; mod parity_set; +#[cfg(any(test, feature = "accounts"))] mod personal; mod private; mod pubsub; mod rpc; +#[cfg(any(test, feature = "accounts"))] mod secretstore; mod signer; mod signing; @@ -43,12 +46,17 @@ pub use self::eth_filter::EthFilterClient; pub use self::eth_pubsub::EthPubSubClient; pub use self::net::NetClient; pub use self::parity::ParityClient; +#[cfg(any(test, feature = "accounts"))] pub use self::parity_accounts::ParityAccountsClient; pub use self::parity_set::ParitySetClient; +#[cfg(any(test, feature = "accounts"))] +pub use self::parity_set::accounts::ParitySetAccountsClient; +#[cfg(any(test, feature = "accounts"))] pub use self::personal::PersonalClient; pub use self::private::PrivateClient; pub use self::pubsub::PubSubClient; pub use self::rpc::RpcClient; +#[cfg(any(test, feature = "accounts"))] pub use self::secretstore::SecretStoreClient; pub use self::signer::SignerClient; pub use self::signing::SigningQueueClient; diff --git a/rpc/src/v1/impls/net.rs b/rpc/src/v1/impls/net.rs index e86bd253f7a..188d67cd5aa 100644 --- a/rpc/src/v1/impls/net.rs +++ b/rpc/src/v1/impls/net.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Net rpc implementation. use std::sync::Arc; diff --git a/rpc/src/v1/impls/parity.rs b/rpc/src/v1/impls/parity.rs index c2d57a345f7..d985f33f625 100644 --- a/rpc/src/v1/impls/parity.rs +++ b/rpc/src/v1/impls/parity.rs @@ -1,54 +1,52 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity-specific rpc implementation. use std::sync::Arc; use std::str::FromStr; -use std::collections::{BTreeMap, HashSet}; - -use ethereum_types::Address; -use version::version_data; +use std::collections::BTreeMap; use crypto::DEFAULT_MAC; -use ethkey::{crypto::ecies, Brain, Generator}; -use ethstore::random_phrase; -use sync::{SyncProvider, ManageNetwork}; -use ethcore::account_provider::AccountProvider; +use ethereum_types::{Address, H64, H160, H256, H512, U64, U256}; use ethcore::client::{BlockChainClient, StateClient, Call}; -use ethcore::ids::BlockId; use ethcore::miner::{self, MinerService}; use ethcore::snapshot::{SnapshotService, RestorationStatus}; use ethcore::state::StateInfo; use ethcore_logger::RotatingLogger; -use updater::{Service as UpdateService}; -use jsonrpc_core::{BoxFuture, Result}; +use ethkey::{crypto::ecies, Brain, Generator}; +use ethstore::random_phrase; use jsonrpc_core::futures::future; -use jsonrpc_macros::Trailing; +use jsonrpc_core::{BoxFuture, Result}; +use sync::{SyncProvider, ManageNetwork}; +use types::ids::BlockId; +use updater::{Service as UpdateService}; +use version::version_data; use v1::helpers::block_import::is_major_importing; -use v1::helpers::{self, errors, fake_sign, ipfs, SigningQueue, SignerService, NetworkSettings, verify_signature}; +use v1::helpers::{self, errors, fake_sign, ipfs, NetworkSettings, verify_signature}; +use v1::helpers::external_signer::{SigningQueue, SignerService}; use v1::metadata::Metadata; use v1::traits::Parity; use v1::types::{ - Bytes, U256, H64, U64, H160, H256, H512, CallRequest, + Bytes, CallRequest, Peers, Transaction, RpcSettings, Histogram, TransactionStats, LocalTransactionStatus, BlockNumber, ConsensusCapability, VersionInfo, OperationsInfo, ChainStatus, Log, Filter, - AccountInfo, HwAccountInfo, RichHeader, Receipt, RecoveredAccount, + RichHeader, Receipt, RecoveredAccount, block_number_to_id }; use Host; @@ -60,7 +58,6 @@ pub struct ParityClient { updater: Arc, sync: Arc, net: Arc, - accounts: Arc, logger: Arc, settings: Arc, signer: Option>, @@ -78,7 +75,6 @@ impl ParityClient where sync: Arc, updater: Arc, net: Arc, - accounts: Arc, logger: Arc, settings: Arc, signer: Option>, @@ -91,7 +87,6 @@ impl ParityClient where sync, updater, net, - accounts, logger, settings, signer, @@ -109,43 +104,6 @@ impl Parity for ParityClient where { type Metadata = Metadata; - fn accounts_info(&self) -> Result> { - let dapp_accounts = self.accounts.accounts() - .map_err(|e| errors::account("Could not fetch accounts.", e))? - .into_iter().collect::>(); - - let info = self.accounts.accounts_info().map_err(|e| errors::account("Could not fetch account info.", e))?; - let other = self.accounts.addresses_info(); - - Ok(info - .into_iter() - .chain(other.into_iter()) - .filter(|&(ref a, _)| dapp_accounts.contains(a)) - .map(|(a, v)| (H160::from(a), AccountInfo { name: v.name })) - .collect() - ) - } - - fn hardware_accounts_info(&self) -> Result> { - let info = self.accounts.hardware_accounts_info().map_err(|e| errors::account("Could not fetch account info.", e))?; - Ok(info - .into_iter() - .map(|(a, v)| (H160::from(a), HwAccountInfo { name: v.name, manufacturer: v.meta })) - .collect() - ) - } - - fn locked_hardware_accounts_info(&self) -> Result> { - self.accounts.locked_hardware_accounts().map_err(|e| errors::account("Error communicating with hardware wallet.", e)) - } - - fn default_account(&self) -> Result { - Ok(self.accounts.default_account() - .map(Into::into) - .ok() - .unwrap_or_default()) - } - fn transactions_limit(&self) -> Result { Ok(self.miner.queue_status().limits.max_count) } @@ -167,6 +125,7 @@ impl Parity for ParityClient where } fn dev_logs(&self) -> Result> { + warn!("This method is deprecated and will be removed in future. See PR #10102"); let logs = self.logger.logs(); Ok(logs.as_slice().to_owned()) } @@ -186,13 +145,13 @@ impl Parity for ParityClient where fn net_peers(&self) -> Result { let sync_status = self.sync.status(); let num_peers_range = self.net.num_peers_range(); - debug_assert!(num_peers_range.end > num_peers_range.start); + debug_assert!(num_peers_range.end() >= num_peers_range.start()); let peers = self.sync.peers().into_iter().map(Into::into).collect(); Ok(Peers { active: sync_status.num_active_peers, connected: sync_status.num_peers, - max: sync_status.current_max_peers(num_peers_range.start, num_peers_range.end - 1), + max: sync_status.current_max_peers(*num_peers_range.start(), *num_peers_range.end()), peers: peers }) } @@ -251,7 +210,7 @@ impl Parity for ParityClient where Ok(Brain::new(phrase).generate().unwrap().address().into()) } - fn list_accounts(&self, count: u64, after: Option, block_number: Trailing) -> Result>> { + fn list_accounts(&self, count: u64, after: Option, block_number: Option) -> Result>> { let number = match block_number.unwrap_or_default() { BlockNumber::Pending => { warn!("BlockNumber::Pending is unsupported"); @@ -266,7 +225,7 @@ impl Parity for ParityClient where .map(|a| a.into_iter().map(Into::into).collect())) } - fn list_storage_keys(&self, address: H160, count: u64, after: Option, block_number: Trailing) -> Result>> { + fn list_storage_keys(&self, address: H160, count: u64, after: Option, block_number: Option) -> Result>> { let number = match block_number.unwrap_or_default() { BlockNumber::Pending => { warn!("BlockNumber::Pending is unsupported"); @@ -287,7 +246,7 @@ impl Parity for ParityClient where .map(Into::into) } - fn pending_transactions(&self, limit: Trailing) -> Result> { + fn pending_transactions(&self, limit: Option) -> Result> { let ready_transactions = self.miner.ready_transactions( &*self.client, limit.unwrap_or_else(usize::max_value), @@ -393,7 +352,7 @@ impl Parity for ParityClient where }) } - fn block_header(&self, number: Trailing) -> BoxFuture { + fn block_header(&self, number: Option) -> BoxFuture { const EXTRA_INFO_PROOF: &str = "Object exists in blockchain (fetched earlier), extra_info is always available if object exists; qed"; let number = number.unwrap_or_default(); @@ -423,7 +382,7 @@ impl Parity for ParityClient where })) } - fn block_receipts(&self, number: Trailing) -> BoxFuture> { + fn block_receipts(&self, number: Option) -> BoxFuture> { let number = number.unwrap_or_default(); let id = match number { @@ -448,7 +407,7 @@ impl Parity for ParityClient where ipfs::cid(content) } - fn call(&self, requests: Vec, num: Trailing) -> Result> { + fn call(&self, requests: Vec, num: Option) -> Result> { let requests = requests .into_iter() .map(|request| Ok(( diff --git a/rpc/src/v1/impls/parity_accounts.rs b/rpc/src/v1/impls/parity_accounts.rs index 941a77796b9..e52f8b7ac0d 100644 --- a/rpc/src/v1/impls/parity_accounts.rs +++ b/rpc/src/v1/impls/parity_accounts.rs @@ -1,36 +1,41 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Account management (personal) rpc implementation use std::sync::Arc; -use std::collections::btree_map::{BTreeMap, Entry}; -use ethereum_types::Address; +use std::collections::{ + btree_map::{BTreeMap, Entry}, + HashSet, +}; +use ethereum_types::{Address, H160, H256, H520}; use ethkey::{Brain, Generator, Secret}; use ethstore::KeyFile; -use ethcore::account_provider::AccountProvider; +use accounts::AccountProvider; use jsonrpc_core::Result; +use v1::helpers::deprecated::{self, DeprecationNotice}; use v1::helpers::errors; -use v1::traits::ParityAccounts; -use v1::types::{H160 as RpcH160, H256 as RpcH256, H520 as RpcH520, Derive, DeriveHierarchical, DeriveHash, ExtAccountInfo}; +use v1::traits::{ParityAccounts, ParityAccountsInfo}; +use v1::types::{Derive, DeriveHierarchical, DeriveHash,ExtAccountInfo, AccountInfo, HwAccountInfo}; use ethkey::Password; /// Account management (personal) rpc implementation. pub struct ParityAccountsClient { accounts: Arc, + deprecation_notice: DeprecationNotice, } impl ParityAccountsClient { @@ -38,12 +43,66 @@ impl ParityAccountsClient { pub fn new(store: &Arc) -> Self { ParityAccountsClient { accounts: store.clone(), + deprecation_notice: Default::default(), } } } +impl ParityAccountsClient { + fn deprecation_notice(&self, method: &'static str) { + self.deprecation_notice.print(method, deprecated::msgs::ACCOUNTS); + } +} + +impl ParityAccountsInfo for ParityAccountsClient { + fn accounts_info(&self) -> Result> { + self.deprecation_notice("parity_accountsInfo"); + + let dapp_accounts = self.accounts.accounts() + .map_err(|e| errors::account("Could not fetch accounts.", e))? + .into_iter().collect::>(); + + let info = self.accounts.accounts_info().map_err(|e| errors::account("Could not fetch account info.", e))?; + let other = self.accounts.addresses_info(); + + Ok(info + .into_iter() + .chain(other.into_iter()) + .filter(|&(ref a, _)| dapp_accounts.contains(a)) + .map(|(a, v)| (H160::from(a), AccountInfo { name: v.name })) + .collect() + ) + } + + fn hardware_accounts_info(&self) -> Result> { + self.deprecation_notice("parity_hardwareAccountsInfo"); + + let info = self.accounts.hardware_accounts_info().map_err(|e| errors::account("Could not fetch account info.", e))?; + Ok(info + .into_iter() + .map(|(a, v)| (H160::from(a), HwAccountInfo { name: v.name, manufacturer: v.meta })) + .collect() + ) + } + + fn locked_hardware_accounts_info(&self) -> Result> { + self.deprecation_notice("parity_lockedHardwareAccountsInfo"); + + self.accounts.locked_hardware_accounts().map_err(|e| errors::account("Error communicating with hardware wallet.", e)) + } + + fn default_account(&self) -> Result { + self.deprecation_notice("parity_defaultAccount"); + + Ok(self.accounts.default_account() + .map(Into::into) + .ok() + .unwrap_or_default()) + } +} + impl ParityAccounts for ParityAccountsClient { - fn all_accounts_info(&self) -> Result> { + fn all_accounts_info(&self) -> Result> { let info = self.accounts.accounts_info().map_err(|e| errors::account("Could not fetch account info.", e))?; let other = self.accounts.addresses_info(); @@ -56,7 +115,7 @@ impl ParityAccounts for ParityAccountsClient { uuid: v.uuid.map(|uuid| uuid.to_string()) })); - let mut accounts: BTreeMap = BTreeMap::new(); + let mut accounts: BTreeMap = BTreeMap::new(); for (address, account) in account_iter { match accounts.entry(address) { @@ -74,21 +133,24 @@ impl ParityAccounts for ParityAccountsClient { Ok(accounts) } - fn new_account_from_phrase(&self, phrase: String, pass: Password) -> Result { + fn new_account_from_phrase(&self, phrase: String, pass: Password) -> Result { + self.deprecation_notice("parity_newAccountFromPhrase"); let brain = Brain::new(phrase).generate().unwrap(); self.accounts.insert_account(brain.secret().clone(), &pass) .map(Into::into) .map_err(|e| errors::account("Could not create account.", e)) } - fn new_account_from_wallet(&self, json: String, pass: Password) -> Result { + fn new_account_from_wallet(&self, json: String, pass: Password) -> Result { + self.deprecation_notice("parity_newAccountFromWallet"); self.accounts.import_presale(json.as_bytes(), &pass) .or_else(|_| self.accounts.import_wallet(json.as_bytes(), &pass, true)) .map(Into::into) .map_err(|e| errors::account("Could not create account.", e)) } - fn new_account_from_secret(&self, secret: RpcH256, pass: Password) -> Result { + fn new_account_from_secret(&self, secret: H256, pass: Password) -> Result { + self.deprecation_notice("parity_newAccountFromSecret"); let secret = Secret::from_unsafe_slice(&secret.0) .map_err(|e| errors::account("Could not create account.", e))?; self.accounts.insert_account(secret, &pass) @@ -96,7 +158,8 @@ impl ParityAccounts for ParityAccountsClient { .map_err(|e| errors::account("Could not create account.", e)) } - fn test_password(&self, account: RpcH160, password: Password) -> Result { + fn test_password(&self, account: H160, password: Password) -> Result { + self.deprecation_notice("parity_testPassword"); let account: Address = account.into(); self.accounts @@ -104,7 +167,8 @@ impl ParityAccounts for ParityAccountsClient { .map_err(|e| errors::account("Could not fetch account info.", e)) } - fn change_password(&self, account: RpcH160, password: Password, new_password: Password) -> Result { + fn change_password(&self, account: H160, password: Password, new_password: Password) -> Result { + self.deprecation_notice("parity_changePassword"); let account: Address = account.into(); self.accounts .change_password(&account, password, new_password) @@ -112,7 +176,8 @@ impl ParityAccounts for ParityAccountsClient { .map_err(|e| errors::account("Could not fetch account info.", e)) } - fn kill_account(&self, account: RpcH160, password: Password) -> Result { + fn kill_account(&self, account: H160, password: Password) -> Result { + self.deprecation_notice("parity_killAccount"); let account: Address = account.into(); self.accounts .kill_account(&account, &password) @@ -120,14 +185,16 @@ impl ParityAccounts for ParityAccountsClient { .map_err(|e| errors::account("Could not delete account.", e)) } - fn remove_address(&self, addr: RpcH160) -> Result { + fn remove_address(&self, addr: H160) -> Result { + self.deprecation_notice("parity_removeAddresss"); let addr: Address = addr.into(); self.accounts.remove_address(addr); Ok(true) } - fn set_account_name(&self, addr: RpcH160, name: String) -> Result { + fn set_account_name(&self, addr: H160, name: String) -> Result { + self.deprecation_notice("parity_setAccountName"); let addr: Address = addr.into(); self.accounts.set_account_name(addr.clone(), name.clone()) @@ -135,7 +202,8 @@ impl ParityAccounts for ParityAccountsClient { Ok(true) } - fn set_account_meta(&self, addr: RpcH160, meta: String) -> Result { + fn set_account_meta(&self, addr: H160, meta: String) -> Result { + self.deprecation_notice("parity_setAccountMeta"); let addr: Address = addr.into(); self.accounts.set_account_meta(addr.clone(), meta.clone()) @@ -143,18 +211,22 @@ impl ParityAccounts for ParityAccountsClient { Ok(true) } - fn import_geth_accounts(&self, addresses: Vec) -> Result> { + fn import_geth_accounts(&self, addresses: Vec) -> Result> { + self.deprecation_notice("parity_importGethAccounts"); self.accounts .import_geth_accounts(into_vec(addresses), false) .map(into_vec) .map_err(|e| errors::account("Couldn't import Geth accounts", e)) } - fn geth_accounts(&self) -> Result> { + fn geth_accounts(&self) -> Result> { + self.deprecation_notice("parity_listGethAccounts"); Ok(into_vec(self.accounts.list_geth_accounts(false))) } fn create_vault(&self, name: String, password: Password) -> Result { + self.deprecation_notice("parity_newVault"); + self.accounts .create_vault(&name, &password) .map_err(|e| errors::account("Could not create vault.", e)) @@ -162,6 +234,8 @@ impl ParityAccounts for ParityAccountsClient { } fn open_vault(&self, name: String, password: Password) -> Result { + self.deprecation_notice("parity_openVault"); + self.accounts .open_vault(&name, &password) .map_err(|e| errors::account("Could not open vault.", e)) @@ -169,6 +243,8 @@ impl ParityAccounts for ParityAccountsClient { } fn close_vault(&self, name: String) -> Result { + self.deprecation_notice("parity_closeVault"); + self.accounts .close_vault(&name) .map_err(|e| errors::account("Could not close vault.", e)) @@ -176,25 +252,32 @@ impl ParityAccounts for ParityAccountsClient { } fn list_vaults(&self) -> Result> { + self.deprecation_notice("parity_listVaults"); + self.accounts .list_vaults() .map_err(|e| errors::account("Could not list vaults.", e)) } fn list_opened_vaults(&self) -> Result> { + self.deprecation_notice("parity_listOpenedVaults"); + self.accounts .list_opened_vaults() .map_err(|e| errors::account("Could not list vaults.", e)) } fn change_vault_password(&self, name: String, new_password: Password) -> Result { + self.deprecation_notice("parity_changeVaultPassword"); + self.accounts .change_vault_password(&name, &new_password) .map_err(|e| errors::account("Could not change vault password.", e)) .map(|_| true) } - fn change_vault(&self, address: RpcH160, new_vault: String) -> Result { + fn change_vault(&self, address: H160, new_vault: String) -> Result { + self.deprecation_notice("parity_changeVault"); self.accounts .change_vault(address.into(), &new_vault) .map_err(|e| errors::account("Could not change vault.", e)) @@ -202,19 +285,24 @@ impl ParityAccounts for ParityAccountsClient { } fn get_vault_meta(&self, name: String) -> Result { + self.deprecation_notice("parity_getVaultMeta"); + self.accounts .get_vault_meta(&name) .map_err(|e| errors::account("Could not get vault metadata.", e)) } fn set_vault_meta(&self, name: String, meta: String) -> Result { + self.deprecation_notice("parity_setVaultMeta"); + self.accounts .set_vault_meta(&name, &meta) .map_err(|e| errors::account("Could not update vault metadata.", e)) .map(|_| true) } - fn derive_key_index(&self, addr: RpcH160, password: Password, derivation: DeriveHierarchical, save_as_account: bool) -> Result { + fn derive_key_index(&self, addr: H160, password: Password, derivation: DeriveHierarchical, save_as_account: bool) -> Result { + self.deprecation_notice("parity_deriveAddressIndex"); let addr: Address = addr.into(); self.accounts .derive_account( @@ -227,7 +315,8 @@ impl ParityAccounts for ParityAccountsClient { .map_err(|e| errors::account("Could not derive account.", e)) } - fn derive_key_hash(&self, addr: RpcH160, password: Password, derivation: DeriveHash, save_as_account: bool) -> Result { + fn derive_key_hash(&self, addr: H160, password: Password, derivation: DeriveHash, save_as_account: bool) -> Result { + self.deprecation_notice("parity_deriveAddressHash"); let addr: Address = addr.into(); self.accounts .derive_account( @@ -240,7 +329,8 @@ impl ParityAccounts for ParityAccountsClient { .map_err(|e| errors::account("Could not derive account.", e)) } - fn export_account(&self, addr: RpcH160, password: Password) -> Result { + fn export_account(&self, addr: H160, password: Password) -> Result { + self.deprecation_notice("parity_exportAccount"); let addr = addr.into(); self.accounts .export_account( @@ -251,7 +341,8 @@ impl ParityAccounts for ParityAccountsClient { .map_err(|e| errors::account("Could not export account.", e)) } - fn sign_message(&self, addr: RpcH160, password: Password, message: RpcH256) -> Result { + fn sign_message(&self, addr: H160, password: Password, message: H256) -> Result { + self.deprecation_notice("parity_signMessage"); self.accounts .sign( addr.into(), @@ -263,6 +354,8 @@ impl ParityAccounts for ParityAccountsClient { } fn hardware_pin_matrix_ack(&self, path: String, pin: String) -> Result { + self.deprecation_notice("parity_hardwarePinMatrixAck"); + self.accounts.hardware_pin_matrix_ack(&path, &pin).map_err(|e| errors::account("Error communicating with hardware wallet.", e)) } } diff --git a/rpc/src/v1/impls/parity_set.rs b/rpc/src/v1/impls/parity_set.rs index bff428dd5f4..a50138eb19d 100644 --- a/rpc/src/v1/impls/parity_set.rs +++ b/rpc/src/v1/impls/parity_set.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . /// Parity-specific rpc interface for operations altering the settings. use std::io; @@ -20,17 +20,66 @@ use std::sync::Arc; use std::time::Duration; use ethcore::client::{BlockChainClient, Mode}; -use ethcore::miner::MinerService; -use sync::ManageNetwork; +use ethcore::miner::{self, MinerService}; +use ethereum_types::{H160, H256, U256}; +use ethkey; use fetch::{self, Fetch}; use hash::keccak_buffer; +use sync::ManageNetwork; use updater::{Service as UpdateService}; use jsonrpc_core::{BoxFuture, Result}; use jsonrpc_core::futures::Future; use v1::helpers::errors; use v1::traits::ParitySet; -use v1::types::{Bytes, H160, H256, U256, ReleaseInfo, Transaction}; +use v1::types::{Bytes, ReleaseInfo, Transaction}; + +#[cfg(any(test, feature = "accounts"))] +pub mod accounts { + use super::*; + use accounts::AccountProvider; + use v1::traits::ParitySetAccounts; + use v1::helpers::deprecated::DeprecationNotice; + use v1::helpers::engine_signer::EngineSigner; + + /// Parity-specific account-touching RPC interfaces. + pub struct ParitySetAccountsClient { + miner: Arc, + accounts: Arc, + deprecation_notice: DeprecationNotice, + } + + impl ParitySetAccountsClient { + /// Creates new ParitySetAccountsClient + pub fn new( + accounts: &Arc, + miner: &Arc, + ) -> Self { + ParitySetAccountsClient { + accounts: accounts.clone(), + miner: miner.clone(), + deprecation_notice: Default::default(), + } + } + } + + impl ParitySetAccounts for ParitySetAccountsClient { + fn set_engine_signer(&self, address: H160, password: String) -> Result { + self.deprecation_notice.print( + "parity_setEngineSigner", + "use `parity_setEngineSignerSecret` instead. See #9997 for context." + ); + + let signer = Box::new(EngineSigner::new( + self.accounts.clone(), + address.clone().into(), + password.into(), + )); + self.miner.set_author(miner::Author::Sealer(signer)); + Ok(true) + } + } +} /// Parity-specific rpc interface for operations altering the settings. pub struct ParitySetClient { @@ -57,7 +106,7 @@ impl ParitySetClient miner: miner.clone(), updater: updater.clone(), net: net.clone(), - fetch: fetch, + fetch, } } } @@ -69,9 +118,11 @@ impl ParitySet for ParitySetClient where F: Fetch + 'static, { - fn set_min_gas_price(&self, _gas_price: U256) -> Result { - warn!("setMinGasPrice is deprecated. Ignoring request."); - Ok(false) + fn set_min_gas_price(&self, gas_price: U256) -> Result { + match self.miner.set_minimal_gas_price(gas_price.into()) { + Ok(success) => Ok(success), + Err(e) => Err(errors::unsupported(e, None)), + } } fn set_transactions_limit(&self, _limit: usize) -> Result { @@ -104,12 +155,13 @@ impl ParitySet for ParitySetClient where } fn set_author(&self, address: H160) -> Result { - self.miner.set_author(address.into(), None).map_err(Into::into).map_err(errors::password)?; + self.miner.set_author(miner::Author::External(address.into())); Ok(true) } - fn set_engine_signer(&self, address: H160, password: String) -> Result { - self.miner.set_author(address.into(), Some(password.into())).map_err(Into::into).map_err(errors::password)?; + fn set_engine_signer_secret(&self, secret: H256) -> Result { + let keypair = ethkey::KeyPair::from_secret(secret.into()).map_err(|e| errors::account("Invalid secret", e))?; + self.miner.set_author(miner::Author::Sealer(ethcore::engines::signer::from_keypair(keypair))); Ok(true) } diff --git a/rpc/src/v1/impls/personal.rs b/rpc/src/v1/impls/personal.rs index e42a91b1f26..b6af1f81e5a 100644 --- a/rpc/src/v1/impls/personal.rs +++ b/rpc/src/v1/impls/personal.rs @@ -1,36 +1,39 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Account management (personal) rpc implementation use std::sync::Arc; use std::time::Duration; -use bytes::{Bytes, ToPretty}; -use ethcore::account_provider::AccountProvider; -use transaction::PendingTransaction; -use ethereum_types::{H520, U128, Address}; +use accounts::AccountProvider; +use bytes::Bytes; +use eip_712::{EIP712, hash_structured_data}; +use ethereum_types::{H160, H256, H520, U128, Address}; use ethkey::{public_to_address, recover, Signature}; +use types::transaction::{PendingTransaction, SignedTransaction}; -use jsonrpc_core::{BoxFuture, Result}; use jsonrpc_core::futures::{future, Future}; +use jsonrpc_core::types::Value; +use jsonrpc_core::{BoxFuture, Result}; +use v1::helpers::deprecated::{self, DeprecationNotice}; +use v1::helpers::dispatch::{self, eth_data_hash, Dispatcher, SignWith, PostSign, WithToken}; use v1::helpers::{errors, eip191}; -use v1::helpers::dispatch::{self, eth_data_hash, Dispatcher, SignWith}; +use v1::metadata::Metadata; use v1::traits::Personal; use v1::types::{ - H160 as RpcH160, H256 as RpcH256, H520 as RpcH520, U128 as RpcU128, Bytes as RpcBytes, ConfirmationPayload as RpcConfirmationPayload, ConfirmationResponse as RpcConfirmationResponse, @@ -38,9 +41,6 @@ use v1::types::{ RichRawTransaction as RpcRichRawTransaction, EIP191Version, }; -use v1::metadata::Metadata; -use eip712::{EIP712, hash_structured_data}; -use jsonrpc_core::types::Value; /// Account management (personal) rpc implementation. pub struct PersonalClient { @@ -48,6 +48,7 @@ pub struct PersonalClient { dispatcher: D, allow_perm_unlock: bool, allow_experimental_rpcs: bool, + deprecation_notice: DeprecationNotice, } impl PersonalClient { @@ -63,12 +64,22 @@ impl PersonalClient { dispatcher, allow_perm_unlock, allow_experimental_rpcs, + deprecation_notice: DeprecationNotice::default(), } } } impl PersonalClient { - fn do_sign_transaction(&self, _meta: Metadata, request: TransactionRequest, password: String) -> BoxFuture<(PendingTransaction, D)> { + fn do_sign_transaction

( + &self, + _meta: Metadata, + request: TransactionRequest, + password: String, + post_sign: P + ) -> BoxFuture + where P: PostSign + 'static, + ::Future: Send + { let dispatcher = self.dispatcher.clone(); let accounts = self.accounts.clone(); @@ -84,13 +95,10 @@ impl PersonalClient { Err(e) => return Box::new(future::err(e)), }; + let accounts = Arc::new(dispatch::Signer::new(accounts)) as _; Box::new(dispatcher.fill_optional_fields(request.into(), default, false) .and_then(move |filled| { - let condition = filled.condition.clone().map(Into::into); - dispatcher.sign(accounts, filled, SignWith::Password(password.into())) - .map(|tx| tx.into_value()) - .map(move |tx| PendingTransaction::new(tx, condition)) - .map(move |tx| (tx, dispatcher)) + dispatcher.sign(filled, &accounts, SignWith::Password(password.into()), post_sign) }) ) } @@ -99,18 +107,21 @@ impl PersonalClient { impl Personal for PersonalClient { type Metadata = Metadata; - fn accounts(&self) -> Result> { + fn accounts(&self) -> Result> { + self.deprecation_notice.print("personal_accounts", deprecated::msgs::ACCOUNTS); let accounts = self.accounts.accounts().map_err(|e| errors::account("Could not fetch accounts.", e))?; - Ok(accounts.into_iter().map(Into::into).collect::>()) + Ok(accounts.into_iter().map(Into::into).collect::>()) } - fn new_account(&self, pass: String) -> Result { + fn new_account(&self, pass: String) -> Result { + self.deprecation_notice.print("personal_newAccount", deprecated::msgs::ACCOUNTS); self.accounts.new_account(&pass.into()) .map(Into::into) .map_err(|e| errors::account("Could not create account.", e)) } - fn unlock_account(&self, account: RpcH160, account_pass: String, duration: Option) -> Result { + fn unlock_account(&self, account: H160, account_pass: String, duration: Option) -> Result { + self.deprecation_notice.print("personal_unlockAccount", deprecated::msgs::ACCOUNTS); let account: Address = account.into(); let store = self.accounts.clone(); let duration = match duration { @@ -129,8 +140,8 @@ impl Personal for PersonalClient { let r = match (self.allow_perm_unlock, duration) { (false, None) => store.unlock_account_temporarily(account, account_pass.into()), (false, _) => return Err(errors::unsupported( - "Time-unlocking is only supported in --geth compatibility mode.", - Some("Restart your client with --geth flag or use personal_sendTransaction instead."), + "Time-unlocking is not supported when permanent unlock is disabled.", + Some("Use personal_sendTransaction or enable permanent unlocking, instead."), )), (true, Some(0)) => store.unlock_account_permanently(account, account_pass.into()), (true, Some(d)) => store.unlock_account_timed(account, account_pass.into(), Duration::from_secs(d.into())), @@ -142,15 +153,16 @@ impl Personal for PersonalClient { } } - fn sign(&self, data: RpcBytes, account: RpcH160, password: String) -> BoxFuture { + fn sign(&self, data: RpcBytes, account: H160, password: String) -> BoxFuture { + self.deprecation_notice.print("personal_sign", deprecated::msgs::ACCOUNTS); let dispatcher = self.dispatcher.clone(); - let accounts = self.accounts.clone(); + let accounts = Arc::new(dispatch::Signer::new(self.accounts.clone())) as _; let payload = RpcConfirmationPayload::EthSignMessage((account.clone(), data).into()); Box::new(dispatch::from_rpc(payload, account.into(), &dispatcher) - .and_then(|payload| { - dispatch::execute(dispatcher, accounts, payload, dispatch::SignWith::Password(password.into())) + .and_then(move |payload| { + dispatch::execute(dispatcher, &accounts, payload, dispatch::SignWith::Password(password.into())) }) .map(|v| v.into_value()) .then(|res| match res { @@ -160,18 +172,19 @@ impl Personal for PersonalClient { })) } - fn sign_191(&self, version: EIP191Version, data: Value, account: RpcH160, password: String) -> BoxFuture { + fn sign_191(&self, version: EIP191Version, data: Value, account: H160, password: String) -> BoxFuture { + self.deprecation_notice.print("personal_sign191", deprecated::msgs::ACCOUNTS); try_bf!(errors::require_experimental(self.allow_experimental_rpcs, "191")); let data = try_bf!(eip191::hash_message(version, data)); let dispatcher = self.dispatcher.clone(); - let accounts = self.accounts.clone(); + let accounts = Arc::new(dispatch::Signer::new(self.accounts.clone())) as _; let payload = RpcConfirmationPayload::EIP191SignMessage((account.clone(), data.into()).into()); Box::new(dispatch::from_rpc(payload, account.into(), &dispatcher) - .and_then(|payload| { - dispatch::execute(dispatcher, accounts, payload, dispatch::SignWith::Password(password.into())) + .and_then(move |payload| { + dispatch::execute(dispatcher, &accounts, payload, dispatch::SignWith::Password(password.into())) }) .map(|v| v.into_value()) .then(|res| match res { @@ -182,7 +195,8 @@ impl Personal for PersonalClient { ) } - fn sign_typed_data(&self, typed_data: EIP712, account: RpcH160, password: String) -> BoxFuture { + fn sign_typed_data(&self, typed_data: EIP712, account: H160, password: String) -> BoxFuture { + self.deprecation_notice.print("personal_signTypedData", deprecated::msgs::ACCOUNTS); try_bf!(errors::require_experimental(self.allow_experimental_rpcs, "712")); let data = match hash_structured_data(typed_data) { @@ -190,13 +204,13 @@ impl Personal for PersonalClient { Err(err) => return Box::new(future::err(errors::invalid_call_data(err.kind()))), }; let dispatcher = self.dispatcher.clone(); - let accounts = self.accounts.clone(); + let accounts = Arc::new(dispatch::Signer::new(self.accounts.clone())) as _; let payload = RpcConfirmationPayload::EIP191SignMessage((account.clone(), data.into()).into()); Box::new(dispatch::from_rpc(payload, account.into(), &dispatcher) - .and_then(|payload| { - dispatch::execute(dispatcher, accounts, payload, dispatch::SignWith::Password(password.into())) + .and_then(move |payload| { + dispatch::execute(dispatcher, &accounts, payload, dispatch::SignWith::Password(password.into())) }) .map(|v| v.into_value()) .then(|res| match res { @@ -207,7 +221,7 @@ impl Personal for PersonalClient { ) } - fn ec_recover(&self, data: RpcBytes, signature: RpcH520) -> BoxFuture { + fn ec_recover(&self, data: RpcBytes, signature: H520) -> BoxFuture { let signature: H520 = signature.into(); let signature = Signature::from_electrum(&signature); let data: Bytes = data.into(); @@ -223,23 +237,33 @@ impl Personal for PersonalClient { } fn sign_transaction(&self, meta: Metadata, request: TransactionRequest, password: String) -> BoxFuture { - Box::new(self.do_sign_transaction(meta, request, password) - .map(|(pending_tx, dispatcher)| dispatcher.enrich(pending_tx.transaction))) - } + self.deprecation_notice.print("personal_signTransaction", deprecated::msgs::ACCOUNTS); - fn send_transaction(&self, meta: Metadata, request: TransactionRequest, password: String) -> BoxFuture { - Box::new(self.do_sign_transaction(meta, request, password) - .and_then(|(pending_tx, dispatcher)| { - let chain_id = pending_tx.chain_id(); - trace!(target: "miner", "send_transaction: dispatching tx: {} for chain ID {:?}", - ::rlp::encode(&*pending_tx).pretty(), chain_id); + let condition = request.condition.clone().map(Into::into); + let dispatcher = self.dispatcher.clone(); + Box::new(self.do_sign_transaction(meta, request, password, ()) + .map(move |tx| PendingTransaction::new(tx.into_value(), condition)) + .map(move |pending_tx| dispatcher.enrich(pending_tx.transaction))) + } - dispatcher.dispatch_transaction(pending_tx).map(Into::into) + fn send_transaction(&self, meta: Metadata, request: TransactionRequest, password: String) -> BoxFuture { + self.deprecation_notice.print("personal_sendTransaction", deprecated::msgs::ACCOUNTS); + let condition = request.condition.clone().map(Into::into); + let dispatcher = self.dispatcher.clone(); + Box::new( + self.do_sign_transaction(meta, request, password, move |signed: WithToken| { + dispatcher.dispatch_transaction( + PendingTransaction::new( + signed.into_value(), + condition + ) + ) }) ) } - fn sign_and_send_transaction(&self, meta: Metadata, request: TransactionRequest, password: String) -> BoxFuture { + fn sign_and_send_transaction(&self, meta: Metadata, request: TransactionRequest, password: String) -> BoxFuture { + self.deprecation_notice.print("personal_signAndSendTransaction", Some("use personal_sendTransaction instead.")); warn!("Using deprecated personal_signAndSendTransaction, use personal_sendTransaction instead."); self.send_transaction(meta, request, password) } diff --git a/rpc/src/v1/impls/private.rs b/rpc/src/v1/impls/private.rs index f4894ef578e..f1cf991240b 100644 --- a/rpc/src/v1/impls/private.rs +++ b/rpc/src/v1/impls/private.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Private transaction signing RPC implementation. @@ -21,11 +21,11 @@ use std::sync::Arc; use rlp::Rlp; use ethcore_private_tx::Provider as PrivateTransactionManager; -use ethereum_types::Address; -use transaction::SignedTransaction; +use ethereum_types::{Address, H160, H256, U256}; +use types::transaction::SignedTransaction; use jsonrpc_core::{Error}; -use v1::types::{Bytes, PrivateTransactionReceipt, H160, H256, TransactionRequest, U256, +use v1::types::{Bytes, PrivateTransactionReceipt, TransactionRequest, BlockNumber, PrivateTransactionReceiptAndTransaction, CallRequest, block_number_to_id}; use v1::traits::Private; use v1::metadata::Metadata; @@ -94,7 +94,7 @@ impl Private for PrivateClient { transaction: request, receipt: PrivateTransactionReceipt { transaction_hash: tx_hash.into(), - contract_address: contract_address.map(|address| address.into()), + contract_address: contract_address.into(), status_code: 0, } }) diff --git a/rpc/src/v1/impls/pubsub.rs b/rpc/src/v1/impls/pubsub.rs index 193fec72bd7..9650fd2d079 100644 --- a/rpc/src/v1/impls/pubsub.rs +++ b/rpc/src/v1/impls/pubsub.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity-specific PUB-SUB rpc implementation. @@ -22,8 +22,7 @@ use parking_lot::RwLock; use jsonrpc_core::{self as core, Result, MetaIoHandler}; use jsonrpc_core::futures::{future, Future, Stream, Sink}; -use jsonrpc_macros::Trailing; -use jsonrpc_macros::pubsub::Subscriber; +use jsonrpc_pubsub::typed::Subscriber; use jsonrpc_pubsub::SubscriptionId; use tokio_timer; @@ -81,7 +80,7 @@ impl PubSubClient { impl> PubSub for PubSubClient { type Metadata = Metadata; - fn parity_subscribe(&self, mut meta: Metadata, subscriber: Subscriber, method: String, params: Trailing) { + fn parity_subscribe(&self, mut meta: Metadata, subscriber: Subscriber, method: String, params: Option) { let params = params.unwrap_or(core::Params::Array(vec![])); // Make sure to get rid of PubSub session otherwise it will never be dropped. meta.session = None; @@ -100,7 +99,7 @@ impl> PubSub for PubSubClient { } } - fn parity_unsubscribe(&self, id: SubscriptionId) -> Result { + fn parity_unsubscribe(&self, _: Option, id: SubscriptionId) -> Result { let res = self.poll_manager.write().unsubscribe(&id); Ok(res) } diff --git a/rpc/src/v1/impls/rpc.rs b/rpc/src/v1/impls/rpc.rs index 9f15cc1a384..f218c5ade6e 100644 --- a/rpc/src/v1/impls/rpc.rs +++ b/rpc/src/v1/impls/rpc.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! RPC generic methods implementation. use std::collections::BTreeMap; diff --git a/rpc/src/v1/impls/secretstore.rs b/rpc/src/v1/impls/secretstore.rs index cbb7580e6ae..b6526b85d5f 100644 --- a/rpc/src/v1/impls/secretstore.rs +++ b/rpc/src/v1/impls/secretstore.rs @@ -1,34 +1,35 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! SecretStore-specific rpc implementation. use std::collections::BTreeSet; use std::sync::Arc; +use accounts::AccountProvider; use crypto::DEFAULT_MAC; +use ethereum_types::{H160, H256, H512}; use ethkey::Secret; -use ethcore::account_provider::AccountProvider; use jsonrpc_core::Result; use v1::helpers::errors; use v1::helpers::secretstore::{generate_document_key, encrypt_document, decrypt_document, decrypt_document_with_shadow, ordered_servers_keccak}; use v1::traits::SecretStore; -use v1::types::{H160, H256, H512, Bytes, EncryptedDocumentKey}; +use v1::types::{Bytes, EncryptedDocumentKey}; use ethkey::Password; /// Parity implementation. diff --git a/rpc/src/v1/impls/signer.rs b/rpc/src/v1/impls/signer.rs index 15cd21d2033..c4f4d357668 100644 --- a/rpc/src/v1/impls/signer.rs +++ b/rpc/src/v1/impls/signer.rs @@ -1,53 +1,55 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Transactions Confirmations rpc implementation use std::sync::Arc; -use ethcore::account_provider::AccountProvider; +use ethereum_types::U256; use ethkey; use parity_runtime::Executor; use parking_lot::Mutex; use rlp::Rlp; -use transaction::{SignedTransaction, PendingTransaction}; +use types::transaction::{SignedTransaction, PendingTransaction}; use jsonrpc_core::{Result, BoxFuture, Error}; use jsonrpc_core::futures::{future, Future, IntoFuture}; use jsonrpc_core::futures::future::Either; -use jsonrpc_pubsub::SubscriptionId; -use jsonrpc_macros::pubsub::{Sink, Subscriber}; +use jsonrpc_pubsub::{SubscriptionId, typed::{Sink, Subscriber}}; +use v1::helpers::deprecated::{self, DeprecationNotice}; use v1::helpers::dispatch::{self, Dispatcher, WithToken, eth_data_hash}; -use v1::helpers::{errors, SignerService, SigningQueue, ConfirmationPayload, FilledTransactionRequest, Subscribers}; +use v1::helpers::{errors, ConfirmationPayload, FilledTransactionRequest, Subscribers}; +use v1::helpers::external_signer::{SigningQueue, SignerService}; use v1::metadata::Metadata; use v1::traits::Signer; -use v1::types::{TransactionModification, ConfirmationRequest, ConfirmationResponse, ConfirmationResponseWithToken, U256, Bytes}; +use v1::types::{TransactionModification, ConfirmationRequest, ConfirmationResponse, ConfirmationResponseWithToken, Bytes}; /// Transactions confirmation (personal) rpc implementation. pub struct SignerClient { signer: Arc, - accounts: Arc, + accounts: Arc, dispatcher: D, subscribers: Arc>>>>, + deprecation_notice: DeprecationNotice, } impl SignerClient { /// Create new instance of signer client. pub fn new( - store: &Arc, + accounts: Arc, dispatcher: D, signer: &Arc, executor: Executor, @@ -71,14 +73,15 @@ impl SignerClient { SignerClient { signer: signer.clone(), - accounts: store.clone(), + accounts: accounts.clone(), dispatcher, subscribers, + deprecation_notice: Default::default(), } } fn confirm_internal(&self, id: U256, modification: TransactionModification, f: F) -> BoxFuture> where - F: FnOnce(D, Arc, ConfirmationPayload) -> T, + F: FnOnce(D, &Arc, ConfirmationPayload) -> T, T: IntoFuture, Error=Error>, T::Future: Send + 'static { @@ -105,7 +108,7 @@ impl SignerClient { request.condition = condition.clone().map(Into::into); } } - let fut = f(dispatcher, self.accounts.clone(), payload); + let fut = f(dispatcher, &self.accounts, payload); Either::A(fut.into_future().then(move |result| { // Execute if let Ok(ref response) = result { @@ -156,6 +159,8 @@ impl Signer for SignerClient { type Metadata = Metadata; fn requests_to_confirm(&self) -> Result> { + self.deprecation_notice.print("signer_requestsToConfirm", deprecated::msgs::ACCOUNTS); + Ok(self.signer.requests() .into_iter() .map(Into::into) @@ -168,6 +173,8 @@ impl Signer for SignerClient { fn confirm_request(&self, id: U256, modification: TransactionModification, pass: String) -> BoxFuture { + self.deprecation_notice.print("signer_confirmRequest", deprecated::msgs::ACCOUNTS); + Box::new(self.confirm_internal(id, modification, move |dis, accounts, payload| { dispatch::execute(dis, accounts, payload, dispatch::SignWith::Password(pass.into())) }).map(|v| v.into_value())) @@ -176,6 +183,8 @@ impl Signer for SignerClient { fn confirm_request_with_token(&self, id: U256, modification: TransactionModification, token: String) -> BoxFuture { + self.deprecation_notice.print("signer_confirmRequestWithToken", deprecated::msgs::ACCOUNTS); + Box::new(self.confirm_internal(id, modification, move |dis, accounts, payload| { dispatch::execute(dis, accounts, payload, dispatch::SignWith::Token(token.into())) }).and_then(|v| match v { @@ -188,6 +197,8 @@ impl Signer for SignerClient { } fn confirm_request_raw(&self, id: U256, bytes: Bytes) -> Result { + self.deprecation_notice.print("signer_confirmRequestRaw", deprecated::msgs::ACCOUNTS); + let id = id.into(); self.signer.take(&id).map(|sender| { @@ -238,24 +249,26 @@ impl Signer for SignerClient { } fn reject_request(&self, id: U256) -> Result { + self.deprecation_notice.print("signer_rejectRequest", deprecated::msgs::ACCOUNTS); + let res = self.signer.take(&id.into()).map(|sender| self.signer.request_rejected(sender)); Ok(res.is_some()) } fn generate_token(&self) -> Result { + self.deprecation_notice.print("signer_generateAuthorizationToken", deprecated::msgs::ACCOUNTS); + self.signer.generate_token() .map_err(|e| errors::token(e)) } - fn generate_web_proxy_token(&self, domain: String) -> Result { - Ok(self.signer.generate_web_proxy_access_token(domain.into())) - } - fn subscribe_pending(&self, _meta: Self::Metadata, sub: Subscriber>) { + self.deprecation_notice.print("signer_subscribePending", deprecated::msgs::ACCOUNTS); + self.subscribers.lock().push(sub) } - fn unsubscribe_pending(&self, id: SubscriptionId) -> Result { + fn unsubscribe_pending(&self, _: Option, id: SubscriptionId) -> Result { let res = self.subscribers.lock().remove(&id).is_some(); Ok(res) } diff --git a/rpc/src/v1/impls/signing.rs b/rpc/src/v1/impls/signing.rs index 1497ce0b2a2..12f8909563c 100644 --- a/rpc/src/v1/impls/signing.rs +++ b/rpc/src/v1/impls/signing.rs @@ -1,41 +1,43 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Signing RPC implementation. use std::sync::Arc; use transient_hashmap::TransientHashMap; -use ethereum_types::U256; use parking_lot::Mutex; -use ethcore::account_provider::AccountProvider; +use ethereum_types::{H160, H256, H520, U256}; use jsonrpc_core::{BoxFuture, Result, Error}; use jsonrpc_core::futures::{future, Future, Poll, Async}; use jsonrpc_core::futures::future::Either; -use v1::helpers::{ - errors, DefaultAccount, SignerService, SigningQueue, + +use v1::helpers::deprecated::{self, DeprecationNotice}; +use v1::helpers::dispatch::{self, Dispatcher}; +use v1::helpers::errors; +use v1::helpers::external_signer::{ + SignerService, SigningQueue, ConfirmationReceiver as RpcConfirmationReceiver, ConfirmationResult as RpcConfirmationResult, }; -use v1::helpers::dispatch::{self, Dispatcher}; use v1::metadata::Metadata; use v1::traits::{EthSigning, ParitySigning}; use v1::types::{ - H160 as RpcH160, H256 as RpcH256, U256 as RpcU256, Bytes as RpcBytes, H520 as RpcH520, + Bytes as RpcBytes, Either as RpcEither, RichRawTransaction as RpcRichRawTransaction, TransactionRequest as RpcTransactionRequest, @@ -89,38 +91,37 @@ fn schedule(executor: Executor, /// Implementation of functions that require signing when no trusted signer is used. pub struct SigningQueueClient { signer: Arc, - accounts: Arc, + accounts: Arc, dispatcher: D, executor: Executor, // None here means that the request hasn't yet been confirmed confirmations: Arc>>>, + deprecation_notice: DeprecationNotice, } impl SigningQueueClient { /// Creates a new signing queue client given shared signing queue. - pub fn new(signer: &Arc, dispatcher: D, executor: Executor, accounts: &Arc) -> Self { + pub fn new(signer: &Arc, dispatcher: D, executor: Executor, accounts: &Arc) -> Self { SigningQueueClient { signer: signer.clone(), accounts: accounts.clone(), dispatcher, executor, confirmations: Arc::new(Mutex::new(TransientHashMap::new(MAX_PENDING_DURATION_SEC))), + deprecation_notice: Default::default(), } } - fn dispatch(&self, payload: RpcConfirmationPayload, default_account: DefaultAccount, origin: Origin) -> BoxFuture { + fn dispatch(&self, payload: RpcConfirmationPayload, origin: Origin) -> BoxFuture { + let default_account = self.accounts.default_account(); let accounts = self.accounts.clone(); - let default_account = match default_account { - DefaultAccount::Provided(acc) => acc, - }; - let dispatcher = self.dispatcher.clone(); let signer = self.signer.clone(); Box::new(dispatch::from_rpc(payload, default_account, &dispatcher) .and_then(move |payload| { let sender = payload.sender(); if accounts.is_unlocked(&sender) { - Either::A(dispatch::execute(dispatcher, accounts, payload, dispatch::SignWith::Nothing) + Either::A(dispatch::execute(dispatcher, &accounts, payload, dispatch::SignWith::Nothing) .map(|v| v.into_value()) .map(DispatchResult::Value)) } else { @@ -138,17 +139,17 @@ impl ParitySigning for SigningQueueClient { type Metadata = Metadata; fn compose_transaction(&self, _meta: Metadata, transaction: RpcTransactionRequest) -> BoxFuture { - let default_account = self.accounts.default_account().ok().unwrap_or_default(); + let default_account = self.accounts.default_account(); Box::new(self.dispatcher.fill_optional_fields(transaction.into(), default_account, true).map(Into::into)) } - fn post_sign(&self, meta: Metadata, address: RpcH160, data: RpcBytes) -> BoxFuture> { + fn post_sign(&self, meta: Metadata, address: H160, data: RpcBytes) -> BoxFuture> { + self.deprecation_notice.print("parity_postSign", deprecated::msgs::ACCOUNTS); let executor = self.executor.clone(); let confirmations = self.confirmations.clone(); Box::new(self.dispatch( RpcConfirmationPayload::EthSignMessage((address.clone(), data).into()), - DefaultAccount::Provided(address.into()), meta.origin ).map(move |result| match result { DispatchResult::Value(v) => RpcEither::Or(v), @@ -159,11 +160,12 @@ impl ParitySigning for SigningQueueClient { })) } - fn post_transaction(&self, meta: Metadata, request: RpcTransactionRequest) -> BoxFuture> { + fn post_transaction(&self, meta: Metadata, request: RpcTransactionRequest) -> BoxFuture> { + self.deprecation_notice.print("parity_postTransaction", deprecated::msgs::ACCOUNTS); let executor = self.executor.clone(); let confirmations = self.confirmations.clone(); - Box::new(self.dispatch(RpcConfirmationPayload::SendTransaction(request), DefaultAccount::Provided(self.accounts.default_account().ok().unwrap_or_default()), meta.origin) + Box::new(self.dispatch(RpcConfirmationPayload::SendTransaction(request), meta.origin) .map(|result| match result { DispatchResult::Value(v) => RpcEither::Or(v), DispatchResult::Future(id, future) => { @@ -173,7 +175,8 @@ impl ParitySigning for SigningQueueClient { })) } - fn check_request(&self, id: RpcU256) -> Result> { + fn check_request(&self, id: U256) -> Result> { + self.deprecation_notice.print("parity_checkRequest", deprecated::msgs::ACCOUNTS); let id: U256 = id.into(); match self.confirmations.lock().get(&id) { None => Err(errors::request_not_found()), // Request info has been dropped, or even never been there @@ -182,10 +185,10 @@ impl ParitySigning for SigningQueueClient { } } - fn decrypt_message(&self, meta: Metadata, address: RpcH160, data: RpcBytes) -> BoxFuture { + fn decrypt_message(&self, meta: Metadata, address: H160, data: RpcBytes) -> BoxFuture { + self.deprecation_notice.print("parity_decryptMessage", deprecated::msgs::ACCOUNTS); let res = self.dispatch( RpcConfirmationPayload::Decrypt((address.clone(), data).into()), - address.into(), meta.origin, ); @@ -202,10 +205,10 @@ impl ParitySigning for SigningQueueClient { impl EthSigning for SigningQueueClient { type Metadata = Metadata; - fn sign(&self, meta: Metadata, address: RpcH160, data: RpcBytes) -> BoxFuture { + fn sign(&self, meta: Metadata, address: H160, data: RpcBytes) -> BoxFuture { + self.deprecation_notice.print("eth_sign", deprecated::msgs::ACCOUNTS); let res = self.dispatch( RpcConfirmationPayload::EthSignMessage((address.clone(), data).into()), - address.into(), meta.origin, ); @@ -217,10 +220,10 @@ impl EthSigning for SigningQueueClient { })) } - fn send_transaction(&self, meta: Metadata, request: RpcTransactionRequest) -> BoxFuture { + fn send_transaction(&self, meta: Metadata, request: RpcTransactionRequest) -> BoxFuture { + self.deprecation_notice.print("eth_sendTransaction", deprecated::msgs::ACCOUNTS); let res = self.dispatch( RpcConfirmationPayload::SendTransaction(request), - DefaultAccount::Provided(self.accounts.default_account().ok().unwrap_or_default()), meta.origin, ); @@ -233,9 +236,10 @@ impl EthSigning for SigningQueueClient { } fn sign_transaction(&self, meta: Metadata, request: RpcTransactionRequest) -> BoxFuture { + self.deprecation_notice.print("eth_signTransaction", deprecated::msgs::ACCOUNTS); + let res = self.dispatch( RpcConfirmationPayload::SignTransaction(request), - DefaultAccount::Provided(self.accounts.default_account().ok().unwrap_or_default()), meta.origin, ); diff --git a/rpc/src/v1/impls/signing_unsafe.rs b/rpc/src/v1/impls/signing_unsafe.rs index c4f2117a5e1..72a3a6fbf18 100644 --- a/rpc/src/v1/impls/signing_unsafe.rs +++ b/rpc/src/v1/impls/signing_unsafe.rs @@ -1,34 +1,33 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Unsafe Signing RPC implementation. use std::sync::Arc; -use ethcore::account_provider::AccountProvider; - +use ethereum_types::{Address, H160, H256, H520, U256}; use jsonrpc_core::{BoxFuture, Result}; use jsonrpc_core::futures::{future, Future}; -use v1::helpers::{errors, DefaultAccount}; +use v1::helpers::{errors}; +use v1::helpers::deprecated::{self, DeprecationNotice}; use v1::helpers::dispatch::{self, Dispatcher}; use v1::metadata::Metadata; use v1::traits::{EthSigning, ParitySigning}; use v1::types::{ - U256 as RpcU256, - H160 as RpcH160, H256 as RpcH256, H520 as RpcH520, Bytes as RpcBytes, + Bytes as RpcBytes, Either as RpcEither, RichRawTransaction as RpcRichRawTransaction, TransactionRequest as RpcTransactionRequest, @@ -38,29 +37,28 @@ use v1::types::{ /// Implementation of functions that require signing when no trusted signer is used. pub struct SigningUnsafeClient { - accounts: Arc, + accounts: Arc, dispatcher: D, + deprecation_notice: DeprecationNotice, } impl SigningUnsafeClient { /// Creates new SigningUnsafeClient. - pub fn new(accounts: &Arc, dispatcher: D) -> Self { + pub fn new(accounts: &Arc, dispatcher: D) -> Self { SigningUnsafeClient { accounts: accounts.clone(), - dispatcher: dispatcher, + dispatcher, + deprecation_notice: Default::default(), } } - fn handle(&self, payload: RpcConfirmationPayload, account: DefaultAccount) -> BoxFuture { + fn handle(&self, payload: RpcConfirmationPayload, account: Address) -> BoxFuture { let accounts = self.accounts.clone(); - let default = match account { - DefaultAccount::Provided(acc) => acc, - }; let dis = self.dispatcher.clone(); - Box::new(dispatch::from_rpc(payload, default, &dis) + Box::new(dispatch::from_rpc(payload, account, &dis) .and_then(move |payload| { - dispatch::execute(dis, accounts, payload, dispatch::SignWith::Nothing) + dispatch::execute(dis, &accounts, payload, dispatch::SignWith::Nothing) }) .map(|v| v.into_value())) } @@ -70,7 +68,8 @@ impl EthSigning for SigningUnsafeClient { type Metadata = Metadata; - fn sign(&self, _: Metadata, address: RpcH160, data: RpcBytes) -> BoxFuture { + fn sign(&self, _: Metadata, address: H160, data: RpcBytes) -> BoxFuture { + self.deprecation_notice.print("eth_sign", deprecated::msgs::ACCOUNTS); Box::new(self.handle(RpcConfirmationPayload::EthSignMessage((address.clone(), data).into()), address.into()) .then(|res| match res { Ok(RpcConfirmationResponse::Signature(signature)) => Ok(signature), @@ -79,8 +78,9 @@ impl EthSigning for SigningUnsafeClient })) } - fn send_transaction(&self, _meta: Metadata, request: RpcTransactionRequest) -> BoxFuture { - Box::new(self.handle(RpcConfirmationPayload::SendTransaction(request), DefaultAccount::Provided(self.accounts.default_account().ok().unwrap_or_default())) + fn send_transaction(&self, _meta: Metadata, request: RpcTransactionRequest) -> BoxFuture { + self.deprecation_notice.print("eth_sendTransaction", deprecated::msgs::ACCOUNTS); + Box::new(self.handle(RpcConfirmationPayload::SendTransaction(request), self.accounts.default_account()) .then(|res| match res { Ok(RpcConfirmationResponse::SendTransaction(hash)) => Ok(hash), Err(e) => Err(e), @@ -89,7 +89,9 @@ impl EthSigning for SigningUnsafeClient } fn sign_transaction(&self, _meta: Metadata, request: RpcTransactionRequest) -> BoxFuture { - Box::new(self.handle(RpcConfirmationPayload::SignTransaction(request), DefaultAccount::Provided(self.accounts.default_account().ok().unwrap_or_default())) + self.deprecation_notice.print("eth_signTransaction", deprecated::msgs::ACCOUNTS); + + Box::new(self.handle(RpcConfirmationPayload::SignTransaction(request), self.accounts.default_account()) .then(|res| match res { Ok(RpcConfirmationResponse::SignTransaction(tx)) => Ok(tx), Err(e) => Err(e), @@ -103,11 +105,12 @@ impl ParitySigning for SigningUnsafeClient { fn compose_transaction(&self, _meta: Metadata, transaction: RpcTransactionRequest) -> BoxFuture { let accounts = self.accounts.clone(); - let default_account = accounts.default_account().ok().unwrap_or_default(); + let default_account = accounts.default_account(); Box::new(self.dispatcher.fill_optional_fields(transaction.into(), default_account, true).map(Into::into)) } - fn decrypt_message(&self, _: Metadata, address: RpcH160, data: RpcBytes) -> BoxFuture { + fn decrypt_message(&self, _: Metadata, address: H160, data: RpcBytes) -> BoxFuture { + self.deprecation_notice.print("parity_decryptMessage", deprecated::msgs::ACCOUNTS); Box::new(self.handle(RpcConfirmationPayload::Decrypt((address.clone(), data).into()), address.into()) .then(|res| match res { Ok(RpcConfirmationResponse::Decrypt(data)) => Ok(data), @@ -116,17 +119,17 @@ impl ParitySigning for SigningUnsafeClient { })) } - fn post_sign(&self, _: Metadata, _: RpcH160, _: RpcBytes) -> BoxFuture> { + fn post_sign(&self, _: Metadata, _: H160, _: RpcBytes) -> BoxFuture> { // We don't support this in non-signer mode. Box::new(future::err(errors::signer_disabled())) } - fn post_transaction(&self, _: Metadata, _: RpcTransactionRequest) -> BoxFuture> { + fn post_transaction(&self, _: Metadata, _: RpcTransactionRequest) -> BoxFuture> { // We don't support this in non-signer mode. Box::new(future::err(errors::signer_disabled())) } - fn check_request(&self, _: RpcU256) -> Result> { + fn check_request(&self, _: U256) -> Result> { // We don't support this in non-signer mode. Err(errors::signer_disabled()) } diff --git a/rpc/src/v1/impls/traces.rs b/rpc/src/v1/impls/traces.rs index 3abddd2f97d..d7428aad27b 100644 --- a/rpc/src/v1/impls/traces.rs +++ b/rpc/src/v1/impls/traces.rs @@ -1,33 +1,34 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Traces api implementation. use std::sync::Arc; use ethcore::client::{BlockChainClient, CallAnalytics, TransactionId, TraceId, StateClient, StateInfo, Call, BlockId}; +use ethereum_types::H256; use rlp::Rlp; -use transaction::SignedTransaction; +use types::transaction::SignedTransaction; use jsonrpc_core::Result; -use jsonrpc_macros::Trailing; use v1::Metadata; use v1::traits::Traces; use v1::helpers::{errors, fake_sign}; -use v1::types::{TraceFilter, LocalizedTrace, BlockNumber, Index, CallRequest, Bytes, TraceResults, TraceResultsWithTransactionHash, TraceOptions, H256, block_number_to_id}; +use v1::types::{TraceFilter, LocalizedTrace, BlockNumber, Index, CallRequest, Bytes, TraceResults, + TraceResultsWithTransactionHash, TraceOptions, block_number_to_id}; fn to_call_analytics(flags: TraceOptions) -> CallAnalytics { CallAnalytics { @@ -87,7 +88,7 @@ impl Traces for TracesClient where .map(LocalizedTrace::from)) } - fn call(&self, request: CallRequest, flags: TraceOptions, block: Trailing) -> Result { + fn call(&self, request: CallRequest, flags: TraceOptions, block: Option) -> Result { let block = block.unwrap_or_default(); let request = CallRequest::into(request); @@ -109,7 +110,7 @@ impl Traces for TracesClient where .map_err(errors::call) } - fn call_many(&self, requests: Vec<(CallRequest, TraceOptions)>, block: Trailing) -> Result> { + fn call_many(&self, requests: Vec<(CallRequest, TraceOptions)>, block: Option) -> Result> { let block = block.unwrap_or_default(); let requests = requests.into_iter() @@ -136,7 +137,7 @@ impl Traces for TracesClient where .map_err(errors::call) } - fn raw_transaction(&self, raw_transaction: Bytes, flags: TraceOptions, block: Trailing) -> Result { + fn raw_transaction(&self, raw_transaction: Bytes, flags: TraceOptions, block: Option) -> Result { let block = block.unwrap_or_default(); let tx = Rlp::new(&raw_transaction.into_vec()).as_val().map_err(|e| errors::invalid_params("Transaction is not valid RLP", e))?; diff --git a/rpc/src/v1/impls/web3.rs b/rpc/src/v1/impls/web3.rs index aa304472856..e7bf9dd49fe 100644 --- a/rpc/src/v1/impls/web3.rs +++ b/rpc/src/v1/impls/web3.rs @@ -1,25 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Web3 rpc implementation. +use ethereum_types::H256; use hash::keccak; use jsonrpc_core::Result; use version::version; use v1::traits::Web3; -use v1::types::{H256, Bytes}; +use v1::types::Bytes; /// Web3 rpc implementation. pub struct Web3Client; diff --git a/rpc/src/v1/informant.rs b/rpc/src/v1/informant.rs index dfa20ee4695..9455fa9ebbc 100644 --- a/rpc/src/v1/informant.rs +++ b/rpc/src/v1/informant.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! RPC Requests Statistics diff --git a/rpc/src/v1/metadata.rs b/rpc/src/v1/metadata.rs index 10486f496c8..3224bd2c039 100644 --- a/rpc/src/v1/metadata.rs +++ b/rpc/src/v1/metadata.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity RPC requests Metadata. use std::sync::Arc; diff --git a/rpc/src/v1/mod.rs b/rpc/src/v1/mod.rs index c9700ec4c0f..8b8afacdb1c 100644 --- a/rpc/src/v1/mod.rs +++ b/rpc/src/v1/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Ethcore rpc v1. //! @@ -41,7 +41,7 @@ pub mod informant; pub mod metadata; pub mod traits; -pub use self::traits::{Debug, Eth, EthFilter, EthPubSub, EthSigning, Net, Parity, ParityAccounts, ParitySet, ParitySigning, Personal, PubSub, Private, Rpc, SecretStore, Signer, Traces, Web3}; +pub use self::traits::{Debug, Eth, EthFilter, EthPubSub, EthSigning, Net, Parity, ParityAccountsInfo, ParityAccounts, ParitySet, ParitySetAccounts, ParitySigning, Personal, PubSub, Private, Rpc, SecretStore, Signer, Traces, Web3}; pub use self::impls::*; pub use self::helpers::{NetworkSettings, block_import, dispatch}; pub use self::metadata::Metadata; @@ -50,6 +50,8 @@ pub use self::extractors::{RpcExtractor, WsExtractor, WsStats, WsDispatcher}; /// Signer utilities pub mod signer { - pub use super::helpers::{SigningQueue, SignerService, ConfirmationsQueue}; - pub use super::types::{ConfirmationRequest, TransactionModification, U256, TransactionCondition}; + #[cfg(any(test, feature = "accounts"))] + pub use super::helpers::engine_signer::EngineSigner; + pub use super::helpers::external_signer::{SignerService, ConfirmationsQueue}; + pub use super::types::{ConfirmationRequest, TransactionModification, TransactionCondition}; } diff --git a/rpc/src/v1/tests/eth.rs b/rpc/src/v1/tests/eth.rs index 6892f991271..68710ae5591 100644 --- a/rpc/src/v1/tests/eth.rs +++ b/rpc/src/v1/tests/eth.rs @@ -1,49 +1,47 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! rpc integration tests. use std::env; use std::sync::Arc; -use ethereum_types::{H256, Address}; -use ethcore::account_provider::AccountProvider; +use accounts::AccountProvider; use ethcore::client::{BlockChainClient, Client, ClientConfig, ChainInfo, ImportBlock}; use ethcore::ethereum; -use ethcore::ids::BlockId; use ethcore::miner::Miner; use ethcore::spec::{Genesis, Spec}; use ethcore::test_helpers; -use ethcore::verification::queue::kind::blocks::Unverified; use ethcore::verification::VerifierType; +use ethcore::verification::queue::kind::blocks::Unverified; +use ethereum_types::{Address, H256, U256}; use ethjson::blockchain::BlockChain; use ethjson::spec::ForkSpec; use io::IoChannel; use miner::external::ExternalMiner; -use parking_lot::Mutex; use parity_runtime::Runtime; +use parking_lot::Mutex; +use types::ids::BlockId; use jsonrpc_core::IoHandler; -use v1::helpers::dispatch::FullDispatcher; +use v1::helpers::dispatch::{self, FullDispatcher}; use v1::helpers::nonce; use v1::impls::{EthClient, EthClientOptions, SigningUnsafeClient}; use v1::metadata::Metadata; use v1::tests::helpers::{TestSnapshotService, TestSyncProvider, Config}; -use v1::traits::eth::Eth; -use v1::traits::eth_signing::EthSigning; -use v1::types::U256 as NU256; +use v1::traits::{Eth, EthSigning}; fn account_provider() -> Arc { Arc::new(AccountProvider::transient_provider()) @@ -56,8 +54,8 @@ fn sync_provider() -> Arc { })) } -fn miner_service(spec: &Spec, accounts: Arc) -> Arc { - Arc::new(Miner::new_for_tests(spec, Some(accounts))) +fn miner_service(spec: &Spec) -> Arc { + Arc::new(Miner::new_for_tests(spec, None)) } fn snapshot_service() -> Arc { @@ -75,11 +73,11 @@ fn make_spec(chain: &BlockChain) -> Spec { } struct EthTester { - _runtime: Runtime, - client: Arc, _miner: Arc, + _runtime: Runtime, _snapshot: Arc, accounts: Arc, + client: Arc, handler: IoHandler, } @@ -95,7 +93,6 @@ impl EthTester { Self::from_spec(make_spec(chain)) }; - for b in chain.blocks_rlp() { if let Ok(block) = Unverified::from_rlp(b) { let _ = tester.client.import_block(block); @@ -116,11 +113,11 @@ impl EthTester { } fn from_spec_conf(spec: Spec, config: ClientConfig) -> Self { - let runtime = Runtime::with_thread_count(1); let account_provider = account_provider(); - let opt_account_provider = account_provider.clone(); - let miner_service = miner_service(&spec, account_provider.clone()); + let ap = account_provider.clone(); + let accounts = Arc::new(move || ap.accounts().unwrap_or_default()) as _; + let miner_service = miner_service(&spec); let snapshot_service = snapshot_service(); let client = Client::new( @@ -137,7 +134,7 @@ impl EthTester { &client, &snapshot_service, &sync_provider, - &opt_account_provider, + &accounts, &miner_service, &external_miner, EthClientOptions { @@ -153,8 +150,9 @@ impl EthTester { let reservations = Arc::new(Mutex::new(nonce::Reservations::new(runtime.executor()))); let dispatcher = FullDispatcher::new(client.clone(), miner_service.clone(), reservations, 50); + let signer = Arc::new(dispatch::Signer::new(account_provider.clone())) as _; let eth_sign = SigningUnsafeClient::new( - &opt_account_provider, + &signer, dispatcher, ); @@ -163,11 +161,11 @@ impl EthTester { handler.extend_with(eth_sign.to_delegate()); EthTester { - _runtime: runtime, _miner: miner_service, + _runtime: runtime, _snapshot: snapshot_service, - client: client, accounts: account_provider, + client: client, handler: handler, } } @@ -460,7 +458,7 @@ fn verify_transaction_counts(name: String, chain: BlockChain) { "jsonrpc": "2.0", "method": "eth_getBlockTransactionCountByNumber", "params": [ - "#.to_owned() + &::serde_json::to_string(&NU256::from(num)).unwrap() + r#" + "#.to_owned() + &::serde_json::to_string(&U256::from(num)).unwrap() + r#" ], "id": "# + format!("{}", *id).as_ref() + r#" }"#; diff --git a/rpc/src/v1/tests/helpers/miner_service.rs b/rpc/src/v1/tests/helpers/miner_service.rs index c867e685460..77618c85328 100644 --- a/rpc/src/v1/tests/helpers/miner_service.rs +++ b/rpc/src/v1/tests/helpers/miner_service.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Test implementation of miner service. @@ -20,22 +20,22 @@ use std::sync::Arc; use std::collections::{BTreeMap, BTreeSet, HashMap}; use bytes::Bytes; -use ethcore::account_provider::SignError as AccountError; -use ethcore::block::{Block, SealedBlock, IsBlock}; +use ethcore::block::{SealedBlock, IsBlock}; use ethcore::client::{Nonce, PrepareOpenBlock, StateClient, EngineInfo}; -use ethcore::engines::EthEngine; +use ethcore::engines::{EthEngine, signer::EngineSigner}; use ethcore::error::Error; -use ethcore::header::{BlockNumber, Header}; -use ethcore::ids::BlockId; use ethcore::miner::{self, MinerService, AuthoringParams}; -use ethcore::receipt::RichReceipt; use ethereum_types::{H256, U256, Address}; use miner::pool::local_transactions::Status as LocalTransactionStatus; use miner::pool::{verifier, VerifiedTransaction, QueueStatus}; use parking_lot::{RwLock, Mutex}; -use transaction::{self, UnverifiedTransaction, SignedTransaction, PendingTransaction}; +use types::transaction::{self, UnverifiedTransaction, SignedTransaction, PendingTransaction}; use txpool; -use ethkey::Password; +use types::BlockNumber; +use types::block::Block; +use types::header::Header; +use types::ids::BlockId; +use types::receipt::RichReceipt; /// Test miner service. pub struct TestMinerService { @@ -49,8 +49,10 @@ pub struct TestMinerService { pub pending_receipts: Mutex>, /// Next nonces. pub next_nonces: RwLock>, - /// Password held by Engine. - pub password: RwLock, + /// Minimum gas price + pub min_gas_price: RwLock>, + /// Signer (if any) + pub signer: RwLock>>, authoring_params: RwLock, } @@ -63,12 +65,13 @@ impl Default for TestMinerService { local_transactions: Default::default(), pending_receipts: Default::default(), next_nonces: Default::default(), - password: RwLock::new("".into()), + min_gas_price: RwLock::new(Some(0.into())), authoring_params: RwLock::new(AuthoringParams { author: Address::zero(), gas_range_target: (12345.into(), 54321.into()), extra_data: vec![1, 2, 3, 4], }), + signer: RwLock::new(None), } } } @@ -120,12 +123,11 @@ impl MinerService for TestMinerService { self.authoring_params.read().clone() } - fn set_author(&self, author: Address, password: Option) -> Result<(), AccountError> { - self.authoring_params.write().author = author; - if let Some(password) = password { - *self.password.write() = password; + fn set_author(&self, author: miner::Author) { + self.authoring_params.write().author = author.address(); + if let miner::Author::Sealer(signer) = author { + *self.signer.write() = Some(signer); } - Ok(()) } fn set_extra_data(&self, extra_data: Bytes) { @@ -280,4 +282,18 @@ impl MinerService for TestMinerService { fn sensible_gas_limit(&self) -> U256 { 0x5208.into() } + + fn set_minimal_gas_price(&self, gas_price: U256) -> Result { + let mut new_price = self.min_gas_price.write(); + match *new_price { + Some(ref mut v) => { + *v = gas_price; + Ok(true) + }, + None => { + let error_msg = "Can't update fixed gas price while automatic gas calibration is enabled."; + Err(error_msg) + }, + } + } } diff --git a/rpc/src/v1/tests/helpers/mod.rs b/rpc/src/v1/tests/helpers/mod.rs index ba87428b989..0cecd271c05 100644 --- a/rpc/src/v1/tests/helpers/mod.rs +++ b/rpc/src/v1/tests/helpers/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Test rpc services. diff --git a/rpc/src/v1/tests/helpers/snapshot_service.rs b/rpc/src/v1/tests/helpers/snapshot_service.rs index 4e45488dbe5..5450886bb42 100644 --- a/rpc/src/v1/tests/helpers/snapshot_service.rs +++ b/rpc/src/v1/tests/helpers/snapshot_service.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethcore::snapshot::{ManifestData, RestorationStatus, SnapshotService}; diff --git a/rpc/src/v1/tests/helpers/sync_provider.rs b/rpc/src/v1/tests/helpers/sync_provider.rs index b65e543e557..37c2f935531 100644 --- a/rpc/src/v1/tests/helpers/sync_provider.rs +++ b/rpc/src/v1/tests/helpers/sync_provider.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Test implementation of SyncProvider. @@ -20,6 +20,7 @@ use std::collections::BTreeMap; use ethereum_types::H256; use parking_lot::RwLock; use sync::{SyncProvider, EthProtocolInfo, SyncStatus, SyncState, PeerInfo, TransactionStats}; +use network::client_version::ClientVersion; /// TestSyncProvider config. pub struct Config { @@ -75,7 +76,7 @@ impl SyncProvider for TestSyncProvider { vec![ PeerInfo { id: Some("node1".to_owned()), - client_version: "Parity-Ethereum/1".to_owned(), + client_version: ClientVersion::from("Parity-Ethereum/1/v2.4.0/linux/rustc"), capabilities: vec!["eth/62".to_owned(), "eth/63".to_owned()], remote_address: "127.0.0.1:7777".to_owned(), local_address: "127.0.0.1:8888".to_owned(), @@ -88,7 +89,7 @@ impl SyncProvider for TestSyncProvider { }, PeerInfo { id: None, - client_version: "Parity-Ethereum/2".to_owned(), + client_version: ClientVersion::from("Parity-Ethereum/2/v2.4.0/linux/rustc"), capabilities: vec!["eth/63".to_owned(), "eth/64".to_owned()], remote_address: "Handshake".to_owned(), local_address: "127.0.0.1:3333".to_owned(), diff --git a/rpc/src/v1/tests/helpers/update_service.rs b/rpc/src/v1/tests/helpers/update_service.rs index 3c4d0b1d7de..ccf3315c47f 100644 --- a/rpc/src/v1/tests/helpers/update_service.rs +++ b/rpc/src/v1/tests/helpers/update_service.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Test implementation of fetch client. diff --git a/rpc/src/v1/tests/mocked/debug.rs b/rpc/src/v1/tests/mocked/debug.rs index d60e8ef8d6f..ffbe8d4d1c9 100644 --- a/rpc/src/v1/tests/mocked/debug.rs +++ b/rpc/src/v1/tests/mocked/debug.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; diff --git a/rpc/src/v1/tests/mocked/eth.rs b/rpc/src/v1/tests/mocked/eth.rs index aaa7fd0a422..75e05ce4674 100644 --- a/rpc/src/v1/tests/mocked/eth.rs +++ b/rpc/src/v1/tests/mocked/eth.rs @@ -1,43 +1,40 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::str::FromStr; use std::collections::HashMap; use std::sync::Arc; use std::time::{Instant, Duration, SystemTime, UNIX_EPOCH}; -use ethereum_types::{H160, H256, U256, Address}; -use parking_lot::Mutex; -use ethcore::account_provider::AccountProvider; +use accounts::AccountProvider; use ethcore::client::{BlockChainClient, BlockId, EachBlockWith, Executed, TestBlockChainClient, TransactionId}; -use ethcore::log_entry::{LocalizedLogEntry, LogEntry}; -use ethcore::miner::MinerService; -use ethcore::receipt::{LocalizedReceipt, TransactionOutcome}; -use ethkey::Secret; -use sync::SyncState; +use ethcore::miner::{self, MinerService}; +use ethereum_types::{H160, H256, U256, Address}; use miner::external::ExternalMiner; +use parity_runtime::Runtime; +use parking_lot::Mutex; use rlp; use rustc_hex::{FromHex, ToHex}; -use transaction::{Transaction, Action}; -use parity_runtime::Runtime; +use sync::SyncState; +use types::transaction::{Transaction, Action}; +use types::log_entry::{LocalizedLogEntry, LogEntry}; +use types::receipt::{LocalizedReceipt, TransactionOutcome}; use jsonrpc_core::IoHandler; -use v1::{Eth, EthClient, EthClientOptions, EthFilter, EthFilterClient, EthSigning, SigningUnsafeClient}; -use v1::helpers::nonce; -use v1::helpers::dispatch::FullDispatcher; +use v1::{Eth, EthClient, EthClientOptions, EthFilter, EthFilterClient}; use v1::tests::helpers::{TestSyncProvider, Config, TestMinerService, TestSnapshotService}; use v1::metadata::Metadata; @@ -88,21 +85,17 @@ impl EthTester { let client = blockchain_client(); let sync = sync_provider(); let ap = accounts_provider(); - let opt_ap = ap.clone(); + let ap2 = ap.clone(); + let opt_ap = Arc::new(move || ap2.accounts().unwrap_or_default()) as _; let miner = miner_service(); let snapshot = snapshot_service(); let hashrates = Arc::new(Mutex::new(HashMap::new())); let external_miner = Arc::new(ExternalMiner::new(hashrates.clone())); - let gas_price_percentile = options.gas_price_percentile; let eth = EthClient::new(&client, &snapshot, &sync, &opt_ap, &miner, &external_miner, options).to_delegate(); let filter = EthFilterClient::new(client.clone(), miner.clone(), 60).to_delegate(); - let reservations = Arc::new(Mutex::new(nonce::Reservations::new(runtime.executor()))); - let dispatcher = FullDispatcher::new(client.clone(), miner.clone(), reservations, gas_price_percentile); - let sign = SigningUnsafeClient::new(&opt_ap, dispatcher).to_delegate(); let mut io: IoHandler = IoHandler::default(); io.extend_with(eth); - io.extend_with(sign); io.extend_with(filter); EthTester { @@ -360,28 +353,6 @@ fn rpc_eth_submit_hashrate() { U256::from(0x500_000)); } -#[test] -fn rpc_eth_sign() { - let tester = EthTester::default(); - - let account = tester.accounts_provider.insert_account(Secret::from([69u8; 32]), &"abcd".into()).unwrap(); - tester.accounts_provider.unlock_account_permanently(account, "abcd".into()).unwrap(); - let _message = "0cc175b9c0f1b6a831c399e26977266192eb5ffee6ae2fec3ad71c777531578f".from_hex().unwrap(); - - let req = r#"{ - "jsonrpc": "2.0", - "method": "eth_sign", - "params": [ - ""#.to_owned() + &format!("0x{:x}", account) + r#"", - "0x0cc175b9c0f1b6a831c399e26977266192eb5ffee6ae2fec3ad71c777531578f" - ], - "id": 1 - }"#; - let res = r#"{"jsonrpc":"2.0","result":"0xa2870db1d0c26ef93c7b72d2a0830fa6b841e0593f7186bc6c7cc317af8cf3a42fda03bd589a49949aa05db83300cdb553116274518dbe9d90c65d0213f4af491b","id":1}"#; - - assert_eq!(tester.io.handle_request_sync(&req), Some(res.into())); -} - #[test] fn rpc_eth_author() { let make_res = |addr| r#"{"jsonrpc":"2.0","result":""#.to_owned() + &format!("0x{:x}", addr) + r#"","id":1}"#; @@ -405,7 +376,7 @@ fn rpc_eth_author() { for i in 0..20 { let addr = tester.accounts_provider.new_account(&format!("{}", i).into()).unwrap(); - tester.miner.set_author(addr.clone(), None).unwrap(); + tester.miner.set_author(miner::Author::External(addr)); assert_eq!(tester.io.handle_request_sync(request), Some(make_res(addr))); } @@ -414,7 +385,7 @@ fn rpc_eth_author() { #[test] fn rpc_eth_mining() { let tester = EthTester::default(); - tester.miner.set_author(Address::from_str("d46e8dd67c5d32be8058bb8eb970870f07244567").unwrap(), None).unwrap(); + tester.miner.set_author(miner::Author::External(Address::from_str("d46e8dd67c5d32be8058bb8eb970870f07244567").unwrap())); let request = r#"{"jsonrpc": "2.0", "method": "eth_mining", "params": [], "id": 1}"#; let response = r#"{"jsonrpc":"2.0","result":false,"id":1}"#; @@ -584,7 +555,7 @@ fn rpc_eth_transaction_count_by_number_pending() { fn rpc_eth_pending_transaction_by_hash() { use ethereum_types::H256; use rlp; - use transaction::SignedTransaction; + use types::transaction::SignedTransaction; let tester = EthTester::default(); { @@ -824,157 +795,6 @@ fn rpc_eth_estimate_gas_default_block() { assert_eq!(tester.io.handle_request_sync(request), Some(response.to_owned())); } -#[test] -fn rpc_eth_send_transaction() { - let tester = EthTester::default(); - let address = tester.accounts_provider.new_account(&"".into()).unwrap(); - tester.accounts_provider.unlock_account_permanently(address, "".into()).unwrap(); - let request = r#"{ - "jsonrpc": "2.0", - "method": "eth_sendTransaction", - "params": [{ - "from": ""#.to_owned() + format!("0x{:x}", address).as_ref() + r#"", - "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567", - "gas": "0x76c0", - "gasPrice": "0x9184e72a000", - "value": "0x9184e72a" - }], - "id": 1 - }"#; - - let t = Transaction { - nonce: U256::zero(), - gas_price: U256::from(0x9184e72a000u64), - gas: U256::from(0x76c0), - action: Action::Call(Address::from_str("d46e8dd67c5d32be8058bb8eb970870f07244567").unwrap()), - value: U256::from(0x9184e72au64), - data: vec![] - }; - let signature = tester.accounts_provider.sign(address, None, t.hash(None)).unwrap(); - let t = t.with_signature(signature, None); - - let response = r#"{"jsonrpc":"2.0","result":""#.to_owned() + format!("0x{:x}", t.hash()).as_ref() + r#"","id":1}"#; - - assert_eq!(tester.io.handle_request_sync(&request), Some(response)); - - tester.miner.increment_nonce(&address); - - let t = Transaction { - nonce: U256::one(), - gas_price: U256::from(0x9184e72a000u64), - gas: U256::from(0x76c0), - action: Action::Call(Address::from_str("d46e8dd67c5d32be8058bb8eb970870f07244567").unwrap()), - value: U256::from(0x9184e72au64), - data: vec![] - }; - let signature = tester.accounts_provider.sign(address, None, t.hash(None)).unwrap(); - let t = t.with_signature(signature, None); - - let response = r#"{"jsonrpc":"2.0","result":""#.to_owned() + format!("0x{:x}", t.hash()).as_ref() + r#"","id":1}"#; - - assert_eq!(tester.io.handle_request_sync(&request), Some(response)); -} - -#[test] -fn rpc_eth_sign_transaction() { - let tester = EthTester::default(); - let address = tester.accounts_provider.new_account(&"".into()).unwrap(); - tester.accounts_provider.unlock_account_permanently(address, "".into()).unwrap(); - let request = r#"{ - "jsonrpc": "2.0", - "method": "eth_signTransaction", - "params": [{ - "from": ""#.to_owned() + format!("0x{:x}", address).as_ref() + r#"", - "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567", - "gas": "0x76c0", - "gasPrice": "0x9184e72a000", - "value": "0x9184e72a" - }], - "id": 1 - }"#; - - let t = Transaction { - nonce: U256::one(), - gas_price: U256::from(0x9184e72a000u64), - gas: U256::from(0x76c0), - action: Action::Call(Address::from_str("d46e8dd67c5d32be8058bb8eb970870f07244567").unwrap()), - value: U256::from(0x9184e72au64), - data: vec![] - }; - let signature = tester.accounts_provider.sign(address, None, t.hash(None)).unwrap(); - let t = t.with_signature(signature, None); - let signature = t.signature(); - let rlp = rlp::encode(&t); - - let response = r#"{"jsonrpc":"2.0","result":{"#.to_owned() + - r#""raw":"0x"# + &rlp.to_hex() + r#"","# + - r#""tx":{"# + - r#""blockHash":null,"blockNumber":null,"# + - &format!("\"chainId\":{},", t.chain_id().map_or("null".to_owned(), |n| format!("{}", n))) + - r#""condition":null,"creates":null,"# + - &format!("\"from\":\"0x{:x}\",", &address) + - r#""gas":"0x76c0","gasPrice":"0x9184e72a000","# + - &format!("\"hash\":\"0x{:x}\",", t.hash()) + - r#""input":"0x","# + - r#""nonce":"0x1","# + - &format!("\"publicKey\":\"0x{:x}\",", t.recover_public().unwrap()) + - &format!("\"r\":\"0x{:x}\",", U256::from(signature.r())) + - &format!("\"raw\":\"0x{}\",", rlp.to_hex()) + - &format!("\"s\":\"0x{:x}\",", U256::from(signature.s())) + - &format!("\"standardV\":\"0x{:x}\",", U256::from(t.standard_v())) + - r#""to":"0xd46e8dd67c5d32be8058bb8eb970870f07244567","transactionIndex":null,"# + - &format!("\"v\":\"0x{:x}\",", U256::from(t.original_v())) + - r#""value":"0x9184e72a""# + - r#"}},"id":1}"#; - - tester.miner.increment_nonce(&address); - - assert_eq!(tester.io.handle_request_sync(&request), Some(response)); -} - -#[test] -fn rpc_eth_send_transaction_with_bad_to() { - let tester = EthTester::default(); - let address = tester.accounts_provider.new_account(&"".into()).unwrap(); - let request = r#"{ - "jsonrpc": "2.0", - "method": "eth_sendTransaction", - "params": [{ - "from": ""#.to_owned() + format!("0x{:x}", address).as_ref() + r#"", - "to": "", - "gas": "0x76c0", - "gasPrice": "0x9184e72a000", - "value": "0x9184e72a" - }], - "id": 1 - }"#; - - let response = r#"{"jsonrpc":"2.0","error":{"code":-32602,"message":"Invalid params: expected a hex-encoded hash with 0x prefix."},"id":1}"#; - - assert_eq!(tester.io.handle_request_sync(&request), Some(response.into())); -} - -#[test] -fn rpc_eth_send_transaction_error() { - let tester = EthTester::default(); - let address = tester.accounts_provider.new_account(&"".into()).unwrap(); - let request = r#"{ - "jsonrpc": "2.0", - "method": "eth_sendTransaction", - "params": [{ - "from": ""#.to_owned() + format!("0x{:x}", address).as_ref() + r#"", - "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567", - "gas": "0x76c0", - "gasPrice": "0x9184e72a000", - "value": "0x9184e72a" - }], - "id": 1 - }"#; - - let response = r#"{"jsonrpc":"2.0","error":{"code":-32020,"message":"Your account is locked. Unlock the account via CLI, personal_unlockAccount or use Trusted Signer.","data":"NotUnlocked"},"id":1}"#; - assert_eq!(tester.io.handle_request_sync(&request), Some(response.into())); -} - #[test] fn rpc_eth_send_raw_transaction_error() { let tester = EthTester::default(); @@ -1141,7 +961,7 @@ fn rpc_get_work_returns_no_work_if_cant_mine() { #[test] fn rpc_get_work_returns_correct_work_package() { let eth_tester = EthTester::default(); - eth_tester.miner.set_author(Address::from_str("d46e8dd67c5d32be8058bb8eb970870f07244567").unwrap(), None).unwrap(); + eth_tester.miner.set_author(miner::Author::External(Address::from_str("d46e8dd67c5d32be8058bb8eb970870f07244567").unwrap())); let request = r#"{"jsonrpc": "2.0", "method": "eth_getWork", "params": [], "id": 1}"#; let response = r#"{"jsonrpc":"2.0","result":["0x76c7bd86693aee93d1a80a408a09a0585b1a1292afcb56192f171d925ea18e2d","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000800000000000000000000000000000000000000000000000000000000000","0x1"],"id":1}"#; @@ -1154,7 +974,7 @@ fn rpc_get_work_should_not_return_block_number() { let eth_tester = EthTester::new_with_options(EthClientOptions::with(|options| { options.send_block_number_in_get_work = false; })); - eth_tester.miner.set_author(Address::from_str("d46e8dd67c5d32be8058bb8eb970870f07244567").unwrap(), None).unwrap(); + eth_tester.miner.set_author(miner::Author::External(Address::from_str("d46e8dd67c5d32be8058bb8eb970870f07244567").unwrap())); let request = r#"{"jsonrpc": "2.0", "method": "eth_getWork", "params": [], "id": 1}"#; let response = r#"{"jsonrpc":"2.0","result":["0x76c7bd86693aee93d1a80a408a09a0585b1a1292afcb56192f171d925ea18e2d","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000800000000000000000000000000000000000000000000000000000000000"],"id":1}"#; @@ -1165,7 +985,7 @@ fn rpc_get_work_should_not_return_block_number() { #[test] fn rpc_get_work_should_timeout() { let eth_tester = EthTester::default(); - eth_tester.miner.set_author(Address::from_str("d46e8dd67c5d32be8058bb8eb970870f07244567").unwrap(), None).unwrap(); + eth_tester.miner.set_author(miner::Author::External(Address::from_str("d46e8dd67c5d32be8058bb8eb970870f07244567").unwrap())); let timestamp = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs() - 1000; // Set latest block to 1000 seconds ago eth_tester.client.set_latest_block_timestamp(timestamp); let hash = eth_tester.miner.work_package(&*eth_tester.client).unwrap().0; diff --git a/rpc/src/v1/tests/mocked/eth_pubsub.rs b/rpc/src/v1/tests/mocked/eth_pubsub.rs index 2eb1295d835..6fd7394a4b2 100644 --- a/rpc/src/v1/tests/mocked/eth_pubsub.rs +++ b/rpc/src/v1/tests/mocked/eth_pubsub.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; @@ -84,9 +84,9 @@ fn should_subscribe_to_new_heads() { #[test] fn should_subscribe_to_logs() { - use ethcore::log_entry::{LocalizedLogEntry, LogEntry}; - use ethcore::ids::BlockId; use ethcore::client::BlockInfo; + use types::log_entry::{LocalizedLogEntry, LogEntry}; + use types::ids::BlockId; // given let el = Runtime::with_thread_count(1); diff --git a/rpc/src/v1/tests/mocked/manage_network.rs b/rpc/src/v1/tests/mocked/manage_network.rs index a742f03c2f9..d327a8743c6 100644 --- a/rpc/src/v1/tests/mocked/manage_network.rs +++ b/rpc/src/v1/tests/mocked/manage_network.rs @@ -1,20 +1,20 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use std::ops::Range; +use std::ops::RangeInclusive; use sync::ManageNetwork; use self::ethcore_network::{ProtocolId, NetworkContext}; @@ -30,6 +30,6 @@ impl ManageNetwork for TestManageNetwork { fn add_reserved_peer(&self, _peer: String) -> Result<(), String> { Ok(()) } fn start_network(&self) {} fn stop_network(&self) {} - fn num_peers_range(&self) -> Range { 25 .. 51 } + fn num_peers_range(&self) -> RangeInclusive { 25..=50 } fn with_proto_context(&self, _: ProtocolId, _: &mut FnMut(&NetworkContext)) { } } diff --git a/rpc/src/v1/tests/mocked/mod.rs b/rpc/src/v1/tests/mocked/mod.rs index 9eabe2aa217..35d109b1715 100644 --- a/rpc/src/v1/tests/mocked/mod.rs +++ b/rpc/src/v1/tests/mocked/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! RPC mocked tests. Most of these test that the RPC server is serializing and forwarding //! method calls properly. @@ -23,13 +23,19 @@ mod eth_pubsub; mod manage_network; mod net; mod parity; +#[cfg(any(test, feature = "accounts"))] mod parity_accounts; mod parity_set; +#[cfg(any(test, feature = "accounts"))] mod personal; mod pubsub; mod rpc; +#[cfg(any(test, feature = "accounts"))] mod secretstore; mod signer; +#[cfg(any(test, feature = "accounts"))] mod signing; +#[cfg(any(test, feature = "accounts"))] +mod signing_unsafe; mod traces; mod web3; diff --git a/rpc/src/v1/tests/mocked/net.rs b/rpc/src/v1/tests/mocked/net.rs index b94bf2b1138..ff6d152d825 100644 --- a/rpc/src/v1/tests/mocked/net.rs +++ b/rpc/src/v1/tests/mocked/net.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use jsonrpc_core::IoHandler; diff --git a/rpc/src/v1/tests/mocked/parity.rs b/rpc/src/v1/tests/mocked/parity.rs index d978a4ac742..6608589f557 100644 --- a/rpc/src/v1/tests/mocked/parity.rs +++ b/rpc/src/v1/tests/mocked/parity.rs @@ -1,33 +1,33 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; -use ethcore::account_provider::AccountProvider; use ethcore::client::{TestBlockChainClient, Executed, TransactionId}; -use ethcore::receipt::{LocalizedReceipt, TransactionOutcome}; use ethcore_logger::RotatingLogger; use ethereum_types::{Address, U256, H256}; use ethstore::ethkey::{Generator, Random}; use miner::pool::local_transactions::Status as LocalTransactionStatus; use sync::ManageNetwork; +use types::receipt::{LocalizedReceipt, TransactionOutcome}; use jsonrpc_core::IoHandler; use v1::{Parity, ParityClient}; use v1::metadata::Metadata; -use v1::helpers::{SignerService, NetworkSettings}; +use v1::helpers::NetworkSettings; +use v1::helpers::external_signer::SignerService; use v1::tests::helpers::{TestSyncProvider, Config, TestMinerService, TestUpdater}; use super::manage_network::TestManageNetwork; use Host; @@ -42,7 +42,6 @@ pub struct Dependencies { pub logger: Arc, pub settings: Arc, pub network: Arc, - pub accounts: Arc, pub ws_address: Option, } @@ -67,7 +66,6 @@ impl Dependencies { rpc_port: 8545, }), network: Arc::new(TestManageNetwork), - accounts: Arc::new(AccountProvider::transient_provider()), ws_address: Some("127.0.0.1:18546".into()), } } @@ -79,7 +77,6 @@ impl Dependencies { self.sync.clone(), self.updater.clone(), self.network.clone(), - self.accounts.clone(), self.logger.clone(), self.settings.clone(), signer, @@ -101,47 +98,6 @@ impl Dependencies { } } -#[test] -fn rpc_parity_accounts_info() { - let deps = Dependencies::new(); - let io = deps.default_client(); - - deps.accounts.new_account(&"".into()).unwrap(); - let accounts = deps.accounts.accounts().unwrap(); - assert_eq!(accounts.len(), 1); - let address = accounts[0]; - - deps.accounts.set_address_name(1.into(), "XX".into()); - deps.accounts.set_account_name(address.clone(), "Test".into()).unwrap(); - deps.accounts.set_account_meta(address.clone(), "{foo: 69}".into()).unwrap(); - - let request = r#"{"jsonrpc": "2.0", "method": "parity_accountsInfo", "params": [], "id": 1}"#; - let response = format!("{{\"jsonrpc\":\"2.0\",\"result\":{{\"0x{:x}\":{{\"name\":\"Test\"}}}},\"id\":1}}", address); - assert_eq!(io.handle_request_sync(request), Some(response)); -} - -#[test] -fn rpc_parity_default_account() { - let deps = Dependencies::new(); - let io = deps.default_client(); - - // Check empty - let address = Address::default(); - let request = r#"{"jsonrpc": "2.0", "method": "parity_defaultAccount", "params": [], "id": 1}"#; - let response = format!("{{\"jsonrpc\":\"2.0\",\"result\":\"0x{:x}\",\"id\":1}}", address); - assert_eq!(io.handle_request_sync(request), Some(response)); - - // With account - deps.accounts.new_account(&"".into()).unwrap(); - let accounts = deps.accounts.accounts().unwrap(); - assert_eq!(accounts.len(), 1); - let address = accounts[0]; - - let request = r#"{"jsonrpc": "2.0", "method": "parity_defaultAccount", "params": [], "id": 1}"#; - let response = format!("{{\"jsonrpc\":\"2.0\",\"result\":\"0x{:x}\",\"id\":1}}", address); - assert_eq!(io.handle_request_sync(request), Some(response)); -} - #[test] fn rpc_parity_consensus_capability() { let deps = Dependencies::new(); @@ -295,7 +251,7 @@ fn rpc_parity_net_peers() { let io = deps.default_client(); let request = r#"{"jsonrpc": "2.0", "method": "parity_netPeers", "params":[], "id": 1}"#; - let response = r#"{"jsonrpc":"2.0","result":{"active":0,"connected":120,"max":50,"peers":[{"caps":["eth/62","eth/63"],"id":"node1","name":"Parity-Ethereum/1","network":{"localAddress":"127.0.0.1:8888","remoteAddress":"127.0.0.1:7777"},"protocols":{"eth":{"difficulty":"0x28","head":"0000000000000000000000000000000000000000000000000000000000000032","version":62},"pip":null}},{"caps":["eth/63","eth/64"],"id":null,"name":"Parity-Ethereum/2","network":{"localAddress":"127.0.0.1:3333","remoteAddress":"Handshake"},"protocols":{"eth":{"difficulty":null,"head":"000000000000000000000000000000000000000000000000000000000000003c","version":64},"pip":null}}]},"id":1}"#; + let response = r#"{"jsonrpc":"2.0","result":{"active":0,"connected":120,"max":50,"peers":[{"caps":["eth/62","eth/63"],"id":"node1","name":{"ParityClient":{"can_handle_large_requests":true,"compiler":"rustc","identity":"1","name":"Parity-Ethereum","os":"linux","semver":"2.4.0"}},"network":{"localAddress":"127.0.0.1:8888","remoteAddress":"127.0.0.1:7777"},"protocols":{"eth":{"difficulty":"0x28","head":"0000000000000000000000000000000000000000000000000000000000000032","version":62},"pip":null}},{"caps":["eth/63","eth/64"],"id":null,"name":{"ParityClient":{"can_handle_large_requests":true,"compiler":"rustc","identity":"2","name":"Parity-Ethereum","os":"linux","semver":"2.4.0"}},"network":{"localAddress":"127.0.0.1:3333","remoteAddress":"Handshake"},"protocols":{"eth":{"difficulty":null,"head":"000000000000000000000000000000000000000000000000000000000000003c","version":64},"pip":null}}]},"id":1}"#; assert_eq!(io.handle_request_sync(request), Some(response.to_owned())); } @@ -433,11 +389,11 @@ fn rpc_parity_transactions_stats() { fn rpc_parity_local_transactions() { let deps = Dependencies::new(); let io = deps.default_client(); - let tx = ::transaction::Transaction { + let tx = ::types::transaction::Transaction { value: 5.into(), gas: 3.into(), gas_price: 2.into(), - action: ::transaction::Action::Create, + action: ::types::transaction::Action::Create, data: vec![1, 2, 3], nonce: 0.into(), }.fake_sign(3.into()); diff --git a/rpc/src/v1/tests/mocked/parity_accounts.rs b/rpc/src/v1/tests/mocked/parity_accounts.rs index 4a1f72173bd..5b2e0762b18 100644 --- a/rpc/src/v1/tests/mocked/parity_accounts.rs +++ b/rpc/src/v1/tests/mocked/parity_accounts.rs @@ -1,28 +1,29 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; -use ethcore::account_provider::{AccountProvider, AccountProviderSettings}; +use accounts::{AccountProvider, AccountProviderSettings}; +use ethereum_types::Address; use ethstore::EthStore; use ethstore::accounts_dir::RootDiskDirectory; use tempdir::TempDir; use jsonrpc_core::IoHandler; -use v1::{ParityAccounts, ParityAccountsClient}; +use v1::{ParityAccounts, ParityAccountsInfo, ParityAccountsClient}; struct ParityAccountsTester { accounts: Arc, @@ -42,8 +43,10 @@ fn accounts_provider_with_vaults_support(temp_path: &str) -> Arc) -> ParityAccountsTester { let opt_ap = accounts_provider.clone(); let parity_accounts = ParityAccountsClient::new(&opt_ap); + let parity_accounts2 = ParityAccountsClient::new(&opt_ap); let mut io = IoHandler::default(); - io.extend_with(parity_accounts.to_delegate()); + io.extend_with(ParityAccounts::to_delegate(parity_accounts)); + io.extend_with(ParityAccountsInfo::to_delegate(parity_accounts2)); let tester = ParityAccountsTester { accounts: accounts_provider, @@ -61,6 +64,47 @@ fn setup_with_vaults_support(temp_path: &str) -> ParityAccountsTester { setup_with_accounts_provider(accounts_provider_with_vaults_support(temp_path)) } +#[test] +fn rpc_parity_accounts_info() { + let tester = setup(); + let io = tester.io; + + tester.accounts.new_account(&"".into()).unwrap(); + let accounts = tester.accounts.accounts().unwrap(); + assert_eq!(accounts.len(), 1); + let address = accounts[0]; + + tester.accounts.set_address_name(1.into(), "XX".into()); + tester.accounts.set_account_name(address.clone(), "Test".into()).unwrap(); + tester.accounts.set_account_meta(address.clone(), "{foo: 69}".into()).unwrap(); + + let request = r#"{"jsonrpc": "2.0", "method": "parity_accountsInfo", "params": [], "id": 1}"#; + let response = format!("{{\"jsonrpc\":\"2.0\",\"result\":{{\"0x{:x}\":{{\"name\":\"Test\"}}}},\"id\":1}}", address); + assert_eq!(io.handle_request_sync(request), Some(response)); +} + +#[test] +fn rpc_parity_default_account() { + let tester = setup(); + let io = tester.io; + + // Check empty + let address = Address::default(); + let request = r#"{"jsonrpc": "2.0", "method": "parity_defaultAccount", "params": [], "id": 1}"#; + let response = format!("{{\"jsonrpc\":\"2.0\",\"result\":\"0x{:x}\",\"id\":1}}", address); + assert_eq!(io.handle_request_sync(request), Some(response)); + + // With account + tester.accounts.new_account(&"".into()).unwrap(); + let accounts = tester.accounts.accounts().unwrap(); + assert_eq!(accounts.len(), 1); + let address = accounts[0]; + + let request = r#"{"jsonrpc": "2.0", "method": "parity_defaultAccount", "params": [], "id": 1}"#; + let response = format!("{{\"jsonrpc\":\"2.0\",\"result\":\"0x{:x}\",\"id\":1}}", address); + assert_eq!(io.handle_request_sync(request), Some(response)); +} + #[test] fn should_be_able_to_get_account_info() { let tester = setup(); diff --git a/rpc/src/v1/tests/mocked/parity_set.rs b/rpc/src/v1/tests/mocked/parity_set.rs index 6438a6661c3..25c13fb1cb6 100644 --- a/rpc/src/v1/tests/mocked/parity_set.rs +++ b/rpc/src/v1/tests/mocked/parity_set.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::str::FromStr; @@ -54,7 +54,13 @@ fn parity_set_client( updater: &Arc, net: &Arc, ) -> TestParitySetClient { - ParitySetClient::new(client, miner, updater, &(net.clone() as Arc), FakeFetch::new(Some(1))) + ParitySetClient::new( + client, + miner, + updater, + &(net.clone() as Arc), + FakeFetch::new(Some(1)), + ) } #[test] @@ -106,14 +112,16 @@ fn rpc_parity_set_min_gas_price() { io.extend_with(parity_set_client(&client, &miner, &updater, &network).to_delegate()); let request = r#"{"jsonrpc": "2.0", "method": "parity_setMinGasPrice", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"#; - let response = r#"{"jsonrpc":"2.0","result":false,"id":1}"#; + let response = r#"{"jsonrpc":"2.0","result":true,"id":1}"#; assert_eq!(io.handle_request_sync(request), Some(response.to_owned())); } #[test] -fn rpc_parity_set_gas_floor_target() { +fn rpc_parity_set_min_gas_price_with_automated_calibration_enabled() { let miner = miner_service(); + *miner.min_gas_price.write() = None; + let client = client_service(); let network = network_service(); let updater = updater_service(); @@ -121,15 +129,14 @@ fn rpc_parity_set_gas_floor_target() { let mut io = IoHandler::new(); io.extend_with(parity_set_client(&client, &miner, &updater, &network).to_delegate()); - let request = r#"{"jsonrpc": "2.0", "method": "parity_setGasFloorTarget", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"#; - let response = r#"{"jsonrpc":"2.0","result":true,"id":1}"#; + let request = r#"{"jsonrpc": "2.0", "method": "parity_setMinGasPrice", "params":["0xdeadbeef"], "id": 1}"#; + let response = r#"{"jsonrpc":"2.0","error":{"code":-32000,"message":"Can't update fixed gas price while automatic gas calibration is enabled."},"id":1}"#; assert_eq!(io.handle_request_sync(request), Some(response.to_owned())); - assert_eq!(miner.authoring_params().gas_range_target.0, U256::from_str("cd1722f3947def4cf144679da39c4c32bdc35681").unwrap()); } #[test] -fn rpc_parity_set_extra_data() { +fn rpc_parity_set_gas_floor_target() { let miner = miner_service(); let client = client_service(); let network = network_service(); @@ -138,31 +145,32 @@ fn rpc_parity_set_extra_data() { let mut io = IoHandler::new(); io.extend_with(parity_set_client(&client, &miner, &updater, &network).to_delegate()); - let request = r#"{"jsonrpc": "2.0", "method": "parity_setExtraData", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"#; + let request = r#"{"jsonrpc": "2.0", "method": "parity_setGasFloorTarget", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"#; let response = r#"{"jsonrpc":"2.0","result":true,"id":1}"#; assert_eq!(io.handle_request_sync(request), Some(response.to_owned())); - assert_eq!(miner.authoring_params().extra_data, "cd1722f3947def4cf144679da39c4c32bdc35681".from_hex().unwrap()); + assert_eq!(miner.authoring_params().gas_range_target.0, U256::from_str("cd1722f3947def4cf144679da39c4c32bdc35681").unwrap()); } #[test] -fn rpc_parity_set_author() { +fn rpc_parity_set_extra_data() { let miner = miner_service(); let client = client_service(); let network = network_service(); let updater = updater_service(); + let mut io = IoHandler::new(); io.extend_with(parity_set_client(&client, &miner, &updater, &network).to_delegate()); - let request = r#"{"jsonrpc": "2.0", "method": "parity_setAuthor", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"#; + let request = r#"{"jsonrpc": "2.0", "method": "parity_setExtraData", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"#; let response = r#"{"jsonrpc":"2.0","result":true,"id":1}"#; assert_eq!(io.handle_request_sync(request), Some(response.to_owned())); - assert_eq!(miner.authoring_params().author, Address::from_str("cd1722f3947def4cf144679da39c4c32bdc35681").unwrap()); + assert_eq!(miner.authoring_params().extra_data, "cd1722f3947def4cf144679da39c4c32bdc35681".from_hex().unwrap()); } #[test] -fn rpc_parity_set_engine_signer() { +fn rpc_parity_set_author() { let miner = miner_service(); let client = client_service(); let network = network_service(); @@ -170,12 +178,11 @@ fn rpc_parity_set_engine_signer() { let mut io = IoHandler::new(); io.extend_with(parity_set_client(&client, &miner, &updater, &network).to_delegate()); - let request = r#"{"jsonrpc": "2.0", "method": "parity_setEngineSigner", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681", "password"], "id": 1}"#; + let request = r#"{"jsonrpc": "2.0", "method": "parity_setAuthor", "params":["0xcd1722f3947def4cf144679da39c4c32bdc35681"], "id": 1}"#; let response = r#"{"jsonrpc":"2.0","result":true,"id":1}"#; assert_eq!(io.handle_request_sync(request), Some(response.to_owned())); assert_eq!(miner.authoring_params().author, Address::from_str("cd1722f3947def4cf144679da39c4c32bdc35681").unwrap()); - assert_eq!(*miner.password.read(), "password".into()); } #[test] @@ -210,7 +217,7 @@ fn rpc_parity_set_hash_content() { #[test] fn rpc_parity_remove_transaction() { - use transaction::{Transaction, Action}; + use types::transaction::{Transaction, Action}; let miner = miner_service(); let client = client_service(); @@ -236,3 +243,29 @@ fn rpc_parity_remove_transaction() { miner.pending_transactions.lock().insert(hash, signed); assert_eq!(io.handle_request_sync(&request), Some(response.to_owned())); } + +#[test] +fn rpc_parity_set_engine_signer() { + use accounts::AccountProvider; + use bytes::ToPretty; + use v1::impls::ParitySetAccountsClient; + use v1::traits::ParitySetAccounts; + + let account_provider = Arc::new(AccountProvider::transient_provider()); + account_provider.insert_account(::hash::keccak("cow").into(), &"password".into()).unwrap(); + + let miner = miner_service(); + let mut io = IoHandler::new(); + io.extend_with( + ParitySetAccountsClient::new(&account_provider, &miner).to_delegate() + ); + + let request = r#"{"jsonrpc": "2.0", "method": "parity_setEngineSigner", "params":["0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826", "password"], "id": 1}"#; + let response = r#"{"jsonrpc":"2.0","result":true,"id":1}"#; + + assert_eq!(io.handle_request_sync(request), Some(response.to_owned())); + assert_eq!(miner.authoring_params().author, Address::from_str("cd2a3d9f938e13cd947ec05abc7fe734df8dd826").unwrap()); + let signature = miner.signer.read().as_ref().unwrap().sign(::hash::keccak("x")).unwrap().to_vec(); + assert_eq!(&format!("{}", signature.pretty()), "6f46069ded2154af6e806706e4f7f6fd310ac45f3c6dccb85f11c0059ee20a09245df0a0008bb84a10882b1298284bc93058e7bc5938ea728e77620061687a6401"); +} + diff --git a/rpc/src/v1/tests/mocked/personal.rs b/rpc/src/v1/tests/mocked/personal.rs index 143b19fa8d6..a2d6b87ce26 100644 --- a/rpc/src/v1/tests/mocked/personal.rs +++ b/rpc/src/v1/tests/mocked/personal.rs @@ -1,29 +1,29 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::str::FromStr; use bytes::ToPretty; -use ethereum_types::{U256, Address}; -use ethcore::account_provider::AccountProvider; +use accounts::AccountProvider; +use ethereum_types::{Address, H520, U256}; use ethcore::client::TestBlockChainClient; use jsonrpc_core::IoHandler; use parking_lot::Mutex; -use transaction::{Action, Transaction}; +use types::transaction::{Action, Transaction}; use parity_runtime::Runtime; use hash::keccak; @@ -31,7 +31,7 @@ use v1::{PersonalClient, Personal, Metadata}; use v1::helpers::{nonce, eip191}; use v1::helpers::dispatch::{eth_data_hash, FullDispatcher}; use v1::tests::helpers::TestMinerService; -use v1::types::{EIP191Version, PresignedTransaction, H520}; +use v1::types::{EIP191Version, PresignedTransaction}; use rustc_hex::ToHex; use serde_json::to_value; use ethkey::Secret; @@ -156,7 +156,7 @@ fn sign() { let hash = eth_data_hash(data); let signature = H520(tester.accounts.sign(address, Some("password123".into()), hash).unwrap().into_electrum()); - let signature = format!("0x{:?}", signature); + let signature = format!("{:?}", signature); let response = r#"{"jsonrpc":"2.0","result":""#.to_owned() + &signature + r#"","id":1}"#; @@ -264,7 +264,7 @@ fn ec_recover() { let hash = eth_data_hash(data.clone()); let signature = H520(tester.accounts.sign(address, Some("password123".into()), hash).unwrap().into_electrum()); - let signature = format!("0x{:?}", signature); + let signature = format!("{:?}", signature); let request = r#"{ "jsonrpc": "2.0", @@ -303,7 +303,7 @@ fn ec_recover_invalid_signature() { } #[test] -fn should_unlock_not_account_temporarily_if_allow_perm_is_disabled() { +fn should_not_unlock_account_temporarily_if_allow_perm_is_disabled() { let tester = setup(); let address = tester.accounts.new_account(&"password123".into()).unwrap(); @@ -317,7 +317,7 @@ fn should_unlock_not_account_temporarily_if_allow_perm_is_disabled() { ], "id": 1 }"#; - let response = r#"{"jsonrpc":"2.0","error":{"code":-32000,"message":"Time-unlocking is only supported in --geth compatibility mode.","data":"Restart your client with --geth flag or use personal_sendTransaction instead."},"id":1}"#; + let response = r#"{"jsonrpc":"2.0","error":{"code":-32000,"message":"Time-unlocking is not supported when permanent unlock is disabled.","data":"Use personal_sendTransaction or enable permanent unlocking, instead."},"id":1}"#; assert_eq!(tester.io.handle_request_sync(&request), Some(response.into())); assert!(tester.accounts.sign(address, None, Default::default()).is_err(), "Should not unlock account."); diff --git a/rpc/src/v1/tests/mocked/pubsub.rs b/rpc/src/v1/tests/mocked/pubsub.rs index c5f965cdac2..c0f664d5fc1 100644 --- a/rpc/src/v1/tests/mocked/pubsub.rs +++ b/rpc/src/v1/tests/mocked/pubsub.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::{atomic, Arc}; diff --git a/rpc/src/v1/tests/mocked/rpc.rs b/rpc/src/v1/tests/mocked/rpc.rs index ed6503cea5f..d4634ac90e4 100644 --- a/rpc/src/v1/tests/mocked/rpc.rs +++ b/rpc/src/v1/tests/mocked/rpc.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::BTreeMap; use jsonrpc_core::IoHandler; diff --git a/rpc/src/v1/tests/mocked/secretstore.rs b/rpc/src/v1/tests/mocked/secretstore.rs index 7e28a52838e..96e20d0028b 100644 --- a/rpc/src/v1/tests/mocked/secretstore.rs +++ b/rpc/src/v1/tests/mocked/secretstore.rs @@ -1,23 +1,24 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use crypto::DEFAULT_MAC; -use ethcore::account_provider::AccountProvider; +use accounts::AccountProvider; +use ethereum_types::H256; use ethkey::{KeyPair, Signature, verify_public}; use serde_json; @@ -26,7 +27,7 @@ use v1::metadata::Metadata; use v1::SecretStoreClient; use v1::traits::secretstore::SecretStore; use v1::helpers::secretstore::ordered_servers_keccak; -use v1::types::{H256, EncryptedDocumentKey}; +use v1::types::EncryptedDocumentKey; struct Dependencies { pub accounts: Arc, diff --git a/rpc/src/v1/tests/mocked/signer.rs b/rpc/src/v1/tests/mocked/signer.rs index 679645bafba..e22c5b8d249 100644 --- a/rpc/src/v1/tests/mocked/signer.rs +++ b/rpc/src/v1/tests/mocked/signer.rs @@ -1,39 +1,40 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::str::FromStr; -use ethereum_types::{U256, Address}; +use ethereum_types::{H520, U256, Address}; use bytes::ToPretty; -use ethcore::account_provider::AccountProvider; +use accounts::AccountProvider; use ethcore::client::TestBlockChainClient; use parity_runtime::Runtime; use parking_lot::Mutex; use rlp::encode; -use transaction::{Transaction, Action, SignedTransaction}; +use types::transaction::{Transaction, Action, SignedTransaction}; use serde_json; use jsonrpc_core::IoHandler; use v1::{SignerClient, Signer, Origin}; use v1::metadata::Metadata; use v1::tests::helpers::TestMinerService; -use v1::types::{Bytes as RpcBytes, H520}; -use v1::helpers::{nonce, SigningQueue, SignerService, FilledTransactionRequest, ConfirmationPayload}; -use v1::helpers::dispatch::{FullDispatcher, eth_data_hash}; +use v1::types::Bytes as RpcBytes; +use v1::helpers::{nonce, FilledTransactionRequest, ConfirmationPayload}; +use v1::helpers::external_signer::{SigningQueue, SignerService}; +use v1::helpers::dispatch::{self, FullDispatcher, eth_data_hash}; struct SignerTester { _runtime: Runtime, @@ -60,13 +61,14 @@ fn signer_tester() -> SignerTester { let runtime = Runtime::with_thread_count(1); let signer = Arc::new(SignerService::new_test(false)); let accounts = accounts_provider(); + let account_signer = Arc::new(dispatch::Signer::new(accounts.clone())); let client = blockchain_client(); let miner = miner_service(); let reservations = Arc::new(Mutex::new(nonce::Reservations::new(runtime.executor()))); let dispatcher = FullDispatcher::new(client, miner.clone(), reservations, 50); let mut io = IoHandler::default(); - io.extend_with(SignerClient::new(&accounts, dispatcher, &signer, runtime.executor()).to_delegate()); + io.extend_with(SignerClient::new(account_signer, dispatcher, &signer, runtime.executor()).to_delegate()); SignerTester { _runtime: runtime, @@ -493,7 +495,7 @@ fn should_confirm_data_sign_with_signature() { let data_hash = eth_data_hash(vec![1, 2, 3, 4].into()); let signature = H520(tester.accounts.sign(address, Some("test".into()), data_hash).unwrap().into_electrum()); - let signature = format!("0x{:?}", signature); + let signature = format!("{:?}", signature); // when let request = r#"{ @@ -555,29 +557,3 @@ fn should_generate_new_token() { // then assert_eq!(tester.io.handle_request_sync(&request), Some(response.to_owned())); } - -#[test] -fn should_generate_new_web_proxy_token() { - use jsonrpc_core::{Response, Output, Value}; - // given - let tester = signer_tester(); - - // when - let request = r#"{ - "jsonrpc":"2.0", - "method":"signer_generateWebProxyAccessToken", - "params":["https://parity.io"], - "id":1 - }"#; - let response = tester.io.handle_request_sync(&request).unwrap(); - let result = serde_json::from_str(&response).unwrap(); - - if let Response::Single(Output::Success(ref success)) = result { - if let Value::String(ref token) = success.result { - assert_eq!(tester.signer.web_proxy_access_token_domain(&token), Some("https://parity.io".into())); - return; - } - } - - assert!(false, "Expected successful response, got: {:?}", result); -} diff --git a/rpc/src/v1/tests/mocked/signing.rs b/rpc/src/v1/tests/mocked/signing.rs index dba0fbd22f4..39385d19bd8 100644 --- a/rpc/src/v1/tests/mocked/signing.rs +++ b/rpc/src/v1/tests/mocked/signing.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::thread; use std::str::FromStr; @@ -25,20 +25,21 @@ use jsonrpc_core::futures::Future; use v1::impls::SigningQueueClient; use v1::metadata::Metadata; use v1::traits::{EthSigning, ParitySigning, Parity}; -use v1::helpers::{nonce, SignerService, SigningQueue, FullDispatcher}; +use v1::helpers::{nonce, dispatch, FullDispatcher}; +use v1::helpers::external_signer::{SignerService, SigningQueue}; use v1::types::{ConfirmationResponse, RichRawTransaction}; use v1::tests::helpers::TestMinerService; use v1::tests::mocked::parity; -use ethereum_types::{U256, Address}; +use accounts::AccountProvider; use bytes::ToPretty; -use ethcore::account_provider::AccountProvider; +use ethereum_types::{U256, Address}; use ethcore::client::TestBlockChainClient; use ethkey::Secret; use ethstore::ethkey::{Generator, Random}; use parking_lot::Mutex; use serde_json; -use transaction::{Transaction, Action, SignedTransaction}; +use types::transaction::{Transaction, Action, SignedTransaction}; use parity_runtime::{Runtime, Executor}; struct SigningTester { @@ -57,6 +58,7 @@ impl Default for SigningTester { let client = Arc::new(TestBlockChainClient::default()); let miner = Arc::new(TestMinerService::default()); let accounts = Arc::new(AccountProvider::transient_provider()); + let account_signer = Arc::new(dispatch::Signer::new(accounts.clone())) as _; let reservations = Arc::new(Mutex::new(nonce::Reservations::new(runtime.executor()))); let mut io = IoHandler::default(); @@ -64,9 +66,9 @@ impl Default for SigningTester { let executor = Executor::new_thread_per_future(); - let rpc = SigningQueueClient::new(&signer, dispatcher.clone(), executor.clone(), &accounts); + let rpc = SigningQueueClient::new(&signer, dispatcher.clone(), executor.clone(), &account_signer); io.extend_with(EthSigning::to_delegate(rpc)); - let rpc = SigningQueueClient::new(&signer, dispatcher, executor, &accounts); + let rpc = SigningQueueClient::new(&signer, dispatcher, executor, &account_signer); io.extend_with(ParitySigning::to_delegate(rpc)); SigningTester { @@ -84,6 +86,30 @@ fn eth_signing() -> SigningTester { SigningTester::default() } +#[test] +fn rpc_eth_sign() { + use rustc_hex::FromHex; + + let tester = eth_signing(); + + let account = tester.accounts.insert_account(Secret::from([69u8; 32]), &"abcd".into()).unwrap(); + tester.accounts.unlock_account_permanently(account, "abcd".into()).unwrap(); + let _message = "0cc175b9c0f1b6a831c399e26977266192eb5ffee6ae2fec3ad71c777531578f".from_hex().unwrap(); + + let req = r#"{ + "jsonrpc": "2.0", + "method": "eth_sign", + "params": [ + ""#.to_owned() + &format!("0x{:x}", account) + r#"", + "0x0cc175b9c0f1b6a831c399e26977266192eb5ffee6ae2fec3ad71c777531578f" + ], + "id": 1 + }"#; + let res = r#"{"jsonrpc":"2.0","result":"0xa2870db1d0c26ef93c7b72d2a0830fa6b841e0593f7186bc6c7cc317af8cf3a42fda03bd589a49949aa05db83300cdb553116274518dbe9d90c65d0213f4af491b","id":1}"#; + + assert_eq!(tester.io.handle_request_sync(&req), Some(res.into())); +} + #[test] fn should_add_sign_to_queue() { // given diff --git a/rpc/src/v1/tests/mocked/signing_unsafe.rs b/rpc/src/v1/tests/mocked/signing_unsafe.rs new file mode 100644 index 00000000000..a91a85ea1fb --- /dev/null +++ b/rpc/src/v1/tests/mocked/signing_unsafe.rs @@ -0,0 +1,237 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::str::FromStr; +use std::sync::Arc; + +use accounts::AccountProvider; +use ethcore::client::TestBlockChainClient; +use ethereum_types::{U256, Address}; +use parity_runtime::Runtime; +use parking_lot::Mutex; +use rlp; +use rustc_hex::ToHex; +use types::transaction::{Transaction, Action}; + +use jsonrpc_core::IoHandler; +use v1::{EthClientOptions, EthSigning, SigningUnsafeClient}; +use v1::helpers::nonce; +use v1::helpers::dispatch::{self, FullDispatcher}; +use v1::tests::helpers::{TestMinerService}; +use v1::metadata::Metadata; + +fn blockchain_client() -> Arc { + let client = TestBlockChainClient::new(); + Arc::new(client) +} + +fn accounts_provider() -> Arc { + Arc::new(AccountProvider::transient_provider()) +} + +fn miner_service() -> Arc { + Arc::new(TestMinerService::default()) +} + +struct EthTester { + pub runtime: Runtime, + pub client: Arc, + pub accounts_provider: Arc, + pub miner: Arc, + pub io: IoHandler, +} + +impl Default for EthTester { + fn default() -> Self { + Self::new_with_options(Default::default()) + } +} + +impl EthTester { + pub fn new_with_options(options: EthClientOptions) -> Self { + let runtime = Runtime::with_thread_count(1); + let client = blockchain_client(); + let accounts_provider = accounts_provider(); + let ap = Arc::new(dispatch::Signer::new(accounts_provider.clone())) as _; + let miner = miner_service(); + let gas_price_percentile = options.gas_price_percentile; + let reservations = Arc::new(Mutex::new(nonce::Reservations::new(runtime.executor()))); + + let dispatcher = FullDispatcher::new(client.clone(), miner.clone(), reservations, gas_price_percentile); + let sign = SigningUnsafeClient::new(&ap, dispatcher).to_delegate(); + let mut io: IoHandler = IoHandler::default(); + io.extend_with(sign); + + EthTester { + runtime, + client, + miner, + io, + accounts_provider, + } + } +} + +#[test] +fn rpc_eth_send_transaction() { + let tester = EthTester::default(); + let address = tester.accounts_provider.new_account(&"".into()).unwrap(); + tester.accounts_provider.unlock_account_permanently(address, "".into()).unwrap(); + let request = r#"{ + "jsonrpc": "2.0", + "method": "eth_sendTransaction", + "params": [{ + "from": ""#.to_owned() + format!("0x{:x}", address).as_ref() + r#"", + "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567", + "gas": "0x76c0", + "gasPrice": "0x9184e72a000", + "value": "0x9184e72a" + }], + "id": 1 + }"#; + + let t = Transaction { + nonce: U256::zero(), + gas_price: U256::from(0x9184e72a000u64), + gas: U256::from(0x76c0), + action: Action::Call(Address::from_str("d46e8dd67c5d32be8058bb8eb970870f07244567").unwrap()), + value: U256::from(0x9184e72au64), + data: vec![] + }; + let signature = tester.accounts_provider.sign(address, None, t.hash(None)).unwrap(); + let t = t.with_signature(signature, None); + + let response = r#"{"jsonrpc":"2.0","result":""#.to_owned() + format!("0x{:x}", t.hash()).as_ref() + r#"","id":1}"#; + + assert_eq!(tester.io.handle_request_sync(&request), Some(response)); + + tester.miner.increment_nonce(&address); + + let t = Transaction { + nonce: U256::one(), + gas_price: U256::from(0x9184e72a000u64), + gas: U256::from(0x76c0), + action: Action::Call(Address::from_str("d46e8dd67c5d32be8058bb8eb970870f07244567").unwrap()), + value: U256::from(0x9184e72au64), + data: vec![] + }; + let signature = tester.accounts_provider.sign(address, None, t.hash(None)).unwrap(); + let t = t.with_signature(signature, None); + + let response = r#"{"jsonrpc":"2.0","result":""#.to_owned() + format!("0x{:x}", t.hash()).as_ref() + r#"","id":1}"#; + + assert_eq!(tester.io.handle_request_sync(&request), Some(response)); +} + +#[test] +fn rpc_eth_sign_transaction() { + let tester = EthTester::default(); + let address = tester.accounts_provider.new_account(&"".into()).unwrap(); + tester.accounts_provider.unlock_account_permanently(address, "".into()).unwrap(); + let request = r#"{ + "jsonrpc": "2.0", + "method": "eth_signTransaction", + "params": [{ + "from": ""#.to_owned() + format!("0x{:x}", address).as_ref() + r#"", + "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567", + "gas": "0x76c0", + "gasPrice": "0x9184e72a000", + "value": "0x9184e72a" + }], + "id": 1 + }"#; + + let t = Transaction { + nonce: U256::one(), + gas_price: U256::from(0x9184e72a000u64), + gas: U256::from(0x76c0), + action: Action::Call(Address::from_str("d46e8dd67c5d32be8058bb8eb970870f07244567").unwrap()), + value: U256::from(0x9184e72au64), + data: vec![] + }; + let signature = tester.accounts_provider.sign(address, None, t.hash(None)).unwrap(); + let t = t.with_signature(signature, None); + let signature = t.signature(); + let rlp = rlp::encode(&t); + + let response = r#"{"jsonrpc":"2.0","result":{"#.to_owned() + + r#""raw":"0x"# + &rlp.to_hex() + r#"","# + + r#""tx":{"# + + r#""blockHash":null,"blockNumber":null,"# + + &format!("\"chainId\":{},", t.chain_id().map_or("null".to_owned(), |n| format!("{}", n))) + + r#""condition":null,"creates":null,"# + + &format!("\"from\":\"0x{:x}\",", &address) + + r#""gas":"0x76c0","gasPrice":"0x9184e72a000","# + + &format!("\"hash\":\"0x{:x}\",", t.hash()) + + r#""input":"0x","# + + r#""nonce":"0x1","# + + &format!("\"publicKey\":\"0x{:x}\",", t.recover_public().unwrap()) + + &format!("\"r\":\"0x{:x}\",", U256::from(signature.r())) + + &format!("\"raw\":\"0x{}\",", rlp.to_hex()) + + &format!("\"s\":\"0x{:x}\",", U256::from(signature.s())) + + &format!("\"standardV\":\"0x{:x}\",", U256::from(t.standard_v())) + + r#""to":"0xd46e8dd67c5d32be8058bb8eb970870f07244567","transactionIndex":null,"# + + &format!("\"v\":\"0x{:x}\",", U256::from(t.original_v())) + + r#""value":"0x9184e72a""# + + r#"}},"id":1}"#; + + tester.miner.increment_nonce(&address); + + assert_eq!(tester.io.handle_request_sync(&request), Some(response)); +} + +#[test] +fn rpc_eth_send_transaction_with_bad_to() { + let tester = EthTester::default(); + let address = tester.accounts_provider.new_account(&"".into()).unwrap(); + let request = r#"{ + "jsonrpc": "2.0", + "method": "eth_sendTransaction", + "params": [{ + "from": ""#.to_owned() + format!("0x{:x}", address).as_ref() + r#"", + "to": "", + "gas": "0x76c0", + "gasPrice": "0x9184e72a000", + "value": "0x9184e72a" + }], + "id": 1 + }"#; + + let response = r#"{"jsonrpc":"2.0","error":{"code":-32602,"message":"Invalid params: prefix is missing."},"id":1}"#; + + assert_eq!(tester.io.handle_request_sync(&request), Some(response.into())); +} + +#[test] +fn rpc_eth_send_transaction_error() { + let tester = EthTester::default(); + let address = tester.accounts_provider.new_account(&"".into()).unwrap(); + let request = r#"{ + "jsonrpc": "2.0", + "method": "eth_sendTransaction", + "params": [{ + "from": ""#.to_owned() + format!("0x{:x}", address).as_ref() + r#"", + "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567", + "gas": "0x76c0", + "gasPrice": "0x9184e72a000", + "value": "0x9184e72a" + }], + "id": 1 + }"#; + + let response = r#"{"jsonrpc":"2.0","error":{"code":-32020,"message":"Your account is locked. Unlock the account via CLI, personal_unlockAccount or use Trusted Signer.","data":"NotUnlocked"},"id":1}"#; + assert_eq!(tester.io.handle_request_sync(&request), Some(response.into())); +} diff --git a/rpc/src/v1/tests/mocked/traces.rs b/rpc/src/v1/tests/mocked/traces.rs index 48c96377923..89cf198aa1d 100644 --- a/rpc/src/v1/tests/mocked/traces.rs +++ b/rpc/src/v1/tests/mocked/traces.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; diff --git a/rpc/src/v1/tests/mocked/web3.rs b/rpc/src/v1/tests/mocked/web3.rs index e16c5f4926f..79bcfe01dba 100644 --- a/rpc/src/v1/tests/mocked/web3.rs +++ b/rpc/src/v1/tests/mocked/web3.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use jsonrpc_core::IoHandler; use version::version; diff --git a/rpc/src/v1/tests/mod.rs b/rpc/src/v1/tests/mod.rs index 471569e5231..83f9dca905f 100644 --- a/rpc/src/v1/tests/mod.rs +++ b/rpc/src/v1/tests/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! RPC unit test moduleS diff --git a/rpc/src/v1/traits/debug.rs b/rpc/src/v1/traits/debug.rs index 0fedf0a5a8e..5d332d434ad 100644 --- a/rpc/src/v1/traits/debug.rs +++ b/rpc/src/v1/traits/debug.rs @@ -1,30 +1,30 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Debug RPC interface. use jsonrpc_core::Result; +use jsonrpc_derive::rpc; use v1::types::RichBlock; -build_rpc_trait! { - /// Debug RPC interface. - pub trait Debug { - /// Returns recently seen bad blocks. - #[rpc(name = "debug_getBadBlocks")] - fn bad_blocks(&self) -> Result>; - } +/// Debug RPC interface. +#[rpc] +pub trait Debug { + /// Returns recently seen bad blocks. + #[rpc(name = "debug_getBadBlocks")] + fn bad_blocks(&self) -> Result>; } diff --git a/rpc/src/v1/traits/eth.rs b/rpc/src/v1/traits/eth.rs index 817da88f75e..14f8fb69e11 100644 --- a/rpc/src/v1/traits/eth.rs +++ b/rpc/src/v1/traits/eth.rs @@ -1,218 +1,217 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Eth rpc interface. use jsonrpc_core::{Result, BoxFuture}; -use jsonrpc_macros::Trailing; +use jsonrpc_derive::rpc; +use ethereum_types::{H64, H160, H256, U64, U256}; use v1::types::{RichBlock, BlockNumber, Bytes, CallRequest, Filter, FilterChanges, Index, EthAccount}; use v1::types::{Log, Receipt, SyncStatus, Transaction, Work}; -use v1::types::{H64, H160, H256, U256, U64}; -build_rpc_trait! { - /// Eth rpc interface. - pub trait Eth { - type Metadata; +/// Eth rpc interface. +#[rpc] +pub trait Eth { + /// RPC Metadata + type Metadata; - /// Returns protocol version encoded as a string (quotes are necessary). - #[rpc(name = "eth_protocolVersion")] - fn protocol_version(&self) -> Result; + /// Returns protocol version encoded as a string (quotes are necessary). + #[rpc(name = "eth_protocolVersion")] + fn protocol_version(&self) -> Result; - /// Returns an object with data about the sync status or false. (wtf?) - #[rpc(name = "eth_syncing")] - fn syncing(&self) -> Result; + /// Returns an object with data about the sync status or false. (wtf?) + #[rpc(name = "eth_syncing")] + fn syncing(&self) -> Result; - /// Returns the number of hashes per second that the node is mining with. - #[rpc(name = "eth_hashrate")] - fn hashrate(&self) -> Result; + /// Returns the number of hashes per second that the node is mining with. + #[rpc(name = "eth_hashrate")] + fn hashrate(&self) -> Result; - /// Returns block author. - #[rpc(name = "eth_coinbase")] - fn author(&self) -> Result; + /// Returns block author. + #[rpc(name = "eth_coinbase")] + fn author(&self) -> Result; - /// Returns true if client is actively mining new blocks. - #[rpc(name = "eth_mining")] - fn is_mining(&self) -> Result; + /// Returns true if client is actively mining new blocks. + #[rpc(name = "eth_mining")] + fn is_mining(&self) -> Result; - /// Returns the chain ID used for transaction signing at the - /// current best block. None is returned if not - /// available. - #[rpc(name = "eth_chainId")] - fn chain_id(&self) -> Result>; - - /// Returns current gas_price. - #[rpc(name = "eth_gasPrice")] - fn gas_price(&self) -> Result; - - /// Returns accounts list. - #[rpc(name = "eth_accounts")] - fn accounts(&self) -> Result>; - - /// Returns highest block number. - #[rpc(name = "eth_blockNumber")] - fn block_number(&self) -> Result; - - /// Returns balance of the given account. - #[rpc(name = "eth_getBalance")] - fn balance(&self, H160, Trailing) -> BoxFuture; - - /// Returns the account- and storage-values of the specified account including the Merkle-proof - #[rpc(name = "eth_getProof")] - fn proof(&self, H160, Vec, Trailing) -> BoxFuture; - - /// Returns content of the storage at given address. - #[rpc(name = "eth_getStorageAt")] - fn storage_at(&self, H160, U256, Trailing) -> BoxFuture; - - /// Returns block with given hash. - #[rpc(name = "eth_getBlockByHash")] - fn block_by_hash(&self, H256, bool) -> BoxFuture>; - - /// Returns block with given number. - #[rpc(name = "eth_getBlockByNumber")] - fn block_by_number(&self, BlockNumber, bool) -> BoxFuture>; - - /// Returns the number of transactions sent from given address at given time (block number). - #[rpc(name = "eth_getTransactionCount")] - fn transaction_count(&self, H160, Trailing) -> BoxFuture; - - /// Returns the number of transactions in a block with given hash. - #[rpc(name = "eth_getBlockTransactionCountByHash")] - fn block_transaction_count_by_hash(&self, H256) -> BoxFuture>; - - /// Returns the number of transactions in a block with given block number. - #[rpc(name = "eth_getBlockTransactionCountByNumber")] - fn block_transaction_count_by_number(&self, BlockNumber) -> BoxFuture>; - - /// Returns the number of uncles in a block with given hash. - #[rpc(name = "eth_getUncleCountByBlockHash")] - fn block_uncles_count_by_hash(&self, H256) -> BoxFuture>; - - /// Returns the number of uncles in a block with given block number. - #[rpc(name = "eth_getUncleCountByBlockNumber")] - fn block_uncles_count_by_number(&self, BlockNumber) -> BoxFuture>; - - /// Returns the code at given address at given time (block number). - #[rpc(name = "eth_getCode")] - fn code_at(&self, H160, Trailing) -> BoxFuture; - - /// Sends signed transaction, returning its hash. - #[rpc(name = "eth_sendRawTransaction")] - fn send_raw_transaction(&self, Bytes) -> Result; - - /// @alias of `eth_sendRawTransaction`. - #[rpc(name = "eth_submitTransaction")] - fn submit_transaction(&self, Bytes) -> Result; - - /// Call contract, returning the output data. - #[rpc(name = "eth_call")] - fn call(&self, CallRequest, Trailing) -> BoxFuture; - - /// Estimate gas needed for execution of given contract. - #[rpc(name = "eth_estimateGas")] - fn estimate_gas(&self, CallRequest, Trailing) -> BoxFuture; - - /// Get transaction by its hash. - #[rpc(name = "eth_getTransactionByHash")] - fn transaction_by_hash(&self, H256) -> BoxFuture>; - - /// Returns transaction at given block hash and index. - #[rpc(name = "eth_getTransactionByBlockHashAndIndex")] - fn transaction_by_block_hash_and_index(&self, H256, Index) -> BoxFuture>; - - /// Returns transaction by given block number and index. - #[rpc(name = "eth_getTransactionByBlockNumberAndIndex")] - fn transaction_by_block_number_and_index(&self, BlockNumber, Index) -> BoxFuture>; - - /// Returns transaction receipt by transaction hash. - #[rpc(name = "eth_getTransactionReceipt")] - fn transaction_receipt(&self, H256) -> BoxFuture>; - - /// Returns an uncles at given block and index. - #[rpc(name = "eth_getUncleByBlockHashAndIndex")] - fn uncle_by_block_hash_and_index(&self, H256, Index) -> BoxFuture>; - - /// Returns an uncles at given block and index. - #[rpc(name = "eth_getUncleByBlockNumberAndIndex")] - fn uncle_by_block_number_and_index(&self, BlockNumber, Index) -> BoxFuture>; - - /// Returns available compilers. - /// @deprecated - #[rpc(name = "eth_getCompilers")] - fn compilers(&self) -> Result>; - - /// Compiles lll code. - /// @deprecated - #[rpc(name = "eth_compileLLL")] - fn compile_lll(&self, String) -> Result; - - /// Compiles solidity. - /// @deprecated - #[rpc(name = "eth_compileSolidity")] - fn compile_solidity(&self, String) -> Result; - - /// Compiles serpent. - /// @deprecated - #[rpc(name = "eth_compileSerpent")] - fn compile_serpent(&self, String) -> Result; - - /// Returns logs matching given filter object. - #[rpc(name = "eth_getLogs")] - fn logs(&self, Filter) -> BoxFuture>; - - /// Returns the hash of the current block, the seedHash, and the boundary condition to be met. - #[rpc(name = "eth_getWork")] - fn work(&self, Trailing) -> Result; - - /// Used for submitting a proof-of-work solution. - #[rpc(name = "eth_submitWork")] - fn submit_work(&self, H64, H256, H256) -> Result; - - /// Used for submitting mining hashrate. - #[rpc(name = "eth_submitHashrate")] - fn submit_hashrate(&self, U256, H256) -> Result; - } + /// Returns the chain ID used for transaction signing at the + /// current best block. None is returned if not + /// available. + #[rpc(name = "eth_chainId")] + fn chain_id(&self) -> Result>; + + /// Returns current gas_price. + #[rpc(name = "eth_gasPrice")] + fn gas_price(&self) -> Result; + + /// Returns accounts list. + #[rpc(name = "eth_accounts")] + fn accounts(&self) -> Result>; + + /// Returns highest block number. + #[rpc(name = "eth_blockNumber")] + fn block_number(&self) -> Result; + + /// Returns balance of the given account. + #[rpc(name = "eth_getBalance")] + fn balance(&self, H160, Option) -> BoxFuture; + + /// Returns the account- and storage-values of the specified account including the Merkle-proof + #[rpc(name = "eth_getProof")] + fn proof(&self, H160, Vec, Option) -> BoxFuture; + + /// Returns content of the storage at given address. + #[rpc(name = "eth_getStorageAt")] + fn storage_at(&self, H160, U256, Option) -> BoxFuture; + + /// Returns block with given hash. + #[rpc(name = "eth_getBlockByHash")] + fn block_by_hash(&self, H256, bool) -> BoxFuture>; + + /// Returns block with given number. + #[rpc(name = "eth_getBlockByNumber")] + fn block_by_number(&self, BlockNumber, bool) -> BoxFuture>; + + /// Returns the number of transactions sent from given address at given time (block number). + #[rpc(name = "eth_getTransactionCount")] + fn transaction_count(&self, H160, Option) -> BoxFuture; + + /// Returns the number of transactions in a block with given hash. + #[rpc(name = "eth_getBlockTransactionCountByHash")] + fn block_transaction_count_by_hash(&self, H256) -> BoxFuture>; + + /// Returns the number of transactions in a block with given block number. + #[rpc(name = "eth_getBlockTransactionCountByNumber")] + fn block_transaction_count_by_number(&self, BlockNumber) -> BoxFuture>; + + /// Returns the number of uncles in a block with given hash. + #[rpc(name = "eth_getUncleCountByBlockHash")] + fn block_uncles_count_by_hash(&self, H256) -> BoxFuture>; + + /// Returns the number of uncles in a block with given block number. + #[rpc(name = "eth_getUncleCountByBlockNumber")] + fn block_uncles_count_by_number(&self, BlockNumber) -> BoxFuture>; + + /// Returns the code at given address at given time (block number). + #[rpc(name = "eth_getCode")] + fn code_at(&self, H160, Option) -> BoxFuture; + + /// Sends signed transaction, returning its hash. + #[rpc(name = "eth_sendRawTransaction")] + fn send_raw_transaction(&self, Bytes) -> Result; + + /// @alias of `eth_sendRawTransaction`. + #[rpc(name = "eth_submitTransaction")] + fn submit_transaction(&self, Bytes) -> Result; + + /// Call contract, returning the output data. + #[rpc(name = "eth_call")] + fn call(&self, CallRequest, Option) -> BoxFuture; + + /// Estimate gas needed for execution of given contract. + #[rpc(name = "eth_estimateGas")] + fn estimate_gas(&self, CallRequest, Option) -> BoxFuture; + + /// Get transaction by its hash. + #[rpc(name = "eth_getTransactionByHash")] + fn transaction_by_hash(&self, H256) -> BoxFuture>; + + /// Returns transaction at given block hash and index. + #[rpc(name = "eth_getTransactionByBlockHashAndIndex")] + fn transaction_by_block_hash_and_index(&self, H256, Index) -> BoxFuture>; + + /// Returns transaction by given block number and index. + #[rpc(name = "eth_getTransactionByBlockNumberAndIndex")] + fn transaction_by_block_number_and_index(&self, BlockNumber, Index) -> BoxFuture>; + + /// Returns transaction receipt by transaction hash. + #[rpc(name = "eth_getTransactionReceipt")] + fn transaction_receipt(&self, H256) -> BoxFuture>; + + /// Returns an uncles at given block and index. + #[rpc(name = "eth_getUncleByBlockHashAndIndex")] + fn uncle_by_block_hash_and_index(&self, H256, Index) -> BoxFuture>; + + /// Returns an uncles at given block and index. + #[rpc(name = "eth_getUncleByBlockNumberAndIndex")] + fn uncle_by_block_number_and_index(&self, BlockNumber, Index) -> BoxFuture>; + + /// Returns available compilers. + /// @deprecated + #[rpc(name = "eth_getCompilers")] + fn compilers(&self) -> Result>; + + /// Compiles lll code. + /// @deprecated + #[rpc(name = "eth_compileLLL")] + fn compile_lll(&self, String) -> Result; + + /// Compiles solidity. + /// @deprecated + #[rpc(name = "eth_compileSolidity")] + fn compile_solidity(&self, String) -> Result; + + /// Compiles serpent. + /// @deprecated + #[rpc(name = "eth_compileSerpent")] + fn compile_serpent(&self, String) -> Result; + + /// Returns logs matching given filter object. + #[rpc(name = "eth_getLogs")] + fn logs(&self, Filter) -> BoxFuture>; + + /// Returns the hash of the current block, the seedHash, and the boundary condition to be met. + #[rpc(name = "eth_getWork")] + fn work(&self, Option) -> Result; + + /// Used for submitting a proof-of-work solution. + #[rpc(name = "eth_submitWork")] + fn submit_work(&self, H64, H256, H256) -> Result; + + /// Used for submitting mining hashrate. + #[rpc(name = "eth_submitHashrate")] + fn submit_hashrate(&self, U256, H256) -> Result; } -build_rpc_trait! { - /// Eth filters rpc api (polling). - // TODO: do filters api properly - pub trait EthFilter { - /// Returns id of new filter. - #[rpc(name = "eth_newFilter")] - fn new_filter(&self, Filter) -> Result; - - /// Returns id of new block filter. - #[rpc(name = "eth_newBlockFilter")] - fn new_block_filter(&self) -> Result; - - /// Returns id of new block filter. - #[rpc(name = "eth_newPendingTransactionFilter")] - fn new_pending_transaction_filter(&self) -> Result; - - /// Returns filter changes since last poll. - #[rpc(name = "eth_getFilterChanges")] - fn filter_changes(&self, Index) -> BoxFuture; - - /// Returns all logs matching given filter (in a range 'from' - 'to'). - #[rpc(name = "eth_getFilterLogs")] - fn filter_logs(&self, Index) -> BoxFuture>; - - /// Uninstalls filter. - #[rpc(name = "eth_uninstallFilter")] - fn uninstall_filter(&self, Index) -> Result; - } +/// Eth filters rpc api (polling). +// TODO: do filters api properly +#[rpc] +pub trait EthFilter { + /// Returns id of new filter. + #[rpc(name = "eth_newFilter")] + fn new_filter(&self, Filter) -> Result; + + /// Returns id of new block filter. + #[rpc(name = "eth_newBlockFilter")] + fn new_block_filter(&self) -> Result; + + /// Returns id of new block filter. + #[rpc(name = "eth_newPendingTransactionFilter")] + fn new_pending_transaction_filter(&self) -> Result; + + /// Returns filter changes since last poll. + #[rpc(name = "eth_getFilterChanges")] + fn filter_changes(&self, Index) -> BoxFuture; + + /// Returns all logs matching given filter (in a range 'from' - 'to'). + #[rpc(name = "eth_getFilterLogs")] + fn filter_logs(&self, Index) -> BoxFuture>; + + /// Uninstalls filter. + #[rpc(name = "eth_uninstallFilter")] + fn uninstall_filter(&self, Index) -> Result; } diff --git a/rpc/src/v1/traits/eth_pubsub.rs b/rpc/src/v1/traits/eth_pubsub.rs index 38babeef42c..06287813921 100644 --- a/rpc/src/v1/traits/eth_pubsub.rs +++ b/rpc/src/v1/traits/eth_pubsub.rs @@ -1,41 +1,38 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Eth PUB-SUB rpc interface. use jsonrpc_core::Result; -use jsonrpc_macros::Trailing; -use jsonrpc_macros::pubsub::Subscriber; -use jsonrpc_pubsub::SubscriptionId; +use jsonrpc_derive::rpc; +use jsonrpc_pubsub::{typed, SubscriptionId}; use v1::types::pubsub; -build_rpc_trait! { - /// Eth PUB-SUB rpc interface. - pub trait EthPubSub { - type Metadata; - - #[pubsub(name = "eth_subscription")] { - /// Subscribe to Eth subscription. - #[rpc(name = "eth_subscribe")] - fn subscribe(&self, Self::Metadata, Subscriber, pubsub::Kind, Trailing); - - /// Unsubscribe from existing Eth subscription. - #[rpc(name = "eth_unsubscribe")] - fn unsubscribe(&self, SubscriptionId) -> Result; - } - } +/// Eth PUB-SUB rpc interface. +#[rpc] +pub trait EthPubSub { + /// RPC Metadata + type Metadata; + + /// Subscribe to Eth subscription. + #[pubsub(subscription = "eth_subscription", subscribe, name = "eth_subscribe")] + fn subscribe(&self, Self::Metadata, typed::Subscriber, pubsub::Kind, Option); + + /// Unsubscribe from existing Eth subscription. + #[pubsub(subscription = "eth_subscription", unsubscribe, name = "eth_unsubscribe")] + fn unsubscribe(&self, Option, SubscriptionId) -> Result; } diff --git a/rpc/src/v1/traits/eth_signing.rs b/rpc/src/v1/traits/eth_signing.rs index 27657475bab..72e13ddabe6 100644 --- a/rpc/src/v1/traits/eth_signing.rs +++ b/rpc/src/v1/traits/eth_signing.rs @@ -1,44 +1,46 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Eth rpc interface. use jsonrpc_core::BoxFuture; - -use v1::types::{Bytes, H160, H256, H520, TransactionRequest, RichRawTransaction}; - -build_rpc_trait! { - /// Signing methods implementation relying on unlocked accounts. - pub trait EthSigning { - type Metadata; - - /// Signs the hash of data with given address signature. - #[rpc(meta, name = "eth_sign")] - fn sign(&self, Self::Metadata, H160, Bytes) -> BoxFuture; - - /// Sends transaction; will block waiting for signer to return the - /// transaction hash. - /// If Signer is disable it will require the account to be unlocked. - #[rpc(meta, name = "eth_sendTransaction")] - fn send_transaction(&self, Self::Metadata, TransactionRequest) -> BoxFuture; - - /// Signs transactions without dispatching it to the network. - /// Returns signed transaction RLP representation and the transaction itself. - /// It can be later submitted using `eth_sendRawTransaction/eth_submitTransaction`. - #[rpc(meta, name = "eth_signTransaction")] - fn sign_transaction(&self, Self::Metadata, TransactionRequest) -> BoxFuture; - } +use jsonrpc_derive::rpc; + +use ethereum_types::{H160, H256, H520}; +use v1::types::{Bytes, TransactionRequest, RichRawTransaction}; + +/// Signing methods implementation relying on unlocked accounts. +#[rpc] +pub trait EthSigning { + /// RPC Metadata + type Metadata; + + /// Signs the hash of data with given address signature. + #[rpc(meta, name = "eth_sign")] + fn sign(&self, Self::Metadata, H160, Bytes) -> BoxFuture; + + /// Sends transaction; will block waiting for signer to return the + /// transaction hash. + /// If Signer is disable it will require the account to be unlocked. + #[rpc(meta, name = "eth_sendTransaction")] + fn send_transaction(&self, Self::Metadata, TransactionRequest) -> BoxFuture; + + /// Signs transactions without dispatching it to the network. + /// Returns signed transaction RLP representation and the transaction itself. + /// It can be later submitted using `eth_sendRawTransaction/eth_submitTransaction`. + #[rpc(meta, name = "eth_signTransaction")] + fn sign_transaction(&self, Self::Metadata, TransactionRequest) -> BoxFuture; } diff --git a/rpc/src/v1/traits/mod.rs b/rpc/src/v1/traits/mod.rs index 7c4f617e15c..e25ca76ac44 100644 --- a/rpc/src/v1/traits/mod.rs +++ b/rpc/src/v1/traits/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Ethereum rpc interfaces. @@ -40,8 +40,8 @@ pub use self::eth_pubsub::EthPubSub; pub use self::eth_signing::EthSigning; pub use self::net::Net; pub use self::parity::Parity; -pub use self::parity_accounts::ParityAccounts; -pub use self::parity_set::ParitySet; +pub use self::parity_accounts::{ParityAccounts, ParityAccountsInfo}; +pub use self::parity_set::{ParitySet, ParitySetAccounts}; pub use self::parity_signing::ParitySigning; pub use self::personal::Personal; pub use self::private::Private; diff --git a/rpc/src/v1/traits/net.rs b/rpc/src/v1/traits/net.rs index d70a4653a6e..a16729294d7 100644 --- a/rpc/src/v1/traits/net.rs +++ b/rpc/src/v1/traits/net.rs @@ -1,36 +1,36 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Net rpc interface. use jsonrpc_core::Result; +use jsonrpc_derive::rpc; -build_rpc_trait! { - /// Net rpc interface. - pub trait Net { - /// Returns protocol version. - #[rpc(name = "net_version")] - fn version(&self) -> Result; +/// Net rpc interface. +#[rpc] +pub trait Net { + /// Returns protocol version. + #[rpc(name = "net_version")] + fn version(&self) -> Result; - /// Returns number of peers connected to node. - #[rpc(name = "net_peerCount")] - fn peer_count(&self) -> Result; + /// Returns number of peers connected to node. + #[rpc(name = "net_peerCount")] + fn peer_count(&self) -> Result; - /// Returns true if client is actively listening for network connections. - /// Otherwise false. - #[rpc(name = "net_listening")] - fn is_listening(&self) -> Result; - } + /// Returns true if client is actively listening for network connections. + /// Otherwise false. + #[rpc(name = "net_listening")] + fn is_listening(&self) -> Result; } diff --git a/rpc/src/v1/traits/parity.rs b/rpc/src/v1/traits/parity.rs index c4a697783e7..e3821355eee 100644 --- a/rpc/src/v1/traits/parity.rs +++ b/rpc/src/v1/traits/parity.rs @@ -1,251 +1,235 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity-specific rpc interface. use std::collections::BTreeMap; +use ethereum_types::{H64, H160, H256, H512, U64, U256}; use jsonrpc_core::{BoxFuture, Result}; -use jsonrpc_macros::Trailing; +use jsonrpc_derive::rpc; use v1::types::{ - H160, H256, H512, U256, U64, H64, Bytes, CallRequest, + Bytes, CallRequest, Peers, Transaction, RpcSettings, Histogram, RecoveredAccount, TransactionStats, LocalTransactionStatus, BlockNumber, ConsensusCapability, VersionInfo, OperationsInfo, ChainStatus, Log, Filter, - AccountInfo, HwAccountInfo, RichHeader, Receipt, + RichHeader, Receipt, }; -build_rpc_trait! { - /// Parity-specific rpc interface. - pub trait Parity { - type Metadata; - - /// Returns accounts information. - #[rpc(name = "parity_accountsInfo")] - fn accounts_info(&self) -> Result>; - - /// Returns hardware accounts information. - #[rpc(name = "parity_hardwareAccountsInfo")] - fn hardware_accounts_info(&self) -> Result>; - - /// Get a list of paths to locked hardware wallets - #[rpc(name = "parity_lockedHardwareAccountsInfo")] - fn locked_hardware_accounts_info(&self) -> Result>; - - /// Returns default account for dapp. - #[rpc(name = "parity_defaultAccount")] - fn default_account(&self) -> Result; - - /// Returns current transactions limit. - #[rpc(name = "parity_transactionsLimit")] - fn transactions_limit(&self) -> Result; - - /// Returns mining extra data. - #[rpc(name = "parity_extraData")] - fn extra_data(&self) -> Result; - - /// Returns mining gas floor target. - #[rpc(name = "parity_gasFloorTarget")] - fn gas_floor_target(&self) -> Result; - - /// Returns mining gas floor cap. - #[rpc(name = "parity_gasCeilTarget")] - fn gas_ceil_target(&self) -> Result; - - /// Returns minimal gas price for transaction to be included in queue. - #[rpc(name = "parity_minGasPrice")] - fn min_gas_price(&self) -> Result; - - /// Returns latest logs - #[rpc(name = "parity_devLogs")] - fn dev_logs(&self) -> Result>; - - /// Returns logs levels - #[rpc(name = "parity_devLogsLevels")] - fn dev_logs_levels(&self) -> Result; - - /// Returns chain name - DEPRECATED. Use `parity_chainName` instead. - #[rpc(name = "parity_netChain")] - fn net_chain(&self) -> Result; - - /// Returns peers details - #[rpc(name = "parity_netPeers")] - fn net_peers(&self) -> Result; - - /// Returns network port - #[rpc(name = "parity_netPort")] - fn net_port(&self) -> Result; - - /// Returns rpc settings - #[rpc(name = "parity_rpcSettings")] - fn rpc_settings(&self) -> Result; - - /// Returns node name - #[rpc(name = "parity_nodeName")] - fn node_name(&self) -> Result; - - /// Returns default extra data - #[rpc(name = "parity_defaultExtraData")] - fn default_extra_data(&self) -> Result; - - /// Returns distribution of gas price in latest blocks. - #[rpc(name = "parity_gasPriceHistogram")] - fn gas_price_histogram(&self) -> BoxFuture; - - /// Returns number of unsigned transactions waiting in the signer queue (if signer enabled) - /// Returns error when signer is disabled - #[rpc(name = "parity_unsignedTransactionsCount")] - fn unsigned_transactions_count(&self) -> Result; - - /// Returns a cryptographically random phrase sufficient for securely seeding a secret key. - #[rpc(name = "parity_generateSecretPhrase")] - fn generate_secret_phrase(&self) -> Result; - - /// Returns whatever address would be derived from the given phrase if it were to seed a brainwallet. - #[rpc(name = "parity_phraseToAddress")] - fn phrase_to_address(&self, String) -> Result; - - /// Returns the value of the registrar for this network. - #[rpc(name = "parity_registryAddress")] - fn registry_address(&self) -> Result>; - - /// Returns all addresses if Fat DB is enabled (`--fat-db`), or null if not. - #[rpc(name = "parity_listAccounts")] - fn list_accounts(&self, u64, Option, Trailing) -> Result>>; - - /// Returns all storage keys of the given address (first parameter) if Fat DB is enabled (`--fat-db`), - /// or null if not. - #[rpc(name = "parity_listStorageKeys")] - fn list_storage_keys(&self, H160, u64, Option, Trailing) -> Result>>; - - /// Encrypt some data with a public key under ECIES. - /// First parameter is the 512-byte destination public key, second is the message. - #[rpc(name = "parity_encryptMessage")] - fn encrypt_message(&self, H512, Bytes) -> Result; - - /// Returns all pending transactions from transaction queue. - #[rpc(name = "parity_pendingTransactions")] - fn pending_transactions(&self, Trailing) -> Result>; - - /// Returns all transactions from transaction queue. - /// - /// Some of them might not be ready to be included in a block yet. - #[rpc(name = "parity_allTransactions")] - fn all_transactions(&self) -> Result>; - - /// Same as parity_allTransactions, but return only transactions hashes. - #[rpc(name = "parity_allTransactionHashes")] - fn all_transaction_hashes(&self) -> Result>; - - /// Returns all future transactions from transaction queue (deprecated) - #[rpc(name = "parity_futureTransactions")] - fn future_transactions(&self) -> Result>; - - /// Returns propagation statistics on transactions pending in the queue. - #[rpc(name = "parity_pendingTransactionsStats")] - fn pending_transactions_stats(&self) -> Result>; - - /// Returns a list of current and past local transactions with status details. - #[rpc(name = "parity_localTransactions")] - fn local_transactions(&self) -> Result>; - - /// Returns current WS Server interface and port or an error if ws server is disabled. - #[rpc(name = "parity_wsUrl")] - fn ws_url(&self) -> Result; - - /// Returns next nonce for particular sender. Should include all transactions in the queue. - #[rpc(name = "parity_nextNonce")] - fn next_nonce(&self, H160) -> BoxFuture; - - /// Get the mode. Returns one of: "active", "passive", "dark", "offline". - #[rpc(name = "parity_mode")] - fn mode(&self) -> Result; - - /// Get the chain name. Returns one of the pre-configured chain names or a filename. - #[rpc(name = "parity_chain")] - fn chain(&self) -> Result; - - /// Get the enode of this node. - #[rpc(name = "parity_enode")] - fn enode(&self) -> Result; - - /// Returns information on current consensus capability. - #[rpc(name = "parity_consensusCapability")] - fn consensus_capability(&self) -> Result; - - /// Get our version information in a nice object. - #[rpc(name = "parity_versionInfo")] - fn version_info(&self) -> Result; - - /// Get information concerning the latest releases if available. - #[rpc(name = "parity_releasesInfo")] - fn releases_info(&self) -> Result>; - - /// Get the current chain status. - #[rpc(name = "parity_chainStatus")] - fn chain_status(&self) -> Result; - - /// Get node kind info. - #[rpc(name = "parity_nodeKind")] - fn node_kind(&self) -> Result<::v1::types::NodeKind>; - - /// Get block header. - /// Same as `eth_getBlockByNumber` but without uncles and transactions. - #[rpc(name = "parity_getBlockHeaderByNumber")] - fn block_header(&self, Trailing) -> BoxFuture; - - /// Get block receipts. - /// Allows you to fetch receipts from the entire block at once. - /// If no parameter is provided defaults to `latest`. - #[rpc(name = "parity_getBlockReceipts")] - fn block_receipts(&self, Trailing) -> BoxFuture>; - - /// Get IPFS CIDv0 given protobuf encoded bytes. - #[rpc(name = "parity_cidV0")] - fn ipfs_cid(&self, Bytes) -> Result; - - /// Call contract, returning the output data. - #[rpc(name = "parity_call")] - fn call(&self, Vec, Trailing) -> Result>; - - /// Used for submitting a proof-of-work solution (similar to `eth_submitWork`, - /// but returns block hash on success, and returns an explicit error message on failure). - #[rpc(name = "parity_submitWorkDetail")] - fn submit_work_detail(&self, H64, H256, H256) -> Result; - - /// Returns the status of the node. Used as the health endpoint. - /// - /// The RPC returns successful response if: - /// - The node have a peer (unless running a dev chain) - /// - The node is not syncing. - /// - /// Otherwise the RPC returns error. - #[rpc(name = "parity_nodeStatus")] - fn status(&self) -> Result<()>; - - /// Extracts Address and public key from signature using the r, s and v params. Equivalent to Solidity erecover - /// as well as checks the signature for chain replay protection - #[rpc(name = "parity_verifySignature")] - fn verify_signature(&self, bool, Bytes, H256, H256, U64) -> Result; - - /// Returns logs matching given filter object. - /// Is allowed to skip filling transaction hash for faster query. - #[rpc(name = "parity_getLogsNoTransactionHash")] - fn logs_no_tx_hash(&self, Filter) -> BoxFuture>; - - } +/// Parity-specific rpc interface. +#[rpc] +pub trait Parity { + /// RPC Metadata + type Metadata; + + /// Returns current transactions limit. + #[rpc(name = "parity_transactionsLimit")] + fn transactions_limit(&self) -> Result; + + /// Returns mining extra data. + #[rpc(name = "parity_extraData")] + fn extra_data(&self) -> Result; + + /// Returns mining gas floor target. + #[rpc(name = "parity_gasFloorTarget")] + fn gas_floor_target(&self) -> Result; + + /// Returns mining gas floor cap. + #[rpc(name = "parity_gasCeilTarget")] + fn gas_ceil_target(&self) -> Result; + + /// Returns minimal gas price for transaction to be included in queue. + #[rpc(name = "parity_minGasPrice")] + fn min_gas_price(&self) -> Result; + + /// Returns latest logs + #[rpc(name = "parity_devLogs")] + fn dev_logs(&self) -> Result>; + + /// Returns logs levels + #[rpc(name = "parity_devLogsLevels")] + fn dev_logs_levels(&self) -> Result; + + /// Returns chain name - DEPRECATED. Use `parity_chainName` instead. + #[rpc(name = "parity_netChain")] + fn net_chain(&self) -> Result; + + /// Returns peers details + #[rpc(name = "parity_netPeers")] + fn net_peers(&self) -> Result; + + /// Returns network port + #[rpc(name = "parity_netPort")] + fn net_port(&self) -> Result; + + /// Returns rpc settings + #[rpc(name = "parity_rpcSettings")] + fn rpc_settings(&self) -> Result; + + /// Returns node name + #[rpc(name = "parity_nodeName")] + fn node_name(&self) -> Result; + + /// Returns default extra data + #[rpc(name = "parity_defaultExtraData")] + fn default_extra_data(&self) -> Result; + + /// Returns distribution of gas price in latest blocks. + #[rpc(name = "parity_gasPriceHistogram")] + fn gas_price_histogram(&self) -> BoxFuture; + + /// Returns number of unsigned transactions waiting in the signer queue (if signer enabled) + /// Returns error when signer is disabled + #[rpc(name = "parity_unsignedTransactionsCount")] + fn unsigned_transactions_count(&self) -> Result; + + /// Returns a cryptographically random phrase sufficient for securely seeding a secret key. + #[rpc(name = "parity_generateSecretPhrase")] + fn generate_secret_phrase(&self) -> Result; + + /// Returns whatever address would be derived from the given phrase if it were to seed a brainwallet. + #[rpc(name = "parity_phraseToAddress")] + fn phrase_to_address(&self, String) -> Result; + + /// Returns the value of the registrar for this network. + #[rpc(name = "parity_registryAddress")] + fn registry_address(&self) -> Result>; + + /// Returns all addresses if Fat DB is enabled (`--fat-db`), or null if not. + #[rpc(name = "parity_listAccounts")] + fn list_accounts(&self, u64, Option, Option) -> Result>>; + + /// Returns all storage keys of the given address (first parameter) if Fat DB is enabled (`--fat-db`), + /// or null if not. + #[rpc(name = "parity_listStorageKeys")] + fn list_storage_keys(&self, H160, u64, Option, Option) -> Result>>; + + /// Encrypt some data with a public key under ECIES. + /// First parameter is the 512-byte destination public key, second is the message. + #[rpc(name = "parity_encryptMessage")] + fn encrypt_message(&self, H512, Bytes) -> Result; + + /// Returns all pending transactions from transaction queue. + #[rpc(name = "parity_pendingTransactions")] + fn pending_transactions(&self, Option) -> Result>; + + /// Returns all transactions from transaction queue. + /// + /// Some of them might not be ready to be included in a block yet. + #[rpc(name = "parity_allTransactions")] + fn all_transactions(&self) -> Result>; + + /// Same as parity_allTransactions, but return only transactions hashes. + #[rpc(name = "parity_allTransactionHashes")] + fn all_transaction_hashes(&self) -> Result>; + + /// Returns all future transactions from transaction queue (deprecated) + #[rpc(name = "parity_futureTransactions")] + fn future_transactions(&self) -> Result>; + + /// Returns propagation statistics on transactions pending in the queue. + #[rpc(name = "parity_pendingTransactionsStats")] + fn pending_transactions_stats(&self) -> Result>; + + /// Returns a list of current and past local transactions with status details. + #[rpc(name = "parity_localTransactions")] + fn local_transactions(&self) -> Result>; + + /// Returns current WS Server interface and port or an error if ws server is disabled. + #[rpc(name = "parity_wsUrl")] + fn ws_url(&self) -> Result; + + /// Returns next nonce for particular sender. Should include all transactions in the queue. + #[rpc(name = "parity_nextNonce")] + fn next_nonce(&self, H160) -> BoxFuture; + + /// Get the mode. Returns one of: "active", "passive", "dark", "offline". + #[rpc(name = "parity_mode")] + fn mode(&self) -> Result; + + /// Get the chain name. Returns one of the pre-configured chain names or a filename. + #[rpc(name = "parity_chain")] + fn chain(&self) -> Result; + + /// Get the enode of this node. + #[rpc(name = "parity_enode")] + fn enode(&self) -> Result; + + /// Returns information on current consensus capability. + #[rpc(name = "parity_consensusCapability")] + fn consensus_capability(&self) -> Result; + + /// Get our version information in a nice object. + #[rpc(name = "parity_versionInfo")] + fn version_info(&self) -> Result; + + /// Get information concerning the latest releases if available. + #[rpc(name = "parity_releasesInfo")] + fn releases_info(&self) -> Result>; + + /// Get the current chain status. + #[rpc(name = "parity_chainStatus")] + fn chain_status(&self) -> Result; + + /// Get node kind info. + #[rpc(name = "parity_nodeKind")] + fn node_kind(&self) -> Result<::v1::types::NodeKind>; + + /// Get block header. + /// Same as `eth_getBlockByNumber` but without uncles and transactions. + #[rpc(name = "parity_getBlockHeaderByNumber")] + fn block_header(&self, Option) -> BoxFuture; + + /// Get block receipts. + /// Allows you to fetch receipts from the entire block at once. + /// If no parameter is provided defaults to `latest`. + #[rpc(name = "parity_getBlockReceipts")] + fn block_receipts(&self, Option) -> BoxFuture>; + + /// Get IPFS CIDv0 given protobuf encoded bytes. + #[rpc(name = "parity_cidV0")] + fn ipfs_cid(&self, Bytes) -> Result; + + /// Call contract, returning the output data. + #[rpc(name = "parity_call")] + fn call(&self, Vec, Option) -> Result>; + + /// Used for submitting a proof-of-work solution (similar to `eth_submitWork`, + /// but returns block hash on success, and returns an explicit error message on failure). + #[rpc(name = "parity_submitWorkDetail")] + fn submit_work_detail(&self, H64, H256, H256) -> Result; + + /// Returns the status of the node. Used as the health endpoint. + /// + /// The RPC returns successful response if: + /// - The node have a peer (unless running a dev chain) + /// - The node is not syncing. + /// + /// Otherwise the RPC returns error. + #[rpc(name = "parity_nodeStatus")] + fn status(&self) -> Result<()>; + + /// Extracts Address and public key from signature using the r, s and v params. Equivalent to Solidity erecover + /// as well as checks the signature for chain replay protection + #[rpc(name = "parity_verifySignature")] + fn verify_signature(&self, bool, Bytes, H256, H256, U64) -> Result; + + /// Returns logs matching given filter object. + /// Is allowed to skip filling transaction hash for faster query. + #[rpc(name = "parity_getLogsNoTransactionHash")] + fn logs_no_tx_hash(&self, Filter) -> BoxFuture>; } diff --git a/rpc/src/v1/traits/parity_accounts.rs b/rpc/src/v1/traits/parity_accounts.rs index 029f06bf2ff..eaffac78850 100644 --- a/rpc/src/v1/traits/parity_accounts.rs +++ b/rpc/src/v1/traits/parity_accounts.rs @@ -1,142 +1,164 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity Accounts-related rpc interface. use std::collections::BTreeMap; use jsonrpc_core::Result; +use jsonrpc_derive::rpc; +use ethereum_types::{H160, H256, H520}; use ethkey::Password; use ethstore::KeyFile; -use v1::types::{H160, H256, H520, DeriveHash, DeriveHierarchical, ExtAccountInfo}; - -build_rpc_trait! { - /// Personal Parity rpc interface. - pub trait ParityAccounts { - /// Returns accounts information. - #[rpc(name = "parity_allAccountsInfo")] - fn all_accounts_info(&self) -> Result>; - - /// Creates new account from the given phrase using standard brainwallet mechanism. - /// Second parameter is password for the new account. - #[rpc(name = "parity_newAccountFromPhrase")] - fn new_account_from_phrase(&self, String, Password) -> Result; - - /// Creates new account from the given JSON wallet. - /// Second parameter is password for the wallet and the new account. - #[rpc(name = "parity_newAccountFromWallet")] - fn new_account_from_wallet(&self, String, Password) -> Result; - - /// Creates new account from the given raw secret. - /// Second parameter is password for the new account. - #[rpc(name = "parity_newAccountFromSecret")] - fn new_account_from_secret(&self, H256, Password) -> Result; - - /// Returns true if given `password` would unlock given `account`. - /// Arguments: `account`, `password`. - #[rpc(name = "parity_testPassword")] - fn test_password(&self, H160, Password) -> Result; - - /// Changes an account's password. - /// Arguments: `account`, `password`, `new_password`. - #[rpc(name = "parity_changePassword")] - fn change_password(&self, H160, Password, Password) -> Result; - - /// Permanently deletes an account. - /// Arguments: `account`, `password`. - #[rpc(name = "parity_killAccount")] - fn kill_account(&self, H160, Password) -> Result; - - /// Permanently deletes an address from the addressbook - /// Arguments: `address` - #[rpc(name = "parity_removeAddress")] - fn remove_address(&self, H160) -> Result; - - /// Set an account's name. - #[rpc(name = "parity_setAccountName")] - fn set_account_name(&self, H160, String) -> Result; - - /// Set an account's metadata string. - #[rpc(name = "parity_setAccountMeta")] - fn set_account_meta(&self, H160, String) -> Result; - - /// Imports a number of Geth accounts, with the list provided as the argument. - #[rpc(name = "parity_importGethAccounts")] - fn import_geth_accounts(&self, Vec) -> Result>; - - /// Returns the accounts available for importing from Geth. - #[rpc(name = "parity_listGethAccounts")] - fn geth_accounts(&self) -> Result>; - - /// Create new vault. - #[rpc(name = "parity_newVault")] - fn create_vault(&self, String, Password) -> Result; - - /// Open existing vault. - #[rpc(name = "parity_openVault")] - fn open_vault(&self, String, Password) -> Result; - - /// Close previously opened vault. - #[rpc(name = "parity_closeVault")] - fn close_vault(&self, String) -> Result; - - /// List all vaults. - #[rpc(name = "parity_listVaults")] - fn list_vaults(&self) -> Result>; - - /// List all currently opened vaults. - #[rpc(name = "parity_listOpenedVaults")] - fn list_opened_vaults(&self) -> Result>; - - /// Change vault password. - #[rpc(name = "parity_changeVaultPassword")] - fn change_vault_password(&self, String, Password) -> Result; - - /// Change vault of the given address. - #[rpc(name = "parity_changeVault")] - fn change_vault(&self, H160, String) -> Result; - - /// Get vault metadata string. - #[rpc(name = "parity_getVaultMeta")] - fn get_vault_meta(&self, String) -> Result; - - /// Set vault metadata string. - #[rpc(name = "parity_setVaultMeta")] - fn set_vault_meta(&self, String, String) -> Result; - - /// Derive new address from given account address using specific hash. - /// Resulting address can be either saved as a new account (with the same password). - #[rpc(name = "parity_deriveAddressHash")] - fn derive_key_hash(&self, H160, Password, DeriveHash, bool) -> Result; - - /// Derive new address from given account address using - /// hierarchical derivation (sequence of 32-bit integer indices). - /// Resulting address can be either saved as a new account (with the same password). - #[rpc(name = "parity_deriveAddressIndex")] - fn derive_key_index(&self, H160, Password, DeriveHierarchical, bool) -> Result; - - /// Exports an account with given address if provided password matches. - #[rpc(name = "parity_exportAccount")] - fn export_account(&self, H160, Password) -> Result; - - /// Sign raw hash with the key corresponding to address and password. - #[rpc(name = "parity_signMessage")] - fn sign_message(&self, H160, Password, H256) -> Result; - - /// Send a PinMatrixAck to a hardware wallet, unlocking it - #[rpc(name = "parity_hardwarePinMatrixAck")] - fn hardware_pin_matrix_ack(&self, String, String) -> Result; - } +use v1::types::{DeriveHash, DeriveHierarchical, ExtAccountInfo}; +use v1::types::{AccountInfo, HwAccountInfo}; + +/// Parity-specific read-only accounts rpc interface. +#[rpc] +pub trait ParityAccountsInfo { + /// Returns accounts information. + #[rpc(name = "parity_accountsInfo")] + fn accounts_info(&self) -> Result>; + + /// Returns hardware accounts information. + #[rpc(name = "parity_hardwareAccountsInfo")] + fn hardware_accounts_info(&self) -> Result>; + + /// Get a list of paths to locked hardware wallets + #[rpc(name = "parity_lockedHardwareAccountsInfo")] + fn locked_hardware_accounts_info(&self) -> Result>; + + /// Returns default account for dapp. + #[rpc(name = "parity_defaultAccount")] + fn default_account(&self) -> Result; +} + +/// Personal Parity rpc interface. +#[rpc] +pub trait ParityAccounts { + /// Returns accounts information. + #[rpc(name = "parity_allAccountsInfo")] + fn all_accounts_info(&self) -> Result>; + + /// Creates new account from the given phrase using standard brainwallet mechanism. + /// Second parameter is password for the new account. + #[rpc(name = "parity_newAccountFromPhrase")] + fn new_account_from_phrase(&self, String, Password) -> Result; + + /// Creates new account from the given JSON wallet. + /// Second parameter is password for the wallet and the new account. + #[rpc(name = "parity_newAccountFromWallet")] + fn new_account_from_wallet(&self, String, Password) -> Result; + + /// Creates new account from the given raw secret. + /// Second parameter is password for the new account. + #[rpc(name = "parity_newAccountFromSecret")] + fn new_account_from_secret(&self, H256, Password) -> Result; + + /// Returns true if given `password` would unlock given `account`. + /// Arguments: `account`, `password`. + #[rpc(name = "parity_testPassword")] + fn test_password(&self, H160, Password) -> Result; + + /// Changes an account's password. + /// Arguments: `account`, `password`, `new_password`. + #[rpc(name = "parity_changePassword")] + fn change_password(&self, H160, Password, Password) -> Result; + + /// Permanently deletes an account. + /// Arguments: `account`, `password`. + #[rpc(name = "parity_killAccount")] + fn kill_account(&self, H160, Password) -> Result; + + /// Permanently deletes an address from the addressbook + /// Arguments: `address` + #[rpc(name = "parity_removeAddress")] + fn remove_address(&self, H160) -> Result; + + /// Set an account's name. + #[rpc(name = "parity_setAccountName")] + fn set_account_name(&self, H160, String) -> Result; + + /// Set an account's metadata string. + #[rpc(name = "parity_setAccountMeta")] + fn set_account_meta(&self, H160, String) -> Result; + + /// Imports a number of Geth accounts, with the list provided as the argument. + #[rpc(name = "parity_importGethAccounts")] + fn import_geth_accounts(&self, Vec) -> Result>; + + /// Returns the accounts available for importing from Geth. + #[rpc(name = "parity_listGethAccounts")] + fn geth_accounts(&self) -> Result>; + + /// Create new vault. + #[rpc(name = "parity_newVault")] + fn create_vault(&self, String, Password) -> Result; + + /// Open existing vault. + #[rpc(name = "parity_openVault")] + fn open_vault(&self, String, Password) -> Result; + + /// Close previously opened vault. + #[rpc(name = "parity_closeVault")] + fn close_vault(&self, String) -> Result; + + /// List all vaults. + #[rpc(name = "parity_listVaults")] + fn list_vaults(&self) -> Result>; + + /// List all currently opened vaults. + #[rpc(name = "parity_listOpenedVaults")] + fn list_opened_vaults(&self) -> Result>; + + /// Change vault password. + #[rpc(name = "parity_changeVaultPassword")] + fn change_vault_password(&self, String, Password) -> Result; + + /// Change vault of the given address. + #[rpc(name = "parity_changeVault")] + fn change_vault(&self, H160, String) -> Result; + + /// Get vault metadata string. + #[rpc(name = "parity_getVaultMeta")] + fn get_vault_meta(&self, String) -> Result; + + /// Set vault metadata string. + #[rpc(name = "parity_setVaultMeta")] + fn set_vault_meta(&self, String, String) -> Result; + + /// Derive new address from given account address using specific hash. + /// Resulting address can be either saved as a new account (with the same password). + #[rpc(name = "parity_deriveAddressHash")] + fn derive_key_hash(&self, H160, Password, DeriveHash, bool) -> Result; + + /// Derive new address from given account address using + /// hierarchical derivation (sequence of 32-bit integer indices). + /// Resulting address can be either saved as a new account (with the same password). + #[rpc(name = "parity_deriveAddressIndex")] + fn derive_key_index(&self, H160, Password, DeriveHierarchical, bool) -> Result; + + /// Exports an account with given address if provided password matches. + #[rpc(name = "parity_exportAccount")] + fn export_account(&self, H160, Password) -> Result; + + /// Sign raw hash with the key corresponding to address and password. + #[rpc(name = "parity_signMessage")] + fn sign_message(&self, H160, Password, H256) -> Result; + + /// Send a PinMatrixAck to a hardware wallet, unlocking it + #[rpc(name = "parity_hardwarePinMatrixAck")] + fn hardware_pin_matrix_ack(&self, String, String) -> Result; } diff --git a/rpc/src/v1/traits/parity_set.rs b/rpc/src/v1/traits/parity_set.rs index 9335ddc273c..c7c23387900 100644 --- a/rpc/src/v1/traits/parity_set.rs +++ b/rpc/src/v1/traits/parity_set.rs @@ -1,115 +1,124 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity-specific rpc interface for operations altering the settings. +use ethereum_types::{H160, H256, U256}; use jsonrpc_core::{BoxFuture, Result}; +use jsonrpc_derive::rpc; -use v1::types::{Bytes, H160, H256, U256, ReleaseInfo, Transaction}; - -build_rpc_trait! { - /// Parity-specific rpc interface for operations altering the settings. - pub trait ParitySet { - /// Sets new minimal gas price for mined blocks. - #[rpc(name = "parity_setMinGasPrice")] - fn set_min_gas_price(&self, U256) -> Result; - - /// Sets new gas floor target for mined blocks. - #[rpc(name = "parity_setGasFloorTarget")] - fn set_gas_floor_target(&self, U256) -> Result; - - /// Sets new gas ceiling target for mined blocks. - #[rpc(name = "parity_setGasCeilTarget")] - fn set_gas_ceil_target(&self, U256) -> Result; - - /// Sets new extra data for mined blocks. - #[rpc(name = "parity_setExtraData")] - fn set_extra_data(&self, Bytes) -> Result; - - /// Sets new author for mined block. - #[rpc(name = "parity_setAuthor")] - fn set_author(&self, H160) -> Result; - - /// Sets account for signing consensus messages. - #[rpc(name = "parity_setEngineSigner")] - fn set_engine_signer(&self, H160, String) -> Result; - - /// Sets the limits for transaction queue. - #[rpc(name = "parity_setTransactionsLimit")] - fn set_transactions_limit(&self, usize) -> Result; - - /// Sets the maximum amount of gas a single transaction may consume. - #[rpc(name = "parity_setMaxTransactionGas")] - fn set_tx_gas_limit(&self, U256) -> Result; - - /// Add a reserved peer. - #[rpc(name = "parity_addReservedPeer")] - fn add_reserved_peer(&self, String) -> Result; - - /// Remove a reserved peer. - #[rpc(name = "parity_removeReservedPeer")] - fn remove_reserved_peer(&self, String) -> Result; - - /// Drop all non-reserved peers. - #[rpc(name = "parity_dropNonReservedPeers")] - fn drop_non_reserved_peers(&self) -> Result; - - /// Accept non-reserved peers (default behavior) - #[rpc(name = "parity_acceptNonReservedPeers")] - fn accept_non_reserved_peers(&self) -> Result; - - /// Start the network. - /// - /// @deprecated - Use `set_mode("active")` instead. - #[rpc(name = "parity_startNetwork")] - fn start_network(&self) -> Result; - - /// Stop the network. - /// - /// @deprecated - Use `set_mode("offline")` instead. - #[rpc(name = "parity_stopNetwork")] - fn stop_network(&self) -> Result; - - /// Set the mode. Argument must be one of: "active", "passive", "dark", "offline". - #[rpc(name = "parity_setMode")] - fn set_mode(&self, String) -> Result; - - /// Set the network spec. Argument must be one of pre-configured chains or a filename. - #[rpc(name = "parity_setChain")] - fn set_spec_name(&self, String) -> Result; - - /// Hash a file content under given URL. - #[rpc(name = "parity_hashContent")] - fn hash_content(&self, String) -> BoxFuture; - - /// Is there a release ready for install? - #[rpc(name = "parity_upgradeReady")] - fn upgrade_ready(&self) -> Result>; - - /// Execute a release which is ready according to upgrade_ready(). - #[rpc(name = "parity_executeUpgrade")] - fn execute_upgrade(&self) -> Result; - - /// Removes transaction from transaction queue. - /// Makes sense only for transactions that were not propagated to other peers yet - /// like scheduled transactions or transactions in future. - /// It might also work for some local transactions with to low gas price - /// or excessive gas limit that are not accepted by other peers whp. - /// Returns `true` when transaction was removed, `false` if it was not found. - #[rpc(name = "parity_removeTransaction")] - fn remove_transaction(&self, H256) -> Result>; - } +use v1::types::{Bytes, ReleaseInfo, Transaction}; + +/// Parity-specific rpc interface for operations altering the account-related settings. +#[rpc] +pub trait ParitySetAccounts { + /// Sets account for signing consensus messages. + #[rpc(name = "parity_setEngineSigner")] + fn set_engine_signer(&self, H160, String) -> Result; +} + +/// Parity-specific rpc interface for operations altering the settings. +#[rpc] +pub trait ParitySet { + /// Sets new minimal gas price for mined blocks. + #[rpc(name = "parity_setMinGasPrice")] + fn set_min_gas_price(&self, U256) -> Result; + + /// Sets new gas floor target for mined blocks. + #[rpc(name = "parity_setGasFloorTarget")] + fn set_gas_floor_target(&self, U256) -> Result; + + /// Sets new gas ceiling target for mined blocks. + #[rpc(name = "parity_setGasCeilTarget")] + fn set_gas_ceil_target(&self, U256) -> Result; + + /// Sets new extra data for mined blocks. + #[rpc(name = "parity_setExtraData")] + fn set_extra_data(&self, Bytes) -> Result; + + /// Sets new author for mined block. + #[rpc(name = "parity_setAuthor")] + fn set_author(&self, H160) -> Result; + + /// Sets the secret of engine signer account. + #[rpc(name = "parity_setEngineSignerSecret")] + fn set_engine_signer_secret(&self, H256) -> Result; + + /// Sets the limits for transaction queue. + #[rpc(name = "parity_setTransactionsLimit")] + fn set_transactions_limit(&self, usize) -> Result; + + /// Sets the maximum amount of gas a single transaction may consume. + #[rpc(name = "parity_setMaxTransactionGas")] + fn set_tx_gas_limit(&self, U256) -> Result; + + /// Add a reserved peer. + #[rpc(name = "parity_addReservedPeer")] + fn add_reserved_peer(&self, String) -> Result; + + /// Remove a reserved peer. + #[rpc(name = "parity_removeReservedPeer")] + fn remove_reserved_peer(&self, String) -> Result; + + /// Drop all non-reserved peers. + #[rpc(name = "parity_dropNonReservedPeers")] + fn drop_non_reserved_peers(&self) -> Result; + + /// Accept non-reserved peers (default behavior) + #[rpc(name = "parity_acceptNonReservedPeers")] + fn accept_non_reserved_peers(&self) -> Result; + + /// Start the network. + /// + /// @deprecated - Use `set_mode("active")` instead. + #[rpc(name = "parity_startNetwork")] + fn start_network(&self) -> Result; + + /// Stop the network. + /// + /// @deprecated - Use `set_mode("offline")` instead. + #[rpc(name = "parity_stopNetwork")] + fn stop_network(&self) -> Result; + + /// Set the mode. Argument must be one of: "active", "passive", "dark", "offline". + #[rpc(name = "parity_setMode")] + fn set_mode(&self, String) -> Result; + + /// Set the network spec. Argument must be one of pre-configured chains or a filename. + #[rpc(name = "parity_setChain")] + fn set_spec_name(&self, String) -> Result; + + /// Hash a file content under given URL. + #[rpc(name = "parity_hashContent")] + fn hash_content(&self, String) -> BoxFuture; + + /// Is there a release ready for install? + #[rpc(name = "parity_upgradeReady")] + fn upgrade_ready(&self) -> Result>; + + /// Execute a release which is ready according to upgrade_ready(). + #[rpc(name = "parity_executeUpgrade")] + fn execute_upgrade(&self) -> Result; + + /// Removes transaction from transaction queue. + /// Makes sense only for transactions that were not propagated to other peers yet + /// like scheduled transactions or transactions in future. + /// It might also work for some local transactions with to low gas price + /// or excessive gas limit that are not accepted by other peers whp. + /// Returns `true` when transaction was removed, `false` if it was not found. + #[rpc(name = "parity_removeTransaction")] + fn remove_transaction(&self, H256) -> Result>; } diff --git a/rpc/src/v1/traits/parity_signing.rs b/rpc/src/v1/traits/parity_signing.rs index 208422222ec..acd9e8cd686 100644 --- a/rpc/src/v1/traits/parity_signing.rs +++ b/rpc/src/v1/traits/parity_signing.rs @@ -1,52 +1,54 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! ParitySigning rpc interface. use jsonrpc_core::{BoxFuture, Result}; - -use v1::types::{U256, H160, Bytes, ConfirmationResponse, TransactionRequest, Either}; - -build_rpc_trait! { - /// Signing methods implementation. - pub trait ParitySigning { - type Metadata; - - /// Given partial transaction request produces transaction with all fields filled in. - /// Such transaction can be then signed externally. - #[rpc(meta, name = "parity_composeTransaction")] - fn compose_transaction(&self, Self::Metadata, TransactionRequest) -> BoxFuture; - - /// Posts sign request asynchronously. - /// Will return a confirmation ID for later use with check_transaction. - #[rpc(meta, name = "parity_postSign")] - fn post_sign(&self, Self::Metadata, H160, Bytes) -> BoxFuture>; - - /// Posts transaction asynchronously. - /// Will return a transaction ID for later use with check_transaction. - #[rpc(meta, name = "parity_postTransaction")] - fn post_transaction(&self, Self::Metadata, TransactionRequest) -> BoxFuture>; - - /// Checks the progress of a previously posted request (transaction/sign). - /// Should be given a valid send_transaction ID. - #[rpc(name = "parity_checkRequest")] - fn check_request(&self, U256) -> Result>; - - /// Decrypt some ECIES-encrypted message. - /// First parameter is the address with which it is encrypted, second is the ciphertext. - #[rpc(meta, name = "parity_decryptMessage")] - fn decrypt_message(&self, Self::Metadata, H160, Bytes) -> BoxFuture; - } +use jsonrpc_derive::rpc; + +use ethereum_types::{H160, U256}; +use v1::types::{Bytes, ConfirmationResponse, TransactionRequest, Either}; + +/// Signing methods implementation. +#[rpc] +pub trait ParitySigning { + /// RPC Metadata + type Metadata; + + /// Given partial transaction request produces transaction with all fields filled in. + /// Such transaction can be then signed externally. + #[rpc(meta, name = "parity_composeTransaction")] + fn compose_transaction(&self, Self::Metadata, TransactionRequest) -> BoxFuture; + + /// Posts sign request asynchronously. + /// Will return a confirmation ID for later use with check_transaction. + #[rpc(meta, name = "parity_postSign")] + fn post_sign(&self, Self::Metadata, H160, Bytes) -> BoxFuture>; + + /// Posts transaction asynchronously. + /// Will return a transaction ID for later use with check_transaction. + #[rpc(meta, name = "parity_postTransaction")] + fn post_transaction(&self, Self::Metadata, TransactionRequest) -> BoxFuture>; + + /// Checks the progress of a previously posted request (transaction/sign). + /// Should be given a valid send_transaction ID. + #[rpc(name = "parity_checkRequest")] + fn check_request(&self, U256) -> Result>; + + /// Decrypt some ECIES-encrypted message. + /// First parameter is the address with which it is encrypted, second is the ciphertext. + #[rpc(meta, name = "parity_decryptMessage")] + fn decrypt_message(&self, Self::Metadata, H160, Bytes) -> BoxFuture; } diff --git a/rpc/src/v1/traits/personal.rs b/rpc/src/v1/traits/personal.rs index cda33f4cf4d..e3632731fa5 100644 --- a/rpc/src/v1/traits/personal.rs +++ b/rpc/src/v1/traits/personal.rs @@ -1,73 +1,74 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Personal rpc interface. -use eip712::EIP712; +use eip_712::EIP712; +use ethereum_types::{H160, H256, H520, U128}; use jsonrpc_core::types::Value; use jsonrpc_core::{BoxFuture, Result}; -use v1::types::{Bytes, U128, H160, H256, H520, TransactionRequest, RichRawTransaction as RpcRichRawTransaction, EIP191Version}; - -build_rpc_trait! { - /// Personal rpc interface. Safe (read-only) functions. - pub trait Personal { - type Metadata; - - /// Lists all stored accounts - #[rpc(name = "personal_listAccounts")] - fn accounts(&self) -> Result>; - - /// Creates new account (it becomes new current unlocked account) - /// Param is the password for the account. - #[rpc(name = "personal_newAccount")] - fn new_account(&self, String) -> Result; - - /// Unlocks specified account for use (can only be one unlocked account at one moment) - #[rpc(name = "personal_unlockAccount")] - fn unlock_account(&self, H160, String, Option) -> Result; - - /// Signs the hash of data with given account signature using the given password to unlock the account during - /// the request. - #[rpc(name = "personal_sign")] - fn sign(&self, Bytes, H160, String) -> BoxFuture; - - /// Produces an EIP-712 compliant signature with given account using the given password to unlock the - /// account during the request. - #[rpc(name = "personal_signTypedData")] - fn sign_typed_data(&self, EIP712, H160, String) -> BoxFuture; - - /// Signs an arbitrary message based on the version specified - #[rpc(name = "personal_sign191")] - fn sign_191(&self, EIP191Version, Value, H160, String) -> BoxFuture; - - /// Returns the account associated with the private key that was used to calculate the signature in - /// `personal_sign`. - #[rpc(name = "personal_ecRecover")] - fn ec_recover(&self, Bytes, H520) -> BoxFuture; - - /// Signs transaction. The account is not unlocked in such case. - #[rpc(meta, name = "personal_signTransaction")] - fn sign_transaction(&self, Self::Metadata, TransactionRequest, String) -> BoxFuture; - - /// Sends transaction and signs it in single call. The account is not unlocked in such case. - #[rpc(meta, name = "personal_sendTransaction")] - fn send_transaction(&self, Self::Metadata, TransactionRequest, String) -> BoxFuture; - - /// @deprecated alias for `personal_sendTransaction`. - #[rpc(meta, name = "personal_signAndSendTransaction")] - fn sign_and_send_transaction(&self, Self::Metadata, TransactionRequest, String) -> BoxFuture; - - } +use jsonrpc_derive::rpc; +use v1::types::{Bytes, TransactionRequest, RichRawTransaction as RpcRichRawTransaction, EIP191Version}; + +/// Personal rpc interface. Safe (read-only) functions. +#[rpc] +pub trait Personal { + /// RPC Metadata + type Metadata; + + /// Lists all stored accounts + #[rpc(name = "personal_listAccounts")] + fn accounts(&self) -> Result>; + + /// Creates new account (it becomes new current unlocked account) + /// Param is the password for the account. + #[rpc(name = "personal_newAccount")] + fn new_account(&self, String) -> Result; + + /// Unlocks specified account for use (can only be one unlocked account at one moment) + #[rpc(name = "personal_unlockAccount")] + fn unlock_account(&self, H160, String, Option) -> Result; + + /// Signs the hash of data with given account signature using the given password to unlock the account during + /// the request. + #[rpc(name = "personal_sign")] + fn sign(&self, Bytes, H160, String) -> BoxFuture; + + /// Produces an EIP-712 compliant signature with given account using the given password to unlock the + /// account during the request. + #[rpc(name = "personal_signTypedData")] + fn sign_typed_data(&self, EIP712, H160, String) -> BoxFuture; + + /// Signs an arbitrary message based on the version specified + #[rpc(name = "personal_sign191")] + fn sign_191(&self, EIP191Version, Value, H160, String) -> BoxFuture; + + /// Returns the account associated with the private key that was used to calculate the signature in + /// `personal_sign`. + #[rpc(name = "personal_ecRecover")] + fn ec_recover(&self, Bytes, H520) -> BoxFuture; + + /// Signs transaction. The account is not unlocked in such case. + #[rpc(meta, name = "personal_signTransaction")] + fn sign_transaction(&self, Self::Metadata, TransactionRequest, String) -> BoxFuture; + + /// Sends transaction and signs it in single call. The account is not unlocked in such case. + #[rpc(meta, name = "personal_sendTransaction")] + fn send_transaction(&self, Self::Metadata, TransactionRequest, String) -> BoxFuture; + + /// @deprecated alias for `personal_sendTransaction`. + #[rpc(meta, name = "personal_signAndSendTransaction")] + fn sign_and_send_transaction(&self, Self::Metadata, TransactionRequest, String) -> BoxFuture; } diff --git a/rpc/src/v1/traits/private.rs b/rpc/src/v1/traits/private.rs index fdc28a817b4..732e3914bda 100644 --- a/rpc/src/v1/traits/private.rs +++ b/rpc/src/v1/traits/private.rs @@ -1,45 +1,47 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! SecretStore-specific rpc interface. +use ethereum_types::{H160, H256, U256}; use jsonrpc_core::Error; +use jsonrpc_derive::rpc; -use v1::types::{Bytes, PrivateTransactionReceipt, H160, H256, U256, BlockNumber, +use v1::types::{Bytes, PrivateTransactionReceipt, BlockNumber, PrivateTransactionReceiptAndTransaction, CallRequest}; -build_rpc_trait! { - /// Private transaction management RPC interface. - pub trait Private { - type Metadata; +/// Private transaction management RPC interface. +#[rpc] +pub trait Private { + /// RPC Metadata + type Metadata; - /// Sends private transaction; Transaction will be added to the validation queue and sent out when ready. - #[rpc(name = "private_sendTransaction")] - fn send_transaction(&self, Bytes) -> Result; + /// Sends private transaction; Transaction will be added to the validation queue and sent out when ready. + #[rpc(name = "private_sendTransaction")] + fn send_transaction(&self, Bytes) -> Result; - /// Creates a transaction for contract's deployment from origin (signed transaction) - #[rpc(name = "private_composeDeploymentTransaction")] - fn compose_deployment_transaction(&self, BlockNumber, Bytes, Vec, U256) -> Result; + /// Creates a transaction for contract's deployment from origin (signed transaction) + #[rpc(name = "private_composeDeploymentTransaction")] + fn compose_deployment_transaction(&self, BlockNumber, Bytes, Vec, U256) -> Result; - /// Make a call to the private contract - #[rpc(name = "private_call")] - fn private_call(&self, BlockNumber, CallRequest) -> Result; + /// Make a call to the private contract + #[rpc(name = "private_call")] + fn private_call(&self, BlockNumber, CallRequest) -> Result; - /// Retrieve the id of the key associated with the contract - #[rpc(name = "private_contractKey")] - fn private_contract_key(&self, H160) -> Result; - } + /// Retrieve the id of the key associated with the contract + #[rpc(name = "private_contractKey")] + fn private_contract_key(&self, H160) -> Result; } diff --git a/rpc/src/v1/traits/pubsub.rs b/rpc/src/v1/traits/pubsub.rs index 840de8d4b0f..c91b335613f 100644 --- a/rpc/src/v1/traits/pubsub.rs +++ b/rpc/src/v1/traits/pubsub.rs @@ -1,39 +1,36 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity-specific PUB-SUB rpc interface. use jsonrpc_core::{Result, Value, Params}; -use jsonrpc_pubsub::SubscriptionId; -use jsonrpc_macros::Trailing; -use jsonrpc_macros::pubsub::Subscriber; - -build_rpc_trait! { - /// Parity-specific PUB-SUB rpc interface. - pub trait PubSub { - type Metadata; - - #[pubsub(name = "parity_subscription")] { - /// Subscribe to changes of any RPC method in Parity. - #[rpc(name = "parity_subscribe")] - fn parity_subscribe(&self, Self::Metadata, Subscriber, String, Trailing); - - /// Unsubscribe from existing Parity subscription. - #[rpc(name = "parity_unsubscribe")] - fn parity_unsubscribe(&self, SubscriptionId) -> Result; - } - } +use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; +use jsonrpc_derive::rpc; + +/// Parity-specific PUB-SUB rpc interface. +#[rpc] +pub trait PubSub { + /// Pub/Sub Metadata + type Metadata; + + /// Subscribe to changes of any RPC method in Parity. + #[pubsub(subscription = "parity_subscription", subscribe, name = "parity_subscribe")] + fn parity_subscribe(&self, Self::Metadata, Subscriber, String, Option); + + /// Unsubscribe from existing Parity subscription. + #[pubsub(subscription = "parity_subscription", unsubscribe, name = "parity_unsubscribe")] + fn parity_unsubscribe(&self, Option, SubscriptionId) -> Result; } diff --git a/rpc/src/v1/traits/rpc.rs b/rpc/src/v1/traits/rpc.rs index 8c0b3c2c905..9600630fecd 100644 --- a/rpc/src/v1/traits/rpc.rs +++ b/rpc/src/v1/traits/rpc.rs @@ -1,36 +1,36 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! RPC interface. use std::collections::BTreeMap; use jsonrpc_core::Result; - -build_rpc_trait! { - /// RPC Interface. - pub trait Rpc { - /// Returns supported modules for Geth 1.3.6 - /// @ignore - #[rpc(name = "modules")] - fn modules(&self) -> Result>; - - /// Returns supported modules for Geth 1.4.0 - /// @ignore - #[rpc(name = "rpc_modules")] - fn rpc_modules(&self) -> Result>; - } +use jsonrpc_derive::rpc; + +/// RPC Interface. +#[rpc] +pub trait Rpc { + /// Returns supported modules for Geth 1.3.6 + /// @ignore + #[rpc(name = "modules")] + fn modules(&self) -> Result>; + + /// Returns supported modules for Geth 1.4.0 + /// @ignore + #[rpc(name = "rpc_modules")] + fn rpc_modules(&self) -> Result>; } diff --git a/rpc/src/v1/traits/secretstore.rs b/rpc/src/v1/traits/secretstore.rs index 83f63b2802b..6883753b4fa 100644 --- a/rpc/src/v1/traits/secretstore.rs +++ b/rpc/src/v1/traits/secretstore.rs @@ -1,60 +1,61 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! SecretStore-specific rpc interface. use std::collections::BTreeSet; + use jsonrpc_core::Result; +use jsonrpc_derive::rpc; +use ethereum_types::{H160, H256, H512}; use ethkey::Password; - -use v1::types::{H160, H256, H512, Bytes, EncryptedDocumentKey}; - -build_rpc_trait! { - /// Parity-specific rpc interface. - pub trait SecretStore { - /// Generate document key to store in secret store. - /// Arguments: `account`, `password`, `server_key_public`. - #[rpc(name = "secretstore_generateDocumentKey")] - fn generate_document_key(&self, H160, Password, H512) -> Result; - - /// Encrypt data with key, received from secret store. - /// Arguments: `account`, `password`, `key`, `data`. - #[rpc(name = "secretstore_encrypt")] - fn encrypt(&self, H160, Password, Bytes, Bytes) -> Result; - - /// Decrypt data with key, received from secret store. - /// Arguments: `account`, `password`, `key`, `data`. - #[rpc(name = "secretstore_decrypt")] - fn decrypt(&self, H160, Password, Bytes, Bytes) -> Result; - - /// Decrypt data with shadow key, received from secret store. - /// Arguments: `account`, `password`, `decrypted_secret`, `common_point`, `decrypt_shadows`, `data`. - #[rpc(name = "secretstore_shadowDecrypt")] - fn shadow_decrypt(&self, H160, Password, H512, H512, Vec, Bytes) -> Result; - - /// Calculates the hash (keccak256) of servers set for using in ServersSetChange session. - /// Returned hash must be signed later by using `secretstore_signRawHash` method. - /// Arguments: `servers_set`. - #[rpc(name = "secretstore_serversSetHash")] - fn servers_set_hash(&self, BTreeSet) -> Result; - - /// Generate recoverable ECDSA signature of raw hash. - /// Passed hash is treated as an input to the `sign` function (no prefixes added, no hash function is applied). - /// Arguments: `account`, `password`, `raw_hash`. - #[rpc(name = "secretstore_signRawHash")] - fn sign_raw_hash(&self, H160, Password, H256) -> Result; - } +use v1::types::{Bytes, EncryptedDocumentKey}; + +/// Parity-specific rpc interface. +#[rpc] +pub trait SecretStore { + /// Generate document key to store in secret store. + /// Arguments: `account`, `password`, `server_key_public`. + #[rpc(name = "secretstore_generateDocumentKey")] + fn generate_document_key(&self, H160, Password, H512) -> Result; + + /// Encrypt data with key, received from secret store. + /// Arguments: `account`, `password`, `key`, `data`. + #[rpc(name = "secretstore_encrypt")] + fn encrypt(&self, H160, Password, Bytes, Bytes) -> Result; + + /// Decrypt data with key, received from secret store. + /// Arguments: `account`, `password`, `key`, `data`. + #[rpc(name = "secretstore_decrypt")] + fn decrypt(&self, H160, Password, Bytes, Bytes) -> Result; + + /// Decrypt data with shadow key, received from secret store. + /// Arguments: `account`, `password`, `decrypted_secret`, `common_point`, `decrypt_shadows`, `data`. + #[rpc(name = "secretstore_shadowDecrypt")] + fn shadow_decrypt(&self, H160, Password, H512, H512, Vec, Bytes) -> Result; + + /// Calculates the hash (keccak256) of servers set for using in ServersSetChange session. + /// Returned hash must be signed later by using `secretstore_signRawHash` method. + /// Arguments: `servers_set`. + #[rpc(name = "secretstore_serversSetHash")] + fn servers_set_hash(&self, BTreeSet) -> Result; + + /// Generate recoverable ECDSA signature of raw hash. + /// Passed hash is treated as an input to the `sign` function (no prefixes added, no hash function is applied). + /// Arguments: `account`, `password`, `raw_hash`. + #[rpc(name = "secretstore_signRawHash")] + fn sign_raw_hash(&self, H160, Password, H256) -> Result; } diff --git a/rpc/src/v1/traits/signer.rs b/rpc/src/v1/traits/signer.rs index 4ede0ce534a..b5653eba635 100644 --- a/rpc/src/v1/traits/signer.rs +++ b/rpc/src/v1/traits/signer.rs @@ -1,67 +1,63 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity Signer-related rpc interface. -use jsonrpc_core::{BoxFuture, Result}; -use jsonrpc_pubsub::SubscriptionId; -use jsonrpc_macros::pubsub::Subscriber; -use v1::types::{U256, Bytes, TransactionModification, ConfirmationRequest, ConfirmationResponse, ConfirmationResponseWithToken}; +use ethereum_types::U256; +use jsonrpc_core::{BoxFuture, Result}; +use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; +use jsonrpc_derive::rpc; -build_rpc_trait! { - /// Signer extension for confirmations rpc interface. - pub trait Signer { - type Metadata; +use v1::types::{Bytes, TransactionModification, ConfirmationRequest, ConfirmationResponse, ConfirmationResponseWithToken}; - /// Returns a list of items to confirm. - #[rpc(name = "signer_requestsToConfirm")] - fn requests_to_confirm(&self) -> Result>; +/// Signer extension for confirmations rpc interface. +#[rpc] +pub trait Signer { + /// RPC Metadata + type Metadata; - /// Confirm specific request. - #[rpc(name = "signer_confirmRequest")] - fn confirm_request(&self, U256, TransactionModification, String) -> BoxFuture; + /// Returns a list of items to confirm. + #[rpc(name = "signer_requestsToConfirm")] + fn requests_to_confirm(&self) -> Result>; - /// Confirm specific request with token. - #[rpc(name = "signer_confirmRequestWithToken")] - fn confirm_request_with_token(&self, U256, TransactionModification, String) -> BoxFuture; + /// Confirm specific request. + #[rpc(name = "signer_confirmRequest")] + fn confirm_request(&self, U256, TransactionModification, String) -> BoxFuture; - /// Confirm specific request with already signed data. - #[rpc(name = "signer_confirmRequestRaw")] - fn confirm_request_raw(&self, U256, Bytes) -> Result; + /// Confirm specific request with token. + #[rpc(name = "signer_confirmRequestWithToken")] + fn confirm_request_with_token(&self, U256, TransactionModification, String) -> BoxFuture; - /// Reject the confirmation request. - #[rpc(name = "signer_rejectRequest")] - fn reject_request(&self, U256) -> Result; + /// Confirm specific request with already signed data. + #[rpc(name = "signer_confirmRequestRaw")] + fn confirm_request_raw(&self, U256, Bytes) -> Result; - /// Generates new authorization token. - #[rpc(name = "signer_generateAuthorizationToken")] - fn generate_token(&self) -> Result; + /// Reject the confirmation request. + #[rpc(name = "signer_rejectRequest")] + fn reject_request(&self, U256) -> Result; - /// Generates new web proxy access token for particular domain. - #[rpc(name = "signer_generateWebProxyAccessToken")] - fn generate_web_proxy_token(&self, String) -> Result; + /// Generates new authorization token. + #[rpc(name = "signer_generateAuthorizationToken")] + fn generate_token(&self) -> Result; - #[pubsub(name = "signer_pending")] { - /// Subscribe to new pending requests on signer interface. - #[rpc(name = "signer_subscribePending")] - fn subscribe_pending(&self, Self::Metadata, Subscriber>); + /// Subscribe to new pending requests on signer interface. + #[pubsub(subscription = "signer_pending", subscribe, name = "signer_subscribePending")] + fn subscribe_pending(&self, Self::Metadata, Subscriber>); - /// Unsubscribe from pending requests subscription. - #[rpc(name = "signer_unsubscribePending")] - fn unsubscribe_pending(&self, SubscriptionId) -> Result; - } - } + /// Unsubscribe from pending requests subscription. + #[pubsub(subscription = "signer_pending", unsubscribe, name = "signer_unsubscribePending")] + fn unsubscribe_pending(&self, Option, SubscriptionId) -> Result; } diff --git a/rpc/src/v1/traits/traces.rs b/rpc/src/v1/traits/traces.rs index 00572ce38db..5308ed4c6c3 100644 --- a/rpc/src/v1/traits/traces.rs +++ b/rpc/src/v1/traits/traces.rs @@ -1,64 +1,66 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Traces specific rpc interface. +use ethereum_types::H256; use jsonrpc_core::Result; -use jsonrpc_macros::Trailing; -use v1::types::{TraceFilter, LocalizedTrace, BlockNumber, Index, CallRequest, Bytes, TraceResults, TraceResultsWithTransactionHash, H256, TraceOptions}; +use jsonrpc_derive::rpc; +use v1::types::{TraceFilter, LocalizedTrace, BlockNumber, Index, CallRequest, Bytes, TraceResults, + TraceResultsWithTransactionHash, TraceOptions}; -build_rpc_trait! { - /// Traces specific rpc interface. - pub trait Traces { - type Metadata; +/// Traces specific rpc interface. +#[rpc] +pub trait Traces { + /// RPC Metadata + type Metadata; - /// Returns traces matching given filter. - #[rpc(name = "trace_filter")] - fn filter(&self, TraceFilter) -> Result>>; + /// Returns traces matching given filter. + #[rpc(name = "trace_filter")] + fn filter(&self, TraceFilter) -> Result>>; - /// Returns transaction trace at given index. - #[rpc(name = "trace_get")] - fn trace(&self, H256, Vec) -> Result>; + /// Returns transaction trace at given index. + #[rpc(name = "trace_get")] + fn trace(&self, H256, Vec) -> Result>; - /// Returns all traces of given transaction. - #[rpc(name = "trace_transaction")] - fn transaction_traces(&self, H256) -> Result>>; + /// Returns all traces of given transaction. + #[rpc(name = "trace_transaction")] + fn transaction_traces(&self, H256) -> Result>>; - /// Returns all traces produced at given block. - #[rpc(name = "trace_block")] - fn block_traces(&self, BlockNumber) -> Result>>; + /// Returns all traces produced at given block. + #[rpc(name = "trace_block")] + fn block_traces(&self, BlockNumber) -> Result>>; - /// Executes the given call and returns a number of possible traces for it. - #[rpc(name = "trace_call")] - fn call(&self, CallRequest, TraceOptions, Trailing) -> Result; + /// Executes the given call and returns a number of possible traces for it. + #[rpc(name = "trace_call")] + fn call(&self, CallRequest, TraceOptions, Option) -> Result; - /// Executes all given calls and returns a number of possible traces for each of it. - #[rpc(name = "trace_callMany")] - fn call_many(&self, Vec<(CallRequest, TraceOptions)>, Trailing) -> Result>; + /// Executes all given calls and returns a number of possible traces for each of it. + #[rpc(name = "trace_callMany")] + fn call_many(&self, Vec<(CallRequest, TraceOptions)>, Option) -> Result>; - /// Executes the given raw transaction and returns a number of possible traces for it. - #[rpc(name = "trace_rawTransaction")] - fn raw_transaction(&self, Bytes, TraceOptions, Trailing) -> Result; + /// Executes the given raw transaction and returns a number of possible traces for it. + #[rpc(name = "trace_rawTransaction")] + fn raw_transaction(&self, Bytes, TraceOptions, Option) -> Result; - /// Executes the transaction with the given hash and returns a number of possible traces for it. - #[rpc(name = "trace_replayTransaction")] - fn replay_transaction(&self, H256, TraceOptions) -> Result; + /// Executes the transaction with the given hash and returns a number of possible traces for it. + #[rpc(name = "trace_replayTransaction")] + fn replay_transaction(&self, H256, TraceOptions) -> Result; - /// Executes all the transactions at the given block and returns a number of possible traces for each transaction. - #[rpc(name = "trace_replayBlockTransactions")] - fn replay_block_transactions(&self, BlockNumber, TraceOptions) -> Result>; - } + /// Executes all the transactions at the given block and returns a number of possible traces for each transaction. + #[rpc(name = "trace_replayBlockTransactions")] + fn replay_block_transactions(&self, BlockNumber, TraceOptions) -> Result>; } diff --git a/rpc/src/v1/traits/web3.rs b/rpc/src/v1/traits/web3.rs index 713cd9a32d3..dd464ee1c22 100644 --- a/rpc/src/v1/traits/web3.rs +++ b/rpc/src/v1/traits/web3.rs @@ -1,33 +1,34 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Web3 rpc interface. +use ethereum_types::H256; use jsonrpc_core::Result; +use jsonrpc_derive::rpc; -use v1::types::{H256, Bytes}; +use v1::types::Bytes; -build_rpc_trait! { - /// Web3 rpc interface. - pub trait Web3 { - /// Returns current client version. - #[rpc(name = "web3_clientVersion")] - fn client_version(&self) -> Result; +/// Web3 rpc interface. +#[rpc] +pub trait Web3 { + /// Returns current client version. + #[rpc(name = "web3_clientVersion")] + fn client_version(&self) -> Result; - /// Returns sha3 of the given data - #[rpc(name = "web3_sha3")] - fn sha3(&self, Bytes) -> Result; - } + /// Returns sha3 of the given data + #[rpc(name = "web3_sha3")] + fn sha3(&self, Bytes) -> Result; } diff --git a/rpc/src/v1/types/account_info.rs b/rpc/src/v1/types/account_info.rs index e0e2464d89b..6d7585f87fc 100644 --- a/rpc/src/v1/types/account_info.rs +++ b/rpc/src/v1/types/account_info.rs @@ -1,23 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Return types for RPC calls -use ethereum_types::{Public, Address}; -use v1::types::{H160, H256, U256, Bytes}; +use ethereum_types::{Public, Address, H160, H256, U256}; +use v1::types::Bytes; /// Account information. #[derive(Debug, Default, Clone, PartialEq, Serialize)] diff --git a/rpc/src/v1/types/block.rs b/rpc/src/v1/types/block.rs index 8d8121766ba..6e23647a0ec 100644 --- a/rpc/src/v1/types/block.rs +++ b/rpc/src/v1/types/block.rs @@ -1,27 +1,27 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::ops::Deref; use std::collections::BTreeMap; -use ethcore::encoded::Header as EthHeader; - -use serde::{Serialize, Serializer}; +use ethereum_types::{H160, H256, U256, Bloom as H2048}; use serde::ser::Error; -use v1::types::{Bytes, Transaction, H160, H256, H2048, U256}; +use serde::{Serialize, Serializer}; +use types::encoded::Header as EthHeader; +use v1::types::{Bytes, Transaction}; /// Block Transactions #[derive(Debug)] @@ -205,8 +205,9 @@ impl Serialize for Rich { #[cfg(test)] mod tests { use std::collections::BTreeMap; + use ethereum_types::{H64, H160, H256, U256, Bloom as H2048}; use serde_json; - use v1::types::{Transaction, H64, H160, H256, H2048, Bytes, U256}; + use v1::types::{Transaction, Bytes}; use super::{Block, RichBlock, BlockTransactions, Header, RichHeader}; #[test] @@ -248,8 +249,8 @@ mod tests { let rich_block = RichBlock { inner: block, extra_info: map![ - "mixHash".into() => format!("0x{:?}", H256::default()), - "nonce".into() => format!("0x{:?}", H64::default()) + "mixHash".into() => format!("{:?}", H256::default()), + "nonce".into() => format!("{:?}", H64::default()) ], }; let serialized_rich_block = serde_json::to_string(&rich_block).unwrap(); @@ -286,8 +287,8 @@ mod tests { let rich_block = RichBlock { inner: block, extra_info: map![ - "mixHash".into() => format!("0x{:?}", H256::default()), - "nonce".into() => format!("0x{:?}", H64::default()) + "mixHash".into() => format!("{:?}", H256::default()), + "nonce".into() => format!("{:?}", H64::default()) ], }; let serialized_rich_block = serde_json::to_string(&rich_block).unwrap(); @@ -321,8 +322,8 @@ mod tests { let rich_header = RichHeader { inner: header, extra_info: map![ - "mixHash".into() => format!("0x{:?}", H256::default()), - "nonce".into() => format!("0x{:?}", H64::default()) + "mixHash".into() => format!("{:?}", H256::default()), + "nonce".into() => format!("{:?}", H64::default()) ], }; let serialized_rich_header = serde_json::to_string(&rich_header).unwrap(); diff --git a/rpc/src/v1/types/block_number.rs b/rpc/src/v1/types/block_number.rs index 085886998e2..64b100d5aa7 100644 --- a/rpc/src/v1/types/block_number.rs +++ b/rpc/src/v1/types/block_number.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use serde::{Deserialize, Deserializer, Serialize, Serializer}; diff --git a/rpc/src/v1/types/bytes.rs b/rpc/src/v1/types/bytes.rs index 0bd62c601c9..837f3b5f9a6 100644 --- a/rpc/src/v1/types/bytes.rs +++ b/rpc/src/v1/types/bytes.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Serializable wrapper around vector of bytes @@ -74,7 +74,7 @@ impl<'a> Visitor<'a> for BytesVisitor { } fn visit_str(self, value: &str) -> Result where E: Error { - if value.len() >= 2 && &value[0..2] == "0x" && value.len() & 1 == 0 { + if value.len() >= 2 && value.starts_with("0x") && value.len() & 1 == 0 { Ok(Bytes::new(FromHex::from_hex(&value[2..]).map_err(|e| Error::custom(format!("Invalid hex: {}", e)))?)) } else { Err(Error::custom("Invalid bytes format. Expected a 0x-prefixed hex string with even length")) @@ -101,6 +101,7 @@ mod tests { #[test] fn test_bytes_deserialize() { + let bytes0: Result = serde_json::from_str(r#""∀∂""#); let bytes1: Result = serde_json::from_str(r#""""#); let bytes2: Result = serde_json::from_str(r#""0x123""#); let bytes3: Result = serde_json::from_str(r#""0xgg""#); @@ -109,6 +110,7 @@ mod tests { let bytes5: Bytes = serde_json::from_str(r#""0x12""#).unwrap(); let bytes6: Bytes = serde_json::from_str(r#""0x0123""#).unwrap(); + assert!(bytes0.is_err()); assert!(bytes1.is_err()); assert!(bytes2.is_err()); assert!(bytes3.is_err()); diff --git a/rpc/src/v1/types/call_request.rs b/rpc/src/v1/types/call_request.rs index 60b06067784..d75e4b1a2d7 100644 --- a/rpc/src/v1/types/call_request.rs +++ b/rpc/src/v1/types/call_request.rs @@ -1,21 +1,22 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . +use ethereum_types::{H160, U256}; use v1::helpers::CallRequest as Request; -use v1::types::{Bytes, H160, U256}; +use v1::types::Bytes; /// Call request #[derive(Debug, Default, PartialEq, Deserialize)] @@ -57,7 +58,7 @@ mod tests { use std::str::FromStr; use rustc_hex::FromHex; use serde_json; - use v1::types::{U256, H160}; + use ethereum_types::{U256, H160}; use super::CallRequest; #[test] diff --git a/rpc/src/v1/types/confirmations.rs b/rpc/src/v1/types/confirmations.rs index e04bda95729..1534fbcea19 100644 --- a/rpc/src/v1/types/confirmations.rs +++ b/rpc/src/v1/types/confirmations.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Types used in Confirmations queue (Trusted Signer) @@ -21,7 +21,8 @@ use serde::{Serialize, Serializer}; use ansi_term::Colour; use bytes::ToPretty; -use v1::types::{U256, TransactionRequest, RichRawTransaction, H160, H256, H520, Bytes, TransactionCondition, Origin}; +use ethereum_types::{H160, H256, H520, U256}; +use v1::types::{TransactionRequest, RichRawTransaction, Bytes, TransactionCondition, Origin}; use v1::helpers; use ethkey::Password; @@ -281,8 +282,9 @@ impl Serialize for Either where #[cfg(test)] mod tests { use std::str::FromStr; + use ethereum_types::{H256, U256}; use serde_json; - use v1::types::{U256, H256, TransactionCondition}; + use v1::types::TransactionCondition; use v1::helpers; use super::*; diff --git a/rpc/src/v1/types/consensus_status.rs b/rpc/src/v1/types/consensus_status.rs index 2fedeb018c5..a5a5c9de8b3 100644 --- a/rpc/src/v1/types/consensus_status.rs +++ b/rpc/src/v1/types/consensus_status.rs @@ -1,21 +1,21 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . +use ethereum_types::{H160, H256}; use semver; -use v1::types::{H160, H256}; use updater::{self, CapState}; /// Capability info diff --git a/rpc/src/v1/types/derivation.rs b/rpc/src/v1/types/derivation.rs index 0abd0868817..1f2764d9ff2 100644 --- a/rpc/src/v1/types/derivation.rs +++ b/rpc/src/v1/types/derivation.rs @@ -1,27 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use serde::{Deserialize, Deserializer}; use serde::de::{Error, Visitor}; +use ethereum_types::H256; use ethstore; -use super::hash::H256; - /// Type of derivation pub enum DerivationType { /// Soft - allow proof of parent @@ -70,6 +69,7 @@ impl From for Derive { } /// Error converting request data +#[cfg(any(test, feature = "accounts"))] #[derive(Debug)] pub enum ConvertError { IndexOverlfow(u64), @@ -77,6 +77,7 @@ pub enum ConvertError { impl Derive { /// Convert to account provider struct dealing with possible overflows + #[cfg(any(test, feature = "accounts"))] pub fn to_derivation(self) -> Result { Ok(match self { Derive::Hierarchical(drv) => { diff --git a/rpc/src/v1/types/eip191.rs b/rpc/src/v1/types/eip191.rs index d5dce32557f..fe3aab4c51a 100644 --- a/rpc/src/v1/types/eip191.rs +++ b/rpc/src/v1/types/eip191.rs @@ -1,23 +1,25 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! EIP-191 specific types + +use ethereum_types::H160; use serde::{Deserialize, Deserializer}; use serde::de; -use v1::types::{H160, Bytes}; +use v1::types::Bytes; /// EIP-191 version specifier #[derive(Debug)] diff --git a/rpc/src/v1/types/eth_types.rs b/rpc/src/v1/types/eth_types.rs new file mode 100644 index 00000000000..606e7592489 --- /dev/null +++ b/rpc/src/v1/types/eth_types.rs @@ -0,0 +1,84 @@ +use ethereum_types::{H256, U256}; +use serde_json; + +type Res = Result; + +#[test] +fn should_serialize_u256() { + let serialized1 = serde_json::to_string(&U256::from(0)).unwrap(); + let serialized2 = serde_json::to_string(&U256::from(1)).unwrap(); + let serialized3 = serde_json::to_string(&U256::from(16)).unwrap(); + let serialized4 = serde_json::to_string(&U256::from(256)).unwrap(); + + assert_eq!(serialized1, r#""0x0""#); + assert_eq!(serialized2, r#""0x1""#); + assert_eq!(serialized3, r#""0x10""#); + assert_eq!(serialized4, r#""0x100""#); +} + +#[test] +fn should_serialize_h256() { + let serialized1 = serde_json::to_string(&H256::from(0)).unwrap(); + let serialized2 = serde_json::to_string(&H256::from(1)).unwrap(); + let serialized3 = serde_json::to_string(&H256::from(16)).unwrap(); + let serialized4 = serde_json::to_string(&H256::from(256)).unwrap(); + + assert_eq!(serialized1, r#""0x0000000000000000000000000000000000000000000000000000000000000000""#); + assert_eq!(serialized2, r#""0x0000000000000000000000000000000000000000000000000000000000000001""#); + assert_eq!(serialized3, r#""0x0000000000000000000000000000000000000000000000000000000000000010""#); + assert_eq!(serialized4, r#""0x0000000000000000000000000000000000000000000000000000000000000100""#); +} + +#[test] +fn should_fail_to_deserialize_decimals() { + let deserialized0: Res = serde_json::from_str(r#""∀∂""#); + let deserialized1: Res = serde_json::from_str(r#""""#); + let deserialized2: Res = serde_json::from_str(r#""0""#); + let deserialized3: Res = serde_json::from_str(r#""10""#); + let deserialized4: Res = serde_json::from_str(r#""1000000""#); + let deserialized5: Res = serde_json::from_str(r#""1000000000000000000""#); + let deserialized6: Res = serde_json::from_str(r#""0x""#); + + assert!(deserialized0.is_err()); + assert!(deserialized1.is_err()); + assert!(deserialized2.is_err()); + assert!(deserialized3.is_err()); + assert!(deserialized4.is_err()); + assert!(deserialized5.is_err()); + assert!(deserialized6.is_err(), "Quantities should represent zero as 0x0"); +} + +#[test] +fn should_fail_to_deserialize_bad_hex_strings() { + let deserialized1: Result = serde_json::from_str(r#""0""#); + let deserialized2: Result = serde_json::from_str(r#""0x""#); + let deserialized3: Result = serde_json::from_str(r#""0x∀∂0000000000000000000000000000000000000000000000000000000000""#); + + assert!(deserialized1.is_err(), "hex string should start with 0x"); + assert!(deserialized2.is_err(), "0x-prefixed hex string of length 64"); + assert!(deserialized3.is_err(), "hex string should only contain hex chars"); +} + +#[test] +fn should_deserialize_u256() { + let deserialized1: U256 = serde_json::from_str(r#""0x0""#).unwrap(); + let deserialized2: U256 = serde_json::from_str(r#""0x1""#).unwrap(); + let deserialized3: U256 = serde_json::from_str(r#""0x01""#).unwrap(); + let deserialized4: U256 = serde_json::from_str(r#""0x100""#).unwrap(); + + assert_eq!(deserialized1, 0.into()); + assert_eq!(deserialized2, 1.into()); + assert_eq!(deserialized3, 1.into()); + assert_eq!(deserialized4, 256.into()); +} + +#[test] +fn should_deserialize_h256() { + let deserialized1: H256 = serde_json::from_str(r#""0x0000000000000000000000000000000000000000000000000000000000000000""#).unwrap(); + let deserialized2: H256 = serde_json::from_str(r#""0x0000000000000000000000000000000000000000000000000000000000000001""#).unwrap(); + let deserialized3: H256 = serde_json::from_str(r#""0x0000000000000000000000000000000000000000000000000000000000000100""#).unwrap(); + + assert_eq!(deserialized1, 0.into()); + assert_eq!(deserialized2, 1.into()); + assert_eq!(deserialized3, 256.into()); +} diff --git a/rpc/src/v1/types/filter.rs b/rpc/src/v1/types/filter.rs index a0663b920e9..c6708da5765 100644 --- a/rpc/src/v1/types/filter.rs +++ b/rpc/src/v1/types/filter.rs @@ -1,26 +1,28 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use ethereum_types::{H160, H256}; +use jsonrpc_core::{Error as RpcError}; use serde::de::{Error, DeserializeOwned}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde_json::{Value, from_value}; -use jsonrpc_core::{Error as RpcError}; -use ethcore::filter::Filter as EthFilter; -use ethcore::client::BlockId; -use v1::types::{BlockNumber, H160, H256, Log}; +use types::filter::Filter as EthFilter; +use types::ids::BlockId; + +use v1::types::{BlockNumber, Log}; use v1::helpers::errors::invalid_params; /// Variadic value @@ -149,8 +151,8 @@ mod tests { use ethereum_types::H256; use super::{VariadicValue, Topic, Filter}; use v1::types::BlockNumber; - use ethcore::filter::Filter as EthFilter; - use ethcore::client::BlockId; + use types::filter::Filter as EthFilter; + use types::ids::BlockId; #[test] fn topic_deserialization() { diff --git a/rpc/src/v1/types/hash.rs b/rpc/src/v1/types/hash.rs deleted file mode 100644 index 07c7ef24f45..00000000000 --- a/rpc/src/v1/types/hash.rs +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -use std::fmt; -use std::str::FromStr; -use std::cmp::Ordering; -use std::hash::{Hash, Hasher}; -use serde; -use rustc_hex::{ToHex, FromHex}; -use ethereum_types::{H64 as Eth64, H160 as Eth160, H256 as Eth256, H520 as Eth520, H512 as Eth512, Bloom as Eth2048}; - -macro_rules! impl_hash { - ($name: ident, $other: ident, $size: expr) => { - /// Hash serialization - pub struct $name(pub [u8; $size]); - - impl Eq for $name { } - - impl Default for $name { - fn default() -> Self { - $name([0; $size]) - } - } - - impl fmt::Debug for $name { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.0.to_hex()) - } - } - - impl fmt::Display for $name { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let hex = self.0.to_hex(); - write!(f, "{}..{}", &hex[0..2], &hex[$size-2..$size]) - } - } - - impl From for $name where $other: From { - fn from(o: T) -> Self { - $name($other::from(o).0) - } - } - - impl FromStr for $name { - type Err = <$other as FromStr>::Err; - - fn from_str(s: &str) -> Result { - $other::from_str(s).map(|x| $name(x.0)) - } - } - - impl Into<$other> for $name { - fn into(self) -> $other { - $other(self.0) - } - } - - impl PartialEq for $name { - fn eq(&self, other: &Self) -> bool { - let self_ref: &[u8] = &self.0; - let other_ref: &[u8] = &other.0; - self_ref == other_ref - } - } - - impl PartialOrd for $name { - fn partial_cmp(&self, other: &Self) -> Option { - let self_ref: &[u8] = &self.0; - let other_ref: &[u8] = &other.0; - self_ref.partial_cmp(other_ref) - } - } - - impl Ord for $name { - fn cmp(&self, other: &Self) -> Ordering { - let self_ref: &[u8] = &self.0; - let other_ref: &[u8] = &other.0; - self_ref.cmp(other_ref) - } - } - - impl Hash for $name { - fn hash(&self, state: &mut H) where H: Hasher { - let self_ref: &[u8] = &self.0; - Hash::hash(self_ref, state) - } - } - - impl Clone for $name { - fn clone(&self) -> Self { - let mut r = [0; $size]; - r.copy_from_slice(&self.0); - $name(r) - } - } - - impl serde::Serialize for $name { - fn serialize(&self, serializer: S) -> Result - where S: serde::Serializer { - let mut hex = "0x".to_owned(); - hex.push_str(&self.0.to_hex()); - serializer.serialize_str(&hex) - } - } - - impl<'a> serde::Deserialize<'a> for $name { - fn deserialize(deserializer: D) -> Result<$name, D::Error> where D: serde::Deserializer<'a> { - struct HashVisitor; - - impl<'b> serde::de::Visitor<'b> for HashVisitor { - type Value = $name; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - write!(formatter, "a 0x-prefixed, padded, hex-encoded hash with length {}", $size * 2) - } - - fn visit_str(self, value: &str) -> Result where E: serde::de::Error { - - if value.len() < 2 || &value[0..2] != "0x" { - return Err(E::custom("expected a hex-encoded hash with 0x prefix")); - } - if value.len() != 2 + $size * 2 { - return Err(E::invalid_length(value.len() - 2, &self)); - } - - match value[2..].from_hex() { - Ok(ref v) => { - let mut result = [0u8; $size]; - result.copy_from_slice(v); - Ok($name(result)) - }, - Err(e) => Err(E::custom(format!("invalid hex value: {:?}", e))), - } - } - - fn visit_string(self, value: String) -> Result where E: serde::de::Error { - self.visit_str(value.as_ref()) - } - } - - deserializer.deserialize_any(HashVisitor) - } - } - } -} - -impl_hash!(H64, Eth64, 8); -impl_hash!(H160, Eth160, 20); -impl_hash!(H256, Eth256, 32); -impl_hash!(H512, Eth512, 64); -impl_hash!(H520, Eth520, 65); -impl_hash!(H2048, Eth2048, 256); diff --git a/rpc/src/v1/types/histogram.rs b/rpc/src/v1/types/histogram.rs index 96c50a48b83..d7f14c514e6 100644 --- a/rpc/src/v1/types/histogram.rs +++ b/rpc/src/v1/types/histogram.rs @@ -1,22 +1,22 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Gas prices histogram. -use v1::types::U256; +use ethereum_types::U256; /// Values of RPC settings. #[derive(Serialize, Deserialize)] diff --git a/rpc/src/v1/types/index.rs b/rpc/src/v1/types/index.rs index 4c8af600045..3f4b4e31705 100644 --- a/rpc/src/v1/types/index.rs +++ b/rpc/src/v1/types/index.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use serde::{Deserialize, Deserializer}; diff --git a/rpc/src/v1/types/log.rs b/rpc/src/v1/types/log.rs index eaef71f75d7..3dcc8fb2988 100644 --- a/rpc/src/v1/types/log.rs +++ b/rpc/src/v1/types/log.rs @@ -1,21 +1,22 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use ethcore::log_entry::{LocalizedLogEntry, LogEntry}; -use v1::types::{Bytes, H160, H256, U256}; +use ethereum_types::{H160, H256, U256}; +use types::log_entry::{LocalizedLogEntry, LogEntry}; +use v1::types::Bytes; /// Log #[derive(Debug, Serialize, PartialEq, Eq, Hash, Clone)] @@ -87,7 +88,8 @@ impl From for Log { mod tests { use serde_json; use std::str::FromStr; - use v1::types::{Log, H160, H256, U256}; + use v1::types::Log; + use ethereum_types::{H160, H256, U256}; #[test] fn log_serialization() { diff --git a/rpc/src/v1/types/mod.rs b/rpc/src/v1/types/mod.rs index cde98e59784..a41f49fab18 100644 --- a/rpc/src/v1/types/mod.rs +++ b/rpc/src/v1/types/mod.rs @@ -1,21 +1,24 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! RPC types +#[cfg(test)] +mod eth_types; + mod account_info; mod block; mod block_number; @@ -25,7 +28,6 @@ mod confirmations; mod consensus_status; mod derivation; mod filter; -mod hash; mod histogram; mod index; mod log; @@ -40,7 +42,6 @@ mod trace_filter; mod transaction; mod transaction_request; mod transaction_condition; -mod uint; mod work; mod private_receipt; mod eip191; @@ -60,7 +61,6 @@ pub use self::confirmations::{ pub use self::consensus_status::*; pub use self::derivation::{DeriveHash, DeriveHierarchical, Derive}; pub use self::filter::{Filter, FilterChanges}; -pub use self::hash::{H64, H160, H256, H512, H520, H2048}; pub use self::histogram::Histogram; pub use self::index::Index; pub use self::log::Log; @@ -78,7 +78,6 @@ pub use self::trace_filter::TraceFilter; pub use self::transaction::{Transaction, RichRawTransaction, LocalTransactionStatus}; pub use self::transaction_request::TransactionRequest; pub use self::transaction_condition::TransactionCondition; -pub use self::uint::{U128, U256, U64}; pub use self::work::Work; pub use self::private_receipt::{PrivateTransactionReceipt, PrivateTransactionReceiptAndTransaction}; diff --git a/rpc/src/v1/types/node_kind.rs b/rpc/src/v1/types/node_kind.rs index a4418d09e52..f02f21939d0 100644 --- a/rpc/src/v1/types/node_kind.rs +++ b/rpc/src/v1/types/node_kind.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Description of the node. diff --git a/rpc/src/v1/types/private_receipt.rs b/rpc/src/v1/types/private_receipt.rs index 246f358b128..fd0eae067fb 100644 --- a/rpc/src/v1/types/private_receipt.rs +++ b/rpc/src/v1/types/private_receipt.rs @@ -1,21 +1,22 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use v1::types::{H160, H256, TransactionRequest}; use ethcore_private_tx::{Receipt as EthPrivateReceipt}; +use ethereum_types::{H160, H256}; +use v1::types::TransactionRequest; /// Receipt #[derive(Debug, Serialize)] @@ -24,7 +25,7 @@ pub struct PrivateTransactionReceipt { /// Transaction Hash pub transaction_hash: H256, /// Private contract address - pub contract_address: Option, + pub contract_address: H160, /// Status code #[serde(rename = "status")] pub status_code: u8, @@ -34,7 +35,7 @@ impl From for PrivateTransactionReceipt { fn from(r: EthPrivateReceipt) -> Self { PrivateTransactionReceipt { transaction_hash: r.hash.into(), - contract_address: r.contract_address.map(Into::into), + contract_address: r.contract_address.into(), status_code: r.status_code.into(), } } diff --git a/rpc/src/v1/types/provenance.rs b/rpc/src/v1/types/provenance.rs index 1ad7cfe1b13..dcdd2408fe8 100644 --- a/rpc/src/v1/types/provenance.rs +++ b/rpc/src/v1/types/provenance.rs @@ -1,23 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Request Provenance use std::fmt; -use v1::types::H256; +use ethereum_types::H256; /// RPC request origin #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] diff --git a/rpc/src/v1/types/pubsub.rs b/rpc/src/v1/types/pubsub.rs index fb4f217c25e..c526a2b372e 100644 --- a/rpc/src/v1/types/pubsub.rs +++ b/rpc/src/v1/types/pubsub.rs @@ -1,25 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Pub-Sub types. +use ethereum_types::H256; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde::de::Error; use serde_json::{Value, from_value}; -use v1::types::{RichHeader, Filter, Log, H256}; +use v1::types::{RichHeader, Filter, Log}; /// Subscription result. #[derive(Debug, Clone, PartialEq, Eq)] diff --git a/rpc/src/v1/types/receipt.rs b/rpc/src/v1/types/receipt.rs index a5cbfd533aa..f440c8f4864 100644 --- a/rpc/src/v1/types/receipt.rs +++ b/rpc/src/v1/types/receipt.rs @@ -1,21 +1,22 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use v1::types::{Log, H160, H256, H2048, U256, U64}; -use ethcore::receipt::{Receipt as EthReceipt, RichReceipt, LocalizedReceipt, TransactionOutcome}; +use ethereum_types::{H160, H256, U64, U256, Bloom as H2048}; +use v1::types::Log; +use types::receipt::{Receipt as EthReceipt, RichReceipt, LocalizedReceipt, TransactionOutcome}; /// Receipt #[derive(Debug, Serialize)] diff --git a/rpc/src/v1/types/rpc_settings.rs b/rpc/src/v1/types/rpc_settings.rs index 3be781f2061..63dfba7a8e4 100644 --- a/rpc/src/v1/types/rpc_settings.rs +++ b/rpc/src/v1/types/rpc_settings.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! RPC Settings data. diff --git a/rpc/src/v1/types/secretstore.rs b/rpc/src/v1/types/secretstore.rs index 22b61b5e152..ef76ec5b464 100644 --- a/rpc/src/v1/types/secretstore.rs +++ b/rpc/src/v1/types/secretstore.rs @@ -1,20 +1,21 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use v1::types::{Bytes, H512}; +use ethereum_types::H512; +use v1::types::Bytes; /// Encrypted document key. #[derive(Default, Debug, Serialize, PartialEq)] @@ -22,7 +23,7 @@ use v1::types::{Bytes, H512}; pub struct EncryptedDocumentKey { /// Common encryption point. Pass this to Secret Store 'Document key storing session' pub common_point: H512, - /// Ecnrypted point. Pass this to Secret Store 'Document key storing session'. + /// Encrypted point. Pass this to Secret Store 'Document key storing session'. pub encrypted_point: H512, /// Document key itself, encrypted with passed account public. Pass this to 'secretstore_encrypt'. pub encrypted_key: Bytes, diff --git a/rpc/src/v1/types/sync.rs b/rpc/src/v1/types/sync.rs index 82b1b41a80b..10094742c0a 100644 --- a/rpc/src/v1/types/sync.rs +++ b/rpc/src/v1/types/sync.rs @@ -1,23 +1,25 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . +use network::client_version::ClientVersion; use std::collections::BTreeMap; + +use ethereum_types::{U256, H512}; use sync::{self, PeerInfo as SyncPeerInfo, TransactionStats as SyncTransactionStats}; use serde::{Serialize, Serializer}; -use v1::types::{U256, H512}; /// Sync info #[derive(Default, Debug, Serialize, PartialEq)] @@ -54,7 +56,7 @@ pub struct PeerInfo { /// Public node id pub id: Option, /// Node client ID - pub name: String, + pub name: ClientVersion, /// Capabilities pub caps: Vec, /// Network information diff --git a/rpc/src/v1/types/trace.rs b/rpc/src/v1/types/trace.rs index 3237665425c..715ffe62c58 100644 --- a/rpc/src/v1/types/trace.rs +++ b/rpc/src/v1/types/trace.rs @@ -1,30 +1,32 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::BTreeMap; -use serde::{Serialize, Serializer}; -use serde::ser::SerializeStruct; -use ethcore::trace::{FlatTrace, LocalizedTrace as EthLocalizedTrace, trace, TraceError}; -use ethcore::trace as et; -use ethcore::state_diff; -use ethcore::account_diff; + use ethcore::client::Executed; -use ethereum_types::H256 as EthH256; +use ethcore::trace as et; +use ethcore::trace::{FlatTrace, LocalizedTrace as EthLocalizedTrace, trace, TraceError}; +use ethereum_types::{H160, H256, U256}; +use serde::ser::SerializeStruct; +use serde::{Serialize, Serializer}; +use types::account_diff; +use types::state_diff; use vm; -use v1::types::{Bytes, H160, H256, U256}; + +use v1::types::Bytes; #[derive(Debug, Serialize)] /// A diff of some chunk of memory. @@ -637,8 +639,8 @@ pub struct TraceResultsWithTransactionHash { pub transaction_hash: H256, } -impl From<(EthH256, Executed)> for TraceResultsWithTransactionHash { - fn from(t: (EthH256, Executed)) -> Self { +impl From<(H256, Executed)> for TraceResultsWithTransactionHash { + fn from(t: (H256, Executed)) -> Self { TraceResultsWithTransactionHash { output: t.1.output.into(), trace: t.1.trace.into_iter().map(Into::into).collect(), diff --git a/rpc/src/v1/types/trace_filter.rs b/rpc/src/v1/types/trace_filter.rs index 71a9021386a..a455c3d1cc2 100644 --- a/rpc/src/v1/types/trace_filter.rs +++ b/rpc/src/v1/types/trace_filter.rs @@ -1,24 +1,25 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Trace filter deserialization. use ethcore::client::BlockId; use ethcore::client; -use v1::types::{BlockNumber, H160}; +use ethereum_types::H160; +use v1::types::BlockNumber; /// Trace filter #[derive(Debug, PartialEq, Deserialize)] diff --git a/rpc/src/v1/types/transaction.rs b/rpc/src/v1/types/transaction.rs index ebf983edb38..72b591a89f7 100644 --- a/rpc/src/v1/types/transaction.rs +++ b/rpc/src/v1/types/transaction.rs @@ -1,27 +1,28 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use serde::{Serialize, Serializer}; use serde::ser::SerializeStruct; use ethcore::{contract_address, CreateContractAddress}; +use ethereum_types::{H160, H256, H512, U64, U256}; use miner; -use transaction::{LocalizedTransaction, Action, PendingTransaction, SignedTransaction}; -use v1::types::{Bytes, H160, H256, U256, H512, U64, TransactionCondition}; +use types::transaction::{LocalizedTransaction, Action, PendingTransaction, SignedTransaction}; +use v1::types::{Bytes, TransactionCondition}; /// Transaction #[derive(Debug, Default, Clone, PartialEq, Serialize)] diff --git a/rpc/src/v1/types/transaction_condition.rs b/rpc/src/v1/types/transaction_condition.rs index c4f7720c90f..589848fe549 100644 --- a/rpc/src/v1/types/transaction_condition.rs +++ b/rpc/src/v1/types/transaction_condition.rs @@ -1,20 +1,20 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use transaction; +use types::transaction; /// Represents condition on minimum block number or block timestamp. #[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)] diff --git a/rpc/src/v1/types/transaction_request.rs b/rpc/src/v1/types/transaction_request.rs index 58cac6dd44c..a4698cafa76 100644 --- a/rpc/src/v1/types/transaction_request.rs +++ b/rpc/src/v1/types/transaction_request.rs @@ -1,22 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! `TransactionRequest` type -use v1::types::{Bytes, H160, U256, TransactionCondition}; +use ethereum_types::{H160, U256}; +use v1::types::{Bytes, TransactionCondition}; use v1::helpers; use ansi_term::Colour; @@ -57,8 +58,7 @@ pub fn format_ether(i: U256) -> String { } else { string.insert(idx as usize, '.'); } - String::from(string.trim_right_matches('0') - .trim_right_matches('.')) + String::from(string.trim_end_matches('0').trim_end_matches('.')) } impl fmt::Display for TransactionRequest { @@ -138,7 +138,8 @@ mod tests { use std::str::FromStr; use rustc_hex::FromHex; use serde_json; - use v1::types::{U256, H160, TransactionCondition}; + use v1::types::TransactionCondition; + use ethereum_types::{H160, U256}; use super::*; #[test] diff --git a/rpc/src/v1/types/uint.rs b/rpc/src/v1/types/uint.rs deleted file mode 100644 index cb6dd5d3fdb..00000000000 --- a/rpc/src/v1/types/uint.rs +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -use std::str::FromStr; -use std::fmt; -use serde; -use ethereum_types::{U256 as EthU256, U128 as EthU128}; - -macro_rules! impl_uint { - ($name: ident, $other: ident, $size: expr) => { - /// Uint serialization. - #[derive(Debug, Default, Clone, Copy, PartialEq, Hash)] - pub struct $name($other); - - impl Eq for $name { } - - impl From for $name where $other: From { - fn from(o: T) -> Self { - $name($other::from(o)) - } - } - - impl FromStr for $name { - type Err = <$other as FromStr>::Err; - - fn from_str(s: &str) -> Result { - $other::from_str(s).map($name) - } - } - - impl Into<$other> for $name { - fn into(self) -> $other { - self.0 - } - } - - impl fmt::Display for $name { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.0) - } - } - - impl fmt::LowerHex for $name { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - fmt::LowerHex::fmt(&self.0, f) - } - } - - impl<'a> serde::Deserialize<'a> for $name { - fn deserialize(deserializer: D) -> Result<$name, D::Error> - where D: serde::Deserializer<'a> { - struct UintVisitor; - - impl<'b> serde::de::Visitor<'b> for UintVisitor { - type Value = $name; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - write!(formatter, "a 0x-prefixed, hex-encoded number of length {}", $size*16) - } - - fn visit_str(self, value: &str) -> Result where E: serde::de::Error { - if value.len() < 2 || &value[0..2] != "0x" { - return Err(E::custom("expected a hex-encoded numbers with 0x prefix")) - } - - // 0x + len - if value.len() > 2 + $size * 16 { - return Err(E::invalid_length(value.len() - 2, &self)); - } - - $other::from_str(&value[2..]).map($name).map_err(|e| E::custom(&format!("invalid hex value: {:?}", e))) - } - - fn visit_string(self, value: String) -> Result where E: serde::de::Error { - self.visit_str(&value) - } - } - - deserializer.deserialize_any(UintVisitor) - } - } - - } -} - -impl_uint!(U128, EthU128, 2); -impl_uint!(U256, EthU256, 4); -impl_uint!(U64, u64, 1); - -impl serde::Serialize for U128 { - fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { - serializer.serialize_str(&format!("{:#x}", self)) - } -} - -impl serde::Serialize for U256 { - fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { - serializer.serialize_str(&format!("{:#x}", self)) - } -} - -impl serde::Serialize for U64 { - fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { - serializer.serialize_str(&format!("{:#x}", self)) - } -} - -#[cfg(test)] -mod tests { - use super::U256; - use serde_json; - - type Res = Result; - - #[test] - fn should_serialize_u256() { - let serialized1 = serde_json::to_string(&U256(0.into())).unwrap(); - let serialized2 = serde_json::to_string(&U256(1.into())).unwrap(); - let serialized3 = serde_json::to_string(&U256(16.into())).unwrap(); - let serialized4 = serde_json::to_string(&U256(256.into())).unwrap(); - - assert_eq!(serialized1, r#""0x0""#); - assert_eq!(serialized2, r#""0x1""#); - assert_eq!(serialized3, r#""0x10""#); - assert_eq!(serialized4, r#""0x100""#); - } - - #[test] - fn should_fail_to_deserialize_decimals() { - let deserialized1: Res = serde_json::from_str(r#""""#); - let deserialized2: Res = serde_json::from_str(r#""0""#); - let deserialized3: Res = serde_json::from_str(r#""10""#); - let deserialized4: Res = serde_json::from_str(r#""1000000""#); - let deserialized5: Res = serde_json::from_str(r#""1000000000000000000""#); - - assert!(deserialized1.is_err()); - assert!(deserialized2.is_err()); - assert!(deserialized3.is_err()); - assert!(deserialized4.is_err()); - assert!(deserialized5.is_err()); - } - - #[test] - fn should_deserialize_u256() { - let deserialized1: U256 = serde_json::from_str(r#""0x""#).unwrap(); - let deserialized2: U256 = serde_json::from_str(r#""0x0""#).unwrap(); - let deserialized3: U256 = serde_json::from_str(r#""0x1""#).unwrap(); - let deserialized4: U256 = serde_json::from_str(r#""0x01""#).unwrap(); - let deserialized5: U256 = serde_json::from_str(r#""0x100""#).unwrap(); - - assert_eq!(deserialized1, U256(0.into())); - assert_eq!(deserialized2, U256(0.into())); - assert_eq!(deserialized3, U256(1.into())); - assert_eq!(deserialized4, U256(1.into())); - assert_eq!(deserialized5, U256(256.into())); - } -} diff --git a/rpc/src/v1/types/work.rs b/rpc/src/v1/types/work.rs index 5fdc117a202..ed6c7c8e917 100644 --- a/rpc/src/v1/types/work.rs +++ b/rpc/src/v1/types/work.rs @@ -1,20 +1,20 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -use super::{H256, U256}; +use ethereum_types::{H256, U256}; use serde::{Serialize, Serializer}; diff --git a/scripts/docker/hub/Dockerfile b/scripts/docker/hub/Dockerfile index d40a662111f..a18cacf9cc9 100644 --- a/scripts/docker/hub/Dockerfile +++ b/scripts/docker/hub/Dockerfile @@ -1,8 +1,5 @@ FROM ubuntu:xenial -MAINTAINER Parity Technologies -#set ENVIROMENT -ARG TARGET -ENV TARGET ${TARGET} +LABEL MAINTAINER="Parity Technologies " # install tools and dependencies RUN apt update && apt install -y --no-install-recommends openssl libudev-dev file curl jq @@ -10,27 +7,24 @@ RUN apt update && apt install -y --no-install-recommends openssl libudev-dev fil # show backtraces ENV RUST_BACKTRACE 1 -#cleanup Docker image -RUN apt autoremove -y -RUN apt clean -y -RUN rm -rf /tmp/* /var/tmp/* /var/lib/apt/lists/* +# cleanup Docker image +RUN apt autoremove -y \ + && apt clean -y \ + && rm -rf /tmp/* /var/tmp/* /var/lib/apt/lists/* RUN groupadd -g 1000 parity \ && useradd -m -u 1000 -g parity -s /bin/sh parity +WORKDIR /home/parity -#add TARGET to docker image -COPY artifacts/x86_64-unknown-linux-gnu/$TARGET /bin/$TARGET - -# Build a shell script because the ENTRYPOINT command doesn't like using ENV -RUN echo "#!/bin/bash \n ${TARGET} \$@" > ./entrypoint.sh -RUN chmod +x ./entrypoint.sh +# add parity-ethereum to docker image +COPY artifacts/x86_64-unknown-linux-gnu/parity /bin/parity COPY scripts/docker/hub/check_sync.sh /check_sync.sh # switch to user parity here USER parity -# setup ENTRYPOINT EXPOSE 5001 8080 8082 8083 8545 8546 8180 30303/tcp 30303/udp -ENTRYPOINT ["./entrypoint.sh"] + +ENTRYPOINT ["/bin/parity"] diff --git a/scripts/gitlab/build-unix.sh b/scripts/gitlab/build-unix.sh index cf6bfe1476c..9b2b1232804 100755 --- a/scripts/gitlab/build-unix.sh +++ b/scripts/gitlab/build-unix.sh @@ -9,59 +9,43 @@ echo "CARGO_HOME: " $CARGO_HOME echo "CARGO_TARGET: " $CARGO_TARGET echo "CC: " $CC echo "CXX: " $CXX +#strip ON +export RUSTFLAGS=" -C link-arg=-s" +# Linker for crosscomile +echo "_____ Linker _____" +cat .cargo/config -echo "__________CARGO CONFIG__________" +echo "_____ Building target: "$CARGO_TARGET" _____" if [ "${CARGO_TARGET}" = "armv7-linux-androideabi" ] then - # use build container's cargo config - cat /.cargo/config + time cargo build --target $CARGO_TARGET --release -p parity-clib --features final else - mkdir -p .cargo - rm -f .cargo/config - echo "[target.$CARGO_TARGET]" >> .cargo/config - echo "linker= \"$CC\"" >> .cargo/config - cat .cargo/config + time cargo build --target $CARGO_TARGET --release --features final + time cargo build --target $CARGO_TARGET --release -p evmbin + time cargo build --target $CARGO_TARGET --release -p ethstore-cli + time cargo build --target $CARGO_TARGET --release -p ethkey-cli + time cargo build --target $CARGO_TARGET --release -p whisper-cli fi - -echo "_____ Building target: "$CARGO_TARGET" _____" -time cargo build --target $CARGO_TARGET --release --features final -time cargo build --target $CARGO_TARGET --release -p evmbin -time cargo build --target $CARGO_TARGET --release -p ethstore-cli -time cargo build --target $CARGO_TARGET --release -p ethkey-cli -time cargo build --target $CARGO_TARGET --release -p whisper-cli - echo "_____ Post-processing binaries _____" -rm -rf artifacts -mkdir -p artifacts -cd artifacts -mkdir -p $CARGO_TARGET -cd $CARGO_TARGET -cp -v ../../target/$CARGO_TARGET/release/parity ./parity -cp -v ../../target/$CARGO_TARGET/release/parity-evm ./parity-evm -cp -v ../../target/$CARGO_TARGET/release/ethstore ./ethstore -cp -v ../../target/$CARGO_TARGET/release/ethkey ./ethkey -cp -v ../../target/$CARGO_TARGET/release/whisper ./whisper - +rm -rf artifacts/* +mkdir -p artifacts/$CARGO_TARGET +cd artifacts/$CARGO_TARGET -# stripping can also be done on release build time -# export RUSTFLAGS="${RUSTFLAGS} -C link-arg=-s" if [ "${CARGO_TARGET}" = "armv7-linux-androideabi" ] then - arm-linux-androideabi-strip -v ./* + cp -v ../../target/$CARGO_TARGET/release/libparity.so ./libparity.so else - strip -v ./* + cp -v ../../target/$CARGO_TARGET/release/parity ./parity + cp -v ../../target/$CARGO_TARGET/release/parity-evm ./parity-evm + cp -v ../../target/$CARGO_TARGET/release/ethstore ./ethstore + cp -v ../../target/$CARGO_TARGET/release/ethkey ./ethkey + cp -v ../../target/$CARGO_TARGET/release/whisper ./whisper fi echo "_____ Calculating checksums _____" for binary in $(ls) do - rhash --sha256 $binary -o $binary.sha256 - if [ "${CARGO_TARGET}" = "armv7-linux-androideabi" ] - then - echo "> ${binary} cannot be hashed with cross-compiled binary" - else - ./parity tools hash $binary > $binary.sha3 - fi + rhash --sha256 $binary -o $binary.sha256 #do we still need this hash (SHA2)? + rhash --sha3-256 $binary -o $binary.sha3 done - diff --git a/scripts/gitlab/cargo-audit.sh b/scripts/gitlab/cargo-audit.sh deleted file mode 100755 index 16f0dc934ad..00000000000 --- a/scripts/gitlab/cargo-audit.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -set -e # fail on any error -set -u # treat unset variables as error - -cargo install cargo-audit -cargo audit diff --git a/scripts/gitlab/publish-docs.sh b/scripts/gitlab/publish-docs.sh index 6bf90ad0562..262ea80807f 100755 --- a/scripts/gitlab/publish-docs.sh +++ b/scripts/gitlab/publish-docs.sh @@ -7,6 +7,7 @@ clone_repos() { echo "__________Clone repos__________" git clone https://github.com/parity-js/jsonrpc.git jsonrpc git clone https://github.com/paritytech/wiki.git wiki + git clone https://github.com/paritytech/parity-config-generator } build_docs() { @@ -15,18 +16,25 @@ build_docs() { npm run build:markdown } +build_config() { + echo "_______Build config docs______" + yarn install + AUTOGENSCRIPT=1 yarn generate-docs +} + update_wiki_docs() { echo "__________Update WIKI docs__________" for file in $(ls jsonrpc/docs); do module_name=${file:0:-3} mv jsonrpc/docs/$file wiki/JSONRPC-$module_name-module.md done + mv parity-config-generator/docs/config.md wiki/Configuring-Parity-Ethereum.md } setup_git() { echo "__________Set github__________" - git config user.email "devops@parity.com" - git config user.name "Devops Parity" + git config --global user.email "devops@parity.com" + git config --global user.name "Devops Parity" } set_remote_wiki() { @@ -38,13 +46,13 @@ commit_files() { git checkout -b rpcdoc-update-${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}} git add . git commit -m "Update docs to ${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}" - git tag -a "${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}" -m "Update RPC docs to ${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}" + git tag -a -f "${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}" -m "Update RPC and config docs to ${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}" } upload_files() { echo "__________Upload files__________" - git push origin HEAD - git push --tags + git push -q origin HEAD + git push -q -f --tags } RPC_TRAITS_DIR="rpc/src/v1/traits" @@ -56,6 +64,9 @@ cp $RPC_TRAITS_DIR/*.rs "jsonrpc/.parity/$RPC_TRAITS_DIR" cd jsonrpc build_docs cd .. +cd parity-config-generator +build_config +cd .. update_wiki_docs cd wiki set_remote_wiki diff --git a/scripts/gitlab/publish-awss3.sh b/scripts/gitlab/publish-onchain.sh similarity index 73% rename from scripts/gitlab/publish-awss3.sh rename to scripts/gitlab/publish-onchain.sh index af768a63283..588cbdfb579 100755 --- a/scripts/gitlab/publish-awss3.sh +++ b/scripts/gitlab/publish-onchain.sh @@ -36,19 +36,3 @@ do esac cd .. done - -echo "__________Push binaries to AWS S3____________" -aws configure set aws_access_key_id $s3_key -aws configure set aws_secret_access_key $s3_secret - -case "${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}" in - (beta|stable|nightly) - export S3_BUCKET=releases.parity.io/ethereum; - ;; - (*) - export S3_BUCKET=builds-parity; - ;; -esac - -aws s3 sync ./ s3://$S3_BUCKET/${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}/ - diff --git a/scripts/gitlab/publish-snap.sh b/scripts/gitlab/publish-snap.sh new file mode 100755 index 00000000000..5e0231af00e --- /dev/null +++ b/scripts/gitlab/publish-snap.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +set -e # fail on any error +set -u # treat unset variables as error + +# some necromancy: +# gsub(/"/, "", $2) deletes "qoutes" +# gsub(/ /, "", $2) deletes whitespaces +TRACK=`awk -F '=' '/^track/ {gsub(/"/, "", $2); gsub(/ /, "", $2); print $2}' ./util/version/Cargo.toml` +echo Track is: $TRACK +# prepare variables +VERSION=v"$(sed -r -n '1,/^version/s/^version = "([^"]+)".*$/\1/p' Cargo.toml)" +SNAP_PACKAGE="parity_"$VERSION"_"$BUILD_ARCH".snap" +CARGO_TARGET="$(ls artifacts)" +# Choose snap release channel based on parity ethereum version track +case ${TRACK} in + nightly) export GRADE="devel" CHANNEL="edge";; + beta) export GRADE="stable" CHANNEL="beta";; + stable) export GRADE="stable" CHANNEL="stable";; + *) echo "No release" && exit 0;; +esac + +# Release untagged versions from branches to the candidate snap channel +case ${CI_COMMIT_REF_NAME} in + beta|stable) export GRADE="stable" CHANNEL="candidate";; +esac +echo "__________Create snap package__________" +echo "Release channel :" $GRADE " Branch/tag: " $CI_COMMIT_REF_NAME +echo $VERSION:$GRADE:$BUILD_ARCH:$CARGO_TARGET + +sed -e 's/$VERSION/'"$VERSION"'/g' \ + -e 's/$GRADE/'"$GRADE"'/g' \ + -e 's/$BUILD_ARCH/'"$BUILD_ARCH"'/g' \ + -e 's/$CARGO_TARGET/'"$CARGO_TARGET"'/g' \ + scripts/snap/snapcraft.template.yaml > snapcraft.yaml + +apt update +apt install -y --no-install-recommends rhash +cat snapcraft.yaml +snapcraft --target-arch=$BUILD_ARCH +ls *.snap + +echo "__________Calculating checksums__________" +rhash --sha256 $SNAP_PACKAGE -o $SNAP_PACKAGE".sha256" +cat $SNAP_PACKAGE".sha256" + +echo "__________Releasing snap package__________" +echo "Release channel :" $CHANNEL " Branch/tag: " $CI_COMMIT_REF_NAME + +echo $SNAPCRAFT_LOGIN_PARITY_BASE64 | base64 --decode > snapcraft.login +snapcraft login --with snapcraft.login +snapcraft push --release $CHANNEL $SNAP_PACKAGE +snapcraft status parity +snapcraft logout diff --git a/scripts/gitlab/test-all.sh b/scripts/gitlab/test-all.sh index 15c22870626..925124b7ac2 100755 --- a/scripts/gitlab/test-all.sh +++ b/scripts/gitlab/test-all.sh @@ -1,6 +1,4 @@ #!/bin/bash -# ARGUMENT $1 Rust flavor to test with (stable/beta/nightly) - set -e # fail on any error set -u # treat unset variables as error @@ -27,9 +25,6 @@ then exit 0 fi -rustup default $1 - -git submodule update --init --recursive rustup show exec ./test.sh diff --git a/scripts/snap/icon.png b/scripts/snap/icon.png new file mode 100644 index 00000000000..f0f22390f56 Binary files /dev/null and b/scripts/snap/icon.png differ diff --git a/scripts/snap/parity.desktop b/scripts/snap/parity.desktop new file mode 100644 index 00000000000..1833865deab --- /dev/null +++ b/scripts/snap/parity.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Type=Application +Encoding=UTF-8 +Name=Parity Ethereum +Comment=The fastest and most advanced Ethereum client. +Exec=parity +Icon=/usr/share/pixmaps/icon.png +Terminal=true diff --git a/scripts/snap/snapcraft.template.yaml b/scripts/snap/snapcraft.template.yaml new file mode 100644 index 00000000000..7307c4ff6c0 --- /dev/null +++ b/scripts/snap/snapcraft.template.yaml @@ -0,0 +1,53 @@ +name: parity +version: $VERSION +architectures: [$BUILD_ARCH] +grade: $GRADE +confinement: strict + +summary: Fast, light, robust Ethereum implementation +description: | + Parity's goal is to be the fastest, lightest, and most secure Ethereum + client. We are developing Parity using the sophisticated and cutting-edge + Rust programming language. Parity is licensed under the GPLv3, and can be + used for all your Ethereum needs. + +apps: + parity: + command: parity + plugs: [home, network, network-bind, mount-observe, removable-media, x11, unity7, desktop, desktop-legacy, wayland] + desktop: ./usr/share/applications/parity.desktop + parity-evm: + command: parity-evm + plugs: [home, network, network-bind, removable-media] + ethkey: + command: ethkey + plugs: [home, removable-media] + ethstore: + command: ethstore + plugs: [home, removable-media] + whisper: + command: whisper + plugs: [home, network-bind, removable-media] + +icon: ./scripts/snap/icon.png + +parts: + desktop-icon: + source: ./scripts/snap + plugin: nil + override-build: | + mkdir -p $SNAPCRAFT_PART_INSTALL/usr/share/applications + mkdir -p $SNAPCRAFT_PART_INSTALL/usr/share/pixmaps + cp -v ./parity.desktop $SNAPCRAFT_PART_INSTALL/usr/share/applications/ + cp -v ./icon.png $SNAPCRAFT_PART_INSTALL/usr/share/pixmaps/ + parity: + source: ./artifacts/$CARGO_TARGET + plugin: nil + override-build: | + mkdir -p $SNAPCRAFT_PART_INSTALL/usr/bin + cp -v parity $SNAPCRAFT_PART_INSTALL/usr/bin/parity + cp -v parity-evm $SNAPCRAFT_PART_INSTALL/usr/bin/parity-evm + cp -v ethkey $SNAPCRAFT_PART_INSTALL/usr/bin/ethkey + cp -v ethstore $SNAPCRAFT_PART_INSTALL/usr/bin/ethstore + cp -v whisper $SNAPCRAFT_PART_INSTALL/usr/bin/whisper + stage-packages: [libudev1, libstdc++6, cmake, libdb5.3] diff --git a/secret_store/Cargo.toml b/secret-store/Cargo.toml similarity index 74% rename from secret_store/Cargo.toml rename to secret-store/Cargo.toml index a5ba3072617..0303472fe4c 100644 --- a/secret_store/Cargo.toml +++ b/secret-store/Cargo.toml @@ -7,36 +7,41 @@ authors = ["Parity Technologies "] [dependencies] byteorder = "1.0" +common-types = { path = "../ethcore/types" } +ethabi = "6.0" +ethabi-contract = "6.0" +ethabi-derive = "6.0" +ethcore = { path = "../ethcore" } +ethcore-accounts = { path = "../accounts", optional = true} +ethcore-call-contract = { path = "../ethcore/call-contract" } +ethcore-sync = { path = "../ethcore/sync" } +ethereum-types = "0.4" +ethkey = { path = "../accounts/ethkey" } +futures = "0.1" +hyper = { version = "0.12", default-features = false } +keccak-hash = "0.1" +kvdb = "0.1" +lazy_static = "1.0" log = "0.4" +parity-bytes = "0.1" +parity-crypto = "0.3" +parity-runtime = { path = "../util/runtime" } parking_lot = "0.7" -hyper = { version = "0.12", default-features = false } +rustc-hex = "1.0" serde = "1.0" -serde_json = "1.0" serde_derive = "1.0" -futures = "0.1" -rustc-hex = "1.0" +serde_json = "1.0" tiny-keccak = "1.4" tokio = "~0.1.11" -parity-runtime = { path = "../util/runtime" } tokio-io = "0.1" tokio-service = "0.1" url = "1.0" -ethcore = { path = "../ethcore" } -parity-bytes = "0.1" -parity-crypto = "0.2" -ethcore-logger = { path = "../logger" } -ethcore-sync = { path = "../ethcore/sync" } -ethcore-transaction = { path = "../ethcore/transaction" } -ethereum-types = "0.4" -kvdb = "0.1" -keccak-hash = "0.1" -ethkey = { path = "../ethkey" } -lazy_static = "1.0" -ethabi = "6.0" -ethabi-derive = "6.0" -ethabi-contract = "6.0" [dev-dependencies] +env_logger = "0.5" ethcore = { path = "../ethcore", features = ["test-helpers"] } tempdir = "0.3" kvdb-rocksdb = "0.1.3" + +[features] +accounts = ["ethcore-accounts"] diff --git a/secret_store/res/acl_storage.json b/secret-store/res/acl_storage.json similarity index 100% rename from secret_store/res/acl_storage.json rename to secret-store/res/acl_storage.json diff --git a/secret_store/res/key_server_set.json b/secret-store/res/key_server_set.json similarity index 100% rename from secret_store/res/key_server_set.json rename to secret-store/res/key_server_set.json diff --git a/secret_store/res/service.json b/secret-store/res/service.json similarity index 100% rename from secret_store/res/service.json rename to secret-store/res/service.json diff --git a/secret_store/src/acl_storage.rs b/secret-store/src/acl_storage.rs similarity index 91% rename from secret_store/src/acl_storage.rs rename to secret-store/src/acl_storage.rs index 5704d42b3f8..8c6656b1084 100644 --- a/secret_store/src/acl_storage.rs +++ b/secret-store/src/acl_storage.rs @@ -1,23 +1,24 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::collections::{HashMap, HashSet}; use parking_lot::{Mutex, RwLock}; -use ethcore::client::{BlockId, ChainNotify, NewBlocks, CallContract}; +use call_contract::CallContract; +use ethcore::client::{BlockId, ChainNotify, NewBlocks}; use ethereum_types::Address; use ethabi::FunctionOutputDecoder; use trusted_client::TrustedClient; diff --git a/secret_store/src/helpers.rs b/secret-store/src/helpers.rs similarity index 76% rename from secret_store/src/helpers.rs rename to secret-store/src/helpers.rs index 3bc49116e0d..19b19d1ba10 100644 --- a/secret_store/src/helpers.rs +++ b/secret-store/src/helpers.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethcore::client::{Client, BlockChainClient, BlockId}; use ethereum_types::H256; diff --git a/secret_store/src/key_server.rs b/secret-store/src/key_server.rs similarity index 93% rename from secret_store/src/key_server.rs rename to secret-store/src/key_server.rs index 93baba111a4..3f03e7e259d 100644 --- a/secret_store/src/key_server.rs +++ b/secret-store/src/key_server.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::BTreeSet; use std::sync::Arc; @@ -23,11 +23,11 @@ use parity_runtime::Executor; use super::acl_storage::AclStorage; use super::key_storage::KeyStorage; use super::key_server_set::KeyServerSet; -use key_server_cluster::{math, ClusterCore}; +use key_server_cluster::{math, new_network_cluster}; use traits::{AdminSessionsServer, ServerKeyGenerator, DocumentKeyServer, MessageSigner, KeyServer, NodeKeyPair}; use types::{Error, Public, RequestSignature, Requester, ServerKeyId, EncryptedDocumentKey, EncryptedDocumentKeyShadow, ClusterConfiguration, MessageHash, EncryptedMessageSignature, NodeId}; -use key_server_cluster::{ClusterClient, ClusterConfiguration as NetClusterConfiguration}; +use key_server_cluster::{ClusterClient, ClusterConfiguration as NetClusterConfiguration, NetConnectionsManagerConfig}; /// Secret store key server implementation pub struct KeyServerImpl { @@ -175,20 +175,23 @@ impl KeyServerCore { pub fn new(config: &ClusterConfiguration, key_server_set: Arc, self_key_pair: Arc, acl_storage: Arc, key_storage: Arc, executor: Executor) -> Result { - let config = NetClusterConfiguration { + let cconfig = NetClusterConfiguration { self_key_pair: self_key_pair.clone(), - listen_address: (config.listener_address.address.clone(), config.listener_address.port), key_server_set: key_server_set, - allow_connecting_to_higher_nodes: config.allow_connecting_to_higher_nodes, acl_storage: acl_storage, key_storage: key_storage, - admin_public: config.admin_public.clone(), + admin_public: config.admin_public, + preserve_sessions: false, + }; + let net_config = NetConnectionsManagerConfig { + listen_address: (config.listener_address.address.clone(), config.listener_address.port), + allow_connecting_to_higher_nodes: config.allow_connecting_to_higher_nodes, auto_migrate_enabled: config.auto_migrate_enabled, }; - let cluster = ClusterCore::new(executor, config) - .and_then(|c| c.run().map(|_| c.client())) - .map_err(|err| Error::from(err))?; + let core = new_network_cluster(executor, cconfig, net_config)?; + let cluster = core.client(); + core.run()?; Ok(KeyServerCore { cluster, @@ -297,14 +300,14 @@ pub mod tests { let start = time::Instant::now(); let mut tried_reconnections = false; loop { - if key_servers.iter().all(|ks| ks.cluster().cluster_state().connected.len() == num_nodes - 1) { + if key_servers.iter().all(|ks| ks.cluster().is_fully_connected()) { break; } let old_tried_reconnections = tried_reconnections; let mut fully_connected = true; for key_server in &key_servers { - if key_server.cluster().cluster_state().connected.len() != num_nodes - 1 { + if !key_server.cluster().is_fully_connected() { fully_connected = false; if !old_tried_reconnections { tried_reconnections = true; @@ -325,7 +328,7 @@ pub mod tests { #[test] fn document_key_generation_and_retrievement_works_over_network_with_single_node() { - //::logger::init_log(); + let _ = ::env_logger::try_init(); let (key_servers, _, runtime) = make_key_servers(6070, 1); // generate document key @@ -347,7 +350,7 @@ pub mod tests { #[test] fn document_key_generation_and_retrievement_works_over_network_with_3_nodes() { - //::logger::init_log(); + let _ = ::env_logger::try_init(); let (key_servers, key_storages, runtime) = make_key_servers(6080, 3); let test_cases = [0, 1, 2]; @@ -375,7 +378,7 @@ pub mod tests { #[test] fn server_key_generation_and_storing_document_key_works_over_network_with_3_nodes() { - //::logger::init_log(); + let _ = ::env_logger::try_init(); let (key_servers, _, runtime) = make_key_servers(6090, 3); let test_cases = [0, 1, 2]; @@ -407,7 +410,7 @@ pub mod tests { #[test] fn server_key_generation_and_message_signing_works_over_network_with_3_nodes() { - //::logger::init_log(); + let _ = ::env_logger::try_init(); let (key_servers, _, runtime) = make_key_servers(6100, 3); let test_cases = [0, 1, 2]; @@ -433,8 +436,8 @@ pub mod tests { #[test] fn decryption_session_is_delegated_when_node_does_not_have_key_share() { - //::logger::init_log(); - let (key_servers, _, runtime) = make_key_servers(6110, 3); + let _ = ::env_logger::try_init(); + let (key_servers, key_storages, runtime) = make_key_servers(6110, 3); // generate document key let threshold = 0; @@ -445,7 +448,7 @@ pub mod tests { let generated_key = crypto::ecies::decrypt(&secret, &DEFAULT_MAC, &generated_key).unwrap(); // remove key from node0 - key_servers[0].cluster().key_storage().remove(&document).unwrap(); + key_storages[0].remove(&document).unwrap(); // now let's try to retrieve key back by requesting it from node0, so that session must be delegated let retrieved_key = key_servers[0].restore_document_key(&document, &signature.into()).unwrap(); @@ -456,8 +459,8 @@ pub mod tests { #[test] fn schnorr_signing_session_is_delegated_when_node_does_not_have_key_share() { - //::logger::init_log(); - let (key_servers, _, runtime) = make_key_servers(6114, 3); + let _ = ::env_logger::try_init(); + let (key_servers, key_storages, runtime) = make_key_servers(6114, 3); let threshold = 1; // generate server key @@ -467,7 +470,7 @@ pub mod tests { let server_public = key_servers[0].generate_key(&server_key_id, &signature.clone().into(), threshold).unwrap(); // remove key from node0 - key_servers[0].cluster().key_storage().remove(&server_key_id).unwrap(); + key_storages[0].remove(&server_key_id).unwrap(); // sign message let message_hash = H256::from(42); @@ -483,8 +486,8 @@ pub mod tests { #[test] fn ecdsa_signing_session_is_delegated_when_node_does_not_have_key_share() { - //::logger::init_log(); - let (key_servers, _, runtime) = make_key_servers(6117, 4); + let _ = ::env_logger::try_init(); + let (key_servers, key_storages, runtime) = make_key_servers(6117, 4); let threshold = 1; // generate server key @@ -494,7 +497,7 @@ pub mod tests { let server_public = key_servers[0].generate_key(&server_key_id, &signature.clone().into(), threshold).unwrap(); // remove key from node0 - key_servers[0].cluster().key_storage().remove(&server_key_id).unwrap(); + key_storages[0].remove(&server_key_id).unwrap(); // sign message let message_hash = H256::random(); diff --git a/secret_store/src/key_server_cluster/admin_sessions/key_version_negotiation_session.rs b/secret-store/src/key_server_cluster/admin_sessions/key_version_negotiation_session.rs similarity index 99% rename from secret_store/src/key_server_cluster/admin_sessions/key_version_negotiation_session.rs rename to secret-store/src/key_server_cluster/admin_sessions/key_version_negotiation_session.rs index 4839ac41e80..58801948664 100644 --- a/secret_store/src/key_server_cluster/admin_sessions/key_version_negotiation_session.rs +++ b/secret-store/src/key_server_cluster/admin_sessions/key_version_negotiation_session.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::collections::{BTreeSet, BTreeMap}; diff --git a/secret_store/src/key_server_cluster/admin_sessions/mod.rs b/secret-store/src/key_server_cluster/admin_sessions/mod.rs similarity index 83% rename from secret_store/src/key_server_cluster/admin_sessions/mod.rs rename to secret-store/src/key_server_cluster/admin_sessions/mod.rs index 1fedc1db404..2509a76c4ac 100644 --- a/secret_store/src/key_server_cluster/admin_sessions/mod.rs +++ b/secret-store/src/key_server_cluster/admin_sessions/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . pub mod key_version_negotiation_session; pub mod servers_set_change_session; diff --git a/secret_store/src/key_server_cluster/admin_sessions/servers_set_change_session.rs b/secret-store/src/key_server_cluster/admin_sessions/servers_set_change_session.rs similarity index 78% rename from secret_store/src/key_server_cluster/admin_sessions/servers_set_change_session.rs rename to secret-store/src/key_server_cluster/admin_sessions/servers_set_change_session.rs index af612c3d9aa..18c63587959 100644 --- a/secret_store/src/key_server_cluster/admin_sessions/servers_set_change_session.rs +++ b/secret-store/src/key_server_cluster/admin_sessions/servers_set_change_session.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::collections::{BTreeSet, BTreeMap}; @@ -1045,148 +1045,204 @@ fn check_nodes_set(all_nodes_set: &BTreeSet, new_nodes_set: &BTreeSet, - pub key_storage: Arc, - pub session: SessionImpl, + pub trait AdminSessionAdapter { + const SIGN_NEW_NODES: bool; + + fn create( + meta: ShareChangeSessionMeta, + admin_public: Public, + all_nodes_set: BTreeSet, + ml: &ClusterMessageLoop, + idx: usize + ) -> S; } - struct MessageLoop { + pub struct MessageLoop { + pub ml: ClusterMessageLoop, pub admin_key_pair: KeyPair, pub original_key_pair: KeyPair, + pub original_key_version: H256, pub all_nodes_set: BTreeSet, pub new_nodes_set: BTreeSet, pub all_set_signature: Signature, pub new_set_signature: Signature, - pub nodes: BTreeMap, + pub sessions: BTreeMap, pub queue: VecDeque<(NodeId, NodeId, Message)>, } - fn create_session(mut meta: ShareChangeSessionMeta, self_node_id: NodeId, admin_public: Public, all_nodes_set: BTreeSet, cluster: Arc, key_storage: Arc) -> SessionImpl { - meta.self_node_id = self_node_id; - SessionImpl::new(SessionParams { - meta: meta, - all_nodes_set: all_nodes_set, - cluster: cluster, - key_storage: key_storage, - nonce: 1, - admin_public: admin_public, - migration_id: None, - }).unwrap() + impl ::std::fmt::Debug for MessageLoop { + fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "{:?}", self.ml) + } } - fn create_node(meta: ShareChangeSessionMeta, admin_public: Public, all_nodes_set: BTreeSet, node: &GenerationNode) -> Node { - for n in &all_nodes_set { - node.cluster.add_node(n.clone()); + struct Adapter; + + impl AdminSessionAdapter for Adapter { + const SIGN_NEW_NODES: bool = true; + + fn create( + mut meta: ShareChangeSessionMeta, + admin_public: Public, + all_nodes_set: BTreeSet, + ml: &ClusterMessageLoop, + idx: usize + ) -> SessionImpl { + meta.self_node_id = *ml.node_key_pair(idx).public(); + SessionImpl::new(SessionParams { + meta: meta, + all_nodes_set: all_nodes_set, + cluster: ml.cluster(idx).view().unwrap(), + key_storage: ml.key_storage(idx).clone(), + nonce: 1, + admin_public: admin_public, + migration_id: None, + }).unwrap() } + } - Node { - cluster: node.cluster.clone(), - key_storage: node.key_storage.clone(), - session: create_session(meta, node.session.node().clone(), admin_public, all_nodes_set, node.cluster.clone(), node.key_storage.clone()), + impl MessageLoop { + pub fn with_gml>( + gml: GenerationMessageLoop, + master: NodeId, + add: Option>, + removed_nodes_ids: Option>, + isolated_nodes_ids: Option>, + ) -> Self { + // read generated key data + let original_key_pair = gml.compute_key_pair(); + let original_key_version = gml.key_version(); + Self::with_ml::( + gml.0, + original_key_pair, + original_key_version, + master, + add, + removed_nodes_ids, + isolated_nodes_ids) } - } - impl MessageLoop { - pub fn new(gml: &GenerationMessageLoop, master_node_id: NodeId, original_key_pair: Option, new_nodes_ids: BTreeSet, removed_nodes_ids: BTreeSet, isolated_nodes_ids: BTreeSet) -> Self { + pub fn and_then>( + self, + master: NodeId, + add: Option>, + removed_nodes_ids: Option>, + isolated_nodes_ids: Option>, + ) -> Self { + Self::with_ml::( + self.ml, + self.original_key_pair, + self.original_key_version, + master, + add, + removed_nodes_ids, + isolated_nodes_ids, + ) + } + + pub fn with_ml>( + mut ml: ClusterMessageLoop, + original_key_pair: KeyPair, + original_key_version: H256, + master: NodeId, + add: Option>, + removed_nodes_ids: Option>, + isolated_nodes_ids: Option>, + ) -> Self { + let add = add.unwrap_or_default(); + let removed_nodes_ids = removed_nodes_ids.unwrap_or_default(); + let isolated_nodes_ids = isolated_nodes_ids.unwrap_or_default(); + // generate admin key pair let admin_key_pair = Random.generate().unwrap(); let admin_public = admin_key_pair.public().clone(); - // compute original secret key - let original_key_pair = original_key_pair.unwrap_or_else(|| gml.compute_key_pair(1)); - // all active nodes set - let mut all_nodes_set: BTreeSet<_> = gml.nodes.keys() + let mut all_nodes_set: BTreeSet<_> = ml.nodes().into_iter() .filter(|n| !isolated_nodes_ids.contains(n)) - .cloned() .collect(); // new nodes set includes all old nodes, except nodes being removed + all nodes being added let new_nodes_set: BTreeSet = all_nodes_set.iter().cloned() - .chain(new_nodes_ids.iter().cloned()) + .chain(add.iter().map(|kp| *kp.public())) .filter(|n| !removed_nodes_ids.contains(n)) .collect(); - all_nodes_set.extend(new_nodes_ids.iter().cloned()); + let mut old_set_to_sign = all_nodes_set.clone(); + all_nodes_set.extend(add.iter().map(|kp| *kp.public())); + if C::SIGN_NEW_NODES { + old_set_to_sign.extend(add.iter().map(|kp| *kp.public())); + } for isolated_node_id in &isolated_nodes_ids { all_nodes_set.remove(isolated_node_id); } let meta = ShareChangeSessionMeta { - self_node_id: master_node_id.clone(), - master_node_id: master_node_id.clone(), + self_node_id: master, + master_node_id: master, id: SessionId::default(), configured_nodes_count: all_nodes_set.len(), connected_nodes_count: all_nodes_set.len(), }; - let old_nodes = gml.nodes.iter().map(|n| create_node(meta.clone(), admin_public.clone(), all_nodes_set.clone(), n.1)); - let new_nodes = new_nodes_ids.into_iter().map(|new_node_id| { - let new_node_cluster = Arc::new(DummyCluster::new(new_node_id.clone())); - for node in &all_nodes_set { - new_node_cluster.add_node(node.clone()); - } - - let new_node_key_storage = Arc::new(DummyKeyStorage::default()); - let new_node_session = create_session(meta.clone(), new_node_id, admin_public.clone(), all_nodes_set.clone(), new_node_cluster.clone(), new_node_key_storage.clone()); - Node { - cluster: new_node_cluster, - key_storage: new_node_key_storage, - session: new_node_session, - } - }); - let nodes: BTreeMap<_, _> = old_nodes.chain(new_nodes).map(|n| (n.session.core.meta.self_node_id.clone(), n)).collect(); - - for node in nodes.values() { - for isolated_node_id in &isolated_nodes_ids { - node.cluster.remove_node(isolated_node_id); - } + // include new nodes in the cluster + for node_key_pair in &add { + ml.include(Arc::new(PlainNodeKeyPair::new(node_key_pair.clone()))); } + // isolate nodes from the cluster + for isolated_node_id in &isolated_nodes_ids { + let idx = ml.nodes().iter().position(|n| n == isolated_node_id).unwrap(); + ml.exclude(idx); + } + + // prepare set of nodes + let sessions: BTreeMap<_, _> = (0..ml.nodes().len()) + .map(|idx| (ml.node(idx), C::create(meta.clone(), admin_public, all_nodes_set.clone(), &ml, idx))) + .collect(); - let all_set_signature = sign(admin_key_pair.secret(), &ordered_nodes_hash(&all_nodes_set)).unwrap(); + let all_set_signature = sign(admin_key_pair.secret(), &ordered_nodes_hash(&old_set_to_sign)).unwrap(); let new_set_signature = sign(admin_key_pair.secret(), &ordered_nodes_hash(&new_nodes_set)).unwrap(); MessageLoop { + ml, admin_key_pair: admin_key_pair, - original_key_pair: original_key_pair, + original_key_pair, + original_key_version, all_nodes_set: all_nodes_set.clone(), new_nodes_set: new_nodes_set, all_set_signature: all_set_signature, new_set_signature: new_set_signature, - nodes: nodes, + sessions, queue: Default::default(), } } pub fn run(&mut self) { + // run session until completion while let Some((from, to, message)) = self.take_message() { self.process_message((from, to, message)).unwrap(); } + + // check that all sessions have finished + assert!(self.sessions.values().all(|s| s.is_finished())); } pub fn take_message(&mut self) -> Option<(NodeId, NodeId, Message)> { - self.nodes.values() - .filter_map(|n| n.cluster.take_message().map(|m| (n.session.core.meta.self_node_id.clone(), m.0, m.1))) - .nth(0) - .or_else(|| self.queue.pop_front()) + self.ml.take_message().or_else(|| self.queue.pop_front()) } pub fn process_message(&mut self, msg: (NodeId, NodeId, Message)) -> Result<(), Error> { - match { match msg.2 { - Message::ServersSetChange(ref message) => self.nodes[&msg.1].session.process_message(&msg.0, message), - _ => unreachable!("only servers set change messages are expected"), - } } { + match self.sessions[&msg.1].on_message(&msg.0, &msg.2) { Ok(_) => Ok(()), Err(Error::TooEarlyForRequest) => { self.queue.push_back(msg); @@ -1195,213 +1251,201 @@ pub mod tests { Err(err) => Err(err), } } + + /// This only works for schemes where threshold = 1 + pub fn check_secret_is_preserved<'a, I: IntoIterator>(&self, nodes: I) { + let nodes: Vec<_> = nodes.into_iter().collect(); + let key_storages: Vec<_> = nodes.iter().map(|n| self.ml.key_storage_of(n)).collect(); + let n = nodes.len(); + let document_secret_plain = math::generate_random_point().unwrap(); + for n1 in 0..n { + for n2 in n1+1..n { + let share1 = key_storages[n1].get(&SessionId::default()).unwrap(); + let share2 = key_storages[n2].get(&SessionId::default()).unwrap(); + + let id_number1 = share1.as_ref().unwrap().last_version().unwrap().id_numbers[nodes[n1]].clone(); + let id_number2 = share1.as_ref().unwrap().last_version().unwrap().id_numbers[nodes[n2]].clone(); + // now encrypt and decrypt data + let (document_secret_decrypted, document_secret_decrypted_test) = + math::tests::do_encryption_and_decryption(1, + self.original_key_pair.public(), + &[id_number1, id_number2], + &[share1.unwrap().last_version().unwrap().secret_share.clone(), + share2.unwrap().last_version().unwrap().secret_share.clone()], + Some(self.original_key_pair.secret()), + document_secret_plain.clone()); + + assert_eq!(document_secret_plain, document_secret_decrypted_test); + assert_eq!(document_secret_plain, document_secret_decrypted); + } + } + } } - pub fn generate_key(threshold: usize, nodes_ids: BTreeSet) -> GenerationMessageLoop { - let mut gml = GenerationMessageLoop::with_nodes_ids(nodes_ids); - gml.master().initialize(Default::default(), Default::default(), false, threshold, gml.nodes.keys().cloned().collect::>().into()).unwrap(); - while let Some((from, to, message)) = gml.take_message() { - gml.process_message((from, to, message)).unwrap(); + impl MessageLoop { + pub fn run_at(mut self, master: NodeId) -> Self { + self.sessions[&master].initialize( + self.new_nodes_set.clone(), + self.all_set_signature.clone(), + self.new_set_signature.clone()).unwrap(); + self.run(); + self } + } + + pub fn generate_key(num_nodes: usize, threshold: usize) -> GenerationMessageLoop { + let gml = GenerationMessageLoop::new(num_nodes).init(threshold).unwrap(); + gml.0.loop_until(|| gml.0.is_empty()); gml } #[test] fn node_added_using_servers_set_change() { // initial 2-of-3 session - let gml = generate_key(1, generate_nodes_ids(3)); - let master_node_id = gml.nodes.keys().cloned().nth(0).unwrap(); + let gml = generate_key(3, 1); - // insert 1 node so that it becames 2-of-4 session - let nodes_to_add: BTreeSet<_> = (0..1).map(|_| Random.generate().unwrap().public().clone()).collect(); - let mut ml = MessageLoop::new(&gml, master_node_id, None, nodes_to_add, BTreeSet::new(), BTreeSet::new()); - ml.nodes[&master_node_id].session.initialize(ml.nodes.keys().cloned().collect(), ml.all_set_signature.clone(), ml.new_set_signature.clone()).unwrap(); - ml.run(); + // add 1 node so that it becames 2-of-4 session + let add = vec![Random.generate().unwrap()]; + let master = gml.0.node(0); + let ml = MessageLoop::with_gml::(gml, master, Some(add), None, None).run_at(master); // try to recover secret for every possible combination of nodes && check that secret is the same - check_secret_is_preserved(ml.original_key_pair.clone(), ml.nodes.iter().map(|(k, v)| (k.clone(), v.key_storage.clone())).collect()); - - // check that all sessions have finished - assert!(ml.nodes.values().all(|n| n.session.is_finished())); + ml.check_secret_is_preserved(ml.sessions.keys()); } #[test] fn node_added_using_server_set_change_from_this_node() { // initial 2-of-3 session - let gml = generate_key(1, generate_nodes_ids(3)); + let gml = generate_key(3, 1); // insert 1 node so that it becames 2-of-4 session // master node is the node we are adding => // 1) add session is delegated to one of old nodes // 2) key share is pushed to new node // 3) delegated session is returned back to added node - let nodes_to_add: BTreeSet<_> = (0..1).map(|_| Random.generate().unwrap().public().clone()).collect(); - let master_node_id = nodes_to_add.iter().cloned().nth(0).unwrap(); - let mut ml = MessageLoop::new(&gml, master_node_id, None, nodes_to_add, BTreeSet::new(), BTreeSet::new()); - ml.nodes[&master_node_id].session.initialize(ml.nodes.keys().cloned().collect(), ml.all_set_signature.clone(), ml.new_set_signature.clone()).unwrap(); - ml.run(); - - // check that all sessions have finished - assert!(ml.nodes.values().all(|n| n.session.is_finished())); + let add = vec![Random.generate().unwrap()]; + let master = add[0].public().clone(); + let ml = MessageLoop::with_gml::(gml, master, Some(add), None, None).run_at(master); + + // try to recover secret for every possible combination of nodes && check that secret is the same + ml.check_secret_is_preserved(ml.sessions.keys()); } #[test] fn node_moved_using_servers_set_change() { // initial 2-of-3 session - let gml = generate_key(1, generate_nodes_ids(3)); - let master_node_id = gml.nodes.keys().cloned().nth(0).unwrap(); + let gml = generate_key(3, 1); // remove 1 node && insert 1 node so that one share is moved - let nodes_to_remove: BTreeSet<_> = gml.nodes.keys().cloned().skip(1).take(1).collect(); - let nodes_to_add: BTreeSet<_> = (0..1).map(|_| Random.generate().unwrap().public().clone()).collect(); - let mut ml = MessageLoop::new(&gml, master_node_id, None, nodes_to_add.clone(), nodes_to_remove.clone(), BTreeSet::new()); - let new_nodes_set = ml.nodes.keys().cloned().filter(|n| !nodes_to_remove.contains(n)).collect(); - ml.nodes[&master_node_id].session.initialize(new_nodes_set, ml.all_set_signature.clone(), ml.new_set_signature.clone()).unwrap(); - ml.run(); + let master = gml.0.node(0); + let remove: BTreeSet<_> = ::std::iter::once(gml.0.node(1)).collect(); + let add = vec![Random.generate().unwrap()]; + let ml = MessageLoop::with_gml::(gml, master, Some(add), Some(remove.clone()), None).run_at(master); // check that secret is still the same as before moving the share - check_secret_is_preserved(ml.original_key_pair.clone(), ml.nodes.iter() - .filter(|&(k, _)| !nodes_to_remove.contains(k)) - .map(|(k, v)| (k.clone(), v.key_storage.clone())) - .collect()); + ml.check_secret_is_preserved(ml.sessions.keys() + .filter(|k| !remove.contains(k))); // check that all removed nodes do not own key share - assert!(ml.nodes.iter().filter(|&(k, _)| nodes_to_remove.contains(k)).all(|(_, v)| v.key_storage.get(&SessionId::default()).unwrap().is_none())); - - // check that all sessions have finished - assert!(ml.nodes.values().all(|n| n.session.is_finished())); + assert!(ml.sessions.keys().filter(|k| remove.contains(k)) + .all(|k| ml.ml.key_storage_of(k).get(&SessionId::default()).unwrap().is_none())); } #[test] fn node_removed_using_servers_set_change() { // initial 2-of-3 session - let gml = generate_key(1, generate_nodes_ids(3)); - let master_node_id = gml.nodes.keys().cloned().nth(0).unwrap(); + let gml = generate_key(3, 1); // remove 1 node so that session becames 2-of-2 - let nodes_to_remove: BTreeSet<_> = gml.nodes.keys().cloned().skip(1).take(1).collect(); - let new_nodes_set: BTreeSet<_> = gml.nodes.keys().cloned().filter(|n| !nodes_to_remove.contains(&n)).collect(); - let mut ml = MessageLoop::new(&gml, master_node_id, None, BTreeSet::new(), nodes_to_remove.clone(), BTreeSet::new()); - ml.nodes[&master_node_id].session.initialize(new_nodes_set, ml.all_set_signature.clone(), ml.new_set_signature.clone()).unwrap(); - ml.run(); + let remove: BTreeSet<_> = ::std::iter::once(gml.0.node(0)).collect(); + let master = gml.0.node(0); + let ml = MessageLoop::with_gml::(gml, master, None, Some(remove.clone()), None).run_at(master); // try to recover secret for every possible combination of nodes && check that secret is the same - check_secret_is_preserved(ml.original_key_pair.clone(), ml.nodes.iter() - .filter(|&(k, _)| !nodes_to_remove.contains(k)) - .map(|(k, v)| (k.clone(), v.key_storage.clone())) - .collect()); + ml.check_secret_is_preserved(ml.sessions.keys() + .filter(|k| !remove.contains(k))); // check that all removed nodes do not own key share - assert!(ml.nodes.iter().filter(|&(k, _)| nodes_to_remove.contains(k)).all(|(_, v)| v.key_storage.get(&SessionId::default()).unwrap().is_none())); - - // check that all sessions have finished - assert!(ml.nodes.values().all(|n| n.session.is_finished())); + assert!(ml.sessions.keys().filter(|k| remove.contains(k)) + .all(|k| ml.ml.key_storage_of(k).get(&SessionId::default()).unwrap().is_none())); } #[test] fn isolated_node_removed_using_servers_set_change() { // initial 2-of-3 session - let gml = generate_key(1, generate_nodes_ids(3)); - let master_node_id = gml.nodes.keys().cloned().nth(0).unwrap(); + let gml = generate_key(3, 1); // remove 1 node so that session becames 2-of-2 - let nodes_to_isolate: BTreeSet<_> = gml.nodes.keys().cloned().skip(1).take(1).collect(); - let new_nodes_set: BTreeSet<_> = gml.nodes.keys().cloned().filter(|n| !nodes_to_isolate.contains(&n)).collect(); - let mut ml = MessageLoop::new(&gml, master_node_id, None, BTreeSet::new(), BTreeSet::new(), nodes_to_isolate.clone()); - ml.nodes[&master_node_id].session.initialize(new_nodes_set, ml.all_set_signature.clone(), ml.new_set_signature.clone()).unwrap(); - ml.run(); + let isolate: BTreeSet<_> = ::std::iter::once(gml.0.node(1)).collect(); + let master = gml.0.node(0); + let ml = MessageLoop::with_gml::(gml, master, None, None, Some(isolate.clone())) + .run_at(master); // try to recover secret for every possible combination of nodes && check that secret is the same - check_secret_is_preserved(ml.original_key_pair.clone(), ml.nodes.iter() - .filter(|&(k, _)| !nodes_to_isolate.contains(k)) - .map(|(k, v)| (k.clone(), v.key_storage.clone())) - .collect()); + ml.check_secret_is_preserved(ml.sessions.keys() + .filter(|k| !isolate.contains(k))); // check that all isolated nodes still OWN key share - assert!(ml.nodes.iter().filter(|&(k, _)| nodes_to_isolate.contains(k)).all(|(_, v)| v.key_storage.get(&SessionId::default()).unwrap().is_some())); - - // check that all sessions have finished - assert!(ml.nodes.iter().filter(|&(k, _)| !nodes_to_isolate.contains(k)).all(|(_, v)| v.session.is_finished())); + assert!(ml.sessions.keys().filter(|k| isolate.contains(k)) + .all(|k| ml.ml.key_storage_of(k).get(&SessionId::default()).unwrap().is_some())); } #[test] fn having_less_than_required_nodes_after_change_does_not_fail_change_session() { // initial 2-of-3 session - let gml = generate_key(1, generate_nodes_ids(3)); - let master_node_id = gml.nodes.keys().cloned().nth(0).unwrap(); + let gml = generate_key(3, 1); - // remove 2 nodes so that key becomes irrecoverable (make sure the session is completed, even though key is irrecoverable) - let nodes_to_remove: BTreeSet<_> = gml.nodes.keys().cloned().skip(1).take(2).collect(); - let new_nodes_set: BTreeSet<_> = gml.nodes.keys().cloned().filter(|n| !nodes_to_remove.contains(&n)).collect(); - let mut ml = MessageLoop::new(&gml, master_node_id, None, BTreeSet::new(), nodes_to_remove.clone(), BTreeSet::new()); - ml.nodes[&master_node_id].session.initialize(new_nodes_set, ml.all_set_signature.clone(), ml.new_set_signature.clone()).unwrap(); - ml.run(); + // remove 2 nodes so that key becomes irrecoverable (make sure the session is completed + // even though key is irrecoverable) + let remove: BTreeSet<_> = gml.0.nodes().into_iter().skip(1).take(2).collect(); + let master = gml.0.node(0); + let ml = MessageLoop::with_gml::(gml, master, None, Some(remove.clone()), None).run_at(master); // check that all removed nodes do not own key share - assert!(ml.nodes.iter().filter(|&(k, _)| nodes_to_remove.contains(k)).all(|(_, v)| v.key_storage.get(&SessionId::default()).unwrap().is_none())); - - // check that all sessions have finished - assert!(ml.nodes.values().all(|n| n.session.is_finished())); + assert!(ml.sessions.keys().filter(|k| remove.contains(k)) + .all(|k| ml.ml.key_storage_of(k).get(&SessionId::default()).unwrap().is_none())); // and now let's add new node (make sure the session is completed, even though key is still irrecoverable) // isolated here are not actually isolated, but removed on the previous step - let nodes_to_add: BTreeSet<_> = (0..1).map(|_| Random.generate().unwrap().public().clone()).collect(); - let new_nodes_set: BTreeSet<_> = gml.nodes.keys().cloned().filter(|n| !nodes_to_remove.contains(&n)) - .chain(nodes_to_add.iter().cloned()) - .collect(); - let master_node_id = nodes_to_add.iter().cloned().nth(0).unwrap(); - let mut ml = MessageLoop::new(&gml, master_node_id, Some(ml.original_key_pair.clone()), nodes_to_add.clone(), BTreeSet::new(), nodes_to_remove.clone()); - ml.nodes[&master_node_id].session.initialize(new_nodes_set, ml.all_set_signature.clone(), ml.new_set_signature.clone()).unwrap(); - ml.run(); + let add = vec![Random.generate().unwrap()]; + let master = add[0].public().clone(); + let ml = ml.and_then::(master, Some(add.clone()), None, Some(remove)).run_at(master); // check that all added nodes do not own key share (there's not enough nodes to run share add session) - assert!(ml.nodes.iter().filter(|&(k, _)| nodes_to_add.contains(k)).all(|(_, v)| v.key_storage.get(&SessionId::default()).unwrap().is_none())); - - // check that all sessions have finished - assert!(ml.nodes.iter().filter(|&(k, _)| !nodes_to_remove.contains(k)).all(|(_, n)| n.session.is_finished())); + assert!(ml.sessions.keys().filter(|k| add.iter().any(|n| n.public() == *k)) + .all(|k| ml.ml.key_storage_of(k).get(&SessionId::default()).unwrap().is_none())); } #[test] fn removing_node_from_cluster_of_2_works() { // initial 2-of-2 session - let gml = generate_key(1, generate_nodes_ids(2)); - let master_node_id = gml.nodes.keys().cloned().nth(0).unwrap(); - - // make 2nd node isolated so that key becomes irrecoverable (make sure the session is completed, even though key is irrecoverable) - let nodes_to_isolate: BTreeSet<_> = gml.nodes.keys().cloned().skip(1).take(1).collect(); - let new_nodes_set: BTreeSet<_> = gml.nodes.keys().cloned().filter(|n| !nodes_to_isolate.contains(&n)).collect(); - let mut ml = MessageLoop::new(&gml, master_node_id, None, BTreeSet::new(), BTreeSet::new(), nodes_to_isolate.clone()); - ml.nodes[&master_node_id].session.initialize(new_nodes_set, ml.all_set_signature.clone(), ml.new_set_signature.clone()).unwrap(); - ml.run(); - - // check that session on master node has completed (session on 2nd node is not even started in network mode) - assert!(ml.nodes.values().take(1).all(|n| n.session.is_finished())); + let gml = generate_key(2, 1); + + // make 2nd node isolated so that key becomes irrecoverable (make sure the session is completed, + // even though key is irrecoverable) + let isolate: BTreeSet<_> = gml.0.nodes().into_iter().skip(1).take(1).collect(); + let master = gml.0.node(0); + MessageLoop::with_gml::(gml, master, None, None, Some(isolate)).run_at(master); } #[test] fn adding_node_that_has_lost_its_database_works() { // initial 2-of-2 session - let gml = generate_key(1, generate_nodes_ids(2)); - let master_node_id = gml.nodes.keys().cloned().nth(0).unwrap(); + let gml = generate_key(2, 1); // insert 1 node so that it becames 2-of-3 session - let nodes_to_add: BTreeSet<_> = (0..1).map(|_| Random.generate().unwrap().public().clone()).collect(); - let mut ml = MessageLoop::new(&gml, master_node_id, None, nodes_to_add.clone(), BTreeSet::new(), BTreeSet::new()); - ml.nodes[&master_node_id].session.initialize(ml.nodes.keys().cloned().collect(), ml.all_set_signature.clone(), ml.new_set_signature.clone()).unwrap(); - ml.run(); + let add = vec![Random.generate().unwrap()]; + let master = gml.0.node(0); + let ml = MessageLoop::with_gml::(gml, master, Some(add.clone()), None, None) + .run_at(master); // now let's say new node has lost its db and we're trying to join it again - ml.nodes[nodes_to_add.iter().nth(0).unwrap()].key_storage.clear().unwrap(); + ml.ml.key_storage_of(add[0].public()).clear().unwrap(); // this time old nodes have version, where new node is mentioned, but it doesn't report it when negotiating - let mut ml = MessageLoop::new(&gml, master_node_id, None, nodes_to_add, BTreeSet::new(), BTreeSet::new()); - ml.nodes[&master_node_id].session.initialize(ml.nodes.keys().cloned().collect(), ml.all_set_signature.clone(), ml.new_set_signature.clone()).unwrap(); - ml.run(); + let ml = ml.and_then::(master, Some(add), None, None).run_at(master); // try to recover secret for every possible combination of nodes && check that secret is the same - check_secret_is_preserved(ml.original_key_pair.clone(), ml.nodes.iter().map(|(k, v)| (k.clone(), v.key_storage.clone())).collect()); - - // check that all sessions have finished - assert!(ml.nodes.values().all(|n| n.session.is_finished())); + ml.check_secret_is_preserved(ml.sessions.keys()); } } diff --git a/secret_store/src/key_server_cluster/admin_sessions/sessions_queue.rs b/secret-store/src/key_server_cluster/admin_sessions/sessions_queue.rs similarity index 82% rename from secret_store/src/key_server_cluster/admin_sessions/sessions_queue.rs rename to secret-store/src/key_server_cluster/admin_sessions/sessions_queue.rs index 7657dfc8263..91d3bc7b893 100644 --- a/secret_store/src/key_server_cluster/admin_sessions/sessions_queue.rs +++ b/secret-store/src/key_server_cluster/admin_sessions/sessions_queue.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::collections::{VecDeque, BTreeSet}; diff --git a/secret_store/src/key_server_cluster/admin_sessions/share_add_session.rs b/secret-store/src/key_server_cluster/admin_sessions/share_add_session.rs similarity index 65% rename from secret_store/src/key_server_cluster/admin_sessions/share_add_session.rs rename to secret-store/src/key_server_cluster/admin_sessions/share_add_session.rs index 51a027dca38..e2af7bc7fa2 100644 --- a/secret_store/src/key_server_cluster/admin_sessions/share_add_session.rs +++ b/secret-store/src/key_server_cluster/admin_sessions/share_add_session.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::collections::{BTreeSet, BTreeMap}; @@ -318,6 +318,7 @@ impl SessionImpl where T: SessionTransport { new_set_signature), consensus_transport: consensus_transport, })?; + consensus_session.initialize(new_nodes_map.keys().cloned().collect())?; // update data @@ -881,405 +882,197 @@ impl SessionTransport for IsolatedSessionTransport { #[cfg(test)] pub mod tests { - use std::sync::Arc; - use std::collections::{VecDeque, BTreeMap, BTreeSet, HashSet}; - use ethkey::{Random, Generator, Public, KeyPair, Signature, sign}; - use ethereum_types::H256; - use key_server_cluster::{NodeId, SessionId, Error, KeyStorage, DummyKeyStorage}; - use key_server_cluster::cluster::Cluster; - use key_server_cluster::cluster::tests::DummyCluster; - use key_server_cluster::cluster_sessions::ClusterSession; - use key_server_cluster::generation_session::tests::{Node as GenerationNode, generate_nodes_ids}; - use key_server_cluster::math; - use key_server_cluster::message::Message; - use key_server_cluster::servers_set_change_session::tests::generate_key; - use key_server_cluster::jobs::servers_set_change_access_job::ordered_nodes_hash; + use std::collections::BTreeSet; + use ethkey::{Random, Generator, Public}; + use key_server_cluster::{NodeId, Error, KeyStorage, NodeKeyPair}; + use key_server_cluster::cluster::tests::MessageLoop as ClusterMessageLoop; + use key_server_cluster::servers_set_change_session::tests::{MessageLoop, AdminSessionAdapter, generate_key}; use key_server_cluster::admin_sessions::ShareChangeSessionMeta; use super::{SessionImpl, SessionParams, IsolatedSessionTransport}; - struct Node { - pub cluster: Arc, - pub key_storage: Arc, - pub session: SessionImpl, - } - - struct MessageLoop { - pub admin_key_pair: KeyPair, - pub original_key_pair: KeyPair, - pub old_nodes_set: BTreeSet, - pub new_nodes_set: BTreeSet, - pub old_set_signature: Signature, - pub new_set_signature: Signature, - pub nodes: BTreeMap, - pub queue: VecDeque<(NodeId, NodeId, Message)>, - pub version: H256, - } - - fn create_session(mut meta: ShareChangeSessionMeta, admin_public: Public, self_node_id: NodeId, cluster: Arc, key_storage: Arc) -> SessionImpl { - let session_id = meta.id.clone(); - meta.self_node_id = self_node_id; - let key_version = key_storage.get(&session_id).unwrap().map(|ks| ks.versions.iter().last().unwrap().hash.clone()); - - SessionImpl::new(SessionParams { - meta: meta.clone(), - transport: IsolatedSessionTransport::new(session_id, key_version, 1, cluster), - key_storage: key_storage, - admin_public: Some(admin_public), - nonce: 1, - }).unwrap() - } - - fn create_node(meta: ShareChangeSessionMeta, admin_public: Public, node: GenerationNode, added_nodes: &BTreeSet) -> Node { - node.cluster.add_nodes(added_nodes.iter().cloned()); - Node { - cluster: node.cluster.clone(), - key_storage: node.key_storage.clone(), - session: create_session(meta, admin_public, node.session.node().clone(), node.cluster, node.key_storage), - } - } - - /// This only works for schemes where threshold = 1 - pub fn check_secret_is_preserved(joint_key_pair: KeyPair, nodes: BTreeMap>) { - let n = nodes.len(); - let document_secret_plain = math::generate_random_point().unwrap(); - for n1 in 0..n { - for n2 in n1+1..n { - let share1 = nodes.values().nth(n1).unwrap().get(&SessionId::default()).unwrap(); - let share2 = nodes.values().nth(n2).unwrap().get(&SessionId::default()).unwrap(); - let id_number1 = share1.as_ref().unwrap().last_version().unwrap().id_numbers[nodes.keys().nth(n1).unwrap()].clone(); - let id_number2 = share1.as_ref().unwrap().last_version().unwrap().id_numbers[nodes.keys().nth(n2).unwrap()].clone(); - - // now encrypt and decrypt data - let (document_secret_decrypted, document_secret_decrypted_test) = - math::tests::do_encryption_and_decryption(1, - joint_key_pair.public(), - &[id_number1, id_number2], - &[share1.unwrap().last_version().unwrap().secret_share.clone(), - share2.unwrap().last_version().unwrap().secret_share.clone()], - Some(joint_key_pair.secret()), - document_secret_plain.clone()); - - assert_eq!(document_secret_plain, document_secret_decrypted_test); - assert_eq!(document_secret_plain, document_secret_decrypted); - } + struct Adapter; + + impl AdminSessionAdapter> for Adapter { + const SIGN_NEW_NODES: bool = false; + + fn create( + mut meta: ShareChangeSessionMeta, + admin_public: Public, + _: BTreeSet, + ml: &ClusterMessageLoop, + idx: usize + ) -> SessionImpl { + let key_storage = ml.key_storage(idx).clone(); + let key_version = key_storage.get(&meta.id).unwrap().map(|ks| ks.last_version().unwrap().hash); + + meta.self_node_id = *ml.node_key_pair(idx).public(); + SessionImpl::new(SessionParams { + meta: meta.clone(), + transport: IsolatedSessionTransport::new(meta.id, key_version, 1, ml.cluster(idx).view().unwrap()), + key_storage, + admin_public: Some(admin_public), + nonce: 1, + }).unwrap() } } - impl MessageLoop { - pub fn new(t: usize, master_node_id: NodeId, old_nodes_set: BTreeSet, new_nodes_set: BTreeSet) -> Self { - // generate admin key pair - let admin_key_pair = Random.generate().unwrap(); - let admin_public = admin_key_pair.public().clone(); - - // run initial generation session - let gml = generate_key(t, old_nodes_set.clone()); - - // compute original secret key - let version = gml.nodes.values().nth(0).unwrap().key_storage.get(&Default::default()).unwrap().unwrap().versions[0].hash.clone(); - let original_key_pair = gml.compute_key_pair(t); - - // prepare sessions on all nodes - let meta = ShareChangeSessionMeta { - id: SessionId::default(), - self_node_id: NodeId::default(), - master_node_id: master_node_id, - configured_nodes_count: new_nodes_set.iter().chain(old_nodes_set.iter()).collect::>().len(), - connected_nodes_count: new_nodes_set.iter().chain(old_nodes_set.iter()).collect::>().len(), - }; - let new_nodes = new_nodes_set.iter() - .filter(|n| !old_nodes_set.contains(&n)) - .map(|new_node_id| { - let new_node_cluster = Arc::new(DummyCluster::new(new_node_id.clone())); - let new_node_key_storage = Arc::new(DummyKeyStorage::default()); - let new_node_session = create_session(meta.clone(), admin_public.clone(), new_node_id.clone(), new_node_cluster.clone(), new_node_key_storage.clone()); - new_node_cluster.add_nodes(new_nodes_set.iter().cloned()); - Node { - cluster: new_node_cluster, - key_storage: new_node_key_storage, - session: new_node_session, - } - }); - let old_nodes = gml.nodes.into_iter().map(|gn| create_node(meta.clone(), admin_public.clone(), gn.1, &new_nodes_set)); - let nodes = old_nodes.chain(new_nodes).map(|n| (n.session.core.meta.self_node_id.clone(), n)).collect(); - - let old_set_signature = sign(admin_key_pair.secret(), &ordered_nodes_hash(&old_nodes_set)).unwrap(); - let new_set_signature = sign(admin_key_pair.secret(), &ordered_nodes_hash(&new_nodes_set)).unwrap(); - MessageLoop { - admin_key_pair: admin_key_pair, - original_key_pair: original_key_pair, - version: version, - old_nodes_set: old_nodes_set.clone(), - new_nodes_set: new_nodes_set.clone(), - old_set_signature: old_set_signature, - new_set_signature: new_set_signature, - nodes: nodes, - queue: Default::default(), - } - } - - pub fn new_additional(master_node_id: NodeId, ml: MessageLoop, new_nodes_set: BTreeSet) -> Self { - let version = ml.nodes.values().nth(0).unwrap().key_storage.get(&Default::default()).unwrap().unwrap().versions.last().unwrap().hash.clone(); - - // prepare sessions on all nodes - let meta = ShareChangeSessionMeta { - id: SessionId::default(), - self_node_id: NodeId::default(), - master_node_id: master_node_id, - configured_nodes_count: new_nodes_set.iter().chain(ml.nodes.keys()).collect::>().len(), - connected_nodes_count: new_nodes_set.iter().chain(ml.nodes.keys()).collect::>().len(), - }; - let old_nodes_set = ml.nodes.keys().cloned().collect(); - let nodes = ml.nodes.iter() - .map(|(n, nd)| { - let node_cluster = nd.cluster.clone(); - let node_key_storage = nd.key_storage.clone(); - let node_session = create_session(meta.clone(), ml.admin_key_pair.public().clone(), n.clone(), node_cluster.clone(), node_key_storage.clone()); - node_cluster.add_nodes(new_nodes_set.iter().cloned()); - (n.clone(), Node { - cluster: node_cluster, - key_storage: node_key_storage, - session: node_session, - }) - }).chain(new_nodes_set.difference(&old_nodes_set).map(|n| { - let new_node_cluster = Arc::new(DummyCluster::new(n.clone())); - let new_node_key_storage = Arc::new(DummyKeyStorage::default()); - let new_node_session = create_session(meta.clone(), ml.admin_key_pair.public().clone(), n.clone(), new_node_cluster.clone(), new_node_key_storage.clone()); - new_node_cluster.add_nodes(new_nodes_set.iter().cloned()); - (n.clone(), Node { - cluster: new_node_cluster, - key_storage: new_node_key_storage, - session: new_node_session, - }) - })).collect(); - - let old_set_signature = sign(ml.admin_key_pair.secret(), &ordered_nodes_hash(&old_nodes_set)).unwrap(); - let new_set_signature = sign(ml.admin_key_pair.secret(), &ordered_nodes_hash(&new_nodes_set)).unwrap(); - MessageLoop { - admin_key_pair: ml.admin_key_pair, - original_key_pair: ml.original_key_pair, - version: version, - old_nodes_set: old_nodes_set.clone(), - new_nodes_set: new_nodes_set.clone(), - old_set_signature: old_set_signature, - new_set_signature: new_set_signature, - nodes: nodes, - queue: Default::default(), - } + impl MessageLoop> { + pub fn init_at(self, master: NodeId) -> Result { + self.sessions[&master].initialize( + Some(self.original_key_version), + Some(self.new_nodes_set.clone()), + Some(self.all_set_signature.clone()), + Some(self.new_set_signature.clone()))?; + Ok(self) } - pub fn update_signature(&mut self) { - self.old_set_signature = sign(self.admin_key_pair.secret(), &ordered_nodes_hash(&self.old_nodes_set)).unwrap(); - self.new_set_signature = sign(self.admin_key_pair.secret(), &ordered_nodes_hash(&self.new_nodes_set)).unwrap(); - } - - pub fn run(&mut self) { - while let Some((from, to, message)) = self.take_message() { - self.process_message((from, to, message)).unwrap(); - } - } - - pub fn take_message(&mut self) -> Option<(NodeId, NodeId, Message)> { - self.nodes.values() - .filter_map(|n| n.cluster.take_message().map(|m| (n.session.core.meta.self_node_id.clone(), m.0, m.1))) - .nth(0) - .or_else(|| self.queue.pop_front()) - } - - pub fn process_message(&mut self, msg: (NodeId, NodeId, Message)) -> Result<(), Error> { - match { match msg.2 { - Message::ShareAdd(ref message) => - self.nodes[&msg.1].session.process_message(&msg.0, message), - _ => unreachable!("only servers set change messages are expected"), - } } { - Ok(_) => Ok(()), - Err(Error::TooEarlyForRequest) => { - self.queue.push_back(msg); - Ok(()) - }, - Err(err) => Err(err), - } + pub fn run_at(self, master: NodeId) -> Result { + let mut ml = self.init_at(master)?; + ml.run(); + Ok(ml) } } #[test] fn node_add_fails_if_nodes_removed() { - let old_nodes_set = generate_nodes_ids(3); - let master_node_id = old_nodes_set.iter().cloned().nth(0).unwrap(); - let node_to_remove_id = old_nodes_set.iter().cloned().nth(1).unwrap(); - let mut new_nodes_set: BTreeSet<_> = old_nodes_set.clone().into_iter().chain(generate_nodes_ids(1)).collect(); - new_nodes_set.remove(&node_to_remove_id); - let ml = MessageLoop::new(1, master_node_id.clone(), old_nodes_set, new_nodes_set.clone()); - assert_eq!(ml.nodes[&master_node_id].session.initialize(Some(ml.version), Some(new_nodes_set), - Some(ml.old_set_signature.clone()), - Some(ml.new_set_signature.clone()) - ).unwrap_err(), Error::ConsensusUnreachable); + // initial 2-of-3 session + let gml = generate_key(3, 1); + + // try to remove 1 node + let add = vec![Random.generate().unwrap()]; + let remove: BTreeSet<_> = ::std::iter::once(gml.0.node(1)).collect(); + let master = gml.0.node(0); + assert_eq!(MessageLoop::with_gml::(gml, master, Some(add), Some(remove), None) + .run_at(master).unwrap_err(), Error::ConsensusUnreachable); } #[test] fn node_add_fails_if_no_nodes_added() { - let old_nodes_set = generate_nodes_ids(3); - let master_node_id = old_nodes_set.iter().cloned().nth(0).unwrap(); - let new_nodes_set = old_nodes_set.clone(); - let ml = MessageLoop::new(1, master_node_id.clone(), old_nodes_set, new_nodes_set.clone()); - assert_eq!(ml.nodes[&master_node_id].session.initialize(Some(ml.version), Some(new_nodes_set), - Some(ml.old_set_signature.clone()), - Some(ml.new_set_signature.clone()) - ).unwrap_err(), Error::ConsensusUnreachable); + // initial 2-of-3 session + let gml = generate_key(3, 1); + + // try to add 0 nodes + let add = vec![]; + let master = gml.0.node(0); + assert_eq!(MessageLoop::with_gml::(gml, master, Some(add), None, None) + .run_at(master).unwrap_err(), Error::ConsensusUnreachable); } #[test] fn node_add_fails_if_started_on_adding_node() { - let old_nodes_set = generate_nodes_ids(3); - let nodes_to_add_set = generate_nodes_ids(1); - let master_node_id = nodes_to_add_set.iter().cloned().nth(0).unwrap(); - let new_nodes_set: BTreeSet<_> = old_nodes_set.clone().into_iter().chain(nodes_to_add_set.into_iter()).collect(); - let ml = MessageLoop::new(1, master_node_id.clone(), old_nodes_set, new_nodes_set.clone()); - assert_eq!(ml.nodes[&master_node_id].session.initialize(Some(ml.version), Some(new_nodes_set), - Some(ml.old_set_signature.clone()), - Some(ml.new_set_signature.clone()) - ).unwrap_err(), Error::ServerKeyIsNotFound); + // initial 2-of-3 session + let gml = generate_key(3, 1); + + // try to add 1 node using this node as a master node + let add = vec![Random.generate().unwrap()]; + let master = *add[0].public(); + assert_eq!(MessageLoop::with_gml::(gml, master, Some(add), None, None) + .run_at(master).unwrap_err(), Error::ServerKeyIsNotFound); } #[test] fn node_add_fails_if_initialized_twice() { - let old_nodes_set = generate_nodes_ids(3); - let master_node_id = old_nodes_set.iter().cloned().nth(0).unwrap(); - let new_nodes_set: BTreeSet<_> = old_nodes_set.clone().into_iter().chain(generate_nodes_ids(1)).collect(); - let ml = MessageLoop::new(1, master_node_id.clone(), old_nodes_set, new_nodes_set.clone()); - assert_eq!(ml.nodes[&master_node_id].session.initialize(Some(ml.version), Some(new_nodes_set.clone()), - Some(ml.old_set_signature.clone()), - Some(ml.new_set_signature.clone()) - ), Ok(())); - assert_eq!(ml.nodes[&master_node_id].session.initialize(Some(ml.version), Some(new_nodes_set), - Some(ml.old_set_signature.clone()), - Some(ml.new_set_signature.clone()) - ), Err(Error::InvalidStateForRequest)); + // initial 2-of-3 session + let gml = generate_key(3, 1); + + // try to add 1 node using this node as a master node + let add = vec![Random.generate().unwrap()]; + let master = gml.0.node(0); + assert_eq!(MessageLoop::with_gml::(gml, master, Some(add), None, None) + .init_at(master).unwrap() + .init_at(master).unwrap_err(), Error::InvalidStateForRequest); } #[test] fn node_add_fails_if_started_without_signatures() { - let old_nodes_set = generate_nodes_ids(3); - let master_node_id = old_nodes_set.iter().cloned().nth(0).unwrap(); - let new_nodes_set: BTreeSet<_> = old_nodes_set.clone().into_iter().chain(generate_nodes_ids(1)).collect(); - let ml = MessageLoop::new(1, master_node_id.clone(), old_nodes_set, new_nodes_set.clone()); - assert_eq!(ml.nodes[&master_node_id].session.initialize(None, None, None, None), Err(Error::InvalidMessage)); + // initial 2-of-3 session + let gml = generate_key(3, 1); + + // try to add 1 node using this node as a master node + let add = vec![Random.generate().unwrap()]; + let master = gml.0.node(0); + assert_eq!(MessageLoop::with_gml::(gml, master, Some(add), None, None) + .sessions[&master] + .initialize(None, None, None, None).unwrap_err(), Error::InvalidMessage); } #[test] fn nodes_added_using_share_add() { let test_cases = vec![(3, 1), (3, 3)]; - for (n, nodes_to_add) in test_cases { - // generate key && prepare ShareAdd sessions - let old_nodes_set = generate_nodes_ids(n); - let new_nodes_set: BTreeSet<_> = old_nodes_set.clone().into_iter().chain(generate_nodes_ids(nodes_to_add)).collect(); - let master_node_id = old_nodes_set.iter().cloned().nth(0).unwrap(); - let mut ml = MessageLoop::new(1, master_node_id.clone(), old_nodes_set, new_nodes_set.clone()); - - // initialize session on master node && run to completion - ml.nodes[&master_node_id].session.initialize(Some(ml.version), Some(new_nodes_set), - Some(ml.old_set_signature.clone()), - Some(ml.new_set_signature.clone())).unwrap(); - ml.run(); + for (n, add) in test_cases { + // generate key + let gml = generate_key(n, 1); - // check that session has completed on all nodes - assert!(ml.nodes.values().all(|n| n.session.is_finished())); + // run share add session + let add = (0..add).map(|_| Random.generate().unwrap()).collect(); + let master = gml.0.node(0); + let ml = MessageLoop::with_gml::(gml, master, Some(add), None, None) + .run_at(master).unwrap(); // check that secret is still the same as before adding the share - check_secret_is_preserved(ml.original_key_pair.clone(), ml.nodes.iter().map(|(k, v)| (k.clone(), v.key_storage.clone())).collect()); + ml.check_secret_is_preserved(ml.sessions.keys()); } } #[test] fn nodes_added_using_share_add_with_isolated_nodes() { - let (n, nodes_to_add) = (3, 3); - - // generate key && prepare ShareAdd sessions - let old_nodes_set = generate_nodes_ids(n); - let new_nodes_set: BTreeSet<_> = old_nodes_set.clone().into_iter().chain(generate_nodes_ids(nodes_to_add)).collect(); - let master_node_id = old_nodes_set.iter().cloned().nth(0).unwrap(); - let isolated_node_id = old_nodes_set.iter().cloned().nth(1).unwrap(); - let mut ml = MessageLoop::new(1, master_node_id.clone(), old_nodes_set, new_nodes_set.clone()); - - // now let's isolate 1 of 3 nodes owning key share - ml.nodes.remove(&isolated_node_id); - ml.old_nodes_set.remove(&isolated_node_id); - ml.new_nodes_set.remove(&isolated_node_id); - for (_, node) in ml.nodes.iter_mut() { - node.cluster.remove_node(&isolated_node_id); - } - ml.update_signature(); + let (n, add) = (3, 3); - // initialize session on master node && run to completion - ml.nodes[&master_node_id].session.initialize(Some(ml.version), Some(new_nodes_set), - Some(ml.old_set_signature.clone()), - Some(ml.new_set_signature.clone())).unwrap(); - ml.run(); + // generate key + let gml = generate_key(n, 1); - // check that session has completed on all nodes - assert!(ml.nodes.values().all(|n| n.session.is_finished())); + // run share add session + let master = gml.0.node(0); + let node_to_isolate = gml.0.node(1); + let add = (0..add).map(|_| Random.generate().unwrap()).collect(); + let isolate = ::std::iter::once(node_to_isolate).collect(); + let ml = MessageLoop::with_gml::(gml, master, Some(add), None, Some(isolate)) + .run_at(master).unwrap(); // check that secret is still the same as before adding the share - check_secret_is_preserved(ml.original_key_pair.clone(), ml.nodes - .iter() - .map(|(k, v)| (k.clone(), v.key_storage.clone())) - .collect()); + ml.check_secret_is_preserved(ml.sessions.keys()); } #[test] fn nodes_add_to_the_node_with_obsolete_version() { - let (n, nodes_to_add) = (3, 3); - - // generate key (2-of-3) && prepare ShareAdd sessions - let old_nodes_set = generate_nodes_ids(n); - let newest_nodes_set = generate_nodes_ids(nodes_to_add); - let new_nodes_set: BTreeSet<_> = old_nodes_set.clone().into_iter().chain(newest_nodes_set.clone()).collect(); - let master_node_id = old_nodes_set.iter().cloned().nth(0).unwrap(); - let isolated_node_id = old_nodes_set.iter().cloned().nth(1).unwrap(); - let oldest_nodes_set: BTreeSet<_> = old_nodes_set.iter().filter(|n| **n != isolated_node_id).cloned().collect(); - let mut ml = MessageLoop::new(1, master_node_id.clone(), old_nodes_set.clone(), new_nodes_set.clone()); - let isolated_key_storage = ml.nodes[&isolated_node_id].key_storage.clone(); - - // now let's isolate 1 of 3 nodes owning key share - ml.nodes.remove(&isolated_node_id); - ml.old_nodes_set.remove(&isolated_node_id); - ml.new_nodes_set.remove(&isolated_node_id); - for (_, node) in ml.nodes.iter_mut() { - node.cluster.remove_node(&isolated_node_id); - } - ml.update_signature(); - - // initialize session on master node && run to completion (2-of-5) - ml.nodes[&master_node_id].session.initialize(Some(ml.version), Some(new_nodes_set), - Some(ml.old_set_signature.clone()), - Some(ml.new_set_signature.clone())).unwrap(); - ml.run(); + let (n, add) = (3, 3); + + // generate key + let gml = generate_key(n, 1); + + // run share add session + let master = gml.0.node(0); + let node_to_isolate_key_pair = gml.0.node_key_pair(1).clone(); + let node_to_isolate = gml.0.node(1); + let isolated_key_storage = gml.0.key_storage(1).clone(); + let mut oldest_nodes_set = gml.0.nodes(); + oldest_nodes_set.remove(&node_to_isolate); + let add = (0..add).map(|_| Random.generate().unwrap()).collect::>(); + let newest_nodes_set = add.iter().map(|kp| *kp.public()).collect::>(); + let isolate = ::std::iter::once(node_to_isolate).collect(); + let ml = MessageLoop::with_gml::(gml, master, Some(add), None, Some(isolate)) + .run_at(master).unwrap(); + let new_key_version = ml.ml.key_storage(0).get(&Default::default()) + .unwrap().unwrap().last_version().unwrap().hash; // now let's add back old node so that key becames 2-of-6 - let new_nodes_set: BTreeSet<_> = ml.nodes.keys().cloned().chain(::std::iter::once(isolated_node_id.clone())).collect(); - let mut ml = MessageLoop::new_additional(master_node_id.clone(), ml, new_nodes_set.clone()); - ml.nodes.get_mut(&isolated_node_id).unwrap().key_storage = isolated_key_storage.clone(); - ml.nodes.get_mut(&isolated_node_id).unwrap().session.core.key_share = isolated_key_storage.get(&Default::default()).unwrap(); - ml.nodes.get_mut(&isolated_node_id).unwrap().session.core.key_storage = isolated_key_storage; - - // initialize session on master node && run to completion (2-of65) - ml.nodes[&master_node_id].session.initialize(Some(ml.version), Some(new_nodes_set), - Some(ml.old_set_signature.clone()), - Some(ml.new_set_signature.clone())).unwrap(); - ml.run(); - - // check that session has completed on all nodes - assert!(ml.nodes.values().all(|n| n.session.is_finished())); + let add = vec![node_to_isolate_key_pair.key_pair().clone()]; + let mut ml = ml.and_then::(master.clone(), Some(add), None, None); + ml.original_key_version = new_key_version; + ml.ml.replace_key_storage_of(&node_to_isolate, isolated_key_storage.clone()); + ml.sessions.get_mut(&node_to_isolate).unwrap().core.key_share = + isolated_key_storage.get(&Default::default()).unwrap(); + ml.sessions.get_mut(&node_to_isolate).unwrap().core.key_storage = isolated_key_storage; + let ml = ml.run_at(master).unwrap(); // check that secret is still the same as before adding the share - check_secret_is_preserved(ml.original_key_pair.clone(), ml.nodes - .iter() - .map(|(k, v)| (k.clone(), v.key_storage.clone())) - .collect()); + ml.check_secret_is_preserved(ml.sessions.keys()); // check that all oldest nodes have versions A, B, C // isolated node has version A, C // new nodes have versions B, C - let oldest_key_share = ml.nodes[oldest_nodes_set.iter().nth(0).unwrap()].key_storage.get(&Default::default()).unwrap().unwrap(); + let oldest_key_share = ml.ml.key_storage_of(oldest_nodes_set.iter().nth(0).unwrap()) + .get(&Default::default()).unwrap().unwrap(); debug_assert_eq!(oldest_key_share.versions.len(), 3); let version_a = oldest_key_share.versions[0].hash.clone(); let version_b = oldest_key_share.versions[1].hash.clone(); @@ -1287,41 +1080,28 @@ pub mod tests { debug_assert!(version_a != version_b && version_b != version_c); debug_assert!(oldest_nodes_set.iter().all(|n| vec![version_a.clone(), version_b.clone(), version_c.clone()] == - ml.nodes[n].key_storage.get(&Default::default()).unwrap().unwrap().versions.iter().map(|v| v.hash.clone()).collect::>())); - debug_assert!(::std::iter::once(&isolated_node_id).all(|n| vec![version_a.clone(), version_c.clone()] == - ml.nodes[n].key_storage.get(&Default::default()).unwrap().unwrap().versions.iter().map(|v| v.hash.clone()).collect::>())); + ml.ml.key_storage_of(n).get(&Default::default()).unwrap().unwrap() + .versions.iter().map(|v| v.hash).collect::>())); + debug_assert!(::std::iter::once(&node_to_isolate).all(|n| vec![version_a.clone(), version_c.clone()] == + ml.ml.key_storage_of(n).get(&Default::default()).unwrap().unwrap() + .versions.iter().map(|v| v.hash).collect::>())); debug_assert!(newest_nodes_set.iter().all(|n| vec![version_b.clone(), version_c.clone()] == - ml.nodes[n].key_storage.get(&Default::default()).unwrap().unwrap().versions.iter().map(|v| v.hash.clone()).collect::>())); + ml.ml.key_storage_of(n).get(&Default::default()).unwrap().unwrap() + .versions.iter().map(|v| v.hash).collect::>())); } #[test] fn nodes_add_fails_when_not_enough_share_owners_are_connected() { - let (n, nodes_to_add) = (3, 3); - - // generate key (2-of-3) && prepare ShareAdd sessions - let old_nodes_set = generate_nodes_ids(n); - let new_nodes_set: BTreeSet<_> = old_nodes_set.clone().into_iter().chain(generate_nodes_ids(nodes_to_add)).collect(); - let master_node_id = old_nodes_set.iter().cloned().nth(0).unwrap(); - let isolated_node_id1 = old_nodes_set.iter().cloned().nth(1).unwrap(); - let isolated_node_id2 = old_nodes_set.iter().cloned().nth(2).unwrap(); - let mut ml = MessageLoop::new(1, master_node_id.clone(), old_nodes_set.clone(), new_nodes_set.clone()); - - // now let's isolate 2 of 3 nodes owning key share - ml.nodes.remove(&isolated_node_id1); - ml.nodes.remove(&isolated_node_id2); - ml.old_nodes_set.remove(&isolated_node_id1); - ml.new_nodes_set.remove(&isolated_node_id1); - ml.old_nodes_set.remove(&isolated_node_id2); - ml.new_nodes_set.remove(&isolated_node_id2); - for (_, node) in ml.nodes.iter_mut() { - node.cluster.remove_node(&isolated_node_id1); - node.cluster.remove_node(&isolated_node_id2); - } - ml.update_signature(); + let (n, add) = (3, 3); + + // generate key + let gml = generate_key(n, 1); - // initialize session on master node && run to completion (2-of-5) - assert_eq!(ml.nodes[&master_node_id].session.initialize(Some(ml.version), Some(new_nodes_set), - Some(ml.old_set_signature.clone()), - Some(ml.new_set_signature.clone())).map(|_| ()), Err(Error::ConsensusUnreachable)); + // run share add session + let master = gml.0.node(0); + let add = (0..add).map(|_| Random.generate().unwrap()).collect::>(); + let isolate = vec![gml.0.node(1), gml.0.node(2)].into_iter().collect(); + assert_eq!(MessageLoop::with_gml::(gml, master, Some(add), None, Some(isolate)) + .run_at(master).unwrap_err(), Error::ConsensusUnreachable); } } diff --git a/secret_store/src/key_server_cluster/admin_sessions/share_change_session.rs b/secret-store/src/key_server_cluster/admin_sessions/share_change_session.rs similarity index 97% rename from secret_store/src/key_server_cluster/admin_sessions/share_change_session.rs rename to secret-store/src/key_server_cluster/admin_sessions/share_change_session.rs index 48cb81c137a..bd2bed2d61d 100644 --- a/secret_store/src/key_server_cluster/admin_sessions/share_change_session.rs +++ b/secret-store/src/key_server_cluster/admin_sessions/share_change_session.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::collections::{BTreeSet, BTreeMap}; diff --git a/secret_store/src/key_server_cluster/client_sessions/decryption_session.rs b/secret-store/src/key_server_cluster/client_sessions/decryption_session.rs similarity index 99% rename from secret_store/src/key_server_cluster/client_sessions/decryption_session.rs rename to secret-store/src/key_server_cluster/client_sessions/decryption_session.rs index 9172a03b1a8..ccb34e9828a 100644 --- a/secret_store/src/key_server_cluster/client_sessions/decryption_session.rs +++ b/secret-store/src/key_server_cluster/client_sessions/decryption_session.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::{BTreeSet, BTreeMap}; use std::sync::Arc; diff --git a/secret_store/src/key_server_cluster/client_sessions/encryption_session.rs b/secret-store/src/key_server_cluster/client_sessions/encryption_session.rs similarity index 97% rename from secret_store/src/key_server_cluster/client_sessions/encryption_session.rs rename to secret-store/src/key_server_cluster/client_sessions/encryption_session.rs index 70532b69052..a3eabc35c61 100644 --- a/secret_store/src/key_server_cluster/client_sessions/encryption_session.rs +++ b/secret-store/src/key_server_cluster/client_sessions/encryption_session.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::BTreeMap; use std::fmt::{Debug, Formatter, Error as FmtError}; diff --git a/secret_store/src/key_server_cluster/client_sessions/generation_session.rs b/secret-store/src/key_server_cluster/client_sessions/generation_session.rs similarity index 70% rename from secret_store/src/key_server_cluster/client_sessions/generation_session.rs rename to secret-store/src/key_server_cluster/client_sessions/generation_session.rs index 8984f61fff7..0fa805f5718 100644 --- a/secret_store/src/key_server_cluster/client_sessions/generation_session.rs +++ b/secret-store/src/key_server_cluster/client_sessions/generation_session.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::{BTreeSet, BTreeMap, VecDeque}; use std::fmt::{Debug, Formatter, Error as FmtError}; @@ -940,406 +940,315 @@ fn check_threshold(threshold: usize, nodes: &BTreeSet) -> Result<(), Err #[cfg(test)] pub mod tests { use std::sync::Arc; - use std::collections::{BTreeSet, BTreeMap, VecDeque}; - use std::time::Duration; - use ethereum_types::Address; - use ethkey::{Random, Generator, KeyPair}; - use key_server_cluster::{NodeId, SessionId, Error, KeyStorage, DummyKeyStorage}; - use key_server_cluster::message::{self, Message, GenerationMessage}; - use key_server_cluster::cluster::tests::{DummyCluster, make_clusters, run_clusters, loop_until, - all_connections_established, new_runtime}; + use ethereum_types::H256; + use ethkey::{Random, Generator, KeyPair, Secret}; + use key_server_cluster::{NodeId, Error, KeyStorage}; + use key_server_cluster::message::{self, Message, GenerationMessage, KeysDissemination, + PublicKeyShare, ConfirmInitialization}; + use key_server_cluster::cluster::tests::{MessageLoop as ClusterMessageLoop, make_clusters_and_preserve_sessions}; use key_server_cluster::cluster_sessions::ClusterSession; - use key_server_cluster::generation_session::{SessionImpl, SessionState, SessionParams}; + use key_server_cluster::generation_session::{SessionImpl, SessionState}; use key_server_cluster::math; use key_server_cluster::math::tests::do_encryption_and_decryption; - pub struct Node { - pub cluster: Arc, - pub key_storage: Arc, - pub session: SessionImpl, - } - - pub struct MessageLoop { - pub session_id: SessionId, - pub nodes: BTreeMap, - pub queue: VecDeque<(NodeId, NodeId, Message)>, - } - - pub fn generate_nodes_ids(n: usize) -> BTreeSet { - (0..n).map(|_| math::generate_random_point().unwrap()).collect() - } + #[derive(Debug)] + pub struct MessageLoop(pub ClusterMessageLoop); impl MessageLoop { - pub fn new(nodes_num: usize) -> Self { - Self::with_nodes_ids(generate_nodes_ids(nodes_num)) + pub fn new(num_nodes: usize) -> Self { + MessageLoop(make_clusters_and_preserve_sessions(num_nodes)) } - pub fn with_nodes_ids(nodes_ids: BTreeSet) -> Self { - let mut nodes = BTreeMap::new(); - let session_id = SessionId::default(); - for node_id in nodes_ids { - let cluster = Arc::new(DummyCluster::new(node_id.clone())); - let key_storage = Arc::new(DummyKeyStorage::default()); - let session = SessionImpl::new(SessionParams { - id: session_id.clone(), - self_node_id: node_id.clone(), - key_storage: Some(key_storage.clone()), - cluster: cluster.clone(), - nonce: Some(0), - }); - nodes.insert(node_id, Node { cluster: cluster, key_storage: key_storage, session: session }); - } - - let nodes_ids: Vec<_> = nodes.keys().cloned().collect(); - for node in nodes.values() { - for node_id in &nodes_ids { - node.cluster.add_node(node_id.clone()); - } - } - - MessageLoop { - session_id: session_id, - nodes: nodes, - queue: VecDeque::new(), - } + pub fn init(self, threshold: usize) -> Result { + self.0.cluster(0).client().new_generation_session(Default::default(), None, Default::default(), threshold) + .map(|_| self) } - pub fn master(&self) -> &SessionImpl { - &self.nodes.values().nth(0).unwrap().session + pub fn session_at(&self, idx: usize) -> Arc { + self.0.sessions(idx).generation_sessions.first().unwrap() } - pub fn first_slave(&self) -> &SessionImpl { - &self.nodes.values().nth(1).unwrap().session + pub fn session_of(&self, node: &NodeId) -> Arc { + self.0.sessions_of(node).generation_sessions.first().unwrap() } - pub fn second_slave(&self) -> &SessionImpl { - &self.nodes.values().nth(2).unwrap().session + pub fn take_message_confirm_initialization(&self) -> (NodeId, NodeId, ConfirmInitialization) { + match self.0.take_message() { + Some((from, to, Message::Generation(GenerationMessage::ConfirmInitialization(msg)))) => + (from, to, msg), + _ => panic!("unexpected"), + } } - pub fn take_message(&mut self) -> Option<(NodeId, NodeId, Message)> { - self.nodes.values() - .filter_map(|n| n.cluster.take_message().map(|m| (n.session.node().clone(), m.0, m.1))) - .nth(0) - .or_else(|| self.queue.pop_front()) + pub fn take_message_keys_dissemination(&self) -> (NodeId, NodeId, KeysDissemination) { + match self.0.take_message() { + Some((from, to, Message::Generation(GenerationMessage::KeysDissemination(msg)))) => + (from, to, msg), + _ => panic!("unexpected"), + } } - pub fn process_message(&mut self, msg: (NodeId, NodeId, Message)) -> Result<(), Error> { - match { - match msg.2 { - Message::Generation(GenerationMessage::InitializeSession(ref message)) => self.nodes[&msg.1].session.on_initialize_session(msg.0.clone(), &message), - Message::Generation(GenerationMessage::ConfirmInitialization(ref message)) => self.nodes[&msg.1].session.on_confirm_initialization(msg.0.clone(), &message), - Message::Generation(GenerationMessage::CompleteInitialization(ref message)) => self.nodes[&msg.1].session.on_complete_initialization(msg.0.clone(), &message), - Message::Generation(GenerationMessage::KeysDissemination(ref message)) => self.nodes[&msg.1].session.on_keys_dissemination(msg.0.clone(), &message), - Message::Generation(GenerationMessage::PublicKeyShare(ref message)) => self.nodes[&msg.1].session.on_public_key_share(msg.0.clone(), &message), - Message::Generation(GenerationMessage::SessionCompleted(ref message)) => self.nodes[&msg.1].session.on_session_completed(msg.0.clone(), &message), - _ => panic!("unexpected"), - } - } { - Ok(_) => Ok(()), - Err(Error::TooEarlyForRequest) => { - self.queue.push_back(msg); - Ok(()) - }, - Err(err) => Err(err), + pub fn take_message_public_key_share(&self) -> (NodeId, NodeId, PublicKeyShare) { + match self.0.take_message() { + Some((from, to, Message::Generation(GenerationMessage::PublicKeyShare(msg)))) => + (from, to, msg), + _ => panic!("unexpected"), } } - pub fn take_and_process_message(&mut self) -> Result<(), Error> { - let msg = self.take_message().unwrap(); - self.process_message(msg) + pub fn nodes_id_numbers(&self) -> Vec { + let session = self.session_at(0); + let session_data = session.data.lock(); + session_data.nodes.values().map(|n| n.id_number.clone()).collect() } - pub fn compute_key_pair(&self, t: usize) -> KeyPair { - let secret_shares = self.nodes.values() - .map(|nd| nd.key_storage.get(&SessionId::default()).unwrap().unwrap().last_version().unwrap().secret_share.clone()) - .take(t + 1) - .collect::>(); - let secret_shares = secret_shares.iter().collect::>(); - let id_numbers = self.nodes.iter() - .map(|(n, nd)| nd.key_storage.get(&SessionId::default()).unwrap().unwrap().last_version().unwrap().id_numbers[n].clone()) - .take(t + 1) - .collect::>(); - let id_numbers = id_numbers.iter().collect::>(); - let joint_secret1 = math::compute_joint_secret_from_shares(t, &secret_shares, &id_numbers).unwrap(); - - let secret_values: Vec<_> = self.nodes.values().map(|s| s.session.joint_public_and_secret().unwrap().unwrap().1).collect(); - let joint_secret2 = math::compute_joint_secret(secret_values.iter()).unwrap(); - assert_eq!(joint_secret1, joint_secret2); - - KeyPair::from_secret(joint_secret1).unwrap() + pub fn nodes_secret_shares(&self) -> Vec { + (0..self.0.nodes().len()).map(|i| { + let session = self.session_at(i); + let session_data = session.data.lock(); + session_data.secret_share.as_ref().unwrap().clone() + }).collect() } - } - fn make_simple_cluster(threshold: usize, num_nodes: usize) -> Result<(SessionId, NodeId, NodeId, MessageLoop), Error> { - let l = MessageLoop::new(num_nodes); - l.master().initialize(Default::default(), Default::default(), false, threshold, l.nodes.keys().cloned().collect::>().into())?; + pub fn compute_key_pair(&self) -> KeyPair { + let t = self.0.key_storage(0).get(&Default::default()).unwrap().unwrap().threshold; + let secret_shares = self.nodes_secret_shares(); + let id_numbers = self.nodes_id_numbers(); + let secret_shares = secret_shares.iter().take(t + 1).collect::>(); + let id_numbers = id_numbers.iter().take(t + 1).collect::>(); + let joint_secret = math::compute_joint_secret_from_shares(t, &secret_shares, &id_numbers).unwrap(); + + KeyPair::from_secret(joint_secret).unwrap() + } - let session_id = l.session_id.clone(); - let master_id = l.master().node().clone(); - let slave_id = l.first_slave().node().clone(); - Ok((session_id, master_id, slave_id, l)) + pub fn key_version(&self) -> H256 { + self.0.key_storage(0).get(&Default::default()) + .unwrap().unwrap().versions.iter().last().unwrap().hash + } } #[test] fn initializes_in_cluster_of_single_node() { - let l = MessageLoop::new(1); - assert!(l.master().initialize(Default::default(), Default::default(), false, 0, l.nodes.keys().cloned().collect::>().into()).is_ok()); + MessageLoop::new(1).init(0).unwrap(); } #[test] fn fails_to_initialize_if_threshold_is_wrong() { - match make_simple_cluster(2, 2) { - Err(Error::NotEnoughNodesForThreshold) => (), - _ => panic!("unexpected"), - } + assert_eq!(MessageLoop::new(2).init(2).unwrap_err(), Error::NotEnoughNodesForThreshold); } #[test] fn fails_to_initialize_when_already_initialized() { - let (_, _, _, l) = make_simple_cluster(0, 2).unwrap(); - assert_eq!(l.master().initialize(Default::default(), Default::default(), false, 0, l.nodes.keys().cloned().collect::>().into()).unwrap_err(), - Error::InvalidStateForRequest); + let ml = MessageLoop::new(2).init(0).unwrap(); + assert_eq!( + ml.session_at(0).initialize(Default::default(), Default::default(), false, 0, ml.0.nodes().into()), + Err(Error::InvalidStateForRequest), + ); } #[test] fn fails_to_accept_initialization_when_already_initialized() { - let (_, _, _, mut l) = make_simple_cluster(0, 2).unwrap(); - let message = l.take_message().unwrap(); - l.process_message(message.clone()).unwrap(); - assert_eq!(l.process_message(message.clone()).unwrap_err(), Error::InvalidStateForRequest); + let ml = MessageLoop::new(2).init(0).unwrap(); + let (from, to, msg) = ml.0.take_message().unwrap(); + ml.0.process_message(from, to, msg.clone()); + assert_eq!( + ml.session_of(&to).on_message(&from, &msg), + Err(Error::InvalidStateForRequest), + ); } #[test] fn slave_updates_derived_point_on_initialization() { - let (_, _, _, mut l) = make_simple_cluster(0, 2).unwrap(); - let passed_point = match l.take_message().unwrap() { - (f, t, Message::Generation(GenerationMessage::InitializeSession(message))) => { - let point = message.derived_point.clone(); - l.process_message((f, t, Message::Generation(GenerationMessage::InitializeSession(message)))).unwrap(); - point + let ml = MessageLoop::new(2).init(0).unwrap(); + let original_point = match ml.0.take_message().unwrap() { + (from, to, Message::Generation(GenerationMessage::InitializeSession(msg))) => { + let original_point = msg.derived_point.clone(); + let msg = Message::Generation(GenerationMessage::InitializeSession(msg)); + ml.0.process_message(from, to, msg); + original_point }, _ => panic!("unexpected"), }; - match l.take_message().unwrap() { - (_, _, Message::Generation(GenerationMessage::ConfirmInitialization(message))) => assert!(passed_point != message.derived_point), + match ml.0.take_message().unwrap() { + (_, _, Message::Generation(GenerationMessage::ConfirmInitialization(msg))) => + assert!(original_point != msg.derived_point), _ => panic!("unexpected"), } } #[test] fn fails_to_accept_initialization_confirmation_if_already_accepted_from_the_same_node() { - let (sid, _, s, mut l) = make_simple_cluster(0, 3).unwrap(); - l.take_and_process_message().unwrap(); - l.take_and_process_message().unwrap(); - l.take_and_process_message().unwrap(); - assert_eq!(l.master().on_confirm_initialization(s, &message::ConfirmInitialization { - session: sid.into(), - session_nonce: 0, - derived_point: math::generate_random_point().unwrap().into(), - }).unwrap_err(), Error::InvalidStateForRequest); + let ml = MessageLoop::new(3).init(0).unwrap(); + ml.0.take_and_process_message(); + + let (from, to, msg) = ml.take_message_confirm_initialization(); + ml.0.process_message(from, to, Message::Generation(GenerationMessage::ConfirmInitialization(msg.clone()))); + assert_eq!(ml.session_of(&to).on_confirm_initialization(from, &msg), Err(Error::InvalidStateForRequest)); } #[test] fn fails_to_accept_initialization_confirmation_if_initialization_already_completed() { - let (sid, _, s, mut l) = make_simple_cluster(0, 2).unwrap(); - l.take_and_process_message().unwrap(); - l.take_and_process_message().unwrap(); - assert_eq!(l.master().on_confirm_initialization(s, &message::ConfirmInitialization { - session: sid.into(), + let ml = MessageLoop::new(2).init(0).unwrap(); + ml.0.take_and_process_message(); + ml.0.take_and_process_message(); + assert_eq!(ml.session_at(0).on_confirm_initialization(ml.0.node(1), &message::ConfirmInitialization { + session: Default::default(), session_nonce: 0, derived_point: math::generate_random_point().unwrap().into(), - }).unwrap_err(), Error::InvalidStateForRequest); + }), Err(Error::InvalidStateForRequest)); } #[test] fn master_updates_derived_point_on_initialization_completion() { - let (_, _, _, mut l) = make_simple_cluster(0, 2).unwrap(); - l.take_and_process_message().unwrap(); - let passed_point = match l.take_message().unwrap() { - (f, t, Message::Generation(GenerationMessage::ConfirmInitialization(message))) => { - let point = message.derived_point.clone(); - l.process_message((f, t, Message::Generation(GenerationMessage::ConfirmInitialization(message)))).unwrap(); - point + let ml = MessageLoop::new(2).init(0).unwrap(); + ml.0.take_and_process_message(); + let original_point = match ml.0.take_message().unwrap() { + (from, to, Message::Generation(GenerationMessage::ConfirmInitialization(msg))) => { + let original_point = msg.derived_point.clone(); + let msg = Message::Generation(GenerationMessage::ConfirmInitialization(msg)); + ml.session_of(&to).on_message(&from, &msg).unwrap(); + original_point }, _ => panic!("unexpected"), }; - assert!(l.master().derived_point().unwrap() != passed_point.into()); - } - - #[test] - fn fails_to_complete_initialization_if_threshold_is_wrong() { - let (sid, m, s, l) = make_simple_cluster(0, 2).unwrap(); - let mut nodes = BTreeMap::new(); - nodes.insert(m, math::generate_random_scalar().unwrap()); - nodes.insert(s, math::generate_random_scalar().unwrap()); - assert_eq!(l.first_slave().on_initialize_session(m, &message::InitializeSession { - session: sid.into(), - session_nonce: 0, - origin: None, - author: Address::default().into(), - nodes: nodes.into_iter().map(|(k, v)| (k.into(), v.into())).collect(), - is_zero: false, - threshold: 2, - derived_point: math::generate_random_point().unwrap().into(), - }).unwrap_err(), Error::NotEnoughNodesForThreshold); + assert!(ml.session_at(0).derived_point().unwrap() != original_point.into()); } #[test] fn fails_to_complete_initialization_if_not_waiting_for_it() { - let (sid, m, _, l) = make_simple_cluster(0, 2).unwrap(); - assert_eq!(l.first_slave().on_complete_initialization(m, &message::CompleteInitialization { - session: sid.into(), + let ml = MessageLoop::new(2).init(0).unwrap(); + ml.0.take_and_process_message(); + assert_eq!(ml.session_at(0).on_complete_initialization(ml.0.node(1), &message::CompleteInitialization { + session: Default::default(), session_nonce: 0, derived_point: math::generate_random_point().unwrap().into(), - }).unwrap_err(), Error::InvalidStateForRequest); + }), Err(Error::InvalidStateForRequest)); } #[test] fn fails_to_complete_initialization_from_non_master_node() { - let (sid, _, _, mut l) = make_simple_cluster(0, 3).unwrap(); - l.take_and_process_message().unwrap(); - l.take_and_process_message().unwrap(); - l.take_and_process_message().unwrap(); - l.take_and_process_message().unwrap(); - assert_eq!(l.first_slave().on_complete_initialization(l.second_slave().node().clone(), &message::CompleteInitialization { - session: sid.into(), + let ml = MessageLoop::new(3).init(0).unwrap(); + ml.0.take_and_process_message(); + ml.0.take_and_process_message(); + ml.0.take_and_process_message(); + ml.0.take_and_process_message(); + assert_eq!(ml.session_at(1).on_complete_initialization(ml.0.node(2), &message::CompleteInitialization { + session: Default::default(), session_nonce: 0, derived_point: math::generate_random_point().unwrap().into(), - }).unwrap_err(), Error::InvalidMessage); + }), Err(Error::InvalidMessage)); } #[test] fn fails_to_accept_keys_dissemination_if_not_waiting_for_it() { - let (sid, _, s, l) = make_simple_cluster(0, 2).unwrap(); - assert_eq!(l.master().on_keys_dissemination(s, &message::KeysDissemination { - session: sid.into(), + let ml = MessageLoop::new(2).init(0).unwrap(); + assert_eq!(ml.session_at(0).on_keys_dissemination(ml.0.node(1), &message::KeysDissemination { + session: Default::default(), session_nonce: 0, secret1: math::generate_random_scalar().unwrap().into(), secret2: math::generate_random_scalar().unwrap().into(), publics: vec![math::generate_random_point().unwrap().into()], - }).unwrap_err(), Error::TooEarlyForRequest); + }), Err(Error::TooEarlyForRequest)); } #[test] fn fails_to_accept_keys_dissemination_if_wrong_number_of_publics_passed() { - let (sid, m, _, mut l) = make_simple_cluster(0, 3).unwrap(); - l.take_and_process_message().unwrap(); // m -> s1: InitializeSession - l.take_and_process_message().unwrap(); // m -> s2: InitializeSession - l.take_and_process_message().unwrap(); // s1 -> m: ConfirmInitialization - l.take_and_process_message().unwrap(); // s2 -> m: ConfirmInitialization - l.take_and_process_message().unwrap(); // m -> s1: CompleteInitialization - l.take_and_process_message().unwrap(); // m -> s2: CompleteInitialization - l.take_and_process_message().unwrap(); // m -> s1: KeysDissemination - assert_eq!(l.first_slave().on_keys_dissemination(m, &message::KeysDissemination { - session: sid.into(), - session_nonce: 0, - secret1: math::generate_random_scalar().unwrap().into(), - secret2: math::generate_random_scalar().unwrap().into(), - publics: vec![math::generate_random_point().unwrap().into(), math::generate_random_point().unwrap().into()], - }).unwrap_err(), Error::InvalidMessage); + let ml = MessageLoop::new(3).init(0).unwrap(); + ml.0.take_and_process_message(); // m -> s1: InitializeSession + ml.0.take_and_process_message(); // m -> s2: InitializeSession + ml.0.take_and_process_message(); // s1 -> m: ConfirmInitialization + ml.0.take_and_process_message(); // s2 -> m: ConfirmInitialization + ml.0.take_and_process_message(); // m -> s1: CompleteInitialization + ml.0.take_and_process_message(); // m -> s2: CompleteInitialization + + let (from, to, mut msg) = ml.take_message_keys_dissemination(); + msg.publics.clear(); + assert_eq!(ml.session_of(&to).on_keys_dissemination(from, &msg), Err(Error::InvalidMessage)); } #[test] fn fails_to_accept_keys_dissemination_second_time_from_the_same_node() { - let (sid, m, _, mut l) = make_simple_cluster(0, 3).unwrap(); - l.take_and_process_message().unwrap(); // m -> s1: InitializeSession - l.take_and_process_message().unwrap(); // m -> s2: InitializeSession - l.take_and_process_message().unwrap(); // s1 -> m: ConfirmInitialization - l.take_and_process_message().unwrap(); // s2 -> m: ConfirmInitialization - l.take_and_process_message().unwrap(); // m -> s1: CompleteInitialization - l.take_and_process_message().unwrap(); // m -> s2: CompleteInitialization - l.take_and_process_message().unwrap(); // m -> s1: KeysDissemination - assert_eq!(l.first_slave().on_keys_dissemination(m, &message::KeysDissemination { - session: sid.into(), - session_nonce: 0, - secret1: math::generate_random_scalar().unwrap().into(), - secret2: math::generate_random_scalar().unwrap().into(), - publics: vec![math::generate_random_point().unwrap().into()], - }).unwrap_err(), Error::InvalidStateForRequest); + let ml = MessageLoop::new(3).init(0).unwrap(); + ml.0.take_and_process_message(); // m -> s1: InitializeSession + ml.0.take_and_process_message(); // m -> s2: InitializeSession + ml.0.take_and_process_message(); // s1 -> m: ConfirmInitialization + ml.0.take_and_process_message(); // s2 -> m: ConfirmInitialization + ml.0.take_and_process_message(); // m -> s1: CompleteInitialization + ml.0.take_and_process_message(); // m -> s2: CompleteInitialization + + let (from, to, msg) = ml.take_message_keys_dissemination(); + ml.0.process_message(from, to, Message::Generation(GenerationMessage::KeysDissemination(msg.clone()))); + assert_eq!(ml.session_of(&to).on_keys_dissemination(from, &msg), Err(Error::InvalidStateForRequest)); } #[test] fn should_not_accept_public_key_share_when_is_not_waiting_for_it() { - let (sid, _, s, l) = make_simple_cluster(1, 3).unwrap(); - assert_eq!(l.master().on_public_key_share(s, &message::PublicKeyShare { - session: sid.into(), + let ml = MessageLoop::new(3).init(1).unwrap(); + assert_eq!(ml.session_at(0).on_public_key_share(ml.0.node(1), &message::PublicKeyShare { + session: Default::default(), session_nonce: 0, public_share: math::generate_random_point().unwrap().into(), - }).unwrap_err(), Error::InvalidStateForRequest); + }), Err(Error::InvalidStateForRequest)); } #[test] fn should_not_accept_public_key_share_when_receiving_twice() { - let (sid, m, _, mut l) = make_simple_cluster(0, 3).unwrap(); - l.take_and_process_message().unwrap(); // m -> s1: InitializeSession - l.take_and_process_message().unwrap(); // m -> s2: InitializeSession - l.take_and_process_message().unwrap(); // s1 -> m: ConfirmInitialization - l.take_and_process_message().unwrap(); // s2 -> m: ConfirmInitialization - l.take_and_process_message().unwrap(); // m -> s1: CompleteInitialization - l.take_and_process_message().unwrap(); // m -> s2: CompleteInitialization - l.take_and_process_message().unwrap(); // m -> s1: KeysDissemination - l.take_and_process_message().unwrap(); // m -> s2: KeysDissemination - l.take_and_process_message().unwrap(); // s1 -> m: KeysDissemination - l.take_and_process_message().unwrap(); // s1 -> s2: KeysDissemination - l.take_and_process_message().unwrap(); // s2 -> m: KeysDissemination - l.take_and_process_message().unwrap(); // s2 -> s1: KeysDissemination - let (f, t, msg) = match l.take_message() { - Some((f, t, Message::Generation(GenerationMessage::PublicKeyShare(msg)))) => (f, t, msg), - _ => panic!("unexpected"), - }; - assert_eq!(&f, l.master().node()); - assert_eq!(&t, l.second_slave().node()); - l.process_message((f, t, Message::Generation(GenerationMessage::PublicKeyShare(msg.clone())))).unwrap(); - assert_eq!(l.second_slave().on_public_key_share(m, &message::PublicKeyShare { - session: sid.into(), - session_nonce: 0, - public_share: math::generate_random_point().unwrap().into(), - }).unwrap_err(), Error::InvalidMessage); + let ml = MessageLoop::new(3).init(0).unwrap(); + ml.0.take_and_process_message(); // m -> s1: InitializeSession + ml.0.take_and_process_message(); // m -> s2: InitializeSession + ml.0.take_and_process_message(); // s1 -> m: ConfirmInitialization + ml.0.take_and_process_message(); // s2 -> m: ConfirmInitialization + ml.0.take_and_process_message(); // m -> s1: CompleteInitialization + ml.0.take_and_process_message(); // m -> s2: CompleteInitialization + ml.0.take_and_process_message(); // m -> s1: KeysDissemination + ml.0.take_and_process_message(); // m -> s2: KeysDissemination + ml.0.take_and_process_message(); // s1 -> m: KeysDissemination + ml.0.take_and_process_message(); // s1 -> s2: KeysDissemination + ml.0.take_and_process_message(); // s2 -> m: KeysDissemination + ml.0.take_and_process_message(); // s2 -> s1: KeysDissemination + + let (from, to, msg) = ml.take_message_public_key_share(); + ml.0.process_message(from, to, Message::Generation(GenerationMessage::PublicKeyShare(msg.clone()))); + assert_eq!(ml.session_of(&to).on_public_key_share(from, &msg), Err(Error::InvalidMessage)); } #[test] fn encryption_fails_on_session_timeout() { - let (_, _, _, l) = make_simple_cluster(0, 2).unwrap(); - assert!(l.master().joint_public_and_secret().is_none()); - l.master().on_session_timeout(); - assert!(l.master().joint_public_and_secret().unwrap().unwrap_err() == Error::NodeDisconnected); + let ml = MessageLoop::new(2).init(0).unwrap(); + assert!(ml.session_at(0).joint_public_and_secret().is_none()); + ml.session_at(0).on_session_timeout(); + assert_eq!(ml.session_at(0).joint_public_and_secret().unwrap(), Err(Error::NodeDisconnected)); } #[test] fn encryption_fails_on_node_timeout() { - let (_, _, _, l) = make_simple_cluster(0, 2).unwrap(); - assert!(l.master().joint_public_and_secret().is_none()); - l.master().on_node_timeout(l.first_slave().node()); - assert!(l.master().joint_public_and_secret().unwrap().unwrap_err() == Error::NodeDisconnected); + let ml = MessageLoop::new(2).init(0).unwrap(); + assert!(ml.session_at(0).joint_public_and_secret().is_none()); + ml.session_at(0).on_node_timeout(&ml.0.node(1)); + assert_eq!(ml.session_at(0).joint_public_and_secret().unwrap(), Err(Error::NodeDisconnected)); } #[test] fn complete_enc_dec_session() { let test_cases = [(0, 5), (2, 5), (3, 5)]; for &(threshold, num_nodes) in &test_cases { - let mut l = MessageLoop::new(num_nodes); - l.master().initialize(Default::default(), Default::default(), false, threshold, l.nodes.keys().cloned().collect::>().into()).unwrap(); - assert_eq!(l.nodes.len(), num_nodes); - - // let nodes do initialization + keys dissemination - while let Some((from, to, message)) = l.take_message() { - l.process_message((from, to, message)).unwrap(); - } + let ml = MessageLoop::new(num_nodes).init(threshold).unwrap(); + ml.0.loop_until(|| ml.0.is_empty()); // check that all nodes has finished joint public generation - let joint_public_key = l.master().joint_public_and_secret().unwrap().unwrap().0; - for node in l.nodes.values() { - let state = node.session.state(); - assert_eq!(state, SessionState::Finished); - assert_eq!(node.session.joint_public_and_secret().map(|p| p.map(|p| p.0)), Some(Ok(joint_public_key))); + let joint_public_key = ml.session_at(0).joint_public_and_secret().unwrap().unwrap().0; + for i in 0..num_nodes { + let session = ml.session_at(i); + assert_eq!(session.state(), SessionState::Finished); + assert_eq!(session.joint_public_and_secret().map(|p| p.map(|p| p.0)), Some(Ok(joint_public_key))); } // now let's encrypt some secret (which is a point on EC) let document_secret_plain = Random.generate().unwrap().public().clone(); - let all_nodes_id_numbers: Vec<_> = l.master().data.lock().nodes.values().map(|n| n.id_number.clone()).collect(); - let all_nodes_secret_shares: Vec<_> = l.nodes.values().map(|n| n.session.data.lock().secret_share.as_ref().unwrap().clone()).collect(); + let all_nodes_id_numbers = ml.nodes_id_numbers(); + let all_nodes_secret_shares = ml.nodes_secret_shares(); let document_secret_decrypted = do_encryption_and_decryption(threshold, &joint_public_key, &all_nodes_id_numbers, &all_nodes_secret_shares, @@ -1350,41 +1259,18 @@ pub mod tests { } } - #[test] - fn encryption_session_works_over_network() { - const CONN_TIMEOUT: Duration = Duration::from_millis(300); - const SESSION_TIMEOUT: Duration = Duration::from_millis(1000); - - let test_cases = [(1, 3)]; - for &(threshold, num_nodes) in &test_cases { - let mut core = new_runtime(); - - // prepare cluster objects for each node - let clusters = make_clusters(&core, 6031, num_nodes); - run_clusters(&clusters); - - // `clusters` contains `Arc` and clones will refer to the same cores. - let clusters_clone = clusters.clone(); - - // establish connections - loop_until(&core.executor(), CONN_TIMEOUT, move || clusters_clone.iter().all(all_connections_established)); - - // run session to completion - let session_id = SessionId::default(); - let session = clusters[0].client().new_generation_session(session_id, Default::default(), Default::default(), threshold).unwrap(); - loop_until(&core.executor(), SESSION_TIMEOUT, move || session.joint_public_and_secret().is_some()); - } - } - #[test] fn generation_message_fails_when_nonce_is_wrong() { - let (sid, m, _, l) = make_simple_cluster(0, 2).unwrap(); - assert_eq!(l.first_slave().process_message(&m, &message::GenerationMessage::KeysDissemination(message::KeysDissemination { - session: sid.into(), + let ml = MessageLoop::new(2).init(0).unwrap(); + ml.0.take_and_process_message(); + + let msg = message::GenerationMessage::KeysDissemination(message::KeysDissemination { + session: Default::default(), session_nonce: 10, secret1: math::generate_random_scalar().unwrap().into(), secret2: math::generate_random_scalar().unwrap().into(), publics: vec![math::generate_random_point().unwrap().into()], - })).unwrap_err(), Error::ReplayProtection); + }); + assert_eq!(ml.session_at(1).process_message(&ml.0.node(0), &msg).unwrap_err(), Error::ReplayProtection); } } diff --git a/secret_store/src/key_server_cluster/client_sessions/mod.rs b/secret-store/src/key_server_cluster/client_sessions/mod.rs similarity index 64% rename from secret_store/src/key_server_cluster/client_sessions/mod.rs rename to secret-store/src/key_server_cluster/client_sessions/mod.rs index 133edcffbb2..7815a74fbf7 100644 --- a/secret_store/src/key_server_cluster/client_sessions/mod.rs +++ b/secret-store/src/key_server_cluster/client_sessions/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . pub mod decryption_session; pub mod encryption_session; diff --git a/secret_store/src/key_server_cluster/client_sessions/signing_session_ecdsa.rs b/secret-store/src/key_server_cluster/client_sessions/signing_session_ecdsa.rs similarity index 84% rename from secret_store/src/key_server_cluster/client_sessions/signing_session_ecdsa.rs rename to secret-store/src/key_server_cluster/client_sessions/signing_session_ecdsa.rs index 670fa138f2c..fe3bd4f1143 100644 --- a/secret_store/src/key_server_cluster/client_sessions/signing_session_ecdsa.rs +++ b/secret-store/src/key_server_cluster/client_sessions/signing_session_ecdsa.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::{BTreeSet, BTreeMap}; use std::collections::btree_map::Entry; @@ -1061,140 +1061,65 @@ impl JobTransport for SigningJobTransport { #[cfg(test)] mod tests { use std::sync::Arc; - use std::collections::{BTreeSet, BTreeMap, VecDeque}; use ethereum_types::H256; - use ethkey::{self, Random, Generator, KeyPair, verify_public, public_to_address}; - use acl_storage::DummyAclStorage; - use key_server_cluster::{NodeId, DummyKeyStorage, SessionId, SessionMeta, Error, KeyStorage}; - use key_server_cluster::cluster_sessions::ClusterSession; - use key_server_cluster::cluster::tests::DummyCluster; - use key_server_cluster::generation_session::tests::MessageLoop as KeyGenerationMessageLoop; - use key_server_cluster::message::Message; - use key_server_cluster::signing_session_ecdsa::{SessionImpl, SessionParams}; - - struct Node { - pub node_id: NodeId, - pub cluster: Arc, - pub key_storage: Arc, - pub session: SessionImpl, - } + use ethkey::{self, Random, Generator, Public, verify_public, public_to_address}; + use key_server_cluster::{SessionId, Error, KeyStorage}; + use key_server_cluster::cluster::tests::{MessageLoop as ClusterMessageLoop}; + use key_server_cluster::signing_session_ecdsa::SessionImpl; + use key_server_cluster::generation_session::tests::MessageLoop as GenerationMessageLoop; - struct MessageLoop { - pub session_id: SessionId, - pub requester: KeyPair, - pub nodes: BTreeMap, - pub queue: VecDeque<(NodeId, NodeId, Message)>, - pub acl_storages: Vec>, - pub version: H256, - } + #[derive(Debug)] + pub struct MessageLoop(pub ClusterMessageLoop); impl MessageLoop { - pub fn new(gl: &KeyGenerationMessageLoop) -> Self { - let version = gl.nodes.values().nth(0).unwrap().key_storage.get(&Default::default()).unwrap().unwrap().versions.iter().last().unwrap().hash; - let mut nodes = BTreeMap::new(); - let session_id = gl.session_id.clone(); - let requester = Random.generate().unwrap(); - let signature = Some(ethkey::sign(requester.secret(), &SessionId::default()).unwrap()); - let master_node_id = gl.nodes.keys().nth(0).unwrap().clone(); - let mut acl_storages = Vec::new(); - for (i, (gl_node_id, gl_node)) in gl.nodes.iter().enumerate() { - let acl_storage = Arc::new(DummyAclStorage::default()); - acl_storages.push(acl_storage.clone()); - let cluster = Arc::new(DummyCluster::new(gl_node_id.clone())); - let session = SessionImpl::new(SessionParams { - meta: SessionMeta { - id: session_id.clone(), - self_node_id: gl_node_id.clone(), - master_node_id: master_node_id.clone(), - threshold: gl_node.key_storage.get(&session_id).unwrap().unwrap().threshold, - configured_nodes_count: gl.nodes.len(), - connected_nodes_count: gl.nodes.len(), - }, - access_key: "834cb736f02d9c968dfaf0c37658a1d86ff140554fc8b59c9fdad5a8cf810eec".parse().unwrap(), - key_share: Some(gl_node.key_storage.get(&session_id).unwrap().unwrap()), - acl_storage: acl_storage, - cluster: cluster.clone(), - nonce: 0, - }, if i == 0 { signature.clone().map(Into::into) } else { None }).unwrap(); - nodes.insert(gl_node_id.clone(), Node { node_id: gl_node_id.clone(), cluster: cluster, key_storage: gl_node.key_storage.clone(), session: session }); - } + pub fn new(num_nodes: usize, threshold: usize) -> Result { + let ml = GenerationMessageLoop::new(num_nodes).init(threshold)?; + ml.0.loop_until(|| ml.0.is_empty()); // complete generation session - let nodes_ids: Vec<_> = nodes.keys().cloned().collect(); - for node in nodes.values() { - for node_id in &nodes_ids { - node.cluster.add_node(node_id.clone()); - } - } + Ok(MessageLoop(ml.0)) + } - MessageLoop { - session_id: session_id, - requester: requester, - nodes: nodes, - queue: VecDeque::new(), - acl_storages: acl_storages, - version: version, - } + pub fn init_with_version(self, key_version: Option) -> Result<(Self, Public, H256), Error> { + let message_hash = H256::random(); + let requester = Random.generate().unwrap(); + let signature = ethkey::sign(requester.secret(), &SessionId::default()).unwrap(); + self.0.cluster(0).client() + .new_ecdsa_signing_session(Default::default(), signature.into(), key_version, message_hash) + .map(|_| (self, *requester.public(), message_hash)) } - pub fn master(&self) -> &SessionImpl { - &self.nodes.values().nth(0).unwrap().session + pub fn init(self) -> Result<(Self, Public, H256), Error> { + let key_version = self.0.key_storage(0).get(&Default::default()) + .unwrap().unwrap().versions.iter().last().unwrap().hash; + self.init_with_version(Some(key_version)) } - pub fn take_message(&mut self) -> Option<(NodeId, NodeId, Message)> { - self.nodes.values() - .filter_map(|n| n.cluster.take_message().map(|m| (n.node_id.clone(), m.0, m.1))) - .nth(0) - .or_else(|| self.queue.pop_front()) + pub fn init_delegated(self) -> Result<(Self, Public, H256), Error> { + self.0.key_storage(0).remove(&Default::default()).unwrap(); + self.init_with_version(None) } - pub fn process_message(&mut self, mut msg: (NodeId, NodeId, Message)) -> Result<(), Error> { - let mut is_queued_message = false; - loop { - match self.nodes[&msg.1].session.on_message(&msg.0, &msg.2) { - Ok(_) => { - if let Some(message) = self.queue.pop_front() { - msg = message; - is_queued_message = true; - continue; - } - return Ok(()); - }, - Err(Error::TooEarlyForRequest) => { - if is_queued_message { - self.queue.push_front(msg); - } else { - self.queue.push_back(msg); - } - return Ok(()); - }, - Err(err) => return Err(err), - } - } + pub fn init_with_isolated(self) -> Result<(Self, Public, H256), Error> { + self.0.isolate(1); + self.init() } - } - fn prepare_signing_sessions(threshold: usize, num_nodes: usize) -> (KeyGenerationMessageLoop, MessageLoop) { - // run key generation sessions - let mut gl = KeyGenerationMessageLoop::new(num_nodes); - gl.master().initialize(Default::default(), Default::default(), false, threshold, gl.nodes.keys().cloned().collect::>().into()).unwrap(); - while let Some((from, to, message)) = gl.take_message() { - gl.process_message((from, to, message)).unwrap(); + pub fn session_at(&self, idx: usize) -> Arc { + self.0.sessions(idx).ecdsa_signing_sessions.first().unwrap() } - // run signing session - let sl = MessageLoop::new(&gl); - (gl, sl) + pub fn ensure_completed(&self) { + self.0.loop_until(|| self.0.is_empty()); + assert!(self.session_at(0).wait().is_ok()); + } } #[test] fn failed_gen_ecdsa_sign_session_when_threshold_is_too_low() { let test_cases = [(1, 2), (2, 4), (3, 6), (4, 6)]; for &(threshold, num_nodes) in &test_cases { - let (_, sl) = prepare_signing_sessions(threshold, num_nodes); - - // run signing session - let message_hash = H256::random(); - assert_eq!(sl.master().initialize(sl.version.clone(), message_hash).unwrap_err(), Error::ConsensusUnreachable); + assert_eq!(MessageLoop::new(num_nodes, threshold).unwrap().init().unwrap_err(), + Error::ConsensusUnreachable); } } @@ -1202,112 +1127,46 @@ mod tests { fn complete_gen_ecdsa_sign_session() { let test_cases = [(0, 1), (2, 5), (2, 6), (3, 11), (4, 11)]; for &(threshold, num_nodes) in &test_cases { - let (gl, mut sl) = prepare_signing_sessions(threshold, num_nodes); - let key_pair = gl.compute_key_pair(threshold); - - // run signing session - let message_hash = H256::random(); - sl.master().initialize(sl.version.clone(), message_hash).unwrap(); - while let Some((from, to, message)) = sl.take_message() { - sl.process_message((from, to, message)).unwrap(); - } + let (ml, _, message) = MessageLoop::new(num_nodes, threshold).unwrap().init().unwrap(); + ml.0.loop_until(|| ml.0.is_empty()); - // verify signature - let signature = sl.master().wait().unwrap(); - assert!(verify_public(key_pair.public(), &signature, &message_hash).unwrap()); + let signer_public = ml.0.key_storage(0).get(&Default::default()).unwrap().unwrap().public; + let signature = ml.session_at(0).wait().unwrap(); + assert!(verify_public(&signer_public, &signature, &message).unwrap()); } } #[test] fn ecdsa_complete_signing_session_with_single_node_failing() { - let (_, mut sl) = prepare_signing_sessions(1, 4); - sl.master().initialize(sl.version.clone(), 777.into()).unwrap(); + let (ml, requester, _) = MessageLoop::new(4, 1).unwrap().init().unwrap(); // we need at least 3-of-4 nodes to agree to reach consensus // let's say 1 of 4 nodes disagee - sl.acl_storages[1].prohibit(public_to_address(sl.requester.public()), SessionId::default()); + ml.0.acl_storage(1).prohibit(public_to_address(&requester), Default::default()); // then consensus reachable, but single node will disagree - while let Some((from, to, message)) = sl.take_message() { - sl.process_message((from, to, message)).unwrap(); - } - - let data = sl.master().data.lock(); - match data.result { - Some(Ok(_)) => (), - _ => unreachable!(), - } + ml.ensure_completed(); } #[test] fn ecdsa_complete_signing_session_with_acl_check_failed_on_master() { - let (_, mut sl) = prepare_signing_sessions(1, 4); - sl.master().initialize(sl.version.clone(), 777.into()).unwrap(); + let (ml, requester, _) = MessageLoop::new(4, 1).unwrap().init().unwrap(); // we need at least 3-of-4 nodes to agree to reach consensus - // let's say 1 of 4 nodes disagee - sl.acl_storages[0].prohibit(public_to_address(sl.requester.public()), SessionId::default()); + // let's say 1 of 4 nodes (here: master) disagee + ml.0.acl_storage(0).prohibit(public_to_address(&requester), Default::default()); // then consensus reachable, but single node will disagree - while let Some((from, to, message)) = sl.take_message() { - sl.process_message((from, to, message)).unwrap(); - } - - let data = sl.master().data.lock(); - match data.result { - Some(Ok(_)) => (), - _ => unreachable!(), - } + ml.ensure_completed(); } #[test] fn ecdsa_signing_works_when_delegated_to_other_node() { - let (_, mut sl) = prepare_signing_sessions(1, 4); - - // let's say node1 doesn't have a share && delegates decryption request to node0 - // initially session is created on node1 => node1 is master for itself, but for other nodes node0 is still master - let actual_master = sl.nodes.keys().nth(0).cloned().unwrap(); - let requested_node = sl.nodes.keys().skip(1).nth(0).cloned().unwrap(); - let version = sl.nodes[&actual_master].key_storage.get(&Default::default()).unwrap().unwrap().last_version().unwrap().hash.clone(); - sl.nodes[&requested_node].key_storage.remove(&Default::default()).unwrap(); - sl.nodes.get_mut(&requested_node).unwrap().session.core.key_share = None; - sl.nodes.get_mut(&requested_node).unwrap().session.core.meta.master_node_id = sl.nodes[&requested_node].session.core.meta.self_node_id.clone(); - sl.nodes[&requested_node].session.data.lock().consensus_session.consensus_job_mut().executor_mut().set_requester( - sl.nodes[&actual_master].session.data.lock().consensus_session.consensus_job().executor().requester().unwrap().clone() - ); - - // now let's try to do a decryption - sl.nodes[&requested_node].session.delegate(actual_master, version, H256::random()).unwrap(); - - // then consensus reachable, but single node will disagree - while let Some((from, to, message)) = sl.take_message() { - sl.process_message((from, to, message)).unwrap(); - } + MessageLoop::new(4, 1).unwrap().init_delegated().unwrap().0.ensure_completed(); } #[test] fn ecdsa_signing_works_when_share_owners_are_isolated() { - let (_, mut sl) = prepare_signing_sessions(2, 6); - - // we need 5 out of 6 nodes to agree to do a decryption - // let's say that 1 of these nodes (master) is isolated - let isolated_node_id = sl.nodes.keys().skip(2).nth(0).cloned().unwrap(); - for node in sl.nodes.values() { - node.cluster.remove_node(&isolated_node_id); - } - - // now let's try to do a signing - sl.master().initialize(sl.version.clone(), H256::random()).unwrap(); - - // then consensus reachable, but single node will disagree - while let Some((from, to, message)) = sl.take_message() { - sl.process_message((from, to, message)).unwrap(); - } - - let data = sl.master().data.lock(); - match data.result { - Some(Ok(_)) => (), - _ => unreachable!(), - } + MessageLoop::new(6, 2).unwrap().init_with_isolated().unwrap().0.ensure_completed(); } } diff --git a/secret_store/src/key_server_cluster/client_sessions/signing_session_schnorr.rs b/secret-store/src/key_server_cluster/client_sessions/signing_session_schnorr.rs similarity index 70% rename from secret_store/src/key_server_cluster/client_sessions/signing_session_schnorr.rs rename to secret-store/src/key_server_cluster/client_sessions/signing_session_schnorr.rs index 376eab26b4f..0b0619f967a 100644 --- a/secret_store/src/key_server_cluster/client_sessions/signing_session_schnorr.rs +++ b/secret-store/src/key_server_cluster/client_sessions/signing_session_schnorr.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::BTreeSet; use std::sync::Arc; @@ -809,279 +809,150 @@ impl JobTransport for SigningJobTransport { mod tests { use std::sync::Arc; use std::str::FromStr; - use std::collections::{BTreeSet, BTreeMap, VecDeque}; + use std::collections::BTreeMap; use ethereum_types::{Address, H256}; - use ethkey::{self, Random, Generator, Public, Secret, KeyPair, public_to_address}; + use ethkey::{self, Random, Generator, Public, Secret, public_to_address}; use acl_storage::DummyAclStorage; - use key_server_cluster::{NodeId, DummyKeyStorage, DocumentKeyShare, DocumentKeyShareVersion, SessionId, - Requester, SessionMeta, Error, KeyStorage}; - use key_server_cluster::cluster_sessions::ClusterSession; - use key_server_cluster::cluster::tests::DummyCluster; - use key_server_cluster::generation_session::tests::MessageLoop as KeyGenerationMessageLoop; + use key_server_cluster::{SessionId, Requester, SessionMeta, Error, KeyStorage}; + use key_server_cluster::cluster::tests::MessageLoop as ClusterMessageLoop; + use key_server_cluster::generation_session::tests::MessageLoop as GenerationMessageLoop; use key_server_cluster::math; - use key_server_cluster::message::{Message, SchnorrSigningMessage, SchnorrSigningConsensusMessage, ConsensusMessage, ConfirmConsensusInitialization, - SchnorrSigningGenerationMessage, GenerationMessage, ConfirmInitialization, InitializeSession, SchnorrRequestPartialSignature}; + use key_server_cluster::message::{SchnorrSigningMessage, SchnorrSigningConsensusMessage, + ConsensusMessage, ConfirmConsensusInitialization, SchnorrSigningGenerationMessage, GenerationMessage, + ConfirmInitialization, InitializeSession, SchnorrRequestPartialSignature}; use key_server_cluster::signing_session_schnorr::{SessionImpl, SessionState, SessionParams}; - struct Node { - pub node_id: NodeId, - pub cluster: Arc, - pub key_storage: Arc, - pub session: SessionImpl, - } - - struct MessageLoop { - pub session_id: SessionId, - pub requester: KeyPair, - pub nodes: BTreeMap, - pub queue: VecDeque<(NodeId, NodeId, Message)>, - pub acl_storages: Vec>, - pub version: H256, - } + #[derive(Debug)] + pub struct MessageLoop(pub ClusterMessageLoop); impl MessageLoop { - pub fn new(gl: &KeyGenerationMessageLoop) -> Self { - let version = gl.nodes.values().nth(0).unwrap().key_storage.get(&Default::default()).unwrap().unwrap().versions.iter().last().unwrap().hash; - let mut nodes = BTreeMap::new(); - let session_id = gl.session_id.clone(); - let requester = Random.generate().unwrap(); - let signature = Some(ethkey::sign(requester.secret(), &SessionId::default()).unwrap()); - let master_node_id = gl.nodes.keys().nth(0).unwrap().clone(); - let mut acl_storages = Vec::new(); - for (i, (gl_node_id, gl_node)) in gl.nodes.iter().enumerate() { - let acl_storage = Arc::new(DummyAclStorage::default()); - acl_storages.push(acl_storage.clone()); - let cluster = Arc::new(DummyCluster::new(gl_node_id.clone())); - let session = SessionImpl::new(SessionParams { - meta: SessionMeta { - id: session_id.clone(), - self_node_id: gl_node_id.clone(), - master_node_id: master_node_id.clone(), - threshold: gl_node.key_storage.get(&session_id).unwrap().unwrap().threshold, - configured_nodes_count: gl.nodes.len(), - connected_nodes_count: gl.nodes.len(), - }, - access_key: "834cb736f02d9c968dfaf0c37658a1d86ff140554fc8b59c9fdad5a8cf810eec".parse().unwrap(), - key_share: Some(gl_node.key_storage.get(&session_id).unwrap().unwrap()), - acl_storage: acl_storage, - cluster: cluster.clone(), - nonce: 0, - }, if i == 0 { signature.clone().map(Into::into) } else { None }).unwrap(); - nodes.insert(gl_node_id.clone(), Node { node_id: gl_node_id.clone(), cluster: cluster, key_storage: gl_node.key_storage.clone(), session: session }); - } + pub fn new(num_nodes: usize, threshold: usize) -> Result { + let ml = GenerationMessageLoop::new(num_nodes).init(threshold)?; + ml.0.loop_until(|| ml.0.is_empty()); // complete generation session - let nodes_ids: Vec<_> = nodes.keys().cloned().collect(); - for node in nodes.values() { - for node_id in &nodes_ids { - node.cluster.add_node(node_id.clone()); - } - } + Ok(MessageLoop(ml.0)) + } - MessageLoop { - session_id: session_id, - requester: requester, - nodes: nodes, - queue: VecDeque::new(), - acl_storages: acl_storages, - version: version, - } + pub fn into_session(&self, at_node: usize) -> SessionImpl { + let requester = Some(Requester::Signature(ethkey::sign(Random.generate().unwrap().secret(), + &SessionId::default()).unwrap())); + SessionImpl::new(SessionParams { + meta: SessionMeta { + id: SessionId::default(), + self_node_id: self.0.node(at_node), + master_node_id: self.0.node(0), + threshold: self.0.key_storage(at_node).get(&Default::default()).unwrap().unwrap().threshold, + configured_nodes_count: self.0.nodes().len(), + connected_nodes_count: self.0.nodes().len(), + }, + access_key: Random.generate().unwrap().secret().clone(), + key_share: self.0.key_storage(at_node).get(&Default::default()).unwrap(), + acl_storage: Arc::new(DummyAclStorage::default()), + cluster: self.0.cluster(0).view().unwrap(), + nonce: 0, + }, requester).unwrap() } - pub fn master(&self) -> &SessionImpl { - &self.nodes.values().nth(0).unwrap().session + pub fn init_with_version(self, key_version: Option) -> Result<(Self, Public, H256), Error> { + let message_hash = H256::random(); + let requester = Random.generate().unwrap(); + let signature = ethkey::sign(requester.secret(), &SessionId::default()).unwrap(); + self.0.cluster(0).client().new_schnorr_signing_session( + Default::default(), + signature.into(), + key_version, + message_hash).map(|_| (self, *requester.public(), message_hash)) } - pub fn take_message(&mut self) -> Option<(NodeId, NodeId, Message)> { - self.nodes.values() - .filter_map(|n| n.cluster.take_message().map(|m| (n.node_id.clone(), m.0, m.1))) - .nth(0) - .or_else(|| self.queue.pop_front()) + pub fn init(self) -> Result<(Self, Public, H256), Error> { + let key_version = self.key_version(); + self.init_with_version(Some(key_version)) } - pub fn process_message(&mut self, mut msg: (NodeId, NodeId, Message)) -> Result<(), Error> { - let mut is_queued_message = false; - loop { - match self.nodes[&msg.1].session.on_message(&msg.0, &msg.2) { - Ok(_) => { - if let Some(message) = self.queue.pop_front() { - msg = message; - is_queued_message = true; - continue; - } - return Ok(()); - }, - Err(Error::TooEarlyForRequest) => { - if is_queued_message { - self.queue.push_front(msg); - } else { - self.queue.push_back(msg); - } - return Ok(()); - }, - Err(err) => return Err(err), - } - } + pub fn init_delegated(self) -> Result<(Self, Public, H256), Error> { + self.0.key_storage(0).remove(&Default::default()).unwrap(); + self.init_with_version(None) } - pub fn run_until bool>(&mut self, predicate: F) -> Result<(), Error> { - while let Some((from, to, message)) = self.take_message() { - if predicate(self) { - return Ok(()); - } + pub fn init_with_isolated(self) -> Result<(Self, Public, H256), Error> { + self.0.isolate(1); + self.init() + } - self.process_message((from, to, message))?; - } + pub fn init_without_share(self) -> Result<(Self, Public, H256), Error> { + let key_version = self.key_version(); + self.0.key_storage(0).remove(&Default::default()).unwrap(); + self.init_with_version(Some(key_version)) + } - unreachable!("either wrong predicate, or failing test") + pub fn session_at(&self, idx: usize) -> Arc { + self.0.sessions(idx).schnorr_signing_sessions.first().unwrap() } - } - fn prepare_signing_sessions(threshold: usize, num_nodes: usize) -> (KeyGenerationMessageLoop, MessageLoop) { - // run key generation sessions - let mut gl = KeyGenerationMessageLoop::new(num_nodes); - gl.master().initialize(Default::default(), Default::default(), false, threshold, gl.nodes.keys().cloned().collect::>().into()).unwrap(); - while let Some((from, to, message)) = gl.take_message() { - gl.process_message((from, to, message)).unwrap(); + pub fn ensure_completed(&self) { + self.0.loop_until(|| self.0.is_empty()); + assert!(self.session_at(0).wait().is_ok()); } - // run signing session - let sl = MessageLoop::new(&gl); - (gl, sl) + pub fn key_version(&self) -> H256 { + self.0.key_storage(0).get(&Default::default()) + .unwrap().unwrap().versions.iter().last().unwrap().hash + } } #[test] fn schnorr_complete_gen_sign_session() { let test_cases = [(0, 1), (0, 5), (2, 5), (3, 5)]; for &(threshold, num_nodes) in &test_cases { - let (gl, mut sl) = prepare_signing_sessions(threshold, num_nodes); + let (ml, _, message) = MessageLoop::new(num_nodes, threshold).unwrap().init().unwrap(); + ml.0.loop_until(|| ml.0.is_empty()); - // run signing session - let message_hash = H256::from(777); - sl.master().initialize(sl.version.clone(), message_hash).unwrap(); - while let Some((from, to, message)) = sl.take_message() { - sl.process_message((from, to, message)).unwrap(); - } - - // verify signature - let public = gl.master().joint_public_and_secret().unwrap().unwrap().0; - let signature = sl.master().wait().unwrap(); - assert!(math::verify_schnorr_signature(&public, &signature, &message_hash).unwrap()); + let signer_public = ml.0.key_storage(0).get(&Default::default()).unwrap().unwrap().public; + let signature = ml.session_at(0).wait().unwrap(); + assert!(math::verify_schnorr_signature(&signer_public, &signature, &message).unwrap()); } } #[test] fn schnorr_constructs_in_cluster_of_single_node() { - let mut nodes = BTreeMap::new(); - let self_node_id = Random.generate().unwrap().public().clone(); - nodes.insert(self_node_id, Random.generate().unwrap().secret().clone()); - match SessionImpl::new(SessionParams { - meta: SessionMeta { - id: SessionId::default(), - self_node_id: self_node_id.clone(), - master_node_id: self_node_id.clone(), - threshold: 0, - configured_nodes_count: 1, - connected_nodes_count: 1, - }, - access_key: Random.generate().unwrap().secret().clone(), - key_share: Some(DocumentKeyShare { - author: Default::default(), - threshold: 0, - public: Default::default(), - common_point: Some(Random.generate().unwrap().public().clone()), - encrypted_point: Some(Random.generate().unwrap().public().clone()), - versions: vec![DocumentKeyShareVersion { - hash: Default::default(), - id_numbers: nodes, - secret_share: Random.generate().unwrap().secret().clone(), - }], - }), - acl_storage: Arc::new(DummyAclStorage::default()), - cluster: Arc::new(DummyCluster::new(self_node_id.clone())), - nonce: 0, - }, Some(Requester::Signature(ethkey::sign(Random.generate().unwrap().secret(), &SessionId::default()).unwrap()))) { - Ok(_) => (), - _ => panic!("unexpected"), - } + MessageLoop::new(1, 0).unwrap().init().unwrap(); } #[test] fn schnorr_fails_to_initialize_if_does_not_have_a_share() { - let self_node_id = Random.generate().unwrap().public().clone(); - let session = SessionImpl::new(SessionParams { - meta: SessionMeta { - id: SessionId::default(), - self_node_id: self_node_id.clone(), - master_node_id: self_node_id.clone(), - threshold: 0, - configured_nodes_count: 1, - connected_nodes_count: 1, - }, - access_key: Random.generate().unwrap().secret().clone(), - key_share: None, - acl_storage: Arc::new(DummyAclStorage::default()), - cluster: Arc::new(DummyCluster::new(self_node_id.clone())), - nonce: 0, - }, Some(Requester::Signature(ethkey::sign(Random.generate().unwrap().secret(), &SessionId::default()).unwrap()))).unwrap(); - assert_eq!(session.initialize(Default::default(), Default::default()), Err(Error::InvalidMessage)); + assert!(MessageLoop::new(2, 1).unwrap().init_without_share().is_err()); } #[test] fn schnorr_fails_to_initialize_if_threshold_is_wrong() { - let mut nodes = BTreeMap::new(); - let self_node_id = Random.generate().unwrap().public().clone(); - nodes.insert(self_node_id.clone(), Random.generate().unwrap().secret().clone()); - nodes.insert(Random.generate().unwrap().public().clone(), Random.generate().unwrap().secret().clone()); - let session = SessionImpl::new(SessionParams { - meta: SessionMeta { - id: SessionId::default(), - self_node_id: self_node_id.clone(), - master_node_id: self_node_id.clone(), - threshold: 2, - configured_nodes_count: 1, - connected_nodes_count: 1, - }, - access_key: Random.generate().unwrap().secret().clone(), - key_share: Some(DocumentKeyShare { - author: Default::default(), - threshold: 2, - public: Default::default(), - common_point: Some(Random.generate().unwrap().public().clone()), - encrypted_point: Some(Random.generate().unwrap().public().clone()), - versions: vec![DocumentKeyShareVersion { - hash: Default::default(), - id_numbers: nodes, - secret_share: Random.generate().unwrap().secret().clone(), - }], - }), - acl_storage: Arc::new(DummyAclStorage::default()), - cluster: Arc::new(DummyCluster::new(self_node_id.clone())), - nonce: 0, - }, Some(Requester::Signature(ethkey::sign(Random.generate().unwrap().secret(), &SessionId::default()).unwrap()))).unwrap(); - assert_eq!(session.initialize(Default::default(), Default::default()), Err(Error::ConsensusUnreachable)); + let mut ml = MessageLoop::new(3, 2).unwrap(); + ml.0.exclude(2); + assert_eq!(ml.init().unwrap_err(), Error::ConsensusUnreachable); } #[test] fn schnorr_fails_to_initialize_when_already_initialized() { - let (_, sl) = prepare_signing_sessions(1, 3); - assert_eq!(sl.master().initialize(sl.version.clone(), 777.into()), Ok(())); - assert_eq!(sl.master().initialize(sl.version.clone(), 777.into()), Err(Error::InvalidStateForRequest)); + let (ml, _, _) = MessageLoop::new(1, 0).unwrap().init().unwrap(); + assert_eq!(ml.session_at(0).initialize(ml.key_version(), 777.into()), + Err(Error::InvalidStateForRequest)); } #[test] fn schnorr_does_not_fail_when_consensus_message_received_after_consensus_established() { - let (_, mut sl) = prepare_signing_sessions(1, 3); - sl.master().initialize(sl.version.clone(), 777.into()).unwrap(); + let (ml, _, _) = MessageLoop::new(3, 1).unwrap().init().unwrap(); + // consensus is established - sl.run_until(|sl| sl.master().state() == SessionState::SessionKeyGeneration).unwrap(); + let session = ml.session_at(0); + ml.0.loop_until(|| session.state() == SessionState::SessionKeyGeneration); + // but 3rd node continues to send its messages // this should not fail session - let consensus_group = sl.master().data.lock().consensus_session.select_consensus_group().unwrap().clone(); + let consensus_group = session.data.lock().consensus_session.select_consensus_group().unwrap().clone(); let mut had_3rd_message = false; - while let Some((from, to, message)) = sl.take_message() { + while let Some((from, to, message)) = ml.0.take_message() { if !consensus_group.contains(&from) { had_3rd_message = true; - sl.process_message((from, to, message)).unwrap(); + ml.0.process_message(from, to, message); } } assert!(had_3rd_message); @@ -1089,10 +960,11 @@ mod tests { #[test] fn schnorr_fails_when_consensus_message_is_received_when_not_initialized() { - let (_, sl) = prepare_signing_sessions(1, 3); - assert_eq!(sl.master().on_consensus_message(sl.nodes.keys().nth(1).unwrap(), &SchnorrSigningConsensusMessage { + let ml = MessageLoop::new(3, 1).unwrap(); + let session = ml.into_session(0); + assert_eq!(session.on_consensus_message(&ml.0.node(1), &SchnorrSigningConsensusMessage { session: SessionId::default().into(), - sub_session: sl.master().core.access_key.clone().into(), + sub_session: session.core.access_key.clone().into(), session_nonce: 0, message: ConsensusMessage::ConfirmConsensusInitialization(ConfirmConsensusInitialization { is_confirmed: true, @@ -1102,10 +974,11 @@ mod tests { #[test] fn schnorr_fails_when_generation_message_is_received_when_not_initialized() { - let (_, sl) = prepare_signing_sessions(1, 3); - assert_eq!(sl.master().on_generation_message(sl.nodes.keys().nth(1).unwrap(), &SchnorrSigningGenerationMessage { + let ml = MessageLoop::new(3, 1).unwrap(); + let session = ml.into_session(0); + assert_eq!(session.on_generation_message(&ml.0.node(1), &SchnorrSigningGenerationMessage { session: SessionId::default().into(), - sub_session: sl.master().core.access_key.clone().into(), + sub_session: session.core.access_key.clone().into(), session_nonce: 0, message: GenerationMessage::ConfirmInitialization(ConfirmInitialization { session: SessionId::default().into(), @@ -1117,16 +990,16 @@ mod tests { #[test] fn schnorr_fails_when_generation_sesson_is_initialized_by_slave_node() { - let (_, mut sl) = prepare_signing_sessions(1, 3); - sl.master().initialize(sl.version.clone(), 777.into()).unwrap(); - sl.run_until(|sl| sl.master().state() == SessionState::SessionKeyGeneration).unwrap(); + let (ml, _, _) = MessageLoop::new(3, 1).unwrap().init().unwrap(); + let session = ml.session_at(0); + ml.0.loop_until(|| session.state() == SessionState::SessionKeyGeneration); - let slave2_id = sl.nodes.keys().nth(2).unwrap().clone(); - let slave1 = &sl.nodes.values().nth(1).unwrap().session; + let slave2_id = ml.0.node(2); + let slave1_session = ml.session_at(1); - assert_eq!(slave1.on_generation_message(&slave2_id, &SchnorrSigningGenerationMessage { + assert_eq!(slave1_session.on_generation_message(&slave2_id, &SchnorrSigningGenerationMessage { session: SessionId::default().into(), - sub_session: sl.master().core.access_key.clone().into(), + sub_session: session.core.access_key.clone().into(), session_nonce: 0, message: GenerationMessage::InitializeSession(InitializeSession { session: SessionId::default().into(), @@ -1143,11 +1016,11 @@ mod tests { #[test] fn schnorr_fails_when_signature_requested_when_not_initialized() { - let (_, sl) = prepare_signing_sessions(1, 3); - let slave1 = &sl.nodes.values().nth(1).unwrap().session; - assert_eq!(slave1.on_partial_signature_requested(sl.nodes.keys().nth(0).unwrap(), &SchnorrRequestPartialSignature { + let ml = MessageLoop::new(3, 1).unwrap(); + let session = ml.into_session(1); + assert_eq!(session.on_partial_signature_requested(&ml.0.node(0), &SchnorrRequestPartialSignature { session: SessionId::default().into(), - sub_session: sl.master().core.access_key.clone().into(), + sub_session: session.core.access_key.clone().into(), session_nonce: 0, request_id: Secret::from_str("0000000000000000000000000000000000000000000000000000000000000001").unwrap().into(), message_hash: H256::default().into(), @@ -1157,10 +1030,11 @@ mod tests { #[test] fn schnorr_fails_when_signature_requested_by_slave_node() { - let (_, sl) = prepare_signing_sessions(1, 3); - assert_eq!(sl.master().on_partial_signature_requested(sl.nodes.keys().nth(1).unwrap(), &SchnorrRequestPartialSignature { + let ml = MessageLoop::new(3, 1).unwrap(); + let session = ml.into_session(0); + assert_eq!(session.on_partial_signature_requested(&ml.0.node(1), &SchnorrRequestPartialSignature { session: SessionId::default().into(), - sub_session: sl.master().core.access_key.clone().into(), + sub_session: session.core.access_key.clone().into(), session_nonce: 0, request_id: Secret::from_str("0000000000000000000000000000000000000000000000000000000000000001").unwrap().into(), message_hash: H256::default().into(), @@ -1170,123 +1044,68 @@ mod tests { #[test] fn schnorr_failed_signing_session() { - let (_, mut sl) = prepare_signing_sessions(1, 3); - sl.master().initialize(sl.version.clone(), 777.into()).unwrap(); + let (ml, requester, _) = MessageLoop::new(3, 1).unwrap().init().unwrap(); // we need at least 2-of-3 nodes to agree to reach consensus // let's say 2 of 3 nodes disagee - sl.acl_storages[1].prohibit(public_to_address(sl.requester.public()), SessionId::default()); - sl.acl_storages[2].prohibit(public_to_address(sl.requester.public()), SessionId::default()); + ml.0.acl_storage(1).prohibit(public_to_address(&requester), SessionId::default()); + ml.0.acl_storage(2).prohibit(public_to_address(&requester), SessionId::default()); // then consensus is unreachable - assert_eq!(sl.run_until(|_| false), Err(Error::ConsensusUnreachable)); + ml.0.loop_until(|| ml.0.is_empty()); + assert_eq!(ml.session_at(0).wait().unwrap_err(), Error::ConsensusUnreachable); } #[test] fn schnorr_complete_signing_session_with_single_node_failing() { - let (_, mut sl) = prepare_signing_sessions(1, 3); - sl.master().initialize(sl.version.clone(), 777.into()).unwrap(); + let (ml, requester, _) = MessageLoop::new(3, 1).unwrap().init().unwrap(); // we need at least 2-of-3 nodes to agree to reach consensus // let's say 1 of 3 nodes disagee - sl.acl_storages[1].prohibit(public_to_address(sl.requester.public()), SessionId::default()); + ml.0.acl_storage(1).prohibit(public_to_address(&requester), SessionId::default()); // then consensus reachable, but single node will disagree - while let Some((from, to, message)) = sl.take_message() { - sl.process_message((from, to, message)).unwrap(); - } - - let data = sl.master().data.lock(); - match data.result { - Some(Ok(_)) => (), - _ => unreachable!(), - } + ml.ensure_completed(); } #[test] fn schnorr_complete_signing_session_with_acl_check_failed_on_master() { - let (_, mut sl) = prepare_signing_sessions(1, 3); - sl.master().initialize(sl.version.clone(), 777.into()).unwrap(); + let (ml, requester, _) = MessageLoop::new(3, 1).unwrap().init().unwrap(); // we need at least 2-of-3 nodes to agree to reach consensus // let's say 1 of 3 nodes disagee - sl.acl_storages[0].prohibit(public_to_address(sl.requester.public()), SessionId::default()); + ml.0.acl_storage(0).prohibit(public_to_address(&requester), SessionId::default()); // then consensus reachable, but single node will disagree - while let Some((from, to, message)) = sl.take_message() { - sl.process_message((from, to, message)).unwrap(); - } - - let data = sl.master().data.lock(); - match data.result { - Some(Ok(_)) => (), - _ => unreachable!(), - } + ml.ensure_completed(); } #[test] fn schnorr_signing_message_fails_when_nonce_is_wrong() { - let (_, sl) = prepare_signing_sessions(1, 3); - assert_eq!(sl.master().process_message(sl.nodes.keys().nth(1).unwrap(), &SchnorrSigningMessage::SchnorrSigningGenerationMessage(SchnorrSigningGenerationMessage { + let ml = MessageLoop::new(3, 1).unwrap(); + let session = ml.into_session(1); + let msg = SchnorrSigningMessage::SchnorrSigningGenerationMessage(SchnorrSigningGenerationMessage { session: SessionId::default().into(), - sub_session: sl.master().core.access_key.clone().into(), + sub_session: session.core.access_key.clone().into(), session_nonce: 10, message: GenerationMessage::ConfirmInitialization(ConfirmInitialization { session: SessionId::default().into(), session_nonce: 0, derived_point: Public::default().into(), }), - })), Err(Error::ReplayProtection)); + }); + assert_eq!(session.process_message(&ml.0.node(1), &msg), Err(Error::ReplayProtection)); } #[test] fn schnorr_signing_works_when_delegated_to_other_node() { - let (_, mut sl) = prepare_signing_sessions(1, 3); - - // let's say node1 doesn't have a share && delegates decryption request to node0 - // initially session is created on node1 => node1 is master for itself, but for other nodes node0 is still master - let actual_master = sl.nodes.keys().nth(0).cloned().unwrap(); - let requested_node = sl.nodes.keys().skip(1).nth(0).cloned().unwrap(); - let version = sl.nodes[&actual_master].key_storage.get(&Default::default()).unwrap().unwrap().last_version().unwrap().hash.clone(); - sl.nodes[&requested_node].key_storage.remove(&Default::default()).unwrap(); - sl.nodes.get_mut(&requested_node).unwrap().session.core.key_share = None; - sl.nodes.get_mut(&requested_node).unwrap().session.core.meta.master_node_id = sl.nodes[&requested_node].session.core.meta.self_node_id.clone(); - sl.nodes[&requested_node].session.data.lock().consensus_session.consensus_job_mut().executor_mut().set_requester( - sl.nodes[&actual_master].session.data.lock().consensus_session.consensus_job().executor().requester().unwrap().clone() - ); - - // now let's try to do a decryption - sl.nodes[&requested_node].session.delegate(actual_master, version, Default::default()).unwrap(); - - // then consensus reachable, but single node will disagree - while let Some((from, to, message)) = sl.take_message() { - sl.process_message((from, to, message)).unwrap(); - } + let (ml, _, _) = MessageLoop::new(3, 1).unwrap().init_delegated().unwrap(); + ml.ensure_completed(); } #[test] fn schnorr_signing_works_when_share_owners_are_isolated() { - let (_, mut sl) = prepare_signing_sessions(1, 3); - - // we need 2 out of 3 nodes to agree to do a decryption - // let's say that 1 of these nodes (master) is isolated - let isolated_node_id = sl.nodes.keys().skip(2).nth(0).cloned().unwrap(); - for node in sl.nodes.values() { - node.cluster.remove_node(&isolated_node_id); - } - - // now let's try to do a signing - sl.master().initialize(sl.version.clone(), 777.into()).unwrap(); - - // then consensus reachable, but single node will disagree - while let Some((from, to, message)) = sl.take_message() { - sl.process_message((from, to, message)).unwrap(); - } - - let data = sl.master().data.lock(); - match data.result { - Some(Ok(_)) => (), - _ => unreachable!(), - } + let (ml, _, _) = MessageLoop::new(3, 1).unwrap().init_with_isolated().unwrap(); + ml.ensure_completed(); } } diff --git a/secret-store/src/key_server_cluster/cluster.rs b/secret-store/src/key_server_cluster/cluster.rs new file mode 100644 index 00000000000..a8416a8f700 --- /dev/null +++ b/secret-store/src/key_server_cluster/cluster.rs @@ -0,0 +1,1110 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +use std::sync::Arc; +use std::collections::{BTreeMap, BTreeSet}; +use parking_lot::RwLock; +use ethkey::{Public, Signature, Random, Generator}; +use ethereum_types::{Address, H256}; +use parity_runtime::Executor; +use key_server_cluster::{Error, NodeId, SessionId, Requester, AclStorage, KeyStorage, KeyServerSet, NodeKeyPair}; +use key_server_cluster::cluster_sessions::{ClusterSession, AdminSession, ClusterSessions, SessionIdWithSubSession, + ClusterSessionsContainer, SERVERS_SET_CHANGE_SESSION_ID, create_cluster_view, + AdminSessionCreationData, ClusterSessionsListener}; +use key_server_cluster::cluster_sessions_creator::ClusterSessionCreator; +use key_server_cluster::cluster_connections::{ConnectionProvider, ConnectionManager}; +use key_server_cluster::cluster_connections_net::{NetConnectionsManager, + NetConnectionsContainer, NetConnectionsManagerConfig}; +use key_server_cluster::cluster_message_processor::{MessageProcessor, SessionsMessageProcessor}; +use key_server_cluster::message::Message; +use key_server_cluster::generation_session::{SessionImpl as GenerationSession}; +use key_server_cluster::decryption_session::{SessionImpl as DecryptionSession}; +use key_server_cluster::encryption_session::{SessionImpl as EncryptionSession}; +use key_server_cluster::signing_session_ecdsa::{SessionImpl as EcdsaSigningSession}; +use key_server_cluster::signing_session_schnorr::{SessionImpl as SchnorrSigningSession}; +use key_server_cluster::key_version_negotiation_session::{SessionImpl as KeyVersionNegotiationSession, + IsolatedSessionTransport as KeyVersionNegotiationSessionTransport, ContinueAction}; +use key_server_cluster::connection_trigger::{ConnectionTrigger, + SimpleConnectionTrigger, ServersSetChangeSessionCreatorConnector}; +use key_server_cluster::connection_trigger_with_migration::ConnectionTriggerWithMigration; + +#[cfg(test)] +use key_server_cluster::cluster_connections::tests::{MessagesQueue, TestConnections, new_test_connections}; + +/// Cluster interface for external clients. +pub trait ClusterClient: Send + Sync { + /// Start new generation session. + fn new_generation_session(&self, session_id: SessionId, origin: Option

, author: Address, threshold: usize) -> Result, Error>; + /// Start new encryption session. + fn new_encryption_session(&self, session_id: SessionId, author: Requester, common_point: Public, encrypted_point: Public) -> Result, Error>; + /// Start new decryption session. + fn new_decryption_session(&self, session_id: SessionId, origin: Option
, requester: Requester, version: Option, is_shadow_decryption: bool, is_broadcast_decryption: bool) -> Result, Error>; + /// Start new Schnorr signing session. + fn new_schnorr_signing_session(&self, session_id: SessionId, requester: Requester, version: Option, message_hash: H256) -> Result, Error>; + /// Start new ECDSA session. + fn new_ecdsa_signing_session(&self, session_id: SessionId, requester: Requester, version: Option, message_hash: H256) -> Result, Error>; + /// Start new key version negotiation session. + fn new_key_version_negotiation_session(&self, session_id: SessionId) -> Result>, Error>; + /// Start new servers set change session. + fn new_servers_set_change_session(&self, session_id: Option, migration_id: Option, new_nodes_set: BTreeSet, old_set_signature: Signature, new_set_signature: Signature) -> Result, Error>; + + /// Listen for new generation sessions. + fn add_generation_listener(&self, listener: Arc>); + /// Listen for new decryption sessions. + fn add_decryption_listener(&self, listener: Arc>); + /// Listen for new key version negotiation sessions. + fn add_key_version_negotiation_listener(&self, listener: Arc>>); + + /// Ask node to make 'faulty' generation sessions. + #[cfg(test)] + fn make_faulty_generation_sessions(&self); + /// Get active generation session with given id. + #[cfg(test)] + fn generation_session(&self, session_id: &SessionId) -> Option>; + #[cfg(test)] + fn is_fully_connected(&self) -> bool; + /// Try connect to disconnected nodes. + #[cfg(test)] + fn connect(&self); +} + +/// Cluster access for single session participant. +pub trait Cluster: Send + Sync { + /// Broadcast message to all other nodes. + fn broadcast(&self, message: Message) -> Result<(), Error>; + /// Send message to given node. + fn send(&self, to: &NodeId, message: Message) -> Result<(), Error>; + /// Is connected to given node? + fn is_connected(&self, node: &NodeId) -> bool; + /// Get a set of connected nodes. + fn nodes(&self) -> BTreeSet; + /// Get total count of configured key server nodes (valid at the time of ClusterView creation). + fn configured_nodes_count(&self) -> usize; + /// Get total count of connected key server nodes (valid at the time of ClusterView creation). + fn connected_nodes_count(&self) -> usize; +} + +/// Cluster initialization parameters. +#[derive(Clone)] +pub struct ClusterConfiguration { + /// KeyPair this node holds. + pub self_key_pair: Arc, + /// Cluster nodes set. + pub key_server_set: Arc, + /// Reference to key storage + pub key_storage: Arc, + /// Reference to ACL storage + pub acl_storage: Arc, + /// Administrator public key. + pub admin_public: Option, + /// Do not remove sessions from container. + pub preserve_sessions: bool, +} + +/// Network cluster implementation. +pub struct ClusterCore { + /// Cluster data. + data: Arc>, +} + +/// Network cluster client interface implementation. +pub struct ClusterClientImpl { + /// Cluster data. + data: Arc>, +} + +/// Network cluster view. It is a communication channel, required in single session. +pub struct ClusterView { + configured_nodes_count: usize, + connected_nodes: BTreeSet, + connections: Arc, + self_key_pair: Arc, +} + +/// Cross-thread shareable cluster data. +pub struct ClusterData { + /// Cluster configuration. + pub config: ClusterConfiguration, + /// KeyPair this node holds. + pub self_key_pair: Arc, + /// Connections data. + pub connections: C, + /// Active sessions data. + pub sessions: Arc, + // Messages processor. + pub message_processor: Arc, + /// Link between servers set chnage session and the connections manager. + pub servers_set_change_creator_connector: Arc, +} + +/// Create new network-backed cluster. +pub fn new_network_cluster( + executor: Executor, + config: ClusterConfiguration, + net_config: NetConnectionsManagerConfig +) -> Result>, Error> { + let mut nodes = config.key_server_set.snapshot().current_set; + let is_isolated = nodes.remove(config.self_key_pair.public()).is_none(); + let connections_data = Arc::new(RwLock::new(NetConnectionsContainer { + is_isolated, + nodes, + connections: BTreeMap::new(), + })); + + let connection_trigger: Box = match net_config.auto_migrate_enabled { + false => Box::new(SimpleConnectionTrigger::with_config(&config)), + true if config.admin_public.is_none() => Box::new(ConnectionTriggerWithMigration::with_config(&config)), + true => return Err(Error::Internal( + "secret store admininstrator public key is specified with auto-migration enabled".into() + )), + }; + + let servers_set_change_creator_connector = connection_trigger.servers_set_change_creator_connector(); + let sessions = Arc::new(ClusterSessions::new(&config, servers_set_change_creator_connector.clone())); + let message_processor = Arc::new(SessionsMessageProcessor::new( + config.self_key_pair.clone(), + servers_set_change_creator_connector.clone(), + sessions.clone(), + connections_data.clone())); + + let connections = NetConnectionsManager::new( + executor, + message_processor.clone(), + connection_trigger, + connections_data, + &config, + net_config)?; + connections.start()?; + + ClusterCore::new(sessions, message_processor, connections, servers_set_change_creator_connector, config) +} + +/// Create new in-memory backed cluster +#[cfg(test)] +pub fn new_test_cluster( + messages: MessagesQueue, + config: ClusterConfiguration, +) -> Result>>, Error> { + let nodes = config.key_server_set.snapshot().current_set; + let connections = new_test_connections(messages, *config.self_key_pair.public(), nodes.keys().cloned().collect()); + + let connection_trigger = Box::new(SimpleConnectionTrigger::with_config(&config)); + let servers_set_change_creator_connector = connection_trigger.servers_set_change_creator_connector(); + let mut sessions = ClusterSessions::new(&config, servers_set_change_creator_connector.clone()); + if config.preserve_sessions { + sessions.preserve_sessions(); + } + let sessions = Arc::new(sessions); + + let message_processor = Arc::new(SessionsMessageProcessor::new( + config.self_key_pair.clone(), + servers_set_change_creator_connector.clone(), + sessions.clone(), + connections.provider(), + )); + + ClusterCore::new(sessions, message_processor, connections, servers_set_change_creator_connector, config) +} + +impl ClusterCore { + pub fn new( + sessions: Arc, + message_processor: Arc, + connections: C, + servers_set_change_creator_connector: Arc, + config: ClusterConfiguration, + ) -> Result, Error> { + Ok(Arc::new(ClusterCore { + data: Arc::new(ClusterData { + self_key_pair: config.self_key_pair.clone(), + connections, + sessions: sessions.clone(), + config, + message_processor, + servers_set_change_creator_connector + }), + })) + } + + /// Create new client interface. + pub fn client(&self) -> Arc { + Arc::new(ClusterClientImpl::new(self.data.clone())) + } + + /// Run cluster. + pub fn run(&self) -> Result<(), Error> { + self.data.connections.connect(); + Ok(()) + } + + #[cfg(test)] + pub fn view(&self) -> Result, Error> { + let connections = self.data.connections.provider(); + let mut connected_nodes = connections.connected_nodes()?; + let disconnected_nodes = connections.disconnected_nodes(); + connected_nodes.insert(self.data.self_key_pair.public().clone()); + + let connected_nodes_count = connected_nodes.len(); + let disconnected_nodes_count = disconnected_nodes.len(); + Ok(Arc::new(ClusterView::new( + self.data.self_key_pair.clone(), + connections, + connected_nodes, + connected_nodes_count + disconnected_nodes_count))) + } +} + +impl ClusterView { + pub fn new( + self_key_pair: Arc, + connections: Arc, + nodes: BTreeSet, + configured_nodes_count: usize + ) -> Self { + ClusterView { + configured_nodes_count: configured_nodes_count, + connected_nodes: nodes, + connections, + self_key_pair, + } + } +} + +impl Cluster for ClusterView { + fn broadcast(&self, message: Message) -> Result<(), Error> { + for node in self.connected_nodes.iter().filter(|n| *n != self.self_key_pair.public()) { + trace!(target: "secretstore_net", "{}: sent message {} to {}", self.self_key_pair.public(), message, node); + let connection = self.connections.connection(node).ok_or(Error::NodeDisconnected)?; + connection.send_message(message.clone()); + } + Ok(()) + } + + fn send(&self, to: &NodeId, message: Message) -> Result<(), Error> { + trace!(target: "secretstore_net", "{}: sent message {} to {}", self.self_key_pair.public(), message, to); + let connection = self.connections.connection(to).ok_or(Error::NodeDisconnected)?; + connection.send_message(message); + Ok(()) + } + + fn is_connected(&self, node: &NodeId) -> bool { + self.connected_nodes.contains(node) + } + + fn nodes(&self) -> BTreeSet { + self.connected_nodes.clone() + } + + fn configured_nodes_count(&self) -> usize { + self.configured_nodes_count + } + + fn connected_nodes_count(&self) -> usize { + self.connected_nodes.len() + } +} + +impl ClusterClientImpl { + pub fn new(data: Arc>) -> Self { + ClusterClientImpl { + data: data, + } + } + + fn create_key_version_negotiation_session(&self, session_id: SessionId) -> Result>, Error> { + let mut connected_nodes = self.data.connections.provider().connected_nodes()?; + connected_nodes.insert(self.data.self_key_pair.public().clone()); + + let access_key = Random.generate()?.secret().clone(); + let session_id = SessionIdWithSubSession::new(session_id, access_key); + let cluster = create_cluster_view(self.data.self_key_pair.clone(), self.data.connections.provider(), false)?; + let session = self.data.sessions.negotiation_sessions.insert(cluster, self.data.self_key_pair.public().clone(), session_id.clone(), None, false, None)?; + match session.initialize(connected_nodes) { + Ok(()) => Ok(session), + Err(error) => { + self.data.sessions.negotiation_sessions.remove(&session.id()); + Err(error) + } + } + } +} + +impl ClusterClient for ClusterClientImpl { + fn new_generation_session(&self, session_id: SessionId, origin: Option
, author: Address, threshold: usize) -> Result, Error> { + let mut connected_nodes = self.data.connections.provider().connected_nodes()?; + connected_nodes.insert(self.data.self_key_pair.public().clone()); + + let cluster = create_cluster_view(self.data.self_key_pair.clone(), self.data.connections.provider(), true)?; + let session = self.data.sessions.generation_sessions.insert(cluster, self.data.self_key_pair.public().clone(), session_id, None, false, None)?; + process_initialization_result( + session.initialize(origin, author, false, threshold, connected_nodes.into()), + session, &self.data.sessions.generation_sessions) + } + + fn new_encryption_session(&self, session_id: SessionId, requester: Requester, common_point: Public, encrypted_point: Public) -> Result, Error> { + let mut connected_nodes = self.data.connections.provider().connected_nodes()?; + connected_nodes.insert(self.data.self_key_pair.public().clone()); + + let cluster = create_cluster_view(self.data.self_key_pair.clone(), self.data.connections.provider(), true)?; + let session = self.data.sessions.encryption_sessions.insert(cluster, self.data.self_key_pair.public().clone(), session_id, None, false, None)?; + process_initialization_result( + session.initialize(requester, common_point, encrypted_point), + session, &self.data.sessions.encryption_sessions) + } + + fn new_decryption_session(&self, session_id: SessionId, origin: Option
, requester: Requester, version: Option, is_shadow_decryption: bool, is_broadcast_decryption: bool) -> Result, Error> { + let mut connected_nodes = self.data.connections.provider().connected_nodes()?; + connected_nodes.insert(self.data.self_key_pair.public().clone()); + + let access_key = Random.generate()?.secret().clone(); + let session_id = SessionIdWithSubSession::new(session_id, access_key); + let cluster = create_cluster_view(self.data.self_key_pair.clone(), self.data.connections.provider(), false)?; + let session = self.data.sessions.decryption_sessions.insert(cluster, self.data.self_key_pair.public().clone(), + session_id.clone(), None, false, Some(requester))?; + + let initialization_result = match version { + Some(version) => session.initialize(origin, version, is_shadow_decryption, is_broadcast_decryption), + None => { + self.create_key_version_negotiation_session(session_id.id.clone()) + .map(|version_session| { + version_session.set_continue_action(ContinueAction::Decrypt(session.clone(), origin, is_shadow_decryption, is_broadcast_decryption)); + self.data.message_processor.try_continue_session(Some(version_session)); + }) + }, + }; + + process_initialization_result( + initialization_result, + session, &self.data.sessions.decryption_sessions) + } + + fn new_schnorr_signing_session(&self, session_id: SessionId, requester: Requester, version: Option, message_hash: H256) -> Result, Error> { + let mut connected_nodes = self.data.connections.provider().connected_nodes()?; + connected_nodes.insert(self.data.self_key_pair.public().clone()); + + let access_key = Random.generate()?.secret().clone(); + let session_id = SessionIdWithSubSession::new(session_id, access_key); + let cluster = create_cluster_view(self.data.self_key_pair.clone(), self.data.connections.provider(), false)?; + let session = self.data.sessions.schnorr_signing_sessions.insert(cluster, self.data.self_key_pair.public().clone(), session_id.clone(), None, false, Some(requester))?; + + let initialization_result = match version { + Some(version) => session.initialize(version, message_hash), + None => { + self.create_key_version_negotiation_session(session_id.id.clone()) + .map(|version_session| { + version_session.set_continue_action(ContinueAction::SchnorrSign(session.clone(), message_hash)); + self.data.message_processor.try_continue_session(Some(version_session)); + }) + }, + }; + + process_initialization_result( + initialization_result, + session, &self.data.sessions.schnorr_signing_sessions) + } + + fn new_ecdsa_signing_session(&self, session_id: SessionId, requester: Requester, version: Option, message_hash: H256) -> Result, Error> { + let mut connected_nodes = self.data.connections.provider().connected_nodes()?; + connected_nodes.insert(self.data.self_key_pair.public().clone()); + + let access_key = Random.generate()?.secret().clone(); + let session_id = SessionIdWithSubSession::new(session_id, access_key); + let cluster = create_cluster_view(self.data.self_key_pair.clone(), self.data.connections.provider(), false)?; + let session = self.data.sessions.ecdsa_signing_sessions.insert(cluster, self.data.self_key_pair.public().clone(), session_id.clone(), None, false, Some(requester))?; + + let initialization_result = match version { + Some(version) => session.initialize(version, message_hash), + None => { + self.create_key_version_negotiation_session(session_id.id.clone()) + .map(|version_session| { + version_session.set_continue_action(ContinueAction::EcdsaSign(session.clone(), message_hash)); + self.data.message_processor.try_continue_session(Some(version_session)); + }) + }, + }; + + process_initialization_result( + initialization_result, + session, &self.data.sessions.ecdsa_signing_sessions) + } + + fn new_key_version_negotiation_session(&self, session_id: SessionId) -> Result>, Error> { + let session = self.create_key_version_negotiation_session(session_id)?; + Ok(session) + } + + fn new_servers_set_change_session(&self, session_id: Option, migration_id: Option, new_nodes_set: BTreeSet, old_set_signature: Signature, new_set_signature: Signature) -> Result, Error> { + new_servers_set_change_session( + self.data.self_key_pair.clone(), + &self.data.sessions, + self.data.connections.provider(), + self.data.servers_set_change_creator_connector.clone(), + ServersSetChangeParams { + session_id, + migration_id, + new_nodes_set, + old_set_signature, + new_set_signature, + }) + } + + fn add_generation_listener(&self, listener: Arc>) { + self.data.sessions.generation_sessions.add_listener(listener); + } + + fn add_decryption_listener(&self, listener: Arc>) { + self.data.sessions.decryption_sessions.add_listener(listener); + } + + fn add_key_version_negotiation_listener(&self, listener: Arc>>) { + self.data.sessions.negotiation_sessions.add_listener(listener); + } + + #[cfg(test)] + fn make_faulty_generation_sessions(&self) { + self.data.sessions.make_faulty_generation_sessions(); + } + + #[cfg(test)] + fn generation_session(&self, session_id: &SessionId) -> Option> { + self.data.sessions.generation_sessions.get(session_id, false) + } + + #[cfg(test)] + fn is_fully_connected(&self) -> bool { + self.data.connections.provider().disconnected_nodes().is_empty() + } + + #[cfg(test)] + fn connect(&self) { + self.data.connections.connect() + } +} + +pub struct ServersSetChangeParams { + pub session_id: Option, + pub migration_id: Option, + pub new_nodes_set: BTreeSet, + pub old_set_signature: Signature, + pub new_set_signature: Signature, +} + +pub fn new_servers_set_change_session( + self_key_pair: Arc, + sessions: &ClusterSessions, + connections: Arc, + servers_set_change_creator_connector: Arc, + params: ServersSetChangeParams, +) -> Result, Error> { + let session_id = match params.session_id { + Some(session_id) if session_id == *SERVERS_SET_CHANGE_SESSION_ID => session_id, + Some(_) => return Err(Error::InvalidMessage), + None => *SERVERS_SET_CHANGE_SESSION_ID, + }; + + let cluster = create_cluster_view(self_key_pair.clone(), connections, true)?; + let creation_data = AdminSessionCreationData::ServersSetChange(params.migration_id, params.new_nodes_set.clone()); + let session = sessions.admin_sessions + .insert(cluster, *self_key_pair.public(), session_id, None, true, Some(creation_data))?; + let initialization_result = session.as_servers_set_change().expect("servers set change session is created; qed") + .initialize(params.new_nodes_set, params.old_set_signature, params.new_set_signature); + + if initialization_result.is_ok() { + servers_set_change_creator_connector.set_key_servers_set_change_session(session.clone()); + } + + process_initialization_result( + initialization_result, + session, &sessions.admin_sessions) +} + +fn process_initialization_result( + result: Result<(), Error>, + session: Arc, + sessions: &ClusterSessionsContainer +) -> Result, Error> + where + S: ClusterSession, + SC: ClusterSessionCreator +{ + match result { + Ok(()) if session.is_finished() => { + sessions.remove(&session.id()); + Ok(session) + }, + Ok(()) => Ok(session), + Err(error) => { + sessions.remove(&session.id()); + Err(error) + }, + } +} + +#[cfg(test)] +pub mod tests { + use std::sync::Arc; + use std::sync::atomic::{AtomicUsize, Ordering}; + use std::collections::{BTreeMap, BTreeSet, VecDeque}; + use parking_lot::{Mutex, RwLock}; + use ethereum_types::{Address, H256}; + use ethkey::{Random, Generator, Public, Signature, sign}; + use key_server_cluster::{NodeId, SessionId, Requester, Error, DummyAclStorage, DummyKeyStorage, + MapKeyServerSet, PlainNodeKeyPair, NodeKeyPair}; + use key_server_cluster::message::Message; + use key_server_cluster::cluster::{new_test_cluster, Cluster, ClusterCore, ClusterConfiguration, ClusterClient}; + use key_server_cluster::cluster_connections::ConnectionManager; + use key_server_cluster::cluster_connections::tests::{MessagesQueue, TestConnections}; + use key_server_cluster::cluster_sessions::{ClusterSession, ClusterSessions, AdminSession, ClusterSessionsListener}; + use key_server_cluster::generation_session::{SessionImpl as GenerationSession, + SessionState as GenerationSessionState}; + use key_server_cluster::decryption_session::{SessionImpl as DecryptionSession}; + use key_server_cluster::encryption_session::{SessionImpl as EncryptionSession}; + use key_server_cluster::signing_session_ecdsa::{SessionImpl as EcdsaSigningSession}; + use key_server_cluster::signing_session_schnorr::{SessionImpl as SchnorrSigningSession}; + use key_server_cluster::key_version_negotiation_session::{SessionImpl as KeyVersionNegotiationSession, + IsolatedSessionTransport as KeyVersionNegotiationSessionTransport}; + + #[derive(Default)] + pub struct DummyClusterClient { + pub generation_requests_count: AtomicUsize, + } + + #[derive(Debug)] + pub struct DummyCluster { + id: NodeId, + data: RwLock, + } + + #[derive(Debug, Default)] + struct DummyClusterData { + nodes: BTreeSet, + messages: VecDeque<(NodeId, Message)>, + } + + impl ClusterClient for DummyClusterClient { + fn new_generation_session(&self, _session_id: SessionId, _origin: Option
, _author: Address, _threshold: usize) -> Result, Error> { + self.generation_requests_count.fetch_add(1, Ordering::Relaxed); + Err(Error::Internal("test-error".into())) + } + fn new_encryption_session(&self, _session_id: SessionId, _requester: Requester, _common_point: Public, _encrypted_point: Public) -> Result, Error> { unimplemented!("test-only") } + fn new_decryption_session(&self, _session_id: SessionId, _origin: Option
, _requester: Requester, _version: Option, _is_shadow_decryption: bool, _is_broadcast_session: bool) -> Result, Error> { unimplemented!("test-only") } + fn new_schnorr_signing_session(&self, _session_id: SessionId, _requester: Requester, _version: Option, _message_hash: H256) -> Result, Error> { unimplemented!("test-only") } + fn new_ecdsa_signing_session(&self, _session_id: SessionId, _requester: Requester, _version: Option, _message_hash: H256) -> Result, Error> { unimplemented!("test-only") } + + fn new_key_version_negotiation_session(&self, _session_id: SessionId) -> Result>, Error> { unimplemented!("test-only") } + fn new_servers_set_change_session(&self, _session_id: Option, _migration_id: Option, _new_nodes_set: BTreeSet, _old_set_signature: Signature, _new_set_signature: Signature) -> Result, Error> { unimplemented!("test-only") } + + fn add_generation_listener(&self, _listener: Arc>) {} + fn add_decryption_listener(&self, _listener: Arc>) {} + fn add_key_version_negotiation_listener(&self, _listener: Arc>>) {} + + fn make_faulty_generation_sessions(&self) { unimplemented!("test-only") } + fn generation_session(&self, _session_id: &SessionId) -> Option> { unimplemented!("test-only") } + fn is_fully_connected(&self) -> bool { true } + fn connect(&self) {} + } + + impl DummyCluster { + pub fn new(id: NodeId) -> Self { + DummyCluster { + id: id, + data: RwLock::new(DummyClusterData::default()) + } + } + + pub fn node(&self) -> NodeId { + self.id.clone() + } + + pub fn add_node(&self, node: NodeId) { + self.data.write().nodes.insert(node); + } + + pub fn add_nodes>(&self, nodes: I) { + self.data.write().nodes.extend(nodes) + } + + pub fn remove_node(&self, node: &NodeId) { + self.data.write().nodes.remove(node); + } + + pub fn take_message(&self) -> Option<(NodeId, Message)> { + self.data.write().messages.pop_front() + } + } + + impl Cluster for DummyCluster { + fn broadcast(&self, message: Message) -> Result<(), Error> { + let mut data = self.data.write(); + let all_nodes: Vec<_> = data.nodes.iter().cloned().filter(|n| n != &self.id).collect(); + for node in all_nodes { + data.messages.push_back((node, message.clone())); + } + Ok(()) + } + + fn send(&self, to: &NodeId, message: Message) -> Result<(), Error> { + debug_assert!(&self.id != to); + self.data.write().messages.push_back((to.clone(), message)); + Ok(()) + } + + fn is_connected(&self, node: &NodeId) -> bool { + let data = self.data.read(); + &self.id == node || data.nodes.contains(node) + } + + fn nodes(&self) -> BTreeSet { + self.data.read().nodes.iter().cloned().collect() + } + + fn configured_nodes_count(&self) -> usize { + self.data.read().nodes.len() + } + + fn connected_nodes_count(&self) -> usize { + self.data.read().nodes.len() + } + } + + /// Test message loop. + pub struct MessageLoop { + messages: MessagesQueue, + preserve_sessions: bool, + key_pairs_map: BTreeMap>, + acl_storages_map: BTreeMap>, + key_storages_map: BTreeMap>, + clusters_map: BTreeMap>>>, + } + + impl ::std::fmt::Debug for MessageLoop { + fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "MessageLoop({})", self.clusters_map.len()) + } + } + + impl MessageLoop { + /// Returns set of all nodes ids. + pub fn nodes(&self) -> BTreeSet { + self.clusters_map.keys().cloned().collect() + } + + /// Returns nodes id by its index. + pub fn node(&self, idx: usize) -> NodeId { + *self.clusters_map.keys().nth(idx).unwrap() + } + + /// Returns key pair of the node by its idx. + pub fn node_key_pair(&self, idx: usize) -> &Arc { + self.key_pairs_map.values().nth(idx).unwrap() + } + + /// Get cluster reference by its index. + pub fn cluster(&self, idx: usize) -> &Arc>> { + self.clusters_map.values().nth(idx).unwrap() + } + + /// Get keys storage reference by its index. + pub fn key_storage(&self, idx: usize) -> &Arc { + self.key_storages_map.values().nth(idx).unwrap() + } + + /// Get keys storage reference by node id. + pub fn key_storage_of(&self, node: &NodeId) -> &Arc { + &self.key_storages_map[node] + } + + /// Replace key storage of the node by its id. + pub fn replace_key_storage_of(&mut self, node: &NodeId, key_storage: Arc) { + *self.key_storages_map.get_mut(node).unwrap() = key_storage; + } + + /// Get ACL storage reference by its index. + pub fn acl_storage(&self, idx: usize) -> &Arc { + self.acl_storages_map.values().nth(idx).unwrap() + } + + /// Get sessions container reference by its index. + pub fn sessions(&self, idx: usize) -> &Arc { + &self.cluster(idx).data.sessions + } + + /// Get sessions container reference by node id. + pub fn sessions_of(&self, node: &NodeId) -> &Arc { + &self.clusters_map[node].data.sessions + } + + /// Isolate node from others. + pub fn isolate(&self, idx: usize) { + let node = self.node(idx); + for (i, cluster) in self.clusters_map.values().enumerate() { + if i == idx { + cluster.data.connections.isolate(); + } else { + cluster.data.connections.disconnect(node); + } + } + } + + /// Exclude node from cluster. + pub fn exclude(&mut self, idx: usize) { + let node = self.node(idx); + for (i, cluster) in self.clusters_map.values().enumerate() { + if i != idx { + cluster.data.connections.exclude(node); + } + } + self.key_storages_map.remove(&node); + self.acl_storages_map.remove(&node); + self.key_pairs_map.remove(&node); + self.clusters_map.remove(&node); + } + + /// Include new node to the cluster. + pub fn include(&mut self, node_key_pair: Arc) -> usize { + let key_storage = Arc::new(DummyKeyStorage::default()); + let acl_storage = Arc::new(DummyAclStorage::default()); + let cluster_params = ClusterConfiguration { + self_key_pair: node_key_pair.clone(), + key_server_set: Arc::new(MapKeyServerSet::new(false, self.nodes().iter() + .chain(::std::iter::once(node_key_pair.public())) + .map(|n| (*n, format!("127.0.0.1:{}", 13).parse().unwrap())) + .collect())), + key_storage: key_storage.clone(), + acl_storage: acl_storage.clone(), + admin_public: None, + preserve_sessions: self.preserve_sessions, + }; + let cluster = new_test_cluster(self.messages.clone(), cluster_params).unwrap(); + + for cluster in self.clusters_map.values(){ + cluster.data.connections.include(node_key_pair.public().clone()); + } + self.acl_storages_map.insert(*node_key_pair.public(), acl_storage); + self.key_storages_map.insert(*node_key_pair.public(), key_storage); + self.clusters_map.insert(*node_key_pair.public(), cluster); + self.key_pairs_map.insert(*node_key_pair.public(), node_key_pair.clone()); + self.clusters_map.keys().position(|k| k == node_key_pair.public()).unwrap() + } + + /// Is empty message queue? + pub fn is_empty(&self) -> bool { + self.messages.lock().is_empty() + } + + /// Takes next message from the queue. + pub fn take_message(&self) -> Option<(NodeId, NodeId, Message)> { + self.messages.lock().pop_front() + } + + /// Process single message. + pub fn process_message(&self, from: NodeId, to: NodeId, message: Message) { + let cluster_data = &self.clusters_map[&to].data; + let connection = cluster_data.connections.provider().connection(&from).unwrap(); + cluster_data.message_processor.process_connection_message(connection, message); + } + + /// Take next message and process it. + pub fn take_and_process_message(&self) -> bool { + let (from, to, message) = match self.take_message() { + Some((from, to, message)) => (from, to, message), + None => return false, + }; + + self.process_message(from, to, message); + true + } + + /// Loops until `predicate` returns `true` or there are no messages in the queue. + pub fn loop_until(&self, predicate: F) where F: Fn() -> bool { + while !predicate() { + if !self.take_and_process_message() { + panic!("message queue is empty but goal is not achieved"); + } + } + } + } + + pub fn make_clusters(num_nodes: usize) -> MessageLoop { + do_make_clusters(num_nodes, false) + } + + pub fn make_clusters_and_preserve_sessions(num_nodes: usize) -> MessageLoop { + do_make_clusters(num_nodes, true) + } + + fn do_make_clusters(num_nodes: usize, preserve_sessions: bool) -> MessageLoop { + let ports_begin = 0; + let messages = Arc::new(Mutex::new(VecDeque::new())); + let key_pairs: Vec<_> = (0..num_nodes) + .map(|_| Arc::new(PlainNodeKeyPair::new(Random.generate().unwrap()))).collect(); + let key_storages: Vec<_> = (0..num_nodes).map(|_| Arc::new(DummyKeyStorage::default())).collect(); + let acl_storages: Vec<_> = (0..num_nodes).map(|_| Arc::new(DummyAclStorage::default())).collect(); + let cluster_params: Vec<_> = (0..num_nodes).map(|i| ClusterConfiguration { + self_key_pair: key_pairs[i].clone(), + key_server_set: Arc::new(MapKeyServerSet::new(false, key_pairs.iter().enumerate() + .map(|(j, kp)| (*kp.public(), format!("127.0.0.1:{}", ports_begin + j as u16).parse().unwrap())) + .collect())), + key_storage: key_storages[i].clone(), + acl_storage: acl_storages[i].clone(), + admin_public: None, + preserve_sessions, + }).collect(); + let clusters: Vec<_> = cluster_params.into_iter() + .map(|params| new_test_cluster(messages.clone(), params).unwrap()) + .collect(); + + let clusters_map = clusters.iter().map(|c| (*c.data.config.self_key_pair.public(), c.clone())).collect(); + let key_pairs_map = key_pairs.into_iter().map(|kp| (*kp.public(), kp)).collect(); + let key_storages_map = clusters.iter().zip(key_storages.into_iter()) + .map(|(c, ks)| (*c.data.config.self_key_pair.public(), ks)).collect(); + let acl_storages_map = clusters.iter().zip(acl_storages.into_iter()) + .map(|(c, acls)| (*c.data.config.self_key_pair.public(), acls)).collect(); + MessageLoop { preserve_sessions, messages, key_pairs_map, acl_storages_map, key_storages_map, clusters_map } + } + + #[test] + fn cluster_wont_start_generation_session_if_not_fully_connected() { + let ml = make_clusters(3); + ml.cluster(0).data.connections.disconnect(*ml.cluster(0).data.self_key_pair.public()); + match ml.cluster(0).client().new_generation_session(SessionId::default(), Default::default(), Default::default(), 1) { + Err(Error::NodeDisconnected) => (), + Err(e) => panic!("unexpected error {:?}", e), + _ => panic!("unexpected success"), + } + } + + #[test] + fn error_in_generation_session_broadcasted_to_all_other_nodes() { + let _ = ::env_logger::try_init(); + let ml = make_clusters(3); + + // ask one of nodes to produce faulty generation sessions + ml.cluster(1).client().make_faulty_generation_sessions(); + + // start && wait for generation session to fail + let session = ml.cluster(0).client() + .new_generation_session(SessionId::default(), Default::default(), Default::default(), 1).unwrap(); + ml.loop_until(|| session.joint_public_and_secret().is_some() + && ml.cluster(0).client().generation_session(&SessionId::default()).is_none()); + assert!(session.joint_public_and_secret().unwrap().is_err()); + + // check that faulty session is either removed from all nodes, or nonexistent (already removed) + for i in 1..3 { + if let Some(session) = ml.cluster(i).client().generation_session(&SessionId::default()) { + // wait for both session completion && session removal (session completion event is fired + // before session is removed from its own container by cluster) + ml.loop_until(|| session.joint_public_and_secret().is_some() + && ml.cluster(i).client().generation_session(&SessionId::default()).is_none()); + assert!(session.joint_public_and_secret().unwrap().is_err()); + } + } + } + + #[test] + fn generation_session_completion_signalled_if_failed_on_master() { + let _ = ::env_logger::try_init(); + let ml = make_clusters(3); + + // ask one of nodes to produce faulty generation sessions + ml.cluster(0).client().make_faulty_generation_sessions(); + + // start && wait for generation session to fail + let session = ml.cluster(0).client() + .new_generation_session(SessionId::default(), Default::default(), Default::default(), 1).unwrap(); + ml.loop_until(|| session.joint_public_and_secret().is_some() + && ml.cluster(0).client().generation_session(&SessionId::default()).is_none()); + assert!(session.joint_public_and_secret().unwrap().is_err()); + + // check that faulty session is either removed from all nodes, or nonexistent (already removed) + for i in 1..3 { + if let Some(session) = ml.cluster(i).client().generation_session(&SessionId::default()) { + let session = session.clone(); + // wait for both session completion && session removal (session completion event is fired + // before session is removed from its own container by cluster) + ml.loop_until(|| session.joint_public_and_secret().is_some() + && ml.cluster(i).client().generation_session(&SessionId::default()).is_none()); + assert!(session.joint_public_and_secret().unwrap().is_err()); + } + } + } + + #[test] + fn generation_session_is_removed_when_succeeded() { + let _ = ::env_logger::try_init(); + let ml = make_clusters(3); + + // start && wait for generation session to complete + let session = ml.cluster(0).client() + .new_generation_session(SessionId::default(), Default::default(), Default::default(), 1).unwrap(); + ml.loop_until(|| (session.state() == GenerationSessionState::Finished + || session.state() == GenerationSessionState::Failed) + && ml.cluster(0).client().generation_session(&SessionId::default()).is_none()); + assert!(session.joint_public_and_secret().unwrap().is_ok()); + + // check that on non-master nodes session is either: + // already removed + // or it is removed right after completion + for i in 1..3 { + if let Some(session) = ml.cluster(i).client().generation_session(&SessionId::default()) { + // run to completion if completion message is still on the way + // AND check that it is actually removed from cluster sessions + ml.loop_until(|| (session.state() == GenerationSessionState::Finished + || session.state() == GenerationSessionState::Failed) + && ml.cluster(i).client().generation_session(&SessionId::default()).is_none()); + } + } + } + + #[test] + fn sessions_are_removed_when_initialization_fails() { + let ml = make_clusters(3); + let client = ml.cluster(0).client(); + + // generation session + { + // try to start generation session => fail in initialization + assert_eq!( + client.new_generation_session(SessionId::default(), None, Default::default(), 100).map(|_| ()), + Err(Error::NotEnoughNodesForThreshold)); + + // try to start generation session => fails in initialization + assert_eq!( + client.new_generation_session(SessionId::default(), None, Default::default(), 100).map(|_| ()), + Err(Error::NotEnoughNodesForThreshold)); + + assert!(ml.cluster(0).data.sessions.generation_sessions.is_empty()); + } + + // decryption session + { + // try to start decryption session => fails in initialization + assert_eq!( + client.new_decryption_session( + Default::default(), Default::default(), Default::default(), Some(Default::default()), false, false + ).map(|_| ()), + Err(Error::InvalidMessage)); + + // try to start generation session => fails in initialization + assert_eq!( + client.new_decryption_session( + Default::default(), Default::default(), Default::default(), Some(Default::default()), false, false + ).map(|_| ()), + Err(Error::InvalidMessage)); + + assert!(ml.cluster(0).data.sessions.decryption_sessions.is_empty()); + assert!(ml.cluster(0).data.sessions.negotiation_sessions.is_empty()); + } + } + + #[test] + fn schnorr_signing_session_completes_if_node_does_not_have_a_share() { + let _ = ::env_logger::try_init(); + let ml = make_clusters(3); + + // start && wait for generation session to complete + let session = ml.cluster(0).client(). + new_generation_session(SessionId::default(), Default::default(), Default::default(), 1).unwrap(); + ml.loop_until(|| (session.state() == GenerationSessionState::Finished + || session.state() == GenerationSessionState::Failed) + && ml.cluster(0).client().generation_session(&SessionId::default()).is_none()); + assert!(session.joint_public_and_secret().unwrap().is_ok()); + + // now remove share from node2 + assert!((0..3).all(|i| ml.cluster(i).data.sessions.generation_sessions.is_empty())); + ml.cluster(2).data.config.key_storage.remove(&Default::default()).unwrap(); + + // and try to sign message with generated key + let signature = sign(Random.generate().unwrap().secret(), &Default::default()).unwrap(); + let session0 = ml.cluster(0).client() + .new_schnorr_signing_session(Default::default(), signature.into(), None, Default::default()).unwrap(); + let session = ml.cluster(0).data.sessions.schnorr_signing_sessions.first().unwrap(); + + ml.loop_until(|| session.is_finished() && (0..3).all(|i| + ml.cluster(i).data.sessions.schnorr_signing_sessions.is_empty())); + session0.wait().unwrap(); + + // and try to sign message with generated key using node that has no key share + let signature = sign(Random.generate().unwrap().secret(), &Default::default()).unwrap(); + let session2 = ml.cluster(2).client() + .new_schnorr_signing_session(Default::default(), signature.into(), None, Default::default()).unwrap(); + let session = ml.cluster(2).data.sessions.schnorr_signing_sessions.first().unwrap(); + + ml.loop_until(|| session.is_finished() && (0..3).all(|i| + ml.cluster(i).data.sessions.schnorr_signing_sessions.is_empty())); + session2.wait().unwrap(); + + // now remove share from node1 + ml.cluster(1).data.config.key_storage.remove(&Default::default()).unwrap(); + + // and try to sign message with generated key + let signature = sign(Random.generate().unwrap().secret(), &Default::default()).unwrap(); + let session1 = ml.cluster(0).client() + .new_schnorr_signing_session(Default::default(), signature.into(), None, Default::default()).unwrap(); + let session = ml.cluster(0).data.sessions.schnorr_signing_sessions.first().unwrap(); + + ml.loop_until(|| session.is_finished()); + session1.wait().unwrap_err(); + } + + #[test] + fn ecdsa_signing_session_completes_if_node_does_not_have_a_share() { + let _ = ::env_logger::try_init(); + let ml = make_clusters(4); + + // start && wait for generation session to complete + let session = ml.cluster(0).client() + .new_generation_session(SessionId::default(), Default::default(), Default::default(), 1).unwrap(); + ml.loop_until(|| (session.state() == GenerationSessionState::Finished + || session.state() == GenerationSessionState::Failed) + && ml.cluster(0).client().generation_session(&SessionId::default()).is_none()); + assert!(session.joint_public_and_secret().unwrap().is_ok()); + + // now remove share from node2 + assert!((0..3).all(|i| ml.cluster(i).data.sessions.generation_sessions.is_empty())); + ml.cluster(2).data.config.key_storage.remove(&Default::default()).unwrap(); + + // and try to sign message with generated key + let signature = sign(Random.generate().unwrap().secret(), &Default::default()).unwrap(); + let session0 = ml.cluster(0).client() + .new_ecdsa_signing_session(Default::default(), signature.into(), None, H256::random()).unwrap(); + let session = ml.cluster(0).data.sessions.ecdsa_signing_sessions.first().unwrap(); + + ml.loop_until(|| session.is_finished() && (0..3).all(|i| + ml.cluster(i).data.sessions.ecdsa_signing_sessions.is_empty())); + session0.wait().unwrap(); + + // and try to sign message with generated key using node that has no key share + let signature = sign(Random.generate().unwrap().secret(), &Default::default()).unwrap(); + let session2 = ml.cluster(2).client() + .new_ecdsa_signing_session(Default::default(), signature.into(), None, H256::random()).unwrap(); + let session = ml.cluster(2).data.sessions.ecdsa_signing_sessions.first().unwrap(); + ml.loop_until(|| session.is_finished() && (0..3).all(|i| + ml.cluster(i).data.sessions.ecdsa_signing_sessions.is_empty())); + session2.wait().unwrap(); + + // now remove share from node1 + ml.cluster(1).data.config.key_storage.remove(&Default::default()).unwrap(); + + // and try to sign message with generated key + let signature = sign(Random.generate().unwrap().secret(), &Default::default()).unwrap(); + let session1 = ml.cluster(0).client() + .new_ecdsa_signing_session(Default::default(), signature.into(), None, H256::random()).unwrap(); + let session = ml.cluster(0).data.sessions.ecdsa_signing_sessions.first().unwrap(); + ml.loop_until(|| session.is_finished()); + session1.wait().unwrap_err(); + } +} diff --git a/secret-store/src/key_server_cluster/cluster_connections.rs b/secret-store/src/key_server_cluster/cluster_connections.rs new file mode 100644 index 00000000000..b484e6d8e0b --- /dev/null +++ b/secret-store/src/key_server_cluster/cluster_connections.rs @@ -0,0 +1,176 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::collections::BTreeSet; +use std::sync::Arc; +use key_server_cluster::{Error, NodeId}; +use key_server_cluster::message::Message; + +/// Connection to the single node. Provides basic information about connected node and +/// allows sending messages to this node. +pub trait Connection: Send + Sync { + /// Is this inbound connection? This only matters when both nodes are simultaneously establishing + /// two connections to each other. The agreement is that the inbound connection from the node with + /// lower NodeId is used and the other connection is closed. + fn is_inbound(&self) -> bool; + /// Returns id of the connected node. + fn node_id(&self) -> &NodeId; + /// Returns 'address' of the node to use in traces. + fn node_address(&self) -> String; + /// Send message to the connected node. + fn send_message(&self, message: Message); +} + +/// Connections manager. Responsible for keeping us connected to all required nodes. +pub trait ConnectionManager: 'static + Send + Sync { + /// Returns shared reference to connections provider. + fn provider(&self) -> Arc; + /// Try to reach all disconnected nodes immediately. This method is exposed mostly for + /// tests, where all 'nodes' are starting listening for incoming connections first and + /// only after this, they're actually start connecting to each other. + fn connect(&self); +} + +/// Connections provider. Holds all active connections and the set of nodes that we need to +/// connect to. At any moment connection could be lost and the set of connected/disconnected +/// nodes could change (at behalf of the connection manager). +/// Clone operation should be cheap (Arc). +pub trait ConnectionProvider: Send + Sync { + /// Returns the set of currently connected nodes. Error is returned when our node is + /// not a part of the cluster ('isolated' node). + fn connected_nodes(&self) -> Result, Error>; + /// Returns the set of currently disconnected nodes. + fn disconnected_nodes(&self) -> BTreeSet; + /// Returns the reference to the active node connection or None if the node is not connected. + fn connection(&self, node: &NodeId) -> Option>; +} + +#[cfg(test)] +pub mod tests { + use std::collections::{BTreeSet, VecDeque}; + use std::sync::Arc; + use std::sync::atomic::{AtomicBool, Ordering}; + use parking_lot::Mutex; + use key_server_cluster::{Error, NodeId}; + use key_server_cluster::message::Message; + use super::{ConnectionManager, Connection, ConnectionProvider}; + + /// Shared messages queue. + pub type MessagesQueue = Arc>>; + + /// Single node connections. + pub struct TestConnections { + node: NodeId, + is_isolated: AtomicBool, + connected_nodes: Mutex>, + disconnected_nodes: Mutex>, + messages: MessagesQueue, + } + + /// Single connection. + pub struct TestConnection { + from: NodeId, + to: NodeId, + messages: MessagesQueue, + } + + impl TestConnections { + pub fn isolate(&self) { + let connected_nodes = ::std::mem::replace(&mut *self.connected_nodes.lock(), Default::default()); + self.is_isolated.store(true, Ordering::Relaxed); + self.disconnected_nodes.lock().extend(connected_nodes) + } + + pub fn disconnect(&self, node: NodeId) { + self.connected_nodes.lock().remove(&node); + self.disconnected_nodes.lock().insert(node); + } + + pub fn exclude(&self, node: NodeId) { + self.connected_nodes.lock().remove(&node); + self.disconnected_nodes.lock().remove(&node); + } + + pub fn include(&self, node: NodeId) { + self.connected_nodes.lock().insert(node); + } + } + + impl ConnectionManager for Arc { + fn provider(&self) -> Arc { + self.clone() + } + + fn connect(&self) {} + } + + impl ConnectionProvider for TestConnections { + fn connected_nodes(&self) -> Result, Error> { + match self.is_isolated.load(Ordering::Relaxed) { + false => Ok(self.connected_nodes.lock().clone()), + true => Err(Error::NodeDisconnected), + } + } + + fn disconnected_nodes(&self) -> BTreeSet { + self.disconnected_nodes.lock().clone() + } + + fn connection(&self, node: &NodeId) -> Option> { + match self.connected_nodes.lock().contains(node) { + true => Some(Arc::new(TestConnection { + from: self.node, + to: *node, + messages: self.messages.clone(), + })), + false => None, + } + } + } + + impl Connection for TestConnection { + fn is_inbound(&self) -> bool { + false + } + + fn node_id(&self) -> &NodeId { + &self.to + } + + fn node_address(&self) -> String { + format!("{}", self.to) + } + + fn send_message(&self, message: Message) { + self.messages.lock().push_back((self.from, self.to, message)) + } + } + + pub fn new_test_connections( + messages: MessagesQueue, + node: NodeId, + mut nodes: BTreeSet + ) -> Arc { + let is_isolated = !nodes.remove(&node); + Arc::new(TestConnections { + node, + is_isolated: AtomicBool::new(is_isolated), + connected_nodes: Mutex::new(nodes), + disconnected_nodes: Default::default(), + messages, + }) + } +} diff --git a/secret-store/src/key_server_cluster/cluster_connections_net.rs b/secret-store/src/key_server_cluster/cluster_connections_net.rs new file mode 100644 index 00000000000..bda7f7dd283 --- /dev/null +++ b/secret-store/src/key_server_cluster/cluster_connections_net.rs @@ -0,0 +1,539 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::collections::{BTreeMap, BTreeSet}; +use std::collections::btree_map::Entry; +use std::io; +use std::net::{SocketAddr, IpAddr}; +use std::sync::Arc; +use std::time::{Duration, Instant}; +use futures::{future, Future, Stream}; +use parking_lot::{Mutex, RwLock}; +use tokio::net::{TcpListener, TcpStream}; +use tokio::timer::{Interval, timeout::Error as TimeoutError}; +use tokio_io::IoFuture; +use ethkey::KeyPair; +use parity_runtime::Executor; +use key_server_cluster::{Error, NodeId, ClusterConfiguration, NodeKeyPair}; +use key_server_cluster::cluster_connections::{ConnectionProvider, Connection, ConnectionManager}; +use key_server_cluster::connection_trigger::{Maintain, ConnectionTrigger}; +use key_server_cluster::cluster_message_processor::MessageProcessor; +use key_server_cluster::io::{DeadlineStatus, ReadMessage, SharedTcpStream, + read_encrypted_message, WriteMessage, write_encrypted_message}; +use key_server_cluster::message::{self, ClusterMessage, Message}; +use key_server_cluster::net::{accept_connection as io_accept_connection, + connect as io_connect, Connection as IoConnection}; + +/// Empty future. +pub type BoxedEmptyFuture = Box + Send>; + +/// Maintain interval (seconds). Every MAINTAIN_INTERVAL seconds node: +/// 1) checks if connected nodes are responding to KeepAlive messages +/// 2) tries to connect to disconnected nodes +/// 3) checks if enc/dec sessions are time-outed +const MAINTAIN_INTERVAL: u64 = 10; + +/// When no messages have been received from node within KEEP_ALIVE_SEND_INTERVAL seconds, +/// we must send KeepAlive message to the node to check if it still responds to messages. +const KEEP_ALIVE_SEND_INTERVAL: Duration = Duration::from_secs(30); +/// When no messages have been received from node within KEEP_ALIVE_DISCONNECT_INTERVAL seconds, +/// we must treat this node as non-responding && disconnect from it. +const KEEP_ALIVE_DISCONNECT_INTERVAL: Duration = Duration::from_secs(60); + +/// Network connection manager configuration. +pub struct NetConnectionsManagerConfig { + /// Allow connecting to 'higher' nodes. + pub allow_connecting_to_higher_nodes: bool, + /// Interface to listen to. + pub listen_address: (String, u16), + /// True if we should autostart key servers set change session when servers set changes? + /// This will only work when servers set is configured using KeyServerSet contract. + pub auto_migrate_enabled: bool, +} + +/// Network connections manager. +pub struct NetConnectionsManager { + /// Address we're listening for incoming connections. + listen_address: SocketAddr, + /// Shared cluster connections data reference. + data: Arc, +} + +/// Network connections data. Shared among NetConnectionsManager and spawned futures. +struct NetConnectionsData { + /// Allow connecting to 'higher' nodes. + allow_connecting_to_higher_nodes: bool, + /// Reference to tokio task executor. + executor: Executor, + /// Key pair of this node. + self_key_pair: Arc, + /// Network messages processor. + message_processor: Arc, + /// Connections trigger. + trigger: Mutex>, + /// Mutable connection data. + container: Arc>, +} + +/// Network connections container. This is the only mutable data of NetConnectionsManager. +/// The set of nodes is mutated by the connection trigger and the connections set is also +/// mutated by spawned futures. +pub struct NetConnectionsContainer { + /// Is this node isolated from cluster? + pub is_isolated: bool, + /// Current key servers set. + pub nodes: BTreeMap, + /// Active connections to key servers. + pub connections: BTreeMap>, +} + +/// Network connection to single key server node. +pub struct NetConnection { + executor: Executor, + /// Id of the peer node. + node_id: NodeId, + /// Address of the peer node. + node_address: SocketAddr, + /// Is this inbound (true) or outbound (false) connection? + is_inbound: bool, + /// Key pair that is used to encrypt connection' messages. + key: KeyPair, + /// Last message time. + last_message_time: RwLock, + /// Underlying TCP stream. + stream: SharedTcpStream, +} + +impl NetConnectionsManager { + /// Create new network connections manager. + pub fn new( + executor: Executor, + message_processor: Arc, + trigger: Box, + container: Arc>, + config: &ClusterConfiguration, + net_config: NetConnectionsManagerConfig, + ) -> Result { + let listen_address = make_socket_address( + &net_config.listen_address.0, + net_config.listen_address.1)?; + + Ok(NetConnectionsManager { + listen_address, + data: Arc::new(NetConnectionsData { + allow_connecting_to_higher_nodes: net_config.allow_connecting_to_higher_nodes, + executor, + message_processor, + self_key_pair: config.self_key_pair.clone(), + trigger: Mutex::new(trigger), + container, + }), + }) + } + + /// Start listening for connections and schedule connections maintenance. + pub fn start(&self) -> Result<(), Error> { + net_listen(&self.listen_address, self.data.clone())?; + net_schedule_maintain(self.data.clone()); + Ok(()) + } +} + +impl ConnectionManager for NetConnectionsManager { + fn provider(&self) -> Arc { + self.data.container.clone() + } + + fn connect(&self) { + net_connect_disconnected(self.data.clone()); + } +} + +impl ConnectionProvider for RwLock { + fn connected_nodes(&self) -> Result, Error> { + let connections = self.read(); + if connections.is_isolated { + return Err(Error::NodeDisconnected); + } + + Ok(connections.connections.keys().cloned().collect()) + } + + fn disconnected_nodes(&self) -> BTreeSet { + let connections = self.read(); + connections.nodes.keys() + .filter(|node_id| !connections.connections.contains_key(node_id)) + .cloned() + .collect() + } + + fn connection(&self, node: &NodeId) -> Option> { + match self.read().connections.get(node).cloned() { + Some(connection) => Some(connection), + None => None, + } + } +} + +impl NetConnection { + /// Create new connection. + pub fn new(executor: Executor, is_inbound: bool, connection: IoConnection) -> NetConnection { + NetConnection { + executor, + node_id: connection.node_id, + node_address: connection.address, + is_inbound: is_inbound, + stream: connection.stream, + key: connection.key, + last_message_time: RwLock::new(Instant::now()), + } + } + + /// Get last message time. + pub fn last_message_time(&self) -> Instant { + *self.last_message_time.read() + } + + /// Update last message time + pub fn set_last_message_time(&self, last_message_time: Instant) { + *self.last_message_time.write() = last_message_time + } + + /// Returns future that sends encrypted message over this connection. + pub fn send_message_future(&self, message: Message) -> WriteMessage { + write_encrypted_message(self.stream.clone(), &self.key, message) + } + + /// Returns future that reads encrypted message from this connection. + pub fn read_message_future(&self) -> ReadMessage { + read_encrypted_message(self.stream.clone(), self.key.clone()) + } +} + +impl Connection for NetConnection { + fn is_inbound(&self) -> bool { + self.is_inbound + } + + fn node_id(&self) -> &NodeId { + &self.node_id + } + + fn node_address(&self) -> String { + format!("{}", self.node_address) + } + + fn send_message(&self, message: Message) { + execute(&self.executor, self.send_message_future(message).then(|_| Ok(()))); + } +} + +impl NetConnectionsData { + /// Executes closure for each active connection. + pub fn active_connections(&self) -> Vec> { + self.container.read().connections.values().cloned().collect() + } + + /// Executes closure for each disconnected node. + pub fn disconnected_nodes(&self) -> Vec<(NodeId, SocketAddr)> { + let container = self.container.read(); + container.nodes.iter() + .filter(|(node_id, _)| !container.connections.contains_key(node_id)) + .map(|(node_id, addr)| (*node_id, *addr)) + .collect() + } + + /// Try to insert new connection. Returns true if connection has been inserted. + /// Returns false (and ignores connections) if: + /// - we do not expect connection from this node + /// - we are already connected to the node and existing connection 'supersede' + /// new connection by agreement + pub fn insert(&self, connection: Arc) -> bool { + let node = *connection.node_id(); + let mut container = self.container.write(); + if !container.nodes.contains_key(&node) { + trace!(target: "secretstore_net", "{}: ignoring unknown connection from {} at {}", + self.self_key_pair.public(), node, connection.node_address()); + return false; + } + + if container.connections.contains_key(&node) { + // we have already connected to the same node + // the agreement is that node with lower id must establish connection to node with higher id + if (*self.self_key_pair.public() < node && connection.is_inbound()) + || (*self.self_key_pair.public() > node && !connection.is_inbound()) { + return false; + } + } + + trace!(target: "secretstore_net", + "{}: inserting connection to {} at {}. Connected to {} of {} nodes", + self.self_key_pair.public(), node, connection.node_address(), + container.connections.len() + 1, container.nodes.len()); + container.connections.insert(node, connection); + + true + } + + /// Tries to remove connection. Returns true if connection has been removed. + /// Returns false if we do not know this connection. + pub fn remove(&self, connection: &NetConnection) -> bool { + let node_id = *connection.node_id(); + let is_inbound = connection.is_inbound(); + let mut container = self.container.write(); + if let Entry::Occupied(entry) = container.connections.entry(node_id) { + if entry.get().is_inbound() != is_inbound { + return false; + } + + trace!(target: "secretstore_net", "{}: removing connection to {} at {}", + self.self_key_pair.public(), node_id, entry.get().node_address()); + entry.remove_entry(); + + true + } else { + false + } + } +} + +/// Listen incoming connections. +fn net_listen( + listen_address: &SocketAddr, + data: Arc, +) -> Result<(), Error> { + execute(&data.executor, net_listen_future(listen_address, data.clone())?); + Ok(()) +} + +/// Listen incoming connections future. +fn net_listen_future( + listen_address: &SocketAddr, + data: Arc, +) -> Result { + Ok(Box::new(TcpListener::bind(listen_address)? + .incoming() + .and_then(move |stream| { + net_accept_connection(data.clone(), stream); + Ok(()) + }) + .for_each(|_| Ok(())) + .then(|_| future::ok(())))) +} + +/// Accept incoming connection. +fn net_accept_connection( + data: Arc, + stream: TcpStream, +) { + execute(&data.executor, net_accept_connection_future(data.clone(), stream)); +} + +/// Accept incoming connection future. +fn net_accept_connection_future(data: Arc, stream: TcpStream) -> BoxedEmptyFuture { + Box::new(io_accept_connection(stream, data.self_key_pair.clone()) + .then(move |result| net_process_connection_result(data, None, result)) + .then(|_| future::ok(()))) +} + +/// Connect to remote node. +fn net_connect( + data: Arc, + remote: SocketAddr, +) { + execute(&data.executor, net_connect_future(data.clone(), remote)); +} + +/// Connect to remote node future. +fn net_connect_future( + data: Arc, + remote: SocketAddr, +) -> BoxedEmptyFuture { + let disconnected_nodes = data.container.disconnected_nodes(); + Box::new(io_connect(&remote, data.self_key_pair.clone(), disconnected_nodes) + .then(move |result| net_process_connection_result(data, Some(remote), result)) + .then(|_| future::ok(()))) +} + +/// Process network connection result. +fn net_process_connection_result( + data: Arc, + outbound_addr: Option, + result: Result>, TimeoutError>, +) -> IoFuture> { + match result { + Ok(DeadlineStatus::Meet(Ok(connection))) => { + let connection = Arc::new(NetConnection::new(data.executor.clone(), outbound_addr.is_none(), connection)); + if data.insert(connection.clone()) { + let maintain_action = data.trigger.lock().on_connection_established(connection.node_id()); + maintain_connection_trigger(data.clone(), maintain_action); + + return net_process_connection_messages(data, connection); + } + }, + Ok(DeadlineStatus::Meet(Err(err))) => { + warn!(target: "secretstore_net", "{}: protocol error '{}' when establishing {} connection{}", + data.self_key_pair.public(), err, if outbound_addr.is_some() { "outbound" } else { "inbound" }, + outbound_addr.map(|a| format!(" with {}", a)).unwrap_or_default()); + }, + Ok(DeadlineStatus::Timeout) => { + warn!(target: "secretstore_net", "{}: timeout when establishing {} connection{}", + data.self_key_pair.public(), if outbound_addr.is_some() { "outbound" } else { "inbound" }, + outbound_addr.map(|a| format!(" with {}", a)).unwrap_or_default()); + }, + Err(err) => { + warn!(target: "secretstore_net", "{}: network error '{}' when establishing {} connection{}", + data.self_key_pair.public(), err, if outbound_addr.is_some() { "outbound" } else { "inbound" }, + outbound_addr.map(|a| format!(" with {}", a)).unwrap_or_default()); + }, + } + + Box::new(future::ok(Ok(()))) +} + +/// Process connection messages. +fn net_process_connection_messages( + data: Arc, + connection: Arc, +) -> IoFuture> { + Box::new(connection + .read_message_future() + .then(move |result| + match result { + Ok((_, Ok(message))) => { + connection.set_last_message_time(Instant::now()); + data.message_processor.process_connection_message(connection.clone(), message); + // continue serving connection + let process_messages_future = net_process_connection_messages( + data.clone(), connection).then(|_| Ok(())); + execute(&data.executor, process_messages_future); + Box::new(future::ok(Ok(()))) + }, + Ok((_, Err(err))) => { + warn!(target: "secretstore_net", "{}: protocol error '{}' when reading message from node {}", + data.self_key_pair.public(), err, connection.node_id()); + // continue serving connection + let process_messages_future = net_process_connection_messages( + data.clone(), connection).then(|_| Ok(())); + execute(&data.executor, process_messages_future); + Box::new(future::ok(Err(err))) + }, + Err(err) => { + let node_id = *connection.node_id(); + warn!(target: "secretstore_net", "{}: network error '{}' when reading message from node {}", + data.self_key_pair.public(), err, node_id); + // close connection + if data.remove(&*connection) { + let maintain_action = data.trigger.lock().on_connection_closed(&node_id); + maintain_connection_trigger(data, maintain_action); + } + Box::new(future::err(err)) + }, + } + )) +} + +/// Schedule connections. maintain. +fn net_schedule_maintain(data: Arc) { + let closure_data = data.clone(); + execute(&data.executor, Interval::new_interval(Duration::new(MAINTAIN_INTERVAL, 0)) + .and_then(move |_| Ok(net_maintain(closure_data.clone()))) + .for_each(|_| Ok(())) + .then(|_| future::ok(()))); +} + +/// Maintain network connections. +fn net_maintain(data: Arc) { + trace!(target: "secretstore_net", "{}: executing maintain procedures", data.self_key_pair.public()); + + update_nodes_set(data.clone()); + data.message_processor.maintain_sessions(); + net_keep_alive(data.clone()); + net_connect_disconnected(data); +} + +/// Send keep alive messages to remote nodes. +fn net_keep_alive(data: Arc) { + let now = Instant::now(); + let active_connections = data.active_connections(); + for connection in active_connections { + let last_message_diff = now - connection.last_message_time(); + if last_message_diff > KEEP_ALIVE_DISCONNECT_INTERVAL { + warn!(target: "secretstore_net", "{}: keep alive timeout for node {}", + data.self_key_pair.public(), connection.node_id()); + + let node_id = *connection.node_id(); + if data.remove(&*connection) { + let maintain_action = data.trigger.lock().on_connection_closed(&node_id); + maintain_connection_trigger(data.clone(), maintain_action); + } + data.message_processor.process_disconnect(&node_id); + } + else if last_message_diff > KEEP_ALIVE_SEND_INTERVAL { + connection.send_message(Message::Cluster(ClusterMessage::KeepAlive(message::KeepAlive {}))); + } + } +} + +/// Connect disconnected nodes. +fn net_connect_disconnected(data: Arc) { + let disconnected_nodes = data.disconnected_nodes(); + for (node_id, address) in disconnected_nodes { + if data.allow_connecting_to_higher_nodes || *data.self_key_pair.public() < node_id { + net_connect(data.clone(), address); + } + } +} + +/// Schedule future execution. +fn execute + Send + 'static>(executor: &Executor, f: F) { + if let Err(err) = future::Executor::execute(executor, Box::new(f)) { + error!("Secret store runtime unable to spawn task. Runtime is shutting down. ({:?})", err); + } +} + +/// Try to update active nodes set from connection trigger. +fn update_nodes_set(data: Arc) { + let maintain_action = data.trigger.lock().on_maintain(); + maintain_connection_trigger(data, maintain_action); +} + +/// Execute maintain procedures of connections trigger. +fn maintain_connection_trigger(data: Arc, maintain_action: Option) { + if maintain_action == Some(Maintain::SessionAndConnections) || maintain_action == Some(Maintain::Session) { + let session_params = data.trigger.lock().maintain_session(); + if let Some(session_params) = session_params { + let session = data.message_processor.start_servers_set_change_session(session_params); + match session { + Ok(_) => trace!(target: "secretstore_net", "{}: started auto-migrate session", + data.self_key_pair.public()), + Err(err) => trace!(target: "secretstore_net", "{}: failed to start auto-migrate session with: {}", + data.self_key_pair.public(), err), + } + } + } + if maintain_action == Some(Maintain::SessionAndConnections) || maintain_action == Some(Maintain::Connections) { + let mut trigger = data.trigger.lock(); + let mut data = data.container.write(); + trigger.maintain_connections(&mut *data); + } +} + +/// Compose SocketAddr from configuration' address and port. +fn make_socket_address(address: &str, port: u16) -> Result { + let ip_address: IpAddr = address.parse().map_err(|_| Error::InvalidNodeAddress)?; + Ok(SocketAddr::new(ip_address, port)) +} diff --git a/secret-store/src/key_server_cluster/cluster_message_processor.rs b/secret-store/src/key_server_cluster/cluster_message_processor.rs new file mode 100644 index 00000000000..b4ba5ef03b2 --- /dev/null +++ b/secret-store/src/key_server_cluster/cluster_message_processor.rs @@ -0,0 +1,357 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::sync::Arc; +use key_server_cluster::{Error, NodeId, NodeKeyPair}; +use key_server_cluster::cluster::{ServersSetChangeParams, new_servers_set_change_session}; +use key_server_cluster::cluster_sessions::{AdminSession}; +use key_server_cluster::cluster_connections::{ConnectionProvider, Connection}; +use key_server_cluster::cluster_sessions::{ClusterSession, ClusterSessions, ClusterSessionsContainer, + create_cluster_view}; +use key_server_cluster::cluster_sessions_creator::{ClusterSessionCreator, IntoSessionId}; +use key_server_cluster::message::{self, Message, ClusterMessage}; +use key_server_cluster::key_version_negotiation_session::{SessionImpl as KeyVersionNegotiationSession, + IsolatedSessionTransport as KeyVersionNegotiationSessionTransport, ContinueAction}; +use key_server_cluster::connection_trigger::ServersSetChangeSessionCreatorConnector; + +/// Something that is able to process signals/messages from other nodes. +pub trait MessageProcessor: Send + Sync { + /// Process disconnect from the remote node. + fn process_disconnect(&self, node: &NodeId); + /// Process single message from the connection. + fn process_connection_message(&self, connection: Arc, message: Message); + + /// Start servers set change session. This is typically used by ConnectionManager when + /// it detects that auto-migration session needs to be started. + fn start_servers_set_change_session(&self, params: ServersSetChangeParams) -> Result, Error>; + /// Try to continue session after key version negotiation session is completed. + fn try_continue_session( + &self, + session: Option>> + ); + /// Maintain active sessions. Typically called by the ConnectionManager at some intervals. + /// Should cancel stalled sessions and send keep-alive messages for sessions that support it. + fn maintain_sessions(&self); +} + +/// Bridge between ConnectionManager and ClusterSessions. +pub struct SessionsMessageProcessor { + self_key_pair: Arc, + servers_set_change_creator_connector: Arc, + sessions: Arc, + connections: Arc, +} + +impl SessionsMessageProcessor { + /// Create new instance of SessionsMessageProcessor. + pub fn new( + self_key_pair: Arc, + servers_set_change_creator_connector: Arc, + sessions: Arc, + connections: Arc, + ) -> Self { + SessionsMessageProcessor { + self_key_pair, + servers_set_change_creator_connector, + sessions, + connections, + } + } + + /// Process single session message from connection. + fn process_message, D>( + &self, + sessions: &ClusterSessionsContainer, + connection: Arc, + mut message: Message, + ) -> Option> + where + Message: IntoSessionId + { + // get or create new session, if required + let mut sender = *connection.node_id(); + let session = self.prepare_session(sessions, &sender, &message); + // send error if session is not found, or failed to create + let session = match session { + Ok(session) => session, + Err(error) => { + // this is new session => it is not yet in container + warn!(target: "secretstore_net", + "{}: {} session read error '{}' when requested for session from node {}", + self.self_key_pair.public(), S::type_name(), error, sender); + if !message.is_error_message() { + let qed = "session_id only fails for cluster messages; + only session messages are passed to process_message; + qed"; + let session_id = message.into_session_id().expect(qed); + let session_nonce = message.session_nonce().expect(qed); + + connection.send_message(SC::make_error_message(session_id, session_nonce, error)); + } + return None; + }, + }; + + let session_id = session.id(); + let mut is_queued_message = false; + loop { + let message_result = session.on_message(&sender, &message); + match message_result { + Ok(_) => { + // if session is completed => stop + if session.is_finished() { + info!(target: "secretstore_net", + "{}: {} session completed", self.self_key_pair.public(), S::type_name()); + sessions.remove(&session_id); + return Some(session); + } + + // try to dequeue message + match sessions.dequeue_message(&session_id) { + Some((msg_sender, msg)) => { + is_queued_message = true; + sender = msg_sender; + message = msg; + }, + None => return Some(session), + } + }, + Err(Error::TooEarlyForRequest) => { + sessions.enqueue_message(&session_id, sender, message, is_queued_message); + return Some(session); + }, + Err(err) => { + warn!( + target: "secretstore_net", + "{}: {} session error '{}' when processing message {} from node {}", + self.self_key_pair.public(), + S::type_name(), + err, + message, + sender); + session.on_session_error(self.self_key_pair.public(), err); + sessions.remove(&session_id); + return Some(session); + }, + } + } + } + + /// Get or insert new session. + fn prepare_session, D>( + &self, + sessions: &ClusterSessionsContainer, + sender: &NodeId, + message: &Message + ) -> Result, Error> + where + Message: IntoSessionId + { + fn requires_all_connections(message: &Message) -> bool { + match *message { + Message::Generation(_) => true, + Message::ShareAdd(_) => true, + Message::ServersSetChange(_) => true, + _ => false, + } + } + + // get or create new session, if required + let session_id = message.into_session_id() + .expect("into_session_id fails for cluster messages only; + only session messages are passed to prepare_session; + qed"); + let is_initialization_message = message.is_initialization_message(); + let is_delegation_message = message.is_delegation_message(); + match is_initialization_message || is_delegation_message { + false => sessions.get(&session_id, true).ok_or(Error::NoActiveSessionWithId), + true => { + let creation_data = SC::creation_data_from_message(&message)?; + let master = if is_initialization_message { + *sender + } else { + *self.self_key_pair.public() + }; + let cluster = create_cluster_view( + self.self_key_pair.clone(), + self.connections.clone(), + requires_all_connections(&message))?; + + let nonce = Some(message.session_nonce().ok_or(Error::InvalidMessage)?); + let exclusive = message.is_exclusive_session_message(); + sessions.insert(cluster, master, session_id, nonce, exclusive, creation_data) + }, + } + } + + /// Process single cluster message from the connection. + fn process_cluster_message(&self, connection: Arc, message: ClusterMessage) { + match message { + ClusterMessage::KeepAlive(_) => { + let msg = Message::Cluster(ClusterMessage::KeepAliveResponse(message::KeepAliveResponse { + session_id: None, + })); + connection.send_message(msg) + }, + ClusterMessage::KeepAliveResponse(msg) => if let Some(session_id) = msg.session_id { + self.sessions.on_session_keep_alive(connection.node_id(), session_id.into()); + }, + _ => warn!(target: "secretstore_net", "{}: received unexpected message {} from node {} at {}", + self.self_key_pair.public(), message, connection.node_id(), connection.node_address()), + } + } +} + +impl MessageProcessor for SessionsMessageProcessor { + fn process_disconnect(&self, node: &NodeId) { + self.sessions.on_connection_timeout(node); + } + + fn process_connection_message(&self, connection: Arc, message: Message) { + trace!(target: "secretstore_net", "{}: received message {} from {}", + self.self_key_pair.public(), message, connection.node_id()); + + // error is ignored as we only process errors on session level + match message { + Message::Generation(message) => self + .process_message(&self.sessions.generation_sessions, connection, Message::Generation(message)) + .map(|_| ()).unwrap_or_default(), + Message::Encryption(message) => self + .process_message(&self.sessions.encryption_sessions, connection, Message::Encryption(message)) + .map(|_| ()).unwrap_or_default(), + Message::Decryption(message) => self + .process_message(&self.sessions.decryption_sessions, connection, Message::Decryption(message)) + .map(|_| ()).unwrap_or_default(), + Message::SchnorrSigning(message) => self + .process_message(&self.sessions.schnorr_signing_sessions, connection, Message::SchnorrSigning(message)) + .map(|_| ()).unwrap_or_default(), + Message::EcdsaSigning(message) => self + .process_message(&self.sessions.ecdsa_signing_sessions, connection, Message::EcdsaSigning(message)) + .map(|_| ()).unwrap_or_default(), + Message::ServersSetChange(message) => { + let message = Message::ServersSetChange(message); + let is_initialization_message = message.is_initialization_message(); + let session = self.process_message(&self.sessions.admin_sessions, connection, message); + if is_initialization_message { + if let Some(session) = session { + self.servers_set_change_creator_connector + .set_key_servers_set_change_session(session.clone()); + } + } + }, + Message::KeyVersionNegotiation(message) => { + let session = self.process_message( + &self.sessions.negotiation_sessions, connection, Message::KeyVersionNegotiation(message)); + self.try_continue_session(session); + }, + Message::ShareAdd(message) => self.process_message( + &self.sessions.admin_sessions, connection, Message::ShareAdd(message)) + .map(|_| ()).unwrap_or_default(), + Message::Cluster(message) => self.process_cluster_message(connection, message), + } + } + + fn try_continue_session( + &self, + session: Option>> + ) { + if let Some(session) = session { + let meta = session.meta(); + let is_master_node = meta.self_node_id == meta.master_node_id; + if is_master_node && session.is_finished() { + self.sessions.negotiation_sessions.remove(&session.id()); + match session.wait() { + Ok(Some((version, master))) => match session.take_continue_action() { + Some(ContinueAction::Decrypt( + session, origin, is_shadow_decryption, is_broadcast_decryption + )) => { + let initialization_error = if self.self_key_pair.public() == &master { + session.initialize( + origin, version, is_shadow_decryption, is_broadcast_decryption) + } else { + session.delegate( + master, origin, version, is_shadow_decryption, is_broadcast_decryption) + }; + + if let Err(error) = initialization_error { + session.on_session_error(&meta.self_node_id, error); + self.sessions.decryption_sessions.remove(&session.id()); + } + }, + Some(ContinueAction::SchnorrSign(session, message_hash)) => { + let initialization_error = if self.self_key_pair.public() == &master { + session.initialize(version, message_hash) + } else { + session.delegate(master, version, message_hash) + }; + + if let Err(error) = initialization_error { + session.on_session_error(&meta.self_node_id, error); + self.sessions.schnorr_signing_sessions.remove(&session.id()); + } + }, + Some(ContinueAction::EcdsaSign(session, message_hash)) => { + let initialization_error = if self.self_key_pair.public() == &master { + session.initialize(version, message_hash) + } else { + session.delegate(master, version, message_hash) + }; + + if let Err(error) = initialization_error { + session.on_session_error(&meta.self_node_id, error); + self.sessions.ecdsa_signing_sessions.remove(&session.id()); + } + }, + None => (), + }, + Ok(None) => unreachable!("is_master_node; session is finished; + negotiation version always finished with result on master; + qed"), + Err(error) => match session.take_continue_action() { + Some(ContinueAction::Decrypt(session, _, _, _)) => { + session.on_session_error(&meta.self_node_id, error); + self.sessions.decryption_sessions.remove(&session.id()); + }, + Some(ContinueAction::SchnorrSign(session, _)) => { + session.on_session_error(&meta.self_node_id, error); + self.sessions.schnorr_signing_sessions.remove(&session.id()); + }, + Some(ContinueAction::EcdsaSign(session, _)) => { + session.on_session_error(&meta.self_node_id, error); + self.sessions.ecdsa_signing_sessions.remove(&session.id()); + }, + None => (), + }, + } + } + } + } + + fn maintain_sessions(&self) { + self.sessions.stop_stalled_sessions(); + self.sessions.sessions_keep_alive(); + } + + fn start_servers_set_change_session(&self, params: ServersSetChangeParams) -> Result, Error> { + new_servers_set_change_session( + self.self_key_pair.clone(), + &*self.sessions, + self.connections.clone(), + self.servers_set_change_creator_connector.clone(), + params, + ) + } +} diff --git a/secret_store/src/key_server_cluster/cluster_sessions.rs b/secret-store/src/key_server_cluster/cluster_sessions.rs similarity index 93% rename from secret_store/src/key_server_cluster/cluster_sessions.rs rename to secret-store/src/key_server_cluster/cluster_sessions.rs index d068c25b93a..53eec133467 100644 --- a/secret_store/src/key_server_cluster/cluster_sessions.rs +++ b/secret-store/src/key_server_cluster/cluster_sessions.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::time::{Duration, Instant}; use std::sync::{Arc, Weak}; @@ -21,8 +21,9 @@ use std::collections::{VecDeque, BTreeMap, BTreeSet}; use parking_lot::{Mutex, RwLock, Condvar}; use ethereum_types::H256; use ethkey::Secret; -use key_server_cluster::{Error, NodeId, SessionId, Requester}; -use key_server_cluster::cluster::{Cluster, ClusterData, ClusterConfiguration, ClusterView}; +use key_server_cluster::{Error, NodeId, SessionId, Requester, NodeKeyPair}; +use key_server_cluster::cluster::{Cluster, ClusterConfiguration, ClusterView}; +use key_server_cluster::cluster_connections::ConnectionProvider; use key_server_cluster::connection_trigger::ServersSetChangeSessionCreatorConnector; use key_server_cluster::message::{self, Message}; use key_server_cluster::generation_session::{SessionImpl as GenerationSessionImpl}; @@ -158,6 +159,8 @@ pub struct ClusterSessionsContainer>>>, /// Sessions container state. container_state: Arc>, + /// Do not actually remove sessions. + preserve_sessions: bool, /// Phantom data. _pd: ::std::marker::PhantomData, } @@ -229,6 +232,17 @@ impl ClusterSessions { self.generation_sessions.creator.make_faulty_generation_sessions(); } + #[cfg(test)] + pub fn preserve_sessions(&mut self) { + self.generation_sessions.preserve_sessions = true; + self.encryption_sessions.preserve_sessions = true; + self.decryption_sessions.preserve_sessions = true; + self.schnorr_signing_sessions.preserve_sessions = true; + self.ecdsa_signing_sessions.preserve_sessions = true; + self.negotiation_sessions.preserve_sessions = true; + self.admin_sessions.preserve_sessions = true; + } + /// Send session-level keep-alive messages. pub fn sessions_keep_alive(&self) { self.admin_sessions.send_keep_alive(&*SERVERS_SET_CHANGE_SESSION_ID, &self.self_node_id); @@ -272,6 +286,7 @@ impl ClusterSessionsContainer where S: ClusterSession, SC: C sessions: RwLock::new(BTreeMap::new()), listeners: Mutex::new(Vec::new()), container_state: container_state, + preserve_sessions: false, _pd: Default::default(), } } @@ -379,9 +394,11 @@ impl ClusterSessionsContainer where S: ClusterSession, SC: C } fn do_remove(&self, session_id: &S::Id, sessions: &mut BTreeMap>) { - if let Some(session) = sessions.remove(session_id) { - self.container_state.lock().on_session_completed(); - self.notify_listeners(|l| l.on_session_removed(session.session.clone())); + if !self.preserve_sessions { + if let Some(session) = sessions.remove(session_id) { + self.container_state.lock().on_session_completed(); + self.notify_listeners(|l| l.on_session_removed(session.session.clone())); + } } } @@ -551,19 +568,22 @@ impl ClusterSession for AdminSession { } } } -pub fn create_cluster_view(data: &Arc, requires_all_connections: bool) -> Result, Error> { - let disconnected_nodes_count = data.connections.disconnected_nodes().len(); + +pub fn create_cluster_view(self_key_pair: Arc, connections: Arc, requires_all_connections: bool) -> Result, Error> { + let mut connected_nodes = connections.connected_nodes()?; + let disconnected_nodes = connections.disconnected_nodes(); + + let disconnected_nodes_count = disconnected_nodes.len(); if requires_all_connections { if disconnected_nodes_count != 0 { return Err(Error::NodeDisconnected); } } - let mut connected_nodes = data.connections.connected_nodes()?; - connected_nodes.insert(data.self_key_pair.public().clone()); + connected_nodes.insert(self_key_pair.public().clone()); let connected_nodes_count = connected_nodes.len(); - Ok(Arc::new(ClusterView::new(data.clone(), connected_nodes, connected_nodes_count + disconnected_nodes_count))) + Ok(Arc::new(ClusterView::new(self_key_pair, connections, connected_nodes, connected_nodes_count + disconnected_nodes_count))) } #[cfg(test)] @@ -583,13 +603,11 @@ mod tests { let key_pair = Random.generate().unwrap(); let config = ClusterConfiguration { self_key_pair: Arc::new(PlainNodeKeyPair::new(key_pair.clone())), - listen_address: ("127.0.0.1".to_owned(), 100_u16), key_server_set: Arc::new(MapKeyServerSet::new(false, vec![(key_pair.public().clone(), format!("127.0.0.1:{}", 100).parse().unwrap())].into_iter().collect())), - allow_connecting_to_higher_nodes: false, key_storage: Arc::new(DummyKeyStorage::default()), acl_storage: Arc::new(DummyAclStorage::default()), admin_public: Some(Random.generate().unwrap().public().clone()), - auto_migrate_enabled: false, + preserve_sessions: false, }; ClusterSessions::new(&config, Arc::new(SimpleServersSetChangeSessionCreatorConnector { admin_public: Some(Random.generate().unwrap().public().clone()), diff --git a/secret_store/src/key_server_cluster/cluster_sessions_creator.rs b/secret-store/src/key_server_cluster/cluster_sessions_creator.rs similarity index 98% rename from secret_store/src/key_server_cluster/cluster_sessions_creator.rs rename to secret-store/src/key_server_cluster/cluster_sessions_creator.rs index 15192542b5c..23a3657c42b 100644 --- a/secret_store/src/key_server_cluster/cluster_sessions_creator.rs +++ b/secret-store/src/key_server_cluster/cluster_sessions_creator.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; diff --git a/secret_store/src/key_server_cluster/connection_trigger.rs b/secret-store/src/key_server_cluster/connection_trigger.rs similarity index 89% rename from secret_store/src/key_server_cluster/connection_trigger.rs rename to secret-store/src/key_server_cluster/connection_trigger.rs index 2de1a595497..7b3649861f4 100644 --- a/secret_store/src/key_server_cluster/connection_trigger.rs +++ b/secret-store/src/key_server_cluster/connection_trigger.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::{BTreeSet, BTreeMap}; use std::collections::btree_map::Entry; @@ -21,10 +21,12 @@ use std::sync::Arc; use ethereum_types::H256; use ethkey::Public; use key_server_cluster::{KeyServerSet, KeyServerSetSnapshot}; -use key_server_cluster::cluster::{ClusterClient, ClusterConnectionsData}; +use key_server_cluster::cluster::{ClusterConfiguration, ServersSetChangeParams}; use key_server_cluster::cluster_sessions::AdminSession; +use key_server_cluster::cluster_connections::{Connection}; +use key_server_cluster::cluster_connections_net::{NetConnectionsContainer}; use types::{Error, NodeId}; -use {NodeKeyPair}; +use NodeKeyPair; #[derive(Debug, Clone, Copy, PartialEq)] /// Describes which maintain() call is required. @@ -45,10 +47,10 @@ pub trait ConnectionTrigger: Send + Sync { fn on_connection_established(&mut self, node: &NodeId) -> Option; /// When connection is closed. fn on_connection_closed(&mut self, node: &NodeId) -> Option; - /// Maintain active sessions. - fn maintain_session(&mut self, sessions: &ClusterClient); + /// Maintain active sessions. Returns Some if servers set session creation required. + fn maintain_session(&mut self) -> Option; /// Maintain active connections. - fn maintain_connections(&mut self, connections: &mut ClusterConnectionsData); + fn maintain_connections(&mut self, connections: &mut NetConnectionsContainer); /// Return connector for the servers set change session creator. fn servers_set_change_creator_connector(&self) -> Arc; } @@ -95,6 +97,11 @@ pub struct TriggerConnections { } impl SimpleConnectionTrigger { + /// Create new simple from cluster configuration. + pub fn with_config(config: &ClusterConfiguration) -> Self { + Self::new(config.key_server_set.clone(), config.self_key_pair.clone(), config.admin_public) + } + /// Create new simple connection trigger. pub fn new(key_server_set: Arc, self_key_pair: Arc, admin_public: Option) -> Self { SimpleConnectionTrigger { @@ -124,10 +131,11 @@ impl ConnectionTrigger for SimpleConnectionTrigger { None } - fn maintain_session(&mut self, _sessions: &ClusterClient) { + fn maintain_session(&mut self) -> Option { + None } - fn maintain_connections(&mut self, connections: &mut ClusterConnectionsData) { + fn maintain_connections(&mut self, connections: &mut NetConnectionsContainer) { self.connections.maintain(ConnectionsAction::ConnectToCurrentSet, connections, &self.key_server_set.snapshot()) } @@ -146,7 +154,7 @@ impl ServersSetChangeSessionCreatorConnector for SimpleServersSetChangeSessionCr } impl TriggerConnections { - pub fn maintain(&self, action: ConnectionsAction, data: &mut ClusterConnectionsData, server_set: &KeyServerSetSnapshot) { + pub fn maintain(&self, action: ConnectionsAction, data: &mut NetConnectionsContainer, server_set: &KeyServerSetSnapshot) { match action { ConnectionsAction::ConnectToCurrentSet => { adjust_connections(self.self_key_pair.public(), data, &server_set.current_set); @@ -159,7 +167,11 @@ impl TriggerConnections { } } -fn adjust_connections(self_node_id: &NodeId, data: &mut ClusterConnectionsData, required_set: &BTreeMap) { +fn adjust_connections( + self_node_id: &NodeId, + data: &mut NetConnectionsContainer, + required_set: &BTreeMap +) { if !required_set.contains_key(self_node_id) { if !data.is_isolated { trace!(target: "secretstore_net", "{}: isolated from cluser", self_node_id); @@ -204,13 +216,13 @@ mod tests { use std::collections::BTreeSet; use std::sync::Arc; use ethkey::{Random, Generator}; - use key_server_cluster::cluster::ClusterConnectionsData; use key_server_cluster::{MapKeyServerSet, PlainNodeKeyPair, KeyServerSetSnapshot, KeyServerSetMigration}; + use key_server_cluster::cluster_connections_net::NetConnectionsContainer; use super::{Maintain, TriggerConnections, ConnectionsAction, ConnectionTrigger, SimpleConnectionTrigger, select_nodes_to_disconnect, adjust_connections}; - fn default_connection_data() -> ClusterConnectionsData { - ClusterConnectionsData { + fn default_connection_data() -> NetConnectionsContainer { + NetConnectionsContainer { is_isolated: false, nodes: Default::default(), connections: Default::default(), diff --git a/secret_store/src/key_server_cluster/connection_trigger_with_migration.rs b/secret-store/src/key_server_cluster/connection_trigger_with_migration.rs similarity index 92% rename from secret_store/src/key_server_cluster/connection_trigger_with_migration.rs rename to secret-store/src/key_server_cluster/connection_trigger_with_migration.rs index cc8db3e6652..559bab18c13 100644 --- a/secret_store/src/key_server_cluster/connection_trigger_with_migration.rs +++ b/secret-store/src/key_server_cluster/connection_trigger_with_migration.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::{BTreeSet, BTreeMap}; use std::net::SocketAddr; @@ -21,7 +21,8 @@ use ethereum_types::H256; use ethkey::Public; use parking_lot::Mutex; use key_server_cluster::{KeyServerSet, KeyServerSetSnapshot, KeyServerSetMigration, is_migration_required}; -use key_server_cluster::cluster::{ClusterClient, ClusterConnectionsData}; +use key_server_cluster::cluster::{ClusterConfiguration, ServersSetChangeParams}; +use key_server_cluster::cluster_connections_net::NetConnectionsContainer; use key_server_cluster::cluster_sessions::{AdminSession, ClusterSession}; use key_server_cluster::jobs::servers_set_change_access_job::ordered_nodes_hash; use key_server_cluster::connection_trigger::{Maintain, ConnectionsAction, ConnectionTrigger, @@ -110,6 +111,11 @@ struct TriggerSession { } impl ConnectionTriggerWithMigration { + /// Create new simple from cluster configuration. + pub fn with_config(config: &ClusterConfiguration) -> Self { + Self::new(config.key_server_set.clone(), config.self_key_pair.clone()) + } + /// Create new trigge with migration. pub fn new(key_server_set: Arc, self_key_pair: Arc) -> Self { let snapshot = key_server_set.snapshot(); @@ -187,13 +193,11 @@ impl ConnectionTrigger for ConnectionTriggerWithMigration { self.do_maintain() } - fn maintain_session(&mut self, sessions: &ClusterClient) { - if let Some(action) = self.session_action { - self.session.maintain(action, sessions, &self.snapshot); - } + fn maintain_session(&mut self) -> Option { + self.session_action.and_then(|action| self.session.maintain(action, &self.snapshot)) } - fn maintain_connections(&mut self, connections: &mut ClusterConnectionsData) { + fn maintain_connections(&mut self, connections: &mut NetConnectionsContainer) { if let Some(action) = self.connections_action { self.connections.maintain(action, connections, &self.snapshot); } @@ -255,30 +259,42 @@ impl TriggerSession { } /// Maintain session. - pub fn maintain(&mut self, action: SessionAction, sessions: &ClusterClient, server_set: &KeyServerSetSnapshot) { - if action == SessionAction::Start { // all other actions are processed in maintain - let migration = server_set.migration.as_ref() - .expect("action is Start only when migration is started (see maintain_session); qed"); - - // we assume that authorities that are removed from the servers set are either offline, or malicious - // => they're not involved in ServersSetChangeSession - // => both sets are the same - let old_set: BTreeSet<_> = migration.set.keys().cloned().collect(); - let new_set = old_set.clone(); - - let signatures = self.self_key_pair.sign(&ordered_nodes_hash(&old_set)) - .and_then(|old_set_signature| self.self_key_pair.sign(&ordered_nodes_hash(&new_set)) - .map(|new_set_signature| (old_set_signature, new_set_signature))) - .map_err(Into::into); - let session = signatures.and_then(|(old_set_signature, new_set_signature)| - sessions.new_servers_set_change_session(None, Some(migration.id.clone()), new_set, old_set_signature, new_set_signature)); - - match session { - Ok(_) => trace!(target: "secretstore_net", "{}: started auto-migrate session", - self.self_key_pair.public()), - Err(err) => trace!(target: "secretstore_net", "{}: failed to start auto-migrate session with: {}", - self.self_key_pair.public(), err), - } + pub fn maintain( + &mut self, + action: SessionAction, + server_set: &KeyServerSetSnapshot + ) -> Option { + if action != SessionAction::Start { // all other actions are processed in maintain + return None; + } + let migration = server_set.migration.as_ref() + .expect("action is Start only when migration is started (see maintain_session); qed"); + + // we assume that authorities that are removed from the servers set are either offline, or malicious + // => they're not involved in ServersSetChangeSession + // => both sets are the same + let old_set: BTreeSet<_> = migration.set.keys().cloned().collect(); + let new_set = old_set.clone(); + + let signatures = self.self_key_pair.sign(&ordered_nodes_hash(&old_set)) + .and_then(|old_set_signature| self.self_key_pair.sign(&ordered_nodes_hash(&new_set)) + .map(|new_set_signature| (old_set_signature, new_set_signature))); + + match signatures { + Ok((old_set_signature, new_set_signature)) => Some(ServersSetChangeParams { + session_id: None, + migration_id: Some(migration.id), + new_nodes_set: new_set, + old_set_signature, + new_set_signature, + }), + Err(err) => { + trace!( + target: "secretstore_net", + "{}: failed to sign servers set for auto-migrate session with: {}", + self.self_key_pair.public(), err); + None + }, } } } diff --git a/secret_store/src/key_server_cluster/io/deadline.rs b/secret-store/src/key_server_cluster/io/deadline.rs similarity index 87% rename from secret_store/src/key_server_cluster/io/deadline.rs rename to secret-store/src/key_server_cluster/io/deadline.rs index f3b660cbf3b..7c08932578a 100644 --- a/secret_store/src/key_server_cluster/io/deadline.rs +++ b/secret-store/src/key_server_cluster/io/deadline.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io; use std::time::Duration; diff --git a/secret_store/src/key_server_cluster/io/handshake.rs b/secret-store/src/key_server_cluster/io/handshake.rs similarity index 98% rename from secret_store/src/key_server_cluster/io/handshake.rs rename to secret-store/src/key_server_cluster/io/handshake.rs index 5081004d0b3..f378cba0985 100644 --- a/secret_store/src/key_server_cluster/io/handshake.rs +++ b/secret-store/src/key_server_cluster/io/handshake.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . ///! Given: two nodes each holding its own `self_key_pair`. ///! diff --git a/secret_store/src/key_server_cluster/io/message.rs b/secret-store/src/key_server_cluster/io/message.rs similarity index 98% rename from secret_store/src/key_server_cluster/io/message.rs rename to secret-store/src/key_server_cluster/io/message.rs index e8e01a91f52..0ce2b7c01ff 100644 --- a/secret_store/src/key_server_cluster/io/message.rs +++ b/secret-store/src/key_server_cluster/io/message.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io::Cursor; use std::u16; diff --git a/secret_store/src/key_server_cluster/io/mod.rs b/secret-store/src/key_server_cluster/io/mod.rs similarity index 79% rename from secret_store/src/key_server_cluster/io/mod.rs rename to secret-store/src/key_server_cluster/io/mod.rs index 02adb72ad77..c1cfe55665c 100644 --- a/secret_store/src/key_server_cluster/io/mod.rs +++ b/secret-store/src/key_server_cluster/io/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . mod deadline; mod handshake; diff --git a/secret_store/src/key_server_cluster/io/read_header.rs b/secret-store/src/key_server_cluster/io/read_header.rs similarity index 80% rename from secret_store/src/key_server_cluster/io/read_header.rs rename to secret-store/src/key_server_cluster/io/read_header.rs index 803e01b95b4..3806537ebff 100644 --- a/secret_store/src/key_server_cluster/io/read_header.rs +++ b/secret-store/src/key_server_cluster/io/read_header.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io; use futures::{Future, Poll, Async}; diff --git a/secret_store/src/key_server_cluster/io/read_message.rs b/secret-store/src/key_server_cluster/io/read_message.rs similarity index 88% rename from secret_store/src/key_server_cluster/io/read_message.rs rename to secret-store/src/key_server_cluster/io/read_message.rs index b1d0395d57a..e16de57a36e 100644 --- a/secret_store/src/key_server_cluster/io/read_message.rs +++ b/secret-store/src/key_server_cluster/io/read_message.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io; use futures::{Poll, Future, Async}; diff --git a/secret_store/src/key_server_cluster/io/read_payload.rs b/secret-store/src/key_server_cluster/io/read_payload.rs similarity index 86% rename from secret_store/src/key_server_cluster/io/read_payload.rs rename to secret-store/src/key_server_cluster/io/read_payload.rs index da4f4d3c019..9f3a47f6624 100644 --- a/secret_store/src/key_server_cluster/io/read_payload.rs +++ b/secret-store/src/key_server_cluster/io/read_payload.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io; use futures::{Poll, Future}; diff --git a/secret_store/src/key_server_cluster/io/shared_tcp_stream.rs b/secret-store/src/key_server_cluster/io/shared_tcp_stream.rs similarity index 83% rename from secret_store/src/key_server_cluster/io/shared_tcp_stream.rs rename to secret-store/src/key_server_cluster/io/shared_tcp_stream.rs index fb8abb47d08..99d6e4ca788 100644 --- a/secret_store/src/key_server_cluster/io/shared_tcp_stream.rs +++ b/secret-store/src/key_server_cluster/io/shared_tcp_stream.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::net::Shutdown; diff --git a/secret_store/src/key_server_cluster/io/write_message.rs b/secret-store/src/key_server_cluster/io/write_message.rs similarity index 86% rename from secret_store/src/key_server_cluster/io/write_message.rs rename to secret-store/src/key_server_cluster/io/write_message.rs index d337a3705a0..15823730a24 100644 --- a/secret_store/src/key_server_cluster/io/write_message.rs +++ b/secret-store/src/key_server_cluster/io/write_message.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io; use futures::{Future, Poll}; diff --git a/secret_store/src/key_server_cluster/jobs/consensus_session.rs b/secret-store/src/key_server_cluster/jobs/consensus_session.rs similarity index 99% rename from secret_store/src/key_server_cluster/jobs/consensus_session.rs rename to secret-store/src/key_server_cluster/jobs/consensus_session.rs index 6d2866750ee..7daf05d3b41 100644 --- a/secret_store/src/key_server_cluster/jobs/consensus_session.rs +++ b/secret-store/src/key_server_cluster/jobs/consensus_session.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::BTreeSet; use key_server_cluster::{Error, NodeId, SessionMeta, Requester}; diff --git a/secret_store/src/key_server_cluster/jobs/decryption_job.rs b/secret-store/src/key_server_cluster/jobs/decryption_job.rs similarity index 96% rename from secret_store/src/key_server_cluster/jobs/decryption_job.rs rename to secret-store/src/key_server_cluster/jobs/decryption_job.rs index debffa25e0a..ca3df29b2da 100644 --- a/secret_store/src/key_server_cluster/jobs/decryption_job.rs +++ b/secret-store/src/key_server_cluster/jobs/decryption_job.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::{BTreeSet, BTreeMap}; use ethereum_types::H256; diff --git a/secret_store/src/key_server_cluster/jobs/dummy_job.rs b/secret-store/src/key_server_cluster/jobs/dummy_job.rs similarity index 86% rename from secret_store/src/key_server_cluster/jobs/dummy_job.rs rename to secret-store/src/key_server_cluster/jobs/dummy_job.rs index f7e771d1558..122903eb60d 100644 --- a/secret_store/src/key_server_cluster/jobs/dummy_job.rs +++ b/secret-store/src/key_server_cluster/jobs/dummy_job.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::{BTreeMap, BTreeSet}; use key_server_cluster::{Error, NodeId}; diff --git a/secret_store/src/key_server_cluster/jobs/job_session.rs b/secret-store/src/key_server_cluster/jobs/job_session.rs similarity index 98% rename from secret_store/src/key_server_cluster/jobs/job_session.rs rename to secret-store/src/key_server_cluster/jobs/job_session.rs index ab0300db361..d76f8addafb 100644 --- a/secret_store/src/key_server_cluster/jobs/job_session.rs +++ b/secret-store/src/key_server_cluster/jobs/job_session.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::{BTreeSet, BTreeMap}; use key_server_cluster::{Error, NodeId, SessionMeta}; diff --git a/secret_store/src/key_server_cluster/jobs/key_access_job.rs b/secret-store/src/key_server_cluster/jobs/key_access_job.rs similarity index 90% rename from secret_store/src/key_server_cluster/jobs/key_access_job.rs rename to secret-store/src/key_server_cluster/jobs/key_access_job.rs index 7ded90afabb..075d7320f2b 100644 --- a/secret_store/src/key_server_cluster/jobs/key_access_job.rs +++ b/secret-store/src/key_server_cluster/jobs/key_access_job.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::collections::{BTreeSet, BTreeMap}; diff --git a/secret_store/src/key_server_cluster/jobs/mod.rs b/secret-store/src/key_server_cluster/jobs/mod.rs similarity index 68% rename from secret_store/src/key_server_cluster/jobs/mod.rs rename to secret-store/src/key_server_cluster/jobs/mod.rs index 75d07e313b7..543f3e1bbb8 100644 --- a/secret_store/src/key_server_cluster/jobs/mod.rs +++ b/secret-store/src/key_server_cluster/jobs/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . pub mod consensus_session; pub mod decryption_job; diff --git a/secret_store/src/key_server_cluster/jobs/servers_set_change_access_job.rs b/secret-store/src/key_server_cluster/jobs/servers_set_change_access_job.rs similarity index 94% rename from secret_store/src/key_server_cluster/jobs/servers_set_change_access_job.rs rename to secret-store/src/key_server_cluster/jobs/servers_set_change_access_job.rs index 6c142d2a2f8..ace5021a058 100644 --- a/secret_store/src/key_server_cluster/jobs/servers_set_change_access_job.rs +++ b/secret-store/src/key_server_cluster/jobs/servers_set_change_access_job.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::{BTreeSet, BTreeMap}; use ethkey::{Public, Signature, recover}; diff --git a/secret_store/src/key_server_cluster/jobs/signing_job_ecdsa.rs b/secret-store/src/key_server_cluster/jobs/signing_job_ecdsa.rs similarity index 94% rename from secret_store/src/key_server_cluster/jobs/signing_job_ecdsa.rs rename to secret-store/src/key_server_cluster/jobs/signing_job_ecdsa.rs index 6349c2e7db4..0628b1e75cb 100644 --- a/secret_store/src/key_server_cluster/jobs/signing_job_ecdsa.rs +++ b/secret-store/src/key_server_cluster/jobs/signing_job_ecdsa.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::{BTreeSet, BTreeMap}; use ethkey::{Public, Secret, Signature}; diff --git a/secret_store/src/key_server_cluster/jobs/signing_job_schnorr.rs b/secret-store/src/key_server_cluster/jobs/signing_job_schnorr.rs similarity index 94% rename from secret_store/src/key_server_cluster/jobs/signing_job_schnorr.rs rename to secret-store/src/key_server_cluster/jobs/signing_job_schnorr.rs index 4d1a0e7d909..7e41dce47ce 100644 --- a/secret_store/src/key_server_cluster/jobs/signing_job_schnorr.rs +++ b/secret-store/src/key_server_cluster/jobs/signing_job_schnorr.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::{BTreeSet, BTreeMap}; use ethkey::{Public, Secret}; diff --git a/secret_store/src/key_server_cluster/jobs/unknown_sessions_job.rs b/secret-store/src/key_server_cluster/jobs/unknown_sessions_job.rs similarity index 89% rename from secret_store/src/key_server_cluster/jobs/unknown_sessions_job.rs rename to secret-store/src/key_server_cluster/jobs/unknown_sessions_job.rs index 908afa1ecc6..33eca6583d6 100644 --- a/secret_store/src/key_server_cluster/jobs/unknown_sessions_job.rs +++ b/secret-store/src/key_server_cluster/jobs/unknown_sessions_job.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::collections::{BTreeSet, BTreeMap}; diff --git a/secret_store/src/key_server_cluster/math.rs b/secret-store/src/key_server_cluster/math.rs similarity index 99% rename from secret_store/src/key_server_cluster/math.rs rename to secret-store/src/key_server_cluster/math.rs index bb5e45fcc0a..60d48b7f3c1 100644 --- a/secret_store/src/key_server_cluster/math.rs +++ b/secret-store/src/key_server_cluster/math.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethkey::{Public, Secret, Signature, Random, Generator, math}; use ethereum_types::{H256, U256}; diff --git a/secret_store/src/key_server_cluster/message.rs b/secret-store/src/key_server_cluster/message.rs similarity index 99% rename from secret_store/src/key_server_cluster/message.rs rename to secret-store/src/key_server_cluster/message.rs index 1bc487eb78f..4b850ec3d3b 100644 --- a/secret_store/src/key_server_cluster/message.rs +++ b/secret-store/src/key_server_cluster/message.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use std::collections::{BTreeSet, BTreeMap}; diff --git a/secret_store/src/key_server_cluster/mod.rs b/secret-store/src/key_server_cluster/mod.rs similarity index 82% rename from secret_store/src/key_server_cluster/mod.rs rename to secret-store/src/key_server_cluster/mod.rs index 018d70d305f..fc46e10318d 100644 --- a/secret_store/src/key_server_cluster/mod.rs +++ b/secret-store/src/key_server_cluster/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use super::types::ServerKeyId; @@ -23,7 +23,8 @@ pub use super::key_storage::{KeyStorage, DocumentKeyShare, DocumentKeyShareVersi pub use super::key_server_set::{is_migration_required, KeyServerSet, KeyServerSetSnapshot, KeyServerSetMigration}; pub use super::serialization::{SerializableSignature, SerializableH256, SerializableSecret, SerializablePublic, SerializableRequester, SerializableMessageHash, SerializableAddress}; -pub use self::cluster::{ClusterCore, ClusterConfiguration, ClusterClient}; +pub use self::cluster::{new_network_cluster, ClusterCore, ClusterConfiguration, ClusterClient}; +pub use self::cluster_connections_net::NetConnectionsManagerConfig; pub use self::cluster_sessions::{ClusterSession, ClusterSessionsListener}; #[cfg(test)] pub use self::cluster::tests::DummyClusterClient; @@ -70,6 +71,9 @@ pub use self::client_sessions::signing_session_ecdsa; pub use self::client_sessions::signing_session_schnorr; mod cluster; +mod cluster_connections; +mod cluster_connections_net; +mod cluster_message_processor; mod cluster_sessions; mod cluster_sessions_creator; mod connection_trigger; diff --git a/secret_store/src/key_server_cluster/net/accept_connection.rs b/secret-store/src/key_server_cluster/net/accept_connection.rs similarity index 85% rename from secret_store/src/key_server_cluster/net/accept_connection.rs rename to secret-store/src/key_server_cluster/net/accept_connection.rs index 3dfb4bdb4a9..3b66fe1d7f0 100644 --- a/secret_store/src/key_server_cluster/net/accept_connection.rs +++ b/secret-store/src/key_server_cluster/net/accept_connection.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io; use std::sync::Arc; diff --git a/secret_store/src/key_server_cluster/net/connect.rs b/secret-store/src/key_server_cluster/net/connect.rs similarity index 89% rename from secret_store/src/key_server_cluster/net/connect.rs rename to secret-store/src/key_server_cluster/net/connect.rs index 438ce9e1279..3c2cbc2693a 100644 --- a/secret_store/src/key_server_cluster/net/connect.rs +++ b/secret-store/src/key_server_cluster/net/connect.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::collections::BTreeSet; diff --git a/secret_store/src/key_server_cluster/net/connection.rs b/secret-store/src/key_server_cluster/net/connection.rs similarity index 71% rename from secret_store/src/key_server_cluster/net/connection.rs rename to secret-store/src/key_server_cluster/net/connection.rs index 7776e97a74e..8688db2897c 100644 --- a/secret_store/src/key_server_cluster/net/connection.rs +++ b/secret-store/src/key_server_cluster/net/connection.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::net; use ethkey::KeyPair; diff --git a/secret_store/src/key_server_cluster/net/mod.rs b/secret-store/src/key_server_cluster/net/mod.rs similarity index 66% rename from secret_store/src/key_server_cluster/net/mod.rs rename to secret-store/src/key_server_cluster/net/mod.rs index e76f4f476c6..a040596af82 100644 --- a/secret_store/src/key_server_cluster/net/mod.rs +++ b/secret-store/src/key_server_cluster/net/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . mod accept_connection; mod connect; diff --git a/secret_store/src/key_server_set.rs b/secret-store/src/key_server_set.rs similarity index 98% rename from secret_store/src/key_server_set.rs rename to secret-store/src/key_server_set.rs index 2e5e6816d4f..5b25641aeec 100644 --- a/secret_store/src/key_server_set.rs +++ b/secret-store/src/key_server_set.rs @@ -1,25 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use std::net::SocketAddr; use std::collections::{BTreeMap, HashSet}; use parking_lot::Mutex; +use call_contract::CallContract; use ethabi::FunctionOutputDecoder; -use ethcore::client::{Client, BlockChainClient, BlockId, ChainNotify, NewBlocks, CallContract}; +use ethcore::client::{Client, BlockChainClient, BlockId, ChainNotify, NewBlocks}; use ethereum_types::{H256, Address}; use ethkey::public_to_address; use bytes::Bytes; diff --git a/secret_store/src/key_storage.rs b/secret-store/src/key_storage.rs similarity index 98% rename from secret_store/src/key_storage.rs rename to secret-store/src/key_storage.rs index f19630c5c6e..36edae43ed5 100644 --- a/secret_store/src/key_storage.rs +++ b/secret-store/src/key_storage.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::BTreeMap; use std::sync::Arc; diff --git a/secret_store/src/lib.rs b/secret-store/src/lib.rs similarity index 90% rename from secret_store/src/lib.rs rename to secret-store/src/lib.rs index 1acbde38096..a3c82991b1d 100644 --- a/secret_store/src/lib.rs +++ b/secret-store/src/lib.rs @@ -1,39 +1,39 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate byteorder; +extern crate common_types; extern crate ethabi; extern crate ethcore; -extern crate parity_bytes as bytes; -extern crate parity_crypto as crypto; -extern crate ethcore_logger as logger; +extern crate ethcore_call_contract as call_contract; extern crate ethcore_sync as sync; -extern crate ethcore_transaction as transaction; extern crate ethereum_types; extern crate ethkey; extern crate hyper; extern crate keccak_hash as hash; extern crate kvdb; +extern crate parity_bytes as bytes; +extern crate parity_crypto as crypto; +extern crate parity_runtime; extern crate parking_lot; extern crate rustc_hex; extern crate serde; extern crate serde_json; extern crate tiny_keccak; extern crate tokio; -extern crate parity_runtime; extern crate tokio_io; extern crate tokio_service; extern crate url; @@ -51,9 +51,14 @@ extern crate lazy_static; #[macro_use] extern crate log; +#[cfg(test)] +extern crate env_logger; #[cfg(test)] extern crate kvdb_rocksdb; +#[cfg(feature = "accounts")] +extern crate ethcore_accounts as accounts; + mod key_server_cluster; mod types; mod helpers; @@ -78,7 +83,9 @@ use parity_runtime::Executor; pub use types::{ServerKeyId, EncryptedDocumentKey, RequestSignature, Public, Error, NodeAddress, ContractAddress, ServiceConfiguration, ClusterConfiguration}; pub use traits::{NodeKeyPair, KeyServer}; -pub use self::node_key_pair::{PlainNodeKeyPair, KeyStoreNodeKeyPair}; +pub use self::node_key_pair::PlainNodeKeyPair; +#[cfg(feature = "accounts")] +pub use self::node_key_pair::KeyStoreNodeKeyPair; /// Start new key server instance pub fn start(client: Arc, sync: Arc, miner: Arc, self_key_pair: Arc, mut config: ServiceConfiguration, diff --git a/secret_store/src/listener/http_listener.rs b/secret-store/src/listener/http_listener.rs similarity index 98% rename from secret_store/src/listener/http_listener.rs rename to secret-store/src/listener/http_listener.rs index fdaac861b55..aa67ec5c662 100644 --- a/secret_store/src/listener/http_listener.rs +++ b/secret-store/src/listener/http_listener.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::BTreeSet; use std::sync::{Arc, Weak}; @@ -334,7 +334,7 @@ fn parse_request(method: &HttpMethod, uri_path: &str, body: &[u8]) -> Request { Err(_) => return Request::Invalid, }; - let path: Vec = uri_path.trim_left_matches('/').split('/').map(Into::into).collect(); + let path: Vec = uri_path.trim_start_matches('/').split('/').map(Into::into).collect(); if path.len() == 0 { return Request::Invalid; } diff --git a/secret_store/src/listener/mod.rs b/secret-store/src/listener/mod.rs similarity index 92% rename from secret_store/src/listener/mod.rs rename to secret-store/src/listener/mod.rs index 8837e7ffd63..b28375d8ec2 100644 --- a/secret_store/src/listener/mod.rs +++ b/secret-store/src/listener/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . pub mod http_listener; pub mod service_contract; diff --git a/secret_store/src/listener/service_contract.rs b/secret-store/src/listener/service_contract.rs similarity index 98% rename from secret_store/src/listener/service_contract.rs rename to secret-store/src/listener/service_contract.rs index 545ce80000d..795e75d2c6d 100644 --- a/secret_store/src/listener/service_contract.rs +++ b/secret-store/src/listener/service_contract.rs @@ -1,25 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use parking_lot::RwLock; +use common_types::filter::Filter; use ethabi::RawLog; use ethabi::FunctionOutputDecoder; -use ethcore::client::{Client, BlockChainClient, BlockId, CallContract}; -use ethcore::filter::Filter; +use call_contract::CallContract; +use ethcore::client::{Client, BlockChainClient, BlockId}; use ethkey::{Public, public_to_address}; use hash::keccak; use bytes::Bytes; diff --git a/secret_store/src/listener/service_contract_aggregate.rs b/secret-store/src/listener/service_contract_aggregate.rs similarity index 92% rename from secret_store/src/listener/service_contract_aggregate.rs rename to secret-store/src/listener/service_contract_aggregate.rs index cc2e97b8d42..29a4730e2b6 100644 --- a/secret_store/src/listener/service_contract_aggregate.rs +++ b/secret-store/src/listener/service_contract_aggregate.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::Arc; use bytes::Bytes; diff --git a/secret_store/src/listener/service_contract_listener.rs b/secret-store/src/listener/service_contract_listener.rs similarity index 99% rename from secret_store/src/listener/service_contract_listener.rs rename to secret-store/src/listener/service_contract_listener.rs index e26d3d9250d..61dcda1766a 100644 --- a/secret_store/src/listener/service_contract_listener.rs +++ b/secret-store/src/listener/service_contract_listener.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::HashSet; use std::sync::Arc; diff --git a/secret_store/src/listener/tasks_queue.rs b/secret-store/src/listener/tasks_queue.rs similarity index 86% rename from secret_store/src/listener/tasks_queue.rs rename to secret-store/src/listener/tasks_queue.rs index 934459940ae..2d9bdba11fc 100644 --- a/secret_store/src/listener/tasks_queue.rs +++ b/secret-store/src/listener/tasks_queue.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::VecDeque; use parking_lot::{Mutex, Condvar}; diff --git a/secret-store/src/node_key_pair.rs b/secret-store/src/node_key_pair.rs new file mode 100644 index 00000000000..f50f75ad1b9 --- /dev/null +++ b/secret-store/src/node_key_pair.rs @@ -0,0 +1,107 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +use ethkey::crypto::ecdh::agree; +use ethkey::{KeyPair, Public, Signature, Error as EthKeyError, sign, public_to_address}; +use ethereum_types::{H256, Address}; +use traits::NodeKeyPair; + +pub struct PlainNodeKeyPair { + key_pair: KeyPair, +} + +impl PlainNodeKeyPair { + pub fn new(key_pair: KeyPair) -> Self { + PlainNodeKeyPair { + key_pair: key_pair, + } + } + + #[cfg(test)] + pub fn key_pair(&self) -> &KeyPair { + &self.key_pair + } +} + +impl NodeKeyPair for PlainNodeKeyPair { + fn public(&self) -> &Public { + self.key_pair.public() + } + + fn address(&self) -> Address { + public_to_address(self.key_pair.public()) + } + + fn sign(&self, data: &H256) -> Result { + sign(self.key_pair.secret(), data) + } + + fn compute_shared_key(&self, peer_public: &Public) -> Result { + agree(self.key_pair.secret(), peer_public) + .map_err(|e| EthKeyError::Custom(e.to_string())) + .and_then(KeyPair::from_secret) + } +} + +#[cfg(feature = "accounts")] +mod accounts { + use super::*; + use std::sync::Arc; + use ethkey::Password; + use accounts::AccountProvider; + + pub struct KeyStoreNodeKeyPair { + account_provider: Arc, + address: Address, + public: Public, + password: Password, + } + + impl KeyStoreNodeKeyPair { + pub fn new(account_provider: Arc, address: Address, password: Password) -> Result { + let public = account_provider.account_public(address.clone(), &password).map_err(|e| EthKeyError::Custom(format!("{}", e)))?; + Ok(KeyStoreNodeKeyPair { + account_provider: account_provider, + address: address, + public: public, + password: password, + }) + } + } + + impl NodeKeyPair for KeyStoreNodeKeyPair { + fn public(&self) -> &Public { + &self.public + } + + fn address(&self) -> Address { + public_to_address(&self.public) + } + + fn sign(&self, data: &H256) -> Result { + self.account_provider.sign(self.address.clone(), Some(self.password.clone()), data.clone()) + .map_err(|e| EthKeyError::Custom(format!("{}", e))) + } + + fn compute_shared_key(&self, peer_public: &Public) -> Result { + KeyPair::from_secret(self.account_provider.agree(self.address.clone(), Some(self.password.clone()), peer_public) + .map_err(|e| EthKeyError::Custom(format!("{}", e)))?) + } + } +} + +#[cfg(feature = "accounts")] +pub use self::accounts::KeyStoreNodeKeyPair; diff --git a/secret_store/src/serialization.rs b/secret-store/src/serialization.rs similarity index 95% rename from secret_store/src/serialization.rs rename to secret-store/src/serialization.rs index 7ae5e8f2694..64cc5f1ce3b 100644 --- a/secret_store/src/serialization.rs +++ b/secret-store/src/serialization.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use std::ops::Deref; diff --git a/secret_store/src/traits.rs b/secret-store/src/traits.rs similarity index 94% rename from secret_store/src/traits.rs rename to secret-store/src/traits.rs index d92983fe8da..fdfa0589795 100644 --- a/secret_store/src/traits.rs +++ b/secret-store/src/traits.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::BTreeSet; use ethkey::{KeyPair, Signature, Error as EthKeyError}; diff --git a/secret_store/src/trusted_client.rs b/secret-store/src/trusted_client.rs similarity index 89% rename from secret_store/src/trusted_client.rs rename to secret-store/src/trusted_client.rs index 24db2146000..a20373ad0d0 100644 --- a/secret_store/src/trusted_client.rs +++ b/secret-store/src/trusted_client.rs @@ -1,26 +1,27 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::{Arc, Weak}; use bytes::Bytes; +use call_contract::RegistryInfo; +use common_types::transaction::{Transaction, SignedTransaction, Action}; use ethereum_types::Address; -use ethcore::client::{Client, BlockChainClient, ChainInfo, Nonce, BlockId, RegistryInfo}; +use ethcore::client::{Client, BlockChainClient, ChainInfo, Nonce, BlockId}; use ethcore::miner::{Miner, MinerService}; use sync::SyncProvider; -use transaction::{Transaction, SignedTransaction, Action}; use helpers::{get_confirmed_block_hash, REQUEST_CONFIRMATIONS_REQUIRED}; use {Error, NodeKeyPair, ContractAddress}; diff --git a/secret_store/src/types/all.rs b/secret-store/src/types/all.rs similarity index 94% rename from secret_store/src/types/all.rs rename to secret-store/src/types/all.rs index bf05b538d5b..3a1e9df70dd 100644 --- a/secret_store/src/types/all.rs +++ b/secret-store/src/types/all.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::BTreeMap; diff --git a/secret_store/src/types/error.rs b/secret-store/src/types/error.rs similarity index 96% rename from secret_store/src/types/error.rs rename to secret-store/src/types/error.rs index fc670fcc02d..72dfded78e2 100644 --- a/secret_store/src/types/error.rs +++ b/secret-store/src/types/error.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt; use std::net; diff --git a/secret_store/src/types/mod.rs b/secret-store/src/types/mod.rs similarity index 62% rename from secret_store/src/types/mod.rs rename to secret-store/src/types/mod.rs index 443f4acb3a5..2001efc5a73 100644 --- a/secret_store/src/types/mod.rs +++ b/secret-store/src/types/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Types used in the public api diff --git a/secret_store/src/key_server_cluster/cluster.rs b/secret_store/src/key_server_cluster/cluster.rs deleted file mode 100644 index 61fb2bcecd7..00000000000 --- a/secret_store/src/key_server_cluster/cluster.rs +++ /dev/null @@ -1,1623 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -use std::io; -use std::time::{Duration, Instant}; -use std::sync::Arc; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::collections::{BTreeMap, BTreeSet}; -use std::collections::btree_map::Entry; -use std::net::{SocketAddr, IpAddr}; -use futures::{future, Future, Stream}; -use parking_lot::{Mutex, RwLock}; -use tokio_io::IoFuture; -use tokio::timer::{Interval, timeout::Error as TimeoutError}; -use tokio::net::{TcpListener, TcpStream}; -use ethkey::{Public, KeyPair, Signature, Random, Generator}; -use ethereum_types::{Address, H256}; -use parity_runtime::Executor; -use key_server_cluster::{Error, NodeId, SessionId, Requester, AclStorage, KeyStorage, KeyServerSet, NodeKeyPair}; -use key_server_cluster::cluster_sessions::{ClusterSession, AdminSession, ClusterSessions, SessionIdWithSubSession, - ClusterSessionsContainer, SERVERS_SET_CHANGE_SESSION_ID, create_cluster_view, AdminSessionCreationData, ClusterSessionsListener}; -use key_server_cluster::cluster_sessions_creator::{ClusterSessionCreator, IntoSessionId}; -use key_server_cluster::message::{self, Message, ClusterMessage}; -use key_server_cluster::generation_session::{SessionImpl as GenerationSession}; -use key_server_cluster::decryption_session::{SessionImpl as DecryptionSession}; -use key_server_cluster::encryption_session::{SessionImpl as EncryptionSession}; -use key_server_cluster::signing_session_ecdsa::{SessionImpl as EcdsaSigningSession}; -use key_server_cluster::signing_session_schnorr::{SessionImpl as SchnorrSigningSession}; -use key_server_cluster::key_version_negotiation_session::{SessionImpl as KeyVersionNegotiationSession, - IsolatedSessionTransport as KeyVersionNegotiationSessionTransport, ContinueAction}; -use key_server_cluster::io::{DeadlineStatus, ReadMessage, SharedTcpStream, read_encrypted_message, WriteMessage, write_encrypted_message}; -use key_server_cluster::net::{accept_connection as net_accept_connection, connect as net_connect, Connection as NetConnection}; -use key_server_cluster::connection_trigger::{Maintain, ConnectionTrigger, SimpleConnectionTrigger, ServersSetChangeSessionCreatorConnector}; -use key_server_cluster::connection_trigger_with_migration::ConnectionTriggerWithMigration; - -/// Maintain interval (seconds). Every MAINTAIN_INTERVAL seconds node: -/// 1) checks if connected nodes are responding to KeepAlive messages -/// 2) tries to connect to disconnected nodes -/// 3) checks if enc/dec sessions are time-outed -const MAINTAIN_INTERVAL: u64 = 10; - -/// When no messages have been received from node within KEEP_ALIVE_SEND_INTERVAL seconds, -/// we must send KeepAlive message to the node to check if it still responds to messages. -const KEEP_ALIVE_SEND_INTERVAL: Duration = Duration::from_secs(30); -/// When no messages have been received from node within KEEP_ALIVE_DISCONNECT_INTERVAL seconds, -/// we must treat this node as non-responding && disconnect from it. -const KEEP_ALIVE_DISCONNECT_INTERVAL: Duration = Duration::from_secs(60); - -/// Empty future. -pub type BoxedEmptyFuture = Box + Send>; - -/// Cluster interface for external clients. -pub trait ClusterClient: Send + Sync { - /// Get cluster state. - fn cluster_state(&self) -> ClusterState; - /// Start new generation session. - fn new_generation_session(&self, session_id: SessionId, origin: Option
, author: Address, threshold: usize) -> Result, Error>; - /// Start new encryption session. - fn new_encryption_session(&self, session_id: SessionId, author: Requester, common_point: Public, encrypted_point: Public) -> Result, Error>; - /// Start new decryption session. - fn new_decryption_session(&self, session_id: SessionId, origin: Option
, requester: Requester, version: Option, is_shadow_decryption: bool, is_broadcast_decryption: bool) -> Result, Error>; - /// Start new Schnorr signing session. - fn new_schnorr_signing_session(&self, session_id: SessionId, requester: Requester, version: Option, message_hash: H256) -> Result, Error>; - /// Start new ECDSA session. - fn new_ecdsa_signing_session(&self, session_id: SessionId, requester: Requester, version: Option, message_hash: H256) -> Result, Error>; - /// Start new key version negotiation session. - fn new_key_version_negotiation_session(&self, session_id: SessionId) -> Result>, Error>; - /// Start new servers set change session. - fn new_servers_set_change_session(&self, session_id: Option, migration_id: Option, new_nodes_set: BTreeSet, old_set_signature: Signature, new_set_signature: Signature) -> Result, Error>; - - /// Listen for new generation sessions. - fn add_generation_listener(&self, listener: Arc>); - /// Listen for new decryption sessions. - fn add_decryption_listener(&self, listener: Arc>); - /// Listen for new key version negotiation sessions. - fn add_key_version_negotiation_listener(&self, listener: Arc>>); - - /// Ask node to make 'faulty' generation sessions. - #[cfg(test)] - fn make_faulty_generation_sessions(&self); - /// Get active generation session with given id. - #[cfg(test)] - fn generation_session(&self, session_id: &SessionId) -> Option>; - /// Try connect to disconnected nodes. - #[cfg(test)] - fn connect(&self); - /// Get key storage. - #[cfg(test)] - fn key_storage(&self) -> Arc; -} - -/// Cluster access for single session participant. -pub trait Cluster: Send + Sync { - /// Broadcast message to all other nodes. - fn broadcast(&self, message: Message) -> Result<(), Error>; - /// Send message to given node. - fn send(&self, to: &NodeId, message: Message) -> Result<(), Error>; - /// Is connected to given node? - fn is_connected(&self, node: &NodeId) -> bool; - /// Get a set of connected nodes. - fn nodes(&self) -> BTreeSet; - /// Get total count of configured key server nodes (valid at the time of ClusterView creation). - fn configured_nodes_count(&self) -> usize; - /// Get total count of connected key server nodes (valid at the time of ClusterView creation). - fn connected_nodes_count(&self) -> usize; -} - -/// Cluster initialization parameters. -#[derive(Clone)] -pub struct ClusterConfiguration { - /// Allow connecting to 'higher' nodes. - pub allow_connecting_to_higher_nodes: bool, - /// KeyPair this node holds. - pub self_key_pair: Arc, - /// Interface to listen to. - pub listen_address: (String, u16), - /// Cluster nodes set. - pub key_server_set: Arc, - /// Reference to key storage - pub key_storage: Arc, - /// Reference to ACL storage - pub acl_storage: Arc, - /// Administrator public key. - pub admin_public: Option, - /// Should key servers set change session when servers set changes? This - /// will only work when servers set is configured using KeyServerSet - /// contract. - pub auto_migrate_enabled: bool, -} - -/// Cluster state. -pub struct ClusterState { - /// Nodes, to which connections are established. - pub connected: BTreeSet, -} - -/// Network cluster implementation. -pub struct ClusterCore { - /// Listen address. - listen_address: SocketAddr, - /// Cluster data. - data: Arc, -} - -/// Network cluster client interface implementation. -pub struct ClusterClientImpl { - /// Cluster data. - data: Arc, -} - -/// Network cluster view. It is a communication channel, required in single session. -pub struct ClusterView { - core: Arc>, - configured_nodes_count: usize, - connected_nodes_count: usize, -} - -/// Cross-thread shareable cluster data. -pub struct ClusterData { - /// Cluster configuration. - pub config: ClusterConfiguration, - /// Handle to the event loop. - pub executor: Executor, - /// KeyPair this node holds. - pub self_key_pair: Arc, - /// Connections data. - pub connections: ClusterConnections, - /// Active sessions data. - pub sessions: ClusterSessions, - /// A shutdown flag. - pub is_shutdown: Arc, -} - -/// Connections that are forming the cluster. Lock order: trigger.lock() -> data.lock(). -pub struct ClusterConnections { - /// Self node id. - pub self_node_id: NodeId, - /// All known other key servers. - pub key_server_set: Arc, - /// Connections trigger. - pub trigger: Mutex>, - /// Servers set change session creator connector. - pub connector: Arc, - /// Connections data. - pub data: RwLock, -} - -/// Cluster connections data. -pub struct ClusterConnectionsData { - /// Is this node isolated from cluster? - pub is_isolated: bool, - /// Active key servers set. - pub nodes: BTreeMap, - /// Active connections to key servers. - pub connections: BTreeMap>, -} - -/// Cluster view core. -struct ClusterViewCore { - /// Cluster reference. - cluster: Arc, - /// Subset of nodes, required for this session. - nodes: BTreeSet, -} - -/// Connection to single node. -pub struct Connection { - /// Node id. - node_id: NodeId, - /// Node address. - node_address: SocketAddr, - /// Is inbound connection? - is_inbound: bool, - /// Tcp stream. - stream: SharedTcpStream, - /// Connection key. - key: KeyPair, - /// Last message time. - last_message_time: RwLock, -} - -impl ClusterCore { - pub fn new(executor: Executor, config: ClusterConfiguration) -> Result, Error> { - let listen_address = make_socket_address(&config.listen_address.0, config.listen_address.1)?; - let connections = ClusterConnections::new(&config)?; - let servers_set_change_creator_connector = connections.connector.clone(); - let sessions = ClusterSessions::new(&config, servers_set_change_creator_connector); - let data = ClusterData::new(&executor, config, connections, sessions); - - Ok(Arc::new(ClusterCore { - listen_address: listen_address, - data: data, - })) - } - - /// Create new client interface. - pub fn client(&self) -> Arc { - Arc::new(ClusterClientImpl::new(self.data.clone())) - } - - /// Get cluster configuration. - #[cfg(test)] - pub fn config(&self) -> &ClusterConfiguration { - &self.data.config - } - - /// Get connection to given node. - #[cfg(test)] - pub fn connection(&self, node: &NodeId) -> Option> { - self.data.connection(node) - } - - /// Run cluster. - pub fn run(&self) -> Result<(), Error> { - self.run_listener() - .and_then(|_| self.run_connections())?; - - // schedule maintain procedures - ClusterCore::schedule_maintain(self.data.clone()); - - Ok(()) - } - - /// Start listening for incoming connections. - pub fn run_listener(&self) -> Result<(), Error> { - // start listeining for incoming connections - self.data.spawn(ClusterCore::listen(self.data.clone(), self.listen_address.clone())?); - Ok(()) - } - - /// Start connecting to other nodes. - pub fn run_connections(&self) -> Result<(), Error> { - // try to connect to every other peer - ClusterCore::connect_disconnected_nodes(self.data.clone()); - Ok(()) - } - - /// Connect to peer. - fn connect(data: Arc, node_address: SocketAddr) { - data.clone().spawn(ClusterCore::connect_future(data, node_address)); - } - - /// Connect to socket using given context and executor. - fn connect_future(data: Arc, node_address: SocketAddr) -> BoxedEmptyFuture { - let disconnected_nodes = data.connections.disconnected_nodes().keys().cloned().collect(); - Box::new(net_connect(&node_address, data.self_key_pair.clone(), disconnected_nodes) - .then(move |result| ClusterCore::process_connection_result(data, Some(node_address), result)) - .then(|_| future::ok(()))) - } - - /// Start listening for incoming connections. - fn listen(data: Arc, listen_address: SocketAddr) -> Result { - Ok(Box::new(TcpListener::bind(&listen_address)? - .incoming() - .and_then(move |stream| { - ClusterCore::accept_connection(data.clone(), stream); - Ok(()) - }) - .for_each(|_| Ok(())) - .then(|_| future::ok(())))) - } - - /// Accept connection. - fn accept_connection(data: Arc, stream: TcpStream) { - data.clone().spawn(ClusterCore::accept_connection_future(data, stream)) - } - - /// Accept connection future. - fn accept_connection_future(data: Arc, stream: TcpStream) -> BoxedEmptyFuture { - Box::new(net_accept_connection(stream, data.self_key_pair.clone()) - .then(move |result| ClusterCore::process_connection_result(data, None, result)) - .then(|_| future::ok(()))) - } - - /// Schedule mainatain procedures. - fn schedule_maintain(data: Arc) { - let d = data.clone(); - - let interval = Interval::new_interval(Duration::new(MAINTAIN_INTERVAL, 0)) - .and_then(move |_| Ok(ClusterCore::maintain(data.clone()))) - .for_each(|_| Ok(())) - .then(|_| future::ok(())); - - d.spawn(interval); - } - - /// Execute maintain procedures. - fn maintain(data: Arc) { - trace!(target: "secretstore_net", "{}: executing maintain procedures", data.self_key_pair.public()); - - ClusterCore::keep_alive(data.clone()); - ClusterCore::connect_disconnected_nodes(data.clone()); - data.sessions.stop_stalled_sessions(); - } - - /// Called for every incomming mesage. - fn process_connection_messages(data: Arc, connection: Arc) -> IoFuture> { - Box::new(connection - .read_message() - .then(move |result| - match result { - Ok((_, Ok(message))) => { - ClusterCore::process_connection_message(data.clone(), connection.clone(), message); - // continue serving connection - data.spawn(ClusterCore::process_connection_messages(data.clone(), connection).then(|_| Ok(()))); - Box::new(future::ok(Ok(()))) - }, - Ok((_, Err(err))) => { - warn!(target: "secretstore_net", "{}: protocol error '{}' when reading message from node {}", data.self_key_pair.public(), err, connection.node_id()); - // continue serving connection - data.spawn(ClusterCore::process_connection_messages(data.clone(), connection).then(|_| Ok(()))); - Box::new(future::ok(Err(err))) - }, - Err(err) => { - warn!(target: "secretstore_net", "{}: network error '{}' when reading message from node {}", data.self_key_pair.public(), err, connection.node_id()); - // close connection - data.connections.remove(data.clone(), connection.node_id(), connection.is_inbound()); - Box::new(future::err(err)) - }, - } - )) - } - - /// Send keepalive messages to every othe node. - fn keep_alive(data: Arc) { - data.sessions.sessions_keep_alive(); - for connection in data.connections.active_connections() { - let last_message_diff = Instant::now() - connection.last_message_time(); - if last_message_diff > KEEP_ALIVE_DISCONNECT_INTERVAL { - warn!(target: "secretstore_net", "{}: keep alive timeout for node {}", - data.self_key_pair.public(), connection.node_id()); - - data.connections.remove(data.clone(), connection.node_id(), connection.is_inbound()); - data.sessions.on_connection_timeout(connection.node_id()); - } - else if last_message_diff > KEEP_ALIVE_SEND_INTERVAL { - data.spawn(connection.send_message(Message::Cluster(ClusterMessage::KeepAlive(message::KeepAlive {}))).then(|_| Ok(()))); - } - } - } - - /// Try to connect to every disconnected node. - fn connect_disconnected_nodes(data: Arc) { - let r = data.connections.update_nodes_set(data.clone()); - if let Some(r) = r { - data.spawn(r); - } - - // connect to disconnected nodes - for (node_id, node_address) in data.connections.disconnected_nodes() { - if data.config.allow_connecting_to_higher_nodes || data.self_key_pair.public() < &node_id { - ClusterCore::connect(data.clone(), node_address); - } - } - } - - /// Process connection future result. - fn process_connection_result(data: Arc, outbound_addr: Option, - result: Result>, TimeoutError>) -> IoFuture> - { - match result { - Ok(DeadlineStatus::Meet(Ok(connection))) => { - let connection = Connection::new(outbound_addr.is_none(), connection); - if data.connections.insert(data.clone(), connection.clone()) { - ClusterCore::process_connection_messages(data.clone(), connection) - } else { - Box::new(future::ok(Ok(()))) - } - }, - Ok(DeadlineStatus::Meet(Err(err))) => { - warn!(target: "secretstore_net", "{}: protocol error '{}' when establishing {} connection{}", - data.self_key_pair.public(), err, if outbound_addr.is_some() { "outbound" } else { "inbound" }, - outbound_addr.map(|a| format!(" with {}", a)).unwrap_or_default()); - Box::new(future::ok(Ok(()))) - }, - Ok(DeadlineStatus::Timeout) => { - warn!(target: "secretstore_net", "{}: timeout when establishing {} connection{}", - data.self_key_pair.public(), if outbound_addr.is_some() { "outbound" } else { "inbound" }, - outbound_addr.map(|a| format!(" with {}", a)).unwrap_or_default()); - Box::new(future::ok(Ok(()))) - }, - Err(err) => { - warn!(target: "secretstore_net", "{}: network error '{}' when establishing {} connection{}", - data.self_key_pair.public(), err, if outbound_addr.is_some() { "outbound" } else { "inbound" }, - outbound_addr.map(|a| format!(" with {}", a)).unwrap_or_default()); - Box::new(future::ok(Ok(()))) - }, - } - } - - /// Process single message from the connection. - fn process_connection_message(data: Arc, connection: Arc, message: Message) { - connection.set_last_message_time(Instant::now()); - trace!(target: "secretstore_net", "{}: received message {} from {}", data.self_key_pair.public(), message, connection.node_id()); - // error is ignored as we only process errors on session level - match message { - Message::Generation(message) => Self::process_message(&data, &data.sessions.generation_sessions, connection, Message::Generation(message)) - .map(|_| ()).unwrap_or_default(), - Message::Encryption(message) => Self::process_message(&data, &data.sessions.encryption_sessions, connection, Message::Encryption(message)) - .map(|_| ()).unwrap_or_default(), - Message::Decryption(message) => Self::process_message(&data, &data.sessions.decryption_sessions, connection, Message::Decryption(message)) - .map(|_| ()).unwrap_or_default(), - Message::SchnorrSigning(message) => Self::process_message(&data, &data.sessions.schnorr_signing_sessions, connection, Message::SchnorrSigning(message)) - .map(|_| ()).unwrap_or_default(), - Message::EcdsaSigning(message) => Self::process_message(&data, &data.sessions.ecdsa_signing_sessions, connection, Message::EcdsaSigning(message)) - .map(|_| ()).unwrap_or_default(), - Message::ServersSetChange(message) => { - let message = Message::ServersSetChange(message); - let is_initialization_message = message.is_initialization_message(); - let session = Self::process_message(&data, &data.sessions.admin_sessions, connection, message); - if is_initialization_message { - if let Some(session) = session { - data.connections.servers_set_change_creator_connector().set_key_servers_set_change_session(session.clone()); - } - } - } - Message::KeyVersionNegotiation(message) => { - let session = Self::process_message(&data, &data.sessions.negotiation_sessions, connection, Message::KeyVersionNegotiation(message)); - Self::try_continue_session(&data, session); - }, - Message::ShareAdd(message) => Self::process_message(&data, &data.sessions.admin_sessions, connection, Message::ShareAdd(message)) - .map(|_| ()).unwrap_or_default(), - Message::Cluster(message) => ClusterCore::process_cluster_message(data, connection, message), - } - } - - /// Try to contnue session. - fn try_continue_session(data: &Arc, session: Option>>) { - if let Some(session) = session { - let meta = session.meta(); - let is_master_node = meta.self_node_id == meta.master_node_id; - if is_master_node && session.is_finished() { - data.sessions.negotiation_sessions.remove(&session.id()); - match session.wait() { - Ok(Some((version, master))) => match session.take_continue_action() { - Some(ContinueAction::Decrypt(session, origin, is_shadow_decryption, is_broadcast_decryption)) => { - let initialization_error = if data.self_key_pair.public() == &master { - session.initialize(origin, version, is_shadow_decryption, is_broadcast_decryption) - } else { - session.delegate(master, origin, version, is_shadow_decryption, is_broadcast_decryption) - }; - - if let Err(error) = initialization_error { - session.on_session_error(&meta.self_node_id, error); - data.sessions.decryption_sessions.remove(&session.id()); - } - }, - Some(ContinueAction::SchnorrSign(session, message_hash)) => { - let initialization_error = if data.self_key_pair.public() == &master { - session.initialize(version, message_hash) - } else { - session.delegate(master, version, message_hash) - }; - - if let Err(error) = initialization_error { - session.on_session_error(&meta.self_node_id, error); - data.sessions.schnorr_signing_sessions.remove(&session.id()); - } - }, - Some(ContinueAction::EcdsaSign(session, message_hash)) => { - let initialization_error = if data.self_key_pair.public() == &master { - session.initialize(version, message_hash) - } else { - session.delegate(master, version, message_hash) - }; - - if let Err(error) = initialization_error { - session.on_session_error(&meta.self_node_id, error); - data.sessions.ecdsa_signing_sessions.remove(&session.id()); - } - }, - None => (), - }, - Ok(None) => unreachable!("is_master_node; session is finished; negotiation version always finished with result on master; qed"), - Err(error) => match session.take_continue_action() { - Some(ContinueAction::Decrypt(session, _, _, _)) => { - session.on_session_error(&meta.self_node_id, error); - data.sessions.decryption_sessions.remove(&session.id()); - }, - Some(ContinueAction::SchnorrSign(session, _)) => { - session.on_session_error(&meta.self_node_id, error); - data.sessions.schnorr_signing_sessions.remove(&session.id()); - }, - Some(ContinueAction::EcdsaSign(session, _)) => { - session.on_session_error(&meta.self_node_id, error); - data.sessions.ecdsa_signing_sessions.remove(&session.id()); - }, - None => (), - }, - } - } - } - } - - /// Get or insert new session. - fn prepare_session, D>(data: &Arc, sessions: &ClusterSessionsContainer, sender: &NodeId, message: &Message) -> Result, Error> - where Message: IntoSessionId { - fn requires_all_connections(message: &Message) -> bool { - match *message { - Message::Generation(_) => true, - Message::ShareAdd(_) => true, - Message::ServersSetChange(_) => true, - _ => false, - } - } - - // get or create new session, if required - let session_id = message.into_session_id().expect("into_session_id fails for cluster messages only; only session messages are passed to prepare_session; qed"); - let is_initialization_message = message.is_initialization_message(); - let is_delegation_message = message.is_delegation_message(); - match is_initialization_message || is_delegation_message { - false => sessions.get(&session_id, true).ok_or(Error::NoActiveSessionWithId), - true => { - let creation_data = SC::creation_data_from_message(&message)?; - let master = if is_initialization_message { sender.clone() } else { data.self_key_pair.public().clone() }; - let cluster = create_cluster_view(data, requires_all_connections(&message))?; - - sessions.insert(cluster, master, session_id, Some(message.session_nonce().ok_or(Error::InvalidMessage)?), message.is_exclusive_session_message(), creation_data) - }, - } - } - - /// Process single session message from connection. - fn process_message, D>(data: &Arc, sessions: &ClusterSessionsContainer, connection: Arc, mut message: Message) -> Option> - where Message: IntoSessionId { - - // get or create new session, if required - let mut sender = connection.node_id().clone(); - let session = Self::prepare_session(data, sessions, &sender, &message); - // send error if session is not found, or failed to create - let session = match session { - Ok(session) => session, - Err(error) => { - // this is new session => it is not yet in container - warn!(target: "secretstore_net", "{}: {} session read error '{}' when requested for session from node {}", - data.self_key_pair.public(), S::type_name(), error, sender); - if !message.is_error_message() { - let session_id = message.into_session_id().expect("session_id only fails for cluster messages; only session messages are passed to process_message; qed"); - let session_nonce = message.session_nonce().expect("session_nonce only fails for cluster messages; only session messages are passed to process_message; qed"); - data.spawn(connection.send_message(SC::make_error_message(session_id, session_nonce, error)).then(|_| Ok(()))); - } - return None; - }, - }; - - let session_id = session.id(); - let mut is_queued_message = false; - loop { - let message_result = session.on_message(&sender, &message); - match message_result { - Ok(_) => { - // if session is completed => stop - if session.is_finished() { - info!(target: "secretstore_net", "{}: {} session completed", data.self_key_pair.public(), S::type_name()); - sessions.remove(&session_id); - return Some(session); - } - - // try to dequeue message - match sessions.dequeue_message(&session_id) { - Some((msg_sender, msg)) => { - is_queued_message = true; - sender = msg_sender; - message = msg; - }, - None => return Some(session), - } - }, - Err(Error::TooEarlyForRequest) => { - sessions.enqueue_message(&session_id, sender, message, is_queued_message); - return Some(session); - }, - Err(err) => { - warn!(target: "secretstore_net", "{}: {} session error '{}' when processing message {} from node {}", - data.self_key_pair.public(), - S::type_name(), - err, - message, - sender); - session.on_session_error(data.self_key_pair.public(), err); - sessions.remove(&session_id); - return Some(session); - }, - } - } - } - - /// Process single cluster message from the connection. - fn process_cluster_message(data: Arc, connection: Arc, message: ClusterMessage) { - match message { - ClusterMessage::KeepAlive(_) => data.spawn(connection.send_message(Message::Cluster(ClusterMessage::KeepAliveResponse(message::KeepAliveResponse { - session_id: None, - }))).then(|_| Ok(()))), - ClusterMessage::KeepAliveResponse(msg) => if let Some(session_id) = msg.session_id { - data.sessions.on_session_keep_alive(connection.node_id(), session_id.into()); - }, - _ => warn!(target: "secretstore_net", "{}: received unexpected message {} from node {} at {}", data.self_key_pair.public(), message, connection.node_id(), connection.node_address()), - } - } - - /// Prevents new tasks from being spawned. - #[cfg(test)] - pub fn shutdown(&self) { - self.data.shutdown() - } -} - -impl ClusterConnections { - pub fn new(config: &ClusterConfiguration) -> Result { - let mut nodes = config.key_server_set.snapshot().current_set; - let is_isolated = nodes.remove(config.self_key_pair.public()).is_none(); - - let trigger: Box = match config.auto_migrate_enabled { - false => Box::new(SimpleConnectionTrigger::new(config.key_server_set.clone(), config.self_key_pair.clone(), config.admin_public.clone())), - true if config.admin_public.is_none() => Box::new(ConnectionTriggerWithMigration::new(config.key_server_set.clone(), config.self_key_pair.clone())), - true => return Err(Error::Internal("secret store admininstrator public key is specified with auto-migration enabled".into())), - }; - let connector = trigger.servers_set_change_creator_connector(); - - Ok(ClusterConnections { - self_node_id: config.self_key_pair.public().clone(), - key_server_set: config.key_server_set.clone(), - trigger: Mutex::new(trigger), - connector: connector, - data: RwLock::new(ClusterConnectionsData { - is_isolated: is_isolated, - nodes: nodes, - connections: BTreeMap::new(), - }), - }) - } - - pub fn cluster_state(&self) -> ClusterState { - ClusterState { - connected: self.data.read().connections.keys().cloned().collect(), - } - } - - pub fn get(&self, node: &NodeId) -> Option> { - self.data.read().connections.get(node).cloned() - } - - pub fn insert(&self, data: Arc, connection: Arc) -> bool { - { - let mut data = self.data.write(); - if !data.nodes.contains_key(connection.node_id()) { - // incoming connections are checked here - trace!(target: "secretstore_net", "{}: ignoring unknown connection from {} at {}", self.self_node_id, connection.node_id(), connection.node_address()); - debug_assert!(connection.is_inbound()); - return false; - } - - if data.connections.contains_key(connection.node_id()) { - // we have already connected to the same node - // the agreement is that node with lower id must establish connection to node with higher id - if (&self.self_node_id < connection.node_id() && connection.is_inbound()) - || (&self.self_node_id > connection.node_id() && !connection.is_inbound()) { - return false; - } - } - - let node = connection.node_id().clone(); - trace!(target: "secretstore_net", "{}: inserting connection to {} at {}. Connected to {} of {} nodes", - self.self_node_id, node, connection.node_address(), data.connections.len() + 1, data.nodes.len()); - data.connections.insert(node.clone(), connection.clone()); - } - - let maintain_action = self.trigger.lock().on_connection_established(connection.node_id()); - self.maintain_connection_trigger(maintain_action, data); - - true - } - - pub fn remove(&self, data: Arc, node: &NodeId, is_inbound: bool) { - { - let mut data = self.data.write(); - if let Entry::Occupied(entry) = data.connections.entry(node.clone()) { - if entry.get().is_inbound() != is_inbound { - return; - } - - trace!(target: "secretstore_net", "{}: removing connection to {} at {}", self.self_node_id, entry.get().node_id(), entry.get().node_address()); - entry.remove_entry(); - } else { - return; - } - } - - let maintain_action = self.trigger.lock().on_connection_closed(node); - self.maintain_connection_trigger(maintain_action, data); - } - - pub fn connected_nodes(&self) -> Result, Error> { - let data = self.data.read(); - if data.is_isolated { - return Err(Error::NodeDisconnected); - } - - Ok(data.connections.keys().cloned().collect()) - } - - pub fn active_connections(&self)-> Vec> { - self.data.read().connections.values().cloned().collect() - } - - pub fn disconnected_nodes(&self) -> BTreeMap { - let data = self.data.read(); - data.nodes.iter() - .filter(|&(node_id, _)| !data.connections.contains_key(node_id)) - .map(|(node_id, node_address)| (node_id.clone(), node_address.clone())) - .collect() - } - - pub fn servers_set_change_creator_connector(&self) -> Arc { - self.connector.clone() - } - - pub fn update_nodes_set(&self, data: Arc) -> Option { - let maintain_action = self.trigger.lock().on_maintain(); - self.maintain_connection_trigger(maintain_action, data); - None - } - - fn maintain_connection_trigger(&self, maintain_action: Option, data: Arc) { - if maintain_action == Some(Maintain::SessionAndConnections) || maintain_action == Some(Maintain::Session) { - let client = ClusterClientImpl::new(data); - self.trigger.lock().maintain_session(&client); - } - if maintain_action == Some(Maintain::SessionAndConnections) || maintain_action == Some(Maintain::Connections) { - let mut trigger = self.trigger.lock(); - let mut data = self.data.write(); - trigger.maintain_connections(&mut *data); - } - } -} - -impl ClusterData { - pub fn new(executor: &Executor, config: ClusterConfiguration, connections: ClusterConnections, sessions: ClusterSessions) -> Arc { - Arc::new(ClusterData { - executor: executor.clone(), - self_key_pair: config.self_key_pair.clone(), - connections: connections, - sessions: sessions, - config: config, - is_shutdown: Arc::new(AtomicBool::new(false)), - }) - } - - /// Get connection to given node. - pub fn connection(&self, node: &NodeId) -> Option> { - self.connections.get(node) - } - - /// Spawns a future on the runtime. - pub fn spawn(&self, f: F) where F: Future + Send + 'static { - if self.is_shutdown.load(Ordering::Acquire) == false { - if let Err(err) = future::Executor::execute(&self.executor, Box::new(f)) { - error!("Secret store runtime unable to spawn task. Runtime is shutting down. ({:?})", err); - } - } else { - error!("Secret store runtime unable to spawn task. Shutdown has been started."); - } - } - - /// Sets the `is_shutdown` flag which prevents future tasks from being - /// spawned via `::spawn`. - #[cfg(test)] - pub fn shutdown(&self) { - self.is_shutdown.store(true, Ordering::Release); - } -} - -impl Connection { - pub fn new(is_inbound: bool, connection: NetConnection) -> Arc { - Arc::new(Connection { - node_id: connection.node_id, - node_address: connection.address, - is_inbound: is_inbound, - stream: connection.stream, - key: connection.key, - last_message_time: RwLock::new(Instant::now()), - }) - } - - pub fn is_inbound(&self) -> bool { - self.is_inbound - } - - pub fn node_id(&self) -> &NodeId { - &self.node_id - } - - pub fn last_message_time(&self) -> Instant { - *self.last_message_time.read() - } - - pub fn set_last_message_time(&self, last_message_time: Instant) { - *self.last_message_time.write() = last_message_time; - } - - pub fn node_address(&self) -> &SocketAddr { - &self.node_address - } - - pub fn send_message(&self, message: Message) -> WriteMessage { - write_encrypted_message(self.stream.clone(), &self.key, message) - } - - pub fn read_message(&self) -> ReadMessage { - read_encrypted_message(self.stream.clone(), self.key.clone()) - } -} - -impl ClusterView { - pub fn new(cluster: Arc, nodes: BTreeSet, configured_nodes_count: usize) -> Self { - ClusterView { - configured_nodes_count: configured_nodes_count, - connected_nodes_count: nodes.len(), - core: Arc::new(RwLock::new(ClusterViewCore { - cluster: cluster, - nodes: nodes, - })), - } - } -} - -impl Cluster for ClusterView { - fn broadcast(&self, message: Message) -> Result<(), Error> { - let core = self.core.read(); - for node in core.nodes.iter().filter(|n| *n != core.cluster.self_key_pair.public()) { - trace!(target: "secretstore_net", "{}: sent message {} to {}", core.cluster.self_key_pair.public(), message, node); - let connection = core.cluster.connection(node).ok_or(Error::NodeDisconnected)?; - core.cluster.spawn(connection.send_message(message.clone()).then(|_| Ok(()))) - } - Ok(()) - } - - fn send(&self, to: &NodeId, message: Message) -> Result<(), Error> { - let core = self.core.read(); - trace!(target: "secretstore_net", "{}: sent message {} to {}", core.cluster.self_key_pair.public(), message, to); - let connection = core.cluster.connection(to).ok_or(Error::NodeDisconnected)?; - core.cluster.spawn(connection.send_message(message).then(|_| Ok(()))); - Ok(()) - } - - fn is_connected(&self, node: &NodeId) -> bool { - self.core.read().nodes.contains(node) - } - - fn nodes(&self) -> BTreeSet { - self.core.read().nodes.clone() - } - - fn configured_nodes_count(&self) -> usize { - self.configured_nodes_count - } - - fn connected_nodes_count(&self) -> usize { - self.connected_nodes_count - } -} - -impl ClusterClientImpl { - pub fn new(data: Arc) -> Self { - ClusterClientImpl { - data: data, - } - } - - fn create_key_version_negotiation_session(&self, session_id: SessionId) -> Result>, Error> { - let mut connected_nodes = self.data.connections.connected_nodes()?; - connected_nodes.insert(self.data.self_key_pair.public().clone()); - - let access_key = Random.generate()?.secret().clone(); - let session_id = SessionIdWithSubSession::new(session_id, access_key); - let cluster = create_cluster_view(&self.data, false)?; - let session = self.data.sessions.negotiation_sessions.insert(cluster, self.data.self_key_pair.public().clone(), session_id.clone(), None, false, None)?; - match session.initialize(connected_nodes) { - Ok(()) => Ok(session), - Err(error) => { - self.data.sessions.negotiation_sessions.remove(&session.id()); - Err(error) - } - } - } - - fn process_initialization_result, D>(result: Result<(), Error>, session: Arc, sessions: &ClusterSessionsContainer) -> Result, Error> { - match result { - Ok(()) if session.is_finished() => { - sessions.remove(&session.id()); - Ok(session) - }, - Ok(()) => Ok(session), - Err(error) => { - sessions.remove(&session.id()); - Err(error) - }, - } - } -} - -impl ClusterClient for ClusterClientImpl { - fn cluster_state(&self) -> ClusterState { - self.data.connections.cluster_state() - } - - fn new_generation_session(&self, session_id: SessionId, origin: Option
, author: Address, threshold: usize) -> Result, Error> { - let mut connected_nodes = self.data.connections.connected_nodes()?; - connected_nodes.insert(self.data.self_key_pair.public().clone()); - - let cluster = create_cluster_view(&self.data, true)?; - let session = self.data.sessions.generation_sessions.insert(cluster, self.data.self_key_pair.public().clone(), session_id, None, false, None)?; - Self::process_initialization_result( - session.initialize(origin, author, false, threshold, connected_nodes.into()), - session, &self.data.sessions.generation_sessions) - } - - fn new_encryption_session(&self, session_id: SessionId, requester: Requester, common_point: Public, encrypted_point: Public) -> Result, Error> { - let mut connected_nodes = self.data.connections.connected_nodes()?; - connected_nodes.insert(self.data.self_key_pair.public().clone()); - - let cluster = create_cluster_view(&self.data, true)?; - let session = self.data.sessions.encryption_sessions.insert(cluster, self.data.self_key_pair.public().clone(), session_id, None, false, None)?; - Self::process_initialization_result( - session.initialize(requester, common_point, encrypted_point), - session, &self.data.sessions.encryption_sessions) - } - - fn new_decryption_session(&self, session_id: SessionId, origin: Option
, requester: Requester, version: Option, is_shadow_decryption: bool, is_broadcast_decryption: bool) -> Result, Error> { - let mut connected_nodes = self.data.connections.connected_nodes()?; - connected_nodes.insert(self.data.self_key_pair.public().clone()); - - let access_key = Random.generate()?.secret().clone(); - let session_id = SessionIdWithSubSession::new(session_id, access_key); - let cluster = create_cluster_view(&self.data, false)?; - let session = self.data.sessions.decryption_sessions.insert(cluster, self.data.self_key_pair.public().clone(), - session_id.clone(), None, false, Some(requester))?; - - let initialization_result = match version { - Some(version) => session.initialize(origin, version, is_shadow_decryption, is_broadcast_decryption), - None => { - self.create_key_version_negotiation_session(session_id.id.clone()) - .map(|version_session| { - version_session.set_continue_action(ContinueAction::Decrypt(session.clone(), origin, is_shadow_decryption, is_broadcast_decryption)); - ClusterCore::try_continue_session(&self.data, Some(version_session)); - }) - }, - }; - - Self::process_initialization_result( - initialization_result, - session, &self.data.sessions.decryption_sessions) - } - - fn new_schnorr_signing_session(&self, session_id: SessionId, requester: Requester, version: Option, message_hash: H256) -> Result, Error> { - let mut connected_nodes = self.data.connections.connected_nodes()?; - connected_nodes.insert(self.data.self_key_pair.public().clone()); - - let access_key = Random.generate()?.secret().clone(); - let session_id = SessionIdWithSubSession::new(session_id, access_key); - let cluster = create_cluster_view(&self.data, false)?; - let session = self.data.sessions.schnorr_signing_sessions.insert(cluster, self.data.self_key_pair.public().clone(), session_id.clone(), None, false, Some(requester))?; - - let initialization_result = match version { - Some(version) => session.initialize(version, message_hash), - None => { - self.create_key_version_negotiation_session(session_id.id.clone()) - .map(|version_session| { - version_session.set_continue_action(ContinueAction::SchnorrSign(session.clone(), message_hash)); - ClusterCore::try_continue_session(&self.data, Some(version_session)); - }) - }, - }; - - Self::process_initialization_result( - initialization_result, - session, &self.data.sessions.schnorr_signing_sessions) - } - - fn new_ecdsa_signing_session(&self, session_id: SessionId, requester: Requester, version: Option, message_hash: H256) -> Result, Error> { - let mut connected_nodes = self.data.connections.connected_nodes()?; - connected_nodes.insert(self.data.self_key_pair.public().clone()); - - let access_key = Random.generate()?.secret().clone(); - let session_id = SessionIdWithSubSession::new(session_id, access_key); - let cluster = create_cluster_view(&self.data, false)?; - let session = self.data.sessions.ecdsa_signing_sessions.insert(cluster, self.data.self_key_pair.public().clone(), session_id.clone(), None, false, Some(requester))?; - - let initialization_result = match version { - Some(version) => session.initialize(version, message_hash), - None => { - self.create_key_version_negotiation_session(session_id.id.clone()) - .map(|version_session| { - version_session.set_continue_action(ContinueAction::EcdsaSign(session.clone(), message_hash)); - ClusterCore::try_continue_session(&self.data, Some(version_session)); - }) - }, - }; - - Self::process_initialization_result( - initialization_result, - session, &self.data.sessions.ecdsa_signing_sessions) - } - - fn new_key_version_negotiation_session(&self, session_id: SessionId) -> Result>, Error> { - let session = self.create_key_version_negotiation_session(session_id)?; - Ok(session) - } - - fn new_servers_set_change_session(&self, session_id: Option, migration_id: Option, new_nodes_set: BTreeSet, old_set_signature: Signature, new_set_signature: Signature) -> Result, Error> { - let mut connected_nodes = self.data.connections.connected_nodes()?; - connected_nodes.insert(self.data.self_key_pair.public().clone()); - - let session_id = match session_id { - Some(session_id) if session_id == *SERVERS_SET_CHANGE_SESSION_ID => session_id, - Some(_) => return Err(Error::InvalidMessage), - None => *SERVERS_SET_CHANGE_SESSION_ID, - }; - - let cluster = create_cluster_view(&self.data, true)?; - let creation_data = Some(AdminSessionCreationData::ServersSetChange(migration_id, new_nodes_set.clone())); - let session = self.data.sessions.admin_sessions.insert(cluster, self.data.self_key_pair.public().clone(), session_id, None, true, creation_data)?; - let initialization_result = session.as_servers_set_change().expect("servers set change session is created; qed") - .initialize(new_nodes_set, old_set_signature, new_set_signature); - - if initialization_result.is_ok() { - self.data.connections.servers_set_change_creator_connector().set_key_servers_set_change_session(session.clone()); - } - - Self::process_initialization_result( - initialization_result, - session, &self.data.sessions.admin_sessions) - } - - fn add_generation_listener(&self, listener: Arc>) { - self.data.sessions.generation_sessions.add_listener(listener); - } - - fn add_decryption_listener(&self, listener: Arc>) { - self.data.sessions.decryption_sessions.add_listener(listener); - } - - fn add_key_version_negotiation_listener(&self, listener: Arc>>) { - self.data.sessions.negotiation_sessions.add_listener(listener); - } - - #[cfg(test)] - fn connect(&self) { - ClusterCore::connect_disconnected_nodes(self.data.clone()); - } - - #[cfg(test)] - fn make_faulty_generation_sessions(&self) { - self.data.sessions.make_faulty_generation_sessions(); - } - - #[cfg(test)] - fn generation_session(&self, session_id: &SessionId) -> Option> { - self.data.sessions.generation_sessions.get(session_id, false) - } - - #[cfg(test)] - fn key_storage(&self) -> Arc { - self.data.config.key_storage.clone() - } -} - -fn make_socket_address(address: &str, port: u16) -> Result { - let ip_address: IpAddr = address.parse().map_err(|_| Error::InvalidNodeAddress)?; - Ok(SocketAddr::new(ip_address, port)) -} - -#[cfg(test)] -pub mod tests { - use std::sync::Arc; - use std::sync::atomic::{AtomicUsize, Ordering}; - use std::time::{Duration, Instant}; - use std::collections::{BTreeSet, VecDeque}; - use parking_lot::RwLock; - use tokio::{ - prelude::{future, Future}, - }; - use parity_runtime::{ - futures::sync::oneshot, - Runtime, Executor, - }; - use ethereum_types::{Address, H256}; - use ethkey::{Random, Generator, Public, Signature, sign}; - use key_server_cluster::{NodeId, SessionId, Requester, Error, DummyAclStorage, DummyKeyStorage, - MapKeyServerSet, PlainNodeKeyPair, KeyStorage}; - use key_server_cluster::message::Message; - use key_server_cluster::cluster::{Cluster, ClusterCore, ClusterConfiguration, ClusterClient, ClusterState}; - use key_server_cluster::cluster_sessions::{ClusterSession, AdminSession, ClusterSessionsListener}; - use key_server_cluster::generation_session::{SessionImpl as GenerationSession, SessionState as GenerationSessionState}; - use key_server_cluster::decryption_session::{SessionImpl as DecryptionSession}; - use key_server_cluster::encryption_session::{SessionImpl as EncryptionSession}; - use key_server_cluster::signing_session_ecdsa::{SessionImpl as EcdsaSigningSession}; - use key_server_cluster::signing_session_schnorr::{SessionImpl as SchnorrSigningSession}; - use key_server_cluster::key_version_negotiation_session::{SessionImpl as KeyVersionNegotiationSession, - IsolatedSessionTransport as KeyVersionNegotiationSessionTransport}; - - const TIMEOUT: Duration = Duration::from_millis(1000); - - #[derive(Default)] - pub struct DummyClusterClient { - pub generation_requests_count: AtomicUsize, - } - - #[derive(Debug)] - pub struct DummyCluster { - id: NodeId, - data: RwLock, - } - - #[derive(Debug, Default)] - struct DummyClusterData { - nodes: BTreeSet, - messages: VecDeque<(NodeId, Message)>, - } - - impl ClusterClient for DummyClusterClient { - fn cluster_state(&self) -> ClusterState { unimplemented!("test-only") } - fn new_generation_session(&self, _session_id: SessionId, _origin: Option
, _author: Address, _threshold: usize) -> Result, Error> { - self.generation_requests_count.fetch_add(1, Ordering::Relaxed); - Err(Error::Internal("test-error".into())) - } - fn new_encryption_session(&self, _session_id: SessionId, _requester: Requester, _common_point: Public, _encrypted_point: Public) -> Result, Error> { unimplemented!("test-only") } - fn new_decryption_session(&self, _session_id: SessionId, _origin: Option
, _requester: Requester, _version: Option, _is_shadow_decryption: bool, _is_broadcast_session: bool) -> Result, Error> { unimplemented!("test-only") } - fn new_schnorr_signing_session(&self, _session_id: SessionId, _requester: Requester, _version: Option, _message_hash: H256) -> Result, Error> { unimplemented!("test-only") } - fn new_ecdsa_signing_session(&self, _session_id: SessionId, _requester: Requester, _version: Option, _message_hash: H256) -> Result, Error> { unimplemented!("test-only") } - - fn new_key_version_negotiation_session(&self, _session_id: SessionId) -> Result>, Error> { unimplemented!("test-only") } - fn new_servers_set_change_session(&self, _session_id: Option, _migration_id: Option, _new_nodes_set: BTreeSet, _old_set_signature: Signature, _new_set_signature: Signature) -> Result, Error> { unimplemented!("test-only") } - - fn add_generation_listener(&self, _listener: Arc>) {} - fn add_decryption_listener(&self, _listener: Arc>) {} - fn add_key_version_negotiation_listener(&self, _listener: Arc>>) {} - - fn make_faulty_generation_sessions(&self) { unimplemented!("test-only") } - fn generation_session(&self, _session_id: &SessionId) -> Option> { unimplemented!("test-only") } - fn connect(&self) { unimplemented!("test-only") } - fn key_storage(&self) -> Arc { unimplemented!("test-only") } - } - - impl DummyCluster { - pub fn new(id: NodeId) -> Self { - DummyCluster { - id: id, - data: RwLock::new(DummyClusterData::default()) - } - } - - pub fn node(&self) -> NodeId { - self.id.clone() - } - - pub fn add_node(&self, node: NodeId) { - self.data.write().nodes.insert(node); - } - - pub fn add_nodes>(&self, nodes: I) { - self.data.write().nodes.extend(nodes) - } - - pub fn remove_node(&self, node: &NodeId) { - self.data.write().nodes.remove(node); - } - - pub fn take_message(&self) -> Option<(NodeId, Message)> { - self.data.write().messages.pop_front() - } - } - - impl Cluster for DummyCluster { - fn broadcast(&self, message: Message) -> Result<(), Error> { - let mut data = self.data.write(); - let all_nodes: Vec<_> = data.nodes.iter().cloned().filter(|n| n != &self.id).collect(); - for node in all_nodes { - data.messages.push_back((node, message.clone())); - } - Ok(()) - } - - fn send(&self, to: &NodeId, message: Message) -> Result<(), Error> { - debug_assert!(&self.id != to); - self.data.write().messages.push_back((to.clone(), message)); - Ok(()) - } - - fn is_connected(&self, node: &NodeId) -> bool { - let data = self.data.read(); - &self.id == node || data.nodes.contains(node) - } - - fn nodes(&self) -> BTreeSet { - self.data.read().nodes.iter().cloned().collect() - } - - fn configured_nodes_count(&self) -> usize { - self.data.read().nodes.len() - } - - fn connected_nodes_count(&self) -> usize { - self.data.read().nodes.len() - } - } - - /// Blocks the calling thread, looping until `predicate` returns `true` or - /// `timeout` has elapsed. - pub fn loop_until(executor: &Executor, timeout: Duration, predicate: F) - where F: Send + 'static + Fn() -> bool - { - use futures::Stream; - use tokio::timer::Interval; - - let start = Instant::now(); - let (complete_tx, complete_rx) = oneshot::channel(); - - executor.spawn(Interval::new_interval(Duration::from_millis(1)) - .and_then(move |_| { - if Instant::now() - start > timeout { - panic!("no result in {:?}", timeout); - } - - Ok(()) - }) - .take_while(move |_| future::ok(!predicate())) - .for_each(|_| Ok(())) - .then(|_| { - complete_tx.send(()).expect("receiver dropped"); - future::ok::<(), ()>(()) - }) - ); - - complete_rx.wait().unwrap(); - } - - pub fn all_connections_established(cluster: &Arc) -> bool { - cluster.config().key_server_set.snapshot().new_set.keys() - .filter(|p| *p != cluster.config().self_key_pair.public()) - .all(|p| cluster.connection(p).is_some()) - } - - pub fn make_clusters(runtime: &Runtime, ports_begin: u16, num_nodes: usize) -> Vec> { - let key_pairs: Vec<_> = (0..num_nodes).map(|_| Random.generate().unwrap()).collect(); - let cluster_params: Vec<_> = (0..num_nodes).map(|i| ClusterConfiguration { - self_key_pair: Arc::new(PlainNodeKeyPair::new(key_pairs[i].clone())), - listen_address: ("127.0.0.1".to_owned(), ports_begin + i as u16), - key_server_set: Arc::new(MapKeyServerSet::new(false, key_pairs.iter().enumerate() - .map(|(j, kp)| (kp.public().clone(), format!("127.0.0.1:{}", ports_begin + j as u16).parse().unwrap())) - .collect())), - allow_connecting_to_higher_nodes: false, - key_storage: Arc::new(DummyKeyStorage::default()), - acl_storage: Arc::new(DummyAclStorage::default()), - admin_public: None, - auto_migrate_enabled: false, - }).collect(); - let clusters: Vec<_> = cluster_params.into_iter().enumerate() - .map(|(_, params)| ClusterCore::new(runtime.executor(), params).unwrap()) - .collect(); - - clusters - } - - pub fn run_clusters(clusters: &[Arc]) { - for cluster in clusters { - cluster.run_listener().unwrap(); - } - for cluster in clusters { - cluster.run_connections().unwrap(); - } - } - - pub fn shutdown_clusters(clusters: &[Arc]) { - for cluster in clusters { - cluster.shutdown() - } - } - - /// Returns a new runtime with a static number of threads. - pub fn new_runtime() -> Runtime { - Runtime::with_thread_count(4) - } - - #[test] - fn cluster_connects_to_other_nodes() { - let runtime = new_runtime(); - let clusters = make_clusters(&runtime, 6010, 3); - run_clusters(&clusters); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || clusters_clone.iter().all(all_connections_established)); - shutdown_clusters(&clusters); - } - - #[test] - fn cluster_wont_start_generation_session_if_not_fully_connected() { - let runtime = new_runtime(); - let clusters = make_clusters(&runtime, 6013, 3); - clusters[0].run().unwrap(); - match clusters[0].client().new_generation_session(SessionId::default(), Default::default(), Default::default(), 1) { - Err(Error::NodeDisconnected) => (), - Err(e) => panic!("unexpected error {:?}", e), - _ => panic!("unexpected success"), - } - shutdown_clusters(&clusters); - } - - #[test] - fn error_in_generation_session_broadcasted_to_all_other_nodes() { - //::logger::init_log(); - let runtime = new_runtime(); - let clusters = make_clusters(&runtime, 6016, 3); - run_clusters(&clusters); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || clusters_clone.iter().all(all_connections_established)); - - // ask one of nodes to produce faulty generation sessions - clusters[1].client().make_faulty_generation_sessions(); - - // start && wait for generation session to fail - let session = clusters[0].client().new_generation_session(SessionId::default(), Default::default(), Default::default(), 1).unwrap(); - let session_clone = session.clone(); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || session_clone.joint_public_and_secret().is_some() - && clusters_clone[0].client().generation_session(&SessionId::default()).is_none()); - assert!(session.joint_public_and_secret().unwrap().is_err()); - - // check that faulty session is either removed from all nodes, or nonexistent (already removed) - for i in 1..3 { - if let Some(session) = clusters[i].client().generation_session(&SessionId::default()) { - let session_clone = session.clone(); - let clusters_clone = clusters.clone(); - // wait for both session completion && session removal (session completion event is fired - // before session is removed from its own container by cluster) - loop_until(&runtime.executor(), TIMEOUT, move || session_clone.joint_public_and_secret().is_some() - && clusters_clone[i].client().generation_session(&SessionId::default()).is_none()); - assert!(session.joint_public_and_secret().unwrap().is_err()); - } - } - shutdown_clusters(&clusters); - } - - #[test] - fn generation_session_completion_signalled_if_failed_on_master() { - //::logger::init_log(); - let runtime = new_runtime(); - let clusters = make_clusters(&runtime, 6025, 3); - run_clusters(&clusters); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || clusters_clone.iter().all(all_connections_established)); - - // ask one of nodes to produce faulty generation sessions - clusters[0].client().make_faulty_generation_sessions(); - - // start && wait for generation session to fail - let session = clusters[0].client().new_generation_session(SessionId::default(), Default::default(), Default::default(), 1).unwrap(); - let session_clone = session.clone(); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || session_clone.joint_public_and_secret().is_some() - && clusters_clone[0].client().generation_session(&SessionId::default()).is_none()); - assert!(session.joint_public_and_secret().unwrap().is_err()); - - // check that faulty session is either removed from all nodes, or nonexistent (already removed) - for i in 1..3 { - if let Some(session) = clusters[i].client().generation_session(&SessionId::default()) { - let session_clone = session.clone(); - let clusters_clone = clusters.clone(); - // wait for both session completion && session removal (session completion event is fired - // before session is removed from its own container by cluster) - loop_until(&runtime.executor(), TIMEOUT, move || session_clone.joint_public_and_secret().is_some() - && clusters_clone[i].client().generation_session(&SessionId::default()).is_none()); - assert!(session.joint_public_and_secret().unwrap().is_err()); - } - } - shutdown_clusters(&clusters); - } - - #[test] - fn generation_session_is_removed_when_succeeded() { - //::logger::init_log(); - let runtime = new_runtime(); - let clusters = make_clusters(&runtime, 6019, 3); - run_clusters(&clusters); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || clusters_clone.iter().all(all_connections_established)); - - // start && wait for generation session to complete - let session = clusters[0].client().new_generation_session(SessionId::default(), Default::default(), Default::default(), 1).unwrap(); - let session_clone = session.clone(); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || (session_clone.state() == GenerationSessionState::Finished - || session_clone.state() == GenerationSessionState::Failed) - && clusters_clone[0].client().generation_session(&SessionId::default()).is_none()); - assert!(session.joint_public_and_secret().unwrap().is_ok()); - - // check that on non-master nodes session is either: - // already removed - // or it is removed right after completion - for i in 1..3 { - if let Some(session) = clusters[i].client().generation_session(&SessionId::default()) { - // run to completion if completion message is still on the way - // AND check that it is actually removed from cluster sessions - let session_clone = session.clone(); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || (session_clone.state() == GenerationSessionState::Finished - || session_clone.state() == GenerationSessionState::Failed) - && clusters_clone[i].client().generation_session(&SessionId::default()).is_none()); - } - } - shutdown_clusters(&clusters); - } - - #[test] - fn sessions_are_removed_when_initialization_fails() { - let runtime = new_runtime(); - let clusters = make_clusters(&runtime, 6022, 3); - run_clusters(&clusters); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || clusters_clone.iter().all(all_connections_established)); - - // generation session - { - // try to start generation session => fail in initialization - assert_eq!(clusters[0].client().new_generation_session(SessionId::default(), Default::default(), Default::default(), 100).map(|_| ()), - Err(Error::NotEnoughNodesForThreshold)); - - // try to start generation session => fails in initialization - assert_eq!(clusters[0].client().new_generation_session(SessionId::default(), Default::default(), Default::default(), 100).map(|_| ()), - Err(Error::NotEnoughNodesForThreshold)); - - assert!(clusters[0].data.sessions.generation_sessions.is_empty()); - } - - // decryption session - { - // try to start decryption session => fails in initialization - assert_eq!(clusters[0].client().new_decryption_session(Default::default(), Default::default(), Default::default(), Some(Default::default()), false, false).map(|_| ()), - Err(Error::InvalidMessage)); - - // try to start generation session => fails in initialization - assert_eq!(clusters[0].client().new_decryption_session(Default::default(), Default::default(), Default::default(), Some(Default::default()), false, false).map(|_| ()), - Err(Error::InvalidMessage)); - - assert!(clusters[0].data.sessions.decryption_sessions.is_empty()); - assert!(clusters[0].data.sessions.negotiation_sessions.is_empty()); - } - shutdown_clusters(&clusters); - } - - // test ignored because of - // - // https://github.com/paritytech/parity-ethereum/issues/9635 - #[test] - #[ignore] - fn schnorr_signing_session_completes_if_node_does_not_have_a_share() { - //::logger::init_log(); - let runtime = new_runtime(); - let clusters = make_clusters(&runtime, 6028, 3); - run_clusters(&clusters); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || clusters_clone.iter().all(all_connections_established)); - - // start && wait for generation session to complete - let session = clusters[0].client().new_generation_session(SessionId::default(), Default::default(), Default::default(), 1).unwrap(); - let session_clone = session.clone(); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || (session_clone.state() == GenerationSessionState::Finished - || session_clone.state() == GenerationSessionState::Failed) - && clusters_clone[0].client().generation_session(&SessionId::default()).is_none()); - assert!(session.joint_public_and_secret().unwrap().is_ok()); - - // now remove share from node2 - assert!((0..3).all(|i| clusters[i].data.sessions.generation_sessions.is_empty())); - clusters[2].data.config.key_storage.remove(&Default::default()).unwrap(); - - // and try to sign message with generated key - let signature = sign(Random.generate().unwrap().secret(), &Default::default()).unwrap(); - let session0 = clusters[0].client().new_schnorr_signing_session(Default::default(), signature.into(), None, Default::default()).unwrap(); - let session = clusters[0].data.sessions.schnorr_signing_sessions.first().unwrap(); - - let session_clone = session.clone(); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || session_clone.is_finished() && (0..3).all(|i| - clusters_clone[i].data.sessions.schnorr_signing_sessions.is_empty())); - session0.wait().unwrap(); - - // and try to sign message with generated key using node that has no key share - let signature = sign(Random.generate().unwrap().secret(), &Default::default()).unwrap(); - let session2 = clusters[2].client().new_schnorr_signing_session(Default::default(), signature.into(), None, Default::default()).unwrap(); - let session = clusters[2].data.sessions.schnorr_signing_sessions.first().unwrap(); - - let session_clone = session.clone(); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || session_clone.is_finished() && (0..3).all(|i| - clusters_clone[i].data.sessions.schnorr_signing_sessions.is_empty())); - session2.wait().unwrap(); - - // now remove share from node1 - clusters[1].data.config.key_storage.remove(&Default::default()).unwrap(); - - // and try to sign message with generated key - let signature = sign(Random.generate().unwrap().secret(), &Default::default()).unwrap(); - let session1 = clusters[0].client().new_schnorr_signing_session(Default::default(), signature.into(), None, Default::default()).unwrap(); - let session = clusters[0].data.sessions.schnorr_signing_sessions.first().unwrap(); - - let session = session.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || session.is_finished()); - session1.wait().unwrap_err(); - shutdown_clusters(&clusters); - } - - // test ignored because of - // - // https://github.com/paritytech/parity-ethereum/issues/9635 - #[test] - #[ignore] - fn ecdsa_signing_session_completes_if_node_does_not_have_a_share() { - //::logger::init_log(); - let runtime = new_runtime(); - let clusters = make_clusters(&runtime, 6041, 4); - run_clusters(&clusters); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || clusters_clone.iter().all(all_connections_established)); - - // start && wait for generation session to complete - let session = clusters[0].client().new_generation_session(SessionId::default(), Default::default(), Default::default(), 1).unwrap(); - let session_clone = session.clone(); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), TIMEOUT, move || (session_clone.state() == GenerationSessionState::Finished - || session_clone.state() == GenerationSessionState::Failed) - && clusters_clone[0].client().generation_session(&SessionId::default()).is_none()); - assert!(session.joint_public_and_secret().unwrap().is_ok()); - - // now remove share from node2 - assert!((0..3).all(|i| clusters[i].data.sessions.generation_sessions.is_empty())); - clusters[2].data.config.key_storage.remove(&Default::default()).unwrap(); - - // and try to sign message with generated key - let signature = sign(Random.generate().unwrap().secret(), &Default::default()).unwrap(); - let session0 = clusters[0].client().new_ecdsa_signing_session(Default::default(), signature.into(), None, H256::random()).unwrap(); - let session = clusters[0].data.sessions.ecdsa_signing_sessions.first().unwrap(); - - let session_clone = session.clone(); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), Duration::from_millis(1000), move || session_clone.is_finished() && (0..3).all(|i| - clusters_clone[i].data.sessions.ecdsa_signing_sessions.is_empty())); - session0.wait().unwrap(); - - // and try to sign message with generated key using node that has no key share - let signature = sign(Random.generate().unwrap().secret(), &Default::default()).unwrap(); - let session2 = clusters[2].client().new_ecdsa_signing_session(Default::default(), signature.into(), None, H256::random()).unwrap(); - let session = clusters[2].data.sessions.ecdsa_signing_sessions.first().unwrap(); - let session_clone = session.clone(); - let clusters_clone = clusters.clone(); - loop_until(&runtime.executor(), Duration::from_millis(1000), move || session_clone.is_finished() && (0..3).all(|i| - clusters_clone[i].data.sessions.ecdsa_signing_sessions.is_empty())); - session2.wait().unwrap(); - - // now remove share from node1 - clusters[1].data.config.key_storage.remove(&Default::default()).unwrap(); - - // and try to sign message with generated key - let signature = sign(Random.generate().unwrap().secret(), &Default::default()).unwrap(); - let session1 = clusters[0].client().new_ecdsa_signing_session(Default::default(), signature.into(), None, H256::random()).unwrap(); - let session = clusters[0].data.sessions.ecdsa_signing_sessions.first().unwrap(); - loop_until(&runtime.executor(), Duration::from_millis(1000), move || session.is_finished()); - session1.wait().unwrap_err(); - shutdown_clusters(&clusters); - } -} diff --git a/secret_store/src/key_server_cluster/cluster_connections.rs b/secret_store/src/key_server_cluster/cluster_connections.rs new file mode 100644 index 00000000000..b484e6d8e0b --- /dev/null +++ b/secret_store/src/key_server_cluster/cluster_connections.rs @@ -0,0 +1,176 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::collections::BTreeSet; +use std::sync::Arc; +use key_server_cluster::{Error, NodeId}; +use key_server_cluster::message::Message; + +/// Connection to the single node. Provides basic information about connected node and +/// allows sending messages to this node. +pub trait Connection: Send + Sync { + /// Is this inbound connection? This only matters when both nodes are simultaneously establishing + /// two connections to each other. The agreement is that the inbound connection from the node with + /// lower NodeId is used and the other connection is closed. + fn is_inbound(&self) -> bool; + /// Returns id of the connected node. + fn node_id(&self) -> &NodeId; + /// Returns 'address' of the node to use in traces. + fn node_address(&self) -> String; + /// Send message to the connected node. + fn send_message(&self, message: Message); +} + +/// Connections manager. Responsible for keeping us connected to all required nodes. +pub trait ConnectionManager: 'static + Send + Sync { + /// Returns shared reference to connections provider. + fn provider(&self) -> Arc; + /// Try to reach all disconnected nodes immediately. This method is exposed mostly for + /// tests, where all 'nodes' are starting listening for incoming connections first and + /// only after this, they're actually start connecting to each other. + fn connect(&self); +} + +/// Connections provider. Holds all active connections and the set of nodes that we need to +/// connect to. At any moment connection could be lost and the set of connected/disconnected +/// nodes could change (at behalf of the connection manager). +/// Clone operation should be cheap (Arc). +pub trait ConnectionProvider: Send + Sync { + /// Returns the set of currently connected nodes. Error is returned when our node is + /// not a part of the cluster ('isolated' node). + fn connected_nodes(&self) -> Result, Error>; + /// Returns the set of currently disconnected nodes. + fn disconnected_nodes(&self) -> BTreeSet; + /// Returns the reference to the active node connection or None if the node is not connected. + fn connection(&self, node: &NodeId) -> Option>; +} + +#[cfg(test)] +pub mod tests { + use std::collections::{BTreeSet, VecDeque}; + use std::sync::Arc; + use std::sync::atomic::{AtomicBool, Ordering}; + use parking_lot::Mutex; + use key_server_cluster::{Error, NodeId}; + use key_server_cluster::message::Message; + use super::{ConnectionManager, Connection, ConnectionProvider}; + + /// Shared messages queue. + pub type MessagesQueue = Arc>>; + + /// Single node connections. + pub struct TestConnections { + node: NodeId, + is_isolated: AtomicBool, + connected_nodes: Mutex>, + disconnected_nodes: Mutex>, + messages: MessagesQueue, + } + + /// Single connection. + pub struct TestConnection { + from: NodeId, + to: NodeId, + messages: MessagesQueue, + } + + impl TestConnections { + pub fn isolate(&self) { + let connected_nodes = ::std::mem::replace(&mut *self.connected_nodes.lock(), Default::default()); + self.is_isolated.store(true, Ordering::Relaxed); + self.disconnected_nodes.lock().extend(connected_nodes) + } + + pub fn disconnect(&self, node: NodeId) { + self.connected_nodes.lock().remove(&node); + self.disconnected_nodes.lock().insert(node); + } + + pub fn exclude(&self, node: NodeId) { + self.connected_nodes.lock().remove(&node); + self.disconnected_nodes.lock().remove(&node); + } + + pub fn include(&self, node: NodeId) { + self.connected_nodes.lock().insert(node); + } + } + + impl ConnectionManager for Arc { + fn provider(&self) -> Arc { + self.clone() + } + + fn connect(&self) {} + } + + impl ConnectionProvider for TestConnections { + fn connected_nodes(&self) -> Result, Error> { + match self.is_isolated.load(Ordering::Relaxed) { + false => Ok(self.connected_nodes.lock().clone()), + true => Err(Error::NodeDisconnected), + } + } + + fn disconnected_nodes(&self) -> BTreeSet { + self.disconnected_nodes.lock().clone() + } + + fn connection(&self, node: &NodeId) -> Option> { + match self.connected_nodes.lock().contains(node) { + true => Some(Arc::new(TestConnection { + from: self.node, + to: *node, + messages: self.messages.clone(), + })), + false => None, + } + } + } + + impl Connection for TestConnection { + fn is_inbound(&self) -> bool { + false + } + + fn node_id(&self) -> &NodeId { + &self.to + } + + fn node_address(&self) -> String { + format!("{}", self.to) + } + + fn send_message(&self, message: Message) { + self.messages.lock().push_back((self.from, self.to, message)) + } + } + + pub fn new_test_connections( + messages: MessagesQueue, + node: NodeId, + mut nodes: BTreeSet + ) -> Arc { + let is_isolated = !nodes.remove(&node); + Arc::new(TestConnections { + node, + is_isolated: AtomicBool::new(is_isolated), + connected_nodes: Mutex::new(nodes), + disconnected_nodes: Default::default(), + messages, + }) + } +} diff --git a/secret_store/src/key_server_cluster/cluster_connections_net.rs b/secret_store/src/key_server_cluster/cluster_connections_net.rs new file mode 100644 index 00000000000..bda7f7dd283 --- /dev/null +++ b/secret_store/src/key_server_cluster/cluster_connections_net.rs @@ -0,0 +1,539 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::collections::{BTreeMap, BTreeSet}; +use std::collections::btree_map::Entry; +use std::io; +use std::net::{SocketAddr, IpAddr}; +use std::sync::Arc; +use std::time::{Duration, Instant}; +use futures::{future, Future, Stream}; +use parking_lot::{Mutex, RwLock}; +use tokio::net::{TcpListener, TcpStream}; +use tokio::timer::{Interval, timeout::Error as TimeoutError}; +use tokio_io::IoFuture; +use ethkey::KeyPair; +use parity_runtime::Executor; +use key_server_cluster::{Error, NodeId, ClusterConfiguration, NodeKeyPair}; +use key_server_cluster::cluster_connections::{ConnectionProvider, Connection, ConnectionManager}; +use key_server_cluster::connection_trigger::{Maintain, ConnectionTrigger}; +use key_server_cluster::cluster_message_processor::MessageProcessor; +use key_server_cluster::io::{DeadlineStatus, ReadMessage, SharedTcpStream, + read_encrypted_message, WriteMessage, write_encrypted_message}; +use key_server_cluster::message::{self, ClusterMessage, Message}; +use key_server_cluster::net::{accept_connection as io_accept_connection, + connect as io_connect, Connection as IoConnection}; + +/// Empty future. +pub type BoxedEmptyFuture = Box + Send>; + +/// Maintain interval (seconds). Every MAINTAIN_INTERVAL seconds node: +/// 1) checks if connected nodes are responding to KeepAlive messages +/// 2) tries to connect to disconnected nodes +/// 3) checks if enc/dec sessions are time-outed +const MAINTAIN_INTERVAL: u64 = 10; + +/// When no messages have been received from node within KEEP_ALIVE_SEND_INTERVAL seconds, +/// we must send KeepAlive message to the node to check if it still responds to messages. +const KEEP_ALIVE_SEND_INTERVAL: Duration = Duration::from_secs(30); +/// When no messages have been received from node within KEEP_ALIVE_DISCONNECT_INTERVAL seconds, +/// we must treat this node as non-responding && disconnect from it. +const KEEP_ALIVE_DISCONNECT_INTERVAL: Duration = Duration::from_secs(60); + +/// Network connection manager configuration. +pub struct NetConnectionsManagerConfig { + /// Allow connecting to 'higher' nodes. + pub allow_connecting_to_higher_nodes: bool, + /// Interface to listen to. + pub listen_address: (String, u16), + /// True if we should autostart key servers set change session when servers set changes? + /// This will only work when servers set is configured using KeyServerSet contract. + pub auto_migrate_enabled: bool, +} + +/// Network connections manager. +pub struct NetConnectionsManager { + /// Address we're listening for incoming connections. + listen_address: SocketAddr, + /// Shared cluster connections data reference. + data: Arc, +} + +/// Network connections data. Shared among NetConnectionsManager and spawned futures. +struct NetConnectionsData { + /// Allow connecting to 'higher' nodes. + allow_connecting_to_higher_nodes: bool, + /// Reference to tokio task executor. + executor: Executor, + /// Key pair of this node. + self_key_pair: Arc, + /// Network messages processor. + message_processor: Arc, + /// Connections trigger. + trigger: Mutex>, + /// Mutable connection data. + container: Arc>, +} + +/// Network connections container. This is the only mutable data of NetConnectionsManager. +/// The set of nodes is mutated by the connection trigger and the connections set is also +/// mutated by spawned futures. +pub struct NetConnectionsContainer { + /// Is this node isolated from cluster? + pub is_isolated: bool, + /// Current key servers set. + pub nodes: BTreeMap, + /// Active connections to key servers. + pub connections: BTreeMap>, +} + +/// Network connection to single key server node. +pub struct NetConnection { + executor: Executor, + /// Id of the peer node. + node_id: NodeId, + /// Address of the peer node. + node_address: SocketAddr, + /// Is this inbound (true) or outbound (false) connection? + is_inbound: bool, + /// Key pair that is used to encrypt connection' messages. + key: KeyPair, + /// Last message time. + last_message_time: RwLock, + /// Underlying TCP stream. + stream: SharedTcpStream, +} + +impl NetConnectionsManager { + /// Create new network connections manager. + pub fn new( + executor: Executor, + message_processor: Arc, + trigger: Box, + container: Arc>, + config: &ClusterConfiguration, + net_config: NetConnectionsManagerConfig, + ) -> Result { + let listen_address = make_socket_address( + &net_config.listen_address.0, + net_config.listen_address.1)?; + + Ok(NetConnectionsManager { + listen_address, + data: Arc::new(NetConnectionsData { + allow_connecting_to_higher_nodes: net_config.allow_connecting_to_higher_nodes, + executor, + message_processor, + self_key_pair: config.self_key_pair.clone(), + trigger: Mutex::new(trigger), + container, + }), + }) + } + + /// Start listening for connections and schedule connections maintenance. + pub fn start(&self) -> Result<(), Error> { + net_listen(&self.listen_address, self.data.clone())?; + net_schedule_maintain(self.data.clone()); + Ok(()) + } +} + +impl ConnectionManager for NetConnectionsManager { + fn provider(&self) -> Arc { + self.data.container.clone() + } + + fn connect(&self) { + net_connect_disconnected(self.data.clone()); + } +} + +impl ConnectionProvider for RwLock { + fn connected_nodes(&self) -> Result, Error> { + let connections = self.read(); + if connections.is_isolated { + return Err(Error::NodeDisconnected); + } + + Ok(connections.connections.keys().cloned().collect()) + } + + fn disconnected_nodes(&self) -> BTreeSet { + let connections = self.read(); + connections.nodes.keys() + .filter(|node_id| !connections.connections.contains_key(node_id)) + .cloned() + .collect() + } + + fn connection(&self, node: &NodeId) -> Option> { + match self.read().connections.get(node).cloned() { + Some(connection) => Some(connection), + None => None, + } + } +} + +impl NetConnection { + /// Create new connection. + pub fn new(executor: Executor, is_inbound: bool, connection: IoConnection) -> NetConnection { + NetConnection { + executor, + node_id: connection.node_id, + node_address: connection.address, + is_inbound: is_inbound, + stream: connection.stream, + key: connection.key, + last_message_time: RwLock::new(Instant::now()), + } + } + + /// Get last message time. + pub fn last_message_time(&self) -> Instant { + *self.last_message_time.read() + } + + /// Update last message time + pub fn set_last_message_time(&self, last_message_time: Instant) { + *self.last_message_time.write() = last_message_time + } + + /// Returns future that sends encrypted message over this connection. + pub fn send_message_future(&self, message: Message) -> WriteMessage { + write_encrypted_message(self.stream.clone(), &self.key, message) + } + + /// Returns future that reads encrypted message from this connection. + pub fn read_message_future(&self) -> ReadMessage { + read_encrypted_message(self.stream.clone(), self.key.clone()) + } +} + +impl Connection for NetConnection { + fn is_inbound(&self) -> bool { + self.is_inbound + } + + fn node_id(&self) -> &NodeId { + &self.node_id + } + + fn node_address(&self) -> String { + format!("{}", self.node_address) + } + + fn send_message(&self, message: Message) { + execute(&self.executor, self.send_message_future(message).then(|_| Ok(()))); + } +} + +impl NetConnectionsData { + /// Executes closure for each active connection. + pub fn active_connections(&self) -> Vec> { + self.container.read().connections.values().cloned().collect() + } + + /// Executes closure for each disconnected node. + pub fn disconnected_nodes(&self) -> Vec<(NodeId, SocketAddr)> { + let container = self.container.read(); + container.nodes.iter() + .filter(|(node_id, _)| !container.connections.contains_key(node_id)) + .map(|(node_id, addr)| (*node_id, *addr)) + .collect() + } + + /// Try to insert new connection. Returns true if connection has been inserted. + /// Returns false (and ignores connections) if: + /// - we do not expect connection from this node + /// - we are already connected to the node and existing connection 'supersede' + /// new connection by agreement + pub fn insert(&self, connection: Arc) -> bool { + let node = *connection.node_id(); + let mut container = self.container.write(); + if !container.nodes.contains_key(&node) { + trace!(target: "secretstore_net", "{}: ignoring unknown connection from {} at {}", + self.self_key_pair.public(), node, connection.node_address()); + return false; + } + + if container.connections.contains_key(&node) { + // we have already connected to the same node + // the agreement is that node with lower id must establish connection to node with higher id + if (*self.self_key_pair.public() < node && connection.is_inbound()) + || (*self.self_key_pair.public() > node && !connection.is_inbound()) { + return false; + } + } + + trace!(target: "secretstore_net", + "{}: inserting connection to {} at {}. Connected to {} of {} nodes", + self.self_key_pair.public(), node, connection.node_address(), + container.connections.len() + 1, container.nodes.len()); + container.connections.insert(node, connection); + + true + } + + /// Tries to remove connection. Returns true if connection has been removed. + /// Returns false if we do not know this connection. + pub fn remove(&self, connection: &NetConnection) -> bool { + let node_id = *connection.node_id(); + let is_inbound = connection.is_inbound(); + let mut container = self.container.write(); + if let Entry::Occupied(entry) = container.connections.entry(node_id) { + if entry.get().is_inbound() != is_inbound { + return false; + } + + trace!(target: "secretstore_net", "{}: removing connection to {} at {}", + self.self_key_pair.public(), node_id, entry.get().node_address()); + entry.remove_entry(); + + true + } else { + false + } + } +} + +/// Listen incoming connections. +fn net_listen( + listen_address: &SocketAddr, + data: Arc, +) -> Result<(), Error> { + execute(&data.executor, net_listen_future(listen_address, data.clone())?); + Ok(()) +} + +/// Listen incoming connections future. +fn net_listen_future( + listen_address: &SocketAddr, + data: Arc, +) -> Result { + Ok(Box::new(TcpListener::bind(listen_address)? + .incoming() + .and_then(move |stream| { + net_accept_connection(data.clone(), stream); + Ok(()) + }) + .for_each(|_| Ok(())) + .then(|_| future::ok(())))) +} + +/// Accept incoming connection. +fn net_accept_connection( + data: Arc, + stream: TcpStream, +) { + execute(&data.executor, net_accept_connection_future(data.clone(), stream)); +} + +/// Accept incoming connection future. +fn net_accept_connection_future(data: Arc, stream: TcpStream) -> BoxedEmptyFuture { + Box::new(io_accept_connection(stream, data.self_key_pair.clone()) + .then(move |result| net_process_connection_result(data, None, result)) + .then(|_| future::ok(()))) +} + +/// Connect to remote node. +fn net_connect( + data: Arc, + remote: SocketAddr, +) { + execute(&data.executor, net_connect_future(data.clone(), remote)); +} + +/// Connect to remote node future. +fn net_connect_future( + data: Arc, + remote: SocketAddr, +) -> BoxedEmptyFuture { + let disconnected_nodes = data.container.disconnected_nodes(); + Box::new(io_connect(&remote, data.self_key_pair.clone(), disconnected_nodes) + .then(move |result| net_process_connection_result(data, Some(remote), result)) + .then(|_| future::ok(()))) +} + +/// Process network connection result. +fn net_process_connection_result( + data: Arc, + outbound_addr: Option, + result: Result>, TimeoutError>, +) -> IoFuture> { + match result { + Ok(DeadlineStatus::Meet(Ok(connection))) => { + let connection = Arc::new(NetConnection::new(data.executor.clone(), outbound_addr.is_none(), connection)); + if data.insert(connection.clone()) { + let maintain_action = data.trigger.lock().on_connection_established(connection.node_id()); + maintain_connection_trigger(data.clone(), maintain_action); + + return net_process_connection_messages(data, connection); + } + }, + Ok(DeadlineStatus::Meet(Err(err))) => { + warn!(target: "secretstore_net", "{}: protocol error '{}' when establishing {} connection{}", + data.self_key_pair.public(), err, if outbound_addr.is_some() { "outbound" } else { "inbound" }, + outbound_addr.map(|a| format!(" with {}", a)).unwrap_or_default()); + }, + Ok(DeadlineStatus::Timeout) => { + warn!(target: "secretstore_net", "{}: timeout when establishing {} connection{}", + data.self_key_pair.public(), if outbound_addr.is_some() { "outbound" } else { "inbound" }, + outbound_addr.map(|a| format!(" with {}", a)).unwrap_or_default()); + }, + Err(err) => { + warn!(target: "secretstore_net", "{}: network error '{}' when establishing {} connection{}", + data.self_key_pair.public(), err, if outbound_addr.is_some() { "outbound" } else { "inbound" }, + outbound_addr.map(|a| format!(" with {}", a)).unwrap_or_default()); + }, + } + + Box::new(future::ok(Ok(()))) +} + +/// Process connection messages. +fn net_process_connection_messages( + data: Arc, + connection: Arc, +) -> IoFuture> { + Box::new(connection + .read_message_future() + .then(move |result| + match result { + Ok((_, Ok(message))) => { + connection.set_last_message_time(Instant::now()); + data.message_processor.process_connection_message(connection.clone(), message); + // continue serving connection + let process_messages_future = net_process_connection_messages( + data.clone(), connection).then(|_| Ok(())); + execute(&data.executor, process_messages_future); + Box::new(future::ok(Ok(()))) + }, + Ok((_, Err(err))) => { + warn!(target: "secretstore_net", "{}: protocol error '{}' when reading message from node {}", + data.self_key_pair.public(), err, connection.node_id()); + // continue serving connection + let process_messages_future = net_process_connection_messages( + data.clone(), connection).then(|_| Ok(())); + execute(&data.executor, process_messages_future); + Box::new(future::ok(Err(err))) + }, + Err(err) => { + let node_id = *connection.node_id(); + warn!(target: "secretstore_net", "{}: network error '{}' when reading message from node {}", + data.self_key_pair.public(), err, node_id); + // close connection + if data.remove(&*connection) { + let maintain_action = data.trigger.lock().on_connection_closed(&node_id); + maintain_connection_trigger(data, maintain_action); + } + Box::new(future::err(err)) + }, + } + )) +} + +/// Schedule connections. maintain. +fn net_schedule_maintain(data: Arc) { + let closure_data = data.clone(); + execute(&data.executor, Interval::new_interval(Duration::new(MAINTAIN_INTERVAL, 0)) + .and_then(move |_| Ok(net_maintain(closure_data.clone()))) + .for_each(|_| Ok(())) + .then(|_| future::ok(()))); +} + +/// Maintain network connections. +fn net_maintain(data: Arc) { + trace!(target: "secretstore_net", "{}: executing maintain procedures", data.self_key_pair.public()); + + update_nodes_set(data.clone()); + data.message_processor.maintain_sessions(); + net_keep_alive(data.clone()); + net_connect_disconnected(data); +} + +/// Send keep alive messages to remote nodes. +fn net_keep_alive(data: Arc) { + let now = Instant::now(); + let active_connections = data.active_connections(); + for connection in active_connections { + let last_message_diff = now - connection.last_message_time(); + if last_message_diff > KEEP_ALIVE_DISCONNECT_INTERVAL { + warn!(target: "secretstore_net", "{}: keep alive timeout for node {}", + data.self_key_pair.public(), connection.node_id()); + + let node_id = *connection.node_id(); + if data.remove(&*connection) { + let maintain_action = data.trigger.lock().on_connection_closed(&node_id); + maintain_connection_trigger(data.clone(), maintain_action); + } + data.message_processor.process_disconnect(&node_id); + } + else if last_message_diff > KEEP_ALIVE_SEND_INTERVAL { + connection.send_message(Message::Cluster(ClusterMessage::KeepAlive(message::KeepAlive {}))); + } + } +} + +/// Connect disconnected nodes. +fn net_connect_disconnected(data: Arc) { + let disconnected_nodes = data.disconnected_nodes(); + for (node_id, address) in disconnected_nodes { + if data.allow_connecting_to_higher_nodes || *data.self_key_pair.public() < node_id { + net_connect(data.clone(), address); + } + } +} + +/// Schedule future execution. +fn execute + Send + 'static>(executor: &Executor, f: F) { + if let Err(err) = future::Executor::execute(executor, Box::new(f)) { + error!("Secret store runtime unable to spawn task. Runtime is shutting down. ({:?})", err); + } +} + +/// Try to update active nodes set from connection trigger. +fn update_nodes_set(data: Arc) { + let maintain_action = data.trigger.lock().on_maintain(); + maintain_connection_trigger(data, maintain_action); +} + +/// Execute maintain procedures of connections trigger. +fn maintain_connection_trigger(data: Arc, maintain_action: Option) { + if maintain_action == Some(Maintain::SessionAndConnections) || maintain_action == Some(Maintain::Session) { + let session_params = data.trigger.lock().maintain_session(); + if let Some(session_params) = session_params { + let session = data.message_processor.start_servers_set_change_session(session_params); + match session { + Ok(_) => trace!(target: "secretstore_net", "{}: started auto-migrate session", + data.self_key_pair.public()), + Err(err) => trace!(target: "secretstore_net", "{}: failed to start auto-migrate session with: {}", + data.self_key_pair.public(), err), + } + } + } + if maintain_action == Some(Maintain::SessionAndConnections) || maintain_action == Some(Maintain::Connections) { + let mut trigger = data.trigger.lock(); + let mut data = data.container.write(); + trigger.maintain_connections(&mut *data); + } +} + +/// Compose SocketAddr from configuration' address and port. +fn make_socket_address(address: &str, port: u16) -> Result { + let ip_address: IpAddr = address.parse().map_err(|_| Error::InvalidNodeAddress)?; + Ok(SocketAddr::new(ip_address, port)) +} diff --git a/secret_store/src/key_server_cluster/cluster_message_processor.rs b/secret_store/src/key_server_cluster/cluster_message_processor.rs new file mode 100644 index 00000000000..b4ba5ef03b2 --- /dev/null +++ b/secret_store/src/key_server_cluster/cluster_message_processor.rs @@ -0,0 +1,357 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::sync::Arc; +use key_server_cluster::{Error, NodeId, NodeKeyPair}; +use key_server_cluster::cluster::{ServersSetChangeParams, new_servers_set_change_session}; +use key_server_cluster::cluster_sessions::{AdminSession}; +use key_server_cluster::cluster_connections::{ConnectionProvider, Connection}; +use key_server_cluster::cluster_sessions::{ClusterSession, ClusterSessions, ClusterSessionsContainer, + create_cluster_view}; +use key_server_cluster::cluster_sessions_creator::{ClusterSessionCreator, IntoSessionId}; +use key_server_cluster::message::{self, Message, ClusterMessage}; +use key_server_cluster::key_version_negotiation_session::{SessionImpl as KeyVersionNegotiationSession, + IsolatedSessionTransport as KeyVersionNegotiationSessionTransport, ContinueAction}; +use key_server_cluster::connection_trigger::ServersSetChangeSessionCreatorConnector; + +/// Something that is able to process signals/messages from other nodes. +pub trait MessageProcessor: Send + Sync { + /// Process disconnect from the remote node. + fn process_disconnect(&self, node: &NodeId); + /// Process single message from the connection. + fn process_connection_message(&self, connection: Arc, message: Message); + + /// Start servers set change session. This is typically used by ConnectionManager when + /// it detects that auto-migration session needs to be started. + fn start_servers_set_change_session(&self, params: ServersSetChangeParams) -> Result, Error>; + /// Try to continue session after key version negotiation session is completed. + fn try_continue_session( + &self, + session: Option>> + ); + /// Maintain active sessions. Typically called by the ConnectionManager at some intervals. + /// Should cancel stalled sessions and send keep-alive messages for sessions that support it. + fn maintain_sessions(&self); +} + +/// Bridge between ConnectionManager and ClusterSessions. +pub struct SessionsMessageProcessor { + self_key_pair: Arc, + servers_set_change_creator_connector: Arc, + sessions: Arc, + connections: Arc, +} + +impl SessionsMessageProcessor { + /// Create new instance of SessionsMessageProcessor. + pub fn new( + self_key_pair: Arc, + servers_set_change_creator_connector: Arc, + sessions: Arc, + connections: Arc, + ) -> Self { + SessionsMessageProcessor { + self_key_pair, + servers_set_change_creator_connector, + sessions, + connections, + } + } + + /// Process single session message from connection. + fn process_message, D>( + &self, + sessions: &ClusterSessionsContainer, + connection: Arc, + mut message: Message, + ) -> Option> + where + Message: IntoSessionId + { + // get or create new session, if required + let mut sender = *connection.node_id(); + let session = self.prepare_session(sessions, &sender, &message); + // send error if session is not found, or failed to create + let session = match session { + Ok(session) => session, + Err(error) => { + // this is new session => it is not yet in container + warn!(target: "secretstore_net", + "{}: {} session read error '{}' when requested for session from node {}", + self.self_key_pair.public(), S::type_name(), error, sender); + if !message.is_error_message() { + let qed = "session_id only fails for cluster messages; + only session messages are passed to process_message; + qed"; + let session_id = message.into_session_id().expect(qed); + let session_nonce = message.session_nonce().expect(qed); + + connection.send_message(SC::make_error_message(session_id, session_nonce, error)); + } + return None; + }, + }; + + let session_id = session.id(); + let mut is_queued_message = false; + loop { + let message_result = session.on_message(&sender, &message); + match message_result { + Ok(_) => { + // if session is completed => stop + if session.is_finished() { + info!(target: "secretstore_net", + "{}: {} session completed", self.self_key_pair.public(), S::type_name()); + sessions.remove(&session_id); + return Some(session); + } + + // try to dequeue message + match sessions.dequeue_message(&session_id) { + Some((msg_sender, msg)) => { + is_queued_message = true; + sender = msg_sender; + message = msg; + }, + None => return Some(session), + } + }, + Err(Error::TooEarlyForRequest) => { + sessions.enqueue_message(&session_id, sender, message, is_queued_message); + return Some(session); + }, + Err(err) => { + warn!( + target: "secretstore_net", + "{}: {} session error '{}' when processing message {} from node {}", + self.self_key_pair.public(), + S::type_name(), + err, + message, + sender); + session.on_session_error(self.self_key_pair.public(), err); + sessions.remove(&session_id); + return Some(session); + }, + } + } + } + + /// Get or insert new session. + fn prepare_session, D>( + &self, + sessions: &ClusterSessionsContainer, + sender: &NodeId, + message: &Message + ) -> Result, Error> + where + Message: IntoSessionId + { + fn requires_all_connections(message: &Message) -> bool { + match *message { + Message::Generation(_) => true, + Message::ShareAdd(_) => true, + Message::ServersSetChange(_) => true, + _ => false, + } + } + + // get or create new session, if required + let session_id = message.into_session_id() + .expect("into_session_id fails for cluster messages only; + only session messages are passed to prepare_session; + qed"); + let is_initialization_message = message.is_initialization_message(); + let is_delegation_message = message.is_delegation_message(); + match is_initialization_message || is_delegation_message { + false => sessions.get(&session_id, true).ok_or(Error::NoActiveSessionWithId), + true => { + let creation_data = SC::creation_data_from_message(&message)?; + let master = if is_initialization_message { + *sender + } else { + *self.self_key_pair.public() + }; + let cluster = create_cluster_view( + self.self_key_pair.clone(), + self.connections.clone(), + requires_all_connections(&message))?; + + let nonce = Some(message.session_nonce().ok_or(Error::InvalidMessage)?); + let exclusive = message.is_exclusive_session_message(); + sessions.insert(cluster, master, session_id, nonce, exclusive, creation_data) + }, + } + } + + /// Process single cluster message from the connection. + fn process_cluster_message(&self, connection: Arc, message: ClusterMessage) { + match message { + ClusterMessage::KeepAlive(_) => { + let msg = Message::Cluster(ClusterMessage::KeepAliveResponse(message::KeepAliveResponse { + session_id: None, + })); + connection.send_message(msg) + }, + ClusterMessage::KeepAliveResponse(msg) => if let Some(session_id) = msg.session_id { + self.sessions.on_session_keep_alive(connection.node_id(), session_id.into()); + }, + _ => warn!(target: "secretstore_net", "{}: received unexpected message {} from node {} at {}", + self.self_key_pair.public(), message, connection.node_id(), connection.node_address()), + } + } +} + +impl MessageProcessor for SessionsMessageProcessor { + fn process_disconnect(&self, node: &NodeId) { + self.sessions.on_connection_timeout(node); + } + + fn process_connection_message(&self, connection: Arc, message: Message) { + trace!(target: "secretstore_net", "{}: received message {} from {}", + self.self_key_pair.public(), message, connection.node_id()); + + // error is ignored as we only process errors on session level + match message { + Message::Generation(message) => self + .process_message(&self.sessions.generation_sessions, connection, Message::Generation(message)) + .map(|_| ()).unwrap_or_default(), + Message::Encryption(message) => self + .process_message(&self.sessions.encryption_sessions, connection, Message::Encryption(message)) + .map(|_| ()).unwrap_or_default(), + Message::Decryption(message) => self + .process_message(&self.sessions.decryption_sessions, connection, Message::Decryption(message)) + .map(|_| ()).unwrap_or_default(), + Message::SchnorrSigning(message) => self + .process_message(&self.sessions.schnorr_signing_sessions, connection, Message::SchnorrSigning(message)) + .map(|_| ()).unwrap_or_default(), + Message::EcdsaSigning(message) => self + .process_message(&self.sessions.ecdsa_signing_sessions, connection, Message::EcdsaSigning(message)) + .map(|_| ()).unwrap_or_default(), + Message::ServersSetChange(message) => { + let message = Message::ServersSetChange(message); + let is_initialization_message = message.is_initialization_message(); + let session = self.process_message(&self.sessions.admin_sessions, connection, message); + if is_initialization_message { + if let Some(session) = session { + self.servers_set_change_creator_connector + .set_key_servers_set_change_session(session.clone()); + } + } + }, + Message::KeyVersionNegotiation(message) => { + let session = self.process_message( + &self.sessions.negotiation_sessions, connection, Message::KeyVersionNegotiation(message)); + self.try_continue_session(session); + }, + Message::ShareAdd(message) => self.process_message( + &self.sessions.admin_sessions, connection, Message::ShareAdd(message)) + .map(|_| ()).unwrap_or_default(), + Message::Cluster(message) => self.process_cluster_message(connection, message), + } + } + + fn try_continue_session( + &self, + session: Option>> + ) { + if let Some(session) = session { + let meta = session.meta(); + let is_master_node = meta.self_node_id == meta.master_node_id; + if is_master_node && session.is_finished() { + self.sessions.negotiation_sessions.remove(&session.id()); + match session.wait() { + Ok(Some((version, master))) => match session.take_continue_action() { + Some(ContinueAction::Decrypt( + session, origin, is_shadow_decryption, is_broadcast_decryption + )) => { + let initialization_error = if self.self_key_pair.public() == &master { + session.initialize( + origin, version, is_shadow_decryption, is_broadcast_decryption) + } else { + session.delegate( + master, origin, version, is_shadow_decryption, is_broadcast_decryption) + }; + + if let Err(error) = initialization_error { + session.on_session_error(&meta.self_node_id, error); + self.sessions.decryption_sessions.remove(&session.id()); + } + }, + Some(ContinueAction::SchnorrSign(session, message_hash)) => { + let initialization_error = if self.self_key_pair.public() == &master { + session.initialize(version, message_hash) + } else { + session.delegate(master, version, message_hash) + }; + + if let Err(error) = initialization_error { + session.on_session_error(&meta.self_node_id, error); + self.sessions.schnorr_signing_sessions.remove(&session.id()); + } + }, + Some(ContinueAction::EcdsaSign(session, message_hash)) => { + let initialization_error = if self.self_key_pair.public() == &master { + session.initialize(version, message_hash) + } else { + session.delegate(master, version, message_hash) + }; + + if let Err(error) = initialization_error { + session.on_session_error(&meta.self_node_id, error); + self.sessions.ecdsa_signing_sessions.remove(&session.id()); + } + }, + None => (), + }, + Ok(None) => unreachable!("is_master_node; session is finished; + negotiation version always finished with result on master; + qed"), + Err(error) => match session.take_continue_action() { + Some(ContinueAction::Decrypt(session, _, _, _)) => { + session.on_session_error(&meta.self_node_id, error); + self.sessions.decryption_sessions.remove(&session.id()); + }, + Some(ContinueAction::SchnorrSign(session, _)) => { + session.on_session_error(&meta.self_node_id, error); + self.sessions.schnorr_signing_sessions.remove(&session.id()); + }, + Some(ContinueAction::EcdsaSign(session, _)) => { + session.on_session_error(&meta.self_node_id, error); + self.sessions.ecdsa_signing_sessions.remove(&session.id()); + }, + None => (), + }, + } + } + } + } + + fn maintain_sessions(&self) { + self.sessions.stop_stalled_sessions(); + self.sessions.sessions_keep_alive(); + } + + fn start_servers_set_change_session(&self, params: ServersSetChangeParams) -> Result, Error> { + new_servers_set_change_session( + self.self_key_pair.clone(), + &*self.sessions, + self.connections.clone(), + self.servers_set_change_creator_connector.clone(), + params, + ) + } +} diff --git a/secret_store/src/node_key_pair.rs b/secret_store/src/node_key_pair.rs deleted file mode 100644 index d96d9ff6115..00000000000 --- a/secret_store/src/node_key_pair.rs +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -use std::sync::Arc; -use ethkey::crypto::ecdh::agree; -use ethkey::{KeyPair, Public, Signature, Error as EthKeyError, sign, public_to_address}; -use ethcore::account_provider::AccountProvider; -use ethereum_types::{H256, Address}; -use traits::NodeKeyPair; -use ethkey::Password; - -pub struct PlainNodeKeyPair { - key_pair: KeyPair, -} - -pub struct KeyStoreNodeKeyPair { - account_provider: Arc, - address: Address, - public: Public, - password: Password, -} - -impl PlainNodeKeyPair { - pub fn new(key_pair: KeyPair) -> Self { - PlainNodeKeyPair { - key_pair: key_pair, - } - } -} - -impl NodeKeyPair for PlainNodeKeyPair { - fn public(&self) -> &Public { - self.key_pair.public() - } - - fn address(&self) -> Address { - public_to_address(self.key_pair.public()) - } - - fn sign(&self, data: &H256) -> Result { - sign(self.key_pair.secret(), data) - } - - fn compute_shared_key(&self, peer_public: &Public) -> Result { - agree(self.key_pair.secret(), peer_public) - .map_err(|e| EthKeyError::Custom(e.to_string())) - .and_then(KeyPair::from_secret) - } -} - -impl KeyStoreNodeKeyPair { - pub fn new(account_provider: Arc, address: Address, password: Password) -> Result { - let public = account_provider.account_public(address.clone(), &password).map_err(|e| EthKeyError::Custom(format!("{}", e)))?; - Ok(KeyStoreNodeKeyPair { - account_provider: account_provider, - address: address, - public: public, - password: password, - }) - } -} - -impl NodeKeyPair for KeyStoreNodeKeyPair { - fn public(&self) -> &Public { - &self.public - } - - fn address(&self) -> Address { - public_to_address(&self.public) - } - - fn sign(&self, data: &H256) -> Result { - self.account_provider.sign(self.address.clone(), Some(self.password.clone()), data.clone()) - .map_err(|e| EthKeyError::Custom(format!("{}", e))) - } - - fn compute_shared_key(&self, peer_public: &Public) -> Result { - KeyPair::from_secret(self.account_provider.agree(self.address.clone(), Some(self.password.clone()), peer_public) - .map_err(|e| EthKeyError::Custom(format!("{}", e)))?) - } -} diff --git a/test.sh b/test.sh index 074171bfe73..e7d8e2a7890 100755 --- a/test.sh +++ b/test.sh @@ -1,33 +1,12 @@ #!/bin/sh # Running Parity Full Test Suite +echo "________Running test.sh________" -FEATURES="json-tests,ci-skip-issue" +FEATURES="json-tests,ci-skip-tests" OPTIONS="--release" VALIDATE=1 THREADS=8 -case $1 in - --no-json) - FEATURES="ipc" - shift # past argument=value - ;; - --no-release) - OPTIONS="" - shift - ;; - --no-validate) - VALIDATE=0 - shift - ;; - --no-run) - OPTIONS="--no-run" - shift - ;; - *) - # unknown option - ;; -esac - set -e @@ -35,9 +14,9 @@ validate () { if [ "$VALIDATE" -eq "1" ] then echo "________Validate build________" - time cargo check $@ --frozen --no-default-features - time cargo check $@ --frozen --manifest-path util/io/Cargo.toml --no-default-features - time cargo check $@ --frozen --manifest-path util/io/Cargo.toml --features "mio" + time cargo check $@ --locked --no-default-features + time cargo check $@ --locked --manifest-path util/io/Cargo.toml --no-default-features + time cargo check $@ --locked --manifest-path util/io/Cargo.toml --features "mio" # Validate chainspecs echo "________Validate chainspecs________" @@ -52,15 +31,15 @@ cpp_test () { (x86_64-unknown-linux-gnu) # Running the C++ example echo "________Running the C++ example________" - cd parity-clib-examples/cpp && \ - mkdir -p build && \ - cd build && \ - cmake .. && \ - make -j $THREADS && \ - ./parity-example && \ - cd .. && \ - rm -rf build && \ - cd ../.. + DIR=parity-clib/examples/cpp/build + mkdir -p $DIR + cd $DIR + cmake .. + make -j $THREADS + # Note: we don't try to run the example because it tries to sync Kovan, and we don't want + # that to happen on CI + cd - + rm -rf $DIR ;; (*) echo "________Skipping the C++ example________" @@ -71,7 +50,7 @@ cpp_test () { cargo_test () { echo "________Running Parity Full Test Suite________" git submodule update --init --recursive - time cargo test $OPTIONS --features "$FEATURES" --frozen --all $@ -- --test-threads $THREADS + time cargo test $OPTIONS --features "$FEATURES" --locked --all $@ -- --test-threads $THREADS } diff --git a/updater/Cargo.toml b/updater/Cargo.toml index 2a0683a0910..dd3417f880d 100644 --- a/updater/Cargo.toml +++ b/updater/Cargo.toml @@ -6,23 +6,24 @@ license = "GPL-3.0" authors = ["Parity Technologies "] [dependencies] -keccak-hash = "0.1" -lazy_static = "1.0" -log = "0.4" +common-types = { path = "../ethcore/types" } ethabi = "6.0" -ethabi-derive = "6.0" ethabi-contract = "6.0" -target_info = "0.1" -semver = "0.9" +ethabi-derive = "6.0" ethcore = { path = "../ethcore" } -parity-bytes = "0.1" ethcore-sync = { path = "../ethcore/sync" } ethereum-types = "0.4" -parking_lot = "0.7" -parity-hash-fetch = { path = "../hash-fetch" } -parity-version = { path = "../util/version" } +keccak-hash = "0.1" +lazy_static = "1.0" +log = "0.4" +parity-bytes = "0.1" +parity-hash-fetch = { path = "hash-fetch" } parity-path = "0.1" +parity-version = { path = "../util/version" } +parking_lot = "0.7" rand = "0.4" +semver = "0.9" +target_info = "0.1" [dev-dependencies] ethcore = { path = "../ethcore", features = ["test-helpers"] } diff --git a/hash-fetch/Cargo.toml b/updater/hash-fetch/Cargo.toml similarity index 73% rename from hash-fetch/Cargo.toml rename to updater/hash-fetch/Cargo.toml index 975f00a89ab..1c5477c06eb 100644 --- a/hash-fetch/Cargo.toml +++ b/updater/hash-fetch/Cargo.toml @@ -13,12 +13,12 @@ mime = "0.3" mime_guess = "2.0.0-alpha.2" rand = "0.4" rustc-hex = "1.0" -fetch = { path = "../util/fetch" } +fetch = { path = "../../util/fetch" } parity-bytes = "0.1" ethereum-types = "0.4" -parity-runtime = { path = "../util/runtime" } +parity-runtime = { path = "../../util/runtime" } keccak-hash = "0.1" -registrar = { path = "../registrar" } +registrar = { path = "../../util/registrar" } ethabi = "6.0" ethabi-derive = "6.0" @@ -26,4 +26,4 @@ ethabi-contract = "6.0" [dev-dependencies] parking_lot = "0.7" -fake-fetch = { path = "../util/fake-fetch" } +fake-fetch = { path = "../../util/fake-fetch" } diff --git a/hash-fetch/res/urlhint.json b/updater/hash-fetch/res/urlhint.json similarity index 100% rename from hash-fetch/res/urlhint.json rename to updater/hash-fetch/res/urlhint.json diff --git a/hash-fetch/src/client.rs b/updater/hash-fetch/src/client.rs similarity index 96% rename from hash-fetch/src/client.rs rename to updater/hash-fetch/src/client.rs index b9d42696ec9..513b02f2568 100644 --- a/hash-fetch/src/client.rs +++ b/updater/hash-fetch/src/client.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Hash-addressed content resolver & fetcher. diff --git a/hash-fetch/src/lib.rs b/updater/hash-fetch/src/lib.rs similarity index 77% rename from hash-fetch/src/lib.rs rename to updater/hash-fetch/src/lib.rs index 97ef6d91d60..a9ddc7363e3 100644 --- a/hash-fetch/src/lib.rs +++ b/updater/hash-fetch/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Hash-addressed content resolver & fetcher. diff --git a/hash-fetch/src/urlhint.rs b/updater/hash-fetch/src/urlhint.rs similarity index 97% rename from hash-fetch/src/urlhint.rs rename to updater/hash-fetch/src/urlhint.rs index d3a9af2bf28..73520fd3b77 100644 --- a/hash-fetch/src/urlhint.rs +++ b/updater/hash-fetch/src/urlhint.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! URLHint Contract diff --git a/updater/src/lib.rs b/updater/src/lib.rs index 611572fac9f..f6fad17199a 100644 --- a/updater/src/lib.rs +++ b/updater/src/lib.rs @@ -1,33 +1,34 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Updater for Parity executables #![warn(missing_docs)] +extern crate common_types; extern crate ethabi; extern crate ethcore; -extern crate parity_bytes as bytes; extern crate ethcore_sync as sync; extern crate ethereum_types; extern crate keccak_hash as hash; +extern crate parity_bytes as bytes; extern crate parity_hash_fetch as hash_fetch; +extern crate parity_path; extern crate parity_version as version; extern crate parking_lot; -extern crate parity_path; extern crate rand; extern crate semver; extern crate target_info; diff --git a/updater/src/service.rs b/updater/src/service.rs index 1cf35d4ea67..b9ef2f9657b 100644 --- a/updater/src/service.rs +++ b/updater/src/service.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use types::{CapState, ReleaseInfo, OperationsInfo, VersionInfo}; diff --git a/updater/src/types/all.rs b/updater/src/types/all.rs index 9dd782683d6..f17480c8adf 100644 --- a/updater/src/types/all.rs +++ b/updater/src/types/all.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Types used in the public API diff --git a/updater/src/types/mod.rs b/updater/src/types/mod.rs index 8fdbcf169df..fab4ec4d0e5 100644 --- a/updater/src/types/mod.rs +++ b/updater/src/types/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Types used in the public api diff --git a/updater/src/types/release_track.rs b/updater/src/types/release_track.rs index eefe18d9f20..0648ebc47ae 100644 --- a/updater/src/types/release_track.rs +++ b/updater/src/types/release_track.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Types used in the public API diff --git a/updater/src/types/version_info.rs b/updater/src/types/version_info.rs index df2026b28c3..b55e08cb196 100644 --- a/updater/src/types/version_info.rs +++ b/updater/src/types/version_info.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Types used in the public API diff --git a/updater/src/updater.rs b/updater/src/updater.rs index 4b968625a4d..70adc9f3b32 100644 --- a/updater/src/updater.rs +++ b/updater/src/updater.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::cmp; use std::fs; @@ -25,9 +25,9 @@ use parking_lot::{Mutex, MutexGuard}; use rand::{self, Rng}; use target_info::Target; -use ethcore::BlockNumber; +use common_types::BlockNumber; +use common_types::filter::Filter; use ethcore::client::{BlockId, BlockChainClient, ChainNotify, NewBlocks}; -use ethcore::filter::Filter; use ethereum_types::H256; use hash_fetch::{self as fetch, HashFetch}; use parity_path::restrict_permissions_owner; diff --git a/util/EIP-712/Cargo.toml b/util/EIP-712/Cargo.toml index aaee48bccd5..baf0bfc89bc 100644 --- a/util/EIP-712/Cargo.toml +++ b/util/EIP-712/Cargo.toml @@ -1,7 +1,14 @@ [package] -name = "eip712" +name = "eip-712" version = "0.1.0" authors = ["Parity Technologies "] +repository = "https://github.com/paritytech/parity-ethereum" +documentation = "https://docs.rs/eip-712" +readme = "README.md" +description = "eip-712 encoding" +keywords = ["eip-712", "eip712", "eip"] +license = "GPL-3.0" +edition = "2018" [dependencies] serde_derive = "1.0" diff --git a/util/EIP-712/README.md b/util/EIP-712/README.md new file mode 100644 index 00000000000..8ddb84bb452 --- /dev/null +++ b/util/EIP-712/README.md @@ -0,0 +1,62 @@ +# EIP-712 ![Crates.io](https://img.shields.io/crates/d/EIP-712.svg) [![Released API docs](https://docs.rs/EIP-712/badge.svg)](https://docs.rs/EIP-712) + +## Example + +```rust +use eip_712::{EIP712, hash_structured_data}; +use serde_json::from_str; +use rustc_hex::ToHex; + +fn main() { + let json = r#"{ + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "0x1", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + }, + "types": { + "EIP712Domain": [ + { "name": "name", "type": "string" }, + { "name": "version", "type": "string" }, + { "name": "chainId", "type": "uint256" }, + { "name": "verifyingContract", "type": "address" } + ], + "Person": [ + { "name": "name", "type": "string" }, + { "name": "wallet", "type": "address" } + ], + "Mail": [ + { "name": "from", "type": "Person" }, + { "name": "to", "type": "Person" }, + { "name": "contents", "type": "string" } + ] + } + }"#; + let typed_data = from_str::(json).unwrap(); + + assert_eq!( + hash_structured_data(typed_data).unwrap().to_hex::(), + "be609aee343fb3c4b28e1df9e632fca64fcfaede20f02e86244efddf30957bd2" + ) +} + +``` + +## License + +This crate is distributed under the terms of GNU GENERAL PUBLIC LICENSE version 3.0. + +See [LICENSE](../../LICENSE) for details. diff --git a/util/EIP-712/src/eip712.rs b/util/EIP-712/src/eip712.rs index fea97a98856..426303403d9 100644 --- a/util/EIP-712/src/eip712.rs +++ b/util/EIP-712/src/eip712.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! EIP712 structs use serde_json::{Value}; @@ -21,6 +21,7 @@ use ethereum_types::{U256, H256, Address}; use regex::Regex; use validator::Validate; use validator::ValidationErrors; +use lazy_static::lazy_static; pub(crate) type MessageTypes = HashMap>; diff --git a/util/EIP-712/src/encode.rs b/util/EIP-712/src/encode.rs index 2add93db5c5..f3c89840d64 100644 --- a/util/EIP-712/src/encode.rs +++ b/util/EIP-712/src/encode.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! EIP712 Encoder use ethabi::{encode, Token as EthAbiToken}; @@ -23,14 +23,13 @@ use std::str::FromStr; use itertools::Itertools; use indexmap::IndexSet; use serde_json::to_value; -use parser::{Parser, Type}; -use error::{Result, ErrorKind, serde_error}; -use eip712::{EIP712, MessageTypes}; +use crate::parser::{Parser, Type}; +use crate::error::{Result, ErrorKind, serde_error}; +use crate::eip712::{EIP712, MessageTypes}; use rustc_hex::FromHex; use validator::Validate; use std::collections::HashSet; - fn check_hex(string: &str) -> Result<()> { if string.len() >= 2 && &string[..2] == "0x" { return Ok(()) @@ -162,7 +161,7 @@ fn encode_data( check_hex(&string)?; - let mut bytes = (&string[2..]) + let bytes = (&string[2..]) .from_hex::>() .map_err(|err| ErrorKind::HexParseError(format!("{}", err)))?; diff --git a/util/EIP-712/src/error.rs b/util/EIP-712/src/error.rs index e6b5634e546..3ec1292bb56 100644 --- a/util/EIP-712/src/error.rs +++ b/util/EIP-712/src/error.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::fmt::{self, Display}; use failure::{Fail, Context, Backtrace}; diff --git a/util/EIP-712/src/lib.rs b/util/EIP-712/src/lib.rs index b881a45e390..26ce9615c63 100644 --- a/util/EIP-712/src/lib.rs +++ b/util/EIP-712/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! EIP-712 encoding utilities //! @@ -156,26 +156,12 @@ //! } //! ``` -#![warn(missing_docs, unused_extern_crates)] +#![warn(missing_docs)] -extern crate serde_json; -extern crate ethabi; -extern crate ethereum_types; -extern crate keccak_hash; -extern crate itertools; -extern crate failure; -extern crate indexmap; -extern crate lunarity_lexer; -extern crate toolshed; -extern crate regex; -extern crate validator; #[macro_use] extern crate validator_derive; #[macro_use] extern crate serde_derive; -#[macro_use] -extern crate lazy_static; -extern crate rustc_hex; mod eip712; mod error; @@ -183,8 +169,8 @@ mod parser; mod encode; /// the EIP-712 encoding function -pub use encode::hash_structured_data; +pub use crate::encode::hash_structured_data; /// encoding Error types -pub use error::{ErrorKind, Error}; +pub use crate::error::{ErrorKind, Error}; /// EIP712 struct -pub use eip712::EIP712; +pub use crate::eip712::EIP712; diff --git a/util/EIP-712/src/parser.rs b/util/EIP-712/src/parser.rs index 7f515f7c93f..c2c16cd599a 100644 --- a/util/EIP-712/src/parser.rs +++ b/util/EIP-712/src/parser.rs @@ -1,22 +1,22 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Solidity type-name parsing use lunarity_lexer::{Lexer, Token}; -use error::*; +use crate::error::*; use toolshed::Arena; use std::{fmt, result}; diff --git a/util/bloom/src/lib.rs b/util/bloom/src/lib.rs index 32aad24bf26..3dec641cd39 100644 --- a/util/bloom/src/lib.rs +++ b/util/bloom/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate siphasher; diff --git a/util/blooms-db/benches/blooms.rs b/util/blooms-db/benches/blooms.rs index 7a27260b35a..1cb3bad543e 100644 --- a/util/blooms-db/benches/blooms.rs +++ b/util/blooms-db/benches/blooms.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . #![feature(test)] diff --git a/util/blooms-db/src/db.rs b/util/blooms-db/src/db.rs index 3adedeaf1b5..7d003f7e27c 100644 --- a/util/blooms-db/src/db.rs +++ b/util/blooms-db/src/db.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::{error, io, fmt}; use std::path::{Path, PathBuf}; diff --git a/util/blooms-db/src/file.rs b/util/blooms-db/src/file.rs index 64766c5cde7..0362ce88494 100644 --- a/util/blooms-db/src/file.rs +++ b/util/blooms-db/src/file.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::io::{Seek, SeekFrom, Write, Read}; use std::path::Path; @@ -92,8 +92,9 @@ impl File { /// This function needs to be mutable `fs::File` is just a shared reference a system file handle. /// https://users.rust-lang.org/t/how-to-handle-match-with-irrelevant-ok--/6291/15 pub fn iterator_from(&mut self, pos: u64) -> io::Result { + let start = std::cmp::min(self.len, pos * 256); let mut buf_reader = io::BufReader::new(&self.file); - buf_reader.seek(SeekFrom::Start(pos * 256))?; + buf_reader.seek(SeekFrom::Start(start))?; let iter = FileIterator { file: buf_reader, diff --git a/util/blooms-db/src/lib.rs b/util/blooms-db/src/lib.rs index a810b97328f..83baaffae8e 100644 --- a/util/blooms-db/src/lib.rs +++ b/util/blooms-db/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Ethereum blooms database diff --git a/util/dir/src/helpers.rs b/util/dir/src/helpers.rs index 6c3e0507291..39cc767cac2 100644 --- a/util/dir/src/helpers.rs +++ b/util/dir/src/helpers.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Directory helper functions use ::home_dir; diff --git a/util/dir/src/lib.rs b/util/dir/src/lib.rs index 64b535c686b..fa7882cdd3e 100644 --- a/util/dir/src/lib.rs +++ b/util/dir/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . #![warn(missing_docs)] diff --git a/util/fake-fetch/src/lib.rs b/util/fake-fetch/src/lib.rs index 750656e78f5..9dc52fc93c5 100644 --- a/util/fake-fetch/src/lib.rs +++ b/util/fake-fetch/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate fetch; extern crate hyper; diff --git a/util/fastmap/src/lib.rs b/util/fastmap/src/lib.rs index 65dd9dfb4a0..97f7d3b24e7 100644 --- a/util/fastmap/src/lib.rs +++ b/util/fastmap/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Provides a `H256FastMap` type with H256 keys and fast hashing function. diff --git a/util/fetch/Cargo.toml b/util/fetch/Cargo.toml index d5df1034bc4..c45c2ca4f42 100644 --- a/util/fetch/Cargo.toml +++ b/util/fetch/Cargo.toml @@ -9,7 +9,7 @@ authors = ["Parity Technologies "] [dependencies] futures = "0.1" hyper = "~0.12.9" -hyper-rustls = "0.14" +hyper-rustls = "0.16.0" http = "0.1" log = "0.4" tokio = "~0.1.8" diff --git a/util/fetch/src/client.rs b/util/fetch/src/client.rs index d32273f24a9..e4474fb7939 100644 --- a/util/fetch/src/client.rs +++ b/util/fetch/src/client.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use futures::future::{self, Loop}; use futures::sync::{mpsc, oneshot}; diff --git a/util/fetch/src/lib.rs b/util/fetch/src/lib.rs index 5ad497a792c..eb172d2c673 100644 --- a/util/fetch/src/lib.rs +++ b/util/fetch/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! A service to fetch any HTTP / HTTPS content. diff --git a/util/io/src/lib.rs b/util/io/src/lib.rs index 0673e8da3e6..997edd7c4a2 100644 --- a/util/io/src/lib.rs +++ b/util/io/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! General IO module. //! diff --git a/util/io/src/service_mio.rs b/util/io/src/service_mio.rs index 07d0f8106bb..f1f19bfc28a 100644 --- a/util/io/src/service_mio.rs +++ b/util/io/src/service_mio.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::{Arc, Weak}; use std::thread::{self, JoinHandle}; diff --git a/util/io/src/service_non_mio.rs b/util/io/src/service_non_mio.rs index 30839f9e954..1cef3574e92 100644 --- a/util/io/src/service_non_mio.rs +++ b/util/io/src/service_non_mio.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::sync::{Arc, Weak}; use std::thread; diff --git a/util/io/src/worker.rs b/util/io/src/worker.rs index 74418159c7f..458882a8514 100644 --- a/util/io/src/worker.rs +++ b/util/io/src/worker.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use futures::future::{self, Loop}; use std::sync::Arc; diff --git a/util/journaldb/Cargo.toml b/util/journaldb/Cargo.toml index 060aa4d6ec5..045b42d6628 100644 --- a/util/journaldb/Cargo.toml +++ b/util/journaldb/Cargo.toml @@ -8,17 +8,17 @@ license = "GPL3" [dependencies] parity-bytes = "0.1" ethereum-types = "0.4" -hashdb = "0.3.0" +hash-db = "0.11.0" heapsize = "0.4" keccak-hasher = { path = "../keccak-hasher" } kvdb = "0.1" log = "0.4" -memorydb = "0.3.0" +memory-db = "0.11.0" parking_lot = "0.7" fastmap = { path = "../../util/fastmap" } rlp = { version = "0.3.0", features = ["ethereum"] } [dev-dependencies] -ethcore-logger = { path = "../../logger" } +env_logger = "0.5" keccak-hash = "0.1" kvdb-memorydb = "0.1" diff --git a/util/journaldb/src/archivedb.rs b/util/journaldb/src/archivedb.rs index 86ed6cf5132..a068919a780 100644 --- a/util/journaldb/src/archivedb.rs +++ b/util/journaldb/src/archivedb.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Disk-backed `HashDB` implementation. @@ -23,12 +23,12 @@ use std::sync::Arc; use bytes::Bytes; use ethereum_types::H256; -use hashdb::*; +use hash_db::{HashDB}; use keccak_hasher::KeccakHasher; use kvdb::{KeyValueDB, DBTransaction, DBValue}; use rlp::{encode, decode}; use super::{DB_PREFIX_LEN, LATEST_ERA_KEY, error_key_already_exists, error_negatively_reference_hash}; -use super::memorydb::*; +use super::memory_db::*; use traits::JournalDB; /// Implementation of the `HashDB` trait for a disk-backed database with a memory overlay @@ -52,7 +52,7 @@ impl ArchiveDB { .expect("Low-level database error.") .map(|val| decode::(&val).expect("decoding db value failed")); ArchiveDB { - overlay: MemoryDB::new(), + overlay: ::new_memory_db(), backing, latest_era, column, @@ -62,31 +62,14 @@ impl ArchiveDB { fn payload(&self, key: &H256) -> Option { self.backing.get(self.column, key).expect("Low-level database error. Some issue with your hard disk?") } + } impl HashDB for ArchiveDB { - fn keys(&self) -> HashMap { - let mut ret: HashMap = self.backing.iter(self.column) - .map(|(key, _)| (H256::from_slice(&*key), 1)) - .collect(); - - for (key, refs) in self.overlay.keys() { - match ret.entry(key) { - Entry::Occupied(mut entry) => { - *entry.get_mut() += refs; - }, - Entry::Vacant(entry) => { - entry.insert(refs); - } - } - } - ret - } - fn get(&self, key: &H256) -> Option { if let Some((d, rc)) = self.overlay.raw(key) { if rc > 0 { - return Some(d); + return Some(d.clone()); } } self.payload(key) @@ -109,7 +92,28 @@ impl HashDB for ArchiveDB { } } +impl ::traits::KeyedHashDB for ArchiveDB { + fn keys(&self) -> HashMap { + let mut ret: HashMap = self.backing.iter(self.column) + .map(|(key, _)| (H256::from_slice(&*key), 1)) + .collect(); + + for (key, refs) in self.overlay.keys() { + match ret.entry(key) { + Entry::Occupied(mut entry) => { + *entry.get_mut() += refs; + }, + Entry::Vacant(entry) => { + entry.insert(refs); + } + } + } + ret + } +} + impl JournalDB for ArchiveDB { + fn boxed_clone(&self) -> Box { Box::new(ArchiveDB { overlay: self.overlay.clone(), @@ -202,7 +206,7 @@ impl JournalDB for ArchiveDB { mod tests { use keccak::keccak; - use hashdb::HashDB; + use hash_db::HashDB; use super::*; use {kvdb_memorydb, JournalDB}; diff --git a/util/journaldb/src/as_hash_db_impls.rs b/util/journaldb/src/as_hash_db_impls.rs index 648e370a015..8a380ea56af 100644 --- a/util/journaldb/src/as_hash_db_impls.rs +++ b/util/journaldb/src/as_hash_db_impls.rs @@ -1,21 +1,21 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Impls of the `AsHashDB` upcast trait for all different variants of DB -use hashdb::{HashDB, AsHashDB}; +use hash_db::{HashDB, AsHashDB}; use keccak_hasher::KeccakHasher; use archivedb::ArchiveDB; use earlymergedb::EarlyMergeDB; @@ -23,28 +23,49 @@ use overlayrecentdb::OverlayRecentDB; use refcounteddb::RefCountedDB; use overlaydb::OverlayDB; use kvdb::DBValue; +use crate::{KeyedHashDB, AsKeyedHashDB}; impl AsHashDB for ArchiveDB { - fn as_hashdb(&self) -> &HashDB { self } - fn as_hashdb_mut(&mut self) -> &mut HashDB { self } + fn as_hash_db(&self) -> &HashDB { self } + fn as_hash_db_mut(&mut self) -> &mut HashDB { self } } impl AsHashDB for EarlyMergeDB { - fn as_hashdb(&self) -> &HashDB { self } - fn as_hashdb_mut(&mut self) -> &mut HashDB { self } + fn as_hash_db(&self) -> &HashDB { self } + fn as_hash_db_mut(&mut self) -> &mut HashDB { self } } impl AsHashDB for OverlayRecentDB { - fn as_hashdb(&self) -> &HashDB { self } - fn as_hashdb_mut(&mut self) -> &mut HashDB { self } + fn as_hash_db(&self) -> &HashDB { self } + fn as_hash_db_mut(&mut self) -> &mut HashDB { self } } impl AsHashDB for RefCountedDB { - fn as_hashdb(&self) -> &HashDB { self } - fn as_hashdb_mut(&mut self) -> &mut HashDB { self } + fn as_hash_db(&self) -> &HashDB { self } + fn as_hash_db_mut(&mut self) -> &mut HashDB { self } } impl AsHashDB for OverlayDB { - fn as_hashdb(&self) -> &HashDB { self } - fn as_hashdb_mut(&mut self) -> &mut HashDB { self } + fn as_hash_db(&self) -> &HashDB { self } + fn as_hash_db_mut(&mut self) -> &mut HashDB { self } +} + +impl AsKeyedHashDB for ArchiveDB { + fn as_keyed_hash_db(&self) -> &KeyedHashDB { self } +} + +impl AsKeyedHashDB for EarlyMergeDB { + fn as_keyed_hash_db(&self) -> &KeyedHashDB { self } +} + +impl AsKeyedHashDB for OverlayRecentDB { + fn as_keyed_hash_db(&self) -> &KeyedHashDB { self } +} + +impl AsKeyedHashDB for RefCountedDB { + fn as_keyed_hash_db(&self) -> &KeyedHashDB { self } +} + +impl AsKeyedHashDB for OverlayDB { + fn as_keyed_hash_db(&self) -> &KeyedHashDB { self } } diff --git a/util/journaldb/src/earlymergedb.rs b/util/journaldb/src/earlymergedb.rs index e50df30733e..2a55200c496 100644 --- a/util/journaldb/src/earlymergedb.rs +++ b/util/journaldb/src/earlymergedb.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Disk-backed `HashDB` implementation. @@ -23,11 +23,11 @@ use std::sync::Arc; use bytes::Bytes; use ethereum_types::H256; -use hashdb::*; +use hash_db::{HashDB}; use heapsize::HeapSizeOf; use keccak_hasher::KeccakHasher; use kvdb::{KeyValueDB, DBTransaction, DBValue}; -use memorydb::*; +use memory_db::*; use parking_lot::RwLock; use rlp::{encode, decode}; use super::{DB_PREFIX_LEN, LATEST_ERA_KEY, error_negatively_reference_hash, error_key_already_exists}; @@ -120,7 +120,7 @@ impl EarlyMergeDB { let (latest_era, refs) = EarlyMergeDB::read_refs(&*backing, col); let refs = Some(Arc::new(RwLock::new(refs))); EarlyMergeDB { - overlay: MemoryDB::new(), + overlay: ::new_memory_db(), backing: backing, refs: refs, latest_era: latest_era, @@ -285,31 +285,14 @@ impl EarlyMergeDB { } (latest_era, refs) } + } impl HashDB for EarlyMergeDB { - fn keys(&self) -> HashMap { - let mut ret: HashMap = self.backing.iter(self.column) - .map(|(key, _)| (H256::from_slice(&*key), 1)) - .collect(); - - for (key, refs) in self.overlay.keys() { - match ret.entry(key) { - Entry::Occupied(mut entry) => { - *entry.get_mut() += refs; - }, - Entry::Vacant(entry) => { - entry.insert(refs); - } - } - } - ret - } - fn get(&self, key: &H256) -> Option { if let Some((d, rc)) = self.overlay.raw(key) { if rc > 0 { - return Some(d) + return Some(d.clone()) } } self.payload(key) @@ -330,6 +313,26 @@ impl HashDB for EarlyMergeDB { } } +impl ::traits::KeyedHashDB for EarlyMergeDB { + fn keys(&self) -> HashMap { + let mut ret: HashMap = self.backing.iter(self.column) + .map(|(key, _)| (H256::from_slice(&*key), 1)) + .collect(); + + for (key, refs) in self.overlay.keys() { + match ret.entry(key) { + Entry::Occupied(mut entry) => { + *entry.get_mut() += refs; + }, + Entry::Vacant(entry) => { + entry.insert(refs); + } + } + } + ret + } +} + impl JournalDB for EarlyMergeDB { fn boxed_clone(&self) -> Box { Box::new(EarlyMergeDB { @@ -523,10 +526,9 @@ impl JournalDB for EarlyMergeDB { mod tests { use keccak::keccak; - use hashdb::HashDB; + use hash_db::HashDB; use super::*; use super::super::traits::JournalDB; - use ethcore_logger::init_log; use kvdb_memorydb; #[test] @@ -823,7 +825,7 @@ mod tests { #[test] fn insert_delete_insert_delete_insert_expunge() { - init_log(); + let _ = ::env_logger::try_init(); let mut jdb = new_db(); @@ -850,7 +852,7 @@ mod tests { #[test] fn forked_insert_delete_insert_delete_insert_expunge() { - init_log(); + let _ = ::env_logger::try_init(); let mut jdb = new_db(); // history is 4 @@ -959,7 +961,7 @@ mod tests { #[test] fn reopen_remove_three() { - init_log(); + let _ = ::env_logger::try_init(); let shared_db = Arc::new(kvdb_memorydb::create(0)); let foo = keccak(b"foo"); diff --git a/util/journaldb/src/lib.rs b/util/journaldb/src/lib.rs index e88b437d828..3eb6ee38c84 100644 --- a/util/journaldb/src/lib.rs +++ b/util/journaldb/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! `JournalDB` interface and implementation. @@ -22,16 +22,16 @@ extern crate log; extern crate ethereum_types; extern crate parity_bytes as bytes; -extern crate hashdb; +extern crate hash_db; extern crate keccak_hasher; extern crate kvdb; -extern crate memorydb; +extern crate memory_db; extern crate parking_lot; extern crate fastmap; extern crate rlp; #[cfg(test)] -extern crate ethcore_logger; +extern crate env_logger; #[cfg(test)] extern crate keccak_hash as keccak; #[cfg(test)] @@ -54,6 +54,11 @@ pub mod overlaydb; /// Export the `JournalDB` trait. pub use self::traits::JournalDB; +/// Export keyed hash trait +pub use self::traits::KeyedHashDB; +/// Export as keyed hash trait +pub use self::traits::AsKeyedHashDB; + /// Journal database operating strategy. #[derive(Debug, PartialEq, Clone, Copy)] pub enum Algorithm { @@ -158,6 +163,10 @@ fn error_negatively_reference_hash(hash: ðereum_types::H256) -> io::Error { io::Error::new(io::ErrorKind::Other, format!("Entry {} removed from database more times than it was added.", hash)) } +pub fn new_memory_db() -> memory_db::MemoryDB { + memory_db::MemoryDB::from_null_node(&rlp::NULL_RLP, rlp::NULL_RLP.as_ref().into()) +} + #[cfg(test)] mod tests { use super::Algorithm; diff --git a/util/journaldb/src/overlaydb.rs b/util/journaldb/src/overlaydb.rs index 259e756bd94..757a92e6219 100644 --- a/util/journaldb/src/overlaydb.rs +++ b/util/journaldb/src/overlaydb.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Disk-backed `HashDB` implementation. @@ -23,9 +23,9 @@ use std::sync::Arc; use ethereum_types::H256; use rlp::{Rlp, RlpStream, Encodable, DecoderError, Decodable, encode, decode}; -use hashdb::*; +use hash_db::{HashDB}; use keccak_hasher::KeccakHasher; -use memorydb::*; +use memory_db::*; use kvdb::{KeyValueDB, DBTransaction, DBValue}; use super::{error_negatively_reference_hash}; @@ -80,7 +80,7 @@ impl Decodable for Payload { impl OverlayDB { /// Create a new instance of OverlayDB given a `backing` database. pub fn new(backing: Arc, col: Option) -> OverlayDB { - OverlayDB{ overlay: MemoryDB::new(), backing: backing, column: col } + OverlayDB{ overlay: ::new_memory_db(), backing: backing, column: col } } /// Create a new instance of OverlayDB with an anonymous temporary database. @@ -153,9 +153,10 @@ impl OverlayDB { true } } + } -impl HashDB for OverlayDB { +impl crate::KeyedHashDB for OverlayDB { fn keys(&self) -> HashMap { let mut ret: HashMap = self.backing.iter(self.column) .map(|(key, _)| { @@ -178,13 +179,16 @@ impl HashDB for OverlayDB { ret } +} + +impl HashDB for OverlayDB { fn get(&self, key: &H256) -> Option { // return ok if positive; if negative, check backing - might be enough references there to make // it positive again. let k = self.overlay.raw(key); let memrc = { if let Some((d, rc)) = k { - if rc > 0 { return Some(d); } + if rc > 0 { return Some(d.clone()); } rc } else { 0 diff --git a/util/journaldb/src/overlayrecentdb.rs b/util/journaldb/src/overlayrecentdb.rs index 017447bcc4b..a48e59d91f3 100644 --- a/util/journaldb/src/overlayrecentdb.rs +++ b/util/journaldb/src/overlayrecentdb.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! `JournalDB` over in-memory overlay @@ -23,11 +23,11 @@ use std::sync::Arc; use bytes::Bytes; use ethereum_types::H256; -use hashdb::*; +use hash_db::{HashDB}; use heapsize::HeapSizeOf; use keccak_hasher::KeccakHasher; use kvdb::{KeyValueDB, DBTransaction, DBValue}; -use memorydb::*; +use memory_db::*; use parking_lot::RwLock; use fastmap::H256FastMap; use rlp::{Rlp, RlpStream, encode, decode, DecoderError, Decodable, Encodable}; @@ -157,7 +157,7 @@ impl OverlayRecentDB { pub fn new(backing: Arc, col: Option) -> OverlayRecentDB { let journal_overlay = Arc::new(RwLock::new(OverlayRecentDB::read_overlay(&*backing, col))); OverlayRecentDB { - transaction_overlay: MemoryDB::new(), + transaction_overlay: ::new_memory_db(), backing: backing, journal_overlay: journal_overlay, column: col, @@ -181,7 +181,7 @@ impl OverlayRecentDB { fn read_overlay(db: &KeyValueDB, col: Option) -> JournalOverlay { let mut journal = HashMap::new(); - let mut overlay = MemoryDB::new(); + let mut overlay = ::new_memory_db(); let mut count = 0; let mut latest_era = None; let mut earliest_era = None; @@ -233,6 +233,7 @@ impl OverlayRecentDB { cumulative_size: cumulative_size, } } + } #[inline] @@ -242,7 +243,28 @@ fn to_short_key(key: &H256) -> H256 { k } +impl ::traits::KeyedHashDB for OverlayRecentDB { + fn keys(&self) -> HashMap { + let mut ret: HashMap = self.backing.iter(self.column) + .map(|(key, _)| (H256::from_slice(&*key), 1)) + .collect(); + + for (key, refs) in self.transaction_overlay.keys() { + match ret.entry(key) { + Entry::Occupied(mut entry) => { + *entry.get_mut() += refs; + }, + Entry::Vacant(entry) => { + entry.insert(refs); + } + } + } + ret + } +} + impl JournalDB for OverlayRecentDB { + fn boxed_clone(&self) -> Box { Box::new(self.clone()) } @@ -365,7 +387,7 @@ impl JournalDB for OverlayRecentDB { for h in &journal.insertions { if let Some((d, rc)) = journal_overlay.backing_overlay.raw(&to_short_key(h)) { if rc > 0 { - canon_insertions.push((h.clone(), d)); //TODO: optimize this to avoid data copy + canon_insertions.push((h.clone(), d.clone())); //TODO: optimize this to avoid data copy } } } @@ -440,28 +462,10 @@ impl JournalDB for OverlayRecentDB { } impl HashDB for OverlayRecentDB { - fn keys(&self) -> HashMap { - let mut ret: HashMap = self.backing.iter(self.column) - .map(|(key, _)| (H256::from_slice(&*key), 1)) - .collect(); - - for (key, refs) in self.transaction_overlay.keys() { - match ret.entry(key) { - Entry::Occupied(mut entry) => { - *entry.get_mut() += refs; - }, - Entry::Vacant(entry) => { - entry.insert(refs); - } - } - } - ret - } - fn get(&self, key: &H256) -> Option { if let Some((d, rc)) = self.transaction_overlay.raw(key) { if rc > 0 { - return Some(d) + return Some(d.clone()) } } let v = { @@ -493,8 +497,7 @@ mod tests { use keccak::keccak; use super::*; - use hashdb::HashDB; - use ethcore_logger::init_log; + use hash_db::HashDB; use {kvdb_memorydb, JournalDB}; fn new_db() -> OverlayRecentDB { @@ -772,7 +775,7 @@ mod tests { #[test] fn insert_delete_insert_delete_insert_expunge() { - init_log(); + let _ = ::env_logger::try_init(); let mut jdb = new_db(); // history is 4 @@ -798,7 +801,7 @@ mod tests { #[test] fn forked_insert_delete_insert_delete_insert_expunge() { - init_log(); + let _ = ::env_logger::try_init(); let mut jdb = new_db(); // history is 4 @@ -905,7 +908,7 @@ mod tests { #[test] fn reopen_remove_three() { - init_log(); + let _ = ::env_logger::try_init(); let shared_db = Arc::new(kvdb_memorydb::create(0)); let foo = keccak(b"foo"); diff --git a/util/journaldb/src/refcounteddb.rs b/util/journaldb/src/refcounteddb.rs index 99b3d8d738e..bdd396a481e 100644 --- a/util/journaldb/src/refcounteddb.rs +++ b/util/journaldb/src/refcounteddb.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Disk-backed, ref-counted `JournalDB` implementation. @@ -22,11 +22,11 @@ use std::sync::Arc; use bytes::Bytes; use ethereum_types::H256; -use hashdb::*; +use hash_db::{HashDB}; use heapsize::HeapSizeOf; use keccak_hasher::KeccakHasher; use kvdb::{KeyValueDB, DBTransaction, DBValue}; -use memorydb::MemoryDB; +use memory_db::MemoryDB; use overlaydb::OverlayDB; use rlp::{encode, decode}; use super::{DB_PREFIX_LEN, LATEST_ERA_KEY}; @@ -81,7 +81,6 @@ impl RefCountedDB { } impl HashDB for RefCountedDB { - fn keys(&self) -> HashMap { self.forward.keys() } fn get(&self, key: &H256) -> Option { self.forward.get(key) } fn contains(&self, key: &H256) -> bool { self.forward.contains(key) } fn insert(&mut self, value: &[u8]) -> H256 { let r = self.forward.insert(value); self.inserts.push(r.clone()); r } @@ -89,6 +88,10 @@ impl HashDB for RefCountedDB { fn remove(&mut self, key: &H256) { self.removes.push(key.clone()); } } +impl ::traits::KeyedHashDB for RefCountedDB { + fn keys(&self) -> HashMap { self.forward.keys() } +} + impl JournalDB for RefCountedDB { fn boxed_clone(&self) -> Box { Box::new(RefCountedDB { @@ -216,7 +219,7 @@ impl JournalDB for RefCountedDB { mod tests { use keccak::keccak; - use hashdb::HashDB; + use hash_db::HashDB; use super::*; use {JournalDB, kvdb_memorydb}; diff --git a/util/journaldb/src/traits.rs b/util/journaldb/src/traits.rs index 1d6aae5f6bf..e6ce8acb040 100644 --- a/util/journaldb/src/traits.rs +++ b/util/journaldb/src/traits.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Disk-backed `HashDB` implementation. @@ -21,13 +21,28 @@ use std::sync::Arc; use bytes::Bytes; use ethereum_types::H256; -use hashdb::HashDB; +use hash_db::{HashDB, AsHashDB}; use keccak_hasher::KeccakHasher; use kvdb::{self, DBTransaction, DBValue}; +use std::collections::HashMap; + + +/// expose keys of a hashDB for debugging or tests (slow). +pub trait KeyedHashDB: HashDB { + /// Primarily use for tests, highly inefficient. + fn keys(&self) -> HashMap; +} + +/// Upcast to `KeyedHashDB` +pub trait AsKeyedHashDB: AsHashDB { + /// Perform upcast to KeyedHashDB. + fn as_keyed_hash_db(&self) -> &KeyedHashDB; +} /// A `HashDB` which can manage a short-term journal potentially containing many forks of mutually /// exclusive actions. -pub trait JournalDB: HashDB { +pub trait JournalDB: KeyedHashDB { + /// Return a copy of ourself, in a box. fn boxed_clone(&self) -> Box; @@ -78,7 +93,7 @@ pub trait JournalDB: HashDB { fn flush(&self) {} /// Consolidate all the insertions and deletions in the given memory overlay. - fn consolidate(&mut self, overlay: ::memorydb::MemoryDB); + fn consolidate(&mut self, overlay: ::memory_db::MemoryDB); /// Commit all changes in a single batch #[cfg(test)] diff --git a/util/journaldb/src/util.rs b/util/journaldb/src/util.rs index e99be458e58..11d329595a4 100644 --- a/util/journaldb/src/util.rs +++ b/util/journaldb/src/util.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use ethereum_types::H256; use rlp::{RlpStream, Encodable, Rlp, DecoderError}; diff --git a/util/keccak-hasher/Cargo.toml b/util/keccak-hasher/Cargo.toml index f61e461e29e..edeecda8331 100644 --- a/util/keccak-hasher/Cargo.toml +++ b/util/keccak-hasher/Cargo.toml @@ -8,5 +8,5 @@ license = "GPL-3.0" [dependencies] ethereum-types = "0.4" tiny-keccak = "1.4.2" -hashdb = "0.3.0" +hash-db = "0.11.0" plain_hasher = "0.2" diff --git a/util/keccak-hasher/src/lib.rs b/util/keccak-hasher/src/lib.rs index bb2b5b45ffe..d9c9be5454e 100644 --- a/util/keccak-hasher/src/lib.rs +++ b/util/keccak-hasher/src/lib.rs @@ -1,26 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Hasher implementation for the Keccak-256 hash -extern crate hashdb; +extern crate hash_db; extern crate ethereum_types; extern crate tiny_keccak; extern crate plain_hasher; -use hashdb::Hasher; +use hash_db::Hasher; use ethereum_types::H256; use tiny_keccak::Keccak; use plain_hasher::PlainHasher; diff --git a/util/len-caching-lock/src/lib.rs b/util/len-caching-lock/src/lib.rs index 553f85ec87e..f2c04e454dd 100644 --- a/util/len-caching-lock/src/lib.rs +++ b/util/len-caching-lock/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! This crate allows automatic caching of `T.len()` with an api that //! allows drop in replacement for `parking_lot` diff --git a/util/len-caching-lock/src/mutex.rs b/util/len-caching-lock/src/mutex.rs index b884a2e06bc..c9a2ea02a47 100644 --- a/util/len-caching-lock/src/mutex.rs +++ b/util/len-caching-lock/src/mutex.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::ops::{Deref, DerefMut}; use std::sync::atomic::AtomicUsize; diff --git a/util/len-caching-lock/src/rwlock.rs b/util/len-caching-lock/src/rwlock.rs index 4d414308ec4..3593cbcf793 100644 --- a/util/len-caching-lock/src/rwlock.rs +++ b/util/len-caching-lock/src/rwlock.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::ops::{Deref, DerefMut}; use std::sync::atomic::AtomicUsize; diff --git a/util/len-caching-mutex/Cargo.toml b/util/len-caching-mutex/Cargo.toml deleted file mode 100644 index a1cfde1f070..00000000000 --- a/util/len-caching-mutex/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -description = "Mutex with cached len, for use with collections" -homepage = "http://parity.io" -license = "GPL-3.0" -name = "len-caching-mutex" -version = "0.1.0" -authors = ["Parity Technologies "] - -[dependencies] -parking_lot = "0.7" diff --git a/util/macros/src/lib.rs b/util/macros/src/lib.rs index cc5f92ba150..999c5122ed1 100644 --- a/util/macros/src/lib.rs +++ b/util/macros/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Utils common types and macros global reexport. diff --git a/util/mem/Cargo.toml b/util/mem/Cargo.toml deleted file mode 100644 index 29d1db923ee..00000000000 --- a/util/mem/Cargo.toml +++ /dev/null @@ -1,4 +0,0 @@ -[package] -name = "mem" -version = "0.1.0" -authors = ["Parity Technologies "] diff --git a/util/memory_cache/Cargo.toml b/util/memory-cache/Cargo.toml similarity index 100% rename from util/memory_cache/Cargo.toml rename to util/memory-cache/Cargo.toml diff --git a/util/memory_cache/src/lib.rs b/util/memory-cache/src/lib.rs similarity index 90% rename from util/memory_cache/src/lib.rs rename to util/memory-cache/src/lib.rs index ab3feafbf5f..64d10336fe2 100644 --- a/util/memory_cache/src/lib.rs +++ b/util/memory-cache/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Lru-cache related utilities as quick-and-dirty wrappers around the lru-cache //! crate. diff --git a/util/memzero/Cargo.toml b/util/memzero/Cargo.toml new file mode 100644 index 00000000000..67d17d26d07 --- /dev/null +++ b/util/memzero/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "memzero" +version = "0.1.0" +description = "A wrapper for zero-ing out memory when dropped" +license = "GPL-3.0" +homepage = "https://parity.io" +repository = "https://github.com/paritytech/parity-ethereum" +documentation = "https://docs.rs/crate/memzero" +authors = ["Parity Technologies "] +edition = "2018" diff --git a/util/mem/src/lib.rs b/util/memzero/src/lib.rs similarity index 78% rename from util/mem/src/lib.rs rename to util/memzero/src/lib.rs index 735a58cd232..827407a9133 100644 --- a/util/mem/src/lib.rs +++ b/util/memzero/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::ops::{Deref, DerefMut}; use std::ptr; diff --git a/util/migration-rocksdb/src/lib.rs b/util/migration-rocksdb/src/lib.rs index 60b66ccf062..d63f2843ca3 100644 --- a/util/migration-rocksdb/src/lib.rs +++ b/util/migration-rocksdb/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! DB Migration module. diff --git a/util/migration-rocksdb/tests/tests.rs b/util/migration-rocksdb/tests/tests.rs index 0e22e6a6568..7458c2d3222 100644 --- a/util/migration-rocksdb/tests/tests.rs +++ b/util/migration-rocksdb/tests/tests.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Tests for migrations. //! A random temp directory is created. A database is created within it, and migrations diff --git a/util/network-devp2p/Cargo.toml b/util/network-devp2p/Cargo.toml index 87d36b718c4..8bf402e206e 100644 --- a/util/network-devp2p/Cargo.toml +++ b/util/network-devp2p/Cargo.toml @@ -21,11 +21,10 @@ ansi_term = "0.10" rustc-hex = "1.0" ethcore-io = { path = "../io", features = ["mio"] } parity-bytes = "0.1" -parity-crypto = "0.2" -ethcore-logger = { path ="../../logger" } +parity-crypto = "0.3.0" ethcore-network = { path = "../network" } ethereum-types = "0.4" -ethkey = { path = "../../ethkey" } +ethkey = { path = "../../accounts/ethkey" } rlp = { version = "0.3.0", features = ["ethereum"] } parity-path = "0.1" ipnetwork = "0.12.6" @@ -35,8 +34,10 @@ serde = "1.0" serde_json = "1.0" serde_derive = "1.0" error-chain = { version = "0.12", default-features = false } +lru-cache = "0.1" [dev-dependencies] +env_logger = "0.5" tempdir = "0.3" assert_matches = "1.2" diff --git a/util/network-devp2p/src/connection.rs b/util/network-devp2p/src/connection.rs index eb663d37942..ae34ec44cf9 100644 --- a/util/network-devp2p/src/connection.rs +++ b/util/network-devp2p/src/connection.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::collections::VecDeque; use std::net::SocketAddr; @@ -41,6 +41,10 @@ const ENCRYPTED_HEADER_LEN: usize = 32; const RECEIVE_PAYLOAD: Duration = Duration::from_secs(30); pub const MAX_PAYLOAD_SIZE: usize = (1 << 24) - 1; +/// Network responses should try not to go over this limit. +/// This should be lower than MAX_PAYLOAD_SIZE +pub const PAYLOAD_SOFT_LIMIT: usize = (1 << 22) - 1; + pub trait GenericSocket : Read + Write { } diff --git a/util/network-devp2p/src/discovery.rs b/util/network-devp2p/src/discovery.rs index abf6cf4d0f8..7bf8dc62e5e 100644 --- a/util/network-devp2p/src/discovery.rs +++ b/util/network-devp2p/src/discovery.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use parity_bytes::Bytes; use std::net::SocketAddr; @@ -20,6 +20,7 @@ use std::collections::{HashSet, HashMap, VecDeque}; use std::collections::hash_map::Entry; use std::default::Default; use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH}; +use lru_cache::LruCache; use hash::keccak; use ethereum_types::{H256, H520}; use rlp::{Rlp, RlpStream}; @@ -53,12 +54,17 @@ const REQUEST_BACKOFF: [Duration; 4] = [ Duration::from_secs(64) ]; +const NODE_LAST_SEEN_TIMEOUT: Duration = Duration::from_secs(24*60*60); + +const OBSERVED_NODES_MAX_SIZE: usize = 10_000; + #[derive(Clone, Debug)] pub struct NodeEntry { pub id: NodeId, pub endpoint: NodeEndpoint, } +#[derive(Debug)] pub struct BucketEntry { pub address: NodeEntry, pub id_hash: H256, @@ -89,6 +95,32 @@ struct FindNodeRequest { answered: bool, } +#[derive(Clone, Copy)] +enum PingReason { + Default, + FromDiscoveryRequest(NodeId, NodeValidity), +} + +#[derive(Clone, Copy, PartialEq)] +enum NodeCategory { + Bucket, + Observed +} + +#[derive(Clone, Copy, PartialEq)] +enum NodeValidity { + Ourselves, + ValidNode(NodeCategory), + ExpiredNode(NodeCategory), + UnknownNode +} + +#[derive(Debug)] +enum BucketError { + Ourselves, + NotInTheBucket{node_entry: NodeEntry, bucket_distance: usize}, +} + struct PingRequest { // Time when the request was sent sent_at: Instant, @@ -99,8 +131,10 @@ struct PingRequest { // The hash Parity used to respond with (until rev 01f825b0e1f1c4c420197b51fc801cbe89284b29) #[deprecated()] deprecated_echo_hash: H256, + reason: PingReason } +#[derive(Debug)] pub struct NodeBucket { nodes: VecDeque, //sorted by last active } @@ -134,6 +168,12 @@ pub struct Discovery<'a> { discovery_id: NodeId, discovery_nodes: HashSet, node_buckets: Vec, + + // Sometimes we don't want to add nodes to the NodeTable, but still want to + // keep track of them to avoid excessive pinging (happens when an unknown node sends + // a discovery request to us -- the node might be on a different net). + other_observed_nodes: LruCache, + in_flight_pings: HashMap, in_flight_find_nodes: HashMap, send_queue: VecDeque, @@ -160,6 +200,7 @@ impl<'a> Discovery<'a> { discovery_id: NodeId::new(), discovery_nodes: HashSet::new(), node_buckets: (0..ADDRESS_BITS).map(|_| NodeBucket::new()).collect(), + other_observed_nodes: LruCache::new(OBSERVED_NODES_MAX_SIZE), in_flight_pings: HashMap::new(), in_flight_find_nodes: HashMap::new(), send_queue: VecDeque::new(), @@ -178,7 +219,7 @@ impl<'a> Discovery<'a> { if self.node_buckets[dist].nodes.iter().any(|n| n.id_hash == id_hash) { return; } - self.try_ping(e); + self.try_ping(e, PingReason::Default); } } @@ -189,41 +230,53 @@ impl<'a> Discovery<'a> { } } - fn update_node(&mut self, e: NodeEntry) -> Option { - trace!(target: "discovery", "Inserting {:?}", &e); + fn update_bucket_record(&mut self, e: NodeEntry) -> Result<(), BucketError> { let id_hash = keccak(e.id); let dist = match Discovery::distance(&self.id_hash, &id_hash) { Some(dist) => dist, None => { debug!(target: "discovery", "Attempted to update own entry: {:?}", e); - return None; + return Err(BucketError::Ourselves); } }; + let bucket = &mut self.node_buckets[dist]; + bucket.nodes.iter_mut().find(|n| n.address.id == e.id) + .map_or(Err(BucketError::NotInTheBucket{node_entry: e.clone(), bucket_distance: dist}.into()), |entry| { + entry.address = e; + entry.last_seen = Instant::now(); + entry.backoff_until = Instant::now(); + entry.fail_count = 0; + Ok(()) + }) + } - let mut added_map = HashMap::new(); - let ping = { - let bucket = &mut self.node_buckets[dist]; - let updated = if let Some(node) = bucket.nodes.iter_mut().find(|n| n.address.id == e.id) { - node.address = e.clone(); - node.last_seen = Instant::now(); - node.backoff_until = Instant::now(); - node.fail_count = 0; - true - } else { false }; + fn update_node(&mut self, e: NodeEntry) -> Option { + trace!(target: "discovery", "Inserting {:?}", &e); + + match self.update_bucket_record(e) { + Ok(()) => None, + Err(BucketError::Ourselves) => None, + Err(BucketError::NotInTheBucket{node_entry, bucket_distance}) => Some((node_entry, bucket_distance)) + }.map(|(node_entry, bucket_distance)| { + trace!(target: "discovery", "Adding a new node {:?} into our bucket {}", &node_entry, bucket_distance); - if !updated { - added_map.insert(e.id, e.clone()); - bucket.nodes.push_front(BucketEntry::new(e)); + let mut added = HashMap::with_capacity(1); + added.insert(node_entry.id, node_entry.clone()); + let node_to_ping = { + let bucket = &mut self.node_buckets[bucket_distance]; + bucket.nodes.push_front(BucketEntry::new(node_entry)); if bucket.nodes.len() > BUCKET_SIZE { select_bucket_ping(bucket.nodes.iter()) - } else { None } - } else { None } - }; - if let Some(node) = ping { - self.try_ping(node); - } - Some(TableUpdates { added: added_map, removed: HashSet::new() }) + } else { + None + } + }; + if let Some(node) = node_to_ping { + self.try_ping(node, PingReason::Default); + }; + TableUpdates{added, removed: HashSet::new()} + }) } /// Starts the discovery process at round 0 @@ -244,7 +297,7 @@ impl<'a> Discovery<'a> { fn update_new_nodes(&mut self) { while self.in_flight_pings.len() < MAX_NODES_PING { match self.adding_nodes.pop() { - Some(next) => self.try_ping(next), + Some(next) => self.try_ping(next, PingReason::Default), None => break, } } @@ -298,7 +351,7 @@ impl<'a> Discovery<'a> { None // a and b are equal, so log distance is -inf } - fn try_ping(&mut self, node: NodeEntry) { + fn try_ping(&mut self, node: NodeEntry, reason: PingReason) { if !self.is_allowed(&node) { trace!(target: "discovery", "Node {:?} not allowed", node); return; @@ -313,7 +366,7 @@ impl<'a> Discovery<'a> { } if self.in_flight_pings.len() < MAX_NODES_PING { - self.ping(&node) + self.ping(&node, reason) .unwrap_or_else(|e| { warn!(target: "discovery", "Error sending Ping packet: {:?}", e); }); @@ -322,7 +375,7 @@ impl<'a> Discovery<'a> { } } - fn ping(&mut self, node: &NodeEntry) -> Result<(), Error> { + fn ping(&mut self, node: &NodeEntry, reason: PingReason) -> Result<(), Error> { let mut rlp = RlpStream::new_list(4); rlp.append(&PROTOCOL_VERSION); self.public_endpoint.to_rlp_list(&mut rlp); @@ -336,6 +389,7 @@ impl<'a> Discovery<'a> { node: node.clone(), echo_hash: hash, deprecated_echo_hash: old_parity_hash, + reason: reason }); trace!(target: "discovery", "Sent Ping to {:?} ; node_id={:#x}", &node.endpoint, node.id); @@ -420,7 +474,6 @@ impl<'a> Discovery<'a> { self.send_queue.push_back(Datagram { payload, address }); } - pub fn on_packet(&mut self, packet: &[u8], from: SocketAddr) -> Result, Error> { // validate packet if packet.len() < 32 + 65 + 4 + 1 { @@ -515,7 +568,7 @@ impl<'a> Discovery<'a> { if request.deprecated_echo_hash == echo_hash { trace!(target: "discovery", "Got Pong from an old parity-ethereum version."); } - Some(request.node.clone()) + Some((request.node.clone(), request.reason.clone())) } }; @@ -529,29 +582,98 @@ impl<'a> Discovery<'a> { }, }; - if let Some(node) = expected_node { - Ok(self.update_node(node)) + if let Some((node, ping_reason)) = expected_node { + if let PingReason::FromDiscoveryRequest(target, validity) = ping_reason { + self.respond_with_discovery(target, &node)?; + // kirushik: I would prefer to probe the network id of the remote node here, and add it to the nodes list if it's on "our" net -- + // but `on_packet` happens synchronously, so doing the full TCP handshake ceremony here is a bad idea. + // So instead we just LRU-caching most recently seen nodes to avoid unnecessary pinging + match validity { + NodeValidity::ValidNode(NodeCategory::Bucket) | NodeValidity::ExpiredNode(NodeCategory::Bucket) => { + trace!(target: "discovery", "Updating node {:?} in our Kad buckets", &node); + self.update_bucket_record(node).unwrap_or_else(|error| { + debug!(target: "discovery", "Error occured when processing ping from a bucket node: {:?}", &error); + }); + }, + NodeValidity::UnknownNode | NodeValidity::ExpiredNode(NodeCategory::Observed) | NodeValidity::ValidNode(NodeCategory::Observed)=> { + trace!(target: "discovery", "Updating node {:?} in the list of other_observed_nodes", &node); + self.other_observed_nodes.insert(node.id, (node.endpoint, Instant::now())); + }, + NodeValidity::Ourselves => (), + } + Ok(None) + } else { + Ok(self.update_node(node)) + } } else { debug!(target: "discovery", "Got unexpected Pong from {:?} ; request not found", &from); Ok(None) } } - fn on_find_node(&mut self, rlp: &Rlp, _node: &NodeId, from: &SocketAddr) -> Result, Error> { + fn on_find_node(&mut self, rlp: &Rlp, node_id: &NodeId, from: &SocketAddr) -> Result, Error> { trace!(target: "discovery", "Got FindNode from {:?}", &from); let target: NodeId = rlp.val_at(0)?; let timestamp: u64 = rlp.val_at(1)?; self.check_timestamp(timestamp)?; + + let node = NodeEntry { + id: node_id.clone(), + endpoint: NodeEndpoint { + address: *from, + udp_port: from.port() + } + }; + + match self.check_validity(&node) { + NodeValidity::Ourselves => (), // It makes no sense to respond to the discovery request from ourselves + NodeValidity::ValidNode(_) => self.respond_with_discovery(target, &node)?, + // Make sure the request source is actually there and responds to pings before actually responding + invalidity_reason => self.try_ping(node, PingReason::FromDiscoveryRequest(target, invalidity_reason)) + } + Ok(None) + } + + fn check_validity(&mut self, node: &NodeEntry) -> NodeValidity { + let id_hash = keccak(node.id); + let dist = match Discovery::distance(&self.id_hash, &id_hash) { + Some(dist) => dist, + None => { + debug!(target: "discovery", "Got an incoming discovery request from self: {:?}", node); + return NodeValidity::Ourselves; + } + }; + + let bucket = &self.node_buckets[dist]; + if let Some(known_node) = bucket.nodes.iter().find(|n| n.address.id == node.id) { + debug!(target: "discovery", "Found a known node in a bucket when processing discovery: {:?}/{:?}", known_node, node); + match ((known_node.address.endpoint == node.endpoint), (known_node.last_seen.elapsed() < NODE_LAST_SEEN_TIMEOUT)) { + (true, true) => NodeValidity::ValidNode(NodeCategory::Bucket), + (true, false) => NodeValidity::ExpiredNode(NodeCategory::Bucket), + _ => NodeValidity::UnknownNode + } + } else { + self.other_observed_nodes.get_mut(&node.id).map_or(NodeValidity::UnknownNode, |(endpoint, observed_at)| { + match ((node.endpoint==*endpoint), (observed_at.elapsed() < NODE_LAST_SEEN_TIMEOUT)) { + (true, true) => NodeValidity::ValidNode(NodeCategory::Observed), + (true, false) => NodeValidity::ExpiredNode(NodeCategory::Observed), + _ => NodeValidity::UnknownNode + } + }) + } + } + + fn respond_with_discovery(&mut self, target: NodeId, node: &NodeEntry) -> Result<(), Error> { let nearest = self.nearest_node_entries(&target); if nearest.is_empty() { - return Ok(None); + return Ok(()); } let mut packets = Discovery::prepare_neighbours_packets(&nearest); for p in packets.drain(..) { - self.send_packet(PACKET_NEIGHBOURS, from, &p)?; + self.send_packet(PACKET_NEIGHBOURS, &node.endpoint.address, &p)?; } - trace!(target: "discovery", "Sent {} Neighbours to {:?}", nearest.len(), &from); - Ok(None) + trace!(target: "discovery", "Sent {} Neighbours to {:?}", nearest.len(), &node.endpoint); + Ok(()) } fn prepare_neighbours_packets(nearest: &[NodeEntry]) -> Vec { @@ -674,7 +796,6 @@ impl<'a> Discovery<'a> { } } - pub fn round(&mut self) { self.check_expired(Instant::now()); self.update_new_nodes(); @@ -827,7 +948,7 @@ mod tests { } // After 4 discovery rounds, the first one should have learned about the rest. - for _round in 0 .. 4 { + for _round in 0 .. 5 { discovery_handlers[0].round(); let mut continue_loop = true; @@ -835,9 +956,9 @@ mod tests { continue_loop = false; // Process all queued messages. - for i in 0 .. 5 { - let src = discovery_handlers[i].public_endpoint.address.clone(); - while let Some(datagram) = discovery_handlers[i].dequeue_send() { + for i in 0 .. 20 { + let src = discovery_handlers[i%5].public_endpoint.address.clone(); + while let Some(datagram) = discovery_handlers[i%5].dequeue_send() { let dest = discovery_handlers.iter_mut() .find(|disc| datagram.address == disc.public_endpoint.address) .unwrap(); @@ -929,14 +1050,14 @@ mod tests { let mut discovery = Discovery { request_backoff: &request_backoff, ..discovery }; for _ in 0..2 { - discovery.ping(&node_entries[101]).unwrap(); + discovery.ping(&node_entries[101], PingReason::Default).unwrap(); let num_nodes = total_bucket_nodes(&discovery.node_buckets); discovery.check_expired(Instant::now() + PING_TIMEOUT); let removed = num_nodes - total_bucket_nodes(&discovery.node_buckets); assert_eq!(removed, 0); } - discovery.ping(&node_entries[101]).unwrap(); + discovery.ping(&node_entries[101], PingReason::Default).unwrap(); let num_nodes = total_bucket_nodes(&discovery.node_buckets); discovery.check_expired(Instant::now() + PING_TIMEOUT); let removed = num_nodes - total_bucket_nodes(&discovery.node_buckets); @@ -1123,7 +1244,7 @@ mod tests { let mut discovery1 = Discovery::new(&key1, ep1.clone(), IpFilter::default()); let mut discovery2 = Discovery::new(&key2, ep2.clone(), IpFilter::default()); - discovery1.ping(&NodeEntry { id: discovery2.id, endpoint: ep2.clone() }).unwrap(); + discovery1.ping(&NodeEntry { id: discovery2.id, endpoint: ep2.clone() }, PingReason::Default).unwrap(); let ping_data = discovery1.dequeue_send().unwrap(); assert!(!discovery1.any_sends_queued()); let data = &ping_data.payload[(32 + 65)..]; diff --git a/util/network-devp2p/src/handshake.rs b/util/network-devp2p/src/handshake.rs index aac43865c68..5388318a771 100644 --- a/util/network-devp2p/src/handshake.rs +++ b/util/network-devp2p/src/handshake.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::time::Duration; use rand::random; diff --git a/util/network-devp2p/src/host.rs b/util/network-devp2p/src/host.rs index 8df7a89a36f..f067260ceb8 100644 --- a/util/network-devp2p/src/host.rs +++ b/util/network-devp2p/src/host.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::net::{SocketAddr, SocketAddrV4, Ipv4Addr}; use std::collections::{HashMap, HashSet}; @@ -42,10 +42,12 @@ use network::{NetworkConfiguration, NetworkIoMessage, ProtocolId, PeerId, Packet use network::{NonReservedPeerMode, NetworkContext as NetworkContextTrait}; use network::{SessionInfo, Error, ErrorKind, DisconnectReason, NetworkProtocolHandler}; use discovery::{Discovery, TableUpdates, NodeEntry, MAX_DATAGRAM_SIZE}; +use network::client_version::ClientVersion; use ip_utils::{map_external_address, select_public_address}; use parity_path::restrict_permissions_owner; use parking_lot::{Mutex, RwLock}; use network::{ConnectionFilter, ConnectionDirection}; +use connection::PAYLOAD_SOFT_LIMIT; type Slab = ::slab::Slab; @@ -179,8 +181,8 @@ impl<'s> NetworkContextTrait for NetworkContext<'s> { Ok(()) } - fn peer_client_version(&self, peer: PeerId) -> String { - self.resolve_session(peer).map_or("unknown".to_owned(), |s| s.lock().info.client_version.clone()) + fn peer_client_version(&self, peer: PeerId) -> ClientVersion { + self.resolve_session(peer).map_or(ClientVersion::from("unknown").to_owned(), |s| s.lock().info.client_version.clone()) } fn session_info(&self, peer: PeerId) -> Option { @@ -200,6 +202,10 @@ impl<'s> NetworkContextTrait for NetworkContext<'s> { .map(|node| self.reserved_peers.contains(&node)) .unwrap_or(false) } + + fn payload_soft_limit(&self) -> usize { + PAYLOAD_SOFT_LIMIT + } } /// Shared host information diff --git a/util/network-devp2p/src/ip_utils.rs b/util/network-devp2p/src/ip_utils.rs index cde0c8c6bb0..4b8473ceca8 100644 --- a/util/network-devp2p/src/ip_utils.rs +++ b/util/network-devp2p/src/ip_utils.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . // Based on original work by David Levy https://raw.githubusercontent.com/dlevy47/rust-interfaces @@ -40,7 +40,7 @@ pub trait SocketAddrExt { fn is_documentation_s(&self) -> bool { false } fn is_global_multicast(&self) -> bool { false } fn is_other_multicast(&self) -> bool { false } - + fn is_reserved(&self) -> bool; fn is_usable_public(&self) -> bool; fn is_usable_private(&self) -> bool; @@ -50,38 +50,38 @@ pub trait SocketAddrExt { impl SocketAddrExt for Ipv4Addr { fn is_global_s(&self) -> bool { - !self.is_private() && - !self.is_loopback() && + !self.is_private() && + !self.is_loopback() && !self.is_link_local() && - !self.is_broadcast() && + !self.is_broadcast() && !self.is_documentation() } - // Used for communications between a service provider and its subscribers when using a carrier-grade NAT + // Used for communications between a service provider and its subscribers when using a carrier-grade NAT // see: https://en.wikipedia.org/wiki/Reserved_IP_addresses fn is_shared_space(&self) -> bool { - *self >= Ipv4Addr::new(100, 64, 0, 0) && + *self >= Ipv4Addr::new(100, 64, 0, 0) && *self <= Ipv4Addr::new(100, 127, 255, 255) } // Used for the IANA IPv4 Special Purpose Address Registry // see: https://en.wikipedia.org/wiki/Reserved_IP_addresses fn is_special_purpose(&self) -> bool { - *self >= Ipv4Addr::new(192, 0, 0, 0) && + *self >= Ipv4Addr::new(192, 0, 0, 0) && *self <= Ipv4Addr::new(192, 0, 0, 255) } // Used for testing of inter-network communications between two separate subnets // see: https://en.wikipedia.org/wiki/Reserved_IP_addresses fn is_benchmarking(&self) -> bool { - *self >= Ipv4Addr::new(198, 18, 0, 0) && + *self >= Ipv4Addr::new(198, 18, 0, 0) && *self <= Ipv4Addr::new(198, 19, 255, 255) } // Reserved for future use // see: https://en.wikipedia.org/wiki/Reserved_IP_addresses fn is_future_use(&self) -> bool { - *self >= Ipv4Addr::new(240, 0, 0, 0) && + *self >= Ipv4Addr::new(240, 0, 0, 0) && *self <= Ipv4Addr::new(255, 255, 255, 254) } @@ -102,7 +102,7 @@ impl SocketAddrExt for Ipv4Addr { !self.is_reserved() && !self.is_private() } - + fn is_usable_private(&self) -> bool { self.is_private() } @@ -118,7 +118,7 @@ impl SocketAddrExt for Ipv4Addr { impl SocketAddrExt for Ipv6Addr { fn is_global_s(&self) -> bool { self.is_global_multicast() || - (!self.is_loopback() && + (!self.is_loopback() && !self.is_unique_local_s() && !self.is_unicast_link_local_s() && !self.is_documentation_s() && @@ -134,7 +134,7 @@ impl SocketAddrExt for Ipv6Addr { fn is_unicast_link_local_s(&self) -> bool { (self.segments()[0] & 0xffc0) == 0xfe80 } - + // reserved for documentation (2001:db8::/32). fn is_documentation_s(&self) -> bool { (self.segments()[0] == 0x2001) && (self.segments()[1] == 0xdb8) @@ -160,7 +160,7 @@ impl SocketAddrExt for Ipv6Addr { !self.is_reserved() && !self.is_unique_local_s() } - + fn is_usable_private(&self) -> bool { self.is_unique_local_s() } @@ -194,7 +194,7 @@ impl SocketAddrExt for IpAddr { IpAddr::V6(ref ip) => ip.is_usable_public(), } } - + fn is_usable_private(&self) -> bool { match *self { IpAddr::V4(ref ip) => ip.is_usable_private(), @@ -308,33 +308,41 @@ pub fn select_public_address(port: u16) -> SocketAddr { pub fn map_external_address(local: &NodeEndpoint) -> Option { if let SocketAddr::V4(ref local_addr) = local.address { - match search_gateway_from_timeout(*local_addr.ip(), Duration::new(5, 0)) { - Err(ref err) => debug!("Gateway search error: {}", err), - Ok(gateway) => { - match gateway.get_external_ip() { - Err(ref err) => { - debug!("IP request error: {}", err); - }, - Ok(external_addr) => { - match gateway.add_any_port(PortMappingProtocol::TCP, SocketAddrV4::new(*local_addr.ip(), local_addr.port()), 0, "Parity Node/TCP") { - Err(ref err) => { - debug!("Port mapping error: {}", err); - }, - Ok(tcp_port) => { - match gateway.add_any_port(PortMappingProtocol::UDP, SocketAddrV4::new(*local_addr.ip(), local.udp_port), 0, "Parity Node/UDP") { - Err(ref err) => { - debug!("Port mapping error: {}", err); - }, - Ok(udp_port) => { - return Some(NodeEndpoint { address: SocketAddr::V4(SocketAddrV4::new(external_addr, tcp_port)), udp_port }); - }, - } - }, - } - }, - } - }, - } + let local_ip = *local_addr.ip(); + let local_port = local_addr.port(); + let local_udp_port = local.udp_port; + + let search_gateway_child = ::std::thread::spawn(move || { + match search_gateway_from_timeout(local_ip, Duration::new(5, 0)) { + Err(ref err) => debug!("Gateway search error: {}", err), + Ok(gateway) => { + match gateway.get_external_ip() { + Err(ref err) => { + debug!("IP request error: {}", err); + }, + Ok(external_addr) => { + match gateway.add_any_port(PortMappingProtocol::TCP, SocketAddrV4::new(local_ip, local_port), 0, "Parity Node/TCP") { + Err(ref err) => { + debug!("Port mapping error: {}", err); + }, + Ok(tcp_port) => { + match gateway.add_any_port(PortMappingProtocol::UDP, SocketAddrV4::new(local_ip, local_udp_port), 0, "Parity Node/UDP") { + Err(ref err) => { + debug!("Port mapping error: {}", err); + }, + Ok(udp_port) => { + return Some(NodeEndpoint { address: SocketAddr::V4(SocketAddrV4::new(external_addr, tcp_port)), udp_port }); + }, + } + }, + } + }, + } + }, + } + None + }); + return search_gateway_child.join().ok()?; } None } @@ -425,32 +433,32 @@ fn ipv4_future_use() { fn ipv4_usable_public() { assert!(!Ipv4Addr::new(0,0,0,0).is_usable_public()); // unspecified assert!(Ipv4Addr::new(0,0,0,1).is_usable_public()); - + assert!(Ipv4Addr::new(9,255,255,255).is_usable_public()); assert!(!Ipv4Addr::new(10,0,0,0).is_usable_public()); // private intra-network assert!(!Ipv4Addr::new(10,255,255,255).is_usable_public()); // private intra-network assert!(Ipv4Addr::new(11,0,0,0).is_usable_public()); - + assert!(Ipv4Addr::new(100, 63, 255, 255).is_usable_public()); - assert!(!Ipv4Addr::new(100, 64, 0, 0).is_usable_public()); // shared space + assert!(!Ipv4Addr::new(100, 64, 0, 0).is_usable_public()); // shared space assert!(!Ipv4Addr::new(100, 127, 255, 255).is_usable_public()); // shared space assert!(Ipv4Addr::new(100, 128, 0, 0).is_usable_public()); - + assert!(Ipv4Addr::new(126,255,255,255).is_usable_public()); assert!(!Ipv4Addr::new(127,0,0,0).is_usable_public()); // loopback assert!(!Ipv4Addr::new(127,255,255,255).is_usable_public()); // loopback assert!(Ipv4Addr::new(128,0,0,0).is_usable_public()); - + assert!(Ipv4Addr::new(169,253,255,255).is_usable_public()); assert!(!Ipv4Addr::new(169,254,0,0).is_usable_public()); // link-local assert!(!Ipv4Addr::new(169,254,255,255).is_usable_public()); // link-local assert!(Ipv4Addr::new(169,255,0,0).is_usable_public()); - + assert!(Ipv4Addr::new(172,15,255,255).is_usable_public()); assert!(!Ipv4Addr::new(172,16,0,0).is_usable_public()); // private intra-network assert!(!Ipv4Addr::new(172,31,255,255).is_usable_public()); // private intra-network assert!(Ipv4Addr::new(172,32,255,255).is_usable_public()); - + assert!(Ipv4Addr::new(191,255,255,255).is_usable_public()); assert!(!Ipv4Addr::new(192,0,0,0).is_usable_public()); // special purpose assert!(!Ipv4Addr::new(192,0,0,255).is_usable_public()); // special purpose @@ -458,19 +466,19 @@ fn ipv4_usable_public() { assert!(Ipv4Addr::new(192,0,1,255).is_usable_public()); assert!(!Ipv4Addr::new(192,0,2,0).is_usable_public()); // documentation - assert!(!Ipv4Addr::new(192,0,2,255).is_usable_public()); // documentation + assert!(!Ipv4Addr::new(192,0,2,255).is_usable_public()); // documentation assert!(Ipv4Addr::new(192,0,3,0).is_usable_public()); - + assert!(Ipv4Addr::new(192,167,255,255).is_usable_public()); assert!(!Ipv4Addr::new(192,168,0,0).is_usable_public()); // private intra-network assert!(!Ipv4Addr::new(192,168,255,255).is_usable_public()); // private intra-network assert!(Ipv4Addr::new(192,169,0,0).is_usable_public()); - + assert!(Ipv4Addr::new(198,17,255,255).is_usable_public()); assert!(!Ipv4Addr::new(198,18,0,0).is_usable_public()); // benchmarking assert!(!Ipv4Addr::new(198,19,255,255).is_usable_public()); // benchmarking assert!(Ipv4Addr::new(198,20,0,0).is_usable_public()); - + assert!(Ipv4Addr::new(198,51,99,255).is_usable_public()); assert!(!Ipv4Addr::new(198,51,100,0).is_usable_public()); // documentation assert!(!Ipv4Addr::new(198,51,100,255).is_usable_public()); // documentation @@ -485,7 +493,7 @@ fn ipv4_usable_public() { assert!(!Ipv4Addr::new(224,0,0,0).is_usable_public()); // multicast assert!(!Ipv4Addr::new(239, 255, 255, 255).is_usable_public()); // multicast assert!(!Ipv4Addr::new(240, 0, 0, 0).is_usable_public()); // future use - assert!(!Ipv4Addr::new(255, 255, 255, 254).is_usable_public()); // future use + assert!(!Ipv4Addr::new(255, 255, 255, 254).is_usable_public()); // future use assert!(!Ipv4Addr::new(255, 255, 255, 255).is_usable_public()); // limited broadcast } @@ -495,12 +503,12 @@ fn ipv4_usable_private() { assert!(Ipv4Addr::new(10,0,0,0).is_usable_private()); // private intra-network assert!(Ipv4Addr::new(10,255,255,255).is_usable_private()); // private intra-network assert!(!Ipv4Addr::new(11,0,0,0).is_usable_private()); - + assert!(!Ipv4Addr::new(172,15,255,255).is_usable_private()); assert!(Ipv4Addr::new(172,16,0,0).is_usable_private()); // private intra-network assert!(Ipv4Addr::new(172,31,255,255).is_usable_private()); // private intra-network assert!(!Ipv4Addr::new(172,32,255,255).is_usable_private()); - + assert!(!Ipv4Addr::new(192,167,255,255).is_usable_private()); assert!(Ipv4Addr::new(192,168,0,0).is_usable_private()); // private intra-network assert!(Ipv4Addr::new(192,168,255,255).is_usable_private()); // private intra-network diff --git a/util/network-devp2p/src/lib.rs b/util/network-devp2p/src/lib.rs index 68d70552d41..6082049e890 100644 --- a/util/network-devp2p/src/lib.rs +++ b/util/network-devp2p/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Network and general IO module. //! @@ -78,13 +78,13 @@ extern crate ethkey; extern crate rlp; extern crate bytes; extern crate parity_path; -extern crate ethcore_logger; extern crate ethcore_network as network; extern crate ipnetwork; extern crate keccak_hash as hash; extern crate serde; extern crate serde_json; extern crate parity_snappy as snappy; +extern crate lru_cache; #[macro_use] extern crate error_chain; @@ -93,6 +93,8 @@ extern crate log; #[macro_use] extern crate serde_derive; +#[cfg(test)] +extern crate env_logger; #[cfg(test)] extern crate tempdir; #[cfg(test)] #[macro_use] diff --git a/util/network-devp2p/src/node_table.rs b/util/network-devp2p/src/node_table.rs index d689676daf9..3cee93fd9a5 100644 --- a/util/network-devp2p/src/node_table.rs +++ b/util/network-devp2p/src/node_table.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use discovery::{TableUpdates, NodeEntry}; use ethereum_types::H512; diff --git a/util/network-devp2p/src/service.rs b/util/network-devp2p/src/service.rs index fc8f79b365e..dfacec4be3d 100644 --- a/util/network-devp2p/src/service.rs +++ b/util/network-devp2p/src/service.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use network::{Error, NetworkConfiguration, NetworkProtocolHandler, NonReservedPeerMode}; use network::{NetworkContext, PeerId, ProtocolId, NetworkIoMessage}; @@ -20,7 +20,7 @@ use host::Host; use io::*; use parking_lot::RwLock; use std::net::SocketAddr; -use std::ops::Range; +use std::ops::RangeInclusive; use std::sync::Arc; use ansi_term::Colour; use network::ConnectionFilter; @@ -95,12 +95,8 @@ impl NetworkService { } /// Returns the number of peers allowed. - /// - /// Keep in mind that `range.end` is *exclusive*. - pub fn num_peers_range(&self) -> Range { - let start = self.config.min_peers; - let end = self.config.max_peers + 1; - start .. end + pub fn num_peers_range(&self) -> RangeInclusive { + self.config.min_peers..=self.config.max_peers } /// Returns external url if available. diff --git a/util/network-devp2p/src/session.rs b/util/network-devp2p/src/session.rs index 1b659bc8ea2..6cecaf36104 100644 --- a/util/network-devp2p/src/session.rs +++ b/util/network-devp2p/src/session.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use std::{str, io}; use std::net::SocketAddr; @@ -29,6 +29,7 @@ use handshake::Handshake; use io::{IoContext, StreamToken}; use network::{Error, ErrorKind, DisconnectReason, SessionInfo, ProtocolId, PeerCapabilityInfo}; use network::SessionCapabilityInfo; +use network::client_version::ClientVersion; use host::*; use node_table::NodeId; use snappy; @@ -112,7 +113,7 @@ impl Session { had_hello: false, info: SessionInfo { id: id.cloned(), - client_version: String::new(), + client_version: ClientVersion::from(""), protocol_version: 0, capabilities: Vec::new(), peer_capabilities: Vec::new(), @@ -419,7 +420,8 @@ impl Session { fn read_hello(&mut self, io: &IoContext, rlp: &Rlp, host: &HostInfo) -> Result<(), Error> where Message: Send + Sync + Clone { let protocol = rlp.val_at::(0)?; - let client_version = rlp.val_at::(1)?; + let client_version_string = rlp.val_at::(1)?; + let client_version = ClientVersion::from(client_version_string); let peer_caps: Vec = rlp.list_at(2)?; let id = rlp.val_at::(4)?; diff --git a/util/network-devp2p/tests/tests.rs b/util/network-devp2p/tests/tests.rs index 091f2509ac7..00f811e4637 100644 --- a/util/network-devp2p/tests/tests.rs +++ b/util/network-devp2p/tests/tests.rs @@ -1,26 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . -extern crate parking_lot; -extern crate parity_bytes; +extern crate env_logger; extern crate ethcore_io as io; -extern crate ethcore_logger; extern crate ethcore_network; extern crate ethcore_network_devp2p; extern crate ethkey; +extern crate parity_bytes; +extern crate parking_lot; use std::sync::atomic::{AtomicBool, Ordering as AtomicOrdering}; use std::sync::Arc; @@ -80,7 +80,7 @@ impl NetworkProtocolHandler for TestProtocol { } fn connected(&self, io: &NetworkContext, peer: &PeerId) { - assert!(io.peer_client_version(*peer).contains("Parity")); + assert!(io.peer_client_version(*peer).to_string().contains("Parity")); if self.drop_session { io.disconnect_peer(*peer) } else { diff --git a/util/network/Cargo.toml b/util/network/Cargo.toml index ef2e11d1244..b7077f7aea6 100644 --- a/util/network/Cargo.toml +++ b/util/network/Cargo.toml @@ -8,14 +8,18 @@ authors = ["Parity Technologies "] [dependencies] error-chain = { version = "0.12", default-features = false } -parity-crypto = "0.2" +parity-crypto = "0.3.0" ethcore-io = { path = "../io" } ethereum-types = "0.4" -ethkey = { path = "../../ethkey" } +ethkey = { path = "../../accounts/ethkey" } ipnetwork = "0.12.6" +lazy_static = "1.0" rlp = { version = "0.3.0", features = ["ethereum"] } libc = "0.2" parity-snappy = "0.1" +semver = {version="0.9.0", features=["serde"]} +serde = "1.0" +serde_derive = "1.0" [dev-dependencies] assert_matches = "1.2" diff --git a/util/network/src/client_version.rs b/util/network/src/client_version.rs new file mode 100644 index 00000000000..47d81fad867 --- /dev/null +++ b/util/network/src/client_version.rs @@ -0,0 +1,515 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Ethereum is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Ethereum. If not, see . + +#![warn(missing_docs)] + +//! Parse ethereum client ID strings and provide querying functionality + +use semver::Version; +use std::fmt; + +/// Parity client string prefix +const LEGACY_CLIENT_ID_PREFIX: &str = "Parity"; +const PARITY_CLIENT_ID_PREFIX: &str = "Parity-Ethereum"; + +lazy_static! { +/// Parity versions starting from this will accept block bodies requests +/// of 256 bodies + static ref PARITY_CLIENT_LARGE_REQUESTS_VERSION: Version = Version::parse("2.4.0").unwrap(); +} + +/// Description of the software version running in a peer +/// according to https://github.com/ethereum/wiki/wiki/Client-Version-Strings +/// This structure as it is represents the format used by Parity clients. Other +/// vendors may provide additional fields. +#[derive(Clone,Debug,PartialEq,Eq,Serialize)] +pub struct ParityClientData { + name: String, + identity: Option, + semver: Version, + os: String, + compiler: String, + + // Capability flags, should be calculated in constructor + can_handle_large_requests: bool, +} + +/// Accessor methods for ParityClientData. This will probably +/// need to be abstracted away into a trait. +impl ParityClientData { + fn new( + name: String, + identity: Option, + semver: Version, + os: String, + compiler: String, + ) -> Self { + // Flags logic + let can_handle_large_requests = &semver >= &PARITY_CLIENT_LARGE_REQUESTS_VERSION; + + // Instantiate and return + ParityClientData { + name: name, + identity: identity, + semver: semver, + os: os, + compiler: compiler, + + can_handle_large_requests: can_handle_large_requests, + } + } + + fn name(&self) -> &str { + self.name.as_str() + } + + fn identity(&self) -> Option<&str> { + self.identity.as_ref().map(String::as_str) + } + + fn semver(&self) -> &Version { + &self.semver + } + + fn os(&self) -> &str { + self.os.as_str() + } + + fn compiler(&self) -> &str { + self.compiler.as_str() + } + + fn can_handle_large_requests(&self) -> bool { + self.can_handle_large_requests + } +} + +/// Enum describing the version of the software running on a peer. +#[derive(Clone,Debug,Eq,PartialEq,Serialize)] +pub enum ClientVersion { + /// The peer runs software from parity and the string format is known + ParityClient( + /// The actual information fields: name, version, os, ... + ParityClientData + ), + /// The string ID is recognized as Parity but the overall format + /// could not be parsed + ParityUnknownFormat(String), + /// Other software vendors than Parity + Other(String), +} + +impl Default for ClientVersion { + fn default() -> Self { + ClientVersion::Other("".to_owned()) + } +} + +/// Provide information about what a particular version of a +/// peer software can do +pub trait ClientCapabilities { + /// Parity versions before PARITY_CLIENT_LARGE_REQUESTS_VERSION would not + /// check the accumulated size of a packet when building a response to a + /// GET_BLOCK_BODIES request. If the packet was larger than a given limit, + /// instead of sending fewer blocks no packet would get sent at all. Query + /// if this version can handle requests for a large number of block bodies. + fn can_handle_large_requests(&self) -> bool; + + /// Service transactions are specific to parity. Query if this version + /// accepts them. + fn accepts_service_transaction(&self) -> bool; +} + +impl ClientCapabilities for ClientVersion { + fn can_handle_large_requests(&self) -> bool { + match self { + ClientVersion::ParityClient(data) => data.can_handle_large_requests(), + ClientVersion::ParityUnknownFormat(_) => false, // Play it safe + ClientVersion::Other(_) => true // As far as we know + } + } + + fn accepts_service_transaction(&self) -> bool { + match self { + ClientVersion::ParityClient(_) => true, + ClientVersion::ParityUnknownFormat(_) => true, + ClientVersion::Other(_) => false + } + } + +} + +fn is_parity(client_id: &str) -> bool { + client_id.starts_with(LEGACY_CLIENT_ID_PREFIX) || client_id.starts_with(PARITY_CLIENT_ID_PREFIX) +} + +/// Parse known parity formats. Recognizes either a short format with four fields +/// or a long format which includes the same fields and an identity one. +fn parse_parity_format(client_version: &str) -> Result { + const PARITY_ID_STRING_MINIMUM_TOKENS: usize = 4; + + let tokens: Vec<&str> = client_version.split("/").collect(); + + if tokens.len() < PARITY_ID_STRING_MINIMUM_TOKENS { + return Err(()) + } + + let name = tokens[0]; + + let identity = if tokens.len() - 3 > 1 { + Some(tokens[1..(tokens.len() - 3)].join("/")) + } else { + None + }; + + let compiler = tokens[tokens.len() - 1]; + let os = tokens[tokens.len() - 2]; + + // If version is in the right position and valid format return a valid + // result. Otherwise return an error. + get_number_from_version(tokens[tokens.len() - 3]) + .and_then(|v| Version::parse(v).ok()) + .map(|semver| ParityClientData::new( + name.to_owned(), + identity, + semver, + os.to_owned(), + compiler.to_owned(), + )) + .ok_or(()) +} + +/// Parse a version string and return the corresponding +/// ClientVersion. Only Parity clients are destructured right now, other +/// strings will just get wrapped in a variant so that the information is +/// not lost. +/// The parsing for parity may still fail, in which case return a ParityUnknownFormat with +/// the original version string. TryFrom would be a better trait to implement. +impl From for ClientVersion +where T: AsRef { + fn from(client_version: T) -> Self { + let client_version_str: &str = client_version.as_ref(); + + if !is_parity(client_version_str) { + return ClientVersion::Other(client_version_str.to_owned()); + } + + if let Ok(data) = parse_parity_format(client_version_str) { + ClientVersion::ParityClient(data) + } else { + ClientVersion::ParityUnknownFormat(client_version_str.to_owned()) + } + } +} + +fn format_parity_version_string(client_version: &ParityClientData, f: &mut fmt::Formatter) -> std::fmt::Result { + let name = client_version.name(); + let semver = client_version.semver(); + let os = client_version.os(); + let compiler = client_version.compiler(); + + match client_version.identity() { + None => write!(f, "{}/v{}/{}/{}", name, semver, os, compiler), + Some(identity) => write!(f, "{}/{}/v{}/{}/{}", name, identity, semver, os, compiler), + } +} + +impl fmt::Display for ClientVersion { + fn fmt(&self, f: &mut fmt::Formatter) -> std::fmt::Result { + match self { + ClientVersion::ParityClient(data) => format_parity_version_string(data, f), + ClientVersion::ParityUnknownFormat(id) => write!(f, "{}", id), + ClientVersion::Other(id) => write!(f, "{}", id) + } + } +} + +fn get_number_from_version(version: &str) -> Option<&str> { + if version.starts_with("v") { + return version.get(1..); + } + + None +} + +#[cfg(test)] +pub mod tests { + use super::*; + + const PARITY_CLIENT_SEMVER: &str = "2.4.0"; + const PARITY_CLIENT_OLD_SEMVER: &str = "2.2.0"; + const PARITY_CLIENT_OS: &str = "linux"; + const PARITY_CLIENT_COMPILER: &str = "rustc"; + const PARITY_CLIENT_IDENTITY: &str = "ExpanseSOLO"; + const PARITY_CLIENT_MULTITOKEN_IDENTITY: &str = "ExpanseSOLO/abc/v1.2.3"; + + + fn make_default_version_string() -> String { + format!( + "{}/v{}/{}/{}", + PARITY_CLIENT_ID_PREFIX, + PARITY_CLIENT_SEMVER, + PARITY_CLIENT_OS, + PARITY_CLIENT_COMPILER + ) + } + + fn make_default_long_version_string() -> String { + format!( + "{}/{}/v{}/{}/{}", + PARITY_CLIENT_ID_PREFIX, + PARITY_CLIENT_IDENTITY, + PARITY_CLIENT_SEMVER, + PARITY_CLIENT_OS, + PARITY_CLIENT_COMPILER + ) + } + + fn make_multitoken_identity_long_version_string() -> String { + format!( + "{}/{}/v{}/{}/{}", + PARITY_CLIENT_ID_PREFIX, + PARITY_CLIENT_MULTITOKEN_IDENTITY, + PARITY_CLIENT_SEMVER, + PARITY_CLIENT_OS, + PARITY_CLIENT_COMPILER + ) + } + + fn make_old_semver_version_string() -> String { + format!( + "{}/v{}/{}/{}", + PARITY_CLIENT_ID_PREFIX, + PARITY_CLIENT_OLD_SEMVER, + PARITY_CLIENT_OS, + PARITY_CLIENT_COMPILER + ) + } + + #[test] + pub fn client_version_when_from_empty_string_then_default() { + let default = ClientVersion::default(); + + assert_eq!(ClientVersion::from(""), default); + } + + #[test] + pub fn get_number_from_version_when_valid_then_number() { + let version_string = format!("v{}", PARITY_CLIENT_SEMVER); + + assert_eq!(get_number_from_version(&version_string).unwrap(), PARITY_CLIENT_SEMVER); + } + + #[test] + pub fn client_version_when_str_parity_format_and_valid_then_all_fields_match() { + let client_version_string = make_default_version_string(); + + if let ClientVersion::ParityClient(client_version) = ClientVersion::from(client_version_string.as_str()) { + assert_eq!(client_version.name(), PARITY_CLIENT_ID_PREFIX); + assert_eq!(*client_version.semver(), Version::parse(PARITY_CLIENT_SEMVER).unwrap()); + assert_eq!(client_version.os(), PARITY_CLIENT_OS); + assert_eq!(client_version.compiler(), PARITY_CLIENT_COMPILER); + } else { + panic!("shouldn't be here"); + } + } + + #[test] + pub fn client_version_when_str_parity_long_format_and_valid_then_all_fields_match() { + let client_version_string = make_default_long_version_string(); + + if let ClientVersion::ParityClient(client_version) = ClientVersion::from(client_version_string.as_str()) { + assert_eq!(client_version.name(), PARITY_CLIENT_ID_PREFIX); + assert_eq!(client_version.identity().unwrap(), PARITY_CLIENT_IDENTITY); + assert_eq!(*client_version.semver(), Version::parse(PARITY_CLIENT_SEMVER).unwrap()); + assert_eq!(client_version.os(), PARITY_CLIENT_OS); + assert_eq!(client_version.compiler(), PARITY_CLIENT_COMPILER); + } else { + panic!("shouldnt be here"); + } + } + + #[test] + pub fn client_version_when_str_parity_long_format_and_valid_and_identity_multiple_tokens_then_all_fields_match() { + let client_version_string = make_multitoken_identity_long_version_string(); + + if let ClientVersion::ParityClient(client_version) = ClientVersion::from(client_version_string.as_str()) { + assert_eq!(client_version.name(), PARITY_CLIENT_ID_PREFIX); + assert_eq!(client_version.identity().unwrap(), PARITY_CLIENT_MULTITOKEN_IDENTITY); + assert_eq!(*client_version.semver(), Version::parse(PARITY_CLIENT_SEMVER).unwrap()); + assert_eq!(client_version.os(), PARITY_CLIENT_OS); + assert_eq!(client_version.compiler(), PARITY_CLIENT_COMPILER); + } else { + panic!("shouldnt be here"); + } + } + + #[test] + pub fn client_version_when_string_parity_format_and_valid_then_all_fields_match() { + let client_version_string: String = make_default_version_string(); + + if let ClientVersion::ParityClient(client_version) = ClientVersion::from(client_version_string.as_str()) { + assert_eq!(client_version.name(), PARITY_CLIENT_ID_PREFIX); + assert_eq!(*client_version.semver(), Version::parse(PARITY_CLIENT_SEMVER).unwrap()); + assert_eq!(client_version.os(), PARITY_CLIENT_OS); + assert_eq!(client_version.compiler(), PARITY_CLIENT_COMPILER); + } else { + panic!("shouldn't be here"); + } + } + + #[test] + pub fn client_version_when_parity_format_and_invalid_then_equals_parity_unknown_client_version_string() { + // This is invalid because version has no leading 'v' + let client_version_string = format!( + "{}/{}/{}/{}", + PARITY_CLIENT_ID_PREFIX, + PARITY_CLIENT_SEMVER, + PARITY_CLIENT_OS, + PARITY_CLIENT_COMPILER); + + let client_version = ClientVersion::from(client_version_string.as_str()); + + let parity_unknown = ClientVersion::ParityUnknownFormat(client_version_string.to_string()); + + assert_eq!(client_version, parity_unknown); + } + + #[test] + pub fn client_version_when_parity_format_without_identity_and_missing_compiler_field_then_equals_parity_unknown_client_version_string() { + let client_version_string = format!( + "{}/v{}/{}", + PARITY_CLIENT_ID_PREFIX, + PARITY_CLIENT_SEMVER, + PARITY_CLIENT_OS, + ); + + let client_version = ClientVersion::from(client_version_string.as_str()); + + let parity_unknown = ClientVersion::ParityUnknownFormat(client_version_string.to_string()); + + assert_eq!(client_version, parity_unknown); + } + + #[test] + pub fn client_version_when_parity_format_with_identity_and_missing_compiler_field_then_equals_parity_unknown_client_version_string() { + let client_version_string = format!( + "{}/{}/v{}/{}", + PARITY_CLIENT_ID_PREFIX, + PARITY_CLIENT_IDENTITY, + PARITY_CLIENT_SEMVER, + PARITY_CLIENT_OS, + ); + + let client_version = ClientVersion::from(client_version_string.as_str()); + + let parity_unknown = ClientVersion::ParityUnknownFormat(client_version_string.to_string()); + + assert_eq!(client_version, parity_unknown); + } + + #[test] + pub fn client_version_when_not_parity_format_and_valid_then_other_with_client_version_string() { + let client_version_string = "Geth/main.jnode.network/v1.8.21-stable-9dc5d1a9/linux"; + + let client_version = ClientVersion::from(client_version_string); + + assert_eq!(client_version, ClientVersion::Other(client_version_string.to_string())); + } + + #[test] + pub fn client_version_when_parity_format_and_valid_then_to_string_equal() { + let client_version_string: String = make_default_version_string(); + + let client_version = ClientVersion::from(client_version_string.as_str()); + + assert_eq!(client_version.to_string(), client_version_string); + } + + #[test] + pub fn client_version_when_other_then_to_string_equal_input_string() { + let client_version_string: String = "Other".to_string(); + + let client_version = ClientVersion::from("Other"); + + assert_eq!(client_version.to_string(), client_version_string); + } + + #[test] + pub fn client_capabilities_when_parity_old_version_then_handles_large_requests_false() { + let client_version_string: String = make_old_semver_version_string(); + + let client_version = ClientVersion::from(client_version_string.as_str()); + + assert!(!client_version.can_handle_large_requests()); + } + + #[test] + pub fn client_capabilities_when_parity_beta_version_then_not_handles_large_requests_true() { + let client_version_string: String = format!( + "{}/v{}/{}/{}", + "Parity-Ethereum", + "2.4.0-beta", + "x86_64-linux-gnu", + "rustc1.31.1") + .to_string(); + + let client_version = ClientVersion::from(client_version_string.as_str()); + + assert!(!client_version.can_handle_large_requests()); + } + + #[test] + pub fn client_version_when_to_owned_then_both_objects_equal() { + let client_version_string: String = make_old_semver_version_string(); + + let origin = ClientVersion::from(client_version_string.as_str()); + + let borrowed = &origin; + + let owned = origin.to_owned(); + + assert_eq!(*borrowed, owned); + } + + #[test] + fn client_version_accepts_service_transaction_for_different_versions() { + assert!(!ClientVersion::from("Geth").accepts_service_transaction()); + assert!(ClientVersion::from("Parity-Ethereum/v2.6.0/linux/rustc").accepts_service_transaction()); + assert!(ClientVersion::from("Parity-Ethereum/ABCDEFGH/v2.7.3/linux/rustc").accepts_service_transaction()); + } + + #[test] + fn is_parity_when_parity_then_true() { + let client_id = format!("{}/", PARITY_CLIENT_ID_PREFIX); + + assert!(is_parity(&client_id)); + } + + #[test] + fn is_parity_when_empty_then_false() { + let client_id = ""; + + assert!(!is_parity(&client_id)); + } + + #[test] + fn is_parity_when_other_then_false() { + let client_id = "other"; + + assert!(!is_parity(&client_id)); + } +} diff --git a/util/network/src/connection_filter.rs b/util/network/src/connection_filter.rs index e146aee4c7c..4efd1c503c5 100644 --- a/util/network/src/connection_filter.rs +++ b/util/network/src/connection_filter.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Connection filter trait. diff --git a/util/network/src/error.rs b/util/network/src/error.rs index e7b0d6eda4b..bd48830c1bb 100644 --- a/util/network/src/error.rs +++ b/util/network/src/error.rs @@ -1,18 +1,22 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . + +// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` +// https://github.com/paritytech/parity-ethereum/issues/10302 +#![allow(deprecated)] use std::{io, net, fmt}; use libc::{ENFILE, EMFILE}; diff --git a/util/network/src/lib.rs b/util/network/src/lib.rs index 395075e9ff1..9e6f71fdd16 100644 --- a/util/network/src/lib.rs +++ b/util/network/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . #![recursion_limit="128"] @@ -24,6 +24,11 @@ extern crate rlp; extern crate ipnetwork; extern crate parity_snappy as snappy; extern crate libc; +extern crate semver; +extern crate serde; + +#[macro_use] +extern crate serde_derive; #[cfg(test)] #[macro_use] extern crate assert_matches; @@ -31,6 +36,11 @@ extern crate assert_matches; #[macro_use] extern crate error_chain; +#[macro_use] +extern crate lazy_static; + +pub mod client_version; + mod connection_filter; mod error; @@ -38,6 +48,7 @@ pub use connection_filter::{ConnectionFilter, ConnectionDirection}; pub use io::TimerToken; pub use error::{Error, ErrorKind, DisconnectReason}; +use client_version::ClientVersion; use std::cmp::Ordering; use std::collections::HashMap; use std::net::{SocketAddr, SocketAddrV4, Ipv4Addr}; @@ -97,7 +108,7 @@ pub struct SessionInfo { /// Peer public key pub id: Option, /// Peer client ID - pub client_version: String, + pub client_version: ClientVersion, /// Peer RLPx protocol version pub protocol_version: u32, /// Session protocol capabilities @@ -275,7 +286,7 @@ pub trait NetworkContext { fn register_timer(&self, token: TimerToken, delay: Duration) -> Result<(), Error>; /// Returns peer identification string - fn peer_client_version(&self, peer: PeerId) -> String; + fn peer_client_version(&self, peer: PeerId) -> ClientVersion; /// Returns information on p2p session fn session_info(&self, peer: PeerId) -> Option; @@ -288,6 +299,9 @@ pub trait NetworkContext { /// Returns whether the given peer ID is a reserved peer. fn is_reserved_peer(&self, peer: PeerId) -> bool; + + /// Returns the size the payload shouldn't exceed + fn payload_soft_limit(&self) -> usize; } impl<'a, T> NetworkContext for &'a T where T: ?Sized + NetworkContext { @@ -319,7 +333,7 @@ impl<'a, T> NetworkContext for &'a T where T: ?Sized + NetworkContext { (**self).register_timer(token, delay) } - fn peer_client_version(&self, peer: PeerId) -> String { + fn peer_client_version(&self, peer: PeerId) -> ClientVersion { (**self).peer_client_version(peer) } @@ -338,6 +352,10 @@ impl<'a, T> NetworkContext for &'a T where T: ?Sized + NetworkContext { fn is_reserved_peer(&self, peer: PeerId) -> bool { (**self).is_reserved_peer(peer) } + + fn payload_soft_limit(&self) -> usize { + (**self).payload_soft_limit() + } } /// Network IO protocol handler. This needs to be implemented for each new subprotocol. diff --git a/util/panic_hook/Cargo.toml b/util/panic-hook/Cargo.toml similarity index 100% rename from util/panic_hook/Cargo.toml rename to util/panic-hook/Cargo.toml diff --git a/util/panic_hook/src/lib.rs b/util/panic-hook/src/lib.rs similarity index 85% rename from util/panic_hook/src/lib.rs rename to util/panic-hook/src/lib.rs index 0c855250906..03501a47fd6 100644 --- a/util/panic_hook/src/lib.rs +++ b/util/panic-hook/src/lib.rs @@ -1,24 +1,23 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Custom panic hook with bug report link extern crate backtrace; -use std::io::{self, Write}; use std::panic::{self, PanicInfo}; use std::thread; use std::process; @@ -27,7 +26,7 @@ use backtrace::Backtrace; /// Set the panic hook to write to stderr and abort the process when a panic happens. pub fn set_abort() { set_with(|msg| { - let _ = io::stderr().write_all(msg.as_bytes()); + eprintln!("{}", msg); process::abort() }); } diff --git a/util/patricia-trie-ethereum/Cargo.toml b/util/patricia-trie-ethereum/Cargo.toml index e6880691a12..8cb8664a5ed 100644 --- a/util/patricia-trie-ethereum/Cargo.toml +++ b/util/patricia-trie-ethereum/Cargo.toml @@ -6,14 +6,15 @@ description = "Merkle-Patricia Trie (Ethereum Style)" license = "GPL-3.0" [dependencies] -patricia-trie = "0.3.0" +trie-db = "0.11.0" keccak-hasher = { version = "0.1.1", path = "../keccak-hasher" } -hashdb = "0.3.0" +hash-db = "0.11.0" rlp = "0.3.0" parity-bytes = "0.1" ethereum-types = "0.4" elastic-array = "0.10" [dev-dependencies] -memorydb = "0.3.0" +memory-db = "0.11.0" keccak-hash = "0.1.2" +journaldb = { path = "../journaldb" } diff --git a/util/patricia-trie-ethereum/src/lib.rs b/util/patricia-trie-ethereum/src/lib.rs index aa83e330cd9..ab44f4e8371 100644 --- a/util/patricia-trie-ethereum/src/lib.rs +++ b/util/patricia-trie-ethereum/src/lib.rs @@ -1,26 +1,26 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Façade crate for `patricia_trie` for Ethereum specific impls -pub extern crate patricia_trie as trie; // `pub` because we need to import this crate for the tests in `patricia_trie` and there were issues: https://gist.github.com/dvdplm/869251ee557a1b4bd53adc7c971979aa +pub extern crate trie_db as trie; // `pub` because we need to import this crate for the tests in `patricia_trie` and there were issues: https://gist.github.com/dvdplm/869251ee557a1b4bd53adc7c971979aa extern crate elastic_array; extern crate parity_bytes; extern crate ethereum_types; -extern crate hashdb; +extern crate hash_db; extern crate keccak_hasher; extern crate rlp; @@ -42,18 +42,19 @@ pub type RlpCodec = RlpNodeCodec; /// /// # Example /// ``` -/// extern crate patricia_trie as trie; +/// extern crate trie_db as trie; /// extern crate patricia_trie_ethereum as ethtrie; -/// extern crate hashdb; +/// extern crate hash_db; /// extern crate keccak_hasher; -/// extern crate memorydb; +/// extern crate memory_db; /// extern crate ethereum_types; /// extern crate elastic_array; +/// extern crate journaldb; /// /// use trie::*; -/// use hashdb::*; +/// use hash_db::*; /// use keccak_hasher::KeccakHasher; -/// use memorydb::*; +/// use memory_db::*; /// use ethereum_types::H256; /// use ethtrie::{TrieDB, TrieDBMut}; /// use elastic_array::ElasticArray128; @@ -61,7 +62,7 @@ pub type RlpCodec = RlpNodeCodec; /// type DBValue = ElasticArray128; /// /// fn main() { -/// let mut memdb = MemoryDB::::new(); +/// let mut memdb = journaldb::new_memory_db(); /// let mut root = H256::new(); /// TrieDBMut::new(&mut memdb, &mut root).insert(b"foo", b"bar").unwrap(); /// let t = TrieDB::new(&memdb, &root).unwrap(); @@ -85,26 +86,27 @@ pub type FatDB<'db> = trie::FatDB<'db, KeccakHasher, RlpCodec>; /// # Example /// ``` -/// extern crate patricia_trie as trie; +/// extern crate trie_db as trie; /// extern crate patricia_trie_ethereum as ethtrie; -/// extern crate hashdb; +/// extern crate hash_db; /// extern crate keccak_hash; /// extern crate keccak_hasher; -/// extern crate memorydb; +/// extern crate memory_db; /// extern crate ethereum_types; /// extern crate elastic_array; +/// extern crate journaldb; /// /// use keccak_hash::KECCAK_NULL_RLP; /// use ethtrie::{TrieDBMut, trie::TrieMut}; /// use keccak_hasher::KeccakHasher; -/// use memorydb::*; +/// use memory_db::*; /// use ethereum_types::H256; /// use elastic_array::ElasticArray128; /// /// type DBValue = ElasticArray128; /// /// fn main() { -/// let mut memdb = MemoryDB::::new(); +/// let mut memdb = journaldb::new_memory_db(); /// let mut root = H256::new(); /// let mut t = TrieDBMut::new(&mut memdb, &mut root); /// assert!(t.is_empty()); diff --git a/util/patricia-trie-ethereum/src/rlp_node_codec.rs b/util/patricia-trie-ethereum/src/rlp_node_codec.rs index 50482c47b9b..ea8aea8a771 100644 --- a/util/patricia-trie-ethereum/src/rlp_node_codec.rs +++ b/util/patricia-trie-ethereum/src/rlp_node_codec.rs @@ -1,24 +1,24 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! `NodeCodec` implementation for Rlp use elastic_array::ElasticArray128; use ethereum_types::H256; -use hashdb::Hasher; +use hash_db::Hasher; use keccak_hasher::KeccakHasher; use rlp::{DecoderError, RlpStream, Rlp, Prototype}; use std::marker::PhantomData; @@ -28,13 +28,17 @@ use trie::{NibbleSlice, NodeCodec, node::Node, ChildReference}; #[derive(Default, Clone)] pub struct RlpNodeCodec {mark: PhantomData} +const HASHED_NULL_NODE_BYTES : [u8;32] = [0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21]; +const HASHED_NULL_NODE : H256 = H256( HASHED_NULL_NODE_BYTES ); // NOTE: what we'd really like here is: // `impl NodeCodec for RlpNodeCodec where H::Out: Decodable` // but due to the current limitations of Rust const evaluation we can't // do `const HASHED_NULL_NODE: H::Out = H::Out( … … )`. Perhaps one day soon? impl NodeCodec for RlpNodeCodec { type Error = DecoderError; - const HASHED_NULL_NODE : H256 = H256( [0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21] ); + fn hashed_null_node() -> ::Out { + HASHED_NULL_NODE + } fn decode(data: &[u8]) -> ::std::result::Result { let r = Rlp::new(data); match r.prototype()? { @@ -49,9 +53,14 @@ impl NodeCodec for RlpNodeCodec { }, // branch - first 16 are nodes, 17th is a value (or empty). Prototype::List(17) => { - let mut nodes = [&[] as &[u8]; 16]; + let mut nodes = [None as Option<&[u8]>; 16]; for i in 0..16 { - nodes[i] = r.at(i)?.as_raw(); + let v = r.at(i)?; + if v.is_empty() { + nodes[i] = None; + } else { + nodes[i] = Some(v.as_raw()); + } } Ok(Node::Branch(nodes, if r.at(16)?.is_empty() { None } else { Some(r.at(16)?.data()?) })) }, @@ -72,54 +81,54 @@ impl NodeCodec for RlpNodeCodec { fn is_empty_node(data: &[u8]) -> bool { Rlp::new(data).is_empty() } - fn empty_node() -> Vec { - let mut stream = RlpStream::new(); - stream.append_empty_data(); - stream.drain() - } + fn empty_node() -> Vec { + let mut stream = RlpStream::new(); + stream.append_empty_data(); + stream.drain() + } - fn leaf_node(partial: &[u8], value: &[u8]) -> Vec { - let mut stream = RlpStream::new_list(2); - stream.append(&partial); - stream.append(&value); + fn leaf_node(partial: &[u8], value: &[u8]) -> Vec { + let mut stream = RlpStream::new_list(2); + stream.append(&partial); + stream.append(&value); stream.drain() - } + } fn ext_node(partial: &[u8], child_ref: ChildReference<::Out>) -> Vec { - let mut stream = RlpStream::new_list(2); - stream.append(&partial); - match child_ref { - ChildReference::Hash(h) => stream.append(&h), - ChildReference::Inline(inline_data, len) => { - let bytes = &AsRef::<[u8]>::as_ref(&inline_data)[..len]; - stream.append_raw(bytes, 1) - }, - }; - stream.drain() + let mut stream = RlpStream::new_list(2); + stream.append(&partial); + match child_ref { + ChildReference::Hash(h) => stream.append(&h), + ChildReference::Inline(inline_data, len) => { + let bytes = &AsRef::<[u8]>::as_ref(&inline_data)[..len]; + stream.append_raw(bytes, 1) + }, + }; + stream.drain() } // fn branch_node(children: I, value: Option>) -> Vec fn branch_node(children: I, value: Option>) -> Vec where I: IntoIterator::Out>>> - { - let mut stream = RlpStream::new_list(17); - for child_ref in children { - match child_ref { - Some(c) => match c { - ChildReference::Hash(h) => stream.append(&h), - ChildReference::Inline(inline_data, len) => { - let bytes = &AsRef::<[u8]>::as_ref(&inline_data)[..len]; - stream.append_raw(bytes, 1) - }, - }, - None => stream.append_empty_data() - }; - } - if let Some(value) = value { - stream.append(&&*value); - } else { - stream.append_empty_data(); - } - stream.drain() - } + { + let mut stream = RlpStream::new_list(17); + for child_ref in children { + match child_ref { + Some(c) => match c { + ChildReference::Hash(h) => stream.append(&h), + ChildReference::Inline(inline_data, len) => { + let bytes = &AsRef::<[u8]>::as_ref(&inline_data)[..len]; + stream.append_raw(bytes, 1) + }, + }, + None => stream.append_empty_data() + }; + } + if let Some(value) = value { + stream.append(&&*value); + } else { + stream.append_empty_data(); + } + stream.drain() + } } diff --git a/registrar/Cargo.toml b/util/registrar/Cargo.toml similarity index 100% rename from registrar/Cargo.toml rename to util/registrar/Cargo.toml diff --git a/registrar/res/registrar.json b/util/registrar/res/registrar.json similarity index 100% rename from registrar/res/registrar.json rename to util/registrar/res/registrar.json diff --git a/registrar/src/lib.rs b/util/registrar/src/lib.rs similarity index 68% rename from registrar/src/lib.rs rename to util/registrar/src/lib.rs index aad33765efe..d07e17c1bc1 100644 --- a/registrar/src/lib.rs +++ b/util/registrar/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate futures; extern crate ethabi; diff --git a/registrar/src/registrar.rs b/util/registrar/src/registrar.rs similarity index 87% rename from registrar/src/registrar.rs rename to util/registrar/src/registrar.rs index e1670164264..cd6d35660a8 100644 --- a/registrar/src/registrar.rs +++ b/util/registrar/src/registrar.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use futures::{Future, future, IntoFuture}; use ethabi::{Address, Bytes}; diff --git a/util/rlp_compress/Cargo.toml b/util/rlp-compress/Cargo.toml similarity index 100% rename from util/rlp_compress/Cargo.toml rename to util/rlp-compress/Cargo.toml diff --git a/util/rlp_compress/src/common.rs b/util/rlp-compress/src/common.rs similarity index 98% rename from util/rlp_compress/src/common.rs rename to util/rlp-compress/src/common.rs index 79f8a93c1f8..81767955b6b 100644 --- a/util/rlp_compress/src/common.rs +++ b/util/rlp-compress/src/common.rs @@ -1,4 +1,4 @@ -// Copyright 2015-2017 Parity Technologies +// Copyright 2015-2019 Parity Technologies (UK) Ltd. // // Licensed under the Apache License, Version 2.0 or the MIT license diff --git a/util/rlp_compress/src/lib.rs b/util/rlp-compress/src/lib.rs similarity index 98% rename from util/rlp_compress/src/lib.rs rename to util/rlp-compress/src/lib.rs index 38dabcd86b8..48620ed239d 100644 --- a/util/rlp_compress/src/lib.rs +++ b/util/rlp-compress/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2015-2018 Parity Technologies +// Copyright 2015-2019 Parity Technologies (UK) Ltd. // // Licensed under the Apache License, Version 2.0 or the MIT license diff --git a/util/rlp_compress/tests/compress.rs b/util/rlp-compress/tests/compress.rs similarity index 99% rename from util/rlp_compress/tests/compress.rs rename to util/rlp-compress/tests/compress.rs index 9d23f8c670c..6c5a0237467 100644 --- a/util/rlp_compress/tests/compress.rs +++ b/util/rlp-compress/tests/compress.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate rlp_compress; diff --git a/util/rlp_derive/Cargo.toml b/util/rlp-derive/Cargo.toml similarity index 100% rename from util/rlp_derive/Cargo.toml rename to util/rlp-derive/Cargo.toml diff --git a/util/rlp_derive/src/de.rs b/util/rlp-derive/src/de.rs similarity index 92% rename from util/rlp_derive/src/de.rs rename to util/rlp-derive/src/de.rs index 8ab1dd79625..234bcbcb84f 100644 --- a/util/rlp_derive/src/de.rs +++ b/util/rlp-derive/src/de.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use syn; use proc_macro2::{TokenStream, Span}; diff --git a/util/rlp_derive/src/en.rs b/util/rlp-derive/src/en.rs similarity index 91% rename from util/rlp_derive/src/en.rs rename to util/rlp-derive/src/en.rs index de7d746e123..95e5b9142d4 100644 --- a/util/rlp_derive/src/en.rs +++ b/util/rlp-derive/src/en.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . use syn; use proc_macro2::{TokenStream, Span}; diff --git a/util/rlp_derive/src/lib.rs b/util/rlp-derive/src/lib.rs similarity index 81% rename from util/rlp_derive/src/lib.rs rename to util/rlp-derive/src/lib.rs index 5b0cc2a6274..0f5d442f443 100644 --- a/util/rlp_derive/src/lib.rs +++ b/util/rlp-derive/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate proc_macro; extern crate proc_macro2; diff --git a/util/rlp_derive/tests/rlp.rs b/util/rlp-derive/tests/rlp.rs similarity index 79% rename from util/rlp_derive/tests/rlp.rs rename to util/rlp-derive/tests/rlp.rs index 41cfed17c08..a6819ba4bdd 100644 --- a/util/rlp_derive/tests/rlp.rs +++ b/util/rlp-derive/tests/rlp.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate rlp; #[macro_use] diff --git a/util/runtime/src/lib.rs b/util/runtime/src/lib.rs index 97bed9b130c..0c78c7f4a30 100644 --- a/util/runtime/src/lib.rs +++ b/util/runtime/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Tokio Runtime wrapper. diff --git a/util/stats/src/lib.rs b/util/stats/src/lib.rs index 8d107f4e9cc..e1ceb4fe849 100644 --- a/util/stats/src/lib.rs +++ b/util/stats/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Statistical functions and helpers. diff --git a/util/stop-guard/Cargo.toml b/util/stop-guard/Cargo.toml deleted file mode 100644 index f8fa5f12343..00000000000 --- a/util/stop-guard/Cargo.toml +++ /dev/null @@ -1,4 +0,0 @@ -[package] -name = "stop-guard" -version = "0.1.0" -authors = ["Parity Technologies "] diff --git a/util/triehash-ethereum/Cargo.toml b/util/triehash-ethereum/Cargo.toml index e46d5d69076..5b636429753 100644 --- a/util/triehash-ethereum/Cargo.toml +++ b/util/triehash-ethereum/Cargo.toml @@ -6,6 +6,6 @@ description = "Trie-root helpers, ethereum style" license = "GPL-3.0" [dependencies] -triehash = { version = "0.3.0", features = ["ethereum"] } +triehash = { version = "0.4.0", features = ["ethereum"] } ethereum-types = "0.4" keccak-hasher = { path = "../keccak-hasher" } diff --git a/util/triehash-ethereum/src/lib.rs b/util/triehash-ethereum/src/lib.rs index 55aa74760e2..696ed61aba7 100644 --- a/util/triehash-ethereum/src/lib.rs +++ b/util/triehash-ethereum/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Generates Keccak-flavoured trie roots. diff --git a/util/unexpected/src/lib.rs b/util/unexpected/src/lib.rs index 77d4035a647..9a1a709be41 100644 --- a/util/unexpected/src/lib.rs +++ b/util/unexpected/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Error utils diff --git a/util/version/Cargo.toml b/util/version/Cargo.toml index f309c3b04c8..87000505465 100644 --- a/util/version/Cargo.toml +++ b/util/version/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "parity-version" # NOTE: this value is used for Parity Ethereum version string (via env CARGO_PKG_VERSION) -version = "2.3.0" +version = "2.5.0" authors = ["Parity Technologies "] build = "build.rs" @@ -16,9 +16,9 @@ track = "nightly" # Latest supported fork blocks. # Indicates a critical release in this track (i.e. consensus issue). [package.metadata.networks] -foundation = { forkBlock = 4370000, critical = false } -ropsten = { forkBlock = 4230000, critical = false } -kovan = { forkBlock = 6600000, critical = false } +foundation = { forkBlock = 7280000, critical = false } +ropsten = { forkBlock = 4939394, critical = false } +kovan = { forkBlock = 10255201, critical = false } [dependencies] parity-bytes = "0.1" diff --git a/util/version/build.rs b/util/version/build.rs index a367296a5fb..3ee37fbca63 100644 --- a/util/version/build.rs +++ b/util/version/build.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . extern crate rustc_version; extern crate toml; diff --git a/util/version/src/lib.rs b/util/version/src/lib.rs index a7452e0ce93..00f9f4550cf 100644 --- a/util/version/src/lib.rs +++ b/util/version/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Parity version specific information. diff --git a/whisper/Cargo.toml b/whisper/Cargo.toml index 4c2f42576e2..5c3548a50c8 100644 --- a/whisper/Cargo.toml +++ b/whisper/Cargo.toml @@ -9,11 +9,11 @@ bitflags = "0.9" byteorder = "1.0.0" ethereum-types = "0.4" ethcore-network = { path = "../util/network" } -parity-crypto = "0.2" -ethkey = { path = "../ethkey" } +parity-crypto = "0.3.0" +ethkey = { path = "../accounts/ethkey" } hex = "0.2" log = "0.4" -mem = { path = "../util/mem" } +memzero = { path = "../util/memzero" } ordered-float = "0.5" parking_lot = "0.7" rand = "0.4" @@ -25,6 +25,6 @@ slab = "0.3" smallvec = "0.6" tiny-keccak = "1.4" -jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -jsonrpc-macros = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -jsonrpc-pubsub = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } +jsonrpc-core = "10.0.1" +jsonrpc-derive = "10.0.2" +jsonrpc-pubsub = "10.0.1" diff --git a/whisper/README.md b/whisper/README.md index a582843f805..dc449568aa7 100644 --- a/whisper/README.md +++ b/whisper/README.md @@ -6,7 +6,7 @@ Implementation of Whisper based on the Whisper-v2 PoC. ``` Parity Whisper-v2 CLI. - Copyright 2015-2018 Parity Technologies (UK) Ltd. + Copyright 2015-2019 Parity Technologies (UK) Ltd. Usage: whisper [options] @@ -25,6 +25,6 @@ _This project is a part of the Parity Ethereum toolchain._ - [evmbin](https://github.com/paritytech/parity-ethereum/blob/master/evmbin/) - EVM implementation for Parity Ethereum. - [ethabi](https://github.com/paritytech/ethabi) - Parity Ethereum function calls encoding. -- [ethstore](https://github.com/paritytech/parity-ethereum/blob/master/ethstore/) - Parity Ethereum key management. -- [ethkey](https://github.com/paritytech/parity-ethereum/blob/master/ethkey/) - Parity Ethereum keys generator. +- [ethstore](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethstore) - Parity Ethereum key management. +- [ethkey](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethkey) - Parity Ethereum keys generator. - [whisper](https://github.com/paritytech/parity-ethereum/blob/master/whisper/) - Implementation of Whisper-v2 PoC. diff --git a/whisper/cli/Cargo.toml b/whisper/cli/Cargo.toml index b3e7fa7b100..4d123c09ab7 100644 --- a/whisper/cli/Cargo.toml +++ b/whisper/cli/Cargo.toml @@ -6,18 +6,18 @@ authors = ["Parity Technologies "] license = "GPL-3.0" [dependencies] -ethcore-network-devp2p = { path = "../../util/network-devp2p" } +docopt = "1.0" +env_logger = "0.5" ethcore-network = { path = "../../util/network" } -ethcore-logger = { path = "../../logger" } +ethcore-network-devp2p = { path = "../../util/network-devp2p" } +jsonrpc-core = "10.0.1" +jsonrpc-http-server = "10.0.1" +jsonrpc-pubsub = "10.0.1" +log = "0.4" +panic_hook = { path = "../../util/panic-hook" } parity-whisper = { path = "../" } -docopt = "1.0" serde = "1.0" serde_derive = "1.0" -panic_hook = { path = "../../util/panic_hook" } -jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -jsonrpc-pubsub = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -jsonrpc-http-server = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-2.2" } -log = "0.4" [[bin]] name = "whisper" diff --git a/whisper/cli/src/main.rs b/whisper/cli/src/main.rs index 76f852c762b..9ef2304b478 100644 --- a/whisper/cli/src/main.rs +++ b/whisper/cli/src/main.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Whisper command line interface //! @@ -23,16 +23,16 @@ #![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))] extern crate docopt; -extern crate ethcore_network_devp2p as devp2p; +extern crate env_logger; extern crate ethcore_network as net; +extern crate ethcore_network_devp2p as devp2p; +extern crate panic_hook; extern crate parity_whisper as whisper; extern crate serde; -extern crate panic_hook; extern crate jsonrpc_core; extern crate jsonrpc_pubsub; extern crate jsonrpc_http_server; -extern crate ethcore_logger as log; #[macro_use] extern crate log as rlog; @@ -49,7 +49,7 @@ use jsonrpc_http_server::{AccessControlAllowOrigin, DomainsValidation}; const POOL_UNIT: usize = 1024 * 1024; const USAGE: &'static str = r#" Parity Whisper-v2 CLI. - Copyright 2015-2018 Parity Technologies (UK) Ltd. + Copyright 2015-2019 Parity Technologies (UK) Ltd. Usage: whisper [options] @@ -131,7 +131,6 @@ enum Error { JsonRpc(jsonrpc_core::Error), Network(net::Error), SockAddr(std::net::AddrParseError), - Logger(String), } impl From for Error { @@ -164,12 +163,6 @@ impl From for Error { } } -impl From for Error { - fn from(err: String) -> Self { - Error::Logger(err) - } -} - impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { match *self { @@ -178,7 +171,6 @@ impl fmt::Display for Error { Error::Io(ref e) => write!(f, "{}", e), Error::JsonRpc(ref e) => write!(f, "{:?}", e), Error::Network(ref e) => write!(f, "{}", e), - Error::Logger(ref e) => write!(f, "{}", e), } } } @@ -206,7 +198,7 @@ fn execute(command: I) -> Result<(), Error> where I: IntoIterator, let pool_size = args.flag_whisper_pool_size * POOL_UNIT; let url = format!("{}:{}", args.flag_address, args.flag_port); - initialize_logger(args.flag_log)?; + initialize_logger(args.flag_log); info!(target: "whisper-cli", "start"); // Filter manager that will dispatch `decryption tasks` @@ -249,11 +241,10 @@ fn execute(command: I) -> Result<(), Error> where I: IntoIterator, Ok(()) } -fn initialize_logger(log_level: String) -> Result<(), String> { - let mut l = log::Config::default(); - l.mode = Some(log_level); - log::setup_log(&l)?; - Ok(()) +fn initialize_logger(log_level: String) { + env_logger::Builder::from_env(env_logger::Env::default()) + .parse(&log_level) + .init(); } #[cfg(test)] diff --git a/whisper/src/lib.rs b/whisper/src/lib.rs index 66d8d1b7321..0e79946d9a5 100644 --- a/whisper/src/lib.rs +++ b/whisper/src/lib.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Whisper P2P messaging system as a DevP2P subprotocol, with RPC and Rust //! interface. @@ -23,7 +23,7 @@ extern crate ethcore_network as network; extern crate ethereum_types; extern crate ethkey; extern crate hex; -extern crate mem; +extern crate memzero; extern crate ordered_float; extern crate parking_lot; extern crate rand; @@ -34,6 +34,7 @@ extern crate smallvec; extern crate tiny_keccak; extern crate jsonrpc_core; +extern crate jsonrpc_derive; extern crate jsonrpc_pubsub; #[macro_use] @@ -42,9 +43,6 @@ extern crate bitflags; #[macro_use] extern crate log; -#[macro_use] -extern crate jsonrpc_macros; - #[macro_use] extern crate serde_derive; diff --git a/whisper/src/message.rs b/whisper/src/message.rs index 95c21125513..f8e8565a8eb 100644 --- a/whisper/src/message.rs +++ b/whisper/src/message.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Whisper message parsing, handlers, and construction. @@ -32,12 +32,13 @@ pub fn work_factor_proved(size: u64, ttl: u64, hash: H256) -> f64 { assert!(size != 0 && ttl != 0); let leading_zeros = { - let leading_zeros = hash.iter().take_while(|&&x| x == 0).count(); - (leading_zeros * 8) + hash.get(leading_zeros + 1).map_or(0, |b| b.leading_zeros() as usize) + let leading_bytes = hash.iter().take_while(|&&x| x == 0).count(); + let remaining_leading_bits = hash.get(leading_bytes).map_or(0, |byte| byte.leading_zeros() as usize); + (leading_bytes * 8) + remaining_leading_bits }; let spacetime = size as f64 * ttl as f64; - (1u64 << leading_zeros) as f64 / spacetime + 2.0_f64.powi(leading_zeros as i32) / spacetime } /// A topic of a message. @@ -416,6 +417,7 @@ impl Message { #[cfg(test)] mod tests { + use ethereum_types::H256; use super::*; use std::time::{self, Duration, SystemTime}; use rlp::Rlp; @@ -518,4 +520,14 @@ mod tests { let now = unix_time(95_000); Message::decode(Rlp::new(&*encoded), now).unwrap(); } + + #[test] + fn work_factor() { + // 256 leading zeros -> 2^256 / 1 + assert_eq!(work_factor_proved(1, 1, H256::from(0)), 115792089237316200000000000000000000000000000000000000000000000000000000000000.0); + // 255 leading zeros -> 2^255 / 1 + assert_eq!(work_factor_proved(1, 1, H256::from(1)), 57896044618658100000000000000000000000000000000000000000000000000000000000000.0); + // 0 leading zeros -> 2^0 / 1 + assert_eq!(work_factor_proved(1, 1, serde_json::from_str::("\"0xff00000000000000000000000000000000000000000000000000000000000000\"").unwrap()), 1.0); + } } diff --git a/whisper/src/net/mod.rs b/whisper/src/net/mod.rs index 6ec3b08a548..64431d14263 100644 --- a/whisper/src/net/mod.rs +++ b/whisper/src/net/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Whisper messaging system as a DevP2P subprotocol. diff --git a/whisper/src/net/tests.rs b/whisper/src/net/tests.rs index 15aba5c3eed..7af0cb8d380 100644 --- a/whisper/src/net/tests.rs +++ b/whisper/src/net/tests.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Tests for the whisper network module. diff --git a/whisper/src/rpc/crypto.rs b/whisper/src/rpc/crypto.rs index a796a0613cc..89116345313 100644 --- a/whisper/src/rpc/crypto.rs +++ b/whisper/src/rpc/crypto.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Encryption schemes supported by RPC layer. @@ -20,7 +20,7 @@ use crypto::aes_gcm::{Encryptor, Decryptor}; use ethkey::crypto::ecies; use ethereum_types::H256; use ethkey::{self, Public, Secret}; -use mem::Memzero; +use memzero::Memzero; /// Length of AES key pub const AES_KEY_LEN: usize = 32; diff --git a/whisper/src/rpc/filter.rs b/whisper/src/rpc/filter.rs index d1b9c4c1cc6..46cefd61e00 100644 --- a/whisper/src/rpc/filter.rs +++ b/whisper/src/rpc/filter.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Abstraction over filters which works with polling and subscription. @@ -21,7 +21,7 @@ use std::{sync::{Arc, atomic, atomic::AtomicBool, mpsc}, thread}; use ethereum_types::{H256, H512}; use ethkey::Public; -use jsonrpc_macros::pubsub::{Subscriber, Sink}; +use jsonrpc_pubsub::typed::{Subscriber, Sink}; use parking_lot::{Mutex, RwLock}; use rand::{Rng, OsRng}; diff --git a/whisper/src/rpc/key_store.rs b/whisper/src/rpc/key_store.rs index a63ef8652c4..081a8b374d6 100644 --- a/whisper/src/rpc/key_store.rs +++ b/whisper/src/rpc/key_store.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Identity and keystore for Whisper sessions. //! @@ -23,7 +23,7 @@ use std::collections::HashMap; use ethereum_types::H256; use ethkey::{KeyPair, Public, Secret}; -use mem::Memzero; +use memzero::Memzero; use rand::{Rng, OsRng}; use rpc::crypto::{AES_KEY_LEN, EncryptionInstance, DecryptionInstance}; diff --git a/whisper/src/rpc/mod.rs b/whisper/src/rpc/mod.rs index 7406d6421d3..03d98b51ff8 100644 --- a/whisper/src/rpc/mod.rs +++ b/whisper/src/rpc/mod.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! JSONRPC interface for Whisper. //! @@ -24,11 +24,11 @@ use std::sync::Arc; use jsonrpc_core::{Error, ErrorCode, Metadata}; -use jsonrpc_pubsub::{Session, PubSubMetadata, SubscriptionId}; -use jsonrpc_macros::pubsub; +use jsonrpc_derive::rpc; +use jsonrpc_pubsub::{Session, PubSubMetadata, SubscriptionId, typed::Subscriber}; use ethereum_types::H256; -use mem::Memzero; +use memzero::Memzero; use parking_lot::RwLock; use self::filter::Filter; @@ -68,81 +68,78 @@ fn abridge_topic(topic: &[u8]) -> Topic { abridged.into() } -build_rpc_trait! { - /// Whisper RPC interface. - pub trait Whisper { - /// Info about the node. - #[rpc(name = "shh_info")] - fn info(&self) -> Result; - - /// Generate a new asymmetric key pair and return an identity. - #[rpc(name = "shh_newKeyPair")] - fn new_key_pair(&self) -> Result; - - /// Import the given SECP2561k private key and return an identity. - #[rpc(name = "shh_addPrivateKey")] - fn add_private_key(&self, types::Private) -> Result; - - /// Generate a new symmetric key and return an identity. - #[rpc(name = "shh_newSymKey")] - fn new_sym_key(&self) -> Result; - - /// Import the given symmetric key and return an identity. - #[rpc(name = "shh_addSymKey")] - fn add_sym_key(&self, types::Symmetric) -> Result; - - /// Get public key. Succeeds if identity is stored and asymmetric. - #[rpc(name = "shh_getPublicKey")] - fn get_public(&self, types::Identity) -> Result; - - /// Get private key. Succeeds if identity is stored and asymmetric. - #[rpc(name = "shh_getPrivateKey")] - fn get_private(&self, types::Identity) -> Result; - - #[rpc(name = "shh_getSymKey")] - fn get_symmetric(&self, types::Identity) -> Result; - - /// Delete key pair denoted by given identity. - /// - /// Return true if successfully removed, false if unknown, - /// and error otherwise. - #[rpc(name = "shh_deleteKey")] - fn remove_key(&self, types::Identity) -> Result; - - /// Post a message to the network with given parameters. - #[rpc(name = "shh_post")] - fn post(&self, types::PostRequest) -> Result; - - /// Create a new polled filter. - #[rpc(name = "shh_newMessageFilter")] - fn new_filter(&self, types::FilterRequest) -> Result; - - /// Poll changes on a polled filter. - #[rpc(name = "shh_getFilterMessages")] - fn poll_changes(&self, types::Identity) -> Result, Error>; - - /// Delete polled filter. Return bool indicating success. - #[rpc(name = "shh_deleteMessageFilter")] - fn delete_filter(&self, types::Identity) -> Result; - } +/// Whisper RPC interface. +#[rpc] +pub trait Whisper { + /// Info about the node. + #[rpc(name = "shh_info")] + fn info(&self) -> Result; + + /// Generate a new asymmetric key pair and return an identity. + #[rpc(name = "shh_newKeyPair")] + fn new_key_pair(&self) -> Result; + + /// Import the given SECP2561k private key and return an identity. + #[rpc(name = "shh_addPrivateKey")] + fn add_private_key(&self, types::Private) -> Result; + + /// Generate a new symmetric key and return an identity. + #[rpc(name = "shh_newSymKey")] + fn new_sym_key(&self) -> Result; + + /// Import the given symmetric key and return an identity. + #[rpc(name = "shh_addSymKey")] + fn add_sym_key(&self, types::Symmetric) -> Result; + + /// Get public key. Succeeds if identity is stored and asymmetric. + #[rpc(name = "shh_getPublicKey")] + fn get_public(&self, types::Identity) -> Result; + + /// Get private key. Succeeds if identity is stored and asymmetric. + #[rpc(name = "shh_getPrivateKey")] + fn get_private(&self, types::Identity) -> Result; + + #[rpc(name = "shh_getSymKey")] + fn get_symmetric(&self, types::Identity) -> Result; + + /// Delete key pair denoted by given identity. + /// + /// Return true if successfully removed, false if unknown, + /// and error otherwise. + #[rpc(name = "shh_deleteKey")] + fn remove_key(&self, types::Identity) -> Result; + + /// Post a message to the network with given parameters. + #[rpc(name = "shh_post")] + fn post(&self, types::PostRequest) -> Result; + + /// Create a new polled filter. + #[rpc(name = "shh_newMessageFilter")] + fn new_filter(&self, types::FilterRequest) -> Result; + + /// Poll changes on a polled filter. + #[rpc(name = "shh_getFilterMessages")] + fn poll_changes(&self, types::Identity) -> Result, Error>; + + /// Delete polled filter. Return bool indicating success. + #[rpc(name = "shh_deleteMessageFilter")] + fn delete_filter(&self, types::Identity) -> Result; } -build_rpc_trait! { - /// Whisper RPC pubsub. - pub trait WhisperPubSub { - type Metadata; +/// Whisper RPC pubsub. +#[rpc] +pub trait WhisperPubSub { + // RPC Metadata + type Metadata; - #[pubsub(name = "shh_subscription")] { - /// Subscribe to messages matching the filter. - #[rpc(name = "shh_subscribe")] - fn subscribe(&self, Self::Metadata, pubsub::Subscriber, types::FilterRequest); + /// Subscribe to messages matching the filter. + #[pubsub(subscription = "shh_subscription", subscribe, name = "shh_subscribe")] + fn subscribe(&self, Self::Metadata, Subscriber, types::FilterRequest); - /// Unsubscribe from filter matching given ID. Return - /// true on success, error otherwise. - #[rpc(name = "shh_unsubscribe")] - fn unsubscribe(&self, SubscriptionId) -> Result; - } - } + /// Unsubscribe from filter matching given ID. Return + /// true on success, error otherwise. + #[pubsub(subscription = "shh_subscription", unsubscribe, name = "shh_unsubscribe")] + fn unsubscribe(&self, Option, SubscriptionId) -> Result; } /// Something which can send messages to the network. @@ -364,7 +361,7 @@ impl WhisperPubSub for fn subscribe( &self, _meta: Self::Metadata, - subscriber: pubsub::Subscriber, + subscriber: Subscriber, req: types::FilterRequest, ) { match Filter::new(req) { @@ -377,7 +374,7 @@ impl WhisperPubSub for } } - fn unsubscribe(&self, id: SubscriptionId) -> Result { + fn unsubscribe(&self, _: Option, id: SubscriptionId) -> Result { use std::str::FromStr; let res = match id { diff --git a/whisper/src/rpc/payload.rs b/whisper/src/rpc/payload.rs index 5884cdee980..326a6b6e2f9 100644 --- a/whisper/src/rpc/payload.rs +++ b/whisper/src/rpc/payload.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Common payload format definition, construction, and decoding. //! diff --git a/whisper/src/rpc/types.rs b/whisper/src/rpc/types.rs index e404de0c70c..40e440bf562 100644 --- a/whisper/src/rpc/types.rs +++ b/whisper/src/rpc/types.rs @@ -1,18 +1,18 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. -// Parity is free software: you can redistribute it and/or modify +// Parity Ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Parity is distributed in the hope that it will be useful, +// Parity Ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// along with Parity Ethereum. If not, see . //! Types for Whisper RPC.