diff --git a/applications/tari_walletd/src/handlers/accounts.rs b/applications/tari_walletd/src/handlers/accounts.rs index 61c82e0adf..b64b4dbc0a 100644 --- a/applications/tari_walletd/src/handlers/accounts.rs +++ b/applications/tari_walletd/src/handlers/accounts.rs @@ -59,6 +59,8 @@ use tari_wallet_daemon_client::{ AccountsGetBalancesResponse, AccountsListRequest, AccountsListResponse, + AccountsRenameRequest, + AccountsRenameResponse, AccountsTransferRequest, AccountsTransferResponse, BalanceEntry, @@ -213,6 +215,19 @@ pub async fn handle_set_default( Ok(AccountSetDefaultResponse {}) } +pub async fn handle_rename( + context: &HandlerContext, + token: Option<&Bearer>, + req: AccountsRenameRequest, +) -> Result { + context.check_auth(token, &[JrpcPermission::Admin])?; + let sdk = context.wallet_sdk(); + let account = get_account(&req.account, &sdk.accounts_api())?; + sdk.accounts_api() + .rename_account(account.component_address(), &req.new_name)?; + Ok(AccountsRenameResponse {}) +} + pub async fn handle_list( context: &HandlerContext, token: Option<&Bearer>, diff --git a/applications/tari_walletd/src/jrpc_server.rs b/applications/tari_walletd/src/jrpc_server.rs index 359a8b934b..5aecf283ab 100644 --- a/applications/tari_walletd/src/jrpc_server.rs +++ b/applications/tari_walletd/src/jrpc_server.rs @@ -143,6 +143,7 @@ async fn handler( }, "stealth_transfer" => call_handler(context, value, token, accounts::handle_stealth_transfer).await, "set_default" => call_handler(context, value, token, accounts::handle_set_default).await, + "rename" => call_handler(context, value, token, accounts::handle_rename).await, "create_free_test_coins" => { call_handler(context, value, token, accounts::handle_create_free_test_coins).await }, diff --git a/bindings/package.json b/bindings/package.json index c9bc0fd50a..1255ddf0d3 100644 --- a/bindings/package.json +++ b/bindings/package.json @@ -1,6 +1,6 @@ { "name": "@tari-project/typescript-bindings", - "version": "1.17.0", + "version": "1.17.1", "description": "TypeScript types synchronized to the Tari Ootle Rust codebase", "homepage": "https://github.com/tari-project/tari-ootle#readme", "bugs": { diff --git a/bindings/src/types/wallet-daemon-client/AccountsRenameRequest.ts b/bindings/src/types/wallet-daemon-client/AccountsRenameRequest.ts new file mode 100644 index 0000000000..6bc49ff538 --- /dev/null +++ b/bindings/src/types/wallet-daemon-client/AccountsRenameRequest.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { ComponentAddressOrName } from "./ComponentAddressOrName"; + +export type AccountsRenameRequest = { account: ComponentAddressOrName; new_name: string }; diff --git a/bindings/src/types/wallet-daemon-client/AccountsRenameResponse.ts b/bindings/src/types/wallet-daemon-client/AccountsRenameResponse.ts new file mode 100644 index 0000000000..19ae15ef6e --- /dev/null +++ b/bindings/src/types/wallet-daemon-client/AccountsRenameResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type AccountsRenameResponse = Record; diff --git a/bindings/src/wallet-daemon-client.ts b/bindings/src/wallet-daemon-client.ts index eaa98e38a3..83f0e38e4e 100644 --- a/bindings/src/wallet-daemon-client.ts +++ b/bindings/src/wallet-daemon-client.ts @@ -61,6 +61,7 @@ export * from "./types/wallet-daemon-client/TransactionSubmitManifestRequest"; export * from "./types/wallet-daemon-client/ConfidentialTransferResponse"; export * from "./types/wallet-daemon-client/TransactionGetResponse"; export * from "./types/wallet-daemon-client/SubstatesGetResponse"; +export * from "./types/wallet-daemon-client/AccountsRenameRequest"; export * from "./types/wallet-daemon-client/AuthRevokeTokenRequest"; export * from "./types/wallet-daemon-client/ProofsGenerateRequest"; export * from "./types/wallet-daemon-client/MintFaucetNftResponse"; @@ -95,6 +96,7 @@ export * from "./types/wallet-daemon-client/TemplatesGetResponse"; export * from "./types/wallet-daemon-client/AccountsGetBalancesRequest"; export * from "./types/wallet-daemon-client/AccountsCreateFreeTestCoinsRequest"; export * from "./types/wallet-daemon-client/AccountGetByKeyIndexRequest"; +export * from "./types/wallet-daemon-client/AccountsRenameResponse"; export * from "./types/wallet-daemon-client/KeysCreateResponse"; export * from "./types/wallet-daemon-client/AccountsCreateOrGetResponse"; export * from "./types/wallet-daemon-client/AccountInfo"; diff --git a/clients/javascript/wallet_daemon_client/package.json b/clients/javascript/wallet_daemon_client/package.json index 21c123d8a0..a9a501c370 100644 --- a/clients/javascript/wallet_daemon_client/package.json +++ b/clients/javascript/wallet_daemon_client/package.json @@ -1,6 +1,6 @@ { "name": "@tari-project/wallet_jrpc_client", - "version": "1.9.0", + "version": "1.9.1", "description": "Tari wallet JSON-RPC client library", "homepage": "https://github.com/tari-project/tari-ootle#readme", "bugs": { diff --git a/clients/javascript/wallet_daemon_client/src/index.ts b/clients/javascript/wallet_daemon_client/src/index.ts index cd9b2880b7..3b2ce5491c 100644 --- a/clients/javascript/wallet_daemon_client/src/index.ts +++ b/clients/javascript/wallet_daemon_client/src/index.ts @@ -16,7 +16,7 @@ import type { AccountsGetBalancesRequest, AccountsGetBalancesResponse, AccountsListRequest, - AccountsListResponse, + AccountsListResponse, AccountsRenameRequest, AccountsRenameResponse, AccountsTransferRequest, AccountsTransferResponse, AuthGetAllJwtRequest, @@ -169,6 +169,10 @@ export class WalletDaemonClient { return this.__invokeRpc("accounts.create", params); } + public accountsRename(params: AccountsRenameRequest): Promise { + return this.__invokeRpc("accounts.rename", params); + } + public accountsClaimBurn(params: ClaimBurnRequest): Promise { return this.__invokeRpc("accounts.claim_burn", params); } diff --git a/clients/wallet_daemon_client/src/lib.rs b/clients/wallet_daemon_client/src/lib.rs index 30d6d2992f..eb16c5f65f 100644 --- a/clients/wallet_daemon_client/src/lib.rs +++ b/clients/wallet_daemon_client/src/lib.rs @@ -86,6 +86,8 @@ use crate::{ AccountsGetBalancesResponse, AccountsListRequest, AccountsListResponse, + AccountsRenameRequest, + AccountsRenameResponse, AuthGetAllJwtRequest, AuthGetAllJwtResponse, AuthRevokeTokenRequest, @@ -318,6 +320,15 @@ impl WalletDaemonClient { .await } + pub async fn accounts_rename( + &mut self, + account: ComponentAddressOrName, + new_name: String, + ) -> Result { + self.send_request("accounts.rename", &AccountsRenameRequest { account, new_name }) + .await + } + pub async fn accounts_transfer>( &mut self, req: T, diff --git a/clients/wallet_daemon_client/src/types.rs b/clients/wallet_daemon_client/src/types.rs index a873ecbf8c..cc473bfeaa 100644 --- a/clients/wallet_daemon_client/src/types.rs +++ b/clients/wallet_daemon_client/src/types.rs @@ -452,6 +452,18 @@ pub struct AccountSetDefaultRequest { #[cfg_attr(feature = "ts", derive(ts_rs::TS), ts(export, export_to = "wallet-daemon-client/"))] pub struct AccountSetDefaultResponse {} +#[derive(Debug, Clone, Deserialize, Serialize)] +#[cfg_attr(feature = "ts", derive(ts_rs::TS), ts(export, export_to = "wallet-daemon-client/"))] +pub struct AccountsRenameRequest { + #[serde(deserialize_with = "string_or_struct")] + pub account: ComponentAddressOrName, + pub new_name: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[cfg_attr(feature = "ts", derive(ts_rs::TS), ts(export, export_to = "wallet-daemon-client/"))] +pub struct AccountsRenameResponse {} + #[derive(Debug, Clone, Deserialize, Serialize)] #[cfg_attr(feature = "ts", derive(ts_rs::TS), ts(export, export_to = "wallet-daemon-client/"))] pub struct AccountsTransferRequest { diff --git a/crates/wallet/sdk/src/apis/accounts.rs b/crates/wallet/sdk/src/apis/accounts.rs index 3dc5ad6686..22b6761d27 100644 --- a/crates/wallet/sdk/src/apis/accounts.rs +++ b/crates/wallet/sdk/src/apis/accounts.rs @@ -126,7 +126,7 @@ impl<'a, TStore: WalletStore, TNetworkInterface> AccountsApi<'a, TStore, TNetwor pub fn update_account( &self, account_address: &ComponentAddress, - update: AccountUpdate, + update: AccountUpdate<'_>, ) -> Result<(), AccountsApiError> { self.store.with_write_tx(|tx| { tx.accounts_update(account_address, update)?; @@ -282,6 +282,16 @@ impl<'a, TStore: WalletStore, TNetworkInterface> AccountsApi<'a, TStore, TNetwor Ok(exists) } + pub fn rename_account(&self, account_addr: &ComponentAddress, new_name: &str) -> Result<(), AccountsApiError> { + let mut tx = self.store.create_write_tx()?; + tx.accounts_update(account_addr, AccountUpdate { + name: Some(new_name), + ..Default::default() + })?; + tx.commit()?; + Ok(()) + } + pub fn set_default_account(&self, account_addr: &ComponentAddress) -> Result<(), AccountsApiError> { let mut tx = self.store.create_write_tx()?; tx.accounts_set_default(account_addr)?; diff --git a/crates/wallet/sdk/src/models/account.rs b/crates/wallet/sdk/src/models/account.rs index 277f7cc1f1..cf3dab9682 100644 --- a/crates/wallet/sdk/src/models/account.rs +++ b/crates/wallet/sdk/src/models/account.rs @@ -99,7 +99,7 @@ pub struct NewAccountData { } #[derive(Debug, Clone, Default)] -pub struct AccountUpdate { - pub name: Option, +pub struct AccountUpdate<'a> { + pub name: Option<&'a str>, pub is_account_on_chain: Option, } diff --git a/crates/wallet/sdk/src/storage.rs b/crates/wallet/sdk/src/storage.rs index 06b1ac0457..0b189af198 100644 --- a/crates/wallet/sdk/src/storage.rs +++ b/crates/wallet/sdk/src/storage.rs @@ -367,7 +367,7 @@ pub trait WalletStoreWriter { fn accounts_update( &mut self, account_addr: &ComponentAddress, - update: AccountUpdate, + update: AccountUpdate<'_>, ) -> Result<(), WalletStorageError>; fn accounts_add_stealth_resource( diff --git a/crates/wallet/storage_sqlite/src/writer.rs b/crates/wallet/storage_sqlite/src/writer.rs index 27a9add6a4..efb9c74ec6 100644 --- a/crates/wallet/storage_sqlite/src/writer.rs +++ b/crates/wallet/storage_sqlite/src/writer.rs @@ -523,7 +523,11 @@ impl WalletStoreWriter for WriteTransaction<'_> { Ok(()) } - fn accounts_update(&mut self, address: &ComponentAddress, update: AccountUpdate) -> Result<(), WalletStorageError> { + fn accounts_update( + &mut self, + address: &ComponentAddress, + update: AccountUpdate<'_>, + ) -> Result<(), WalletStorageError> { use crate::schema::accounts; let AccountUpdate { name, diff --git a/crates/wallet/storage_sqlite/tests/accounts.rs b/crates/wallet/storage_sqlite/tests/accounts.rs index f094c9e78f..a78ffa6ea8 100644 --- a/crates/wallet/storage_sqlite/tests/accounts.rs +++ b/crates/wallet/storage_sqlite/tests/accounts.rs @@ -20,7 +20,7 @@ fn update_account() { let mut tx = db.create_write_tx().unwrap(); tx.accounts_insert(Some("test"), &address, 0, false, false).unwrap(); tx.accounts_update(&address, AccountUpdate { - name: Some("foo".to_string()), + name: Some("foo"), ..Default::default() }) .unwrap();