diff --git a/CHANGELOG.md b/CHANGELOG.md index 525c94496d09..4a84e98beba8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,8 @@ - [#4976](https://github.com/ChainSafe/forest/issues/4976) Add support for the `Filecoin.EthSubscribe` and `Filecoin.EthUnsubscribe` API methods to enable subscriptions to Ethereum event types: `heads` and `logs`. +- [#5999](https://github.com/ChainSafe/forest/pull/5999) Add `forest-cli mpool nonce` command to get the current nonce for an address. + ### Changed - [#5886](https://github.com/ChainSafe/forest/issues/5886) Updated `forest-tool archive metadata` to print F3 snapshot header info when applicable. diff --git a/docs/docs/users/reference/cli.sh b/docs/docs/users/reference/cli.sh index 55ca166d2a8e..96f3bdb69b4c 100755 --- a/docs/docs/users/reference/cli.sh +++ b/docs/docs/users/reference/cli.sh @@ -62,6 +62,7 @@ generate_markdown_section "forest-cli" "sync mark-bad" generate_markdown_section "forest-cli" "mpool" generate_markdown_section "forest-cli" "mpool pending" generate_markdown_section "forest-cli" "mpool stat" +generate_markdown_section "forest-cli" "mpool nonce" generate_markdown_section "forest-cli" "state" generate_markdown_section "forest-cli" "state fetch" diff --git a/src/cli/subcommands/mpool_cmd.rs b/src/cli/subcommands/mpool_cmd.rs index cfdfb0d60b4e..574ede2e7214 100644 --- a/src/cli/subcommands/mpool_cmd.rs +++ b/src/cli/subcommands/mpool_cmd.rs @@ -32,6 +32,11 @@ pub enum MpoolCommands { #[arg(long)] from: Option, }, + /// Get the current nonce for an address + Nonce { + /// Address to check nonce for + address: Address, + }, /// Print mempool stats Stat { /// Number of blocks to look back for minimum `basefee` @@ -273,6 +278,12 @@ impl MpoolCommands { print_stats(&stats, basefee_lookback); + Ok(()) + } + Self::Nonce { address } => { + let nonce = MpoolGetNonce::call(&client, (address,)).await?; + println!("{nonce}"); + Ok(()) } } diff --git a/src/tool/subcommands/api_cmd/api_compare_tests.rs b/src/tool/subcommands/api_cmd/api_compare_tests.rs index 1b28f2e57e0e..5e03f9257e68 100644 --- a/src/tool/subcommands/api_cmd/api_compare_tests.rs +++ b/src/tool/subcommands/api_cmd/api_compare_tests.rs @@ -81,6 +81,14 @@ static KNOWN_CALIBNET_ADDRESS: LazyLock
= LazyLock::new(|| { .into() }); +/// This address is known to be empty on calibnet. It should always have a zero balance. +static KNOWN_EMPTY_CALIBNET_ADDRESS: LazyLock
= LazyLock::new(|| { + crate::shim::address::Network::Testnet + .parse_address("t1qb2x5qctp34rxd7ucl327h5ru6aazj2heno7x5y") + .unwrap() + .into() +}); + const TICKET_QUALITY_GREEDY: f64 = 0.9; const TICKET_QUALITY_OPTIMAL: f64 = 0.8; const ZERO_ADDRESS: &str = "0x0000000000000000000000000000000000000000"; @@ -506,6 +514,16 @@ fn auth_tests() -> anyhow::Result> { fn mpool_tests() -> Vec { vec![ RpcTest::identity(MpoolGetNonce::request((*KNOWN_CALIBNET_ADDRESS,)).unwrap()), + // This should cause an error with `actor not found` in both Lotus and Forest. The messages + // are quite different, so we don't do strict equality check. + // "forest_response": { + // "Err": "ErrorObject { code: InternalError, message: \"Actor not found: addr=t1qb2x5qctp34rxd7ucl327h5ru6aazj2heno7x5y\", data: None }" + // }, + // "lotus_response": { + // "Err": "ErrorObject { code: ServerError(1), message: \"resolution lookup failed (t1qb2x5qctp34rxd7ucl327h5ru6aazj2heno7x5y): resolve address t1qb2x5qctp34rxd7ucl327h5ru6aazj2heno7x5y: actor not found\", data: None }" + // } + RpcTest::identity(MpoolGetNonce::request((*KNOWN_EMPTY_CALIBNET_ADDRESS,)).unwrap()) + .policy_on_rejected(PolicyOnRejected::Pass), RpcTest::basic(MpoolPending::request((ApiTipsetKey(None),)).unwrap()), RpcTest::basic(MpoolSelect::request((ApiTipsetKey(None), TICKET_QUALITY_GREEDY)).unwrap()), RpcTest::basic(MpoolSelect::request((ApiTipsetKey(None), TICKET_QUALITY_OPTIMAL)).unwrap()) @@ -1147,7 +1165,7 @@ fn wallet_tests(worker_address: Option
) -> Vec { Address::from_str("t3wmbvnabsj6x2uki33phgtqqemmunnttowpx3chklrchy76pv52g5ajnaqdypxoomq5ubfk65twl5ofvkhshq").unwrap(), Address::from_str("t410fx2cumi6pgaz64varl77xbuub54bgs3k5xsvn3ki").unwrap(), // This address should have 0 FIL - Address::from_str("t1qb2x5qctp34rxd7ucl327h5ru6aazj2heno7x5y").unwrap(), + *KNOWN_EMPTY_CALIBNET_ADDRESS, ]; let mut tests = vec![]; diff --git a/src/tool/subcommands/api_cmd/test_snapshots.txt b/src/tool/subcommands/api_cmd/test_snapshots.txt index e3eec68b33f0..c5046217acc9 100644 --- a/src/tool/subcommands/api_cmd/test_snapshots.txt +++ b/src/tool/subcommands/api_cmd/test_snapshots.txt @@ -62,6 +62,8 @@ filecoin_ethuninstallfilter_1737446676698857.rpcsnap.json.zst filecoin_gasestimategaslimit_1741782110512299.rpcsnap.json.zst filecoin_getactoreventsraw_1741782590255476.rpcsnap.json.zst filecoin_minergetbaseinfo_1737022538681402.rpcsnap.json.zst +filecoin_mpoolgetnonce_1756218632700175.rpcsnap.json.zst +filecoin_mpoolgetnonce_1756220013069333.rpcsnap.json.zst filecoin_msiggetavailablebalance_1741782824665885.rpcsnap.json.zst filecoin_msiggetpending_1741783576868798.rpcsnap.json.zst filecoin_msiggetvested_1741783652819678.rpcsnap.json.zst diff --git a/src/tool/subcommands/api_cmd/test_snapshots_ignored.txt b/src/tool/subcommands/api_cmd/test_snapshots_ignored.txt index e00ed4fa1c72..82ee8c2d4c47 100644 --- a/src/tool/subcommands/api_cmd/test_snapshots_ignored.txt +++ b/src/tool/subcommands/api_cmd/test_snapshots_ignored.txt @@ -39,7 +39,6 @@ Filecoin.MarketAddBalance Filecoin.MinerCreateBlock Filecoin.MpoolBatchPush Filecoin.MpoolBatchPushUntrusted -Filecoin.MpoolGetNonce Filecoin.MpoolPending Filecoin.MpoolPush Filecoin.MpoolPushMessage