@cardano-sdk/wallet 0.1.4 → 0.1.8

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 (169) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/README.md +8 -0
  4. package/dist/KeyManagement/InMemoryKeyManager.d.ts +9 -0
  5. package/dist/KeyManagement/InMemoryKeyManager.d.ts.map +1 -0
  6. package/dist/KeyManagement/InMemoryKeyManager.js +94 -0
  7. package/dist/KeyManagement/InMemoryKeyManager.js.map +1 -0
  8. package/dist/KeyManagement/errors/InvalidMnemonic.d.ts +5 -0
  9. package/dist/KeyManagement/errors/InvalidMnemonic.d.ts.map +1 -0
  10. package/dist/KeyManagement/errors/InvalidMnemonic.js +13 -0
  11. package/dist/KeyManagement/errors/InvalidMnemonic.js.map +1 -0
  12. package/{src/KeyManagement/errors/index.ts → dist/KeyManagement/errors/index.d.ts} +1 -0
  13. package/dist/KeyManagement/errors/index.d.ts.map +1 -0
  14. package/dist/KeyManagement/errors/index.js +6 -0
  15. package/dist/KeyManagement/errors/index.js.map +1 -0
  16. package/{src/KeyManagement/index.ts → dist/KeyManagement/index.d.ts} +1 -0
  17. package/dist/KeyManagement/index.d.ts.map +1 -0
  18. package/dist/KeyManagement/index.js +30 -0
  19. package/dist/KeyManagement/index.js.map +1 -0
  20. package/dist/KeyManagement/types.d.ts +30 -0
  21. package/dist/KeyManagement/types.d.ts.map +1 -0
  22. package/dist/KeyManagement/types.js +15 -0
  23. package/dist/KeyManagement/types.js.map +1 -0
  24. package/dist/KeyManagement/util.d.ts +6 -0
  25. package/dist/KeyManagement/util.d.ts.map +1 -0
  26. package/dist/KeyManagement/util.js +31 -0
  27. package/dist/KeyManagement/util.js.map +1 -0
  28. package/dist/SingleAddressWallet.d.ts +45 -0
  29. package/dist/SingleAddressWallet.d.ts.map +1 -0
  30. package/dist/SingleAddressWallet.js +158 -0
  31. package/dist/SingleAddressWallet.js.map +1 -0
  32. package/dist/Transaction/computeImplicitCoin.d.ts +4 -0
  33. package/dist/Transaction/computeImplicitCoin.d.ts.map +1 -0
  34. package/dist/Transaction/computeImplicitCoin.js +21 -0
  35. package/dist/Transaction/computeImplicitCoin.js.map +1 -0
  36. package/dist/Transaction/createTransactionInternals.d.ts +16 -0
  37. package/dist/Transaction/createTransactionInternals.d.ts.map +1 -0
  38. package/dist/Transaction/createTransactionInternals.js +28 -0
  39. package/dist/Transaction/createTransactionInternals.js.map +1 -0
  40. package/dist/Transaction/ensureValidityInterval.d.ts +3 -0
  41. package/dist/Transaction/ensureValidityInterval.d.ts.map +1 -0
  42. package/dist/Transaction/ensureValidityInterval.js +6 -0
  43. package/dist/Transaction/ensureValidityInterval.js.map +1 -0
  44. package/dist/Transaction/index.d.ts +4 -0
  45. package/dist/Transaction/index.d.ts.map +1 -0
  46. package/dist/Transaction/index.js +16 -0
  47. package/dist/Transaction/index.js.map +1 -0
  48. package/dist/index.d.ts +6 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +31 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/services/AssetsTracker.d.ts +16 -0
  53. package/dist/services/AssetsTracker.d.ts.map +1 -0
  54. package/dist/services/AssetsTracker.js +13 -0
  55. package/dist/services/AssetsTracker.js.map +1 -0
  56. package/dist/services/BalanceTracker.d.ts +5 -0
  57. package/dist/services/BalanceTracker.d.ts.map +1 -0
  58. package/dist/services/BalanceTracker.js +43 -0
  59. package/dist/services/BalanceTracker.js.map +1 -0
  60. package/dist/services/DelegationTracker/DelegationTracker.d.ts +26 -0
  61. package/dist/services/DelegationTracker/DelegationTracker.d.ts.map +1 -0
  62. package/dist/services/DelegationTracker/DelegationTracker.js +39 -0
  63. package/dist/services/DelegationTracker/DelegationTracker.js.map +1 -0
  64. package/dist/services/DelegationTracker/RewardAccounts.d.ts +36 -0
  65. package/dist/services/DelegationTracker/RewardAccounts.d.ts.map +1 -0
  66. package/dist/services/DelegationTracker/RewardAccounts.js +86 -0
  67. package/dist/services/DelegationTracker/RewardAccounts.js.map +1 -0
  68. package/dist/services/DelegationTracker/RewardsHistory.d.ts +14 -0
  69. package/dist/services/DelegationTracker/RewardsHistory.d.ts.map +1 -0
  70. package/dist/services/DelegationTracker/RewardsHistory.js +27 -0
  71. package/dist/services/DelegationTracker/RewardsHistory.js.map +1 -0
  72. package/dist/services/DelegationTracker/index.d.ts +5 -0
  73. package/dist/services/DelegationTracker/index.d.ts.map +1 -0
  74. package/dist/services/DelegationTracker/index.js +17 -0
  75. package/dist/services/DelegationTracker/index.js.map +1 -0
  76. package/dist/services/DelegationTracker/transactionCertificates.d.ts +9 -0
  77. package/dist/services/DelegationTracker/transactionCertificates.d.ts.map +1 -0
  78. package/dist/services/DelegationTracker/transactionCertificates.js +33 -0
  79. package/dist/services/DelegationTracker/transactionCertificates.js.map +1 -0
  80. package/dist/services/DelegationTracker/types.d.ts +6 -0
  81. package/dist/services/DelegationTracker/types.d.ts.map +1 -0
  82. package/dist/services/DelegationTracker/types.js +3 -0
  83. package/dist/services/DelegationTracker/types.js.map +1 -0
  84. package/dist/services/TransactionError.d.ts +15 -0
  85. package/dist/services/TransactionError.d.ts.map +1 -0
  86. package/dist/services/TransactionError.js +23 -0
  87. package/dist/services/TransactionError.js.map +1 -0
  88. package/dist/services/TransactionsTracker.d.ts +22 -0
  89. package/dist/services/TransactionsTracker.d.ts.map +1 -0
  90. package/dist/services/TransactionsTracker.js +75 -0
  91. package/dist/services/TransactionsTracker.js.map +1 -0
  92. package/dist/services/UtxoTracker.d.ts +18 -0
  93. package/dist/services/UtxoTracker.d.ts.map +1 -0
  94. package/dist/services/UtxoTracker.js +20 -0
  95. package/dist/services/UtxoTracker.js.map +1 -0
  96. package/dist/services/index.d.ts +9 -0
  97. package/dist/services/index.d.ts.map +1 -0
  98. package/dist/services/index.js +21 -0
  99. package/dist/services/index.js.map +1 -0
  100. package/dist/services/types.d.ts +81 -0
  101. package/dist/services/types.d.ts.map +1 -0
  102. package/dist/services/types.js +16 -0
  103. package/dist/services/types.js.map +1 -0
  104. package/dist/services/util/SyncableIntervalTrackerSubject.d.ts +19 -0
  105. package/dist/services/util/SyncableIntervalTrackerSubject.d.ts.map +1 -0
  106. package/dist/services/util/SyncableIntervalTrackerSubject.js +30 -0
  107. package/dist/services/util/SyncableIntervalTrackerSubject.js.map +1 -0
  108. package/dist/services/util/TrackerSubject.d.ts +14 -0
  109. package/dist/services/util/TrackerSubject.d.ts.map +1 -0
  110. package/dist/services/util/TrackerSubject.js +46 -0
  111. package/dist/services/util/TrackerSubject.js.map +1 -0
  112. package/dist/services/util/coldObservableProvider.d.ts +4 -0
  113. package/dist/services/util/coldObservableProvider.d.ts.map +1 -0
  114. package/dist/services/util/coldObservableProvider.js +14 -0
  115. package/dist/services/util/coldObservableProvider.js.map +1 -0
  116. package/dist/services/util/equals.d.ts +9 -0
  117. package/dist/services/util/equals.d.ts.map +1 -0
  118. package/dist/services/util/equals.js +19 -0
  119. package/dist/services/util/equals.js.map +1 -0
  120. package/dist/services/util/index.d.ts +6 -0
  121. package/dist/services/util/index.d.ts.map +1 -0
  122. package/dist/services/util/index.js +18 -0
  123. package/dist/services/util/index.js.map +1 -0
  124. package/dist/services/util/trigger.d.ts +5 -0
  125. package/dist/services/util/trigger.d.ts.map +1 -0
  126. package/dist/services/util/trigger.js +9 -0
  127. package/dist/services/util/trigger.js.map +1 -0
  128. package/dist/types.d.ts +35 -0
  129. package/dist/types.d.ts.map +1 -0
  130. package/dist/types.js +3 -0
  131. package/dist/types.js.map +1 -0
  132. package/package.json +17 -8
  133. package/jest.config.js +0 -1
  134. package/src/Address.ts +0 -12
  135. package/src/BalanceTracker.ts +0 -62
  136. package/src/InMemoryTransactionTracker.ts +0 -87
  137. package/src/InMemoryUtxoRepository.ts +0 -192
  138. package/src/KeyManagement/InMemoryKeyManager.ts +0 -67
  139. package/src/KeyManagement/errors/InvalidMnemonic.ts +0 -9
  140. package/src/KeyManagement/types.ts +0 -15
  141. package/src/KeyManagement/util.ts +0 -14
  142. package/src/SingleAddressWallet.ts +0 -120
  143. package/src/Transaction/CertificateFactory.ts +0 -154
  144. package/src/Transaction/computeImplicitCoin.ts +0 -36
  145. package/src/Transaction/createTransactionInternals.ts +0 -60
  146. package/src/Transaction/index.ts +0 -5
  147. package/src/Transaction/types.ts +0 -12
  148. package/src/Transaction/withdrawal.ts +0 -17
  149. package/src/TransactionError.ts +0 -17
  150. package/src/index.ts +0 -9
  151. package/src/tsconfig.json +0 -11
  152. package/src/types.ts +0 -56
  153. package/test/.eslintrc.js +0 -7
  154. package/test/BalanceTracker.test.ts +0 -44
  155. package/test/InMemoryTransactionTracker.test.ts +0 -108
  156. package/test/InMemoryUtxoRepository.test.ts +0 -242
  157. package/test/KeyManagement/InMemoryKeyManager.test.ts +0 -39
  158. package/test/SingleAddressWallet.test.ts +0 -87
  159. package/test/Transaction/CertificateFactory.test.ts +0 -89
  160. package/test/Transaction/computeImplicitCoin.test.ts +0 -26
  161. package/test/Transaction/createTransactionInternals.test.ts +0 -84
  162. package/test/Transaction/withdrawal.test.ts +0 -13
  163. package/test/integration/withdrawal.test.ts +0 -108
  164. package/test/mocks/MockTransactionTracker.ts +0 -8
  165. package/test/mocks/MockUtxoRepository.ts +0 -13
  166. package/test/mocks/ProviderStub.ts +0 -151
  167. package/test/mocks/index.ts +0 -4
  168. package/test/mocks/testKeyManager.ts +0 -10
  169. package/test/tsconfig.json +0 -12
@@ -1,192 +0,0 @@
1
- import Schema, { TxIn, TxOut } from '@cardano-ogmios/schema';
2
- import { Buffer } from 'buffer';
3
- import { CardanoProvider, Ogmios, CardanoSerializationLib, CSL, cslUtil } from '@cardano-sdk/core';
4
- import { dummyLogger, Logger } from 'ts-log';
5
- import { ImplicitCoin, InputSelector, SelectionConstraints, SelectionResult } from '@cardano-sdk/cip2';
6
- import { KeyManager } from './KeyManagement';
7
- import {
8
- UtxoRepository,
9
- OnTransactionArgs,
10
- TransactionTracker,
11
- TransactionTrackerEvent,
12
- UtxoRepositoryEvent,
13
- UtxoRepositoryEvents
14
- } from './types';
15
- import { cslToOgmios } from '@cardano-sdk/core/src/Ogmios';
16
- import Emittery from 'emittery';
17
-
18
- export interface InMemoryUtxoRepositoryProps {
19
- csl: CardanoSerializationLib;
20
- provider: CardanoProvider;
21
- keyManager: KeyManager;
22
- inputSelector: InputSelector;
23
- txTracker: TransactionTracker;
24
- logger?: Logger;
25
- }
26
-
27
- const utxoEquals = ([txIn1]: [Schema.TxIn, Schema.TxOut], [txIn2]: [Schema.TxIn, Schema.TxOut]): boolean =>
28
- txIn1.txId === txIn2.txId && txIn1.index === txIn2.index;
29
-
30
- export class InMemoryUtxoRepository extends Emittery<UtxoRepositoryEvents> implements UtxoRepository {
31
- #csl: CardanoSerializationLib;
32
- #delegationAndRewards: Ogmios.DelegationsAndRewards;
33
- #inputSelector: InputSelector;
34
- #keyManager: KeyManager;
35
- #logger: Logger;
36
- #provider: CardanoProvider;
37
- #utxoSet: Set<[TxIn, TxOut]>;
38
- #lockedUtxoSet: Set<[TxIn, TxOut]> = new Set();
39
- #lockedRewards = 0n;
40
-
41
- constructor({
42
- csl,
43
- logger = dummyLogger,
44
- provider,
45
- inputSelector,
46
- keyManager,
47
- txTracker
48
- }: InMemoryUtxoRepositoryProps) {
49
- super();
50
- this.#csl = csl;
51
- this.#logger = logger;
52
- this.#provider = provider;
53
- this.#utxoSet = new Set();
54
- this.#delegationAndRewards = { rewards: undefined, delegate: undefined };
55
- this.#inputSelector = inputSelector;
56
- this.#keyManager = keyManager;
57
- txTracker.on(TransactionTrackerEvent.NewTransaction, (args) => {
58
- // not blocking to make it testable easier
59
- this.#onTransaction(args).catch(this.#logger.error);
60
- });
61
- }
62
-
63
- public async sync(): Promise<void> {
64
- this.#logger.debug('Syncing InMemoryUtxoRepository');
65
- const result = await this.#provider.utxoDelegationAndRewards(
66
- [this.#keyManager.deriveAddress(1, 0)],
67
- Buffer.from(this.#keyManager.stakeKey.hash().to_bytes()).toString('hex')
68
- );
69
- this.#logger.trace(result);
70
- for (const utxo of result.utxo) {
71
- if (!this.allUtxos.some((oldUtxo) => utxoEquals(utxo, oldUtxo))) {
72
- this.#utxoSet.add(utxo);
73
- this.#logger.debug('New UTxO', utxo);
74
- }
75
- }
76
- for (const utxo of this.#utxoSet) {
77
- if (!result.utxo.some((newUtxo) => utxoEquals(utxo, newUtxo))) {
78
- this.#utxoSet.delete(utxo);
79
- this.#logger.debug('UTxO is gone', utxo);
80
- }
81
- }
82
- if (this.#delegationAndRewards.delegate !== result.delegationAndRewards.delegate) {
83
- this.#delegationAndRewards.delegate = result.delegationAndRewards.delegate;
84
- this.#logger.debug('Delegation stored', result.delegationAndRewards.delegate);
85
- }
86
- if (this.#delegationAndRewards.rewards !== result.delegationAndRewards.rewards) {
87
- this.#delegationAndRewards.rewards = result.delegationAndRewards.rewards
88
- ? BigInt(result.delegationAndRewards.rewards)
89
- : undefined;
90
- this.#logger.debug('Rewards balance stored', result.delegationAndRewards.rewards);
91
- }
92
- this.#emitSynced();
93
- }
94
-
95
- public async selectInputs(
96
- outputs: Set<CSL.TransactionOutput>,
97
- constraints: SelectionConstraints,
98
- implicitCoin?: ImplicitCoin
99
- ): Promise<SelectionResult> {
100
- if (this.#utxoSet.size === 0) {
101
- this.#logger.debug('Local UTxO set is empty. Syncing...');
102
- await this.sync();
103
- }
104
- return this.#inputSelector.select({
105
- utxo: new Set(Ogmios.ogmiosToCsl(this.#csl).utxo(this.availableUtxos)),
106
- outputs,
107
- constraints,
108
- implicitCoin
109
- });
110
- }
111
-
112
- public get allUtxos(): Schema.Utxo {
113
- return [...this.#utxoSet.values()];
114
- }
115
-
116
- public get availableUtxos(): Schema.Utxo {
117
- return this.allUtxos.filter((utxo) => !this.#lockedUtxoSet.has(utxo));
118
- }
119
-
120
- public get allRewards(): Ogmios.Lovelace | null {
121
- return this.#delegationAndRewards.rewards ?? null;
122
- }
123
-
124
- public get availableRewards(): Ogmios.Lovelace | null {
125
- if (!this.allRewards) return null;
126
- return this.allRewards - this.#lockedRewards;
127
- }
128
-
129
- public get delegation(): Schema.PoolId | null {
130
- return this.#delegationAndRewards.delegate ?? null;
131
- }
132
-
133
- #emitSynced() {
134
- this.emit(UtxoRepositoryEvent.Changed, {
135
- allUtxos: this.allUtxos,
136
- availableUtxos: this.availableUtxos,
137
- allRewards: this.allRewards,
138
- availableRewards: this.availableRewards,
139
- delegation: this.delegation
140
- }).catch(this.#logger.error);
141
- }
142
-
143
- async #onTransaction({ transaction, confirmed }: OnTransactionArgs) {
144
- // Lock reward
145
- const rewardsLockedByTx = this.#getOwnTransactionWithdrawalQty(transaction);
146
- this.#lockedRewards += rewardsLockedByTx;
147
- // Lock utxo
148
- const utxoLockedByTx: Schema.Utxo = [];
149
- const inputs = transaction.body().inputs();
150
- for (let inputIdx = 0; inputIdx < inputs.len(); inputIdx++) {
151
- const { txId, index } = cslToOgmios.txIn(inputs.get(inputIdx));
152
- const utxo = this.allUtxos.find(([txIn]) => txIn.txId === txId && txIn.index === index)!;
153
- this.#lockedUtxoSet.add(utxo);
154
- utxoLockedByTx.push(utxo);
155
- }
156
- this.#emitSynced();
157
- // Await confirmation. Rejection should be handled by the user after submitting transaction.
158
- await confirmed.catch(() => void 0);
159
- // Unlock utxo
160
- for (const utxo of utxoLockedByTx) {
161
- this.#lockedUtxoSet.delete(utxo);
162
- }
163
- // Unlock rewards
164
- this.#lockedRewards -= rewardsLockedByTx;
165
- // Sync utxo and rewards with the provider
166
- await this.#trySync();
167
- }
168
-
169
- async #trySync() {
170
- try {
171
- await this.sync();
172
- } catch (error) {
173
- this.#logger.debug('InMemoryUtxoRepository.#trySync failed:', error);
174
- this.emit(UtxoRepositoryEvent.OutOfSync, void 0).catch(this.#logger.error);
175
- }
176
- }
177
-
178
- #getOwnTransactionWithdrawalQty(transaction: CSL.Transaction) {
179
- const withdrawals = transaction.body().withdrawals();
180
- if (!withdrawals) return 0n;
181
- const ownStakeCredential = this.#csl.StakeCredential.from_keyhash(this.#keyManager.stakeKey.hash());
182
- const withdrawalKeys = withdrawals.keys();
183
- let withdrawalTotal = 0n;
184
- for (let withdrawalKeyIdx = 0; withdrawalKeyIdx < withdrawalKeys.len(); withdrawalKeyIdx++) {
185
- const rewardAddress = withdrawalKeys.get(withdrawalKeyIdx);
186
- if (cslUtil.bytewiseEquals(rewardAddress.payment_cred(), ownStakeCredential)) {
187
- withdrawalTotal += BigInt(withdrawals.get(rewardAddress)!.to_str());
188
- }
189
- }
190
- return withdrawalTotal;
191
- }
192
- }
@@ -1,67 +0,0 @@
1
- import * as bip39 from 'isomorphic-bip39';
2
- import { Cardano, CardanoSerializationLib, CSL } from '@cardano-sdk/core';
3
- import { Buffer } from 'buffer';
4
- import * as errors from './errors';
5
- import { KeyManager } from './types';
6
- import { harden, joinMnemonicWords } from './util';
7
-
8
- export const createInMemoryKeyManager = ({
9
- csl,
10
- password,
11
- accountIndex,
12
- mnemonicWords,
13
- networkId
14
- }: {
15
- csl: CardanoSerializationLib;
16
- password: string;
17
- accountIndex?: number;
18
- mnemonicWords: string[];
19
- networkId: Cardano.NetworkId;
20
- }): KeyManager => {
21
- if (!accountIndex) {
22
- accountIndex = 0;
23
- }
24
-
25
- const mnemonic = joinMnemonicWords(mnemonicWords);
26
- const validMnemonic = bip39.validateMnemonic(mnemonic);
27
- if (!validMnemonic) throw new errors.InvalidMnemonic();
28
-
29
- const entropy = bip39.mnemonicToEntropy(mnemonic);
30
- const accountPrivateKey = csl.Bip32PrivateKey.from_bip39_entropy(Buffer.from(entropy, 'hex'), Buffer.from(password))
31
- .derive(harden(1852))
32
- .derive(harden(1815))
33
- .derive(harden(accountIndex));
34
-
35
- const privateParentKey = accountPrivateKey.derive(0).derive(0);
36
- const publicParentKey = privateParentKey.to_public();
37
- const publicKey = accountPrivateKey.to_public();
38
- const stakeKey = publicKey.derive(2).derive(0);
39
-
40
- return {
41
- deriveAddress: (addressIndex, index) => {
42
- const utxoPubKey = publicKey.derive(index).derive(addressIndex);
43
- const baseAddr = csl.BaseAddress.new(
44
- networkId,
45
- csl.StakeCredential.from_keyhash(utxoPubKey.to_raw_key().hash()),
46
- csl.StakeCredential.from_keyhash(stakeKey.to_raw_key().hash())
47
- );
48
-
49
- return baseAddr.to_address().to_bech32();
50
- },
51
- signMessage: async (_addressType, _signingIndex, message) => ({
52
- publicKey: publicParentKey.toString(),
53
- signature: `Signature for ${message} is not implemented yet`
54
- }),
55
- signTransaction: async (txHash: CSL.TransactionHash) => {
56
- const witnessSet = csl.TransactionWitnessSet.new();
57
- const vkeyWitnesses = csl.Vkeywitnesses.new();
58
- const vkeyWitness = csl.make_vkey_witness(txHash, privateParentKey.to_raw_key());
59
- vkeyWitnesses.add(vkeyWitness);
60
- witnessSet.set_vkeys(vkeyWitnesses);
61
- return witnessSet;
62
- },
63
- stakeKey: stakeKey.to_raw_key(),
64
- publicKey: publicKey.to_raw_key(),
65
- publicParentKey: publicParentKey.to_raw_key()
66
- };
67
- };
@@ -1,9 +0,0 @@
1
- import { CustomError } from 'ts-custom-error';
2
-
3
- export class InvalidMnemonic extends CustomError {
4
- constructor() {
5
- super();
6
- this.message = 'Invalid Mnemonic';
7
- this.name = 'InvalidMnemonic';
8
- }
9
- }
@@ -1,15 +0,0 @@
1
- import { CSL } from '@cardano-sdk/core';
2
- import { Address } from '..';
3
-
4
- export interface KeyManager {
5
- deriveAddress: (addressIndex: number, index: 0 | 1) => string;
6
- signMessage: (
7
- addressType: Address.AddressType,
8
- signingIndex: number,
9
- message: string
10
- ) => Promise<{ publicKey: string; signature: string }>;
11
- publicKey: CSL.PublicKey;
12
- publicParentKey: CSL.PublicKey;
13
- signTransaction: (txHash: CSL.TransactionHash) => Promise<CSL.TransactionWitnessSet>;
14
- stakeKey: CSL.PublicKey;
15
- }
@@ -1,14 +0,0 @@
1
- import * as bip39 from 'isomorphic-bip39';
2
-
3
- /**
4
- * A wrapper around the bip39 package function, with default strength applied to produce 24 words
5
- */
6
- export const generateMnemonicWords = (strength = 256) => bip39.generateMnemonic(strength).split(' ');
7
- export const joinMnemonicWords = (mnenomic: string[]) => mnenomic.join(' ');
8
-
9
- /**
10
- * A wrapper around the bip39 package function
11
- */
12
- export const validateMnemonic = bip39.validateMnemonic;
13
-
14
- export const harden = (num: number): number => 0x80_00_00_00 + num;
@@ -1,120 +0,0 @@
1
- import Schema from '@cardano-ogmios/schema';
2
- import { CardanoProvider, Ogmios, Transaction, CardanoSerializationLib, CSL, ProviderError } from '@cardano-sdk/core';
3
- import { UtxoRepository } from './types';
4
- import { dummyLogger, Logger } from 'ts-log';
5
- import { defaultSelectionConstraints } from '@cardano-sdk/cip2';
6
- import { computeImplicitCoin, createTransactionInternals, InitializeTxProps, TxInternals } from './Transaction';
7
- import {
8
- BalanceTracker,
9
- InMemoryTransactionTracker,
10
- KeyManagement,
11
- TransactionError,
12
- TransactionFailure,
13
- TransactionTracker
14
- } from '.';
15
-
16
- export interface SubmitTxResult {
17
- /**
18
- * Resolves when transaction is submitted.
19
- * Rejects with {TransactionError}.
20
- */
21
- submitted: Promise<void>;
22
- /**
23
- * Resolves when transaction is submitted and confirmed.
24
- * Rejects with {TransactionError}.
25
- */
26
- confirmed: Promise<void>;
27
- }
28
- export interface SingleAddressWallet {
29
- address: Schema.Address;
30
- balance: BalanceTracker;
31
- initializeTx: (props: InitializeTxProps) => Promise<TxInternals>;
32
- name: string;
33
- signTx: (body: CSL.TransactionBody, hash: CSL.TransactionHash) => Promise<CSL.Transaction>;
34
- submitTx: (tx: CSL.Transaction) => SubmitTxResult;
35
- }
36
-
37
- export interface SingleAddressWalletDependencies {
38
- csl: CardanoSerializationLib;
39
- keyManager: KeyManagement.KeyManager;
40
- logger?: Logger;
41
- provider: CardanoProvider;
42
- utxoRepository: UtxoRepository;
43
- txTracker?: TransactionTracker;
44
- balanceTracker?: BalanceTracker;
45
- }
46
-
47
- export interface SingleAddressWalletProps {
48
- name: string;
49
- }
50
-
51
- const ensureValidityInterval = (
52
- currentSlot: number,
53
- validityInterval?: Transaction.ValidityInterval
54
- ): Transaction.ValidityInterval =>
55
- // Todo: Based this on slot duration, to equal 2hrs
56
- ({ invalidHereafter: currentSlot + 3600, ...validityInterval });
57
-
58
- export const createSingleAddressWallet = async (
59
- { name }: SingleAddressWalletProps,
60
- {
61
- csl,
62
- provider,
63
- keyManager,
64
- utxoRepository,
65
- txTracker = new InMemoryTransactionTracker({ csl, provider }),
66
- balanceTracker = new BalanceTracker(utxoRepository),
67
- logger = dummyLogger
68
- }: SingleAddressWalletDependencies
69
- ): Promise<SingleAddressWallet> => {
70
- const address = keyManager.deriveAddress(0, 0);
71
- const protocolParameters = await provider.currentWalletProtocolParameters();
72
- const signTx = async (body: CSL.TransactionBody, hash: CSL.TransactionHash) => {
73
- const witnessSet = await keyManager.signTransaction(hash);
74
- return csl.Transaction.new(body, witnessSet);
75
- };
76
- return {
77
- address,
78
- balance: balanceTracker,
79
- initializeTx: async (props) => {
80
- const tip = await provider.ledgerTip();
81
- const validityInterval = ensureValidityInterval(tip.slot, props.options?.validityInterval);
82
- const txOutputs = new Set([...props.outputs].map((output) => Ogmios.ogmiosToCsl(csl).txOut(output)));
83
- const constraints = defaultSelectionConstraints({
84
- csl,
85
- protocolParameters,
86
- buildTx: async (inputSelection) => {
87
- logger.debug('Building TX for selection constraints', inputSelection);
88
- const { body, hash } = await createTransactionInternals(csl, {
89
- changeAddress: address,
90
- inputSelection,
91
- validityInterval
92
- });
93
- return signTx(body, hash);
94
- }
95
- });
96
- const implicitCoin = computeImplicitCoin(protocolParameters, props);
97
- const inputSelectionResult = await utxoRepository.selectInputs(txOutputs, constraints, implicitCoin);
98
- return createTransactionInternals(csl, {
99
- changeAddress: address,
100
- inputSelection: inputSelectionResult.selection,
101
- validityInterval
102
- });
103
- },
104
- name,
105
- signTx,
106
- submitTx: (tx) => {
107
- const submitted = provider.submitTx(tx).catch((error) => {
108
- if (error instanceof ProviderError) {
109
- throw new TransactionError(TransactionFailure.FailedToSubmit, error, error.detail);
110
- }
111
- throw new TransactionError(TransactionFailure.FailedToSubmit, error);
112
- });
113
- const confirmed = txTracker.track(tx, submitted);
114
- return {
115
- submitted,
116
- confirmed
117
- };
118
- }
119
- };
120
- };
@@ -1,154 +0,0 @@
1
- import { ByName } from '@cardano-ogmios/schema';
2
- import { CardanoSerializationLib, CSL, NotImplementedError, Ogmios } from '@cardano-sdk/core';
3
- import { KeyManager } from '../KeyManagement';
4
-
5
- export type Ed25519KeyHashBech32 = string;
6
- export type VrfKeyHashBech32 = string;
7
- export type AddressBech32 = string;
8
- export type PoolMetadataHashBech32 = string;
9
-
10
- interface Ratio {
11
- numerator: number;
12
- denominator: number;
13
- }
14
-
15
- interface MultiHostNameRelay {
16
- relayType: 'multihost-name';
17
- dnsName: string;
18
- }
19
-
20
- type SingleHostAddrRelay = {
21
- relayType: 'singlehost-addr';
22
- ipv4?: string;
23
- ipv6?: string;
24
- port?: number;
25
- };
26
-
27
- type SingleHostNameRelay = {
28
- relayType: 'singlehost-name';
29
- } & ByName;
30
-
31
- type Relay = MultiHostNameRelay | SingleHostAddrRelay | SingleHostNameRelay;
32
-
33
- interface PoolMetadata {
34
- hash: PoolMetadataHashBech32;
35
- url: string;
36
- }
37
-
38
- interface PoolParameters {
39
- poolKeyHash: Ed25519KeyHashBech32;
40
- vrfKeyHash: VrfKeyHashBech32;
41
- pledge: Ogmios.Lovelace;
42
- cost: Ogmios.Lovelace;
43
- margin: Ratio;
44
- rewardAddress: AddressBech32;
45
- owners: Ed25519KeyHashBech32[];
46
- relays: Relay[];
47
- poolMetadata?: PoolMetadata;
48
- }
49
-
50
- export class CertificateFactory {
51
- readonly #stakeCredential: CSL.StakeCredential;
52
- readonly #csl: CardanoSerializationLib;
53
-
54
- constructor(csl: CardanoSerializationLib, keyManager: KeyManager) {
55
- this.#csl = csl;
56
- this.#stakeCredential = csl.StakeCredential.from_keyhash(keyManager.stakeKey.hash());
57
- }
58
-
59
- stakeKeyRegistration() {
60
- return this.#csl.Certificate.new_stake_registration(this.#csl.StakeRegistration.new(this.#stakeCredential));
61
- }
62
-
63
- stakeKeyDeregistration() {
64
- return this.#csl.Certificate.new_stake_deregistration(this.#csl.StakeDeregistration.new(this.#stakeCredential));
65
- }
66
-
67
- poolRegistration({
68
- poolKeyHash,
69
- vrfKeyHash,
70
- pledge,
71
- cost,
72
- margin,
73
- rewardAddress,
74
- owners,
75
- relays,
76
- poolMetadata
77
- }: PoolParameters) {
78
- const cslOwners = this.#csl.Ed25519KeyHashes.new();
79
- for (const owner of owners) {
80
- cslOwners.add(this.#csl.Ed25519KeyHash.from_bech32(owner));
81
- }
82
- const cslRelays = this.#createCslRelays(relays);
83
- const poolParams = this.#csl.PoolParams.new(
84
- this.#csl.Ed25519KeyHash.from_bech32(poolKeyHash),
85
- this.#csl.VRFKeyHash.from_bech32(vrfKeyHash),
86
- this.#csl.BigNum.from_str(pledge.toString()),
87
- this.#csl.BigNum.from_str(cost.toString()),
88
- this.#csl.UnitInterval.new(
89
- this.#csl.BigNum.from_str(margin.numerator.toString()),
90
- this.#csl.BigNum.from_str(margin.denominator.toString())
91
- ),
92
- this.#csl.RewardAddress.from_address(this.#csl.Address.from_bech32(rewardAddress))!,
93
- cslOwners,
94
- cslRelays,
95
- poolMetadata
96
- ? this.#csl.PoolMetadata.new(
97
- this.#csl.URL.new(poolMetadata.url),
98
- this.#csl.PoolMetadataHash.from_bech32(poolMetadata.hash)
99
- )
100
- : undefined
101
- );
102
- return this.#csl.Certificate.new_pool_registration(this.#csl.PoolRegistration.new(poolParams));
103
- }
104
-
105
- poolRetirement(poolKeyHash: Ed25519KeyHashBech32, epoch: number) {
106
- return this.#csl.Certificate.new_pool_retirement(
107
- this.#csl.PoolRetirement.new(this.#csl.Ed25519KeyHash.from_bech32(poolKeyHash), epoch)
108
- );
109
- }
110
-
111
- stakeDelegation(delegatee: Ed25519KeyHashBech32) {
112
- return this.#csl.Certificate.new_stake_delegation(
113
- this.#csl.StakeDelegation.new(this.#stakeCredential, this.#csl.Ed25519KeyHash.from_bech32(delegatee))
114
- );
115
- }
116
-
117
- #createCslRelays(relays: Relay[]) {
118
- const cslRelays = this.#csl.Relays.new();
119
- for (const relay of relays) {
120
- switch (relay.relayType) {
121
- case 'singlehost-addr':
122
- if (relay.ipv6) {
123
- throw new NotImplementedError('Parse IPv6 to byte array');
124
- }
125
- cslRelays.add(
126
- this.#csl.Relay.new_single_host_addr(
127
- this.#csl.SingleHostAddr.new(
128
- relay.port,
129
- relay.ipv4
130
- ? this.#csl.Ipv4.new(new Uint8Array(relay.ipv4.split('.').map((segment) => Number.parseInt(segment))))
131
- : undefined
132
- )
133
- )
134
- );
135
- break;
136
- case 'singlehost-name':
137
- cslRelays.add(
138
- this.#csl.Relay.new_single_host_name(
139
- this.#csl.SingleHostName.new(relay.port || undefined, this.#csl.DNSRecordAorAAAA.new(relay.hostname))
140
- )
141
- );
142
- break;
143
- case 'multihost-name':
144
- cslRelays.add(
145
- this.#csl.Relay.new_multi_host_name(this.#csl.MultiHostName.new(this.#csl.DNSRecordSRV.new(relay.dnsName)))
146
- );
147
- break;
148
- default:
149
- throw new NotImplementedError('Relay type');
150
- }
151
- }
152
- return cslRelays;
153
- }
154
- }
@@ -1,36 +0,0 @@
1
- import { ImplicitCoin } from '@cardano-sdk/cip2';
2
- import { BigIntMath, ProtocolParametersRequiredByWallet } from '@cardano-sdk/core';
3
- import { InitializeTxProps } from './types';
4
-
5
- /**
6
- * Implementation is the same as in csl.get_implicit_input() and csl.get_deposit().
7
- */
8
- export const computeImplicitCoin = (
9
- { stakeKeyDeposit, poolDeposit }: ProtocolParametersRequiredByWallet,
10
- { certificates, withdrawals }: InitializeTxProps
11
- ): ImplicitCoin => {
12
- const stakeKeyDepositBigint = stakeKeyDeposit && BigInt(stakeKeyDeposit);
13
- const poolDepositBigint = poolDeposit && BigInt(poolDeposit);
14
- const deposit = BigIntMath.sum(
15
- certificates?.map(
16
- (cert) =>
17
- (cert.as_stake_registration() && stakeKeyDepositBigint) ||
18
- (cert.as_pool_registration() && poolDepositBigint) ||
19
- 0n
20
- ) || []
21
- );
22
- const withdrawalsTotal =
23
- (withdrawals && BigIntMath.sum(withdrawals.map(({ quantity }) => BigInt(quantity.to_str())))) || 0n;
24
- const reclaimTotal = BigIntMath.sum(
25
- certificates?.map(
26
- (cert) =>
27
- (cert.as_stake_deregistration() && stakeKeyDepositBigint) ||
28
- (cert.as_pool_retirement() && poolDepositBigint) ||
29
- 0n
30
- ) || []
31
- );
32
- return {
33
- deposit,
34
- input: withdrawalsTotal + reclaimTotal
35
- };
36
- };
@@ -1,60 +0,0 @@
1
- import { SelectionResult } from '@cardano-sdk/cip2';
2
- import { Transaction, CardanoSerializationLib, CSL } from '@cardano-sdk/core';
3
- import { Withdrawal } from './withdrawal';
4
-
5
- export type TxInternals = {
6
- hash: CSL.TransactionHash;
7
- body: CSL.TransactionBody;
8
- };
9
-
10
- export type CreateTxInternalsProps = {
11
- changeAddress: string;
12
- inputSelection: SelectionResult['selection'];
13
- validityInterval: Transaction.ValidityInterval;
14
- certificates?: CSL.Certificate[];
15
- withdrawals?: Withdrawal[];
16
- };
17
-
18
- export const createTransactionInternals = async (
19
- csl: CardanoSerializationLib,
20
- props: CreateTxInternalsProps
21
- ): Promise<TxInternals> => {
22
- const inputs = csl.TransactionInputs.new();
23
- for (const utxo of props.inputSelection.inputs) {
24
- inputs.add(utxo.input());
25
- }
26
- const outputs = csl.TransactionOutputs.new();
27
- for (const output of props.inputSelection.outputs) {
28
- outputs.add(output);
29
- }
30
- for (const value of props.inputSelection.change) {
31
- outputs.add(csl.TransactionOutput.new(csl.Address.from_bech32(props.changeAddress), value));
32
- }
33
- const body = csl.TransactionBody.new(
34
- inputs,
35
- outputs,
36
- props.inputSelection.fee,
37
- props.validityInterval.invalidHereafter
38
- );
39
- if (props.validityInterval.invalidBefore !== undefined) {
40
- body.set_validity_start_interval(props.validityInterval.invalidBefore);
41
- }
42
- if (props.certificates?.length) {
43
- const certs = csl.Certificates.new();
44
- for (const cert of props.certificates) {
45
- certs.add(cert);
46
- }
47
- body.set_certs(certs);
48
- }
49
- if (props.withdrawals?.length) {
50
- const withdrawals = csl.Withdrawals.new();
51
- for (const { address, quantity } of props.withdrawals) {
52
- withdrawals.insert(address, quantity);
53
- }
54
- body.set_withdrawals(withdrawals);
55
- }
56
- return {
57
- body,
58
- hash: csl.hash_transaction(body)
59
- };
60
- };
@@ -1,5 +0,0 @@
1
- export * from './CertificateFactory';
2
- export * from './withdrawal';
3
- export * from './computeImplicitCoin';
4
- export * from './createTransactionInternals';
5
- export * from './types';
@@ -1,12 +0,0 @@
1
- import * as Schema from '@cardano-ogmios/schema';
2
- import { CSL, Transaction } from '@cardano-sdk/core';
3
- import { Withdrawal } from './withdrawal';
4
-
5
- export type InitializeTxProps = {
6
- outputs: Set<Schema.TxOut>;
7
- certificates?: CSL.Certificate[];
8
- withdrawals?: Withdrawal[];
9
- options?: {
10
- validityInterval?: Transaction.ValidityInterval;
11
- };
12
- };