@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/CHANGELOG.md +15 -0
- package/dist/cjs/factories.d.ts.map +1 -1
- package/dist/cjs/factories.js +6 -5
- package/dist/cjs/factories.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/factories.d.ts.map +1 -1
- package/dist/esm/factories.js +7 -6
- package/dist/esm/factories.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +19 -18
- package/src/factories.ts +26 -6
- package/test/providers/TxSubmitProvider.test.ts +126 -0
- package/test/wallet_epoch_0/PersonalWallet/cip30WalletApi.test.ts +119 -0
- package/test/web-extension/extension/const.ts +0 -2
- package/test/web-extension/extension/ui.html +0 -2
- package/test/web-extension/extension/ui.ts +0 -21
- package/test/web-extension/specs/wallet.spec.ts +1 -8
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cardano-sdk/e2e",
|
|
3
|
-
"version": "0.49.
|
|
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.
|
|
79
|
-
"@cardano-sdk/cardano-services-client": "~0.23.
|
|
80
|
-
"@cardano-sdk/core": "~0.
|
|
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.
|
|
83
|
-
"@cardano-sdk/hardware-trezor": "~0.6.
|
|
84
|
-
"@cardano-sdk/input-selection": "~0.13.
|
|
85
|
-
"@cardano-sdk/key-management": "~0.
|
|
86
|
-
"@cardano-sdk/ogmios": "~0.18.
|
|
87
|
-
"@cardano-sdk/tx-construction": "~0.24.
|
|
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.
|
|
90
|
-
"@cardano-sdk/util-rxjs": "~0.9.
|
|
91
|
-
"@cardano-sdk/wallet": "~0.
|
|
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.
|
|
122
|
-
"@cardano-sdk/projection": "~0.12.
|
|
123
|
-
"@cardano-sdk/projection-typeorm": "~0.9.
|
|
124
|
-
"@cardano-sdk/web-extension": "~0.37.
|
|
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": "
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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();
|