Skip to content
4 changes: 4 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 3 additions & 18 deletions bin/ev-reth/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,6 @@
#![allow(missing_docs, rustdoc::missing_crate_level_docs)]

use clap::Parser;
use evolve_ev_reth::{
config::EvolveConfig,
rpc::txpool::{EvolveTxpoolApiImpl, EvolveTxpoolApiServer},
};
use reth_ethereum_cli::Cli;
use reth_tracing_otlp::{OtlpConfig, OtlpProtocol};
use tracing::info;
Expand Down Expand Up @@ -98,20 +94,9 @@ fn main() {
if let Err(err) =
Cli::<EvolveChainSpecParser, EvolveArgs>::parse().run(|builder, _evolve_args| async move {
log_startup();
let handle = builder
.node(EvolveNode::new())
.extend_rpc_modules(move |ctx| {
// Build custom txpool RPC with config + optional CLI/env override
let evolve_cfg = EvolveConfig::default();
let evolve_txpool =
EvolveTxpoolApiImpl::new(ctx.pool().clone(), evolve_cfg.max_txpool_bytes);

// Merge into all enabled transports (HTTP / WS)
ctx.modules.merge_configured(evolve_txpool.into_rpc())?;
Ok(())
})
.launch()
.await?;
// The evolve txpool and proposer RPC modules are registered by
// `EvolveNode::add_ons`.
let handle = builder.node(EvolveNode::new()).launch().await?;

info!("=== EV-RETH: Node launched successfully with ev-reth payload builder ===");
handle.node_exit_future.await
Expand Down
62 changes: 61 additions & 1 deletion crates/ev-precompiles/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Custom EVM precompiles for Evolve, providing native token supply management func

## Overview

This crate implements custom precompiled contracts that extend the EVM with Evolve-specific functionality. Currently, it provides a mint/burn precompile that allows controlled manipulation of native token supply.
This crate implements custom precompiled contracts that extend the EVM with Evolve-specific functionality. It provides a mint/burn precompile for controlled native token supply management and a proposer-control precompile for execution-owned ev-node proposer rotation.

## Mint Precompile

Expand Down Expand Up @@ -190,3 +190,63 @@ cast send --rpc-url $RPC_URL --private-key $OPERATOR_KEY \
0x000000000000000000000000000000000000f100 \
"mint(address,uint256)" 0xRECIPIENT 1000000000000000000
```

## Proposer Control Precompile

The proposer control precompile stores the ev-node proposer that should sign the next block. It is
used by the ev-node EVM execution adapter to populate ADR-023's `NextProposerAddress` from execution
state.

### Address

```
0x000000000000000000000000000000000000f101
```
Comment thread
coderabbitai[bot] marked this conversation as resolved.

### Interface

```solidity
interface IProposerControl {
function nextProposer() external view returns (address);
function setNextProposer(address proposer) external;
function admin() external view returns (address);
}
```

### Configuration

```json
{
"config": {
"evolve": {
"proposerControlAdmin": "0x1234567890123456789012345678901234567890",
"proposerControlActivationHeight": 0,
"initialNextProposer": "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"
}
}
}
```

For existing chains, set `proposerControlActivationHeight` to a future block and upgrade all nodes
before that height. `initialNextProposer` should be the currently active proposer so reads are stable
before the first rotation transaction.

### Operations

The configured admin rotates the next proposer with:

```bash
cast send --rpc-url $RPC_URL --private-key $ADMIN_KEY \
0x000000000000000000000000000000000000f101 \
"setNextProposer(address)" 0xNEXT_PROPOSER
```

The stored proposer can be read through either the precompile ABI or ev-reth's convenience RPC:

```bash
cast call --rpc-url $RPC_URL \
0x000000000000000000000000000000000000f101 \
"nextProposer()(address)"

cast rpc --rpc-url $RPC_URL evolve_getNextProposer latest
```
Comment on lines +208 to +252

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Update proposer ABI/docs to bytes32 to match the implemented precompile.

Lines 210-212, 241-242, and 249 currently document address, but crates/ev-precompiles/src/proposer.rs implements nextProposer()/setNextProposer as bytes32. Following the current README will produce incorrect calldata/signatures and failed calls.

Suggested doc diff
 interface IProposerControl {
-    function nextProposer() external view returns (address);
-    function setNextProposer(address proposer) external;
+    function nextProposer() external view returns (bytes32);
+    function setNextProposer(bytes32 proposer) external;
     function admin() external view returns (address);
 }

-cast send ... "setNextProposer(address)" 0xNEXT_PROPOSER
+cast send ... "setNextProposer(bytes32)" 0x<64-hex-bytes>

-cast call ... "nextProposer()(address)"
+cast call ... "nextProposer()(bytes32)"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
```solidity
interface IProposerControl {
function nextProposer() external view returns (address);
function setNextProposer(address proposer) external;
function admin() external view returns (address);
}
```
### Configuration
```json
{
"config": {
"evolve": {
"proposerControlAdmin": "0x1234567890123456789012345678901234567890",
"proposerControlActivationHeight": 0,
"initialNextProposer": "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"
}
}
}
```
For existing chains, set `proposerControlActivationHeight` to a future block and upgrade all nodes
before that height. `initialNextProposer` should be the currently active proposer so reads are stable
before the first rotation transaction.
### Operations
The configured admin rotates the next proposer with:
```bash
cast send --rpc-url $RPC_URL --private-key $ADMIN_KEY \
0x000000000000000000000000000000000000f101 \
"setNextProposer(address)" 0xNEXT_PROPOSER
```
The stored proposer can be read through either the precompile ABI or ev-reth's convenience RPC:
```bash
cast call --rpc-url $RPC_URL \
0x000000000000000000000000000000000000f101 \
"nextProposer()(address)"
cast rpc --rpc-url $RPC_URL evolve_getNextProposer latest
```
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/ev-precompiles/README.md` around lines 208 - 252, The README docs and
example ABI need to use bytes32 for proposer values to match the precompile:
update the IProposerControl interface declaration (replace address with bytes32
for nextProposer() and setNextProposer(bytes32)), change the JSON config keys
(proposerControlAdmin stays address but initialNextProposer must be a bytes32
value), and update all example CLI commands and cast calls to pass/expect a
bytes32 (and the corresponding calldata/signature) instead of an address; verify
references to nextProposer and setNextProposer in the prose reflect bytes32
semantics to avoid mismatched calldata with
crates/ev-precompiles/src/proposer.rs.

1 change: 1 addition & 0 deletions crates/ev-precompiles/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
pub mod mint;
pub mod proposer;
Loading