@cardano-sdk/e2e 0.11.0 → 0.12.0
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/environment.d.ts +3 -2
- package/dist/cjs/environment.d.ts.map +1 -1
- package/dist/cjs/environment.js +3 -1
- package/dist/cjs/environment.js.map +1 -1
- package/dist/cjs/factories.d.ts +4 -2
- package/dist/cjs/factories.d.ts.map +1 -1
- package/dist/cjs/factories.js +9 -3
- package/dist/cjs/factories.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/environment.d.ts +3 -2
- package/dist/esm/environment.d.ts.map +1 -1
- package/dist/esm/environment.js +3 -1
- package/dist/esm/environment.js.map +1 -1
- package/dist/esm/factories.d.ts +4 -2
- package/dist/esm/factories.d.ts.map +1 -1
- package/dist/esm/factories.js +8 -2
- package/dist/esm/factories.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/jest.config.js +1 -1
- package/package.json +17 -16
- package/src/environment.ts +3 -1
- package/src/factories.ts +33 -10
- package/test/artillery/wallet-restoration/types.ts +2 -2
- package/test/k6/endpoints/asset/get-asset.test.js +22 -0
- package/test/k6/endpoints/chain-history/blocks/by-hashes.test.js +19 -0
- package/test/k6/endpoints/chain-history/txs/by-addresses.test.js +23 -0
- package/test/k6/endpoints/chain-history/txs/by-hashes.test.js +19 -0
- package/test/k6/endpoints/network-info/era-summaries.test.js +18 -0
- package/test/k6/endpoints/network-info/genesis-parameters.test.js +18 -0
- package/test/k6/endpoints/network-info/ledger-tip.test.js +18 -0
- package/test/k6/endpoints/network-info/lovelace-supply.test.js +18 -0
- package/test/k6/endpoints/network-info/protocol-parameters.test.js +18 -0
- package/test/k6/endpoints/network-info/stake.test.js +18 -0
- package/test/k6/endpoints/rewards/account-balance.test.js +19 -0
- package/test/k6/endpoints/stake-pool/stats.test.js +18 -0
- package/test/k6/endpoints/utxo/utxo-by-addresses.test.js +19 -0
- package/test/k6/scenarios/tx-submission.test.js +64 -0
- package/test/k6/scenarios/wallet-creation.test.js +211 -0
- package/test/k6/scenarios/wallet-restoration.test.js +192 -0
- package/test/load-test-custom/wallet-init/wallet-init.test.ts +4 -4
- package/test/load-test-custom/wallet-restoration/wallet-restoration.test.ts +2 -2
- package/test/long-running/delegation-rewards.test.ts +3 -3
- package/test/util.ts +3 -3
- package/test/wallet/{SingleAddressWallet → PersonalWallet}/byron.test.ts +3 -3
- package/test/wallet/{SingleAddressWallet → PersonalWallet}/delegation.test.ts +1 -1
- package/test/wallet/{SingleAddressWallet → PersonalWallet}/metadata.test.ts +3 -3
- package/test/wallet/{SingleAddressWallet → PersonalWallet}/mint.test.ts +3 -3
- package/test/wallet/PersonalWallet/multiAddress.test.ts +158 -0
- package/test/wallet/{SingleAddressWallet → PersonalWallet}/multisignature.test.ts +3 -3
- package/test/wallet/{SingleAddressWallet → PersonalWallet}/nft.test.ts +6 -4
- package/test/wallet/{SingleAddressWallet → PersonalWallet}/phase2validation.test.ts +4 -4
- package/test/wallet/{SingleAddressWallet → PersonalWallet}/pouchDbWalletStores.test.ts +2 -2
- package/test/wallet/{SingleAddressWallet → PersonalWallet}/txChainHistory.test.ts +3 -3
- package/test/wallet/{SingleAddressWallet → PersonalWallet}/txChaining.test.ts +1 -1
- package/test/wallet/{SingleAddressWallet → PersonalWallet}/unspendableUtxos.test.ts +4 -4
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/* eslint-disable sonarjs/no-duplicate-string */
|
|
2
|
+
import { AddressType, GroupedAddress, util } from '@cardano-sdk/key-management';
|
|
3
|
+
import { KeyAgentFactoryProps, getWallet } from '../../../src';
|
|
4
|
+
import { PersonalWallet } from '@cardano-sdk/wallet';
|
|
5
|
+
import { createLogger } from '@cardano-sdk/util-dev';
|
|
6
|
+
import { createStandaloneKeyAgent, firstValueFromTimed, normalizeTxBody, walletReady } from '../../util';
|
|
7
|
+
import { filter, map, take } from 'rxjs';
|
|
8
|
+
import { getEnv, walletVariables } from '../../../src/environment';
|
|
9
|
+
import { isNotNil } from '@cardano-sdk/util';
|
|
10
|
+
|
|
11
|
+
const env = getEnv(walletVariables);
|
|
12
|
+
const logger = createLogger();
|
|
13
|
+
const PAYMENT_ADDRESSES_TO_GENERATE = 60;
|
|
14
|
+
const COINS_PER_ADDRESS = 3_000_000n;
|
|
15
|
+
|
|
16
|
+
describe('PersonalWallet/multiAddress', () => {
|
|
17
|
+
let wallet: PersonalWallet;
|
|
18
|
+
|
|
19
|
+
beforeAll(async () => {
|
|
20
|
+
wallet = (await getWallet({ env, idx: 0, logger, name: 'Wallet', polling: { interval: 50 } })).wallet;
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
afterAll(() => {
|
|
24
|
+
wallet.shutdown();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// eslint-disable-next-line max-statements
|
|
28
|
+
it('can discover and spend UTXOs from a multi address wallet', async () => {
|
|
29
|
+
await walletReady(wallet);
|
|
30
|
+
const genesis = await firstValueFromTimed(wallet.genesisParameters$);
|
|
31
|
+
|
|
32
|
+
// Create a random set of mnemonics for a brand-new wallet
|
|
33
|
+
const mnemonics = util.generateMnemonicWords();
|
|
34
|
+
const multiAddressKeyAgent = await createStandaloneKeyAgent(
|
|
35
|
+
mnemonics,
|
|
36
|
+
genesis,
|
|
37
|
+
await wallet.keyAgent.getBip32Ed25519()
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
let txBuilder = wallet.createTxBuilder();
|
|
41
|
+
|
|
42
|
+
let addressesToBeDiscovered = new Array<GroupedAddress>();
|
|
43
|
+
|
|
44
|
+
// Let's add the 5 stake keys.
|
|
45
|
+
for (let i = 0; i < 5; ++i) {
|
|
46
|
+
addressesToBeDiscovered.push(
|
|
47
|
+
await multiAddressKeyAgent.deriveAddress(
|
|
48
|
+
{
|
|
49
|
+
index: 0,
|
|
50
|
+
type: AddressType.External
|
|
51
|
+
},
|
|
52
|
+
i
|
|
53
|
+
)
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Deposit some tADA at some generated addresses from the previously generated mnemonics.
|
|
58
|
+
for (let i = 0; i < PAYMENT_ADDRESSES_TO_GENERATE; ++i) {
|
|
59
|
+
const address = await multiAddressKeyAgent.deriveAddress(
|
|
60
|
+
{
|
|
61
|
+
index: i,
|
|
62
|
+
type: AddressType.External
|
|
63
|
+
},
|
|
64
|
+
0
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
addressesToBeDiscovered.push(address);
|
|
68
|
+
|
|
69
|
+
const txOutput = await txBuilder.buildOutput().address(address.address).coin(3_000_000n).build();
|
|
70
|
+
txBuilder.addOutput(txOutput);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Remove duplicates
|
|
74
|
+
addressesToBeDiscovered = [...new Set(addressesToBeDiscovered)];
|
|
75
|
+
|
|
76
|
+
const unsignedTx = txBuilder.build();
|
|
77
|
+
|
|
78
|
+
const { tx: signedTx } = await unsignedTx.sign();
|
|
79
|
+
|
|
80
|
+
await wallet.submitTx(signedTx);
|
|
81
|
+
|
|
82
|
+
// Search chain history to see if the transaction is there.
|
|
83
|
+
const txFoundInHistory = await firstValueFromTimed(
|
|
84
|
+
wallet.transactions.history$.pipe(
|
|
85
|
+
map((txs) => txs.find((tx) => tx.id === signedTx.id)),
|
|
86
|
+
filter(isNotNil),
|
|
87
|
+
take(1)
|
|
88
|
+
)
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
expect(txFoundInHistory.id).toEqual(signedTx.id);
|
|
92
|
+
expect(normalizeTxBody(txFoundInHistory.body)).toEqual(normalizeTxBody(signedTx.body));
|
|
93
|
+
|
|
94
|
+
// Create a new wallet using the mnemonics previously generated.
|
|
95
|
+
const mnemonicString = mnemonics.join(' ');
|
|
96
|
+
|
|
97
|
+
const customKeyParams: KeyAgentFactoryProps = {
|
|
98
|
+
accountIndex: 0,
|
|
99
|
+
chainId: env.KEY_MANAGEMENT_PARAMS.chainId,
|
|
100
|
+
mnemonic: mnemonicString,
|
|
101
|
+
passphrase: 'some_passphrase'
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const newWallet = await getWallet({
|
|
105
|
+
customKeyParams,
|
|
106
|
+
env,
|
|
107
|
+
idx: 0,
|
|
108
|
+
logger,
|
|
109
|
+
name: 'New Multi Address Wallet',
|
|
110
|
+
polling: { interval: 500 }
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
await walletReady(newWallet.wallet);
|
|
114
|
+
const walletAddresses = await firstValueFromTimed(newWallet.wallet.addresses$);
|
|
115
|
+
|
|
116
|
+
// Let's check if all addresses has been discovered.
|
|
117
|
+
expect(walletAddresses).toEqual(addressesToBeDiscovered);
|
|
118
|
+
|
|
119
|
+
const totalBalance = await firstValueFromTimed(newWallet.wallet.balance.utxo.total$);
|
|
120
|
+
const expectedAmount = PAYMENT_ADDRESSES_TO_GENERATE * Number(COINS_PER_ADDRESS);
|
|
121
|
+
|
|
122
|
+
expect(Number(totalBalance.coins)).toEqual(expectedAmount);
|
|
123
|
+
|
|
124
|
+
// Now lets see if the wallet can spend from all these addresses.
|
|
125
|
+
txBuilder = newWallet.wallet.createTxBuilder();
|
|
126
|
+
|
|
127
|
+
const fundingWalletAddresses = await firstValueFromTimed(wallet.addresses$);
|
|
128
|
+
const returnAdaOutput = await txBuilder
|
|
129
|
+
.buildOutput()
|
|
130
|
+
.address(fundingWalletAddresses[0].address)
|
|
131
|
+
.coin(totalBalance.coins - 1_500_000n) // Let's leave some behind for fees.
|
|
132
|
+
.build();
|
|
133
|
+
|
|
134
|
+
txBuilder.addOutput(returnAdaOutput);
|
|
135
|
+
|
|
136
|
+
const returnAdaUnsignedTx = await txBuilder.build();
|
|
137
|
+
|
|
138
|
+
const { tx: returnAdaSignedTx } = await returnAdaUnsignedTx.sign();
|
|
139
|
+
await newWallet.wallet.submitTx(returnAdaSignedTx);
|
|
140
|
+
|
|
141
|
+
// Search chain history to see if the transaction is there.
|
|
142
|
+
const returnAdaTxFoundInHistory = await firstValueFromTimed(
|
|
143
|
+
newWallet.wallet.transactions.history$.pipe(
|
|
144
|
+
map((txs) => txs.find((tx) => tx.id === returnAdaSignedTx.id)),
|
|
145
|
+
filter(isNotNil),
|
|
146
|
+
take(1)
|
|
147
|
+
)
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
expect(returnAdaTxFoundInHistory.id).toEqual(returnAdaSignedTx.id);
|
|
151
|
+
expect(normalizeTxBody(returnAdaTxFoundInHistory.body)).toEqual(normalizeTxBody(returnAdaSignedTx.body));
|
|
152
|
+
|
|
153
|
+
const endingBalance = await firstValueFromTimed(newWallet.wallet.balance.utxo.total$);
|
|
154
|
+
const expectedEndingBalance = 1_500_000n - returnAdaTxFoundInHistory.body.fee;
|
|
155
|
+
|
|
156
|
+
expect(endingBalance.coins).toEqual(expectedEndingBalance);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* eslint-disable sonarjs/no-duplicate-string */
|
|
2
2
|
import { Cardano, nativeScriptPolicyId } from '@cardano-sdk/core';
|
|
3
|
-
import { FinalizeTxProps,
|
|
3
|
+
import { FinalizeTxProps, PersonalWallet } from '@cardano-sdk/wallet';
|
|
4
4
|
import { InitializeTxProps } from '@cardano-sdk/tx-construction';
|
|
5
5
|
import { KeyRole, util } from '@cardano-sdk/key-management';
|
|
6
6
|
import { burnTokens, createStandaloneKeyAgent, submitAndConfirm, walletReady } from '../../util';
|
|
@@ -11,8 +11,8 @@ import { getEnv, getWallet, walletVariables } from '../../../src';
|
|
|
11
11
|
const env = getEnv(walletVariables);
|
|
12
12
|
const logger = createLogger();
|
|
13
13
|
|
|
14
|
-
describe('
|
|
15
|
-
let wallet:
|
|
14
|
+
describe('PersonalWallet/multisignature', () => {
|
|
15
|
+
let wallet: PersonalWallet;
|
|
16
16
|
const assetName = '3030303030';
|
|
17
17
|
|
|
18
18
|
afterAll(() => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* eslint-disable sonarjs/no-duplicate-string */
|
|
2
2
|
import { Asset, Cardano, metadatum, nativeScriptPolicyId } from '@cardano-sdk/core';
|
|
3
|
-
import { Assets, FinalizeTxProps,
|
|
3
|
+
import { Assets, FinalizeTxProps, PersonalWallet } from '@cardano-sdk/wallet';
|
|
4
4
|
import { InitializeTxProps } from '@cardano-sdk/tx-construction';
|
|
5
5
|
import { KeyRole, TransactionSigner, util } from '@cardano-sdk/key-management';
|
|
6
6
|
import { burnTokens, createStandaloneKeyAgent, firstValueFromTimed, submitAndConfirm, walletReady } from '../../util';
|
|
@@ -12,7 +12,7 @@ const env = getEnv(walletVariables);
|
|
|
12
12
|
const logger = createLogger();
|
|
13
13
|
|
|
14
14
|
// Returns [assets in wallet balance, assetInfos with nftMetadata for the assets in the balance]
|
|
15
|
-
const walletBalanceAssetsAndNfts = (wallet:
|
|
15
|
+
const walletBalanceAssetsAndNfts = (wallet: PersonalWallet) =>
|
|
16
16
|
combineLatest([wallet.balance.utxo.total$, wallet.assetInfo$]).pipe(
|
|
17
17
|
filter(([balance]) => !!balance.assets),
|
|
18
18
|
map(([balance, assetInfos]): [Cardano.TokenMap, Assets] => [balance.assets!, assetInfos]),
|
|
@@ -27,12 +27,12 @@ const walletBalanceAssetsAndNfts = (wallet: SingleAddressWallet) =>
|
|
|
27
27
|
])
|
|
28
28
|
);
|
|
29
29
|
|
|
30
|
-
describe('
|
|
30
|
+
describe('PersonalWallet.assets/nft', () => {
|
|
31
31
|
const TOKEN_METADATA_1_INDEX = 0;
|
|
32
32
|
const TOKEN_METADATA_2_INDEX = 1;
|
|
33
33
|
const TOKEN_BURN_INDEX = 2;
|
|
34
34
|
|
|
35
|
-
let wallet:
|
|
35
|
+
let wallet: PersonalWallet;
|
|
36
36
|
let policySigner: TransactionSigner;
|
|
37
37
|
let policyId: Cardano.PolicyId;
|
|
38
38
|
let policyScript: Cardano.NativeScript;
|
|
@@ -198,6 +198,7 @@ describe('SingleAddressWallet.assets/nft', () => {
|
|
|
198
198
|
policyId,
|
|
199
199
|
// in case of repeated tests on the same network, total asset supply is not updated due to
|
|
200
200
|
// the limitation that asset info is not refreshed on wallet balance changes
|
|
201
|
+
quantity: expect.anything(),
|
|
201
202
|
supply: expect.anything(),
|
|
202
203
|
tokenMetadata: null
|
|
203
204
|
});
|
|
@@ -356,6 +357,7 @@ describe('SingleAddressWallet.assets/nft', () => {
|
|
|
356
357
|
version: '1.0'
|
|
357
358
|
},
|
|
358
359
|
policyId,
|
|
360
|
+
quantity: expect.anything(),
|
|
359
361
|
supply: expect.anything(),
|
|
360
362
|
tokenMetadata: null
|
|
361
363
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Cardano } from '@cardano-sdk/core';
|
|
2
|
-
import { FinalizeTxProps,
|
|
2
|
+
import { FinalizeTxProps, PersonalWallet, TransactionFailure } from '@cardano-sdk/wallet';
|
|
3
3
|
import { Hash32ByteBase16 } from '@cardano-sdk/crypto';
|
|
4
4
|
import { HexBlob, isNotNil } from '@cardano-sdk/util';
|
|
5
5
|
import { InitializeTxProps } from '@cardano-sdk/tx-construction';
|
|
@@ -17,7 +17,7 @@ const logger = createLogger();
|
|
|
17
17
|
* @param wallet The wallet which will set the collateral.
|
|
18
18
|
*/
|
|
19
19
|
const createCollateral = async (
|
|
20
|
-
wallet:
|
|
20
|
+
wallet: PersonalWallet
|
|
21
21
|
): Promise<{ collateralInput: Cardano.TxIn; collateralCoinValue: bigint }> => {
|
|
22
22
|
const txBuilder = wallet.createTxBuilder();
|
|
23
23
|
|
|
@@ -53,8 +53,8 @@ const createCollateral = async (
|
|
|
53
53
|
return { collateralCoinValue: utxo[1].value.coins, collateralInput: utxo[0] };
|
|
54
54
|
};
|
|
55
55
|
|
|
56
|
-
describe('
|
|
57
|
-
let wallet:
|
|
56
|
+
describe('PersonalWallet/phase2validation', () => {
|
|
57
|
+
let wallet: PersonalWallet;
|
|
58
58
|
|
|
59
59
|
afterAll(() => {
|
|
60
60
|
wallet.shutdown();
|
|
@@ -7,7 +7,7 @@ import delay from 'delay';
|
|
|
7
7
|
|
|
8
8
|
const env = getEnv(walletVariables);
|
|
9
9
|
|
|
10
|
-
describe('
|
|
10
|
+
describe('PersonalWallet/pouchDbWalletStores', () => {
|
|
11
11
|
const walletName = 'DbTestWallet';
|
|
12
12
|
let stores1: storage.WalletStores;
|
|
13
13
|
|
|
@@ -15,7 +15,7 @@ describe('SingleAddressWallet/pouchDbWalletStores', () => {
|
|
|
15
15
|
stores1 = storage.createPouchDbWalletStores(walletName, { logger });
|
|
16
16
|
});
|
|
17
17
|
|
|
18
|
-
it('stores and restores
|
|
18
|
+
it('stores and restores PersonalWallet, continues sync after initial load', async () => {
|
|
19
19
|
const wallet1 = (await getWallet({ env, logger, name: 'Test Wallet', stores: stores1 })).wallet;
|
|
20
20
|
|
|
21
21
|
// wallet1 fetched all responses from wallet provider
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PersonalWallet } from '@cardano-sdk/wallet';
|
|
2
2
|
import { filter, firstValueFrom, map, take } from 'rxjs';
|
|
3
3
|
import { getEnv, getWallet, walletVariables } from '../../../src';
|
|
4
4
|
import { isNotNil } from '@cardano-sdk/util';
|
|
@@ -7,8 +7,8 @@ import { normalizeTxBody, walletReady } from '../../util';
|
|
|
7
7
|
|
|
8
8
|
const env = getEnv(walletVariables);
|
|
9
9
|
|
|
10
|
-
describe('
|
|
11
|
-
let wallet:
|
|
10
|
+
describe('PersonalWallet/txChainHistory', () => {
|
|
11
|
+
let wallet: PersonalWallet;
|
|
12
12
|
|
|
13
13
|
beforeEach(async () => {
|
|
14
14
|
({ wallet } = await getWallet({ env, logger, name: 'Sending Wallet', polling: { interval: 50 } }));
|
|
@@ -6,7 +6,7 @@ import { submitAndConfirm, walletReady } from '../../util';
|
|
|
6
6
|
|
|
7
7
|
const env = getEnv(walletVariables);
|
|
8
8
|
|
|
9
|
-
describe('
|
|
9
|
+
describe('PersonalWallet/txChaining', () => {
|
|
10
10
|
let wallet: ObservableWallet;
|
|
11
11
|
|
|
12
12
|
beforeAll(async () => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable sonarjs/no-duplicate-string */
|
|
2
|
-
import {
|
|
2
|
+
import { PersonalWallet, utxoEquals } from '@cardano-sdk/wallet';
|
|
3
3
|
import { createLogger } from '@cardano-sdk/util-dev';
|
|
4
4
|
import { filter, firstValueFrom, map, take } from 'rxjs';
|
|
5
5
|
import { firstValueFromTimed, walletReady } from '../../util';
|
|
@@ -9,9 +9,9 @@ import { isNotNil } from '@cardano-sdk/util';
|
|
|
9
9
|
const env = getEnv(walletVariables);
|
|
10
10
|
const logger = createLogger();
|
|
11
11
|
|
|
12
|
-
describe('
|
|
13
|
-
let wallet1:
|
|
14
|
-
let wallet2:
|
|
12
|
+
describe('PersonalWallet/unspendableUtxos', () => {
|
|
13
|
+
let wallet1: PersonalWallet;
|
|
14
|
+
let wallet2: PersonalWallet;
|
|
15
15
|
|
|
16
16
|
afterAll(() => {
|
|
17
17
|
wallet1.shutdown();
|