@cardano-sdk/e2e 0.17.1 → 0.18.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.
@@ -67,22 +67,22 @@ updatePool()
67
67
  coldKey=network-files/pools/cold"${SP_NODE_ID}".skey
68
68
  vrfKey=network-files/pools/vrf"${SP_NODE_ID}".vkey
69
69
  delegatorPaymentKey=network-files/stake-delegator-keys/payment"${SP_NODE_ID}".vkey
70
- delegatorStakingKey=network-files/stake-delegator-keys/staking"${SP_NODE_ID}".vkey
70
+ delegatorStakeKey=network-files/stake-delegator-keys/staking"${SP_NODE_ID}".vkey
71
71
  delegatorPaymentSKey=network-files/stake-delegator-keys/payment"${SP_NODE_ID}".skey
72
- delegatorStakingSKey=network-files/stake-delegator-keys/staking"${SP_NODE_ID}".skey
72
+ delegatorStakeSKey=network-files/stake-delegator-keys/staking"${SP_NODE_ID}".skey
73
73
 
74
74
  POOL_ID=$(cardano-cli stake-pool id --cold-verification-key-file "$coldVKey" --output-format "hex")
75
75
 
76
76
  # funding pool owner stake address
77
- stakingAddr=$(cardano-cli address build --payment-verification-key-file "$genesisVKey" --stake-verification-key-file "$stakeVKey" --testnet-magic 888)
78
- currentBalance=$(getAddressBalance "$stakingAddr")
77
+ stakeAddr=$(cardano-cli address build --payment-verification-key-file "$genesisVKey" --stake-verification-key-file "$stakeVKey" --testnet-magic 888)
78
+ currentBalance=$(getAddressBalance "$stakeAddr")
79
79
  utxo=$(cardano-cli query utxo --address "$genesisAddr" --testnet-magic 888 | awk 'NR == 3 {printf("%s#%s", $1, $2)}')
80
80
 
81
81
  cardano-cli transaction build \
82
82
  --babbage-era \
83
83
  --change-address "$genesisAddr" \
84
84
  --tx-in "$utxo" \
85
- --tx-out "$stakingAddr"+"$POOL_OWNER_STAKE" \
85
+ --tx-out "$stakeAddr"+"$POOL_OWNER_STAKE" \
86
86
  --testnet-magic 888 \
87
87
  --out-file wallets-tx.raw 2>&1
88
88
 
@@ -94,11 +94,11 @@ updatePool()
94
94
 
95
95
  cardano-cli transaction submit --testnet-magic 888 --tx-file wallets-tx.signed 2>&1
96
96
 
97
- updatedBalance=$(getAddressBalance "$stakingAddr")
97
+ updatedBalance=$(getAddressBalance "$stakeAddr")
98
98
 
99
99
  while [ "$currentBalance" -eq "$updatedBalance" ]
100
100
  do
101
- updatedBalance=$(getAddressBalance "$stakingAddr")
101
+ updatedBalance=$(getAddressBalance "$stakeAddr")
102
102
  sleep 1
103
103
  done
104
104
 
@@ -216,12 +216,12 @@ updatePool()
216
216
  # register delegator stake address
217
217
  echo "Registering delegator stake certificate ${SP_NODE_ID}..."
218
218
 
219
- paymentAddr=$(cardano-cli address build --payment-verification-key-file "$delegatorPaymentKey" --stake-verification-key-file "$delegatorStakingKey" --testnet-magic 888)
219
+ paymentAddr=$(cardano-cli address build --payment-verification-key-file "$delegatorPaymentKey" --stake-verification-key-file "$delegatorStakeKey" --testnet-magic 888)
220
220
  currentBalance=$(getAddressBalance "$paymentAddr")
221
221
 
222
222
  # create pool delegation certificate
223
223
  cardano-cli stake-address delegation-certificate \
224
- --stake-verification-key-file "$delegatorStakingKey" \
224
+ --stake-verification-key-file "$delegatorStakeKey" \
225
225
  --stake-pool-id "$POOL_ID" \
226
226
  --out-file deleg.cert
227
227
 
@@ -258,7 +258,7 @@ updatePool()
258
258
  cardano-cli transaction sign \
259
259
  --tx-body-file tx.raw \
260
260
  --signing-key-file "$delegatorPaymentSKey" \
261
- --signing-key-file "$delegatorStakingSKey" \
261
+ --signing-key-file "$delegatorStakeSKey" \
262
262
  --testnet-magic 888 \
263
263
  --out-file tx.signed
264
264
 
@@ -384,21 +384,21 @@ deregisterPool()
384
384
  coldVKey=network-files/pools/cold"${SP_NODE_ID}".vkey
385
385
  coldKey=network-files/pools/cold"${SP_NODE_ID}".skey
386
386
  delegatorPaymentKey=network-files/stake-delegator-keys/payment"${SP_NODE_ID}".vkey
387
- delegatorStakingKey=network-files/stake-delegator-keys/staking"${SP_NODE_ID}".vkey
387
+ delegatorStakeKey=network-files/stake-delegator-keys/staking"${SP_NODE_ID}".vkey
388
388
  delegatorPaymentSKey=network-files/stake-delegator-keys/payment"${SP_NODE_ID}".skey
389
- delegatorStakingSKey=network-files/stake-delegator-keys/staking"${SP_NODE_ID}".skey
389
+ delegatorStakeSKey=network-files/stake-delegator-keys/staking"${SP_NODE_ID}".skey
390
390
 
391
391
  # We are going to redelegate this stake to dbSync can index it properly.
392
392
  echo "Registering delegator stake certificate ${SP_NODE_ID}..."
393
393
 
394
- paymentAddr=$(cardano-cli address build --payment-verification-key-file "$delegatorPaymentKey" --stake-verification-key-file "$delegatorStakingKey" --testnet-magic 888)
394
+ paymentAddr=$(cardano-cli address build --payment-verification-key-file "$delegatorPaymentKey" --stake-verification-key-file "$delegatorStakeKey" --testnet-magic 888)
395
395
  currentBalance=$(getAddressBalance "$paymentAddr")
396
396
 
397
397
  POOL_ID=$(cardano-cli stake-pool id --cold-verification-key-file "$coldVKey" --output-format "hex")
398
398
 
399
399
  # create pool delegation certificate
400
400
  cardano-cli stake-address delegation-certificate \
401
- --stake-verification-key-file "$delegatorStakingKey" \
401
+ --stake-verification-key-file "$delegatorStakeKey" \
402
402
  --stake-pool-id "$POOL_ID" \
403
403
  --out-file deleg.cert
404
404
 
@@ -435,7 +435,7 @@ deregisterPool()
435
435
  cardano-cli transaction sign \
436
436
  --tx-body-file tx.raw \
437
437
  --signing-key-file "$delegatorPaymentSKey" \
438
- --signing-key-file "$delegatorStakingSKey" \
438
+ --signing-key-file "$delegatorStakeSKey" \
439
439
  --testnet-magic 888 \
440
440
  --out-file tx.signed
441
441
 
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@cardano-sdk/e2e",
3
- "version": "0.17.1",
3
+ "version": "0.18.0",
4
4
  "description": "End to end tests for the cardano-js-sdk packages.",
5
5
  "engines": {
6
- "node": ">=16.0"
6
+ "node": ">=16.20.1"
7
7
  },
8
8
  "main": "dist/cjs/index.js",
9
9
  "module": "dist/esm/index.js",
@@ -81,19 +81,19 @@
81
81
  "dependencies": {
82
82
  "@cardano-foundation/ledgerjs-hw-app-cardano": "^6.0.0",
83
83
  "@cardano-ogmios/client": "5.6.0",
84
- "@cardano-sdk/cardano-services": "~0.14.8",
85
- "@cardano-sdk/cardano-services-client": "~0.10.6",
86
- "@cardano-sdk/core": "~0.15.4",
87
- "@cardano-sdk/crypto": "~0.1.9",
88
- "@cardano-sdk/hardware-ledger": "~0.2.17",
89
- "@cardano-sdk/input-selection": "~0.11.4",
90
- "@cardano-sdk/key-management": "~0.8.2",
91
- "@cardano-sdk/ogmios": "~0.12.13",
92
- "@cardano-sdk/tx-construction": "~0.9.4",
93
- "@cardano-sdk/util": "~0.13.0",
94
- "@cardano-sdk/util-dev": "~0.13.9",
95
- "@cardano-sdk/util-rxjs": "~0.5.5",
96
- "@cardano-sdk/wallet": "~0.18.5",
84
+ "@cardano-sdk/cardano-services": "~0.15.0",
85
+ "@cardano-sdk/cardano-services-client": "~0.11.0",
86
+ "@cardano-sdk/core": "~0.16.0",
87
+ "@cardano-sdk/crypto": "~0.1.10",
88
+ "@cardano-sdk/hardware-ledger": "~0.3.0",
89
+ "@cardano-sdk/input-selection": "~0.11.5",
90
+ "@cardano-sdk/key-management": "~0.9.0",
91
+ "@cardano-sdk/ogmios": "~0.12.14",
92
+ "@cardano-sdk/tx-construction": "~0.10.0",
93
+ "@cardano-sdk/util": "~0.13.1",
94
+ "@cardano-sdk/util-dev": "~0.14.0",
95
+ "@cardano-sdk/util-rxjs": "~0.5.6",
96
+ "@cardano-sdk/wallet": "~0.19.0",
97
97
  "@vespaiach/axios-fetch-adapter": "^0.3.0",
98
98
  "axios": "^0.27.2",
99
99
  "bunyan": "^1.8.15",
@@ -122,10 +122,10 @@
122
122
  "@babel/core": "^7.18.2",
123
123
  "@babel/preset-env": "^7.18.2",
124
124
  "@babel/preset-typescript": "^7.17.12",
125
- "@cardano-sdk/dapp-connector": "~0.9.11",
126
- "@cardano-sdk/projection": "~0.6.17",
127
- "@cardano-sdk/projection-typeorm": "~0.3.13",
128
- "@cardano-sdk/web-extension": "~0.14.1",
125
+ "@cardano-sdk/dapp-connector": "~0.9.12",
126
+ "@cardano-sdk/projection": "~0.7.0",
127
+ "@cardano-sdk/projection-typeorm": "~0.4.0",
128
+ "@cardano-sdk/web-extension": "~0.14.2",
129
129
  "@dcspark/cardano-multiplatform-lib-browser": "^3.1.1",
130
130
  "@emurgo/cardano-message-signing-asmjs": "^1.0.1",
131
131
  "@types/bunyan": "^1.8.8",
@@ -177,5 +177,5 @@
177
177
  "webpack-cli": "^4.9.2",
178
178
  "webpack-merge": "^5.8.0"
179
179
  },
180
- "gitHead": "9ee5e5d97ec63af2b5994d5fe9290a718a84b980"
180
+ "gitHead": "4308af6772b6761b0bcafa7d2c689cd9847a0bed"
181
181
  }
@@ -1,4 +1,4 @@
1
- import { Cardano } from '@cardano-sdk/core';
1
+ import { Cardano, StakePoolProvider } from '@cardano-sdk/core';
2
2
  import { PersonalWallet } from '@cardano-sdk/wallet';
3
3
  import {
4
4
  TestWallet,
@@ -16,6 +16,64 @@ import { waitForWalletStateSettle } from '../../../wallet/test/util';
16
16
 
17
17
  const env = getEnv(walletVariables);
18
18
 
19
+ const submitDelegationTx = async (wallet: PersonalWallet, pools: Cardano.PoolId[]) => {
20
+ logger.info(`Creating delegation tx at epoch #${(await firstValueFrom(wallet.currentEpoch$)).epochNo}`);
21
+ const { tx: signedTx } = await wallet
22
+ .createTxBuilder()
23
+ .delegatePortfolio({
24
+ pools: pools.map((poolId) => ({ id: Cardano.PoolIdHex(Cardano.PoolId.toKeyHash(poolId)), weight: 1 }))
25
+ })
26
+ .build()
27
+ .sign();
28
+ await wallet.submitTx(signedTx);
29
+ const { epochNo } = await firstValueFrom(wallet.currentEpoch$);
30
+ logger.info(`Delegation tx ${signedTx.id} submitted at epoch #${epochNo}`);
31
+
32
+ return signedTx;
33
+ };
34
+
35
+ const generateTxs = async (sendingWallet: PersonalWallet, receivingWallet: PersonalWallet) => {
36
+ logger.info('Sending 100 txs to generate reward fees');
37
+
38
+ const tAdaToSend = 5_000_000n;
39
+ const [{ address: receivingAddress }] = await firstValueFrom(receivingWallet.addresses$);
40
+
41
+ for (let i = 0; i < 100; i++) {
42
+ const txBuilder = sendingWallet.createTxBuilder();
43
+ const txOut = await txBuilder.buildOutput().address(receivingAddress).coin(tAdaToSend).build();
44
+ const { tx: signedTx } = await txBuilder.addOutput(txOut).build().sign();
45
+ await sendingWallet.submitTx(signedTx);
46
+ }
47
+ };
48
+
49
+ const buildSpendRewardTx = async (sendingWallet: PersonalWallet, receivingWallet: PersonalWallet) => {
50
+ const tAdaToSend = 5_000_000n;
51
+ const [{ address: receivingAddress }] = await firstValueFrom(receivingWallet.addresses$);
52
+ const txBuilder = sendingWallet.createTxBuilder();
53
+ const txOut = await txBuilder.buildOutput().address(receivingAddress).coin(tAdaToSend).build();
54
+ const tx = txBuilder.addOutput(txOut).build();
55
+ const { body } = await tx.inspect();
56
+ logger.debug('Body of tx before sign');
57
+ logger.debug(body);
58
+ const { tx: signedTx } = await tx.sign();
59
+ logger.debug('Body of tx after sign');
60
+ logger.debug(signedTx.body);
61
+
62
+ return signedTx;
63
+ };
64
+
65
+ const getPoolIds = async (stakePoolProvider: StakePoolProvider, count: number) => {
66
+ const activePools = await stakePoolProvider.queryStakePools({
67
+ filters: { pledgeMet: true, status: [Cardano.StakePoolStatus.Active] },
68
+ pagination: { limit: count, startAt: 0 }
69
+ });
70
+ expect(activePools.totalResultCount).toBeGreaterThanOrEqual(count);
71
+ const poolIds = activePools.pageResults.map(({ id }) => id);
72
+ expect(poolIds.every((poolId) => poolId !== undefined)).toBeTruthy();
73
+ logger.info('Wallet funds will be staked to pools:', poolIds);
74
+ return poolIds;
75
+ };
76
+
19
77
  describe('delegation rewards', () => {
20
78
  let providers: TestWallet['providers'];
21
79
  let wallet1: PersonalWallet;
@@ -51,64 +109,11 @@ describe('delegation rewards', () => {
51
109
  await initializeWallets();
52
110
 
53
111
  // Arrange
54
- const activePools = await providers.stakePoolProvider.queryStakePools({
55
- filters: { pledgeMet: true, status: [Cardano.StakePoolStatus.Active] },
56
- pagination: { limit: 1, startAt: 0 }
57
- });
58
- expect(activePools.totalResultCount).toBeGreaterThan(0);
59
- const poolId = activePools.pageResults[0].id;
60
- expect(poolId).toBeDefined();
61
- logger.info(`Wallet funds will be staked to pool ${poolId}.`);
62
-
63
- const submitDelegationTx = async () => {
64
- logger.info(`Creating delegation tx at epoch #${(await firstValueFrom(wallet1.currentEpoch$)).epochNo}`);
65
- const { tx: signedTx } = await wallet1
66
- .createTxBuilder()
67
- .delegatePortfolio({
68
- pools: [{ id: Cardano.PoolIdHex(Cardano.PoolId.toKeyHash(poolId)), weight: 1 }]
69
- })
70
- .build()
71
- .sign();
72
- await wallet1.submitTx(signedTx);
73
- const { epochNo } = await firstValueFrom(wallet1.currentEpoch$);
74
- logger.info(`Delegation tx ${signedTx.id} submitted at epoch #${epochNo}`);
75
-
76
- return signedTx;
77
- };
78
-
79
- const generateTxs = async () => {
80
- logger.info('Sending 100 txs to generate reward fees');
81
-
82
- const tAdaToSend = 5_000_000n;
83
- const [{ address: receivingAddress }] = await firstValueFrom(wallet2.addresses$);
84
-
85
- for (let i = 0; i < 100; i++) {
86
- const txBuilder = wallet1.createTxBuilder();
87
- const txOut = await txBuilder.buildOutput().address(receivingAddress).coin(tAdaToSend).build();
88
- const { tx: signedTx } = await txBuilder.addOutput(txOut).build().sign();
89
- await wallet1.submitTx(signedTx);
90
- }
91
- };
92
-
93
- const buildSpendRewardTx = async () => {
94
- const tAdaToSend = 5_000_000n;
95
- const [{ address: receivingAddress }] = await firstValueFrom(wallet2.addresses$);
96
- const txBuilder = wallet1.createTxBuilder();
97
- const txOut = await txBuilder.buildOutput().address(receivingAddress).coin(tAdaToSend).build();
98
- const tx = await txBuilder.addOutput(txOut).build();
99
- const { body } = await tx.inspect();
100
- logger.debug('Body of tx before sign');
101
- logger.debug(body);
102
- const { tx: signedTx } = await tx.sign();
103
- logger.debug('Body of tx after sign');
104
- logger.debug(signedTx.body);
105
-
106
- return signedTx;
107
- };
112
+ const [poolId] = await getPoolIds(providers.stakePoolProvider, 1);
108
113
 
109
114
  // Stake and wait for reward
110
115
 
111
- const signedTx = await submitDelegationTx();
116
+ const signedTx = await submitDelegationTx(wallet1, [poolId]);
112
117
 
113
118
  const delegationTxConfirmedAtEpoch = await getTxConfirmationEpoch(wallet1, signedTx);
114
119
 
@@ -116,7 +121,7 @@ describe('delegation rewards', () => {
116
121
 
117
122
  await waitForEpoch(wallet1, delegationTxConfirmedAtEpoch + 2);
118
123
 
119
- await generateTxs();
124
+ await generateTxs(wallet1, wallet2);
120
125
  await waitForEpoch(wallet1, delegationTxConfirmedAtEpoch + 4);
121
126
 
122
127
  // Check reward
@@ -127,8 +132,49 @@ describe('delegation rewards', () => {
127
132
  logger.info(`Generated rewards: ${rewards} tLovelace`);
128
133
 
129
134
  // Spend reward
130
- const spendRewardTx = await buildSpendRewardTx();
135
+ const spendRewardTx = await buildSpendRewardTx(wallet1, wallet2);
131
136
  expect(spendRewardTx.body.withdrawals?.length).toBeGreaterThan(0);
132
137
  await submitAndConfirm(wallet1, spendRewardTx);
133
138
  });
139
+
140
+ it('can spend rewards from multiple accounts', async () => {
141
+ if (!(await runningAgainstLocalNetwork())) {
142
+ return logger.fatal(
143
+ "Skipping test 'will receive rewards for delegated tADA' as it should only run with a fast test network"
144
+ );
145
+ }
146
+
147
+ // This has to be done inside the test (instead of beforeAll)
148
+ // so that it doesn't fail when running against non-local networks
149
+ await initializeWallets();
150
+
151
+ const [poolId1, poolId2] = await getPoolIds(providers.stakePoolProvider, 2);
152
+ const signedTx = await submitDelegationTx(wallet1, [poolId1, poolId2]);
153
+
154
+ const delegationTxConfirmedAtEpoch = await getTxConfirmationEpoch(wallet1, signedTx);
155
+
156
+ logger.info(`Delegation tx confirmed at epoch #${delegationTxConfirmedAtEpoch}`);
157
+
158
+ await waitForEpoch(wallet1, delegationTxConfirmedAtEpoch + 2);
159
+
160
+ await generateTxs(wallet1, wallet2);
161
+ await waitForEpoch(wallet1, delegationTxConfirmedAtEpoch + 4);
162
+
163
+ // Check reward
164
+ await waitForWalletStateSettle(wallet1);
165
+ const rewardsPerAcct = await firstValueFrom(wallet1.delegation.rewardAccounts$);
166
+ const rewards = await firstValueFrom(wallet1.balance.rewardAccounts.rewards$);
167
+
168
+ logger.info(`Generated rewards: ${rewards} tLovelace`);
169
+ logger.info('Generated rewards per account:', rewardsPerAcct);
170
+
171
+ expect(rewards).toBeGreaterThan(0n);
172
+
173
+ // Spend reward
174
+ const spendRewardTx = await buildSpendRewardTx(wallet1, wallet2);
175
+ logger.info('transaction Withdrawals', spendRewardTx.body.withdrawals);
176
+
177
+ expect(spendRewardTx.body.withdrawals?.length).toBeGreaterThanOrEqual(2);
178
+ await submitAndConfirm(wallet1, spendRewardTx);
179
+ });
134
180
  });
@@ -8,7 +8,11 @@ import { wallet$ } from './walletManager';
8
8
  import { walletName } from '../const';
9
9
 
10
10
  // this should come from remote api
11
- const confirmationCallback: walletCip30.CallbackConfirmation = async () => true;
11
+ const confirmationCallback: walletCip30.CallbackConfirmation = {
12
+ signData: async () => true,
13
+ signTx: async () => true,
14
+ submitTx: async () => true
15
+ };
12
16
 
13
17
  const walletApi = walletCip30.createWalletApi(wallet$, confirmationCallback, { logger });
14
18
  cip30.initializeBackgroundScript({ walletName }, { authenticator, logger, runtime, walletApi });
@@ -37,7 +37,7 @@ describe('wallet', () => {
37
37
  const dappBtnRun = '#bp3-tab-panel_TabsExample_1 > div > button';
38
38
  const dappSubmittedTxConfirmation = '#root > div > p:last-child';
39
39
  const dappChangeAddress = '#root > div > p:nth-child(11)';
40
- const dappStakingAddress = '#root > div > p:nth-child(12)';
40
+ const dappStakeAddress = '#root > div > p:nth-child(12)';
41
41
  const dappUsedAddress = '#root > div > p:nth-child(13)';
42
42
 
43
43
  const btnDelegate = '#multiDelegation .delegate button';
@@ -120,7 +120,7 @@ describe('wallet', () => {
120
120
 
121
121
  it('dapp gets correct addresses from cip30 wallet api', async () => {
122
122
  await expect($(dappChangeAddress)).toHaveTextContaining(walletAddr1);
123
- await expect($(dappStakingAddress)).toHaveTextContaining(walletStakeAddr1);
123
+ await expect($(dappStakeAddress)).toHaveTextContaining(walletStakeAddr1);
124
124
  await expect($(dappUsedAddress)).toHaveTextContaining(walletAddr1);
125
125
  });
126
126
  });