diff --git a/.github/scripts/flamegraph_watcher.sh b/.github/scripts/flamegraph_watcher.sh new file mode 100644 index 0000000000..368ce462d6 --- /dev/null +++ b/.github/scripts/flamegraph_watcher.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# This script sends 171 * transactions to a test account, per defined private key +# then polls the account balance until the expected balance has been reached +# and then kills the process. It also measures the elapsed time of the test and +# outputs it to Github Action's outputs. +iterations=3500 +value=1 +account=0x33c6b73432B3aeA0C1725E415CC40D04908B85fd +end_val=$((171 * $iterations * $value)) + +start_time=$(date +%s) +ethrex_l2 test load --path /home/runner/work/ethrex/ethrex/test_data/private_keys.txt -i $iterations -v --value $value --to $account >/dev/null + +output=$(ethrex_l2 info -b -a $account --wei 2>&1) +echo "balance: $output" +while [[ $output -lt $end_val ]]; do + sleep 2 + output=$(ethrex_l2 info -b -a $account --wei 2>&1) + echo "balance: $output" +done +end_time=$(date +%s) +elapsed=$((end_time - start_time)) + +minutes=$((elapsed / 60)) +seconds=$((elapsed % 60)) +output=$(ethrex_l2 info -b -a $account --wei 2>&1) +echo "Balance of $output reached in $minutes min $seconds s, killing process" + +echo killing "$PROGRAM" +sudo pkill "$PROGRAM" + +while pgrep -l "perf" >/dev/null; do + echo "perf still alive, waiting for it to exit..." + sleep 10 +done +echo "perf exited" + +# We need this for the following job, to add to the static page +echo "time=$minutes minutes $seconds seconds" >>"$GITHUB_OUTPUT" diff --git a/.github/scripts/publish_link_flamegraphs.sh b/.github/scripts/publish_link_flamegraphs.sh new file mode 100644 index 0000000000..32938ecd84 --- /dev/null +++ b/.github/scripts/publish_link_flamegraphs.sh @@ -0,0 +1,25 @@ +curl -XPOST -H "Content-type: application/json" -d '{ + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "🔥 Daily Flamegraph Report" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Flamegraphs are available at **\n + • **\n + • **\n" + } + }, + ], + "unfurl_links": true, + "unfurl_media": true +}' "$1" diff --git a/.github/workflows/daily_reports.yaml b/.github/workflows/daily_reports.yaml index 29a2bc881e..74611c2a7c 100644 --- a/.github/workflows/daily_reports.yaml +++ b/.github/workflows/daily_reports.yaml @@ -198,3 +198,24 @@ jobs: || secrets.LEVM_SLACK_WEBHOOK }} run: sh .github/scripts/publish_levm_ef_tests.sh "$SLACK_WEBHOOK" + + flamegraphs-page: + name: Post to Slack link to Flamegraphs Page + runs-on: ubuntu-latest + steps: + - name: Post message to slack + env: + SLACK_WEBHOOKS: > + ${{ github.event_name == 'workflow_dispatch' + && secrets.TEST_CHANNEL_SLACK + || format( + '{0} {1} {2}', + secrets.ETHREX_L1_SLACK_WEBHOOK, + secrets.ETHREX_L2_SLACK_WEBHOOK, + secrets.LEVM_SLACK_WEBHOOK + ) + }} + run: | + for webhook in $SLACK_WEBHOOKS; do + sh .github/scripts/publish_link_flamegraphs.sh "$webhook" + done diff --git a/.github/workflows/flamegraph_reporter.yaml b/.github/workflows/flamegraph_reporter.yaml new file mode 100644 index 0000000000..3a530e4763 --- /dev/null +++ b/.github/workflows/flamegraph_reporter.yaml @@ -0,0 +1,320 @@ +name: Flamegraph Reporter + +permissions: + contents: read + pages: write + id-token: write + +on: + push: + branches: [ "main", "automate-perf-tests" ] + workflow_dispatch: + +env: + RUST_VERSION: 1.84.0 + RUST_RETH_VERSION: 1.84.0 + +jobs: + flamegraph-ethrex: + name: Generate Flamegraph for Ethrex + runs-on: ubuntu-latest + env: + PROGRAM: ethrex + outputs: + time: ${{steps.generate-flamegraph-ethrex.outputs.time}} + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - name: Rustup toolchain install + uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{ env.RUST_VERSION }} + + - name: Caching + uses: Swatinem/rust-cache@v2 + + - name: Cache Extra Binaries + id: cache-binaries + uses: actions/cache@v4 + with: + path: | + ${{ env.HOME }}/.cargo/bin/addr2line + ${{ env.HOME }}/.cargo/bin/flamegraph + ${{ env.HOME }}/.cargo/bin/inferno-* + key: ${{ runner.os }}-${{ env.RUST_VERSION }}-extra-binaries + + - name: Cache ethrex_l2 + id: cache-ethrex-l2 + uses: actions/cache@v4 + with: + path: ${{ env.HOME }}/.cargo/bin/ethrex_l2 + key: ${{ runner.os }}-${{ env.RUST_VERSION }}-ethrex-l2-${{ hashFiles('cmd/ethrex_l2/Cargo.lock') }} + + - name: Change perf settings + run: | + sudo sysctl kernel.perf_event_paranoid=-1 + sudo sysctl -w kernel.kptr_restrict=0 + sudo chmod +r /proc/kallsyms + sudo perf list hw + + - name: Check addr2line installation + id: check-addr2line + run: | + if [ -f "$HOME/.cargo/bin/addr2line" ]; then + echo "$HOME/.cargo/bin/addr2line found" + echo "addr2line_exists=true" >> $GITHUB_OUTPUT + else + echo "$HOME/.cargo/bin/addr2line NOT found" + echo "addr2line_exists=false" >> $GITHUB_OUTPUT + fi + + - name: Checkout gimli addr2line + if: steps.check-addr2line.outputs.addr2line_exists != 'true' + uses: actions/checkout@v4 + with: + repository: gimli-rs/addr2line + path: "addr2line" + + - name: Build gimli addr2line + if: steps.check-addr2line.outputs.addr2line_exists != 'true' + working-directory: ./addr2line + run: | + # Little hack we need else it throws error building + echo "[workspace]" >> ./Cargo.toml + cargo install --force --features="bin" addr2line + + - name: Install flamegraph + run: | + if [ ! -f "$HOME/.cargo/bin/flamegraph" ]; then + cargo install --force flamegraph + else + echo "$HOME/.cargo/bin/flamegraph" already found + fi + if [ ! -f "$HOME/.cargo/bin/inferno-collapse-perf" ]; then + cargo install --force inferno + else + echo "$HOME/.cargo/bin/inferno-collapse-perf" already found + fi + + - name: Install ethrex_l2 cli + run: | + if [ -f "$HOME/.cargo/bin/ethrex_l2" ]; then + echo "$HOME/.cargo/bin/ethrex_l2" already found + else + cargo install --force --path cmd/ethrex_l2 + fi + ethrex_l2 config create default --default + ethrex_l2 config set default + + - id: generate-flamegraph-ethrex + name: Generate Flamegraph data for Ethrex + shell: bash + run: | + rm -rf target/release/ethrex + CARGO_PROFILE_RELEASE_DEBUG=true cargo flamegraph -c "record -o perf.data -F997 --call-graph dwarf,16384 -g" \ + --bin ethrex --features dev -- --network /home/runner/work/ethrex/ethrex/test_data/genesis-l2.json --http.port 1729 >/dev/null & + while [ ! -x "./target/release/ethrex" ]; do + echo "Waiting for ethrex binary to be ready..." + sleep 2 + done + sleep 10 + echo "Compilation finished. Executing load test..." + bash /home/runner/work/ethrex/ethrex/.github/scripts/flamegraph_watcher.sh && + echo "Load test finished" + + - name: Generate SVG + shell: bash + run: | + PATH=$HOME/.cargo/bin:$PATH which addr2line + PATH=$HOME/.cargo/bin:$PATH perf script -v -i /home/runner/work/ethrex/ethrex/perf.data --no-inline > stack.data + PATH=$HOME/.cargo/bin:$PATH inferno-collapse-perf -q < stack.data > collapsed.data + PATH=$HOME/.cargo/bin:$PATH inferno-flamegraph --title "Ethrex Flamegraph" < collapsed.data > flamegraph_ethrex.svg + + - name: Upload artifacts - flamegraph_ethrex.svg + uses: actions/upload-artifact@v4 + with: + name: flamegraph_ethrex.svg + path: ./flamegraph_ethrex.svg + + flamegraph-reth: + name: Generate Flamegraph for Reth + runs-on: ubuntu-latest + env: + PROGRAM: reth + outputs: + time: ${{steps.generate-flamegraph-reth.outputs.time}} + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - name: Rustup toolchain install + uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{ env.RUST_RETH_VERSION }} + + - name: Checkout reth + uses: actions/checkout@v4 + with: + repository: paradigmxyz/reth + path: "reth" + ref: main + + - name: Caching + uses: Swatinem/rust-cache@v2 + with: + workspaces: '. -> target + ./reth -> ./reth/target' + + - name: Cache Extra Binaries + id: cache-binaries + uses: actions/cache@v4 + with: + path: | + ${{ env.HOME }}/.cargo/bin/addr2line + ${{ env.HOME }}/.cargo/bin/flamegraph + ${{ env.HOME }}/.cargo/bin/inferno-* + key: ${{ runner.os }}-${{ env.RUST_VERSION }}-extra-binaries + + - name: Cache ethrex_l2 + id: cache-ethrex-l2 + uses: actions/cache@v4 + with: + path: ${{ env.HOME }}/.cargo/bin/ethrex_l2 + key: ${{ runner.os }}-${{ env.RUST_VERSION }}-ethrex-l2-${{ hashFiles('cmd/ethrex_l2/Cargo.lock') }} + + - name: Change perf settings + run: | + sudo sysctl kernel.perf_event_paranoid=-1 + sudo sysctl -w kernel.kptr_restrict=0 + sudo chmod +r /proc/kallsyms + sudo perf list hw + + - name: Check addr2line installation + id: check-addr2line + run: | + if [ -f "$HOME/.cargo/bin/addr2line" ]; then + echo "$HOME/.cargo/bin/addr2line found" + echo "addr2line_exists=true" >> $GITHUB_OUTPUT + else + echo "$HOME/.cargo/bin/addr2line NOT found" + echo "addr2line_exists=false" >> $GITHUB_OUTPUT + fi + + - name: Checkout gimli addr2line + if: steps.check-addr2line.outputs.addr2line_exists != 'true' + uses: actions/checkout@v4 + with: + repository: gimli-rs/addr2line + path: "addr2line" + + - name: Build gimli addr2line + if: steps.check-addr2line.outputs.addr2line_exists != 'true' + working-directory: ./addr2line + run: | + # Little hack we need else it throws error building + echo "[workspace]" >> ./Cargo.toml + cargo install --force --features="bin" addr2line + + - name: Install flamegraph + run: | + if [ ! -f "$HOME/.cargo/bin/flamegraph" ]; then + cargo install --force flamegraph + else + echo "$HOME/.cargo/bin/flamegraph" already found + fi + if [ ! -f "$HOME/.cargo/bin/inferno-collapse-perf" ]; then + cargo install --force inferno + else + echo "$HOME/.cargo/bin/inferno-collapse-perf" already found + fi + + - name: Install ethrex_l2 cli + run: | + if [ -f "$HOME/.cargo/bin/ethrex_l2" ]; then + echo "$HOME/.cargo/bin/ethrex_l2" already found + else + cargo install --force --path cmd/ethrex_l2 + fi + ethrex_l2 config create default --default + ethrex_l2 config set default + + - id: generate-flamegraph-reth + name: Build and test reth + shell: bash + # --dev.block-time 1000ms set to 1000ms to match ethrex block generation time + run: | + cd ./reth + rm -rf target/profiling/reth + CARGO_PROFILE_RELEASE_DEBUG=true cargo flamegraph -c "record -o perf.data -F997 --call-graph dwarf,16384 -g" \ + --bin reth --profile profiling -- node --chain /home/runner/work/ethrex/ethrex/test_data/genesis-load-test.json --dev \ + --dev.block-time 1000ms --http.port 1729 --txpool.max-pending-txns 100000000 --txpool.max-new-txns 1000000000 \ + --txpool.pending-max-count 100000000 --txpool.pending-max-size 10000000000 --txpool.basefee-max-count 100000000000 \ + --txpool.basefee-max-size 1000000000000 --txpool.queued-max-count 1000000000 >/dev/null & + while [ ! -x "./target/profiling/reth" ]; do + echo "Waiting for reth binary to be ready..." + sleep 10 + done + sleep 30 + echo "Executing load test..." + bash /home/runner/work/ethrex/ethrex/.github/scripts/flamegraph_watcher.sh && + echo "Load test finished" + + + - name: Generate SVG + shell: bash + run: | + PATH=$HOME/.cargo/bin:$PATH which addr2line + PATH=$HOME/.cargo/bin:$PATH perf script -v -i /home/runner/work/ethrex/ethrex/reth/perf.data --no-inline > stack.data + PATH=$HOME/.cargo/bin:$PATH inferno-collapse-perf -q < stack.data > collapsed.data + PATH=$HOME/.cargo/bin:$PATH inferno-flamegraph --title "Reth Flamegraph" < collapsed.data > flamegraph_reth.svg + + - name: Upload artifacts - flamegraph_reth.svg + uses: actions/upload-artifact@v4 + with: + name: flamegraph_reth.svg + path: ./flamegraph_reth.svg + + upload-static-page: + name: Upload artifacts for static page + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: [ flamegraph-ethrex, flamegraph-reth ] + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - name: Download ethrex flamegraph artifact + uses: actions/download-artifact@v4 + with: + name: flamegraph_ethrex.svg + path: flamegraph_ethrex.svg + + - name: Download reth flamegraph artifact + uses: actions/download-artifact@v4 + with: + name: flamegraph_reth.svg + path: flamegraph_reth.svg + + - name: Update static page locally with new data + shell: bash + run: | + cp -r flamegraph_ethrex.svg pages/ + cp -r flamegraph_reth.svg pages/ + sed -i "s/{{LAST_UPDATE}}/$(TZ='Etc/GMT+3' date +'%Y-%m-%dT%H:%M:%S')/g" pages/index.html + sed -i "s/{{ETHREX_TIME}}/${{ needs.flamegraph-ethrex.outputs.time }}/g" pages/index.html + sed -i "s/{{RETH_TIME}}/${{ needs.flamegraph-reth.outputs.time }}/g" pages/index.html + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: "pages/" + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 1c4f9e2d58..bd7771a7c8 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ ethereum-package/ **/.DS_Store **/.vscode +**/.idea # EVM Mlir stuff diff --git a/Makefile b/Makefile index aef4dabb12..e842eaae6b 100644 --- a/Makefile +++ b/Makefile @@ -196,3 +196,10 @@ load-node: install-cli ## 🚧 Runs a load-test. Run make start-node-with-flameg rm-test-db: ## 🛑 Removes the DB used by the ethrex client used for testing sudo cargo run --release --bin ethrex -- removedb --datadir test_ethrex + +flamegraph: + sudo -E CARGO_PROFILE_RELEASE_DEBUG=true cargo flamegraph --bin ethrex --features dev -- --network test_data/genesis-l2.json --http.port 1729 >/dev/null & + bash scripts/flamegraph.sh + +test-load: + ethrex_l2 test load --path ./test_data/private_keys.txt -i 1000 -v --value 10000000 --to 0xFCbaC0713ACf16708aB6BC977227041FA1BC618D diff --git a/cmd/ethrex_l2/src/commands/config.rs b/cmd/ethrex_l2/src/commands/config.rs index abe1f7cdf6..28f7e80b4c 100644 --- a/cmd/ethrex_l2/src/commands/config.rs +++ b/cmd/ethrex_l2/src/commands/config.rs @@ -1,3 +1,4 @@ +use crate::utils::config::default_config; use crate::utils::{ config::{ config_file_names, config_path, config_path_interactive_selection, confirm, @@ -28,7 +29,11 @@ pub(crate) enum Command { opts: Box, }, #[clap(about = "Create a new config.")] - Create { config_name: String }, + Create { + config_name: String, + #[arg(long = "default", required = false)] + default: bool, + }, #[clap(about = "Set the config to use.")] Set { #[arg( @@ -99,7 +104,7 @@ impl Command { let (new_config, config_path) = if let Some(ref config_name) = config_name { let config_path = config_path(config_name)?; if !config_path.exists() { - return confirm_config_creation(config_name.clone()).await; + return confirm_config_creation(config_name.clone(), false).await; } let new_config = if opts.is_empty() { edit_config_by_name_interactively(&config_path)? @@ -117,7 +122,10 @@ impl Command { } set_new_config(config_path.clone(), show).await?; } - Command::Create { config_name } => { + Command::Create { + config_name, + default, + } => { let config_path = config_path(&config_name)?; if config_path.exists() { let override_confirmation = confirm(CONFIG_OVERRIDE_PROMPT_MSG)?; @@ -126,7 +134,11 @@ impl Command { return Ok::<(), eyre::Error>(()); } } - let config = prompt_config()?; + let config = if default { + default_config()? + } else { + prompt_config()? + }; let toml_config = toml::to_string_pretty(&config)?; println!( "Config created at: {}\n{toml_config}", @@ -138,7 +150,7 @@ impl Command { let config_path_to_select = if let Some(config_name) = config_name { let config_path_to_select = config_path(&config_name)?; if !config_path_to_select.exists() { - return confirm_config_creation(config_name).await; + return confirm_config_creation(config_name, false).await; } config_path_to_select } else { @@ -154,7 +166,7 @@ impl Command { let config_to_display_path = if let Some(config_name) = config_name { let config_to_display_path = config_path(&config_name)?; if !config_to_display_path.exists() { - return confirm_config_creation(config_name).await; + return confirm_config_creation(config_name, false).await; } config_to_display_path } else { diff --git a/cmd/ethrex_l2/src/commands/info.rs b/cmd/ethrex_l2/src/commands/info.rs index d88e86a6ad..538a9836d5 100644 --- a/cmd/ethrex_l2/src/commands/info.rs +++ b/cmd/ethrex_l2/src/commands/info.rs @@ -1,6 +1,7 @@ -use crate::config::EthrexL2Config; +use crate::{commands::wallet::balance_in_wei, config::EthrexL2Config}; use clap::Subcommand; use colored::{self, Colorize}; +use ethrex_core::Address; use ethrex_l2_sdk::eth_client::EthClient; use keccak_hash::H256; use std::str::FromStr; @@ -12,7 +13,7 @@ pub(crate) enum Command { short_flag = 'l' )] LatestBlocks, - #[clap(about = "Get the current block_number.", short_flag = 'b')] + #[clap(about = "Get the current block_number.", alias = "bl")] BlockNumber { #[arg(long = "l2", required = false)] l2: bool, @@ -28,6 +29,17 @@ pub(crate) enum Command { #[arg(short = 'h', required = true)] tx_hash: String, }, + #[clap(about = "Get the account's balance info.", short_flag = 'b')] + Balance { + #[arg(long = "l2", required = false)] + l2: bool, + #[arg(long = "l1", required = false)] + l1: bool, + #[arg(short = 'a', required = true)] + account: Address, + #[arg(long = "wei", required = false, default_value_t = false)] + wei: bool, + }, } impl Command { @@ -89,6 +101,22 @@ impl Command { println!("[L1]:\n{tx}"); } } + + Command::Balance { + l2, + l1, + wei, + account, + } => { + if !l1 || l2 { + let account_balance = rollup_client.get_balance(account).await?; + println!("{}", balance_in_wei(wei, account_balance)); + } + if l1 { + let account_balance = eth_client.get_balance(account).await?; + println!("{}", balance_in_wei(wei, account_balance)); + } + } } Ok(()) } diff --git a/cmd/ethrex_l2/src/commands/test.rs b/cmd/ethrex_l2/src/commands/test.rs index 458313c485..52f987caf2 100644 --- a/cmd/ethrex_l2/src/commands/test.rs +++ b/cmd/ethrex_l2/src/commands/test.rs @@ -134,6 +134,25 @@ async fn transfer_from( retries } +async fn test_connection(cfg: EthrexL2Config) -> bool { + let client = EthClient::new(&cfg.network.l2_rpc_url); + let mut retries = 0; + while retries < 50 { + match client.get_chain_id().await { + Ok(_) => { + return true; + } + Err(err) => { + println!("Connection to server failed: {err}, retrying ({retries}/50)"); + retries += 1; + sleep(std::time::Duration::from_secs(30)); + } + } + } + println!("Failed to establish connection to the server"); + false +} + impl Command { pub async fn run(self, cfg: EthrexL2Config) -> eyre::Result<()> { match self { @@ -145,61 +164,68 @@ impl Command { verbose, contract, } => { - if let Ok(lines) = read_lines(path) { - let mut to_address = match to { - Some(address) => address, - None => Address::random(), - }; - let calldata: Bytes = if contract { - // This is the bytecode for the contract with the following functions - // version() -> always returns 2 - // function fibonacci(uint n) public pure returns (uint) -> returns the nth fib number - let init_code = hex::decode("6080604052348015600e575f5ffd5b506103198061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c806354fd4d501461003857806361047ff414610056575b5f5ffd5b610040610086565b60405161004d9190610152565b60405180910390f35b610070600480360381019061006b9190610199565b61008b565b60405161007d9190610152565b60405180910390f35b600281565b5f5f8210156100cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c69061021e565b60405180910390fd5b5f82036100de575f9050610135565b600182036100ef5760019050610135565b5f5f90505f600190505f600290505b84811161012e575f82905083836101159190610269565b92508093505080806101269061029c565b9150506100fe565b5080925050505b919050565b5f819050919050565b61014c8161013a565b82525050565b5f6020820190506101655f830184610143565b92915050565b5f5ffd5b6101788161013a565b8114610182575f5ffd5b50565b5f813590506101938161016f565b92915050565b5f602082840312156101ae576101ad61016b565b5b5f6101bb84828501610185565b91505092915050565b5f82825260208201905092915050565b7f496e707574206d757374206265206e6f6e2d6e656761746976650000000000005f82015250565b5f610208601a836101c4565b9150610213826101d4565b602082019050919050565b5f6020820190508181035f830152610235816101fc565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6102738261013a565b915061027e8361013a565b92508282019050808211156102965761029561023c565b5b92915050565b5f6102a68261013a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036102d8576102d761023c565b5b60018201905091905056fea264697066735822122021e2c2b56b7e23b9555cc95390dfb2979a8526595038818d133d5bb772c01a6564736f6c634300081c0033")?; - let client = EthClient::new(&cfg.network.l2_rpc_url); - - let (_, contract_address) = client - .deploy( - cfg.wallet.address, - cfg.wallet.private_key, - init_code.into(), - Overrides::default(), - ) - .await?; - - to_address = contract_address; - - calldata::encode_calldata( - "fibonacci(uint256)", - &[Value::Uint(100000000000000_u64.into())], - )? - .into() - } else { - Bytes::new() - }; - - println!("Sending to: {to_address:#x}"); - - let mut threads = vec![]; - for pk in lines.map_while(Result::ok) { - let thread = tokio::spawn(transfer_from( - pk, - to_address, - value, - iterations, - verbose, - calldata.clone(), - cfg.clone(), - )); - threads.push(thread); - } - - let mut retries = 0; - for thread in threads { - retries += thread.await?; - } - - println!("Total retries: {retries}"); + let Ok(lines) = read_lines(path) else { + return Ok(()); + }; + if !test_connection(cfg.clone()).await { + println!("Test failed to establish connection to server"); + return Ok(()); + } + + let mut to_address = match to { + Some(address) => address, + None => Address::random(), + }; + + let calldata: Bytes = if contract { + // This is the bytecode for the contract with the following functions + // version() -> always returns 2 + // function fibonacci(uint n) public pure returns (uint) -> returns the nth fib number + let init_code = hex::decode("6080604052348015600e575f5ffd5b506103198061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c806354fd4d501461003857806361047ff414610056575b5f5ffd5b610040610086565b60405161004d9190610152565b60405180910390f35b610070600480360381019061006b9190610199565b61008b565b60405161007d9190610152565b60405180910390f35b600281565b5f5f8210156100cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c69061021e565b60405180910390fd5b5f82036100de575f9050610135565b600182036100ef5760019050610135565b5f5f90505f600190505f600290505b84811161012e575f82905083836101159190610269565b92508093505080806101269061029c565b9150506100fe565b5080925050505b919050565b5f819050919050565b61014c8161013a565b82525050565b5f6020820190506101655f830184610143565b92915050565b5f5ffd5b6101788161013a565b8114610182575f5ffd5b50565b5f813590506101938161016f565b92915050565b5f602082840312156101ae576101ad61016b565b5b5f6101bb84828501610185565b91505092915050565b5f82825260208201905092915050565b7f496e707574206d757374206265206e6f6e2d6e656761746976650000000000005f82015250565b5f610208601a836101c4565b9150610213826101d4565b602082019050919050565b5f6020820190508181035f830152610235816101fc565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6102738261013a565b915061027e8361013a565b92508282019050808211156102965761029561023c565b5b92915050565b5f6102a68261013a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036102d8576102d761023c565b5b60018201905091905056fea264697066735822122021e2c2b56b7e23b9555cc95390dfb2979a8526595038818d133d5bb772c01a6564736f6c634300081c0033")?; + let client = EthClient::new(&cfg.network.l2_rpc_url); + + let (_, contract_address) = client + .deploy( + cfg.wallet.address, + cfg.wallet.private_key, + init_code.into(), + Overrides::default(), + ) + .await?; + + to_address = contract_address; + + calldata::encode_calldata( + "fibonacci(uint256)", + &[Value::Uint(100000000000000_u64.into())], + )? + .into() + } else { + Bytes::new() + }; + + println!("Sending to: {to_address:#x}"); + + let mut threads = vec![]; + for pk in lines.map_while(Result::ok) { + let thread = tokio::spawn(transfer_from( + pk, + to_address, + value, + iterations, + verbose, + calldata.clone(), + cfg.clone(), + )); + threads.push(thread); } + + let mut retries = 0; + for thread in threads { + retries += thread.await?; + } + + println!("Total retries: {retries}"); Ok(()) } } diff --git a/cmd/ethrex_l2/src/commands/wallet.rs b/cmd/ethrex_l2/src/commands/wallet.rs index 67b8f98105..35e6eaf4a4 100644 --- a/cmd/ethrex_l2/src/commands/wallet.rs +++ b/cmd/ethrex_l2/src/commands/wallet.rs @@ -24,6 +24,8 @@ pub(crate) enum Command { l2: bool, #[arg(long = "l1", required = false)] l1: bool, + #[arg(long = "wei", required = false, default_value_t = false)] + wei: bool, }, #[clap(about = "Deposit funds into some wallet.")] Deposit { @@ -265,17 +267,24 @@ impl Command { token_address, l2, l1, + wei, } => { if token_address.is_some() { todo!("Handle ERC20 balances") } if !l1 || l2 { let account_balance = rollup_client.get_balance(from).await?; - println!("[L2] Account balance: {account_balance}"); + println!( + "[L2] Account balance: {}", + balance_in_wei(wei, account_balance) + ); } if l1 { let account_balance = eth_client.get_balance(from).await?; - println!("[L1] Account balance: {account_balance}"); + println!( + "[L1] Account balance: {}", + balance_in_wei(wei, account_balance) + ); } } Command::Deposit { @@ -605,3 +614,65 @@ pub async fn wait_for_transaction_receipt(client: &EthClient, tx_hash: H256) -> println!("Transaction confirmed"); Ok(()) } + +pub fn balance_in_wei(wei: bool, balance: U256) -> String { + if wei { + format!("{balance}") + } else { + let mut balance = format!("{balance}"); + let len = balance.len(); + + balance = match len { + 18 => { + let mut front = "0.".to_owned(); + front.push_str(&balance); + front + } + 0..=17 => { + let mut front = "0.".to_owned(); + let zeros = "0".repeat(18 - len); + front.push_str(&zeros); + front.push_str(&balance); + front + } + 19.. => { + balance.insert(len - 18, '.'); + balance + } + }; + balance + } +} + +#[test] +fn test_balance_in_ether() { + // test more than 1 ether + assert_eq!( + "999999999.999003869993631450", + balance_in_wei( + false, + U256::from_dec_str("999999999999003869993631450").unwrap() + ) + ); + + // test 0.5 + assert_eq!( + "0.509003869993631450", + balance_in_wei( + false, + U256::from_dec_str("000000000509003869993631450").unwrap() + ) + ); + + // test 0.005 + assert_eq!( + "0.005090038699936314", + balance_in_wei( + false, + U256::from_dec_str("000000000005090038699936314").unwrap() + ) + ); + + // test 0.0 + assert_eq!("0.000000000000000000", balance_in_wei(false, U256::zero())); +} diff --git a/cmd/ethrex_l2/src/config.rs b/cmd/ethrex_l2/src/config.rs index 9aa553fa6f..78a77b75c1 100644 --- a/cmd/ethrex_l2/src/config.rs +++ b/cmd/ethrex_l2/src/config.rs @@ -71,9 +71,12 @@ pub async fn load_selected_config() -> eyre::Result { DEFAULT_CONFIG_NAME.to_owned(), )? .to_owned(); - commands::config::Command::Create { config_name } - .run() - .await?; + commands::config::Command::Create { + config_name, + default: false, + } + .run() + .await?; } } let config = std::fs::read_to_string(config_path).context("Failed to read config file")?; diff --git a/cmd/ethrex_l2/src/utils/config/mod.rs b/cmd/ethrex_l2/src/utils/config/mod.rs index 5c405db541..7a75d244ee 100644 --- a/cmd/ethrex_l2/src/utils/config/mod.rs +++ b/cmd/ethrex_l2/src/utils/config/mod.rs @@ -135,13 +135,46 @@ pub fn prompt_config() -> eyre::Result { Ok(prompted_config) } -pub async fn confirm_config_creation(config_name: String) -> eyre::Result<()> { +pub fn default_config() -> eyre::Result { + let prompted_config = EthrexL2Config { + network: NetworkConfig { + l1_rpc_url: DEFAULT_L1_RPC_URL.into(), + l1_chain_id: DEFAULT_L1_CHAIN_ID, + l2_rpc_url: DEFAULT_L2_RPC_URL.into(), + l2_chain_id: DEFAULT_L2_CHAIN_ID, + l2_explorer_url: DEFAULT_L2_EXPLORER_URL.into(), + l1_explorer_url: DEFAULT_L1_EXPLORER_URL.into(), + }, + wallet: WalletConfig { + private_key: { + let prompted_private_key = format!( + "0x{}", + hex::encode( + SecretKey::from_slice(DEFAULT_PRIVATE_KEY.as_bytes())?.secret_bytes(), + ) + ); + SecretKey::from_slice(H256::from_str(&prompted_private_key[2..])?.as_fixed_bytes())? + }, + address: DEFAULT_ADDRESS, + }, + contracts: ContractsConfig { + common_bridge: DEFAULT_CONTRACTS_COMMON_BRIDGE_ADDRESS, + on_chain_proposer: DEFAULT_CONTRACTS_ON_CHAIN_PROPOSER_ADDRESS, + }, + }; + Ok(prompted_config) +} + +pub async fn confirm_config_creation(config_name: String, default: bool) -> eyre::Result<()> { let create_confirmation = confirm(CONFIG_CREATE_PROMPT_MSG)?; if create_confirmation { Box::pin(async { - commands::config::Command::Create { config_name } - .run() - .await + commands::config::Command::Create { + config_name, + default, + } + .run() + .await }) .await } else { diff --git a/pages/index.html b/pages/index.html new file mode 100644 index 0000000000..df69995c16 --- /dev/null +++ b/pages/index.html @@ -0,0 +1,79 @@ + + + + + + Ethrex Flamegraph Comparison + + + + + + + + + + + + +
+

Ethrex Flamegraph Comparison

+

Last update: {{LAST_UPDATE}}

+
+
+
+
+

Ethrex

+ Download +
+

Time elapsed: {{ETHREX_TIME}}

+
+ +
+
+
+
+

Reth

+ + Download +
+

Time elapsed: {{RETH_TIME}}

+
+ +
+
+
+ + + + diff --git a/pages/style.css b/pages/style.css new file mode 100644 index 0000000000..7e6dc8d295 --- /dev/null +++ b/pages/style.css @@ -0,0 +1,87 @@ +body { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + min-height: 100vh; + margin: 0; + font-family: Arial, sans-serif; + background-color: #f9f9f9; +} + +header { + text-align: center; + margin-bottom: 1.5em; +} + +h1 { + margin-bottom: 0; +} + +.last-updated { + margin-top: 0.5em; + font-weight: lighter; + color: dimgray; +} + +.container { + display: flex; + gap: 10px; + width: 90%; +} + +.column { + flex: 1; + text-align: center; + background: #fff; + border: 1px solid #ddd; + border-radius: 8px; + padding: 10px 5px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + height: 80vh; +} + +img { + width: 80%; + height: auto; + max-width: 200px; + max-height: 150px; +} + +h2 { + margin-bottom: 5px; + font-size: 1.5rem; +} + +.col-header { + margin-bottom: 2em; +} + +.time-elapsed { + font-size: 0.9em; + margin-bottom: 0.8em; +} + +.object-container { + position: relative; + width: 100%; + height: 100%; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; +} + +object { + width: 100%; + height: 100%; + max-height: 100%; + max-width: 100%; + object-fit: contain; + border: 1px solid #ccc; + border-radius: 4px; +} diff --git a/scripts/flamegraph.sh b/scripts/flamegraph.sh new file mode 100644 index 0000000000..fa1d1fe4d8 --- /dev/null +++ b/scripts/flamegraph.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# This script sends 171 * transactions to a test account, per defined private key +# then polls the account balance until the expected balance has been reached +# and then kills the process. It also measures the elapsed time of the test and +# outputs it to Github Action's outputs. +iterations=3500 +value=1 +account=0x33c6b73432B3aeA0C1725E415CC40D04908B85fd +end_val=$((171 * $iterations * $value)) + +start_time=$(date +%s) +ethrex_l2 test load --path ./test_data/private_keys.txt -i $iterations -v --value $value --to $account >/dev/null + +output=$(ethrex_l2 info -b -a $account --wei 2>&1) + +while [[ $output -lt $end_val ]]; do + sleep 5 + output=$(ethrex_l2 info -b -a $account --wei 2>&1) +done +end_time=$(date +%s) + +elapsed=$((end_time - start_time)) + +minutes=$((elapsed / 60)) +seconds=$((elapsed % 60)) +output=$(ethrex_l2 info -b -a $account --wei 2>&1) +echo "Balance of $output reached in $minutes min $seconds s, killing process" + +sudo pkill ethrex +spinner=( '/' '-' '\' '|' ) + +while pgrep -l "perf" >/dev/null; do + for s in "${spinner[@]}"; do + printf "\rWaiting for $PROGRAM to exit $s" + sleep 0.1 + done + sleep 0.6 +done + +echo "The Flamegraph should have been generated." diff --git a/test_data/genesis-load-test.json b/test_data/genesis-load-test.json index 733ab3ba7b..3b8476ead7 100644 --- a/test_data/genesis-load-test.json +++ b/test_data/genesis-load-test.json @@ -1,561 +1,565 @@ { - "config": { - "chainId": 1729, - "homesteadBlock": 0, - "eip150Block": 0, - "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "eip155Block": 0, - "eip158Block": 0, - "daoForkBlock": 0, - "frontierBlock": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, - "petersburgBlock": 0, - "muirGlacierBlock": 0, - "istanbulBlock": 0, - "berlinBlock": 0, - "londonBlock": 0, - "terminalTotalDifficulty": "0x0", - "mergeNetsplitBlock": 0, - "shanghaiTime": 0, - "cancunTime": 0, - "clique": { - "period": 0, - "epoch": 30000 - } - }, - "nonce": "0x0", - "timestamp": "0x5ca9158b", - "gasLimit": "0x37e11d600", - "difficulty": "0x0", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "0x0000bd19F707CA481886244bDd20Bd6B8a81bd3e": { - "balance": "0xc097ce7bc90715b34b9f1000000000", - "nonce": "0" - }, - "0x000cD1537A823Ae7609E3897DA8d95801B557a8a": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0006d77295a0260ceAC113c5Aa15CFf0d28d9723": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000eA2e72065A2ceCA7f677Bc5E648279c2D843d": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000a52D537c4150ec274dcE3962a0d179B7E71B0": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0009aEFF154De37C8e02E83f93D2FeC5EC96f8a3": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000f1EB7F258D4A7683E5D0FC3C01058841DDC6f": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000aC79590dCc656c00c4453f123AcBf10DBb086": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0002Bf507275217c9E5EE250bC1B5ca177bb4f74": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000a3fC3BFD55b37025E6F4f57B0B6121F54e5bF": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000b4C43cce938dfD3420F975591Ee46D872C136": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0004b0C6de796fD980554cc7ff7B062b3B5079E1": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00025eea83bA285532F5054b238c938076833d13": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000352E93fe11f9B715fdc61864315970B3DC082": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000c0d6b7C4516a5B274C51EA331A9410fe69127": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000D06C23EeD09A7Fa81cADd7eD5C783E8a25635": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0003Ea7fDFCdb89E9ddAb0128ec5C628F8D09D45": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0005C34d7B8b06CE8019C3Bb232dE82B2748A560": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00079f33619F70F1DCE64EB6782E45D3498d807C": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0003E72436Ff296B3d39339784499D021b72Aca5": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00075af7E665F3Ca4A4b05520CD6d5c13BbFEAf8": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000b59AeD48ADCd6c36Ae5f437AbB9CA730a2c43": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0004e4dfCed9d798767A4d7BA2B03495cE80A2b7": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000e73282F60E2CdE0D4FA9B323B6D54d860f330": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00010AB05661Bfde304A4d884DF99d3011A83C54": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000B9Ea41A9dF00b7ae597afc0D10AF42666081F": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00087C666bf7f52758DE186570979C4C79747157": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0008a52c83D34f0791D07FfeD04Fb6b14f94E2D4": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000A7Bbde38Fc53925D0De9cc1beE3038d36c2d2": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000Aa0154ed6560257d222B5dbE6ce4b66c48979": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000b681738e1f8aF387c41b2b1f0A04E0C33e9DB": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000D66A7706f2DD5F557d5b68e01E07E8FFDfaf5": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00069DA530A71Dc92D02090d7f5f63e326e9beD0": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000db74a3da16609F183ACE7AF65B43D896349CE": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0003B1aB565508e095a543C89531e3fbc4a349DA": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0001c94c108BcE19CDb36b00F867A1798A81DedA": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000995137728C7C2a9142F4628f95c98Cac433d7": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000Ec60762AD0425A04C40c118Db5B9710Aa639e": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000Ebf88AE1BA960B06b0a9bbE576baa3B72E92E": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000e1a554572dd96fF3d1F2664832F3E4a66E7b7": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00032C03f3b02D816128Fb5D2752398E2919a03c": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000A073dAC5ec2058a0De0e175874D5E297E086E": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000e06626Bb8618D9A1867362D46ddb1bF95ad75": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000212949b4866db43bAF7c4e0975426710ED081": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00094cc0653B52406170105F4eb96C5e2f31Ab74": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000E67E4b1A23A3826304099cb24f337c916CF4b": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000885A4932ebeD6D760EA381e4EdAe51A53db05": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000883A40409Fa2193b698928459CB9E4DD5f8D8": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0002590DD45738F909115B163F1322A8A24a8B4E": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0005f132597da3152a6Da6beDB7C10bcC9B1B7f5": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00031470def99c1d4dfE1fd08DD7A8520Ce21DB7": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0001Ebe3a3bA36f57F5989B3F0e5BEEBc710569C": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0006Bd0469166f63D0A1c33F71898D2b2E009b9b": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00000A8d3f37af8DeF18832962Ee008d8dCa4F7b": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000e490f26249951F8527779399aa8F281509aC0": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0000638374f7dB166990BDc6aBeE884Ee01a8920": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00031dE95353DeE86dc9B1248e825500DE0B39aF": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000511B42328794337D8b6846E5cFFef30c2d77A": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000d0576AdEf7083d53F6676bfc7c30d03b6Db1B": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0001E8Ff6406a7cd9071F46B8255Db6C16178448": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000C47c771A8db282eC233b28AD8525dc74D13FE": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000798832bb08268dB237898b95A8DaE9D58b62c": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000c877a5D9b9De61e5318B3f4330c56ecdC0865": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0003Ffc1f09d39FBFE87eD63E98249039C7b1d9A": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000d72403c18B2516d8ada074E1E7822bF1084DB": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00054e17Db8C8Db028B19cB0f631888AdEb35E4b": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0002d9b2a816717C4d70040D66A714795F9B27a4": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0002AfCC1B0B608E86b5a1Dc45dE08184E629796": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000b1db69627F04688aA47951d847c8BFAB3fFaE": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000c2de896E4a92e796d6A9c1E4B01feB3e6Ed61": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000EDC52118DadB4B81f013005b6db2665B682ac": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0009e10C0D2F1a7A2b00b61c476aa8b608c60aDc": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000f2AbaA7581fAA2ad5C82b604C77ef68c3eAD9": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000F74AA6EE08C15076b3576eE33Ed3a80c9A1AD": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0001533C6C5b425815b2BaDdCdd42DFF3be04BCb": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0002D79686DeF20a0aB43FEA4a41a1Ad56529621": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00077A336FCA40F933a7A301F4a39C26594F3EB5": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000B05E15C62CBC266A4DD1804b017d1f6dB078b": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000130badE00212bE1AA2F4aCFe965934635C9cD": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0008Bd31Ee6A758e168844cBEA107Ca4d87251aF": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000A390975F21371F1Cf3C783a4A7C1aF49074Fe": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000701F7d594Fb146e4d1c71342012e48A788055": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0005c6BeD054FEad199D72C6f663fC6fBf996153": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0009d862F87F26c638AAd14F2cc48FCa54DBf49d": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00029637dA962294449549f804f8184046F5fbB0": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000279CB54E00B858774afEA4601034Db41c1A05": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0003dDe6f01e3B755e24891a5B0f2463BaD83e15": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000086Eeea461Ca48e4D319F9789F3Efd134E574": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0004351AD413792131011CC7ed8299dd783C6487": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00097B4463159340Ac83B9bdf657C304cD70c11c": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0004ad0D0823e3d31C6ECA2A3495373fA76c43aC": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0005E815c1A3F40011Bd70C76062bbcBc51c546B": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0006A070bAC6195b59d4bC7f73741DCBe4e16b5e": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0006cEE23d8E9BC8d99E826cDa50481394aD9bDD": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000a523148845bEe3EE1e9F83df8257a1191C85B": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000D268F322F10925cdB5d2AD527E582259Da655": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000E5DE0a0175866d21F4Ec6c41F0422A05f14D6": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000cDF8Dba2393a40857cbCB0FCD9b998a941078": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000A341763112a5E3452c7AEE45c382a3fb7dc78": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000635BCbB109781Cea0Cd53e9f1370Dbac9937f": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000E0ea540095B3853c4cb09E5Cdd197330D3B55": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00044cbfb4Ef6054667994C37c0fe0B6BB639718": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00065fC4337dF331242bEE738031dAf35817Ee9e": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000815A8A659a51A8EF01F02441947Ea99182568": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0004C8da21c68dED2F63efD9836De7D43e7cDa10": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0006ed38815a9439c59bD917c12f77a9A7D39BCE": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0004Aa0442d0d43222431b3017912EC6a099771C": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000b3F6da04b6261B4154C8FaEd119632C49DBd5": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000AEBc2568796FDB763CAB67B31e0feE58Fe17d": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000425E97fC6692891876012824a210451cC06C4": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000036e0f87f8Cd3e97f9cfDB2e4E5Ff193c217a": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000305CD7184aB37fdd3D826B92A640218D09527": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000c95f1D83De53B76a0828F1bCdB1DfE12C0ab3": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000882c5FbD315801e4C367BCB04dBD299B9F571": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0000E101815A78EbB9FBBa34F4871aD32d5eb6CD": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000A997c1ceCB1DA78C16249e032e77d1865646a": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00056bde49E3cAA9166C2a4C4951d0Cf067956A0": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000e65342176C7dac47bc75113F569695d6A113C": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0008D608884cd733642ab17aCa0c8504850B94fA": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000dFE27e1b71a49B641ad762aB95558584878D1": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00085D9D1a71acf1080cED44CB501B350900627f": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0007d272a1f7Dfe862b030adE2922D149f3bDe3B": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0004b230511F921934F33E8B4425E43295232680": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0007514395022786B59ff91408692462C48d872c": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0005b34eB0d99dE72DB14d466f692009c4049D46": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0001a2c749FE0Ab1C09f1131BA17530f9D764fBC": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000c6c1D8F778D981968F9904772B0c455E1C17c": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000e64e0a2Fd76B4883c800833c82c5F2420b813": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000577bDc84B4019F77D9D09BDD8ED6145E0e890": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000029bD811D292E7f1CF36c0FA08fd753C45074": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000cE6740261E297FaD4c975D6D8F89f95C29add": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0001d0bAE8B1B9fe61d0B788E562A987813cbD98": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000E3388598A0534275104Ad44745620AF31EC7E": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000791D3185781e14eBb342E5df3BC9910f62E6F": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000Df55E76cf6dfD9598DD2b54948dE937f50f2B": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000055acf237931902ceBf4B905BF59813180555": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00009074D8fc5Eeb25f1548Df05AD955E21FB08D": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000C1aE5FeCf09595C0C76Db609FEB2a5Af0962E": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000F76B2Fe7cCC13474de28586A877664EBA16B4": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000F7cFBa0B176Afc2eBadA9d4764d2eA6BBC5a1": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00002132cE94eEfB06eB15898C1AABd94feb0AC2": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00069dC0cc6b9d7B48B5348b12F625E8aB704104": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000A0191cf913E03bd594bC8817FC3B2895C0a25": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0007316aEDc52EB35c9B5c2E44e9fD712d1DF887": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000EBd066B6FEBB9d7f3B767DF06C08e369Dc20F": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00096af89fd96f0d6E1721d9145944e813317d46": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000C5e39879228A1Fc8dF2470822CB8ce2Af8e07": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000ea86B4A3d7e4AF8CFab052c8b9a040149b507": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000796370C839773893a2cEFA5fc81f2332936fB": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000990B05481b1661bc6211298f6429451B09425": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0008a02d3E8507621f430345b98478058cDca79A": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000d35f8cd11bd989216b3669cBaac6fd8c07196": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000541653a96ABAdDba52fAA8D118e570d529543": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0006264bf7E3395309F728222641Ff8D0e1ad2C0": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000688AA0fBfB3F1e6554A63dF13bE08cB671b3b": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00030da862690D170F096074e9E8b38db7D6f037": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0005e37296348571bd3604f7E56B67a7022801f6": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000ed6E0F4Fdc3615663BF4A601E35e7A8d66E1c": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000c53b37fA4977B59FD3Efdb473D8069844aDeA": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00057714949aD700733C5b8E6cF3e8c6B7D228a2": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000C8FC4132881c31f67638c3941dF8D94a92299": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000fA71E446e1EcFd74d835b5bD6fA848A770d26": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000784B47aC2843419Df4cAd697d4e7b65CE1F93": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0002869e27c6FaEe08cCA6b765a726E7a076Ee0F": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0003135C47c441506b58483Ec6173F767182670B": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0006E80d584cbF9EB8C41CF2b009C607744a70F6": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000C1C05dBFf111c79D5c9E91420DFBEA1c31716": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0009Bf72AF31A4E6B8Ef6FbbFcb017823E4d2aF2": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x00021C20F3e68F930077Cca109Ca3C044E8B39bD": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000E90875aC71eD46A11dc1b509d2B35E2c9C31F": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x000f17eB09AA3f28132323E6075C672949526d5A": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x0000000000000000000000000000000000000000": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - }, - "0x3d1e15a1a55578f7c920884a9943b3b35d0d885b": { - "balance": "0xc097ce7bc90715b34b9f1000000000" - } - }, - "number": "0x0", - "gasUsed": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "baseFeePerGas": 1, - "excessBlobGas": "0x0", - "blobGasUsed": 0 + "config": { + "chainId": 1729, + "homesteadBlock": 0, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "eip158Block": 0, + "daoForkBlock": 0, + "frontierBlock": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "muirGlacierBlock": 0, + "istanbulBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "terminalTotalDifficulty": "0x0", + "mergeNetsplitBlock": 0, + "shanghaiTime": 0, + "cancunTime": 0, + "clique": { + "period": 0, + "epoch": 30000 + } + }, + "nonce": "0x0", + "timestamp": "0x5ca9158b", + "gasLimit": "0x8f0d180", + "difficulty": "0x0", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "0x0007a881CD95B1484fca47615B64803dad620C8d": { + "balance": "0xc097ce7bc90715b34b9f1000000000", + "nonce": "0" + }, + "0x0000bd19F707CA481886244bDd20Bd6B8a81bd3e": { + "balance": "0xc097ce7bc90715b34b9f1000000000", + "nonce": "0" + }, + "0x000cD1537A823Ae7609E3897DA8d95801B557a8a": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0006d77295a0260ceAC113c5Aa15CFf0d28d9723": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000eA2e72065A2ceCA7f677Bc5E648279c2D843d": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000a52D537c4150ec274dcE3962a0d179B7E71B0": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0009aEFF154De37C8e02E83f93D2FeC5EC96f8a3": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000f1EB7F258D4A7683E5D0FC3C01058841DDC6f": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000aC79590dCc656c00c4453f123AcBf10DBb086": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0002Bf507275217c9E5EE250bC1B5ca177bb4f74": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000a3fC3BFD55b37025E6F4f57B0B6121F54e5bF": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000b4C43cce938dfD3420F975591Ee46D872C136": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0004b0C6de796fD980554cc7ff7B062b3B5079E1": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00025eea83bA285532F5054b238c938076833d13": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000352E93fe11f9B715fdc61864315970B3DC082": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000c0d6b7C4516a5B274C51EA331A9410fe69127": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000D06C23EeD09A7Fa81cADd7eD5C783E8a25635": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0003Ea7fDFCdb89E9ddAb0128ec5C628F8D09D45": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0005C34d7B8b06CE8019C3Bb232dE82B2748A560": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00079f33619F70F1DCE64EB6782E45D3498d807C": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0003E72436Ff296B3d39339784499D021b72Aca5": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00075af7E665F3Ca4A4b05520CD6d5c13BbFEAf8": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000b59AeD48ADCd6c36Ae5f437AbB9CA730a2c43": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0004e4dfCed9d798767A4d7BA2B03495cE80A2b7": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000e73282F60E2CdE0D4FA9B323B6D54d860f330": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00010AB05661Bfde304A4d884DF99d3011A83C54": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000B9Ea41A9dF00b7ae597afc0D10AF42666081F": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00087C666bf7f52758DE186570979C4C79747157": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0008a52c83D34f0791D07FfeD04Fb6b14f94E2D4": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000A7Bbde38Fc53925D0De9cc1beE3038d36c2d2": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000Aa0154ed6560257d222B5dbE6ce4b66c48979": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000b681738e1f8aF387c41b2b1f0A04E0C33e9DB": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000D66A7706f2DD5F557d5b68e01E07E8FFDfaf5": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00069DA530A71Dc92D02090d7f5f63e326e9beD0": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000db74a3da16609F183ACE7AF65B43D896349CE": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0003B1aB565508e095a543C89531e3fbc4a349DA": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0001c94c108BcE19CDb36b00F867A1798A81DedA": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000995137728C7C2a9142F4628f95c98Cac433d7": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000Ec60762AD0425A04C40c118Db5B9710Aa639e": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000Ebf88AE1BA960B06b0a9bbE576baa3B72E92E": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000e1a554572dd96fF3d1F2664832F3E4a66E7b7": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00032C03f3b02D816128Fb5D2752398E2919a03c": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000A073dAC5ec2058a0De0e175874D5E297E086E": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000e06626Bb8618D9A1867362D46ddb1bF95ad75": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000212949b4866db43bAF7c4e0975426710ED081": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00094cc0653B52406170105F4eb96C5e2f31Ab74": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000E67E4b1A23A3826304099cb24f337c916CF4b": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000885A4932ebeD6D760EA381e4EdAe51A53db05": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000883A40409Fa2193b698928459CB9E4DD5f8D8": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0002590DD45738F909115B163F1322A8A24a8B4E": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0005f132597da3152a6Da6beDB7C10bcC9B1B7f5": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00031470def99c1d4dfE1fd08DD7A8520Ce21DB7": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0001Ebe3a3bA36f57F5989B3F0e5BEEBc710569C": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0006Bd0469166f63D0A1c33F71898D2b2E009b9b": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00000A8d3f37af8DeF18832962Ee008d8dCa4F7b": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000e490f26249951F8527779399aa8F281509aC0": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0000638374f7dB166990BDc6aBeE884Ee01a8920": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00031dE95353DeE86dc9B1248e825500DE0B39aF": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000511B42328794337D8b6846E5cFFef30c2d77A": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000d0576AdEf7083d53F6676bfc7c30d03b6Db1B": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0001E8Ff6406a7cd9071F46B8255Db6C16178448": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000C47c771A8db282eC233b28AD8525dc74D13FE": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000798832bb08268dB237898b95A8DaE9D58b62c": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000c877a5D9b9De61e5318B3f4330c56ecdC0865": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0003Ffc1f09d39FBFE87eD63E98249039C7b1d9A": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000d72403c18B2516d8ada074E1E7822bF1084DB": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00054e17Db8C8Db028B19cB0f631888AdEb35E4b": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0002d9b2a816717C4d70040D66A714795F9B27a4": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0002AfCC1B0B608E86b5a1Dc45dE08184E629796": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000b1db69627F04688aA47951d847c8BFAB3fFaE": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000c2de896E4a92e796d6A9c1E4B01feB3e6Ed61": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000EDC52118DadB4B81f013005b6db2665B682ac": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0009e10C0D2F1a7A2b00b61c476aa8b608c60aDc": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000f2AbaA7581fAA2ad5C82b604C77ef68c3eAD9": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000F74AA6EE08C15076b3576eE33Ed3a80c9A1AD": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0001533C6C5b425815b2BaDdCdd42DFF3be04BCb": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0002D79686DeF20a0aB43FEA4a41a1Ad56529621": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00077A336FCA40F933a7A301F4a39C26594F3EB5": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000B05E15C62CBC266A4DD1804b017d1f6dB078b": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000130badE00212bE1AA2F4aCFe965934635C9cD": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0008Bd31Ee6A758e168844cBEA107Ca4d87251aF": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000A390975F21371F1Cf3C783a4A7C1aF49074Fe": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000701F7d594Fb146e4d1c71342012e48A788055": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0005c6BeD054FEad199D72C6f663fC6fBf996153": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0009d862F87F26c638AAd14F2cc48FCa54DBf49d": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00029637dA962294449549f804f8184046F5fbB0": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000279CB54E00B858774afEA4601034Db41c1A05": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0003dDe6f01e3B755e24891a5B0f2463BaD83e15": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000086Eeea461Ca48e4D319F9789F3Efd134E574": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0004351AD413792131011CC7ed8299dd783C6487": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00097B4463159340Ac83B9bdf657C304cD70c11c": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0004ad0D0823e3d31C6ECA2A3495373fA76c43aC": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0005E815c1A3F40011Bd70C76062bbcBc51c546B": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0006A070bAC6195b59d4bC7f73741DCBe4e16b5e": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0006cEE23d8E9BC8d99E826cDa50481394aD9bDD": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000a523148845bEe3EE1e9F83df8257a1191C85B": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000D268F322F10925cdB5d2AD527E582259Da655": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000E5DE0a0175866d21F4Ec6c41F0422A05f14D6": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000cDF8Dba2393a40857cbCB0FCD9b998a941078": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000A341763112a5E3452c7AEE45c382a3fb7dc78": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000635BCbB109781Cea0Cd53e9f1370Dbac9937f": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000E0ea540095B3853c4cb09E5Cdd197330D3B55": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00044cbfb4Ef6054667994C37c0fe0B6BB639718": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00065fC4337dF331242bEE738031dAf35817Ee9e": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000815A8A659a51A8EF01F02441947Ea99182568": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0004C8da21c68dED2F63efD9836De7D43e7cDa10": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0006ed38815a9439c59bD917c12f77a9A7D39BCE": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0004Aa0442d0d43222431b3017912EC6a099771C": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000b3F6da04b6261B4154C8FaEd119632C49DBd5": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000AEBc2568796FDB763CAB67B31e0feE58Fe17d": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000425E97fC6692891876012824a210451cC06C4": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000036e0f87f8Cd3e97f9cfDB2e4E5Ff193c217a": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000305CD7184aB37fdd3D826B92A640218D09527": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000c95f1D83De53B76a0828F1bCdB1DfE12C0ab3": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000882c5FbD315801e4C367BCB04dBD299B9F571": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0000E101815A78EbB9FBBa34F4871aD32d5eb6CD": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000A997c1ceCB1DA78C16249e032e77d1865646a": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00056bde49E3cAA9166C2a4C4951d0Cf067956A0": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000e65342176C7dac47bc75113F569695d6A113C": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0008D608884cd733642ab17aCa0c8504850B94fA": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000dFE27e1b71a49B641ad762aB95558584878D1": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00085D9D1a71acf1080cED44CB501B350900627f": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0007d272a1f7Dfe862b030adE2922D149f3bDe3B": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0004b230511F921934F33E8B4425E43295232680": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0007514395022786B59ff91408692462C48d872c": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0005b34eB0d99dE72DB14d466f692009c4049D46": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0001a2c749FE0Ab1C09f1131BA17530f9D764fBC": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000c6c1D8F778D981968F9904772B0c455E1C17c": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000e64e0a2Fd76B4883c800833c82c5F2420b813": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000577bDc84B4019F77D9D09BDD8ED6145E0e890": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000029bD811D292E7f1CF36c0FA08fd753C45074": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000cE6740261E297FaD4c975D6D8F89f95C29add": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0001d0bAE8B1B9fe61d0B788E562A987813cbD98": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000E3388598A0534275104Ad44745620AF31EC7E": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000791D3185781e14eBb342E5df3BC9910f62E6F": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000Df55E76cf6dfD9598DD2b54948dE937f50f2B": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000055acf237931902ceBf4B905BF59813180555": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00009074D8fc5Eeb25f1548Df05AD955E21FB08D": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000C1aE5FeCf09595C0C76Db609FEB2a5Af0962E": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000F76B2Fe7cCC13474de28586A877664EBA16B4": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000F7cFBa0B176Afc2eBadA9d4764d2eA6BBC5a1": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00002132cE94eEfB06eB15898C1AABd94feb0AC2": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00069dC0cc6b9d7B48B5348b12F625E8aB704104": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000A0191cf913E03bd594bC8817FC3B2895C0a25": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0007316aEDc52EB35c9B5c2E44e9fD712d1DF887": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000EBd066B6FEBB9d7f3B767DF06C08e369Dc20F": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00096af89fd96f0d6E1721d9145944e813317d46": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000C5e39879228A1Fc8dF2470822CB8ce2Af8e07": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000ea86B4A3d7e4AF8CFab052c8b9a040149b507": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000796370C839773893a2cEFA5fc81f2332936fB": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000990B05481b1661bc6211298f6429451B09425": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0008a02d3E8507621f430345b98478058cDca79A": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000d35f8cd11bd989216b3669cBaac6fd8c07196": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000541653a96ABAdDba52fAA8D118e570d529543": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0006264bf7E3395309F728222641Ff8D0e1ad2C0": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000688AA0fBfB3F1e6554A63dF13bE08cB671b3b": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00030da862690D170F096074e9E8b38db7D6f037": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0005e37296348571bd3604f7E56B67a7022801f6": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000ed6E0F4Fdc3615663BF4A601E35e7A8d66E1c": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000c53b37fA4977B59FD3Efdb473D8069844aDeA": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00057714949aD700733C5b8E6cF3e8c6B7D228a2": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000C8FC4132881c31f67638c3941dF8D94a92299": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000fA71E446e1EcFd74d835b5bD6fA848A770d26": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000784B47aC2843419Df4cAd697d4e7b65CE1F93": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0002869e27c6FaEe08cCA6b765a726E7a076Ee0F": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0003135C47c441506b58483Ec6173F767182670B": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0006E80d584cbF9EB8C41CF2b009C607744a70F6": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000C1C05dBFf111c79D5c9E91420DFBEA1c31716": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0009Bf72AF31A4E6B8Ef6FbbFcb017823E4d2aF2": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x00021C20F3e68F930077Cca109Ca3C044E8B39bD": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000E90875aC71eD46A11dc1b509d2B35E2c9C31F": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x000f17eB09AA3f28132323E6075C672949526d5A": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x0000000000000000000000000000000000000000": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + }, + "0x3d1e15a1a55578f7c920884a9943b3b35d0d885b": { + "balance": "0xc097ce7bc90715b34b9f1000000000" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": 1, + "excessBlobGas": "0x0", + "blobGasUsed": 0 }