forked from decred/dcrdex
-
Notifications
You must be signed in to change notification settings - Fork 0
/
registry.ts
622 lines (546 loc) · 11.7 KB
/
registry.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
declare global {
interface Window {
log: (...args: any) => void
enableLogger: (loggerID: string, enable: boolean) => void
recordLogger: (loggerID: string, enable: boolean) => void
dumpLogger: (loggerID: string) => void
localeDiscrepancies: () => void
}
}
export enum ConnectionStatus {
Disconnected = 0,
Connected = 1,
InvalidCert = 2,
}
export interface Exchange {
host: string
acctID: string
markets: Record<string, Market>
assets: Record<number, Asset>
connectionStatus: ConnectionStatus
feeAsset: FeeAsset // DEPRECATED. DCR.
regFees: Record<string, FeeAsset>
pendingFee: PendingFeeState | null
candleDurs: string[]
}
export interface Candle {
startStamp: number
endStamp: number
matchVolume: number
quoteVolume: number
highRate: number
lowRate: number
startRate: number
endRate: number
}
export interface CandlesPayload {
dur: string
ms: number
candles: Candle[]
}
export interface Market {
name: string
baseid: number
basesymbol: string
quoteid: number
quotesymbol: string
lotsize: number
ratestep: number
epochlen: number
startepoch: number
buybuffer: number
orders: Order[]
spot: Spot | undefined
atomToConv: number
inflight: InFlightOrder[]
}
export interface InFlightOrder extends Order {
tempID: number
}
export interface Order {
host: string
baseID: number
baseSymbol: string
quoteID: number
quoteSymbol: string
market: string
type: number
id: string
stamp: number
submitTime: number
sig: string
status: number
epoch: number
qty: number
sell: boolean
filled: number
matches: Match[]
cancelling: boolean
canceled: boolean
feesPaid: FeeBreakdown
fundingCoins: Coin[]
accelerationCoins: Coin[]
lockedamt: number
rate: number // limit only
tif: number // limit only
targetOrderID: string // cancel only
readyToTick: boolean
}
export interface Match {
matchID: string
status: number
active: boolean
revoked: boolean
rate: number
qty: number
side: number
feeRate: number
swap: Coin
counterSwap: Coin
redeem: Coin
counterRedeem: Coin
refund: Coin
stamp: number
isCancel: boolean
}
export interface Spot {
stamp: number
baseID: number
quoteID: number
rate: number
bookVolume: number // Unused?
change24: number
vol24: number
}
export interface Asset {
id: number
symbol: string
version: number
maxFeeRate: number
swapSize: number
swapSizeBase: number
redeemSize: number
swapConf: number
unitInfo: UnitInfo
}
export interface FeeAsset {
id: number
confs: number
amount: number
}
export interface PendingFeeState {
symbol: string
assetID: number
confs: number
}
export interface FeeBreakdown {
swap: number
redemption: number
}
export interface SupportedAsset {
id: number
symbol: string
name: string
wallet: WalletState
info?: WalletInfo
token?: Token
unitInfo: UnitInfo
walletCreationPending: boolean
}
export interface Token {
parentID: number
name: string
unitInfo: UnitInfo
definition: WalletDefinition
}
export interface WalletState {
symbol: string
assetID: number
version: number
type: string
traits: number
open: boolean
running: boolean
disabled: boolean
balance: WalletBalance
address: string
units: string
encrypted: boolean
peerCount: number
synced: boolean
syncProgress: number
}
export interface WalletInfo {
name: string
version: number
availablewallets: WalletDefinition[]
versions: number[]
emptyidx: number
unitinfo: UnitInfo
}
export interface WalletBalance {
available: number
immature: number
locked: number
stamp: string // time.Time
orderlocked: number
contractlocked: number
other: Record<string, number>
}
export interface WalletDefinition {
seeded: boolean
type: string
tab: string
description: string
configpath: string
configopts: ConfigOption[]
noauth: boolean
}
export interface ConfigOption {
key: string
displayname: string
description: string
default: any
max: any
min: any
noecho: boolean
isboolean: boolean
isdate: boolean
disablewhenactive: boolean
isBirthdayConfig: boolean
repeatable?: string
noauth: boolean
regAsset?: number
required?: boolean
}
export interface Coin {
id: string
stringID: string
assetID: number
symbol: string
confs: Confirmations
}
export interface Confirmations {
required: number
count: number
}
export interface UnitInfo {
atomicUnit: string
conventional: Denomination
denominations: Denomination[]
}
export interface Denomination {
unit: string
conversionFactor: number
}
export interface User {
exchanges: Record<string, Exchange>
inited: boolean
seedgentime: number
assets: Record<number, SupportedAsset>
fiatRates: Record<number, number>
authed: boolean // added by webserver
ok: boolean // added by webserver
bots: BotReport[]
}
export interface CoreNote {
type: string
topic: string
subject: string
details: string
severity: number
stamp: number
acked: boolean
id: string
}
export interface FeePaymentNote extends CoreNote {
asset: number
confirmations: number
dex: string
}
export interface BalanceNote extends CoreNote {
assetID: number
balance: WalletBalance
}
export interface RateNote extends CoreNote {
fiatRates: Record<number, number>
}
export interface WalletConfigNote extends CoreNote {
wallet: WalletState
}
export type WalletStateNote = WalletConfigNote
export interface WalletCreationNote extends CoreNote {
assetID: number
}
export interface SpotPriceNote extends CoreNote {
host: string
spots: Record<string, Spot>
}
export interface BotNote extends CoreNote {
report: BotReport
}
export interface MatchNote extends CoreNote {
orderID: string
match: Match
host: string
marketID: string
}
export interface ConnEventNote extends CoreNote {
host: string
connectionStatus: ConnectionStatus
}
export interface OrderNote extends CoreNote {
order: Order
tempID: number
}
export interface RecentMatch {
rate: number
qty: number
stamp: number
sell: boolean
}
export interface EpochNote extends CoreNote {
host: string
marketID: string
epoch: number
}
export interface APIResponse {
requestSuccessful: boolean
ok: boolean
msg: string
err?: string
}
export interface LogMessage {
time: string
msg: string
}
export interface NoteElement extends HTMLElement {
note: CoreNote
}
export interface BalanceResponse extends APIResponse {
balance: WalletBalance
}
export interface LayoutMetrics {
bodyTop: number
bodyLeft: number
width: number
height: number
centerX: number
centerY: number
}
export interface PasswordCache {
pw: string
}
export interface PageElement extends HTMLElement {
value?: string
src?: string
files?: FileList
checked?: boolean
href?: string
htmlFor?: string
}
export interface BooleanConfig {
reason: string
}
export interface XYRangePoint {
label: string
x: number
y: number
}
export interface XYRange {
start: XYRangePoint
end: XYRangePoint
xUnit: string
yUnit: string
}
export interface OrderOption extends ConfigOption {
boolean?: BooleanConfig
xyRange?: XYRange
showByDefault?: boolean
}
export interface SwapEstimate {
lots: number
value: number
maxFees: number
realisticWorstCase: number
realisticBestCase: number
}
export interface RedeemEstimate {
realisticBestCase: number
realisticWorstCase: number
}
export interface PreSwap {
estimate: SwapEstimate
options: OrderOption[]
}
export interface PreRedeem {
estimate: RedeemEstimate
options: OrderOption[]
}
export interface OrderEstimate {
swap: PreSwap
redeem: PreRedeem
}
export interface MaxOrderEstimate {
swap: SwapEstimate
redeem: RedeemEstimate
}
export interface MaxSell {
maxSell: MaxOrderEstimate
}
export interface MaxBuy {
maxBuy: MaxOrderEstimate
}
export interface TradeForm {
host: string
isLimit: boolean
sell: boolean
base: number
quote: number
qty: number
rate: number
tifnow: boolean
options: Record<string, any>
}
export interface BookUpdate {
action: string
host: string
marketID: string
matchesSummary: RecentMatch[]
payload: any
}
export interface MiniOrder {
qty: number
qtyAtomic: number
rate: number
msgRate: number
epoch: number
sell: boolean
token: string
}
export interface CoreOrderBook {
sells: MiniOrder[]
buys: MiniOrder[]
epoch: MiniOrder[]
recentMatches: RecentMatch[]
}
export interface MarketOrderBook {
base: number
quote: number
book: CoreOrderBook
}
export interface RemainderUpdate {
token: string
qty: number
qtyAtomic: number
}
export interface OrderFilter {
n?: number
offset?: string
hosts: string[]
assets: number[]
statuses: number[]
}
export interface MakerProgram {
host: string
baseID: number
quoteID: number
lots: number
oracleWeighting: number
oracleBias: number
driftTolerance: number
gapFactor: number
gapStrategy: string
}
export interface BotOrder {
host: string
marketID: string
orderID: string
}
export interface BotReport {
programID: number
program: MakerProgram
running: boolean
orders: BotOrder
}
export interface MarketReport {
basisPrice: number
price: number
oracles: OracleReport[]
breakEvenSpread: number
}
export interface OracleReport {
host: string
usdVol: number
bestBuy: number
bestSell: number
}
// changing the order of the elements in this enum will affect
// the sorting of the peers table in wallets.ts.
export enum PeerSource {
WalletDefault,
UserAdded,
Discovered,
}
export interface WalletPeer {
addr: string
source: PeerSource
connected: boolean
}
export interface Application {
assets: Record<number, SupportedAsset>
seedGenTime: number
user: User
header: HTMLElement
headerSpace: HTMLElement
walletMap: Record<number, WalletState>
exchanges: Record<string, Exchange>
fiatRatesMap: Record<number, number>
showPopups: boolean
commitHash: string
authed(): boolean
start (): Promise<void>
reconnected (): void
fetchUser (): Promise<User | void>
loadPage (page: string, data?: any, skipPush?: boolean): Promise<boolean>
attach (data: any): void
bindTooltips (ancestor: HTMLElement): void
attachHeader (): void
showDropdown (icon: HTMLElement, dialog: HTMLElement): void
ackNotes (): void
setNoteTimes (noteList: HTMLElement): void
bindInternalNavigation (ancestor: HTMLElement): void
storeNotes (): void
updateMenuItemsDisplay (): void
attachCommon (node: HTMLElement): void
updateExchangeRegistration (dexAddr: string, confs: number, assetID: number): void
handleFeePaymentNote (note: FeePaymentNote): void
setNotes (notes: CoreNote[]): void
notify (note: CoreNote): void
log (loggerID: string, ...msg: any): void
prependPokeElement (note: CoreNote): void
prependNoteElement (note: CoreNote, skipSave?: boolean): void
prependListElement (noteList: HTMLElement, note: CoreNote, el: NoteElement): void
loading (el: HTMLElement): () => void
orders (host: string, mktID: string): Order[]
haveAssetOrders (assetID: number): boolean
walletIsActive (assetID: number): boolean
order (oid: string): Order | null
canAccelerateOrder(order: Order): boolean
unitInfo (assetID: number, xc?: Exchange): UnitInfo
conventionalRate (baseID: number, quoteID: number, encRate: number, xc?: Exchange): number
walletDefinition (assetID: number, walletType: string): WalletDefinition
currentWalletDefinition (assetID: number): WalletDefinition
fetchBalance (assetID: number): Promise<WalletBalance>
checkResponse (resp: APIResponse): boolean
signOut (): Promise<void>
registerNoteFeeder (receivers: Record<string, (n: CoreNote) => void>): void
}
// TODO: Define an interface for Application?
let application: Application
export function registerApplication (a: Application) {
application = a
}
export function app (): Application {
return application
}