@cardano-sdk/e2e 0.49.5 → 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 +11 -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 +18 -18
- package/src/factories.ts +26 -6
- package/test/providers/TxSubmitProvider.test.ts +126 -0
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,20 +75,20 @@
|
|
|
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.13.
|
|
83
|
-
"@cardano-sdk/hardware-trezor": "~0.6.
|
|
84
|
-
"@cardano-sdk/input-selection": "~0.13.
|
|
85
|
-
"@cardano-sdk/key-management": "~0.25.
|
|
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
93
|
"@emurgo/cardano-message-signing-nodejs": "^1.0.1",
|
|
94
94
|
"@shiroyasha9/axios-fetch-adapter": "1.0.3",
|
|
@@ -119,10 +119,10 @@
|
|
|
119
119
|
"@babel/core": "^7.18.2",
|
|
120
120
|
"@babel/preset-env": "^7.18.2",
|
|
121
121
|
"@babel/preset-typescript": "^7.17.12",
|
|
122
|
-
"@cardano-sdk/dapp-connector": "~0.13.
|
|
123
|
-
"@cardano-sdk/projection": "~0.12.
|
|
124
|
-
"@cardano-sdk/projection-typeorm": "~0.9.
|
|
125
|
-
"@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",
|
|
126
126
|
"@dcspark/cardano-multiplatform-lib-browser": "^3.1.1",
|
|
127
127
|
"@emurgo/cardano-message-signing-asmjs": "^1.0.1",
|
|
128
128
|
"@types/bunyan": "^1.8.8",
|
|
@@ -182,5 +182,5 @@
|
|
|
182
182
|
"publishConfig": {
|
|
183
183
|
"access": "public"
|
|
184
184
|
},
|
|
185
|
-
"gitHead": "
|
|
185
|
+
"gitHead": "1e454e8ffaa2637307bfde7c2183ea76d0fed76d"
|
|
186
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
|
+
});
|