@cardano-sdk/e2e 0.49.4 → 0.49.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cardano-sdk/e2e",
3
- "version": "0.49.4",
3
+ "version": "0.49.6",
4
4
  "description": "End to end tests for the cardano-js-sdk packages.",
5
5
  "repository": "https://github.com/input-output-hk/cardano-js-sdk",
6
6
  "license": "Apache-2.0",
@@ -75,21 +75,22 @@
75
75
  "dependencies": {
76
76
  "@cardano-foundation/ledgerjs-hw-app-cardano": "^7.1.4",
77
77
  "@cardano-ogmios/client": "6.9.0",
78
- "@cardano-sdk/cardano-services": "~0.33.4",
79
- "@cardano-sdk/cardano-services-client": "~0.23.4",
80
- "@cardano-sdk/core": "~0.42.2",
78
+ "@cardano-sdk/cardano-services": "~0.33.6",
79
+ "@cardano-sdk/cardano-services-client": "~0.23.6",
80
+ "@cardano-sdk/core": "~0.43.0",
81
81
  "@cardano-sdk/crypto": "~0.1.32",
82
- "@cardano-sdk/hardware-ledger": "~0.12.18",
83
- "@cardano-sdk/hardware-trezor": "~0.6.17",
84
- "@cardano-sdk/input-selection": "~0.13.32",
85
- "@cardano-sdk/key-management": "~0.24.14",
86
- "@cardano-sdk/ogmios": "~0.18.18",
87
- "@cardano-sdk/tx-construction": "~0.24.1",
82
+ "@cardano-sdk/hardware-ledger": "~0.13.1",
83
+ "@cardano-sdk/hardware-trezor": "~0.6.19",
84
+ "@cardano-sdk/input-selection": "~0.13.34",
85
+ "@cardano-sdk/key-management": "~0.25.1",
86
+ "@cardano-sdk/ogmios": "~0.18.20",
87
+ "@cardano-sdk/tx-construction": "~0.24.3",
88
88
  "@cardano-sdk/util": "~0.15.5",
89
- "@cardano-sdk/util-dev": "~0.24.3",
90
- "@cardano-sdk/util-rxjs": "~0.9.0",
91
- "@cardano-sdk/wallet": "~0.47.1",
89
+ "@cardano-sdk/util-dev": "~0.24.5",
90
+ "@cardano-sdk/util-rxjs": "~0.9.2",
91
+ "@cardano-sdk/wallet": "~0.49.0",
92
92
  "@dcspark/cardano-multiplatform-lib-nodejs": "^3.1.1",
93
+ "@emurgo/cardano-message-signing-nodejs": "^1.0.1",
93
94
  "@shiroyasha9/axios-fetch-adapter": "1.0.3",
94
95
  "axios": "^1.7.4",
95
96
  "bunyan": "^1.8.15",
@@ -118,10 +119,10 @@
118
119
  "@babel/core": "^7.18.2",
119
120
  "@babel/preset-env": "^7.18.2",
120
121
  "@babel/preset-typescript": "^7.17.12",
121
- "@cardano-sdk/dapp-connector": "~0.12.48",
122
- "@cardano-sdk/projection": "~0.12.18",
123
- "@cardano-sdk/projection-typeorm": "~0.9.18",
124
- "@cardano-sdk/web-extension": "~0.37.1",
122
+ "@cardano-sdk/dapp-connector": "~0.13.1",
123
+ "@cardano-sdk/projection": "~0.12.20",
124
+ "@cardano-sdk/projection-typeorm": "~0.9.20",
125
+ "@cardano-sdk/web-extension": "~0.37.3",
125
126
  "@dcspark/cardano-multiplatform-lib-browser": "^3.1.1",
126
127
  "@emurgo/cardano-message-signing-asmjs": "^1.0.1",
127
128
  "@types/bunyan": "^1.8.8",
@@ -181,5 +182,5 @@
181
182
  "publishConfig": {
182
183
  "access": "public"
183
184
  },
184
- "gitHead": "90c0b02e4db5261975932bf9d149e79cc47b8d85"
185
+ "gitHead": "1e454e8ffaa2637307bfde7c2183ea76d0fed76d"
185
186
  }
package/src/factories.ts CHANGED
@@ -60,7 +60,7 @@ import { Logger } from 'ts-log';
60
60
  import { NoCache, NodeTxSubmitProvider } from '@cardano-sdk/cardano-services';
61
61
  import { OgmiosObservableCardanoNode } from '@cardano-sdk/ogmios';
62
62
  import { TrezorKeyAgent } from '@cardano-sdk/hardware-trezor';
63
- import { createStubStakePoolProvider } from '@cardano-sdk/util-dev';
63
+ import { createStubHandleProvider, createStubStakePoolProvider } from '@cardano-sdk/util-dev';
64
64
  import { filter, firstValueFrom, of } from 'rxjs';
65
65
  import { getEnv, walletVariables } from './environment';
66
66
  import DeviceConnection from '@cardano-foundation/ledgerjs-hw-app-cardano';
@@ -179,7 +179,10 @@ chainHistoryProviderFactory.register(BLOCKFROST_PROVIDER, async (params: any, lo
179
179
  return new Promise(async (resolve) => {
180
180
  resolve(
181
181
  new BlockfrostChainHistoryProvider(
182
- new BlockfrostClient({ baseUrl: params.baseUrl }, { rateLimiter: { schedule: (task) => task() } }),
182
+ new BlockfrostClient(
183
+ { apiVersion: params.apiVersion, baseUrl: params.baseUrl, projectId: params.projectId },
184
+ { rateLimiter: { schedule: (task) => task() } }
185
+ ),
183
186
  await networkInfoProviderFactory.create('blockfrost', params, logger),
184
187
  logger
185
188
  )
@@ -225,7 +228,10 @@ networkInfoProviderFactory.register(BLOCKFROST_PROVIDER, async (params: any, log
225
228
  return new Promise(async (resolve) => {
226
229
  resolve(
227
230
  new BlockfrostNetworkInfoProvider(
228
- new BlockfrostClient({ baseUrl: params.baseUrl }, { rateLimiter: { schedule: (task) => task() } }),
231
+ new BlockfrostClient(
232
+ { apiVersion: params.apiVersion, baseUrl: params.baseUrl, projectId: params.projectId },
233
+ { rateLimiter: { schedule: (task) => task() } }
234
+ ),
229
235
  logger
230
236
  )
231
237
  );
@@ -246,7 +252,10 @@ rewardsProviderFactory.register(BLOCKFROST_PROVIDER, async (params: any, logger)
246
252
  return new Promise(async (resolve) => {
247
253
  resolve(
248
254
  new BlockfrostRewardsProvider(
249
- new BlockfrostClient({ baseUrl: params.baseUrl }, { rateLimiter: { schedule: (task) => task() } }),
255
+ new BlockfrostClient(
256
+ { apiVersion: params.apiVersion, baseUrl: params.baseUrl, projectId: params.projectId },
257
+ { rateLimiter: { schedule: (task) => task() } }
258
+ ),
250
259
  logger
251
260
  )
252
261
  );
@@ -293,7 +302,10 @@ txSubmitProviderFactory.register(BLOCKFROST_PROVIDER, async (params: any, logger
293
302
  return new Promise(async (resolve) => {
294
303
  resolve(
295
304
  new BlockfrostTxSubmitProvider(
296
- new BlockfrostClient({ baseUrl: params.baseUrl }, { rateLimiter: { schedule: (task) => task() } }),
305
+ new BlockfrostClient(
306
+ { apiVersion: params.apiVersion, baseUrl: params.baseUrl, projectId: params.projectId },
307
+ { rateLimiter: { schedule: (task) => task() } }
308
+ ),
297
309
  logger
298
310
  )
299
311
  );
@@ -319,7 +331,10 @@ utxoProviderFactory.register(BLOCKFROST_PROVIDER, async (params: any, logger) =>
319
331
  return new Promise(async (resolve) => {
320
332
  resolve(
321
333
  new BlockfrostUtxoProvider(
322
- new BlockfrostClient({ baseUrl: params.baseUrl }, { rateLimiter: { schedule: (task) => task() } }),
334
+ new BlockfrostClient(
335
+ { apiVersion: params.apiVersion, baseUrl: params.baseUrl, projectId: params.projectId },
336
+ { rateLimiter: { schedule: (task) => task() } }
337
+ ),
323
338
  logger
324
339
  )
325
340
  );
@@ -334,6 +349,11 @@ handleProviderFactory.register(HTTP_PROVIDER, async (params: any, logger: Logger
334
349
  });
335
350
  });
336
351
 
352
+ handleProviderFactory.register(
353
+ STUB_PROVIDER,
354
+ async (): Promise<HandleProvider> => Promise.resolve(createStubHandleProvider())
355
+ );
356
+
337
357
  // Stake Pool providers
338
358
  stakePoolProviderFactory.register(
339
359
  STUB_PROVIDER,
@@ -0,0 +1,126 @@
1
+ import { BaseWallet } from '@cardano-sdk/wallet';
2
+ import { Cardano, ProviderFailure, TxSubmissionErrorCode, TxSubmitProvider } from '@cardano-sdk/core';
3
+ import { GenericTxBuilder, TxBuilderDependencies } from '@cardano-sdk/tx-construction';
4
+ import { firstValueFrom } from 'rxjs';
5
+ import { getEnv, getWallet, walletVariables } from '../../src';
6
+ import { logger } from '@cardano-sdk/util-dev';
7
+
8
+ describe('TxSubmitProvider', () => {
9
+ let wallet: BaseWallet;
10
+ let txSubmitProvider: TxSubmitProvider;
11
+ let ownAddress: Cardano.PaymentAddress;
12
+ let walletTxBuilderDependencies: TxBuilderDependencies;
13
+
14
+ beforeAll(async () => {
15
+ const env = getEnv(walletVariables);
16
+ ({
17
+ wallet,
18
+ providers: { txSubmitProvider }
19
+ } = await getWallet({ env, idx: 0, logger, name: 'Test Wallet' }));
20
+ const addresses = await firstValueFrom(wallet.addresses$);
21
+ ownAddress = addresses[0].address;
22
+ walletTxBuilderDependencies = wallet.getTxBuilderDependencies();
23
+ });
24
+
25
+ it('maps ProviderError{TxSubmissionError{OutsideOfValidityInterval}}', async () => {
26
+ const actualTip = await firstValueFrom(wallet.tip$);
27
+ const txBuilder = new GenericTxBuilder({
28
+ ...walletTxBuilderDependencies,
29
+ txBuilderProviders: {
30
+ ...walletTxBuilderDependencies.txBuilderProviders,
31
+ tip: async () => ({
32
+ ...actualTip,
33
+ // GenericTxBuilder fails to build a tx with expired validity interval.
34
+ // we need to trick it to believe the it's within validity interval
35
+ // in order to test submission error
36
+ slot: Cardano.Slot(actualTip.slot - 10)
37
+ })
38
+ }
39
+ });
40
+ const tx = await txBuilder
41
+ .addOutput({ address: ownAddress, value: { coins: 2_000_000n } })
42
+ .setValidityInterval({ invalidHereafter: Cardano.Slot(actualTip.slot - 1) })
43
+ .build()
44
+ .sign();
45
+
46
+ await expect(txSubmitProvider.submitTx({ signedTransaction: tx.cbor })).rejects.toThrow(
47
+ expect.objectContaining({
48
+ innerError: expect.objectContaining({
49
+ code: TxSubmissionErrorCode.OutsideOfValidityInterval
50
+ }),
51
+ reason: ProviderFailure.BadRequest
52
+ })
53
+ );
54
+ });
55
+
56
+ it('maps ProviderError{TxSubmissionError{ValueNotConserved}}', async () => {
57
+ const txBuilder = new GenericTxBuilder({
58
+ ...walletTxBuilderDependencies,
59
+ inputSelector: {
60
+ select: async ({ utxo, outputs }) => ({
61
+ remainingUTxO: new Set([...utxo].slice(1)),
62
+ selection: {
63
+ change: [] as Cardano.TxOut[],
64
+ fee: 2_000_000n,
65
+ inputs: new Set([[...utxo][0]]),
66
+ outputs
67
+ }
68
+ })
69
+ }
70
+ });
71
+ const tx = await txBuilder
72
+ .addOutput({ address: ownAddress, value: { coins: 2_000_000n } })
73
+ .build()
74
+ .sign();
75
+
76
+ await expect(txSubmitProvider.submitTx({ signedTransaction: tx.cbor })).rejects.toThrow(
77
+ expect.objectContaining({
78
+ innerError: expect.objectContaining({
79
+ code: TxSubmissionErrorCode.ValueNotConserved,
80
+ data: expect.objectContaining({
81
+ consumed: expect.objectContaining({ coins: expect.any(BigInt) }),
82
+ produced: expect.objectContaining({ coins: expect.any(BigInt) })
83
+ })
84
+ }),
85
+ reason: ProviderFailure.BadRequest
86
+ })
87
+ );
88
+ });
89
+
90
+ // this mapping is not implemented yet due to
91
+ // https://input-output-rnd.slack.com/archives/C06J663L2A2/p1735920667624239
92
+ it.skip('maps ProviderError{TxSubmissionError{IncompleteWithdrawals}}', async () => {
93
+ const rewardAccounts = await firstValueFrom(wallet.delegation.rewardAccounts$);
94
+ if (rewardAccounts.some((acc) => !acc.dRepDelegatee || !acc.rewardBalance)) {
95
+ return logger.warn(
96
+ 'Skipping IncompleteWithdrawals error test because there are either no rewards, or not delegated to drep'
97
+ );
98
+ }
99
+ const txBuilder = new GenericTxBuilder({
100
+ ...walletTxBuilderDependencies,
101
+ txBuilderProviders: {
102
+ ...walletTxBuilderDependencies.txBuilderProviders,
103
+ rewardAccounts: async () => {
104
+ const accounts = await walletTxBuilderDependencies.txBuilderProviders.rewardAccounts();
105
+ return accounts.map((account) => ({
106
+ ...account,
107
+ rewardBalance: account.rewardBalance - 1n
108
+ }));
109
+ }
110
+ }
111
+ });
112
+ const tx = await txBuilder
113
+ .addOutput({ address: ownAddress, value: { coins: 2_000_000n } })
114
+ .build()
115
+ .sign();
116
+
117
+ await expect(txSubmitProvider.submitTx({ signedTransaction: tx.cbor })).rejects.toThrow(
118
+ expect.objectContaining({
119
+ innerError: expect.objectContaining({
120
+ code: TxSubmissionErrorCode.IncompleteWithdrawals
121
+ }),
122
+ reason: ProviderFailure.BadRequest
123
+ })
124
+ );
125
+ });
126
+ });
@@ -0,0 +1,119 @@
1
+ import * as Crypto from '@cardano-sdk/crypto';
2
+ import { BaseWallet, cip30 } from '@cardano-sdk/wallet';
3
+ import { Bip32Account, KeyRole, cip8 } from '@cardano-sdk/key-management';
4
+ import { COSEKey, COSESign1 } from '@emurgo/cardano-message-signing-nodejs';
5
+ import { Cardano, util } from '@cardano-sdk/core';
6
+ import { Cip30DataSignature, SenderContext } from '@cardano-sdk/dapp-connector';
7
+ import { HexBlob } from '@cardano-sdk/util';
8
+ import { NEVER, firstValueFrom, of } from 'rxjs';
9
+ import { buildDRepAddressFromDRepKey } from '../../../../wallet/test/util';
10
+ import { getEnv, getWallet, walletReady, walletVariables } from '../../../src';
11
+ import { logger } from '@cardano-sdk/util-dev';
12
+
13
+ const env = getEnv(walletVariables);
14
+
15
+ const decodeSignature = (dataSignature: Cip30DataSignature) => {
16
+ const coseKey = COSEKey.from_bytes(Buffer.from(dataSignature.key, 'hex'));
17
+ const coseSign1 = COSESign1.from_bytes(Buffer.from(dataSignature.signature, 'hex'));
18
+
19
+ const publicKeyHeader = coseKey.header(cip8.CoseLabel.x)!;
20
+ const publicKeyBytes = publicKeyHeader.as_bytes()!;
21
+ const publicKeyHex = util.bytesToHex(publicKeyBytes);
22
+ const signedData = coseSign1.signed_data();
23
+ return { coseKey, coseSign1, publicKeyHex, signedData };
24
+ };
25
+
26
+ describe('PersonalWallet/cip30WalletApi', () => {
27
+ let wallet: BaseWallet;
28
+ let drepKeyHashHex: Crypto.Ed25519KeyHashHex;
29
+ let drepPubKey: Crypto.Ed25519PublicKeyHex;
30
+ let walletApi: ReturnType<typeof cip30.createWalletApi>;
31
+ let bip32Account: Bip32Account;
32
+
33
+ beforeEach(async () => {
34
+ ({ wallet, bip32Account } = await getWallet({ env, logger, name: 'wallet' }));
35
+ await walletReady(wallet, 10n);
36
+
37
+ drepPubKey = (await wallet.governance.getPubDRepKey())!;
38
+ drepKeyHashHex = (await Crypto.Ed25519PublicKey.fromHex(drepPubKey!).hash()).hex();
39
+
40
+ walletApi = cip30.createWalletApi(
41
+ of(wallet),
42
+ {
43
+ signData: () => Promise.resolve({ cancel$: NEVER })
44
+ } as unknown as cip30.CallbackConfirmation,
45
+ { logger: console }
46
+ );
47
+ });
48
+
49
+ it('can signData with hex DRepID', async () => {
50
+ const signature = await walletApi.signData(
51
+ { sender: '' } as unknown as SenderContext,
52
+ drepKeyHashHex,
53
+ HexBlob('abc123')
54
+ );
55
+
56
+ expect(decodeSignature(signature).publicKeyHex).toEqual(drepPubKey);
57
+ });
58
+
59
+ it('can signData with bech32 type 6 addr DRepID', async () => {
60
+ const drepAddr = (await buildDRepAddressFromDRepKey(drepPubKey))?.toAddress()?.toBech32();
61
+ const signature = await walletApi.signData(
62
+ { sender: '' } as unknown as SenderContext,
63
+ drepAddr!,
64
+ HexBlob('abc123')
65
+ );
66
+
67
+ expect(decodeSignature(signature).publicKeyHex).toEqual(drepPubKey);
68
+ });
69
+
70
+ it('can signData with bech32 base address', async () => {
71
+ const [{ address, index }] = await firstValueFrom(wallet.addresses$);
72
+ const paymentKeyHex = (await bip32Account.derivePublicKey({ index, role: KeyRole.External })).hex();
73
+
74
+ const signature = await walletApi.signData({ sender: '' } as unknown as SenderContext, address, HexBlob('abc123'));
75
+
76
+ expect(decodeSignature(signature).publicKeyHex).toEqual(paymentKeyHex);
77
+ });
78
+
79
+ it('can signData with hex-encoded base address', async () => {
80
+ const [{ address, index }] = await firstValueFrom(wallet.addresses$);
81
+ const addressHex = Cardano.Address.fromBech32(address).toBytes();
82
+ const paymentKeyHex = (await bip32Account.derivePublicKey({ index, role: KeyRole.External })).hex();
83
+
84
+ const signature = await walletApi.signData(
85
+ { sender: '' } as unknown as SenderContext,
86
+ addressHex,
87
+ HexBlob('abc123')
88
+ );
89
+
90
+ expect(decodeSignature(signature).publicKeyHex).toEqual(paymentKeyHex);
91
+ });
92
+
93
+ it('can signData with bech32 base address', async () => {
94
+ const [{ rewardAccount, index }] = await firstValueFrom(wallet.addresses$);
95
+ const stakeKeyHex = (await bip32Account.derivePublicKey({ index, role: KeyRole.Stake })).hex();
96
+
97
+ const signature = await walletApi.signData(
98
+ { sender: '' } as unknown as SenderContext,
99
+ rewardAccount,
100
+ HexBlob('abc123')
101
+ );
102
+
103
+ expect(decodeSignature(signature).publicKeyHex).toEqual(stakeKeyHex);
104
+ });
105
+
106
+ it('can signData with hex-encoded reward account', async () => {
107
+ const [{ rewardAccount, index }] = await firstValueFrom(wallet.addresses$);
108
+ const rewardAccountHex = Cardano.Address.fromBech32(rewardAccount).toBytes();
109
+ const stakeKeyHex = (await bip32Account.derivePublicKey({ index, role: KeyRole.Stake })).hex();
110
+
111
+ const signature = await walletApi.signData(
112
+ { sender: '' } as unknown as SenderContext,
113
+ rewardAccountHex,
114
+ HexBlob('abc123')
115
+ );
116
+
117
+ expect(decodeSignature(signature).publicKeyHex).toEqual(stakeKeyHex);
118
+ });
119
+ });
@@ -17,12 +17,10 @@ export const selectors = {
17
17
  btnDelegate: '#multiDelegation .delegate button',
18
18
  btnGrantAccess: '#requestAccessGrant',
19
19
  btnSignAndBuildTx: '#buildAndSignTx',
20
- btnSignDataWithDRepId: '#signDataWithDRepId',
21
20
  deactivateWallet: '#deactivateWallet',
22
21
  destroyWallet: '#destroyWallet',
23
22
  divAdaPrice: '#adaPrice',
24
23
  divBgPortDisconnectStatus: '#remoteApiPortDisconnect .bgPortDisconnect',
25
- divDataSignature: '#dataSignature',
26
24
  divSignature: '#signature',
27
25
  divUiPortDisconnectStatus: '#remoteApiPortDisconnect .uiPortDisconnect',
28
26
  liPercents: '#multiDelegation .distribution li .percent',
@@ -45,8 +45,6 @@
45
45
  <button id="buildAndSignTx">Build & Sign TX</button>
46
46
  <div>Signature: <span id="signature">-</span></div>
47
47
 
48
- <button id="signDataWithDRepId">Sign Data with DRepID</button>
49
- <div>Signature: <span id="dataSignature">-</span></div>
50
48
  <script src="ui.js"></script>
51
49
  </body>
52
50
 
@@ -124,23 +124,6 @@ const sendDelegationTx = async (portfolio: { pool: Cardano.StakePool; weight: nu
124
124
  document.querySelector('#multiDelegation .delegateTxId')!.textContent = msg;
125
125
  };
126
126
 
127
- const signDataWithDRepID = async (): Promise<void> => {
128
- let msg: string;
129
- const dRepId = 'drep1vpzcgfrlgdh4fft0p0ju70czkxxkuknw0jjztl3x7aqgm9q3hqyaz';
130
- try {
131
- const signature = await wallet.signData({
132
- payload: HexBlob('abc123'),
133
- signWith: Cardano.DRepID(dRepId)
134
- });
135
- msg = JSON.stringify(signature);
136
- } catch (error) {
137
- msg = `ERROR signing data with DRepID: ${JSON.stringify(error)}`;
138
- }
139
-
140
- // Set text with signature or error
141
- document.querySelector(selectors.divDataSignature)!.textContent = msg;
142
- };
143
-
144
127
  const setAddresses = ({ address, stakeAddress }: { address: string; stakeAddress: string }): void => {
145
128
  document.querySelector(selectors.spanAddress)!.textContent = address;
146
129
  document.querySelector(selectors.spanStakeAddress)!.textContent = stakeAddress;
@@ -378,10 +361,6 @@ document.querySelector(selectors.btnSignAndBuildTx)!.addEventListener('click', a
378
361
  setSignature(signedTx.witness.signatures.values().next().value);
379
362
  });
380
363
 
381
- document
382
- .querySelector(selectors.btnSignDataWithDRepId)!
383
- .addEventListener('click', async () => await signDataWithDRepID());
384
-
385
364
  // Code below tests that a disconnected port in background script will result in the consumed API method call promise to reject
386
365
  // UI consumes API -> BG exposes fake API that closes port
387
366
  const disconnectPortTestObj = consumeRemoteApi(
@@ -23,9 +23,7 @@ describe('wallet', () => {
23
23
  liPools,
24
24
  liPercents,
25
25
  divBgPortDisconnectStatus,
26
- divUiPortDisconnectStatus,
27
- btnSignDataWithDRepId,
28
- divDataSignature
26
+ divUiPortDisconnectStatus
29
27
  } = selectors;
30
28
 
31
29
  // The address is filled in by the tests, which are order dependent
@@ -137,11 +135,6 @@ describe('wallet', () => {
137
135
  await buildAndSign();
138
136
  });
139
137
 
140
- it('can sign data with a DRepID', async () => {
141
- await (await $(btnSignDataWithDRepId)).click();
142
- await expect($(divDataSignature)).toHaveTextContaining('signature');
143
- });
144
-
145
138
  it('can destroy second wallet before switching back to the first wallet', async () => {
146
139
  // Destroy also clears associated store. Store will be rebuilt during future activation of same wallet
147
140
  await $(destroyWallet).click();