Skip to content

Commit af6a261

Browse files
committed
add immutable
1 parent 88c1c7b commit af6a261

File tree

6 files changed

+67
-7
lines changed

6 files changed

+67
-7
lines changed

crates/anvil-polkadot/src/api_server/server.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,9 @@ impl ApiServer {
359359
EthRequest::SetStorageAt(address, key, value) => {
360360
self.set_storage_at(address, key, value).to_rpc_result()
361361
}
362+
EthRequest::SetImmutableStorageAt(address, data) => {
363+
self.set_immutable_storage_at(address, data).to_rpc_result()
364+
}
362365
EthRequest::SetChainId(chain_id) => self.set_chain_id(chain_id).to_rpc_result(),
363366
// --- Revert ---
364367
EthRequest::EvmSnapshot(()) => self.snapshot().await.to_rpc_result(),
@@ -1316,6 +1319,20 @@ impl ApiServer {
13161319
Ok(())
13171320
}
13181321

1322+
fn set_immutable_storage_at(
1323+
&self,
1324+
address: Address,
1325+
data: alloy_primitives::Bytes,
1326+
) -> Result<()> {
1327+
node_info!("anvil_setImmutableStorageAt");
1328+
1329+
let latest_block = self.latest_block();
1330+
1331+
self.backend.inject_immutable_data(latest_block, address, data.to_vec());
1332+
1333+
Ok(())
1334+
}
1335+
13191336
// ----- Wallet RPCs
13201337
async fn sign(&self, address: Address, content: impl AsRef<[u8]>) -> Result<String> {
13211338
node_info!("eth_sign");

crates/anvil-polkadot/src/substrate_node/genesis.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,20 @@ use alloy_primitives::{Address, U256};
99
use codec::Encode;
1010
use polkadot_sdk::{
1111
pallet_revive::{evm::Account, genesis::ContractData},
12-
sc_chain_spec::{BuildGenesisBlock, resolve_state_version_from_wasm},
13-
sc_client_api::{BlockImportOperation, backend::Backend},
12+
sc_chain_spec::{resolve_state_version_from_wasm, BuildGenesisBlock},
13+
sc_client_api::{backend::Backend, BlockImportOperation},
1414
sc_executor::RuntimeVersionOf,
1515
sp_blockchain,
16-
sp_core::{self, H160, storage::Storage},
16+
sp_core::{self, storage::Storage, H160},
1717
sp_runtime::{
18-
BuildStorage, FixedU128,
1918
traits::{Block as BlockT, Hash as HashT, HashingFor, Header as HeaderT},
19+
BuildStorage, FixedU128,
2020
},
2121
};
2222
use serde::{Deserialize, Serialize};
23-
use serde_json::{Value, json};
23+
use serde_json::{json, Value};
2424
use std::{collections::BTreeMap, marker::PhantomData, sync::Arc};
25-
use substrate_runtime::{WASM_BINARY, constants::NATIVE_TO_ETH_RATIO};
25+
use substrate_runtime::{constants::NATIVE_TO_ETH_RATIO, WASM_BINARY};
2626
use subxt_signer::eth::Keypair;
2727

2828
/// Genesis settings
@@ -116,7 +116,13 @@ impl GenesisConfig {
116116
let genesis_nonce: u64 = account.nonce.unwrap_or_default();
117117
let contract_data: Option<ContractData> = if account.code.is_some() {
118118
Some(ContractData {
119-
code: account.code.clone().map(|code| code.to_vec()).unwrap_or_default(),
119+
code: account
120+
.code
121+
.clone()
122+
.map(|code| code.to_vec())
123+
.unwrap_or_default()
124+
.into(),
125+
immutable_data: Default::default(),
120126
storage: account
121127
.storage
122128
.clone()

crates/anvil-polkadot/src/substrate_node/service/backend.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,11 @@ impl BackendWithOverlay {
207207
overrides.set_code_info(at, code_hash, code_info);
208208
}
209209

210+
pub fn inject_immutable_data(&self, at: Hash, address: Address, data: Vec<u8>) {
211+
let mut overrides = self.overrides.lock();
212+
overrides.set_immutable_data(at, address, data);
213+
}
214+
210215
pub fn inject_child_storage(
211216
&self,
212217
at: Hash,
@@ -353,6 +358,16 @@ impl StorageOverrides {
353358
self.add(latest_block, changeset);
354359
}
355360

361+
fn set_immutable_data(&mut self, latest_block: Hash, address: Address, data: Vec<u8>) {
362+
let mut changeset = BlockOverrides::default();
363+
changeset.top.insert(
364+
well_known_keys::immutable_data_of(H160::from_slice(address.as_slice())),
365+
Some(data.encode()),
366+
);
367+
368+
self.add(latest_block, changeset);
369+
}
370+
356371
fn set_child_storage(
357372
&mut self,
358373
latest_block: Hash,

crates/anvil-polkadot/src/substrate_node/service/storage.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,13 @@ pub mod well_known_keys {
9090

9191
key
9292
}
93+
94+
pub fn immutable_data_of(address: H160) -> Vec<u8> {
95+
let mut key = Vec::new();
96+
key.extend_from_slice(&twox_128("Revive".as_bytes()));
97+
key.extend_from_slice(&twox_128("ImmutableDataOf".as_bytes()));
98+
key.extend_from_slice(&address.encode());
99+
100+
key
101+
}
93102
}

crates/anvil/core/src/eth/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,14 @@ pub enum EthRequest {
428428
B256,
429429
),
430430

431+
/// Sets the immutable data associated with a contract address
432+
#[serde(rename = "anvil_setImmutableStorageAt")]
433+
SetImmutableStorageAt(
434+
Address,
435+
/// immutable data
436+
Bytes,
437+
),
438+
431439
/// Sets the coinbase address
432440
#[serde(rename = "anvil_setCoinbase", alias = "hardhat_setCoinbase", with = "sequence")]
433441
SetCoinbase(Address),

crates/anvil/src/eth/api.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,11 @@ impl EthApi {
392392
EthRequest::SetStorageAt(addr, slot, val) => {
393393
self.anvil_set_storage_at(addr, slot, val).await.to_rpc_result()
394394
}
395+
EthRequest::SetImmutableStorageAt(_, _) => {
396+
return ResponseResult::Error(RpcError::invalid_params(
397+
"anvil_setImmutableStorageAt is not supported on EVM anvil",
398+
));
399+
}
395400
EthRequest::SetCoinbase(addr) => self.anvil_set_coinbase(addr).await.to_rpc_result(),
396401
EthRequest::EthCoinbase(()) => self.author().to_rpc_result(),
397402
EthRequest::SetChainId(id) => self.anvil_set_chain_id(id).await.to_rpc_result(),

0 commit comments

Comments
 (0)