Skip to content

Commit 8dbde2c

Browse files
authored
feat: return new account on add account wallet manager (#691)
1 parent 9391f76 commit 8dbde2c

File tree

8 files changed

+51
-10
lines changed

8 files changed

+51
-10
lines changed

.changeset/famous-eyes-guess.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@fuel-ts/wallet-manager": patch
3+
---
4+
5+
Return account after addAccount
6+
Export types from WalletManager

packages/wallet-manager/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from './wallet-manager';
2+
export * from './types';

packages/wallet-manager/src/storages/memory-storage.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
class MemoryStorage {
1+
import type { StorageAbstract } from '../types';
2+
3+
class MemoryStorage implements StorageAbstract {
24
// eslint-disable-next-line @typescript-eslint/no-explicit-any
35
storage = new Map<string, any>();
46

5-
async getItem(key: string) {
7+
async getItem<T>(key: string): Promise<T | null> {
68
return this.storage.get(key);
79
}
810

9-
async setItem<T>(key: string, value: T) {
10-
return this.storage.set(key, value);
11+
async setItem(key: string, value: string) {
12+
this.storage.set(key, value);
1113
}
1214

1315
async removeItem(key: string) {

packages/wallet-manager/src/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ export abstract class Vault<TOptions = { secret?: string }> {
5858
}
5959

6060
export abstract class StorageAbstract {
61-
abstract setItem<T>(key: string, value: T): Promise<unknown>;
62-
abstract getItem<T>(key: string): Promise<T | null>;
61+
abstract setItem(key: string, value: string): Promise<void>;
62+
abstract getItem(key: string): Promise<string | null | undefined>;
6363
abstract removeItem(key: string): Promise<void>;
6464
abstract clear(): Promise<void>;
6565
}

packages/wallet-manager/src/vaults/mnemonic-vault.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export class MnemonicVault implements Vault<MnemonicVaultOptions> {
6060

6161
addAccount() {
6262
this.numberOfAccounts += 1;
63-
const wallet = Wallet.fromMnemonic(this.#secret, this.getDerivePath(this.numberOfAccounts));
63+
const wallet = Wallet.fromMnemonic(this.#secret, this.getDerivePath(this.numberOfAccounts - 1));
6464

6565
return {
6666
publicKey: wallet.publicKey,

packages/wallet-manager/src/vaults/privatekey-vault.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,15 @@ describe('PrivateKeyVault', () => {
4141
expect(vaultFromState.getAccounts()[0].publicKey).toBe(walletSpec.publicKey);
4242
expect(vaultFromState.getAccounts()[1].publicKey).toBe(walletSpec2.publicKey);
4343
});
44+
45+
it('Return new account on add account', async () => {
46+
const vault = new PrivateKeyVault({
47+
secret: walletSpec.privateKey,
48+
});
49+
50+
const account = vault.addAccount();
51+
const accounts = vault.getAccounts();
52+
53+
expect(account.publicKey).toBe(accounts[1].publicKey);
54+
});
4455
});

packages/wallet-manager/src/wallet-manager.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,25 @@ describe('Wallet Manager', () => {
139139
expect(privateKeyReturned).toBe(wallet.privateKey);
140140
});
141141

142+
it('Return account when adding account to vault', async () => {
143+
// #region typedoc:wallet-manager-create
144+
const walletManager = new WalletManager();
145+
const password = '0b540281-f87b-49ca-be37-2264c7f260f7';
146+
147+
// Add a vault of type privateKey
148+
await walletManager.unlock(password);
149+
// #endregion
150+
151+
await walletManager.addVault({
152+
type: 'mnemonic',
153+
secret: WalletManagerSpec.mnemonic,
154+
});
155+
const account = await walletManager.addAccount();
156+
const accounts = await walletManager.getAccounts();
157+
158+
expect(account.publicKey).toBe(accounts[1].publicKey);
159+
});
160+
142161
it('Export privateKey from address from a mnemonic vault', async () => {
143162
const { walletManager } = await setupWallet({
144163
type: 'mnemonic',

packages/wallet-manager/src/wallet-manager.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,11 @@ export class WalletManager extends EventEmitter {
142142
const vaultState = this.#vaults[options?.vaultId || 0];
143143
await assert(vaultState, ERROR_MESSAGES.vault_not_found);
144144
// Add account on vault
145-
vaultState.vault.addAccount();
145+
const account = vaultState.vault.addAccount();
146146
// Save the accounts state
147147
await this.saveState();
148+
// Return account
149+
return account;
148150
}
149151

150152
/**
@@ -231,7 +233,7 @@ export class WalletManager extends EventEmitter {
231233
async loadState() {
232234
await assert(!this.#isLocked, ERROR_MESSAGES.wallet_not_unlocked);
233235

234-
const data = await this.storage.getItem<string>(this.STORAGE_KEY);
236+
const data = await this.storage.getItem(this.STORAGE_KEY);
235237
if (data) {
236238
const state = await decrypt<WalletManagerState>(this.#passphrase, <Keystore>JSON.parse(data));
237239
this.#vaults = this.#deserializeVaults(state.vaults);
@@ -247,7 +249,7 @@ export class WalletManager extends EventEmitter {
247249
const encryptedData = await encrypt(this.#passphrase, {
248250
vaults: this.#serializeVaults(this.#vaults),
249251
});
250-
this.storage.setItem(this.STORAGE_KEY, JSON.stringify(encryptedData));
252+
await this.storage.setItem(this.STORAGE_KEY, JSON.stringify(encryptedData));
251253
this.emit('update');
252254
}
253255

0 commit comments

Comments
 (0)