diff --git a/gravity/0001-local-testing-sdk.patch b/gravity/0001-local-testing-sdk.patch new file mode 100644 index 00000000..a1b3085f --- /dev/null +++ b/gravity/0001-local-testing-sdk.patch @@ -0,0 +1,33 @@ +From 0356f774f75855d26a2d151bb3d61c2630b88d83 Mon Sep 17 00:00:00 2001 +From: "xingqiang.yuan" +Date: Thu, 22 Jan 2026 10:15:23 +0800 +Subject: [PATCH] local testing sdk + +--- + bin/gravity_node/src/consensus/mock_consensus/mock.rs | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/bin/gravity_node/src/consensus/mock_consensus/mock.rs b/bin/gravity_node/src/consensus/mock_consensus/mock.rs +index e254d7a..37d94a3 100644 +--- a/bin/gravity_node/src/consensus/mock_consensus/mock.rs ++++ b/bin/gravity_node/src/consensus/mock_consensus/mock.rs +@@ -125,7 +125,7 @@ impl MockConsensus { + } + } + +- if txns.len() > max_txn_num { ++ if txns.len() >= max_txn_num { + return Self::construct_block(block_number, txns, attr, epoch); + } + } +@@ -241,6 +241,7 @@ impl MockConsensus { + .as_ref() + .unwrap() + .iter() ++ .filter(|tx| !tx.is_discarded) // Only include successfully executed transactions + .map(|tx| TxnId { + sender: ExternalAccountAddress::new(tx.sender), + seq_num: tx.nonce, +-- +2.50.1 (Apple Git-155) + diff --git a/gravity/0001-local-testing.patch b/gravity/0001-local-testing.patch new file mode 100644 index 00000000..fd1a5599 --- /dev/null +++ b/gravity/0001-local-testing.patch @@ -0,0 +1,199 @@ +From 09fb76e151165ce3ebc1a2db820d0e9ed5237e9f Mon Sep 17 00:00:00 2001 +From: "xingqiang.yuan" +Date: Thu, 22 Jan 2026 17:29:02 +0800 +Subject: [PATCH] local testing + +--- + .../pipe-exec-layer-ext-v2/execute/src/lib.rs | 54 ++++++++++++------- + .../execute/src/onchain_config/epoch.rs | 6 +-- + .../src/onchain_config/metadata_txn.rs | 10 ++-- + 3 files changed, 42 insertions(+), 28 deletions(-) + +diff --git a/crates/pipe-exec-layer-ext-v2/execute/src/lib.rs b/crates/pipe-exec-layer-ext-v2/execute/src/lib.rs +index 747b4192a..17b6a8f36 100644 +--- a/crates/pipe-exec-layer-ext-v2/execute/src/lib.rs ++++ b/crates/pipe-exec-layer-ext-v2/execute/src/lib.rs +@@ -361,10 +361,12 @@ impl Core { + HashedPostState::from_bundle_state::(&execution_output.state.state); + self.metrics.cache_account_state.record(write_start.elapsed()); + let elapsed = start_time.elapsed(); ++ let tx_count = block.body.transactions.len(); + info!(target: "PipeExecService.process", + block_number=?block_number, + block_id=?block_id, + gas_used=execution_output.gas_used, ++ tx_count=tx_count, + elapsed=?elapsed, + epoch=?epoch, + "block executed" +@@ -558,7 +560,7 @@ impl Core { + ) -> (Vec, Option<(u64, Bytes)>) { + let mut gravity_events = vec![]; + let mut epoch_change_result = None; +- ++ + for receipt in receipts { + debug!(target: "execute_ordered_block", + number=?block_number, +@@ -577,7 +579,7 @@ impl Core { + let validator_bytes = crate::onchain_config::types::convert_validator_set_to_bcs(solidity_validator_set); + epoch_change_result = Some((event.newEpoch.to::(), validator_bytes)); + } +- ++ + if let Ok(event) = ObservedJWKsUpdated::decode_log(&log) { + info!(target: "execute_ordered_block", + number=?block_number, +@@ -738,7 +740,7 @@ impl Core { + &result.execution_output.receipts, + result.block.number, + ); +- ++ + // Check if any transaction (including JWK transactions) triggered a new epoch + // TODO(gravity_lightman): We need further more tests to test this branch + if let Some((new_epoch, validators)) = epoch_change_result { +@@ -755,7 +757,7 @@ impl Core { + gravity_events.push(GravityEvent::NewEpoch(new_epoch, validators.into())); + result.epoch = new_epoch; + } +- ++ + result.gravity_events.extend(gravity_events); + result + } +@@ -858,8 +860,29 @@ impl Core { + base_fee_per_gas: u64, + gas_limit: u64, + ) -> (Vec, Vec
, Vec) { +- let invalid_idxs = filter_invalid_txs(db, &txs, &senders, base_fee_per_gas, gas_limit); +- if invalid_idxs.is_empty() { ++ // Find transactions that exceed gas limit (should be excluded from current block but remain in txpool) ++ let mut gas_limit_exceeded_tx_idx = txs.len(); ++ let mut tx_gas_limit_sum = 0; ++ for (idx, tx) in txs.iter().enumerate() { ++ let tx_gas_limit = tx.gas_limit(); ++ if tx_gas_limit_sum + tx_gas_limit > gas_limit { ++ warn!(target: "filter_invalid_txs", ++ tx_hash=?txs[idx].hash(), ++ sender=?senders[idx], ++ block_gas_limit=?gas_limit, ++ "gas limit exceeded, truncated to {}", ++ idx, ++ ); ++ gas_limit_exceeded_tx_idx = idx; ++ break; ++ } else { ++ tx_gas_limit_sum += tx_gas_limit; ++ } ++ } ++ ++ // Filter transactions: exclude gas limit exceeded ones from current block ++ // Don't send to discard_txs_tx - these transactions should remain in txpool for the next block ++ if gas_limit_exceeded_tx_idx == txs.len() { + let mut txs_info = Vec::with_capacity(txs.len()); + for (tx, sender) in txs.iter().zip(senders.iter()) { + txs_info.push(TxInfo { +@@ -871,30 +894,21 @@ impl Core { + } + (txs, senders, txs_info) + } else { +- let _ = self +- .discard_txs_tx +- .send(invalid_idxs.iter().map(|&idx| txs[idx].hash()).copied().collect::>()); +- +- let mut filtered_txs = Vec::with_capacity(txs.len() - invalid_idxs.len()); +- let mut filtered_senders = Vec::with_capacity(filtered_txs.capacity()); ++ let mut filtered_txs = Vec::with_capacity(gas_limit_exceeded_tx_idx); ++ let mut filtered_senders = Vec::with_capacity(gas_limit_exceeded_tx_idx); + let mut txs_info = Vec::with_capacity(txs.len()); + for (i, (tx, sender)) in txs.into_iter().zip(senders.into_iter()).enumerate() { +- if invalid_idxs.contains(&i) { +- txs_info.push(TxInfo { +- tx_hash: *tx.hash(), +- sender, +- nonce: tx.nonce(), +- is_discarded: true, +- }); ++ if i >= gas_limit_exceeded_tx_idx { ++ // Gas limit exceeded transactions are excluded from current block but not discarded + continue; + } +- + txs_info.push(TxInfo { + tx_hash: *tx.hash(), + sender, + nonce: tx.nonce(), + is_discarded: false, + }); ++ + filtered_txs.push(tx); + filtered_senders.push(sender); + } +diff --git a/crates/pipe-exec-layer-ext-v2/execute/src/onchain_config/epoch.rs b/crates/pipe-exec-layer-ext-v2/execute/src/onchain_config/epoch.rs +index f73d6eaf2..c0dbf0932 100644 +--- a/crates/pipe-exec-layer-ext-v2/execute/src/onchain_config/epoch.rs ++++ b/crates/pipe-exec-layer-ext-v2/execute/src/onchain_config/epoch.rs +@@ -38,13 +38,13 @@ where + EthApi::NetworkTypes: RpcTypes, + { + fn fetch(&self, block_number: u64) -> Bytes { +- #[cfg(feature = "pipe_test")] ++ #[cfg(not(feature = "pipe_test"))] + { + // For testing, return epoch 0 +- Bytes::from(0u64.to_le_bytes().to_vec()) ++ Bytes::from(1u64.to_le_bytes().to_vec()) + } + +- #[cfg(not(feature = "pipe_test"))] ++ #[cfg(feature = "pipe_test")] + { + let call = EpochManager::getCurrentEpochInfoCall {}; + let input: Bytes = call.abi_encode().into(); +diff --git a/crates/pipe-exec-layer-ext-v2/execute/src/onchain_config/metadata_txn.rs b/crates/pipe-exec-layer-ext-v2/execute/src/onchain_config/metadata_txn.rs +index a6ae59ba4..bd6c8dc0e 100644 +--- a/crates/pipe-exec-layer-ext-v2/execute/src/onchain_config/metadata_txn.rs ++++ b/crates/pipe-exec-layer-ext-v2/execute/src/onchain_config/metadata_txn.rs +@@ -156,7 +156,7 @@ fn new_system_call_txn( + chain_id: None, + nonce, + gas_price, +- gas_limit: 30_000_000, ++ gas_limit: 15_000_000, + to: TxKind::Call(contract), + value: U256::ZERO, + input, +@@ -166,10 +166,10 @@ fn new_system_call_txn( + } + + /// Execute a metadata contract call (blockPrologue or blockPrologueExt) +-/// ++/// + /// If `enable_randomness` is true, calls blockPrologueExt. + /// Otherwise, calls the legacy blockPrologue function. +-/// ++/// + /// Note: blockPrologueExt retrieves randomness from block.difficulty (set before this call), + /// so it doesn't need to be passed as a parameter. + pub fn transact_metadata_contract_call( +@@ -206,7 +206,7 @@ pub fn transact_metadata_contract_call( + ); + let tx_env = Recovered::new_unchecked(txn.clone(), SYSTEM_CALLER).into_tx_env(); + let result = evm.transact_raw(tx_env).unwrap(); +- ++ + let function_name = if enable_randomness { "blockPrologueExt" } else { "blockPrologue" }; + assert!( + result.result.is_success(), +@@ -214,6 +214,6 @@ pub fn transact_metadata_contract_call( + function_name, + result.result + ); +- ++ + (MetadataTxnResult { result: result.result, txn }, result.state) + } +-- +2.50.1 (Apple Git-155) + diff --git a/gravity/Makefile b/gravity/Makefile new file mode 100644 index 00000000..ec2ca999 --- /dev/null +++ b/gravity/Makefile @@ -0,0 +1,35 @@ +.PHONY: help prepare build start stop logs clean + +.DEFAULT_GOAL := help + +BINARY_PATH := gravity-sdk/target/release/gravity_node +LOG_FILE := gravity_node.out + +help: ## Show help + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-12s\033[0m %s\n", $$1, $$2}' + +prepare: ## Clone repos and apply patches + @[ -d "gravity-reth" ] || (git clone -b gravity-v0.4.1 https://github.com/Galxe/gravity-reth.git && cd gravity-reth && git apply ../0001-local-testing.patch) + @[ -d "gravity-sdk" ] || git clone -b v0.4.1 https://github.com/Galxe/gravity-sdk.git && cd gravity-sdk && git apply ../0001-local-testing-sdk.patch + +build: ## Build gravity_node + @cd gravity-sdk && \ + grep -qF '[patch."https://github.com/Galxe/gravity-reth"]' Cargo.toml || \ + (echo "" >> Cargo.toml && \ + echo '[patch."https://github.com/Galxe/gravity-reth"]' >> Cargo.toml && \ + echo 'greth = { path = "../gravity-reth" }' >> Cargo.toml) && \ + make gravity_node + +start: ## Start gravity_node + @bash scripts/start_mock.sh + +stop: ## Stop gravity_node + @lsof -ti :8545 | xargs kill 2>/dev/null || true + +logs: ## View logs + @tail -f $(LOG_FILE) 2>/dev/null || echo "Log file not found" + +clean: stop ## Clean logs + @rm -f $(LOG_FILE) gravity_node.pid + @sleep 1 && rm -rf gravity_node + diff --git a/gravity/README.md b/gravity/README.md new file mode 100644 index 00000000..6592fb2f --- /dev/null +++ b/gravity/README.md @@ -0,0 +1,122 @@ +# Gravity Node Management + +A simple management tool for running Gravity Node in MOCK mode for local testing. + +## Prerequisites + +- `jq` - JSON processor (required for parsing configuration) +- `make` - Build automation tool +- `git` - Version control +- Rust toolchain (for building gravity_node) + +## Quick Start + +1. **Prepare environment** (clone repositories and apply patches): + ```bash + make prepare + ``` + +2. **Build gravity_node**: + ```bash + make build + ``` + +3. **Start gravity_node**: + ```bash + make start + ``` + +## Configuration + +The node reads configuration from `my_config/reth_config.json`. This file should contain: +- `env_vars`: Environment variables to export +- `reth_args`: Command-line arguments for gravity_node + +### Configuration Options + +**Environment Variables:** +- `MOCK_CONSENSUS`: Enable mock consensus mode +- `MOCK_SET_ORDERED_INTERVAL_MS`: Block interval in ms (e.g., `200`) +- `MOCK_MAX_BLOCK_SIZE`: Max transactions per block + - **Native transfer (Pay) testing**: Set to `1000` + - **ERC20 token testing**: Set to `10000` + +**Performance Optimization (in reth_args):** +- `gravity.disable-grevm`: `true` to disable / `false` to enable parallel EVM +- `gravity.disable-pipe-execution`: `true` to disable / `false` to enable pipeline + +Examples: +```json +// Fastest mode (both enabled) +"gravity.disable-grevm": false, +"gravity.disable-pipe-execution": false + +// Debug mode (both disabled) +"gravity.disable-grevm": true, +"gravity.disable-pipe-execution": true + +// Grevm disabled, Pipeline enabled +"gravity.disable-grevm": true, +"gravity.disable-pipe-execution": false +``` + +## Available Commands + +Run `make help` to see all available commands: + +- `make prepare` - Clone repositories and apply patches +- `make build` - Build gravity_node binary +- `make start` - Start gravity_node in background +- `make stop` - Stop running gravity_node +- `make logs` - View real-time logs +- `make clean` - Stop node and clean log files + +## Project Structure + +``` +gravity/ +├── Makefile # Main entry point +├── README.md # This file +├── 0001-local-testing.patch # Patch for gravity-reth +├── my_config/ # Configuration files +│ └── reth_config.json # Main configuration +└── scripts/ # Helper scripts + ├── prepare.sh # Setup script + ├── add_patch.sh # Patch management + ├── build_gravity_node.sh # Build script + └── start_mock.sh # Start script +``` + +## How It Works + +1. **prepare**: Clones `gravity-reth` and `gravity-sdk` repositories, applies local testing patches +2. **build**: Adds Cargo.toml patch configuration (if needed) and builds the binary +3. **start**: Parses configuration, exports environment variables, and starts gravity_node in background +4. **stop**: Kills the process running on port 8545 +5. **clean**: Stops the node (if running) and removes log files + +## Logs + +Logs are written to `gravity_node.out` in the gravity directory. View them with: +```bash +make logs +``` + +Or directly: +```bash +tail -f gravity_node.out +``` + +## Troubleshooting + +- **Port 8545 already in use**: Run `make stop` first, or manually kill the process +- **Build fails**: Ensure Rust toolchain is installed and `make prepare` has been run +- **Config file not found**: Ensure `my_config/reth_config.json` exists +- **jq not found**: Install jq using the commands in Prerequisites section + +## Notes + +- The node runs in MOCK mode for local testing +- All scripts automatically handle directory navigation +- The build process automatically adds required Cargo.toml patches + diff --git a/gravity/my_config/discovery b/gravity/my_config/discovery new file mode 100644 index 00000000..6f3ce728 --- /dev/null +++ b/gravity/my_config/discovery @@ -0,0 +1,7 @@ +--- +2d86b40a1d692c0749a0a0426e2021ee24e2430da0f5bb9c2ae6c586bf3e0a0f: + addresses: + - /ip4/127.0.0.1/tcp/2024/noise-ik/2d86b40a1d692c0749a0a0426e2021ee24e2430da0f5bb9c2ae6c586bf3e0a0f/handshake/0 + keys: + - "2d86b40a1d692c0749a0a0426e2021ee24e2430da0f5bb9c2ae6c586bf3e0a0f" + role: Validator diff --git a/gravity/my_config/genesis.json b/gravity/my_config/genesis.json new file mode 100644 index 00000000..97892620 --- /dev/null +++ b/gravity/my_config/genesis.json @@ -0,0 +1,151 @@ +{ + "nonce": "0x0", + "timestamp": "0x6490fdd2", + "extraData": "0x", + "gasLimit": "0x11e1a300", + "difficulty": "0x0", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "config": { + "chainId": 7771625, + "homesteadBlock": 0, + "daoForkSupport": true, + "daoForkBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "arrowGlacierBlock": 0, + "grayGlacierBlock": 0, + "mergeNetsplitBlock": 0, + "shanghaiTime": 0, + "cancunTime": 0, + "pragueTime": 0, + "osakaTime": 0, + "terminalTotalDifficultyPassed": false, + "extraFields": {}, + "depositContractAddress": null + }, + "alloc": { + "0x00000000000000000000000000000000000000ff": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x00000000000000000000000000000000000000f0": { + "balance": "0x0", + "code": "0x608060405234801561000f575f5ffd5b50600436106100f3575f3560e01c80637a34967e11610095578063bd61a53311610064578063bd61a53314610215578063d6c4a7ff14610233578063dfc8bf4e14610251578063e06bf1b61461026f576100f3565b80637a34967e146101b15780638a93fadf146101cf578063900cf0cf146101d9578063b97dd9e2146101f7576100f3565b8063406e6992116100d1578063406e69921461014d5780634e4e9dca1461016b5780636f4227341461017557806370fed29c14610193576100f3565b806314acd134146100f75780631dbd0acf146101135780632863ea6414610131575b5f5ffd5b610111600480360381019061010c9190610901565b610279565b005b61011b6102bc565b6040516101289190610946565b60405180910390f35b61014b6004803603810190610146919061099c565b6102ce565b005b6101556105c3565b60405161016291906109d6565b60405180910390f35b6101736105dc565b005b61017d6106dd565b60405161018a9190610946565b60405180910390f35b61019b6106f3565b6040516101a891906109fe565b60405180910390f35b6101b9610718565b6040516101c691906109fe565b60405180910390f35b6101d761073c565b005b6101e161079d565b6040516101ee91906109d6565b60405180910390f35b6101ff6107b5565b60405161020c91906109d6565b60405180910390f35b61021d6107d0565b60405161022a91906109d6565b60405180910390f35b61023b6107ec565b6040516102489190610a72565b60405180910390f35b610259610811565b6040516102669190610aab565b60405180910390f35b610277610836565b005b8060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60109054906101000a900460ff1681565b5f8167ffffffffffffffff1614806102eb57506102e96106dd565b155b6105c0575f60089054906101000a900467ffffffffffffffff1667ffffffffffffffff168167ffffffffffffffff1603610351576040517fb9ef9e6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60089054906101000a900467ffffffffffffffff1667ffffffffffffffff168167ffffffffffffffff16116103b3576040517fb28098c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f60086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060015f5f9054906101000a900467ffffffffffffffff166103fc9190610af1565b5f5f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab60405161044f90610bd2565b60405180910390a160015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379fa79836040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156104bd575f5ffd5b505af11580156104cf573d5f5f3e3d5ffd5b505050505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379fa79836040518163ffffffff1660e01b81526004015f604051808303815f875af115801561053e573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105669190610d2c565b90505f5f9054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff4c133897e4ce5d98268cfa0ea5ee78bd7643d92c7aacce83065fbcb9dd6e0c2826040516105b69190610dc5565b60405180910390a2505b50565b5f60089054906101000a900467ffffffffffffffff1681565b5f5f5f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1614158061062857505f5f60089054906101000a900467ffffffffffffffff1667ffffffffffffffff1614155b1561065f576040517fda9161d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015f5f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f5f9054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff4c133897e4ce5d98268cfa0ea5ee78bd7643d92c7aacce83065fbcb9dd6e0c26040516106d390610e08565b60405180910390a2565b5f5f60109054906101000a900460ff1615905090565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f00000000000000000000000000000000000000000000000000000000000000ff81565b5f60109054906101000a900460ff1615610781576040517e5ecddb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015f60106101000a81548160ff021916908315150217905550565b5f5f9054906101000a900467ffffffffffffffff1681565b5f5f5f9054906101000a900467ffffffffffffffff16905090565b5f5f60089054906101000a900467ffffffffffffffff16905090565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60109054906101000a900460ff1661087b576040517ff2a5f75a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60106101000a81548160ff021916908315150217905550565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6108d0826108a7565b9050919050565b6108e0816108c6565b81146108ea575f5ffd5b50565b5f813590506108fb816108d7565b92915050565b5f602082840312156109165761091561089f565b5b5f610923848285016108ed565b91505092915050565b5f8115159050919050565b6109408161092c565b82525050565b5f6020820190506109595f830184610937565b92915050565b5f67ffffffffffffffff82169050919050565b61097b8161095f565b8114610985575f5ffd5b50565b5f8135905061099681610972565b92915050565b5f602082840312156109b1576109b061089f565b5b5f6109be84828501610988565b91505092915050565b6109d08161095f565b82525050565b5f6020820190506109e95f8301846109c7565b92915050565b6109f8816108c6565b82525050565b5f602082019050610a115f8301846109ef565b92915050565b5f819050919050565b5f610a3a610a35610a30846108a7565b610a17565b6108a7565b9050919050565b5f610a4b82610a20565b9050919050565b5f610a5c82610a41565b9050919050565b610a6c81610a52565b82525050565b5f602082019050610a855f830184610a63565b92915050565b5f610a9582610a41565b9050919050565b610aa581610a8b565b82525050565b5f602082019050610abe5f830184610a9c565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610afb8261095f565b9150610b068361095f565b9250828201905067ffffffffffffffff811115610b2657610b25610ac4565b5b92915050565b5f82825260208201905092915050565b7f656e746572207265636f6e66696775726520616e642063616c6c206f6e4e65775f8201527f45706f636820666f7220636f6e73656e73757320636f6e66696720636f6e747260208201527f6163740000000000000000000000000000000000000000000000000000000000604082015250565b5f610bbc604383610b2c565b9150610bc782610b3c565b606082019050919050565b5f6020820190508181035f830152610be981610bb0565b9050919050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610c3e82610bf8565b810181811067ffffffffffffffff82111715610c5d57610c5c610c08565b5b80604052505050565b5f610c6f610896565b9050610c7b8282610c35565b919050565b5f67ffffffffffffffff821115610c9a57610c99610c08565b5b610ca382610bf8565b9050602081019050919050565b8281835e5f83830152505050565b5f610cd0610ccb84610c80565b610c66565b905082815260208101848484011115610cec57610ceb610bf4565b5b610cf7848285610cb0565b509392505050565b5f82601f830112610d1357610d12610bf0565b5b8151610d23848260208601610cbe565b91505092915050565b5f60208284031215610d4157610d4061089f565b5b5f82015167ffffffffffffffff811115610d5e57610d5d6108a3565b5b610d6a84828501610cff565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f610d9782610d73565b610da18185610d7d565b9350610db1818560208601610cb0565b610dba81610bf8565b840191505092915050565b5f6020820190508181035f830152610ddd8184610d8d565b905092915050565b50565b5f610df35f83610d7d565b9150610dfe82610de5565b5f82019050919050565b5f6020820190508181035f830152610e1f81610de8565b905091905056fea2646970667358221220f556bbe296de02d2e806232366b2f9764935429047092c1abb2efca511b760b164736f6c634300081e0033000000000000000000000000000000000000000000000000000000000000000000", + "storage": { + "0x02": "0xf3", + "0x01": "0xf2", + "0x03": "0xff", + "0x00": "0x01" + } + }, + "0x00000000000000000000000000000000000000f1": { + "balance": "0x0", + "code": "0x608060405234801561000f575f5ffd5b5060043610610091575f3560e01c8063510f9d7711610064578063510f9d771461010d57806355610f88146101295780638da5cb5b14610147578063c82798d114610165578063d21719751461018357610091565b806308f74c76146100955780630bd3e850146100b357806335aee9af146100d1578063367bf2f9146100ef575b5f5ffd5b61009d61019f565b6040516100aa9190610547565b60405180910390f35b6100bb6101c4565b6040516100c891906105bb565b60405180910390f35b6100d96101e9565b6040516100e691906105f6565b60405180910390f35b6100f7610204565b60405161010491906105f6565b60405180910390f35b6101276004803603810190610122919061063d565b61021c565b005b610131610475565b60405161013e91906105f6565b60405180910390f35b61014f61049f565b60405161015c9190610547565b60405180910390f35b61016d6104c4565b60405161017a91906105f6565b60405180910390f35b61019d6004803603810190610198919061063d565b6104dd565b005b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f5f9054906101000a900467ffffffffffffffff16905090565b5f5f9054906101000a900467ffffffffffffffff1681565b60015f5f9054906101000a900467ffffffffffffffff1661023d9190610695565b5f5f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f5f60089054906101000a900467ffffffffffffffff16905060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636f4227346040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061030a9190610705565b15610471575f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd61a5336040518163ffffffff1660e01b8152600401602060405180830381865afa15801561037a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e9190610744565b90508067ffffffffffffffff168367ffffffffffffffff161180156103e257508167ffffffffffffffff1681846103d5919061076f565b67ffffffffffffffff1610155b1561046f5760035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632863ea64846040518263ffffffff1660e01b815260040161044191906105f6565b5f604051808303815f87803b158015610458575f5ffd5b505af115801561046a573d5f5f3e3d5ffd5b505050505b505b5050565b5f620f42405f60089054906101000a900467ffffffffffffffff1661049a91906107d7565b905090565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60089054906101000a900467ffffffffffffffff1681565b805f60086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61053182610508565b9050919050565b61054181610527565b82525050565b5f60208201905061055a5f830184610538565b92915050565b5f819050919050565b5f61058361057e61057984610508565b610560565b610508565b9050919050565b5f61059482610569565b9050919050565b5f6105a58261058a565b9050919050565b6105b58161059b565b82525050565b5f6020820190506105ce5f8301846105ac565b92915050565b5f67ffffffffffffffff82169050919050565b6105f0816105d4565b82525050565b5f6020820190506106095f8301846105e7565b92915050565b5f5ffd5b61061c816105d4565b8114610626575f5ffd5b50565b5f8135905061063781610613565b92915050565b5f602082840312156106525761065161060f565b5b5f61065f84828501610629565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61069f826105d4565b91506106aa836105d4565b9250828201905067ffffffffffffffff8111156106ca576106c9610668565b5b92915050565b5f8115159050919050565b6106e4816106d0565b81146106ee575f5ffd5b50565b5f815190506106ff816106db565b92915050565b5f6020828403121561071a5761071961060f565b5b5f610727848285016106f1565b91505092915050565b5f8151905061073e81610613565b92915050565b5f602082840312156107595761075861060f565b5b5f61076684828501610730565b91505092915050565b5f610779826105d4565b9150610784836105d4565b9250828203905067ffffffffffffffff8111156107a4576107a3610668565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6107e1826105d4565b91506107ec836105d4565b9250826107fc576107fb6107aa565b5b82820490509291505056fea2646970667358221220159935f350f67bea4591d6c6244d1c6952de2c6c5b68fa694766f228d00c2d1f64736f6c634300081e0033000000000000000000000000000000000000000000000000000000000000000000", + "storage": { + "0x01": "0xff", + "0x00": "0x141dd760000000000000000000", + "0x02": "0xff", + "0x03": "0x0100000000000000000000000000000000000000f0" + } + }, + "0x00000000000000000000000000000000000000f2": { + "balance": "0x0", + "code": "0x608060405234801561000f575f5ffd5b5060043610610086575f3560e01c806379fa79831161005957806379fa7983146101015780637a34967e1461010b5780637f1514e714610129578063cae588071461014757610086565b80631f6fc3891461008a5780632f01b975146100a65780634308aec1146100c557806373c6a288146100e3575b5f5ffd5b6100a4600480360381019061009f919061068c565b610165565b005b6100ae610206565b6040516100bc929190610761565b60405180910390f35b6100cd6102ac565b6040516100da919061078f565b60405180910390f35b6100eb61033b565b6040516100f8919061078f565b60405180910390f35b6101096103c7565b005b61011361050a565b60405161012091906107ee565b60405180910390f35b61013161052e565b60405161013e9190610807565b60405180910390f35b61014f610540565b60405161015c919061078f565b60405180910390f35b7fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab6040516101929061087a565b60405180910390a15f82829050036101d6576040517f396f4c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181600191826101e7929190610ad5565b50600160025f6101000a81548160ff0219169083151502179055505050565b60605f600160025f9054906101000a900460ff16818054610226906108fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610252906108fc565b801561029d5780601f106102745761010080835404028352916020019161029d565b820191905f5260205f20905b81548152906001019060200180831161028057829003601f168201915b50505050509150915091509091565b60605f80546102ba906108fc565b80601f01602080910402602001604051908101604052809291908181526020018280546102e6906108fc565b80156103315780601f1061030857610100808354040283529160200191610331565b820191905f5260205f20905b81548152906001019060200180831161031457829003601f168201915b5050505050905090565b60018054610348906108fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610374906108fc565b80156103bf5780601f10610396576101008083540402835291602001916103bf565b820191905f5260205f20905b8154815290600101906020018083116103a257829003601f168201915b505050505081565b7fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab6040516103f490610bec565b60405180910390a160025f9054906101000a900460ff1615610508577fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab60405161043d90610c7a565b60405180910390a15f60018054610453906108fc565b80601f016020809104026020016040519081016040528092919081815260200182805461047f906108fc565b80156104ca5780601f106104a1576101008083540402835291602001916104ca565b820191905f5260205f20905b8154815290600101906020018083116104ad57829003601f168201915b50505050509050805f90816104df9190610c98565b505f60025f6101000a81548160ff02191690831515021790555060015f61050691906105cb565b505b565b7f00000000000000000000000000000000000000000000000000000000000000ff81565b60025f9054906101000a900460ff1681565b5f805461054c906108fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610578906108fc565b80156105c35780601f1061059a576101008083540402835291602001916105c3565b820191905f5260205f20905b8154815290600101906020018083116105a657829003601f168201915b505050505081565b5080546105d7906108fc565b5f825580601f106105e85750610605565b601f0160209004905f5260205f20908101906106049190610608565b5b50565b5b8082111561061f575f815f905550600101610609565b5090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261064c5761064b61062b565b5b8235905067ffffffffffffffff8111156106695761066861062f565b5b60208301915083600182028301111561068557610684610633565b5b9250929050565b5f5f602083850312156106a2576106a1610623565b5b5f83013567ffffffffffffffff8111156106bf576106be610627565b5b6106cb85828601610637565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610719826106d7565b61072381856106e1565b93506107338185602086016106f1565b61073c816106ff565b840191505092915050565b5f8115159050919050565b61075b81610747565b82525050565b5f6040820190508181035f830152610779818561070f565b90506107886020830184610752565b9392505050565b5f6020820190508181035f8301526107a7818461070f565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6107d8826107af565b9050919050565b6107e8816107ce565b82525050565b5f6020820190506108015f8301846107df565b92915050565b5f60208201905061081a5f830184610752565b92915050565b5f82825260208201905092915050565b7f656e74657220736574466f724e65787445706f636800000000000000000000005f82015250565b5f610864601583610820565b915061086f82610830565b602082019050919050565b5f6020820190508181035f83015261089181610858565b9050919050565b5f82905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061091357607f821691505b602082108103610926576109256108cf565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026109887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261094d565b610992868361094d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6109d66109d16109cc846109aa565b6109b3565b6109aa565b9050919050565b5f819050919050565b6109ef836109bc565b610a036109fb826109dd565b848454610959565b825550505050565b5f5f905090565b610a1a610a0b565b610a258184846109e6565b505050565b5b81811015610a4857610a3d5f82610a12565b600181019050610a2b565b5050565b601f821115610a8d57610a5e8161092c565b610a678461093e565b81016020851015610a76578190505b610a8a610a828561093e565b830182610a2a565b50505b505050565b5f82821c905092915050565b5f610aad5f1984600802610a92565b1980831691505092915050565b5f610ac58383610a9e565b9150826002028217905092915050565b610adf8383610898565b67ffffffffffffffff811115610af857610af76108a2565b5b610b0282546108fc565b610b0d828285610a4c565b5f601f831160018114610b3a575f8415610b28578287013590505b610b328582610aba565b865550610b99565b601f198416610b488661092c565b5f5b82811015610b6f57848901358255600182019150602085019450602081019050610b4a565b86831015610b8c5784890135610b88601f891682610a9e565b8355505b6001600288020188555050505b50505050505050565b7f656e746572206f6e4e657745706f6368000000000000000000000000000000005f82015250565b5f610bd6601083610820565b9150610be182610ba2565b602082019050919050565b5f6020820190508181035f830152610c0381610bca565b9050919050565b7f656e746572206f6e4e657745706f636820616e642068617350656e64696e67435f8201527f6f6e666967000000000000000000000000000000000000000000000000000000602082015250565b5f610c64602583610820565b9150610c6f82610c0a565b604082019050919050565b5f6020820190508181035f830152610c9181610c58565b9050919050565b610ca1826106d7565b67ffffffffffffffff811115610cba57610cb96108a2565b5b610cc482546108fc565b610ccf828285610a4c565b5f60209050601f831160018114610d00575f8415610cee578287015190505b610cf88582610aba565b865550610d5f565b601f198416610d0e8661092c565b5f5b82811015610d3557848901518255600182019150602085019450602081019050610d10565b86831015610d525784890151610d4e601f891682610a9e565b8355505b6001600288020188555050505b50505050505056fea26469706673582212200ed2abf891943cf24c38e3d5494e8766b441e3c5a4a161047ec6759e331d9cbb64736f6c634300081e0033000000000000000000000000000000000000000000000000000000000000000000", + "storage": { + "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564": "0x0100000000000000000000000000000000000000000000000000000000000000", + "0x00": "0x49", + "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": "0x0301010a00000000000000280000000000000001010000000a00000000000000" + } + }, + "0x00000000000000000000000000000000000000f3": { + "balance": "0x0", + "code": "0x608060405234801561000f575f5ffd5b5060043610610086575f3560e01c806379fa79831161005957806379fa7983146101015780637a34967e1461011f5780637f1514e71461013d578063cae588071461015b57610086565b80631f6fc3891461008a5780632f01b975146100a65780634308aec1146100c557806373c6a288146100e3575b5f5ffd5b6100a4600480360381019061009f919061068e565b610179565b005b6100ae6101e5565b6040516100bc929190610763565b60405180910390f35b6100cd61028b565b6040516100da9190610791565b60405180910390f35b6100eb61031a565b6040516100f89190610791565b60405180910390f35b6101096103a6565b6040516101169190610791565b60405180910390f35b61012761050c565b60405161013491906107f0565b60405180910390f35b610145610530565b6040516101529190610809565b60405180910390f35b610163610542565b6040516101709190610791565b60405180910390f35b5f82829050036101b5576040517f396f4c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181600191826101c6929190610a5f565b50600160025f6101000a81548160ff0219169083151502179055505050565b60605f600160025f9054906101000a900460ff1681805461020590610886565b80601f016020809104026020016040519081016040528092919081815260200182805461023190610886565b801561027c5780601f106102535761010080835404028352916020019161027c565b820191905f5260205f20905b81548152906001019060200180831161025f57829003601f168201915b50505050509150915091509091565b60605f805461029990610886565b80601f01602080910402602001604051908101604052809291908181526020018280546102c590610886565b80156103105780601f106102e757610100808354040283529160200191610310565b820191905f5260205f20905b8154815290600101906020018083116102f357829003601f168201915b5050505050905090565b6001805461032790610886565b80601f016020809104026020016040519081016040528092919081815260200182805461035390610886565b801561039e5780601f106103755761010080835404028352916020019161039e565b820191905f5260205f20905b81548152906001019060200180831161038157829003601f168201915b505050505081565b606060025f9054906101000a900460ff161561047f575f600180546103ca90610886565b80601f01602080910402602001604051908101604052809291908181526020018280546103f690610886565b80156104415780601f1061041857610100808354040283529160200191610441565b820191905f5260205f20905b81548152906001019060200180831161042457829003601f168201915b50505050509050805f90816104569190610b2c565b505f60025f6101000a81548160ff02191690831515021790555060015f61047d91906105cd565b505b5f805461048b90610886565b80601f01602080910402602001604051908101604052809291908181526020018280546104b790610886565b80156105025780601f106104d957610100808354040283529160200191610502565b820191905f5260205f20905b8154815290600101906020018083116104e557829003601f168201915b5050505050905090565b7f00000000000000000000000000000000000000000000000000000000000000ff81565b60025f9054906101000a900460ff1681565b5f805461054e90610886565b80601f016020809104026020016040519081016040528092919081815260200182805461057a90610886565b80156105c55780601f1061059c576101008083540402835291602001916105c5565b820191905f5260205f20905b8154815290600101906020018083116105a857829003601f168201915b505050505081565b5080546105d990610886565b5f825580601f106105ea5750610607565b601f0160209004905f5260205f2090810190610606919061060a565b5b50565b5b80821115610621575f815f90555060010161060b565b5090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261064e5761064d61062d565b5b8235905067ffffffffffffffff81111561066b5761066a610631565b5b60208301915083600182028301111561068757610686610635565b5b9250929050565b5f5f602083850312156106a4576106a3610625565b5b5f83013567ffffffffffffffff8111156106c1576106c0610629565b5b6106cd85828601610639565b92509250509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61071b826106d9565b61072581856106e3565b93506107358185602086016106f3565b61073e81610701565b840191505092915050565b5f8115159050919050565b61075d81610749565b82525050565b5f6040820190508181035f83015261077b8185610711565b905061078a6020830184610754565b9392505050565b5f6020820190508181035f8301526107a98184610711565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6107da826107b1565b9050919050565b6107ea816107d0565b82525050565b5f6020820190506108035f8301846107e1565b92915050565b5f60208201905061081c5f830184610754565b92915050565b5f82905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061089d57607f821691505b6020821081036108b0576108af610859565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026109127fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826108d7565b61091c86836108d7565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61096061095b61095684610934565b61093d565b610934565b9050919050565b5f819050919050565b61097983610946565b61098d61098582610967565b8484546108e3565b825550505050565b5f5f905090565b6109a4610995565b6109af818484610970565b505050565b5b818110156109d2576109c75f8261099c565b6001810190506109b5565b5050565b601f821115610a17576109e8816108b6565b6109f1846108c8565b81016020851015610a00578190505b610a14610a0c856108c8565b8301826109b4565b50505b505050565b5f82821c905092915050565b5f610a375f1984600802610a1c565b1980831691505092915050565b5f610a4f8383610a28565b9150826002028217905092915050565b610a698383610822565b67ffffffffffffffff811115610a8257610a8161082c565b5b610a8c8254610886565b610a978282856109d6565b5f601f831160018114610ac4575f8415610ab2578287013590505b610abc8582610a44565b865550610b23565b601f198416610ad2866108b6565b5f5b82811015610af957848901358255600182019150602085019450602081019050610ad4565b86831015610b165784890135610b12601f891682610a28565b8355505b6001600288020188555050505b50505050505050565b610b35826106d9565b67ffffffffffffffff811115610b4e57610b4d61082c565b5b610b588254610886565b610b638282856109d6565b5f60209050601f831160018114610b94575f8415610b82578287015190505b610b8c8582610a44565b865550610bf3565b601f198416610ba2866108b6565b5f5b82811015610bc957848901518255600182019150602085019450602081019050610ba4565b86831015610be65784890151610be2601f891682610a28565b8355505b6001600288020188555050505b50505050505056fea2646970667358221220051650a481dc4c778486710cc76390f4ad0c2006fd90eab1a623c5e8d86549b564736f6c634300081e0033000000000000000000000000000000000000000000000000000000000000000000", + "storage": { + "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564": "0x0a0f010000000000000030851d41932d866f5fabed6673898e15473e6a0adcf5", + "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e566": "0x7f00000105e80707202d86b40a1d692c0749a0a0426e2021ee24e2430da0f5bb", + "0x00": "0x01cb", + "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e565": "0x033d2c93816c6b115c85ad3451e0bac61d570d5ed9f23e1e7f77c42f012d0400", + "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e568": "0x0749a0a0426e2021ee24e2430da0f5bb9c2ae6c586bf3e0a0f08000000000000", + "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e567": "0x9c2ae6c586bf3e0a0f08002f012d04007f00000105e80707202d86b40a1d692c", + "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563": "0x012d86b40a1d692c0749a0a0426e2021ee24e2430da0f5bb9c2ae6c586bf3e" + } + }, + "0x0000000000000000000000000000000000002000": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xAEd2a948892475F800A337427B3275D190EA3e94": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x7b254Bd44F6CE45e00a912b2460D47F3Be56fAD7": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x9B2C25E77a97d3e84DC0Cb7F83fb676ddC4F24b9": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x18c23753385ce7A60B15d171302E48b6AFf0BDC5": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x8Fa80A2f23c98324B7176100dcf66D1Fe37927f0": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0xA1d03C8F257150003E7113e36D8eBC2498Bdf598": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x58b4D15de822f0417aF64ecaC694a83bD31C53fd": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x36AA16C35f161555606825204FEb1E1fD952dd0d": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x20B67Ccff27D6a6fC02a661C83a947EB0aA41A0E": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x835B696b820923aa02D4dD40FF7D3C1031eF6144": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0xb97443B3Ec31dF6AE427FBcc6464c9C200F1b2FD": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x8A581EFFfe86Ebf73fD1FD83e028d82160374673": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0xbCA7A535953E1A157432Cea1D978C11075eA6e42": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x68FA8844dFc7906146C7f6666F924c0c790d43D4": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x1f7F546d8F176008e8Cd652116EFFb251f0BB196": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x0Cb1271c850DB29097e254Cbfc40523315bBf179": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x72BF363dA2fbDa2BC8db49C45a099BE3a9B2Be85": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0xD8c89dfb1025C83672BF9fe3E20DF0098c0c5b9b": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x860c6c0A7cb242c4b043b0BE7Ae5005e4268d74f": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0xBF8d084D5fbcAecd6595aCcb31Bc1515Da5554A7": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + }, + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": { + "balance": "0x1999999999999999999999999999999999999999999999999999999999999999" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} diff --git a/gravity/my_config/identity.yaml b/gravity/my_config/identity.yaml new file mode 100644 index 00000000..3ba24104 --- /dev/null +++ b/gravity/my_config/identity.yaml @@ -0,0 +1,4 @@ +account_address: 2d86b40a1d692c0749a0a0426e2021ee24e2430da0f5bb9c2ae6c586bf3e0a0f +account_private_key: 49e1215cc2c1963a39c72dd41c3639ab0615ad50dbdd48548e358fb516ba259b +consensus_private_key: "0x08f4f119547f55b86f8700963323585afc91e346f55d7a4bcfd928f3386834b8" +network_private_key: 200912a088598014b88cd1fb91dbdf2df18b352184a727c076f07cfd145fa267 diff --git a/gravity/my_config/nodes_config.json b/gravity/my_config/nodes_config.json new file mode 100644 index 00000000..65aebdcf --- /dev/null +++ b/gravity/my_config/nodes_config.json @@ -0,0 +1,11 @@ +{ + "nodes": [ + { + "peer_id": "2d86b40a1d692c0749a0a0426e2021ee24e2430da0f5bb9c2ae6c586bf3e0a0f", + "addresses": [ + "/ip4/127.0.0.1/tcp/2024/noise-ik/2d86b40a1d692c0749a0a0426e2021ee24e2430da0f5bb9c2ae6c586bf3e0a0f/handshake/0" + ] + } + ] +} + diff --git a/gravity/my_config/reth_config.json b/gravity/my_config/reth_config.json new file mode 100644 index 00000000..f6d82735 --- /dev/null +++ b/gravity/my_config/reth_config.json @@ -0,0 +1,40 @@ +{ + "reth_args": { + "chain": "./my_config/genesis.json", + "http": "", + "http.port": 8545, + "http.corsdomain": "*", + "http.api": "debug,eth,net,trace,txpool,web3,rpc", + "http.addr": "0.0.0.0", + "dev": "", + "port": 12024, + "authrpc.port": 8551, + "authrpc.addr": "0.0.0.0", + "metrics": "0.0.0.0:9001", + "log.file.filter": "info", + "datadir": "./gravity_node/data/reth", + "datadir.static-files": "./gravity_node/data/reth", + "gravity_node_config": "./my_config/validator.yaml", + "log.file.directory": "./gravity_node/execution_logs/", + "rpc.max-subscriptions-per-connection": 20000, + "rpc.max-connections": 20000, + "txpool.max-pending-txns": 1000000, + "txpool.pending-max-count": 17592186044415, + "txpool.pending-max-size": 17592186044415, + "txpool.basefee-max-count": 17592186044415, + "txpool.basefee-max-size": 17592186044415, + "txpool.queued-max-count": 17592186044415, + "txpool.queued-max-size": 17592186044415, + "gravity.pipe-block-gas-limit": 100000000000, + "gravity.disable-grevm": true, + "gravity.disable-pipe-execution": false, + "http.disable-compression": "" + }, + "env_vars": { + "MOCK_CONSENSUS": "true", + "MOCK_SET_ORDERED_INTERVAL_MS": "200", + "MOCK_MAX_BLOCK_SIZE": "1000", + "BATCH_INSERT_TIME": 20 + } +} + diff --git a/gravity/my_config/validator.yaml b/gravity/my_config/validator.yaml new file mode 100644 index 00000000..1c797045 --- /dev/null +++ b/gravity/my_config/validator.yaml @@ -0,0 +1,61 @@ +base: + role: "validator" + data_dir: "./gravity_node/data" + waypoint: + from_file: "./my_config/waypoint.txt" + +consensus: + safety_rules: + backend: + type: "on_disk_storage" + path: ./gravity_node/data/secure_storage.json + initial_safety_rules_config: + from_file: + waypoint: + from_file: ./my_config/waypoint.txt + identity_blob_path: ./my_config/identity.yaml + enable_pipeline: true + max_sending_block_txns_after_filtering: 15000 + max_sending_block_txns: 15000 + max_receiving_block_txns: 15000 + max_sending_block_bytes: 31457280 + max_receiving_block_bytes: 31457280 + quorum_store: + receiver_max_total_txns: 7000 + sender_max_total_txns: 7000 + receiver_max_batch_bytes: 1048736 + sender_max_batch_bytes: 1048736 + sender_max_total_bytes: 1073741824 + receiver_max_total_bytes: 1073741824 + memory_quota: 1073741824 # 1GB + db_quota: 1073741824 # 1GB + back_pressure: + dynamic_max_txn_per_s: 30000 + backlog_txn_limit_count: 50000 + backlog_per_validator_batch_limit_count: 2000 + +validator_network: + network_id: validator + listen_address: "/ip4/127.0.0.1/tcp/2024" + discovery_method: + file: + path: "./my_config/discovery" + interval_secs: 3600 + mutual_authentication: true + identity: + type: "from_file" + path: ./my_config/identity.yaml + +storage: + dir: "./gravity_node/data" + +node_config_path: "./my_config/nodes_config.json" + +log_file_path: "./gravity_node/consensus_log" + +inspection_service: + port: 10000 + address: 0.0.0.0 + +mempool: + capacity_per_user: 20000 diff --git a/gravity/my_config/waypoint.txt b/gravity/my_config/waypoint.txt new file mode 100644 index 00000000..7dc9690a --- /dev/null +++ b/gravity/my_config/waypoint.txt @@ -0,0 +1 @@ +0:0bbcef246836cfde5a016000f7324c837a42120e5c1d461265bbc16e81186810 \ No newline at end of file diff --git a/gravity/scripts/add_patch.sh b/gravity/scripts/add_patch.sh new file mode 100755 index 00000000..a626d450 --- /dev/null +++ b/gravity/scripts/add_patch.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Add gravity-reth patch to Cargo.toml if not already present + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +GRAVITY_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +cd "$GRAVITY_DIR" + +CARGO_TOML="gravity-sdk/Cargo.toml" + +if grep -qF '[patch."https://github.com/Galxe/gravity-reth"]' "$CARGO_TOML"; then + echo "Patch already exists. Nothing to do." + exit 0 +fi + +echo "" >> "$CARGO_TOML" +echo '[patch."https://github.com/Galxe/gravity-reth"]' >> "$CARGO_TOML" +echo 'greth = { path = "/Users/xzavieryuan/workspace/op-dev/gravity-reth" }' >> "$CARGO_TOML" +echo "Patch added successfully!" + diff --git a/gravity/scripts/build_gravity_node.sh b/gravity/scripts/build_gravity_node.sh new file mode 100644 index 00000000..3c69b762 --- /dev/null +++ b/gravity/scripts/build_gravity_node.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +GRAVITY_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +cd "$GRAVITY_DIR/gravity-sdk" && make gravity_node diff --git a/gravity/scripts/prepare.sh b/gravity/scripts/prepare.sh new file mode 100755 index 00000000..c1b372be --- /dev/null +++ b/gravity/scripts/prepare.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +GRAVITY_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +cd "$GRAVITY_DIR" + +git clone -b gravity-v0.4.1 https://github.com/Galxe/gravity-reth.git + +git clone -b v0.4.1 https://github.com/Galxe/gravity-sdk.git + +cd $GRAVITY_DIR/gravity-reth && git apply ../0001-local-testing.patch + +cd $GRAVITY_DIR && ./scripts/add_patch.sh diff --git a/gravity/scripts/start_mock.sh b/gravity/scripts/start_mock.sh new file mode 100755 index 00000000..cc239b6a --- /dev/null +++ b/gravity/scripts/start_mock.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +# Start gravity_node in MOCK mode + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +GRAVITY_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +cd "$GRAVITY_DIR" + +# Check if jq is installed +if ! command -v jq &> /dev/null; then + echo "Error: 'jq' is required but not installed. Please install 'jq' first." + exit 1 +fi + +# Configuration file path +reth_config="./my_config/reth_config.json" + +# Check if config file exists +if [ ! -f "$reth_config" ]; then + echo "Error: Config file '$reth_config' not found." + exit 1 +fi + +# Parse environment variables +while IFS= read -r key && IFS= read -r value; do + if [ -n "$value" ] && [ "$value" != "null" ]; then + export "${key}=${value}" + fi +done < <(jq -r '.env_vars | to_entries[] | .key, .value' "$reth_config") + +# Parse reth_args +reth_args=() +while IFS= read -r key && IFS= read -r value; do + # Special handling for gravity disable flags + if [[ "$key" == "gravity.disable-grevm" ]] || [[ "$key" == "gravity.disable-pipe-execution" ]]; then + if [ "$value" == "true" ]; then + reth_args+=( "--${key}" ) # Add flag to disable + fi + # If false or null, skip (don't add flag = enabled) + elif [ -z "$value" ] || [ "$value" == "null" ]; then + reth_args+=( "--${key}" ) + else + reth_args+=( "--${key}=${value}" ) + fi +done < <(jq -r '.reth_args | to_entries[] | .key, .value' "$reth_config") + +# Display startup information +echo "Starting gravity_node in MOCK mode..." +echo "MOCK_CONSENSUS=$MOCK_CONSENSUS" +echo "MOCK_SET_ORDERED_INTERVAL_MS=$MOCK_SET_ORDERED_INTERVAL_MS" +echo "MOCK_MAX_BLOCK_SIZE=$MOCK_MAX_BLOCK_SIZE" + +# Display optimization status +disable_grevm=$(jq -r '.reth_args."gravity.disable-grevm" // false' "$reth_config") +disable_pipe=$(jq -r '.reth_args."gravity.disable-pipe-execution" // false' "$reth_config") +echo "Grevm: $([ "$disable_grevm" == "true" ] && echo "DISABLED" || echo "ENABLED")" +echo "Pipeline: $([ "$disable_pipe" == "true" ] && echo "DISABLED" || echo "ENABLED")" +echo "" + +export RUST_BACKTRACE=1 + +# Start node in background +nohup ./gravity-sdk/target/release/gravity_node node "${reth_args[@]}" > gravity_node.out 2>&1 & +echo "gravity_node started in background (PID: $!)" +echo "Logs are written to: gravity_node.out" + diff --git a/tools/adventure/testdata/config.json b/tools/adventure/testdata/config.json index fc521c14..628d812f 100644 --- a/tools/adventure/testdata/config.json +++ b/tools/adventure/testdata/config.json @@ -1,11 +1,11 @@ { - "rpc": ["http://127.0.0.1:8123"], + "rpc": ["http://127.0.0.1:8545"], "accountsFilePath": "./testdata/accounts-20k.txt", "senderPrivateKey": "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", - "concurrency": 20, - "mempoolPauseThreshold": 50000, + "concurrency": 35, + "mempoolPauseThreshold": 100000, "targetTPS": 0, "maxBatchSize": 100, - "gasPriceGwei": 100, + "gasPriceGwei": 1, "saveTxHashes": false -} \ No newline at end of file +}