@cardano-sdk/wallet 0.1.4 → 0.1.5

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.
Files changed (118) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/dist/Address.d.ts +11 -0
  4. package/dist/Address.d.ts.map +1 -0
  5. package/dist/Address.js +9 -0
  6. package/dist/Address.js.map +1 -0
  7. package/dist/BalanceTracker.d.ts +23 -0
  8. package/dist/BalanceTracker.d.ts.map +1 -0
  9. package/dist/BalanceTracker.js +48 -0
  10. package/dist/BalanceTracker.js.map +1 -0
  11. package/dist/InMemoryTransactionTracker.d.ts +16 -0
  12. package/dist/InMemoryTransactionTracker.d.ts.map +1 -0
  13. package/dist/InMemoryTransactionTracker.js +84 -0
  14. package/dist/InMemoryTransactionTracker.js.map +1 -0
  15. package/dist/InMemoryUtxoRepository.d.ts +25 -0
  16. package/dist/InMemoryUtxoRepository.d.ts.map +1 -0
  17. package/dist/InMemoryUtxoRepository.js +154 -0
  18. package/dist/InMemoryUtxoRepository.js.map +1 -0
  19. package/dist/KeyManagement/InMemoryKeyManager.d.ts +9 -0
  20. package/dist/KeyManagement/InMemoryKeyManager.d.ts.map +1 -0
  21. package/dist/KeyManagement/InMemoryKeyManager.js +68 -0
  22. package/dist/KeyManagement/InMemoryKeyManager.js.map +1 -0
  23. package/dist/KeyManagement/errors/InvalidMnemonic.d.ts +5 -0
  24. package/dist/KeyManagement/errors/InvalidMnemonic.d.ts.map +1 -0
  25. package/dist/KeyManagement/errors/InvalidMnemonic.js +13 -0
  26. package/dist/KeyManagement/errors/InvalidMnemonic.js.map +1 -0
  27. package/{src/KeyManagement/errors/index.ts → dist/KeyManagement/errors/index.d.ts} +1 -0
  28. package/dist/KeyManagement/errors/index.d.ts.map +1 -0
  29. package/dist/KeyManagement/errors/index.js +6 -0
  30. package/dist/KeyManagement/errors/index.js.map +1 -0
  31. package/{src/KeyManagement/index.ts → dist/KeyManagement/index.d.ts} +1 -0
  32. package/dist/KeyManagement/index.d.ts.map +1 -0
  33. package/dist/KeyManagement/index.js +30 -0
  34. package/dist/KeyManagement/index.js.map +1 -0
  35. package/dist/KeyManagement/types.d.ts +14 -0
  36. package/dist/KeyManagement/types.d.ts.map +1 -0
  37. package/dist/KeyManagement/types.js +3 -0
  38. package/dist/KeyManagement/types.js.map +1 -0
  39. package/dist/KeyManagement/util.d.ts +6 -0
  40. package/dist/KeyManagement/util.d.ts.map +1 -0
  41. package/dist/KeyManagement/util.js +31 -0
  42. package/dist/KeyManagement/util.js.map +1 -0
  43. package/dist/SingleAddressWallet.d.ts +30 -0
  44. package/dist/SingleAddressWallet.d.ts.map +1 -0
  45. package/dist/SingleAddressWallet.js +62 -0
  46. package/dist/SingleAddressWallet.js.map +1 -0
  47. package/dist/Transaction/CertificateFactory.d.ts +50 -0
  48. package/dist/Transaction/CertificateFactory.d.ts.map +1 -0
  49. package/dist/Transaction/CertificateFactory.js +72 -0
  50. package/dist/Transaction/CertificateFactory.js.map +1 -0
  51. package/dist/Transaction/computeImplicitCoin.d.ts +4 -0
  52. package/dist/Transaction/computeImplicitCoin.d.ts.map +1 -0
  53. package/dist/Transaction/computeImplicitCoin.js +21 -0
  54. package/dist/Transaction/computeImplicitCoin.js.map +1 -0
  55. package/dist/Transaction/createTransactionInternals.d.ts +16 -0
  56. package/dist/Transaction/createTransactionInternals.d.ts.map +1 -0
  57. package/dist/Transaction/createTransactionInternals.js +41 -0
  58. package/dist/Transaction/createTransactionInternals.js.map +1 -0
  59. package/{src/Transaction/index.ts → dist/Transaction/index.d.ts} +1 -0
  60. package/dist/Transaction/index.d.ts.map +1 -0
  61. package/dist/Transaction/index.js +18 -0
  62. package/dist/Transaction/index.js.map +1 -0
  63. package/dist/Transaction/types.d.ts +11 -0
  64. package/dist/Transaction/types.d.ts.map +1 -0
  65. package/dist/Transaction/types.js +3 -0
  66. package/dist/Transaction/types.js.map +1 -0
  67. package/dist/Transaction/withdrawal.d.ts +8 -0
  68. package/dist/Transaction/withdrawal.d.ts.map +1 -0
  69. package/dist/Transaction/withdrawal.js +10 -0
  70. package/dist/Transaction/withdrawal.js.map +1 -0
  71. package/dist/TransactionError.d.ts +15 -0
  72. package/dist/TransactionError.d.ts.map +1 -0
  73. package/dist/TransactionError.js +23 -0
  74. package/dist/TransactionError.js.map +1 -0
  75. package/{src/index.ts → dist/index.d.ts} +1 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +35 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/types.d.ts +37 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +13 -0
  82. package/dist/types.js.map +1 -0
  83. package/package.json +13 -8
  84. package/jest.config.js +0 -1
  85. package/src/Address.ts +0 -12
  86. package/src/BalanceTracker.ts +0 -62
  87. package/src/InMemoryTransactionTracker.ts +0 -87
  88. package/src/InMemoryUtxoRepository.ts +0 -192
  89. package/src/KeyManagement/InMemoryKeyManager.ts +0 -67
  90. package/src/KeyManagement/errors/InvalidMnemonic.ts +0 -9
  91. package/src/KeyManagement/types.ts +0 -15
  92. package/src/KeyManagement/util.ts +0 -14
  93. package/src/SingleAddressWallet.ts +0 -120
  94. package/src/Transaction/CertificateFactory.ts +0 -154
  95. package/src/Transaction/computeImplicitCoin.ts +0 -36
  96. package/src/Transaction/createTransactionInternals.ts +0 -60
  97. package/src/Transaction/types.ts +0 -12
  98. package/src/Transaction/withdrawal.ts +0 -17
  99. package/src/TransactionError.ts +0 -17
  100. package/src/tsconfig.json +0 -11
  101. package/src/types.ts +0 -56
  102. package/test/.eslintrc.js +0 -7
  103. package/test/BalanceTracker.test.ts +0 -44
  104. package/test/InMemoryTransactionTracker.test.ts +0 -108
  105. package/test/InMemoryUtxoRepository.test.ts +0 -242
  106. package/test/KeyManagement/InMemoryKeyManager.test.ts +0 -39
  107. package/test/SingleAddressWallet.test.ts +0 -87
  108. package/test/Transaction/CertificateFactory.test.ts +0 -89
  109. package/test/Transaction/computeImplicitCoin.test.ts +0 -26
  110. package/test/Transaction/createTransactionInternals.test.ts +0 -84
  111. package/test/Transaction/withdrawal.test.ts +0 -13
  112. package/test/integration/withdrawal.test.ts +0 -108
  113. package/test/mocks/MockTransactionTracker.ts +0 -8
  114. package/test/mocks/MockUtxoRepository.ts +0 -13
  115. package/test/mocks/ProviderStub.ts +0 -151
  116. package/test/mocks/index.ts +0 -4
  117. package/test/mocks/testKeyManager.ts +0 -10
  118. package/test/tsconfig.json +0 -12
@@ -1,108 +0,0 @@
1
- import { CardanoSerializationLib, CSL, ProviderError, ProviderFailure } from '@cardano-sdk/core';
2
- import { dummyLogger } from 'ts-log';
3
- import { ledgerTip, providerStub, ProviderStub, queryTransactionsResult } from './mocks';
4
- import mockDelay from 'delay';
5
- import { TransactionTrackerEvent, InMemoryTransactionTracker, TransactionFailure } from '../src';
6
-
7
- jest.mock('delay', () => jest.fn().mockResolvedValue(void 0));
8
-
9
- describe('InMemoryTransactionTracker', () => {
10
- const POLL_INTERVAL = 1000;
11
- let ledgerTipSlot: number;
12
- let provider: ProviderStub;
13
- let txTracker: InMemoryTransactionTracker;
14
- let hash_transaction: jest.Mock;
15
-
16
- const mockHashTransactionReturn = (resultHash: string) => {
17
- hash_transaction.mockReturnValue({
18
- to_bytes() {
19
- return Buffer.from(resultHash);
20
- }
21
- });
22
- };
23
-
24
- beforeEach(() => {
25
- provider = providerStub();
26
- provider.queryTransactionsByHashes.mockReturnValue([queryTransactionsResult[0]]);
27
- hash_transaction = jest.fn();
28
- mockHashTransactionReturn('some-hash');
29
- txTracker = new InMemoryTransactionTracker({
30
- provider,
31
- csl: { hash_transaction } as unknown as CardanoSerializationLib,
32
- logger: dummyLogger,
33
- pollInterval: POLL_INTERVAL
34
- });
35
- ledgerTipSlot = ledgerTip.slot;
36
- (mockDelay as unknown as jest.Mock).mockReset();
37
- });
38
-
39
- describe('track', () => {
40
- let onTransaction: jest.Mock;
41
-
42
- beforeEach(() => {
43
- onTransaction = jest.fn();
44
- txTracker.on(TransactionTrackerEvent.NewTransaction, onTransaction);
45
- });
46
-
47
- it('cannot track transactions that have no validity interval', async () => {
48
- await expect(() =>
49
- txTracker.track({
50
- body: () => ({
51
- ttl: () => void 0
52
- })
53
- } as unknown as CSL.Transaction)
54
- ).rejects.toThrowError(TransactionFailure.CannotTrack);
55
- });
56
-
57
- describe('valid transaction', () => {
58
- let transaction: CSL.Transaction;
59
-
60
- beforeEach(async () => {
61
- transaction = {
62
- body: () => ({
63
- ttl: () => ledgerTipSlot
64
- })
65
- } as unknown as CSL.Transaction;
66
- });
67
-
68
- it('throws CannotTrack on ledger tip fetch error', async () => {
69
- provider.queryTransactionsByHashes.mockResolvedValueOnce([]);
70
- provider.ledgerTip.mockRejectedValueOnce(new ProviderError(ProviderFailure.Unknown));
71
- await expect(txTracker.track(transaction)).rejects.toThrowError(TransactionFailure.CannotTrack);
72
- expect(provider.ledgerTip).toBeCalledTimes(1);
73
- expect(provider.queryTransactionsByHashes).toBeCalledTimes(1);
74
- });
75
-
76
- it('polls provider at "pollInterval" until it returns the transaction', async () => {
77
- // resolve [] or reject with 404 should be treated the same
78
- provider.queryTransactionsByHashes.mockResolvedValueOnce([]);
79
- provider.queryTransactionsByHashes.mockRejectedValueOnce(new ProviderError(ProviderFailure.NotFound));
80
- await txTracker.track(transaction);
81
- expect(provider.queryTransactionsByHashes).toBeCalledTimes(3);
82
- expect(mockDelay).toBeCalledTimes(3);
83
- expect(mockDelay).toBeCalledWith(POLL_INTERVAL);
84
- });
85
-
86
- it('throws after timeout', async () => {
87
- provider.queryTransactionsByHashes.mockResolvedValueOnce([]);
88
- provider.ledgerTip.mockResolvedValueOnce({ slot: ledgerTipSlot + 1 });
89
- await expect(txTracker.track(transaction)).rejects.toThrowError(TransactionFailure.Timeout);
90
- });
91
-
92
- it('emits "transaction" event for tracked transactions, returns promise unique per pending tx', async () => {
93
- const promise1 = txTracker.track(transaction);
94
- const promise2 = txTracker.track(transaction);
95
- await promise1;
96
- await promise2;
97
- mockHashTransactionReturn('other-hash');
98
- await txTracker.track(transaction);
99
- expect(provider.queryTransactionsByHashes).toBeCalledTimes(2);
100
- expect(onTransaction).toBeCalledTimes(2);
101
- // assert it clears cache
102
- await txTracker.track(transaction);
103
- expect(provider.queryTransactionsByHashes).toBeCalledTimes(3);
104
- expect(onTransaction).toBeCalledTimes(3);
105
- });
106
- });
107
- });
108
- });
@@ -1,242 +0,0 @@
1
- /* eslint-disable unicorn/consistent-function-scoping */
2
- /* eslint-disable promise/param-names */
3
- import { roundRobinRandomImprove, InputSelector } from '@cardano-sdk/cip2';
4
- import { loadCardanoSerializationLib, CardanoSerializationLib, CSL, Ogmios, Cardano } from '@cardano-sdk/core';
5
- import { flushPromises, SelectionConstraints } from '@cardano-sdk/util-dev';
6
- import {
7
- providerStub,
8
- delegate,
9
- rewards,
10
- ProviderStub,
11
- utxo,
12
- delegationAndRewards,
13
- MockTransactionTracker
14
- } from './mocks';
15
- import {
16
- InMemoryUtxoRepository,
17
- KeyManagement,
18
- TransactionTrackerEvent,
19
- UtxoRepository,
20
- UtxoRepositoryEvent,
21
- UtxoRepositoryFields
22
- } from '../src';
23
- import { ogmiosToCsl } from '@cardano-sdk/core/src/Ogmios';
24
- import { TxIn, TxOut } from '@cardano-ogmios/schema';
25
- import { TransactionError, TransactionFailure } from '../src/TransactionError';
26
-
27
- const addresses = [
28
- 'addr_test1qq585l3hyxgj3nas2v3xymd23vvartfhceme6gv98aaeg9muzcjqw982pcftgx53fu5527z2cj2tkx2h8ux2vxsg475q2g7k3g'
29
- ];
30
-
31
- describe('InMemoryUtxoRepository', () => {
32
- let utxoRepository: UtxoRepository;
33
- let provider: ProviderStub;
34
- let inputSelector: InputSelector;
35
- let csl: CardanoSerializationLib;
36
- let keyManager: KeyManagement.KeyManager;
37
- let outputs: Set<CSL.TransactionOutput>;
38
- let txTracker: MockTransactionTracker;
39
-
40
- beforeEach(async () => {
41
- provider = providerStub();
42
- csl = await loadCardanoSerializationLib();
43
- inputSelector = roundRobinRandomImprove(csl);
44
- keyManager = KeyManagement.createInMemoryKeyManager({
45
- csl,
46
- mnemonicWords: KeyManagement.util.generateMnemonicWords(),
47
- networkId: 0,
48
- password: '123'
49
- });
50
- outputs = new Set([
51
- Ogmios.ogmiosToCsl(csl).txOut({
52
- address: addresses[0],
53
- value: { coins: 4_000_000 }
54
- }),
55
- Ogmios.ogmiosToCsl(csl).txOut({
56
- address: addresses[0],
57
- value: { coins: 2_000_000 }
58
- })
59
- ]);
60
- txTracker = new MockTransactionTracker();
61
- utxoRepository = new InMemoryUtxoRepository({
62
- csl,
63
- provider,
64
- keyManager,
65
- inputSelector,
66
- txTracker
67
- });
68
- });
69
-
70
- test('constructed state', async () => {
71
- expect(utxoRepository.allUtxos.length).toBe(0);
72
- expect(utxoRepository.allRewards).toBe(null);
73
- expect(utxoRepository.delegation).toBe(null);
74
- });
75
-
76
- test('sync', async () => {
77
- const syncedHandler = jest.fn();
78
- utxoRepository.on(UtxoRepositoryEvent.Changed, syncedHandler);
79
- await utxoRepository.sync();
80
- const expectedFields: UtxoRepositoryFields = {
81
- allUtxos: utxo,
82
- availableUtxos: utxo,
83
- allRewards: rewards,
84
- availableRewards: rewards,
85
- delegation: delegate
86
- };
87
- expect(utxoRepository).toMatchObject(expectedFields);
88
- expect(syncedHandler).toBeCalledTimes(1);
89
- expect(syncedHandler).toBeCalledWith(expectedFields);
90
- const identicalUtxo = [{ ...utxo[1][0] }, { ...utxo[1][1] }] as const; // clone UTxO
91
- provider.utxoDelegationAndRewards.mockResolvedValueOnce({
92
- utxo: [utxo[0], identicalUtxo],
93
- delegationAndRewards
94
- });
95
- await utxoRepository.sync();
96
- expect(utxoRepository.allUtxos.length).toBe(2);
97
- // Verify we're not replacing the object with an identical one in the UTxO set
98
- expect(utxoRepository.allUtxos).not.toContain(identicalUtxo);
99
- expect(utxoRepository.allUtxos).toContain(utxo[1]);
100
- expect(syncedHandler).toBeCalledTimes(2);
101
- });
102
-
103
- describe('selectInputs', () => {
104
- it('can be called without explicitly syncing', async () => {
105
- const result = await utxoRepository.selectInputs(outputs, SelectionConstraints.NO_CONSTRAINTS);
106
- expect(utxoRepository.allUtxos.length).toBe(3);
107
- expect(utxoRepository.allRewards).toBe(rewards);
108
- expect(utxoRepository.delegation).toBe(delegate);
109
- expect(result.selection.inputs.size).toBeGreaterThan(0);
110
- expect(result.selection.outputs).toBe(outputs);
111
- expect(result.selection.change.size).toBe(2);
112
- });
113
- });
114
-
115
- describe('availableUtxos and availableRewards', () => {
116
- let transactionUtxo: [TxIn, TxOut];
117
- let transaction: CSL.Transaction;
118
- let numUtxoPreTransaction: number;
119
- let rewardsPreTransaction: bigint;
120
- let onOutOfSync: jest.Mock;
121
- let completeConfirmation: Function;
122
- const transactionWithdrawal = 1n;
123
-
124
- const trackTransaction = async (confirmed: Promise<void>) => {
125
- const syncedHandler = jest.fn();
126
- utxoRepository.on(UtxoRepositoryEvent.Changed, syncedHandler);
127
- await txTracker.emit(TransactionTrackerEvent.NewTransaction, {
128
- transaction,
129
- confirmed
130
- });
131
- // transaction not yet confirmed
132
- expect(utxoRepository.availableUtxos).toHaveLength(utxoRepository.allUtxos.length - 1);
133
- expect(utxoRepository.availableUtxos).not.toContain(transactionUtxo);
134
- expect(syncedHandler).toBeCalledTimes(1);
135
- expect(syncedHandler).toBeCalledWith({
136
- allUtxos: utxo,
137
- availableUtxos: utxo.slice(1),
138
- allRewards: rewards,
139
- availableRewards: rewards - transactionWithdrawal,
140
- delegation: delegate
141
- } as UtxoRepositoryFields);
142
- };
143
-
144
- const assertThereAreNoPendingTransactionsOrRewards = () => {
145
- expect(utxoRepository.availableUtxos).toHaveLength(utxoRepository.allUtxos.length);
146
- expect(utxoRepository.allRewards).toBe(utxoRepository.availableRewards);
147
- };
148
-
149
- beforeEach(async () => {
150
- transactionUtxo = utxo[0];
151
- transaction = {
152
- body: () => ({
153
- inputs: () => ({
154
- len: () => 1,
155
- get: () => ogmiosToCsl(csl).txIn(transactionUtxo[0])
156
- }),
157
- withdrawals: () => ({
158
- keys: () => ({
159
- len: () => 1,
160
- get: () =>
161
- csl.RewardAddress.new(
162
- Cardano.NetworkId.testnet,
163
- csl.StakeCredential.from_keyhash(keyManager.stakeKey.hash())
164
- )
165
- }),
166
- len: () => 1,
167
- get: () => csl.BigNum.from_str(transactionWithdrawal.toString())
168
- })
169
- })
170
- } as unknown as CSL.Transaction;
171
- await utxoRepository.sync();
172
- numUtxoPreTransaction = utxoRepository.allUtxos.length;
173
- rewardsPreTransaction = utxoRepository.allRewards!;
174
- onOutOfSync = jest.fn();
175
- utxoRepository.on(UtxoRepositoryEvent.OutOfSync, onOutOfSync);
176
- });
177
-
178
- it('preconditions', () => {
179
- expect(utxoRepository.availableUtxos).toHaveLength(utxoRepository.allUtxos.length);
180
- expect(utxoRepository.availableUtxos).toContain(transactionUtxo);
181
- expect(utxoRepository.availableRewards).toBe(rewardsPreTransaction);
182
- });
183
-
184
- describe('sync success', () => {
185
- beforeEach(() => {
186
- // Simulate spent utxo and rewards
187
- expect(provider.utxoDelegationAndRewards).toBeCalledTimes(1);
188
- provider.utxoDelegationAndRewards.mockResolvedValueOnce({
189
- utxo: utxo.slice(1),
190
- delegationAndRewards: {
191
- ...delegationAndRewards,
192
- rewards: rewards - transactionWithdrawal
193
- }
194
- });
195
- });
196
-
197
- const confirmTxAndAssertUtxoRepositorySynced = async () => {
198
- await completeConfirmation!();
199
- await flushPromises();
200
- // Assert values from provider sync
201
- expect(provider.utxoDelegationAndRewards).toBeCalledTimes(2);
202
- expect(utxoRepository.availableUtxos).toHaveLength(numUtxoPreTransaction - 1);
203
- expect(utxoRepository.availableUtxos).not.toContain(transactionUtxo);
204
- expect(utxoRepository.availableRewards).toBe(rewardsPreTransaction - transactionWithdrawal);
205
- expect(onOutOfSync).not.toBeCalled();
206
- };
207
-
208
- it('transaction confirmed', async () => {
209
- await trackTransaction(new Promise<void>((resolve) => (completeConfirmation = resolve)));
210
- await confirmTxAndAssertUtxoRepositorySynced();
211
- assertThereAreNoPendingTransactionsOrRewards();
212
- });
213
-
214
- it('transaction confirmation failed', async () => {
215
- // setup for transaction to timeout
216
- await trackTransaction(
217
- new Promise<void>(
218
- (_, reject) => (completeConfirmation = () => reject(new TransactionError(TransactionFailure.Timeout)))
219
- )
220
- );
221
- await confirmTxAndAssertUtxoRepositorySynced();
222
- assertThereAreNoPendingTransactionsOrRewards();
223
- });
224
- });
225
-
226
- it('emits OutOfSync on sync failure', async () => {
227
- provider.utxoDelegationAndRewards.mockRejectedValueOnce(new Error('any error'));
228
-
229
- const confirmed = new Promise<void>((resolve) => (completeConfirmation = resolve));
230
- await trackTransaction(confirmed);
231
-
232
- // transaction confirmed
233
- await completeConfirmation!();
234
- await flushPromises();
235
- expect(utxoRepository.availableUtxos).toHaveLength(numUtxoPreTransaction);
236
- expect(utxoRepository.availableUtxos).toContain(transactionUtxo);
237
- expect(utxoRepository.allRewards).toBe(rewardsPreTransaction);
238
- expect(onOutOfSync).toBeCalledTimes(1);
239
- assertThereAreNoPendingTransactionsOrRewards();
240
- });
241
- });
242
- });
@@ -1,39 +0,0 @@
1
- import { Cardano, CardanoSerializationLib, loadCardanoSerializationLib } from '@cardano-sdk/core';
2
- import { Buffer } from 'buffer';
3
- import { KeyManagement } from '../../src';
4
-
5
- describe('InMemoryKeyManager', () => {
6
- let keyManager: KeyManagement.KeyManager;
7
- let csl: CardanoSerializationLib;
8
-
9
- beforeEach(async () => {
10
- csl = await loadCardanoSerializationLib();
11
- const mnemonicWords = KeyManagement.util.generateMnemonicWords();
12
- keyManager = KeyManagement.createInMemoryKeyManager({
13
- csl,
14
- mnemonicWords,
15
- networkId: Cardano.NetworkId.testnet,
16
- password: '123'
17
- });
18
- expect(keyManager.publicKey).toBeInstanceOf(csl.PublicKey);
19
- });
20
-
21
- test('initial state publicKey', async () => {
22
- expect(keyManager.publicKey).toBeDefined();
23
- expect(keyManager.publicParentKey).toBeDefined();
24
- });
25
-
26
- test('deriveAddress', async () => {
27
- const address = await keyManager.deriveAddress(0, 0);
28
- expect(address).toBeDefined();
29
- expect(keyManager.publicParentKey).toBeDefined();
30
- });
31
-
32
- test('signTransaction', async () => {
33
- const txHash = csl.TransactionHash.from_bytes(
34
- Buffer.from('8561258e210352fba2ac0488afed67b3427a27ccf1d41ec030c98a8199bc22ec', 'hex')
35
- );
36
- const witnessSet = await keyManager.signTransaction(txHash);
37
- expect(witnessSet).toBeInstanceOf(csl.TransactionWitnessSet);
38
- });
39
- });
@@ -1,87 +0,0 @@
1
- /* eslint-disable max-len */
2
- import { loadCardanoSerializationLib, CardanoSerializationLib, Cardano } from '@cardano-sdk/core';
3
- import { InputSelector, roundRobinRandomImprove } from '@cardano-sdk/cip2';
4
- import { ProviderStub, providerStub, txTracker } from './mocks';
5
- import {
6
- BalanceTracker,
7
- createSingleAddressWallet,
8
- InMemoryUtxoRepository,
9
- KeyManagement,
10
- SingleAddressWallet,
11
- SingleAddressWalletDependencies,
12
- UtxoRepository
13
- } from '../src';
14
-
15
- describe('Wallet', () => {
16
- const name = 'Test Wallet';
17
- let csl: CardanoSerializationLib;
18
- let inputSelector: InputSelector;
19
- let keyManager: KeyManagement.KeyManager;
20
- let provider: ProviderStub;
21
- let utxoRepository: UtxoRepository;
22
- let walletDependencies: SingleAddressWalletDependencies;
23
-
24
- beforeEach(async () => {
25
- csl = await loadCardanoSerializationLib();
26
- keyManager = KeyManagement.createInMemoryKeyManager({
27
- csl,
28
- mnemonicWords: KeyManagement.util.generateMnemonicWords(),
29
- networkId: Cardano.NetworkId.testnet,
30
- password: '123'
31
- });
32
- provider = providerStub();
33
- inputSelector = roundRobinRandomImprove(csl);
34
- utxoRepository = new InMemoryUtxoRepository({ csl, provider, keyManager, inputSelector, txTracker });
35
- walletDependencies = { csl, keyManager, provider, utxoRepository, txTracker };
36
- });
37
-
38
- test('createWallet', async () => {
39
- const wallet = await createSingleAddressWallet({ name }, walletDependencies);
40
- expect(wallet.address).toBeDefined();
41
- expect(wallet.name).toBe(name);
42
- expect(typeof wallet.initializeTx).toBe('function');
43
- expect(typeof wallet.signTx).toBe('function');
44
- expect(wallet.balance).toBeInstanceOf(BalanceTracker);
45
- });
46
-
47
- describe('wallet behaviour', () => {
48
- let wallet: SingleAddressWallet;
49
- const props = {
50
- outputs: new Set([
51
- {
52
- address:
53
- 'addr_test1qpu5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5ewvxwdrt70qlcpeeagscasafhffqsxy36t90ldv06wqrk2qum8x5w',
54
- value: { coins: 11_111_111 }
55
- }
56
- ])
57
- };
58
-
59
- beforeEach(async () => {
60
- wallet = await createSingleAddressWallet({ name }, walletDependencies);
61
- });
62
-
63
- test('initializeTx', async () => {
64
- const txInternals = await wallet.initializeTx(props);
65
- expect(txInternals.body).toBeInstanceOf(csl.TransactionBody);
66
- expect(txInternals.hash).toBeInstanceOf(csl.TransactionHash);
67
- });
68
-
69
- test('signTx', async () => {
70
- const { body, hash } = await wallet.initializeTx(props);
71
- const tx = await wallet.signTx(body, hash);
72
- await expect(tx.body().outputs().len()).toBe(2);
73
- await expect(tx.body().inputs().len()).toBeGreaterThan(0);
74
- });
75
-
76
- test('submitTx', async () => {
77
- const { body, hash } = await wallet.initializeTx(props);
78
- const tx = await wallet.signTx(body, hash);
79
- const { submitted, confirmed } = wallet.submitTx(tx);
80
- await confirmed;
81
- expect(provider.submitTx).toBeCalledTimes(1);
82
- expect(provider.submitTx).toBeCalledWith(tx);
83
- expect(txTracker.track).toBeCalledTimes(1);
84
- expect(txTracker.track).toBeCalledWith(tx, submitted);
85
- });
86
- });
87
- });
@@ -1,89 +0,0 @@
1
- import { CardanoSerializationLib, loadCardanoSerializationLib } from '@cardano-sdk/core';
2
- import { testKeyManager } from '../mocks';
3
- import { CertificateFactory } from '../../src/Transaction';
4
- import { KeyManager } from '../../src/KeyManagement';
5
-
6
- describe('Transaction.CertificateFactory', () => {
7
- let csl: CardanoSerializationLib;
8
- let stakeKey: string;
9
- let keyManager: KeyManager;
10
- let certs: CertificateFactory;
11
- const delegatee = 'pool1qqvukkkfr3ux4qylfkrky23f6trl2l6xjluv36z90ax7gfa8yxt';
12
-
13
- beforeAll(async () => {
14
- csl = await loadCardanoSerializationLib();
15
- keyManager = testKeyManager(csl);
16
- stakeKey = keyManager.stakeKey.hash().to_bech32('ed25519_pk');
17
- certs = new CertificateFactory(csl, keyManager);
18
- });
19
-
20
- it('stakeKeyRegistration', () =>
21
- expect(
22
- certs.stakeKeyRegistration().as_stake_registration()?.stake_credential().to_keyhash()?.to_bech32('ed25519_pk')
23
- ).toBe(stakeKey));
24
-
25
- it('stakeKeyDeregistration', () =>
26
- expect(
27
- certs.stakeKeyDeregistration().as_stake_deregistration()?.stake_credential().to_keyhash()?.to_bech32('ed25519_pk')
28
- ).toBe(stakeKey));
29
-
30
- it('stakeDelegation', () => {
31
- const delegation = certs.stakeDelegation(delegatee).as_stake_delegation()!;
32
- expect(delegation.stake_credential().to_keyhash()?.to_bech32('ed25519_pk')).toBe(stakeKey);
33
- expect(delegation.pool_keyhash().to_bech32('pool')).toBe(delegatee);
34
- });
35
-
36
- it('poolRegistration', () => {
37
- const owner = keyManager.publicKey.hash().to_bech32('ed25519_pk');
38
- const vrfKeyHash = 'vrf_vk13hg4gg5fg67399nuz2ldk89kqw9h379cfgtkpvd83ra89f908kcqv2cw3j';
39
- const rewardAddress = 'addr1uxa5pudxg77g3sdaddecmw8tvc6hmynywn49lltt4fmvn7cmpqcax';
40
- const poolMetadata = {
41
- hash: 'pool1ntpzzu5g6xhqkns4csd435lqtgfjqm7e4wquk9v58eqhf0esey9st6vf29',
42
- url: 'https://example.com'
43
- };
44
- const params = certs
45
- .poolRegistration({
46
- cost: 1000n,
47
- pledge: 10_000n,
48
- margin: { denominator: 5, numerator: 1 },
49
- owners: [owner],
50
- poolKeyHash: stakeKey,
51
- relays: [
52
- { relayType: 'singlehost-name', hostname: 'example.com', port: 5000 },
53
- {
54
- relayType: 'singlehost-addr',
55
- port: 6000,
56
- ipv4: '127.0.0.1'
57
- },
58
- { relayType: 'multihost-name', dnsName: 'example.com' }
59
- ],
60
- vrfKeyHash,
61
- rewardAddress,
62
- poolMetadata
63
- })
64
- .as_pool_registration()!
65
- .pool_params();
66
- expect(params.cost().to_str()).toBe('1000');
67
- expect(params.pledge().to_str()).toBe('10000');
68
- const margin = params.margin();
69
- expect(margin.numerator().to_str()).toBe('1');
70
- expect(margin.denominator().to_str()).toBe('5');
71
- const owners = params.pool_owners();
72
- expect(owners.len()).toBe(1);
73
- expect(owners.get(0).to_bech32('ed25519_pk')).toBe(owner);
74
- expect(params.operator().to_bech32('ed25519_pk')).toBe(stakeKey);
75
- const relays = params.relays();
76
- expect(relays.len()).toBe(3);
77
- expect(params.vrf_keyhash().to_bech32('vrf_vk')).toBe(vrfKeyHash);
78
- expect(params.reward_account().to_address().to_bech32('addr')).toBe(rewardAddress);
79
- const metadata = params.pool_metadata()!;
80
- expect(metadata.url().url()).toBe(poolMetadata.url);
81
- expect(metadata.pool_metadata_hash().to_bech32('pool')).toBe(poolMetadata.hash);
82
- });
83
-
84
- it('poolRetirement', () => {
85
- const retirement = certs.poolRetirement(stakeKey, 1000).as_pool_retirement()!;
86
- expect(retirement.pool_keyhash().to_bech32('ed25519_pk')).toEqual(stakeKey);
87
- expect(retirement.epoch()).toEqual(1000);
88
- });
89
- });
@@ -1,26 +0,0 @@
1
- import { loadCardanoSerializationLib, ProtocolParametersRequiredByWallet } from '@cardano-sdk/core';
2
- import { testKeyManager } from '../mocks';
3
- import { Transaction } from '../../src';
4
- import { InitializeTxProps } from '../../src/Transaction';
5
-
6
- describe('Transaction.computeImplicitCoin', () => {
7
- it('sums registrations for deposit, withdrawals and deregistrations for input', async () => {
8
- const protocolParameters = { stakeKeyDeposit: 2, poolDeposit: 3 } as ProtocolParametersRequiredByWallet;
9
- const csl = await loadCardanoSerializationLib();
10
- const keyManager = testKeyManager(csl);
11
- const certs = new Transaction.CertificateFactory(csl, keyManager);
12
- const certificates = [
13
- certs.stakeKeyRegistration(),
14
- certs.stakeKeyDeregistration(),
15
- certs.stakeKeyRegistration(),
16
- certs.poolRetirement(keyManager.stakeKey.hash().to_bech32('key'), 1000),
17
- certs.stakeDelegation('pool1qqvukkkfr3ux4qylfkrky23f6trl2l6xjluv36z90ax7gfa8yxt')
18
- ];
19
- const withdrawals = [Transaction.withdrawal(csl, keyManager, 5n)];
20
- const txProps = { certificates, withdrawals } as unknown as InitializeTxProps;
21
-
22
- const coin = Transaction.computeImplicitCoin(protocolParameters, txProps);
23
- expect(coin.deposit).toBe(2n + 2n);
24
- expect(coin.input).toBe(2n + 3n + 5n);
25
- });
26
- });
@@ -1,84 +0,0 @@
1
- import { InputSelector, roundRobinRandomImprove } from '@cardano-sdk/cip2';
2
- import { loadCardanoSerializationLib, CardanoSerializationLib, CSL, CardanoProvider, Ogmios } from '@cardano-sdk/core';
3
- import { SelectionConstraints } from '@cardano-sdk/util-dev';
4
- import { providerStub, txTracker, testKeyManager } from '../mocks';
5
- import {
6
- CertificateFactory,
7
- createTransactionInternals,
8
- CreateTxInternalsProps,
9
- Withdrawal
10
- } from '../../src/Transaction';
11
- import { UtxoRepository, InMemoryUtxoRepository, KeyManagement } from '../../src';
12
-
13
- const address =
14
- 'addr_test1qq585l3hyxgj3nas2v3xymd23vvartfhceme6gv98aaeg9muzcjqw982pcftgx53fu5527z2cj2tkx2h8ux2vxsg475q2g7k3g';
15
-
16
- describe('Transaction.createTransactionInternals', () => {
17
- let csl: CardanoSerializationLib;
18
- let provider: CardanoProvider;
19
- let inputSelector: InputSelector;
20
- let utxoRepository: UtxoRepository;
21
- let keyManager: KeyManagement.KeyManager;
22
- let outputs: Set<CSL.TransactionOutput>;
23
-
24
- const createSimpleTransactionInternals = async (props?: Partial<CreateTxInternalsProps>) => {
25
- const result = await utxoRepository.selectInputs(outputs, SelectionConstraints.NO_CONSTRAINTS);
26
- const ledgerTip = await provider.ledgerTip();
27
- return await createTransactionInternals(csl, {
28
- changeAddress: 'addr_test1gz2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzerspqgpsqe70et',
29
- inputSelection: result.selection,
30
- validityInterval: {
31
- invalidHereafter: ledgerTip.slot + 3600
32
- },
33
- ...props
34
- });
35
- };
36
-
37
- beforeEach(async () => {
38
- csl = await loadCardanoSerializationLib();
39
- provider = providerStub();
40
- inputSelector = roundRobinRandomImprove(csl);
41
- keyManager = testKeyManager(csl);
42
-
43
- outputs = new Set([
44
- Ogmios.ogmiosToCsl(csl).txOut({
45
- address,
46
- value: { coins: 4_000_000 }
47
- }),
48
- Ogmios.ogmiosToCsl(csl).txOut({
49
- address,
50
- value: { coins: 2_000_000 }
51
- })
52
- ]);
53
- utxoRepository = new InMemoryUtxoRepository({ csl, provider, keyManager, inputSelector, txTracker });
54
- });
55
-
56
- test('simple transaction', async () => {
57
- const { body, hash } = await createSimpleTransactionInternals();
58
- expect(body).toBeInstanceOf(csl.TransactionBody);
59
- expect(hash).toBeInstanceOf(csl.TransactionHash);
60
- });
61
-
62
- test('transaction with withdrawals', async () => {
63
- const withdrawal: Withdrawal = {
64
- address: csl.RewardAddress.new(
65
- csl.NetworkId.testnet().kind(),
66
- csl.StakeCredential.from_keyhash(keyManager.stakeKey.hash())
67
- ),
68
- quantity: csl.BigNum.from_str('5000000')
69
- };
70
- const { body } = await createSimpleTransactionInternals({ withdrawals: [withdrawal] });
71
- const txWithdrawals = body.withdrawals()!;
72
- expect(txWithdrawals.len()).toBe(1);
73
- const txWithdrawalQty = txWithdrawals.get(withdrawal.address);
74
- expect(txWithdrawalQty?.to_str()).toBe(withdrawal.quantity.to_str());
75
- });
76
-
77
- test('transaction with certificates', async () => {
78
- const delegatee = 'pool1qqvukkkfr3ux4qylfkrky23f6trl2l6xjluv36z90ax7gfa8yxt';
79
- const certFactory = new CertificateFactory(csl, keyManager);
80
- const certificates = [certFactory.stakeKeyRegistration(), certFactory.stakeDelegation(delegatee)];
81
- const { body } = await createSimpleTransactionInternals({ certificates });
82
- expect(body.certs()!.len()).toBe(certificates.length);
83
- });
84
- });