Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
70 changes: 69 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,71 @@ 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 (bytes32);
function setNextProposer(bytes32 proposer) external;
function admin() external view returns (address);
}
```

The proposer is an opaque 32-byte value rather than an `address` so it can hold proposer
identities that are not 20-byte EVM addresses (ev-node signer keys). For an EVM address,
left-pad it to 32 bytes. The precompile only rejects the zero value; it does not validate
that the bytes encode a usable proposer identity, so the admin must submit a correct value.

### Configuration

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

`initialNextProposer` is a 32-byte value (a 20-byte address must be left-padded, as above).
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(bytes32)" \
0x000000000000000000000000$(echo $NEXT_PROPOSER_ADDR | cut -c3-)
```

The stored proposer can be read through either the precompile ABI or ev-reth's convenience RPC
(only registered when `proposerControlAdmin` is configured):

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

cast rpc --rpc-url $RPC_URL evolve_getNextProposer latest
```
Comment thread
coderabbitai[bot] marked this conversation as resolved.
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