Skip to content

Commit 545deca

Browse files
feat(anvil): add Tempo anvil API tests (#14140)
1 parent 2bd2707 commit 545deca

1 file changed

Lines changed: 113 additions & 0 deletions

File tree

crates/anvil/tests/it/anvil_api.rs

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,3 +1190,116 @@ async fn test_anvil_reset_fork_to_non_fork() {
11901190
let new_block = provider.get_block(BlockId::latest()).await.unwrap().unwrap();
11911191
assert_eq!(new_block.header.number, 1);
11921192
}
1193+
1194+
#[tokio::test(flavor = "multi_thread")]
1195+
async fn can_get_node_info_tempo_t0() {
1196+
let (api, handle) = spawn(NodeConfig::test_tempo()).await;
1197+
1198+
let node_info = api.anvil_node_info().await.unwrap();
1199+
1200+
let provider = handle.http_provider();
1201+
1202+
let block_number = provider.get_block_number().await.unwrap();
1203+
let block = provider.get_block(BlockId::from(block_number)).await.unwrap().unwrap();
1204+
1205+
let expected_node_info = NodeInfo {
1206+
current_block_number: 0_u64,
1207+
current_block_timestamp: 1,
1208+
current_block_hash: block.header.hash,
1209+
hard_fork: "T0".to_string(),
1210+
transaction_order: "fees".to_owned(),
1211+
environment: NodeEnvironment {
1212+
base_fee: 10_000_000_000,
1213+
chain_id: 31337,
1214+
gas_limit: 30_000_000,
1215+
gas_price: 11_000_000_000,
1216+
},
1217+
fork_config: NodeForkConfig {
1218+
fork_url: None,
1219+
fork_block_number: None,
1220+
fork_retry_backoff: None,
1221+
},
1222+
network: Some("tempo".to_string()),
1223+
};
1224+
1225+
assert_eq!(node_info, expected_node_info);
1226+
}
1227+
1228+
#[tokio::test(flavor = "multi_thread")]
1229+
async fn can_get_node_info_tempo_t1() {
1230+
use tempo_chainspec::hardfork::TempoHardfork;
1231+
1232+
let config = NodeConfig::test_tempo().with_hardfork(Some(TempoHardfork::T1.into()));
1233+
let (api, handle) = spawn(config).await;
1234+
1235+
let node_info = api.anvil_node_info().await.unwrap();
1236+
1237+
let provider = handle.http_provider();
1238+
1239+
let block_number = provider.get_block_number().await.unwrap();
1240+
let block = provider.get_block(BlockId::from(block_number)).await.unwrap().unwrap();
1241+
1242+
let expected_node_info = NodeInfo {
1243+
current_block_number: 0_u64,
1244+
current_block_timestamp: 1,
1245+
current_block_hash: block.header.hash,
1246+
hard_fork: "T1".to_string(),
1247+
transaction_order: "fees".to_owned(),
1248+
environment: NodeEnvironment {
1249+
base_fee: 20_000_000_000,
1250+
chain_id: 31337,
1251+
gas_limit: 30_000_000,
1252+
gas_price: 21_000_000_000,
1253+
},
1254+
fork_config: NodeForkConfig {
1255+
fork_url: None,
1256+
fork_block_number: None,
1257+
fork_retry_backoff: None,
1258+
},
1259+
network: Some("tempo".to_string()),
1260+
};
1261+
1262+
assert_eq!(node_info, expected_node_info);
1263+
}
1264+
1265+
#[tokio::test(flavor = "multi_thread")]
1266+
async fn can_deal_erc20_tempo() {
1267+
use foundry_evm::core::tempo::{ALPHA_USD_ADDRESS, PATH_USD_ADDRESS};
1268+
1269+
let (api, _handle) = spawn(NodeConfig::test_tempo()).await;
1270+
1271+
let target = Address::random();
1272+
1273+
// TIP20 tokens are precompile-backed — anvil_dealERC20 uses access-list slot probing
1274+
// which doesn't discover precompile storage slots. Verify this fails gracefully.
1275+
for token_addr in [PATH_USD_ADDRESS, ALPHA_USD_ADDRESS] {
1276+
let amount = U256::from(5_000_000); // 5 tokens (6 decimals)
1277+
1278+
let result = api.anvil_deal_erc20(target, token_addr, amount).await;
1279+
assert!(
1280+
result.is_err(),
1281+
"anvil_dealERC20 should fail for precompile-based TIP20 {token_addr}"
1282+
);
1283+
1284+
let err = result.unwrap_err().to_string();
1285+
assert!(
1286+
err.contains("no slot found"),
1287+
"Error should mention slot discovery failure, got: {err}"
1288+
);
1289+
}
1290+
}
1291+
1292+
#[tokio::test(flavor = "multi_thread")]
1293+
async fn can_get_default_base_fee_tempo() {
1294+
let (api, handle) = spawn(NodeConfig::test_tempo()).await;
1295+
let provider = handle.http_provider();
1296+
1297+
api.mine_one().await;
1298+
1299+
let block = provider.get_block(BlockNumberOrTag::Latest.into()).await.unwrap().unwrap();
1300+
assert_eq!(
1301+
block.header.base_fee_per_gas,
1302+
Some(10_000_000_000),
1303+
"T0 base fee should be 10 billion attodollars"
1304+
);
1305+
}

0 commit comments

Comments
 (0)