decred.org/dcrdex@v1.0.5/client/webserver/site/src/js/registry.ts (about)

     1  declare global {
     2    interface Window {
     3      log: (...args: any) => void
     4      enableLogger: (loggerID: string, enable: boolean) => void
     5      recordLogger: (loggerID: string, enable: boolean) => void
     6      dumpLogger: (loggerID: string) => void
     7      mmstatus: () => Promise<MarketMakingStatus>
     8      testFormatFourSigFigs: () => void
     9      testFormatRateFullPrecision: () => void
    10      user: () => User
    11      cexBook: () => Promise<void>
    12      mmStatus: () => MarketMakingStatus
    13      isWebview?: () => boolean
    14      webkit: any | undefined
    15      openUrl: (url: string) => void
    16      open: (url?: string | URL, target?: string, features?: string) => WindowProxy | null
    17      sendOSNotification (title: string, body?: string): void
    18      clearLocale (): void
    19    }
    20  }
    21  
    22  export enum ConnectionStatus {
    23    Disconnected = 0,
    24    Connected = 1,
    25    InvalidCert = 2,
    26  }
    27  
    28  export interface BondOptions {
    29    bondAssetID: number
    30    targetTier: number
    31    maxBondedAmt: number
    32  }
    33  
    34  export interface Reputation {
    35    bondedTier: number
    36    penalties: number
    37    legacyTier: boolean
    38    score: number
    39  }
    40  
    41  export interface ExchangeAuth {
    42    rep: Reputation
    43    bondAssetID: number
    44    pendingStrength: number
    45    weakStrength: number
    46    liveStrength: number
    47    targetTier: number
    48    effectiveTier: number
    49    maxBondedAmt: number
    50    penaltyComps: number
    51    pendingBonds: PendingBondState[]
    52    expiredBonds: any[]
    53    compensation: number
    54  }
    55  
    56  export interface Exchange {
    57    host: string
    58    acctID: string
    59    auth: ExchangeAuth
    60    markets: Record<string, Market>
    61    assets: Record<number, Asset>
    62    connectionStatus: ConnectionStatus
    63    viewOnly: boolean
    64    bondAssets: Record<string, BondAsset>
    65    candleDurs: string[]
    66    maxScore: number
    67    penaltyThreshold: number
    68    disabled: boolean
    69  }
    70  
    71  export interface Candle {
    72    startStamp: number
    73    endStamp: number
    74    matchVolume: number
    75    quoteVolume: number
    76    highRate: number
    77    lowRate: number
    78    startRate: number
    79    endRate: number
    80  }
    81  
    82  export interface CandlesPayload {
    83    dur: string
    84    ms: number
    85    candles: Candle[]
    86  }
    87  
    88  export interface Market {
    89    name: string
    90    baseid: number
    91    basesymbol: string
    92    quoteid: number
    93    quotesymbol: string
    94    lotsize: number
    95    parcelsize: number
    96    ratestep: number
    97    epochlen: number
    98    startepoch: number
    99    buybuffer: number
   100    orders: Order[]
   101    spot: Spot | undefined
   102    atomToConv: number
   103    inflight: InFlightOrder[]
   104    minimumRate: number
   105  }
   106  
   107  export interface InFlightOrder extends Order {
   108    tempID: number
   109  }
   110  
   111  export interface Order {
   112    host: string
   113    baseID: number
   114    baseSymbol: string
   115    quoteID: number
   116    quoteSymbol: string
   117    market: string
   118    type: number
   119    id: string
   120    stamp: number
   121    submitTime: number
   122    sig: string
   123    status: number
   124    epoch: number
   125    qty: number
   126    sell: boolean
   127    filled: number
   128    matches: Match[]
   129    cancelling: boolean
   130    canceled: boolean
   131    feesPaid: FeeBreakdown
   132    fundingCoins: Coin[]
   133    accelerationCoins: Coin[]
   134    lockedamt: number
   135    rate: number // limit only
   136    tif: number // limit only
   137    targetOrderID: string // cancel only
   138    readyToTick: boolean
   139  }
   140  
   141  export interface Match {
   142    matchID: string
   143    status: number
   144    active: boolean
   145    revoked: boolean
   146    rate: number
   147    qty: number
   148    side: number
   149    feeRate: number
   150    swap: Coin
   151    counterSwap: Coin
   152    redeem: Coin
   153    counterRedeem: Coin
   154    refund: Coin
   155    stamp: number
   156    isCancel: boolean
   157  }
   158  
   159  export interface Spot {
   160    stamp: number
   161    baseID: number
   162    quoteID: number
   163    rate: number
   164    bookVolume: number // Unused?
   165    change24: number
   166    vol24: number
   167    low24: number
   168    high24: number
   169  }
   170  
   171  export interface Asset {
   172    id: number
   173    symbol: string
   174    version: number
   175    maxFeeRate: number
   176    swapSize: number
   177    swapSizeBase: number
   178    redeemSize: number
   179    swapConf: number
   180    unitInfo: UnitInfo
   181  }
   182  
   183  export interface BondAsset {
   184    ver: number
   185    id: number
   186    confs: number
   187    amount: number
   188  }
   189  
   190  export interface PendingBondState {
   191    symbol: string
   192    assetID: number
   193    coinID: string
   194    confs: number
   195  }
   196  
   197  export interface FeeBreakdown {
   198    swap: number
   199    redemption: number
   200  }
   201  
   202  export interface SupportedAsset {
   203    id: number
   204    symbol: string
   205    name: string
   206    wallet: WalletState
   207    info?: WalletInfo
   208    token?: Token
   209    unitInfo: UnitInfo
   210    walletCreationPending: boolean
   211  }
   212  
   213  export interface Token {
   214    parentID: number
   215    name: string
   216    unitInfo: UnitInfo
   217    contractAddress: string
   218    definition: WalletDefinition
   219  }
   220  
   221  export enum ApprovalStatus {
   222    Approved = 0,
   223    Pending = 1,
   224    NotApproved = 2
   225  }
   226  
   227  export interface FeeState {
   228    rate: number
   229    send: number
   230    swap: number
   231    redeem: number
   232    refund: number
   233    stampMS: number
   234  }
   235  
   236  export interface SyncStatus {
   237    synced: boolean
   238    targetHeight: number
   239    startingBlocks: number
   240    blocks: number
   241    txs: number | undefined
   242  }
   243  
   244  export interface WalletState {
   245    symbol: string
   246    assetID: number
   247    version: number
   248    type: string
   249    traits: number
   250    open: boolean
   251    running: boolean
   252    disabled: boolean
   253    balance: WalletBalance
   254    address: string
   255    units: string
   256    encrypted: boolean
   257    peerCount: number
   258    synced: boolean
   259    syncProgress: number
   260    syncStatus: SyncStatus
   261    approved: Record<number, ApprovalStatus>
   262    feeState?: FeeState
   263  }
   264  
   265  export interface WalletInfo {
   266    name: string
   267    version: number
   268    availablewallets: WalletDefinition[]
   269    versions: number[]
   270    emptyidx: number
   271    unitinfo: UnitInfo
   272  }
   273  
   274  export interface WalletBalance {
   275    available: number
   276    immature: number
   277    locked: number
   278    stamp: string // time.Time
   279    orderlocked: number
   280    contractlocked: number
   281    bondlocked: number
   282    bondReserves: number
   283    reservesDeficit: number
   284    other: Record<string, CustomBalance>
   285  }
   286  
   287  export interface CustomBalance {
   288    amt: number
   289    locked: boolean
   290  }
   291  
   292  export interface WalletDefinition {
   293    seeded: boolean
   294    type: string
   295    tab: string
   296    description: string
   297    configpath: string
   298    configopts: ConfigOption[]
   299    multifundingopts: OrderOption[]
   300    noauth: boolean
   301    guidelink: string
   302  }
   303  
   304  export interface ConfigOption {
   305    key: string
   306    displayname: string
   307    description: string
   308    default: any
   309    max: any
   310    min: any
   311    noecho: boolean
   312    isboolean: boolean
   313    isdate: boolean
   314    disablewhenactive: boolean
   315    isBirthdayConfig: boolean
   316    repeatable?: string
   317    repeatN?: number
   318    regAsset?: number
   319    required?: boolean
   320    dependsOn?: string
   321  }
   322  
   323  export interface Coin {
   324    id: string
   325    stringID: string
   326    assetID: number
   327    symbol: string
   328    confs: Confirmations
   329  }
   330  
   331  export interface Confirmations {
   332    required: number
   333    count: number
   334  }
   335  
   336  export interface UnitInfo {
   337    atomicUnit: string
   338    conventional: Denomination
   339    denominations: Denomination[]
   340    feeRateDenom: string
   341  }
   342  
   343  export interface Denomination {
   344    unit: string
   345    conversionFactor: number
   346  }
   347  
   348  export interface ExtensionConfiguredWallet {
   349    hiddenFields: string[]
   350    disableWalletType: boolean
   351    disablePassword: boolean
   352    disableStaking: boolean
   353    disablePrivacy: boolean
   354  }
   355  
   356  export interface ExtensionModeConfig {
   357    name: string
   358    restrictedWallets: Record<string, ExtensionConfiguredWallet>
   359  }
   360  
   361  export interface User {
   362    exchanges: Record<string, Exchange>
   363    inited: boolean
   364    seedgentime: number
   365    assets: Record<number, SupportedAsset>
   366    fiatRates: Record<number, number>
   367    bots: BotReport[]
   368    net: number
   369    extensionModeConfig: ExtensionModeConfig
   370    actions: ActionRequiredNote[]
   371  }
   372  
   373  export interface CoreNote {
   374    type: string
   375    topic: string
   376    subject: string
   377    details: string
   378    severity: number
   379    stamp: number
   380    acked: boolean
   381    id: string
   382  }
   383  
   384  export interface BondNote extends CoreNote {
   385    asset: number
   386    confirmations: number
   387    dex: string
   388    coinID: string | null
   389    tier: number | null
   390    auth: ExchangeAuth | null
   391  }
   392  
   393  export interface ReputationNote extends CoreNote {
   394    host: string
   395    rep: Reputation
   396  }
   397  
   398  export interface BalanceNote extends CoreNote {
   399    assetID: number
   400    balance: WalletBalance
   401  }
   402  
   403  export interface RateNote extends CoreNote {
   404    fiatRates: Record<number, number>
   405  }
   406  
   407  export interface WalletConfigNote extends CoreNote {
   408    wallet: WalletState
   409  }
   410  
   411  export interface WalletSyncNote extends CoreNote {
   412    assetID: number
   413    syncStatus: SyncStatus
   414    syncProgress: number
   415  }
   416  
   417  export type WalletStateNote = WalletConfigNote
   418  
   419  export interface WalletCreationNote extends CoreNote {
   420    assetID: number
   421  }
   422  
   423  export interface BaseWalletNote {
   424    route: string
   425    assetID: number
   426  }
   427  
   428  export interface TipChangeNote extends BaseWalletNote {
   429    tip: number
   430    data: any
   431  }
   432  
   433  export interface CustomWalletNote extends BaseWalletNote {
   434    payload: any
   435  }
   436  
   437  export interface TransactionNote extends BaseWalletNote {
   438    transaction: WalletTransaction
   439    new: boolean
   440  }
   441  
   442  export interface ActionRequiredNote extends BaseWalletNote {
   443    uniqueID: string
   444    actionID: string
   445    payload: any
   446  }
   447  
   448  export interface ActionResolvedNote extends BaseWalletNote {
   449    uniqueID: string
   450  }
   451  
   452  export interface TransactionActionNote {
   453    tx: WalletTransaction
   454    nonce: number
   455    newFees: number
   456  }
   457  
   458  export interface WalletNote extends CoreNote {
   459    payload: BaseWalletNote
   460  }
   461  
   462  export interface CoreActionRequiredNote extends CoreNote {
   463    payload: ActionRequiredNote
   464  }
   465  
   466  export interface RejectedRedemptionData {
   467    assetID: number
   468    orderID: string
   469    coinID: string
   470    coinFmt: string
   471  }
   472  
   473  export interface SpotPriceNote extends CoreNote {
   474    host: string
   475    spots: Record<string, Spot>
   476  }
   477  
   478  export interface RunStatsNote extends CoreNote {
   479    host: string
   480    baseID: number
   481    quoteID: number
   482    stats?: RunStats
   483  }
   484  
   485  export interface RunEventNote extends CoreNote {
   486    host: string
   487    baseID: number
   488    quoteID: number
   489    startTime: number
   490    event: MarketMakingEvent
   491  }
   492  
   493  export interface MakerProgram {
   494    host: string
   495    baseID: number
   496    quoteID: number
   497    lots: number
   498    oracleWeighting: number
   499    oracleBias: number
   500    driftTolerance: number
   501    gapFactor: number
   502    gapStrategy: string
   503  }
   504  
   505  export interface BotOrder {
   506    host: string
   507    marketID: string
   508    orderID: string
   509  }
   510  
   511  export interface BotReport {
   512    programID: number
   513    program: MakerProgram
   514    running: boolean
   515    orders: BotOrder
   516  }
   517  
   518  export interface LotFees {
   519    swap: number
   520    redeem: number
   521    refund: number
   522  }
   523  
   524  export interface LotFeeRange {
   525    max: LotFees
   526    estimated: LotFees
   527  }
   528  
   529  export interface AssetBookingFees extends LotFeeRange {
   530    bookingFeesPerLot: number
   531    bookingFeesPerCounterLot: number
   532    bookingFees: number
   533    swapReservesFactor: number // (1 + orderReservesFactor)
   534    redeemReservesFactor: number
   535    tokenFeesPerSwap: number
   536  }
   537  
   538  export interface BookingFees {
   539    base: AssetBookingFees
   540    quote: AssetBookingFees
   541  }
   542  
   543  export interface MarketReport {
   544    price: number
   545    oracles: OracleReport[]
   546    baseFiatRate: number
   547    quoteFiatRate: number
   548    baseFees: LotFeeRange
   549    quoteFees: LotFeeRange
   550  }
   551  
   552  export interface MatchNote extends CoreNote {
   553    orderID: string
   554    match: Match
   555    host: string
   556    marketID: string
   557  }
   558  
   559  export interface ConnEventNote extends CoreNote {
   560    host: string
   561    connectionStatus: ConnectionStatus
   562  }
   563  
   564  export interface OrderNote extends CoreNote {
   565    order: Order
   566    tempID: number
   567  }
   568  
   569  export interface RecentMatch {
   570    rate: number
   571    qty: number
   572    stamp: number
   573    sell: boolean
   574  }
   575  
   576  export interface EpochNote extends CoreNote {
   577    host: string
   578    marketID: string
   579    epoch: number
   580  }
   581  
   582  export interface APIResponse {
   583    requestSuccessful: boolean
   584    ok: boolean
   585    msg: string
   586    err?: string
   587  }
   588  
   589  export interface LogMessage {
   590    time: string
   591    msg: string
   592  }
   593  
   594  export interface NoteElement extends HTMLElement {
   595    note: CoreNote
   596  }
   597  
   598  export interface BalanceResponse extends APIResponse {
   599    balance: WalletBalance
   600  }
   601  
   602  export interface LayoutMetrics {
   603    bodyTop: number
   604    bodyLeft: number
   605    width: number
   606    height: number
   607    centerX: number
   608    centerY: number
   609  }
   610  
   611  export interface PageElement extends HTMLElement {
   612    value?: string
   613    src?: string
   614    files?: FileList
   615    checked?: boolean
   616    href?: string
   617    htmlFor?: string
   618    name?: string
   619    options?: HTMLOptionElement[]
   620    selectedIndex?: number
   621    disabled?: boolean
   622  }
   623  
   624  export interface BooleanConfig {
   625    reason: string
   626  }
   627  
   628  export interface XYRangePoint {
   629    label: string
   630    x: number
   631    y: number
   632  }
   633  
   634  export interface XYRange {
   635    start: XYRangePoint
   636    end: XYRangePoint
   637    xUnit: string
   638    yUnit: string
   639    roundX?: boolean
   640    roundY?: boolean
   641  }
   642  
   643  export interface OrderOption extends ConfigOption {
   644    boolean?: BooleanConfig
   645    xyRange?: XYRange
   646    showByDefault?: boolean
   647    quoteAssetOnly?: boolean
   648  }
   649  
   650  export interface SwapEstimate {
   651    lots: number
   652    value: number
   653    maxFees: number
   654    realisticWorstCase: number
   655    realisticBestCase: number
   656    feeReservesPerLot: number
   657  }
   658  
   659  export interface RedeemEstimate {
   660    realisticBestCase: number
   661    realisticWorstCase: number
   662  }
   663  
   664  export interface PreSwap {
   665    estimate: SwapEstimate
   666    options: OrderOption[]
   667  }
   668  
   669  export interface PreRedeem {
   670    estimate: RedeemEstimate
   671    options: OrderOption[]
   672  }
   673  
   674  export interface OrderEstimate {
   675    swap: PreSwap
   676    redeem: PreRedeem
   677  }
   678  
   679  export interface MaxOrderEstimate {
   680    swap: SwapEstimate
   681    redeem: RedeemEstimate
   682  }
   683  
   684  export interface MaxSell {
   685    maxSell: MaxOrderEstimate
   686  }
   687  
   688  export interface MaxBuy {
   689    maxBuy: MaxOrderEstimate
   690  }
   691  
   692  export interface TradeForm {
   693    host: string
   694    isLimit: boolean
   695    sell: boolean
   696    base: number
   697    quote: number
   698    qty: number
   699    rate: number
   700    tifnow: boolean
   701    options: Record<string, any>
   702  }
   703  
   704  export interface BookUpdate {
   705    action: string
   706    host: string
   707    marketID: string
   708    matchesSummary: RecentMatch[]
   709    payload: any
   710  }
   711  
   712  export interface MiniOrder {
   713    qty: number
   714    qtyAtomic: number
   715    rate: number
   716    msgRate: number
   717    epoch: number
   718    sell: boolean
   719    token: string
   720  }
   721  
   722  export interface CoreOrderBook {
   723    sells: MiniOrder[]
   724    buys: MiniOrder[]
   725    epoch: MiniOrder[]
   726    recentMatches: RecentMatch[]
   727  }
   728  
   729  export interface MarketOrderBook {
   730    base: number
   731    quote: number
   732    book: CoreOrderBook
   733  }
   734  
   735  export interface RemainderUpdate {
   736    token: string
   737    qty: number
   738    qtyAtomic: number
   739  }
   740  
   741  export interface OrderFilterMarket {
   742    baseID: number
   743    quoteID: number
   744  }
   745  
   746  export interface OrderFilter {
   747    n?: number
   748    offset?: string
   749    hosts?: string[]
   750    assets?: number[]
   751    market?: OrderFilterMarket
   752    statuses?: number[]
   753  }
   754  
   755  export interface OrderPlacement {
   756    lots: number
   757    gapFactor: number
   758  }
   759  
   760  export interface AutoRebalanceConfig {
   761    minBaseTransfer: number
   762    minQuoteTransfer: number
   763  }
   764  
   765  export interface BasicMarketMakingConfig {
   766    gapStrategy: string
   767    sellPlacements: OrderPlacement[]
   768    buyPlacements: OrderPlacement[]
   769    driftTolerance: number
   770  }
   771  
   772  export interface ArbMarketMakingPlacement {
   773    lots: number
   774    multiplier: number
   775  }
   776  
   777  export interface ArbMarketMakingConfig {
   778    buyPlacements: ArbMarketMakingPlacement[]
   779    sellPlacements: ArbMarketMakingPlacement[]
   780    profit: number
   781    driftTolerance: number
   782    orderPersistence: number
   783  }
   784  
   785  export interface SimpleArbConfig {
   786    profitTrigger: number
   787    maxActiveArbs: number
   788    numEpochsLeaveOpen: number
   789  }
   790  
   791  export interface BotCEXCfg {
   792    name: string
   793    autoRebalance?: AutoRebalanceConfig
   794  }
   795  
   796  export interface BotBalanceAllocation {
   797    dex: Record<number, number>
   798    cex: Record<number, number>
   799  }
   800  
   801  export interface BotAssetConfig {
   802    swapFeeN: number
   803    orderReservesFactor: number
   804    slippageBufferFactor: number
   805    transferFactor: number
   806  }
   807  
   808  export interface UIConfig {
   809    baseConfig: BotAssetConfig
   810    quoteConfig: BotAssetConfig
   811    simpleArbLots?: number
   812    cexRebalance: boolean
   813  }
   814  
   815  export interface StartConfig extends MarketWithHost {
   816    autoRebalance?: AutoRebalanceConfig
   817    alloc: BotBalanceAllocation
   818  }
   819  
   820  export interface BotConfig {
   821    host: string
   822    baseID: number
   823    quoteID: number
   824    baseWalletOptions?: Record<string, string>
   825    quoteWalletOptions?: Record<string, string>
   826    cexName: string
   827    uiConfig: UIConfig
   828    basicMarketMakingConfig?: BasicMarketMakingConfig
   829    arbMarketMakingConfig?: ArbMarketMakingConfig
   830    simpleArbConfig?: SimpleArbConfig
   831  }
   832  
   833  export interface CEXConfig {
   834    name: string
   835    apiKey: string
   836    apiSecret: string
   837  }
   838  
   839  export interface MarketWithHost {
   840    host: string
   841    baseID: number
   842    quoteID: number
   843  }
   844  
   845  export interface MMCEXStatus {
   846    config: CEXConfig
   847    connected: boolean
   848    connectErr: string
   849    markets: Record<string, CEXMarket>
   850    balances: Record<number, ExchangeBalance>
   851  }
   852  
   853  export interface BotBalance {
   854    available: number
   855    locked: number
   856    pending: number
   857    reserved: number
   858  }
   859  
   860  export interface BotBalances {
   861    dex: BotBalance
   862    cex: BotBalance
   863  }
   864  
   865  export interface BotInventory {
   866    avail: number
   867    locked: number // includes BotBalance.reserved
   868    total: number // avail + locked
   869  }
   870  
   871  export interface RunningBotInventory {
   872    avail: number
   873    locked: number
   874    dex: BotInventory
   875    cex: BotInventory
   876  }
   877  
   878  export interface CEXNotification extends CoreNote {
   879    cexName: string
   880    note: any
   881  }
   882  
   883  export interface CEXBalanceUpdate {
   884    assetID: number
   885    balance: ExchangeBalance
   886  }
   887  
   888  export interface EpochReportNote extends CoreNote {
   889    host: string
   890    baseID: number
   891    quoteID: number
   892    report?: EpochReport
   893  }
   894  
   895  export interface CEXProblemsNote extends CoreNote {
   896    host: string
   897    baseID: number
   898    quoteID: number
   899    problems?: CEXProblems
   900  }
   901  
   902  export interface FeeEstimates extends LotFeeRange {
   903    bookingFeesPerLot: number
   904    bookingFees: number
   905    tokenFeesPerSwap: number
   906  }
   907  
   908  export interface ProjectedAlloc {
   909    // book is inventory dedicated either to active orders for basicmm and arbmm,
   910    // or on reserve for orders in the case of basicarb. book + bookingFees is the
   911    // starvation threshold for DEX, meaning it's impossible to start a bot
   912    // unstarved if there no way to get book + bookingFees to Bison Wallet. A user
   913    // could potentially adjust order reserves or swap fee reserves to free up
   914    // more funds, but with possible degradation of bot performance.
   915    book: number
   916    // booking fees is funding dedicated to covering the fees for funded orders.
   917    // bookingFees are in the units of the parent chain for token assets.
   918    bookingFees: number
   919    // swapFeeReserves is only required for token assets. These are fees
   920    // reserved for funding swaps. These fees are only debited, so will definitely
   921    // run out eventually, but we'll get a UI that enabled manual and/or auto
   922    // refill soon. swapFeeReserves are in the units of the parent chain.
   923    swapFeeReserves: number
   924    // cex is the inventory dedicated to funding counter-orders on cex for an
   925    // arbmm or simplearb bot. cex is the starvation threshold for CEX.
   926    cex: number
   927    // orderReserves is inventory reserved for facilitating withdraws and
   928    // deposits or for replacing matched orders. It's a good idea to have a
   929    // little extra around, otherwise a trade sequence gone wrong could put
   930    // the bot in a starved or unbalanced state.
   931    orderReserves: number
   932    // slippageBuffer is only required for the quote asset. This accounts for
   933    // variations in rate, because the quote asset's "lot size" varies with
   934    // rate. If the rate goes down, the quote-converted lot size goes up, so
   935    // we'll let the user choose to reserve a little extra for this case.
   936    slippageBuffer: number
   937  }
   938  
   939  export interface FeeGapStats {
   940    basisPrice: number
   941    feeGap: number
   942    remoteGap: number
   943    roundTripFees: number
   944  }
   945  
   946  export interface RunStats {
   947    initialBalances: Record<number, number>
   948    dexBalances: Record<number, BotBalance>
   949    cexBalances: Record<number, BotBalance>
   950    profitLoss: ProfitLoss
   951    startTime: number
   952    pendingDeposits: number
   953    pendingWithdrawals: number
   954    completedMatches: number
   955    tradedUSD: number
   956    feeGap: FeeGapStats
   957  }
   958  
   959  export interface StampedError {
   960    stamp: number
   961    error: string
   962  }
   963  
   964  export interface BotProblems {
   965    walletNotSynced: Record<number, boolean>
   966    noWalletPeers: Record<number, boolean>
   967    accountSuspended: boolean
   968    userLimitTooLow: boolean
   969    noPriceSource: boolean
   970    oracleFiatMismatch: boolean
   971    cexOrderbookUnsynced: boolean
   972    causesSelfMatch: boolean
   973    unknownError: string
   974  }
   975  
   976  export interface TradePlacement {
   977    rate: number
   978    lots: number
   979    standingLots: number
   980    orderedLots: number
   981    counterTradeRate: number
   982    requiredDex: Record<number, number>
   983    requiredCex: number
   984    usedDex: Record<number, number>
   985    usedCex: number
   986    error?: BotProblems
   987  }
   988  
   989  export interface OrderReport {
   990    placements: TradePlacement[]
   991    fees: LotFeeRange
   992    availableDexBals: Record<number, BotBalance>
   993    requiredDexBals: Record<number, number>
   994    remainingDexBals: Record<number, number>
   995    usedDexBals: Record<number, number>
   996    availableCexBal: BotBalance
   997    requiredCexBal: number
   998    remainingCexBal: number
   999    usedCexBal: number
  1000    error?: BotProblems
  1001  }
  1002  
  1003  export interface EpochReport {
  1004    epochNum: number
  1005    preOrderProblems?: BotProblems
  1006    buysReport?: OrderReport
  1007    sellsReport?: OrderReport
  1008  }
  1009  
  1010  export interface CEXProblems {
  1011    depositErr: Record<number, StampedError>
  1012    withdrawErr: Record<number, StampedError>
  1013    tradeErr: StampedError
  1014  }
  1015  
  1016  export interface MMBotStatus {
  1017    config: BotConfig
  1018    running: boolean
  1019    runStats?: RunStats
  1020    latestEpoch?: EpochReport
  1021    cexProblems?: CEXProblems
  1022  }
  1023  
  1024  export interface MarketMakingStatus {
  1025    cexes: Record<string, MMCEXStatus>
  1026    bots: MMBotStatus[]
  1027  }
  1028  
  1029  export interface DEXOrderEvent {
  1030    id: string
  1031    rate: number
  1032    qty: number
  1033    sell: boolean
  1034    transactions: WalletTransaction[]
  1035  }
  1036  
  1037  export interface CEXOrderEvent {
  1038    id: string
  1039    rate: number
  1040    qty: number
  1041    sell: boolean
  1042    baseFilled: number
  1043    quoteFilled: number
  1044  }
  1045  
  1046  export interface DepositEvent {
  1047    assetID: number
  1048    transaction: WalletTransaction
  1049    cexCredit: number
  1050  }
  1051  
  1052  export interface WithdrawalEvent {
  1053    id: string
  1054    assetID: number
  1055    transaction: WalletTransaction
  1056    cexDebit: number
  1057  }
  1058  
  1059  export interface BalanceEffects {
  1060    settled: Record<number, number>
  1061    pending: Record<number, number>
  1062    locked: Record<number, number>
  1063    reserved: Record<number, number>
  1064  }
  1065  
  1066  export interface MarketMakingEvent {
  1067    id: number
  1068    timestamp: number
  1069    balanceEffects: BalanceEffects
  1070    pending: boolean
  1071    dexOrderEvent?: DEXOrderEvent
  1072    cexOrderEvent?: CEXOrderEvent
  1073    depositEvent?: DepositEvent
  1074    withdrawalEvent?: WithdrawalEvent
  1075  }
  1076  
  1077  interface MarketDay {
  1078    vol: number
  1079    quoteVol: number
  1080    priceChange: number
  1081    priceChangePct: number
  1082    avgPrice: number
  1083    lastPrice: number
  1084    openPrice: number
  1085    highPrice: number
  1086    lowPrice: number
  1087  }
  1088  
  1089  export interface CEXMarket {
  1090    baseID: number
  1091    quoteID: number
  1092    baseMinWithdraw: number
  1093    quoteMinWithdraw: number
  1094    day: MarketDay
  1095  }
  1096  
  1097  export interface OracleReport {
  1098    host: string
  1099    usdVol: number
  1100    bestBuy: number
  1101    bestSell: number
  1102  }
  1103  
  1104  export interface ExchangeBalance {
  1105    available: number
  1106    locked: number
  1107  }
  1108  
  1109  // changing the order of the elements in this enum will affect
  1110  // the sorting of the peers table in wallets.ts.
  1111  export enum PeerSource {
  1112    WalletDefault,
  1113    UserAdded,
  1114    Discovered,
  1115  }
  1116  
  1117  export interface BalanceState {
  1118    fiatRates: Record<number, number>
  1119    balances: Record<number, BotBalance>
  1120    invMods: Record<number, number>
  1121  }
  1122  
  1123  export interface Amount {
  1124    atoms: number
  1125    conventional: number
  1126    fmt: string
  1127    usd: number
  1128    fmtUSD: string
  1129  }
  1130  
  1131  export interface ProfitLoss {
  1132    initial: Record<number, Amount>
  1133    initialUSD: number
  1134    mods: Record<number, Amount>
  1135    modsUSD: number
  1136    final: Record<number, Amount>
  1137    finalUSD: number
  1138    diffs: Record<number, Amount>
  1139    profit: number
  1140    profitRatio: number
  1141  }
  1142  
  1143  export interface StampedBotConfig {
  1144    timestamp: number
  1145    cfg: BotConfig
  1146  }
  1147  
  1148  export interface MarketMakingRunOverview {
  1149    endTime: number
  1150    cfgs: StampedBotConfig[]
  1151    initialBalances: Record<number, number>
  1152    profitLoss: ProfitLoss
  1153    finalState: BalanceState
  1154  }
  1155  
  1156  export interface WalletPeer {
  1157    addr: string
  1158    source: PeerSource
  1159    connected: boolean
  1160  }
  1161  
  1162  export interface TicketTransaction {
  1163    hash: string
  1164    ticketPrice: number
  1165    fees: number
  1166    stamp: number
  1167    blockHeight: number
  1168  }
  1169  
  1170  export interface Ticket {
  1171    tx: TicketTransaction
  1172    status: number
  1173    spender: string
  1174  }
  1175  
  1176  export interface TBChoice {
  1177    id: string
  1178    description: string
  1179  }
  1180  
  1181  export interface TBAgenda {
  1182    id: string
  1183    description: string
  1184    currentChoice: string
  1185    choices: TBChoice[]
  1186  }
  1187  
  1188  export interface TKeyPolicyResult {
  1189    key: string
  1190    policy: string
  1191    ticket?: string
  1192  }
  1193  
  1194  export interface TBTreasurySpend {
  1195    hash: string
  1196    value: number
  1197    currentPolicy: string
  1198  }
  1199  
  1200  export interface Stances {
  1201    agendas: TBAgenda[]
  1202    tspends: TBTreasurySpend[]
  1203    treasuryKeys: TKeyPolicyResult[]
  1204  }
  1205  
  1206  export interface TicketStats {
  1207    totalRewards: number
  1208    ticketCount: number
  1209    votes: number
  1210    revokes: number
  1211    mempool: number
  1212    queued: number
  1213  }
  1214  
  1215  export interface TicketStakingStatus {
  1216    ticketPrice: number
  1217    votingSubsidy: number
  1218    vsp: string
  1219    isRPC: boolean
  1220    tickets: Ticket[]
  1221    stances: Stances
  1222    stats: TicketStats
  1223  }
  1224  
  1225  // VotingServiceProvider is information about a voting service provider.
  1226  export interface VotingServiceProvider {
  1227    url: string
  1228    network: number
  1229    launched: number
  1230    lastUpdated: number
  1231    apiVersions: number[]
  1232    feePercentage: number
  1233    closed: boolean
  1234    voting: number
  1235    voted: number
  1236    revoked: number
  1237    vspdVersion: string
  1238    blockHeight: number
  1239    netShare: number
  1240  }
  1241  
  1242  export interface BondTxInfo {
  1243    bondID: string
  1244    lockTime: number
  1245    accountID: string
  1246  }
  1247  
  1248  export interface WalletTransaction {
  1249    type: number
  1250    id: string
  1251    amount: number
  1252    fees: number
  1253    timestamp: number
  1254    blockNumber: number
  1255    tokenID?: number
  1256    recipient?: string
  1257    bondInfo?: BondTxInfo
  1258    additionalData: Record<string, string>
  1259  }
  1260  
  1261  export interface TxHistoryResult {
  1262    txs: WalletTransaction[]
  1263    lastTx: boolean
  1264  }
  1265  
  1266  export const PrepaidBondID = 2147483647
  1267  
  1268  export interface Application {
  1269    assets: Record<number, SupportedAsset>
  1270    seedGenTime: number
  1271    user: User
  1272    mmStatus: MarketMakingStatus
  1273    header: HTMLElement
  1274    headerSpace: HTMLElement
  1275    walletMap: Record<number, WalletState>
  1276    exchanges: Record<string, Exchange>
  1277    fiatRatesMap: Record<number, number>
  1278    showPopups: boolean
  1279    commitHash: string
  1280    authed: boolean
  1281    start (): Promise<void>
  1282    reconnected (): void
  1283    fetchUser (): Promise<User | void>
  1284    fetchMMStatus (): Promise<User | void>
  1285    loadPage (page: string, data?: any, skipPush?: boolean): Promise<boolean>
  1286    attach (data: any): void
  1287    bindTooltips (ancestor: HTMLElement): void
  1288    bindUrlHandlers (ancestor: HTMLElement): void
  1289    attachHeader (): void
  1290    updateMarketElements (ancestor: PageElement, baseID: number, quoteID: number, xc?: Exchange): void
  1291    showDropdown (icon: HTMLElement, dialog: HTMLElement): void
  1292    ackNotes (): void
  1293    setNoteTimes (noteList: HTMLElement): void
  1294    bindInternalNavigation (ancestor: HTMLElement): void
  1295    updateMenuItemsDisplay (): void
  1296    attachCommon (node: HTMLElement): void
  1297    updateBondConfs (dexAddr: string, coinID: string, confs: number, assetID: number): void
  1298    handleBondNote (note: BondNote): void
  1299    loggedIn (notes: CoreNote[], pokes: CoreNote[]): void
  1300    setPokes(pokes: CoreNote[]): void
  1301    botStatus (host: string, baseID: number, quoteID: number): MMBotStatus | undefined
  1302    notify (note: CoreNote): void
  1303    log (loggerID: string, ...msg: any): void
  1304    prependPokeElement (note: CoreNote): void
  1305    prependNoteElement (note: CoreNote, skipSave?: boolean): void
  1306    prependListElement (noteList: HTMLElement, note: CoreNote, el: NoteElement): void
  1307    loading (el: HTMLElement): () => void
  1308    orders (host: string, mktID: string): Order[]
  1309    haveActiveOrders (assetID: number): boolean
  1310    order (oid: string): Order | null
  1311    canAccelerateOrder(order: Order): boolean
  1312    unitInfo (assetID: number, xc?: Exchange): UnitInfo
  1313    baseChainSymbol (assetID: number): string
  1314    extensionWallet (assetID: number): ExtensionConfiguredWallet | undefined
  1315    conventionalRate (baseID: number, quoteID: number, encRate: number, xc?: Exchange): number
  1316    walletDefinition (assetID: number, walletType: string): WalletDefinition
  1317    currentWalletDefinition (assetID: number): WalletDefinition
  1318    fetchBalance (assetID: number): Promise<WalletBalance>
  1319    checkResponse (resp: APIResponse): boolean
  1320    signOut (): Promise<void>
  1321    registerNoteFeeder (receivers: Record<string, (n: CoreNote) => void>): void
  1322    txHistory(assetID: number, n: number, after?: string): Promise<TxHistoryResult>
  1323    getWalletTx(assetID: number, txid: string): WalletTransaction | undefined
  1324    clearTxHistory(assetID: number): void
  1325    parentAsset(assetID: number): SupportedAsset
  1326    needsCustomProvider (assetID: number): Promise<boolean>
  1327  }
  1328  
  1329  // TODO: Define an interface for Application?
  1330  let application: Application
  1331  
  1332  export function registerApplication (a: Application) {
  1333    application = a
  1334  }
  1335  
  1336  export function app (): Application {
  1337    return application
  1338  }