diff --git a/CHANGELOG.md b/CHANGELOG.md index ad859aac4760..241ca8619081 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,8 @@ ### Fixed +- [#7018](https://github.com/ChainSafe/forest/issues/7018): Fixed `forest-wallet set-default` failing when the keystore has no `default` entry. + ## Forest v0.33.4 "Stray" Mandatory release for mainnet node operators. It includes support for the _NV28 FireHorse_ network upgrade on mainnet, which is set to activate at epoch `6052800` (2026-05-27T14:00:00Z). It also includes a few improvements and fixes for the JSON-RPC server. diff --git a/src/key_management/wallet.rs b/src/key_management/wallet.rs index fe8ee2684992..698758b5bd16 100644 --- a/src/key_management/wallet.rs +++ b/src/key_management/wallet.rs @@ -120,15 +120,7 @@ impl Wallet { /// Set a default `KeyInfo` to the wallet pub fn set_default(&mut self, addr: Address) -> anyhow::Result<()> { - let addr_string = format!("wallet-{addr}"); - let key_info = self.keystore.get(&addr_string)?; - if self.keystore.get("default").is_ok() { - self.keystore.remove("default")?; // This line should - // unregister current - // default key then - // continue - } - self.keystore.put("default", key_info)?; + set_default(&addr, &mut self.keystore)?; Ok(()) } @@ -227,6 +219,16 @@ pub fn try_find_key(addr: &Address, keystore: &KeyStore) -> Result { ki.try_into() } +/// Set the default key to the key identified by `addr`. +pub fn set_default(addr: &Address, keystore: &mut KeyStore) -> Result<(), Error> { + let key_info = try_find(addr, keystore)?; + if keystore.get("default").is_ok() { + keystore.remove("default")?; + } + keystore.put("default", key_info)?; + Ok(()) +} + /// Return `KeyInfo` for given address in `KeyStore` pub fn export_key_info(addr: &Address, keystore: &KeyStore) -> Result { let key = try_find_key(addr, keystore)?; diff --git a/src/rpc/methods/wallet.rs b/src/rpc/methods/wallet.rs index 6a82b214c595..9c740bacd34a 100644 --- a/src/rpc/methods/wallet.rs +++ b/src/rpc/methods/wallet.rs @@ -189,11 +189,7 @@ impl RpcMethod<1> for WalletSetDefault { (address,): Self::Params, _: &http::Extensions, ) -> Result { - let mut keystore = ctx.keystore.write(); - let addr_string = format!("wallet-{address}"); - let key_info = keystore.get(&addr_string)?; - keystore.remove("default")?; // This line should unregister current default key then continue - keystore.put("default", key_info)?; + crate::key_management::set_default(&address, &mut ctx.keystore.write())?; Ok(()) } } diff --git a/src/wallet/subcommands/wallet_cmd.rs b/src/wallet/subcommands/wallet_cmd.rs index 9796573a3c69..d3dff1103b11 100644 --- a/src/wallet/subcommands/wallet_cmd.rs +++ b/src/wallet/subcommands/wallet_cmd.rs @@ -159,10 +159,7 @@ impl WalletBackend { async fn wallet_set_default(&mut self, address: Address) -> anyhow::Result<()> { if let Some(keystore) = &mut self.local { - let addr_string = format!("wallet-{address}"); - let key_info = keystore.get(&addr_string)?; - keystore.remove("default")?; // This line should unregister current default key then continue - keystore.put("default", key_info)?; + crate::key_management::set_default(&address, keystore)?; Ok(()) } else { Ok(WalletSetDefault::call(&self.remote, (address,)).await?)