Skip to content
Draft
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.

14 changes: 13 additions & 1 deletion bin/ev-dev/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@ use reth_ethereum_cli::Cli;
use std::io::Write;
use tracing::info;

use ev_node::{EvolveArgs, EvolveChainSpecParser, EvolveNode};
use ev_node::{
EvolveArgs, EvolveChainSpecParser, EvolveNode, EvolvePayloadBuilderConfig,
EvolveProposerApiImpl, EvolveProposerApiServer,
};

#[global_allocator]
static ALLOC: reth_cli_util::allocator::Allocator = reth_cli_util::allocator::new_allocator();
Expand Down Expand Up @@ -209,7 +212,16 @@ fn main() {
let evolve_cfg = EvolveConfig::default();
let evolve_txpool =
EvolveTxpoolApiImpl::new(ctx.pool().clone(), evolve_cfg.max_txpool_bytes);
let proposer_cfg =
EvolvePayloadBuilderConfig::from_chain_spec(ctx.config().chain.as_ref())?;
let initial_next_proposer = proposer_cfg
.proposer_control_precompile_settings()
.map(|(_, _, initial_next_proposer)| initial_next_proposer)
.unwrap_or_default();
let proposer_api =
EvolveProposerApiImpl::new(ctx.provider().clone(), initial_next_proposer);
ctx.modules.merge_configured(evolve_txpool.into_rpc())?;
ctx.modules.merge_configured(proposer_api.into_rpc())?;
Ok(())
})
.launch_with_debug_capabilities()
Expand Down
14 changes: 13 additions & 1 deletion bin/ev-reth/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@ use tracing::info;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, Layer};
use url::Url;

use ev_node::{log_startup, EvolveArgs, EvolveChainSpecParser, EvolveNode};
use ev_node::{
log_startup, EvolveArgs, EvolveChainSpecParser, EvolveNode, EvolvePayloadBuilderConfig,
EvolveProposerApiImpl, EvolveProposerApiServer,
};

#[global_allocator]
static ALLOC: reth_cli_util::allocator::Allocator = reth_cli_util::allocator::new_allocator();
Expand Down Expand Up @@ -105,9 +108,18 @@ fn main() {
let evolve_cfg = EvolveConfig::default();
let evolve_txpool =
EvolveTxpoolApiImpl::new(ctx.pool().clone(), evolve_cfg.max_txpool_bytes);
let proposer_cfg =
EvolvePayloadBuilderConfig::from_chain_spec(ctx.config().chain.as_ref())?;
let initial_next_proposer = proposer_cfg
.proposer_control_precompile_settings()
.map(|(_, _, initial_next_proposer)| initial_next_proposer)
.unwrap_or_default();
let proposer_api =
EvolveProposerApiImpl::new(ctx.provider().clone(), initial_next_proposer);

// Merge into all enabled transports (HTTP / WS)
ctx.modules.merge_configured(evolve_txpool.into_rpc())?;
ctx.modules.merge_configured(proposer_api.into_rpc())?;
Ok(())
})
.launch()
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
```

### 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
```
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
Loading