@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.
- package/LICENSE +21 -0
- package/README.md +18 -0
- package/dist/dts/FedimintWallet.d.ts +51 -0
- package/dist/dts/FedimintWallet.d.ts.map +1 -0
- package/dist/dts/WalletDirector.d.ts +79 -0
- package/dist/dts/WalletDirector.d.ts.map +1 -0
- package/dist/dts/index.d.ts +5 -0
- package/dist/dts/index.d.ts.map +1 -0
- package/dist/dts/services/BalanceService.d.ts +15 -0
- package/dist/dts/services/BalanceService.d.ts.map +1 -0
- package/dist/dts/services/FederationService.d.ts +13 -0
- package/dist/dts/services/FederationService.d.ts.map +1 -0
- package/dist/dts/services/LightningService.d.ts +48 -0
- package/dist/dts/services/LightningService.d.ts.map +1 -0
- package/dist/dts/services/MintService.d.ts +23 -0
- package/dist/dts/services/MintService.d.ts.map +1 -0
- package/dist/dts/services/RecoveryService.d.ts +13 -0
- package/dist/dts/services/RecoveryService.d.ts.map +1 -0
- package/dist/dts/services/WalletService.d.ts +13 -0
- package/dist/dts/services/WalletService.d.ts.map +1 -0
- package/dist/dts/services/index.d.ts +7 -0
- package/dist/dts/services/index.d.ts.map +1 -0
- package/dist/dts/transport/TransportClient.d.ts +55 -0
- package/dist/dts/transport/TransportClient.d.ts.map +1 -0
- package/dist/dts/transport/index.d.ts +2 -0
- package/dist/dts/transport/index.d.ts.map +1 -0
- package/dist/dts/types/index.d.ts +4 -0
- package/dist/dts/types/index.d.ts.map +1 -0
- package/dist/dts/types/transport.d.ts +2 -0
- package/dist/dts/types/transport.d.ts.map +1 -0
- package/dist/dts/types/utils.d.ts +21 -0
- package/dist/dts/types/utils.d.ts.map +1 -0
- package/dist/dts/types/wallet.d.ts +241 -0
- package/dist/dts/types/wallet.d.ts.map +1 -0
- package/dist/dts/utils/logger.d.ts +24 -0
- package/dist/dts/utils/logger.d.ts.map +1 -0
- package/dist/index.d.ts +578 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -0
- package/src/FedimintWallet.ts +119 -0
- package/src/WalletDirector.ts +119 -0
- package/src/index.ts +4 -0
- package/src/services/BalanceService.test.ts +26 -0
- package/src/services/BalanceService.ts +29 -0
- package/src/services/FederationService.test.ts +58 -0
- package/src/services/FederationService.ts +216 -0
- package/src/services/LightningService.test.ts +265 -0
- package/src/services/LightningService.ts +289 -0
- package/src/services/MintService.test.ts +74 -0
- package/src/services/MintService.ts +129 -0
- package/src/services/RecoveryService.ts +28 -0
- package/src/services/WalletService.test.ts +59 -0
- package/src/services/WalletService.ts +50 -0
- package/src/services/index.ts +6 -0
- package/src/transport/TransportClient.ts +254 -0
- package/src/transport/index.ts +1 -0
- package/src/types/index.ts +3 -0
- package/src/types/transport.ts +1 -0
- package/src/types/utils.ts +23 -0
- package/src/types/wallet.ts +298 -0
- 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
|
+
}
|