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