@fedimint/core 0.1.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.
Files changed (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +18 -0
  3. package/dist/dts/FedimintWallet.d.ts +51 -0
  4. package/dist/dts/FedimintWallet.d.ts.map +1 -0
  5. package/dist/dts/WalletDirector.d.ts +79 -0
  6. package/dist/dts/WalletDirector.d.ts.map +1 -0
  7. package/dist/dts/index.d.ts +5 -0
  8. package/dist/dts/index.d.ts.map +1 -0
  9. package/dist/dts/services/BalanceService.d.ts +15 -0
  10. package/dist/dts/services/BalanceService.d.ts.map +1 -0
  11. package/dist/dts/services/FederationService.d.ts +13 -0
  12. package/dist/dts/services/FederationService.d.ts.map +1 -0
  13. package/dist/dts/services/LightningService.d.ts +48 -0
  14. package/dist/dts/services/LightningService.d.ts.map +1 -0
  15. package/dist/dts/services/MintService.d.ts +23 -0
  16. package/dist/dts/services/MintService.d.ts.map +1 -0
  17. package/dist/dts/services/RecoveryService.d.ts +13 -0
  18. package/dist/dts/services/RecoveryService.d.ts.map +1 -0
  19. package/dist/dts/services/WalletService.d.ts +13 -0
  20. package/dist/dts/services/WalletService.d.ts.map +1 -0
  21. package/dist/dts/services/index.d.ts +7 -0
  22. package/dist/dts/services/index.d.ts.map +1 -0
  23. package/dist/dts/transport/TransportClient.d.ts +55 -0
  24. package/dist/dts/transport/TransportClient.d.ts.map +1 -0
  25. package/dist/dts/transport/index.d.ts +2 -0
  26. package/dist/dts/transport/index.d.ts.map +1 -0
  27. package/dist/dts/types/index.d.ts +4 -0
  28. package/dist/dts/types/index.d.ts.map +1 -0
  29. package/dist/dts/types/transport.d.ts +2 -0
  30. package/dist/dts/types/transport.d.ts.map +1 -0
  31. package/dist/dts/types/utils.d.ts +21 -0
  32. package/dist/dts/types/utils.d.ts.map +1 -0
  33. package/dist/dts/types/wallet.d.ts +241 -0
  34. package/dist/dts/types/wallet.d.ts.map +1 -0
  35. package/dist/dts/utils/logger.d.ts +24 -0
  36. package/dist/dts/utils/logger.d.ts.map +1 -0
  37. package/dist/index.d.ts +578 -0
  38. package/dist/index.js +2 -0
  39. package/dist/index.js.map +1 -0
  40. package/package.json +40 -0
  41. package/src/FedimintWallet.ts +119 -0
  42. package/src/WalletDirector.ts +119 -0
  43. package/src/index.ts +4 -0
  44. package/src/services/BalanceService.test.ts +26 -0
  45. package/src/services/BalanceService.ts +29 -0
  46. package/src/services/FederationService.test.ts +58 -0
  47. package/src/services/FederationService.ts +216 -0
  48. package/src/services/LightningService.test.ts +265 -0
  49. package/src/services/LightningService.ts +289 -0
  50. package/src/services/MintService.test.ts +74 -0
  51. package/src/services/MintService.ts +129 -0
  52. package/src/services/RecoveryService.ts +28 -0
  53. package/src/services/WalletService.test.ts +59 -0
  54. package/src/services/WalletService.ts +50 -0
  55. package/src/services/index.ts +6 -0
  56. package/src/transport/TransportClient.ts +254 -0
  57. package/src/transport/index.ts +1 -0
  58. package/src/types/index.ts +3 -0
  59. package/src/types/transport.ts +1 -0
  60. package/src/types/utils.ts +23 -0
  61. package/src/types/wallet.ts +298 -0
  62. package/src/utils/logger.ts +69 -0
@@ -0,0 +1,298 @@
1
+ import { MSats, Duration, JSONValue, JSONObject } from './utils'
2
+
3
+ const MODULE_KINDS = ['', 'ln', 'mint', 'wallet'] as const
4
+ type ModuleKind = (typeof MODULE_KINDS)[number]
5
+
6
+ // TODO: Define the structure of FederationConfig
7
+ type FederationConfig = JSONObject
8
+
9
+ type GatewayInfo = {
10
+ gateway_id: string
11
+ api: string
12
+ node_pub_key: string
13
+ federation_index: number
14
+ route_hints: RouteHint[]
15
+ fees: FeeToAmount
16
+ }
17
+ type LightningGateway = {
18
+ info: GatewayInfo
19
+ vetted: boolean
20
+ ttl: Duration
21
+ }
22
+
23
+ type RouteHint = {
24
+ // TODO: Define the structure of RouteHint
25
+ }
26
+
27
+ type FeeToAmount = {
28
+ // TODO: Define the structure of FeeToAmount
29
+ }
30
+
31
+ type OutgoingLightningPayment = {
32
+ payment_type: PayType
33
+ contract_id: string
34
+ fee: MSats
35
+ }
36
+
37
+ type PayType = { lightning: string } | { internal: string }
38
+
39
+ type LnPayState =
40
+ | 'created'
41
+ | 'canceled'
42
+ | { funded: { block_height: number } }
43
+ | { waiting_for_refund: { error_reason: string } }
44
+ | 'awaiting_change'
45
+ | { success: { preimage: string } }
46
+ | { refunded: { gateway_error: string } }
47
+ | { unexpected_error: { error_message: string } }
48
+
49
+ type LnReceiveState =
50
+ | 'created'
51
+ | { waiting_for_payment: { invoice: string; timeout: number } }
52
+ | { canceled: { reason: string } }
53
+ | 'funded'
54
+ | 'awaiting_funds'
55
+ | 'claimed'
56
+
57
+ type LnInternalPayState =
58
+ | 'funding'
59
+ | { preimage: string }
60
+ | { refund_success: { out_points: BtcOutPoint[]; error: string } }
61
+ | { refund_error: { error_message: string; error: string } }
62
+ | { funding_failed: { error: string } }
63
+ | { unexpected_error: string }
64
+
65
+ type CreateBolt11Response = {
66
+ operation_id: string
67
+ invoice: string
68
+ }
69
+
70
+ type StreamError = {
71
+ error: string
72
+ data: never
73
+ end: never
74
+ }
75
+
76
+ type StreamSuccess<T extends JSONValue> = {
77
+ data: T
78
+ error: never
79
+ end: never
80
+ }
81
+
82
+ type StreamEnd = {
83
+ end: string
84
+ data: never
85
+ error: never
86
+ }
87
+
88
+ type StreamResult<T extends JSONValue> =
89
+ | StreamSuccess<T>
90
+ | StreamError
91
+ | StreamEnd
92
+
93
+ type CancelFunction = () => void
94
+
95
+ type ReissueExternalNotesState = 'Created' | 'Issuing' | 'Done'
96
+ // | { Failed: { error: string } }
97
+
98
+ type MintSpendNotesResponse = Array<string>
99
+
100
+ type SpendNotesState =
101
+ | 'Created'
102
+ | 'UserCanceledProcessing'
103
+ | 'UserCanceledSuccess'
104
+ | 'UserCanceledFailure'
105
+ | 'Success'
106
+ | 'Refunded'
107
+
108
+ type TxOutputSummary = {
109
+ outpoint: {
110
+ txid: string
111
+ vout: number
112
+ }
113
+ amount: number
114
+ }
115
+
116
+ type BtcOutPoint = {
117
+ txid: string
118
+ vout: number
119
+ }
120
+
121
+ type WalletDepositState =
122
+ | 'WaitingForTransaction'
123
+ | {
124
+ WaitingForConfirmation: {
125
+ btc_deposited: number
126
+ btc_out_point: BtcOutPoint
127
+ }
128
+ }
129
+ | { Confirmed: { btc_deposited: number; btc_out_point: BtcOutPoint } }
130
+ | { Claimed: { btc_deposited: number; btc_out_point: BtcOutPoint } }
131
+ | { Failed: string }
132
+
133
+ type WalletSummary = {
134
+ spendable_utxos: TxOutputSummary[]
135
+ unsigned_peg_out_txos: TxOutputSummary[]
136
+ unsigned_change_utxos: TxOutputSummary[]
137
+ // TODO: fix typo in rust
138
+ unconfirmed_peg_out_txos: TxOutputSummary[]
139
+ unconfirmed_change_utxos: TxOutputSummary[]
140
+ }
141
+
142
+ type LnVariant = {
143
+ pay?: {
144
+ gateway_id: string
145
+ invoice: string
146
+ fee: number
147
+ is_internal_payment: boolean
148
+ out_point: {
149
+ out_idx: number
150
+ txid: string
151
+ }
152
+ }
153
+ receive?: {
154
+ gateway_id: string
155
+ invoice: string
156
+ out_point: {
157
+ out_idx: number
158
+ txid: string
159
+ }
160
+ }
161
+ }
162
+
163
+ type MintVariant = {
164
+ spend_o_o_b?: {
165
+ requested_amount: number
166
+ oob_notes: string
167
+ }
168
+ reissuance?: {
169
+ txid: string
170
+ }
171
+ }
172
+
173
+ type WalletVariant = {
174
+ deposit?: {
175
+ address: string
176
+ tweak_idx: number
177
+ }
178
+ withdraw?: {
179
+ address: string
180
+ amountMsats: number
181
+ fee: {
182
+ fee_rate: {
183
+ sats_per_kvb: number
184
+ }
185
+ total_weight: number
186
+ }
187
+ }
188
+ }
189
+
190
+ type OperationKey = {
191
+ creation_time: { nanos_since_epoch: number; secs_since_epoch: number }
192
+ operation_id: string
193
+ }
194
+ type OperationMeta = {
195
+ amount: number
196
+ extra_meta: JSONObject
197
+ variant: LnVariant | MintVariant | WalletVariant
198
+ }
199
+
200
+ type OperationLog = {
201
+ meta: OperationMeta
202
+ operation_module_kind: string
203
+ outcome: {
204
+ outcome: LnPayState | LnReceiveState | SpendNotesState | WalletDepositState
205
+ }
206
+ }
207
+
208
+ type BaseTransactions = {
209
+ timestamp: number
210
+ operationId: string
211
+ kind: 'ln' | 'mint' | 'wallet'
212
+ }
213
+
214
+ type LightningTransaction = BaseTransactions & {
215
+ type: 'send' | 'receive'
216
+ invoice: string
217
+ outcome:
218
+ | 'created'
219
+ | 'canceled'
220
+ | 'claimed'
221
+ | 'pending'
222
+ | 'success'
223
+ | 'funded'
224
+ | 'awaiting_funds'
225
+ | 'unexpected_error'
226
+ gateway: string
227
+ fee?: number
228
+ internalPay?: boolean
229
+ preimage?: string
230
+ txId: string
231
+ }
232
+
233
+ type EcashTransaction = BaseTransactions & {
234
+ type: 'spend_oob' | 'reissue'
235
+ amountMsats: number
236
+ outcome?: SpendNotesState | ReissueExternalNotesState
237
+ notes?: string
238
+ txId?: string
239
+ }
240
+
241
+ type WalletTransaction = BaseTransactions & {
242
+ type: 'withdraw' | 'deposit'
243
+ onchainAddress: string
244
+ amountMsats: number
245
+ fee: number
246
+ outcome?:
247
+ | 'WaitingForTransaction'
248
+ | 'WaitingForConfirmation'
249
+ | 'Confirmed'
250
+ | 'Claimed'
251
+ | 'Failed'
252
+ }
253
+
254
+ type Transactions = LightningTransaction | EcashTransaction | WalletTransaction
255
+
256
+ /** Keys are powers of 2 */
257
+ type NoteCountByDenomination = Record<number, number>
258
+
259
+ type GenerateAddressResponse = {
260
+ deposit_address: string
261
+ operation_id: string
262
+ }
263
+
264
+ export {
265
+ LightningGateway,
266
+ FederationConfig,
267
+ RouteHint,
268
+ FeeToAmount,
269
+ OutgoingLightningPayment,
270
+ PayType,
271
+ LnPayState,
272
+ LnReceiveState,
273
+ CreateBolt11Response,
274
+ GatewayInfo,
275
+ StreamError,
276
+ StreamSuccess,
277
+ StreamResult,
278
+ ModuleKind,
279
+ CancelFunction,
280
+ LnInternalPayState,
281
+ ReissueExternalNotesState,
282
+ MintSpendNotesResponse,
283
+ SpendNotesState,
284
+ WalletSummary,
285
+ TxOutputSummary,
286
+ NoteCountByDenomination,
287
+ GenerateAddressResponse,
288
+ OperationKey,
289
+ OperationLog,
290
+ LnVariant,
291
+ MintVariant,
292
+ WalletVariant,
293
+ LightningTransaction,
294
+ EcashTransaction,
295
+ WalletTransaction,
296
+ Transactions,
297
+ WalletDepositState,
298
+ }
@@ -0,0 +1,69 @@
1
+ import type { TransportLogger } from '@fedimint/types'
2
+
3
+ const logLevels = ['debug', 'info', 'warn', 'error', 'none'] as const
4
+ export type LogLevel = (typeof logLevels)[number]
5
+
6
+ export class Logger {
7
+ private level: LogLevel
8
+ private logger: TransportLogger
9
+
10
+ /**
11
+ * Generic Logger for a given environment.
12
+ *
13
+ * @param _logger - The transport's logger to use. (console for web, react native, etc.)
14
+ * @param level - The log level to use. (debug, info, warn, error, none)
15
+ */
16
+ constructor(_logger: TransportLogger = console, level: LogLevel = 'none') {
17
+ this.logger = _logger
18
+ this.level = level
19
+ }
20
+
21
+ setLevel(level: LogLevel) {
22
+ this.level = level
23
+ }
24
+
25
+ private coerceLevel(level: string): LogLevel {
26
+ if (logLevels.includes(level.toLocaleUpperCase() as LogLevel)) {
27
+ return level.toLocaleUpperCase() as LogLevel
28
+ }
29
+ return 'info'
30
+ }
31
+
32
+ log(level: string, message: string, ...args: any[]) {
33
+ const logLevel = this.coerceLevel(level)
34
+ if (!this.shouldLog(logLevel)) {
35
+ return
36
+ }
37
+ const consoleFn = this.logger[logLevel]
38
+ consoleFn(`[${logLevel.toUpperCase()}] ${message}`, ...args)
39
+ }
40
+
41
+ debug(message: string, ...args: any[]) {
42
+ this.log('debug', message, ...args)
43
+ }
44
+
45
+ info(message: string, ...args: any[]) {
46
+ this.log('info', message, ...args)
47
+ }
48
+
49
+ warn(message: string, ...args: any[]) {
50
+ this.log('warn', message, ...args)
51
+ }
52
+
53
+ error(message: string, ...args: any[]) {
54
+ this.log('error', message, ...args)
55
+ }
56
+
57
+ private shouldLog(
58
+ messageLevel: LogLevel,
59
+ ): messageLevel is Exclude<LogLevel, 'none'> {
60
+ const levels: LogLevel[] = ['debug', 'info', 'warn', 'error', 'none']
61
+ const messageLevelIndex = levels.indexOf(messageLevel)
62
+ const currentLevelIndex = levels.indexOf(this.level)
63
+ return (
64
+ currentLevelIndex <= messageLevelIndex &&
65
+ this.level !== 'none' &&
66
+ messageLevel !== 'none'
67
+ )
68
+ }
69
+ }