diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 0000000000..eaac63a70d --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,9 @@ + +# Build and Publish Snap Package workflow + +This workflow builds a `snap` package and uploads it to the [Snap Store](https://snapcraft.io/store). It has a `workflow_dispatch` trigger so it can be triggered manually only, it is not hooked up to any other GH event. + +The store upload requires the `SNAPCRAFT_STORE_CREDENTIALS` variable to be set in [Github Secrets](https://github.com/decred/dcrdex/settings/secrets/actions). +See https://github.com/snapcore/action-publish for details. + +More information on Snapcraft authentication: [https://snapcraft.io/docs/snapcraft-authentication] \ No newline at end of file diff --git a/.github/workflows/build-snap.yml b/.github/workflows/build-snap.yml new file mode 100644 index 0000000000..81e93c2b48 --- /dev/null +++ b/.github/workflows/build-snap.yml @@ -0,0 +1,48 @@ +name: Build and Publish Snap Package + +on: +# manually trigger the workflow from the Actions tab + workflow_dispatch: + +jobs: + build-snap: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + with: + fetch-depth: 0 + + - name: Compile frontend + working-directory: client/webserver/site + run: | + npm install + npm run build + + - name: Install deb deps + run: | + sudo apt-get update + sudo apt-get -y install libgtk-3-dev libwebkit2gtk-4.1-dev build-essential + + - name: Build deb package + working-directory: client/cmd/bisonw-desktop + run: pkg/pkg-debian.sh + + - name: Prepare snapcraft.yml + working-directory: client/cmd/bisonw-desktop + run: pkg/prepare-snap.sh + + - name: Build snap package + uses: snapcore/action-build@3bdaa03e1ba6bf59a65f84a751d943d549a54e79 # v1.3.0 + id: build + with: + path: client/cmd/bisonw-desktop + + - name: Publish snap to Snap Store + uses: snapcore/action-publish@214b86e5ca036ead1668c79afb81e550e6c54d40 # v1.2.0 + env: + SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_STORE_CREDENTIALS }} + with: + snap: ${{ steps.build.outputs.snap }} + release: stable diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8c8c42efbb..cd0cdbc51a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,14 +5,14 @@ permissions: jobs: build-go: name: Go CI - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest strategy: matrix: - go: ['1.22', '1.23'] + go: ['1.23', '1.24'] steps: - uses: awalsh128/cache-apt-pkgs-action@5902b33ae29014e6ca012c5d8025d4346556bd40 #v1.4.3 with: - packages: git-restore-mtime libgtk-3-dev libwebkit2gtk-4.0-dev + packages: git-restore-mtime libgtk-3-dev libwebkit2gtk-4.1-dev version: 1.0 - name: Set up Go @@ -28,7 +28,7 @@ jobs: - name: restore timestamps run: git restore-mtime - name: Install Linters - run: "curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.60.2" + run: "curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.0.2" - name: Use test and module cache uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 #v4.2.0 with: diff --git a/.gitignore b/.gitignore index 0e82613dfd..75f73c2a3c 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,7 @@ client/cmd/bisonw-desktop/pkg/installers client/cmd/testbinance/testbinance client/cmd/mmbaltracker/mmbaltracker server/noderelay/cmd/sourcenode/sourcenode +client/cmd/bisonw-desktop/snap/snapcraft.yaml tatanka/cmd/demo/demo server/cmd/validatemarkets client/cmd/translationsreport/translationsreport diff --git a/.golangci.yml b/.golangci.yml index e50af6c829..9430511a17 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,18 +1,12 @@ +version: "2" run: - deadline: 10m - -output: - formats: colored-line-number - + timeout: 10m linters: - disable-all: true + default: none enable: - asciicheck - bidichk - durationcheck - - gofmt - - goimports - - gosimple - govet - grouper - ineffassign @@ -21,6 +15,20 @@ linters: - reassign - rowserrcheck - sqlclosecheck + - staticcheck - tparallel - - typecheck - unconvert + settings: + staticcheck: + checks: + - S1* + exclusions: + paths: + - docs/examples +formatters: + enable: + - gofmt + - goimports + exclusions: + paths: + - docs/examples diff --git a/client/Dockerfile b/client/Dockerfile index 7b367106d2..d9700631fb 100644 --- a/client/Dockerfile +++ b/client/Dockerfile @@ -41,7 +41,7 @@ WORKDIR /root/dex/client/cmd/bwctl/ RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build # Final image -FROM debian:buster-slim +FROM debian:bookworm-slim RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y ca-certificates WORKDIR /dex ENV HOME /dex diff --git a/client/Dockerfile.release b/client/Dockerfile.release index 2de9082660..45e376ffb9 100644 --- a/client/Dockerfile.release +++ b/client/Dockerfile.release @@ -29,7 +29,7 @@ WORKDIR /root/dex/client/cmd/bwctl/ RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build # Final image -FROM debian:buster-slim +FROM debian:bookworm-slim RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y ca-certificates WORKDIR /dex ENV HOME /dex diff --git a/client/app/config.go b/client/app/config.go index e1f61a9875..89089b14ed 100644 --- a/client/app/config.go +++ b/client/app/config.go @@ -198,6 +198,7 @@ func (cfg *Config) Web(c *core.Core, mm *mm.MarketMaker, log dex.Logger, utc boo KeyFile: keyFile, NoEmbed: cfg.NoEmbedSite, HttpProf: cfg.HTTPProfile, + AppVersion: userAppVersion(Version), Language: cfg.Language, } } @@ -352,9 +353,16 @@ func ResolveConfig(appData string, cfg *Config) error { if cfg.MMConfig.EventLogDBPath == "" { cfg.MMConfig.EventLogDBPath = defaultMMEventLogDBPath } + return nil } +// userAppVersion returns a simple user-facing version: maj.min.patch. +func userAppVersion(fullVersion string) string { + parts := strings.Split(fullVersion, "-") + return parts[0] +} + // setNet sets the filepath for the network directory and some network specific // files. It returns a suggested path for the database file and a log file. If // using a file rotator, the directory of the log filepath as parsed by diff --git a/client/asset/bch/spv.go b/client/asset/bch/spv.go index fc88fe2fa5..6b8276a3ad 100644 --- a/client/asset/bch/spv.go +++ b/client/asset/bch/spv.go @@ -51,11 +51,10 @@ import ( ) const ( - DefaultM uint64 = 784931 // From bchutil. Used for gcs filters. - logDirName = "logs" - neutrinoDBName = "neutrino.db" - defaultAcctNum = 0 - defaultAcctName = "default" + DefaultM uint64 = 784931 // From bchutil. Used for gcs filters. + logDirName = "logs" + neutrinoDBName = "neutrino.db" + defaultAcctNum = 0 ) var ( @@ -248,15 +247,6 @@ func (w *bchSPVWallet) txDetails(txHash *bchchainhash.Hash) (*bchwtxmgr.TxDetail var _ btc.BTCWallet = (*bchSPVWallet)(nil) -// AccountInfo returns the account information of the wallet for use by the -// exchange wallet. -func (w *bchSPVWallet) AccountInfo() btc.XCWalletAccount { - return btc.XCWalletAccount{ - AccountName: defaultAcctName, - AccountNumber: defaultAcctNum, - } -} - func (w *bchSPVWallet) PublishTransaction(btcTx *wire.MsgTx, label string) error { bchTx, err := convertMsgTxToBCH(btcTx) if err != nil { @@ -802,6 +792,18 @@ func (w *bchSPVWallet) RemovePeer(addr string) error { return w.peerManager.RemovePeer(addr) } +func (w *bchSPVWallet) TotalReceivedForAddr(btcAddr btcutil.Address, minConf int32) (btcutil.Amount, error) { + bchAddr, err := dexbch.BTCAddrToBCHAddr(btcAddr, w.btcParams) + if err != nil { + return 0, err + } + amt, err := w.Wallet.TotalReceivedForAddr(bchAddr, 0) + if err != nil { + return 0, err + } + return btcutil.Amount(amt), nil +} + // secretSource is used to locate keys and redemption scripts while signing a // transaction. secretSource satisfies the txauthor.SecretsSource interface. type secretSource struct { diff --git a/client/asset/btc/btc.go b/client/asset/btc/btc.go index e76d5a53dc..7ea5f8fc86 100644 --- a/client/asset/btc/btc.go +++ b/client/asset/btc/btc.go @@ -147,7 +147,7 @@ var ( Description: "Allow split funding transactions that pre-size outputs to " + "prevent excessive overlock.", IsBoolean: true, - DefaultValue: true, + DefaultValue: "true", }, }, { @@ -156,7 +156,7 @@ var ( DisplayName: "Multi split buffer", Description: "Add an integer percent buffer to split output amounts to " + "facilitate output reuse. This is only required for quote assets.", - DefaultValue: 5, + DefaultValue: "5", DependsOn: multiSplitKey, }, QuoteAssetOnly: true, @@ -227,7 +227,7 @@ func apiFallbackOpt(defaultV bool) *asset.ConfigOption { "This is useful as a fallback for SPV wallets and RPC wallets " + "that have recently been started.", IsBoolean: true, - DefaultValue: defaultV, + DefaultValue: strconv.FormatBool(defaultV), } } @@ -239,7 +239,7 @@ func CommonConfigOpts(symbol string /* upper-case */, withApiFallback bool) []*a DisplayName: "Fallback fee rate", Description: fmt.Sprintf("The fee rate to use for sending or withdrawing funds and fee payment when"+ " estimatesmartfee is not available. Units: %s/kB", symbol), - DefaultValue: defaultFee * 1000 / 1e8, + DefaultValue: strconv.FormatFloat(defaultFee*1000/1e8, 'f', -1, 64), }, { Key: "feeratelimit", @@ -248,7 +248,7 @@ func CommonConfigOpts(symbol string /* upper-case */, withApiFallback bool) []*a "pay on swap transactions. If feeratelimit is lower than a market's "+ "maxfeerate, you will not be able to trade on that market with this "+ "wallet. Units: %s/kB", symbol), - DefaultValue: defaultFeeRateLimit * 1000 / 1e8, + DefaultValue: strconv.FormatFloat(defaultFeeRateLimit*1000/1e8, 'f', -1, 64), }, { Key: "redeemconftarget", @@ -256,7 +256,7 @@ func CommonConfigOpts(symbol string /* upper-case */, withApiFallback bool) []*a Description: "The target number of blocks for the redeem transaction " + "to be mined. Used to set the transaction's fee rate. " + "(default: 2 blocks)", - DefaultValue: defaultRedeemConfTarget, + DefaultValue: strconv.FormatUint(defaultRedeemConfTarget, 10), }, { Key: "txsplit", @@ -268,7 +268,7 @@ func CommonConfigOpts(symbol string /* upper-case */, withApiFallback bool) []*a "or the order is canceled. This an extra transaction for which network " + "mining fees are paid.", IsBoolean: true, - DefaultValue: false, + DefaultValue: "false", }, } @@ -644,26 +644,30 @@ func (d *Driver) MinLotSize(maxFeeRate uint64) uint64 { return dexbtc.MinLotSize(maxFeeRate, true) } -type CustomSPVWalletConstructor func(settings map[string]string, params *chaincfg.Params) (BTCWallet, error) +type CustomWallet interface { + Wallet + TxFeeEstimator + TipRedemptionWallet +} + +type CustomWalletConstructor func(settings map[string]string, params *chaincfg.Params) (CustomWallet, error) -// customSPVWalletConstructors are functions for setting up custom -// implementations of the BTCWallet interface that may be used by the -// ExchangeWalletSPV instead of the default spv implementation. -var customSPVWalletConstructors = map[string]CustomSPVWalletConstructor{} +// customWalletConstructors are functions for setting up CustomWallet +// implementations used by ExchangeWalletCustom. +var customWalletConstructors = map[string]CustomWalletConstructor{} -// RegisterCustomSPVWallet registers a function that should be used in creating -// a BTCWallet implementation that the ExchangeWalletSPV will use in place of -// the default spv wallet implementation. External consumers can use this -// function to provide alternative BTCWallet implementations, and must do so -// before attempting to create an ExchangeWalletSPV instance of this type. It'll -// panic if callers try to register a wallet twice. -func RegisterCustomSPVWallet(constructor CustomSPVWalletConstructor, def *asset.WalletDefinition) { +// RegisterCustomWallet registers a function that should be used in creating a +// CustomWallet implementation for ExchangeWalletCustom. External consumers can +// use this function to provide CustomWallet implementation, and must do so +// before attempting to create an ExchangeWalletCustom instance of this type. +// It'll panic if callers try to register a wallet twice. +func RegisterCustomWallet(constructor CustomWalletConstructor, def *asset.WalletDefinition) { for _, availableWallets := range WalletInfo.AvailableWallets { if def.Type == availableWallets.Type { panic(fmt.Sprintf("wallet type (%q) is already registered", def.Type)) } } - customSPVWalletConstructors[def.Type] = constructor + customWalletConstructors[def.Type] = constructor WalletInfo.AvailableWallets = append(WalletInfo.AvailableWallets, def) } @@ -807,6 +811,10 @@ type baseWallet struct { feeCache *feeRateCache decodeAddr dexbtc.AddressDecoder walletDir string + // noListTxHistory is true for assets that cannot call the + // ListTransactionSinceBlock method. This is true for Firo + // electrum as of electrum 4.1.5.3. + noListTxHistory bool deserializeTx func([]byte) (*wire.MsgTx, error) serializeTx func(*wire.MsgTx) ([]byte, error) @@ -871,8 +879,8 @@ func (w *baseWallet) apiFeeFallback() bool { type intermediaryWallet struct { *baseWallet - txFeeEstimator txFeeEstimator - tipRedeemer tipRedemptionWallet + txFeeEstimator TxFeeEstimator + tipRedeemer TipRedemptionWallet syncingTxHistory atomic.Bool } @@ -902,6 +910,13 @@ type ExchangeWalletAccelerator struct { *ExchangeWalletFullNode } +// ExchangeWalletCustom is an external wallet that implements the Wallet, +// TxFeeEstimator and TipRedemptionWallet interface. +type ExchangeWalletCustom struct { + *intermediaryWallet + *authAddOn +} + // Check that wallets satisfy their supported interfaces. var _ asset.Wallet = (*intermediaryWallet)(nil) var _ asset.Accelerator = (*ExchangeWalletAccelerator)(nil) @@ -917,8 +932,10 @@ var _ asset.Bonder = (*baseWallet)(nil) var _ asset.Authenticator = (*ExchangeWalletSPV)(nil) var _ asset.Authenticator = (*ExchangeWalletFullNode)(nil) var _ asset.Authenticator = (*ExchangeWalletAccelerator)(nil) +var _ asset.Authenticator = (*ExchangeWalletCustom)(nil) var _ asset.AddressReturner = (*baseWallet)(nil) var _ asset.WalletHistorian = (*ExchangeWalletSPV)(nil) +var _ asset.NewAddresser = (*baseWallet)(nil) // RecoveryCfg is the information that is transferred from the old wallet // to the new one when the wallet is recovered. @@ -1119,22 +1136,11 @@ func NewWallet(cfg *asset.WalletConfig, logger dex.Logger, net dex.Network) (ass cloneCFG.MinElectrumVersion = *ver return ElectrumWallet(cloneCFG) default: - makeCustomWallet, ok := customSPVWalletConstructors[cfg.Type] + makeCustomWallet, ok := customWalletConstructors[cfg.Type] if !ok { return nil, fmt.Errorf("unknown wallet type %q", cfg.Type) } - - // Create custom wallet first and return early if we encounter any - // error. - btcWallet, err := makeCustomWallet(cfg.Settings, cloneCFG.ChainParams) - if err != nil { - return nil, fmt.Errorf("btc custom wallet setup error: %v", err) - } - - walletConstructor := func(_ string, _ *WalletConfig, _ *chaincfg.Params, _ dex.Logger) BTCWallet { - return btcWallet - } - return OpenSPVWallet(cloneCFG, walletConstructor) + return OpenCustomWallet(cloneCFG, makeCustomWallet) } } @@ -1372,6 +1378,43 @@ func noLocalFeeRate(ctx context.Context, rr RawRequester, u uint64) (uint64, err return 0, errors.New("no local fee rate estimate possible") } +// OpenCustomWallet opens a custom wallet. +func OpenCustomWallet(cfg *BTCCloneCFG, walletConstructor CustomWalletConstructor) (*ExchangeWalletCustom, error) { + walletCfg := new(WalletConfig) + err := config.Unmapify(cfg.WalletCFG.Settings, walletCfg) + if err != nil { + return nil, err + } + + // Custom wallets without a FeeEstimator will default to any enabled + // external fee estimator. + if cfg.FeeEstimator == nil { + cfg.FeeEstimator = noLocalFeeRate + } + + btc, err := newUnconnectedWallet(cfg, walletCfg) + if err != nil { + return nil, err + } + + customWallet, err := walletConstructor(cfg.WalletCFG.Settings, cfg.ChainParams) + if err != nil { + return nil, err + } + btc.setNode(customWallet) + + w := &ExchangeWalletCustom{ + intermediaryWallet: &intermediaryWallet{ + baseWallet: btc, + txFeeEstimator: customWallet, + tipRedeemer: customWallet, + }, + authAddOn: &authAddOn{customWallet}, + } + w.prepareRedemptionFinder() + return w, nil +} + // OpenSPVWallet opens the previously created native SPV wallet. func OpenSPVWallet(cfg *BTCCloneCFG, walletConstructor BTCWalletConstructor) (*ExchangeWalletSPV, error) { walletCfg := new(WalletConfig) @@ -1394,6 +1437,8 @@ func OpenSPVWallet(cfg *BTCCloneCFG, walletConstructor BTCWalletConstructor) (*E spvw := &spvWallet{ chainParams: cfg.ChainParams, cfg: walletCfg, + acctNum: defaultAcctNum, + acctName: defaultAcctName, dir: filepath.Join(cfg.WalletCFG.DataDir, cfg.ChainParams.Name), log: cfg.Logger.SubLogger("SPV"), tipChan: make(chan *BlockVector, 8), @@ -1404,9 +1449,6 @@ func OpenSPVWallet(cfg *BTCCloneCFG, walletConstructor BTCWalletConstructor) (*E spvw.wallet = walletConstructor(spvw.dir, spvw.cfg, spvw.chainParams, spvw.log) btc.setNode(spvw) - // Set account number for easy reference. - spvw.acctNum = spvw.wallet.AccountInfo().AccountNumber - w := &ExchangeWalletSPV{ intermediaryWallet: &intermediaryWallet{ baseWallet: btc, @@ -1429,13 +1471,13 @@ func (btc *baseWallet) setNode(node Wallet) { return orderEnough(val, lots, maxFeeRate, btc.initTxSizeBase, btc.initTxSize, btc.segwit, reportChange) }, func() ([]*ListUnspentResult, error) { // list - return node.listUnspent() + return node.ListUnspent() }, func(unlock bool, ops []*Output) error { // lock - return node.lockUnspent(unlock, ops) + return node.LockUnspent(unlock, ops) }, func() ([]*RPCOutpoint, error) { // listLocked - return node.listLockUnspent() + return node.ListLockUnspent() }, func(txHash *chainhash.Hash, vout uint32) (*wire.TxOut, error) { txRaw, _, err := btc.rawWalletTx(txHash) @@ -1462,16 +1504,16 @@ func (btc *baseWallet) setNode(node Wallet) { func (btc *intermediaryWallet) prepareRedemptionFinder() { btc.rf = NewRedemptionFinder( btc.log, - btc.tipRedeemer.getWalletTransaction, - btc.tipRedeemer.getBlockHeight, - btc.tipRedeemer.getBlock, - btc.tipRedeemer.getBlockHeader, + btc.tipRedeemer.GetWalletTransaction, + btc.tipRedeemer.GetBlockHeight, + btc.tipRedeemer.GetBlock, + btc.tipRedeemer.GetBlockHeader, btc.hashTx, btc.deserializeTx, - btc.tipRedeemer.getBestBlockHeight, - btc.tipRedeemer.searchBlockForRedemptions, - btc.tipRedeemer.getBlockHash, - btc.tipRedeemer.findRedemptionsInMempool, + btc.tipRedeemer.GetBestBlockHeight, + btc.tipRedeemer.SearchBlockForRedemptions, + btc.tipRedeemer.GetBlockHash, + btc.tipRedeemer.FindRedemptionsInMempool, ) } @@ -1526,7 +1568,7 @@ func (btc *baseWallet) findExistingAddressBasedTxHistoryDB() (string, error) { func (btc *baseWallet) startTxHistoryDB(ctx context.Context) (*sync.WaitGroup, error) { var dbPath string - fingerPrint, err := btc.node.fingerprint() + fingerPrint, err := btc.node.Fingerprint() if err == nil && fingerPrint != "" { dbPath = btc.txHistoryDBPath(fingerPrint) } @@ -1595,12 +1637,12 @@ func (btc *baseWallet) startTxHistoryDB(ctx context.Context) (*sync.WaitGroup, e func (btc *baseWallet) connect(ctx context.Context) (*sync.WaitGroup, error) { btc.ctx = ctx var wg sync.WaitGroup - if err := btc.node.connect(ctx, &wg); err != nil { + if err := btc.node.Connect(ctx, &wg); err != nil { return nil, err } // Initialize the best block. - bestBlockHdr, err := btc.node.getBestBlockHeader() + bestBlockHdr, err := btc.node.GetBestBlockHeader() if err != nil { return nil, fmt.Errorf("error initializing best block for %s: %w", btc.symbol, err) } @@ -1678,7 +1720,7 @@ func (btc *intermediaryWallet) Connect(ctx context.Context) (*sync.WaitGroup, er // Reconfigure attempts to reconfigure the wallet. func (btc *baseWallet) Reconfigure(ctx context.Context, cfg *asset.WalletConfig, currentAddress string) (restart bool, err error) { // See what the node says. - restart, err = btc.node.reconfigure(cfg, currentAddress) + restart, err = btc.node.Reconfigure(cfg, currentAddress) if err != nil { return false, err } @@ -1739,13 +1781,13 @@ func (r *GetBlockchainInfoResult) Syncing() bool { // SyncStatus is information about the blockchain sync status. func (btc *baseWallet) SyncStatus() (*asset.SyncStatus, error) { - ss, err := btc.node.syncStatus() + ss, err := btc.node.SyncStatus() if err != nil { return nil, err } ss.StartingBlocks = uint64(atomic.LoadInt64(&btc.tipAtConnect)) if ss.Synced { - numPeers, err := btc.node.peerCount() + numPeers, err := btc.node.PeerCount() if err != nil { return nil, err } @@ -1761,7 +1803,7 @@ func (btc *baseWallet) OwnsDepositAddress(address string) (bool, error) { if err != nil { return false, err } - return btc.node.ownsAddress(addr) + return btc.node.OwnsAddress(addr) } func (btc *baseWallet) balance() (*asset.Balance, error) { @@ -1775,7 +1817,7 @@ func (btc *baseWallet) balance() (*asset.Balance, error) { if btc.useLegacyBalance { return btc.legacyBalance() } - balances, err := btc.node.balances() + balances, err := btc.node.Balances() if err != nil { return nil, err } @@ -2116,7 +2158,7 @@ func (btc *baseWallet) PreSwap(req *asset.PreSwapForm) (*asset.PreSwap, error) { Key: swapFeeBumpKey, DisplayName: "Faster Swaps", Description: desc, - DefaultValue: 1.0, + DefaultValue: "1.0", }, XYRange: &asset.XYRange{ Start: asset.XYRangePoint{ @@ -2182,7 +2224,7 @@ func (btc *baseWallet) splitOption(req *asset.PreSwapForm, utxos []*CompositeUTX Key: splitKey, DisplayName: "Pre-size Funds", IsBoolean: true, - DefaultValue: btc.useSplitTx(), // not nil interface + DefaultValue: strconv.FormatBool(btc.useSplitTx()), // not nil interface ShowByDefault: true, }, Boolean: &asset.BooleanConfig{}, @@ -2208,7 +2250,7 @@ func (btc *baseWallet) splitOption(req *asset.PreSwapForm, utxos []*CompositeUTX opt.Boolean.Reason = fmt.Sprintf("avoids no %s overlock for this order (ignored)", symbol) opt.Description = fmt.Sprintf("A split transaction for this order avoids no %s overlock, "+ "but adds additional fees.", symbol) - opt.DefaultValue = false + opt.DefaultValue = "false" return opt // not enabled by default, but explain why } @@ -2363,7 +2405,7 @@ func (btc *baseWallet) preRedeem(numLots, feeSuggestion uint64, options map[stri Key: redeemFeeBumpFee, DisplayName: "Change Redemption Fees", Description: "Bump the redemption transaction fees up to 2x for faster confirmation of your redemption transaction.", - DefaultValue: 1.0, + DefaultValue: "1.0", }, XYRange: &asset.XYRange{ Start: asset.XYRangePoint{ @@ -2589,7 +2631,7 @@ func (btc *baseWallet) submitMultiSplitTx(fundingCoins asset.Coins, spents []*Ou var success bool defer func() { if !success { - btc.node.lockUnspent(true, spents) + btc.node.LockUnspent(true, spents) } }() @@ -2604,7 +2646,7 @@ func (btc *baseWallet) submitMultiSplitTx(fundingCoins asset.Coins, spents []*Ou outputAddresses := make([]btcutil.Address, len(orders)) for i, req := range requiredForOrders { - outputAddr, err := btc.node.externalAddress() + outputAddr, err := btc.node.ExternalAddress() if err != nil { return nil, 0, err } @@ -2616,7 +2658,7 @@ func (btc *baseWallet) submitMultiSplitTx(fundingCoins asset.Coins, spents []*Ou baseTx.AddTxOut(wire.NewTxOut(int64(req), script)) } - changeAddr, err := btc.node.changeAddress() + changeAddr, err := btc.node.ChangeAddress() if err != nil { return nil, 0, err } @@ -2640,7 +2682,7 @@ func (btc *baseWallet) submitMultiSplitTx(fundingCoins asset.Coins, spents []*Ou } } btc.cm.LockUTXOs(locks) - btc.node.lockUnspent(false, ops) + btc.node.LockUnspent(false, ops) var totalOut uint64 for _, txOut := range tx.TxOut { @@ -2774,7 +2816,7 @@ func (btc *baseWallet) fundMultiWithSplit(keep, maxLock uint64, values []*asset. } btc.cm.LockUTXOs(locks) - btc.node.lockUnspent(false, spents) + btc.node.LockUnspent(false, spents) return coins, redeemScripts, splitFees, nil } @@ -2792,7 +2834,7 @@ func (btc *baseWallet) fundMulti(maxLock uint64, values []*asset.MultiOrderValue } if len(coins) == len(values) || !allowSplit { btc.cm.LockOutputsMap(fundingCoins) - btc.node.lockUnspent(false, spents) + btc.node.LockUnspent(false, spents) return coins, redeemScripts, 0, nil } @@ -2827,7 +2869,7 @@ func (btc *baseWallet) split(value uint64, lots uint64, outputs []*Output, input return } btc.cm.LockOutputsMap(fundingCoins) - err = btc.node.lockUnspent(false, outputs) + err = btc.node.LockUnspent(false, outputs) if err != nil { btc.log.Errorf("error locking unspent outputs: %v", err) } @@ -2855,7 +2897,7 @@ func (btc *baseWallet) split(value uint64, lots uint64, outputs []*Output, input return coins, false, 0, nil // err==nil records and locks the provided fundingCoins in defer } - addr, err := btc.node.externalAddress() + addr, err := btc.node.ExternalAddress() if err != nil { return nil, false, 0, fmt.Errorf("error creating split transaction address: %w", err) } @@ -2874,7 +2916,7 @@ func (btc *baseWallet) split(value uint64, lots uint64, outputs []*Output, input baseTx.AddTxOut(wire.NewTxOut(int64(reqFunds), splitScript)) if extraOutput > 0 { - addr, err := btc.node.changeAddress() + addr, err := btc.node.ChangeAddress() if err != nil { return nil, false, 0, fmt.Errorf("error creating split transaction address: %w", err) } @@ -2886,7 +2928,7 @@ func (btc *baseWallet) split(value uint64, lots uint64, outputs []*Output, input } // Grab a change address. - changeAddr, err := btc.node.changeAddress() + changeAddr, err := btc.node.ChangeAddress() if err != nil { return nil, false, 0, fmt.Errorf("error creating change address: %w", err) } @@ -2921,7 +2963,7 @@ func (btc *baseWallet) split(value uint64, lots uint64, outputs []*Output, input // Unlock spent coins returnErr := btc.ReturnCoins(coins) if returnErr != nil { - btc.log.Errorf("error unlocking spent coins: %v", err) + btc.log.Errorf("error unlocking spent coins: %v", returnErr) } btc.log.Infof("Funding %s %s order with split output coin %v from original coins %v", @@ -2971,7 +3013,7 @@ func (btc *baseWallet) rawWalletTx(hash *chainhash.Hash) ([]byte, uint32, error) // fallback to getWalletTransaction } - tx, err := btc.node.getWalletTransaction(hash) + tx, err := btc.node.GetWalletTransaction(hash) if err != nil { return nil, 0, err } @@ -2994,18 +3036,18 @@ type authAddOn struct { // the password for the underlying bitcoind wallet which will also be unlocked. // It implements asset.authenticator. func (a *authAddOn) Unlock(pw []byte) error { - return a.w.walletUnlock(pw) + return a.w.WalletUnlock(pw) } // Lock locks the underlying bitcoind wallet. It implements asset.authenticator. func (a *authAddOn) Lock() error { - return a.w.walletLock() + return a.w.WalletLock() } // Locked will be true if the wallet is currently locked. It implements // asset.authenticator. func (a *authAddOn) Locked() bool { - return a.w.locked() + return a.w.Locked() } func (btc *baseWallet) addInputsToTx(tx *wire.MsgTx, coins asset.Coins) (uint64, []OutPoint, error) { @@ -3041,7 +3083,7 @@ func (btc *baseWallet) fundedTx(coins asset.Coins) (*wire.MsgTx, uint64, []OutPo // lookupWalletTxOutput looks up the value of a transaction output that is // spandable by this wallet, and creates an output. func (btc *baseWallet) lookupWalletTxOutput(txHash *chainhash.Hash, vout uint32) (*Output, error) { - getTxResult, err := btc.node.getWalletTransaction(txHash) + getTxResult, err := btc.node.GetWalletTransaction(txHash) if err != nil { return nil, err } @@ -3069,7 +3111,7 @@ func (btc *baseWallet) getTransactions(coins []dex.Bytes) ([]*GetTransactionResu if err != nil { return nil, err } - getTxRes, err := btc.node.getWalletTransaction(txHash) + getTxRes, err := btc.node.GetWalletTransaction(txHash) if err != nil { return nil, err } @@ -3087,7 +3129,7 @@ func (btc *baseWallet) getTxFee(tx *wire.MsgTx) (uint64, error) { } for _, txIn := range tx.TxIn { - prevTx, err := btc.node.getWalletTransaction(&txIn.PreviousOutPoint.Hash) + prevTx, err := btc.node.GetWalletTransaction(&txIn.PreviousOutPoint.Hash) if err != nil { return 0, err } @@ -3157,7 +3199,7 @@ func (btc *baseWallet) additionalFeesRequired(txs []*GetTransactionResult, newFe // changeCanBeAccelerated returns nil if the change can be accelerated, // otherwise it returns an error containing the reason why it cannot. func (btc *baseWallet) changeCanBeAccelerated(change *Output, remainingSwaps bool) error { - lockedUtxos, err := btc.node.listLockUnspent() + lockedUtxos, err := btc.node.ListLockUnspent() if err != nil { return err } @@ -3173,7 +3215,7 @@ func (btc *baseWallet) changeCanBeAccelerated(change *Output, remainingSwaps boo } } - utxos, err := btc.node.listUnspent() + utxos, err := btc.node.ListUnspent() if err != nil { return err } @@ -3267,7 +3309,7 @@ func (btc *baseWallet) signedAccelerationTx(previousTxs []*GetTransactionResult, return makeError(err) } - addr, err := btc.node.externalAddress() + addr, err := btc.node.ExternalAddress() if err != nil { return makeError(fmt.Errorf("error creating change address: %w", err)) } @@ -3364,7 +3406,7 @@ func accelerateOrder(btc *baseWallet, swapCoins, accelerationCoins []dex.Bytes, // changeCanBeAccelerated would have returned an error since this means // that the change was locked by another order. if requiredForRemainingSwaps > 0 { - err = btc.node.lockUnspent(false, []*Output{newChange}) + err = btc.node.LockUnspent(false, []*Output{newChange}) if err != nil { // The transaction is already broadcasted, so don't fail now. btc.log.Errorf("failed to lock change output: %v", err) @@ -3806,7 +3848,7 @@ func (btc *baseWallet) Swap(swaps *asset.Swaps) ([]asset.Receipt, asset.Coin, ui } // Grab a change address. - changeAddr, err := btc.node.changeAddress() + changeAddr, err := btc.node.ChangeAddress() if err != nil { return nil, nil, 0, fmt.Errorf("error creating change address: %w", err) } @@ -3870,7 +3912,7 @@ func (btc *baseWallet) Swap(swaps *asset.Swaps) ([]asset.Receipt, asset.Coin, ui if change != nil && swaps.LockChange { // Lock the change output btc.log.Debugf("locking change coin %s", change) - err = btc.node.lockUnspent(false, []*Output{change}) + err = btc.node.LockUnspent(false, []*Output{change}) if err != nil { // The swap transaction is already broadcasted, so don't fail now. btc.log.Errorf("failed to lock change output: %v", err) @@ -3974,7 +4016,7 @@ func (btc *baseWallet) Redeem(form *asset.RedeemForm) ([]dex.Bytes, asset.Coin, } // Send the funds back to the exchange wallet. - redeemAddr, err := btc.node.externalAddress() + redeemAddr, err := btc.node.ExternalAddress() if err != nil { return nil, nil, 0, fmt.Errorf("error getting new address from the wallet: %w", err) } @@ -4076,7 +4118,7 @@ func (btc *baseWallet) SignMessage(coin asset.Coin, msg dex.Bytes) (pubkeys, sig if utxo == nil { return nil, nil, fmt.Errorf("no utxo found for %s", op) } - privKey, err := btc.node.privKeyForAddress(utxo.Address) + privKey, err := btc.node.PrivKeyForAddress(utxo.Address) if err != nil { return nil, nil, err } @@ -4120,7 +4162,7 @@ func (btc *baseWallet) AuditContract(coinID, contract, txData dex.Bytes, rebroad if len(txData) == 0 { // Fall back to gettxout, but we won't have the tx to rebroadcast. pkScript, _ := btc.scriptHashScript(contract) // pkScript and since time are unused if full node - txOut, _, err = btc.node.getTxOut(txHash, vout, pkScript, time.Now().Add(-ContractSearchLimit)) + txOut, _, err = btc.node.GetTxOut(txHash, vout, pkScript, time.Now().Add(-ContractSearchLimit)) if err != nil || txOut == nil { return nil, fmt.Errorf("error finding unspent contract: %s:%d : %w", txHash, vout, err) } @@ -4175,7 +4217,7 @@ func (btc *baseWallet) AuditContract(coinID, contract, txData dex.Bytes, rebroad // and does not affect the audit result. if rebroadcast && tx != nil { go func() { - if hashSent, err := btc.node.sendRawTransaction(tx); err != nil { + if hashSent, err := btc.node.SendRawTransaction(tx); err != nil { btc.log.Debugf("Rebroadcasting counterparty contract %v (THIS MAY BE NORMAL): %v", txHash, err) } else if !hashSent.IsEqual(txHash) { btc.log.Errorf("Counterparty contract %v was rebroadcast as %v!", txHash, hashSent) @@ -4201,7 +4243,7 @@ func (btc *baseWallet) AuditContract(coinID, contract, txData dex.Bytes, rebroad // LockTimeExpired returns true if the specified locktime has expired, making it // possible to refund the locked coins. func (btc *baseWallet) LockTimeExpired(_ context.Context, lockTime time.Time) (bool, error) { - medianTime, err := btc.node.medianTime() // TODO: pass ctx + medianTime, err := btc.node.MedianTime() // TODO: pass ctx if err != nil { return false, fmt.Errorf("error getting median time: %w", err) } @@ -4263,7 +4305,7 @@ func (btc *baseWallet) Refund(coinID, contract dex.Bytes, feeRate uint64) (dex.B // the wallet tx though and used for the spender search, while not passing // a script here to ensure no attempt is made to find the output without // a limited startTime. - utxo, _, err := btc.node.getTxOut(txHash, vout, pkScript, time.Time{}) + utxo, _, err := btc.node.GetTxOut(txHash, vout, pkScript, time.Time{}) if err != nil { return nil, fmt.Errorf("error finding unspent contract: %w", err) } @@ -4329,7 +4371,7 @@ func (btc *baseWallet) refundTx(txHash *chainhash.Hash, vout uint32, contract de return nil, fmt.Errorf("refund tx not worth the fees") } if refundAddr == nil { - refundAddr, err = btc.node.externalAddress() + refundAddr, err = btc.node.ExternalAddress() if err != nil { return nil, fmt.Errorf("error getting new address from the wallet: %w", err) } @@ -4374,7 +4416,7 @@ func (btc *baseWallet) refundTx(txHash *chainhash.Hash, vout uint32, contract de // DepositAddress returns an address for depositing funds into the // exchange wallet. func (btc *baseWallet) DepositAddress() (string, error) { - addr, err := btc.node.externalAddress() + addr, err := btc.node.ExternalAddress() if err != nil { return "", err } @@ -4382,14 +4424,14 @@ func (btc *baseWallet) DepositAddress() (string, error) { if err != nil { return "", err } - if btc.node.locked() { + if btc.node.Locked() { return addrStr, nil } // If the wallet is unlocked, be extra cautious and ensure the wallet gave // us an address for which we can retrieve the private keys, regardless of // what ownsAddress would say. - priv, err := btc.node.privKeyForAddress(addrStr) + priv, err := btc.node.PrivKeyForAddress(addrStr) if err != nil { return "", fmt.Errorf("private key unavailable for address %v: %w", addrStr, err) } @@ -4457,6 +4499,11 @@ func (btc *baseWallet) NewAddress() (string, error) { return btc.DepositAddress() } +// AddressUsed checks if a wallet address has been used. +func (btc *baseWallet) AddressUsed(addrStr string) (bool, error) { + return btc.node.AddressUsed(addrStr) +} + // Withdraw withdraws funds to the specified address. Fees are subtracted from // the value. feeRate is in units of sats/byte. // Withdraw satisfies asset.Withdrawer. @@ -4486,7 +4533,7 @@ func (btc *baseWallet) SendTransaction(rawTx []byte) ([]byte, error) { return nil, err } - txHash, err := btc.node.sendRawTransaction(msgTx) + txHash, err := btc.node.SendRawTransaction(msgTx) if err != nil { return nil, err } @@ -4527,7 +4574,7 @@ func (btc *baseWallet) send(address string, val uint64, feeRate uint64, subtract baseSize += dexbtc.P2PKHOutputSize * 2 } - enough := sendEnough(val, feeRate, subtract, uint64(baseSize), btc.segwit, true) + enough := SendEnough(val, feeRate, subtract, uint64(baseSize), btc.segwit, true) minConfs := uint32(0) coins, _, _, _, inputsSize, _, err := btc.cm.Fund(btc.bondReserves.Load(), minConfs, false, enough) if err != nil { @@ -4548,7 +4595,7 @@ func (btc *baseWallet) send(address string, val uint64, feeRate uint64, subtract } fundedTx.AddTxOut(wire.NewTxOut(int64(toSend), pay2script)) - changeAddr, err := btc.node.changeAddress() + changeAddr, err := btc.node.ChangeAddress() if err != nil { return nil, 0, 0, fmt.Errorf("error creating change address: %w", err) } @@ -4597,7 +4644,7 @@ func (btc *baseWallet) SwapConfirmations(_ context.Context, id dex.Bytes, contra if err != nil { return 0, false, err } - return btc.node.swapConfirmations(txHash, vout, pkScript, startTime) + return btc.node.SwapConfirmations(txHash, vout, pkScript, startTime) } // RegFeeConfirmations gets the number of confirmations for the specified output @@ -4613,7 +4660,7 @@ func (btc *baseWallet) RegFeeConfirmations(_ context.Context, id dex.Bytes) (con } func (btc *baseWallet) checkPeers() { - numPeers, err := btc.node.peerCount() + numPeers, err := btc.node.PeerCount() if err != nil { prevPeer := atomic.SwapUint32(&btc.lastPeerCount, 0) if prevPeer != 0 { @@ -4671,7 +4718,7 @@ func (btc *intermediaryWallet) watchBlocks(ctx context.Context) { // Poll for the block. If the wallet offers tip reports, delay reporting // the tip to give the wallet a moment to request and scan block data. case <-ticker.C: - newTipHdr, err := btc.node.getBestBlockHeader() + newTipHdr, err := btc.node.GetBestBlockHeader() if err != nil { btc.log.Errorf("failed to get best block header from %s node: %v", btc.symbol, err) continue @@ -4708,7 +4755,7 @@ func (btc *intermediaryWallet) watchBlocks(ctx context.Context) { queuedBlock.queue.Stop() } blockAllowance := walletBlockAllowance - syncStatus, err := btc.node.syncStatus() + syncStatus, err := btc.node.SyncStatus() if err != nil { btc.log.Errorf("Error retrieving sync status before queuing polled block: %v", err) } else if !syncStatus.Synced { @@ -4791,7 +4838,7 @@ func (btc *baseWallet) signTxAndAddChange(baseTx *wire.MsgTx, addr btcutil.Addre // Sign the transaction to get an initial size estimate and calculate whether // a change output would be dust. sigCycles := 1 - msgTx, err := btc.node.signTx(baseTx) + msgTx, err := btc.node.SignTx(baseTx) if err != nil { return makeErr("signing error: %v, raw tx: %x", err, btc.wireBytes(baseTx)) } @@ -4836,7 +4883,7 @@ func (btc *baseWallet) signTxAndAddChange(baseTx *wire.MsgTx, addr btcutil.Addre for { // Sign the transaction with the change output and compute new size. sigCycles++ - msgTx, err = btc.node.signTx(baseTx) + msgTx, err = btc.node.SignTx(baseTx) if err != nil { return makeErr("signing error: %v, raw tx: %x", err, btc.wireBytes(baseTx)) } @@ -4894,7 +4941,7 @@ func (btc *baseWallet) signTxAndAddChange(baseTx *wire.MsgTx, addr btcutil.Addre } func (btc *baseWallet) broadcastTx(signedTx *wire.MsgTx) (*chainhash.Hash, error) { - txHash, err := btc.node.sendRawTransaction(signedTx) + txHash, err := btc.node.SendRawTransaction(signedTx) if err != nil { return nil, fmt.Errorf("sendrawtx error: %v, raw tx: %x", err, btc.wireBytes(signedTx)) } @@ -4914,7 +4961,7 @@ func (btc *baseWallet) createSig(tx *wire.MsgTx, idx int, pkScript []byte, addr return nil, nil, err } - privKey, err := btc.node.privKeyForAddress(addrStr) + privKey, err := btc.node.PrivKeyForAddress(addrStr) if err != nil { return nil, nil, err } @@ -4936,7 +4983,7 @@ func (btc *baseWallet) createWitnessSig(tx *wire.MsgTx, idx int, pkScript []byte if err != nil { return nil, nil, err } - privKey, err := btc.node.privKeyForAddress(addrStr) + privKey, err := btc.node.PrivKeyForAddress(addrStr) if err != nil { return nil, nil, err } @@ -4989,7 +5036,7 @@ func (btc *intermediaryWallet) EstimateSendTxFee(address string, sendAmount, fee tx := wire.NewMsgTx(btc.txVersion()) tx.AddTxOut(wireOP) - fee, err = btc.txFeeEstimator.estimateSendTxFee(tx, btc.feeRateWithFallback(feeRate), subtract) + fee, err = btc.txFeeEstimator.EstimateSendTxFee(tx, btc.feeRateWithFallback(feeRate), subtract) if err != nil { return 0, false, err } @@ -5113,7 +5160,7 @@ func (btc *baseWallet) MakeBondTx(ver uint16, amt, feeRate uint64, lockTime time } const subtract = false - coins, _, _, _, _, _, err := btc.cm.Fund(0, 0, true, sendEnough(amt, feeRate, subtract, uint64(baseSize), btc.segwit, true)) + coins, _, _, _, _, _, err := btc.cm.Fund(0, 0, true, SendEnough(amt, feeRate, subtract, uint64(baseSize), btc.segwit, true)) if err != nil { return nil, nil, fmt.Errorf("failed to fund bond tx: %w", err) } @@ -5142,7 +5189,7 @@ func (btc *baseWallet) MakeBondTx(ver uint16, amt, feeRate uint64, lockTime time return nil, nil, fmt.Errorf("failed to add inputs to bond tx: %w", err) } - changeAddr, err := btc.node.changeAddress() + changeAddr, err := btc.node.ChangeAddress() if err != nil { return nil, nil, fmt.Errorf("error creating change address: %w", err) } @@ -5237,7 +5284,7 @@ func (btc *baseWallet) makeBondRefundTxV0(txid *chainhash.Hash, vout uint32, amt } // Add the refund output. - redeemAddr, err := btc.node.externalAddress() + redeemAddr, err := btc.node.ExternalAddress() if err != nil { return nil, fmt.Errorf("error creating change address: %w", err) } @@ -5299,7 +5346,7 @@ func (btc *baseWallet) RefundBond(ctx context.Context, ver uint16, coinID, scrip return nil, err } - _, err = btc.node.sendRawTransaction(msgTx) + _, err = btc.node.SendRawTransaction(msgTx) if err != nil { return nil, fmt.Errorf("error sending refund bond transaction: %w", err) } @@ -5379,7 +5426,7 @@ func (btc *baseWallet) FindBond(_ context.Context, coinID []byte, _ time.Time) ( // If the bond was funded by this wallet or had a change output paying // to this wallet, it should be found here. - tx, err := btc.node.getWalletTransaction(txHash) + tx, err := btc.node.GetWalletTransaction(txHash) if err != nil { return nil, fmt.Errorf("did not find the bond output %v:%d", txHash, vout) } @@ -5405,7 +5452,7 @@ func (btc *intermediaryWallet) FindBond( // If the bond was funded by this wallet or had a change output paying // to this wallet, it should be found here. - tx, err := btc.node.getWalletTransaction(txHash) + tx, err := btc.node.GetWalletTransaction(txHash) if err == nil { msgTx, err := btc.deserializeTx(tx.Bytes) if err != nil { @@ -5421,7 +5468,7 @@ func (btc *intermediaryWallet) FindBond( // restored from seed. This is not a problem. However, we are unable to // use filters because we don't know any output scripts. Brute force // finding the transaction. - bestBlockHdr, err := btc.node.getBestBlockHeader() + bestBlockHdr, err := btc.node.GetBestBlockHeader() if err != nil { return nil, fmt.Errorf("unable to get best hash: %v", err) } @@ -5430,15 +5477,16 @@ func (btc *intermediaryWallet) FindBond( return nil, fmt.Errorf("invalid best block hash from %s node: %v", btc.symbol, err) } var ( - blk *wire.MsgBlock - msgTx *wire.MsgTx + blk *wire.MsgBlock + msgTx *wire.MsgTx + zeroHash = chainhash.Hash{} ) out: for { if err := ctx.Err(); err != nil { return nil, fmt.Errorf("bond search stopped: %w", err) } - blk, err = btc.tipRedeemer.getBlock(*blockHash) + blk, err = btc.tipRedeemer.GetBlock(*blockHash) if err != nil { return nil, fmt.Errorf("error retrieving block %s: %w", blockHash, err) } @@ -5453,7 +5501,7 @@ out: } } blockHash = &blk.Header.PrevBlock - if blockHash == nil { + if blockHash == nil || *blockHash == zeroHash /* genesis */ { return nil, fmt.Errorf("did not find the bond output %v:%d", txHash, vout) } } @@ -5745,7 +5793,7 @@ func (btc *baseWallet) idUnknownTx(tx *ListTransactionsResult) (*asset.WalletTra } addr := addrs[0] - owns, err := btc.node.ownsAddress(addr) + owns, err := btc.node.OwnsAddress(addr) if err != nil { btc.log.Errorf("ownsAddress error: %w", err) return false @@ -5789,7 +5837,7 @@ func (btc *baseWallet) idUnknownTx(tx *ListTransactionsResult) (*asset.WalletTra } addr := addrs[0] - owns, err := btc.node.ownsAddress(addr) + owns, err := btc.node.OwnsAddress(addr) if err != nil { btc.log.Errorf("ownsAddress error: %w", err) continue @@ -5817,7 +5865,7 @@ func (btc *baseWallet) idUnknownTx(tx *ListTransactionsResult) (*asset.WalletTra } addr := addrs[0] - owns, err := btc.node.ownsAddress(addr) + owns, err := btc.node.OwnsAddress(addr) if err != nil { btc.log.Errorf("ownsAddress error: %w", err) continue @@ -5859,6 +5907,10 @@ func (btc *baseWallet) addUnknownTransactionsToHistory(tip uint64) { return } + if btc.noListTxHistory { + return + } + const blockQueryBuffer = 3 var blockToQuery uint64 lastQuery := btc.receiveTxLastQuery.Load() @@ -5871,7 +5923,7 @@ func (btc *baseWallet) addUnknownTransactionsToHistory(tip uint64) { blockToQuery = tip - blockQueryBuffer } - txs, err := btc.node.listTransactionsSinceBlock(int32(blockToQuery)) + txs, err := btc.node.ListTransactionsSinceBlock(int32(blockToQuery)) if err != nil { btc.log.Errorf("Error listing transactions since block %d: %v", blockToQuery, err) return @@ -5959,7 +6011,7 @@ func (btc *intermediaryWallet) syncTxHistory(tip uint64) { return } - gtr, err := btc.node.getWalletTransaction(&txHash) + gtr, err := btc.node.GetWalletTransaction(&txHash) if errors.Is(err, asset.CoinNotFoundError) { err = txHistoryDB.RemoveTx(txHash.String()) if err == nil || errors.Is(err, asset.CoinNotFoundError) { @@ -5985,7 +6037,7 @@ func (btc *intermediaryWallet) syncTxHistory(tip uint64) { btc.log.Errorf("Error decoding block hash %s: %v", gtr.BlockHash, err) return } - blockHeight, err := btc.tipRedeemer.getBlockHeight(blockHash) + blockHeight, err := btc.tipRedeemer.GetBlockHeight(blockHash) if err != nil { btc.log.Errorf("Error getting block height for %s: %v", blockHash, err) return @@ -6066,7 +6118,7 @@ func (btc *intermediaryWallet) WalletTransaction(ctx context.Context, txID strin if err != nil { return nil, fmt.Errorf("error decoding txid %s: %w", txID, err) } - gtr, err := btc.node.getWalletTransaction(txHash) + gtr, err := btc.node.GetWalletTransaction(txHash) if err != nil { return nil, fmt.Errorf("error getting transaction %s: %w", txID, err) } @@ -6077,7 +6129,7 @@ func (btc *intermediaryWallet) WalletTransaction(ctx context.Context, txID strin if err != nil { return nil, fmt.Errorf("error decoding block hash %s: %w", gtr.BlockHash, err) } - height, err := btc.tipRedeemer.getBlockHeight(blockHash) + height, err := btc.tipRedeemer.GetBlockHeight(blockHash) if err != nil { return nil, fmt.Errorf("error getting block height for %s: %w", blockHash, err) } @@ -6125,7 +6177,7 @@ func (btc *intermediaryWallet) TxHistory(n int, refID *string, past bool) ([]*as // lockedSats is the total value of locked outputs, as locked with LockUnspent. func (btc *baseWallet) lockedSats() (uint64, error) { - lockedOutpoints, err := btc.node.listLockUnspent() + lockedOutpoints, err := btc.node.ListLockUnspent() if err != nil { return 0, err } @@ -6141,7 +6193,7 @@ func (btc *baseWallet) lockedSats() (uint64, error) { sum += utxo.Amount continue } - tx, err := btc.node.getWalletTransaction(txHash) + tx, err := btc.node.GetWalletTransaction(txHash) if err != nil { return 0, err } @@ -6169,7 +6221,7 @@ func (btc *baseWallet) wireBytes(tx *wire.MsgTx) []byte { // GetBestBlockHeight is exported for use by clone wallets. Not part of the // asset.Wallet interface. func (btc *baseWallet) GetBestBlockHeight() (int32, error) { - return btc.node.getBestBlockHeight() + return btc.node.GetBestBlockHeight() } // Convert the BTC value to satoshi. @@ -6378,7 +6430,7 @@ func (btc *baseWallet) ConfirmRedemption(coinID dex.Bytes, redemption *asset.Red return nil, err } - utxo, _, err := btc.node.getTxOut(swapHash, vout, pkScript, time.Now().Add(-ContractSearchLimit)) + utxo, _, err := btc.node.GetTxOut(swapHash, vout, pkScript, time.Now().Add(-ContractSearchLimit)) if err != nil { return nil, fmt.Errorf("error finding unspent contract %s with swap hash %v vout %d: %w", redemption.Spends.Coin.ID(), swapHash, vout, err) } diff --git a/client/asset/btc/btc_test.go b/client/asset/btc/btc_test.go index b7d27b3404..92f70e168a 100644 --- a/client/asset/btc/btc_test.go +++ b/client/asset/btc/btc_test.go @@ -33,6 +33,7 @@ import ( "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" + "github.com/btcsuite/btcwallet/wallet" ) var ( @@ -79,34 +80,6 @@ func randBytes(l int) []byte { return b } -func signFuncRaw(t *testing.T, params []json.RawMessage, sizeTweak int, sigComplete, segwit bool) (json.RawMessage, error) { - signTxRes := SignTxResult{ - Complete: sigComplete, - } - var msgHex string - err := json.Unmarshal(params[0], &msgHex) - if err != nil { - t.Fatalf("error unmarshaling transaction hex: %v", err) - } - msgBytes, _ := hex.DecodeString(msgHex) - txReader := bytes.NewReader(msgBytes) - msgTx := wire.NewMsgTx(wire.TxVersion) - err = msgTx.Deserialize(txReader) - if err != nil { - t.Fatalf("error deserializing contract: %v", err) - } - - signFunc(msgTx, sizeTweak, segwit) - - buf := new(bytes.Buffer) - err = msgTx.Serialize(buf) - if err != nil { - t.Fatalf("error serializing contract: %v", err) - } - signTxRes.Hex = buf.Bytes() - return mustMarshal(signTxRes), nil -} - func signFunc(tx *wire.MsgTx, sizeTweak int, segwit bool) { // Set the sigScripts to random bytes of the correct length for spending a // p2pkh output. @@ -184,7 +157,7 @@ type testData struct { // spv fetchInputInfoTx *wire.MsgTx getCFilterScripts map[chainhash.Hash][][]byte - checkpoints map[OutPoint]*scanCheckpoint + checkpoints map[OutPoint]*ScanCheckpoint confs uint32 confsSpent bool confsErr error @@ -211,12 +184,16 @@ func newTestData() *testData { fetchInputInfoTx: dummyTx(), getCFilterScripts: make(map[chainhash.Hash][][]byte), confsErr: WalletTransactionNotFound, - checkpoints: make(map[OutPoint]*scanCheckpoint), + checkpoints: make(map[OutPoint]*ScanCheckpoint), tipChanged: make(chan asset.WalletNotification, 1), getTransactionMap: make(map[string]*GetTransactionResult), } } +func (c *testData) GetTransactions(startHeight, endHeight int32, accountName string, cancel <-chan struct{}) (*wallet.GetTransactionsResult, error) { + return nil, fmt.Errorf("not implemented") +} + func (c *testData) getBlock(blockHash chainhash.Hash) *msgBlockWithHeight { c.blockchainMtx.Lock() defer c.blockchainMtx.Unlock() @@ -548,12 +525,6 @@ func (c *testData) addRawTx(blockHeight int64, tx *wire.MsgTx) (*chainhash.Hash, return blockHash, block.msgBlock } -func (c *testData) addDBBlockForTx(txHash, blockHash *chainhash.Hash) { - c.blockchainMtx.Lock() - defer c.blockchainMtx.Unlock() - c.dbBlockForTx[*txHash] = &hashEntry{hash: *blockHash} -} - func (c *testData) getBlockAtHeight(blockHeight int64) (*chainhash.Hash, *msgBlockWithHeight) { c.blockchainMtx.RLock() defer c.blockchainMtx.RUnlock() @@ -719,7 +690,7 @@ func tNewWallet(segwit bool, walletType string) (*intermediaryWallet, *testData, panic(err.Error()) } // Initialize the best block. - bestHash, err := wallet.node.getBestBlockHash() + bestHash, err := wallet.node.GetBestBlockHash() if err != nil { shutdown() os.RemoveAll(dataDir) @@ -3747,7 +3718,6 @@ func testLockUnlock(t *testing.T, segwit bool, walletType string) { t.Fatalf("no error for walletlock rpc error") } } - } type tSenderType byte @@ -5745,7 +5715,7 @@ type tReconfigurer struct { err error } -func (r *tReconfigurer) reconfigure(walletCfg *asset.WalletConfig, currentAddress string) (restartRequired bool, err error) { +func (r *tReconfigurer) Reconfigure(walletCfg *asset.WalletConfig, currentAddress string) (restartRequired bool, err error) { return r.restart, r.err } diff --git a/client/asset/btc/coin_selection.go b/client/asset/btc/coin_selection.go index ef7da03921..e692859f1c 100644 --- a/client/asset/btc/coin_selection.go +++ b/client/asset/btc/coin_selection.go @@ -13,7 +13,7 @@ import ( dexbtc "decred.org/dcrdex/dex/networks/btc" ) -// sendEnough generates a function that can be used as the enough argument to +// SendEnough generates a function that can be used as the enough argument to // the fund method when creating transactions to send funds. If fees are to be // subtracted from the inputs, set subtract so that the required amount excludes // the transaction fee. If change from the transaction should be considered @@ -21,7 +21,7 @@ import ( // enough func will return a non-zero excess value. Otherwise, the enough func // will always return 0, leaving only unselected UTXOs to cover any required // reserves. -func sendEnough(amt, feeRate uint64, subtract bool, baseTxSize uint64, segwit, reportChange bool) EnoughFunc { +func SendEnough(amt, feeRate uint64, subtract bool, baseTxSize uint64, segwit, reportChange bool) EnoughFunc { return func(_, inputSize, sum uint64) (bool, uint64) { txFee := (baseTxSize + inputSize) * feeRate req := amt diff --git a/client/asset/btc/coinmanager.go b/client/asset/btc/coinmanager.go index 43d9e6e106..36dd5375f4 100644 --- a/client/asset/btc/coinmanager.go +++ b/client/asset/btc/coinmanager.go @@ -343,7 +343,7 @@ func (c *CoinManager) spendableUTXOs(confs uint32) ([]*CompositeUTXO, map[OutPoi return nil, nil, 0, err } - utxos, utxoMap, sum, err := convertUnspent(confs, unspents, c.chainParams) + utxos, utxoMap, sum, err := ConvertUnspent(confs, unspents, c.chainParams) if err != nil { return nil, nil, 0, err } @@ -564,7 +564,7 @@ func (c *CoinManager) LockedOutput(pt OutPoint) *UTxO { return c.lockedOutputs[pt] } -func convertUnspent(confs uint32, unspents []*ListUnspentResult, chainParams *chaincfg.Params) ([]*CompositeUTXO, map[OutPoint]*CompositeUTXO, uint64, error) { +func ConvertUnspent(confs uint32, unspents []*ListUnspentResult, chainParams *chaincfg.Params) ([]*CompositeUTXO, map[OutPoint]*CompositeUTXO, uint64, error) { sort.Slice(unspents, func(i, j int) bool { return unspents[i].Amount < unspents[j].Amount }) var sum uint64 utxos := make([]*CompositeUTXO, 0, len(unspents)) diff --git a/client/asset/btc/electrum.go b/client/asset/btc/electrum.go index feb11f239d..b266fbb119 100644 --- a/client/asset/btc/electrum.go +++ b/client/asset/btc/electrum.go @@ -76,12 +76,17 @@ func ElectrumWallet(cfg *BTCCloneCFG) (*ExchangeWalletElectrum, error) { findRedemptionQueue: make(map[OutPoint]*FindRedemptionReq), minElectrumVersion: cfg.MinElectrumVersion, } + // In (*baseWallet).feeRate, use ExchangeWalletElectrum's walletFeeRate // override for localFeeRate. No externalFeeRate is required but will be // used if eew.walletFeeRate returned an error and an externalFeeRate is // enabled. btc.localFeeRate = eew.walletFeeRate + // Firo electrum does not have "onchain_history" method as of firo + // electrum 4.1.5.3, find an alternative. + btc.noListTxHistory = cfg.Symbol == "firo" + return eew, nil } @@ -150,23 +155,17 @@ func (btc *ExchangeWalletElectrum) Connect(ctx context.Context) (*sync.WaitGroup btc.ew.wallet.SetIncludeIgnoreWarnings(true) } - // TODO: Firo electrum does not have "onchain_history" method as of firo - // electrum 4.1.5.3, find an alternative. - hasOnchainHistory := btc.symbol != "firo" - - if hasOnchainHistory { - dbWG, err := btc.startTxHistoryDB(ctx) - if err != nil { - return nil, err - } - - wg.Add(1) - go func() { - defer wg.Done() - dbWG.Wait() - }() + dbWG, err := btc.startTxHistoryDB(ctx) + if err != nil { + return nil, err } + wg.Add(1) + go func() { + defer wg.Done() + dbWG.Wait() + }() + wg.Add(1) go func() { defer wg.Done() @@ -179,16 +178,14 @@ func (btc *ExchangeWalletElectrum) Connect(ctx context.Context) (*sync.WaitGroup btc.monitorPeers(ctx) }() - if hasOnchainHistory { - wg.Add(1) - go func() { - defer wg.Done() - btc.tipMtx.RLock() - tip := btc.currentTip - btc.tipMtx.RUnlock() - go btc.syncTxHistory(uint64(tip.Height)) - }() - } + wg.Add(1) + go func() { + defer wg.Done() + btc.tipMtx.RLock() + tip := btc.currentTip + btc.tipMtx.RUnlock() + go btc.syncTxHistory(uint64(tip.Height)) + }() return wg, nil } @@ -342,7 +339,7 @@ func (btc *ExchangeWalletElectrum) watchBlocks(ctx context.Context) { defer ticker.Stop() bestBlock := func() (*BlockVector, error) { - hdr, err := btc.node.getBestBlockHeader() + hdr, err := btc.node.GetBestBlockHeader() if err != nil { return nil, fmt.Errorf("getBestBlockHeader: %v", err) } @@ -367,7 +364,7 @@ func (btc *ExchangeWalletElectrum) watchBlocks(ctx context.Context) { // only comparing heights instead of hashes, which means we might // not notice a reorg to a block at the same height, which is // unimportant because of how electrum searches for transactions. - ss, err := btc.node.syncStatus() + ss, err := btc.node.SyncStatus() if err != nil { btc.log.Errorf("failed to get sync status: %w", err) continue @@ -442,7 +439,7 @@ func (btc *ExchangeWalletElectrum) syncTxHistory(tip uint64) { return } - gtr, err := btc.node.getWalletTransaction(&txHash) + gtr, err := btc.node.GetWalletTransaction(&txHash) if errors.Is(err, asset.CoinNotFoundError) { err = txHistoryDB.RemoveTx(txHash.String()) if err == nil || errors.Is(err, asset.CoinNotFoundError) { @@ -463,9 +460,9 @@ func (btc *ExchangeWalletElectrum) syncTxHistory(tip uint64) { var updated bool if gtr.BlockHash != "" { - bestHeight, err := btc.node.getBestBlockHeight() + bestHeight, err := btc.node.GetBestBlockHeight() if err != nil { - btc.log.Errorf("getBestBlockHeader: %v", err) + btc.log.Errorf("GetBestBlockHeader: %v", err) return } // TODO: Just get the block height with the header. @@ -476,12 +473,12 @@ func (btc *ExchangeWalletElectrum) syncTxHistory(tip uint64) { btc.log.Errorf("Cannot find mined tx block number for %s", gtr.BlockHash) return } - bh, err := btc.ew.getBlockHeaderByHeight(btc.ctx, int64(blockHeight)) + bh, err := btc.ew.GetBlockHash(int64(blockHeight)) if err != nil { btc.log.Errorf("Error getting mined tx block number %s: %v", gtr.BlockHash, err) return } - if bh.BlockHash().String() == gtr.BlockHash { + if bh.String() == gtr.BlockHash { break } i++ @@ -547,6 +544,9 @@ func (btc *ExchangeWalletElectrum) WalletTransaction(ctx context.Context, txID s } txHistoryDB := btc.txDB() + if txHistoryDB == nil { + return nil, fmt.Errorf("tx database not initialized") + } tx, err := txHistoryDB.GetTx(txID) if err != nil && !errors.Is(err, asset.CoinNotFoundError) { return nil, err @@ -558,16 +558,16 @@ func (btc *ExchangeWalletElectrum) WalletTransaction(ctx context.Context, txID s return nil, fmt.Errorf("error decoding txid %s: %w", txID, err) } - gtr, err := btc.node.getWalletTransaction(txHash) + gtr, err := btc.node.GetWalletTransaction(txHash) if err != nil { return nil, fmt.Errorf("error getting transaction %s: %w", txID, err) } var blockHeight uint32 if gtr.BlockHash != "" { - bestHeight, err := btc.node.getBestBlockHeight() + bestHeight, err := btc.node.GetBestBlockHeight() if err != nil { - return nil, fmt.Errorf("getBestBlockHeader: %v", err) + return nil, fmt.Errorf("GetBestBlockHeader: %v", err) } // TODO: Just get the block height with the header. blockHeight := bestHeight - int32(gtr.Confirmations) + 1 diff --git a/client/asset/btc/electrum_client.go b/client/asset/btc/electrum_client.go index 2d266ae5da..08b3013ffe 100644 --- a/client/asset/btc/electrum_client.go +++ b/client/asset/btc/electrum_client.go @@ -206,7 +206,7 @@ func (ew *electrumWallet) connInfo(ctx context.Context, host string) (addr strin } // part of btc.Wallet interface -func (ew *electrumWallet) connect(ctx context.Context, wg *sync.WaitGroup) error { +func (ew *electrumWallet) Connect(ctx context.Context, wg *sync.WaitGroup) error { // Helper to get a host:port string and connection options for a host name. connInfo := func(host string) (addr string, srvOpts *electrum.ConnectOpts, err error) { addr, tlsConfig, err := ew.connInfo(ctx, host) @@ -260,7 +260,7 @@ func (ew *electrumWallet) connect(ctx context.Context, wg *sync.WaitGroup) error // This wallet may not be "protected", in which case we omit the password // from the requests. Detect this now and flag the wallet as unlocked. - _ = ew.walletUnlock([]byte{}) + _ = ew.WalletUnlock([]byte{}) // Start a goroutine to keep the chain client alive and on the same // ElectrumX server as the external Electrum wallet if possible. @@ -343,7 +343,7 @@ func (ew *electrumWallet) connect(ctx context.Context, wg *sync.WaitGroup) error return err } -func (ew *electrumWallet) reconfigure(cfg *asset.WalletConfig, currentAddress string) (restartRequired bool, err error) { +func (ew *electrumWallet) Reconfigure(cfg *asset.WalletConfig, currentAddress string) (restartRequired bool, err error) { // electrumWallet only handles walletTypeElectrum. if cfg.Type != walletTypeElectrum { restartRequired = true @@ -363,7 +363,7 @@ func (ew *electrumWallet) reconfigure(cfg *asset.WalletConfig, currentAddress st } // part of btc.Wallet interface -func (ew *electrumWallet) sendRawTransaction(tx *wire.MsgTx) (*chainhash.Hash, error) { +func (ew *electrumWallet) SendRawTransaction(tx *wire.MsgTx) (*chainhash.Hash, error) { b, err := serializeMsgTx(tx) if err != nil { return nil, err @@ -389,7 +389,7 @@ func (ew *electrumWallet) sendRawTransaction(tx *wire.MsgTx) (*chainhash.Hash, e prevOut := txIn.PreviousOutPoint ops[i] = &Output{Pt: NewOutPoint(&prevOut.Hash, prevOut.Index)} } - if err = ew.lockUnspent(true, ops); err != nil { + if err = ew.LockUnspent(true, ops); err != nil { ew.log.Errorf("Failed to unlock spent UTXOs: %v", err) } return hash, nil @@ -431,7 +431,7 @@ func (ew *electrumWallet) outputIsSpent(ctx context.Context, txHash *chainhash.H } // part of btc.Wallet interface -func (ew *electrumWallet) getTxOut(txHash *chainhash.Hash, vout uint32, _ []byte, _ time.Time) (*wire.TxOut, uint32, error) { +func (ew *electrumWallet) GetTxOut(txHash *chainhash.Hash, vout uint32, _ []byte, _ time.Time) (*wire.TxOut, uint32, error) { return ew.getTxOutput(ew.ctx, txHash, vout) } @@ -489,8 +489,8 @@ func (ew *electrumWallet) getBlockHeaderByHeight(ctx context.Context, height int } // part of btc.Wallet interface -func (ew *electrumWallet) medianTime() (time.Time, error) { - chainHeight, err := ew.getBestBlockHeight() +func (ew *electrumWallet) MedianTime() (time.Time, error) { + chainHeight, err := ew.GetBestBlockHeight() if err != nil { return time.Time{}, err } @@ -554,26 +554,33 @@ func (ew *electrumWallet) calcMedianTime(ctx context.Context, height int64) (tim } // part of btc.Wallet interface -func (ew *electrumWallet) getBlockHash(height int64) (*chainhash.Hash, error) { - hdr, err := ew.getBlockHeaderByHeight(ew.ctx, height) +func (ew *electrumWallet) GetBlockHash(height int64) (*chainhash.Hash, error) { + hdrStr, err := ew.chain().BlockHeader(ew.ctx, uint32(height)) if err != nil { return nil, err } - hash := hdr.BlockHash() + + fullHeader, err := hex.DecodeString(hdrStr) + if err != nil { + return nil, err + } + + hash := chainhash.DoubleHashH(fullHeader) + return &hash, nil } // part of btc.Wallet interface -func (ew *electrumWallet) getBestBlockHash() (*chainhash.Hash, error) { +func (ew *electrumWallet) GetBestBlockHash() (*chainhash.Hash, error) { inf, err := ew.wallet.GetInfo(ew.ctx) if err != nil { return nil, err } - return ew.getBlockHash(inf.SyncHeight) + return ew.GetBlockHash(inf.SyncHeight) } // part of btc.Wallet interface -func (ew *electrumWallet) getBestBlockHeight() (int32, error) { +func (ew *electrumWallet) GetBestBlockHeight() (int32, error) { inf, err := ew.wallet.GetInfo(ew.ctx) if err != nil { return 0, err @@ -582,7 +589,7 @@ func (ew *electrumWallet) getBestBlockHeight() (int32, error) { } // part of btc.Wallet interface -func (ew *electrumWallet) getBestBlockHeader() (*BlockHeader, error) { +func (ew *electrumWallet) GetBestBlockHeader() (*BlockHeader, error) { inf, err := ew.wallet.GetInfo(ew.ctx) if err != nil { return nil, err @@ -604,7 +611,7 @@ func (ew *electrumWallet) getBestBlockHeader() (*BlockHeader, error) { } // part of btc.Wallet interface -func (ew *electrumWallet) balances() (*GetBalancesResult, error) { +func (ew *electrumWallet) Balances() (*GetBalancesResult, error) { eBal, err := ew.wallet.GetBalance(ew.ctx) if err != nil { return nil, err @@ -623,12 +630,12 @@ func (ew *electrumWallet) balances() (*GetBalancesResult, error) { } // part of btc.Wallet interface -func (ew *electrumWallet) listUnspent() ([]*ListUnspentResult, error) { +func (ew *electrumWallet) ListUnspent() ([]*ListUnspentResult, error) { eUnspent, err := ew.wallet.ListUnspent(ew.ctx) if err != nil { return nil, err } - chainHeight, err := ew.getBestBlockHeight() + chainHeight, err := ew.GetBestBlockHeight() if err != nil { return nil, err } @@ -698,7 +705,7 @@ func (ew *electrumWallet) listUnspent() ([]*ListUnspentResult, error) { } // part of btc.Wallet interface -func (ew *electrumWallet) lockUnspent(unlock bool, ops []*Output) error { +func (ew *electrumWallet) LockUnspent(unlock bool, ops []*Output) error { eUnspent, err := ew.wallet.ListUnspent(ew.ctx) if err != nil { return err @@ -767,13 +774,13 @@ func (ew *electrumWallet) listLockedOutpoints() []*RPCOutpoint { } // part of btc.Wallet interface -func (ew *electrumWallet) listLockUnspent() ([]*RPCOutpoint, error) { +func (ew *electrumWallet) ListLockUnspent() ([]*RPCOutpoint, error) { return ew.listLockedOutpoints(), nil } -// externalAddress creates a fresh address beyond the default gap limit, so it +// ExternalAddress creates a fresh address beyond the default gap limit, so it // should be used immediately. Part of btc.Wallet interface. -func (ew *electrumWallet) externalAddress() (btcutil.Address, error) { +func (ew *electrumWallet) ExternalAddress() (btcutil.Address, error) { addr, err := ew.wallet.GetUnusedAddress(ew.ctx) if err != nil { return nil, err @@ -781,14 +788,14 @@ func (ew *electrumWallet) externalAddress() (btcutil.Address, error) { return ew.decodeAddr(addr, ew.chainParams) } -// changeAddress creates a fresh address beyond the default gap limit, so it +// ChangeAddress creates a fresh address beyond the default gap limit, so it // should be used immediately. Part of btc.Wallet interface. -func (ew *electrumWallet) changeAddress() (btcutil.Address, error) { - return ew.externalAddress() // sadly, cannot request internal addresses +func (ew *electrumWallet) ChangeAddress() (btcutil.Address, error) { + return ew.ExternalAddress() // sadly, cannot request internal addresses } // part of btc.Wallet interface -func (ew *electrumWallet) signTx(inTx *wire.MsgTx) (*wire.MsgTx, error) { +func (ew *electrumWallet) SignTx(inTx *wire.MsgTx) (*wire.MsgTx, error) { // If the wallet's signtransaction RPC ever has a problem with the PSBT, we // could attempt to sign the transaction ourselves by pulling the inputs' // private keys and using txscript manually, but this can vary greatly @@ -819,7 +826,7 @@ type pubKeyer interface { } // part of btc.Wallet interface -func (ew *electrumWallet) privKeyForAddress(addr string) (*btcec.PrivateKey, error) { +func (ew *electrumWallet) PrivKeyForAddress(addr string) (*btcec.PrivateKey, error) { addrDec, err := ew.decodeAddr(addr, ew.chainParams) if err != nil { return nil, err @@ -885,8 +892,8 @@ func (ew *electrumWallet) testPass(pw []byte) error { return nil } -// walletLock locks the wallet. Part of the btc.Wallet interface. -func (ew *electrumWallet) walletLock() error { +// WalletLock locks the wallet. Part of the btc.Wallet interface. +func (ew *electrumWallet) WalletLock() error { ew.pwMtx.Lock() defer ew.pwMtx.Unlock() if ew.pw == "" && ew.unlocked { @@ -900,9 +907,9 @@ func (ew *electrumWallet) walletLock() error { return nil } -// locked indicates if the wallet has been unlocked. Part of the btc.Wallet +// Locked indicates if the wallet has been unlocked. Part of the btc.Wallet // interface. -func (ew *electrumWallet) locked() bool { +func (ew *electrumWallet) Locked() bool { ew.pwMtx.RLock() defer ew.pwMtx.RUnlock() return !ew.unlocked @@ -915,10 +922,10 @@ func (ew *electrumWallet) walletPass() string { return pw } -// walletUnlock attempts to unlock the wallet with the provided password. On +// WalletUnlock attempts to unlock the wallet with the provided password. On // success, the password is stored and may be accessed via pass or walletPass. // Part of the btc.Wallet interface. -func (ew *electrumWallet) walletUnlock(pw []byte) error { +func (ew *electrumWallet) WalletUnlock(pw []byte) error { if err := ew.testPass(pw); err != nil { return err } @@ -929,7 +936,7 @@ func (ew *electrumWallet) walletUnlock(pw []byte) error { } // part of the btc.Wallet interface -func (ew *electrumWallet) peerCount() (uint32, error) { +func (ew *electrumWallet) PeerCount() (uint32, error) { if ew.chain() == nil { // must work prior to resetChain return 0, nil } @@ -948,7 +955,7 @@ func (ew *electrumWallet) peerCount() (uint32, error) { } // part of the btc.Wallet interface -func (ew *electrumWallet) ownsAddress(addr btcutil.Address) (bool, error) { +func (ew *electrumWallet) OwnsAddress(addr btcutil.Address) (bool, error) { addrStr, err := ew.stringAddr(addr, ew.chainParams) if err != nil { return false, err @@ -964,7 +971,7 @@ func (ew *electrumWallet) ownsAddress(addr btcutil.Address) (bool, error) { } // part of the btc.Wallet interface -func (ew *electrumWallet) syncStatus() (*asset.SyncStatus, error) { +func (ew *electrumWallet) SyncStatus() (*asset.SyncStatus, error) { info, err := ew.wallet.GetInfo(ew.ctx) if err != nil { return nil, err @@ -977,8 +984,8 @@ func (ew *electrumWallet) syncStatus() (*asset.SyncStatus, error) { } // part of the btc.Wallet interface -func (ew *electrumWallet) listTransactionsSinceBlock(blockHeight int32) ([]*ListTransactionsResult, error) { - bestHeight, err := ew.getBestBlockHeight() +func (ew *electrumWallet) ListTransactionsSinceBlock(blockHeight int32) ([]*ListTransactionsResult, error) { + bestHeight, err := ew.GetBestBlockHeight() if err != nil { return nil, fmt.Errorf("error getting best block: %v", err) } @@ -1044,7 +1051,7 @@ func (ew *electrumWallet) checkWalletTx(txid string) ([]byte, uint32, error) { } // part of the walletTxChecker interface -func (ew *electrumWallet) getWalletTransaction(txHash *chainhash.Hash) (*GetTransactionResult, error) { +func (ew *electrumWallet) GetWalletTransaction(txHash *chainhash.Hash) (*GetTransactionResult, error) { // Try the wallet first. If it is not a wallet transaction or if it is // confirmed, fall back to the chain method to get the block info and time // fields. @@ -1078,12 +1085,12 @@ func (ew *electrumWallet) getWalletTransaction(txHash *chainhash.Hash) (*GetTran }, nil } -func (ew *electrumWallet) fingerprint() (string, error) { +func (ew *electrumWallet) Fingerprint() (string, error) { return "", fmt.Errorf("fingerprint not implemented") } // part of the walletTxChecker interface -func (ew *electrumWallet) swapConfirmations(txHash *chainhash.Hash, vout uint32, contract []byte, startTime time.Time) (confs uint32, spent bool, err error) { +func (ew *electrumWallet) SwapConfirmations(txHash *chainhash.Hash, vout uint32, contract []byte, startTime time.Time) (confs uint32, spent bool, err error) { // To determine if it is spent, we need the address of the output. var pkScript []byte txid := txHash.String() @@ -1211,3 +1218,11 @@ func (ew *electrumWallet) findOutputSpender(ctx context.Context, txHash *chainha return nil, 0, nil // caller should check msgTx (internal method) } + +func (ew *electrumWallet) AddressUsed(addrStr string) (bool, error) { + txs, err := ew.wallet.GetAddressHistory(ew.ctx, addrStr) + if err != nil { + return false, fmt.Errorf("error getting address history: %w", err) + } + return len(txs) > 0, nil +} diff --git a/client/asset/btc/electrum_client_test.go b/client/asset/btc/electrum_client_test.go index 3a5d55f3a1..6d8c798fac 100644 --- a/client/asset/btc/electrum_client_test.go +++ b/client/asset/btc/electrum_client_test.go @@ -37,7 +37,7 @@ func Test_electrumWallet(t *testing.T) { segwit: true, }) var wg sync.WaitGroup - err := ew.connect(ctx, &wg) + err := ew.Connect(ctx, &wg) if err != nil { t.Fatal(err) } @@ -74,7 +74,7 @@ func Test_electrumWallet(t *testing.T) { } // gettxout - first the spent output - fundTxOut, fundConfs, err := ew.getTxOut(fundHash, fundVout, nil, time.Time{}) + fundTxOut, fundConfs, err := ew.GetTxOut(fundHash, fundVout, nil, time.Time{}) if err != nil { t.Fatal(err) } @@ -88,7 +88,7 @@ func Test_electrumWallet(t *testing.T) { fundVal = 20000 fundPkScript, _ = hex.DecodeString("76a914b3e0f80ce29ac48793de504ae9aa0b6579dda29a88ac") fundAddr = "mwv4kWRXkc2w42823FU9SJ16cvZH8Aobke" - fundTxOut, fundConfs, err = ew.getTxOut(fundHash, fundVout, nil, time.Time{}) + fundTxOut, fundConfs, err = ew.GetTxOut(fundHash, fundVout, nil, time.Time{}) if err != nil { t.Fatal(err) } @@ -122,12 +122,12 @@ func Test_electrumWallet(t *testing.T) { } t.Log(addr) - err = ew.walletUnlock([]byte(walletPass)) + err = ew.WalletUnlock([]byte(walletPass)) if err != nil { t.Fatal(err) } - _, err = ew.privKeyForAddress(addr) + _, err = ew.PrivKeyForAddress(addr) if err != nil { t.Fatal(err) } diff --git a/client/asset/btc/redemption_finder.go b/client/asset/btc/redemption_finder.go index f8fa5394b0..df55903390 100644 --- a/client/asset/btc/redemption_finder.go +++ b/client/asset/btc/redemption_finder.go @@ -43,6 +43,10 @@ func (req *FindRedemptionReq) sendResult(res *FindRedemptionResult) { } } +func (req *FindRedemptionReq) PkScript() []byte { + return req.pkScript +} + // FindRedemptionResult models the result of a find redemption attempt. type FindRedemptionResult struct { redemptionCoinID dex.Bytes @@ -505,7 +509,7 @@ func (r *RedemptionFinder) CancelRedemptionSearches() { r.mtx.Unlock() } -func findRedemptionsInTxWithHasher(ctx context.Context, segwit bool, reqs map[OutPoint]*FindRedemptionReq, msgTx *wire.MsgTx, +func FindRedemptionsInTxWithHasher(ctx context.Context, segwit bool, reqs map[OutPoint]*FindRedemptionReq, msgTx *wire.MsgTx, chainParams *chaincfg.Params, hashTx func(*wire.MsgTx) *chainhash.Hash) (discovered map[OutPoint]*FindRedemptionResult) { discovered = make(map[OutPoint]*FindRedemptionResult, len(reqs)) diff --git a/client/asset/btc/rpcclient.go b/client/asset/btc/rpcclient.go index 5a420a0472..a24eefad92 100644 --- a/client/asset/btc/rpcclient.go +++ b/client/asset/btc/rpcclient.go @@ -29,38 +29,39 @@ import ( ) const ( - methodGetBalances = "getbalances" - methodGetBalance = "getbalance" - methodListUnspent = "listunspent" - methodLockUnspent = "lockunspent" - methodListLockUnspent = "listlockunspent" - methodChangeAddress = "getrawchangeaddress" - methodNewAddress = "getnewaddress" - methodSignTx = "signrawtransactionwithwallet" - methodSignTxLegacy = "signrawtransaction" - methodUnlock = "walletpassphrase" - methodLock = "walletlock" - methodPrivKeyForAddress = "dumpprivkey" - methodGetTransaction = "gettransaction" - methodSendToAddress = "sendtoaddress" - methodSetTxFee = "settxfee" - methodGetWalletInfo = "getwalletinfo" - methodGetAddressInfo = "getaddressinfo" - methodListDescriptors = "listdescriptors" - methodValidateAddress = "validateaddress" - methodEstimateSmartFee = "estimatesmartfee" - methodSendRawTransaction = "sendrawtransaction" - methodGetTxOut = "gettxout" - methodGetBlock = "getblock" - methodGetBlockHash = "getblockhash" - methodGetBestBlockHash = "getbestblockhash" - methodGetRawMempool = "getrawmempool" - methodGetRawTransaction = "getrawtransaction" - methodGetBlockHeader = "getblockheader" - methodGetNetworkInfo = "getnetworkinfo" - methodGetBlockchainInfo = "getblockchaininfo" - methodFundRawTransaction = "fundrawtransaction" - methodListSinceBlock = "listsinceblock" + methodGetBalances = "getbalances" + methodGetBalance = "getbalance" + methodListUnspent = "listunspent" + methodLockUnspent = "lockunspent" + methodListLockUnspent = "listlockunspent" + methodChangeAddress = "getrawchangeaddress" + methodNewAddress = "getnewaddress" + methodSignTx = "signrawtransactionwithwallet" + methodSignTxLegacy = "signrawtransaction" + methodUnlock = "walletpassphrase" + methodLock = "walletlock" + methodPrivKeyForAddress = "dumpprivkey" + methodGetTransaction = "gettransaction" + methodSendToAddress = "sendtoaddress" + methodSetTxFee = "settxfee" + methodGetWalletInfo = "getwalletinfo" + methodGetAddressInfo = "getaddressinfo" + methodListDescriptors = "listdescriptors" + methodValidateAddress = "validateaddress" + methodEstimateSmartFee = "estimatesmartfee" + methodSendRawTransaction = "sendrawtransaction" + methodGetTxOut = "gettxout" + methodGetBlock = "getblock" + methodGetBlockHash = "getblockhash" + methodGetBestBlockHash = "getbestblockhash" + methodGetRawMempool = "getrawmempool" + methodGetRawTransaction = "getrawtransaction" + methodGetBlockHeader = "getblockheader" + methodGetNetworkInfo = "getnetworkinfo" + methodGetBlockchainInfo = "getblockchaininfo" + methodFundRawTransaction = "fundrawtransaction" + methodListSinceBlock = "listsinceblock" + methodGetReceivedByAddress = "getreceivedbyaddress" ) // IsTxNotFoundErr will return true if the error indicates that the requested @@ -159,7 +160,7 @@ func ChainOK(net dex.Network, str string) bool { return strings.Contains(str, chainStr) } -func (wc *rpcClient) connect(ctx context.Context, _ *sync.WaitGroup) error { +func (wc *rpcClient) Connect(ctx context.Context, _ *sync.WaitGroup) error { wc.ctx = ctx // Check the version. Do it here, so we can also diagnose a bad connection. netVer, codeVer, err := wc.getVersion() @@ -196,11 +197,11 @@ func (wc *rpcClient) connect(ctx context.Context, _ *sync.WaitGroup) error { return nil } -// reconfigure attempts to reconfigure the rpcClient for the new settings. Live +// Reconfigure attempts to reconfigure the rpcClient for the new settings. Live // reconfiguration is only attempted if the new wallet type is walletTypeRPC. If // the special_activelyUsed flag is set, reconfigure will fail if we can't // validate ownership of the current deposit address. -func (wc *rpcClient) reconfigure(cfg *asset.WalletConfig, currentAddress string) (restartRequired bool, err error) { +func (wc *rpcClient) Reconfigure(cfg *asset.WalletConfig, currentAddress string) (restartRequired bool, err error) { if cfg.Type != wc.cloneParams.WalletCFG.Type { restartRequired = true return @@ -323,15 +324,15 @@ func (wc *rpcClient) sendRawTransaction(tx *wire.MsgTx) (txHash *chainhash.Hash, prevOut := &txIn.PreviousOutPoint ops = append(ops, &Output{Pt: NewOutPoint(&prevOut.Hash, prevOut.Index)}) } - if err := wc.lockUnspent(true, ops); err != nil { + if err := wc.LockUnspent(true, ops); err != nil { wc.log.Warnf("error unlocking spent outputs: %v", err) } return txHash, nil } -// getTxOut returns the transaction output info if it's unspent and +// GetTxOut returns the transaction output info if it's unspent and // nil, otherwise. -func (wc *rpcClient) getTxOut(txHash *chainhash.Hash, index uint32, _ []byte, _ time.Time) (*wire.TxOut, uint32, error) { +func (wc *rpcClient) GetTxOut(txHash *chainhash.Hash, index uint32, _ []byte, _ time.Time) (*wire.TxOut, uint32, error) { txOut, err := wc.getTxOutput(txHash, index) if err != nil { return nil, 0, fmt.Errorf("getTxOut error: %w", err) @@ -363,8 +364,8 @@ func (wc *rpcClient) callHashGetter(method string, args anylist) (*chainhash.Has return chainhash.NewHashFromStr(txid) } -// getBlock fetches the MsgBlock. -func (wc *rpcClient) getBlock(h chainhash.Hash) (*wire.MsgBlock, error) { +// GetBlock fetches the MsgBlock. +func (wc *rpcClient) GetBlock(h chainhash.Hash) (*wire.MsgBlock, error) { var blkB dex.Bytes args := anylist{h.String()} if wc.booleanGetBlock { @@ -380,31 +381,31 @@ func (wc *rpcClient) getBlock(h chainhash.Hash) (*wire.MsgBlock, error) { return wc.deserializeBlock(blkB) } -// getBlockHash returns the hash of the block in the best block chain at the +// GetBlockHash returns the hash of the block in the best block chain at the // given height. -func (wc *rpcClient) getBlockHash(blockHeight int64) (*chainhash.Hash, error) { +func (wc *rpcClient) GetBlockHash(blockHeight int64) (*chainhash.Hash, error) { return wc.callHashGetter(methodGetBlockHash, anylist{blockHeight}) } -// getBestBlockHash returns the hash of the best block in the longest block +// GetBestBlockHash returns the hash of the best block in the longest block // chain (aka mainchain). -func (wc *rpcClient) getBestBlockHash() (*chainhash.Hash, error) { +func (wc *rpcClient) GetBestBlockHash() (*chainhash.Hash, error) { return wc.callHashGetter(methodGetBestBlockHash, nil) } -// getBestBlockHeight returns the height of the top mainchain block. -func (wc *rpcClient) getBestBlockHeader() (*BlockHeader, error) { - tipHash, err := wc.getBestBlockHash() +// GetBestBlockHeader returns the height of the top mainchain block. +func (wc *rpcClient) GetBestBlockHeader() (*BlockHeader, error) { + tipHash, err := wc.GetBestBlockHash() if err != nil { return nil, err } - hdr, _, err := wc.getBlockHeader(tipHash) + hdr, _, err := wc.GetBlockHeader(tipHash) return hdr, err } -// getBestBlockHeight returns the height of the top mainchain block. -func (wc *rpcClient) getBestBlockHeight() (int32, error) { - header, err := wc.getBestBlockHeader() +// GetBestBlockHeight returns the height of the top mainchain block. +func (wc *rpcClient) GetBestBlockHeight() (int32, error) { + header, err := wc.GetBestBlockHeader() if err != nil { return -1, err } @@ -413,7 +414,7 @@ func (wc *rpcClient) getBestBlockHeight() (int32, error) { // getChainStamp satisfies chainStamper for manual median time calculations. func (wc *rpcClient) getChainStamp(blockHash *chainhash.Hash) (stamp time.Time, prevHash *chainhash.Hash, err error) { - hdr, _, err := wc.getBlockHeader(blockHash) + hdr, _, err := wc.GetBlockHeader(blockHash) if err != nil { return } @@ -424,15 +425,15 @@ func (wc *rpcClient) getChainStamp(blockHash *chainhash.Hash) (stamp time.Time, return time.Unix(hdr.Time, 0).UTC(), prevHash, nil } -// medianTime is the median time for the current best block. -func (wc *rpcClient) medianTime() (stamp time.Time, err error) { - tipHash, err := wc.getBestBlockHash() +// MedianTime is the median time for the current best block. +func (wc *rpcClient) MedianTime() (stamp time.Time, err error) { + tipHash, err := wc.GetBestBlockHash() if err != nil { return } if wc.manualMedianTime { return CalcMedianTime(func(blockHash *chainhash.Hash) (stamp time.Time, prevHash *chainhash.Hash, err error) { - hdr, _, err := wc.getBlockHeader(blockHash) + hdr, _, err := wc.GetBlockHeader(blockHash) if err != nil { return } @@ -485,23 +486,23 @@ func (wc *rpcClient) GetRawTransaction(txHash *chainhash.Hash) (*wire.MsgTx, err return wc.deserializeTx(txB) } -// balances retrieves a wallet's balance details. -func (wc *rpcClient) balances() (*GetBalancesResult, error) { +// Balances retrieves a wallet's balance details. +func (wc *rpcClient) Balances() (*GetBalancesResult, error) { var balances GetBalancesResult return &balances, wc.call(methodGetBalances, nil, &balances) } -// listUnspent retrieves a list of the wallet's UTXOs. -func (wc *rpcClient) listUnspent() ([]*ListUnspentResult, error) { +// ListUnspent retrieves a list of the wallet's UTXOs. +func (wc *rpcClient) ListUnspent() ([]*ListUnspentResult, error) { unspents := make([]*ListUnspentResult, 0) // TODO: listunspent 0 9999999 []string{}, include_unsafe=false return unspents, wc.call(methodListUnspent, anylist{uint8(0)}, &unspents) } -// lockUnspent locks and unlocks outputs for spending. An output that is part of +// LockUnspent locks and unlocks outputs for spending. An output that is part of // an order, but not yet spent, should be locked until spent or until the order // is canceled or fails. -func (wc *rpcClient) lockUnspent(unlock bool, ops []*Output) error { +func (wc *rpcClient) LockUnspent(unlock bool, ops []*Output) error { var rpcops []*RPCOutpoint // To clear all, this must be nil->null, not empty slice. for _, op := range ops { rpcops = append(rpcops, &RPCOutpoint{ @@ -517,9 +518,9 @@ func (wc *rpcClient) lockUnspent(unlock bool, ops []*Output) error { return err } -// listLockUnspent returns a slice of outpoints for all unspent outputs marked +// ListLockUnspent returns a slice of outpoints for all unspent outputs marked // as locked by a wallet. -func (wc *rpcClient) listLockUnspent() ([]*RPCOutpoint, error) { +func (wc *rpcClient) ListLockUnspent() ([]*RPCOutpoint, error) { var unspents []*RPCOutpoint err := wc.call(methodListLockUnspent, nil, &unspents) if err != nil { @@ -561,9 +562,9 @@ func (wc *rpcClient) listLockUnspent() ([]*RPCOutpoint, error) { return unspents, nil } -// changeAddress gets a new internal address from the wallet. The address will +// ChangeAddress gets a new internal address from the wallet. The address will // be bech32-encoded (P2WPKH). -func (wc *rpcClient) changeAddress() (btcutil.Address, error) { +func (wc *rpcClient) ChangeAddress() (btcutil.Address, error) { var addrStr string var err error switch { @@ -580,7 +581,7 @@ func (wc *rpcClient) changeAddress() (btcutil.Address, error) { return wc.decodeAddr(addrStr, wc.chainParams) } -func (wc *rpcClient) externalAddress() (btcutil.Address, error) { +func (wc *rpcClient) ExternalAddress() (btcutil.Address, error) { if wc.segwit { return wc.address("bech32") } @@ -602,8 +603,8 @@ func (wc *rpcClient) address(aType string) (btcutil.Address, error) { return wc.decodeAddr(addrStr, wc.chainParams) // we should consider returning a string } -// signTx attempts to have the wallet sign the transaction inputs. -func (wc *rpcClient) signTx(inTx *wire.MsgTx) (*wire.MsgTx, error) { +// SignTx attempts to have the wallet sign the transaction inputs. +func (wc *rpcClient) SignTx(inTx *wire.MsgTx) (*wire.MsgTx, error) { txBytes, err := wc.serializeTx(inTx) if err != nil { return nil, fmt.Errorf("tx serialization error: %w", err) @@ -639,8 +640,8 @@ func (wc *rpcClient) listDescriptors(private bool) (*listDescriptorsResult, erro return descriptors, wc.call(methodListDescriptors, anylist{private}, descriptors) } -func (wc *rpcClient) listTransactionsSinceBlock(blockHeight int32) ([]*ListTransactionsResult, error) { - blockHash, err := wc.getBlockHash(int64(blockHeight)) +func (wc *rpcClient) ListTransactionsSinceBlock(blockHeight int32) ([]*ListTransactionsResult, error) { + blockHash, err := wc.GetBlockHash(int64(blockHeight)) if err != nil { return nil, fmt.Errorf("getBlockHash error: %w", err) } @@ -670,9 +671,9 @@ func (wc *rpcClient) listTransactionsSinceBlock(blockHeight int32) ([]*ListTrans return txs, nil } -// privKeyForAddress retrieves the private key associated with the specified +// PrivKeyForAddress retrieves the private key associated with the specified // address. -func (wc *rpcClient) privKeyForAddress(addr string) (*btcec.PrivateKey, error) { +func (wc *rpcClient) PrivKeyForAddress(addr string) (*btcec.PrivateKey, error) { // Use a specialized client's privKey function if wc.privKeyFunc != nil { return wc.privKeyFunc(addr) @@ -841,8 +842,8 @@ masters: return nil, errors.New("no private key found for address") } -// getWalletTransaction retrieves the JSON-RPC gettransaction result. -func (wc *rpcClient) getWalletTransaction(txHash *chainhash.Hash) (*GetTransactionResult, error) { +// GetWalletTransaction retrieves the JSON-RPC gettransaction result. +func (wc *rpcClient) GetWalletTransaction(txHash *chainhash.Hash) (*GetTransactionResult, error) { tx := new(GetTransactionResult) err := wc.call(methodGetTransaction, anylist{txHash.String()}, tx) if err != nil { @@ -854,19 +855,19 @@ func (wc *rpcClient) getWalletTransaction(txHash *chainhash.Hash) (*GetTransacti return tx, nil } -// walletUnlock unlocks the wallet. -func (wc *rpcClient) walletUnlock(pw []byte) error { +// WalletUnlock unlocks the wallet. +func (wc *rpcClient) WalletUnlock(pw []byte) error { // 100000000 comes from bitcoin-cli help walletpassphrase return wc.call(methodUnlock, anylist{string(pw), 100000000}, nil) } -// walletLock locks the wallet. -func (wc *rpcClient) walletLock() error { +// WalletLock locks the wallet. +func (wc *rpcClient) WalletLock() error { return wc.call(methodLock, nil, nil) } -// locked returns the wallet's lock state. -func (wc *rpcClient) locked() bool { +// Locked returns the wallet's lock state. +func (wc *rpcClient) Locked() bool { walletInfo, err := wc.GetWalletInfo() if err != nil { wc.log.Errorf("GetWalletInfo error: %w", err) @@ -880,9 +881,9 @@ func (wc *rpcClient) locked() bool { return time.Unix(*walletInfo.UnlockedUntil, 0).Before(time.Now()) } -// sendTxFeeEstimator returns the fee required to send tx using the provided +// EstimateSendTxFee returns the fee required to send tx using the provided // feeRate. -func (wc *rpcClient) estimateSendTxFee(tx *wire.MsgTx, feeRate uint64, subtract bool) (txfee uint64, err error) { +func (wc *rpcClient) EstimateSendTxFee(tx *wire.MsgTx, feeRate uint64, subtract bool) (txfee uint64, err error) { txBytes, err := wc.serializeTx(tx) if err != nil { return 0, fmt.Errorf("tx serialization error: %w", err) @@ -941,9 +942,9 @@ func (wc *rpcClient) GetWalletInfo() (*GetWalletInfoResult, error) { return wi, wc.call(methodGetWalletInfo, nil, wi) } -// fingerprint returns an identifier for this wallet. Only HD wallets will have +// Fingerprint returns an identifier for this wallet. Only HD wallets will have // an identifier. Descriptor wallets will not. -func (wc *rpcClient) fingerprint() (string, error) { +func (wc *rpcClient) Fingerprint() (string, error) { walletInfo, err := wc.GetWalletInfo() if err != nil { return "", err @@ -967,8 +968,8 @@ func (wc *rpcClient) getAddressInfo(addr btcutil.Address, method string) (*GetAd return ai, wc.call(method, anylist{addrStr}, ai) } -// ownsAddress indicates if an address belongs to the wallet. -func (wc *rpcClient) ownsAddress(addr btcutil.Address) (bool, error) { +// OwnsAddress indicates if an address belongs to the wallet. +func (wc *rpcClient) OwnsAddress(addr btcutil.Address) (bool, error) { method := methodGetAddressInfo if wc.legacyValidateAddressRPC { method = methodValidateAddress @@ -980,8 +981,8 @@ func (wc *rpcClient) ownsAddress(addr btcutil.Address) (bool, error) { return ai.IsMine, nil } -// syncStatus is information about the blockchain sync status. -func (wc *rpcClient) syncStatus() (*asset.SyncStatus, error) { +// SyncStatus is information about the blockchain sync status. +func (wc *rpcClient) SyncStatus() (*asset.SyncStatus, error) { chainInfo, err := wc.getBlockchainInfo() if err != nil { return nil, fmt.Errorf("getblockchaininfo error: %w", err) @@ -994,17 +995,17 @@ func (wc *rpcClient) syncStatus() (*asset.SyncStatus, error) { }, nil } -// swapConfirmations gets the number of confirmations for the specified coin ID +// SwapConfirmations gets the number of confirmations for the specified coin ID // by first checking for a unspent output, and if not found, searching indexed // wallet transactions. -func (wc *rpcClient) swapConfirmations(txHash *chainhash.Hash, vout uint32, _ []byte, _ time.Time) (confs uint32, spent bool, err error) { +func (wc *rpcClient) SwapConfirmations(txHash *chainhash.Hash, vout uint32, _ []byte, _ time.Time) (confs uint32, spent bool, err error) { // Check for an unspent output. txOut, err := wc.getTxOutput(txHash, vout) if err == nil && txOut != nil { return uint32(txOut.Confirmations), false, nil } // Check wallet transactions. - tx, err := wc.getWalletTransaction(txHash) + tx, err := wc.GetWalletTransaction(txHash) if err != nil { if IsTxNotFoundErr(err) { return 0, false, asset.CoinNotFoundError @@ -1026,10 +1027,10 @@ func (wc *rpcClient) getRPCBlockHeader(blockHash *chainhash.Hash) (*BlockHeader, return blkHeader, nil } -// getBlockHeader gets the *blockHeader for the specified block hash. It also +// GetBlockHeader gets the *BlockHeader for the specified block hash. It also // returns a bool value to indicate whether this block is a part of main chain. // For orphaned blocks header.Confirmations is negative (typically -1). -func (wc *rpcClient) getBlockHeader(blockHash *chainhash.Hash) (header *BlockHeader, mainchain bool, err error) { +func (wc *rpcClient) GetBlockHeader(blockHash *chainhash.Hash) (header *BlockHeader, mainchain bool, err error) { hdr, err := wc.getRPCBlockHeader(blockHash) if err != nil { return nil, false, err @@ -1039,10 +1040,10 @@ func (wc *rpcClient) getBlockHeader(blockHash *chainhash.Hash) (header *BlockHea return hdr, mainchain, nil } -// getBlockHeight gets the mainchain height for the specified block. Returns +// GetBlockHeight gets the mainchain height for the specified block. Returns // error for orphaned blocks. -func (wc *rpcClient) getBlockHeight(blockHash *chainhash.Hash) (int32, error) { - hdr, _, err := wc.getBlockHeader(blockHash) +func (wc *rpcClient) GetBlockHeight(blockHash *chainhash.Hash) (int32, error) { + hdr, _, err := wc.GetBlockHeader(blockHash) if err != nil { return -1, err } @@ -1052,7 +1053,7 @@ func (wc *rpcClient) getBlockHeight(blockHash *chainhash.Hash) (int32, error) { return int32(hdr.Height), nil } -func (wc *rpcClient) peerCount() (uint32, error) { +func (wc *rpcClient) PeerCount() (uint32, error) { var r struct { Connections uint32 `json:"connections"` } @@ -1090,9 +1091,9 @@ func (wc *rpcClient) getVersion() (uint64, uint64, error) { return r.Version, r.ProtocolVersion, nil } -// findRedemptionsInMempool attempts to find spending info for the specified +// FindRedemptionsInMempool attempts to find spending info for the specified // contracts by searching every input of all txs in the mempool. -func (wc *rpcClient) findRedemptionsInMempool(ctx context.Context, reqs map[OutPoint]*FindRedemptionReq) (discovered map[OutPoint]*FindRedemptionResult) { +func (wc *rpcClient) FindRedemptionsInMempool(ctx context.Context, reqs map[OutPoint]*FindRedemptionReq) (discovered map[OutPoint]*FindRedemptionResult) { return FindRedemptionsInMempool(ctx, wc.log, reqs, wc.GetRawMempool, wc.GetRawTransaction, wc.segwit, wc.hashTx, wc.chainParams) } @@ -1140,7 +1141,7 @@ func FindRedemptionsInMempool( logAbandon(fmt.Sprintf("getrawtransaction error for tx hash %v: %v", txHash, err)) return } - newlyDiscovered := findRedemptionsInTxWithHasher(ctx, segwit, reqs, tx, chainParams, hashTx) + newlyDiscovered := FindRedemptionsInTxWithHasher(ctx, segwit, reqs, tx, chainParams, hashTx) for outPt, res := range newlyDiscovered { discovered[outPt] = res } @@ -1149,10 +1150,10 @@ func FindRedemptionsInMempool( return } -// searchBlockForRedemptions attempts to find spending info for the specified +// SearchBlockForRedemptions attempts to find spending info for the specified // contracts by searching every input of all txs in the provided block range. -func (wc *rpcClient) searchBlockForRedemptions(ctx context.Context, reqs map[OutPoint]*FindRedemptionReq, blockHash chainhash.Hash) (discovered map[OutPoint]*FindRedemptionResult) { - msgBlock, err := wc.getBlock(blockHash) +func (wc *rpcClient) SearchBlockForRedemptions(ctx context.Context, reqs map[OutPoint]*FindRedemptionReq, blockHash chainhash.Hash) (discovered map[OutPoint]*FindRedemptionResult) { + msgBlock, err := wc.GetBlock(blockHash) if err != nil { wc.log.Errorf("RPC GetBlock error: %v", err) return @@ -1172,7 +1173,7 @@ func SearchBlockForRedemptions( discovered = make(map[OutPoint]*FindRedemptionResult, len(reqs)) for _, msgTx := range msgBlock.Transactions { - newlyDiscovered := findRedemptionsInTxWithHasher(ctx, segwit, reqs, msgTx, chainParams, hashTx) + newlyDiscovered := FindRedemptionsInTxWithHasher(ctx, segwit, reqs, msgTx, chainParams, hashTx) for outPt, res := range newlyDiscovered { discovered[outPt] = res } @@ -1180,6 +1181,15 @@ func SearchBlockForRedemptions( return } +func (wc *rpcClient) AddressUsed(addr string) (bool, error) { + var recv float64 + const minConf = 0 + if err := wc.call(methodGetReceivedByAddress, []any{addr, minConf}, &recv); err != nil { + return false, err + } + return recv != 0, nil +} + // call is used internally to marshal parameters and send requests to the RPC // server via (*rpcclient.Client).RawRequest. If thing is non-nil, the result // will be marshaled into thing. diff --git a/client/asset/btc/spv.go b/client/asset/btc/spv.go index a6e7ae43e0..70d110da3e 100644 --- a/client/asset/btc/spv.go +++ b/client/asset/btc/spv.go @@ -114,15 +114,6 @@ func openSPVWallet(dir string, cfg *WalletConfig, return w } -// AccountInfo returns the account information of the wallet for use by the -// exchange wallet. -func (w *btcSPVWallet) AccountInfo() XCWalletAccount { - return XCWalletAccount{ - AccountName: defaultAcctName, - AccountNumber: defaultAcctNum, - } -} - func (w *btcSPVWallet) Birthday() time.Time { return w.Manager.Birthday() } diff --git a/client/asset/btc/spv_scan_filters.go b/client/asset/btc/spv_scan_filters.go index 9ee62d1c54..cfde79551f 100644 --- a/client/asset/btc/spv_scan_filters.go +++ b/client/asset/btc/spv_scan_filters.go @@ -13,27 +13,27 @@ import ( "github.com/btcsuite/btcd/wire" ) -// spendingInput is added to a filterScanResult if a spending input is found. -type spendingInput struct { - txHash chainhash.Hash - vin uint32 - blockHash chainhash.Hash - blockHeight uint32 +// SpendingInput is added to a filterScanResult if a spending input is found. +type SpendingInput struct { + TxHash chainhash.Hash + Vin uint32 + BlockHash chainhash.Hash + BlockHeight uint32 } -// filterScanResult is the result from a filter scan. -type filterScanResult struct { - // blockHash is the block that the output was found in. - blockHash *chainhash.Hash - // blockHeight is the height of the block that the output was found in. - blockHeight uint32 - // txOut is the output itself. - txOut *wire.TxOut - // spend will be set if a spending input is found. - spend *spendingInput - // checkpoint is used to track the last block scanned so that future scans +// FilterScanResult is the result from a filter scan. +type FilterScanResult struct { + // BlockHash is the block that the output was found in. + BlockHash *chainhash.Hash + // BlockHeight is the height of the block that the output was found in. + BlockHeight uint32 + // TxOut is the output itself. + TxOut *wire.TxOut + // Spend will be set if a spending input is found. + Spend *SpendingInput + // Checkpoint is used to track the last block scanned so that future scans // can skip scanned blocks. - checkpoint chainhash.Hash + Checkpoint chainhash.Hash } // hashEntry stores a chainhash.Hash with a last-access time that can be used @@ -43,52 +43,52 @@ type hashEntry struct { lastAccess time.Time } -// scanCheckpoint is a cached, incomplete filterScanResult. When another scan -// is requested for an outpoint with a cached *scanCheckpoint, the scan can -// pick up where it left off. -type scanCheckpoint struct { - res *filterScanResult - lastAccess time.Time +// ScanCheckpoint is a cached, incomplete FilterScanResult. When another scan is +// requested for an outpoint with a cached *ScanCheckpoint, the scan can pick up +// where it left off. +type ScanCheckpoint struct { + Res *FilterScanResult + LastAccess time.Time } -// blockInfoReader defines methods for retrieving block information. -type blockInfoReader interface { - getBlockHash(blockHeight int64) (*chainhash.Hash, error) - getBlockHeight(*chainhash.Hash) (int32, error) - getBlockHeaderVerbose(blockHash *chainhash.Hash) (*wire.BlockHeader, error) - getBlock(h chainhash.Hash) (*wire.MsgBlock, error) - getChainHeight() (int32, error) - matchPkScript(blockHash *chainhash.Hash, scripts [][]byte) (bool, error) +// BlockInfoReader defines methods for retrieving block information. +type BlockInfoReader interface { + GetBlockHash(blockHeight int64) (*chainhash.Hash, error) + GetBlockHeight(*chainhash.Hash) (int32, error) + GetBlockHeaderVerbose(blockHash *chainhash.Hash) (*wire.BlockHeader, error) + GetBlock(h chainhash.Hash) (*wire.MsgBlock, error) + GetChainHeight() (int32, error) + MatchPkScript(blockHash *chainhash.Hash, scripts [][]byte) (bool, error) } // BlockFiltersScanner is a utility tool for searching for an output and its // spending input by scanning BIP158 compact filters. Used by SPV wallets to // locate non-wallet transactions. type BlockFiltersScanner struct { - blockInfoReader + BlockInfoReader log dex.Logger cacheExpiration time.Duration checkpointMtx sync.Mutex - checkpoints map[OutPoint]*scanCheckpoint + checkpoints map[OutPoint]*ScanCheckpoint txBlocksMtx sync.Mutex txBlocks map[chainhash.Hash]*hashEntry } // NewBlockFiltersScanner creates a BlockFiltersScanner. -func NewBlockFiltersScanner(blkInfoRdr blockInfoReader, log dex.Logger) *BlockFiltersScanner { +func NewBlockFiltersScanner(blkInfoRdr BlockInfoReader, log dex.Logger) *BlockFiltersScanner { return &BlockFiltersScanner{ - blockInfoReader: blkInfoRdr, + BlockInfoReader: blkInfoRdr, log: log, cacheExpiration: time.Hour * 2, txBlocks: make(map[chainhash.Hash]*hashEntry), - checkpoints: make(map[OutPoint]*scanCheckpoint), + checkpoints: make(map[OutPoint]*ScanCheckpoint), } } -// storeTxBlock stores the block hash for the tx in the cache. -func (s *BlockFiltersScanner) storeTxBlock(txHash, blockHash chainhash.Hash) { +// StoreTxBlock stores the block hash for the tx in the cache. +func (s *BlockFiltersScanner) StoreTxBlock(txHash, blockHash chainhash.Hash) { s.txBlocksMtx.Lock() defer s.txBlocksMtx.Unlock() s.txBlocks[txHash] = &hashEntry{ @@ -97,8 +97,8 @@ func (s *BlockFiltersScanner) storeTxBlock(txHash, blockHash chainhash.Hash) { } } -// txBlock attempts to retrieve the block hash for the tx from the cache. -func (s *BlockFiltersScanner) txBlock(txHash chainhash.Hash) (chainhash.Hash, bool) { +// TxBlock attempts to retrieve the block hash for the tx from the cache. +func (s *BlockFiltersScanner) TxBlock(txHash chainhash.Hash) (chainhash.Hash, bool) { s.txBlocksMtx.Lock() defer s.txBlocksMtx.Unlock() entry, found := s.txBlocks[txHash] @@ -109,46 +109,46 @@ func (s *BlockFiltersScanner) txBlock(txHash chainhash.Hash) (chainhash.Hash, bo return entry.hash, true } -// cacheCheckpoint caches a *filterScanResult so that future scans can be +// CacheCheckpoint caches a *filterScanResult so that future scans can be // skipped or shortened. -func (s *BlockFiltersScanner) cacheCheckpoint(txHash *chainhash.Hash, vout uint32, res *filterScanResult) { - if res.spend != nil && res.blockHash == nil { +func (s *BlockFiltersScanner) CacheCheckpoint(txHash *chainhash.Hash, vout uint32, res *FilterScanResult) { + if res.Spend != nil && res.BlockHash == nil { // Probably set the start time too late. Don't cache anything return } s.checkpointMtx.Lock() defer s.checkpointMtx.Unlock() - s.checkpoints[NewOutPoint(txHash, vout)] = &scanCheckpoint{ - res: res, - lastAccess: time.Now(), + s.checkpoints[NewOutPoint(txHash, vout)] = &ScanCheckpoint{ + Res: res, + LastAccess: time.Now(), } } -// unvalidatedCheckpoint returns any cached *filterScanResult for the outpoint. -func (s *BlockFiltersScanner) unvalidatedCheckpoint(txHash *chainhash.Hash, vout uint32) *filterScanResult { +// UnvalidatedCheckpoint returns any cached *filterScanResult for the outpoint. +func (s *BlockFiltersScanner) UnvalidatedCheckpoint(txHash *chainhash.Hash, vout uint32) *FilterScanResult { s.checkpointMtx.Lock() defer s.checkpointMtx.Unlock() check, found := s.checkpoints[NewOutPoint(txHash, vout)] if !found { return nil } - check.lastAccess = time.Now() - res := *check.res + check.LastAccess = time.Now() + res := *check.Res return &res } -// checkpoint returns a filterScanResult and the checkpoint block hash. If a +// Checkpoint returns a filterScanResult and the checkpoint block hash. If a // result is found with an orphaned checkpoint block hash, it is cleared from // the cache and not returned. -func (s *BlockFiltersScanner) checkpoint(txHash *chainhash.Hash, vout uint32) *filterScanResult { - res := s.unvalidatedCheckpoint(txHash, vout) +func (s *BlockFiltersScanner) Checkpoint(txHash *chainhash.Hash, vout uint32) *FilterScanResult { + res := s.UnvalidatedCheckpoint(txHash, vout) if res == nil { return nil } - if !s.blockIsMainchain(&res.checkpoint, -1) { + if !s.BlockIsMainchain(&res.Checkpoint, -1) { // reorg detected, abandon the checkpoint. s.log.Debugf("abandoning checkpoint %s because checkpoint block %q is orphaned", - NewOutPoint(txHash, vout), res.checkpoint) + NewOutPoint(txHash, vout), res.Checkpoint) s.checkpointMtx.Lock() delete(s.checkpoints, NewOutPoint(txHash, vout)) s.checkpointMtx.Unlock() @@ -171,22 +171,22 @@ func (s *BlockFiltersScanner) CleanCaches(expiration time.Duration) { s.checkpointMtx.Lock() for outPt, check := range s.checkpoints { - if time.Since(check.lastAccess) > expiration { + if time.Since(check.LastAccess) > expiration { delete(s.checkpoints, outPt) } } s.checkpointMtx.Unlock() } -// blockForStoredTx looks for a block hash in the txBlocks index. -func (s *BlockFiltersScanner) blockForStoredTx(txHash *chainhash.Hash) (*chainhash.Hash, int32, error) { +// BlockForStoredTx looks for a block hash in the txBlocks index. +func (s *BlockFiltersScanner) BlockForStoredTx(txHash *chainhash.Hash) (*chainhash.Hash, int32, error) { // Check if we know the block hash for the tx. - blockHash, found := s.txBlock(*txHash) + blockHash, found := s.TxBlock(*txHash) if !found { return nil, 0, nil } // Check that the block is still mainchain. - blockHeight, err := s.getBlockHeight(&blockHash) + blockHeight, err := s.GetBlockHeight(&blockHash) if err != nil { s.log.Errorf("Error retrieving block height for hash %s: %v", blockHash, err) return nil, 0, err @@ -194,17 +194,17 @@ func (s *BlockFiltersScanner) blockForStoredTx(txHash *chainhash.Hash) (*chainha return &blockHash, blockHeight, nil } -// blockIsMainchain will be true if the blockHash is that of a mainchain block. -func (s *BlockFiltersScanner) blockIsMainchain(blockHash *chainhash.Hash, blockHeight int32) bool { +// BlockIsMainchain will be true if the blockHash is that of a mainchain block. +func (s *BlockFiltersScanner) BlockIsMainchain(blockHash *chainhash.Hash, blockHeight int32) bool { if blockHeight < 0 { var err error - blockHeight, err = s.getBlockHeight(blockHash) + blockHeight, err = s.GetBlockHeight(blockHash) if err != nil { s.log.Errorf("Error getting block height for hash %s", blockHash) return false } } - checkHash, err := s.getBlockHash(int64(blockHeight)) + checkHash, err := s.GetBlockHash(int64(blockHeight)) if err != nil { s.log.Errorf("Error retrieving block hash for height %d", blockHeight) return false @@ -213,11 +213,11 @@ func (s *BlockFiltersScanner) blockIsMainchain(blockHash *chainhash.Hash, blockH return *checkHash == *blockHash } -// mainchainBlockForStoredTx gets the block hash and height for the transaction +// MainchainBlockForStoredTx gets the block hash and height for the transaction // IFF an entry has been stored in the txBlocks index. -func (s *BlockFiltersScanner) mainchainBlockForStoredTx(txHash *chainhash.Hash) (*chainhash.Hash, int32) { +func (s *BlockFiltersScanner) MainchainBlockForStoredTx(txHash *chainhash.Hash) (*chainhash.Hash, int32) { // Check that the block is still mainchain. - blockHash, blockHeight, err := s.blockForStoredTx(txHash) + blockHash, blockHeight, err := s.BlockForStoredTx(txHash) if err != nil { s.log.Errorf("Error retrieving mainchain block height for hash %s", blockHash) return nil, 0 @@ -225,33 +225,33 @@ func (s *BlockFiltersScanner) mainchainBlockForStoredTx(txHash *chainhash.Hash) if blockHash == nil { return nil, 0 } - if !s.blockIsMainchain(blockHash, blockHeight) { + if !s.BlockIsMainchain(blockHash, blockHeight) { return nil, 0 } return blockHash, blockHeight } -// findBlockForTime locates a good start block so that a search beginning at the +// FindBlockForTime locates a good start block so that a search beginning at the // returned block has a very low likelihood of missing any blocks that have time // > matchTime. This is done by performing a binary search (sort.Search) to find // a block with a block time maxFutureBlockTime before matchTime. To ensure // we also accommodate the median-block time rule and aren't missing anything // due to out of sequence block times we use an unsophisticated algorithm of // choosing the first block in an 11 block window with no times >= matchTime. -func (s *BlockFiltersScanner) findBlockForTime(matchTime time.Time) (int32, error) { +func (s *BlockFiltersScanner) FindBlockForTime(matchTime time.Time) (int32, error) { offsetTime := matchTime.Add(-maxFutureBlockTime) - bestHeight, err := s.getChainHeight() + bestHeight, err := s.GetChainHeight() if err != nil { return 0, fmt.Errorf("getChainHeight error: %v", err) } getBlockTimeForHeight := func(height int32) (time.Time, error) { - hash, err := s.getBlockHash(int64(height)) + hash, err := s.GetBlockHash(int64(height)) if err != nil { return time.Time{}, err } - header, err := s.getBlockHeaderVerbose(hash) + header, err := s.GetBlockHeaderVerbose(hash) if err != nil { return time.Time{}, err } @@ -300,30 +300,30 @@ func (s *BlockFiltersScanner) findBlockForTime(matchTime time.Time) (int32, erro // both the output and a spending transaction is found. if startTime is // supplied, and the blockHash for the output is not known to the wallet, a // candidate block will be selected with findBlockTime. -func (s *BlockFiltersScanner) ScanFilters(txHash *chainhash.Hash, vout uint32, pkScript []byte, walletTip int32, startTime time.Time, blockHash *chainhash.Hash) (*filterScanResult, error) { +func (s *BlockFiltersScanner) ScanFilters(txHash *chainhash.Hash, vout uint32, pkScript []byte, walletTip int32, startTime time.Time, blockHash *chainhash.Hash) (*FilterScanResult, error) { // TODO: Check that any blockHash supplied is not orphaned? // Check if we know the block hash for the tx. var limitHeight int32 // See if we have a checkpoint to use. - checkPt := s.checkpoint(txHash, vout) + checkPt := s.Checkpoint(txHash, vout) if checkPt != nil { - if checkPt.blockHash != nil && checkPt.spend != nil { + if checkPt.BlockHash != nil && checkPt.Spend != nil { // We already have the output and the spending input, and // checkpointBlock already verified it's still mainchain. return checkPt, nil } - height, err := s.getBlockHeight(&checkPt.checkpoint) + height, err := s.GetBlockHeight(&checkPt.Checkpoint) if err != nil { - return nil, fmt.Errorf("getBlockHeight error: %w", err) + return nil, fmt.Errorf("GetBlockHeight error: %w", err) } limitHeight = height + 1 } else if blockHash == nil { // No checkpoint and no block hash. Gotta guess based on time. - blockHash, limitHeight = s.mainchainBlockForStoredTx(txHash) + blockHash, limitHeight = s.MainchainBlockForStoredTx(txHash) if blockHash == nil { var err error - limitHeight, err = s.findBlockForTime(startTime) + limitHeight, err = s.FindBlockForTime(startTime) if err != nil { return nil, err } @@ -331,7 +331,7 @@ func (s *BlockFiltersScanner) ScanFilters(txHash *chainhash.Hash, vout uint32, p } else { // No checkpoint, but user supplied a block hash. var err error - limitHeight, err = s.getBlockHeight(blockHash) + limitHeight, err = s.GetBlockHeight(blockHash) if err != nil { return nil, fmt.Errorf("error getting height for supplied block hash %s", blockHash) } @@ -350,52 +350,52 @@ func (s *BlockFiltersScanner) ScanFilters(txHash *chainhash.Hash, vout uint32, p // If we found a block, let's store a reference in our local database so we // can maybe bypass a long search next time. - if utxo.blockHash != nil { + if utxo.BlockHash != nil { s.log.Debugf("cfilters scan SUCCEEDED for %v:%d. block hash: %v, spent: %v", - txHash, vout, utxo.blockHash, utxo.spend != nil) - s.storeTxBlock(*txHash, *utxo.blockHash) + txHash, vout, utxo.BlockHash, utxo.Spend != nil) + s.StoreTxBlock(*txHash, *utxo.BlockHash) } - s.cacheCheckpoint(txHash, vout, utxo) + s.CacheCheckpoint(txHash, vout, utxo) return utxo, nil } // filterScanFromHeight scans BIP158 filters beginning at the specified block // height until the tip, or until a spending transaction is found. -func (s *BlockFiltersScanner) filterScanFromHeight(txHash chainhash.Hash, vout uint32, pkScript []byte, walletTip int32, startBlockHeight int32, checkPt *filterScanResult) (*filterScanResult, error) { +func (s *BlockFiltersScanner) filterScanFromHeight(txHash chainhash.Hash, vout uint32, pkScript []byte, walletTip int32, startBlockHeight int32, checkPt *FilterScanResult) (*FilterScanResult, error) { res := checkPt if res == nil { - res = new(filterScanResult) + res = new(FilterScanResult) } search: for height := startBlockHeight; height <= walletTip; height++ { - if res.spend != nil && res.blockHash == nil { + if res.Spend != nil && res.BlockHash == nil { s.log.Warnf("A spending input (%s) was found during the scan but the output (%s) "+ "itself wasn't found. Was the startBlockHeight early enough?", - NewOutPoint(&res.spend.txHash, res.spend.vin), + NewOutPoint(&res.Spend.TxHash, res.Spend.Vin), NewOutPoint(&txHash, vout), ) return res, nil } - blockHash, err := s.getBlockHash(int64(height)) + blockHash, err := s.GetBlockHash(int64(height)) if err != nil { return nil, fmt.Errorf("error getting block hash for height %d: %w", height, err) } - matched, err := s.matchPkScript(blockHash, [][]byte{pkScript}) + matched, err := s.MatchPkScript(blockHash, [][]byte{pkScript}) if err != nil { return nil, fmt.Errorf("matchPkScript error: %w", err) } - res.checkpoint = *blockHash + res.Checkpoint = *blockHash if !matched { continue search } // Pull the block. s.log.Tracef("Block %v matched pkScript for output %v:%d. Pulling the block...", blockHash, txHash, vout) - msgBlock, err := s.getBlock(*blockHash) + msgBlock, err := s.GetBlock(*blockHash) if err != nil { return nil, fmt.Errorf("GetBlock error: %v", err) } @@ -404,19 +404,19 @@ search: nextTx: for _, tx := range msgBlock.Transactions { // Look for a spending input. - if res.spend == nil { + if res.Spend == nil { for vin, txIn := range tx.TxIn { prevOut := &txIn.PreviousOutPoint if prevOut.Hash == txHash && prevOut.Index == vout { - res.spend = &spendingInput{ - txHash: tx.TxHash(), - vin: uint32(vin), - blockHash: *blockHash, - blockHeight: uint32(height), + res.Spend = &SpendingInput{ + TxHash: tx.TxHash(), + Vin: uint32(vin), + BlockHash: *blockHash, + BlockHeight: uint32(height), } - s.log.Tracef("Found txn %v spending %v in block %v (%d)", res.spend.txHash, - txHash, res.spend.blockHash, res.spend.blockHeight) - if res.blockHash != nil { + s.log.Tracef("Found txn %v spending %v in block %v (%d)", res.Spend.TxHash, + txHash, res.Spend.BlockHash, res.Spend.BlockHeight) + if res.BlockHash != nil { break search } // The output could still be in this block, just not @@ -426,16 +426,16 @@ search: } } // Only check for the output if this is the right transaction. - if res.blockHash != nil || tx.TxHash() != txHash { + if res.BlockHash != nil || tx.TxHash() != txHash { continue nextTx } for _, txOut := range tx.TxOut { if bytes.Equal(txOut.PkScript, pkScript) { - res.blockHash = blockHash - res.blockHeight = uint32(height) - res.txOut = txOut - s.log.Tracef("Found txn %v in block %v (%d)", txHash, res.blockHash, height) - if res.spend != nil { + res.BlockHash = blockHash + res.BlockHeight = uint32(height) + res.TxOut = txOut + s.log.Tracef("Found txn %v in block %v (%d)", txHash, res.BlockHash, height) + if res.Spend != nil { break search } // Keep looking for the spending transaction. diff --git a/client/asset/btc/spv_test.go b/client/asset/btc/spv_test.go index 18e1964f07..e1cf0ea8b7 100644 --- a/client/asset/btc/spv_test.go +++ b/client/asset/btc/spv_test.go @@ -39,14 +39,7 @@ type tBtcWallet struct { *testData } -func (c *tBtcWallet) AccountInfo() XCWalletAccount { - return XCWalletAccount{ - AccountName: defaultAcctName, - AccountNumber: defaultAcctNum, - } -} - -func (c *tBtcWallet) GetTransactions(startBlock, endBlock int32, accountName string, cancel <-chan struct{}) (*wallet.GetTransactionsResult, error) { +func (c *tBtcWallet) ListSinceBlock(start, end, syncHeight int32) ([]btcjson.ListTransactionsResult, error) { return nil, nil } @@ -298,22 +291,6 @@ func (c *tBtcWallet) WalletTransaction(txHash *chainhash.Hash) (*wtxmgr.TxDetail }, nil } -func (c *tBtcWallet) getTransaction(txHash *chainhash.Hash) (*GetTransactionResult, error) { - if c.getTransactionErr != nil { - return nil, c.getTransactionErr - } - var txData *GetTransactionResult - if c.getTransactionMap != nil { - if txData = c.getTransactionMap["any"]; txData == nil { - txData = c.getTransactionMap[txHash.String()] - } - } - if txData == nil { - return nil, WalletTransactionNotFound - } - return txData, nil -} - func (c *tBtcWallet) SyncedTo() waddrmgr.BlockStamp { bestHash, bestHeight := c.bestBlock() // NOTE: in reality this may be lower than the chain service's best block blk := c.getBlock(*bestHash) @@ -365,6 +342,10 @@ func (c *tBtcWallet) RemovePeer(string) error { return nil } +func (c *tBtcWallet) TotalReceivedForAddr(addr btcutil.Address, minConf int32) (btcutil.Amount, error) { + return 0, nil +} + type tNeutrinoClient struct { *testData } @@ -489,7 +470,7 @@ func TestSwapConfirmations(t *testing.T) { checkSuccess := func(tag string, expConfs uint32, expSpent bool) { t.Helper() - confs, spent, err := spv.swapConfirmations(&swapTxHash, vout, pkScript, matchTime) + confs, spent, err := spv.SwapConfirmations(&swapTxHash, vout, pkScript, matchTime) if err != nil { t.Fatalf("%s error: %v", tag, err) } @@ -503,7 +484,7 @@ func TestSwapConfirmations(t *testing.T) { checkFailure := func(tag string) { t.Helper() - _, _, err := spv.swapConfirmations(&swapTxHash, vout, pkScript, matchTime) + _, _, err := spv.SwapConfirmations(&swapTxHash, vout, pkScript, matchTime) if err == nil { t.Fatalf("no error for %q test", tag) } @@ -532,12 +513,14 @@ func TestSwapConfirmations(t *testing.T) { // DB path. node.dbBlockForTx[swapTxHash] = &hashEntry{hash: *swapBlockHash} node.dbBlockForTx[spendTxHash] = &hashEntry{hash: *spendBlockHash} - node.checkpoints[swapOutPt] = &scanCheckpoint{res: &filterScanResult{ - blockHash: swapBlockHash, - blockHeight: swapHeight, - spend: &spendingInput{}, - checkpoint: *spendBlockHash, - }} + node.checkpoints[swapOutPt] = &ScanCheckpoint{ + Res: &FilterScanResult{ + BlockHash: swapBlockHash, + BlockHeight: swapHeight, + Spend: &SpendingInput{}, + Checkpoint: *spendBlockHash, + }, + } checkSuccess("GetSpend", swapConfs, true) delete(node.checkpoints, swapOutPt) delete(node.dbBlockForTx, swapTxHash) @@ -580,9 +563,9 @@ func TestFindBlockForTime(t *testing.T) { matchTime := generateTestBlockTime(searchBlock) const offsetBlock = searchBlock - testBlocksPerBlockTimeOffset const startBlock = offsetBlock - medianTimeBlocks - height, err := spv.findBlockForTime(matchTime) + height, err := spv.FindBlockForTime(matchTime) if err != nil { - t.Fatalf("findBlockForTime error: %v", err) + t.Fatalf("FindBlockForTime error: %v", err) } if height != startBlock { t.Fatalf("wrong height. wanted %d, got %d", startBlock, height) @@ -592,27 +575,27 @@ func TestFindBlockForTime(t *testing.T) { // will continue down 11 more. _, blk := node.getBlockAtHeight(startBlock) blk.msgBlock.Header.Timestamp = generateTestBlockTime(offsetBlock) - height, err = spv.findBlockForTime(matchTime) + height, err = spv.FindBlockForTime(matchTime) if err != nil { - t.Fatalf("findBlockForTime error for shifted start block: %v", err) + t.Fatalf("FindBlockForTime error for shifted start block: %v", err) } if height != startBlock-medianTimeBlocks { t.Fatalf("wrong height. wanted %d, got %d", startBlock-11, height) } // And doing an early enough block just returns genesis - height, err = spv.findBlockForTime(generateTestBlockTime(10)) + height, err = spv.FindBlockForTime(generateTestBlockTime(10)) if err != nil { - t.Fatalf("findBlockForTime error for genesis test: %v", err) + t.Fatalf("FindBlockForTime error for genesis test: %v", err) } if height != 0 { t.Fatalf("not genesis: height = %d", height) } // A time way in the future still returns at least the last 11 blocks. - height, err = spv.findBlockForTime(generateTestBlockTime(100)) + height, err = spv.FindBlockForTime(generateTestBlockTime(100)) if err != nil { - t.Fatalf("findBlockForTime error for future test: %v", err) + t.Fatalf("FindBlockForTime error for future test: %v", err) } // +1 because tip block is included here, as opposed to the shifted start // block, where the shifted block wasn't included. @@ -647,7 +630,7 @@ func TestGetTxOut(t *testing.T) { // Abnormal error node.getTransactionErr = tErr - _, _, err := spv.getTxOut(&txHash, vout, pkScript, generateTestBlockTime(blockHeight)) + _, _, err := spv.GetTxOut(&txHash, vout, pkScript, generateTestBlockTime(blockHeight)) if err == nil { t.Fatalf("no error for getWalletTransaction error") } @@ -659,7 +642,7 @@ func TestGetTxOut(t *testing.T) { Bytes: txB, }} - _, confs, err := spv.getTxOut(&txHash, vout, pkScript, generateTestBlockTime(blockHeight)) + _, confs, err := spv.GetTxOut(&txHash, vout, pkScript, generateTestBlockTime(blockHeight)) if err != nil { t.Fatalf("error for wallet transaction found: %v", err) } @@ -670,12 +653,13 @@ func TestGetTxOut(t *testing.T) { // No wallet transaction, but we have a spend recorded. node.getTransactionErr = WalletTransactionNotFound node.getTransactionMap = nil - node.checkpoints[outPt] = &scanCheckpoint{res: &filterScanResult{ - blockHash: blockHash, - spend: &spendingInput{}, - checkpoint: *spendBlockHash, - }} - op, confs, err := spv.getTxOut(&txHash, vout, pkScript, generateTestBlockTime(blockHeight)) + node.checkpoints[outPt] = &ScanCheckpoint{ + Res: &FilterScanResult{ + BlockHash: blockHash, + Spend: &SpendingInput{}, + Checkpoint: *spendBlockHash, + }} + op, confs, err := spv.GetTxOut(&txHash, vout, pkScript, generateTestBlockTime(blockHeight)) if op != nil || confs != 0 || err != nil { t.Fatal("wrong result for spent txout", op != nil, confs, err) } @@ -686,7 +670,7 @@ func TestGetTxOut(t *testing.T) { // case 1: we have a block hash in the database node.dbBlockForTx[txHash] = &hashEntry{hash: *blockHash} node.getCFilterScripts[*blockHash] = [][]byte{pkScript} - _, _, err = spv.getTxOut(&txHash, vout, pkScript, generateTestBlockTime(blockHeight)) + _, _, err = spv.GetTxOut(&txHash, vout, pkScript, generateTestBlockTime(blockHeight)) if err != nil { t.Fatalf("error for GetUtxo with cached hash: %v", err) } @@ -694,7 +678,7 @@ func TestGetTxOut(t *testing.T) { // case 2: no block hash in db. Will do scan and store them. delete(node.dbBlockForTx, txHash) delete(node.checkpoints, outPt) - _, _, err = spv.getTxOut(&txHash, vout, pkScript, generateTestBlockTime(blockHeight)) + _, _, err = spv.GetTxOut(&txHash, vout, pkScript, generateTestBlockTime(blockHeight)) if err != nil { t.Fatalf("error for GetUtxo with no cached hash: %v", err) } @@ -705,7 +689,7 @@ func TestGetTxOut(t *testing.T) { // case 3: spending tx found first delete(node.checkpoints, outPt) node.getCFilterScripts[*spendBlockHash] = [][]byte{pkScript} - txOut, _, err := spv.getTxOut(&txHash, vout, pkScript, generateTestBlockTime(blockHeight)) + txOut, _, err := spv.GetTxOut(&txHash, vout, pkScript, generateTestBlockTime(blockHeight)) if err != nil { t.Fatalf("error for spent tx: %v", err) } @@ -714,12 +698,12 @@ func TestGetTxOut(t *testing.T) { } // Make sure we can find it with the checkpoint. - node.checkpoints[outPt].res.spend = nil + node.checkpoints[outPt].Res.Spend = nil node.getCFilterScripts[*spendBlockHash] = nil // We won't actually scan for the output itself, so nil'ing these should // have no effect. node.getCFilterScripts[*blockHash] = nil - _, _, err = spv.getTxOut(&txHash, vout, pkScript, generateTestBlockTime(blockHeight)) + _, _, err = spv.GetTxOut(&txHash, vout, pkScript, generateTestBlockTime(blockHeight)) if err != nil { t.Fatalf("error for checkpointed output: %v", err) } @@ -868,7 +852,7 @@ func TestGetBlockHeader(t *testing.T) { node.mainchain[int64(height)] = &hh } - hdr, mainchain, err := wallet.tipRedeemer.getBlockHeader(&blockHash) + hdr, mainchain, err := wallet.tipRedeemer.GetBlockHeader(&blockHash) if err != nil { t.Fatalf("initial success error: %v", err) } @@ -892,7 +876,7 @@ func TestGetBlockHeader(t *testing.T) { } node.mainchain[int64(blockHeight)] = &chainhash.Hash{0x01} // mainchain ended up with different block - hdr, mainchain, err = wallet.tipRedeemer.getBlockHeader(&blockHash) + hdr, mainchain, err = wallet.tipRedeemer.GetBlockHeader(&blockHash) if err != nil { t.Fatalf("initial success error: %v", err) } @@ -906,7 +890,7 @@ func TestGetBlockHeader(t *testing.T) { // Can't fetch header error. delete(node.verboseBlocks, blockHash) // can't find block by hash - if _, _, err := wallet.tipRedeemer.getBlockHeader(&blockHash); err == nil { + if _, _, err := wallet.tipRedeemer.GetBlockHeader(&blockHash); err == nil { t.Fatalf("Can't fetch header error not propagated") } node.verboseBlocks[blockHash] = &blockHdr // clean up @@ -917,7 +901,7 @@ func TestGetBlockHeader(t *testing.T) { 0: node.mainchain[0], 1: node.mainchain[1], } - hdr, mainchain, err = wallet.tipRedeemer.getBlockHeader(&blockHash) + hdr, mainchain, err = wallet.tipRedeemer.GetBlockHeader(&blockHash) if err != nil { t.Fatalf("invalid tip height not noticed") } diff --git a/client/asset/btc/spv_wrapper.go b/client/asset/btc/spv_wrapper.go index 61477a69c5..9a47d3511c 100644 --- a/client/asset/btc/spv_wrapper.go +++ b/client/asset/btc/spv_wrapper.go @@ -100,9 +100,6 @@ type BTCWallet interface { WaitForShutdown() ChainSynced() bool // currently unused AccountProperties(scope waddrmgr.KeyScope, acct uint32) (*waddrmgr.AccountProperties, error) - // AccountInfo returns the account information of the wallet for use by the - // exchange wallet. - AccountInfo() XCWalletAccount // The below methods are not implemented by *wallet.Wallet, so must be // implemented by the BTCWallet implementation. WalletTransaction(txHash *chainhash.Hash) (*wtxmgr.TxDetails, error) @@ -118,11 +115,8 @@ type BTCWallet interface { AddPeer(string) error RemovePeer(string) error GetTransactions(startHeight, endHeight int32, accountName string, cancel <-chan struct{}) (*wallet.GetTransactionsResult, error) -} - -type XCWalletAccount struct { - AccountName string - AccountNumber uint32 + ListSinceBlock(start, end, syncHeight int32) ([]btcjson.ListTransactionsResult, error) + TotalReceivedForAddr(addr btcutil.Address, minConf int32) (btcutil.Amount, error) } // BlockNotification is block hash and height delivered by a BTCWallet when it @@ -211,6 +205,7 @@ type spvWallet struct { wallet BTCWallet cl SPVService acctNum uint32 + acctName string dir string decodeAddr dexbtc.AddressDecoder @@ -226,9 +221,9 @@ type spvWallet struct { var _ Wallet = (*spvWallet)(nil) var _ tipNotifier = (*spvWallet)(nil) -// reconfigure attempts to reconfigure the rpcClient for the new settings. Live +// Reconfigure attempts to reconfigure the rpcClient for the new settings. Live // reconfiguration is only attempted if the new wallet type is walletTypeSPV. -func (w *spvWallet) reconfigure(cfg *asset.WalletConfig, currentAddress string) (restartRequired bool, err error) { +func (w *spvWallet) Reconfigure(cfg *asset.WalletConfig, currentAddress string) (restartRequired bool, err error) { // If the wallet type is not SPV, then we can't reconfigure the wallet. if cfg.Type != walletTypeSPV { restartRequired = true @@ -258,11 +253,11 @@ func (w *spvWallet) RawRequest(ctx context.Context, method string, params []json return nil, errors.New("RawRequest not available on spv") } -func (w *spvWallet) ownsAddress(addr btcutil.Address) (bool, error) { +func (w *spvWallet) OwnsAddress(addr btcutil.Address) (bool, error) { return w.wallet.HaveAddress(addr) } -func (w *spvWallet) sendRawTransaction(tx *wire.MsgTx) (*chainhash.Hash, error) { +func (w *spvWallet) SendRawTransaction(tx *wire.MsgTx) (*chainhash.Hash, error) { // Publish the transaction in a goroutine so the caller may wait for a given // period before it goes asynchronous and it is assumed that btcwallet at // least succeeded with its DB updates and queueing of the transaction for @@ -306,7 +301,11 @@ func (w *spvWallet) sendRawTransaction(tx *wire.MsgTx) (*chainhash.Hash, error) return &txHash, nil } -func (w *spvWallet) getBlock(blockHash chainhash.Hash) (*wire.MsgBlock, error) { +func (w *spvWallet) GetBlockHeaderVerbose(blockHash *chainhash.Hash) (*wire.BlockHeader, error) { + return w.cl.GetBlockHeader(blockHash) +} + +func (w *spvWallet) GetBlock(blockHash chainhash.Hash) (*wire.MsgBlock, error) { block, err := w.cl.GetBlock(blockHash) if err != nil { return nil, fmt.Errorf("neutrino GetBlock error: %v", err) @@ -315,27 +314,25 @@ func (w *spvWallet) getBlock(blockHash chainhash.Hash) (*wire.MsgBlock, error) { return block.MsgBlock(), nil } -func (w *spvWallet) getBlockHash(blockHeight int64) (*chainhash.Hash, error) { +func (w *spvWallet) GetBlockHash(blockHeight int64) (*chainhash.Hash, error) { return w.cl.GetBlockHash(blockHeight) } -// getBlockHeight gets the mainchain height for the specified block. Returns -// error for orphaned blocks. -func (w *spvWallet) getBlockHeight(h *chainhash.Hash) (int32, error) { +func (w *spvWallet) GetBlockHeight(h *chainhash.Hash) (int32, error) { return w.cl.GetBlockHeight(h) } -func (w *spvWallet) getBestBlockHash() (*chainhash.Hash, error) { +func (w *spvWallet) GetBestBlockHash() (*chainhash.Hash, error) { blk := w.wallet.SyncedTo() return &blk.Hash, nil } -// getBestBlockHeight returns the height of the best block processed by the +// GetBestBlockHeight returns the height of the best block processed by the // wallet, which indicates the height at which the compact filters have been // retrieved and scanned for wallet addresses. This is may be less than // getChainHeight, which indicates the height that the chain service has reached // in its retrieval of block headers and compact filter headers. -func (w *spvWallet) getBestBlockHeight() (int32, error) { +func (w *spvWallet) GetBestBlockHeight() (int32, error) { return w.wallet.SyncedTo().Height, nil } @@ -348,15 +345,15 @@ func (w *spvWallet) getChainStamp(blockHash *chainhash.Hash) (stamp time.Time, p return hdr.Timestamp, &hdr.PrevBlock, nil } -// medianTime is the median time for the current best block. -func (w *spvWallet) medianTime() (time.Time, error) { +// MedianTime is the median time for the current best block. +func (w *spvWallet) MedianTime() (time.Time, error) { blk := w.wallet.SyncedTo() return CalcMedianTime(w.getChainStamp, &blk.Hash) } -// getChainHeight is only for confirmations since it does not reflect the wallet +// GetChainHeight is only for confirmations since it does not reflect the wallet // manager's sync height, just the chain service. -func (w *spvWallet) getChainHeight() (int32, error) { +func (w *spvWallet) GetChainHeight() (int32, error) { blk, err := w.cl.BestBlock() if err != nil { return -1, err @@ -364,7 +361,7 @@ func (w *spvWallet) getChainHeight() (int32, error) { return blk.Height, err } -func (w *spvWallet) peerCount() (uint32, error) { +func (w *spvWallet) PeerCount() (uint32, error) { return uint32(len(w.cl.Peers())), nil } @@ -406,7 +403,7 @@ func (w *spvWallet) syncHeight() int32 { // the chain service sync stage that comes before the wallet has performed any // address recovery/rescan, and switch to the wallet's sync height when it // reports non-zero height. -func (w *spvWallet) syncStatus() (*asset.SyncStatus, error) { +func (w *spvWallet) SyncStatus() (*asset.SyncStatus, error) { // Chain service headers (block and filter) height. chainBlk, err := w.cl.BestBlock() if err != nil { @@ -496,8 +493,7 @@ func (w *spvWallet) ownsInputs(txid string) bool { return true } -func (w *spvWallet) listTransactionsSinceBlock(blockHeight int32) ([]*ListTransactionsResult, error) { - acctName := w.wallet.AccountInfo().AccountName +func (w *spvWallet) ListTransactionsSinceBlock(blockHeight int32) ([]*ListTransactionsResult, error) { tip, err := w.cl.BestBlock() if err != nil { return nil, fmt.Errorf("BestBlock error: %v", err) @@ -506,7 +502,7 @@ func (w *spvWallet) listTransactionsSinceBlock(blockHeight int32) ([]*ListTransa // We use GetTransactions instead of ListSinceBlock, because ListSinceBlock // does not include transactions that pay to a change address, which // Redeem, Refund, and RedeemBond do. - res, err := w.wallet.GetTransactions(blockHeight, tip.Height, acctName, nil) + res, err := w.wallet.GetTransactions(blockHeight, tip.Height, w.acctName, nil) if err != nil { return nil, err } @@ -538,9 +534,9 @@ func (w *spvWallet) listTransactionsSinceBlock(blockHeight int32) ([]*ListTransa } // balances retrieves a wallet's balance details. -func (w *spvWallet) balances() (*GetBalancesResult, error) { +func (w *spvWallet) Balances() (*GetBalancesResult, error) { // Determine trusted vs untrusted coins with listunspent. - unspents, err := w.wallet.ListUnspent(0, math.MaxInt32, w.wallet.AccountInfo().AccountName) + unspents, err := w.wallet.ListUnspent(0, math.MaxInt32, w.acctName) if err != nil { return nil, fmt.Errorf("error listing unspent outputs: %w", err) } @@ -575,9 +571,9 @@ func (w *spvWallet) balances() (*GetBalancesResult, error) { }, nil } -// listUnspent retrieves list of the wallet's UTXOs. -func (w *spvWallet) listUnspent() ([]*ListUnspentResult, error) { - unspents, err := w.wallet.ListUnspent(0, math.MaxInt32, w.wallet.AccountInfo().AccountName) +// ListUnspent retrieves list of the wallet's UTXOs. +func (w *spvWallet) ListUnspent() ([]*ListUnspentResult, error) { + unspents, err := w.wallet.ListUnspent(0, math.MaxInt32, w.acctName) if err != nil { return nil, err } @@ -619,10 +615,10 @@ func (w *spvWallet) listUnspent() ([]*ListUnspentResult, error) { return res, nil } -// lockUnspent locks and unlocks outputs for spending. An output that is part of +// LockUnspent locks and unlocks outputs for spending. An output that is part of // an order, but not yet spent, should be locked until spent or until the order // is canceled or fails. -func (w *spvWallet) lockUnspent(unlock bool, ops []*Output) error { +func (w *spvWallet) LockUnspent(unlock bool, ops []*Output) error { switch { case unlock && len(ops) == 0: w.wallet.ResetLockedOutpoints() @@ -639,9 +635,9 @@ func (w *spvWallet) lockUnspent(unlock bool, ops []*Output) error { return nil } -// listLockUnspent returns a slice of outpoints for all unspent outputs marked +// ListLockUnspent returns a slice of outpoints for all unspent outputs marked // as locked by a wallet. -func (w *spvWallet) listLockUnspent() ([]*RPCOutpoint, error) { +func (w *spvWallet) ListLockUnspent() ([]*RPCOutpoint, error) { outpoints := w.wallet.LockedOutpoints() pts := make([]*RPCOutpoint, 0, len(outpoints)) for _, pt := range outpoints { @@ -653,28 +649,28 @@ func (w *spvWallet) listLockUnspent() ([]*RPCOutpoint, error) { return pts, nil } -// changeAddress gets a new internal address from the wallet. The address will +// ChangeAddress gets a new internal address from the wallet. The address will // be bech32-encoded (P2WPKH). -func (w *spvWallet) changeAddress() (btcutil.Address, error) { +func (w *spvWallet) ChangeAddress() (btcutil.Address, error) { return w.wallet.NewChangeAddress(w.acctNum, waddrmgr.KeyScopeBIP0084) } -// externalAddress gets a new bech32-encoded (P2WPKH) external address from the +// ExternalAddress gets a new bech32-encoded (P2WPKH) external address from the // wallet. -func (w *spvWallet) externalAddress() (btcutil.Address, error) { +func (w *spvWallet) ExternalAddress() (btcutil.Address, error) { return w.wallet.NewAddress(w.acctNum, waddrmgr.KeyScopeBIP0084) } // signTx attempts to have the wallet sign the transaction inputs. -func (w *spvWallet) signTx(tx *wire.MsgTx) (*wire.MsgTx, error) { +func (w *spvWallet) SignTx(tx *wire.MsgTx) (*wire.MsgTx, error) { // Can't use btcwallet.Wallet.SignTransaction, because it doesn't work for // segwit transactions (for real?). return tx, w.wallet.SignTx(tx) } -// privKeyForAddress retrieves the private key associated with the specified +// PrivKeyForAddress retrieves the private key associated with the specified // address. -func (w *spvWallet) privKeyForAddress(addr string) (*btcec.PrivateKey, error) { +func (w *spvWallet) PrivKeyForAddress(addr string) (*btcec.PrivateKey, error) { a, err := w.decodeAddr(addr, w.chainParams) if err != nil { return nil, err @@ -693,25 +689,25 @@ func (w *spvWallet) Lock() error { return nil } -// estimateSendTxFee callers should provide at least one output value. -func (w *spvWallet) estimateSendTxFee(tx *wire.MsgTx, feeRate uint64, subtract bool) (fee uint64, err error) { +// EstimateSendTxFee callers should provide at least one output value. +func (w *spvWallet) EstimateSendTxFee(tx *wire.MsgTx, feeRate uint64, subtract bool) (fee uint64, err error) { minTxSize := uint64(tx.SerializeSize()) var sendAmount uint64 for _, txOut := range tx.TxOut { sendAmount += uint64(txOut.Value) } - unspents, err := w.listUnspent() + unspents, err := w.ListUnspent() if err != nil { return 0, fmt.Errorf("error listing unspent outputs: %w", err) } - utxos, _, _, err := convertUnspent(0, unspents, w.chainParams) + utxos, _, _, err := ConvertUnspent(0, unspents, w.chainParams) if err != nil { return 0, fmt.Errorf("error converting unspent outputs: %w", err) } - enough := sendEnough(sendAmount, feeRate, subtract, minTxSize, true, false) + enough := SendEnough(sendAmount, feeRate, subtract, minTxSize, true, false) sum, _, inputsSize, _, _, _, _, err := TryFund(utxos, enough) if err != nil { return 0, err @@ -752,11 +748,11 @@ func (w *spvWallet) estimateSendTxFee(tx *wire.MsgTx, feeRate uint64, subtract b return finalFee, nil } -// swapConfirmations attempts to get the number of confirmations and the spend +// SwapConfirmations attempts to get the number of confirmations and the spend // status for the specified tx output. For swap outputs that were not generated // by this wallet, startTime must be supplied to limit the search. Use the match // time assigned by the server. -func (w *spvWallet) swapConfirmations(txHash *chainhash.Hash, vout uint32, pkScript []byte, +func (w *spvWallet) SwapConfirmations(txHash *chainhash.Hash, vout uint32, pkScript []byte, startTime time.Time) (confs uint32, spent bool, err error) { // First, check if it's a wallet transaction. We probably won't be able @@ -792,7 +788,7 @@ func (w *spvWallet) swapConfirmations(txHash *chainhash.Hash, vout uint32, pkScr // status, but it will allow us to short circuit a longer scan if we already // know the output is spent. if blockHash == nil { - blockHash, _ = w.mainchainBlockForStoredTx(txHash) + blockHash, _ = w.MainchainBlockForStoredTx(txHash) } // Our last option is neutrino. @@ -805,7 +801,7 @@ func (w *spvWallet) swapConfirmations(txHash *chainhash.Hash, vout uint32, pkScr return 0, false, err } - if utxo.spend == nil && utxo.blockHash == nil { + if utxo.Spend == nil && utxo.BlockHash == nil { if assumedMempool { w.log.Tracef("swapConfirmations - scanFilters did not find %v:%d, assuming in mempool.", txHash, vout) @@ -817,15 +813,15 @@ func (w *spvWallet) swapConfirmations(txHash *chainhash.Hash, vout uint32, pkScr txHash, vout, startTime, pkScript) } - if utxo.blockHash != nil { - bestHeight, err := w.getChainHeight() + if utxo.BlockHash != nil { + bestHeight, err := w.GetChainHeight() if err != nil { return 0, false, fmt.Errorf("getBestBlockHeight error: %v", err) } - confs = uint32(bestHeight) - utxo.blockHeight + 1 + confs = uint32(bestHeight) - utxo.BlockHeight + 1 } - if utxo.spend != nil { + if utxo.Spend != nil { // In the off-chance that a spend was found but not the output itself, // confs will be incorrect here. // In situations where we're looking for the counter-party's swap, we @@ -841,16 +837,16 @@ func (w *spvWallet) swapConfirmations(txHash *chainhash.Hash, vout uint32, pkScr return confs, false, nil } -func (w *spvWallet) locked() bool { +func (w *spvWallet) Locked() bool { return w.wallet.Locked() } -func (w *spvWallet) walletLock() error { +func (w *spvWallet) WalletLock() error { w.wallet.Lock() return nil } -func (w *spvWallet) walletUnlock(pw []byte) error { +func (w *spvWallet) WalletUnlock(pw []byte) error { return w.Unlock(pw) } @@ -858,10 +854,9 @@ func (w *spvWallet) getBlockHeaderVerbose(blockHash *chainhash.Hash) (*wire.Bloc return w.cl.GetBlockHeader(blockHash) } -// getBlockHeader gets the *blockHeader for the specified block hash. It also // returns a bool value to indicate whether this block is a part of main chain. // For orphaned blocks header.Confirmations is negative. -func (w *spvWallet) getBlockHeader(blockHash *chainhash.Hash) (header *BlockHeader, mainchain bool, err error) { +func (w *spvWallet) GetBlockHeader(blockHash *chainhash.Hash) (header *BlockHeader, mainchain bool, err error) { hdr, err := w.cl.GetBlockHeader(blockHash) if err != nil { return nil, false, err @@ -878,7 +873,7 @@ func (w *spvWallet) getBlockHeader(blockHash *chainhash.Hash) (header *BlockHead } confirmations := int64(-1) - mainchain = w.blockIsMainchain(blockHash, blockHeight) + mainchain = w.BlockIsMainchain(blockHash, blockHeight) if mainchain { confirmations = int64(confirms(blockHeight, tip.Height)) } @@ -892,12 +887,12 @@ func (w *spvWallet) getBlockHeader(blockHash *chainhash.Hash) (header *BlockHead }, mainchain, nil } -func (w *spvWallet) getBestBlockHeader() (*BlockHeader, error) { - hash, err := w.getBestBlockHash() +func (w *spvWallet) GetBestBlockHeader() (*BlockHeader, error) { + hash, err := w.GetBestBlockHash() if err != nil { return nil, err } - hdr, _, err := w.getBlockHeader(hash) + hdr, _, err := w.GetBlockHeader(hash) return hdr, err } @@ -905,8 +900,8 @@ func (w *spvWallet) logFilePath() string { return filepath.Join(w.dir, logDirName, logFileName) } -// connect will start the wallet and begin syncing. -func (w *spvWallet) connect(ctx context.Context, wg *sync.WaitGroup) (err error) { +// Connect will start the wallet and begin syncing. +func (w *spvWallet) Connect(ctx context.Context, wg *sync.WaitGroup) (err error) { w.cl, err = w.wallet.Start() if err != nil { return err @@ -1063,9 +1058,9 @@ func (w *spvWallet) numDerivedAddresses() (internal, external uint32, err error) return props.InternalKeyCount, props.ExternalKeyCount, nil } -// fingerprint returns an identifier for this wallet. It is the hash of the +// Fingerprint returns an identifier for this wallet. It is the hash of the // compressed serialization of the account pub key. -func (w *spvWallet) fingerprint() (string, error) { +func (w *spvWallet) Fingerprint() (string, error) { props, err := w.wallet.AccountProperties(waddrmgr.KeyScopeBIP0084, w.acctNum) if err != nil { return "", err @@ -1083,10 +1078,10 @@ func (w *spvWallet) fingerprint() (string, error) { return hex.EncodeToString(btcutil.Hash160(pk.SerializeCompressed())), nil } -// getTxOut finds an unspent transaction output and its number of confirmations. +// GetTxOut finds an unspent transaction output and its number of confirmations. // To match the behavior of the RPC method, even if an output is found, if it's // known to be spent, no *wire.TxOut and no error will be returned. -func (w *spvWallet) getTxOut(txHash *chainhash.Hash, vout uint32, pkScript []byte, startTime time.Time) (*wire.TxOut, uint32, error) { +func (w *spvWallet) GetTxOut(txHash *chainhash.Hash, vout uint32, pkScript []byte, startTime time.Time) (*wire.TxOut, uint32, error) { // Check for a wallet transaction first txDetails, err := w.wallet.WalletTransaction(txHash) var blockHash *chainhash.Hash @@ -1132,7 +1127,7 @@ func (w *spvWallet) getTxOut(txHash *chainhash.Hash, vout uint32, pkScript []byt return nil, 0, err } - if utxo == nil || utxo.spend != nil || utxo.blockHash == nil { + if utxo == nil || utxo.Spend != nil || utxo.BlockHash == nil { return nil, 0, nil } @@ -1141,14 +1136,14 @@ func (w *spvWallet) getTxOut(txHash *chainhash.Hash, vout uint32, pkScript []byt return nil, 0, fmt.Errorf("BestBlock error: %v", err) } - confs := uint32(confirms(int32(utxo.blockHeight), tip.Height)) + confs := uint32(confirms(int32(utxo.BlockHeight), tip.Height)) - return utxo.txOut, confs, nil + return utxo.TxOut, confs, nil } // matchPkScript pulls the filter for the block and attempts to match the // supplied scripts. -func (w *spvWallet) matchPkScript(blockHash *chainhash.Hash, scripts [][]byte) (bool, error) { +func (w *spvWallet) MatchPkScript(blockHash *chainhash.Hash, scripts [][]byte) (bool, error) { filter, err := w.cl.GetCFilter(*blockHash, wire.GCSFilterRegular) if err != nil { return false, fmt.Errorf("GetCFilter error: %w", err) @@ -1168,9 +1163,9 @@ func (w *spvWallet) matchPkScript(blockHash *chainhash.Hash, scripts [][]byte) ( return matchFound, nil } -// searchBlockForRedemptions attempts to find spending info for the specified +// SearchBlockForRedemptions attempts to find spending info for the specified // contracts by searching every input of all txs in the provided block range. -func (w *spvWallet) searchBlockForRedemptions(ctx context.Context, reqs map[OutPoint]*FindRedemptionReq, +func (w *spvWallet) SearchBlockForRedemptions(ctx context.Context, reqs map[OutPoint]*FindRedemptionReq, blockHash chainhash.Hash) (discovered map[OutPoint]*FindRedemptionResult) { // Just match all the scripts together. @@ -1181,7 +1176,7 @@ func (w *spvWallet) searchBlockForRedemptions(ctx context.Context, reqs map[OutP discovered = make(map[OutPoint]*FindRedemptionResult, len(reqs)) - matchFound, err := w.matchPkScript(&blockHash, scripts) + matchFound, err := w.MatchPkScript(&blockHash, scripts) if err != nil { w.log.Errorf("matchPkScript error: %v", err) return @@ -1199,7 +1194,7 @@ func (w *spvWallet) searchBlockForRedemptions(ctx context.Context, reqs map[OutP } for _, msgTx := range block.MsgBlock().Transactions { - newlyDiscovered := findRedemptionsInTxWithHasher(ctx, true, reqs, msgTx, w.chainParams, hashTx) + newlyDiscovered := FindRedemptionsInTxWithHasher(ctx, true, reqs, msgTx, w.chainParams, hashTx) for outPt, res := range newlyDiscovered { discovered[outPt] = res } @@ -1207,8 +1202,8 @@ func (w *spvWallet) searchBlockForRedemptions(ctx context.Context, reqs map[OutP return } -// findRedemptionsInMempool is unsupported for SPV. -func (w *spvWallet) findRedemptionsInMempool(ctx context.Context, reqs map[OutPoint]*FindRedemptionReq) (discovered map[OutPoint]*FindRedemptionResult) { +// FindRedemptionsInMempool is unsupported for SPV. +func (w *spvWallet) FindRedemptionsInMempool(ctx context.Context, reqs map[OutPoint]*FindRedemptionReq) (discovered map[OutPoint]*FindRedemptionResult) { return } @@ -1222,7 +1217,7 @@ func (w *spvWallet) confirmations(txHash *chainhash.Hash, vout uint32) (blockHas if details.Block.Hash != (chainhash.Hash{}) { blockHash = &details.Block.Hash - height, err := w.getChainHeight() + height, err := w.GetChainHeight() if err != nil { return nil, 0, false, err } @@ -1237,12 +1232,12 @@ func (w *spvWallet) confirmations(txHash *chainhash.Hash, vout uint32) (blockHas return blockHash, confs, false, SpentStatusUnknown } -// getWalletTransaction checks the wallet database for the specified +// GetWalletTransaction checks the wallet database for the specified // transaction. Only transactions with output scripts that pay to the wallet or // transactions that spend wallet outputs are stored in the wallet database. // This is pretty much copy-paste from btcwallet 'gettransaction' JSON-RPC // handler. -func (w *spvWallet) getWalletTransaction(txHash *chainhash.Hash) (*GetTransactionResult, error) { +func (w *spvWallet) GetWalletTransaction(txHash *chainhash.Hash) (*GetTransactionResult, error) { // Option # 1 just copies from UnstableAPI.TxDetails. Duplicating the // unexported bucket key feels dirty. // @@ -1316,6 +1311,20 @@ func (w *spvWallet) getWalletTransaction(txHash *chainhash.Hash) (*GetTransactio */ } +func (w *spvWallet) AddressUsed(addrStr string) (bool, error) { + addr, err := w.decodeAddr(addrStr, w.chainParams) + if err != nil { + return false, fmt.Errorf("error decoding address: %w", err) + } + + const minConfs = 0 + amt, err := w.wallet.TotalReceivedForAddr(addr, minConfs) + if err != nil { + return false, fmt.Errorf("error getting address received: %v", err) + } + return amt != 0, nil +} + func confirms(txHeight, curHeight int32) int32 { switch { case txHeight == -1, txHeight > curHeight: diff --git a/client/asset/btc/wallet.go b/client/asset/btc/wallet.go index 963359f768..3389680ef7 100644 --- a/client/asset/btc/wallet.go +++ b/client/asset/btc/wallet.go @@ -18,46 +18,47 @@ import ( // all requests with a context.Context. type Wallet interface { RawRequester // for localFeeRate/rpcFeeRate calls - connect(ctx context.Context, wg *sync.WaitGroup) error - sendRawTransaction(tx *wire.MsgTx) (*chainhash.Hash, error) - getTxOut(txHash *chainhash.Hash, index uint32, pkScript []byte, startTime time.Time) (*wire.TxOut, uint32, error) - getBlockHash(blockHeight int64) (*chainhash.Hash, error) - getBestBlockHash() (*chainhash.Hash, error) - getBestBlockHeight() (int32, error) - medianTime() (time.Time, error) - balances() (*GetBalancesResult, error) - listUnspent() ([]*ListUnspentResult, error) // must not return locked coins - lockUnspent(unlock bool, ops []*Output) error - listLockUnspent() ([]*RPCOutpoint, error) - changeAddress() (btcutil.Address, error) // warning: don't just use the Stringer if there's a "recode" function for a clone e.g. BCH - externalAddress() (btcutil.Address, error) - signTx(inTx *wire.MsgTx) (*wire.MsgTx, error) - privKeyForAddress(addr string) (*btcec.PrivateKey, error) - walletUnlock(pw []byte) error - walletLock() error - locked() bool - syncStatus() (*asset.SyncStatus, error) - peerCount() (uint32, error) - swapConfirmations(txHash *chainhash.Hash, vout uint32, contract []byte, startTime time.Time) (confs uint32, spent bool, err error) - getBestBlockHeader() (*BlockHeader, error) - ownsAddress(addr btcutil.Address) (bool, error) // this should probably just take a string - getWalletTransaction(txHash *chainhash.Hash) (*GetTransactionResult, error) - reconfigure(walletCfg *asset.WalletConfig, currentAddress string) (restartRequired bool, err error) - fingerprint() (string, error) - listTransactionsSinceBlock(blockHeight int32) ([]*ListTransactionsResult, error) + Connect(ctx context.Context, wg *sync.WaitGroup) error + SendRawTransaction(tx *wire.MsgTx) (*chainhash.Hash, error) + GetTxOut(txHash *chainhash.Hash, index uint32, pkScript []byte, startTime time.Time) (*wire.TxOut, uint32, error) + GetBlockHash(blockHeight int64) (*chainhash.Hash, error) + GetBestBlockHash() (*chainhash.Hash, error) + GetBestBlockHeight() (int32, error) + MedianTime() (time.Time, error) + Balances() (*GetBalancesResult, error) + ListUnspent() ([]*ListUnspentResult, error) // must not return locked coins + LockUnspent(unlock bool, ops []*Output) error + ListLockUnspent() ([]*RPCOutpoint, error) + ChangeAddress() (btcutil.Address, error) // warning: don't just use the Stringer if there's a "recode" function for a clone e.g. BCH + ExternalAddress() (btcutil.Address, error) + SignTx(inTx *wire.MsgTx) (*wire.MsgTx, error) + PrivKeyForAddress(addr string) (*btcec.PrivateKey, error) + WalletUnlock(pw []byte) error + WalletLock() error + Locked() bool + SyncStatus() (*asset.SyncStatus, error) + PeerCount() (uint32, error) + SwapConfirmations(txHash *chainhash.Hash, vout uint32, contract []byte, startTime time.Time) (confs uint32, spent bool, err error) + GetBestBlockHeader() (*BlockHeader, error) + OwnsAddress(addr btcutil.Address) (bool, error) // this should probably just take a string + GetWalletTransaction(txHash *chainhash.Hash) (*GetTransactionResult, error) + Reconfigure(walletCfg *asset.WalletConfig, currentAddress string) (restartRequired bool, err error) + Fingerprint() (string, error) + ListTransactionsSinceBlock(blockHeight int32) ([]*ListTransactionsResult, error) + AddressUsed(addr string) (bool, error) } -type tipRedemptionWallet interface { +type TipRedemptionWallet interface { Wallet - getBlockHeight(*chainhash.Hash) (int32, error) - getBlockHeader(blockHash *chainhash.Hash) (hdr *BlockHeader, mainchain bool, err error) - getBlock(h chainhash.Hash) (*wire.MsgBlock, error) - searchBlockForRedemptions(ctx context.Context, reqs map[OutPoint]*FindRedemptionReq, blockHash chainhash.Hash) (discovered map[OutPoint]*FindRedemptionResult) - findRedemptionsInMempool(ctx context.Context, reqs map[OutPoint]*FindRedemptionReq) (discovered map[OutPoint]*FindRedemptionResult) + GetBlockHeight(*chainhash.Hash) (int32, error) + GetBlockHeader(blockHash *chainhash.Hash) (hdr *BlockHeader, mainchain bool, err error) + GetBlock(h chainhash.Hash) (*wire.MsgBlock, error) + SearchBlockForRedemptions(ctx context.Context, reqs map[OutPoint]*FindRedemptionReq, blockHash chainhash.Hash) (discovered map[OutPoint]*FindRedemptionResult) + FindRedemptionsInMempool(ctx context.Context, reqs map[OutPoint]*FindRedemptionReq) (discovered map[OutPoint]*FindRedemptionResult) } -type txFeeEstimator interface { - estimateSendTxFee(tx *wire.MsgTx, feeRate uint64, subtract bool) (fee uint64, err error) +type TxFeeEstimator interface { + EstimateSendTxFee(tx *wire.MsgTx, feeRate uint64, subtract bool) (fee uint64, err error) } // walletTxChecker provide a fast wallet tx query when block info not needed. diff --git a/client/asset/dash/dash.go b/client/asset/dash/dash.go index 508abbd9d9..71cbeb08ea 100644 --- a/client/asset/dash/dash.go +++ b/client/asset/dash/dash.go @@ -5,6 +5,7 @@ package dash import ( "fmt" + "strconv" "decred.org/dcrdex/client/asset" "decred.org/dcrdex/client/asset/btc" @@ -29,7 +30,7 @@ var ( Key: "fallbackfee", DisplayName: "Fallback fee rate", Description: "Dash's 'fallbackfee' rate. Units: DASH/kB", - DefaultValue: dexdash.DefaultFee * 1000 / 1e8, + DefaultValue: strconv.FormatFloat(dexdash.DefaultFee*1000/1e8, 'f', -1, 64), }, { Key: "feeratelimit", @@ -38,7 +39,7 @@ var ( "pay on swap transactions. If feeratelimit is lower than a market's " + "maxfeerate, you will not be able to trade on that market with this " + "wallet. Units: DASH/kB", - DefaultValue: dexdash.DefaultFeeRateLimit * 1000 / 1e8, + DefaultValue: strconv.FormatFloat(dexdash.DefaultFeeRateLimit*1000/1e8, 'f', -1, 64), }, { Key: "redeemconftarget", @@ -46,7 +47,7 @@ var ( Description: "The target number of blocks for the redeem transaction " + "to be mined. Used to set the transaction's fee rate. " + "(default: 2 blocks)", - DefaultValue: defaultRedeemConfTarget, + DefaultValue: strconv.FormatUint(defaultRedeemConfTarget, 10), }, { Key: "txsplit", @@ -56,7 +57,7 @@ var ( "during match settlement, or the order is canceled. This an extra transaction for which network mining fees are paid. " + "Used only for standing-type orders, e.g. limit orders without immediate time-in-force.", IsBoolean: true, - DefaultValue: true, + DefaultValue: "true", }, }...) diff --git a/client/asset/dcr/dcr.go b/client/asset/dcr/dcr.go index ff557bdffd..e3f39c3c4c 100644 --- a/client/asset/dcr/dcr.go +++ b/client/asset/dcr/dcr.go @@ -126,13 +126,13 @@ var ( // be tried over and over with wallet in SPV mode. maxRedeemMempoolAge = time.Hour * 2 - walletOpts = []*asset.ConfigOption{ + WalletOpts = []*asset.ConfigOption{ { Key: "fallbackfee", DisplayName: "Fallback fee rate", Description: "The fee rate to use for fee payment and withdrawals when " + "estimatesmartfee is not available. Units: DCR/kB", - DefaultValue: defaultFee * 1000 / 1e8, + DefaultValue: strconv.FormatFloat(defaultFee*1000/1e8, 'f', -1, 64), }, { Key: "feeratelimit", @@ -141,7 +141,7 @@ var ( "pay on swap transactions. If feeratelimit is lower than a market's " + "maxfeerate, you will not be able to trade on that market with this " + "wallet. Units: DCR/kB", - DefaultValue: defaultFeeRateLimit * 1000 / 1e8, + DefaultValue: strconv.FormatFloat(defaultFeeRateLimit*1000/1e8, 'f', -1, 64), }, { Key: "redeemconftarget", @@ -149,13 +149,13 @@ var ( Description: "The target number of blocks for the redeem transaction " + "to get a confirmation. Used to set the transaction's fee rate." + " (default: 1 block)", - DefaultValue: defaultRedeemConfTarget, + DefaultValue: strconv.FormatUint(defaultRedeemConfTarget, 10), }, { Key: "gaplimit", DisplayName: "Address Gap Limit", Description: "The gap limit for used address discovery", - DefaultValue: wallet.DefaultGapLimit, + DefaultValue: strconv.FormatUint(uint64(wallet.DefaultGapLimit), 10), }, { Key: "txsplit", @@ -167,7 +167,7 @@ var ( "the order is canceled. This an extra transaction for which network " + "mining fees are paid.", IsBoolean: true, - DefaultValue: true, // cheap fees, helpful for bond reserves, and adjustable at order-time + DefaultValue: "true", // cheap fees, helpful for bond reserves, and adjustable at order-time }, { Key: "apifeefallback", @@ -176,7 +176,7 @@ var ( "This is useful as a fallback for SPV wallets and RPC wallets " + "that have recently been started.", IsBoolean: true, - DefaultValue: true, + DefaultValue: "true", }, } @@ -234,7 +234,7 @@ var ( Description: "Allow split funding transactions that pre-size outputs to " + "prevent excessive overlock.", IsBoolean: true, - DefaultValue: true, + DefaultValue: "true", }, }, { @@ -243,7 +243,7 @@ var ( DisplayName: "Multi split buffer", Description: "Add an integer percent buffer to split output amounts to " + "facilitate output reuse. This is only required for quote assets.", - DefaultValue: 5, + DefaultValue: "5", DependsOn: multiSplitKey, }, QuoteAssetOnly: true, @@ -276,7 +276,7 @@ var ( Type: walletTypeSPV, Tab: "Native", Description: "Use the built-in SPV wallet", - ConfigOpts: walletOpts, + ConfigOpts: WalletOpts, Seeded: true, MultiFundingOpts: multiFundingOpts, }, @@ -285,7 +285,7 @@ var ( Tab: "External", Description: "Connect to dcrwallet", DefaultConfigPath: defaultConfigPath, - ConfigOpts: append(rpcOpts, walletOpts...), + ConfigOpts: append(rpcOpts, WalletOpts...), MultiFundingOpts: multiFundingOpts, }, }, @@ -707,6 +707,7 @@ var _ asset.Bonder = (*ExchangeWallet)(nil) var _ asset.Authenticator = (*ExchangeWallet)(nil) var _ asset.TicketBuyer = (*ExchangeWallet)(nil) var _ asset.WalletHistorian = (*ExchangeWallet)(nil) +var _ asset.NewAddresser = (*ExchangeWallet)(nil) type block struct { height int64 @@ -1268,15 +1269,16 @@ func (dcr *ExchangeWallet) SetBondReserves(reserves uint64) { func (dcr *ExchangeWallet) FeeRate() uint64 { const confTarget = 2 // 1 historically gives crazy rates rate, err := dcr.feeRate(confTarget) - if err != nil && dcr.network != dex.Simnet { // log and return 0 - dcr.log.Errorf("feeRate error: %v", err) + if err != nil { + dcr.log.Debugf("feeRate error: %v", err) + return 0 } return rate } // feeRate returns the current optimal fee rate in atoms / byte. func (dcr *ExchangeWallet) feeRate(confTarget uint64) (uint64, error) { - if dcr.ctx == nil { + if !dcr.connected.Load() { return 0, errors.New("not connected") } if feeEstimator, is := dcr.wallet.(FeeRateEstimator); is && !dcr.wallet.SpvMode() { @@ -1387,7 +1389,7 @@ func fetchFeeFromOracle(ctx context.Context, net dex.Network, nb uint64) (float6 func (dcr *ExchangeWallet) targetFeeRateWithFallback(confTarget, feeSuggestion uint64) uint64 { feeRate, err := dcr.feeRate(confTarget) if err != nil { - dcr.log.Errorf("Failed to get fee rate: %v", err) + dcr.log.Debugf("Failed to get fee rate: %v", err) } else if feeRate != 0 { dcr.log.Tracef("Obtained estimate for %d-conf fee rate, %d", confTarget, feeRate) return feeRate @@ -1652,7 +1654,7 @@ func (dcr *ExchangeWallet) PreSwap(req *asset.PreSwapForm) (*asset.PreSwap, erro Key: swapFeeBumpKey, DisplayName: "Faster Swaps", Description: desc, - DefaultValue: 1.0, + DefaultValue: "1.0", }, XYRange: &asset.XYRange{ Start: asset.XYRangePoint{ @@ -1715,7 +1717,7 @@ func (dcr *ExchangeWallet) splitOption(req *asset.PreSwapForm, utxos []*composit Key: splitKey, DisplayName: "Pre-size Funds", IsBoolean: true, - DefaultValue: dcr.config().useSplitTx, // not nil interface + DefaultValue: strconv.FormatBool(dcr.config().useSplitTx), // not nil interface ShowByDefault: true, }, Boolean: &asset.BooleanConfig{}, @@ -1739,7 +1741,7 @@ func (dcr *ExchangeWallet) splitOption(req *asset.PreSwapForm, utxos []*composit if !splitUsed || splitLocked >= noSplitLocked { // locked check should be redundant opt.Boolean.Reason = "avoids no DCR overlock for this order (ignored)" opt.Description = "A split transaction for this order avoids no DCR overlock, but adds additional fees." - opt.DefaultValue = false + opt.DefaultValue = "false" return opt // not enabled by default, but explain why } @@ -1796,7 +1798,7 @@ func (dcr *ExchangeWallet) preRedeem(numLots, feeSuggestion uint64, options map[ Key: redeemFeeBumpFee, DisplayName: "Faster Redemption", Description: "Bump the redemption transaction fees up to 2x for faster confirmations on your redemption transaction.", - DefaultValue: 1.0, + DefaultValue: "1.0", }, XYRange: &asset.XYRange{ Start: asset.XYRangePoint{ @@ -4127,6 +4129,11 @@ func (dcr *ExchangeWallet) NewAddress() (string, error) { return dcr.DepositAddress() } +// AddressUsed checks if a wallet address has been used. +func (dcr *ExchangeWallet) AddressUsed(addrStr string) (bool, error) { + return dcr.wallet.AddressUsed(dcr.ctx, addrStr) +} + // Unlock unlocks the exchange wallet. func (dcr *ExchangeWallet) Unlock(pw []byte) error { // Older SPV wallet potentially need an upgrade while we have a password. diff --git a/client/asset/dcr/dcr_test.go b/client/asset/dcr/dcr_test.go index 6634a7e117..244c6a9881 100644 --- a/client/asset/dcr/dcr_test.go +++ b/client/asset/dcr/dcr_test.go @@ -151,6 +151,7 @@ func tNewWalletMonitorBlocks(monitorBlocks bool) (*ExchangeWallet, *tRPCClient, shutdown() panic(err.Error()) } + wallet.connected.Store(true) rpcw := &rpcWallet{ rpcClient: client, log: log, @@ -721,6 +722,10 @@ func (c *tRPCClient) SetTxFee(ctx context.Context, fee dcrutil.Amount) error { return nil } +func (c *tRPCClient) GetReceivedByAddressMinConf(ctx context.Context, address stdaddr.Address, minConfs int) (dcrutil.Amount, error) { + return 0, nil +} + func (c *tRPCClient) ListSinceBlock(ctx context.Context, hash *chainhash.Hash) (*walletjson.ListSinceBlockResult, error) { return nil, nil } diff --git a/client/asset/dcr/rpcwallet.go b/client/asset/dcr/rpcwallet.go index 4cf81d1e12..6c07a8178d 100644 --- a/client/asset/dcr/rpcwallet.go +++ b/client/asset/dcr/rpcwallet.go @@ -156,6 +156,7 @@ type rpcClient interface { SetVoteChoice(ctx context.Context, agendaID, choiceID string) error SetTxFee(ctx context.Context, fee dcrutil.Amount) error ListSinceBlock(ctx context.Context, hash *chainhash.Hash) (*walletjson.ListSinceBlockResult, error) + GetReceivedByAddressMinConf(ctx context.Context, address stdaddr.Address, minConfs int) (dcrutil.Amount, error) } // newRPCWallet creates an rpcClient and uses it to construct a new instance @@ -1217,6 +1218,19 @@ func (w *rpcWallet) SetTxFee(ctx context.Context, feePerKB dcrutil.Amount) error return w.rpcClient.SetTxFee(ctx, feePerKB) } +func (w *rpcWallet) AddressUsed(ctx context.Context, addrStr string) (bool, error) { + addr, err := stdaddr.DecodeAddress(addrStr, w.chainParams) + if err != nil { + return false, err + } + const minConf = 0 + recv, err := w.rpcClient.GetReceivedByAddressMinConf(ctx, addr, minConf) + if err != nil { + return false, err + } + return recv != 0, nil +} + // anylist is a list of RPC parameters to be converted to []json.RawMessage and // sent via nodeRawRequest. type anylist []any diff --git a/client/asset/dcr/spv.go b/client/asset/dcr/spv.go index 7861a53e90..79635d0c4b 100644 --- a/client/asset/dcr/spv.go +++ b/client/asset/dcr/spv.go @@ -105,6 +105,7 @@ type dcrWallet interface { NewVSPTicket(ctx context.Context, hash *chainhash.Hash) (*wallet.VSPTicket, error) RescanProgressFromHeight(ctx context.Context, n wallet.NetworkBackend, startHeight int32, p chan<- wallet.RescanProgress) RescanPoint(ctx context.Context) (*chainhash.Hash, error) + TotalReceivedForAddr(ctx context.Context, addr stdaddr.Address, minConf int32) (dcrutil.Amount, error) } // Interface for *spv.Syncer so that we can test with a stub. @@ -153,8 +154,7 @@ type spvWallet struct { dir string chainParams *chaincfg.Params log dex.Logger - spv spvSyncer // *spv.Syncer - bestSpvPeerHeight int32 // atomic + bestSpvPeerHeight int32 // atomic tipChan chan *block gapLimit uint32 @@ -164,6 +164,9 @@ type spvWallet struct { cancel context.CancelFunc wg sync.WaitGroup + + spvMtx sync.RWMutex + spv spvSyncer // *spv.Syncer } var _ Wallet = (*spvWallet)(nil) @@ -393,19 +396,10 @@ func (w *spvWallet) startWallet(ctx context.Context) error { w.dcrWallet = &extendedWallet{dcrw} w.db = db - var connectPeers []string - switch w.chainParams.Net { - case wire.SimNet: - connectPeers = []string{"localhost:19560"} - } - - spv := newSpvSyncer(dcrw, w.dir, connectPeers) - w.spv = spv - w.wg.Add(2) go func() { defer w.wg.Done() - w.spvLoop(ctx, spv) + w.spvLoop(ctx) }() go func() { defer w.wg.Done() @@ -427,8 +421,11 @@ func (w *spvWallet) stop() { w.log.Info("SPV wallet closed") } -func (w *spvWallet) spvLoop(ctx context.Context, syncer *spv.Syncer) { +func (w *spvWallet) spvLoop(ctx context.Context) { for { + // Create a new syncer after every failure or dcrwallet will + // panic because of closing of a closed channel. + syncer := w.newSpvSyncer() err := syncer.Run(ctx) if ctx.Err() != nil { return @@ -741,6 +738,8 @@ func (w *spvWallet) SignRawTransaction(ctx context.Context, baseTx *wire.MsgTx) // SendRawTransaction broadcasts the provided transaction to the Decred network. // Part of the Wallet interface. func (w *spvWallet) SendRawTransaction(ctx context.Context, tx *wire.MsgTx, allowHighFees bool) (*chainhash.Hash, error) { + w.spvMtx.RLock() + defer w.spvMtx.RUnlock() // TODO: Conditional high fee check? return w.PublishTransaction(ctx, tx, w.spv) } @@ -829,7 +828,9 @@ func (w *spvWallet) GetBlock(ctx context.Context, blockHash *chainhash.Hash) (*w return block, nil } + w.spvMtx.RLock() blocks, err := w.spv.Blocks(ctx, []*chainhash.Hash{blockHash}) + w.spvMtx.RUnlock() if err != nil { return nil, err } @@ -983,7 +984,9 @@ func (w *spvWallet) SyncStatus(ctx context.Context) (*asset.SyncStatus, error) { height = utils.Clamp(height, 0, targetHeight) ss.Blocks = uint64(height) + w.spvMtx.RLock() ss.Synced, _ = w.spv.Synced(ctx) + w.spvMtx.RUnlock() if rescanHash, err := w.dcrWallet.RescanPoint(ctx); err != nil { return nil, fmt.Errorf("error getting rescan point: %w", err) @@ -1003,7 +1006,9 @@ func (w *spvWallet) SyncStatus(ctx context.Context) (*asset.SyncStatus, error) { // spv peers. If no peers are connected, the last observed max peer height is // returned. func (w *spvWallet) bestPeerInitialHeight() int32 { + w.spvMtx.RLock() peers := w.spv.GetRemotePeers() + w.spvMtx.RUnlock() if len(peers) == 0 { return atomic.LoadInt32(&w.bestSpvPeerHeight) } @@ -1047,6 +1052,8 @@ func (w *spvWallet) newVSPClient(vspHost, vspPubKey string, log dex.Logger) (*vs // rescan performs a blocking rescan, sending updates on the channel. func (w *spvWallet) rescan(ctx context.Context, fromHeight int32, c chan wallet.RescanProgress) { + w.spvMtx.RLock() + defer w.spvMtx.RUnlock() w.dcrWallet.RescanProgressFromHeight(ctx, w.spv, fromHeight, c) } @@ -1085,7 +1092,9 @@ func (w *spvWallet) PurchaseTickets(ctx context.Context, n int, vspHost, vspPubK } } + w.spvMtx.RLock() res, err := w.dcrWallet.PurchaseTickets(ctx, w.spv, req) + w.spvMtx.RUnlock() if err != nil { return nil, err } @@ -1410,6 +1419,19 @@ func (w *spvWallet) SetTxFee(_ context.Context, feePerKB dcrutil.Amount) error { return nil } +func (w *spvWallet) AddressUsed(ctx context.Context, addrStr string) (bool, error) { + addr, err := stdaddr.DecodeAddress(addrStr, w.chainParams) + if err != nil { + return false, err + } + const minConf = 0 + recv, err := w.TotalReceivedForAddr(ctx, addr, minConf) + if err != nil { + return false, err + } + return recv != 0, nil +} + // cacheBlock caches a block for future use. The block has a lastAccess stamp // added, and will be discarded if not accessed again within 2 hours. func (w *spvWallet) cacheBlock(block *wire.MsgBlock) { @@ -1443,6 +1465,8 @@ func (w *spvWallet) cachedBlock(blockHash *chainhash.Hash) *wire.MsgBlock { // PeerCount returns the count of currently connected peers. func (w *spvWallet) PeerCount(ctx context.Context) (uint32, error) { + w.spvMtx.RLock() + defer w.spvMtx.RUnlock() return uint32(len(w.spv.GetRemotePeers())), nil } @@ -1458,15 +1482,25 @@ func (w *spvWallet) cleanBlockCache() { } } -func newSpvSyncer(w *wallet.Wallet, netDir string, connectPeers []string) *spv.Syncer { +func (w *spvWallet) newSpvSyncer() *spv.Syncer { + w.spvMtx.Lock() + defer w.spvMtx.Unlock() + ew := w.dcrWallet.(*extendedWallet) + dcrw := ew.Wallet + var connectPeers []string + switch w.chainParams.Net { + case wire.SimNet: + connectPeers = []string{"localhost:19560"} + } addr := &net.TCPAddr{IP: net.ParseIP("::1"), Port: 0} - amgr := addrmgr.New(netDir, net.LookupIP) - lp := p2p.NewLocalPeer(w.ChainParams(), addr, amgr) - syncer := spv.NewSyncer(w, lp) + amgr := addrmgr.New(w.dir, net.LookupIP) + lp := p2p.NewLocalPeer(dcrw.ChainParams(), addr, amgr) + syncer := spv.NewSyncer(dcrw, lp) if len(connectPeers) > 0 { syncer.SetPersistentPeers(connectPeers) } - w.SetNetworkBackend(syncer) + dcrw.SetNetworkBackend(syncer) + w.spv = syncer return syncer } diff --git a/client/asset/dcr/spv_mixing.go b/client/asset/dcr/spv_mixing.go index da3e5ccff8..6fb4a4dc27 100644 --- a/client/asset/dcr/spv_mixing.go +++ b/client/asset/dcr/spv_mixing.go @@ -50,7 +50,9 @@ func (w *spvWallet) mix(ctx context.Context) { // Don't perform any actions while transactions are not synced // through the tip block. + w.spvMtx.RLock() synced, _ := w.spv.Synced(ctx) + w.spvMtx.RUnlock() if !synced { w.log.Tracef("Skipping account mixing: transactions are not synced") return diff --git a/client/asset/dcr/spv_test.go b/client/asset/dcr/spv_test.go index 6b3081407b..08dca3d247 100644 --- a/client/asset/dcr/spv_test.go +++ b/client/asset/dcr/spv_test.go @@ -430,6 +430,10 @@ func (w *tDcrWallet) RescanPoint(ctx context.Context) (*chainhash.Hash, error) { return nil, nil } +func (w *tDcrWallet) TotalReceivedForAddr(ctx context.Context, addr stdaddr.Address, minConf int32) (dcrutil.Amount, error) { + return 0, nil +} + func tNewSpvWallet() (*spvWallet, *tDcrWallet) { dcrw := &tDcrWallet{ blockInfo: make(map[int32]*wallet.BlockInfo), diff --git a/client/asset/dcr/wallet.go b/client/asset/dcr/wallet.go index 45aa18a612..a35c3c063d 100644 --- a/client/asset/dcr/wallet.go +++ b/client/asset/dcr/wallet.go @@ -176,6 +176,7 @@ type Wallet interface { StakeInfo(ctx context.Context) (*wallet.StakeInfoData, error) Reconfigure(ctx context.Context, cfg *asset.WalletConfig, net dex.Network, currentAddress string) (restart bool, err error) WalletOwnsAddress(ctx context.Context, addr stdaddr.Address) (bool, error) + AddressUsed(ctx context.Context, addrStr string) (bool, error) } // WalletTransaction is a pared down version of walletjson.GetTransactionResult. diff --git a/client/asset/dgb/dgb.go b/client/asset/dgb/dgb.go index 962fa5ce0c..6a87489f57 100644 --- a/client/asset/dgb/dgb.go +++ b/client/asset/dgb/dgb.go @@ -5,6 +5,7 @@ package dgb import ( "fmt" + "strconv" "decred.org/dcrdex/client/asset" "decred.org/dcrdex/client/asset/btc" @@ -36,7 +37,7 @@ var ( Key: "fallbackfee", DisplayName: "Fallback fee rate", Description: "DigiByte's 'fallbackfee' rate. Units: DGB/kB", - DefaultValue: dexdgb.DefaultFee * 1000 / 1e8, // higher than BTC default + DefaultValue: strconv.FormatFloat(dexdgb.DefaultFee*1000/1e8, 'f', -1, 64), // higher than BTC default }, { Key: "feeratelimit", @@ -45,7 +46,7 @@ var ( "pay on swap transactions. If feeratelimit is lower than a market's " + "maxfeerate, you will not be able to trade on that market with this " + "wallet. Units: BTC/kB", - DefaultValue: dexdgb.DefaultFeeRateLimit * 1000 / 1e8, // higher than BTC default + DefaultValue: strconv.FormatFloat(dexdgb.DefaultFeeRateLimit*1000/1e8, 'f', -1, 64), // higher than BTC default }, { Key: "redeemconftarget", @@ -53,7 +54,7 @@ var ( Description: "The target number of blocks for the redeem transaction " + "to be mined. Used to set the transaction's fee rate. " + "(default: 2 blocks)", - DefaultValue: defaultRedeemConfTarget, + DefaultValue: strconv.FormatUint(defaultRedeemConfTarget, 10), }, { Key: "txsplit", @@ -63,7 +64,7 @@ var ( "during match settlement, or the order is canceled. This an extra transaction for which network mining fees are paid. " + "Used only for standing-type orders, e.g. limit orders without immediate time-in-force.", IsBoolean: true, - DefaultValue: true, // low fee, fast chain + DefaultValue: "true", // low fee, fast chain }, // no ExternalFeeEstimator, so no apifeefallback option }...) // WalletInfo defines some general information about a DigiByte wallet. diff --git a/client/asset/doge/doge.go b/client/asset/doge/doge.go index 97ee04ff33..df15918601 100644 --- a/client/asset/doge/doge.go +++ b/client/asset/doge/doge.go @@ -8,6 +8,7 @@ import ( "encoding/json" "fmt" "math" + "strconv" "decred.org/dcrdex/client/asset" "decred.org/dcrdex/client/asset/btc" @@ -56,7 +57,7 @@ var ( Key: fallbackFeeKey, DisplayName: "Fallback fee rate", Description: "Dogecoin's 'fallbackfee' rate. Units: DOGE/kB", - DefaultValue: dexdoge.DefaultFee * 1000 / 1e8, + DefaultValue: strconv.FormatFloat(dexdoge.DefaultFee*1000/1e8, 'f', -1, 64), }, { Key: "feeratelimit", @@ -65,7 +66,7 @@ var ( "pay on swap transactions. If feeratelimit is lower than a market's " + "maxfeerate, you will not be able to trade on that market with this " + "wallet. Units: BTC/kB", - DefaultValue: dexdoge.DefaultFeeRateLimit * 1000 / 1e8, + DefaultValue: strconv.FormatFloat(dexdoge.DefaultFeeRateLimit*1000/1e8, 'f', -1, 64), }, { Key: "txsplit", @@ -83,7 +84,7 @@ var ( "This is useful as a fallback for SPV wallets and RPC wallets " + "that have recently been started.", IsBoolean: true, - DefaultValue: true, + DefaultValue: "true", }, } // WalletInfo defines some general information about a Dogecoin wallet. diff --git a/client/asset/eth/eth.go b/client/asset/eth/eth.go index be0151766e..1e391c6ec1 100644 --- a/client/asset/eth/eth.go +++ b/client/asset/eth/eth.go @@ -138,7 +138,7 @@ var ( "pay on swap transactions. If gasfeelimit is lower than a market's " + "maxfeerate, you will not be able to trade on that market with this " + "wallet. Units: gwei / gas", - DefaultValue: defaultGasFeeLimit, + DefaultValue: strconv.FormatUint(defaultGasFeeLimit, 10), }, } RPCOpts = []*asset.ConfigOption{ diff --git a/client/asset/firo/block_deserialize.go b/client/asset/firo/block_deserialize.go new file mode 100644 index 0000000000..9652a3b45f --- /dev/null +++ b/client/asset/firo/block_deserialize.go @@ -0,0 +1,105 @@ +package firo + +import ( + "bytes" + "errors" + "fmt" + + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" +) + +const ( + // Only blocks mined with progpow are considered. + // Previous mining algorithms: MTP and Lyra2z ignored as being too early for + // Firo wallet on Dex ~ late 2023 + ProgpowStartTime = 1635228000 // Tue Oct 26 2021 06:00:00 UTC+0 + HeaderLength = 80 + ProgpowExtraLength = 40 + ProgpowFullHeaderLength = HeaderLength + ProgpowExtraLength +) + +var errInvalidBlockLength = errors.New("invalid block length") + +// deserializeBlock deserializes the wire bytes passed in as blk and returns the +// header for the network plus any Transparent transactions found parsed into a +// wire.MsgBlock. +// +// Other transaction types are discarded; including coinbase. +func deserializeBlock(net *chaincfg.Params, blk []byte) (*wire.MsgBlock, error) { + var hdrHash chainhash.Hash + var hdr *wire.BlockHeader + + // hash header + var header []byte + switch net.Name { + case "mainnet", "testnet3", "testnet": + if len(blk) < ProgpowFullHeaderLength { + return nil, errInvalidBlockLength + } + header = make([]byte, ProgpowFullHeaderLength) + copy(header, blk[:ProgpowFullHeaderLength]) + + case "regtest": + if len(blk) < HeaderLength { + return nil, errInvalidBlockLength + } + header = make([]byte, HeaderLength) + copy(header, blk[:HeaderLength]) + + default: + return nil, fmt.Errorf("unknown net: %s", net.Name) + } + hdrHash = chainhash.DoubleHashH(header) + + // make a reader over the full block + r := bytes.NewReader(blk) + + // deserialize the first 80 bytes of the header + hdr = &wire.BlockHeader{} + err := hdr.Deserialize(r) + if err != nil { + return nil, fmt.Errorf("failed to deserialize block header: %w", err) + } + + if int(hdr.Timestamp.Unix()) < ProgpowStartTime { + return nil, fmt.Errorf("dex not considering blocks mined before progpow") + } + + if net.Name != "regtest" { + // Blocks mined later than progpow start time have 40 extra bytes holding + // mining info. Skip over! + var extraBytes = make([]byte, ProgpowExtraLength) + r.Read(extraBytes) + } + + // This block's transactions + txnCount, err := wire.ReadVarInt(r, 0) + if err != nil { + return nil, fmt.Errorf("failed to parse transaction count: %w", err) + } + + if txnCount == 0 { + return nil, fmt.Errorf("invalid transaction count 0 -- must at least have a coinbase") + } + + txns := make([]*wire.MsgTx, 0, txnCount) + for i := 0; i < int(txnCount); i++ { + tx, err := deserializeTransaction(r) + + if err != nil { + return nil, fmt.Errorf("failed to deserialize transaction %d of %d (type=%d) in block %s: %w", + i+1, txnCount, tx.txType, hdrHash.String(), err) + } + + if tx.txType == TransactionNormal { + txns = append(txns, tx.msgTx) + } + } + + return &wire.MsgBlock{ + Header: *hdr, + Transactions: txns, + }, nil +} diff --git a/client/asset/firo/firo.go b/client/asset/firo/firo.go index 0098b2deba..36ff9c98aa 100644 --- a/client/asset/firo/firo.go +++ b/client/asset/firo/firo.go @@ -9,6 +9,7 @@ import ( "errors" "fmt" "math" + "strconv" "strings" "time" @@ -22,14 +23,15 @@ import ( "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/wire" ) const ( version = 0 // Zcoin XZC BipID = 136 - // Consensus changes v0.14.14.0 - minNetworkVersion = 141400 + // https://github.com/firoorg/firo/releases/tag/v0.14.14.1 + minNetworkVersion = 141401 walletTypeRPC = "firodRPC" walletTypeElectrum = "electrumRPC" estimateFeeConfs = 2 // 2 blocks should be enough @@ -42,7 +44,7 @@ var ( Key: "fallbackfee", DisplayName: "Fallback fee rate", Description: "Firo's 'fallbackfee' rate. Units: FIRO/kB", - DefaultValue: dexfiro.DefaultFee * 1000 / 1e8, + DefaultValue: strconv.FormatFloat(dexfiro.DefaultFee*1000/1e8, 'f', -1, 64), }, { Key: "feeratelimit", @@ -51,7 +53,7 @@ var ( "pay on swap transactions. If feeratelimit is lower than a market's " + "maxfeerate, you will not be able to trade on that market with this " + "wallet. Units: FIRO/kB", - DefaultValue: dexfiro.DefaultFeeRateLimit * 1000 / 1e8, + DefaultValue: strconv.FormatFloat(dexfiro.DefaultFeeRateLimit*1000/1e8, 'f', -1, 64), }, { Key: "txsplit", @@ -137,13 +139,6 @@ func NewWallet(cfg *asset.WalletConfig, logger dex.Logger, network dex.Network) return nil, fmt.Errorf("unknown network ID %v", network) } - // Designate the clone ports. - ports := dexbtc.NetPorts{ - Mainnet: "8888", - Testnet: "18888", - Simnet: "28888", - } - cloneCFG := &btc.BTCCloneCFG{ WalletCFG: cfg, MinNetworkVersion: minNetworkVersion, @@ -152,7 +147,7 @@ func NewWallet(cfg *asset.WalletConfig, logger dex.Logger, network dex.Network) Logger: logger, Network: network, ChainParams: params, - Ports: ports, + Ports: dexfiro.NetPorts, DefaultFallbackFee: dexfiro.DefaultFee, DefaultFeeRateLimit: dexfiro.DefaultFeeRateLimit, Segwit: false, @@ -172,15 +167,18 @@ func NewWallet(cfg *asset.WalletConfig, logger dex.Logger, network dex.Network) ExternalFeeEstimator: externalFeeRate, AddressDecoder: decodeAddress, PrivKeyFunc: nil, // set only for walletTypeRPC below + BlockDeserializer: nil, // set only for walletTypeRPC below } switch cfg.Type { case walletTypeRPC: var exw *btc.ExchangeWalletFullNode - // override PrivKeyFunc - we need our own Firo dumpprivkey fn cloneCFG.PrivKeyFunc = func(addr string) (*btcec.PrivateKey, error) { return privKeyForAddress(exw, addr) } + cloneCFG.BlockDeserializer = func(blk []byte) (*wire.MsgBlock, error) { + return deserializeBlock(params, blk) + } var err error exw, err = btc.BTCCloneWallet(cloneCFG) return exw, err diff --git a/client/asset/firo/tx_deserialize.go b/client/asset/firo/tx_deserialize.go new file mode 100644 index 0000000000..981eed92fe --- /dev/null +++ b/client/asset/firo/tx_deserialize.go @@ -0,0 +1,314 @@ +package firo + +import ( + "encoding/binary" + "fmt" + "io" + + "github.com/btcsuite/btcd/wire" +) + +var byteOrder = binary.LittleEndian + +const ( + // protocol version 0 + pver uint32 = 0 + // wire.maxTxInPerMessage + maxTxInPerMessage = wire.MaxMessagePayload/41 + 1 + // wire.maxTxOutPerMessage + maxTxOutPerMessage = wire.MaxMessagePayload/wire.MinTxOutPayload + 1 +) + +type TxType int + +const ( + // Transaction types + TransactionNormal = 0 + TransactionProviderRegister = 1 + TransactionProviderUpdateService = 2 + TransactionProviderUpdateRegistrar = 3 + TransactionProviderUpdateRevoke = 4 + TransactionCoinbase = 5 + TransactionQuorumCommitment = 6 + TransactionSpork = 7 + TransactionLelantus = 8 + TransactionSpark = 9 + // TRANSACTION_ALIAS is a regular spark spend transaction, but contains + // additional info about a created/modified spark name. + TransactionAlias = 10 +) + +type decoder struct { + buf [8]byte + rd io.Reader +} + +func newDecoder(r io.Reader) *decoder { + return &decoder{rd: r} +} + +func (d *decoder) Read(b []byte) (n int, err error) { + n, err = d.rd.Read(b) + if err != nil { + return 0, err + } + return n, nil +} + +func (d *decoder) readByte() (byte, error) { + b := d.buf[:1] + if _, err := io.ReadFull(d, b); err != nil { + return 0, err + } + return b[0], nil +} + +func (d *decoder) readUint16() (uint16, error) { + b := d.buf[:2] + if _, err := io.ReadFull(d, b); err != nil { + return 0, err + } + return byteOrder.Uint16(b), nil +} + +func (d *decoder) readUint32() (uint32, error) { + b := d.buf[:4] + if _, err := io.ReadFull(d, b); err != nil { + return 0, err + } + return byteOrder.Uint32(b), nil +} + +func (d *decoder) readUint64() (uint64, error) { + b := d.buf[:] + if _, err := io.ReadFull(d, b); err != nil { + return 0, err + } + return byteOrder.Uint64(b), nil +} + +// readOutPoint reads the next sequence of bytes from r as an OutPoint. +func (d *decoder) readOutPoint(op *wire.OutPoint) error { + _, err := io.ReadFull(d, op.Hash[:]) + if err != nil { + return err + } + + op.Index, err = d.readUint32() + return err +} + +// wire.ReadVarInt a.k.a. CompactSize, not VARINT +// https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer +func (d *decoder) readCompactSize() (uint64, error) { + // Compact Size + // size < 253 -- 1 byte + // size <= USHRT_MAX -- 3 bytes (253 + 2 bytes) + // size <= UINT_MAX -- 5 bytes (254 + 4 bytes) + // size > UINT_MAX -- 9 bytes (255 + 8 bytes) + chSize, err := d.readByte() + if err != nil { + return 0, err + } + switch chSize { + case 253: + sz, err := d.readUint16() + if err != nil { + return 0, err + } + return uint64(sz), nil + case 254: + sz, err := d.readUint32() + if err != nil { + return 0, err + } + return uint64(sz), nil + case 255: + sz, err := d.readUint64() + if err != nil { + return 0, err + } + return sz, nil + default: // < 253 + return uint64(chSize), nil + } +} + +// readTxIn reads the next sequence of bytes from r as a transaction input. +func (d *decoder) readTxIn(ti *wire.TxIn) error { + err := d.readOutPoint(&ti.PreviousOutPoint) + if err != nil { + return err + } + + ti.SignatureScript, err = wire.ReadVarBytes(d, pver, wire.MaxMessagePayload, "sigScript") + if err != nil { + return err + } + + ti.Sequence, err = d.readUint32() + return err +} + +// readTxOut reads the next sequence of bytes from r as a transaction output. +func (d *decoder) readTxOut(to *wire.TxOut) error { + v, err := d.readUint64() + if err != nil { + return err + } + + pkScript, err := wire.ReadVarBytes(d, pver, wire.MaxMessagePayload, "pkScript") + if err != nil { + return err + } + + to.Value = int64(v) + to.PkScript = pkScript + + return nil +} + +// readVarBytes reads the next sequence of bytes from r and returns them. +func (d *decoder) readVarBytes() ([]byte, error) { + byteArray, err := wire.ReadVarBytes(d, pver, wire.MaxMessagePayload, "extra") + if err != nil { + return nil, err + } + return byteArray, nil +} + +type txn struct { + msgTx *wire.MsgTx + txType TxType +} + +// deserializeTransaction deserializes a transaction +func deserializeTransaction(r io.Reader) (*txn, error) { + tx := txn{ + msgTx: &wire.MsgTx{}, + txType: 0, + } + + dec := newDecoder(r) + + fullVersion, err := dec.readUint32() + if err != nil { + return nil, err + } + ver := fullVersion & 0x0000ffff + typ := (fullVersion >> 16) & 0x0000ffff + + tx.msgTx.Version = int32(ver) + tx.txType = TxType(typ) + + switch tx.txType { + case TransactionNormal, + TransactionProviderRegister, + TransactionProviderUpdateService, + TransactionProviderUpdateRegistrar, + TransactionProviderUpdateRevoke, + TransactionCoinbase, + TransactionLelantus, + TransactionSpark, + TransactionAlias: + { + deserializeTx(dec, &tx, tx.txType) + } + case TransactionQuorumCommitment, + TransactionSpork: + err = deserializeNonSpendingTx(dec, &tx, tx.txType) + default: + err = fmt.Errorf("unknown transaction type %d", tx.txType) + } + + return &tx, err +} + +// deserializeTx deserializes a transaction +func deserializeTx(dec *decoder, tx *txn, txType TxType) error { + count, err := dec.readCompactSize() + if err != nil { + return err + } + + if count == 0 { + return fmt.Errorf("input count is 0 -- but no segwit transactions for Firo") + } + + if count > maxTxInPerMessage { + return fmt.Errorf("too many transaction inputs to fit into "+ + "max message size [count %d, max %d]", count, maxTxInPerMessage) + } + + tx.msgTx.TxIn = make([]*wire.TxIn, count) + for i := range tx.msgTx.TxIn { + txIn := &wire.TxIn{} + err = dec.readTxIn(txIn) + if err != nil { + return err + } + tx.msgTx.TxIn[i] = txIn + } + + count, err = dec.readCompactSize() + if err != nil { + return err + } + if count > maxTxOutPerMessage { + return fmt.Errorf("too many transactions outputs to fit into "+ + "max message size [count %d, max %d]", count, maxTxOutPerMessage) + } + + tx.msgTx.TxOut = make([]*wire.TxOut, count) + for i := range tx.msgTx.TxOut { + txOut := &wire.TxOut{} + err = dec.readTxOut(txOut) + if err != nil { + return err + } + tx.msgTx.TxOut[i] = txOut + } + + tx.msgTx.LockTime, err = dec.readUint32() + if err != nil { + return err + } + + if txType == TransactionNormal { + return nil + } + + // read vExtraPayload + _, err = dec.readVarBytes() + return err +} + +// deserializeNonSpendingTx deserializes spork, quorum txs which have no inputs and +// no outputs +func deserializeNonSpendingTx(dec *decoder, tx *txn, txType TxType) error { + count, err := dec.readCompactSize() + if err != nil { + return err + } + + if count != 0 { + return fmt.Errorf("tx (type=%d) expected 0 txins - got %d", txType, count) + } + + count, err = dec.readCompactSize() + if err != nil { + return err + } + + if count != 0 { + return fmt.Errorf("tx (type=%d) expected 0 txouts - got %d", txType, count) + } + + tx.msgTx.LockTime, err = dec.readUint32() + if err != nil { + return err + } + + _, err = dec.readVarBytes() + return err +} diff --git a/client/asset/interface.go b/client/asset/interface.go index 8f7e924fcd..49c3479e45 100644 --- a/client/asset/interface.go +++ b/client/asset/interface.go @@ -342,7 +342,7 @@ type ConfigOption struct { Key string `json:"key"` DisplayName string `json:"displayname"` Description string `json:"description"` - DefaultValue any `json:"default"` + DefaultValue string `json:"default"` // If MaxValue/MinValue are set to the string "now" for a date config, the // UI will display the current date. MaxValue any `json:"max"` @@ -708,6 +708,7 @@ type Sweeper interface { // NewAddresser is a wallet that can generate new deposit addresses. type NewAddresser interface { NewAddress() (string, error) + AddressUsed(string) (bool, error) } // AddressReturner is a wallet that allows recycling of unused redemption or refund diff --git a/client/asset/ltc/ltc.go b/client/asset/ltc/ltc.go index 385f1a21f6..f964bcde9d 100644 --- a/client/asset/ltc/ltc.go +++ b/client/asset/ltc/ltc.go @@ -170,24 +170,22 @@ func (d *Driver) Create(params *asset.CreateWalletParams) error { params.Logger, recoveryCfg.NumExternalAddresses, recoveryCfg.NumInternalAddresses, chainParams) } -// customSPVWalletConstructors are functions for setting up custom -// implementations of the btc.BTCWallet interface that may be used by the -// ExchangeWalletSPV instead of the default spv implementation. -var customSPVWalletConstructors = map[string]btc.CustomSPVWalletConstructor{} +// customWalletConstructors are functions for setting up btc.CustomWallet +// implementations used by btc.ExchangeWalletCustom. +var customWalletConstructors = map[string]btc.CustomWalletConstructor{} -// RegisterCustomSPVWallet registers a function that should be used in creating -// a btc.BTCWallet implementation that the ExchangeWalletSPV will use in place -// of the default spv wallet implementation. External consumers can use this -// function to provide alternative btc.BTCWallet implementations, and must do so -// before attempting to create an ExchangeWalletSPV instance of this type. It'll -// panic if callers try to register a wallet twice. -func RegisterCustomSPVWallet(constructor btc.CustomSPVWalletConstructor, def *asset.WalletDefinition) { +// RegisterCustomWallet registers a function that should be used in creating a +// btc.CustomWallet implementation for btc.ExchangeWalletCustom. External +// consumers can use this function to provide btc.CustomWallet implementation, +// and must do so before attempting to create an btc.ExchangeWalletCustom +// instance of this type. It'll panic if callers try to register a wallet twice. +func RegisterCustomWallet(constructor btc.CustomWalletConstructor, def *asset.WalletDefinition) { for _, availableWallets := range WalletInfo.AvailableWallets { if def.Type == availableWallets.Type { panic(fmt.Sprintf("wallet type (%q) is already registered", def.Type)) } } - customSPVWalletConstructors[def.Type] = constructor + customWalletConstructors[def.Type] = constructor WalletInfo.AvailableWallets = append(WalletInfo.AvailableWallets, def) } @@ -243,22 +241,11 @@ func NewWallet(cfg *asset.WalletConfig, logger dex.Logger, network dex.Network) cloneCFG.MinElectrumVersion = *ver return btc.ElectrumWallet(cloneCFG) default: - makeCustomWallet, ok := customSPVWalletConstructors[cfg.Type] + makeCustomWallet, ok := customWalletConstructors[cfg.Type] if !ok { return nil, fmt.Errorf("unknown wallet type %q", cfg.Type) } - - // Create custom wallet first and return early if we encounter any - // error. - ltcWallet, err := makeCustomWallet(cfg.Settings, cloneCFG.ChainParams) - if err != nil { - return nil, fmt.Errorf("custom wallet setup error: %v", err) - } - - walletConstructor := func(_ string, _ *btc.WalletConfig, _ *chaincfg.Params, _ dex.Logger) btc.BTCWallet { - return ltcWallet - } - return btc.OpenSPVWallet(cloneCFG, walletConstructor) + return btc.OpenCustomWallet(cloneCFG, makeCustomWallet) } } diff --git a/client/asset/ltc/spv.go b/client/asset/ltc/spv.go index 7ff09ee85c..0ecc8f86b2 100644 --- a/client/asset/ltc/spv.go +++ b/client/asset/ltc/spv.go @@ -47,12 +47,11 @@ import ( ) const ( - DefaultM uint64 = 784931 // From ltcutil. Used for gcs filters. - logDirName = "logs" - neutrinoDBName = "neutrino.db" - defaultAcctNum = 0 - defaultAcctName = "default" - dbTimeout = 20 * time.Second + DefaultM uint64 = 784931 // From ltcutil. Used for gcs filters. + logDirName = "logs" + neutrinoDBName = "neutrino.db" + defaultAcctNum = 0 + dbTimeout = 20 * time.Second ) var ( @@ -160,15 +159,6 @@ func createSPVWallet(privPass []byte, seed []byte, bday time.Time, walletDir str return nil } -// AccountInfo returns the account information of the wallet for use by the -// exchange wallet. -func (w *ltcSPVWallet) AccountInfo() btc.XCWalletAccount { - return btc.XCWalletAccount{ - AccountName: defaultAcctName, - AccountNumber: defaultAcctNum, - } -} - // walletParams works around a bug in ltcwallet that doesn't recognize // wire.TestNet4 in (*ScopedKeyManager).cloneKeyWithVersion which is called from // AccountProperties. Only do this for the *wallet.Wallet, not the @@ -839,6 +829,18 @@ func (w *ltcSPVWallet) RemovePeer(addr string) error { return w.peerManager.RemovePeer(addr) } +func (w *ltcSPVWallet) TotalReceivedForAddr(btcAddr btcutil.Address, minConf int32) (btcutil.Amount, error) { + ltcAddr, err := w.addrBTC2LTC(btcAddr) + if err != nil { + return 0, err + } + amt, err := w.Wallet.TotalReceivedForAddr(ltcAddr, 0) + if err != nil { + return 0, err + } + return btcutil.Amount(amt), nil +} + // secretSource is used to locate keys and redemption scripts while signing a // transaction. secretSource satisfies the txauthor.SecretsSource interface. type secretSource struct { diff --git a/client/asset/polygon/polygon.go b/client/asset/polygon/polygon.go index 6e65cf8dff..2d172c1819 100644 --- a/client/asset/polygon/polygon.go +++ b/client/asset/polygon/polygon.go @@ -68,7 +68,7 @@ var ( "pay on swap transactions. If gasfeelimit is lower than a market's " + "maxfeerate, you will not be able to trade on that market with this " + "wallet. Units: gwei / gas", - DefaultValue: defaultGasFeeLimit, + DefaultValue: strconv.FormatUint(defaultGasFeeLimit, 10), }, } WalletInfo = asset.WalletInfo{ diff --git a/client/asset/zcl/zcl.go b/client/asset/zcl/zcl.go index c7cb75c7d0..fb2a519f3f 100644 --- a/client/asset/zcl/zcl.go +++ b/client/asset/zcl/zcl.go @@ -7,6 +7,7 @@ import ( "context" "fmt" "math" + "strconv" "decred.org/dcrdex/client/asset" "decred.org/dcrdex/client/asset/btc" @@ -65,7 +66,7 @@ var ( Key: "fallbackfee", DisplayName: "Fallback fee rate", Description: "Zclassic's 'fallbackfee' rate. Units: ZEC/kB", - DefaultValue: defaultFee * 1000 / 1e8, + DefaultValue: strconv.FormatFloat(defaultFee*1000/1e8, 'f', -1, 64), }, { Key: "feeratelimit", @@ -74,7 +75,7 @@ var ( "pay on swap transactions. If feeratelimit is lower than a market's " + "maxfeerate, you will not be able to trade on that market with this " + "wallet. Units: BTC/kB", - DefaultValue: defaultFeeRateLimit * 1000 / 1e8, + DefaultValue: strconv.FormatFloat(defaultFeeRateLimit*1000/1e8, 'f', -1, 64), }, { Key: "txsplit", diff --git a/client/asset/zec/transparent_rpc.go b/client/asset/zec/transparent_rpc.go index 2771e657c9..1b20d14bf6 100644 --- a/client/asset/zec/transparent_rpc.go +++ b/client/asset/zec/transparent_rpc.go @@ -410,3 +410,9 @@ func walletInfo(c rpcCaller) (*walletInfoRes, error) { } return &res, nil } + +func getReceivedByAddress(c rpcCaller, addrStr string) (recv uint64, _ error) { + const minConf = 0 + const inZats = true + return recv, c.CallRPC("getreceivedbyaddress", []any{addrStr, minConf, inZats}, &recv) +} diff --git a/client/asset/zec/zec.go b/client/asset/zec/zec.go index bd68bb57d1..4caee3ee29 100644 --- a/client/asset/zec/zec.go +++ b/client/asset/zec/zec.go @@ -17,6 +17,7 @@ import ( "path/filepath" "regexp" "sort" + "strconv" "strings" "sync" "sync/atomic" @@ -105,7 +106,7 @@ var ( Key: "fallbackfee", DisplayName: "Fallback fee rate", Description: "Zcash's 'fallbackfee' rate. Units: ZEC/kB", - DefaultValue: defaultFee * 1000 / 1e8, + DefaultValue: strconv.FormatFloat(defaultFee*1000/1e8, 'f', -1, 64), }, { Key: "feeratelimit", @@ -114,7 +115,7 @@ var ( "pay on swap transactions. If feeratelimit is lower than a market's " + "maxfeerate, you will not be able to trade on that market with this " + "wallet. Units: BTC/kB", - DefaultValue: defaultFeeRateLimit * 1000 / 1e8, + DefaultValue: strconv.FormatFloat(defaultFeeRateLimit*1000/1e8, 'f', -1, 64), }, { Key: "txsplit", @@ -336,6 +337,7 @@ type zecWallet struct { var _ asset.FeeRater = (*zecWallet)(nil) var _ asset.Wallet = (*zecWallet)(nil) var _ asset.WalletHistorian = (*zecWallet)(nil) +var _ asset.NewAddresser = (*zecWallet)(nil) // TODO: Implement LiveReconfigurer // var _ asset.LiveReconfigurer = (*zecWallet)(nil) @@ -1166,7 +1168,7 @@ func (w *zecWallet) splitOption(req *asset.PreSwapForm, utxos []*btc.CompositeUT Key: "swapsplit", DisplayName: "Pre-size Funds", IsBoolean: true, - DefaultValue: w.useSplitTx(), // not nil interface + DefaultValue: strconv.FormatBool(w.useSplitTx()), // not nil interface ShowByDefault: true, }, Boolean: &asset.BooleanConfig{}, @@ -1191,7 +1193,7 @@ func (w *zecWallet) splitOption(req *asset.PreSwapForm, utxos []*btc.CompositeUT opt.Boolean.Reason = "avoids no ZEC overlock for this order (ignored)" opt.Description = "A split transaction for this order avoids no ZEC overlock, " + "but adds additional fees." - opt.DefaultValue = false + opt.DefaultValue = "false" return opt // not enabled by default, but explain why } @@ -1680,6 +1682,13 @@ func (w *zecWallet) NewAddress() (string, error) { return w.DepositAddress() } +// AddressUsed checks if a wallet address has been used. +func (w *zecWallet) AddressUsed(addrStr string) (bool, error) { + // TODO: Resolve with new unified address encoding in https://github.com/decred/dcrdex/pull/2675 + recv, err := getReceivedByAddress(w, addrStr) + return recv != 0, err +} + func (w *zecWallet) FindRedemption(ctx context.Context, coinID, contract dex.Bytes) (redemptionCoin, secret dex.Bytes, err error) { return w.rf.FindRedemption(ctx, coinID) } diff --git a/client/cmd/bisonw-desktop/README.md b/client/cmd/bisonw-desktop/README.md index 6d6810cd51..df910af246 100644 --- a/client/cmd/bisonw-desktop/README.md +++ b/client/cmd/bisonw-desktop/README.md @@ -5,14 +5,48 @@ bison-desktop is a cross-platform desktop application for Bison Wallet. The inst **Note**: The instructions below are to be run in your CLI from the `bisonw-desktop` directory. ## Debian -Build with `./pkg/pkg-debian.sh`. The deb archive is located in **./build**. -For development, you'll need to install the WebKit Development Libraries. -`apt install libgtk-3-dev libwebkit2gtk-4.0-dev` -For production, they are specified as DEPENDS in the control file and the -package manager will install them. +### Install build dependencies -## MacOS (darwin) -Build with `./pkg/pkg-darwin.sh` for `amd64` MacOS machines. If running on an -`arm64` machine, you'll need to build with `TARGETS=darwin/arm64 ./pkg/pkg-darwin.sh` instead. -The `.dmg` click installer can be located in **./pkg/installers** after a successful build. +```bash +sudo apt-get install libgtk-3-dev libwebkit2gtk-4.1-dev build-essential +``` + +### Run build + +```bash +./pkg/pkg-debian.sh +``` + +The deb archive will be located in **./build**. + +## Snap + +Snap is a package standard that can be installed on many Linux distributions from the Snap Store, and via software centers in e.g. Fedora, Ubuntu. + +### Preparing the build environment + +```bash +sudo apt-get install snapd +sudo snap install --classic snapcraft +sudo adduser $USER lxd +newgrp lxd +lxd init --auto +sudo ufw disable # if ufw is installed on the host, this is neccessary for lxd to have network access + +``` + +### Running the build + + 1. Build the Debian package + 2. `./pkg/pkg-snap.sh` + +### Publishing the snap + +The snap can be uploaded to the Snap Store using `./pkg/publish-snap.sh`. This requires [Snapcraft developer account credentials](https://snapcraft.io/docs/releasing-your-app). After this is completed, the package can be installed on any system running `snap` by running `snap install bisonw`. The app will be available on the [Snap Store](https://snapcraft.io/store/bisonw). + +## macOS (darwin) + +Build with `./pkg/pkg-darwin.sh` for `amd64` MacOS machines. If running on an `arm64` machine, you'll need to build with `TARGETS=darwin/arm64 ./pkg/pkg-darwin.sh` instead. The `.dmg` click installer can be located in **./pkg/installers** after a successful build. + +Due to a problem with darwinkit, the maximum golang version that can be used to build the darwin application is 1.24.8. diff --git a/client/cmd/bisonw-desktop/app.go b/client/cmd/bisonw-desktop/app.go index 7ce4a28060..4b5d2cdd4b 100644 --- a/client/cmd/bisonw-desktop/app.go +++ b/client/cmd/bisonw-desktop/app.go @@ -70,9 +70,9 @@ import ( "decred.org/dcrdex/client/webserver" "decred.org/dcrdex/dex" "fyne.io/systray" + webview "github.com/bisoncraft/webview_go" "github.com/gen2brain/beeep" "github.com/pkg/browser" - "github.com/webview/webview" ) func mainCore() error { @@ -430,9 +430,9 @@ func runWebview(url string) { useIconBytes(w, Icon) // useIcon(w, "src/dexc.png") } - width, height := limitedWindowWidthAndHeight(int(C.display_width()), int(C.display_height())) + width, height := limitedWindowWidthAndHeight(float64(C.display_width()), float64(C.display_height())) - w.SetSize(width, height, webview.HintNone) + w.SetSize(int(width), int(height), webview.HintNone) w.Navigate(url) bindJSFunctions(w) w.Run() diff --git a/client/cmd/bisonw-desktop/app_darwin.go b/client/cmd/bisonw-desktop/app_darwin.go index 362941a6ff..a5d01c4f06 100644 --- a/client/cmd/bisonw-desktop/app_darwin.go +++ b/client/cmd/bisonw-desktop/app_darwin.go @@ -4,68 +4,29 @@ package main /* #cgo CFLAGS: -x objective-c -#cgo LDFLAGS: -lobjc -framework WebKit -framework AppKit -framework UserNotifications +#cgo LDFLAGS: -lobjc -framework WebKit #import #import -#import -#import - -// NavigationActionPolicyCancel is an integer used in Go code to represent -// WKNavigationActionPolicyCancel -const int NavigationActionPolicyCancel = 1; // CompletionHandlerDelegate implements methods required for executing // completion and decision handlers. @interface CompletionHandlerDelegate:NSObject -- (void)completionHandler:(void (^)(NSArray * _Nullable URLs))completionHandler withURLs:(NSArray * _Nullable)URLs; -- (void)decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler withPolicy:(int)policy; -- (void)authenticationCompletionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler withChallenge:(NSURLAuthenticationChallenge *)challenge; -- (void)deliverNotificationWithTitle:(NSString *)title message:(NSString *)message icon:(NSImage *)icon; +- (WKWebView *)newWebView; @end @implementation CompletionHandlerDelegate -// "completionHandler:withURLs" accepts a completion handler function from -// "webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:" and -// executes it with the provided URLs. -- (void)completionHandler:(void (^)(NSArray * _Nullable URLs))completionHandler withURLs:(NSArray * _Nullable)URLs { - completionHandler(URLs); -} - -// "decisionHandler:withPolicy" accepts a decision handler function from -// "webView:decidePolicyForNavigationAction:decisionHandler" and executes -// it with the provided policy. -- (void)decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler withPolicy:(int)policy { - policy == NavigationActionPolicyCancel ? decisionHandler(WKNavigationActionPolicyCancel) : decisionHandler(WKNavigationActionPolicyAllow); -} - -// Implements "authenticationCompletionHandler:withChallenge" for "webView:didReceiveAuthenticationChallenge:completionHandler". -// See: https://developer.apple.com/forums/thread/15610. -- (void)authenticationCompletionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler withChallenge:(NSURLAuthenticationChallenge *)challenge { - SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; - CFDataRef exceptions = SecTrustCopyExceptions(serverTrust); - SecTrustSetExceptions(serverTrust, exceptions); - CFRelease(exceptions); - completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:serverTrust]); -} - -// Implements "deliverNotificationWithTitle:message:icon:" handler with the NSUserNotification -// and NSUserNotificationCenter classes which have been marked deprecated -// but it is what works atm for macOS apps. The newer UNUserNotificationCenter has some -// implementation issues and very little information to aid debugging. -// See: https://developer.apple.com/documentation/foundation/nsusernotification?language=objc and -// https://github.com/progrium/macdriver/discussions/258 -- (void)deliverNotificationWithTitle:(NSString *)title message:(NSString *)message icon:(NSImage *)icon{ - NSUserNotification *notification = [NSUserNotification new]; - notification.title = title; - notification.informativeText = message; - notification.actionButtonTitle = @"Ok"; - notification.hasActionButton = 1; - notification.soundName = NSUserNotificationDefaultSoundName; - [notification setValue:icon forKey:@"_identityImage"]; - [notification setValue:@(false) forKey:@"_identityImageHasBorder"]; - [notification setValue:@YES forKey:@"_ignoresDoNotDisturb"]; - [[NSUserNotificationCenter defaultUserNotificationCenter]deliverNotification:notification]; +// Implements "newWebview". This is because the inspectable property is not available via +// darwinkit at the time of writing. Only MacOs 13.3+ has this property. +// This means that the webview is not inspectable on older versions of macOS. +// See: https://stackoverflow.com/a/75984167 +- (WKWebView *)newWebView { + WKWebViewConfiguration *webConfiguration = [WKWebViewConfiguration new]; + WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:webConfiguration]; + if (@available(macOS 13.3, *)) { + webView.inspectable = YES; + } + return webView; } @end @@ -93,32 +54,37 @@ import ( "syscall" "time" - "decred.org/dcrdex/client/app" + bwapp "decred.org/dcrdex/client/app" "decred.org/dcrdex/client/asset" "decred.org/dcrdex/client/core" "decred.org/dcrdex/client/mm" "decred.org/dcrdex/client/rpcserver" "decred.org/dcrdex/client/webserver" "decred.org/dcrdex/dex" - "github.com/progrium/macdriver/cocoa" - mdCore "github.com/progrium/macdriver/core" - "github.com/progrium/macdriver/objc" - "github.com/progrium/macdriver/webkit" + "github.com/progrium/darwinkit/macos/appkit" + "github.com/progrium/darwinkit/macos/foundation" + "github.com/progrium/darwinkit/macos/webkit" + "github.com/progrium/darwinkit/objc" ) var ( - webviewConfig = webkit.WKWebViewConfiguration_New() width, height = windowWidthAndHeight() maxOpenWindows = 5 // what would they want to do with more than 5 😂? nOpenWindows atomic.Int32 // number of open windows // Initialized when bisonw-desktop has been started. - appURL *url.URL + appHost string + appURL *url.URL + logDir string // completionHandler handles Objective-C callback functions for some // delegate methods. - completionHandler = objc.Object_fromPointer(C.createCompletionHandlerDelegate()) - dexcAppIcon = cocoa.NSImage_InitWithData(mdCore.NSData_WithBytes(Icon, uint64(len(Icon)))) + completionHandler = objc.ObjectFrom(C.createCompletionHandlerDelegate()) + + bisonwAppIcon = appkit.NewImageWithData(Icon) + dw = &delegateWrapper{} + + clientCore *core.Core ) const ( @@ -126,16 +92,10 @@ const ( // of the main menu. macOSAppTitle = "Bison Wallet" - // selOpenLogs is the selector for the "Open Logs" menu item. - selOpenLogs = "openLogs:" - // selNewWindow is the selector for the "New Window" menu item. - selNewWindow = "newWindow:" - // selIsNewWebview is the selector for a webview that require a new window. - selIsNewWebview = "isNewWebView:" - - // NavigationActionPolicyCancel is used in Objective-C code to represent - // WKNavigationActionPolicyCancel. - NavigationActionPolicyCancel = 1 + // The name of the Bison Wallet Js Handler. To access this function in the + // browser window, do: + // window.webkit.messageHandlers..postMessage() + bwJsHandlerName = "bwHandler" ) func init() { @@ -144,23 +104,9 @@ func init() { // mdCore.Dispatch(func()) to execute any function that needs to run in the // "main" thread. runtime.LockOSThread() - - // Set the user controller. This object coordinates interactions the app’s - // native code and the webpage’s scripts and other content. See: - // https://developer.apple.com/documentation/webkit/wkwebviewconfiguration/1395668-usercontentcontroller?language=objc. - webviewConfig.Set("userContentController:", objc.Get("WKUserContentController").Alloc().Init()) - // Set "developerExtrasEnabled" to true to allow viewing the developer - // console. - webviewConfig.Preferences().SetValueForKey(mdCore.True, mdCore.String("developerExtrasEnabled")) - // Set "DOMPasteAllowed" to true to allow user's paste text. - webviewConfig.Preferences().SetValueForKey(mdCore.True, mdCore.String("DOMPasteAllowed")) - - // Set to false in order to prevent bisonw-desktop from exiting when the last - // window is closed. - cocoa.TerminateAfterWindowsClose = false } -// mainCore is the darwin entry point for the DEX Desktop client. +// mainCore is the darwin entry point for the Bison Wallet Desktop client. func mainCore() error { appCtx, cancel := context.WithCancel(context.Background()) defer cancel() // don't leak on the earliest returns @@ -211,11 +157,11 @@ func mainCore() error { defer shutdownCloser.Done() // execute deferred functions if we return early // Initialize logging. utc := !cfg.LocalLogs - logMaker, closeLogger := app.InitLogging(cfg.LogPath, cfg.DebugLevel, cfg.LogStdout, utc) + logMaker, closeLogger := bwapp.InitLogging(cfg.LogPath, cfg.DebugLevel, cfg.LogStdout, utc) shutdownCloser.Add(closeLogger) log = logMaker.Logger("APP") - log.Infof("%s version %s (Go version %s)", appName, app.Version, runtime.Version()) + log.Infof("%s version %s (Go version %s)", appName, bwapp.Version, runtime.Version()) if utc { log.Infof("Logging with UTC time stamps. Current local time is %v", time.Now().Local().Format("15:04:05 MST")) @@ -241,7 +187,7 @@ func mainCore() error { }() // Prepare the core. - clientCore, err := core.New(cfg.Core(logMaker.Logger("CORE"))) + clientCore, err = core.New(cfg.Core(logMaker.Logger("CORE"))) if err != nil { return fmt.Errorf("error creating client core: %w", err) } @@ -334,64 +280,34 @@ func mainCore() error { return fmt.Errorf("url.ParseRequestURI error: %w", err) } - logDir := filepath.Dir(cfg.LogPath) - classWrapper := initCocoaDefaultDelegateClassWrapper(logDir) - - // MacOS will always execute this method when bisonw-desktop is about to exit - // so we should use this opportunity to cleanup. See: - // https://developer.apple.com/documentation/appkit/nsapplicationdelegate/1428642-applicationshouldterminate?language=objc - classWrapper.AddMethod("applicationShouldTerminate:", func(s objc.Object) mdCore.NSUInteger { - cancel() // no-op with clean rpc/web server setup - wg.Wait() // no-op with clean setup and shutdown - shutdownCloser.Done() // execute shutdown functions - return mdCore.NSUInteger(1) - }) + // Set the appHost to the host part of the URL. This is used to determine if + // the URL should be opened in the webview or in the user's default browser. + appHost, _, _ = strings.Cut(appURL.Host, ":") - // MacOS will always execute this method when bisonw-desktop window is about - // to close See: - // https://developer.apple.com/documentation/appkit/nswindowdelegate/1419605-windowwillclose?language=objc - var noteSent bool - classWrapper.AddMethod("windowWillClose:", func(_ objc.Object) { - windowsOpen := nOpenWindows.Add(-1) - if windowsOpen > 0 { - return // nothing to do - } - - err := clientCore.Logout() - if err == nil { - return // nothing to do - } - - if !errors.Is(err, core.ActiveOrdersLogoutErr) { - log.Errorf("Core logout error: %v", err) - return - } - - if !noteSent && cocoa.NSApp().IsRunning() { // last window has been closed but app is still running - noteSent = true - sendDesktopNotification("Bison Wallet still running", "Bison Wallet is still resolving active DEX orders") - } - }) + logDir = filepath.Dir(cfg.LogPath) - // Bind JS callback function handler. - bindJSFunctionHandler() + app := appkit.Application_SharedApplication() - app := cocoa.NSApp() - // Set the "ActivationPolicy" to "NSApplicationActivationPolicyRegular" in + // Set the "ActivationPolicy" to "ApplicationActivationPolicyRegular" in // order to run bisonw-desktop as a regular MacOS app (i.e as a non-cli - // application). See: - // https://developer.apple.com/documentation/appkit/nsapplication/1428621-setactivationpolicy?language=objc - app.SetActivationPolicy(cocoa.NSApplicationActivationPolicyRegular) + // application). + app.SetActivationPolicy(appkit.ApplicationActivationPolicyRegular) // Set "ActivateIgnoringOtherApps" to "false" in order to block other // attempt at opening bisonw-desktop from creating a new instance when - // bisonw-desktop is already running. See: - // https://developer.apple.com/documentation/appkit/nsapplication/1428468-activateignoringotherapps/. - // "ActivateIgnoringOtherApps" is deprecated but still allowed until macOS - // version 14. Ventura is macOS version 13. + // bisonw-desktop is already running. "ActivateIgnoringOtherApps" is + // deprecated but still allowed until macOS version 14. Ventura is macOS + // version 13. app.ActivateIgnoringOtherApps(false) + + delegate := newAppDelegate(logDir, func() { + log.Infof("Shutting down...") + cancel() + wg.Wait() // no-op with clean setup and shutdown + shutdownCloser.Done() // execute shutdown functions + }) // Set bisonw-desktop delegate to manage bisonw-desktop behavior. See: // https://developer.apple.com/documentation/appkit/nsapplication/1428705-delegate?language=objc - app.SetDelegate(cocoa.DefaultDelegate) + app.SetDelegate(&delegate) wg.Add(1) go func() { @@ -399,7 +315,7 @@ func mainCore() error { for { select { case <-appCtx.Done(): - cocoa.NSApp().Terminate() + app.Terminate(nil) return } } @@ -417,143 +333,149 @@ func hasOpenWindows() bool { return nOpenWindows.Load() > 0 } -// createNewWebView creates a new webview with the specified URL. The actual -// window will be created when the webview is loaded (i.e the -// "webView:didFinishNavigation:" method have been executed). +var ( + windowPool []*appkit.Window + windowPoolMutex sync.Mutex + activeOrdersNoteSent bool +) + +// createNewWebView creates a new webview and window. func createNewWebView() { if int(nOpenWindows.Load()) >= maxOpenWindows { log.Debugf("Ignoring open new window request, max number of (%d) open windows exceeded", maxOpenWindows) return } - // Create a new webview and loads the appURL. - req := mdCore.NSURLRequest_Init(mdCore.URL(appURL.String())) - webView := webkit.WKWebView_Init(mdCore.Rect(0, 0, float64(width), float64(height)), webviewConfig) - webView.Object.Class().AddMethod(selIsNewWebview, func(_ objc.Object) objc.Object { return mdCore.True }) - webView.LoadRequest(req) - webView.SetAllowsBackForwardNavigationGestures_(true) - webView.SetUIDelegate_(cocoa.DefaultDelegate) - webView.SetNavigationDelegate_(cocoa.DefaultDelegate) -} + windowPoolMutex.Lock() + if len(windowPool) > 0 { + windowPtr := windowPool[len(windowPool)-1] + windowPool = windowPool[:len(windowPool)-1] + windowPoolMutex.Unlock() -// cocoaDefaultDelegateClassWrapper wraps cocoa.DefaultDelegateClass. -type cocoaDefaultDelegateClassWrapper struct { - objc.Class -} + windowPtr.MakeKeyAndOrderFront(nil) + nOpenWindows.Add(1) + return + } + windowPoolMutex.Unlock() -// initCocoaDefaultDelegateClassWrapper creates a new -// *cocoaDefaultDelegateClassWrapper and adds required Object-C methods. Other -// methods can be added to the returned *cocoaDefaultDelegateClassWrapper. -func initCocoaDefaultDelegateClassWrapper(logDir string) *cocoaDefaultDelegateClassWrapper { - ad := &cocoaDefaultDelegateClassWrapper{ - Class: cocoa.DefaultDelegateClass, - } - - // Set the app's main and status bar menu when we receive - // NSApplicationWillFinishLaunchingNotification. See: - // - https://github.com/go-gl/glfw/blob/master/v3.3/glfw/glfw/src/cocoa_init.m#L427-L443 - // - https://developer.apple.com/documentation/appkit/nsapplicationwillfinishlaunchingnotification?language=objc - ad.AddMethod("applicationWillFinishLaunching:", ad.handleApplicationWillFinishLaunching) - // MacOS will always send a notification named - // "NSApplicationDidFinishLaunchingNotification" when an application has - // finished launching. See: - // https://developer.apple.com/documentation/appkit/nsapplicationdidfinishlaunchingnotification?language=objc - ad.AddMethod("applicationDidFinishLaunching:", ad.handleApplicationDidFinishLaunching) - // MacOS will always execute this method when bisonw-desktop icon on the dock - // is clicked or a new process is about to start, so we hijack the action - // and create new windows if all windows have been closed. See: - // https://developer.apple.com/documentation/appkit/nsapplicationdelegate/1428638-applicationshouldhandlereopen?language=objc - ad.AddMethod("applicationShouldHandleReopen:hasVisibleWindows:", ad.handleApplicationShouldHandleReopenHasVisibleWindows) - // "applicationDockMenu:" method returns the app's dock menu. See: - // https://developer.apple.com/documentation/appkit/nsapplicationdelegate/1428564-applicationdockmenu?language=objc - ad.AddMethod("applicationDockMenu:", ad.handleApplicationDockMenu) - // WebView will execute this method when the page has loaded. We can then - // create a new window to avoid a temporary blank window. See: - // https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455629-webview?language=objc - // NOTE: This method actually receives three argument but the docs said to - // expect two (webView and navigation). - ad.AddMethod("webView:didFinishNavigation:", ad.handleWebViewDidFinishNavigation) - // MacOS will execute this method when a file upload button is clicked. See: - // https://developer.apple.com/documentation/webkit/wkuidelegate/1641952-webview?language=objc - ad.AddMethod("webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:", ad.handleWebViewRunOpenPanelWithParametersInitiatedByFrameCompletionHandler) - // MacOS will execute this method for each navigation in webview to decide - // if to open the URL in webview or in the user's default browser. See: - // https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455641-webview?language=objc - ad.AddMethod("webView:decidePolicyForNavigationAction:decisionHandler:", ad.handleWebViewDecidePolicyForNavigationActionDecisionHandler) - // MacOS will execute this method when bisonw-desktop is started with a - // self-signed certificate and a new webview is requested. See: - // https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455638-webview?language=objc - // and https://developer.apple.com/forums/thread/15610. - ad.AddMethod("webView:didReceiveAuthenticationChallenge:completionHandler:", ad.handleWebViewDidReceiveAuthenticationChallengeCompletionHandler) - - // Add custom selectors to the app delegate since there are reused in - // different menus. App delegates methods should be added before NSApp is - // initialized. - ad.AddMethod(selOpenLogs, func(_ objc.Object) { - logDirURL, err := app.FilePathToURL(logDir) - if err != nil { - log.Errorf("error constructing log directory URL: %v", err) - } else { - openURL(logDirURL) + webView := objc.Call[webkit.WebView](completionHandler, objc.Sel("newWebView")) + webView.SetFrameSize(foundation.Size{Width: width, Height: height}) + webView.SetAllowsBackForwardNavigationGestures(true) + webView.SetUIDelegate(newUIDelegate()) + webView.SetNavigationDelegate(newNavigationDelegate()) + webView.Configuration().Preferences().SetJavaScriptCanOpenWindowsAutomatically(true) + webkit.AddScriptMessageHandler(webView, bwJsHandlerName, userContentControllerDidReceiveScriptMessageHandler) + webkit.LoadURL(webView, appURL.String()) + + win := appkit.NewWindowWithSize(width, height) + objc.Retain(&win) + + windowDelegate := appkit.WindowDelegate{} + windowDelegate.SetWindowShouldClose(func(sender appkit.Window) bool { + sender.OrderOut(nil) + windowPoolMutex.Lock() + windowPool = append(windowPool, &win) + windowPoolMutex.Unlock() + + windowsOpen := nOpenWindows.Add(-1) + if windowsOpen > 0 { + return false } - }) - ad.AddMethod(selNewWindow, func(_ objc.Object) { - windows := cocoa.NSApp().OrderedWindows() - len := windows.Count() - if len < uint64(maxOpenWindows) { - createNewWebView() - } else { - // Show the last window if maxOpenWindows has been exceeded. - winObj := windows.ObjectAtIndex(len - 1) - win := cocoa.NSWindow_fromRef(winObj) - win.MakeMainWindow() + + err := clientCore.Logout() + if err == nil { + return false + } + + if !errors.Is(err, core.ActiveOrdersLogoutErr) { + log.Infof("logout error: %v", err) + return false + } + + app := appkit.Application_SharedApplication() + if !activeOrdersNoteSent && app.IsRunning() { + activeOrdersNoteSent = true + sendDesktopNotification("Bison Wallet still running", "Bison Wallet is still resolving active DEX orders") } + + return false + }) + + win.SetTitle(appTitle) + win.SetMovable(true) + win.SetContentView(webView) + win.MakeKeyAndOrderFront(win) + win.SetDelegate(&windowDelegate) + win.SetMinSize(foundation.Size{Width: 600, Height: 600}) + win.Center() + + nOpenWindows.Add(1) +} + +// newAppDelegate creates a new appkit.ApplicationDelegate and sets required +// methods. Other methods can be added to the returned +// appkit.ApplicationDelegate. +func newAppDelegate(logDir string, shutdownCallback func()) appkit.ApplicationDelegate { + ad := appkit.ApplicationDelegate{} + + ad.SetApplicationWillFinishLaunching(dw.handleApplicationWillFinishLaunching) + + ad.SetApplicationDidFinishLaunching(dw.handleApplicationDidFinishLaunching) + + ad.SetApplicationShouldHandleReopenHasVisibleWindows(dw.handleApplicationShouldHandleReopenHasVisibleWindows) + + ad.SetApplicationDockMenu(dw.handleApplicationDockMenu) + + ad.SetApplicationShouldTerminateAfterLastWindowClosed(func(appkit.Application) bool { + return false + }) + + // MacOS will always execute this method when bisonw-desktop is about to exit + // so we should use this opportunity to cleanup. + ad.SetApplicationShouldTerminate(func(_ appkit.Application) appkit.ApplicationTerminateReply { + shutdownCallback() + return appkit.TerminateNow }) return ad } -func (ad *cocoaDefaultDelegateClassWrapper) handleApplicationWillFinishLaunching(_ objc.Object) { - // Create the status bar menu. We want users to notice bisonw desktop is - // still running (even with the dot below the dock icon). - obj := cocoa.NSStatusBar_System().StatusItemWithLength(cocoa.NSVariableStatusItemLength) - obj.Retain() - obj.Button().SetImage(cocoa.NSImage_InitWithData(mdCore.NSData_WithBytes(Icon, uint64(len(Icon))))) - obj.Button().Image().SetSize(mdCore.Size(18, 18)) - obj.Button().SetToolTip("Self-custodial multi-wallet") - - runningItem := cocoa.NSMenuItem_New() - runningItem.SetTitle("Bison Wallet is running") - runningItem.SetEnabled(false) - - menu := cocoa.NSMenu_New() - menu.AddItem(runningItem) - quitMenuItem := cocoa.NSMenuItem_Init("Quit "+macOSAppTitle, objc.Sel("terminate:"), "q") - quitMenuItem.SetToolTip("Quit Bison Wallet") - menu.AddItem(quitMenuItem) - obj.SetMenu(menu) +func newUIDelegate() *webkit.UIDelegate { + wd := &webkit.UIDelegate{} + // MacOS will execute this method when a file upload button is clicked. See: + wd.SetWebViewRunOpenPanelWithParametersInitiatedByFrameCompletionHandler(dw.handleWebViewRunOpenPanelWithParametersInitiatedByFrameCompletionHandler) + return wd +} - setAppMainMenuBar() +func newNavigationDelegate() *webkit.NavigationDelegate { + navigationDelegate := &webkit.NavigationDelegate{} + + // MacOS will execute this method when bisonw-desktop is started with a + // self-signed certificate and a new webview is requested. + navigationDelegate.SetWebViewDidReceiveAuthenticationChallengeCompletionHandler(dw.handleWebViewDidReceiveAuthenticationChallengeCompletionHandler) - // Hide the application until it is ready to be shown when we receive - // the "NSApplicationDidFinishLaunchingNotification" below. This also - // allows us to ensure the menu bar is redrawn. - cocoa.NSApp().TryToPerform_with_(objc.Sel("hide:"), nil) + // MacOS will execute this method for each navigation in webview to decide + // if to open the URL in webview or in the user's default browser. + navigationDelegate.SetWebViewDecidePolicyForNavigationActionDecisionHandler(dw.handleWebViewDecidePolicyForNavigationActionDecisionHandler) + + return navigationDelegate } -func (ad *cocoaDefaultDelegateClassWrapper) handleApplicationDidFinishLaunching(_, _ objc.Object) { - // Unhide the app on the main thread after it has finished launching we need - // to give this priority before creating the window to ensure the window is - // immediately visible when it's created. This also has the side effect of - // redrawing the menu bar which will be unresponsive until it is redrawn. - mdCore.Dispatch(func() { - cocoa.NSApp().TryToPerform_with_(objc.Sel("unhide:"), nil) - }) +// delegateWrapper implements methods that a added to an +// appkit.ApplicationDelegate. +type delegateWrapper struct{} +func (_ *delegateWrapper) handleApplicationWillFinishLaunching(_ foundation.Notification) { + app := appkit.Application_SharedApplication() + setSystemBar(app) + setAppMainMenuBar(app) +} + +func (_ *delegateWrapper) handleApplicationDidFinishLaunching(_ foundation.Notification) { createNewWebView() } -func (ad *cocoaDefaultDelegateClassWrapper) handleApplicationShouldHandleReopenHasVisibleWindows(_ objc.Object) bool { +func (_ *delegateWrapper) handleApplicationShouldHandleReopenHasVisibleWindows(_ appkit.Application, hasVisibleWindows bool) bool { if !hasOpenWindows() { // bisonw-desktop is already running but there are no windows open so // we should create a new window. @@ -567,174 +489,172 @@ func (ad *cocoaDefaultDelegateClassWrapper) handleApplicationShouldHandleReopenH return true } -func (ad *cocoaDefaultDelegateClassWrapper) handleApplicationDockMenu(_ objc.Object) objc.Object { - menu := cocoa.NSMenu_New() - newWindowMenuItem := cocoa.NSMenuItem_Init("New Window", objc.Sel(selNewWindow), "n") - logsMenuItem := cocoa.NSMenuItem_Init("Open Logs", objc.Sel(selOpenLogs), "l") - menu.AddItem(newWindowMenuItem) - menu.AddItem(logsMenuItem) +func (_ *delegateWrapper) handleApplicationDockMenu(_ appkit.Application) appkit.Menu { + menu := appkit.NewMenu() + menu.AddItem(appkit.NewMenuItemWithAction("New Window", "n", menuItemActionNewWindow)) + menu.AddItem(appkit.NewMenuItemWithAction("Open Logs", "l", menuItemActionOpenLogs)) return menu } -func (ad *cocoaDefaultDelegateClassWrapper) handleWebViewRunOpenPanelWithParametersInitiatedByFrameCompletionHandler(_ objc.Object, webview objc.Object, param objc.Object, fram objc.Object, completionHandlerFn objc.Object) { - panel := objc.Get("NSOpenPanel").Send("openPanel") - openFiles := panel.Send("runModal").Bool() - if !openFiles { - completionHandler.Send("completionHandler:withURLs:", completionHandlerFn, nil) +// handleWebViewRunOpenPanelWithParametersInitiatedByFrameCompletionHandler +// handles file selection requests from the webview. This is used to open a file +// selection dialog when the user clicks on a file upload button in the webview. +func (_ *delegateWrapper) handleWebViewRunOpenPanelWithParametersInitiatedByFrameCompletionHandler(_ webkit.WebView, p webkit.OpenPanelParameters, _ webkit.FrameInfo, completionHandler func(URLs []foundation.URL)) { + panel := appkit.OpenPanel_OpenPanel() + panel.SetAllowsMultipleSelection(p.AllowsMultipleSelection()) + panel.SetCanChooseDirectories(p.AllowsDirectories()) + resp := panel.RunModal() + if resp == appkit.ModalResponseOK { + completionHandler(panel.URLs()) return } - completionHandler.Send("completionHandler:withURLs:", completionHandlerFn, panel.Send("URLs")) + completionHandler([]foundation.URL{}) } -func (ad *cocoaDefaultDelegateClassWrapper) handleWebViewDidReceiveAuthenticationChallengeCompletionHandler(_ objc.Object, webview objc.Object, challenge objc.Object, challengeCompletionHandler objc.Object) { - completionHandler.Send("authenticationCompletionHandler:withChallenge:", challengeCompletionHandler, challenge) +func (_ *delegateWrapper) handleWebViewDidReceiveAuthenticationChallengeCompletionHandler(_ webkit.WebView, challenge foundation.URLAuthenticationChallenge, challengeCompletionHandler func(disposition foundation.URLSessionAuthChallengeDisposition, credential foundation.URLCredential)) { + challengeCompletionHandler(foundation.URLSessionAuthChallengeUseCredential, challenge.ProposedCredential()) } -func (ad *cocoaDefaultDelegateClassWrapper) handleWebViewDidFinishNavigation(_ objc.Object /* delegate */, webView objc.Object, _ objc.Object /* navigation */) { - // Return early if we already created a window for this webview. - if !mdCore.True.Equals(webView.Send(selIsNewWebview)) { - return // Nothing to do. This is just a normal window refresh. +func (_ *delegateWrapper) handleWebViewDecidePolicyForNavigationActionDecisionHandler(webView webkit.WebView, navigationAction webkit.NavigationAction, decisionHandler func(arg0 webkit.NavigationActionPolicy)) { + decisionPolicy := webkit.NavigationActionPolicyAllow + reqURL := navigationAction.Request().URL() + host, _, _ := strings.Cut(reqURL.Host(), ":") + isLogExport := reqURL.Path() == "/api/exportapplog" + if host != appHost || isLogExport { + decisionPolicy = webkit.NavigationActionPolicyCancel + if isLogExport { + openLogs() + } else { + openURL(reqURL.AbsoluteString()) + } } + decisionHandler(decisionPolicy) +} - // Overwrite the webview "selIsNewWebview" method to return false. This will - // prevent this new webview from opening new windows later. - webView.Class().AddMethod(selIsNewWebview, func(_ objc.Object) objc.Object { return mdCore.False }) - nOpenWindows.Add(1) // increment the number of open windows +func menuItemActionNewWindow(_ objc.Object) { + createNewWebView() +} - // Create a new window and set the webview as its content view. - win := cocoa.NSWindow_Init(mdCore.NSMakeRect(0, 0, float64(width), float64(height)), cocoa.NSClosableWindowMask|cocoa.NSTitledWindowMask|cocoa.NSResizableWindowMask|cocoa.NSFullSizeContentViewWindowMask|cocoa.NSMiniaturizableWindowMask, cocoa.NSBackingStoreBuffered, false) - win.SetTitle(appTitle) - win.Center() - win.SetMovable_(true) - win.SetContentView(webkit.WKWebView_fromRef(webView)) - win.SetMinSize_(mdCore.NSSize{Width: 600, Height: 600}) - win.MakeKeyAndOrderFront(nil) - win.SetDelegate_(cocoa.DefaultDelegate) +func menuItemActionOpenLogs(_ objc.Object) { + openLogs() } -func (ad *cocoaDefaultDelegateClassWrapper) handleWebViewDecidePolicyForNavigationActionDecisionHandler(delegate objc.Object, webview objc.Object, navigation objc.Object, decisionHandler objc.Object) { - reqURL := mdCore.NSURLRequest_fromRef(navigation.Send("request")).URL() - destinationHost := reqURL.Host().String() - var decisionPolicy int - if appURL.Hostname() != destinationHost { - decisionPolicy = NavigationActionPolicyCancel - openURL(reqURL.String()) +func openLogs() { + logDirURL, err := bwapp.FilePathToURL(logDir) + if err != nil { + log.Errorf("error constructing log directory URL: %v", err) + return + } - completionHandler.Send("decisionHandler:withPolicy:", decisionHandler, decisionPolicy) + openURL(logDirURL) } -// setAppMainMenuBar creates and sets the main menu items for the app menu. -func setAppMainMenuBar() { - // Create the App menu. - appMenu := cocoa.NSMenu_Init(macOSAppTitle) +// setSystemBar creates and sets the system bar menu items for the app. +func setSystemBar(app appkit.Application) { + runningMenuItem := appkit.NewMenuItem() + runningMenuItem.SetTitle("Bison Wallet is running") + runningMenuItem.SetEnabled(false) - // Create the menu items. - hideMenuItem := cocoa.NSMenuItem_Init("Hide "+macOSAppTitle, objc.Sel("hide:"), "h") - hideOthersMenuItem := cocoa.NSMenuItem_Init("Hide Others", objc.Sel("hideOtherApplications:"), "") - showAllMenuItem := cocoa.NSMenuItem_Init("Show All", objc.Sel("unhideAllApplications:"), "") - quitMenuItem := cocoa.NSMenuItem_Init("Quit "+macOSAppTitle, objc.Sel("terminate:"), "q") + hideMenuItem := appkit.NewMenuItemWithAction("Hide", "h", func(_ objc.Object) { app.Hide(nil) }) + hideMenuItem.SetToolTip("Hide Bison Wallet") + + quitMenuItem := appkit.NewMenuItemWithAction("Quit "+macOSAppTitle, "q", func(_ objc.Object) { app.Terminate(nil) }) quitMenuItem.SetToolTip("Quit Bison Wallet") - // Add the menu items. - appMenu.AddItem(hideMenuItem) - appMenu.AddItem(hideOthersMenuItem) - appMenu.AddItem(showAllMenuItem) - appMenu.AddItem(cocoa.NSMenuItem_Separator()) + // Create the status bar menu item. + menu := appkit.NewMenuWithTitle("main") + menu.AddItem(runningMenuItem) + menu.AddItem(hideMenuItem) + menu.AddItem(quitMenuItem) + + // Create the status bar icon. + icon := appkit.NewImageWithData(Icon) + icon.SetSize(foundation.Size{Width: 18, Height: 18}) + + // Create the status bar menu. We want users to notice bisonw desktop is + // still running (even with the dot below the dock icon). + item := appkit.StatusBar_SystemStatusBar().StatusItemWithLength(appkit.VariableStatusItemLength) + objc.Retain(&item) + + item.Button().SetImage(icon) + item.Button().SetToolTip("Self-custodial multi-wallet") + item.SetMenu(menu) +} + +// setAppMainMenuBar creates and sets the main menu items for the app menu. +func setAppMainMenuBar(app appkit.Application) { + // Create the App menu. + appMenu := appkit.NewMenuWithTitle(macOSAppTitle) + appMenu.AddItem(appkit.NewMenuItemWithAction("Hide "+macOSAppTitle, "h", func(_ objc.Object) { app.Hide(nil) })) + appMenu.AddItem(appkit.NewMenuItemWithAction("Hide Others", "", func(_ objc.Object) { app.HideOtherApplications(nil) })) + appMenu.AddItem(appkit.NewMenuItemWithAction("Show All", "", func(_ objc.Object) { app.UnhideAllApplications(nil) })) + appMenu.AddItem(appkit.MenuItem_SeparatorItem()) + quitMenuItem := appkit.NewMenuItemWithAction("Quit "+macOSAppTitle, "q", func(_ objc.Object) { app.Terminate(nil) }) + quitMenuItem.SetToolTip("Quit " + macOSAppTitle) appMenu.AddItem(quitMenuItem) // Create the "Window" menu. - windowMenu := cocoa.NSMenu_Init("Window") - - // Create the "Window" menu items. - newWindowMenuItem := cocoa.NSMenuItem_Init("New Window", objc.Sel(selNewWindow), "n") - minimizeMenuItem := cocoa.NSMenuItem_Init("Minimize", objc.Sel("performMiniaturize:"), "m") - zoomMenuItem := cocoa.NSMenuItem_Init("Zoom", objc.Sel("performZoom:"), "z") - frontMenuItem := cocoa.NSMenuItem_Init("Bring All to Front", objc.Sel("arrangeInFront:"), "") - fullScreenMenuItem := cocoa.NSMenuItem_Init("Enter Full Screen", objc.Sel("toggleFullScreen:"), "f") - - // Add the "Window" menu items. - windowMenu.AddItem(newWindowMenuItem) - windowMenu.AddItem(cocoa.NSMenuItem_Separator()) - windowMenu.AddItem(minimizeMenuItem) - windowMenu.AddItem(zoomMenuItem) - windowMenu.AddItem(frontMenuItem) - windowMenu.AddItem(cocoa.NSMenuItem_Separator()) - windowMenu.AddItem(fullScreenMenuItem) + windowMenu := appkit.NewMenuWithTitle("Window") + windowMenu.AddItem(appkit.NewMenuItemWithAction("New Window", "n", menuItemActionNewWindow)) + windowMenu.AddItem(appkit.MenuItem_SeparatorItem()) + windowMenu.AddItem(appkit.NewMenuItemWithSelector("Minimize", "m", objc.Sel("performMiniaturize:"))) + windowMenu.AddItem(appkit.NewMenuItemWithSelector("Zoom", "z", objc.Sel("performZoom:"))) + windowMenu.AddItem(appkit.NewMenuItemWithSelector("Bring All to Front", "", objc.Sel("arrangeInFront:"))) + windowMenu.AddItem(appkit.MenuItem_SeparatorItem()) + windowMenu.AddItem(appkit.NewMenuItemWithSelector("Enter Full Screen", "f", objc.Sel("toggleFullScreen:"))) + + // Create the "Edit" menu. + editMenu := appkit.NewMenuWithTitle("Edit") + editMenu.AddItem(appkit.NewMenuItemWithSelector("Select All", "a", objc.Sel("selectAll:"))) + editMenu.AddItem(appkit.MenuItem_SeparatorItem()) + editMenu.AddItem(appkit.NewMenuItemWithSelector("Copy", "c", objc.Sel("copy:"))) + editMenu.AddItem(appkit.NewMenuItemWithSelector("Paste", "v", objc.Sel("paste:"))) + editMenu.AddItem(appkit.NewMenuItemWithSelector("Cut", "x", objc.Sel("cut:"))) + editMenu.AddItem(appkit.NewMenuItemWithSelector("Undo", "z", objc.Sel("undo:"))) + editMenu.AddItem(appkit.NewMenuItemWithSelector("Redo", "Z", objc.Sel("redo:"))) // Create the "Others" menu. - othersMenu := cocoa.NSMenu_Init("Others") - - // Create the "Others" menu items. - logsMenuItem := cocoa.NSMenuItem_Init("Open Logs", objc.Sel(selOpenLogs), "l") - - // Add the "Others" menu item. - othersMenu.AddItem(logsMenuItem) + othersMenu := appkit.NewMenuWithTitle("Others") + othersMenu.AddItem(appkit.NewMenuItemWithAction("Open Logs", "l", menuItemActionOpenLogs)) // Create the main menu bar. - menuBar := cocoa.NSMenu_New() - app := cocoa.NSApp() - for _, menu := range []cocoa.NSMenu{appMenu, windowMenu, othersMenu} { - // Create a menu item for the menuBar and set the menu as the - // submenu. See: - // https://developer.apple.com/documentation/appkit/nsmenuitem/1514845-submenu?language=objc - mainBarItem := cocoa.NSMenuItem_New() - mainBarItem.SetTitle(menu.Title()) - mainBarItem.SetSubmenu(menu) - menuBar.AddItem(mainBarItem) + menu := appkit.NewMenuWithTitle("main") + for _, m := range []appkit.Menu{appMenu, editMenu, windowMenu, othersMenu} { + menuItem := appkit.NewMenuItemWithSelector(m.Title(), "", objc.Selector{}) + menuItem.SetSubmenu(m) + menu.AddItem(menuItem) if menu.Title() == "Window" { - // Set NSApp's WindowsMenu to the Window menu. This will allow - // windows to be grouped together in the dock icon and in the - // Window menu. Also, MacOS will automatically add other default - // Window menu items. See: - // https://developer.apple.com/documentation/appkit/nsapplication/1428547-windowsmenu?language=objc - app.Set("WindowsMenu:", menu) + // Set app's WindowsMenu to the Window menu. This will allow windows + // to be grouped together in the dock icon and in the Window menu. + // Also, MacOS will automatically add other default Window menu + // items. See: + // https://developer.apple.com/documentation/appkit/nsapplication/1428547-windowsmenu?language=objc. + // TODO: Since the new update, this is not working as expected, the + // windows are not grouped as expected. + app.SetWindowsMenu(m) } } - app.SetMainMenu(menuBar) + app.SetMainMenu(menu) return } -func windowWidthAndHeight() (width, height int) { - frame := cocoa.NSScreen_Main().Frame() - return limitedWindowWidthAndHeight(int(math.Round(frame.Size.Width)), int(math.Round(frame.Size.Height))) +func windowWidthAndHeight() (width, height float64) { + frame := appkit.Screen_MainScreen().Frame() + return limitedWindowWidthAndHeight(math.Round(frame.Size.Width), math.Round(frame.Size.Height)) } -// bindJSFunctionHandler exports a function handler callable in the frontend. -// The exported function will appear under the given name as a global JavaScript -// function window.webkit.messageHandlers.bwHandler.postMessage([fnName, -// args...]). -// Expected arguments is an array of: -// 1. jsFunctionName as first argument -// 2. jsFunction arguments -func bindJSFunctionHandler() { - const fnName = "bwHandler" - - // Create and register a new objc class for the function handler. - fnClass := objc.NewClass(fnName, "NSObject") - objc.RegisterClass(fnClass) - - // JS function handler must implement the WKScriptMessageHandler protocol. - // See: - // https://developer.apple.com/documentation/webkit/wkscriptmessagehandler?language=objc - fnClass.AddMethod("userContentController:didReceiveScriptMessage:", handleJSFunctionsCallback) - - // The name of this function in the browser window is - // window.webkit.messageHandlers..postMessage(), where - // corresponds to the value of this parameter. See: - // https://developer.apple.com/documentation/webkit/wkusercontentcontroller/1537172-addscriptmessagehandler?language=objc - webviewConfig.Get("userContentController").Send("addScriptMessageHandler:name:", objc.Get(fnName).Alloc().Init(), mdCore.String(fnName)) -} - -// handleJSFunctionsCallback handles function calls from a javascript -// environment. -func handleJSFunctionsCallback(f_ objc.Object /* functionHandler */, ct objc.Object /* WKUserContentController */, msg objc.Object, wv objc.Object /* webview */) { +// userContentControllerDidReceiveScriptMessageHandler is called when a script message +// is received from the webview. Expected arguments is an array of: 1. +// jsFunctionName as first argument, 2. jsFunction arguments (e.g function +// window.webkit.messageHandlers.bwHandler.postMessage([fnName, args...])). +// Satifies the webkit.PScriptMessageHandler interface. +func userContentControllerDidReceiveScriptMessageHandler(msgBody objc.Object) { // Arguments must be provided as an array(NSSingleObjectArrayI or NSArrayI). - msgBody := msg.Get("body") - msgClass := msgBody.Class().String() + msgClass := msgBody.Class().Name() if !strings.Contains(msgClass, "Array") { - log.Errorf("Received unexpected argument type %s (content: %s)", msgClass, msgBody.String()) + log.Errorf("Received unexpected argument type %s (content: %s)", msgClass, msgBody.Description()) return // do nothing } @@ -744,7 +664,7 @@ func handleJSFunctionsCallback(f_ objc.Object /* functionHandler */, ct objc.Obj // = "myName"; }. args := parseJSCallbackArgsString(msgBody) if len(args) == 0 { - log.Errorf("Received unexpected argument type %s (content: %s)", msgClass, msgBody.String()) + log.Errorf("Received unexpected argument type %s (content: %s)", msgClass, msgBody.Description()) return // do nothing } @@ -758,7 +678,7 @@ func handleJSFunctionsCallback(f_ objc.Object /* functionHandler */, ct objc.Obj case fnName == "sendOSNotification" && nArgs > minArg: sendDesktopNotificationJSCallback(args[1:]) default: - log.Errorf("Received unexpected JS function type %s (message content: %s)", fnName, msgBody.String()) + log.Errorf("Received unexpected JS function type %s (message content: %s)", fnName, msgBody.Description()) } } @@ -778,12 +698,12 @@ func sendDesktopNotificationJSCallback(msg []string) { // the "path" is opened with the appropriate app (e.g a valid HTTP URL will be // opened in the user's default browser) func openURL(path string) { - // See: https://developer.apple.com/documentation/appkit/nsworkspace?language=objc - cocoa.NSWorkspace_sharedWorkspace().Send("openURL:", mdCore.NSURL_Init(path)) + url := foundation.NewURLWithString(path) + appkit.Workspace_SharedWorkspace().OpenURL(url) } func parseJSCallbackArgsString(msg objc.Object) []string { - args := mdCore.NSArray_fromRef(msg) + args := foundation.ArrayFrom(msg.Ptr()) count := args.Count() if count == 0 { return nil @@ -791,11 +711,11 @@ func parseJSCallbackArgsString(msg objc.Object) []string { var argsAsStr []string for i := 0; i < int(count); i++ { - ob := args.ObjectAtIndex(uint64(i)) - if ob.Class().String() == "NSNull" /* this is the string representation of the null type in objc. */ { + ob := args.ObjectAtIndex(uint(i)) + if ob.IsNil() || ob.Description() == "" { continue // ignore } - argsAsStr = append(argsAsStr, ob.String()) + argsAsStr = append(argsAsStr, ob.Description()) } return argsAsStr } @@ -848,7 +768,14 @@ func (sc *shutdownCloser) Done() { } func sendDesktopNotification(title, msg string) { - nsTitle := mdCore.NSString_FromString(title) - nsMessage := mdCore.NSString_FromString(msg) - completionHandler.Send("deliverNotificationWithTitle:message:icon:", nsTitle, nsMessage, dexcAppIcon) + // This API is deprecated but still functional. + notif := objc.Call[objc.Object](objc.GetClass("NSUserNotification"), objc.Sel("new")) + objc.Retain(¬if) + objc.Call[objc.Void](notif, objc.Sel("setTitle:"), title) + objc.Call[objc.Void](notif, objc.Sel("setInformativeText:"), msg) + + center := objc.Call[objc.Object](objc.GetClass("NSUserNotificationCenter"), objc.Sel("defaultUserNotificationCenter")) + if center.Ptr() != nil { + objc.Call[objc.Void](center, objc.Sel("deliverNotification:"), notif) + } } diff --git a/client/cmd/bisonw-desktop/go.mod b/client/cmd/bisonw-desktop/go.mod index 0c6da75433..65a8ca147d 100644 --- a/client/cmd/bisonw-desktop/go.mod +++ b/client/cmd/bisonw-desktop/go.mod @@ -1,20 +1,20 @@ module decred.org/dcrdex/client/cmd/bisonw-desktop -go 1.21 +go 1.24.8 replace decred.org/dcrdex => ../../.. require ( decred.org/dcrdex v0.6.3 fyne.io/systray v1.10.1-0.20230403195833-7dc3c09283d6 + github.com/bisoncraft/webview_go v0.1.0 github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 - github.com/progrium/macdriver v0.4.0 - github.com/webview/webview v0.0.0-20230415172654-8387ff8945fc + github.com/progrium/darwinkit v0.5.0 ) require ( github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect @@ -36,6 +36,10 @@ require ( github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.39.0 // indirect + github.com/prometheus/procfs v0.9.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/stretchr/testify v1.9.0 // indirect github.com/supranational/blst v0.3.11 // indirect @@ -46,7 +50,7 @@ require ( require ( decred.org/cspp/v2 v2.4.0 // indirect - decred.org/dcrwallet/v4 v4.3.0 // indirect + decred.org/dcrwallet/v4 v4.3.1 // indirect github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect github.com/DataDog/zstd v1.5.2 // indirect github.com/StackExchange/wmi v1.2.1 // indirect @@ -60,12 +64,12 @@ require ( github.com/btcsuite/btcd/btcutil/psbt v1.1.8 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect - github.com/btcsuite/btcwallet v0.16.10-0.20240815225602-6ecae9c12fde // indirect - github.com/btcsuite/btcwallet/wallet/txauthor v1.3.4 // indirect - github.com/btcsuite/btcwallet/wallet/txrules v1.2.1 // indirect - github.com/btcsuite/btcwallet/wallet/txsizes v1.2.4 // indirect - github.com/btcsuite/btcwallet/walletdb v1.4.2 // indirect - github.com/btcsuite/btcwallet/wtxmgr v1.5.3 // indirect + github.com/btcsuite/btcwallet v0.16.10 // indirect + github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5 // indirect + github.com/btcsuite/btcwallet/wallet/txrules v1.2.2 // indirect + github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5 // indirect + github.com/btcsuite/btcwallet/walletdb v1.4.4 // indirect + github.com/btcsuite/btcwallet/wtxmgr v1.5.4 // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8 // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect @@ -125,7 +129,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/gorilla/websocket v1.5.1 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.3.1 // indirect @@ -160,10 +164,6 @@ require ( github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.39.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect @@ -174,7 +174,7 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/zquestz/grab v0.0.0-20190224022517-abcee96e61b1 // indirect - go.etcd.io/bbolt v1.3.9 // indirect + go.etcd.io/bbolt v1.3.11 // indirect golang.org/x/crypto v0.33.0 // indirect golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect golang.org/x/net v0.28.0 // indirect diff --git a/client/cmd/bisonw-desktop/go.sum b/client/cmd/bisonw-desktop/go.sum index 968d64f0cd..f2cf795921 100644 --- a/client/cmd/bisonw-desktop/go.sum +++ b/client/cmd/bisonw-desktop/go.sum @@ -40,8 +40,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= decred.org/cspp/v2 v2.4.0 h1:whb0YW+UELHJS/UfT5MBXSJXrKUVw5omhgKNhjzYix4= decred.org/cspp/v2 v2.4.0/go.mod h1:9nO3bfvCheOPIFZw5f6sRQ42CjBFB5RKSaJ9Iq6G4MA= -decred.org/dcrwallet/v4 v4.3.0 h1:JqFyUa5Xj51br1In8wzQresUrW5nuGp7cCFIxpb4VZE= -decred.org/dcrwallet/v4 v4.3.0/go.mod h1:cd0+55eXPYwYddb/8r3dRyXI+MXiqx642QisZbswzUI= +decred.org/dcrwallet/v4 v4.3.1 h1:6OZ1GS9YvLk2/SGZc2Tw11QV3sqkov431da7sBd7Bc0= +decred.org/dcrwallet/v4 v4.3.1/go.mod h1:cd0+55eXPYwYddb/8r3dRyXI+MXiqx642QisZbswzUI= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= fyne.io/systray v1.10.1-0.20230403195833-7dc3c09283d6 h1:lHt8dm97Uy9ggtnt9N6XOlsp76wXmRAh3SjReWm1e2Q= fyne.io/systray v1.10.1-0.20230403195833-7dc3c09283d6/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE= @@ -112,8 +112,10 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bisoncraft/webview_go v0.1.0 h1:F0ZiJSYzDqE4HJhI1u5I+Y7H51bYzprDum0tAtMnOw4= +github.com/bisoncraft/webview_go v0.1.0/go.mod h1:cDmD2SZRZJl3wXKsgU3cRLA64HCcJL9Kxa+Hp5u4so4= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0= @@ -141,18 +143,18 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtyd github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcwallet v0.16.10-0.20240815225602-6ecae9c12fde h1:NURMAR/mat4V2ZwZE/dXIu+pfHc3SKN/kvAcKlfs/CU= -github.com/btcsuite/btcwallet v0.16.10-0.20240815225602-6ecae9c12fde/go.mod h1:X2xDre+j1QphTRo54y2TikUzeSvreL1t1aMXrD8Kc5A= -github.com/btcsuite/btcwallet/wallet/txauthor v1.3.4 h1:poyHFf7+5+RdxNp5r2T6IBRD7RyraUsYARYbp/7t4D8= -github.com/btcsuite/btcwallet/wallet/txauthor v1.3.4/go.mod h1:GETGDQuyq+VFfH1S/+/7slLM/9aNa4l7P4ejX6dJfb0= -github.com/btcsuite/btcwallet/wallet/txrules v1.2.1 h1:UZo7YRzdHbwhK7Rhv3PO9bXgTxiOH45edK5qdsdiatk= -github.com/btcsuite/btcwallet/wallet/txrules v1.2.1/go.mod h1:MVSqRkju/IGxImXYPfBkG65FgEZYA4fXchheILMVl8g= -github.com/btcsuite/btcwallet/wallet/txsizes v1.2.4 h1:nmcKAVTv/cmYrs0A4hbiC6Qw+WTLYy/14SmTt3mLnCo= -github.com/btcsuite/btcwallet/wallet/txsizes v1.2.4/go.mod h1:YqJR8WAAHiKIPesZTr9Cx9Az4fRhRLcJ6GcxzRUZCAc= -github.com/btcsuite/btcwallet/walletdb v1.4.2 h1:zwZZ+zaHo4mK+FAN6KeK85S3oOm+92x2avsHvFAhVBE= -github.com/btcsuite/btcwallet/walletdb v1.4.2/go.mod h1:7ZQ+BvOEre90YT7eSq8bLoxTsgXidUzA/mqbRS114CQ= -github.com/btcsuite/btcwallet/wtxmgr v1.5.3 h1:QrWCio9Leh3DwkWfp+A1SURj8pYn3JuTLv3waP5uEro= -github.com/btcsuite/btcwallet/wtxmgr v1.5.3/go.mod h1:M4nQpxGTXiDlSOODKXboXX7NFthmiBNjzAKKNS7Fhjg= +github.com/btcsuite/btcwallet v0.16.10 h1:SDMS0Gp7oEJVvyZNQ6gDYkpkvp/cSMRcAAy3fvO3vTk= +github.com/btcsuite/btcwallet v0.16.10/go.mod h1:1HJXYbjJzgumlnxOC2+ViR1U+gnHWoOn7WeK5OfY1eU= +github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5 h1:Rr0njWI3r341nhSPesKQ2JF+ugDSzdPoeckS75SeDZk= +github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5/go.mod h1:+tXJ3Ym0nlQc/iHSwW1qzjmPs3ev+UVWMbGgfV1OZqU= +github.com/btcsuite/btcwallet/wallet/txrules v1.2.2 h1:YEO+Lx1ZJJAtdRrjuhXjWrYsmAk26wLTlNzxt2q0lhk= +github.com/btcsuite/btcwallet/wallet/txrules v1.2.2/go.mod h1:4v+grppsDpVn91SJv+mZT7B8hEV4nSmpREM4I8Uohws= +github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5 h1:93o5Xz9dYepBP4RMFUc9RGIFXwqP2volSWRkYJFrNtI= +github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5/go.mod h1:lQ+e9HxZ85QP7r3kdxItkiMSloSLg1PEGis5o5CXUQw= +github.com/btcsuite/btcwallet/walletdb v1.4.4 h1:BDel6iT/ltYSIYKs0YbjwnEDi7xR3yzABIsQxN2F1L8= +github.com/btcsuite/btcwallet/walletdb v1.4.4/go.mod h1:jk/hvpLFINF0C1kfTn0bfx2GbnFT+Nvnj6eblZALfjs= +github.com/btcsuite/btcwallet/wtxmgr v1.5.4 h1:hJjHy1h/dJwSfD9uDsCwcH21D1iOrus6OrI5gR9E/O0= +github.com/btcsuite/btcwallet/wtxmgr v1.5.4/go.mod h1:lAv0b1Vj9Ig5U8QFm0yiJ9WqPl8yGO/6l7JxdHY1PKE= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8 h1:nOsAWScwueMVk/VLm/dvQQD7DuanyvAUb6B3P3eT274= @@ -182,10 +184,6 @@ github.com/charithe/durationcheck v0.0.6/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6pr github.com/charithe/durationcheck v0.0.7/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= github.com/chavacava/garif v0.0.0-20210405163807-87a70f3d418b/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= -github.com/chromedp/cdproto v0.0.0-20230220211738-2b1ec77315c9/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= -github.com/chromedp/cdproto v0.0.0-20230625224106-7fafe342e117/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= -github.com/chromedp/chromedp v0.9.1/go.mod h1:DUgZWRvYoEfgi66CgZ/9Yv+psgi+Sksy5DTScENWjaQ= -github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -428,7 +426,8 @@ github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8w github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= +github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= +github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4 h1:qZNfIGkIANxGv/OqtnntR4DfOY2+BgwR60cAcu/i3SE= github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4/go.mod h1:kW3HQ4UdaAyrUCSSDR4xUzBKW6O2iA4uHhk7AtyYp10= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= @@ -447,10 +446,6 @@ github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2 github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= -github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -538,8 +533,8 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -560,8 +555,8 @@ github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4Mgqvf github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gookit/color v1.3.8/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= @@ -674,7 +669,6 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/bitset v1.0.0 h1:Ws0PXV3PwXqWK2n7Vz6idCdrV/9OrBXgHEJi27ZB9Dw= github.com/jrick/bitset v1.0.0/go.mod h1:ZOYB5Uvkla7wIEY4FEssPVi3IQXa02arznRaYaAEPe4= @@ -736,7 +730,6 @@ github.com/ldez/gomoddirectives v0.2.1/go.mod h1:sGicqkRgBOg//JfpXwkB9Hj0X5RyJ7m github.com/ldez/tagliatelle v0.2.0/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= @@ -784,7 +777,6 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -907,7 +899,6 @@ github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxS github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= @@ -941,9 +932,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/polyfloyd/go-errorlint v0.0.0-20210418123303-74da32850375/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= github.com/polyfloyd/go-errorlint v0.0.0-20210510181950-ab96adb96fea/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/progrium/macdriver v0.4.0 h1:aQ4KCBRG1XlMWxA8fM7ABvRJrOVs8p8jeb9wEz1SZX0= -github.com/progrium/macdriver v0.4.0/go.mod h1:eOkZeUZKoYeBp7kXdZXTPqtn+c67fVxBYO6NyHIoDac= -github.com/progrium/macschema v0.1.1-0.20230703163849-29f3d05de640/go.mod h1:4Xfn2JjWUS9ZFQwyRsrU8hbOHVAuvDj+7PX29p1uhts= +github.com/progrium/darwinkit v0.5.0 h1:SwchcMbTOG1py3CQsINmGlsRmYKdlFrbnv3dE4aXA0s= +github.com/progrium/darwinkit v0.5.0/go.mod h1:PxQhZuftnALLkCVaR8LaHtUOfoo4pm8qUDG+3C/sXNs= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -1133,8 +1123,6 @@ github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl github.com/valyala/quicktemplate v1.6.3/go.mod h1:fwPzK2fHuYEODzJ9pkw0ipCPNHZ2tD5KW4lOuSdPKzY= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= -github.com/webview/webview v0.0.0-20230415172654-8387ff8945fc h1:3LWOLV/SbVjPYCARWGcRpOKP30U/I6EP1v8PSIoh1aU= -github.com/webview/webview v0.0.0-20230415172654-8387ff8945fc/go.mod h1:rpXAuuHgyEJb6kXcXldlkOjU6y4x+YcASKKXJNUhh0Y= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= @@ -1158,8 +1146,8 @@ go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= -go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0= +go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= @@ -1384,7 +1372,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201022201747-fb209a7c41cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201024232916-9f70ab9862d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1408,7 +1395,6 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= diff --git a/client/cmd/bisonw-desktop/icon.go b/client/cmd/bisonw-desktop/icon.go index bad209a944..482255c8fb 100644 --- a/client/cmd/bisonw-desktop/icon.go +++ b/client/cmd/bisonw-desktop/icon.go @@ -8,7 +8,7 @@ package main import ( _ "embed" - "github.com/webview/webview" + "github.com/bisoncraft/webview_go" ) //go:embed src/bisonw.png diff --git a/client/cmd/bisonw-desktop/icon_linux.go b/client/cmd/bisonw-desktop/icon_linux.go index 82d034e96f..da3aa8de8b 100644 --- a/client/cmd/bisonw-desktop/icon_linux.go +++ b/client/cmd/bisonw-desktop/icon_linux.go @@ -31,7 +31,7 @@ import ( _ "embed" "unsafe" - "github.com/webview/webview" + webview "github.com/bisoncraft/webview_go" ) //go:embed src/bisonw.png diff --git a/client/cmd/bisonw-desktop/icon_windows.go b/client/cmd/bisonw-desktop/icon_windows.go index 87be8c26c3..6b563fe060 100644 --- a/client/cmd/bisonw-desktop/icon_windows.go +++ b/client/cmd/bisonw-desktop/icon_windows.go @@ -35,7 +35,7 @@ import ( "strings" "unsafe" - "github.com/webview/webview" + "github.com/bisoncraft/webview_go" ) //go:embed src/bisonw.png diff --git a/client/cmd/bisonw-desktop/main.go b/client/cmd/bisonw-desktop/main.go index 6f86ff1be4..1366e6fa04 100644 --- a/client/cmd/bisonw-desktop/main.go +++ b/client/cmd/bisonw-desktop/main.go @@ -115,7 +115,7 @@ func findExePath() string { return s } -func limitedWindowWidthAndHeight(width int, height int) (int, int) { +func limitedWindowWidthAndHeight(width float64, height float64) (float64, float64) { if width <= 0 || width > 1920 { width = 1920 } diff --git a/client/cmd/bisonw-desktop/pkg/common.sh b/client/cmd/bisonw-desktop/pkg/common.sh new file mode 100644 index 0000000000..9a8d6109a0 --- /dev/null +++ b/client/cmd/bisonw-desktop/pkg/common.sh @@ -0,0 +1,19 @@ + +# This file defines common variables to be source'd by the various build scripts +# in this directory. + +# pick up the release tag from git +VER=$(git describe --tags --abbrev=0 --always | sed -e 's/^v//') +META= # "release" +REV="0" + +APP="bisonw" +ARCH="amd64" + +# The build directory will be deleted at the beginning of every build. The +# directory is .gitignore'd. +BUILD_DIR="./build" + +# DEB_NAME follows the prescribed format for debian packaging. +DEB_NAME="${APP}_${VER}-${REV}_${ARCH}" + diff --git a/client/cmd/bisonw-desktop/pkg/pkg-darwin.sh b/client/cmd/bisonw-desktop/pkg/pkg-darwin.sh index ade39caf70..0e8b028cbc 100755 --- a/client/cmd/bisonw-desktop/pkg/pkg-darwin.sh +++ b/client/cmd/bisonw-desktop/pkg/pkg-darwin.sh @@ -24,8 +24,8 @@ APP_NAME="Bison Wallet" VOLUME_NAME="Bison Wallet ${VER}${META:++${META}}" # Filepaths to important directories. -SRC_DIR="$(cd ../src && pwd && cd ../pkg)" SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +SRC_DIR="${SCRIPTPATH}/../src" INSTALLERS_DIR="$SCRIPTPATH/installers" APP_DIR="${SCRIPTPATH}/${APP_NAME}.app" CONTENTS_DIR="${APP_DIR}/Contents" @@ -84,7 +84,7 @@ function prepare() { # Build the webpack bundle prior to building the webserver package, which embeds # the files. Don't do this for release builds because the assets are committed. if [ "${META}" != "release" ]; then - pushd ../../../webserver/site + pushd ${SCRIPTPATH}/../../../webserver/site go generate # just check, no write npm ci npm run build @@ -106,10 +106,11 @@ function build_targets() { # Potentially want to run with CGO_CXXFLAGS="-mmacosx-version-min=10.11.0" - pushd .. + pushd "${SCRIPTPATH}/.." GOOS=${OS} GOARCH=${ARCH} CGO_ENABLED=1 go build -v -trimpath -o "${APP_EXCE_DIR}/${APP_NAME}" -ldflags "${LDFLAGS_DEXC:-${LDFLAGS_BASE}}" popd + pushd "${SCRIPTPATH}" ./create-dmg.sh \ --volname "${VOLUME_NAME}" \ --volicon "${VOLUME_ICON_FILE}" \ @@ -122,15 +123,16 @@ function build_targets() { --app-drop-link 380 210 \ "${INSTALLERS_DIR}/${TARGET_NAME}.dmg" \ "${APP_DIR}" + popd done } -TARGETS="darwin/amd64 darwin/arm64" +TARGETS=${TARGETS:-"darwin/arm64"} prepare build_targets cleanup -pushd ./installers +pushd "${INSTALLERS_DIR}" shasum -a 256 *.dmg > dexc-v${VER}-manifest.txt popd diff --git a/client/cmd/bisonw-desktop/pkg/pkg-debian.sh b/client/cmd/bisonw-desktop/pkg/pkg-debian.sh index 260c8605ec..330c78789a 100755 --- a/client/cmd/bisonw-desktop/pkg/pkg-debian.sh +++ b/client/cmd/bisonw-desktop/pkg/pkg-debian.sh @@ -3,7 +3,8 @@ # A good getting-started guide for Debian packaging can be found at # https://www.internalpointers.com/post/build-binary-deb-package-practical-guide -set -ex +# turn this on for debugging, keep noise low for prod builds +# set -ex APP="bisonw" VER="1.0.3" @@ -11,14 +12,7 @@ META="release" REV="0" ARCH="amd64" -# DEB_NAME follows the prescribed format for debian packaging. -DEB_NAME="${APP}_${VER}-${REV}_${ARCH}" - -# The build directory will be deleted at the beginning of every build. The -# directory is .gitignore'd. -BUILD_DIR="./build" - -# A directory for binary source files e.g. image files. +# A directory containing metadata files SRC_DIR="./src" # The DEB_DIR represents the root directory in our target system. The directory @@ -35,17 +29,12 @@ CONTROL_DIR="${DEB_DIR}/DEBIAN" POSTINST_PATH="${CONTROL_DIR}/postinst" POSTRM_PATH="${CONTROL_DIR}/postrm" -# The bisonw binary. -BIN_TARGETDIR="/usr/lib/bisonw" +# The dexc binary. +BIN_TARGETDIR="/usr/bin" BIN_BUILDDIR="${DEB_DIR}${BIN_TARGETDIR}" BIN_FILENAME="${APP}" BIN_BUILDPATH="${BIN_BUILDDIR}/${BIN_FILENAME}" -ICON_FILENAME="bisonw.png" -SRC_TARGETDIR="${BIN_TARGETDIR}/src" -SRC_BUILDDIR="${DEB_DIR}${SRC_TARGETDIR}" -LIBICON_BUILDPATH="${SRC_BUILDDIR}/${ICON_FILENAME}" - # The Desktop Entry is a format for "installing" programs on Linux, creating # an entry in the main menu. # https://specifications.freedesktop.org/desktop-entry-spec/latest/ @@ -54,18 +43,17 @@ DOT_DESKTOP_BUILDDIR="${DEB_DIR}${DOT_DESKTOP_TARGETDIR}" DOT_DESKTOP_FILENAME="bisonw.desktop" DOT_DESKTOP_BUILDPATH="${DOT_DESKTOP_BUILDDIR}/${DOT_DESKTOP_FILENAME}" -# This will be the icon shown for the program in the taskbar. I know that both -# PNG and SVG will work. If it's a bitmap, should probably be >= 128 x 128 px. -ICON_TARGETDIR="/usr/share/pixmaps" -ICON_BUILDDIR="${DEB_DIR}${ICON_TARGETDIR}" -DESKTOPICON_BUILDPATH="${ICON_BUILDDIR}/${ICON_FILENAME}" - # Prepare the directory structure. rm -fr "${BUILD_DIR}" mkdir -p -m 0755 "${CONTROL_DIR}" -mkdir -p "${SRC_BUILDDIR}" # subdir of BIN_BUILDDIR mkdir -p "${DOT_DESKTOP_BUILDDIR}" -mkdir -p "${ICON_BUILDDIR}" + +# Build site bundle +CWD=$(pwd) +cd ../../webserver/site +npm clean-install +npm run build +cd $CWD # Build bisonw LDFLAGS="-s -w -X main.Version=${VER}${META:++${META}}" @@ -79,44 +67,42 @@ Package: bisonw Version: ${VER} Architecture: ${ARCH} Maintainer: Decred developers -Depends: libgtk-3-0, libwebkit2gtk-4.0-37 +Depends: libgtk-3-0, libwebkit2gtk-4.1-0 Description: A multi-wallet backed by Decred DEX EOF -# Symlink the binary and update the desktop icons, refresh the "start" menu. +# Copy icons +# This will be the icon shown for the program in the taskbar. I know that both +# PNG and SVG will work. If it's a bitmap, should probably be >= 128 x 128 px. +ICON_TARGETDIR="/usr/share/icons/hicolor" +ICON_BUILDDIR="${DEB_DIR}${ICON_TARGETDIR}" +install -Dm644 -t "${ICON_BUILDDIR}/scalable/apps" "${SRC_DIR}/bisonw.svg" +install -Dm644 -t "${ICON_BUILDDIR}/128x128/apps" "${SRC_DIR}/bisonw.png" + +# AppStream metadata +# https://wiki.debian.org/AppStream +install -Dm644 -t "${DEB_DIR}/usr/share/metainfo" "${SRC_DIR}/org.decred.dcrdex.metainfo.xml" + +# Update the desktop icons, refresh the "start" menu. cat > "${POSTINST_PATH}" < "${POSTRM_PATH}" < "${DOT_DESKTOP_BUILDPATH}" < "$SNAPCRAFT_YML" + diff --git a/client/cmd/bisonw-desktop/pkg/publish-snap.sh b/client/cmd/bisonw-desktop/pkg/publish-snap.sh new file mode 100755 index 0000000000..fec2f2bb10 --- /dev/null +++ b/client/cmd/bisonw-desktop/pkg/publish-snap.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +source $(dirname "$0")/common.sh + +snapcraft login + +snapcraft upload --release=stable $BUILD_DIR/${APP}_${VER}_${ARCH}.snap diff --git a/client/cmd/bisonw-desktop/snap/local/snapcraft.yaml.in b/client/cmd/bisonw-desktop/snap/local/snapcraft.yaml.in new file mode 100644 index 0000000000..61c3cb6824 --- /dev/null +++ b/client/cmd/bisonw-desktop/snap/local/snapcraft.yaml.in @@ -0,0 +1,103 @@ +name: bisonw +adopt-info: metainfo +version: '$VERSION' +license: BlueOak-1.0.0 + +base: core22 +grade: stable +confinement: strict + +architectures: + - build-on: amd64 +compression: lzo + +plugs: + dbus-svc: + bus: system + interface: dbus + name: org.freedesktop.portal + dbus-statusnotifier: + bus: session + interface: dbus + name: org.kde.StatusNotifierWatcher + dbus-dbusmenu: + bus: session + interface: dbus + name: com.canonical.dbusmenu + +apps: + bisonw: + common-id: org.decred.dcrdex + command: usr/bin/bisonw + desktop: usr/share/applications/bisonw.desktop + extensions: [gnome] + environment: + GTK_USE_PORTAL: "1" + + # required snap interfaces: + # https://snapcraft.io/docs/interface-management + plugs: + - home + - opengl + - x11 + - desktop + - desktop-legacy + - network + - network-status + - browser-support + - screen-inhibit-control + - dbus-svc + - dbus-dbusmenu + - dbus-statusnotifier + +parts: + metainfo: + plugin: nil + source: . + parse-info: [./src/org.decred.dcrdex.metainfo.xml] + + bisonw-desktop: + plugin: dump + source: ./build/$DEB_NAME.deb + source-type: deb + override-build: | + craftctl default + # Point icon to the correct location + sed -i -e 's|Icon=.*$|Icon=usr/share/icons/hicolor/scalable/apps/bisonw.svg|' $SNAPCRAFT_PART_INSTALL/usr/share/applications/bisonw.desktop + + # prune unused libs added by .deb dependencies from the .snap + prime: + - -usr/lib/x86_64-linux-gnu/libEGL_mesa* + - -usr/lib/x86_64-linux-gnu/libGLX_mesa* + - -usr/lib/x86_64-linux-gnu/libGLESv2* + - -usr/lib/x86_64-linux-gnu/libcaca++* + - -usr/lib/x86_64-linux-gnu/libcolordprivate* + - -usr/lib/x86_64-linux-gnu/libdconf* + - -usr/lib/x86_64-linux-gnu/libexslt* + - -usr/lib/x86_64-linux-gnu/libgstcheck-1.0* + - -usr/lib/x86_64-linux-gnu/libgstcontroller-1.0* + - -usr/lib/x86_64-linux-gnu/libicuio* + - -usr/lib/x86_64-linux-gnu/libicutest* + - -usr/lib/x86_64-linux-gnu/libjacknet* + - -usr/lib/x86_64-linux-gnu/libjackserver* + - -usr/lib/x86_64-linux-gnu/liborc-test-0.4* + - -usr/lib/x86_64-linux-gnu/libpulse-simple* + - -usr/lib/x86_64-linux-gnu/libunwind-coredump* + - -usr/lib/x86_64-linux-gnu/libunwind-ptrace* + - -usr/lib/x86_64-linux-gnu/libunwind-x86_64* + - -usr/lib/x86_64-linux-gnu/libwoff2enc* + - -usr/lib/x86_64-linux-gnu/libicutu* + - -usr/lib/x86_64-linux-gnu/libsamplerate* + - -usr/lib/x86_64-linux-gnu/libxcb-dri2* + - -usr/lib/x86_64-linux-gnu/libxcb-glx* + - -usr/lib/x86_64-linux-gnu/libxcb-present* + - -usr/lib/x86_64-linux-gnu/libxcb-randr* + - -usr/lib/x86_64-linux-gnu/libxcb-sync* + - -usr/lib/x86_64-linux-gnu/libxcb-xfixes* + - -usr/lib/x86_64-linux-gnu/libxshmfence* + + stage-packages: + - desktop-file-utils + - libwebkit2gtk-4.1-0 + - libgtk-3-0 + diff --git a/client/cmd/bisonw-desktop/src/bisonw.svg b/client/cmd/bisonw-desktop/src/bisonw.svg new file mode 100644 index 0000000000..f6bb97f7c9 --- /dev/null +++ b/client/cmd/bisonw-desktop/src/bisonw.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/cmd/bisonw-desktop/src/org.decred.dcrdex.desktop b/client/cmd/bisonw-desktop/src/org.decred.dcrdex.desktop new file mode 100644 index 0000000000..3460b5a647 --- /dev/null +++ b/client/cmd/bisonw-desktop/src/org.decred.dcrdex.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=Bison Wallet +Comment=Multi-wallet backed by Decred DEX +Categories=Office;Finance; +Icon=org.decred.dcrdex +Exec=dexc +Terminal=false +StartupWMClass=BisonWallet diff --git a/client/cmd/bisonw-desktop/src/org.decred.dcrdex.metainfo.xml b/client/cmd/bisonw-desktop/src/org.decred.dcrdex.metainfo.xml new file mode 100644 index 0000000000..0cfafde20d --- /dev/null +++ b/client/cmd/bisonw-desktop/src/org.decred.dcrdex.metainfo.xml @@ -0,0 +1,28 @@ + + + org.decred.dcrdex + org.decred.dcrdex.desktop + Decred DEX Client + Multi-wallet backed by Decred DEX + MIT + BlueOak-1.0.0 + https://dex.decred.org + https://chat.decred.org/#/room/#dex:decred.org + The Decred Developers + +

+ Self-custodial multi-wallet with built-in peer-to-peer exchange. +

+
+ + + https://raw.githubusercontent.com/decred/umbrel-app-store/master/decred-dcrdex/images/screenshot_1.png + + + https://raw.githubusercontent.com/decred/umbrel-app-store/master/decred-dcrdex/images/screenshot_2.png + + + https://raw.githubusercontent.com/decred/umbrel-app-store/master/decred-dcrdex/images/screenshot_3.png + + +
diff --git a/client/core/account.go b/client/core/account.go index ce7760385f..fc96efdccb 100644 --- a/client/core/account.go +++ b/client/core/account.go @@ -69,7 +69,7 @@ func (c *Core) ToggleAccountStatus(pw []byte, host string, disable bool) error { if disable { // Check active orders or bonds. if dc.hasActiveOrders() { - return fmt.Errorf("cannot disable account with active orders") + return errors.New("cannot disable account with active orders") } if dc.hasUnspentBond() { @@ -82,9 +82,13 @@ func (c *Core) ToggleAccountStatus(pw []byte, host string, disable bool) error { return newError(accountStatusUpdateErr, "error updating account status: %w", err) } + topic := TopicDEXEnabled + status := comms.Connected if disable { dc.acct.toggleAccountStatus(true) c.stopDEXConnection(dc) + topic = TopicDEXDisabled + status = comms.Disconnected } else { acctInfo, err := c.db.Account(host) if err != nil { @@ -92,11 +96,14 @@ func (c *Core) ToggleAccountStatus(pw []byte, host string, disable bool) error { } dc, connected := c.connectAccount(acctInfo) if !connected { - return fmt.Errorf("failed to connected re-enabled account: %w", err) + return errors.New("failed to connected re-enabled account") } c.initializeDEXConnection(dc, crypter) } + subject, details := c.formatDetails(topic, dc.acct.host) + dc.notify(newConnEventNote(topic, subject, dc.acct.host, status, details, db.Poke)) + return nil } diff --git a/client/core/bookie.go b/client/core/bookie.go index 397bbed935..120588031e 100644 --- a/client/core/bookie.go +++ b/client/core/bookie.go @@ -352,9 +352,7 @@ func (b *bookie) send(u *BookUpdate) { select { case feed.c <- u: default: - b.log.Warnf("bookie %p: Closing book update feed %d with no receiver. "+ - "The receiver should have closed the feed before going away.", b, fid) - go b.closeFeed(feed.id) // delete it and maybe start a delayed bookie close + b.log.Errorf("bookie %p: feed %d is blocking and book update was thrown away.", b, fid) } } } diff --git a/client/core/core.go b/client/core/core.go index 3ccde47fa9..ad588beaad 100644 --- a/client/core/core.go +++ b/client/core/core.go @@ -235,6 +235,9 @@ func (dc *dexConnection) bondAsset(assetID uint32) (*msgjson.BondAsset, uint64) assetSymb := dex.BipIDSymbol(assetID) dc.cfgMtx.RLock() defer dc.cfgMtx.RUnlock() + if dc.cfg == nil { + return nil, 0 + } bondExpiry := dc.cfg.BondExpiry bondAsset := dc.cfg.BondAssets[assetSymb] return bondAsset, bondExpiry // bondAsset may be nil @@ -2969,22 +2972,37 @@ func (c *Core) loadWallet(dbWallet *db.Wallet) (*xcWallet, error) { }() } + // Ensure default settings are always supplied to the wallet as they + // may not be saved yet. + walletDef, err := asset.WalletDef(assetID, dbWallet.Type) + if err != nil { + return nil, newError(assetSupportErr, "asset.WalletDef error: %w", err) + } + defaultValues := make(map[string]string, len(walletDef.ConfigOpts)) + for _, option := range walletDef.ConfigOpts { + defaultValues[strings.ToLower(option.Key)] = option.DefaultValue + } + settings := dbWallet.Settings + for k, v := range defaultValues { + if _, has := settings[k]; !has { + settings[k] = v + } + } + log := c.log.SubLogger(unbip(assetID)) var w asset.Wallet - var err error if token == nil { - walletCfg := &asset.WalletConfig{ Type: dbWallet.Type, - Settings: dbWallet.Settings, + Settings: settings, Emit: asset.NewWalletEmitter(c.notes, assetID, log), PeersChange: peersChange, DataDir: c.assetDataDirectory(assetID), } - walletCfg.Settings[asset.SpecialSettingActivelyUsed] = + settings[asset.SpecialSettingActivelyUsed] = strconv.FormatBool(c.assetHasActiveOrders(dbWallet.AssetID)) - defer delete(walletCfg.Settings, asset.SpecialSettingActivelyUsed) + defer delete(settings, asset.SpecialSettingActivelyUsed) w, err = asset.OpenWallet(assetID, walletCfg, log, c.net) } else { @@ -3001,7 +3019,7 @@ func (c *Core) loadWallet(dbWallet *db.Wallet) (*xcWallet, error) { w, err = tokenMaster.OpenTokenWallet(&asset.TokenConfig{ AssetID: assetID, - Settings: dbWallet.Settings, + Settings: settings, Emit: asset.NewWalletEmitter(c.notes, assetID, log), PeersChange: peersChange, }) @@ -4016,6 +4034,21 @@ func (c *Core) NewDepositAddress(assetID uint32) (string, error) { return addr, nil } +// AddressUsed checks whether an address for a NewAddresser has been used. +func (c *Core) AddressUsed(assetID uint32, addr string) (bool, error) { + w, exists := c.wallet(assetID) + if !exists { + return false, newError(missingWalletErr, "no wallet found for %s", unbip(assetID)) + } + + na, ok := w.Wallet.(asset.NewAddresser) + if !ok { + return false, errors.New("wallet is not a NewAddresser") + } + + return na.AddressUsed(addr) +} + // AutoWalletConfig attempts to load setting from a wallet package's // asset.WalletInfo.DefaultConfigPath. If settings are not found, an empty map // is returned. @@ -4628,7 +4661,6 @@ func (c *Core) Login(pw []byte) error { c.resolveActiveTrades(crypter) c.notify(newLoginNote("Connecting to DEX servers...")) c.initializeDEXConnections(crypter) - } return nil @@ -8328,6 +8360,7 @@ func (c *Core) handleReconnect(host string) { c.log.Errorf("handleReconnect: Unable to apply new configuration for DEX at %s: %v", host, err) return } + c.notify(newServerConfigUpdateNote(host)) type market struct { // for book re-subscribe name string diff --git a/client/core/core_test.go b/client/core/core_test.go index d470d38b54..f4d0296b6a 100644 --- a/client/core/core_test.go +++ b/client/core/core_test.go @@ -913,6 +913,10 @@ func (w *TXCWallet) NewAddress() (string, error) { return "", w.addrErr } +func (w *TXCWallet) AddressUsed(addr string) (bool, error) { + return false, nil +} + func (w *TXCWallet) Unlock(pw []byte) error { return w.unlockErr } diff --git a/client/core/locale_ntfn.go b/client/core/locale_ntfn.go index 69a7d98a56..c5a4d4b0de 100644 --- a/client/core/locale_ntfn.go +++ b/client/core/locale_ntfn.go @@ -355,6 +355,14 @@ var originLocale = map[Topic]*translation{ Notes: "args: [bond asset, dex host]", }, }, + TopicDEXDisabled: { + subject: intl.Translation{T: "DEX server status"}, + template: intl.Translation{T: "DEX server %s has been disabled.", Notes: "args: [host]"}, + }, + TopicDEXEnabled: { + subject: intl.Translation{T: "DEX server status"}, + template: intl.Translation{T: "DEX server %s has been enabled.", Notes: "args: [host]"}, + }, } var ptBR = map[Topic]*translation{ diff --git a/client/core/notification.go b/client/core/notification.go index f4d0f844fe..460dd8ed49 100644 --- a/client/core/notification.go +++ b/client/core/notification.go @@ -502,6 +502,8 @@ const ( TopicDEXConnected Topic = "DEXConnected" TopicDEXDisconnected Topic = "DEXDisconnected" TopicDexConnectivity Topic = "DEXConnectivity" + TopicDEXDisabled Topic = "DEXDisabled" + TopicDEXEnabled Topic = "DEXEnabled" ) func newConnEventNote(topic Topic, subject, host string, status comms.ConnectionStatus, details string, severity db.Severity) *ConnEventNote { @@ -686,6 +688,21 @@ func newUpgradeNote(topic Topic, subject, details string, severity db.Severity) } } +// ServerConfigUpdateNote is sent when a server's configuration is updated. +type ServerConfigUpdateNote struct { + db.Notification + Host string `json:"host"` +} + +const TopicServerConfigUpdate Topic = "ServerConfigUpdate" + +func newServerConfigUpdateNote(host string) *ServerConfigUpdateNote { + return &ServerConfigUpdateNote{ + Notification: db.NewNotification(NoteTypeServerNotify, TopicServerConfigUpdate, "", "", db.Data), + Host: host, + } +} + // WalletCreationNote is a notification regarding asynchronous wallet creation. type WalletCreationNote struct { db.Notification diff --git a/client/mm/config.go b/client/mm/config.go index f4a558f472..193a172533 100644 --- a/client/mm/config.go +++ b/client/mm/config.go @@ -4,6 +4,8 @@ import ( "encoding/json" "fmt" "strconv" + + "decred.org/dcrdex/dex/utils" ) // MarketMakingConfig is the overall configuration of the market maker. @@ -50,12 +52,26 @@ type AutoRebalanceConfig struct { MinQuoteTransfer uint64 `json:"minQuoteTransfer"` } +func (a *AutoRebalanceConfig) copy() *AutoRebalanceConfig { + return &AutoRebalanceConfig{ + MinBaseTransfer: a.MinBaseTransfer, + MinQuoteTransfer: a.MinQuoteTransfer, + } +} + // BotBalanceAllocation is the initial allocation of funds for a bot. type BotBalanceAllocation struct { DEX map[uint32]uint64 `json:"dex"` CEX map[uint32]uint64 `json:"cex"` } +func (b *BotBalanceAllocation) copy() *BotBalanceAllocation { + return &BotBalanceAllocation{ + DEX: utils.CopyMap(b.DEX), + CEX: utils.CopyMap(b.CEX), + } +} + // BotInventoryDiffs is the amount of funds to add or remove from a bot's // allocation. type BotInventoryDiffs struct { @@ -63,6 +79,13 @@ type BotInventoryDiffs struct { CEX map[uint32]int64 `json:"cex"` } +func (d *BotInventoryDiffs) copy() *BotInventoryDiffs { + return &BotInventoryDiffs{ + DEX: utils.CopyMap(d.DEX), + CEX: utils.CopyMap(d.CEX), + } +} + // balanceDiffsToAllocations converts a BotInventoryDiffs to a // BotBalanceAllocation by removing all negative diffs. func balanceDiffsToAllocation(diffs *BotInventoryDiffs) *BotBalanceAllocation { @@ -90,6 +113,18 @@ func balanceDiffsToAllocation(diffs *BotInventoryDiffs) *BotBalanceAllocation { // should be created and the event log db should be updated to support both // versions. +type rpcConfig struct { + Alloc *BotBalanceAllocation `json:"alloc"` + AutoRebalance *AutoRebalanceConfig `json:"autoRebalance"` +} + +func (r *rpcConfig) copy() *rpcConfig { + return &rpcConfig{ + Alloc: r.Alloc.copy(), + AutoRebalance: r.AutoRebalance.copy(), + } +} + // BotConfig is the configuration for a market making bot. // The balance fields are the initial amounts that will be reserved to use for // this bot. As the bot trades, the amounts reserved for it will be updated. @@ -109,10 +144,12 @@ type BotConfig struct { // RPCConfig can be used for file-based initial allocations and // auto-rebalance settings. - RPCConfig *struct { - Alloc *BotBalanceAllocation `json:"alloc"` - AutoRebalance *AutoRebalanceConfig `json:"autoRebalance"` - } `json:"rpcConfig"` + RPCConfig *rpcConfig `json:"rpcConfig"` + + // LotSize is the lot size of the market at the time this configuration + // was created. It is used to notify the user if the lot size changes + // when they are starting the bot. + LotSize uint64 `json:"lotSize"` // Only one of the following configs should be set BasicMMConfig *BasicMarketMakingConfig `json:"basicMarketMakingConfig,omitempty"` @@ -120,6 +157,64 @@ type BotConfig struct { ArbMarketMakerConfig *ArbMarketMakerConfig `json:"arbMarketMakingConfig,omitempty"` } +func (c *BotConfig) copy() *BotConfig { + b := *c + + b.BaseWalletOptions = utils.CopyMap(c.BaseWalletOptions) + b.QuoteWalletOptions = utils.CopyMap(c.QuoteWalletOptions) + + if c.UIConfig != nil { + b.UIConfig = make(json.RawMessage, len(c.UIConfig)) + copy(b.UIConfig, c.UIConfig) + } + if c.RPCConfig != nil { + b.RPCConfig = c.RPCConfig.copy() + } + if c.BasicMMConfig != nil { + b.BasicMMConfig = c.BasicMMConfig.copy() + } + if c.SimpleArbConfig != nil { + b.SimpleArbConfig = c.SimpleArbConfig.copy() + } + if c.ArbMarketMakerConfig != nil { + b.ArbMarketMakerConfig = c.ArbMarketMakerConfig.copy() + } + + return &b +} + +// updateLotSize modifies the bot's configuration based on an update to the +// market's lot size. +func (c *BotConfig) updateLotSize(oldLotSize, newLotSize uint64) { + if c.BasicMMConfig != nil { + c.BasicMMConfig.updateLotSize(oldLotSize, newLotSize) + } else if c.ArbMarketMakerConfig != nil { + c.ArbMarketMakerConfig.updateLotSize(oldLotSize, newLotSize) + } +} + +func (c *BotConfig) validate() error { + if c.BasicMMConfig != nil { + return c.BasicMMConfig.validate() + } else if c.SimpleArbConfig != nil { + return c.SimpleArbConfig.validate() + } else if c.ArbMarketMakerConfig != nil { + return c.ArbMarketMakerConfig.validate() + } + + return fmt.Errorf("no bot config set") +} + +func validateConfigUpdate(old, new *BotConfig) error { + if (old.BasicMMConfig == nil) != (new.BasicMMConfig == nil) || + (old.SimpleArbConfig == nil) != (new.SimpleArbConfig == nil) || + (old.ArbMarketMakerConfig == nil) != (new.ArbMarketMakerConfig == nil) { + return fmt.Errorf("cannot change bot type") + } + + return new.validate() +} + func (c *BotConfig) requiresPriceOracle() bool { return c.BasicMMConfig != nil } diff --git a/client/mm/event_log.go b/client/mm/event_log.go index c5fe29fba0..a27b32d24f 100644 --- a/client/mm/event_log.go +++ b/client/mm/event_log.go @@ -9,6 +9,7 @@ import ( "encoding/binary" "encoding/json" "fmt" + "time" "decred.org/dcrdex/client/asset" "decred.org/dcrdex/dex" @@ -105,7 +106,7 @@ type eventLogDB interface { // storeEvent stores/updates a market making event. storeEvent(startTime int64, mkt *MarketWithHost, e *MarketMakingEvent, fs *BalanceState) // endRun stores the time that a market making run was ended. - endRun(startTime int64, mkt *MarketWithHost, endTime int64) error + endRun(startTime int64, mkt *MarketWithHost) error // runs returns a list of runs in the database. If n == 0, all of the runs // will be returned. If refStartTime and refMkt are not nil, the runs // including and before the run with the start time and market will be @@ -321,6 +322,11 @@ func (db *boltEventLogDB) updateEvent(update *eventUpdate) { } } + err = storeEndTime(runBucket) + if err != nil { + return err + } + // Update the final state. bsJSON, err := json.Marshal(bs) if err != nil { @@ -448,7 +454,15 @@ func (db *boltEventLogDB) storeNewRun(startTime int64, mkt *MarketWithHost, cfg return err } - runBucket.Put(startTimeKey, encode.Uint64Bytes(uint64(startTime))) + err = runBucket.Put(startTimeKey, encode.Uint64Bytes(uint64(startTime))) + if err != nil { + return err + } + + err = storeEndTime(runBucket) + if err != nil { + return err + } if err := db.storeCfgUpdate(runBucket, cfg, startTime); err != nil { return err @@ -616,8 +630,13 @@ func (db *boltEventLogDB) runOverview(startTime int64, mkt *MarketWithHost) (*Ma }) } +// storeEndTime updates the end time of a run to the current time. +func storeEndTime(runBucket *bbolt.Bucket) error { + return runBucket.Put(endTimeKey, encode.Uint64Bytes(uint64(time.Now().Unix()))) +} + // endRun stores the time that a market making run was ended. -func (db *boltEventLogDB) endRun(startTime int64, mkt *MarketWithHost, endTime int64) error { +func (db *boltEventLogDB) endRun(startTime int64, mkt *MarketWithHost) error { return db.Update(func(tx *bbolt.Tx) error { botRuns := tx.Bucket(botRunsBucket) key := runKey(startTime, mkt) @@ -626,7 +645,7 @@ func (db *boltEventLogDB) endRun(startTime int64, mkt *MarketWithHost, endTime i return fmt.Errorf("nil run bucket for key %x", key) } - return runBucket.Put(endTimeKey, encode.Uint64Bytes(uint64(endTime))) + return storeEndTime(runBucket) }) } diff --git a/client/mm/event_log_test.go b/client/mm/event_log_test.go index 9db5ceb6e2..78f92bcb26 100644 --- a/client/mm/event_log_test.go +++ b/client/mm/event_log_test.go @@ -301,7 +301,7 @@ func TestEventLogDB(t *testing.T) { t.Fatalf("expected event:\n%v\n\ngot:\n%v", event2, runEvents[0]) } - err = db.endRun(startTime, mkt, startTime+1000) + err = db.endRun(startTime, mkt) if err != nil { t.Fatalf("error ending run: %v", err) } @@ -310,8 +310,8 @@ func TestEventLogDB(t *testing.T) { if err != nil { t.Fatalf("error getting run overview: %v", err) } - if *overview.EndTime != startTime+1000 { - t.Fatalf("expected end time %d, got %d", startTime+1000, overview.EndTime) + if *overview.EndTime < startTime || *overview.EndTime > time.Now().Unix() { + t.Fatalf("expected end time %d, got %d", startTime, overview.EndTime) } bs := currBalanceState() finalBals := map[uint32]uint64{ diff --git a/client/mm/exchange_adaptor.go b/client/mm/exchange_adaptor.go index d8cfc9da1f..fbc501463e 100644 --- a/client/mm/exchange_adaptor.go +++ b/client/mm/exchange_adaptor.go @@ -305,8 +305,8 @@ type pendingCEXOrder struct { type market struct { host string name string - rateStep uint64 - lotSize uint64 + rateStep atomic.Uint64 + lotSize atomic.Uint64 baseID uint32 baseTicker string bui dex.UnitInfo @@ -346,11 +346,10 @@ func parseMarket(host string, mkt *core.Market) (*market, error) { return nil, err } } - return &market{ + + m := &market{ host: host, name: mkt.Name, - rateStep: mkt.RateStep, - lotSize: mkt.LotSize, baseID: mkt.BaseID, baseTicker: bui.Conventional.Unit, bui: bui, @@ -361,7 +360,10 @@ func parseMarket(host string, mkt *core.Market) (*market, error) { qui: qui, quoteFeeID: quoteFeeID, quoteFeeUI: quoteFeeUI, - }, nil + } + m.lotSize.Store(mkt.LotSize) + m.rateStep.Store(mkt.RateStep) + return m, nil } func (m *market) fmtRate(msgRate uint64) string { @@ -410,6 +412,7 @@ type unifiedExchangeAdaptor struct { libxc.CEX ctx context.Context + kill context.CancelFunc wg sync.WaitGroup botID string log dex.Logger @@ -513,12 +516,14 @@ func (u *unifiedExchangeAdaptor) withPause(f func() error) error { defer u.paused.Store(false) u.botLoop.Disconnect() + if err := f(); err != nil { return err } if u.ctx.Err() != nil { // Make sure we weren't shut down during pause. return u.ctx.Err() } + return u.botLoop.ConnectOnce(u.ctx) } @@ -649,7 +654,7 @@ func (u *unifiedExchangeAdaptor) SufficientBalanceForDEXTrade(rate, qty uint64, } balances[fromAsset] -= fromQty - numLots := qty / u.lotSize + numLots := qty / u.lotSize.Load() if balances[fromFeeAsset] < numLots*fees.Swap { return false, nil } @@ -1163,6 +1168,7 @@ func (u *unifiedExchangeAdaptor) multiTrade( if sell { or.Fees = sellFees } + lotSize := u.lotSize.Load() fromID, fromFeeID, toID, toFeeID := orderAssets(u.baseID, u.quoteID, sell) fees, fundingFees := or.Fees.Max, or.Fees.Funding @@ -1211,7 +1217,7 @@ func (u *unifiedExchangeAdaptor) multiTrade( } mustCancel := !withinTolerance(order.Rate, placements[o.placementIndex].Rate, driftTolerance) - or.Placements[o.placementIndex].StandingLots += (order.Qty - order.Filled) / u.lotSize + or.Placements[o.placementIndex].StandingLots += (order.Qty - order.Filled) / lotSize if or.Placements[o.placementIndex].StandingLots > or.Placements[o.placementIndex].Lots { mustCancel = true } @@ -1232,7 +1238,7 @@ func (u *unifiedExchangeAdaptor) multiTrade( multiSplitBuffer := u.botCfg().multiSplitBuffer() fundingReq := func(rate, lots, counterTradeRate uint64) (dexReq map[uint32]uint64, cexReq uint64) { - qty := u.lotSize * lots + qty := lotSize * lots swapFees := fees.Swap * lots if !sell { qty = calc.BaseToQuote(rate, qty) @@ -1250,9 +1256,9 @@ func (u *unifiedExchangeAdaptor) multiTrade( } if accountForCEXBal { if sell { - cexReq = calc.BaseToQuote(counterTradeRate, u.lotSize*lots) + cexReq = calc.BaseToQuote(counterTradeRate, lotSize*lots) } else { - cexReq = u.lotSize * lots + cexReq = lotSize * lots } } return @@ -1322,7 +1328,7 @@ func (u *unifiedExchangeAdaptor) multiTrade( placementIndex: uint64(i), counterTradeRate: placement.CounterTradeRate, placement: &core.QtyRate{ - Qty: lotsToPlace * u.lotSize, + Qty: lotsToPlace * lotSize, Rate: placement.Rate, }, }) @@ -2454,7 +2460,12 @@ func (u *unifiedExchangeAdaptor) cancelAllOrders(ctx context.Context) { i := 0 for { select { - case ni := <-bookFeed.Next(): + case ni, ok := <-bookFeed.Next(): + if !ok { + u.log.Error("Stopping bot due to nil book feed.") + u.kill() + return + } switch epoch := ni.Payload.(type) { case *core.ResolvedEpoch: if u.tryCancelOrders(ctx, &epoch.Current, true) { @@ -2771,6 +2782,38 @@ func (u *unifiedExchangeAdaptor) handleDEXOrderUpdate(o *core.Order) { u.updateDEXOrderEvent(pendingOrder, complete) } +func (u *unifiedExchangeAdaptor) handleServerConfigUpdate() { + coreMkt, err := u.clientCore.ExchangeMarket(u.host, u.baseID, u.quoteID) + if err != nil { + u.log.Errorf("Stopping bot due to error getting market params: %v", err) + u.kill() + return + } + + if coreMkt.LotSize == u.lotSize.Load() && coreMkt.RateStep == u.rateStep.Load() { + return + } + + err = u.withPause(func() error { + if coreMkt.LotSize != u.lotSize.Load() { + cfg := u.botCfg() + copy := cfg.copy() + copy.updateLotSize(u.lotSize.Load(), coreMkt.LotSize) + err := u.updateConfig(copy) + if err != nil { + return err + } + u.lotSize.Store(coreMkt.LotSize) + } + u.rateStep.Store(coreMkt.RateStep) + return nil + }) + if err != nil { + u.log.Errorf("Error updating config due to server config update. stopping bot: %v", err) + u.kill() + } +} + func (u *unifiedExchangeAdaptor) handleDEXNotification(n core.Notification) { switch note := n.(type) { case *core.OrderNote: @@ -2798,6 +2841,11 @@ func (u *unifiedExchangeAdaptor) handleDEXNotification(n core.Notification) { } case *core.FiatRatesNote: u.fiatRates.Store(note.FiatRates) + case *core.ServerConfigUpdateNote: + if note.Host != u.host { + return + } + u.handleServerConfigUpdate() } } @@ -2818,16 +2866,17 @@ func (u *unifiedExchangeAdaptor) lotCosts(sellVWAP, buyVWAP uint64) (*lotCosts, if err != nil { return nil, fmt.Errorf("error getting order fees: %w", err) } - perLot.dexBase = u.lotSize + lotSize := u.lotSize.Load() + perLot.dexBase = lotSize if u.baseID == u.baseFeeID { perLot.dexBase += sellFees.BookingFeesPerLot } - perLot.cexBase = u.lotSize + perLot.cexBase = lotSize perLot.baseRedeem = buyFees.Max.Redeem perLot.baseFunding = sellFees.Funding - dexQuoteLot := calc.BaseToQuote(sellVWAP, u.lotSize) - cexQuoteLot := calc.BaseToQuote(buyVWAP, u.lotSize) + dexQuoteLot := calc.BaseToQuote(sellVWAP, lotSize) + cexQuoteLot := calc.BaseToQuote(buyVWAP, lotSize) perLot.dexQuote = dexQuoteLot if u.quoteID == u.quoteFeeID { perLot.dexQuote += buyFees.BookingFeesPerLot @@ -3192,6 +3241,7 @@ func (u *unifiedExchangeAdaptor) inventory(assetID uint32, dexLot, cexLot uint64 // specified number of lots. If the book is too empty for the specified number // of lots, a 1-lot estimate will be attempted too. func (u *unifiedExchangeAdaptor) cexCounterRates(cexBuyLots, cexSellLots uint64) (dexBuyRate, dexSellRate uint64, err error) { + lotSize := u.lotSize.Load() tryLots := func(b, s uint64) (uint64, uint64, bool, error) { if b == 0 { b = 1 @@ -3199,14 +3249,14 @@ func (u *unifiedExchangeAdaptor) cexCounterRates(cexBuyLots, cexSellLots uint64) if s == 0 { s = 1 } - buyRate, _, filled, err := u.CEX.VWAP(u.baseID, u.quoteID, true, u.lotSize*s) + buyRate, _, filled, err := u.CEX.VWAP(u.baseID, u.quoteID, true, lotSize*s) if err != nil { return 0, 0, false, fmt.Errorf("error calculating dex buy price for quote conversion: %w", err) } if !filled { return 0, 0, false, nil } - sellRate, _, filled, err := u.CEX.VWAP(u.baseID, u.quoteID, false, u.lotSize*b) + sellRate, _, filled, err := u.CEX.VWAP(u.baseID, u.quoteID, false, lotSize*b) if err != nil { return 0, 0, false, fmt.Errorf("error calculating dex sell price for quote conversion: %w", err) } @@ -3336,7 +3386,9 @@ func (u *unifiedExchangeAdaptor) updateFeeRates() (buyFees, sellFees *OrderFees, } func (u *unifiedExchangeAdaptor) Connect(ctx context.Context) (*sync.WaitGroup, error) { + ctx, u.kill = context.WithCancel(ctx) u.ctx = ctx + fiatRates := u.clientCore.FiatConversionRates() u.fiatRates.Store(fiatRates) @@ -3357,7 +3409,7 @@ func (u *unifiedExchangeAdaptor) Connect(ctx context.Context) (*sync.WaitGroup, go func() { defer u.wg.Done() <-ctx.Done() - u.eventLogDB.endRun(startTime, u.mwh, time.Now().Unix()) + u.eventLogDB.endRun(startTime, u.mwh) }() u.wg.Add(1) @@ -3476,7 +3528,6 @@ func newProfitLoss( mods map[uint32]int64, fiatRates map[uint32]float64, ) *ProfitLoss { - pl := &ProfitLoss{ Initial: make(map[uint32]*Amount, len(initialBalances)), Mods: make(map[uint32]*Amount, len(mods)), @@ -3610,9 +3661,14 @@ func (u *unifiedExchangeAdaptor) applyInventoryDiffs(balanceDiffs *BotInventoryD return mods } -func (u *unifiedExchangeAdaptor) updateConfig(cfg *BotConfig) { +func (u *unifiedExchangeAdaptor) updateConfig(cfg *BotConfig) error { + if err := validateConfigUpdate(u.botCfg(), cfg); err != nil { + return err + } + u.botCfgV.Store(cfg) u.updateConfigEvent(cfg) + return nil } func (u *unifiedExchangeAdaptor) updateInventory(balanceDiffs *BotInventoryDiffs) { diff --git a/client/mm/exchange_adaptor_test.go b/client/mm/exchange_adaptor_test.go index ca54d1108d..45b300794b 100644 --- a/client/mm/exchange_adaptor_test.go +++ b/client/mm/exchange_adaptor_test.go @@ -40,7 +40,7 @@ func newTEventLogDB() *tEventLogDB { func (db *tEventLogDB) storeNewRun(startTime int64, mkt *MarketWithHost, cfg *BotConfig, initialState *BalanceState) error { return nil } -func (db *tEventLogDB) endRun(startTime int64, mkt *MarketWithHost, endTime int64) error { return nil } +func (db *tEventLogDB) endRun(startTime int64, mkt *MarketWithHost) error { return nil } func (db *tEventLogDB) storeEvent(startTime int64, mkt *MarketWithHost, e *MarketMakingEvent, fs *BalanceState) { db.storedEventsMtx.Lock() defer db.storedEventsMtx.Unlock() @@ -507,7 +507,9 @@ func testDistribution(t *testing.T, baseID, quoteID uint32) { u.clientCore = tCore u.autoRebalanceCfg = &AutoRebalanceConfig{} a := &arbMarketMaker{unifiedExchangeAdaptor: u} - a.cfgV.Store(&ArbMarketMakerConfig{Profit: profit}) + u.botCfgV.Store(&BotConfig{ + ArbMarketMakerConfig: &ArbMarketMakerConfig{Profit: profit}, + }) fiatRates := map[uint32]float64{baseID: 1, quoteID: 1} u.fiatRates.Store(fiatRates) @@ -579,9 +581,16 @@ func testDistribution(t *testing.T, baseID, quoteID uint32) { setLots := func(b, s uint64) { buyLots, sellLots = b, s - a.placementLotsV.Store(&placementLots{ - baseLots: sellLots, - quoteLots: buyLots, + u.botCfgV.Store(&BotConfig{ + ArbMarketMakerConfig: &ArbMarketMakerConfig{ + Profit: profit, + BuyPlacements: []*ArbMarketMakingPlacement{ + {Lots: buyLots, Multiplier: 1}, + }, + SellPlacements: []*ArbMarketMakingPlacement{ + {Lots: sellLots, Multiplier: 1}, + }, + }, }) addBaseFees, addQuoteFees = sellFundingFees, buyFundingFees cex.asksVWAP[lotSize*buyLots] = vwapResult{avg: buyVWAP} diff --git a/client/mm/libxc/binance.go b/client/mm/libxc/binance.go index 5a64e3b4ae..a0dc2f8680 100644 --- a/client/mm/libxc/binance.go +++ b/client/mm/libxc/binance.go @@ -338,52 +338,103 @@ func (b *binanceOrderBook) midGap() uint64 { return b.book.midGap() } -// TODO: check all symbols -var dexToBinanceSymbol = map[string]string{ - "polygon": "MATIC", +// dexToBinanceCoinSymbol maps DEX asset symbols to Binance coin symbols +// Only include mappings that are NOT simple case conversions +var dexToBinanceCoinSymbol = map[string]string{ + "polygon": "POL", "weth": "ETH", } +// binanceToDexCoinSymbol maps Binance coin symbols to DEX coin symbols. +// These override the reverse mappings from dexToBinanceCoinSymbol. +var binanceToDexCoinSymbol = map[string]string{ + "ETH": "eth", +} + +// dexToBinanceNetworkSymbol maps DEX network symbols to Binance network symbols +var dexToBinanceNetworkSymbol = map[string]string{ + "polygon": "MATIC", +} + +// dexCoinToWrappedSymbol maps DEX coin symbols to their wrapped version when +// on different networks +var dexCoinToWrappedSymbol = map[string]string{ + "eth": "weth", +} + +// binanceToDexSymbol is the complete mapping from Binance symbols to DEX symbols +// Built in init() from all the other mappings var binanceToDexSymbol = make(map[string]string) // convertBnCoin converts a binance coin symbol to a dex symbol. func convertBnCoin(coin string) string { - symbol := strings.ToLower(coin) if convertedSymbol, found := binanceToDexSymbol[strings.ToUpper(coin)]; found { - symbol = convertedSymbol + return convertedSymbol } - if symbol == "weth" { - return "eth" + return strings.ToLower(coin) +} + +// convertBnNetwork converts a binance network symbol to a dex symbol. +func convertBnNetwork(network string) string { + for key, value := range dexToBinanceNetworkSymbol { + if value == strings.ToUpper(network) { + return key + } } - return symbol + return convertBnCoin(network) } // binanceCoinNetworkToDexSymbol takes the coin name and its network name as // returned by the binance API and returns the DEX symbol. func binanceCoinNetworkToDexSymbol(coin, network string) string { - symbol, netSymbol := convertBnCoin(coin), convertBnCoin(network) + symbol, netSymbol := convertBnCoin(coin), convertBnNetwork(network) if symbol == netSymbol { return symbol } - if symbol == "eth" { - symbol = "weth" + // Convert coin to wrapped version if it has a wrapped equivalent + // Only apply to the coin symbol, not the network symbol + if wrappedSymbol, found := dexCoinToWrappedSymbol[symbol]; found { + symbol = wrappedSymbol } return symbol + "." + netSymbol } -func init() { - for key, value := range dexToBinanceSymbol { - binanceToDexSymbol[value] = key +func mapDexSymbolToBinanceCoin(symbol string) string { + if binanceSymbol, found := dexToBinanceCoinSymbol[strings.ToLower(symbol)]; found { + return binanceSymbol } + return strings.ToUpper(symbol) } -func mapDexToBinanceSymbol(symbol string) string { - if binanceSymbol, found := dexToBinanceSymbol[strings.ToLower(symbol)]; found { +func mapDexSymbolToBinanceNetwork(symbol string) string { + if binanceSymbol, found := dexToBinanceNetworkSymbol[strings.ToLower(symbol)]; found { return binanceSymbol } return strings.ToUpper(symbol) } +func init() { + // Build the binanceToDexSymbol map for coin symbols only + // Network symbols are handled separately by convertBnNetwork. + // This is to avoid network symbols affecting coin symbol conversions. + // The specific reason for this is that the MATIC coin ticker was changed + // to POL, but the network symbol for Polygon POS is still MATIC. However, + // MATIC is still returned with a balance of 0 in the balances response. + + // Direct Binance -> DEX coin symbol mappings (highest priority) + for key, value := range binanceToDexCoinSymbol { + binanceToDexSymbol[key] = value + } + + // From coin symbol mappings (DEX -> Binance, reverse to Binance -> DEX) + for key, value := range dexToBinanceCoinSymbol { + // Only add if not already present (lower priority) + if _, exists := binanceToDexSymbol[value]; !exists { + binanceToDexSymbol[value] = key + } + } +} + type bncAssetConfig struct { assetID uint32 // symbol is the DEX asset symbol, always lower case @@ -411,10 +462,13 @@ func bncAssetCfg(assetID uint32) (*bncAssetConfig, error) { } parts := strings.Split(symbol, ".") - coin := mapDexToBinanceSymbol(parts[0]) - chain := coin + coin := mapDexSymbolToBinanceCoin(parts[0]) + + var chain string if len(parts) > 1 { - chain = mapDexToBinanceSymbol(parts[1]) + chain = mapDexSymbolToBinanceNetwork(parts[1]) + } else { + chain = mapDexSymbolToBinanceNetwork(parts[0]) } return &bncAssetConfig{ diff --git a/client/mm/libxc/binance_test.go b/client/mm/libxc/binance_test.go index 20e523646e..70b6bad669 100644 --- a/client/mm/libxc/binance_test.go +++ b/client/mm/libxc/binance_test.go @@ -33,13 +33,13 @@ func TestSubscribeTradeUpdates(t *testing.T) { func TestBinanceToDexSymbol(t *testing.T) { tests := map[[2]string]string{ - {"ETH", "ETH"}: "eth", - {"ETH", "MATIC"}: "weth.polygon", - {"MATIC", "MATIC"}: "polygon", - {"USDC", "ETH"}: "usdc.eth", - {"USDC", "MATIC"}: "usdc.polygon", - {"BTC", "BTC"}: "btc", - {"WBTC", "ETH"}: "wbtc.eth", + {"ETH", "ETH"}: "eth", + {"ETH", "MATIC"}: "weth.polygon", + {"USDC", "ETH"}: "usdc.eth", + {"USDC", "MATIC"}: "usdc.polygon", + {"BTC", "BTC"}: "btc", + {"WBTC", "ETH"}: "wbtc.eth", + {"POL", "MATIC"}: "polygon", } for test, expected := range tests { @@ -108,6 +108,13 @@ func TestBncAssetCfg(t *testing.T) { chain: "MATIC", conversionFactor: 1e9, }, + 966: { + assetID: 966, + symbol: "polygon", + coin: "POL", + chain: "MATIC", + conversionFactor: 1e9, + }, } for test, expected := range tests { diff --git a/client/mm/libxc/orderbook.go b/client/mm/libxc/orderbook.go index 7da5d3bb37..990e1c7a06 100644 --- a/client/mm/libxc/orderbook.go +++ b/client/mm/libxc/orderbook.go @@ -5,6 +5,7 @@ package libxc import ( "fmt" "math" + "math/big" "sync" "github.com/huandu/skiplist" @@ -106,6 +107,7 @@ func (ob *orderbook) update(bids []*obEntry, asks []*obEntry) { } } +// clear clears the orderbook. func (ob *orderbook) clear() { ob.mtx.Lock() defer ob.mtx.Unlock() @@ -114,8 +116,8 @@ func (ob *orderbook) clear() { ob.asks = *skiplist.New(asksComparable) } -func (ob *orderbook) vwap(bids bool, qty uint64) (vwap, extrema uint64, filled bool) { - if qty == 0 { // avoid division by zero +func (ob *orderbook) vwap(bids bool, baseQty uint64) (vwap, extrema uint64, filled bool) { + if baseQty == 0 { // avoid division by zero return 0, 0, false } @@ -129,27 +131,32 @@ func (ob *orderbook) vwap(bids bool, qty uint64) (vwap, extrema uint64, filled b list = &ob.asks } - remaining := qty - var weightedSum uint64 + weightedTotal := big.NewInt(0) + bigQty := big.NewInt(0) + bigRate := big.NewInt(0) + addToWeightedTotal := func(rate uint64, qty uint64) { + bigRate.SetUint64(rate) + bigQty.SetUint64(qty) + weightedTotal.Add(weightedTotal, bigRate.Mul(bigRate, bigQty)) + } + + remaining := baseQty for curr := list.Front(); curr != nil; curr = curr.Next() { - if curr == nil { - break - } entry := curr.Value.(*obEntry) - extrema = entry.rate if entry.qty >= remaining { filled = true - weightedSum += remaining * extrema + extrema = entry.rate + addToWeightedTotal(entry.rate, remaining) break } remaining -= entry.qty - weightedSum += entry.qty * extrema + addToWeightedTotal(entry.rate, entry.qty) } if !filled { return 0, 0, false } - return weightedSum / qty, extrema, filled + return weightedTotal.Div(weightedTotal, big.NewInt(int64(baseQty))).Uint64(), extrema, filled } func (ob *orderbook) midGap() uint64 { diff --git a/client/mm/libxc/orderbook_test.go b/client/mm/libxc/orderbook_test.go index 41499ab0bb..f0561224ed 100644 --- a/client/mm/libxc/orderbook_test.go +++ b/client/mm/libxc/orderbook_test.go @@ -3,7 +3,11 @@ package libxc -import "testing" +import ( + "reflect" + "sort" + "testing" +) func TestOrderbook(t *testing.T) { ob := newOrderBook() @@ -18,84 +22,127 @@ func TestOrderbook(t *testing.T) { t.Fatalf("empty book should not be filled") } + sortedEntries := func(bids bool, entries []*obEntry) []*obEntry { + sorted := make([]*obEntry, len(entries)) + copy(sorted, entries) + sort.Slice(sorted, func(i, j int) bool { + if bids { + return sorted[i].rate > sorted[j].rate + } + return sorted[i].rate < sorted[j].rate + }) + return sorted + } + // Populate the book with some bids and asks. They both // have the same values, but VWAP for asks should be - // calculate from the lower values first. - ob.update([]*obEntry{ - {qty: 30, rate: 4000}, - {qty: 30, rate: 5000}, - {qty: 80, rate: 400}, - {qty: 10, rate: 3000}, - }, []*obEntry{ - {qty: 30, rate: 4000}, - {qty: 30, rate: 5000}, - {qty: 80, rate: 400}, - {qty: 10, rate: 3000}, - }) - vwap, extrema, filled := ob.vwap(true, 65) - if !filled { - t.Fatalf("should be filled") - } - expectedVWAP := uint64((30*5000 + 30*4000 + 5*3000) / 65) - if vwap != expectedVWAP { - t.Fatalf("wrong vwap. expected %d got %d", expectedVWAP, vwap) - } - if extrema != 3000 { - t.Fatalf("wrong extrema") - } + // calculated from the lower values first. + bids := []*obEntry{ + {qty: 30e8, rate: 4000}, + {qty: 30e8, rate: 5000}, + {qty: 80e8, rate: 400}, + {qty: 10e8, rate: 3000}, + } + asks := []*obEntry{ + {qty: 30e8, rate: 4000}, + {qty: 30e8, rate: 5000}, + {qty: 80e8, rate: 400}, + {qty: 10e8, rate: 3000}, + } + ob.update(bids, asks) - vwap, extrema, filled = ob.vwap(false, 65) - if !filled { - t.Fatalf("should be filled") + sortedBids := sortedEntries(true, bids) + sortedAsks := sortedEntries(false, asks) + snapBids, snapAsks := ob.snap() + if !reflect.DeepEqual(snapBids, sortedBids) { + t.Fatalf("wrong snap bids. expected %v got %v", sortedBids, snapBids) } - expectedVWAP = uint64(400) - if vwap != expectedVWAP { - t.Fatalf("wrong vwap. expected %d got %d", expectedVWAP, vwap) - } - if extrema != 400 { - t.Fatalf("wrong extrema") + if !reflect.DeepEqual(snapAsks, sortedAsks) { + t.Fatalf("wrong snap asks. expected %v got %v", sortedAsks, snapAsks) } - // Tests querying more quantity than on books - _, _, filled = ob.vwap(true, 161) - if filled { - t.Fatalf("should not be filled") - } - _, _, filled = ob.vwap(false, 161) - if filled { - t.Fatalf("should not be filled") + type vwapFn func(bids bool, qty uint64) (vwap, extrema uint64, filled bool) + checkVWAPFn := func(fn vwapFn, bids bool, qty uint64, expVWAP, expExtrema uint64, expFilled bool) { + t.Helper() + vwap, extrema, filled := fn(bids, qty) + if filled != expFilled { + t.Fatalf("wrong filled. expected %v got %v", expFilled, filled) + } + if vwap != expVWAP { + t.Fatalf("wrong vwap. expected %d got %d", expVWAP, vwap) + } + if extrema != expExtrema { + t.Fatalf("wrong extrema. expected %d got %d", expExtrema, extrema) + } + } + checkVWAP := func(bids bool, qty uint64, expVWAP, expExtrema uint64, expFilled bool) { + t.Helper() + checkVWAPFn(ob.vwap, bids, qty, expVWAP, expExtrema, expFilled) } + // Test vwap for bids and asks + expVWAP := (sortedBids[0].rate*30e8 + sortedBids[1].rate*30e8 + sortedBids[2].rate*5e8) / 65e8 + checkVWAP(true, 65e8, expVWAP, 3000, true) + checkVWAP(false, 65e8, 400, 400, true) + + // Test vwap for qty > total qty + checkVWAP(true, 161e8, 0, 0, false) + checkVWAP(false, 161e8, 0, 0, false) + // Update quantities. Setting qty to 0 should delete. - ob.update([]*obEntry{ + bids = []*obEntry{ {qty: 0, rate: 5000}, - {qty: 50, rate: 4000}, - }, []*obEntry{ + {qty: 50e8, rate: 4000}, + } + asks = []*obEntry{ {qty: 0, rate: 400}, - {qty: 35, rate: 4000}, - }) + {qty: 35e8, rate: 4000}, + } + ob.update(bids, asks) - vwap, extrema, filled = ob.vwap(true, 65) - if !filled { - t.Fatalf("should be filled") + // Make sure snap returns the correct entries + expSnapBids := []*obEntry{ + {qty: 50e8, rate: 4000}, + {qty: 10e8, rate: 3000}, + {qty: 80e8, rate: 400}, } - expectedVWAP = uint64((50*4000 + 10*3000 + 5*400) / 65) - if vwap != expectedVWAP { - t.Fatalf("wrong vwap. expected %d got %d", expectedVWAP, vwap) + expSnapAsks := []*obEntry{ + {qty: 10e8, rate: 3000}, + {qty: 35e8, rate: 4000}, + {qty: 30e8, rate: 5000}, } - if extrema != 400 { - t.Fatalf("wrong extrema") + snapBids, snapAsks = ob.snap() + if !reflect.DeepEqual(snapBids, expSnapBids) { + t.Fatalf("wrong snap bids. expected %v got %v", expSnapBids, snapBids) + } + if !reflect.DeepEqual(snapAsks, expSnapAsks) { + t.Fatalf("wrong snap asks. expected %v got %v", expSnapAsks, snapAsks) } - vwap, extrema, filled = ob.vwap(false, 65) + // Test vwap with updated quantities + expVWAP = (50e8*uint64(4000) + 10e8*uint64(3000) + 5e8*uint64(400)) / 65e8 + checkVWAP(true, 65e8, expVWAP, 400, true) + expVWAP = (10e8*uint64(3000) + 35e8*uint64(4000) + 20e8*uint64(5000)) / 65e8 + checkVWAP(false, 65e8, expVWAP, 5000, true) +} + +// Test vwap with values that would overflow uint64. +func TestVWAPOverflow(t *testing.T) { + bids := []*obEntry{ + {qty: 1e15, rate: 12e9}, + {qty: 1e15, rate: 10e9}, + } + ob := newOrderBook() + ob.update(bids, nil) + + vwap, extrema, filled := ob.vwap(true, 2e15) if !filled { t.Fatalf("should be filled") } - expectedVWAP = uint64((20*5000 + 35*4000 + 10*3000) / 65) - if vwap != expectedVWAP { - t.Fatalf("wrong vwap. expected %d got %d", expectedVWAP, vwap) + if vwap != uint64(11e9) { + t.Fatalf("wrong vwap. expected %d got %d", uint64(11e9), vwap) } - if extrema != 5000 { + if extrema != uint64(10e9) { t.Fatalf("wrong extrema") } } diff --git a/client/mm/mm.go b/client/mm/mm.go index 308b2983ce..d10a3b54a9 100644 --- a/client/mm/mm.go +++ b/client/mm/mm.go @@ -790,7 +790,7 @@ type StartConfig struct { } // StartBot starts a market making bot. -func (m *MarketMaker) StartBot(startCfg *StartConfig, alternateConfigPath *string, appPW []byte) (err error) { +func (m *MarketMaker) StartBot(startCfg *StartConfig, alternateConfigPath *string, appPW []byte, overrideLotSizeChange bool) (err error) { mkt := startCfg.MarketWithHost m.startUpdateMtx.Lock() @@ -827,6 +827,31 @@ func (m *MarketMaker) StartBot(startCfg *StartConfig, alternateConfigPath *strin startCfg.AutoRebalance = botCfg.RPCConfig.AutoRebalance } + // Lot size may be zero if started from RPC. If the lot size in the config + // is set, then we check if the lot size has changed since the configuration + // was saved. If so, and overrideLotSizeChange is false, we return an error. + // If overrideLotSizeChange is true, we update the lot size in the config. + if botCfg.LotSize > 0 { + mktInfo, err := m.core.ExchangeMarket(mkt.Host, mkt.BaseID, mkt.QuoteID) + if err != nil { + return fmt.Errorf("error getting market info for %s: %w", mkt, err) + } + + if botCfg.LotSize != mktInfo.LotSize { + if overrideLotSizeChange { + botCfg.LotSize = mktInfo.LotSize + m.updateDefaultBotConfig(botCfg) + } else { + return fmt.Errorf("lot size changed since configuration") + } + } + + if !overrideLotSizeChange && botCfg.LotSize != mktInfo.LotSize { + return fmt.Errorf("lot size for %s has changed: %d -> %d", mkt, botCfg.LotSize, mktInfo.LotSize) + } + botCfg.LotSize = mktInfo.LotSize + } + return m.startBot(startCfg, botCfg, cexCfg, appPW) } @@ -990,6 +1015,12 @@ func (m *MarketMaker) UpdateBotConfig(updatedCfg *BotConfig) error { return fmt.Errorf("call UpdateRunningBotCfg to update the config of a running bot") } + mkt, err := m.core.ExchangeMarket(updatedCfg.Host, updatedCfg.BaseID, updatedCfg.QuoteID) + if err != nil { + return fmt.Errorf("error getting market: %w", err) + } + updatedCfg.LotSize = mkt.LotSize + m.updateDefaultBotConfig(updatedCfg) return nil } diff --git a/client/mm/mm_arb_market_maker.go b/client/mm/mm_arb_market_maker.go index 174ad291f7..0c6ff7be71 100644 --- a/client/mm/mm_arb_market_maker.go +++ b/client/mm/mm_arb_market_maker.go @@ -17,6 +17,7 @@ import ( "decred.org/dcrdex/dex" "decred.org/dcrdex/dex/calc" "decred.org/dcrdex/dex/order" + "decred.org/dcrdex/dex/utils" ) // ArbMarketMakingPlacement is the configuration for an order placement @@ -82,6 +83,80 @@ type ArbMarketMakerConfig struct { NumEpochsLeaveOpen uint64 `json:"orderPersistence"` } +func (a *ArbMarketMakerConfig) copy() *ArbMarketMakerConfig { + c := *a + + copyArbMarketMakingPlacement := func(p *ArbMarketMakingPlacement) *ArbMarketMakingPlacement { + return &ArbMarketMakingPlacement{ + Lots: p.Lots, + Multiplier: p.Multiplier, + } + } + c.BuyPlacements = utils.Map(a.BuyPlacements, copyArbMarketMakingPlacement) + c.SellPlacements = utils.Map(a.SellPlacements, copyArbMarketMakingPlacement) + + return &c +} + +func (a *ArbMarketMakerConfig) validate() error { + if len(a.BuyPlacements) == 0 && len(a.SellPlacements) == 0 { + return fmt.Errorf("no placements") + } + + if a.Profit <= 0 { + return fmt.Errorf("profit must be greater than 0") + } + + if a.DriftTolerance < 0 || a.DriftTolerance > 0.01 { + return fmt.Errorf("drift tolerance %f out of bounds", a.DriftTolerance) + } + + if a.NumEpochsLeaveOpen < 2 { + return fmt.Errorf("arbs must be left open for at least 2 epochs") + } + + return nil +} + +// updateLotSize modifies the number of lots in each placement in the event +// of a lot size change. It will place as many lots as possible without +// exceeding the total quantity placed using the original lot size. +// +// This function is NOT thread safe. +func (c *ArbMarketMakerConfig) updateLotSize(originalLotSize, newLotSize uint64) { + b2a := func(p *OrderPlacement) *ArbMarketMakingPlacement { + return &ArbMarketMakingPlacement{ + Lots: p.Lots, + Multiplier: p.GapFactor, + } + } + a2b := func(p *ArbMarketMakingPlacement) *OrderPlacement { + return &OrderPlacement{ + Lots: p.Lots, + GapFactor: p.Multiplier, + } + } + update := func(placements []*ArbMarketMakingPlacement) []*ArbMarketMakingPlacement { + return utils.Map(updateLotSize(utils.Map(placements, a2b), originalLotSize, newLotSize), b2a) + } + c.SellPlacements = update(c.SellPlacements) + c.BuyPlacements = update(c.BuyPlacements) +} + +func (a *ArbMarketMakerConfig) placementLots() *placementLots { + var baseLots, quoteLots uint64 + for _, p := range a.BuyPlacements { + quoteLots += p.Lots + } + for _, p := range a.SellPlacements { + baseLots += p.Lots + } + return &placementLots{ + baseLots: baseLots, + quoteLots: quoteLots, + } +} + type placementLots struct { baseLots uint64 quoteLots uint64 @@ -91,8 +166,6 @@ type arbMarketMaker struct { *unifiedExchangeAdaptor cex botCexAdaptor core botCoreAdaptor - cfgV atomic.Value // *ArbMarketMakerConfig - placementLotsV atomic.Value // *placementLots book dexOrderBook rebalanceRunning atomic.Bool currEpoch atomic.Uint64 @@ -108,7 +181,7 @@ type arbMarketMaker struct { var _ bot = (*arbMarketMaker)(nil) func (a *arbMarketMaker) cfg() *ArbMarketMakerConfig { - return a.cfgV.Load().(*ArbMarketMakerConfig) + return a.botCfg().ArbMarketMakerConfig } func (a *arbMarketMaker) handleCEXTradeUpdate(update *libxc.Trade) { @@ -201,7 +274,8 @@ func dexPlacementRate(cexRate uint64, sell bool, profitRate float64, mkt *market unadjustedRate = uint64(math.Round(float64(cexRate) / (1 + profitRate))) } - rateAdj := rateAdjustment(feesInQuoteUnits, mkt.lotSize) + lotSize, rateStep := mkt.lotSize.Load(), mkt.rateStep.Load() + rateAdj := rateAdjustment(feesInQuoteUnits, lotSize) if log.Level() <= dex.LevelTrace { log.Tracef("%s %s placement rate: cexRate = %s, profitRate = %.3f, unadjustedRate = %s, rateAdj = %s, fees = %s", @@ -210,14 +284,14 @@ func dexPlacementRate(cexRate uint64, sell bool, profitRate float64, mkt *market } if sell { - return steppedRate(unadjustedRate+rateAdj, mkt.rateStep), nil + return steppedRate(unadjustedRate+rateAdj, rateStep), nil } if rateAdj > unadjustedRate { return 0, fmt.Errorf("rate adjustment required for fees %d > rate %d", rateAdj, unadjustedRate) } - return steppedRate(unadjustedRate-rateAdj, mkt.rateStep), nil + return steppedRate(unadjustedRate-rateAdj, rateStep), nil } func rateAdjustment(feesInQuoteUnits, lotSize uint64) uint64 { @@ -246,7 +320,7 @@ func (a *arbMarketMaker) ordersToPlace() (buys, sells []*TradePlacement, err err newPlacements := make([]*TradePlacement, 0, len(cfgPlacements)) var cumulativeCEXDepth uint64 for i, cfgPlacement := range cfgPlacements { - cumulativeCEXDepth += uint64(float64(cfgPlacement.Lots*a.lotSize) * cfgPlacement.Multiplier) + cumulativeCEXDepth += uint64(float64(cfgPlacement.Lots*a.lotSize.Load()) * cfgPlacement.Multiplier) _, extrema, filled, err := a.CEX.VWAP(a.baseID, a.quoteID, sellOnDEX, cumulativeCEXDepth) if err != nil { return nil, fmt.Errorf("error getting CEX VWAP: %w", err) @@ -291,11 +365,7 @@ func (a *arbMarketMaker) ordersToPlace() (buys, sells []*TradePlacement, err err // distribution parses the current inventory distribution and checks if better // distributions are possible via deposit or withdrawal. func (a *arbMarketMaker) distribution() (dist *distribution, err error) { - cfgI := a.placementLotsV.Load() - if cfgI == nil { - return nil, errors.New("no placements?") - } - placements := cfgI.(*placementLots) + placements := a.cfg().placementLots() if placements.baseLots == 0 && placements.quoteLots == 0 { return nil, errors.New("zero placement lots?") } @@ -429,7 +499,7 @@ func feeGap(core botCoreAdaptor, cex libxc.CEX, baseID, quoteID uint32, lotSize } func (a *arbMarketMaker) registerFeeGap() { - feeGap, err := feeGap(a.core, a.CEX, a.baseID, a.quoteID, a.lotSize) + feeGap, err := feeGap(a.core, a.CEX, a.baseID, a.quoteID, a.lotSize.Load()) if err != nil { a.log.Warnf("error getting fee-gap stats: %v", err) return @@ -459,7 +529,12 @@ func (a *arbMarketMaker) botLoop(ctx context.Context) (*sync.WaitGroup, error) { defer bookFeed.Close() for { select { - case ni := <-bookFeed.Next(): + case ni, ok := <-bookFeed.Next(): + if !ok { + a.log.Error("Stopping bot due to nil book feed.") + a.kill() + return + } switch epoch := ni.Payload.(type) { case *core.ResolvedEpoch: a.rebalance(epoch.Current, book) @@ -508,31 +583,6 @@ func (a *arbMarketMaker) botLoop(ctx context.Context) (*sync.WaitGroup, error) { return &wg, nil } -func (a *arbMarketMaker) setTransferConfig(cfg *ArbMarketMakerConfig) { - var baseLots, quoteLots uint64 - for _, p := range cfg.BuyPlacements { - quoteLots += p.Lots - } - for _, p := range cfg.SellPlacements { - baseLots += p.Lots - } - a.placementLotsV.Store(&placementLots{ - baseLots: baseLots, - quoteLots: quoteLots, - }) -} - -func (a *arbMarketMaker) updateConfig(cfg *BotConfig) error { - if cfg.ArbMarketMakerConfig == nil { - return errors.New("no arb market maker config provided") - } - - a.cfgV.Store(cfg.ArbMarketMakerConfig) - a.setTransferConfig(cfg.ArbMarketMakerConfig) - a.unifiedExchangeAdaptor.updateConfig(cfg) - return nil -} - func newArbMarketMaker(cfg *BotConfig, adaptorCfg *exchangeAdaptorCfg, log dex.Logger) (*arbMarketMaker, error) { if cfg.ArbMarketMakerConfig == nil { // implies bug in caller @@ -554,8 +604,5 @@ func newArbMarketMaker(cfg *BotConfig, adaptorCfg *exchangeAdaptorCfg, log dex.L } adaptor.setBotLoop(arbMM.botLoop) - - arbMM.cfgV.Store(cfg.ArbMarketMakerConfig) - arbMM.setTransferConfig(cfg.ArbMarketMakerConfig) return arbMM, nil } diff --git a/client/mm/mm_arb_market_maker_test.go b/client/mm/mm_arb_market_maker_test.go index dbf232739c..177a72bd56 100644 --- a/client/mm/mm_arb_market_maker_test.go +++ b/client/mm/mm_arb_market_maker_test.go @@ -75,22 +75,14 @@ func TestArbMMRebalance(t *testing.T) { var buyLots, sellLots, minDexBase, minCexBase /* totalBase, */, minDexQuote, minCexQuote /*, totalQuote */ uint64 setLots := func(buy, sell uint64) { buyLots, sellLots = buy, sell - a.placementLotsV.Store(&placementLots{ - baseLots: sellLots, - quoteLots: buyLots, - }) - a.cfgV.Store(&ArbMarketMakerConfig{ - Profit: 0, - BuyPlacements: []*ArbMarketMakingPlacement{ - { - Lots: buyLots, - Multiplier: 1, + u.botCfgV.Store(&BotConfig{ + ArbMarketMakerConfig: &ArbMarketMakerConfig{ + Profit: 0, + BuyPlacements: []*ArbMarketMakingPlacement{ + {Lots: buyLots, Multiplier: 1}, }, - }, - SellPlacements: []*ArbMarketMakingPlacement{ - { - Lots: sellLots, - Multiplier: 1, + SellPlacements: []*ArbMarketMakingPlacement{ + {Lots: sellLots, Multiplier: 1}, }, }, }) @@ -315,9 +307,12 @@ func TestArbMarketMakerDEXUpdates(t *testing.T) { arbMM.CEX = newTCEX() arbMM.ctx = ctx arbMM.setBotLoop(arbMM.botLoop) - arbMM.cfgV.Store(&ArbMarketMakerConfig{ - Profit: profit, + arbMM.unifiedExchangeAdaptor.botCfgV.Store(&BotConfig{ + ArbMarketMakerConfig: &ArbMarketMakerConfig{ + Profit: profit, + }, }) + arbMM.currEpoch.Store(123) err := arbMM.runBotLoop(ctx) if err != nil { @@ -410,7 +405,7 @@ func TestDEXPlacementRate(t *testing.T) { } expectedProfitableSellRate := uint64(float64(tt.counterTradeRate) * (1 + tt.profit)) - additional := calc.BaseToQuote(sellRate, tt.mkt.lotSize) - calc.BaseToQuote(expectedProfitableSellRate, tt.mkt.lotSize) + additional := calc.BaseToQuote(sellRate, tt.mkt.lotSize.Load()) - calc.BaseToQuote(expectedProfitableSellRate, tt.mkt.lotSize.Load()) if additional > tt.fees*101/100 || additional < tt.fees*99/100 { t.Fatalf("%s: expected additional %d but got %d", tt.name, tt.fees, additional) } @@ -420,7 +415,7 @@ func TestDEXPlacementRate(t *testing.T) { t.Fatalf("%s: unexpected error: %v", tt.name, err) } expectedProfitableBuyRate := uint64(float64(tt.counterTradeRate) / (1 + tt.profit)) - savings := calc.BaseToQuote(expectedProfitableBuyRate, tt.mkt.lotSize) - calc.BaseToQuote(buyRate, tt.mkt.lotSize) + savings := calc.BaseToQuote(expectedProfitableBuyRate, tt.mkt.lotSize.Load()) - calc.BaseToQuote(buyRate, tt.mkt.lotSize.Load()) if savings > tt.fees*101/100 || savings < tt.fees*99/100 { t.Fatalf("%s: expected savings %d but got %d", tt.name, tt.fees, savings) } diff --git a/client/mm/mm_basic.go b/client/mm/mm_basic.go index e65fb0da11..1fb3a954b6 100644 --- a/client/mm/mm_basic.go +++ b/client/mm/mm_basic.go @@ -15,6 +15,7 @@ import ( "decred.org/dcrdex/client/core" "decred.org/dcrdex/dex" "decred.org/dcrdex/dex/calc" + "decred.org/dcrdex/dex/utils" ) // GapStrategy is a specifier for an algorithm to choose the maker bot's target @@ -77,7 +78,7 @@ func needBreakEvenHalfSpread(strat GapStrategy) bool { return strat == GapStrategyAbsolutePlus || strat == GapStrategyPercentPlus || strat == GapStrategyMultiplier } -func (c *BasicMarketMakingConfig) Validate() error { +func (c *BasicMarketMakingConfig) validate() error { if c.DriftTolerance == 0 { c.DriftTolerance = 0.001 } @@ -138,6 +139,56 @@ func (c *BasicMarketMakingConfig) Validate() error { return nil } +func (c *BasicMarketMakingConfig) copy() *BasicMarketMakingConfig { + cfg := *c + + copyOrderPlacement := func(p *OrderPlacement) *OrderPlacement { + return &OrderPlacement{ + Lots: p.Lots, + GapFactor: p.GapFactor, + } + } + + cfg.SellPlacements = utils.Map(c.SellPlacements, copyOrderPlacement) + cfg.BuyPlacements = utils.Map(c.BuyPlacements, copyOrderPlacement) + + return &cfg +} + +func updateLotSize(placements []*OrderPlacement, originalLotSize, newLotSize uint64) (updatedPlacements []*OrderPlacement) { + var qtyCounter uint64 + for _, p := range placements { + qtyCounter += p.Lots * originalLotSize + } + newPlacements := make([]*OrderPlacement, 0, len(placements)) + for _, p := range placements { + lots := uint64(math.Round((float64(p.Lots) * float64(originalLotSize)) / float64(newLotSize))) + lots = utils.Max(lots, 1) + maxLots := qtyCounter / newLotSize + lots = utils.Min(lots, maxLots) + if lots == 0 { + continue + } + qtyCounter -= lots * newLotSize + newPlacements = append(newPlacements, &OrderPlacement{ + Lots: lots, + GapFactor: p.GapFactor, + }) + } + + return newPlacements +} + +// updateLotSize modifies the number of lots in each placement in the event +// of a lot size change. It will place as many lots as possible without +// exceeding the total quantity placed using the original lot size. +// +// This function is NOT thread safe. +func (c *BasicMarketMakingConfig) updateLotSize(originalLotSize, newLotSize uint64) { + c.SellPlacements = updateLotSize(c.SellPlacements, originalLotSize, newLotSize) + c.BuyPlacements = updateLotSize(c.BuyPlacements, originalLotSize, newLotSize) +} + type basicMMCalculator interface { basisPrice() (bp uint64, err error) halfSpread(uint64) (uint64, error) @@ -170,6 +221,7 @@ func (b *basicMMCalculatorImpl) basisPrice() (uint64, error) { b.log.Tracef("oracle rate = %s", b.fmtRate(oracleRate)) rateFromFiat := b.core.ExchangeRateFromFiatSources() + rateStep := b.rateStep.Load() if rateFromFiat == 0 { b.log.Meter("basisPrice_nofiat_"+b.market.name, time.Hour).Warn( "No fiat-based rate estimate(s) available for sanity check for %s", b.market.name, @@ -177,13 +229,13 @@ func (b *basicMMCalculatorImpl) basisPrice() (uint64, error) { if oracleRate == 0 { // steppedRate(0, x) => x, so we have to handle this. return 0, errNoBasisPrice } - return steppedRate(oracleRate, b.rateStep), nil + return steppedRate(oracleRate, rateStep), nil } if oracleRate == 0 { b.log.Meter("basisPrice_nooracle_"+b.market.name, time.Hour).Infof( "No oracle rate available. Using fiat-derived basis rate = %s for %s", b.fmtRate(rateFromFiat), b.market.name, ) - return steppedRate(rateFromFiat, b.rateStep), nil + return steppedRate(rateFromFiat, rateStep), nil } mismatch := math.Abs((float64(oracleRate) - float64(rateFromFiat)) / float64(oracleRate)) const maxOracleFiatMismatch = 0.05 @@ -195,7 +247,7 @@ func (b *basicMMCalculatorImpl) basisPrice() (uint64, error) { return 0, errOracleFiatMismatch } - return steppedRate(oracleRate, b.rateStep), nil + return steppedRate(oracleRate, rateStep), nil } // halfSpread calculates the distance from the mid-gap where if you sell a lot @@ -254,7 +306,7 @@ func (b *basicMMCalculatorImpl) feeGapStats(basisPrice uint64) (*FeeGapStats, er */ f := sellFeesInBaseUnits + buyFeesInBaseUnits - l := b.lotSize + l := b.lotSize.Load() r := float64(basisPrice) / calc.RateEncodingFactor g := float64(f) * r / float64(f+2*l) @@ -276,7 +328,6 @@ func (b *basicMMCalculatorImpl) feeGapStats(basisPrice uint64) (*FeeGapStats, er type basicMarketMaker struct { *unifiedExchangeAdaptor - cfgV atomic.Value // *BasicMarketMakingConfig core botCoreAdaptor oracle oracle rebalanceRunning atomic.Bool @@ -286,7 +337,7 @@ type basicMarketMaker struct { var _ bot = (*basicMarketMaker)(nil) func (m *basicMarketMaker) cfg() *BasicMarketMakingConfig { - return m.cfgV.Load().(*BasicMarketMakingConfig) + return m.botCfg().BasicMMConfig } func (m *basicMarketMaker) orderPrice(basisPrice, feeAdj uint64, sell bool, gapFactor float64) uint64 { @@ -308,7 +359,7 @@ func (m *basicMarketMaker) orderPrice(basisPrice, feeAdj uint64, sell bool, gapF adj += feeAdj } - adj = steppedRate(adj, m.rateStep) + adj = steppedRate(adj, m.rateStep.Load()) if sell { return basisPrice + adj @@ -423,7 +474,12 @@ func (m *basicMarketMaker) botLoop(ctx context.Context) (*sync.WaitGroup, error) defer bookFeed.Close() for { select { - case ni := <-bookFeed.Next(): + case ni, ok := <-bookFeed.Next(): + if !ok { + m.log.Error("Stopping bot due to nil book feed.") + m.kill() + return + } switch epoch := ni.Payload.(type) { case *core.ResolvedEpoch: m.rebalance(epoch.Current) @@ -437,21 +493,6 @@ func (m *basicMarketMaker) botLoop(ctx context.Context) (*sync.WaitGroup, error) return &wg, nil } -func (m *basicMarketMaker) updateConfig(cfg *BotConfig) error { - if cfg.BasicMMConfig == nil { - // implies bug in caller - return errors.New("no market making config provided") - } - - err := cfg.BasicMMConfig.Validate() - if err != nil { - return fmt.Errorf("invalid market making config: %v", err) - } - - m.cfgV.Store(cfg.BasicMMConfig) - return nil -} - // RunBasicMarketMaker starts a basic market maker bot. func newBasicMarketMaker(cfg *BotConfig, adaptorCfg *exchangeAdaptorCfg, oracle oracle, log dex.Logger) (*basicMarketMaker, error) { if cfg.BasicMMConfig == nil { @@ -464,7 +505,7 @@ func newBasicMarketMaker(cfg *BotConfig, adaptorCfg *exchangeAdaptorCfg, oracle return nil, fmt.Errorf("error constructing exchange adaptor: %w", err) } - err = cfg.BasicMMConfig.Validate() + err = cfg.BasicMMConfig.validate() if err != nil { return nil, fmt.Errorf("invalid market making config: %v", err) } @@ -474,7 +515,6 @@ func newBasicMarketMaker(cfg *BotConfig, adaptorCfg *exchangeAdaptorCfg, oracle core: adaptor, oracle: oracle, } - basicMM.cfgV.Store(cfg.BasicMMConfig) adaptor.setBotLoop(basicMM.botLoop) return basicMM, nil } diff --git a/client/mm/mm_basic_test.go b/client/mm/mm_basic_test.go index 2ebf31f4e7..2698cbc19a 100644 --- a/client/mm/mm_basic_test.go +++ b/client/mm/mm_basic_test.go @@ -176,6 +176,72 @@ func TestBreakEvenHalfSpread(t *testing.T) { } } +func TestUpdateLotSize(t *testing.T) { + tests := []struct { + name string + placements []*OrderPlacement + originalSize uint64 + newSize uint64 + wantPlacements []*OrderPlacement + }{ + { + name: "simple halving", + placements: []*OrderPlacement{ + {Lots: 2, GapFactor: 1.0}, + {Lots: 4, GapFactor: 2.0}, + }, + originalSize: 100, + newSize: 200, + wantPlacements: []*OrderPlacement{ + {Lots: 1, GapFactor: 1.0}, + {Lots: 2, GapFactor: 2.0}, + }, + }, + { + name: "rounding up", + placements: []*OrderPlacement{ + {Lots: 3, GapFactor: 1.0}, + {Lots: 1, GapFactor: 1.0}, + }, + originalSize: 100, + newSize: 160, + wantPlacements: []*OrderPlacement{ + {Lots: 2, GapFactor: 1.0}, + }, + }, + { + name: "minimum 1 lot", + placements: []*OrderPlacement{ + {Lots: 1, GapFactor: 1.0}, + {Lots: 1, GapFactor: 1.0}, + {Lots: 1, GapFactor: 1.0}, + }, + originalSize: 100, + newSize: 250, + wantPlacements: []*OrderPlacement{ + {Lots: 1, GapFactor: 1.0}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := updateLotSize(tt.placements, tt.originalSize, tt.newSize) + if len(got) != len(tt.wantPlacements) { + t.Fatalf("got %d placements, want %d", len(got), len(tt.wantPlacements)) + } + for i := range got { + if got[i].Lots != tt.wantPlacements[i].Lots { + t.Errorf("placement %d: got %d lots, want %d", i, got[i].Lots, tt.wantPlacements[i].Lots) + } + if got[i].GapFactor != tt.wantPlacements[i].GapFactor { + t.Errorf("placement %d: got %f gap factor, want %f", i, got[i].GapFactor, tt.wantPlacements[i].GapFactor) + } + } + }) + } +} + func TestBasicMMRebalance(t *testing.T) { const basisPrice uint64 = 5e6 const halfSpread uint64 = 2e5 @@ -365,11 +431,13 @@ func TestBasicMMRebalance(t *testing.T) { mm.baseCexBalances[baseID] = lotSize * 50 mm.baseDexBalances[quoteID] = int64(calc.BaseToQuote(basisPrice, lotSize*50)) mm.baseCexBalances[quoteID] = int64(calc.BaseToQuote(basisPrice, lotSize*50)) - mm.cfgV.Store(&BasicMarketMakingConfig{ - GapStrategy: tt.strategy, - BuyPlacements: tt.cfgBuyPlacements, - SellPlacements: tt.cfgSellPlacements, - }) + mm.unifiedExchangeAdaptor.botCfgV.Store(&BotConfig{ + BasicMMConfig: &BasicMarketMakingConfig{ + GapStrategy: tt.strategy, + BuyPlacements: tt.cfgBuyPlacements, + SellPlacements: tt.cfgSellPlacements, + }}) + mm.rebalance(100) if len(tcore.multiTradesPlaced) != 2 { diff --git a/client/mm/mm_simple_arb.go b/client/mm/mm_simple_arb.go index b32ce3282f..8b8dff12d6 100644 --- a/client/mm/mm_simple_arb.go +++ b/client/mm/mm_simple_arb.go @@ -35,7 +35,15 @@ type SimpleArbConfig struct { NumEpochsLeaveOpen uint32 `json:"numEpochsLeaveOpen"` } -func (c *SimpleArbConfig) Validate() error { +func (c *SimpleArbConfig) copy() *SimpleArbConfig { + return &SimpleArbConfig{ + ProfitTrigger: c.ProfitTrigger, + MaxActiveArbs: c.MaxActiveArbs, + NumEpochsLeaveOpen: c.NumEpochsLeaveOpen, + } +} + +func (c *SimpleArbConfig) validate() error { if c.ProfitTrigger <= 0 || c.ProfitTrigger > 1 { return fmt.Errorf("profit trigger must be 0 < t <= 1, but got %v", c.ProfitTrigger) } @@ -67,7 +75,6 @@ type simpleArbMarketMaker struct { *unifiedExchangeAdaptor cex botCexAdaptor core botCoreAdaptor - cfgV atomic.Value // *SimpleArbConfig book dexOrderBook rebalanceRunning atomic.Bool @@ -78,7 +85,7 @@ type simpleArbMarketMaker struct { var _ bot = (*simpleArbMarketMaker)(nil) func (a *simpleArbMarketMaker) cfg() *SimpleArbConfig { - return a.cfgV.Load().(*SimpleArbConfig) + return a.botCfg().SimpleArbConfig } // arbExists checks if an arbitrage opportunity exists. @@ -101,11 +108,11 @@ func (a *simpleArbMarketMaker) arbExists() (exists, sellOnDex bool, lotsToArb, d // arbExistsOnSide checks if an arbitrage opportunity exists either when // buying or selling on the dex. func (a *simpleArbMarketMaker) arbExistsOnSide(sellOnDEX bool) (exists bool, lotsToArb, dexRate, cexRate uint64, err error) { - lotSize := a.lotSize + lotSize := a.lotSize.Load() var prevProfit uint64 for numLots := uint64(1); ; numLots++ { - dexAvg, dexExtrema, dexFilled, err := a.book.VWAP(numLots, a.lotSize, !sellOnDEX) + dexAvg, dexExtrema, dexFilled, err := a.book.VWAP(numLots, lotSize, !sellOnDEX) if err != nil { return false, 0, 0, 0, fmt.Errorf("error calculating dex VWAP: %w", err) } @@ -207,6 +214,8 @@ func (a *simpleArbMarketMaker) executeArb(sellOnDex bool, lotsToArb, dexRate, ce } // also check self-match on CEX? + lotSize := a.lotSize.Load() + // Hold the lock for this entire process because updates to the cex trade // may come even before the Trade function has returned, and in order to // be able to process them, the new arbSequence struct must already be in @@ -215,13 +224,13 @@ func (a *simpleArbMarketMaker) executeArb(sellOnDex bool, lotsToArb, dexRate, ce defer a.activeArbsMtx.Unlock() // Place cex order first. If placing dex order fails then can freely cancel cex order. - cexTrade, err := a.cex.CEXTrade(a.ctx, a.baseID, a.quoteID, !sellOnDex, cexRate, lotsToArb*a.lotSize) + cexTrade, err := a.cex.CEXTrade(a.ctx, a.baseID, a.quoteID, !sellOnDex, cexRate, lotsToArb*lotSize) if err != nil { a.log.Errorf("error placing cex order: %v", err) return } - dexOrder, err := a.core.DEXTrade(dexRate, lotsToArb*a.lotSize, sellOnDex) + dexOrder, err := a.core.DEXTrade(dexRate, lotsToArb*lotSize, sellOnDex) if err != nil { if err != nil { a.log.Errorf("error placing dex order: %v", err) @@ -426,14 +435,15 @@ func (a *simpleArbMarketMaker) distribution() (dist *distribution, err error) { if err != nil { return nil, fmt.Errorf("error getting converted fees: %w", err) } - adj := float64(sellFeesInBase)/float64(a.lotSize) + a.cfg().ProfitTrigger - sellRate := steppedRate(uint64(math.Round(float64(sellVWAP)*(1+adj))), a.rateStep) + lotSize, rateStep := a.lotSize.Load(), a.rateStep.Load() + adj := float64(sellFeesInBase)/float64(lotSize) + a.cfg().ProfitTrigger + sellRate := steppedRate(uint64(math.Round(float64(sellVWAP)*(1+adj))), rateStep) buyFeesInBase, err := a.OrderFeesInUnits(false, true, buyVWAP) if err != nil { return nil, fmt.Errorf("error getting converted fees: %w", err) } - adj = float64(buyFeesInBase)/float64(a.lotSize) + a.cfg().ProfitTrigger - buyRate := steppedRate(uint64(math.Round(float64(buyVWAP)/(1+adj))), a.rateStep) + adj = float64(buyFeesInBase)/float64(lotSize) + a.cfg().ProfitTrigger + buyRate := steppedRate(uint64(math.Round(float64(buyVWAP)/(1+adj))), rateStep) perLot, err := a.lotCosts(sellRate, buyRate) if perLot == nil { return nil, fmt.Errorf("error getting lot costs: %w", err) @@ -477,7 +487,12 @@ func (a *simpleArbMarketMaker) botLoop(ctx context.Context) (*sync.WaitGroup, er defer bookFeed.Close() for { select { - case ni := <-bookFeed.Next(): + case ni, ok := <-bookFeed.Next(): + if !ok { + a.log.Error("Stopping bot due to nil book feed.") + a.kill() + return + } switch epoch := ni.Payload.(type) { case *core.ResolvedEpoch: a.rebalance(epoch.Current) @@ -521,7 +536,7 @@ func (a *simpleArbMarketMaker) botLoop(ctx context.Context) (*sync.WaitGroup, er } func (a *simpleArbMarketMaker) registerFeeGap() { - feeGap, err := feeGap(a.core, a.CEX, a.baseID, a.quoteID, a.lotSize) + feeGap, err := feeGap(a.core, a.CEX, a.baseID, a.quoteID, a.lotSize.Load()) if err != nil { a.log.Warnf("error getting fee-gap stats: %v", err) return @@ -529,15 +544,6 @@ func (a *simpleArbMarketMaker) registerFeeGap() { a.unifiedExchangeAdaptor.registerFeeGap(feeGap) } -func (a *simpleArbMarketMaker) updateConfig(cfg *BotConfig) error { - if cfg.SimpleArbConfig == nil { - // implies bug in caller - return fmt.Errorf("no arb config provided") - } - a.cfgV.Store(cfg.SimpleArbConfig) - return nil -} - func newSimpleArbMarketMaker(cfg *BotConfig, adaptorCfg *exchangeAdaptorCfg, log dex.Logger) (*simpleArbMarketMaker, error) { if cfg.SimpleArbConfig == nil { // implies bug in caller @@ -555,7 +561,6 @@ func newSimpleArbMarketMaker(cfg *BotConfig, adaptorCfg *exchangeAdaptorCfg, log core: adaptor, activeArbs: make([]*arbSequence, 0), } - simpleArb.cfgV.Store(cfg.SimpleArbConfig) adaptor.setBotLoop(simpleArb.botLoop) return simpleArb, nil } diff --git a/client/mm/mm_simple_arb_test.go b/client/mm/mm_simple_arb_test.go index 43ca7410cd..1b30bead5c 100644 --- a/client/mm/mm_simple_arb_test.go +++ b/client/mm/mm_simple_arb_test.go @@ -544,10 +544,12 @@ func TestArbRebalance(t *testing.T) { BookingFeesPerLot: sellSwapFees, } // arbEngine.setBotLoop(arbEngine.botLoop) - a.cfgV.Store(&SimpleArbConfig{ - ProfitTrigger: profitTrigger, - MaxActiveArbs: maxActiveArbs, - NumEpochsLeaveOpen: numEpochsLeaveOpen, + a.unifiedExchangeAdaptor.botCfgV.Store(&BotConfig{ + SimpleArbConfig: &SimpleArbConfig{ + ProfitTrigger: profitTrigger, + MaxActiveArbs: maxActiveArbs, + NumEpochsLeaveOpen: numEpochsLeaveOpen, + }, }) a.book = orderBook a.rebalance(currEpoch) @@ -698,11 +700,14 @@ func TestArbDexTradeUpdates(t *testing.T) { arbEngine.CEX = newTCEX() arbEngine.ctx = ctx arbEngine.setBotLoop(arbEngine.botLoop) - arbEngine.cfgV.Store(&SimpleArbConfig{ - ProfitTrigger: 0.01, - MaxActiveArbs: 5, - NumEpochsLeaveOpen: 10, + arbEngine.unifiedExchangeAdaptor.botCfgV.Store(&BotConfig{ + SimpleArbConfig: &SimpleArbConfig{ + ProfitTrigger: 0.01, + MaxActiveArbs: 5, + NumEpochsLeaveOpen: 10, + }, }) + err := arbEngine.runBotLoop(ctx) if err != nil { t.Fatalf("%s: Connect error: %v", test.name, err) @@ -820,10 +825,12 @@ func TestCexTradeUpdates(t *testing.T) { arbEngine.ctx = ctx arbEngine.CEX = newTCEX() arbEngine.setBotLoop(arbEngine.botLoop) - arbEngine.cfgV.Store(&SimpleArbConfig{ - ProfitTrigger: 0.01, - MaxActiveArbs: 5, - NumEpochsLeaveOpen: 10, + arbEngine.unifiedExchangeAdaptor.botCfgV.Store(&BotConfig{ + SimpleArbConfig: &SimpleArbConfig{ + ProfitTrigger: 0.01, + MaxActiveArbs: 5, + NumEpochsLeaveOpen: 10, + }, }) err := arbEngine.runBotLoop(ctx) diff --git a/client/rpcserver/handlers.go b/client/rpcserver/handlers.go index 8417584557..1e3a3836fc 100644 --- a/client/rpcserver/handlers.go +++ b/client/rpcserver/handlers.go @@ -226,8 +226,8 @@ func handleNewWallet(s *RPCServer, params *RawParams) *msgjson.ResponsePayload { // Apply default config options if they exist. for _, opt := range walletDef.ConfigOpts { - if _, has := form.config[opt.Key]; !has && opt.DefaultValue != nil { - form.config[opt.Key] = fmt.Sprintf("%v", opt.DefaultValue) + if _, has := form.config[opt.Key]; !has { + form.config[opt.Key] = opt.DefaultValue } } @@ -884,7 +884,7 @@ func handleStartBot(s *RPCServer, params *RawParams) *msgjson.ResponsePayload { return usage(startBotRoute, err) } - err = s.mm.StartBot(&mm.StartConfig{MarketWithHost: *form.mkt}, &form.cfgFilePath, form.appPass) + err = s.mm.StartBot(&mm.StartConfig{MarketWithHost: *form.mkt}, &form.cfgFilePath, form.appPass, true) if err != nil { resErr := msgjson.NewError(msgjson.RPCStartMarketMakingError, "unable to start market making: %v", err) return createResponse(startBotRoute, nil, resErr) diff --git a/client/webserver/api.go b/client/webserver/api.go index 23bb0067fe..3409fb8552 100644 --- a/client/webserver/api.go +++ b/client/webserver/api.go @@ -427,7 +427,7 @@ func (s *WebServer) apiRedeemPrepaidBond(w http.ResponseWriter, r *http.Request) s.writeAPIError(w, fmt.Errorf("password error: %w", err)) return } - tier, err := s.core.RedeemPrepaidBond(appPW, req.Code, req.Host, req.Cert) + tier, err := s.core.RedeemPrepaidBond(appPW, req.Code, req.Host, []byte(req.Cert)) if err != nil { s.writeAPIError(w, err) return @@ -597,6 +597,36 @@ func (s *WebServer) apiNewDepositAddress(w http.ResponseWriter, r *http.Request) }) } +// apiAddressUsed checks whether an address has been used. +func (s *WebServer) apiAddressUsed(w http.ResponseWriter, r *http.Request) { + form := &struct { + AssetID *uint32 `json:"assetID"` + Addr string `json:"addr"` + }{} + if !readPost(w, r, form) { + return + } + if form.AssetID == nil { + s.writeAPIError(w, errors.New("missing asset ID")) + return + } + assetID := *form.AssetID + + used, err := s.core.AddressUsed(assetID, form.Addr) + if err != nil { + s.writeAPIError(w, err) + return + } + + writeJSON(w, &struct { + OK bool `json:"ok"` + Used bool `json:"used"` + }{ + OK: true, + Used: used, + }) +} + // apiConnectWallet is the handler for the '/connectwallet' API request. // Connects to a specified wallet, but does not unlock it. func (s *WebServer) apiConnectWallet(w http.ResponseWriter, r *http.Request) { @@ -990,6 +1020,16 @@ func (s *WebServer) apiSetLocale(w http.ResponseWriter, r *http.Request) { writeJSON(w, simpleAck()) } +// apiBuildInfo is the handler for the '/buildinfo' API request. +func (s *WebServer) apiBuildInfo(w http.ResponseWriter, r *http.Request) { + resp := buildInfoResponse{ + OK: true, + Version: s.appVersion, + Revision: commitHash, + } + writeJSON(w, resp) +} + // apiLogin handles the 'login' API request. func (s *WebServer) apiLogin(w http.ResponseWriter, r *http.Request) { login := new(loginForm) @@ -1908,7 +1948,7 @@ func (s *WebServer) apiStartMarketMakingBot(w http.ResponseWriter, r *http.Reque s.writeAPIError(w, errors.New("config missing")) return } - if err = s.mm.StartBot(form.Config, nil, appPW); err != nil { + if err = s.mm.StartBot(form.Config, nil, appPW, true); err != nil { s.writeAPIError(w, fmt.Errorf("error starting market making: %v", err)) return } diff --git a/client/webserver/http.go b/client/webserver/http.go index 45ca372e66..0edb096134 100644 --- a/client/webserver/http.go +++ b/client/webserver/http.go @@ -55,17 +55,21 @@ func (s *WebServer) sendTemplate(w http.ResponseWriter, tmplID string, data any) // CommonArguments are common page arguments that must be supplied to every // page to populate the and <header> elements. type CommonArguments struct { - UserInfo *userInfo - Title string - UseDEXBranding bool + UserInfo *userInfo + Title string + UseDEXBranding bool + Version string + NewAppVersionAvailable bool } // Create the CommonArguments for the request. func (s *WebServer) commonArgs(r *http.Request, title string) *CommonArguments { return &CommonArguments{ - UserInfo: extractUserInfo(r), - Title: title, - UseDEXBranding: s.useDEXBranding, + UserInfo: extractUserInfo(r), + Title: title, + UseDEXBranding: s.useDEXBranding, + Version: s.appVersion, + NewAppVersionAvailable: s.newAppVersionAvailable, } } @@ -77,7 +81,7 @@ func (s *WebServer) handleHome(w http.ResponseWriter, r *http.Request) { // handleLogin is the handler for the '/login' page request. func (s *WebServer) handleLogin(w http.ResponseWriter, r *http.Request) { - cArgs := s.commonArgs(r, "Login | Decred DEX") + cArgs := s.commonArgs(r, "Login | Bison Wallet") if cArgs.UserInfo.Authed { http.Redirect(w, r, walletsRoute, http.StatusSeeOther) return @@ -97,7 +101,7 @@ type registerTmplData struct { // handleRegister is the handler for the '/register' page request. func (s *WebServer) handleRegister(w http.ResponseWriter, r *http.Request) { - common := s.commonArgs(r, "Register | Decred DEX") + common := s.commonArgs(r, "Register | Bison Wallet") host, _ := getHostCtx(r) s.sendTemplate(w, "register", ®isterTmplData{ CommonArguments: *common, @@ -129,12 +133,12 @@ func (s *WebServer) knownUnregisteredExchanges(registeredExchanges map[string]*c // handleMarkets is the handler for the '/markets' page request. func (s *WebServer) handleMarkets(w http.ResponseWriter, r *http.Request) { - s.sendTemplate(w, "markets", s.commonArgs(r, "Markets | Decred DEX")) + s.sendTemplate(w, "markets", s.commonArgs(r, "Markets | Bison Wallet")) } // handleMarketMaking is the handler for the '/mm' page request. func (s *WebServer) handleMarketMaking(w http.ResponseWriter, r *http.Request) { - s.sendTemplate(w, "mm", s.commonArgs(r, "Market Making | Decred DEX")) + s.sendTemplate(w, "mm", s.commonArgs(r, "Market Making | Bison Wallet")) } // handleWallets is the handler for the '/wallets' page request. @@ -158,7 +162,7 @@ func (s *WebServer) handleWallets(w http.ResponseWriter, r *http.Request) { sort.Slice(nowallets, func(i, j int) bool { return nowallets[i].Name < nowallets[j].Name }) - s.sendTemplate(w, "wallets", s.commonArgs(r, "Wallets | Decred DEX")) + s.sendTemplate(w, "wallets", s.commonArgs(r, "Wallets | Bison Wallet")) } // handleWalletLogFile is the handler for the '/wallets/logfile' page request. @@ -246,12 +250,12 @@ func (s *WebServer) handleGenerateQRCode(w http.ResponseWriter, r *http.Request) // handleInit is the handler for the '/init' page request func (s *WebServer) handleInit(w http.ResponseWriter, r *http.Request) { - s.sendTemplate(w, "init", s.commonArgs(r, "Welcome | Decred DEX")) + s.sendTemplate(w, "init", s.commonArgs(r, "Welcome | Bison Wallet")) } // handleSettings is the handler for the '/settings' page request. func (s *WebServer) handleSettings(w http.ResponseWriter, r *http.Request) { - common := s.commonArgs(r, "Settings | Decred DEX") + common := s.commonArgs(r, "Settings | Bison Wallet") xcs := s.core.Exchanges() data := &struct { CommonArguments @@ -287,7 +291,7 @@ func (s *WebServer) handleDexSettings(w http.ResponseWriter, r *http.Request) { return } - common := *s.commonArgs(r, fmt.Sprintf("%v Settings | Decred DEX", host)) + common := *s.commonArgs(r, fmt.Sprintf("%v Settings | Bison Wallet", host)) data := &struct { CommonArguments Exchange *core.Exchange @@ -303,19 +307,19 @@ func (s *WebServer) handleDexSettings(w http.ResponseWriter, r *http.Request) { // handleMMSettings is the handler for the '/mmsettings' page request. func (s *WebServer) handleMMSettings(w http.ResponseWriter, r *http.Request) { - common := *s.commonArgs(r, "Market Making Settings | Decred DEX") + common := *s.commonArgs(r, "Market Making Settings | Bison Wallet") s.sendTemplate(w, "mmsettings", common) } // handleMMArchives is the handler for the '/mmarchives' page request. func (s *WebServer) handleMMArchives(w http.ResponseWriter, r *http.Request) { - common := *s.commonArgs(r, "Market Making Archives | Decred DEX") + common := *s.commonArgs(r, "Market Making Archives | Bison Wallet") s.sendTemplate(w, "mmarchives", common) } // handleMMLogs is the handler for the '/mmlogs' page request. func (s *WebServer) handleMMLogs(w http.ResponseWriter, r *http.Request) { - common := *s.commonArgs(r, "Market Making Logs | Decred DEX") + common := *s.commonArgs(r, "Market Making Logs | Bison Wallet") s.sendTemplate(w, "mmlogs", common) } @@ -343,7 +347,7 @@ func (s *WebServer) handleOrders(w http.ResponseWriter, r *http.Request) { } s.sendTemplate(w, "orders", &ordersTmplData{ - CommonArguments: *s.commonArgs(r, "Orders | Decred DEX"), + CommonArguments: *s.commonArgs(r, "Orders | Bison Wallet"), Assets: s.core.SupportedAssets(), Hosts: hosts, Statuses: allStatuses, @@ -483,7 +487,7 @@ func (s *WebServer) handleOrder(w http.ResponseWriter, r *http.Request) { return } s.sendTemplate(w, "order", &orderTmplData{ - CommonArguments: *s.commonArgs(r, "Order | Decred DEX"), + CommonArguments: *s.commonArgs(r, "Order | Bison Wallet"), Order: s.orderReader(ord), }) } diff --git a/client/webserver/live_test.go b/client/webserver/live_test.go index cae2faf0c1..6923ce649e 100644 --- a/client/webserver/live_test.go +++ b/client/webserver/live_test.go @@ -714,7 +714,7 @@ func (c *TCore) PreOrder(*core.TradeForm) (*core.OrderEstimate, error) { Key: "moredough", DisplayName: "Get More Dough", Description: "Cast a magical incantation to double the amount of XYZ received.", - DefaultValue: true, + DefaultValue: "true", }, Boolean: &asset.BooleanConfig{ Reason: "Cuz why not?", @@ -725,7 +725,7 @@ func (c *TCore) PreOrder(*core.TradeForm) (*core.OrderEstimate, error) { Key: "awesomeness", DisplayName: "More Awesomeness", Description: "Crank up the awesomeness for next-level trading.", - DefaultValue: 1.0, + DefaultValue: "1.0", }, XYRange: &asset.XYRange{ Start: asset.XYRangePoint{ @@ -755,7 +755,7 @@ func (c *TCore) PreOrder(*core.TradeForm) (*core.OrderEstimate, error) { Key: "lesshassle", DisplayName: "Smoother Experience", Description: "Select this option for a super-elite VIP DEX experience.", - DefaultValue: false, + DefaultValue: "false", }, Boolean: &asset.BooleanConfig{ Reason: "Half the time, twice the service", @@ -1657,6 +1657,10 @@ func (c *TCore) NewDepositAddress(assetID uint32) (string, error) { return ordertest.RandomAddress(), nil } +func (c *TCore) AddressUsed(assetID uint32, addr string) (bool, error) { + return rand.Float32() > 0.5, nil +} + func (c *TCore) SetWalletPassword(appPW []byte, assetID uint32, newPW []byte) error { return nil } func (c *TCore) User() *core.User { @@ -2145,7 +2149,7 @@ func (m *TMarketMaker) MarketReport(host string, baseID, quoteID uint32) (*mm.Ma }, nil } -func (m *TMarketMaker) StartBot(startCfg *mm.StartConfig, alternateConfigPath *string, appPW []byte) (err error) { +func (m *TMarketMaker) StartBot(startCfg *mm.StartConfig, alternateConfigPath *string, appPW []byte, overrideLotSizeUpdate bool) (err error) { m.runningBotsMtx.Lock() defer m.runningBotsMtx.Unlock() diff --git a/client/webserver/locales/ar.go b/client/webserver/locales/ar.go index 27f7c264ac..b36fc2bc3f 100644 --- a/client/webserver/locales/ar.go +++ b/client/webserver/locales/ar.go @@ -137,6 +137,7 @@ var Ar = map[string]*intl.Translation{ "Export Account": {T: "تصدير الحساب"}, "simultaneous_servers_msg": {T: "يدعم عميل منصة المبادلات اللامركزية لديكريد الاستخدام المتزامن لأي عدد من خوادم منصة المبادلات اللامركزية DEX."}, "Change App Password": {T: "تغيير كلمة مرور التطبيق"}, + "Version": {T: "إصدار"}, "Build ID": {T: "معرف البنية"}, "Connect": {T: "اتصل"}, "Send": {T: "ارسال"}, diff --git a/client/webserver/locales/de-de.go b/client/webserver/locales/de-de.go index 22d44f5b83..a7b122c1c2 100644 --- a/client/webserver/locales/de-de.go +++ b/client/webserver/locales/de-de.go @@ -167,6 +167,7 @@ var DeDE = map[string]*intl.Translation{ "browser_ntfn_blocked": {T: "Browser-Benachrichtigungen sind derzeit blockiert. Heben die Blockierung dieser Seite in Ihrem Browser auf, um Benachrichtigungen zu erhalten."}, "enable_browser_ntfn_info": {T: "Benachrichtigungen auf dem Desktop erscheinen auch dann, wenn dieses Fenster nicht aktiv ist. Dies kann nützlich sein, wenn Sie andere Anwendungen aktiviert haben, da Sie dann Benachrichtigungen über Aktivitäten auf Bison Wallet erhalten. Sie können die Arten von Benachrichtigungen, die Sie erhalten möchten, unten anpassen."}, "Save Notifications": {T: "Benachrichtigungen Speichern"}, + "Version": {T: "Version"}, "Build ID": {T: "Build ID"}, "Connect": {T: "Verbinden"}, "Send": {T: "Senden"}, diff --git a/client/webserver/locales/en-us.go b/client/webserver/locales/en-us.go index 2cfc67effe..3f980b6856 100644 --- a/client/webserver/locales/en-us.go +++ b/client/webserver/locales/en-us.go @@ -169,6 +169,12 @@ var EnUS = map[string]*intl.Translation{ "browser_ntfn_blocked": {T: "Browser notifications are currently blocked. Please unblock this site in your browser to receive notifications."}, "enable_browser_ntfn_info": {T: "Desktop notifications appear even when this window is not active. When you have other applications open this can be helpful as you will be notified on DCRDEX events. Customize below the types of notifications you would like to receive."}, "Save Notifications": {T: "Save Notifications"}, + "Companion App": {T: "Companion App"}, + "companion_app_info": {T: "Install the DCRDEX companion app and scan this QR code."}, + "companion_app_tor_needed": {T: "Tor must be enabled for this."}, + "Pair companion app": {T: "Pair companion app"}, + "Download APK": {T: "Download APK"}, + "Version": {T: "Version"}, "Build ID": {T: "Build ID"}, "Connect": {T: "Connect"}, "Send": {T: "Send"}, @@ -681,4 +687,17 @@ var EnUS = map[string]*intl.Translation{ "Wallet Balances": {T: "Wallet Balances"}, "Placements": {T: "Placements"}, "delete_bot": {T: "Delete Bot"}, + "export_logs": {T: "Export Logs"}, + "address has been used": {T: "address has been used"}, + "Allow external transfers": {T: "Allow external transfers"}, + "external_transfers_tooltip": {T: "When enabled, the bot will be able to transfer funds between the DEX and the CEX."}, + "Internal transfers only": {T: "Internal transfers only"}, + "internal_only_tooltip": {T: "When enabled, the bot will be able to use any available funds in the wallet to simulate a transfer between the DEX and the CEX, (i.e. increase the bot's DEX balance and decrease the bot's CEX balance when a withdrawal needs to be made) but no actual transfers will be made."}, + "running_bot_allocation_note": {T: "This bot is already running. The numbers below are the allocation adjustments that will be made, not the total balance that will be allocated."}, + "order_type": {T: "Order Type"}, + "Total Profit": {T: "Total Profit"}, + "total_profit_tooltip": {T: "Total profit only includes runs that have completed"}, + "Number of Runs": {T: "Number of Runs"}, + "New Release Message": {T: "<strong> 🚀 New release available!</strong> Get the latest version now."}, + "View Website": {T: "View Website"}, } diff --git a/client/webserver/locales/pl-pl.go b/client/webserver/locales/pl-pl.go index c1f7be9a99..147fa170fe 100644 --- a/client/webserver/locales/pl-pl.go +++ b/client/webserver/locales/pl-pl.go @@ -133,6 +133,7 @@ var PlPL = map[string]*intl.Translation{ "Export Account": {T: "Eksportuj konto"}, "simultaneous_servers_msg": {T: "Klient Decred DEX wspiera jednoczesne korzystanie z wielu serwerów DEX."}, "Change App Password": {T: "Zmień hasło aplikacji"}, + "Version": {T: "Wersja"}, "Build ID": {T: "ID builda"}, "Connect": {T: "Połącz"}, "Withdraw": {T: "Wypłać"}, diff --git a/client/webserver/locales/pt-br.go b/client/webserver/locales/pt-br.go index 38187ed0b2..b77f4ed314 100644 --- a/client/webserver/locales/pt-br.go +++ b/client/webserver/locales/pt-br.go @@ -133,6 +133,7 @@ var PtBr = map[string]*intl.Translation{ "Export Account": {T: "Exportar Conta"}, "simultaneous_servers_msg": {T: "O cliente da DEX suporta simultâneos números de servidores DEX."}, "Change App Password": {T: "Trocar Senha do aplicativo"}, + "Version": {T: "Versão"}, "Build ID": {T: "ID da Build"}, "Connect": {T: "Conectar"}, "Withdraw": {T: "Retirar"}, diff --git a/client/webserver/locales/zh-cn.go b/client/webserver/locales/zh-cn.go index 0da298ba6e..5c6a6c1fb6 100644 --- a/client/webserver/locales/zh-cn.go +++ b/client/webserver/locales/zh-cn.go @@ -166,6 +166,7 @@ var ZhCN = map[string]*intl.Translation{ "browser_ntfn_blocked": {T: "浏览器通知目前被阻止。请在浏览器中解除对该站点的阻止,以接收通知。"}, "enable_browser_ntfn_info": {T: "即使此窗口不活跃,桌面通知仍会出现。当您打开其他应用程序时,这会很有帮助,因为您将收到 DCRDEX 事件的通知。您可以在下方自定义您希望接收的通知类型。"}, "Save Notifications": {T: "保存通知"}, + "Version": {T: "版本"}, "Build ID": {T: "构建 ID"}, "Connect": {T: "连接"}, "Send": {T: "发送"}, diff --git a/client/webserver/site/dist/entry.js b/client/webserver/site/dist/entry.js index 8df6f050ca..f063537052 100644 --- a/client/webserver/site/dist/entry.js +++ b/client/webserver/site/dist/entry.js @@ -1,3 +1,3 @@ /*! For license information please see entry.js.LICENSE.txt */ -(()=>{var e={633:(e,t,n)=>{var r=n(738).default;function a(){"use strict";e.exports=a=function(){return t},e.exports.__esModule=!0,e.exports.default=e.exports;var t={},n=Object.prototype,o=n.hasOwnProperty,s=Object.defineProperty||function(e,t,n){e[t]=n.value},i="function"==typeof Symbol?Symbol:{},c=i.iterator||"@@iterator",l=i.asyncIterator||"@@asyncIterator",u=i.toStringTag||"@@toStringTag";function d(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{d({},"")}catch(e){d=function(e,t,n){return e[t]=n}}function h(e,t,n,r){var a=t&&t.prototype instanceof v?t:v,o=Object.create(a.prototype),i=new I(r||[]);return s(o,"_invoke",{value:S(e,n,i)}),o}function p(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=h;var f={};function v(){}function m(){}function g(){}var y={};d(y,c,(function(){return this}));var b=Object.getPrototypeOf,x=b&&b(b(A([])));x&&x!==n&&o.call(x,c)&&(y=x);var k=g.prototype=v.prototype=Object.create(y);function w(e){["next","throw","return"].forEach((function(t){d(e,t,(function(e){return this._invoke(t,e)}))}))}function C(e,t){function n(a,s,i,c){var l=p(e[a],e,s);if("throw"!==l.type){var u=l.arg,d=u.value;return d&&"object"==r(d)&&o.call(d,"__await")?t.resolve(d.__await).then((function(e){n("next",e,i,c)}),(function(e){n("throw",e,i,c)})):t.resolve(d).then((function(e){u.value=e,i(u)}),(function(e){return n("throw",e,i,c)}))}c(l.arg)}var a;s(this,"_invoke",{value:function(e,r){function o(){return new t((function(t,a){n(e,r,t,a)}))}return a=a?a.then(o,o):o()}})}function S(e,t,n){var r="suspendedStart";return function(a,o){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===a)throw o;return{value:void 0,done:!0}}for(n.method=a,n.arg=o;;){var s=n.delegate;if(s){var i=F(s,n);if(i){if(i===f)continue;return i}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var c=p(e,t,n);if("normal"===c.type){if(r=n.done?"completed":"suspendedYield",c.arg===f)continue;return{value:c.arg,done:n.done}}"throw"===c.type&&(r="completed",n.method="throw",n.arg=c.arg)}}}function F(e,t){var n=t.method,r=e.iterator[n];if(void 0===r)return t.delegate=null,"throw"===n&&e.iterator.return&&(t.method="return",t.arg=void 0,F(e,t),"throw"===t.method)||"return"!==n&&(t.method="throw",t.arg=new TypeError("The iterator does not provide a '"+n+"' method")),f;var a=p(r,e.iterator,t.arg);if("throw"===a.type)return t.method="throw",t.arg=a.arg,t.delegate=null,f;var o=a.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,f):o:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,f)}function T(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function D(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function I(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(T,this),this.reset(!0)}function A(e){if(e){var t=e[c];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,r=function t(){for(;++n<e.length;)if(o.call(e,n))return t.value=e[n],t.done=!1,t;return t.value=void 0,t.done=!0,t};return r.next=r}}return{next:R}}function R(){return{value:void 0,done:!0}}return m.prototype=g,s(k,"constructor",{value:g,configurable:!0}),s(g,"constructor",{value:m,configurable:!0}),m.displayName=d(g,u,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===m||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,g):(e.__proto__=g,d(e,u,"GeneratorFunction")),e.prototype=Object.create(k),e},t.awrap=function(e){return{__await:e}},w(C.prototype),d(C.prototype,l,(function(){return this})),t.AsyncIterator=C,t.async=function(e,n,r,a,o){void 0===o&&(o=Promise);var s=new C(h(e,n,r,a),o);return t.isGeneratorFunction(n)?s:s.next().then((function(e){return e.done?e.value:s.next()}))},w(k),d(k,u,"Generator"),d(k,c,(function(){return this})),d(k,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=A,I.prototype={constructor:I,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(D),!e)for(var t in this)"t"===t.charAt(0)&&o.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=void 0)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function n(n,r){return s.type="throw",s.arg=e,t.next=n,r&&(t.method="next",t.arg=void 0),!!r}for(var r=this.tryEntries.length-1;r>=0;--r){var a=this.tryEntries[r],s=a.completion;if("root"===a.tryLoc)return n("end");if(a.tryLoc<=this.prev){var i=o.call(a,"catchLoc"),c=o.call(a,"finallyLoc");if(i&&c){if(this.prev<a.catchLoc)return n(a.catchLoc,!0);if(this.prev<a.finallyLoc)return n(a.finallyLoc)}else if(i){if(this.prev<a.catchLoc)return n(a.catchLoc,!0)}else{if(!c)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return n(a.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&o.call(r,"finallyLoc")&&this.prev<r.finallyLoc){var a=r;break}}a&&("break"===e||"continue"===e)&&a.tryLoc<=t&&t<=a.finallyLoc&&(a=null);var s=a?a.completion:{};return s.type=e,s.arg=t,a?(this.method="next",this.next=a.finallyLoc,f):this.complete(s)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),f},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),D(n),f}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var a=r.arg;D(n)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:A(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},t}e.exports=a,e.exports.__esModule=!0,e.exports.default=e.exports},738:e=>{function t(n){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},756:(e,t,n)=>{var r=n(633)();e.exports=r;try{regeneratorRuntime=r}catch(e){"object"==typeof globalThis?globalThis.regeneratorRuntime=r:Function("r","regeneratorRuntime = r")(r)}}},t={};function n(r){var a=t[r];if(void 0!==a)return a.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function t(t,n){if(t){if("string"==typeof t)return e(t,n);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?e(t,n):void 0}}function r(n){return function(t){if(Array.isArray(t))return e(t)}(n)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(n)||t(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,o,s,i=[],c=!0,l=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=o.call(n)).done)&&(i.push(r.value),i.length!==t);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(l)throw a}}return i}}(e,n)||t(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(e,t,n,r,a,o,s){try{var i=e[o](s),c=i.value}catch(e){return void n(e)}i.done?t(c):Promise.resolve(c).then(r,a)}function s(e){return function(){var t=this,n=arguments;return new Promise((function(r,a){var s=e.apply(t,n);function i(e){o(s,r,a,i,c,"next",e)}function c(e){o(s,r,a,i,c,"throw",e)}i(void 0)}))}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c(e)}function l(e){var t=function(e){if("object"!==c(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==c(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===c(t)?t:String(t)}function u(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,l(r.key),r)}}function d(e,t,n){return t&&u(e.prototype,t),n&&u(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}function h(e,t,n){return(t=l(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var p=n(756),f=n.n(p);function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function m(e,t){return m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},m(e,t)}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&m(e,t)}function y(e,t){if(t&&("object"===c(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return v(e)}function b(e){return b=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},b(e)}function x(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var k=function(){function e(){i(this,e)}return d(e,null,[{key:"setCookie",value:function(e,t){var n=new Date;n.setTime(n.getTime()+31536e7);var r="expires="+n.toUTCString();document.cookie=e+"="+t+";"+r+";path=/"}},{key:"getCookie",value:function(e){var t,n=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return x(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?x(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}(document.cookie.split(";"));try{for(n.s();!(t=n.n()).done;){var r=a(t.value.split("="),2),o=r[0],s=r[1];if(o.trim()===e)return s}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"removeCookie",value:function(e){document.cookie="".concat(e,"=;expires=Thu, 01 Jan 1970 00:00:01 GMT;")}},{key:"isDark",value:function(){return"1"===e.fetchLocal(e.darkModeLK)}},{key:"storeLocal",value:function(e,t){window.localStorage.setItem(e,JSON.stringify(t))}},{key:"fetchLocal",value:function(e){var t=window.localStorage.getItem(e);return null!==t?JSON.parse(t):null}},{key:"removeLocal",value:function(e){window.localStorage.removeItem(e)}}]),e}();function w(e,t,n){return C.apply(this,arguments)}function C(){return(C=s(f().mark((function e(t,n,r){var a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,window.fetch(n,{method:t,headers:new window.Headers({"content-type":"application/json"}),body:r});case 3:if(200===(a=e.sent).status){e.next=6;break}throw a;case 6:return e.next=8,a.json();case 8:return(o=e.sent).requestSuccessful=!0,e.abrupt("return",o);case 13:return e.prev=13,e.t0=e.catch(0),e.t0.requestSuccessful=!1,e.next=18,e.t0.text();case 18:return e.t0.msg=e.sent,e.abrupt("return",e.t0);case 20:case"end":return e.stop()}}),e,null,[[0,13]])})))).apply(this,arguments)}function S(e,t){return F.apply(this,arguments)}function F(){return(F=s(f().mark((function e(t,n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",w("POST",t,JSON.stringify(n)));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function T(e){return D.apply(this,arguments)}function D(){return(D=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",w("GET",t));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}h(k,"darkModeLK","darkMode"),h(k,"authCK","dexauth"),h(k,"pwKeyCK","sessionkey"),h(k,"popupsLK","popups"),h(k,"loggersLK","loggers"),h(k,"recordersLK","recorders"),h(k,"lastMarketLK","selectedMarket"),h(k,"depthZoomLK","depthZoom"),h(k,"lastMMMarketLK","mmMarket"),h(k,"optionsExpansionLK","mmOptsExpand"),h(k,"leftMarketDockLK","leftmarketdock"),h(k,"selectedAssetLK","selectedasset"),h(k,"notificationsLK","notifications"),h(k,"orderDisclaimerAckedLK","ordAck"),h(k,"lastCandleDurationLK","lastCandleDuration"),h(k,"localeSpecsKey","localeSpecsLK"),h(k,"localeKey","localeLK"),null===k.fetchLocal(k.darkModeLK)&&k.storeLocal(k.darkModeLK,"1"),null===k.fetchLocal(k.popupsLK)&&k.storeLocal(k.popupsLK,"1"),null===k.fetchLocal(k.leftMarketDockLK)&&k.storeLocal(k.leftMarketDockLK,"1");var I,A=function(e){return e[e.walletErr=0]="walletErr",e[e.walletAuthErr=1]="walletAuthErr",e[e.walletBalanceErr=2]="walletBalanceErr",e[e.dupeDEXErr=3]="dupeDEXErr",e[e.assetSupportErr=4]="assetSupportErr",e[e.registerErr=5]="registerErr",e[e.signatureErr=6]="signatureErr",e[e.zeroFeeErr=7]="zeroFeeErr",e[e.feeMismatchErr=8]="feeMismatchErr",e[e.feeSendErr=9]="feeSendErr",e[e.passwordErr=10]="passwordErr",e[e.emptyHostErr=11]="emptyHostErr",e[e.connectionErr=12]="connectionErr",e[e.acctKeyErr=13]="acctKeyErr",e[e.unknownOrderErr=14]="unknownOrderErr",e[e.orderParamsErr=15]="orderParamsErr",e[e.dbErr=16]="dbErr",e[e.authErr=17]="authErr",e[e.connectWalletErr=18]="connectWalletErr",e[e.missingWalletErr=19]="missingWalletErr",e[e.encryptionErr=20]="encryptionErr",e[e.decodeErr=21]="decodeErr",e[e.accountVerificationErr=22]="accountVerificationErr",e[e.accountProofErr=23]="accountProofErr",e[e.parseKeyErr=24]="parseKeyErr",e[e.marketErr=25]="marketErr",e[e.addressParseErr=26]="addressParseErr",e[e.addrErr=27]="addrErr",e[e.fileReadErr=28]="fileReadErr",e[e.unknownDEXErr=29]="unknownDEXErr",e[e.accountRetrieveErr=30]="accountRetrieveErr",e[e.accountDisableErr=31]="accountDisableErr",e[e.suspendedAcctErr=32]="suspendedAcctErr",e[e.existenceCheckErr=33]="existenceCheckErr",e[e.createWalletErr=34]="createWalletErr",e[e.activeOrdersErr=35]="activeOrdersErr",e[e.newAddrErr=36]="newAddrErr",e}({}),R="NO_PASS_ERROR_MSG",E="BUY",B="SELL",P="VERSION_NOT_SUPPORTED",L="NO_ASSET_WALLET",O="EXECUTED",M="BOOKED",q="CANCELING",N="PASSWORD_NOT_MATCH",W="UNKNOWN",V="SETTLING",U="CANCELED",_="REVOKED",j="NONE_SELECTED",H="API_ERROR",z="LOCKED",G="INVALID_ADDRESS_MSG",X="LIMIT_ORDER",K="MARKET_ORDER",Q="MATCH_STATUS_REDEMPTION_SENT",Y="MATCH_REDEMPTION_CONFIRMED",J="MATCH_STATUS_REFUND_PENDING",Z="ORDER_ACCELERATION_ERR_MSG",$="DISCONNECTED",ee="BROWSER_NTFN_ENABLED",te="ORDER_BUTTON_BUY_BALANCE_ERROR",ne="ORDER_BUTTON_SELL_BALANCE_ERROR",re="ORDER_BUTTON_QTY_ERROR",ae="ORDER_BUTTON_QTY_RATE_ERROR",oe="CREATE_ASSET_WALLET_MSG",se="TRADING_TIER_UPDATED",ie="INVALID_TIER_VALUE",ce="MATCH_BUFFER",le="NO_PLACEMENTS",ue="INVALID_VALUE",de="NO_ZERO",he="BOTTYPE_BASIC_MM",pe="BOTTYPE_ARB_MM",fe="BOTTYPE_SIMPLE_ARB",ve="CEXBALANCE_ERR",me="PENDING",ge="COMPLETE",ye="CEX_NOT_CONNECTED";function be(e,t,n){return xe.apply(this,arguments)}function xe(){return(xe=s(f().mark((function e(t,n,r){var a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r){e.next=5;break}if(!(a=k.fetchLocal(k.localeSpecsKey))||a.lang!==t||a.commitHash!==n){e.next=5;break}return I=k.fetchLocal(k.localeKey),e.abrupt("return");case 5:return e.next=7,S("/api/locale",t);case 7:I=e.sent,k.storeLocal(k.localeSpecsKey,{lang:t,commitHash:n}),k.storeLocal(k.localeKey,I);case 10:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ke(e,t){return function(e,t){return e.replace(/{{\s?([^{}\s]*)\s?}}/g,(function(e,n){return t[n]}))}(I[e],t||{})}function we(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Ce(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Ce(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){throw e})),f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){i=!0,o=e})),f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function Ce(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}window.clearLocale=function(){k.removeLocal(k.localeSpecsKey),k.removeLocal(k.localeKey)};var Se=new window.DOMParser,Fe={0:"btc",42:"dcr",2:"ltc",5:"dash",20:"dgb",22:"mona",28:"vtc",3:"doge",145:"bch",60:"eth",60001:"usdc.eth",60002:"usdt.eth",60003:"matic.eth",136:"firo",133:"zec",966:"polygon",966001:"usdc.polygon",966002:"weth.polygon",966003:"wbtc.polygon",966004:"usdt.polygon",147:"zcl"},Te={};!function(){for(var e=0,t=Object.keys(Fe);e<t.length;e++){var n=t[e];Te[Fe[parseInt(n)]]=parseInt(n)}}();var De=Object.values(Fe),Ie=1e8,Ae=Math.round(Math.log10(Ie)),Re=navigator.languages.filter((function(e){return"c"!==e})),Ee=new Intl.NumberFormat(Re,{maximumFractionDigits:0}),Be=new Intl.NumberFormat(Re,{minimumSignificantDigits:4,maximumSignificantDigits:4}),Pe={},Le={};function Oe(e,t){return Me(Le,e,e,t)}function Me(e,t,n,r){var a="".concat(t,"-").concat(n),o=e[a];return o||(o=new Intl.NumberFormat(null!=r?r:Re,{minimumFractionDigits:t,maximumFractionDigits:n}),e[a]=o),o}function qe(e,t){var n=8;if(t){var r=t.conventional.conversionFactor;e/=r,n=Math.round(Math.log10(r))}return[e,n]}var Ne=function(){function e(){i(this,e)}var t,n;return d(e,null,[{key:"idel",value:function(e,t){return e.querySelector("#".concat(t))}},{key:"bind",value:function(e,t,n,r){var a,o=we(Array.isArray(t)?t:[t]);try{for(o.s();!(a=o.n()).done;){var s=a.value;e.addEventListener(s,n,r)}}catch(e){o.e(e)}finally{o.f()}}},{key:"unbind",value:function(e,t,n){e.removeEventListener(t,n)}},{key:"noderize",value:function(e){return Se.parseFromString(e,"text/html")}},{key:"mouseInElement",value:function(e,t){if(t.contains(e.target))return!0;var n=t.getBoundingClientRect();return e.pageX>=n.left&&e.pageX<=n.right&&e.pageY>=n.top&&e.pageY<=n.bottom}},{key:"layoutMetrics",value:function(e){var t=e.getBoundingClientRect(),n=document.documentElement,r=t.top+n.scrollTop,a=t.left+n.scrollLeft,o=e.offsetWidth,s=e.offsetHeight;return{bodyTop:r,bodyLeft:a,width:o,height:s,centerX:a+o/2,centerY:r+s/2}}},{key:"descendentMetrics",value:function(t,n){var r=e.layoutMetrics(t),a=e.layoutMetrics(n);return{bodyTop:a.bodyTop-r.bodyTop,bodyLeft:a.bodyLeft-r.bodyLeft,width:a.width,height:a.height,centerX:a.centerX-r.bodyLeft,centerY:a.centerY-r.bodyTop}}},{key:"empty",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];for(var r=0,a=t;r<a.length;r++)for(var o=a[r];o.firstChild;)o.removeChild(o.firstChild)}},{key:"setContent",value:function(t){e.empty(t);for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];for(var o=0,s=r;o<s.length;o++){var i=s[o];t.appendChild(i)}}},{key:"hide",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];for(var r=0,a=t;r<a.length;r++)a[r].classList.add("d-hide")}},{key:"show",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];for(var r=0,a=t;r<a.length;r++)a[r].classList.remove("d-hide")}},{key:"showTemporarily",value:function(e){for(var t=this,n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];this.show.apply(this,r),setTimeout((function(){t.hide.apply(t,r)}),e)}},{key:"setVis",value:function(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];t?e.show.apply(e,r):e.hide.apply(e,r)}},{key:"isHidden",value:function(e){return e.classList.contains("d-hide")}},{key:"isDisplayed",value:function(e){return!e.classList.contains("d-hide")}},{key:"animate",value:(n=s(f().mark((function e(t,n,r){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,new We(t,n,r).wait();case 2:case"end":return e.stop()}}),e)}))),function(e,t,r){return n.apply(this,arguments)})},{key:"blink",value:(t=s(f().mark((function t(n){var r,o,s,i,c;return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:r=k.isDark()?[255,255,255]:[0,0,0],o=a(r,3),s=o[0],i=o[1],c=o[2],e.animate(1e3,(function(e){n.style.outline="2px solid rgba(".concat(s,", ").concat(i,", ").concat(c,", ").concat((2-2*e)%1,")")}));case 3:case"end":return t.stop()}}),t)}))),function(e){return t.apply(this,arguments)})},{key:"applySelector",value:function(e,t){return Array.from(e.querySelectorAll(t))}},{key:"kids",value:function(e){return Array.from(e.children)}},{key:"safeSelector",value:function(e,t){return e.querySelector(t)||(console.warn("no element found for selector '".concat(t,"' on element ->"),e),document.createElement("div"))}},{key:"idDescendants",value:function(t){var n,r={},a=we(e.applySelector(t,"[id]"));try{for(a.s();!(n=a.n()).done;){var o=n.value;r[o.id]=o}}catch(e){a.e(e)}finally{a.f()}return r}},{key:"formatCoinValue",value:function(e,t){var n=a(qe(e,t),2),r=n[0],o=n[1];return Number.isInteger(r)?Ee.format(r):function(e){return Me(Pe,2,e)}(o).format(r)}},{key:"conventionalCoinValue",value:function(e,t){return a(qe(e,t),1)[0]}},{key:"formatRateFullPrecision",value:function(e,t,n,r){var a=e*(t.conventional.conversionFactor/n.conventional.conversionFactor)/Ie,o=Ae-Math.floor(Math.log10(r))-Math.floor(Math.log10(t.conventional.conversionFactor)-Math.log10(n.conventional.conversionFactor));return o<=0?Ee.format(a):Oe(o).format(a)}},{key:"formatFourSigFigs",value:function(e,t){return function(e,t,n,r){var a,o;if(n>=1e3)return e.format(n);var s=t.format(n);return"number"!=typeof r||(null!==(a=null===(o=t.formatToParts(n).filter((function(e){return"fraction"===e.type}))[0])||void 0===o?void 0:o.value)&&void 0!==a?a:"").length<=r?s:Oe(r,void 0).format(n)}(Ee,Be,e,t)}},{key:"formatInt",value:function(e){return Ee.format(e)}},{key:"formatFullPrecision",value:function(e,t){var n=a(qe(e,t),2),r=n[0];return Oe(n[1]).format(r)}},{key:"formatFiatConversion",value:function(e,t,n){if(!t||0===t)return ke("UNAVAILABLE");var r=a(qe(e,n),1)[0]*t;return Oe(2).format(r)}},{key:"languages",value:function(){return Re}},{key:"formatFiatValue",value:function(e){return Oe(2).format(e)}},{key:"bestConversion",value:function(e,t,n){for(var r=function(e,t){var n,r=(h(n={},e.atomicUnit,1),h(n,e.conventional.unit,e.conventional.conversionFactor),n);if(e.denominations&&t){var a,o=we(e.denominations);try{for(o.s();!(a=o.n()).done;){var s=a.value;t[s.unit]&&(r[s.unit]=s.conversionFactor)}}catch(e){o.e(e)}finally{o.f()}}return r}(t,n),a=[],o=function(t){return Math.abs(Math.log10(e/t[1])-1)},s=0,i=Object.entries(r);s<i.length;s++){var c=i[s];a.push([c[0],o(c)])}var l=a.reduce((function(e,t){return t[1]<e[1]?t:e})),u=l[0],d=r[u];return[e/d,Math.round(Math.log10(d)),u]}},{key:"formatBestUnitsFullPrecision",value:function(e,t,n){var r=a(this.bestConversion(e,t,n),3),o=r[0],s=r[1],i=r[2];return Number.isInteger(o)?[Ee.format(o),i]:[Oe(s).format(o),i]}},{key:"formatBestUnitsFourSigFigs",value:function(t,n,r){var o=a(this.bestConversion(t,n,r),3),s=o[0],i=o[1],c=o[2];return[e.formatFourSigFigs(s,i),c]}},{key:"formatBestRateElement",value:function(t,n,r,a,o){e.formatBestValueElement(t,n,r,a,o),e.setText(t,"[data-denom]",a.feeRateDenom)}},{key:"formatBestValueElement",value:function(t,n,r,o,s){var i=a(this.formatBestUnitsFourSigFigs(r,o,s),2),c=i[0],l=i[1];e.setText(t,"[data-value]",c),e.setText(t,"[data-unit]",l);var u=e.safeSelector(t,"[data-unit-box]");u.dataset.atoms=String(r),u.dataset.assetID=String(n)}},{key:"conventionalRateStep",value:function(e,t,n){var r=[n.conventional.conversionFactor,t.conventional.conversionFactor];return e/Ie*(r[1]/r[0])}},{key:"logoPath",value:function(e){return-1===De.indexOf(e)&&(e=e.substring(0,1)),e=e.split(".")[0],"/img/coins/".concat(e,".png")}},{key:"bipSymbol",value:function(e){return Fe[e]}},{key:"bipIDFromSymbol",value:function(e){return Te[e]}},{key:"bipCEXSymbol",value:function(e){var t=Fe[e];if(!t||""===t)return"";var n=t.split(".");return"weth"===n[0]?"eth":n[0]}},{key:"logoPathFromID",value:function(t){return e.logoPath(Fe[t])}},{key:"symbolize",value:function(t,n){var r=t.unitInfo.conventional.unit,a=document.createElement("span");a.textContent=r.toUpperCase();var o=t.symbol.split(".");if(2!==o.length)return a;var s=o[1],i=document.createElement("span");if(i.appendChild(a),n){var c=document.createElement("img");return c.src=e.logoPath(s),c.classList.add("token-parent"),i.appendChild(c),i}var l=document.createElement("sup");return l.textContent=s.toUpperCase(),l.classList.add("token-parent"),i.appendChild(l),i}},{key:"shortSymbol",value:function(e){return e.split(".")[0].toUpperCase()}},{key:"setText",value:function(t,n,r){var a,o=we(e.applySelector(t,n));try{for(o.s();!(a=o.n()).done;)a.value.textContent=r}catch(e){o.e(e)}finally{o.f()}}},{key:"setSrc",value:function(t,n,r){var a,o=we(e.applySelector(t,n));try{for(o.s();!(a=o.n()).done;)a.value.src=r}catch(e){o.e(e)}finally{o.f()}}},{key:"cleanTemplates",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.forEach((function(e){e.remove(),e.removeAttribute("id")}))}},{key:"tmplElement",value:function(e,t){return e.querySelector('[data-tmpl="'.concat(t,'"]'))||document.createElement("div")}},{key:"parseTemplate",value:function(t){var n,r={},a=we(e.applySelector(t,"[data-tmpl]"));try{for(a.s();!(n=a.n()).done;){var o=n.value;r[o.dataset.tmpl||""]=o}}catch(e){a.e(e)}finally{a.f()}return r}},{key:"timeSince",value:function(t){return e.formatDuration((new Date).getTime()-t)}},{key:"hmsSince",value:function(e){var t=(new Date).getTime()/1e3-e,n=String(Math.floor(t/3600));t%=3600;var r=String(Math.floor(t/60)),a=String(Math.floor(t%60));return"".concat(n.padStart(2,"0"),":").concat(r.padStart(2,"0"),":").concat(a.padStart(2,"0"))}},{key:"formatDuration",value:function(e){var t,n,r,o,s,i,c=Math.floor(e),l="",u=0,d=function(e,t){return(e>0||u>0)&&u++,e>0&&(l+="".concat(e," ").concat(t," ")),u>=2},h=a(Qe(c,He),2);if(t=h[0],c=h[1],d(t,"y"))return l;var p=a(Qe(c,ze),2);if(n=p[0],c=p[1],d(n,"mo"))return l;var f=a(Qe(c,Ge),2);if(r=f[0],c=f[1],d(r,"d"))return l;var v=a(Qe(c,Xe),2);if(o=v[0],c=v[1],d(o,"h"))return l;var m=a(Qe(c,Ke),2);if(s=m[0],c=m[1],d(s,"m"))return l;var g=a(Qe(c,1e3),2);return i=g[0],c=g[1],d(i,"s"),l||"0 s"}},{key:"disableMouseWheel",value:function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];for(var a=0,o=n;a<o.length;a++){var s=o[a];e.bind(s,"wheel",(function(){}),{passive:!0})}}},{key:"showFormError",value:function(t,n){t.textContent=n,e.show(t)}},{key:"showFiatValue",value:function(t,n,r,a){r?(t.textContent=e.formatFiatConversion(n,r,a),e.show(t.parentElement)):e.hide(t.parentElement)}}]),e}(),We=function(){function e(t,n,r,a){i(this,e),h(this,"done",void 0),h(this,"endAnimation",void 0),h(this,"thread",void 0),this.done=a,this.thread=this.run(t,n,r)}var t,n,r;return d(e,[{key:"run",value:(r=s(f().mark((function t(n,r,a){var o,s,i,c,l,u;return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:n=n>=0?n:31536e7,o=a?Ve[a]:Ve.linear,s=(new Date).getTime(),i=n===e.Forever?Number.MAX_SAFE_INTEGER:s+n,c=i-s,l=1e3/30,u=s,this.endAnimation=!1;case 8:if(!(u<i)){t.next=17;break}if(!this.endAnimation){t.next=11;break}return t.abrupt("return",this.runCompletionFunction());case 11:return r(o((u-s)/c)),t.next=14,je(l);case 14:u=(new Date).getTime(),t.next=8;break;case 17:r(1),this.runCompletionFunction();case 19:case"end":return t.stop()}}),t,this)}))),function(e,t,n){return r.apply(this,arguments)})},{key:"wait",value:(n=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.thread;case 2:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"stop",value:function(){this.endAnimation=!0}},{key:"stopAndWait",value:(t=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.stop(),e.next=3,this.wait();case 3:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"runCompletionFunction",value:function(){this.done&&this.done()}}]),e}();h(We,"Forever",void 0),We.Forever=-1;var Ve={linear:function(e){return e},easeIn:function(e){return e*e},easeOut:function(e){return e*(2-e)},easeInHard:function(e){return e*e*e},easeOutHard:function(e){return--e*e*e+1},easeOutElastic:function(e){var t=2*Math.PI/3;return 0===e?0:1===e?1:Math.pow(2,-10*e)*Math.sin((10*e-.75)*t)+1}},Ue=function(){function e(t){i(this,e),h(this,"icons",void 0),h(this,"status",void 0);var n=function(e){return t.querySelector("[data-state=".concat(e,"]"))};this.icons={},this.icons.sleeping=n("sleeping"),this.icons.locked=n("locked"),this.icons.unlocked=n("unlocked"),this.icons.nowallet=n("nowallet"),this.icons.syncing=n("syncing"),this.icons.nopeers=n("nopeers"),this.icons.disabled=n("disabled"),this.status=n("status")}return d(e,[{key:"sleeping",value:function(){var e=this.icons;Ne.hide(e.locked,e.unlocked,e.nowallet,e.syncing,e.disabled),Ne.show(e.sleeping),this.status&&(this.status.textContent=ke("OFF"))}},{key:"locked",value:function(){var e=this.icons;Ne.hide(e.unlocked,e.nowallet,e.sleeping,e.disabled),Ne.show(e.locked),this.status&&(this.status.textContent=ke(z))}},{key:"unlocked",value:function(){var e=this.icons;Ne.hide(e.locked,e.nowallet,e.sleeping,e.disabled),Ne.show(e.unlocked),this.status&&(this.status.textContent=ke("READY"))}},{key:"nowallet",value:function(){var e=this.icons;Ne.hide(e.locked,e.unlocked,e.sleeping,e.syncing,e.disabled),Ne.show(e.nowallet),this.status&&(this.status.textContent=ke("NO_WALLET"))}},{key:"disabled",value:function(){var e=this.icons;Ne.hide(e.locked,e.unlocked,e.sleeping,e.syncing,e.nowallet,e.nopeers),Ne.show(e.disabled),e.disabled.dataset.tooltip=ke("DISABLED_MSG")}},{key:"setSyncing",value:function(e){var t=this.icons.syncing;if(e&&e.running&&!e.disabled){if(0===e.peerCount)return Ne.show(this.icons.nopeers),void Ne.hide(t);if(Ne.hide(this.icons.nopeers),!e.synced)return Ne.show(t),void(t.dataset.tooltip=ke("WALLET_SYNC_PROGRESS",{syncProgress:(100*e.syncProgress).toFixed(1)}));Ne.hide(t)}else Ne.hide(t)}},{key:"readWallet",value:function(e){if(this.setSyncing(e),!e)return this.nowallet();switch(!0){case e.disabled:this.disabled();break;case!e.running:this.sleeping();break;case!e.open:this.locked();break;case e.open:this.unlocked();break;default:console.error("wallet in unknown state",e)}}}]),e}(),_e=function(){function e(t,n,r,a){var o=this;i(this,e),h(this,"toggle",void 0),h(this,"toggling",void 0),this.toggle=t,0===t.children.length&&t.appendChild(document.createElement("div")),Ne.bind(t,"click",function(){var e=s(f().mark((function e(r){var s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r.stopPropagation(),Ne.hide(n),s=!t.classList.contains("on"),o.toggling=!0,e.prev=4,e.next=7,a(s);case 7:e.next=15;break;case 9:return e.prev=9,e.t0=e.catch(4),o.toggling=!1,Ne.show(n),n.textContent=ke(H,{msg:e.t0.msg||String(e.t0)}),e.abrupt("return");case 15:o.toggling=!1;case 16:case"end":return e.stop()}}),e,null,[[4,9]])})));return function(t){return e.apply(this,arguments)}}()),this.setState(r)}return d(e,[{key:"setState",value:function(e){e?this.toggle.classList.add("on"):this.toggle.classList.remove("on")}}]),e}();function je(e){return new Promise((function(t){return setTimeout(t,e)}))}var He=31536e6,ze=2592e6,Ge=864e5,Xe=36e5,Ke=6e4;function Qe(e,t){var n=Math.floor(e/t);return[n,e-n*t]}var Ye=function(){function e(t,n){var r,a,o,s=this;i(this,e),h(this,"input",void 0),h(this,"prec",void 0),h(this,"fmt",void 0),h(this,"changed",void 0),h(this,"set",void 0),h(this,"min",void 0),this.input=t,this.prec=null!==(r=n.prec)&&void 0!==r?r:0,this.fmt=n.sigFigs?et:$e,this.changed=null!==(a=n.changed)&&void 0!==a?a:function(){},this.set=n.set,this.min=null!==(o=n.min)&&void 0!==o?o:0,Ne.bind(t,"change",(function(){s.inputChanged()}))}return d(e,[{key:"inputChanged",value:function(){var e=this.changed;e&&e(this.value())}},{key:"setValue",value:function(e){this.input.value=String(e),e=this.value(),this.set&&this.set(e,this.input.value)}},{key:"value",value:function(){var e=this.input,t=this.min,n=this.prec,r=a((0,this.fmt)(Math.max(tt(e.value,null!=t?t:0),null!=t?t:0),null!=n?n:0),2),o=r[0],s=r[1];return e.value=s,o}}]),e}(),Je=function(e){g(a,e);var t,n,r=(t=a,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,r=b(t);if(n){var a=b(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function a(e,t){var n,o;i(this,a),h(v(o=r.call(this,Ne.safeSelector(e,"input"),t)),"inc",void 0),h(v(o),"opts",void 0),o.opts=t,o.inc=null!==(n=t.inc)&&void 0!==n?n:1;var s=Ne.safeSelector(e,".ico-arrowup"),c=Ne.safeSelector(e,".ico-arrowdown");return Ne.bind(s,"click",(function(){o.increment(1)})),Ne.bind(c,"click",(function(){o.increment(-1)})),o}return d(a,[{key:"setIncrementAndMinimum",value:function(e,t){this.inc=e,this.min=t}},{key:"increment",value:function(e){var t=this.inc,n=this.min;this.input.value=String(Math.max(this.value()+e*t,n)),this.inputChanged()}}]),a}(Ye),Ze=function(){function e(t,n){var r=this;i(this,e),h(this,"track",void 0),h(this,"ball",void 0),h(this,"r",void 0),h(this,"changed",void 0),this.changed=n,this.r=0;var a=document.createElement("div");a.dataset.tmpl="color",t.appendChild(a);var o=this.track=document.createElement("div");o.dataset.tmpl="track",a.appendChild(o);var s=this.ball=document.createElement("div");s.dataset.tmpl="ball",o.appendChild(s),Ne.bind(t,"mousedown",(function(e){if(0===e.button){e.preventDefault(),e.stopPropagation();var t=e.pageX,n=o.clientWidth,a=r.r*n,i=function(e){e.preventDefault();var o=function(e){return Math.max(Math.min(a+(e.pageX-t),n),0)}(e);r.r=o/n,s.style.left="".concat(100*r.r,"%"),r.changed(r.r)};Ne.bind(document,"mousemove",i),Ne.bind(document,"mouseup",(function e(t){i(t),Ne.unbind(document,"mousemove",i),Ne.unbind(document,"mouseup",e)}))}})),Ne.bind(t,"click",(function(e){if(0===e.button){var t=e.pageX,n=Ne.layoutMetrics(o);r.r=nt((t-n.bodyLeft)/n.width,0,1),s.style.left="".concat(r.r*n.width,"px"),r.changed(r.r)}}))}return d(e,[{key:"setValue",value:function(e){this.r=nt(e,0,1),this.ball.style.left="".concat(100*this.r,"%")}}]),e}();function $e(e,t){var n=Math.pow(10,null!=t?t:0),r=(e=Math.round(e*n)/n).toFixed(t);if(t>0){for(;r.endsWith("0");)r=r.substring(0,r.length-1);r.endsWith(".")&&(r=r.substring(0,r.length-1))}return[e,r]}function et(e,t){var n=Math.floor(Math.log10(Math.abs(e)));return n>=3?[Math.round(e),e.toFixed(0)]:$e(e,Math.min(4-n,t))}function tt(e,t){var n=parseFloat((null!=e?e:"").replace(/,/g,""));return isNaN(n)?null!=t?t:0:n}function nt(e,t,n){return e<t?t:e>n?n:e}function rt(e,t,n,r){return at.apply(this,arguments)}function at(){return(at=s(f().mark((function e(t,n,r,a){var o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,navigator.clipboard.writeText(t);case 3:e.next=8;break;case 5:e.prev=5,e.t0=e.catch(0),console.error("Unable to copy: ",e.t0);case 8:o=n.style.color,s=r.style.color,n.style.color=a,r.style.color=a,setTimeout((function(){n.style.color=o,r.style.color=s}),350);case 13:case"end":return e.stop()}}),e,null,[[0,5]])})))).apply(this,arguments)}var ot,st,it,ct,lt=function(){function e(){i(this,e)}return d(e,[{key:"unload",value:function(){}}]),e}(),ut=function(e){return e[e.Disconnected=0]="Disconnected",e[e.Connected=1]="Connected",e[e.InvalidCert=2]="InvalidCert",e}({}),dt=function(e){return e[e.Approved=0]="Approved",e[e.Pending=1]="Pending",e[e.NotApproved=2]="NotApproved",e}({}),ht=function(e){return e[e.WalletDefault=0]="WalletDefault",e[e.UserAdded=1]="UserAdded",e[e.Discovered=2]="Discovered",e}({}),pt=2147483647;function ft(){return ot}function vt(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=b(e);if(t){var a=b(this).constructor;n=Reflect.construct(r,arguments,a)}else n=r.apply(this,arguments);return y(this,n)}}function mt(e){var t=[e.booleanOptTmpl,e.rangeOptTmpl,e.orderOptTmpl];it=t[0],ct=t[1],st=t[2]}var gt=new Intl.NumberFormat(Ne.languages(),{minimumSignificantDigits:3,maximumSignificantDigits:3}),yt=d((function e(t,n,r){var a=this;i(this,e),h(this,"opt",void 0),h(this,"node",void 0),h(this,"tmpl",void 0),h(this,"on",void 0),this.opt=t;var o=this.node=st.cloneNode(!0),s=this.tmpl=Ne.parseTemplate(o);s.optName.textContent=t.displayname,s.tooltip.dataset.tooltip=t.description,n?s.chainIcon.src=Ne.logoPath(n):Ne.hide(s.chainIcon),this.on=!1,Ne.bind(o,"click",(function(){a.on||(a.on=!0,o.classList.add("selected"),r.enable())})),Ne.bind(s.toggle,"click",(function(e){a.on&&(e.stopPropagation(),a.on=!1,o.classList.remove("selected"),r.disable())}))})),bt=function(e){g(n,e);var t=vt(n);function n(e,r,a,o){var s;if(i(this,n),h(v(s=t.call(this,e,r,{enable:function(){return s.enable()},disable:function(){return s.disable()}})),"control",void 0),h(v(s),"changed",void 0),h(v(s),"dict",void 0),s.dict=a,s.changed=function(){return o()},void 0===e.boolean)throw Error("not a boolean opt");var c=e.boolean,l=s.control=it.cloneNode(!0);return s.tmpl.controls.appendChild(l),Ne.parseTemplate(l).reason.textContent=c.reason,s.on=void 0!==a[e.key]?a[e.key]:e.default,s.on&&s.node.classList.add("selected"),s}return d(n,[{key:"store",value:function(){this.on===this.opt.default?delete this.dict[this.opt.key]:this.dict[this.opt.key]=this.on,this.changed()}},{key:"enable",value:function(){this.store()}},{key:"disable",value:function(){this.store()}}]),n}(yt),xt=function(e){g(n,e);var t=vt(n);function n(e,r,a,o){var s;if(i(this,n),h(v(s=t.call(this,e,r,{enable:function(){return s.enable()},disable:function(){return s.disable()}})),"handler",void 0),h(v(s),"x",void 0),h(v(s),"changed",void 0),h(v(s),"dict",void 0),s.dict=a,s.changed=o,void 0===e.xyRange)throw Error("not an xy range opt");var c=e.xyRange,l=a[e.key];return s.on=void 0!==l,s.on?(s.node.classList.add("selected"),s.x=l):s.x=e.default,s.handler=new kt(c,s.x,{changed:o,selected:function(){s.node.classList.add("selected")},settingsDict:a,settingsKey:e.key}),s.tmpl.controls.appendChild(s.handler.control),s}return d(n,[{key:"enable",value:function(){this.dict[this.opt.key]=this.x,this.changed()}},{key:"disable",value:function(){delete this.dict[this.opt.key],this.changed()}},{key:"setValue",value:function(e){this.handler.setValue(e),this.on=!0,this.node.classList.add("selected")}}]),n}(yt),kt=function(){function e(t,n,r){var a,o,s,c,l=this;i(this,e),h(this,"control",void 0),h(this,"range",void 0),h(this,"tmpl",void 0),h(this,"initVal",void 0),h(this,"settingsDict",void 0),h(this,"settingsKey",void 0),h(this,"x",void 0),h(this,"scrollingX",void 0),h(this,"y",void 0),h(this,"r",void 0),h(this,"roundX",void 0),h(this,"roundY",void 0),h(this,"disabled",void 0),h(this,"updated",void 0),h(this,"changed",void 0),h(this,"selected",void 0),h(this,"convert",void 0);var u=this.control=ct.cloneNode(!0),d=this.tmpl=Ne.parseTemplate(u);d.rangeLblStart.textContent=t.start.label,d.rangeLblEnd.textContent=t.end.label,d.xUnit.textContent=t.xUnit,d.yUnit.textContent=t.yUnit,this.range=t,this.initVal=n,this.settingsDict=r.settingsDict,this.settingsKey=null!==(a=r.settingsKey)&&void 0!==a?a:"",this.roundX=Boolean(r.roundX),this.roundY=Boolean(r.roundY),this.setDisabled(Boolean(r.disabled)),this.changed=null!==(o=r.changed)&&void 0!==o?o:function(){},this.selected=null!==(s=r.selected)&&void 0!==s?s:function(){},this.updated=null!==(c=r.updated)&&void 0!==c?c:function(){},this.convert=r.convert||function(e){return e};var p=d.slider,f=d.handle,v=t.end.x-t.start.x,m=t.end.y-t.start.y,g=function(e){return(e-t.start.x)/v};this.r=g(n),this.scrollingX=this.x=n,this.y=this.r*m+t.start.y,this.accept(this.scrollingX,{skipUpdate:!0});var y=function e(n){if(!l.disabled&&("change"===n.type||n.target!==d.xInput)){var r=d.xInput.value;if(r){var a=parseFloat(r);isNaN(a)||(l.scrollingX=wt(a,t.start.x,t.end.x),l.r=g(l.scrollingX),l.y=l.r*m+t.start.y,l.accept(l.scrollingX))}Ne.hide(d.xInput),Ne.show(d.x),Ne.unbind(document,"click",e),l.changed()}};Ne.bind(d.x,"click",(function(e){l.disabled||(Ne.hide(d.x),Ne.show(d.xInput),d.xInput.focus(),d.xInput.value=gt.format(l.scrollingX),Ne.bind(document,"click",y),e.stopPropagation())})),Ne.bind(d.xInput,"change",y);var b=function e(n){if(!l.disabled&&("change"===n.type||n.target!==d.yInput)){var r=d.yInput.value;if(r){var a=parseFloat(r);isNaN(a)||(l.y=wt(a,t.start.y,t.end.y),l.r=(l.y-t.start.y)/m,l.scrollingX=t.start.x+l.r*v,l.accept(l.scrollingX))}Ne.hide(d.yInput),Ne.show(d.y),Ne.unbind(document,"click",e),l.changed()}};Ne.bind(d.y,"click",(function(e){l.disabled||(Ne.hide(d.y),Ne.show(d.yInput),d.yInput.focus(),d.yInput.value=gt.format(l.y),Ne.bind(document,"click",b),e.stopPropagation())})),Ne.bind(d.yInput,"change",b),Ne.bind(f,"mousedown",(function(e){if(!l.disabled&&0===e.button){e.preventDefault(),e.stopPropagation(),l.selected();var n=e.pageX,r=p.clientWidth-f.offsetWidth,a=g(l.scrollingX)*r,o=function(e,o){e.preventDefault(),l.r=function(e){return Math.max(Math.min(a+(e.pageX-n),r),0)}(e)/r,l.scrollingX=l.r*v+t.start.x,l.y=l.r*m+t.start.y,l.accept(l.scrollingX,{skipChange:!o})};Ne.bind(document,"mousemove",o),Ne.bind(document,"mouseup",(function e(t){o(t,!0),Ne.unbind(document,"mousemove",o),Ne.unbind(document,"mouseup",e),l.changed()}))}})),Ne.bind(d.sliderBox,"click",(function(e){if(!l.disabled&&0===e.button){var n=e.pageX,r=Ne.layoutMetrics(d.slider);l.r=wt((n-r.bodyLeft)/r.width,0,1),l.scrollingX=l.r*v+t.start.x,l.y=l.r*m+t.start.y,l.accept(l.scrollingX)}}))}return d(e,[{key:"setDisabled",value:function(e){this.control.classList.toggle("disabled",e),this.disabled=e}},{key:"setXLabel",value:function(e){this.tmpl.x.textContent=e}},{key:"setYLabel",value:function(e){this.tmpl.y.textContent=e}},{key:"accept",value:function(e,t){var n,r=this.tmpl;this.roundX&&(e=Math.round(e)),this.roundY&&(this.y=Math.round(this.y)),r.x.textContent=gt.format(e),r.y.textContent=gt.format(this.y),this.roundY&&(r.y.textContent="".concat(this.y));var a=wt(this.r,0,1);r.handle.style.left="calc(".concat(100*a,"% - ").concat(14*a,"px)"),this.x=e,this.scrollingX=e,t=null!==(n=t)&&void 0!==n?n:{},this.settingsDict&&(this.settingsDict[this.settingsKey]=this.convert(this.x,this.y)),t.skipUpdate||(this.updated(e,this.y),t.skipChange||this.changed())}},{key:"setValue",value:function(e,t){var n=this.range;this.r=(e-n.start.x)/(n.end.x-n.start.x),this.y=n.start.y+this.r*(n.end.y-n.start.y),this.accept(e,{skipUpdate:t})}},{key:"modified",value:function(){return this.x!==this.initVal}},{key:"reset",value:function(){this.setValue(this.initVal,!0)}}]),e}(),wt=function(e,t,n){return e<t?t:e>n?n:e};function Ct(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return St(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?St(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function St(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var Ft=1e8;function Tt(e){var t=e.sell?B:E,n=document.documentElement.lang.toLowerCase();return ke(t).toLocaleLowerCase(n)}function Dt(e){return 1===e.type?0===e.tif?ke("LIMIT_ORDER_IMMEDIATE_TIF"):ke(X):ke(K)}function It(e){return 2===e.type&&!e.sell}function At(e){if(!e.matches)return!1;var t,n=Ct(e.matches);try{for(n.s();!(t=n.n()).done;)if(t.value.active)return!0}catch(e){n.e(e)}finally{n.f()}return!1}function Rt(e){if(!e.id)return ke("ORDER_SUBMITTING");var t=At(e);switch(e.status){case 0:return ke(W);case 1:return ke("EPOCH");case 2:return e.cancelling?ke(q):t?"".concat(ke(M),"/").concat(ke(V)):ke(M);case 3:return t?ke(V):0===e.filled&&3!==e.type?ke("NO_MATCH"):ke(O);case 4:return t?"".concat(ke(U),"/").concat(ke(V)):ke(U);case 5:return t?"".concat(ke(_),"/").concat(ke(V)):ke(_)}return ke(W)}function Et(e){if(!e.matches)return 0;var t=It(e)?function(e){return e.qty*e.rate/Ft}:function(e){return e.qty};return e.matches.reduce((function(e,n){return n.isCancel?e:e+t(n)}),0)}function Bt(e){if(!e.matches)return 0;var t=It(e)?function(e){return e.qty*e.rate/Ft}:function(e){return e.qty};return e.matches.reduce((function(e,n){return n.isCancel?e:0===n.side&&n.status>=3||1===n.side&&n.status>=4?e+t(n):e}),0)}function Pt(e){var t;if(null===(t=e.matches)||void 0===t||!t.length)return ke(K);var n=Ne.formatCoinValue(ft().conventionalRate(e.baseID,e.quoteID,Lt(e)));return e.matches.length>1&&(n="~ "+n),n}function Lt(e){var t;if(null===(t=e.matches)||void 0===t||!t.length)return 0;var n,r=0,a=0,o=Ct(e.matches);try{for(o.s();!(n=o.n()).done;){var s=n.value;a+=s.qty,r+=s.rate*s.qty}}catch(e){o.e(e)}finally{o.f()}return r/a}function Ot(e,t){return e*t/Ft}function Mt(e){return ke("MATCH_STATUS_REVOKED",{status:ke(e)})}function qt(e){return 1===e.type&&1===e.tif&&e.status<3}function Nt(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=b(e);if(t){var a=b(this).constructor;n=Reflect.construct(r,arguments,a)}else n=r.apply(this,arguments);return y(this,n)}}function Wt(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Vt(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Vt(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){throw e})),f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){i=!0,o=e})),f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function Vt(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var Ut=Ne.bind,_t=2*Math.PI,jt=String.fromCharCode(59914),Ht=String.fromCharCode(59915),zt={body:"#0b2031",axisLabel:"#b1b1b1",gridBorder:"#383f4b",gridLines:"#383f4b",gapLine:"#6b6b6b",value:"#9a9a9a",zoom:"#5b5b5b",zoomHover:"#aaa",sellLine:"#ae3333",buyLine:"#05a35a",sellFill:"#591a1a",buyFill:"#02572f",crosshairs:"#888",legendFill:"black",legendText:"#d5d5d5"},Gt={body:"#f4f4f4",axisLabel:"#1b1b1b",gridBorder:"#ddd",gridLines:"#ddd",gapLine:"#595959",value:"#4d4d4d",zoom:"#777",zoomHover:"#333",sellLine:"#99302b",buyLine:"#207a46",sellFill:"#bd5959",buyFill:"#4cad75",crosshairs:"#595959",legendFill:"#e6e6e6",legendText:"#1b1b1b"},Xt=function(){function e(t,n){var r=this;i(this,e),h(this,"parent",void 0),h(this,"report",void 0),h(this,"theme",void 0),h(this,"canvas",void 0),h(this,"visible",void 0),h(this,"renderScheduled",void 0),h(this,"ctx",void 0),h(this,"mousePos",void 0),h(this,"rect",void 0),h(this,"wheelLimiter",void 0),h(this,"boundResizer",void 0),h(this,"plotRegion",void 0),h(this,"xRegion",void 0),h(this,"yRegion",void 0),h(this,"dataExtents",void 0),h(this,"unattachers",void 0),this.parent=t,this.report=n,this.theme=k.isDark()?zt:Gt,this.canvas=document.createElement("canvas"),this.visible=!0,t.appendChild(this.canvas);var a=this.canvas.getContext("2d");if(a){this.ctx=a,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.mousePos=null,Ut(this.canvas,"mousemove",(function(e){r.rect&&(r.mousePos={x:e.clientX-r.rect.left,y:e.clientY-r.rect.y},r.draw())})),Ut(this.canvas,"mouseleave",(function(){r.mousePos=null,r.draw()})),new ResizeObserver((function(){return r.resize()})).observe(this.parent),this.wheelLimiter=null,Ut(this.canvas,"wheel",(function(e){r.wheel(e)}),{passive:!0}),Ut(this.canvas,"click",(function(e){r.click(e)}));var o=function(){r.visible="hidden"!==document.visibilityState,r.visible&&r.renderScheduled&&(r.renderScheduled=!1,r.draw())};Ut(document,"visibilitychange",o),this.unattachers=[function(){Ne.unbind(document,"visibilitychange",o)}]}else console.error("error getting canvas context")}return d(e,[{key:"wheeled",value:function(){var e=this;this.wheelLimiter=window.setTimeout((function(){e.wheelLimiter=null}),100)}},{key:"clear",value:function(){this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height)}},{key:"draw",value:function(){this.render()}},{key:"click",value:function(e){this.report.click(e)}},{key:"wheel",value:function(e){this.zoom(e.deltaY<0)}},{key:"resize",value:function(){var e=this;this.canvas.width=this.parent.clientWidth,this.canvas.height=this.parent.clientHeight;var t=new Jt(0,this.canvas.width,0,this.canvas.height-30),n=new Jt(0,this.canvas.width,this.canvas.height-30,this.canvas.height),r=new Jt(0,40,0,this.canvas.height-30);this.plotRegion=new Zt(this.ctx,t),this.xRegion=new Zt(this.ctx,n),this.yRegion=new Zt(this.ctx,r),window.requestAnimationFrame((function(){e.rect=e.canvas.getBoundingClientRect(),e.report.resize()}))}},{key:"zoom",value:function(e){this.wheelLimiter||this.report.zoom(e)}},{key:"unattach",value:function(){var e,t=Wt(this.unattachers);try{for(t.s();!(e=t.n()).done;)(0,e.value)()}catch(e){t.e(e)}finally{t.f()}this.unattachers=[]}},{key:"render",value:function(){console.error("child class must override render method")}},{key:"applyLabelStyle",value:function(e){this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.font="".concat(null!=e?e:"14","px 'sans', sans-serif"),this.ctx.fillStyle=this.theme.axisLabel}},{key:"plotXLabels",value:function(e,t,n,r){var a=this,o=new Jt(t,n,0,1);this.xRegion.plot(o,(function(o,s){a.applyLabelStyle();var i=(n+t)/2,c=t,l=i,u=[s.x(t),s.x(n)],d=u[0],h=u[1],p=s.y(.5);e.lbls.forEach((function(e){var t=o.measureText(e.txt),n=s.x(e.val);n-t.width/2<d||n+t.width/2>h||(o.fillText(e.txt,n,p),i>=c&&i<e.val&&(l=(c+e.val)/2),c=e.val)})),o.font="11px 'sans', sans-serif",2===r.length?(o.fillText(r[0],s.x(l),s.y(.63)),o.fillText(r[1],s.x(l),s.y(.23))):1===r.length&&o.fillText(r[0],s.x(l),p)}),!0)}},{key:"plotXGrid",value:function(e,t,n){var r=this,a=new Jt(t,n,0,1);this.plotRegion.plot(a,(function(t,n){t.lineWidth=1,t.strokeStyle=r.theme.gridLines,e.lbls.forEach((function(e){nn(t,n.x(e.val),n.y(0),n.x(e.val),n.y(1))}))}),!0)}},{key:"plotYLabels",value:function(e,t,n,r){var a=this,o=new Jt(0,1,t,n),s=function(e,t,n,r,o,s){e.save(),e.fillStyle=a.theme.body,e.beginPath(),e.roundRect?e.roundRect(t,n,r,o,s):e.rect(t,n,r,o),e.fill(),e.restore()};this.yRegion.plot(o,(function(o,i){a.applyLabelStyle(),a.ctx.textAlign="left";var c=n/2,l=0,u=c,d=i.x(0);e.lbls.forEach((function(e){var r=i.y(e.val);if(!(r<i.y(n)+3+7||r>i.y(t)-3-7)){var a=o.measureText(e.txt);s(o,d,r-7-3,a.width+6,23,3),o.fillText(e.txt,d+3,r+2),c>=l&&c<e.val&&(u=(l+e.val)/2),l=e.val}}));var h=o.measureText(r),p=i.y(u);s(o,d,p-3-7,h.width+6,20,3),o.fillText(r,d+3,i.y(u))}),!0)}},{key:"plotYGrid",value:function(e,t,n,r){var a=this,o=new Jt(0,1,n,r);e.plot(o,(function(e,n){e.lineWidth=1,e.strokeStyle=a.theme.gridLines,t.lbls.forEach((function(t){nn(e,n.x(0),n.y(t.val),n.x(1),n.y(t.val))}))}),!0)}},{key:"makeYLabels",value:function(e,t,n,r){this.applyLabelStyle();var a=$t(this.ctx,e.height(),this.dataExtents.y.min,this.dataExtents.y.max,50,t,n,r),o=(a.widest||0)+20;return this.yRegion.extents.x.max=o,this.yRegion.extents.y.max=e.extents.y.max,a}},{key:"line",value:function(e,t,n,r,a){nn(this.ctx,e,t,n,r,a)}},{key:"dot",value:function(e,t,n,r){rn(this.ctx,e,t,n,r)}}]),e}(),Kt=function(e){g(n,e);var t=Nt(n);function n(e,r,a){var o;return i(this,n),h(v(o=t.call(this,e,{resize:function(){return o.resized()},click:function(e){return o.clicked(e)},zoom:function(e){return o.zoomed(e)}})),"reporters",void 0),h(v(o),"book",void 0),h(v(o),"zoomLevel",void 0),h(v(o),"lotSize",void 0),h(v(o),"conventionalRateStep",void 0),h(v(o),"lines",void 0),h(v(o),"markers",void 0),h(v(o),"zoomInBttn",void 0),h(v(o),"zoomOutBttn",void 0),h(v(o),"baseUnit",void 0),h(v(o),"quoteUnit",void 0),o.reporters=r,o.zoomLevel=a,o.lines=[],o.markers={buys:[],sells:[]},o.setZoomBttns(),o.resize(),o}return d(n,[{key:"setZoomBttns",value:function(){this.zoomInBttn=new Zt(this.ctx,new Jt(0,0,0,0)),this.zoomOutBttn=new Zt(this.ctx,new Jt(0,0,0,0))}},{key:"resized",value:function(){this.setZoomBttns(),this.book&&this.draw()}},{key:"zoomed",value:function(e){this.zoomLevel&&this.book.buys&&this.book.sells&&(this.wheeled(),this.zoomLevel*=e?2/3:1.5,this.zoomLevel=nt(this.zoomLevel,.005,2),this.draw(),this.reporters.zoom(this.zoomLevel))}},{key:"clicked",value:function(e){if(this.dataExtents){var t=e.clientX-this.rect.left,n=e.clientY-this.rect.y;if(this.zoomInBttn.contains(t,n))this.zoom(!0);else if(this.zoomOutBttn.contains(t,n))this.zoom(!1);else{var r=this.plotRegion.translator(this.dataExtents);this.reporters.click(r.unx(t))}}}},{key:"set",value:function(e,t,n,r,o){if(this.book=e,this.lotSize=t/r.conventional.conversionFactor,this.conventionalRateStep=Ne.conventionalRateStep(n,r,o),this.baseUnit=r.conventional.unit,this.quoteUnit=o.conventional.unit,!this.zoomLevel){var s=a(this.gap(),2),i=s[0],c=s[1],l=Math.max(c/i*5,.05);this.zoomLevel=Math.min(l,2)}this.draw()}},{key:"render",value:function(){var e=this;if(this.book&&this.visible&&0!==this.canvas.width){this.clear();var t=this.ctx,n=this.mousePos,o=this.book.buys,s=this.book.sells,i=a(this.gap(),2),c=i[0],l=i[1],u=this.zoomLevel*c/2,d=c+u,h=c-u,p=r(this.markers.buys),f=r(this.markers.sells);p.sort((function(e,t){return t.rate-e.rate})),f.sort((function(e,t){return e.rate-t.rate}));for(var v=[],m=[],g=[],y=[],b=[],x={buyBase:0,buyQuote:0,sellBase:0,sellQuote:0},k=0,w=0,C=0;C<o.length;C++){var S=o[C];if(w+=S.qty,S.rate>=h&&g.push([S.rate,w]),!S.epoch)for(k+=S.qty,m.push([S.rate,k]),x.buyBase+=S.qty,x.buyQuote+=S.qty*S.rate;p.length&&an(p[0].rate,S.rate);){var F=p.shift();F&&v.push({rate:F.rate,qty:S.epoch?w:k,sell:S.sell,active:F.active})}}var T=m.length?tn(m)[1]:0;m.push([h,T]);var D=g.length?tn(g)[1]:0;g.push([h,D]),w=k=0;for(var I=0;I<s.length;I++){var A=s[I];if(w+=A.qty,A.rate<=d&&b.push([A.rate,w]),!A.epoch)for(k+=A.qty,y.push([A.rate,k]),x.sellBase+=A.qty,x.sellQuote+=A.qty*A.rate;f.length&&an(f[0].rate,A.rate);){var R=f.shift();R&&v.push({rate:R.rate,qty:A.epoch?w:k,sell:A.sell,active:R.active})}}var E=y.length?tn(y)[1]:0;y.push([d,E]);var B=b.length?tn(b)[1]:0;b.push([d,B]);var P=this.xRegion.extents.y.min,L=(P+40)/P,O=(B&&D?Math.max(D,B):B||D||1)*L,M=new Jt(h,d,0,O);this.dataExtents=M;var q=null,N=$t(t,this.plotRegion.width(),M.x.min,M.x.max,100,this.conventionalRateStep,"");this.plotXGrid(N,h,d);var W=this.makeYLabels(this.plotRegion,this.lotSize,this.baseUnit);this.plotYGrid(this.plotRegion,W,this.dataExtents.y.min,this.dataExtents.y.max),this.plotRegion.plot(M,(function(t,r){t.lineWidth=1,t.strokeStyle=e.theme.gridBorder,t.lineWidth=2.5,t.strokeStyle=e.theme.gapLine,nn(t,r.x(c),r.y(0),r.x(c),r.y(.3*M.y.max)),t.font="30px 'demi-sans', sans-serif",t.textAlign="center",t.textBaseline="middle",t.fillStyle=e.theme.value;var a=.5*M.y.max;t.fillText(Ne.formatFourSigFigs(c),r.x(c),r.y(a)),t.font="12px 'sans', sans-serif",t.fillText("".concat((l/c*100).toFixed(2),"% spread"),r.x(c),r.y(a)+24),t.textAlign="center",t.textBaseline="middle";var o=e.plotRegion.extents.midX,s=r.y(.9*O),i=M.xRange/c*100,u="".concat(i.toFixed(1),"%"),p=t.measureText(u).width;t.font="13px 'sans', sans-serif",t.fillText(u,o,s+1);var f=o-p/2-10-20,g=s-10;e.zoomOutBttn.setExtents(f,f+20,g,g+20);var b=n&&e.zoomOutBttn.contains(n.x,n.y);e.zoomOutBttn.plot(new Jt(0,1,0,1),(function(t){t.font="12px 'icomoon'",t.fillStyle=e.theme.zoom,b&&(t.fillStyle=e.theme.zoomHover,t.font="13px 'icomoon'"),t.fillText(Ht,e.zoomOutBttn.extents.midX,e.zoomOutBttn.extents.midY)})),f=o+p/2+10,e.zoomInBttn.setExtents(f,f+20,g,g+20),b=n&&e.zoomInBttn.contains(n.x,n.y),e.zoomInBttn.plot(new Jt(0,1,0,1),(function(t){t.font="12px 'icomoon'",t.fillStyle=e.theme.zoom,b&&(t.fillStyle=e.theme.zoomHover,t.font="14px 'icomoon'"),t.fillText(jt,e.zoomInBttn.extents.midX,e.zoomInBttn.extents.midY)}));for(var x=.005*(d-h),k=[],w=0,C=v||[];w<C.length;w++){var S=C[w],F=n&&on(S.rate,r.unx(n.x),x);F&&k.push(S.rate),t.save(),t.lineWidth=F||S.active?5:3,t.strokeStyle=S.sell?e.theme.sellLine:e.theme.buyLine,t.fillStyle=S.sell?e.theme.sellFill:e.theme.buyFill;var T=F||S.active?10:8;t.beginPath();var D={x:r.x(S.rate),y:r.y(S.qty)-8},I=D.y-Math.sqrt(3)*T/2;t.moveTo(D.x,D.y),t.lineTo(D.x-T/2,I),t.lineTo(D.x+T/2,I),t.closePath(),t.stroke(),t.fill(),t.restore()}if(n&&e.plotRegion.contains(n.x,n.y)){var A=r.unx(n.x),R=y,E=function(e){return e>=A},B=e.theme.sellLine;A<c&&(R=m,E=function(e){return e<=A},B=e.theme.buyLine);for(var P,L,N=R[0],W=0;W<R.length;W++){var V=R[W];if(E(V[0]))break;N=V}P=A,L=e.theme.crosshairs,P>d||P<h||(t.save(),t.setLineDash([3,5]),t.lineWidth=1.5,t.strokeStyle=L,nn(t,r.x(P),r.y(0),r.x(P),r.y(O)),t.restore()),q={rate:A,depth:N[1],dotColor:B,hoverMarkers:k}}})),t.lineWidth=1.5,t.setLineDash([3,3]),t.fillStyle=this.theme.sellFill,t.strokeStyle=this.theme.sellLine,this.drawDepth(b),t.fillStyle=this.theme.buyFill,t.strokeStyle=this.theme.buyLine,this.drawDepth(g),t.lineWidth=2.5,t.setLineDash([]),t.fillStyle=this.theme.sellFill,t.strokeStyle=this.theme.sellLine,this.drawDepth(y),t.fillStyle=this.theme.buyFill,t.strokeStyle=this.theme.buyLine,this.drawDepth(m),this.plotYLabels(W,this.dataExtents.y.min,this.dataExtents.y.max,this.baseUnit),this.plotXLabels(N,h,d,["".concat(this.quoteUnit,"/"),this.baseUnit]),q&&this.plotRegion.plot(M,(function(e,t){q&&rn(e,t.x(q.rate),t.y(q.depth),q.dotColor,5)})),this.reporters.volume(x),this.reporters.mouse(q)}else this.renderScheduled=!0}},{key:"drawDepth",value:function(e){var t,n=e[0];this.plotRegion.plot(this.dataExtents,(function(r,a){var o=a.y(0),s=a.y(n[1]);r.beginPath(),r.moveTo(a.x(n[0]),a.y(n[1]));for(var i=0;i<e.length;i++)t=a.x(e[i][0]),r.lineTo(t,s),s=a.y(e[i][1]),r.lineTo(t,s);r.stroke(),r.lineTo(t,o),r.lineTo(a.x(n[0]),o),r.closePath(),r.globalAlpha=.25,r.fill()}))}},{key:"gap",value:function(){var e=[this.book.bestGapBuy(),this.book.bestGapSell()],t=e[0],n=e[1];return t?n?[(n.rate+t.rate)/2,n.rate-t.rate]:[t.rate,0]:n?[n.rate,0]:[1,0]}},{key:"setLines",value:function(e){this.lines=e}},{key:"setMarkers",value:function(e){this.markers=e}}]),n}(Xt),Qt=function(e){g(n,e);var t=Nt(n);function n(e,r){var a;return i(this,n),h(v(a=t.call(this,e,{resize:function(){return a.resized()},click:function(){a.clicked()},zoom:function(e){return a.zoomed(e)}})),"reporters",void 0),h(v(a),"data",void 0),h(v(a),"zoomLevel",void 0),h(v(a),"numToShow",void 0),h(v(a),"candleRegion",void 0),h(v(a),"volumeRegion",void 0),h(v(a),"resizeTimer",void 0),h(v(a),"zoomLevels",void 0),h(v(a),"market",void 0),h(v(a),"rateConversionFactor",void 0),a.reporters=r,a.zoomLevel=1,a.numToShow=100,a.resize(),a}return d(n,[{key:"resized",value:function(){var e=this,t=this.plotRegion.extents,n=new Jt(t.x.min,t.x.max,t.y.min,t.y.min+.85*t.yRange);this.candleRegion=new Zt(this.ctx,n);var r=new Jt(t.x.min,t.x.max,t.y.min+.85*t.yRange,t.y.max);this.volumeRegion=new Zt(this.ctx,r),this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=window.setTimeout((function(){return e.draw()}),100)}},{key:"clicked",value:function(){}},{key:"zoomed",value:function(e){var t=this.zoomLevels.indexOf(this.numToShow);if(e){if(0===t)return;this.numToShow=this.zoomLevels[t-1]}else{if(this.zoomLevels.length<=t+1||this.numToShow>this.data.candles.length)return;this.numToShow=this.zoomLevels[t+1]}this.draw()}},{key:"render",value:function(){var e,t=this,n=this.data;if(n&&this.visible&&0!==this.canvas.width){var r=n.ms,a=this.mousePos,o=n.candles||[],s=Math.min(this.numToShow,o.length),i=o.slice(o.length-s);if(this.clear(),0!==s){var c,l=function(e){return sn(e.endStamp,r)},u=function(e){return l(e)+r},d=function(e){return l(e)+.2*r},h=.6*r,p=i[0],f=i[s-1],v=[p.highRate,p.lowRate,p.matchVolume],m=v[0],g=v[1],y=v[2],b=Wt(i);try{for(b.s();!(c=b.n()).done;){var x=c.value;x.highRate>m&&(m=x.highRate),x.lowRate<g&&(g=x.lowRate),x.matchVolume>y&&(y=x.matchVolume)}}catch(e){b.e(e)}finally{b.f()}m+=.1*(m-g);var k=l(p),w=u(f);w+=.05*(w-k);var C=this.market.ratestep,S=new Jt(k,w,g,m);g===m&&(S.y.min-=C,S.y.max+=C),this.dataExtents=S;var F=null;a&&this.plotRegion.plot(new Jt(S.x.min,S.x.max,0,1),(function(e,n){var o,s=sn(n.unx(a.x),r),c=Wt(i);try{for(c.s();!(o=c.n()).done;){var u=o.value;if(l(u)===s){F=u,e.fillStyle=t.theme.gridLines,e.fillRect(n.x(l(u)),n.y(0),n.w(r),n.h(1));break}}}catch(e){c.e(e)}finally{c.f()}}));var T=this.rateConversionFactor,D=(null===(e=ft().assets[this.market.baseid])||void 0===e?void 0:e.unitInfo.conventional.unit)||this.market.basesymbol.toUpperCase(),I=function(e,t,n){var r=e[0],a=e[e.length-1],o=sn(r.endStamp,t),s=sn(a.endStamp,t)+t,i=s-o,c=Math.min(e.length,n/100),l=sn(i/c,t);if(0===l)return console.error("zero tick",t,i,c),{lbls:[]};var u=o,d=(new Date).getTimezoneOffset(),h=function(e){return(e-=6e4*d)-e%864e5},p=h(o),f=0;h(r.endStamp)===h(a.endStamp)&&(p=0);var v,m=[];for(v=t<864e5?function(e,t){return h(t)!==p?"".concat(en[e.getMonth()]).concat(e.getDate()," ").concat(e.getHours(),":").concat(String(e.getMinutes()).padStart(2,"0")):"".concat(e.getHours(),":").concat(String(e.getMinutes()).padStart(2,"0"))}:function(e){var t=e.getFullYear();return t!==f?"".concat(en[e.getMonth()]).concat(e.getDate()," '").concat(String(t).slice(2,4)):"".concat(en[e.getMonth()]).concat(e.getDate())};u<=s;){var g=new Date(u);m.push({val:u,txt:v(g,u)}),p=h(u),f=g.getFullYear(),u+=l}return{lbls:m}}(i,r,this.plotRegion.width());this.plotXGrid(I,k,w);var A=this.makeYLabels(this.candleRegion,C,D,(function(e){return Ne.formatFourSigFigs(e/T)}));this.plotYGrid(this.candleRegion,A,this.dataExtents.y.min,this.dataExtents.y.max);var R=new Jt(k,w,0,y);if(this.volumeRegion.plot(R,(function(e,n){e.fillStyle=t.theme.gridBorder;var r,a=Wt(i);try{for(a.s();!(r=a.n()).done;){var o=r.value;e.fillRect(n.x(d(o)),n.y(0),n.w(h),n.h(o.matchVolume))}}catch(e){a.e(e)}finally{a.f()}})),this.candleRegion.plot(S,(function(e,n){e.lineWidth=1;var r,a=Wt(i);try{for(a.s();!(r=a.n()).done;){var o=r.value,s=o.startRate>o.endRate,c=[n.x(d(o)),n.y(o.startRate),n.w(h),n.h(o.endRate-o.startRate)],l=c[0],u=c[1],p=c[2],f=c[3],v=[n.y(o.highRate),n.y(o.lowRate),p/2+l],m=v[0],g=v[1],y=v[2];e.strokeStyle=s?t.theme.sellLine:t.theme.buyLine,e.fillStyle=s?t.theme.sellFill:t.theme.buyFill,e.beginPath(),e.moveTo(y,m),e.lineTo(y,g),e.stroke(),e.fillRect(l,u,p,f),e.strokeRect(l,u,p,f)}}catch(e){a.e(e)}finally{a.f()}})),this.plotXLabels(I,k,w,[]),this.plotYLabels(A,this.dataExtents.y.min,this.dataExtents.y.max,D),F){var E=this.xRegion.extents.y;this.xRegion.plot(new Jt(S.x.min,S.x.max,E.min,E.max),(function(e,n){if(F){t.applyLabelStyle();var r="".concat(new Date(l(F)).toLocaleString()," - ").concat(new Date(u(F)).toLocaleString()),a=e.measureText(r).width+50,o=n.x((l(F)+u(F))/2),s=o-a/2,i=t.xRegion.extents.x;s<i.min?s=i.min:s+a>i.max&&(s=i.max-a),o=s+a/2;var c=E.min+(t.xRegion.height()-16)/2;e.fillStyle=t.theme.legendFill,e.strokeStyle=t.theme.gridBorder;var d=[s-25,c-2,a+50,20];e.fillRect.apply(e,d),e.strokeRect.apply(e,d),t.applyLabelStyle(),e.fillText(r,o,t.xRegion.extents.midY,a)}}))}this.reporters.mouse(F)}}else this.renderScheduled=!0}},{key:"setCandles",value:function(e,t,n,r){if(this.data=e,e.candles){this.market=t;var a=[r.conventional.conversionFactor,n.conventional.conversionFactor],o=a[0],s=a[1];this.rateConversionFactor=Ft*o/s;var i=25;this.zoomLevels=[];for(var c=Math.max(e.candles.length,1e3);i<c;)this.zoomLevels.push(i),i*=2;this.numToShow=100,this.draw()}}}]),n}(Xt),Yt=function(e){g(n,e);var t=Nt(n);function n(e,r){var a;i(this,n),h(v(a=t.call(this,e,{resize:function(){return a.resized()},click:function(){},zoom:function(){}})),"ani",void 0),h(v(a),"size",void 0),h(v(a),"region",void 0),h(v(a),"colorShift",void 0),h(v(a),"opts",void 0),h(v(a),"msgRegion",void 0),h(v(a),"fontSize",void 0),a.canvas.classList.add("fill-abs"),a.canvas.style.zIndex="5",a.opts=null!=r?r:{};var o=1500*Math.random();a.colorShift=360*Math.random();var s=[1,.65,.75],c=[3,3,2],l=[Math.PI,10*Math.PI/9,Math.PI/2.5],u=[0,0,1.5*Math.PI],d=function(e,t,n){return s[e]*Math.cos(c[e]*t+l[e]*n+u[e])},p=function(e,t){var n=e*Math.PI*2;return(d(0,n,t)+d(1,n,t)+d(2,n,t))/3};return a.resize(),a.ani=new We(We.Forever,(function(){for(var e=((new Date).getTime()-o)/1500*Math.PI*2,t=[],n=0;n<75;n++)t.push(p(n/74,e));a.drawValues(t)})),a}return d(n,[{key:"resized",value:function(){var e=this.opts,t=[this.canvas.width,this.canvas.height],n=t[0],r=t[1],a=.8*n,o=.8*r;a>150&&(a=150),o>100&&(o=100);var s=(n-a)/2,i=(r-o)/2;if(e.message){this.fontSize=nt(.15*o,10,14),this.applyLabelStyle(this.fontSize);var c=.5*this.fontSize,l=this.fontSize/2+c;i-=l,this.msgRegion=new Zt(this.ctx,new Jt(0,n,i+o,i+o+2*l))}this.region=new Zt(this.ctx,new Jt(s,s+a,i,i+o))}},{key:"drawValues",value:function(e){var t=this;if(this.region){this.clear();var n=function(e){return"hsl(".concat(e,", 35%, 50%)")},r=this.region,a=this.msgRegion,o=this.canvas,s=o.width,i=o.height,c=this.opts,l=c.backgroundColor,u=c.message,d=this.colorShift,h=this.ctx;l&&(h.fillStyle=!0===l?k.isDark()?"#0a1e34":"#f0f0f0":l,h.fillRect(0,0,s,i)),r.plot(new Jt(0,1,-1,1),(function(t,r){t.lineWidth=4,t.lineCap="round";var a=d+(new Date).getTime()%2e3/2e3*360,o=t.createLinearGradient(r.x(0),0,r.x(1),0);o.addColorStop(0,n(a)),t.strokeStyle=o,t.beginPath(),t.moveTo(r.x(0),r.y(e[0]));for(var s=1;s<e.length;s++){var i=s/(e.length-1);o.addColorStop(i,n(300*i+a)),t.lineTo(r.x(i),r.y(e[s]))}t.stroke()})),u&&a.plot(new Jt(0,1,0,1),(function(e,n){t.applyLabelStyle(t.fontSize),e.fillText(u,n.x(.5),n.y(.5),t.msgRegion.width())}))}}},{key:"render",value:function(){}},{key:"stop",value:function(){this.ani.stop(),this.canvas.remove()}}]),n}(Xt),Jt=function(){function e(t,n,r,a){i(this,e),h(this,"x",void 0),h(this,"y",void 0),this.setExtents(t,n,r,a)}return d(e,[{key:"setExtents",value:function(e,t,n,r){this.x={min:e,max:t},this.y={min:n,max:r}}},{key:"xRange",get:function(){return this.x.max-this.x.min}},{key:"midX",get:function(){return(this.x.max+this.x.min)/2}},{key:"yRange",get:function(){return this.y.max-this.y.min}},{key:"midY",get:function(){return(this.y.max+this.y.min)/2}}]),e}(),Zt=function(){function e(t,n){i(this,e),h(this,"context",void 0),h(this,"extents",void 0),this.context=t,this.extents=n}return d(e,[{key:"setExtents",value:function(e,t,n,r){this.extents.setExtents(e,t,n,r)}},{key:"width",value:function(){return this.extents.xRange}},{key:"height",value:function(){return this.extents.yRange}},{key:"contains",value:function(e,t){var n=this.extents;return e<n.x.max&&e>n.x.min&&t<n.y.max&&t>n.y.min}},{key:"translator",value:function(e){var t=this.extents,n=e.x.min,r=e.y.min,a=e.yRange,o=e.xRange,s=t.x.min,i=t.x.max-s,c=t.y.max,l=c-t.y.min,u=i/o,d=l/a;return{x:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){return(e-n)*u+s})),y:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){return c-(e-r)*d})),unx:function(e){return(e-s)/u+n},uny:function(e){return r-(e-c)/d},w:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){return e/o*i})),h:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){return-e/a*l}))}}},{key:"clear",value:function(){var e=this.extents;this.context.clearRect(e.x.min,e.y.min,e.xRange,e.yRange)}},{key:"plot",value:function(e,t,n){var r=this.context,a=this.extents;r.save(),n||(r.beginPath(),r.rect(a.x.min,a.y.min,a.xRange,a.yRange),r.clip());var o=this.translator(e);t(this.context,o),r.restore()}}]),e}();function $t(e,t,n,r,a,o,s,i){i=i||Ne.formatFourSigFigs;var c=t/a,l=r-n;if(c<1||l<=0)return{lbls:[]};for(var u=l/c,d=u+o-u%o,h=n+d-n%d,p=Math.max(Math.abs(r),Math.abs(n)),f=Math.round(Math.log10(p/d))+2,v=[],m=0;h<r;){var g=i(h=Number(h.toPrecision(f)));m=Math.max(m,e.measureText(g).width),v.push({val:h,txt:g}),h+=d}var y=e.measureText(s).width;return y>m&&(m=y),{widest:m,lbls:v}}var en=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"];function tn(e){return e[e.length-1]}function nn(e,t,n,r,a,o){e.beginPath(),e.moveTo(t,n),e.lineTo(r,a),o||e.stroke()}function rn(e,t,n,r,a){e.fillStyle=r,e.beginPath(),e.arc(t,n,a,0,_t),e.fill()}function an(e,t){return on(e,t,1e-8)}function on(e,t,n){return Math.abs(e-t)<Math.abs(n)}function sn(e,t){return e-e%t}function cn(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return ln(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?ln(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function ln(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var un=function(){function e(t){i(this,e),h(this,"page",void 0),h(this,"host",void 0),this.page=Ne.parseTemplate(t),Ne.cleanTemplates(this.page.penaltyMarkerTmpl)}return d(e,[{key:"setHost",value:function(e){this.host=e}},{key:"update",value:function(){var e=this.page,t=this.host,n=ft().exchanges[t],r=n.auth,a=n.maxScore,o=n.penaltyThreshold,s=r.rep.score,i=dn(r),c=i?i*o*-1:-1*o,l=25;e.scoreWarn.style.width="".concat(l,"%");var u=s>=0?l+s/a*75:l-Math.min(l,s/c*l);e.scorePointer.style.left="".concat(u,"%"),e.scoreMin.textContent=String(c),e.scoreMax.textContent=String(a);var d=Tn(s,a);e.limitBonus.textContent=d.toFixed(1);var h,p=cn(Ne.applySelector(e.scoreTray,".penalty-marker"));try{for(p.s();!(h=p.n()).done;)h.value.remove()}catch(e){p.e(e)}finally{p.f()}if(i>1)for(var f=l/i,v=1;v<i;v++){var m=e.penaltyMarkerTmpl.cloneNode(!0);e.scoreTray.appendChild(m),m.style.left="".concat(f*v,"%")}e.score.textContent=String(s),e.scoreData.classList.remove("negative","positive"),s>0?e.scoreData.classList.add("positive"):e.scoreData.classList.add("negative")}}]),e}();function dn(e){var t=e.weakStrength,n=e.targetTier,r=e.effectiveTier;if(r>n){var a=r-n;return t>=a?n:n+(a-t)}return r}var hn,pn,fn,vn,mn,gn,yn,bn,xn,kn,wn,Cn,Sn=function(e,t,n){var r,a,o=e.qty-e.filled;if(1===e.type)return o;if(e.sell)return o*e.rate/Ft;var s=n||(null==t||null===(r=t.spot)||void 0===r?void 0:r.rate)||0;return t?s&&((null==t||null===(a=t.spot)||void 0===a?void 0:a.bookVolume)||0)>0?o*Ft/s:t.lotsize:0};function Fn(e,t,n){return 3===e.type?0:function(e,t,n){var r;if(1!==e.status)return 0;var a=Sn(e,t,n);return function(e,t){return 2===e.type||0===e.tif||0!==t&&(e.sell?e.rate<t:e.rate>t)}(e,n||(null===(r=t.spot)||void 0===r?void 0:r.rate)||0)?2*a:a}(e,t,n)+function(e){return 2!==e.status?0:Sn(e)}(e)+function(e){var t,n=0,r=cn(e.matches||[]);try{for(r.s();!(t=r.n()).done;){var a=t.value;if(0===a.side){if(a.status>3)continue}else if(a.status>2)continue;n+=a.qty}}catch(e){r.e(e)}finally{r.f()}return n}(e)}function Tn(e,t){return e>0?1+e/t*2:1}var Dn="TakerFoundMakerRedemption:";function In(e){return e.startsWith(Dn)?[e.substring(26),!0]:42===e.length?[e,!0]:[e,!1]}var An=(h(hn={},0,(function(e){var t=a(In(e),2),n=t[0];return t[1]?"https://etherscan.io/address/".concat(n):"https://etherscan.io/tx/".concat(n)})),h(hn,1,(function(e){var t=a(In(e),2),n=t[0];return t[1]?"https://sepolia.etherscan.io/address/".concat(n):"https://sepolia.etherscan.io/tx/".concat(n)})),h(hn,2,(function(e){var t=a(In(e),2),n=t[0];return t[1]?"https://etherscan.io/address/".concat(n):"https://etherscan.io/tx/".concat(n)})),hn),Rn=(h(pn={},0,(function(e){var t=a(In(e),2),n=t[0];return t[1]?"https://polygonscan.com/address/".concat(n):"https://polygonscan.com/tx/".concat(n)})),h(pn,1,(function(e){var t=a(In(e),2),n=t[0];return t[1]?"https://amoy.polygonscan.com/address/".concat(n):"https://amoy.polygonscan.com/tx/".concat(n)})),h(pn,2,(function(e){var t=a(In(e),2),n=t[0];return t[1]?"https://polygonscan.com/address/".concat(n):"https://polygonscan.com/tx/".concat(n)})),pn),En={42:(fn={},h(fn,0,(function(e){var t=a(e.split(":"),2),n=t[0],r=t[1];return void 0!==r?"https://explorer.dcrdata.org/tx/".concat(n,"/out/").concat(r):"https://explorer.dcrdata.org/tx/".concat(n)})),h(fn,1,(function(e){var t=a(e.split(":"),2),n=t[0],r=t[1];return void 0!==r?"https://testnet.dcrdata.org/tx/".concat(n,"/out/").concat(r):"https://testnet.dcrdata.org/tx/".concat(n)})),h(fn,2,(function(e){var t=a(e.split(":"),2),n=t[0],r=t[1];return void 0!==r?"http://127.0.0.1:17779/tx/".concat(n,"/out/").concat(r):"https://127.0.0.1:17779/tx/".concat(n)})),fn),0:(vn={},h(vn,0,(function(e){return"https://mempool.space/tx/".concat(e.split(":")[0])})),h(vn,1,(function(e){return"https://mempool.space/testnet/tx/".concat(e.split(":")[0])})),h(vn,2,(function(e){return"https://mempool.space/tx/".concat(e.split(":")[0])})),vn),2:(mn={},h(mn,0,(function(e){return"https://ltc.bitaps.com/".concat(e.split(":")[0])})),h(mn,1,(function(e){return"https://sochain.com/tx/LTCTEST/".concat(e.split(":")[0])})),h(mn,2,(function(e){return"https://ltc.bitaps.com/".concat(e.split(":")[0])})),mn),20:(gn={},h(gn,0,(function(e){return"https://digiexplorer.info/tx/".concat(e.split(":")[0])})),h(gn,1,(function(e){return"https://testnetexplorer.digibyteservers.io/tx/".concat(e.split(":")[0])})),h(gn,2,(function(e){return"https://digiexplorer.info/tx/".concat(e.split(":")[0])})),gn),60:An,60001:An,60002:An,3:(yn={},h(yn,0,(function(e){return"https://dogeblocks.com/tx/".concat(e.split(":")[0])})),h(yn,1,(function(e){return"https://blockexplorer.one/dogecoin/testnet/tx/".concat(e.split(":")[0])})),h(yn,2,(function(e){return"https://dogeblocks.com/tx/".concat(e.split(":")[0])})),yn),5:(bn={},h(bn,0,(function(e){return"https://blockexplorer.one/dash/mainnet/tx/".concat(e.split(":")[0])})),h(bn,1,(function(e){return"https://blockexplorer.one/dash/testnet/tx/".concat(e.split(":")[0])})),h(bn,2,(function(e){return"https://blockexplorer.one/dash/mainnet/tx/".concat(e.split(":")[0])})),bn),133:(xn={},h(xn,0,(function(e){return"https://zcashblockexplorer.com/transactions/".concat(e.split(":")[0])})),h(xn,1,(function(e){return"https://blockexplorer.one/zcash/testnet/tx/".concat(e.split(":")[0])})),h(xn,2,(function(e){return"https://zcashblockexplorer.com/transactions/".concat(e.split(":")[0])})),xn),147:(kn={},h(kn,0,(function(e){return"https://explorer.zcl.zelcore.io/tx/".concat(e.split(":")[0])})),h(kn,2,(function(e){return"https://explorer.zcl.zelcore.io/tx/".concat(e.split(":")[0])})),kn),136:(wn={},h(wn,0,(function(e){return"https://explorer.firo.org/tx/".concat(e.split(":")[0])})),h(wn,1,(function(e){return"https://testexplorer.firo.org/tx/".concat(e.split(":")[0])})),h(wn,2,(function(e){return"https://explorer.firo.org/tx/".concat(e.split(":")[0])})),wn),145:(Cn={},h(Cn,0,(function(e){return"https://bch.loping.net/tx/".concat(e.split(":")[0])})),h(Cn,1,(function(e){return"https://tbch4.loping.net/tx/".concat(e.split(":")[0])})),h(Cn,2,(function(e){return"https://bch.loping.net/tx/".concat(e.split(":")[0])})),Cn),966:Rn,966001:Rn,966002:Rn,966003:Rn,966004:Rn};function Bn(e){return e.startsWith(Dn)?ke("TAKER_FOUND_MAKER_REDEMPTION",{makerAddr:e.substring(26)}):e}function Pn(e,t){var n=ft().user.net,r=En[function(e){var t=ft().user.assets[e];return t.token?t.token.parentID:e}(e)];if(r){var a=r[n];a&&(t.classList.remove("plainlink"),t.classList.add("subtlelink"),t.href=a(t.dataset.explorerCoin||""))}}function Ln(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function On(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ln(Object(n),!0).forEach((function(t){h(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ln(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Mn(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return qn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?qn(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function qn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var Nn="multiplier",Wn="absolute",Vn="absolute-plus",Un="percent",_n="percent-plus",jn="basicMM",Hn="arbMM",zn="basicArb",Gn={Binance:{name:"Binance",logo:"/img/binance.com.png"},BinanceUS:{name:"Binance U.S.",logo:"/img/binance.us.png"}},Xn=new(function(){function e(){i(this,e),h(this,"cexBalanceCache",{})}var t,n,r,a,o,c,l,u;return d(e,[{key:"updateBotConfig",value:(u=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",S("/api/updatebotconfig",t));case 1:case"end":return e.stop()}}),e)}))),function(e){return u.apply(this,arguments)})},{key:"updateCEXConfig",value:(l=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",S("/api/updatecexconfig",t));case 1:case"end":return e.stop()}}),e)}))),function(e){return l.apply(this,arguments)})},{key:"removeBotConfig",value:(c=s(f().mark((function e(t,n,r){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",S("/api/removebotconfig",{host:t,baseID:n,quoteID:r}));case 1:case"end":return e.stop()}}),e)}))),function(e,t,n){return c.apply(this,arguments)})},{key:"report",value:(o=s(f().mark((function e(t,n,r){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",S("/api/marketreport",{host:t,baseID:n,quoteID:r}));case 1:case"end":return e.stop()}}),e)}))),function(e,t,n){return o.apply(this,arguments)})},{key:"startBot",value:(a=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/startmarketmakingbot",{config:t});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)}))),function(e){return a.apply(this,arguments)})},{key:"stopBot",value:(r=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/stopmarketmakingbot",{market:t});case 2:case"end":return e.stop()}}),e)}))),function(e){return r.apply(this,arguments)})},{key:"status",value:(n=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T("/api/marketmakingstatus");case 2:return e.abrupt("return",e.sent.status);case 3:case"end":return e.stop()}}),e)}))),function(){return n.apply(this,arguments)})},{key:"botStats",value:function(e,t,n,r){for(var a=0,o=Object.values(ft().mmStatus.bots);a<o.length;a++){var s=o[a];if(s.runStats){var i=s.runStats,c=s.config;if(c.baseID===e&&c.quoteID===t&&c.host===n&&i.startTime===r)return i}}}},{key:"cachedCexBalance",value:function(e,t){var n;return null===(n=this.cexBalanceCache[e])||void 0===n?void 0:n[t]}},{key:"cexBalance",value:(t=s(f().mark((function e(t,n){var r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.cexBalanceCache[t]||(this.cexBalanceCache[t]={}),e.next=3,S("/api/cexbalance",{cexName:t,assetID:n});case 3:return r=e.sent.cexBalance,this.cexBalanceCache[t][n]=r,e.abrupt("return",r);case 6:case"end":return e.stop()}}),e,this)}))),function(e,n){return t.apply(this,arguments)})}]),e}());function Kn(e){return ft().mmStatus.bots.reduce((function(t,n){var r,a,o,s,i,c,l,u,d,h,p,f,v,m,g,y,b,x,k,w,C=n.runStats;if(!n.running||!C)return t;var S=C.dexBalances,F=C.cexBalances;return t.cex.locked+=null!==(r=null===(a=F[e])||void 0===a?void 0:a.locked)&&void 0!==r?r:0,t.cex.locked+=null!==(o=null===(s=F[e])||void 0===s?void 0:s.reserved)&&void 0!==o?o:0,t.cex.avail+=null!==(i=null===(c=F[e])||void 0===c?void 0:c.available)&&void 0!==i?i:0,t.cex.total=t.cex.avail+t.cex.locked,t.dex.locked+=null!==(l=null===(u=S[e])||void 0===u?void 0:u.locked)&&void 0!==l?l:0,t.dex.locked+=null!==(d=null===(h=S[e])||void 0===h?void 0:h.reserved)&&void 0!==d?d:0,t.dex.avail+=null!==(p=null===(f=S[e])||void 0===f?void 0:f.available)&&void 0!==p?p:0,t.dex.total=t.dex.avail+t.dex.locked,t.avail+=(null!==(v=null===(m=S[e])||void 0===m?void 0:m.available)&&void 0!==v?v:0)+(null!==(g=null===(y=F[e])||void 0===y?void 0:y.available)&&void 0!==g?g:0),t.locked+=(null!==(b=null===(x=S[e])||void 0===x?void 0:x.locked)&&void 0!==b?b:0)+(null!==(k=null===(w=F[e])||void 0===w?void 0:w.locked)&&void 0!==k?k:0),t}),{avail:0,locked:0,cex:{avail:0,locked:0,total:0},dex:{avail:0,locked:0,total:0}})}function Qn(e,t,n,r){Ne.setText(e,"[data-host]",r);var a=ft().assets[t],o=a.unitInfo,s=a.name,i=a.symbol,c=a.token;Ne.setText(e,"[data-base-name]",s),Ne.setSrc(e,"[data-base-logo]",Ne.logoPath(i)),Ne.setText(e,"[data-base-ticker]",o.conventional.unit);var l=ft().assets[c?c.parentID:t],u=l.unitInfo,d=l.name,h=l.symbol;Ne.setText(e,"[data-base-fee-name]",d),Ne.setSrc(e,"[data-base-fee-logo]",Ne.logoPath(h)),Ne.setText(e,"[data-base-fee-ticker]",u.conventional.unit);var p=ft().assets[n],f=p.unitInfo,v=p.name,m=p.symbol,g=p.token;Ne.setText(e,"[data-quote-name]",v),Ne.setSrc(e,"[data-quote-logo]",Ne.logoPath(m)),Ne.setText(e,"[data-quote-ticker]",f.conventional.unit);var y=ft().assets[g?g.parentID:n],b=y.unitInfo,x=y.name,k=y.symbol;Ne.setText(e,"[data-quote-fee-name]",x),Ne.setSrc(e,"[data-quote-fee-logo]",Ne.logoPath(k)),Ne.setText(e,"[data-quote-fee-ticker]",b.conventional.unit)}function Yn(e,t){var n=Gn[t];Ne.setText(e,"[data-cex-name]",n.name),Ne.setSrc(e,"[data-cex-logo]",n.logo);var r,a=Mn(Ne.applySelector(e,"[data-cex-logo]"));try{for(a.s();!(r=a.n()).done;){var o=r.value;Ne.show(o)}}catch(e){a.e(e)}finally{a.f()}}function Jn(e,t,n,r){var a=ft().fiatRatesMap[t],o=ft().fiatRatesMap[n],s=ft().assets[t].unitInfo.conventional.conversionFactor,i=ft().assets[n].unitInfo.conventional.conversionFactor;return a&&o?e*a/o*i/s:r?e*r.rate/Ft:i}var Zn=function(e){g(s,e);var t,n,o=(t=s,n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,r=b(t);if(n){var a=b(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function s(e){var t;return i(this,s),h(v(t=o.call(this,e,{resize:function(){return t.resized()},click:function(){},zoom:function(){}})),"cfg",void 0),h(v(t),"loadedCEX",void 0),h(v(t),"cexLogo",void 0),t}return d(s,[{key:"resized",value:function(){this.render()}},{key:"draw",value:function(){}},{key:"setMarket",value:function(e){var t=this;this.cfg=e;var n=this.loadedCEX,r=this.cfg.cexName;r&&r!==n&&(this.loadedCEX=r,this.cexLogo=new Image,Ne.bind(this.cexLogo,"load",(function(){t.render()})),this.cexLogo.src=Gn[r||""].logo),this.render()}},{key:"render",value:function(){var e=this,t=this.ctx,n=this.canvas,o=this.theme,s=this.cfg;if(0!==n.width&&s){var i=s.dict,c=i.buyPlacements,l=i.sellPlacements,u=i.profit,d=s.baseFiatRate,h=s.botType;if(h!==zn){this.clear();var p=function(n,r,a,o,s){t.save(),t.setLineDash([3,5]),t.lineWidth=1.5,t.strokeStyle=s,e.line(n,r,a,o),t.restore()},f=h===jn,v=n.width/2,m=a(f?[v,v]:[.48*n.width,.52*n.width],2),g=m[0],y=m[1],b=c.reduce((function(e,t){return e+t.lots}),0),x=l.reduce((function(e,t){return e+t.lots}),0),k=Math.max(b,x),w=0,C=0;if(f){var S=c.reduce((function(e,t){return Math.max(e,t.gapFactor)}),0),F=l.reduce((function(e,t){return Math.max(e,t.gapFactor)}),0);w=Math.max(S,F)}else{var T=[].concat(r(c),r(l)),D=T.reduce((function(e,t){return e+t.gapFactor}),0)/T.length;C=.01*(1+D),w=Math.min(10,Math.max(c.length,l.length))*C}var I=u+w,A=Math.max(1.05*I,.155),R=k*d,E=.2+.7*Math.log(nt(R,0,1e6))/Math.log(1e6),B=new Zt(t,new Jt(0,n.width,0,n.height));f?p(v,0,v,n.height,o.gapLine):B.plot(new Jt(0,1,0,1),(function(t,n){var r=[n.y(0),n.y(1)],a=r[0],s=r[1];p(g,a,g,s,o.gapLine),p(y,a,y,s,o.gapLine);var i=n.y(.95);t.drawImage(e.cexLogo,v-8,i,16,16),e.applyLabelStyle(18),t.fillText("δ",v,i+29)}));var P=function(e,r){if(null!=r&&r.length){var s=a(e?[0,g]:[y,n.width],2),i=s[0],c=s[1],l=new Zt(t,new Jt(i,c,n.height*(1-E),n.height)),d=a(e?[-A,0]:[0,A],2),h=d[0],p=d[1];l.plot(new Jt(h,p,0,k),(function(t,a){t.lineWidth=2.5,t.strokeStyle=e?o.buyLine:o.sellLine,t.fillStyle=e?o.buyFill:o.sellFill,t.beginPath();var s=e?-1:1,i=r[0],c=a.y(0),l=a.x((f?i.gapFactor:u+C)*s);t.moveTo(l,c);for(var d=0,h=0;h<r.length;h++){var p=r[h],v=f?p.gapFactor:u+(h+1)*C,m=a.x(v*s);t.lineTo(m,a.y(d)),d+=p.lots,t.lineTo(m,a.y(d))}var g=e?-.1*n.width:1.1*n.width;t.lineTo(g,a.y(d)),t.stroke(),t.lineTo(g,c),t.lineTo(l,c),t.closePath(),t.globalAlpha=.25,t.fill()}),!0)}};P(!1,l),P(!0,c)}}}}]),s}(Xt);function $n(e,t,n){return"".concat(e,"-").concat(t,"-").concat(n)}function er(e,t,n){var r=tr(e,t,n);if(r)return r.config}function tr(e,t,n){var r=(ft().mmStatus.bots||[]).filter((function(r){return r.config.baseID===t&&r.config.quoteID===n&&r.config.host===e}));if(r.length)return r[0]}function nr(e,t){return e+t.lots}var rr=function(){function e(t){i(this,e),h(this,"cfg",void 0),h(this,"host",void 0),h(this,"baseID",void 0),h(this,"baseSymbol",void 0),h(this,"baseTicker",void 0),h(this,"baseFeeID",void 0),h(this,"baseIsAccountLocker",void 0),h(this,"baseFeeSymbol",void 0),h(this,"baseFeeTicker",void 0),h(this,"baseToken",void 0),h(this,"quoteID",void 0),h(this,"quoteSymbol",void 0),h(this,"quoteTicker",void 0),h(this,"quoteFeeID",void 0),h(this,"quoteIsAccountLocker",void 0),h(this,"quoteFeeSymbol",void 0),h(this,"quoteFeeTicker",void 0),h(this,"quoteToken",void 0),h(this,"botType",void 0),h(this,"cexName",void 0),h(this,"dinfo",void 0),h(this,"alloc",void 0),h(this,"proj",void 0),h(this,"bui",void 0),h(this,"baseFactor",void 0),h(this,"baseFeeUI",void 0),h(this,"baseFeeFactor",void 0),h(this,"qui",void 0),h(this,"quoteFactor",void 0),h(this,"quoteFeeUI",void 0),h(this,"quoteFeeFactor",void 0),h(this,"id",void 0),h(this,"mktID",void 0),h(this,"lotSize",void 0),h(this,"lotSizeConv",void 0),h(this,"lotSizeUSD",void 0),h(this,"quoteLot",void 0),h(this,"quoteLotConv",void 0),h(this,"quoteLotUSD",void 0),h(this,"rateStep",void 0),h(this,"baseFeeFiatRate",void 0),h(this,"quoteFeeFiatRate",void 0),h(this,"baseLots",void 0),h(this,"quoteLots",void 0),h(this,"marketReport",void 0),h(this,"nBuyPlacements",void 0),h(this,"nSellPlacements",void 0);var n=this.host=t.host,r=this.baseID=t.baseID,a=this.quoteID=t.quoteID;this.cexName=t.cexName;var o=ft().mmStatus.bots.find((function(e){var t=e.config;return t.baseID===r&&t.quoteID===a&&t.host===n}));if(!o)throw Error("where's the bot status?");this.cfg=o.config;var s=ft().assets[r],c=s.token,l=s.symbol,u=s.unitInfo;this.baseSymbol=l,this.baseTicker=u.conventional.unit,this.bui=u,this.baseFactor=u.conventional.conversionFactor,this.baseToken=c;var d=this.baseFeeID=c?c.parentID:r,p=ft().assets[this.baseFeeID],f=p.unitInfo,v=p.symbol,m=p.wallet;this.baseIsAccountLocker=(16384&m.traits)>0,this.baseFeeUI=f,this.baseFeeTicker=f.conventional.unit,this.baseFeeSymbol=v,this.baseFeeFactor=this.baseFeeUI.conventional.conversionFactor;var g=ft().assets[a],y=g.token,b=g.symbol,x=g.unitInfo;this.quoteSymbol=b,this.quoteTicker=x.conventional.unit,this.qui=x,this.quoteFactor=x.conventional.conversionFactor,this.quoteToken=y;var k=this.quoteFeeID=y?y.parentID:a,w=ft().assets[this.quoteFeeID],C=w.unitInfo,S=w.symbol,F=w.wallet;this.quoteIsAccountLocker=(16384&F.traits)>0,this.quoteFeeUI=C,this.quoteFeeTicker=C.conventional.unit,this.quoteFeeSymbol=S,this.quoteFeeFactor=this.quoteFeeUI.conventional.conversionFactor,this.id=$n(n,r,a),this.mktID="".concat(l,"_").concat(b);var T=ft().exchanges[n].markets[this.mktID],D=T.lotsize,I=T.ratestep;this.lotSize=D,this.lotSizeConv=D/u.conventional.conversionFactor,this.rateStep=I,this.quoteLot=Jn(D,r,a),this.quoteLotConv=this.quoteLot/x.conventional.conversionFactor,this.baseFeeFiatRate=ft().fiatRatesMap[d],this.quoteFeeFiatRate=ft().fiatRatesMap[k],t.arbMarketMakingConfig?(this.botType=Hn,this.baseLots=t.arbMarketMakingConfig.sellPlacements.reduce(nr,0),this.quoteLots=t.arbMarketMakingConfig.buyPlacements.reduce(nr,0),this.nBuyPlacements=t.arbMarketMakingConfig.buyPlacements.length,this.nSellPlacements=t.arbMarketMakingConfig.sellPlacements.length):t.simpleArbConfig?(this.botType=zn,this.baseLots=t.uiConfig.simpleArbLots,this.quoteLots=t.uiConfig.simpleArbLots):t.basicMarketMakingConfig&&(this.botType=jn,this.baseLots=t.basicMarketMakingConfig.sellPlacements.reduce(nr,0),this.quoteLots=t.basicMarketMakingConfig.buyPlacements.reduce(nr,0),this.nBuyPlacements=t.basicMarketMakingConfig.buyPlacements.length,this.nSellPlacements=t.basicMarketMakingConfig.sellPlacements.length)}var t;return d(e,[{key:"initialize",value:(t=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.host,n=this.baseID,r=this.quoteID,a=this.lotSizeConv,o=this.quoteLotConv,e.next=3,Xn.report(t,n,r);case 3:s=e.sent,i=this.marketReport=s.report,this.lotSizeUSD=a*i.baseFiatRate,this.quoteLotUSD=o*i.quoteFiatRate,this.proj=this.projectedAllocations();case 8:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"status",value:function(){var e=this.baseID,t=this.quoteID,n=ft().mmStatus.bots.find((function(n){return n.config.baseID===e&&n.config.quoteID===t}));return n?{botCfg:n.config,running:n.running,runStats:n.runStats,latestEpoch:n.latestEpoch,cexProblems:n.cexProblems}:{botCfg:{},running:!1,runStats:{}}}},{key:"adjustedBalances",value:function(){var e,t,n=this.baseID,r=this.quoteID,a=this.baseFeeID,o=this.quoteFeeID,s=this.cexName,i=this.baseFactor,c=this.quoteFactor,l=this.baseFeeFactor,u=this.quoteFeeFactor,d=[ft().walletMap[n],ft().walletMap[r]],h=d[0],p=d[1],f=[Kn(n),Kn(r)],v=f[0],m=f[1],g=0,y=0;if(s){var b=ft().mmStatus.cexes[s];if(!b)throw Error("where's the cex status?");e=b.balances[n],t=b.balances[r]}e&&(g=(e.available||0)-v.cex.avail),t&&(y=(t.available||0)-m.cex.avail);var x=h.balance.available-v.dex.avail,k=p.balance.available-m.dex.avail,w=x+g,C=k+y,S=a===n?h:ft().walletMap[a],F=o===r?p:ft().walletMap[o],T=w,D=x,I=g;if(a!==n){var A=Kn(n);D=S.balance.available-A.dex.total,e&&(I=(e.available||0)-A.cex.total),T=D+I}var R=C,E=k,B=y;if(o!==r){var P=Kn(r);E=F.balance.available-P.dex.total,t&&(B=(t.available||0)-P.cex.total),R=E+B}return{baseAvail:w/i,quoteAvail:C/c,dexBaseAvail:x/i,dexQuoteAvail:k/c,cexBaseAvail:g/i,cexQuoteAvail:y/c,baseFeeAvail:T/l,quoteFeeAvail:R/u,dexBaseFeeAvail:D/l,dexQuoteFeeAvail:E/u,cexBaseFeeAvail:I/l,cexQuoteFeeAvail:B/u}}},{key:"feesAndCommit",value:function(){var e=this.baseID,t=this.quoteID,n=this.marketReport,r=n.baseFees,a=n.quoteFees,o=this.lotSize,s=this.baseLots,i=this.quoteLots,c=this.baseFeeID,l=this.quoteFeeID,u=this.baseIsAccountLocker,d=this.quoteIsAccountLocker,h=this.cfg.uiConfig,p=h.baseConfig,f=h.quoteConfig;return ir(e,t,r,a,o,s,i,c,l,u,d,p.orderReservesFactor,f.orderReservesFactor)}},{key:"projectedAllocations",value:function(){var e=this.cfg.uiConfig,t=e.quoteConfig,n=e.baseConfig,r=this.baseFactor,a=this.quoteFactor,o=this.baseID,s=this.quoteID,i=this.lotSizeConv,c=this.quoteLotConv,l=this.baseFeeFactor,u=this.quoteFeeFactor,d=this.baseFeeID,h=this.quoteFeeID,p=this.baseToken,f=this.quoteToken,v=this.cexName,m=this.feesAndCommit(),g=m.commit,y=m.fees,b={book:0,bookingFees:0,swapFeeReserves:0,cex:0,orderReserves:0,slippageBuffer:0},x={book:0,bookingFees:0,swapFeeReserves:0,cex:0,orderReserves:0,slippageBuffer:0};b.book=g.dex.base.lots*i,x.book=g.cex.base.lots*c,b.orderReserves=Math.max(g.cex.base.val,g.dex.base.val)*n.orderReservesFactor/r,x.orderReserves=Math.max(g.cex.quote.val,g.dex.quote.val)*t.orderReservesFactor/a,v&&(b.cex=g.cex.base.lots*i,x.cex=g.cex.quote.lots*c),b.bookingFees=y.base.bookingFees/l,x.bookingFees=y.quote.bookingFees/u,p&&(b.swapFeeReserves=y.base.tokenFeesPerSwap*n.swapFeeN/l),f&&(x.swapFeeReserves=y.quote.tokenFeesPerSwap*t.swapFeeN/u),x.slippageBuffer=(x.book+x.cex+x.orderReserves)*t.slippageBufferFactor;var k={},w=function(e,t){var n;k[e]=(null!==(n=k[e])&&void 0!==n?n:0)+t};return w(o,Math.round((b.book+b.cex+b.orderReserves)*r)),w(d,Math.round((b.bookingFees+b.swapFeeReserves)*l)),w(s,Math.round((x.book+x.cex+x.orderReserves+x.slippageBuffer)*a)),w(h,Math.round((x.bookingFees+x.swapFeeReserves)*u)),{qProj:x,bProj:b,alloc:k}}},{key:"fundingState",value:function(){var e=this.proj,t=e.bProj,n=e.qProj,r=this.baseID,a=this.quoteID,o=this.baseFeeID,s=this.quoteFeeID,i=this.cfg.uiConfig.cexRebalance,c=this.cexName,l=this.adjustedBalances(),u=l.baseAvail,d=l.quoteAvail,h=l.dexBaseAvail,p=l.dexQuoteAvail,f=l.cexBaseAvail,v=l.cexQuoteAvail,m=l.dexBaseFeeAvail,g=l.dexQuoteFeeAvail,y=Boolean(c&&i),b=t.cex,x=[t.book,0,0],k=x[0],w=x[1],C=x[2];r===o?k+=t.bookingFees:C+=t.bookingFees+t.swapFeeReserves,y?w+=t.orderReserves:k+=t.orderReserves,r===s&&(y?w+=n.bookingFees+n.swapFeeReserves:k+=n.bookingFees+n.swapFeeReserves);var S=[n.book,n.cex,0,0],F=S[0],T=S[1],D=S[2],I=S[3];if(a===s?F+=n.bookingFees:I+=n.bookingFees+n.swapFeeReserves,y)D+=n.orderReserves+n.slippageBuffer;else{F+=n.orderReserves;var A=n.book+n.cex+n.orderReserves;F+=(n.book+n.orderReserves)/A*n.slippageBuffer,T+=n.cex/A*n.slippageBuffer}a===o&&(y?D+=t.bookingFees+t.swapFeeReserves:F+=t.bookingFees+t.swapFeeReserves);var R=h>=k,E=f>=b,B=p>=F,P=v>=T,L=k+b+w,O=F+T+D,M=R&&E&&u>=L,q=B&&P&&d>=O,N=m>=C,W=g>=I,V=M&&q&&N&&W,U=!V;return V||(U=u>=L&&d>=O&&N&&W&&y),{base:{dex:{avail:h,req:k,funded:R},cex:{avail:f,req:b,funded:E},transferable:w,fees:{avail:m,req:C,funded:N},fundedAndBalanced:M,fundedAndNotBalanced:!M&&u>=L&&y},quote:{dex:{avail:p,req:F,funded:B},cex:{avail:v,req:T,funded:P},transferable:D,fees:{avail:g,req:I,funded:W},fundedAndBalanced:q,fundedAndNotBalanced:!q&&d>=O&&y},fundedAndBalanced:V,fundedAndNotBalanced:U,starved:!V&&!U}}}]),e}(),ar=function(){function e(t,n,r,a){var o=this;i(this,e),h(this,"div",void 0),h(this,"page",void 0),h(this,"mkt",void 0),h(this,"startTime",void 0),h(this,"ticker",void 0),h(this,"currentForm",void 0),h(this,"forms",void 0),h(this,"latestEpoch",void 0),h(this,"cexProblems",void 0),h(this,"orderReportFormEl",void 0),h(this,"orderReportForm",void 0),h(this,"displayedOrderReportFormSide",void 0),h(this,"dexBalancesRowTmpl",void 0),h(this,"placementRowTmpl",void 0),h(this,"placementAmtRowTmpl",void 0),this.div=t,this.page=Ne.parseTemplate(t),this.orderReportFormEl=r.orderReportForm,this.orderReportForm=Ne.idDescendants(r.orderReportForm),this.dexBalancesRowTmpl=r.dexBalancesRowTmpl,this.placementRowTmpl=r.placementRowTmpl,this.placementAmtRowTmpl=r.placementAmtRowTmpl,Ne.cleanTemplates(this.dexBalancesRowTmpl,this.placementRowTmpl,this.placementAmtRowTmpl),this.forms=n,Ne.bind(this.page.stopBttn,"click",(function(){return o.stop()})),Ne.bind(this.page.runLogsBttn,"click",(function(){var e=o.mkt,t=e.baseID,n=e.quoteID,r=e.host,s=o.startTime;ft().loadPage("mmlogs",{baseID:t,quoteID:n,host:r,startTime:s,returnPage:a})})),Ne.bind(this.page.buyOrdersBttn,"click",(function(){return o.showOrderReport("buys")})),Ne.bind(this.page.sellOrdersBttn,"click",(function(){return o.showOrderReport("sells")}))}var t,n,o;return d(e,[{key:"stop",value:(o=s(f().mark((function e(){var t,n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.mkt,r=n.host,a=n.baseID,o=n.quoteID,s=ft().loading(t.stopBttn),e.next=4,Xn.stopBot({host:r,baseID:a,quoteID:o});case 4:s();case 5:case"end":return e.stop()}}),e,this)}))),function(){return o.apply(this,arguments)})},{key:"setMarket",value:(n=s(f().mark((function e(t,n,r){var a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=ft().mmStatus.bots.find((function(e){var a=e.config;return a.baseID===n&&a.quoteID===r&&a.host===t}))){e.next=3;break}return e.abrupt("return");case 3:return o=new rr(a.config),e.next=6,o.initialize();case 6:this.setBotMarket(o);case 7:case"end":return e.stop()}}),e,this)}))),function(e,t,r){return n.apply(this,arguments)})},{key:"setBotMarket",value:(t=s(f().mark((function e(t){var n,a,o,s,i,c,l,u,d,h,p,v,m,g,y,b,x,k,w,C,S,F,T,D,I,A;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.mkt=t,c=this.page,l=this.div,u=this.mkt,d=u.host,h=u.baseID,p=u.quoteID,v=u.baseFeeID,m=u.quoteFeeID,g=u.cexName,y=u.baseFeeSymbol,b=u.quoteFeeSymbol,x=u.baseFeeTicker,k=u.quoteFeeTicker,w=u.cfg,C=u.baseFactor,S=u.quoteFactor,Qn(l,h,p,d),Ne.setVis(v!==h,c.baseFeeReservesBox),Ne.setVis(m!==p,c.quoteFeeReservesBox),Ne.setVis.apply(Ne,[Boolean(g)].concat(r(Ne.applySelector(l,"[data-cex-show]")))),c.baseFeeLogo.src=Ne.logoPath(y),c.baseFeeTicker.textContent=x,c.quoteFeeLogo.src=Ne.logoPath(b),c.quoteFeeTicker.textContent=k,F=w.basicMarketMakingConfig,T=null!==(n=null==F?void 0:F.gapStrategy)&&void 0!==n?n:Un,D=null!==(a=null!==(o=null===(s=w.arbMarketMakingConfig)||void 0===s?void 0:s.profit)&&void 0!==o?o:null===(i=w.simpleArbConfig)||void 0===i?void 0:i.profitTrigger)&&void 0!==a?a:0,F&&(I=r(F.buyPlacements).sort((function(e,t){return e.gapFactor-t.gapFactor})),A=r(F.sellPlacements).sort((function(e,t){return e.gapFactor-t.gapFactor})),D=I.length>0?A.length>0?(I[0].gapFactor+A[0].gapFactor)/2:I[0].gapFactor:A[0].gapFactor),Ne.hide(c.profitLabel,c.gapLabel,c.multiplierLabel,c.profitUnit,c.gapUnit,c.multiplierUnit),e.t0=T,e.next=e.t0===Un||e.t0===_n?18:e.t0===Nn?21:24;break;case 18:return Ne.show(c.profitLabel,c.profitUnit),c.gapFactor.textContent=(100*D).toFixed(2),e.abrupt("break",25);case 21:return Ne.show(c.multiplierLabel,c.multiplierUnit),c.gapFactor.textContent=(100*D).toFixed(2),e.abrupt("break",25);case 24:c.gapFactor.textContent=Ne.formatFourSigFigs(D/Ft*C/S);case 25:this.update(),this.readBook();case 27:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})},{key:"handleBalanceNote",value:function(e){if(this.mkt){var t=this.mkt,n=t.baseID,r=t.quoteID,a=t.baseFeeID,o=t.quoteFeeID;e.assetID!==n&&e.assetID!==a&&e.assetID!==r&&e.assetID!==o||this.update()}}},{key:"handleEpochReportNote",value:function(e){if(this.mkt){var t=this.mkt,n=t.baseID,r=t.quoteID,a=t.host;if(e.baseID===n&&e.quoteID===r&&e.host===a&&e.report){if(this.latestEpoch=e.report,this.forms.currentForm===this.orderReportFormEl&&this.forms.currentFormID===this.mkt.id){var o="buys"===this.displayedOrderReportFormSide?e.report.buysReport:e.report.sellsReport;o?this.updateOrderReport(o,this.displayedOrderReportFormSide,e.report.epochNum):this.forms.close()}this.update()}}}},{key:"handleCexProblemsNote",value:function(e){if(this.mkt){var t=this.mkt,n=t.baseID,r=t.quoteID,a=t.host;e.baseID===n&&e.quoteID===r&&e.host===a&&(this.cexProblems=e.problems,this.update())}}},{key:"setTicker",value:function(){this.page.runTime.textContent=Ne.hmsSince(this.startTime)}},{key:"update",value:function(){var e,t,n,r=this,o=this.div,s=this.page,i=this.mkt,c=i.baseID,l=i.quoteID,u=i.baseFeeID,d=i.quoteFeeID,h=i.baseFactor,p=i.quoteFactor,f=i.baseFeeFactor,v=i.quoteFeeFactor,m=i.marketReport,g=m.baseFiatRate,y=m.quoteFiatRate,b=this.mkt.status(),x=b.botCfg,k=x.cexName,w=x.basicMarketMakingConfig,C=b.runStats,S=b.latestEpoch,F=b.cexProblems;if(this.latestEpoch=S,this.cexProblems=F,Ne.hide(s.stats,s.cexRow,s.pendingDepositBox,s.pendingWithdrawalBox),C){this.ticker||(this.startTime=C.startTime,this.setTicker(),this.ticker=setInterval((function(){return r.setTicker()}),1e3)),Ne.show(s.stats),sr(100*C.profitLoss.profitRatio,s.profit,s.profitSign,2),sr(C.profitLoss.profit,s.profitLoss,s.plSign,2),this.startTime=C.startTime;var T=function(e){return e?e.available+e.locked+e.pending+e.reserved:0},D=T(C.dexBalances[c])/h;s.walletBaseInventory.textContent=Ne.formatFourSigFigs(D),s.walletBaseInvFiat.textContent=Ne.formatFourSigFigs(D*g,2);var I=T(C.dexBalances[l])/p;if(s.walletQuoteInventory.textContent=Ne.formatFourSigFigs(I),s.walletQuoteInvFiat.textContent=Ne.formatFourSigFigs(I*y,2),Ne.setVis(k,s.cexRow),k){Ne.show(s.pendingDepositBox,s.pendingWithdrawalBox),Yn(o,k);var A=T(C.cexBalances[c])/h;s.cexBaseInventory.textContent=Ne.formatFourSigFigs(A),s.cexBaseInventoryFiat.textContent=Ne.formatFourSigFigs(A*g,2);var R=T(C.cexBalances[l])/p;s.cexQuoteInventory.textContent=Ne.formatFourSigFigs(R),s.cexQuoteInventoryFiat.textContent=Ne.formatFourSigFigs(R*y,2)}if(u!==c){var E=T(C.dexBalances[u])/f;s.baseFeeReserves.textContent=Ne.formatFourSigFigs(E)}if(d!==l){var B=T(C.dexBalances[d])/v;s.quoteFeeReserves.textContent=Ne.formatFourSigFigs(B)}s.pendingDeposits.textContent=String(Math.round(C.pendingDeposits)),s.pendingWithdrawals.textContent=String(Math.round(C.pendingWithdrawals)),s.completedMatches.textContent=String(Math.round(C.completedMatches)),Ne.setVis(C.tradedUSD,s.tradedUSDBox),C.tradedUSD>0&&(s.tradedUSD.textContent=Ne.formatFourSigFigs(C.tradedUSD)),Ne.setVis(g,s.roundTripFeesBox),g&&(s.roundTripFeesUSD.textContent=Ne.formatFourSigFigs((null===(e=C.feeGap)||void 0===e?void 0:e.roundTripFees)/h*g||0));var P=ft().conventionalRate(c,l,(null===(t=C.feeGap)||void 0===t?void 0:t.basisPrice)||0);s.basisPrice.textContent=Ne.formatFourSigFigs(P);var L=!w||w.gapStrategy===Vn||w.gapStrategy===_n;if(Ne.setVis(L,s.feeGapBox),L){var O,M=ft().conventionalRate(c,l,(null===(O=C.feeGap)||void 0===O?void 0:O.feeGap)||0);s.feeGap.textContent=Ne.formatFourSigFigs(M),s.feeGapPct.textContent=(M/P*100||0).toFixed(2)}Ne.setVis(w,s.gapStrategyBox),w&&(s.gapStrategy.textContent=w.gapStrategy);var q=ft().conventionalRate(c,l,(null===(n=C.feeGap)||void 0===n?void 0:n.remoteGap)||0);if(Ne.setVis(q,s.remoteGapBox),q&&(s.remoteGap.textContent=Ne.formatFourSigFigs(q),s.remoteGapPct.textContent=(q/P*100||0).toFixed(2)),Ne.setVis(null==S?void 0:S.buysReport,s.buyOrdersReportBox),null!=S&&S.buysReport){var N=or(S.buysReport);Ne.setVis(N,s.buyOrdersSuccess),Ne.setVis(!N,s.buyOrdersFailed)}if(Ne.setVis(null==S?void 0:S.sellsReport,s.sellOrdersReportBox),null!=S&&S.sellsReport){var W=or(S.sellsReport);Ne.setVis(W,s.sellOrdersSuccess),Ne.setVis(!W,s.sellOrdersFailed)}var V=cr(null==S?void 0:S.preOrderProblems,this.mkt.cexName,this.mkt.host),U=function(e){if(!e)return[];var t=[];if(e.depositErr)for(var n=0,r=Object.entries(e.depositErr);n<r.length;n++){var o=a(r[n],2),s=o[0],i=o[1];t.push(ke("DEPOSIT_ERROR",{assetSymbol:ft().assets[Number(s)].symbol.toUpperCase(),time:new Date(1e3*i.stamp).toLocaleString(),error:i.error}))}if(e.withdrawErr)for(var c=0,l=Object.entries(e.withdrawErr);c<l.length;c++){var u=a(l[c],2),d=u[0],h=u[1];t.push(ke("WITHDRAW_ERROR",{assetSymbol:ft().assets[Number(d)].symbol.toUpperCase(),time:new Date(1e3*h.stamp).toLocaleString(),error:h.error}))}return e.tradeErr&&t.push(ke("CEX_TRADE_ERROR",{time:new Date(1e3*e.tradeErr.stamp).toLocaleString(),error:e.tradeErr.error})),t}(this.cexProblems),_=[].concat(V,U);Ne.setVis(_.length>0,s.preOrderProblemsBox),Ne.empty(s.preOrderProblemsBox);var j,H=Mn(_);try{for(H.s();!(j=H.n()).done;){var z=j.value,G=document.createElement("span");G.textContent="- ".concat(z),s.preOrderProblemsBox.appendChild(G)}}catch(e){H.e(e)}finally{H.f()}}else this.ticker&&(clearInterval(this.ticker),this.ticker=void 0)}},{key:"updateOrderReport",value:function(e,t,n){var r=this,o=this.orderReportForm,s=ke("buys"===t?E:B);if(o.orderReportTitle.textContent=ke("ORDER_REPORT_TITLE",{side:s,epochNum:"".concat(n)}),Ne.setVis(e.error,o.orderReportError),Ne.setVis(!e.error,o.orderReportDetails),e.error){var i=cr(e.error,this.mkt.cexName,this.mkt.host);Ne.empty(o.orderReportError);for(var c=0,l=i;c<l.length;c++){var u=l[c],d=document.createElement("span");d.textContent="- ".concat(u),o.orderReportError.appendChild(d)}}else{Ne.empty(o.dexBalancesBody,o.placementsBody);var h=function(t){var n=r.dexBalancesRowTmpl.cloneNode(!0),a=Ne.parseTemplate(n),o=ft().assets[t];a.asset.textContent=o.symbol.toUpperCase(),a.assetLogo.src=Ne.logoPath(o.symbol);var s=o.unitInfo,i=e.availableDexBals[t]?e.availableDexBals[t].available:0,c=e.requiredDexBals[t]?e.requiredDexBals[t]:0,l=e.remainingDexBals[t]?e.remainingDexBals[t]:0,u=e.availableDexBals[t]?e.availableDexBals[t].pending:0,d=e.availableDexBals[t]?e.availableDexBals[t].locked:0,h=e.usedDexBals[t]?e.usedDexBals[t]:0;a.available.textContent=Ne.formatCoinValue(i,s),a.locked.textContent=Ne.formatCoinValue(d,s),a.required.textContent=Ne.formatCoinValue(c,s),a.remaining.textContent=Ne.formatCoinValue(l,s),a.pending.textContent=Ne.formatCoinValue(u,s),a.used.textContent=Ne.formatCoinValue(h,s);var p=lr(c,i);a.deficiency.textContent=Ne.formatCoinValue(p,s),p>0&&a.deficiency.classList.add("text-warning");var f=lr(p,u);return a.deficiencyWithPending.textContent=Ne.formatCoinValue(f,s),f>0&&a.deficiencyWithPending.classList.add("text-warning"),[n,p]},p=[this.mkt.baseID,this.mkt.quoteID];p.includes(this.mkt.baseFeeID)||p.push(this.mkt.baseFeeID),p.includes(this.mkt.quoteFeeID)||p.push(this.mkt.quoteFeeID);for(var f,v=0,m=[],g=0,y=p;g<y.length;g++){var b=a(h(y[g]),2),x=b[0];v+=b[1],o.dexBalancesBody.appendChild(x),m.push(x)}if(function(e,t){Ne.setVis(e,o.dexDeficiencyHeader,o.dexDeficiencyWithPendingHeader);var n,r=Mn(t);try{for(r.s();!(n=r.n()).done;){var a=n.value,s=Ne.parseTemplate(a);Ne.setVis(e,s.deficiency,s.deficiencyWithPending)}}catch(e){r.e(e)}finally{r.f()}}(v>0,m),Ne.setVis(this.mkt.cexName,o.cexSection,o.counterTradeRateHeader,o.requiredCEXHeader,o.usedCEXHeader),this.mkt.cexName){var k=Gn[this.mkt.cexName];k?(o.cexLogo.src=k.logo,o.cexBalancesTitle.textContent=ke("CEX_BALANCES",{cexName:k.name})):console.error("CEXDisplayInfo not found for ".concat(this.mkt.cexName));var w="buys"===t?this.mkt.baseID:this.mkt.quoteID;f=ft().assets[w],o.cexAsset.textContent=f.symbol.toUpperCase(),o.cexAssetLogo.src=Ne.logoPath(f.symbol);var C=e.availableCexBal?e.availableCexBal.available:0,S=e.requiredCexBal?e.requiredCexBal:0,F=e.remainingCexBal?e.remainingCexBal:0,T=e.availableCexBal?e.availableCexBal.pending:0,D=e.availableCexBal?e.availableCexBal.reserved:0,I=e.usedCexBal?e.usedCexBal:0,A=lr(S,C),R=lr(A,T);o.cexAvailable.textContent=Ne.formatCoinValue(C,f.unitInfo),o.cexLocked.textContent=Ne.formatCoinValue(D,f.unitInfo),o.cexRequired.textContent=Ne.formatCoinValue(S,f.unitInfo),o.cexRemaining.textContent=Ne.formatCoinValue(F,f.unitInfo),o.cexPending.textContent=Ne.formatCoinValue(T,f.unitInfo),o.cexUsed.textContent=Ne.formatCoinValue(I,f.unitInfo);var P=A>0;Ne.setVis(P,o.cexDeficiencyHeader,o.cexDeficiencyWithPendingHeader,o.cexDeficiency,o.cexDeficiencyWithPending),P&&(o.cexDeficiency.textContent=Ne.formatCoinValue(A,f.unitInfo),o.cexDeficiencyWithPending.textContent=Ne.formatCoinValue(R,f.unitInfo),R>0?o.cexDeficiencyWithPending.classList.add("text-warning"):o.cexDeficiencyWithPending.classList.remove("text-warning"))}var L,O=!1,M=Mn(e.placements);try{for(M.s();!(L=M.n()).done;)if(L.value.error){O=!0;break}}catch(e){M.e(e)}finally{M.f()}Ne.setVis(O,o.errorHeader);for(var q=function(e,t){var n=r.placementRowTmpl.cloneNode(!0),a=Ne.parseTemplate(n),o=ft().assets[r.mkt.baseID].unitInfo,s=ft().assets[r.mkt.quoteID].unitInfo;a.priority.textContent=String(t),a.rate.textContent=Ne.formatRateFullPrecision(e.rate,o,s,r.mkt.rateStep),a.lots.textContent=String(e.lots),a.standingLots.textContent=String(e.standingLots),a.orderedLots.textContent=String(e.orderedLots),e.standingLots+e.orderedLots<e.lots&&(a.lots.classList.add("text-warning"),a.standingLots.classList.add("text-warning"),a.orderedLots.classList.add("text-warning")),Ne.setVis(e.counterTradeRate>0,a.counterTradeRate),a.counterTradeRate.textContent=Ne.formatRateFullPrecision(e.counterTradeRate,o,s,r.mkt.rateStep);for(var i=0,c=p;i<c.length;i++){var l=c[i],u=ft().assets[l],d=u.unitInfo,h=e.requiredDex[l]?e.requiredDex[l]:0,v=e.usedDex[l]?e.usedDex[l]:0,m=r.placementAmtRowTmpl.cloneNode(!0),g=Ne.parseTemplate(m),y=r.placementAmtRowTmpl.cloneNode(!0),b=Ne.parseTemplate(y);g.amt.textContent=Ne.formatCoinValue(h,d),g.assetLogo.src=Ne.logoPath(u.symbol),g.assetSymbol.textContent=u.symbol.toUpperCase(),b.amt.textContent=Ne.formatCoinValue(v,d),b.assetLogo.src=Ne.logoPath(u.symbol),b.assetSymbol.textContent=u.symbol.toUpperCase(),a.requiredDEX.appendChild(m),a.usedDEX.appendChild(y)}if(Ne.setVis(r.mkt.cexName,a.requiredCEX,a.usedCEX),r.mkt.cexName){var x=Ne.formatCoinValue(e.requiredCex,f.unitInfo);a.requiredCEX.textContent="".concat(x," ").concat(f.symbol.toUpperCase());var k=Ne.formatCoinValue(e.usedCex,f.unitInfo);a.usedCEX.textContent="".concat(k," ").concat(f.symbol.toUpperCase())}if(Ne.setVis(O,a.error),e.error){var w=cr(e.error,r.mkt.cexName,r.mkt.host);a.error.textContent=w.join("\n")}return n},N=0;N<e.placements.length;N++)o.placementsBody.appendChild(q(e.placements[N],N+1))}}},{key:"showOrderReport",value:function(e){if(this.latestEpoch){var t="buys"===e?this.latestEpoch.buysReport:this.latestEpoch.sellsReport;t&&(this.updateOrderReport(t,e,this.latestEpoch.epochNum),this.displayedOrderReportFormSide=e,this.forms.show(this.orderReportFormEl,this.mkt.id))}}},{key:"readBook",value:function(){if(this.mkt){var e=this.page,t=this.mkt,n=t.host,r=t.mktID,a=ft().exchanges[n].markets[r].orders||[];e.nBookedOrders.textContent=String(a.filter((function(e){return 2===e.status})).length)}}}]),e}();function or(e){if(e.error)return!1;for(var t=0;t<e.placements.length;t++){var n=e.placements[t];if(n.orderedLots+n.standingLots<n.lots)return!1;if(n.error)return!1}return!0}function sr(e,t,n,r){t.textContent=Ne.formatFourSigFigs(e,r),n.classList.toggle("ico-plus",e>0),n.classList.toggle("text-good",e>0)}function ir(e,t,n,r,a,o,s,i,c,l,u,d,h){var p=Jn(a,e,t),f={dex:{base:{lots:o,val:o*a},quote:{lots:s,val:s*p}},cex:{base:{lots:s,val:s*a},quote:{lots:o,val:o*p}}},v=0,m=0;e!==i&&(v+=n.estimated.swap,i===c&&(v+=r.estimated.redeem));var g=n.max.swap;e===c&&(g+=r.max.redeem),l&&(g+=n.max.refund,u||i===c||(m=n.max.redeem));var y=0,b=0;t!==c&&(y+=r.estimated.swap,c===i&&(y+=n.estimated.redeem));var x=r.max.swap;t===i&&(x+=n.max.redeem),u&&(x+=r.max.refund,l||c===i||(b=r.max.redeem));var k=1+d,w=1+h,C=g*o*k,S=m*s*w,F=x*s*w,T=b*o*k;return{commit:f,fees:{base:On(On({},n),{},{bookingFeesPerLot:g,bookingFeesPerCounterLot:m,bookingFees:C+S,swapReservesFactor:k,redeemReservesFactor:w,tokenFeesPerSwap:v}),quote:On(On({},r),{},{bookingFeesPerLot:x,bookingFeesPerCounterLot:b,bookingFees:F+T,swapReservesFactor:w,redeemReservesFactor:k,tokenFeesPerSwap:y})}}}function cr(e,t,n){if(!e)return[];var r=[];if(e.walletNotSynced)for(var o=0,s=Object.entries(e.walletNotSynced);o<s.length;o++){var i=a(s[o],2),c=i[0];i[1]&&r.push(ke("WALLET_NOT_SYNCED",{assetSymbol:ft().assets[Number(c)].symbol.toUpperCase()}))}if(e.noWalletPeers)for(var l=0,u=Object.entries(e.noWalletPeers);l<u.length;l++){var d=a(u[l],2),h=d[0];d[1]&&r.push(ke("WALLET_NO_PEERS",{assetSymbol:ft().assets[Number(h)].symbol.toUpperCase()}))}return e.accountSuspended&&r.push(ke("ACCOUNT_SUSPENDED",{dexHost:n})),e.userLimitTooLow&&r.push(ke("USER_LIMIT_TOO_LOW",{dexHost:n})),e.noPriceSource&&r.push(ke("NO_PRICE_SOURCE")),e.cexOrderbookUnsynced&&r.push(ke("CEX_ORDERBOOK_UNSYNCED",{cexName:t})),e.causesSelfMatch&&r.push(ke("CAUSES_SELF_MATCH")),e.unknownError&&r.push(e.unknownError),r}function lr(e,t){return e-t>0?e-t:0}function ur(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return dr(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?dr(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){throw e})),f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){i=!0,o=e})),f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function dr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}window.mmstatus=function(){return Xn.status()};var hr=function(){function e(t,n){var r=this;i(this,e),h(this,"formsDiv",void 0),h(this,"currentForm",void 0),h(this,"currentFormID",void 0),h(this,"keyup",void 0),h(this,"closed",void 0),this.formsDiv=t,this.closed=null==n?void 0:n.closed,t.querySelectorAll(".form-closer").forEach((function(e){Ne.bind(e,"click",(function(){r.close()}))})),Ne.bind(t,"mousedown",(function(e){r.currentForm&&(Ne.mouseInElement(e,r.currentForm)||r.close())})),this.keyup=function(e){"Escape"===e.key&&r.close()},Ne.bind(document,"keyup",this.keyup)}var t;return d(e,[{key:"show",value:(t=s(f().mark((function e(t,n){var a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.currentForm=t,this.currentFormID=n,Ne.hide.apply(Ne,r(Array.from(this.formsDiv.children))),t.style.right="10000px",Ne.show(this.formsDiv,t),a=(this.formsDiv.offsetWidth+t.offsetWidth)/2,e.next=8,Ne.animate(Ir,(function(e){t.style.right="".concat((1-e)*a,"px")}),"easeOutHard");case 8:t.style.right="0";case 9:case"end":return e.stop()}}),e,this)}))),function(e,n){return t.apply(this,arguments)})},{key:"close",value:function(){Ne.hide(this.formsDiv);var e=this.currentForm;this.currentForm=void 0,this.currentFormID=void 0,this.closed&&this.closed(e)}},{key:"exit",value:function(){Ne.unbind(document,"keyup",this.keyup)}}]),e}(),pr=function(){function e(t,n,r){var a=this;i(this,e),h(this,"page",void 0),h(this,"form",void 0),h(this,"success",void 0),h(this,"current",void 0),h(this,"subform",void 0),h(this,"walletCfgGuide",void 0),h(this,"parentSyncer",void 0),h(this,"createUpdater",void 0),this.form=t,this.success=n;var o=this.page=Ne.parseTemplate(t);r&&(Ne.show(o.goBack),Ne.bind(o.goBack,"click",(function(){r()}))),Ne.empty(o.walletTabTmpl),o.walletTabTmpl.removeAttribute("id"),this.subform=new vr(o.walletSettings,!0),this.walletCfgGuide=Ne.tmplElement(t,"walletCfgGuide"),Br(t,o.submitAdd,(function(){return a.submit()})),Br(t,o.oneBttn,(function(){return a.submit()})),ft().registerNoteFeeder({walletstate:function(e){a.reportWalletState(e.wallet)},walletsync:function(e){a.parentSyncer&&a.parentSyncer(ft().walletMap[e.assetID])},createwallet:function(e){a.reportCreationUpdate(e)}})}var t,n,a,o,c,l,u;return d(e,[{key:"reportWalletState",value:function(e){this.parentSyncer&&this.parentSyncer(e)}},{key:"reportCreationUpdate",value:function(e){this.createUpdater&&this.createUpdater(e)}},{key:"createWallet",value:(u=s(f().mark((function e(t,n,r){var a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a={assetID:t,pass:this.page.newWalletPass.value||"",config:this.subform.map(t),walletType:n,parentForm:r},o=new Yt(this.form,{backgroundColor:!0}),e.next=4,S("/api/newwallet",a);case 4:return s=e.sent,o.stop(),e.abrupt("return",s);case 7:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return u.apply(this,arguments)})},{key:"submit",value:(l=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=t.newWalletPass,Ne.hide(t.newWalletErr),r=this.current,a=r.asset,o=r.parentAsset,s=this.current.selectedDef,c=s.type,o&&(c=a.token.definition.type,i={assetID:o.id,config:this.subform.map(o.id),walletType:s.type}),e.next=9,this.createWallet(a.id,c,i);case 9:if(l=e.sent,ft().checkResponse(l)){e.next=13;break}return this.setError(l.msg),e.abrupt("return");case 13:if(n.value="",!o){e.next=19;break}return e.next=17,this.runParentSync();case 17:e.next=20;break;case 19:this.success(this.current.asset.id);case 20:case"end":return e.stop()}}),e,this)}))),function(){return l.apply(this,arguments)})},{key:"runParentSync",value:(c=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n=this.current,r=n.parentAsset,a=n.asset,r){e.next=3;break}return e.abrupt("return");case 3:return t.parentSyncPct.textContent="0",t.parentName.textContent=r.name,t.parentLogo.src=Ne.logoPath(r.symbol),t.childName.textContent=a.name,t.childLogo.src=Ne.logoPath(a.symbol),Ne.hide(t.mainForm),Ne.show(t.parentSyncing),e.prev=10,e.next=13,this.syncParent(r);case 13:this.success(this.current.asset.id),e.next=19;break;case 16:e.prev=16,e.t0=e.catch(10),this.setError(e.t0.message||e.t0);case 19:Ne.show(t.mainForm),Ne.hide(t.parentSyncing);case 21:case"end":return e.stop()}}),e,this,[[10,16]])}))),function(){return c.apply(this,arguments)})},{key:"syncParent",value:function(e){var t=this,n=this.page,r=this.current.asset;return new Promise((function(a,o){var s=ft().assets[e.id].wallet;if(s&&s.synced)return a();t.parentSyncer=function(t){t.assetID===e.id&&(n.parentSyncPct.textContent=(100*t.syncProgress).toFixed(1))},t.createUpdater=function(e){if(e.assetID===r.id){switch(e.topic){case"QueuedCreationFailed":o(new Error("".concat(e.subject,": ").concat(e.details)));break;case"QueuedCreationSuccess":a();break;default:return}t.parentSyncer=null,t.createUpdater=null}}}))}},{key:"setAsset",value:(o=s(f().mark((function e(t){var n,r,a,o,s,i,c,l,u,d,h,p=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.parseAsset(t)){e.next=2;break}return e.abrupt("return");case 2:if(n=this.page,r=n.walletTypeTabs,a=this.current,o=a.winfo,s=a.asset,i=a.parentAsset,n.assetName.textContent=o.name,n.newWalletPass.value="",Ne.empty(r),Ne.hide(r,n.newWalletErr,n.tokenMsgBox),this.page.assetLogo.src=Ne.logoPath(s.symbol),i&&(n.tokenParentLogo.src=Ne.logoPath(i.symbol),n.tokenParentName.textContent=i.name,Ne.show(n.tokenMsgBox)),c=i?i.info:null,!((l=c?c.availablewallets:o.availablewallets?o.availablewallets:[o.definition]).length>1)){e.next=34;break}Ne.show(r),u=ur(l),e.prev=16,h=f().mark((function e(){var t,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=d.value,(a=n.walletTabTmpl.cloneNode(!0)).dataset.tooltip=t.description,a.textContent=t.tab,r.appendChild(a),Ne.bind(a,"click",(function(){var e,n=ur(Ne.kids(r));try{for(n.s();!(e=n.n()).done;)e.value.classList.remove("selected")}catch(e){n.e(e)}finally{n.f()}a.classList.add("selected"),p.update(t)}));case 6:case"end":return e.stop()}}),e)})),u.s();case 19:if((d=u.n()).done){e.next=23;break}return e.delegateYield(h(),"t0",21);case 21:e.next=19;break;case 23:e.next=28;break;case 25:e.prev=25,e.t1=e.catch(16),u.e(e.t1);case 28:return e.prev=28,u.f(),e.finish(28);case 31:ft().bindTooltips(r),r.firstChild.classList.add("selected");case 34:return e.next=36,this.update(this.current.selectedDef);case 36:if(!s.walletCreationPending){e.next=39;break}return e.next=39,this.runParentSync();case 39:case"end":return e.stop()}}),e,this,[[16,25,28,31]])}))),function(e){return o.apply(this,arguments)})},{key:"parseAsset",value:function(e){if(this.current&&this.current.asset.id===e)return!1;var t=ft().assets[e],n=t.token;if(!n){if(!t.info)throw Error("this non-token asset has no wallet info!");return this.current={asset:t,winfo:t.info,selectedDef:t.info.availablewallets[0]},!0}var r=ft().user.assets[n.parentID];if(r.wallet)return this.current={asset:t,winfo:n,selectedDef:n.definition},!0;if(!r.info)throw Error("this parent has no wallet info!");return this.current={asset:t,parentAsset:r,winfo:n,selectedDef:r.info.availablewallets[0]},!0}},{key:"update",value:(a=s(f().mark((function e(t){var n,a,o,s,i,c,l,u,d,h,p,v,m,g,y,b,x,k;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=this.page,this.current.selectedDef=t,Ne.hide(n.walletPassAndSubmitBttn,n.oneBttnBox,n.newWalletPassBox),a=t.guidelink,(o=t.configopts||[]).map((function(e){return e.isBirthdayConfig&&ft().seedGenTime>0&&(e.default=Pr(new Date)),e})),s=!1,i=ur(o),e.prev=8,i.s();case 10:if((c=i.n()).done){e.next=17;break}if(!c.value.required){e.next=15;break}return s=!0,e.abrupt("break",17);case 15:e.next=10;break;case 17:e.next=22;break;case 19:e.prev=19,e.t0=e.catch(8),i.e(e.t0);case 22:return e.prev=22,i.f(),e.finish(22);case 25:if(l=this.current,u=l.asset,d=l.parentAsset,h=l.winfo,(p=t.seeded||Boolean(u.token))&&!s?(Ne.hide(n.walletSettingsHeader),Ne.show(n.oneBttnBox)):p?(Ne.show(n.walletPassAndSubmitBttn,n.walletSettingsHeader),n.newWalletPass.value="",n.submitAdd.textContent=ke("CREATE")):(Ne.show(n.walletPassAndSubmitBttn,n.walletSettingsHeader),t.noauth||Ne.show(n.newWalletPassBox),n.submitAdd.textContent=ke("ADD")),d){v=JSON.parse(JSON.stringify(o)),m=ur(v);try{for(m.s();!(g=m.n()).done;)g.value.regAsset=d.id}catch(e){m.e(e)}finally{m.f()}if((y=h.definition.configopts||[]).length>0){b=JSON.parse(JSON.stringify(y)),x=ur(b);try{for(x.s();!(k=x.n()).done;)k.value.regAsset=u.id}catch(e){x.e(e)}finally{x.f()}v.push.apply(v,r(b))}this.subform.update(u.id,v,!1)}else this.subform.update(u.id,o,!1);return this.setGuideLink(a),t.seeded||Boolean(this.current.asset.token)?Ne.hide(this.subform.fileSelector):Ne.show(this.subform.fileSelector),e.next=33,this.loadDefaults();case 33:case"end":return e.stop()}}),e,this,[[8,19,22,25]])}))),function(e){return a.apply(this,arguments)})},{key:"setGuideLink",value:function(e){Ne.hide(this.walletCfgGuide),""!==e&&(this.walletCfgGuide.href=e,Ne.show(this.walletCfgGuide))}},{key:"setError",value:(n=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.page.newWalletErr.textContent=t,Ne.show(this.page.newWalletErr);case 2:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"loadDefaults",value:(t=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.current,n=t.asset,r=t.parentAsset,(a=t.selectedDef).configpath){e.next=3;break}return e.abrupt("return");case 3:if(o=n.id,!r){e.next=8;break}if(!a.seeded){e.next=7;break}return e.abrupt("return");case 7:o=r.id;case 8:return s=ft().loading(this.form),e.next=11,S("/api/defaultwalletcfg",{assetID:o,type:a.type});case 11:if(i=e.sent,s(),ft().checkResponse(i)){e.next=16;break}return this.setError(i.msg),e.abrupt("return");case 16:this.subform.setLoadedConfig(i.config);case 17:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),fr=0,vr=function(){function e(t,n){var r=this;i(this,e),h(this,"page",void 0),h(this,"form",void 0),h(this,"configElements",void 0),h(this,"configOpts",void 0),h(this,"sectionize",void 0),h(this,"allSettings",void 0),h(this,"dynamicOpts",void 0),h(this,"textInputTmpl",void 0),h(this,"dateInputTmpl",void 0),h(this,"checkboxTmpl",void 0),h(this,"repeatableTmpl",void 0),h(this,"fileSelector",void 0),h(this,"fileInput",void 0),h(this,"errMsg",void 0),h(this,"showOther",void 0),h(this,"showIcon",void 0),h(this,"hideIcon",void 0),h(this,"showHideMsg",void 0),h(this,"otherSettings",void 0),h(this,"loadedSettingsMsg",void 0),h(this,"loadedSettings",void 0),h(this,"defaultSettingsMsg",void 0),h(this,"defaultSettings",void 0),h(this,"assetHasActiveOrders",void 0),h(this,"assetID",void 0),this.page=Ne.idDescendants(t),this.form=t,this.configElements=[],this.configOpts=[],this.sectionize=n,this.allSettings=Ne.tmplElement(t,"allSettings"),this.dynamicOpts=Ne.tmplElement(t,"dynamicOpts"),this.textInputTmpl=Ne.tmplElement(t,"textInput"),this.textInputTmpl.remove(),this.dateInputTmpl=Ne.tmplElement(t,"dateInput"),this.dateInputTmpl.remove(),this.checkboxTmpl=Ne.tmplElement(t,"checkbox"),this.checkboxTmpl.remove(),this.repeatableTmpl=Ne.tmplElement(t,"repeatableInput"),this.repeatableTmpl.remove(),this.fileSelector=Ne.tmplElement(t,"fileSelector"),this.fileInput=Ne.tmplElement(t,"fileInput"),this.errMsg=Ne.tmplElement(t,"errMsg"),this.showOther=Ne.tmplElement(t,"showOther"),this.showIcon=Ne.tmplElement(t,"showIcon"),this.hideIcon=Ne.tmplElement(t,"hideIcon"),this.showHideMsg=Ne.tmplElement(t,"showHideMsg"),this.otherSettings=Ne.tmplElement(t,"otherSettings"),this.loadedSettingsMsg=Ne.tmplElement(t,"loadedSettingsMsg"),this.loadedSettings=Ne.tmplElement(t,"loadedSettings"),this.defaultSettingsMsg=Ne.tmplElement(t,"defaultSettingsMsg"),this.defaultSettings=Ne.tmplElement(t,"defaultSettings"),n||Ne.hide(this.showOther),Ne.bind(this.fileSelector,"click",(function(){return r.fileInput.click()})),Ne.bind(this.fileInput,"change",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",r.fileInputChanged());case 1:case"end":return e.stop()}}),e)})))),Ne.bind(this.showOther,"click",(function(){r.setOtherSettingsViz(r.hideIcon.classList.contains("d-hide"))}))}var t;return d(e,[{key:"fileInputChanged",value:(t=s(f().mark((function e(){var t,n,a,o,s,i,c,l;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(Ne.hide(this.errMsg),this.fileInput.value){e.next=3;break}return e.abrupt("return");case 3:if((n=this.fileInput.files)&&0!==n.length){e.next=6;break}return e.abrupt("return");case 6:return a=ft().loading(this.form),e.next=9,n[0].text();case 9:if(o=e.sent){e.next=12;break}return e.abrupt("return");case 12:return e.next=14,S("/api/parseconfig",{configtext:o});case 14:if(s=e.sent,a(),ft().checkResponse(s)){e.next=20;break}return this.errMsg.textContent=s.msg,Ne.show(this.errMsg),e.abrupt("return");case 20:if(0!==Object.keys(s.map).length){e.next=22;break}return e.abrupt("return");case 22:(t=this.dynamicOpts).append.apply(t,r(this.setConfig(s.map))),this.reorder(this.dynamicOpts),i=[this.loadedSettings.children.length,this.defaultSettings.children.length],l=i[1],0===(c=i[0])&&Ne.hide(this.loadedSettings,this.loadedSettingsMsg),0===l&&Ne.hide(this.defaultSettings,this.defaultSettingsMsg),c+l===0&&Ne.hide(this.showOther,this.otherSettings);case 28:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"addOpt",value:function(e,t,n,r){var a,o,s=this;if(t.isboolean)o=this.checkboxTmpl.cloneNode(!0);else if(t.isdate)o=this.dateInputTmpl.cloneNode(!0);else if(t.repeatable){if((o=this.repeatableTmpl.cloneNode(!0)).classList.add("repeatable"),Ne.bind(Ne.tmplElement(o,"add"),"click",(function(){s.addOpt(e,t,o,!0)})),!r)for(var i=0;i<(t.repeatN?t.repeatN-1:0);i++)this.addOpt(e,t,n,!0)}else o=this.textInputTmpl.cloneNode(!0);-1!==((null===(a=ft().extensionWallet(this.assetID))||void 0===a?void 0:a.hiddenFields)||[]).indexOf(t.key)&&Ne.hide(o),this.configElements.push([t,o]);var c=o.querySelector("input");c.dataset.configKey=t.key,fr++;var l="wcfg-"+String(fr);c.id=l;var u=Ne.safeSelector(o,"label");if(u.htmlFor=l,u.prepend(t.displayname),void 0!==t.regAsset){var d=new window.Image(15,15);d.src=Ne.logoPathFromID(t.regAsset||-1),u.prepend(d)}if(n?n.after(o):e.appendChild(o),t.noecho&&(c.type="password",c.autocomplete="off"),t.description&&(u.dataset.tooltip=t.description),t.isboolean)c.checked=t.default;else if(t.isdate){var h=function(e){return e?Lr("now"===e?new Date:new Date(1e3*e)):""};c.max=h(t.max),c.min=h(t.min);var p=t.default?new Date(1e3*t.default):new Date;c.value=Lr(p)}else c.value=null!==t.default?t.default:"";return c.disabled=Boolean(t.disablewhenactive&&this.assetHasActiveOrders),o}},{key:"update",value:function(e,t,n){if(this.assetHasActiveOrders=n,this.configElements=[],this.configOpts=t||[],this.assetID=e,Ne.empty(this.dynamicOpts,this.defaultSettings,this.loadedSettings),0===this.configOpts.length)return Ne.hide(this.form);Ne.show(this.form),this.setOtherSettingsViz(!1),Ne.hide(this.loadedSettingsMsg,this.loadedSettings,this.defaultSettingsMsg,this.defaultSettings,this.errMsg);var r,a=[],o=ur(this.configOpts);try{for(o.s();!(r=o.n()).done;){var s=r.value;this.sectionize&&null!==s.default?a.push(s):this.addOpt(this.dynamicOpts,s)}}catch(e){o.e(e)}finally{o.f()}if(a.length){var i,c=ur(a);try{for(c.s();!(i=c.n()).done;){var l=i.value;this.addOpt(this.defaultSettings,l)}}catch(e){c.e(e)}finally{c.f()}Ne.show(this.showOther,this.defaultSettingsMsg,this.defaultSettings)}else Ne.hide(this.showOther);ft().bindTooltips(this.allSettings),this.dynamicOpts.children.length?Ne.show(this.dynamicOpts):Ne.hide(this.dynamicOpts)}},{key:"setOtherSettingsViz",value:function(e){if(e)return Ne.hide(this.showIcon),Ne.show(this.hideIcon,this.otherSettings),void(this.showHideMsg.textContent=ke("HIDE_ADDITIONAL_SETTINGS"));Ne.hide(this.hideIcon,this.otherSettings),Ne.show(this.showIcon),this.showHideMsg.textContent=ke("SHOW_ADDITIONAL_SETTINGS")}},{key:"setConfig",value:function(e){for(var t,n=[],o={},s=[],i=0,c=r(this.configElements);i<c.length;i++){var l=c[i],u=a(l,2),d=u[0],h=u[1],p=e[d.key];if(void 0!==p)if(d.repeatable){if(o[d.key]){h.remove(),s.push(l);continue}o[d.key]=!0;var f=p.split(d.repeatable),v=f[0];n.push(h),Ne.safeSelector(h,"input").value=v;for(var m=1;m<(d.repeatN||1);m++)n.push(this.addOpt(h.parentElement,d,h,!0));for(var g=1;g<f.length;g++){var y=this.addOpt(h.parentElement,d,h,!0);Ne.safeSelector(y,"input").value=f[g],n.push(y)}}else{n.push(h);var b=Ne.safeSelector(h,"input");d.isboolean?b.checked="1"===(t=p)||"true"===t.toLowerCase():d.isdate?b.value=Lr(new Date(1e3*parseInt(p))):b.value=p}}for(var x=0,k=s;x<k.length;x++){var w=k[x],C=this.configElements.indexOf(w);C>=0&&this.configElements.splice(C,1)}return n}},{key:"setLoadedConfig",value:function(e){var t,n=this.setConfig(e);this.sectionize&&0!==n.length&&((t=this.loadedSettings).append.apply(t,r(n)),this.reorder(this.loadedSettings),Ne.show(this.loadedSettings,this.loadedSettingsMsg),0===this.defaultSettings.children.length&&Ne.hide(this.defaultSettings,this.defaultSettingsMsg))}},{key:"map",value:function(e){var t,n={},r=ur(this.configElements);try{for(r.s();!(t=r.n()).done;){var o=a(t.value,2),s=o[0],i=o[1],c=Ne.safeSelector(i,"input");if(void 0===s.regAsset||s.regAsset===e)if(s.isboolean&&s.key)n[s.key]=c.checked?"1":"0";else if(s.isdate&&s.key){var l=c.min?Pr(new Date(c.min+"T00:00")):Number.MIN_SAFE_INTEGER,u=c.max?Pr(new Date(c.max+"T00:00")):Number.MAX_SAFE_INTEGER,d=c.value?Pr(new Date(c.value+"T00:00")):0;d<l?d=l:d>u&&(d=u),n[s.key]=String(d)}else c.value&&(s.repeatable&&n[s.key]?n[s.key]+=s.repeatable+c.value:n[s.key]=c.value)}}catch(e){r.e(e)}finally{r.f()}return n}},{key:"reorder",value:function(e){var t=this,n={};e.querySelectorAll("input").forEach((function(e){var r=e.dataset.configKey;if(r){var o,s=[],i=ur(t.configElements);try{for(i.s();!(o=i.n()).done;){var c=a(o.value,2),l=c[0],u=c[1];l.key===r&&s.push(u)}}catch(e){i.e(e)}finally{i.f()}n[r]=s}}));var r,o=ur(this.configOpts);try{for(o.s();!(r=o.n()).done;){var s,i=r.value,c=ur(n[i.key]||[]);try{for(c.s();!(s=c.n()).done;){var l=s.value;e.append(l)}}catch(e){c.e(e)}finally{c.f()}}}catch(e){o.e(e)}finally{o.f()}}}]),e}(),mr=function(){function e(t,n,r){var a=this;i(this,e),h(this,"form",void 0),h(this,"success",void 0),h(this,"page",void 0),h(this,"xc",void 0),h(this,"certFile",void 0),h(this,"bondAssetID",void 0),h(this,"tier",void 0),h(this,"fees",void 0),this.form=t,this.success=n,this.page=Ne.parseTemplate(t),this.certFile="",Ne.bind(this.page.goBack,"click",(function(){return r()})),Br(t,this.page.submit,(function(){return a.submitForm()}))}var t,n;return d(e,[{key:"setExchange",value:function(e,t){this.xc=e,this.certFile=t,this.page.host.textContent=e.host}},{key:"setAsset",value:function(e,t,n){var r=ft().assets[e],a=r.unitInfo.conventional,o=a.conversionFactor,s=a.unit;this.bondAssetID=r.id,this.tier=t,this.fees=n;var i=this.page,c=this.xc.bondAssets[r.symbol].amount*t*2/o;i.tradingTier.textContent=String(t),i.logo.src=Ne.logoPath(r.symbol),i.bondLock.textContent=Ne.formatFourSigFigs(c),i.bondUnit.textContent=s;var l=ft().fiatRatesMap[e];Ne.show(i.bondLockUSDBox),l?i.bondLockUSD.textContent=Ne.formatFourSigFigs(c*l):Ne.hide(i.bondLockUSDBox),n&&(i.feeReserves.textContent=Ne.formatFourSigFigs(n/o)),i.reservesUnit.textContent=s}},{key:"setFees",value:function(e,t){this.fees=t;var n=ft().assets[e].unitInfo.conventional.conversionFactor;this.page.feeReserves.textContent=Ne.formatFourSigFigs(t/n)}},{key:"animate",value:(n=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.form,Ne.animate(400,(function(e){t.style.transform="scale(".concat(e,")"),t.style.opacity=String(Math.pow(e,4));var n="".concat(500*(1-e),"px");t.style.top=n,t.style.left=n}));case 2:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"submitForm",value:(t=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l,u,d,h;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n=this.bondAssetID,r=this.xc,a=this.certFile,o=this.tier,s=ft().assets[n]){e.next=6;break}return t.regErr.innerText=ke("SELECT_WALLET_FOR_FEE_PAYMENT"),Ne.show(t.regErr),e.abrupt("return");case 6:return Ne.hide(t.regErr),i=r.bondAssets[s.wallet.symbol],c=r.host,!ft().exchanges[r.host]||ft().exchanges[r.host].viewOnly?(l={addr:c,cert:a,bond:i.amount*o,asset:i.id},u="/api/postbond"):(l={host:c,targetTier:o,bondAssetID:n},u="/api/updatebondoptions"),d=ft().loading(this.form),e.next=13,S(u,l);case 13:if(h=e.sent,d(),ft().checkResponse(h)){e.next=19;break}return t.regErr.textContent=h.msg,Ne.show(t.regErr),e.abrupt("return");case 19:this.success();case 20:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),gr=function(){function e(t,n){var r=this;i(this,e),h(this,"form",void 0),h(this,"success",void 0),h(this,"xc",void 0),h(this,"selectedAssetID",void 0),h(this,"certFile",void 0),h(this,"page",void 0),h(this,"assetRows",void 0),h(this,"marketRows",void 0),this.form=t,this.certFile="",this.success=n;var a=this.page=Ne.parseTemplate(t);Ne.cleanTemplates(a.currentBondTmpl,a.bondAssetTmpl,a.marketTmpl),Ne.bind(a.tradingTierInput,"input",(function(){r.setTier()})),Ne.bind(a.tradingTierInput,"keyup",(function(e){"Enter"===e.key&&r.acceptTier()})),Ne.bind(a.submitTradingTier,"click",(function(){r.acceptTier()})),Ne.bind(a.tierUp,"click",(function(){r.incrementTier(!0)})),Ne.bind(a.tierDown,"click",(function(){r.incrementTier(!1)})),Ne.bind(a.goBackToAssets,"click",(function(){Ne.hide(a.tradingTierForm),Ne.show(a.assetForm)})),Ne.bind(a.whatsABond,"click",(function(){Ne.hide(a.assetForm),Ne.show(a.whatsABondPanel)}));var o=function(){Ne.show(a.assetForm),Ne.hide(a.whatsABondPanel)};Ne.bind(a.bondGotIt,"click",(function(){o()})),Ne.bind(a.whatsABondBack,"click",(function(){o()})),Ne.bind(a.usePrepaidBond,"click",(function(){r.showPrepaidBondForm()})),Ne.bind(a.ppbGoBack,"click",(function(){r.hidePrepaidBondForm()})),Ne.bind(a.submitPrepaidBond,"click",(function(){r.submitPrepaidBond()})),ft().registerNoteFeeder({createwallet:function(e){"QueuedCreationSuccess"===e.topic&&r.walletCreated(e.assetID)}})}var t,n;return d(e,[{key:"setTierError",value:function(e){this.page.tradingTierErr.textContent=e,Ne.show(this.page.tradingTierErr)}},{key:"setAssetError",value:function(e){this.page.regAssetErr.textContent=e,Ne.show(this.page.regAssetErr)}},{key:"clearErrors",value:function(){Ne.hide(this.page.regAssetErr,this.page.tradingTierErr)}},{key:"setExchange",value:function(e,t){var n=this;this.xc=e,this.certFile=t,this.assetRows={},this.marketRows=[];var r=this.page;Ne.hide(r.assetForm,r.tradingTierForm,r.whatsABondPanel,r.prepaidBonds),Ne.empty(r.bondAssets,r.markets),this.clearErrors();for(var a=function(e,t){var a=ft().assets[e];if(a){var o=a.unitInfo.conventional,s=o.unit,i=o.conversionFactor,c=a.name,l=a.symbol,u=r.bondAssetTmpl.cloneNode(!0);r.bondAssets.appendChild(u);var d=Ne.parseTemplate(u);d.logo.src=Ne.logoPath(l),d.name.textContent=c,Ne.bind(u,"click",(function(){n.assetSelected(e)})),d.feeSymbol.textContent=s;var h=t.amount/i;d.feeAmt.textContent=Ne.formatFourSigFigs(h);var p=ft().fiatRatesMap[e];Ne.setVis(p,d.fiatBox),p&&(d.fiatBondAmount.textContent=Ne.formatFourSigFigs(h*p)),n.assetRows[e]={ready:d.ready}}},o=function(t){var a=t.baseid,o=t.quoteid,s=[ft().assets[a],ft().assets[o]];if(s[0]&&s[1]){var i=r.marketTmpl.cloneNode(!0);r.markets.appendChild(i);var c,l=e.assets[a],u=l.symbol,d=l.unitInfo,h=e.assets[o],p=h.symbol,f=h.unitInfo,v=ur(Ne.applySelector(i,"[data-base-ticker]"));try{for(v.s();!(c=v.n()).done;)c.value.textContent=d.conventional.unit}catch(e){v.e(e)}finally{v.f()}var m,g=ur(Ne.applySelector(i,"[data-quote-ticker]"));try{for(g.s();!(m=g.n()).done;)m.value.textContent=f.conventional.unit}catch(e){g.e(e)}finally{g.f()}var y=Ne.parseTemplate(i);y.baseLogo.src=Ne.logoPath(u),y.quoteLogo.src=Ne.logoPath(p);var b=function(e){var n=t.parcelsize,o=t.lotsize/d.conventional.conversionFactor,s=o*n*2*e,i=o*n*2*3*e;y.tradeLimitLow.textContent=Ne.formatFourSigFigs(s),y.tradeLimitHigh.textContent=Ne.formatFourSigFigs(i);var c=ft().fiatRatesMap[a];c&&(y.fiatTradeLimitLow.textContent=Ne.formatFourSigFigs(s*c),y.fiatTradeLimitHigh.textContent=Ne.formatFourSigFigs(i*c)),Ne.setVis(c,r.fiatTradeLowBox,r.fiatTradeHighBox)};b(dn(e.auth)||1),n.marketRows.push({mkt:t,tmpl:y,setTier:b})}},s=0,i=Object.values(e.assets||{});s<i.length;s++){var c=i[s],l=c.symbol,u=c.id;if(ft().assets[u]){var d=e.bondAssets[l];d&&a(u,d)}}for(var h=0,p=Object.values(e.markets||{});h<p.length;h++)o(p[h]);r.tradingTierInput.value=e.auth.targetTier?String(e.auth.targetTier):"1",this.validBondAssetSelected(e)?this.assetSelected(e.auth.bondAssetID):Ne.show(r.assetForm)}},{key:"validBondAssetSelected",value:function(e){if(e.viewOnly)return!1;var t=e.auth,n=t.targetTier,r=t.bondAssetID;if(n<1)return!1;var a=ft().assets[r];return a&&Boolean(e.bondAssets[a.symbol])}},{key:"walletCreated",value:function(e){var t=this.assetRows[e],n=ft().assets[e];!function(e,t){t.wallet?e.textContent=ke("WALLET_READY"):t.walletCreationPending?e.textContent=ke("WALLET_PENDING"):e.textContent=ke("SETUP_NEEDED"),e.classList.remove("readygreen","setuporange"),e.classList.add(t.wallet?"readygreen":"setuporange")}(t.ready,n)}},{key:"refresh",value:function(){this.setExchange(this.xc,this.certFile)}},{key:"assetSelected",value:function(e){this.selectedAssetID=e,this.setTier();var t=this.page,n=t.assetForm,r=t.tradingTierForm,a=t.tradingTierInput;Ne.hide(n),Ne.show(r),a.focus()}},{key:"setTier",value:function(){var e,t=this.page,n=this.xc.bondAssets,r=this.selectedAssetID,o=ft().assets[r],s=o.symbol,i=o.unitInfo,c=i.conventional,l=c.conversionFactor,u=c.unit,d=n[s],h=null!==(e=t.tradingTierInput.value)&&void 0!==e?e:"";if(h){var p=parseInt(h);if(isNaN(p))this.setTierError(ke(ie));else{t.tradingTierInput.value=String(p),t.bondSizeDisplay.textContent=Ne.formatCoinValue(d.amount,i);var f,v=ur(Ne.applySelector(t.tradingTierForm,"[data-tier]"));try{for(v.s();!(f=v.n()).done;)f.value.textContent=String(p)}catch(e){v.e(e)}finally{v.f()}var m,g=ur(Ne.applySelector(t.tradingTierForm,"[data-bond-asset-ticker]"));try{for(g.s();!(m=g.n()).done;)m.value.textContent=u}catch(e){g.e(e)}finally{g.f()}var y=d.amount*p*2;t.bondLockDisplay.textContent=Ne.formatCoinValue(y,i);var b=ft().fiatRatesMap[r];b&&(t.fiatLockDisplay.textContent=Ne.formatFourSigFigs(y/l*b));for(var x=0,k=Object.values(this.marketRows);x<k.length;x++)k[x].setTier(p);for(var w={},C=0,S=Object.entries(ft().assets);C<S.length;C++){var F=a(S[C],2),T=F[0],D=F[1].wallet;if(D){var I=D.balance,A=I.bondlocked+I.bondReserves;A>0&&(w[parseInt(T)]=A)}}var R=Object.keys(w).length>0;if(Ne.setVis(R,t.currentBondBox),R){Ne.empty(t.currentBonds);for(var E=0,B=Object.entries(w);E<B.length;E++){var P=a(B[E],2),L=P[0],O=P[1],M=parseInt(L),q=ft().assets[M],N=q.unitInfo,W=q.symbol,V=q.name,U=N.conventional,_=U.conversionFactor,j=U.unit,H=t.currentBondTmpl.cloneNode(!0);t.currentBonds.appendChild(H);var z=Ne.parseTemplate(H);z.icon.src=Ne.logoPath(W),z.name.textContent=V,z.amt.textContent=Ne.formatCoinValue(O,N),z.ticker.textContent=j,z.name.textContent=V;var G=ft().fiatRatesMap[M];Ne.setVis(z.fiatBox),G&&(z.fiatAmt.textContent=Ne.formatFourSigFigs(O/_*G))}}Ne.setVis(b,t.fiatLockBox)}}}},{key:"acceptTier",value:function(){var e,t=this.page,n=this.selectedAssetID;this.clearErrors();var r=null!==(e=t.tradingTierInput.value)&&void 0!==e?e:"";if(r){var a=parseInt(r);isNaN(a)?this.setTierError(ke(ie)):this.success(n,a)}}},{key:"incrementTier",value:function(e){var t,n=this.page.tradingTierInput;n.value=String(Math.max(1,(parseInt(null!==(t=n.value)&&void 0!==t?t:"")||1)+(e?1:-1))),this.setTier()}},{key:"animate",value:(n=s(f().mark((function e(){var t,n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.form,r=Array.from(t.bondAssets.children),n.style.opacity="0",e.next=8,Ne.animate(350,(function(e){for(var t=0,a=r;t<a.length;t++){var o=a[t];o.style.marginTop="".concat(75*(1-e),"px"),o.style.transform="scale(".concat(e,")")}n.style.opacity=Math.pow(e,4).toFixed(1),n.style.top="".concat(50*(1-e),"px")}),"easeOut");case 8:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"showPrepaidBondForm",value:function(){var e=this.page;Ne.hide(e.assetForm,e.prepaidBondErr),e.prepaidBondCode.value="",Ne.show(e.prepaidBonds)}},{key:"hidePrepaidBondForm",value:function(){var e=this.page;Ne.hide(e.prepaidBonds),Ne.show(e.assetForm)}},{key:"submitPrepaidBond",value:(t=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n=this.xc.host,Ne.hide(t.prepaidBondErr),r=t.prepaidBondCode.value){e.next=7;break}return t.prepaidBondErr.textContent=ke(ue),Ne.show(t.prepaidBondErr),e.abrupt("return");case 7:return e.next=9,S("/api/redeemprepaidbond",{host:n,code:r,cert:this.certFile});case 9:if(a=e.sent,ft().checkResponse(a)){e.next=14;break}return t.prepaidBondErr.textContent=a.msg,Ne.show(t.prepaidBondErr),e.abrupt("return");case 14:this.success(pt,a.tier);case 15:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),yr=function(){function e(t,n,r){var a=this;i(this,e),h(this,"form",void 0),h(this,"success",void 0),h(this,"goBack",void 0),h(this,"page",void 0),h(this,"assetID",void 0),h(this,"parentID",void 0),h(this,"xc",void 0),h(this,"bondAsset",void 0),h(this,"progressCache",void 0),h(this,"progressed",void 0),h(this,"funded",void 0),h(this,"bondFeeBuffer",void 0),h(this,"parentAssetSynced",void 0),this.form=t,this.success=n,this.page=Ne.parseTemplate(t),this.assetID=-1,this.progressCache=[],this.progressed=!1,this.funded=!1,Ne.bind(this.page.goBack,"click",(function(){a.assetID=-1,r()})),ft().registerNoteFeeder({walletstate:function(e){return a.reportWalletState(e.wallet)},walletsync:function(e){if(e.assetID===a.assetID){var t=ft().walletMap[e.assetID];a.reportProgress(t.synced,t.syncProgress)}},balance:function(e){return a.reportBalance(e.assetID)}})}return d(e,[{key:"setExchange",value:function(e){this.xc=e}},{key:"setWallet",value:function(e,t,n){this.assetID=e,this.progressCache=[],this.progressed=!1,this.funded=!1,this.bondFeeBuffer=t,this.parentAssetSynced=!1;var r=this.page,a=ft().assets[e],o=a.symbol,s=a.unitInfo,i=a.wallet,c=i.balance,l=i.address,u=i.synced,d=i.syncProgress,h=a.token;this.parentID=null==h?void 0:h.parentID;var p,f=this.bondAsset=this.xc.bondAssets[o],v=function(e,t){Ne.empty(e),e.appendChild(Ne.symbolize(t))},m=ur(Ne.applySelector(this.form,".unit"));try{for(m.s();!(p=m.n()).done;)v(p.value,a)}catch(e){m.e(e)}finally{m.f()}r.logo.src=Ne.logoPath(o),r.depoAddr.textContent=l,Ne.hide(r.syncUncheck,r.syncCheck,r.balUncheck,r.balCheck,r.syncRemainBox,r.bondCostBreakdown),Ne.show(r.balanceBox);var g=2*f.amount*n;if(t>0){Ne.show(r.bondCostBreakdown),r.bondLockNoFees.textContent=Ne.formatCoinValue(g,s),r.bondLockFees.textContent=Ne.formatCoinValue(t,s),g+=t;var y=Math.max(g-c.available+c.reservesDeficit,0);if(r.totalForBond.textContent=Ne.formatCoinValue(y,s),Ne.hide(r.sendEnough),Ne.hide(r.txFeeBox,r.sendEnoughForToken,r.txFeeBalanceBox),Ne.hide(r.sendEnoughWithEst),h){Ne.show(r.txFeeBox,r.sendEnoughForToken,r.txFeeBalanceBox);var b=ft().assets[h.parentID];r.txFee.textContent=Ne.formatCoinValue(t,b.unitInfo),r.parentFees.textContent=Ne.formatCoinValue(t,b.unitInfo),r.tokenFees.textContent=Ne.formatCoinValue(y,s),v(r.txFeeUnit,b),v(r.parentUnit,b),v(r.parentBalUnit,b),r.parentBal.textContent=b.wallet?Ne.formatCoinValue(b.wallet.balance.available,b.unitInfo):"0"}else Ne.show(r.sendEnoughWithEst);r.fee.textContent=Ne.formatCoinValue(g,s)}else Ne.show(r.sendEnough);Ne.show(u?r.syncCheck:d>=1?r.syncSpinner:r.syncUncheck),Ne.show(c.available>=2*f.amount+t?r.balCheck:r.balUncheck),r.progress.textContent=(100*d).toFixed(1),u&&(this.progressed=!0),this.reportBalance(e)}},{key:"reportWalletState",value:function(e){this.progressed&&this.funded||(e.assetID===this.assetID&&this.reportProgress(e.synced,e.syncProgress),this.reportBalance(e.assetID))}},{key:"reportBalance",value:function(e){if(!this.funded&&-1!==this.assetID&&(e===this.assetID||e===this.parentID)){var t=this.page,n=ft().assets[this.assetID],r=n.wallet.balance.available;if(t.balance.textContent=Ne.formatCoinValue(r,n.unitInfo),n.token){var a=ft().assets[n.token.parentID],o=a.wallet.balance.available;if(t.parentBal.textContent=Ne.formatCoinValue(o,a.unitInfo),o<this.bondFeeBuffer)return}r<2*this.bondAsset.amount+this.bondFeeBuffer||(Ne.show(t.balCheck),Ne.hide(t.balUncheck,t.balanceBox,t.sendEnough),this.funded=!0,this.progressed&&this.success())}}},{key:"reportProgress",value:function(e,t){var n=this.page;if(e)return n.progress.textContent="100",Ne.hide(n.syncUncheck,n.syncRemainBox,n.syncSpinner),Ne.show(n.syncCheck),this.progressed=!0,void(this.funded&&this.success());if(1===t?(Ne.hide(n.syncUncheck),Ne.show(n.syncSpinner)):(Ne.hide(n.syncSpinner),Ne.show(n.syncUncheck)),n.progress.textContent=(100*t).toFixed(1),t>=.999)return Ne.hide(n.syncRemaining),Ne.show(n.syncFinishingUp),Ne.show(n.syncRemainBox),void(n.syncFinishingUp.textContent=ke("WALLET_SYNC_FINISHING_UP"));var r=this.progressCache;if(r.push({stamp:(new Date).getTime(),progress:t}),!(r.length<2)){for(;r.length>20;)r.shift();var a=[r[0],r[r.length-1]],o=a[0],s=a[1],i=s.progress-o.progress;if(0!==i){Ne.hide(n.syncFinishingUp),Ne.show(n.syncRemaining),Ne.show(n.syncRemainBox);var c=i/(s.stamp-o.stamp),l=(1-s.progress)/c;n.syncRemain.textContent=Ne.formatDuration(l)}}}}]),e}(),br=function(){function e(t,n){var r=this;i(this,e),h(this,"form",void 0),h(this,"page",void 0),h(this,"order",void 0),h(this,"acceleratedRate",void 0),h(this,"earlyAcceleration",void 0),h(this,"currencyUnit",void 0),h(this,"success",void 0),this.form=t,this.success=n;var a=this.page=Ne.idDescendants(t);Ne.bind(a.accelerateSubmit,"click",(function(){r.submit()})),Ne.bind(a.submitEarlyConfirm,"click",(function(){r.sendAccelerateRequest()}))}var t,n,r,a;return d(e,[{key:"displayEarlyAccelerationMsg",value:function(){var e=this.page;this.earlyAcceleration&&(e.recentAccelerationTime.textContent="".concat(Math.floor(this.earlyAcceleration.timePast/60)),e.recentSwapTime.textContent="".concat(Math.floor(this.earlyAcceleration.timePast/60)),this.earlyAcceleration.wasAcceleration?(Ne.show(e.recentAccelerationMsg),Ne.hide(e.recentSwapMsg),e.recentAccelerationTime.textContent="".concat(Math.floor(this.earlyAcceleration.timePast/60))):(Ne.show(e.recentSwapMsg),Ne.hide(e.recentAccelerationMsg),e.recentSwapTime.textContent="".concat(Math.floor(this.earlyAcceleration.timePast/60))),Ne.hide(e.configureAccelerationDiv,e.accelerateErr),Ne.show(e.earlyAccelerationDiv))}},{key:"sendAccelerateRequest",value:(a=s(f().mark((function e(){var t,n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.order,n=this.page,r={orderID:t.id,newRate:this.acceleratedRate},a=ft().loading(n.accelerateMainDiv),e.next=6,S("/api/accelerateorder",r);case 6:o=e.sent,a(),ft().checkResponse(o)?(n.accelerateTxID.textContent=o.txID,Ne.hide(n.accelerateMainDiv,n.preAccelerateErr,n.accelerateErr),Ne.show(n.accelerateMsgDiv,n.accelerateSuccess),this.success()):(n.accelerateErr.textContent=ke(Z,{msg:o.msg}),Ne.hide(n.earlyAccelerationDiv),Ne.show(n.accelerateErr,n.configureAccelerationDiv));case 9:case"end":return e.stop()}}),e,this)}))),function(){return a.apply(this,arguments)})},{key:"submit",value:(r=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.earlyAcceleration?this.displayEarlyAccelerationMsg():this.sendAccelerateRequest();case 1:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"refresh",value:(n=s(f().mark((function e(t){var n,r,a,o,s,i,c=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,this.order=t,e.next=4,S("/api/preaccelerate",t.id);case 4:if(r=e.sent,ft().checkResponse(r)){e.next=10;break}return n.preAccelerateErr.textContent=ke(Z,{msg:r.msg}),Ne.hide(n.accelerateMainDiv,n.accelerateSuccess),Ne.show(n.accelerateMsgDiv,n.preAccelerateErr),e.abrupt("return");case 10:Ne.hide(n.accelerateMsgDiv,n.preAccelerateErr,n.accelerateErr,n.feeEstimateDiv,n.earlyAccelerationDiv),Ne.show(n.accelerateMainDiv,n.accelerateSuccess,n.configureAccelerationDiv),a=r.preAccelerate,this.earlyAcceleration=a.earlyAcceleration,this.currencyUnit=a.suggestedRange.yUnit,n.accelerateAvgFeeRate.textContent="".concat(a.swapRate," ").concat(a.suggestedRange.yUnit),n.accelerateCurrentFeeRate.textContent="".concat(a.suggestedRate," ").concat(a.suggestedRange.yUnit),this.acceleratedRate=a.suggestedRange.start.y,o=function(){},s=function(e,t){c.acceleratedRate=t},i=new kt(a.suggestedRange,a.suggestedRange.start.x,{updated:s,changed:function(){return c.updateAccelerationEstimate()},selected:o,roundY:!0}),Ne.empty(n.sliderContainer),n.sliderContainer.appendChild(i.control),this.updateAccelerationEstimate();case 25:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"updateAccelerationEstimate",value:(t=s(f().mark((function e(){var t,n,r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.order,r={orderID:n.id,newRate:this.acceleratedRate},a=ft().loading(t.sliderContainer),e.next=6,S("/api/accelerationestimate",r);case 6:if(o=e.sent,a(),ft().checkResponse(o)){e.next=12;break}return t.accelerateErr.textContent=ke("ORDER_ACCELERATION_FEE_ERR_MSG",{msg:o.msg}),Ne.show(t.accelerateErr),e.abrupt("return");case 12:t.feeRateEstimate.textContent="".concat(this.acceleratedRate," ").concat(this.currencyUnit),n.sell?(s=n.baseID,i=n.baseSymbol):(s=n.quoteID,i=n.quoteSymbol),c=ft().unitInfo(s),t.feeEstimate.textContent="".concat(o.fee/c.conventional.conversionFactor," ").concat(i),Ne.show(t.feeEstimateDiv);case 17:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),xr=function(){function e(t,n,r){var a=this;i(this,e),h(this,"form",void 0),h(this,"success",void 0),h(this,"page",void 0),h(this,"knownExchanges",void 0),h(this,"dexToUpdate",void 0),h(this,"certPicker",void 0),this.form=t,this.success=n;var o=this.page=Ne.parseTemplate(t);this.certPicker=new Fr(t),Ne.bind(o.skipRegistration,"change",(function(){return a.showOrHideSubmitBttn()})),Ne.bind(o.showCustom,"click",(function(){Ne.hide(o.showCustom),Ne.show(o.customBox,o.auth)})),this.knownExchanges=Array.from(o.knownXCs.querySelectorAll(".known-exchange"));var s,c=ur(this.knownExchanges);try{var l=function(){var e=s.value;Ne.bind(e,"click",(function(){var t,n=e.dataset.host,r=ur(a.knownExchanges);try{for(r.s();!(t=r.n()).done;)t.value.classList.remove("selected")}catch(e){r.e(e)}finally{r.f()}return a.checkDEX(n)}))};for(c.s();!(s=c.n()).done;)l()}catch(e){c.e(e)}finally{c.f()}Br(t,o.submit,(function(){return a.checkDEX()})),r&&(Ne.hide(o.addDexHdr,o.skipRegistrationBox),Ne.show(o.updateDexHdr),this.dexToUpdate=r),this.refresh()}var t,n;return d(e,[{key:"refresh",value:function(){var e=this.page;e.addr.value="",this.certPicker.clearCertFile(),Ne.hide(e.err),0===this.knownExchanges.length||this.dexToUpdate?(Ne.show(e.customBox,e.auth),Ne.hide(e.showCustom,e.knownXCs,e.pickServerMsg,e.addCustomMsg)):(Ne.hide(e.customBox),Ne.show(e.showCustom));var t,n=ur(this.knownExchanges);try{for(n.s();!(t=n.n()).done;)t.value.classList.remove("selected")}catch(e){n.e(e)}finally{n.f()}this.showOrHideSubmitBttn()}},{key:"showOrHideSubmitBttn",value:function(){var e=this.page;Ne.setVis(Ne.isDisplayed(e.customBox),e.auth)}},{key:"skipRegistration",value:function(){var e;return null!==(e=this.page.skipRegistration.checked)&&void 0!==e&&e}},{key:"animate",value:(n=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.form,Ne.animate(550,(function(e){t.style.transform="scale(".concat(.9+.1*e,")"),t.style.opacity=String(Math.pow(e,4))}),"easeOut");case 2:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"checkDEX",value:(t=s(f().mark((function e(t){var n,r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,Ne.hide(n.err),""!==(t=t||n.addr.value)){e.next=7;break}return n.err.textContent=ke("EMPTY_DEX_ADDRESS_MSG"),Ne.show(n.err),e.abrupt("return");case 7:return e.next=9,this.certPicker.file();case 9:return r=e.sent,a=this.skipRegistration(),this.dexToUpdate?(o="/api/updatedexhost",s={newHost:t,cert:r,oldHost:this.dexToUpdate}):(o=a?"/api/adddex":"/api/discoveracct",s={addr:t,cert:r}),i=ft().loading(this.form),e.next=15,S(o,s);case 15:if(c=e.sent,i(),ft().checkResponse(c)){e.next=20;break}return String(c.msg).includes("certificate required")?Ne.show(n.needCert):(n.err.textContent=c.msg,Ne.show(n.err)),e.abrupt("return");case 20:return e.next=22,ft().fetchUser();case 22:if(this.dexToUpdate||!(a||c.paid||Object.keys(c.xc.auth.pendingBonds).length>0)){e.next=26;break}return e.next=25,ft().loadPage("markets");case 25:return e.abrupt("return");case 26:this.success(c.xc,r);case 27:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})}]),e}(),kr=function(){function e(t,n,r){var a=this;i(this,e),h(this,"form",void 0),h(this,"addr",void 0),h(this,"success",void 0),h(this,"page",void 0),this.form=t,this.addr=n,this.success=r;var o=this.page=Ne.parseTemplate(t);o.dexHost.textContent=n,Br(t,o.submit,(function(){return a.checkDEX()}))}var t,n;return d(e,[{key:"animate",value:(n=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.form,Ne.animate(550,(function(e){t.style.transform="scale(".concat(.9+.1*e,")"),t.style.opacity=String(Math.pow(e,4))}),"easeOut");case 2:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"checkDEX",value:(t=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,Ne.hide(t.err),n={addr:this.addr},r=ft().loading(this.form),e.next=6,S("/api/discoveracct",n);case 6:if(a=e.sent,r(),ft().checkResponse(a)){e.next=12;break}return t.err.textContent=a.msg,Ne.show(t.err),e.abrupt("return");case 12:if(!a.paid){e.next=18;break}return e.next=15,ft().fetchUser();case 15:return e.next=17,ft().loadPage("markets");case 17:return e.abrupt("return");case 18:this.success(a.xc);case 19:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),wr=function(){function e(t,n){var r=this;i(this,e),h(this,"form",void 0),h(this,"success",void 0),h(this,"page",void 0),this.success=n,this.form=t,Br(t,(this.page=Ne.parseTemplate(t)).submit,(function(){r.submit()})),ft().registerNoteFeeder({login:function(e){r.handleLoginNote(e)}})}var t,n;return d(e,[{key:"handleLoginNote",value:function(e){if(""!==e.details){var t=Ne.idel(this.form,"loaderMsg");Ne.show(t),t&&(t.textContent=e.details)}}},{key:"focus",value:function(){this.page.pw.focus()}},{key:"refresh",value:function(){Ne.hide(this.page.errMsg),this.page.pw.value=""}},{key:"submit",value:(n=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,Ne.hide(t.errMsg),""!==(n=t.pw.value||"")){e.next=6;break}return Ne.showFormError(t.errMsg,ke(R)),e.abrupt("return");case 6:return r=ft().loading(this.form),e.next=9,S("/api/login",{pass:n});case 9:if(a=e.sent,r(),t.pw.value="",ft().checkResponse(a)){e.next=15;break}return Ne.showFormError(t.errMsg,a.msg),e.abrupt("return");case 15:return e.next=17,ft().fetchUser();case 17:a.notes=a.notes||[],a.notes.reverse(),a.pokes=a.pokes||[],ft().loggedIn(a.notes,a.pokes),this.success();case 22:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"animate",value:(t=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.form,Ne.animate(550,(function(e){t.style.transform="scale(".concat(.9+.1*e,")"),t.style.opacity=String(Math.pow(e,4))}),"easeOut");case 2:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),Cr=function(){function e(t){var n=this;i(this,e),h(this,"form",void 0),h(this,"page",void 0),h(this,"assetID",void 0),this.form=t;var r=this.page=Ne.idDescendants(t);Ne.cleanTemplates(r.unifiedReceiverTmpl),Ne.bind(r.newDepAddrBttn,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.newDepositAddress();case 1:case"end":return e.stop()}}),e)})))),Ne.bind(r.copyAddressBtn,"click",(function(){n.copyAddress()}))}var t,n,r;return d(e,[{key:"setAsset",value:(r=s(f().mark((function e(t){var n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.assetID=t,n=this.page,Ne.hide(n.depositErr,n.depositTokenMsgBox),r=ft().assets[t],n.depositLogo.src=Ne.logoPath(r.symbol),a=ft().walletMap[t],n.depositName.textContent=r.unitInfo.conventional.unit,r.token&&(o=ft().assets[r.token.parentID],n.depositTokenParentLogo.src=Ne.logoPath(o.symbol),n.depositTokenParentName.textContent=o.name,Ne.show(n.depositTokenMsgBox)),Ne.setVis(!!(2&a.traits),n.newDepAddrBttnBox),this.setAddress(a.address);case 10:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"setAddress",value:function(e){var t=this,n=this.page;if(Ne.hide(n.unifiedReceivers),e.startsWith("unified:")){var r=JSON.parse(e.substring(8));Ne.empty(n.unifiedReceivers),Ne.show(n.unifiedReceivers);for(var o=function(){var e=a(i[s],2),r=e[0],o=e[1],c=n.unifiedReceiverTmpl.cloneNode(!0);n.unifiedReceivers.appendChild(c),c.textContent=r,c.dataset.type=r,"unified"===r&&c.classList.add("selected"),Ne.bind(c,"click",(function(){for(var e=0,a=Array.from(n.unifiedReceivers.children);e<a.length;e++){var s=a[e];s.classList.toggle("selected",s.dataset.type===r)}t.setCentralAddress(o)}))},s=0,i=Object.entries(r);s<i.length;s++)o();e=r.unified}this.setCentralAddress(e)}},{key:"setCentralAddress",value:function(e){var t=this.page;t.depositAddress.textContent=e,t.qrcode.src="/generateqrcode?address=".concat(e)}},{key:"newDepositAddress",value:(n=s(f().mark((function e(){var t,n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.assetID,r=this.form,Ne.hide(t.depositErr),a=ft().loading(r),e.next=5,S("/api/depositaddress",{assetID:n});case 5:if(o=e.sent,a(),ft().checkResponse(o)){e.next=11;break}return t.depositErr.textContent=o.msg,Ne.show(t.depositErr),e.abrupt("return");case 11:ft().walletMap[n].address=o.address,this.setAddress(o.address);case 13:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"copyAddress",value:(t=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.page,navigator.clipboard.writeText(t.depositAddress.textContent||"").then((function(){Ne.show(t.copyAlert),setTimeout((function(){Ne.hide(t.copyAlert)}),800)})).catch((function(e){console.error("Unable to copy: ",e)}));case 2:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),Sr=function(){function e(t,n){var r=this;i(this,e),h(this,"form",void 0),h(this,"page",void 0),h(this,"success",void 0),this.form=t,this.success=n,Br(t,(this.page=Ne.idDescendants(t)).resetAppPWSubmitBtn,(function(){return r.resetAppPW()}))}var t;return d(e,[{key:"resetAppPW",value:(t=s(f().mark((function e(){var t,n,r,a,o,s=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n=t.newAppPassword.value||"",r=t.confirmNewAppPassword.value,""!==n){e.next=6;break}return Ne.showFormError(t.appPWResetErrMsg,ke(R)),e.abrupt("return");case 6:if(n===r){e.next=9;break}return Ne.showFormError(t.appPWResetErrMsg,ke(N)),e.abrupt("return");case 9:return a=ft().loading(this.form),e.next=12,S("/api/resetapppassword",{newPass:n,seed:t.seedInput.value});case 12:if(o=e.sent,a(),ft().checkResponse(o)){e.next=17;break}return Ne.showFormError(t.appPWResetErrMsg,o.msg),e.abrupt("return");case 17:Ne.isDisplayed(t.appPWResetErrMsg)&&Ne.hide(t.appPWResetErrMsg),t.appPWResetSuccessMsg.textContent=ke("PASSWORD_RESET_SUCCESS_MSG"),Ne.show(t.appPWResetSuccessMsg),setTimeout((function(){return s.success()}),3e3);case 21:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"focus",value:function(){this.page.newAppPassword.focus()}},{key:"refresh",value:function(){var e=this.page;e.newAppPassword.value="",e.confirmNewAppPassword.value="",e.seedInput.value="",Ne.hide(e.appPWResetSuccessMsg,e.appPWResetErrMsg)}}]),e}(),Fr=function(){function e(t){var n=this;i(this,e),h(this,"page",void 0);var r=this.page=Ne.parseTemplate(t);r.selectedCert.textContent=ke(j),Ne.bind(r.certFile,"change",(function(){return n.onCertFileChange()})),Ne.bind(r.removeCert,"click",(function(){return n.clearCertFile()})),Ne.bind(r.addCert,"click",(function(){return r.certFile.click()}))}var t,n;return d(e,[{key:"onCertFileChange",value:(n=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,(n=t.certFile.files)&&n.length){e.next=4;break}return e.abrupt("return");case 4:t.selectedCert.textContent=n[0].name,Ne.show(t.removeCert),Ne.hide(t.addCert);case 7:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"clearCertFile",value:function(){var e=this.page;e.certFile.value="",e.selectedCert.textContent=ke(j),Ne.hide(e.removeCert),Ne.show(e.addCert)}},{key:"file",value:(t=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(t=this.page).certFile.value){e.next=7;break}if(!(n=t.certFile.files)||!n.length){e.next=7;break}return e.next=6,n[0].text();case 6:return e.abrupt("return",e.sent);case 7:return e.abrupt("return","");case 8:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),Tr=function(){function e(t,n){var r=this;i(this,e),h(this,"page",void 0),h(this,"success",void 0),h(this,"assetID",void 0),h(this,"parentID",void 0),h(this,"txFee",void 0),h(this,"host",void 0),this.page=Ne.parseTemplate(t),this.success=n,Ne.bind(this.page.submit,"click",(function(){r.approve()}))}var t,n;return d(e,[{key:"setAsset",value:(n=s(f().mark((function e(t,n){var r,a,o,s,i,c,l,u,d,h,p,v,m,g,y;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.assetID=t,this.host=n,a=ft().assets[t],o=this.parentID=null===(r=a.token)||void 0===r?void 0:r.parentID,s=this.page,Ne.show(s.submissionElements),Ne.hide(s.txMsg,s.errMsg,s.addressBox,s.balanceBox,s.addressBox),Ne.empty(s.tokenSymbol),s.tokenSymbol.appendChild(Ne.symbolize(a,!0)),i=ft().exchanges[n].assets[t].version,e.next=12,S("/api/approvetokenfee",{assetID:a.id,version:i,approving:!0});case 12:c=e.sent,ft().checkResponse(c)?(l=ft().assets[o],u=l.unitInfo,d=l.wallet,h=d.address,p=d.balance.available,v=l.name,m=this.txFee=c.txFee,g="".concat(Ne.formatCoinValue(m,u)," ").concat(u.conventional.unit),(y=ft().fiatRatesMap[o])&&(g+=" (".concat(Ne.formatFiatConversion(m,y,u)," USD)")),s.feeEstimate.textContent=g,Ne.show(s.balanceBox),s.balance.textContent=Ne.formatCoinValue(p,u),s.parentTicker.textContent=u.conventional.unit,s.parentName.textContent=v,p<m&&(Ne.show(s.addressBox),s.address.textContent=h)):(s.errMsg.textContent=c.msg,Ne.show(s.errMsg));case 14:case"end":return e.stop()}}),e,this)}))),function(e,t){return n.apply(this,arguments)})},{key:"approve",value:(t=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.assetID,r=this.host,a=this.success,o=ft().assets[n],e.next=5,S("/api/approvetoken",{assetID:o.id,dexAddr:r});case 5:if(s=e.sent,ft().checkResponse(s)){e.next=10;break}return t.errMsg.textContent=s.msg,Ne.show(t.errMsg),e.abrupt("return");case 10:t.txid.innerText=s.txID,(i=En[o.id])&&i[ft().user.net]&&(t.txid.href=i[ft().user.net](s.txID)),Ne.hide(t.submissionElements,t.balanceBox,t.addressBox),Ne.show(t.txMsg),a&&a();case 16:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"handleBalanceNote",value:function(e){var t=this.page,n=this.parentID,r=this.txFee;e.assetID===n&&(t.balance.textContent=Ne.formatCoinValue(e.balance.available,ft().assets[n].unitInfo),e.balance.available>=r?Ne.hide(t.addressBox):Ne.hide(t.errMsg))}}]),e}(),Dr=function(){function e(t,n){var r=this;i(this,e),h(this,"form",void 0),h(this,"page",void 0),h(this,"updated",void 0),h(this,"cexName",void 0),this.form=t,this.updated=n,this.page=Ne.parseTemplate(t),Ne.bind(this.page.cexSubmit,"click",(function(){return r.submit()}))}var t;return d(e,[{key:"setCEX",value:function(e){this.cexName=e,Yn(this.form,e);var t=this.page;Ne.hide(t.cexConfigPrompt,t.cexConnectErrBox,t.cexFormErr),t.cexApiKeyInput.value="",t.cexSecretInput.value="";var n=ft().mmStatus.cexes[e],r=null==n?void 0:n.connectErr;r?(Ne.show(t.cexConnectErrBox),t.cexConnectErr.textContent=r,t.cexApiKeyInput.value=n.config.apiKey,t.cexSecretInput.value=n.config.apiSecret):Ne.show(t.cexConfigPrompt)}},{key:"submit",value:(t=s(f().mark((function e(){var t,n,r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n=this.cexName,r=this.form,Ne.hide(t.cexFormErr),a=t.cexApiKeyInput.value,o=t.cexSecretInput.value,a&&o){e.next=8;break}return Ne.show(t.cexFormErr),t.cexFormErr.textContent=ke(R),e.abrupt("return");case 8:return s=ft().loading(r),e.prev=9,e.next=12,Xn.updateCEXConfig({name:n,apiKey:a,apiSecret:o});case 12:if(i=e.sent,ft().checkResponse(i)){e.next=15;break}throw i;case 15:this.updated(n,!0),e.next=23;break;case 18:e.prev=18,e.t0=e.catch(9),Ne.show(t.cexFormErr),t.cexFormErr.textContent=ke(H,{msg:null!==(c=e.t0.msg)&&void 0!==c?c:String(e.t0)}),this.updated(n,!1);case 23:return e.prev=23,s(),e.finish(23);case 26:case"end":return e.stop()}}),e,this,[[9,18,23,26]])}))),function(){return t.apply(this,arguments)})}]),e}(),Ir=300;function Ar(e,t){return Rr.apply(this,arguments)}function Rr(){return(Rr=s(f().mark((function e(t,n){var r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=document.body.offsetWidth/2,e.next=3,Ne.animate(Ir,(function(e){t.style.right="".concat(e*r,"px")}),"easeInHard");case 3:return Ne.hide(t),t.style.right="0",n.style.right=String(-r),Ne.show(n),n.querySelector("input")&&Ne.safeSelector(n,"input").focus(),e.next=10,Ne.animate(Ir,(function(e){n.style.right="".concat(e*r-r,"px")}),"easeOutHard");case 10:n.style.right="0";case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Er(e,t){e.successMessage.textContent=t,Ne.show(e.forms,e.checkmarkForm),e.checkmarkForm.style.right="0",e.checkmark.style.fontSize="0px";var n=a(k.isDark()?[223,226,225]:[51,51,51],3),r=n[0],o=n[1],s=n[2],i=16-r,c=163-o,l=16-s;return new We(1200,(function(t){e.checkmark.style.fontSize="".concat(80*t,"px"),e.checkmark.style.color="rgb(".concat(r+t*i,", ").concat(o+t*c,", ").concat(s+t*l,")")}),"easeOutElastic")}function Br(e,t,n){var r=function(e){e.preventDefault&&e.preventDefault(),n(e)};Ne.bind(t,"click",r),Ne.bind(e,"submit",r)}function Pr(e){return Math.floor(e.getTime()/1e3)}function Lr(e){return function(e){return new Date(e.getTime()-60*e.getTimezoneOffset()*1e3)}(e).toISOString().split("T")[0]}function Or(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var Mr=function(e){g(k,e);var t,n,r,a,o,c,l,u,p,m,x=(p=k,m=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(p);if(m){var n=b(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return y(this,e)});function k(e,t){var n;i(this,k),h(v(n=x.call(this)),"body",void 0),h(v(n),"data",void 0),h(v(n),"xc",void 0),h(v(n),"page",void 0),h(v(n),"dexAddrForm",void 0),h(v(n),"discoverAcctForm",void 0),h(v(n),"newWalletForm",void 0),h(v(n),"regAssetForm",void 0),h(v(n),"walletWaitForm",void 0),h(v(n),"confirmRegisterForm",void 0),n.body=e,n.data=t;var r=n.page=Ne.idDescendants(e);t.host&&r.dexAddrForm.classList.contains("selected")&&(r.dexAddrForm.classList.remove("selected"),r.discoverAcctForm.classList.add("selected"),r.discoverAcctForm.dataset.host=t.host);var a,o=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Or(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Or(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}(e.querySelectorAll(".form-closer"));try{for(o.s();!(a=o.n()).done;){var c=a.value;c!==r.resetPassFormCloser&&Ne.hide(c)}}catch(e){o.e(e)}finally{o.f()}n.newWalletForm=new pr(r.newWalletForm,(function(e){return n.newWalletCreated(e,n.confirmRegisterForm.tier)}),(function(){return n.animateRegAsset(r.newWalletForm)})),n.dexAddrForm=new xr(r.dexAddrForm,function(){var e=s(f().mark((function e(t,a){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.requestFeepayment(r.dexAddrForm,t,a);case 1:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}());var l=r.discoverAcctForm.dataset.host;l&&(n.discoverAcctForm=new kr(r.discoverAcctForm,l,function(){var e=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.requestFeepayment(r.discoverAcctForm,t,"");case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())),n.regAssetForm=new gr(r.regAssetForm,function(){var e=s(f().mark((function e(t,a){var o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t!==pt){e.next=3;break}return n.registerDEXSuccess(),e.abrupt("return");case 3:if(o=ft().assets[t],!(s=o.wallet)){e.next=17;break}return i=n.xc.bondAssets[o.symbol],e.next=9,n.getBondsFeeBuffer(t,r.regAssetForm);case 9:if(c=e.sent,n.confirmRegisterForm.setAsset(t,a,c),!(s.synced&&s.balance.available>=2*i.amount+c)){e.next=14;break}return n.animateConfirmForm(r.regAssetForm),e.abrupt("return");case 14:return n.walletWaitForm.setWallet(t,c,a),Ar(r.regAssetForm,r.walletWait),e.abrupt("return");case 17:n.confirmRegisterForm.tier=a,n.newWalletForm.setAsset(t),Ar(r.regAssetForm,r.newWalletForm);case 20:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()),n.walletWaitForm=new yr(r.walletWait,(function(){n.animateConfirmForm(r.walletWait)}),(function(){n.animateRegAsset(r.walletWait)})),n.confirmRegisterForm=new mr(r.confirmRegForm,(function(){n.registerDEXSuccess()}),(function(){n.animateRegAsset(r.confirmRegForm)}));var u=Ne.safeSelector(r.forms,":scope > form.selected");switch(u.classList.remove("selected"),u){case r.dexAddrForm:n.dexAddrForm.animate();break;case r.discoverAcctForm:n.discoverAcctForm.animate()}return Ne.show(u),u===r.discoverAcctForm&&n.discoverAcctForm.page.submit.click(),ft().authed&&n.auth(),n}return d(k,[{key:"auth",value:(u=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ft().fetchUser();case 2:case"end":return e.stop()}}),e)}))),function(){return u.apply(this,arguments)})},{key:"requestFeepayment",value:(l=s(f().mark((function e(t,n,r){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.xc=n,this.confirmRegisterForm.setExchange(n,r),this.walletWaitForm.setExchange(n),this.regAssetForm.setExchange(n,r),this.animateRegAsset(t);case 5:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return l.apply(this,arguments)})},{key:"animateRegAsset",value:(c=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:Ne.hide(t),this.regAssetForm.animate(),Ne.show(this.page.regAssetForm);case 3:case"end":return e.stop()}}),e,this)}))),function(e){return c.apply(this,arguments)})},{key:"animateConfirmForm",value:(o=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.confirmRegisterForm.animate(),Ne.hide(t),Ne.show(this.page.confirmRegForm);case 3:case"end":return e.stop()}}),e,this)}))),function(e){return o.apply(this,arguments)})},{key:"getBondsFeeBuffer",value:(a=s(f().mark((function e(t,n){var r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=ft().loading(n),e.next=3,S("/api/bondsfeebuffer",{assetID:t});case 3:if(a=e.sent,r(),ft().checkResponse(a)){e.next=7;break}return e.abrupt("return",0);case 7:return e.abrupt("return",a.feeBuffer);case 8:case"end":return e.stop()}}),e)}))),function(e,t){return a.apply(this,arguments)})},{key:"getCertFile",value:(r=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t="",!this.dexAddrForm.page.certFile.value){e.next=7;break}if(!(n=this.dexAddrForm.page.certFile.files)||!n.length){e.next=7;break}return e.next=6,n[0].text();case 6:t=e.sent;case 7:return e.abrupt("return",t);case 8:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"registerDEXSuccess",value:(n=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ft().fetchUser();case 2:return ft().updateMenuItemsDisplay(),e.next=5,ft().loadPage(this.data.backTo||"markets");case 5:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"newWalletCreated",value:(t=s(f().mark((function e(t,n){var r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.regAssetForm.refresh(),e.next=3,ft().fetchUser();case 3:if(r=e.sent){e.next=6;break}return e.abrupt("return");case 6:return a=this.page,o=r.assets[t],s=o.wallet,i=this.xc.bondAssets[o.symbol].amount,e.next=12,this.getBondsFeeBuffer(t,a.newWalletForm);case 12:if(c=e.sent,this.walletWaitForm.setWallet(t,c,n),this.confirmRegisterForm.setAsset(t,n,c),!(s.synced&&s.balance.available>=2*i+c)){e.next=19;break}return e.next=18,this.animateConfirmForm(a.newWalletForm);case 18:return e.abrupt("return");case 19:return e.next=21,Ar(a.newWalletForm,a.walletWait);case 21:case"end":return e.stop()}}),e,this)}))),function(e,n){return t.apply(this,arguments)})}]),k}(lt);var qr=function(e){g(o,e);var t,n,r,a=(n=o,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(n);if(r){var a=b(this).constructor;e=Reflect.construct(t,arguments,a)}else e=t.apply(this,arguments);return y(this,e)});function o(e){var t;i(this,o),h(v(t=a.call(this)),"loginForm",void 0),h(v(t),"page",void 0),h(v(t),"appPassResetForm",void 0);var n=t.page=Ne.idDescendants(e);t.loginForm=new wr(n.loginForm,(function(){t.loggedIn()}));var r=function(){Ne.hide(n.resetAppPWForm),t.loginForm.refresh(),Ne.show(n.loginForm),t.loginForm.focus()};return r(),t.appPassResetForm=new Sr(n.resetAppPWForm,(function(){r()})),Ne.bind(n.forgotPassBtn,"click",(function(){t.appPassResetForm.refresh(),Ar(n.loginForm,n.resetAppPWForm)})),Ne.bind(n.resetPassFormCloser,"click",(function(){r()})),Ne.bind(n.forms,"mousedown",(function(e){!Ne.mouseInElement(e,n.resetAppPWForm)&&Ne.isDisplayed(n.resetAppPWForm)&&r()})),t}return d(o,[{key:"loggedIn",value:(t=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ft().loadPage("wallets");case 2:case"end":return e.stop()}}),e)}))),function(){return t.apply(this,arguments)})}]),o}(lt);function Nr(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Wr(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Wr(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){throw e})),f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){i=!0,o=e})),f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function Wr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var Vr=1<<17,Ur=["TICKET_STATUS_UNKNOWN","TICKET_STATUS_UNMINED","TICKET_STATUS_IMMATURE","TICKET_STATUS_LIVE","TICKET_STATUS_VOTED","TICKET_STATUS_MISSED","TICKET_STATUS_EXPIRED","TICKET_STATUS_UNSPENT","TICKET_STATUS_REVOKED"],_r=[2,4,5,8,14,15],jr=[1,3,7,13,16],Hr=[6,9,10,12];function zr(e){return _r.includes(e)?["+","positive-tx"]:jr.includes(e)?["-","negative-tx"]:["",""]}var Gr=["TX_TYPE_UNKNOWN","TX_TYPE_SEND","TX_TYPE_RECEIVE","TX_TYPE_SWAP","TX_TYPE_REDEEM","TX_TYPE_REFUND","TX_TYPE_SPLIT","TX_TYPE_CREATE_BOND","TX_TYPE_REDEEM_BOND","TX_TYPE_APPROVE_TOKEN","TX_TYPE_ACCELERATION","TX_TYPE_SELF_TRANSFER","TX_TYPE_REVOKE_TOKEN_APPROVAL","TX_TYPE_TICKET_PURCHASE","TX_TYPE_TICKET_VOTE","TX_TYPE_TICKET_REVOCATION","TX_TYPE_SWAP_OR_SEND","TX_TYPE_MIX"];function Xr(e){return ke(Gr[e])}var Kr,Qr,Yr=10,Jr=0,Zr=function(e){g(ve,e);var t,n,o,c,l,u,p,m,x,w,C,F,T,D,I,E,B,P,L,O,M,q,N,W,V,U,_,j,z,X,K,Q,Y,J,Z,$,ee,te,ne,re,ae,oe,se,ie,ce,le,ue,de,he,pe,fe=(he=ve,pe=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(he);if(pe){var n=b(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return y(this,e)});function ve(e,t){var n;i(this,ve),h(v(n=fe.call(this)),"body",void 0),h(v(n),"data",void 0),h(v(n),"page",void 0),h(v(n),"assetButtons",void 0),h(v(n),"newWalletForm",void 0),h(v(n),"reconfigForm",void 0),h(v(n),"walletCfgGuide",void 0),h(v(n),"depositAddrForm",void 0),h(v(n),"keyup",void 0),h(v(n),"changeWalletPW",void 0),h(v(n),"displayed",void 0),h(v(n),"animation",void 0),h(v(n),"forms",void 0),h(v(n),"forceReq",void 0),h(v(n),"forceUrl",void 0),h(v(n),"currentForm",void 0),h(v(n),"restoreInfoCard",void 0),h(v(n),"selectedAssetID",void 0),h(v(n),"stakeStatus",void 0),h(v(n),"maxSend",void 0),h(v(n),"unapprovingTokenVersion",void 0),h(v(n),"ticketPage",void 0),h(v(n),"oldestTx",void 0),h(v(n),"currTx",void 0),h(v(n),"mixing",void 0),h(v(n),"mixerToggle",void 0),h(v(n),"stampers",void 0),h(v(n),"secondTicker",void 0),n.body=e,n.data=t;var r=n.page=Ne.idDescendants(e);n.stampers=[],Jr=ft().user.net,n.secondTicker=window.setInterval((function(){!function(){var e,t=Nr(n.stampers);try{for(t.s();!(e=t.n()).done;){var r=e.value;r.dataset.stamp&&(r.textContent=Ne.timeSince(1e3*parseInt(r.dataset.stamp||"")))}}catch(e){t.e(e)}finally{t.f()}}()}),1e4),Ne.cleanTemplates(r.restoreInfoCard,r.connectedIconTmpl,r.disconnectedIconTmpl,r.removeIconTmpl),n.restoreInfoCard=r.restoreInfoCard.cloneNode(!0),Ne.show(r.connectedIconTmpl,r.disconnectedIconTmpl,r.removeIconTmpl),n.forms=Ne.applySelector(r.forms,":scope > form"),r.forms.querySelectorAll(".form-closer").forEach((function(e){Ne.bind(e,"click",(function(){n.closePopups()}))})),Ne.bind(r.cancelForce,"click",(function(){n.closePopups()})),n.selectedAssetID=-1,Ne.cleanTemplates(r.iconSelectTmpl,r.balanceDetailRow,r.recentOrderTmpl,r.vspRowTmpl,r.ticketHistoryRowTmpl,r.votingChoiceTmpl,r.votingAgendaTmpl,r.tspendTmpl,r.tkeyTmpl,r.txHistoryRowTmpl,r.txHistoryDateRowTmpl),Ne.bind(r.createWallet,"click",(function(){return n.showNewWallet(n.selectedAssetID)})),Ne.bind(r.connectBttn,"click",(function(){return n.doConnect(n.selectedAssetID)})),Ne.bind(r.send,"click",(function(){return n.showSendForm(n.selectedAssetID)})),Ne.bind(r.receive,"click",(function(){return n.showDeposit(n.selectedAssetID)})),Ne.bind(r.unlockBttn,"click",(function(){return n.openWallet(n.selectedAssetID)})),Ne.bind(r.lockBttn,"click",(function(){return n.lock(n.selectedAssetID)})),Ne.bind(r.reconfigureBttn,"click",(function(){return n.showReconfig(n.selectedAssetID)})),Ne.bind(r.needsProviderBttn,"click",(function(){return n.showReconfig(n.selectedAssetID)})),Ne.bind(r.rescanWallet,"click",(function(){return n.rescanWallet(n.selectedAssetID)})),Ne.bind(r.earlierTxs,"click",(function(){return n.loadEarlierTxs()})),Ne.bind(r.copyTxIDBtn,"click",(function(){var e;rt((null===(e=n.currTx)||void 0===e?void 0:e.id)||"",r.txDetailsID,r.copyTxIDBtn,"#1e7d11")})),Ne.bind(r.copyRecipientBtn,"click",(function(){var e;rt((null===(e=n.currTx)||void 0===e?void 0:e.recipient)||"",r.txDetailsRecipient,r.copyRecipientBtn,"#1e7d11")})),Ne.bind(r.copyBondIDBtn,"click",(function(){var e,t;rt((null===(e=n.currTx)||void 0===e||null===(t=e.bondInfo)||void 0===t?void 0:t.bondID)||"",r.txDetailsBondID,r.copyBondIDBtn,"#1e7d11")})),Ne.bind(r.copyBondAccountIDBtn,"click",(function(){var e,t;rt((null===(e=n.currTx)||void 0===e||null===(t=e.bondInfo)||void 0===t?void 0:t.accountID)||"",r.txDetailsBondAccountID,r.copyBondAccountIDBtn,"#1e7d11")})),Ne.bind(r.hideMixTxsCheckbox,"change",(function(){n.showTxHistory(n.selectedAssetID)})),n.newWalletForm=new pr(r.newWalletForm,(function(e){var t={assetName:ft().assets[e].name};n.assetUpdated(e,r.newWalletForm,ke("NEW_WALLET_SUCCESS",t)),n.sortAssetButtons(),n.updateTicketBuyer(e),n.updatePrivacy(e)})),n.reconfigForm=new vr(r.reconfigInputs,!1),n.walletCfgGuide=Ne.tmplElement(r.reconfigForm,"walletCfgGuide"),Br(r.sendForm,r.submitSendForm,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.stepSend();case 1:case"end":return e.stop()}}),e)})))),Br(r.vSendForm,r.vSend,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.send();case 1:case"end":return e.stop()}}),e)})))),Br(r.reconfigForm,r.submitReconfig,(function(){return n.reconfig()})),r.forms.querySelectorAll(".form-closer").forEach((function(e){Ne.bind(e,"click",(function(){return n.closePopups()}))})),Ne.bind(r.forms,"mousedown",(function(e){Ne.mouseInElement(e,n.currentForm)||n.closePopups()})),n.mixerToggle=new _e(r.toggleMixer,r.mixingErr,!1,(function(e){return n.updateMixerState(e)})),n.keyup=function(e){"Escape"===e.key&&Ne.isDisplayed(n.page.forms)&&n.closePopups()},Ne.bind(document,"keyup",n.keyup),Ne.bind(r.downloadLogs,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.downloadLogs();case 1:case"end":return e.stop()}}),e)})))),Ne.bind(r.exportWallet,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.displayExportWalletAuth();case 1:case"end":return e.stop()}}),e)})))),Ne.bind(r.recoverWallet,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.showRecoverWallet();case 1:case"end":return e.stop()}}),e)})))),Br(r.exportWalletAuth,r.exportWalletAuthSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.exportWalletAuthSubmit();case 1:case"end":return e.stop()}}),e)})))),Br(r.recoverWalletConfirm,r.recoverWalletSubmit,(function(){n.recoverWallet()})),Br(r.confirmForce,r.confirmForceSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.confirmForceSubmit();case 1:case"end":return e.stop()}}),e)})))),Ne.bind(r.disableWallet,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.showToggleWalletStatus(!0);case 1:case"end":return e.stop()}}),e)})))),Ne.bind(r.enableWallet,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.showToggleWalletStatus(!1);case 1:case"end":return e.stop()}}),e)})))),Br(r.toggleWalletStatusConfirm,r.toggleWalletStatusSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.toggleWalletStatus();case 1:case"end":return e.stop()}}),e)})))),Ne.bind(r.managePeers,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.showManagePeersForm();case 1:case"end":return e.stop()}}),e)})))),Ne.bind(r.addPeerSubmit,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.submitAddPeer();case 1:case"end":return e.stop()}}),e)})))),Ne.bind(r.unapproveTokenAllowance,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.showUnapproveTokenAllowanceTableForm();case 1:case"end":return e.stop()}}),e)})))),Ne.bind(r.unapproveTokenSubmit,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.submitUnapproveTokenAllowance();case 1:case"end":return e.stop()}}),e)})))),Ne.bind(r.showVSPs,"click",(function(){n.showVSPPicker()})),Ne.bind(r.vspDisplay,"click",(function(){n.showVSPPicker()})),Br(r.vspPicker,r.customVspSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.setCustomVSP();case 1:case"end":return e.stop()}}),e)})))),Ne.bind(r.purchaseTicketsBttn,"click",(function(){n.showPurchaseTicketsDialog()})),Br(r.purchaseTicketsForm,r.purchaserSubmit,(function(){n.purchaseTickets()})),Ne.bind(r.purchaserInput,"change",(function(){n.purchaserInputChanged()})),Ne.bind(r.ticketHistory,"click",(function(){n.showTicketHistory()})),Ne.bind(r.ticketHistoryNextPage,"click",(function(){n.nextTicketPage()})),Ne.bind(r.ticketHistoryPrevPage,"click",(function(){n.prevTicketPage()})),Ne.bind(r.setVotes,"click",(function(){n.showSetVotesDialog()})),Ne.bind(r.purchaseTicketsErrCloser,"click",(function(){Ne.hide(r.purchaseTicketsErrBox)})),Ne.bind(r.privacyInfoBttn,"click",(function(){n.showForm(r.mixingInfo)})),n.depositAddrForm=new Cr(r.deposit),Ne.bind(r.walletBal,"click",(function(){n.populateMaxSend()})),Ne.bind(r.sendAmt,"input",(function(){var e=ft().assets[n.selectedAssetID].unitInfo,t=tt(r.sendAmt.value),a=e.conventional.conversionFactor;Ne.showFiatValue(r.sendValue,t*a,ft().fiatRatesMap[n.selectedAssetID],e)})),Ne.bind(r.maxSend,"click",(function(){n.populateMaxSend()})),Ne.bind(r.sendAddr,"input",s(f().mark((function e(){var t,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=ft().assets[n.selectedAssetID],r.sendAddr.classList.remove("border-danger","border-success"),a=r.sendAddr.value||"",t&&""!==a){e.next=5;break}return e.abrupt("return");case 5:return e.next=7,n.validateSendAddress(a,t.id);case 7:e.sent?r.sendAddr.classList.add("border-success"):r.sendAddr.classList.add("border-danger");case 9:case"end":return e.stop()}}),e)})))),Ne.bind(r.showChangePW,"click",(function(){n.changeWalletPW=!n.changeWalletPW,n.setPWSettingViz(n.changeWalletPW)})),Ne.bind(r.changeWalletTypeSelect,"change",(function(){n.changeWalletType()})),Ne.bind(r.showChangeType,"click",(function(){Ne.isHidden(r.changeWalletType)?(Ne.show(r.changeWalletType,r.changeTypeHideIcon),Ne.hide(r.changeTypeShowIcon),r.changeTypeMsg.textContent=ke("KEEP_WALLET_TYPE")):n.showReconfig(n.selectedAssetID,{skipAnimation:!0})})),ft().registerNoteFeeder({fiatrateupdate:function(e){n.handleRatesNote(e)},balance:function(e){n.handleBalanceNote(e)},walletstate:function(e){n.handleWalletStateNote(e)},walletconfig:function(e){n.handleWalletStateNote(e)},walletsync:function(e){n.updateSyncAndPeers(e.assetID)},createwallet:function(e){n.handleCreateWalletNote(e)},walletnote:function(e){n.handleCustomWalletNote(e)}});var a=n.sortAssetButtons().id,o=k.fetchLocal(k.selectedAssetLK);return o&&(a=Number(o)),n.setSelectedAsset(a),setInterval((function(){var e,t=Nr(n.page.txHistoryTableBody.children);try{for(t.s();!(e=t.n()).done;){var r=e.value,a=Ne.tmplElement(r,"age");a.textContent=Ne.timeSince(parseInt(a.dataset.timestamp))}}catch(e){t.e(e)}finally{t.f()}}),5e3),n}return d(ve,[{key:"closePopups",value:function(){Ne.hide(this.page.forms),this.currTx=void 0,this.animation&&this.animation.stop()}},{key:"safePost",value:(de=s(f().mark((function e(t,n){var r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=this.selectedAssetID,e.next=3,S(t,n);case 3:if(a=e.sent,r===this.selectedAssetID){e.next=6;break}throw Error("asset changed during request. aborting");case 6:return e.abrupt("return",a);case 7:case"end":return e.stop()}}),e,this)}))),function(e,t){return de.apply(this,arguments)})},{key:"stepSend",value:(ue=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l,u,d,h,p,v,m,g,y,b,x,k,w,C;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,Ne.hide(t.vSendErr,t.sendErr,t.vSendEstimates,t.txFeeNotAvailable),n=parseInt(t.sendForm.dataset.assetID||""),r=ft().assets[n].token,a=t.subtractCheckBox.checked||!1,o=ft().unitInfo(n).conventional.conversionFactor,s=Math.round(tt(t.sendAmt.value,0)*o),""!==(i=t.sendAddr.value||"")){e.next=10;break}return e.abrupt("return",Ne.showFormError(t.sendErr,ke(G,{address:i})));case 10:if(c=ft().assets[n],l=c.wallet,u=c.unitInfo,d=c.symbol,h=0,!(512&l.traits)){e.next=36;break}return p={addr:t.sendAddr.value,assetID:n,subtract:a,value:s},v=ft().loading(t.sendForm),e.next=17,S("/api/txfee",p);case 17:if(m=e.sent,v(),ft().checkResponse(m)){e.next=29;break}return t.txFeeNotAvailable.dataset.tooltip=ke("TXFEE_ERR_MSG",{err:m.msg}),Ne.show(t.txFeeNotAvailable),e.next=24,this.validateSendAddress(i,n);case 24:if(e.sent){e.next=27;break}return e.abrupt("return",Ne.showFormError(t.sendErr,ke(G,{address:i||""})));case 27:e.next=34;break;case 29:if(!m.ok){e.next=34;break}if(m.validaddress){e.next=32;break}return e.abrupt("return",Ne.showFormError(t.sendErr,ke(G,{address:t.sendAddr.value||""})));case 32:h=m.txfee,Ne.show(t.vSendEstimates);case 34:e.next=41;break;case 36:return e.next=38,this.validateSendAddress(i,n);case 38:if(e.sent){e.next=41;break}return e.abrupt("return",Ne.showFormError(t.sendErr,ke(G,{address:i||""})));case 41:return t.vSendSymbol.textContent=d.toUpperCase(),t.vSendLogo.src=Ne.logoPath(d),r?(g=ft().assets[r.parentID],y=g.unitInfo,b=g.symbol,t.vSendFee.textContent=Ne.formatFullPrecision(h,y)+" "+b):t.vSendFee.textContent=Ne.formatFullPrecision(h,u),x=ft().fiatRatesMap[n],Ne.showFiatValue(t.vSendFeeFiat,h,x,u),t.vSendDestinationAmt.textContent=Ne.formatFullPrecision(s-h,u),t.vTotalSend.textContent=Ne.formatFullPrecision(s,u),Ne.showFiatValue(t.vTotalSendFiat,s,x,u),t.vSendAddr.textContent=t.sendAddr.value||"",k=l.balance.available-s,t.balanceAfterSend.textContent=Ne.formatFullPrecision(k,u),Ne.showFiatValue(t.balanceAfterSendFiat,k,x,u),Ne.show(t.approxSign),a||(Ne.hide(t.approxSign),t.vSendDestinationAmt.textContent=Ne.formatFullPrecision(s,u),w=s,r||(w+=h),t.vTotalSend.textContent=Ne.formatFullPrecision(w,u),Ne.showFiatValue(t.vTotalSendFiat,w,x,u),C=l.balance.available-s,r||(C-=h),C<=0?(t.balanceAfterSend.textContent=Ne.formatFullPrecision(0,u),Ne.showFiatValue(t.balanceAfterSendFiat,0,x,u)):(t.balanceAfterSend.textContent=Ne.formatFullPrecision(C,u),Ne.showFiatValue(t.balanceAfterSendFiat,C,x,u))),Ne.hide(t.sendForm),e.next=58,this.showForm(t.vSendForm);case 58:case"end":return e.stop()}}),e,this)}))),function(){return ue.apply(this,arguments)})},{key:"cancelSend",value:(le=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,Ne.hide(t.vSendForm,t.sendErr),e.next=4,this.showForm(t.sendForm);case 4:case"end":return e.stop()}}),e,this)}))),function(){return le.apply(this,arguments)})},{key:"validateSendAddress",value:(ce=s(f().mark((function e(t,n){var r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/validateaddress",{addr:t,assetID:n});case 2:return r=e.sent,e.abrupt("return",ft().checkResponse(r));case 4:case"end":return e.stop()}}),e)}))),function(e,t){return ce.apply(this,arguments)})},{key:"setPWSettingViz",value:function(e){var t=this.page;if(e)return Ne.hide(t.showIcon),Ne.show(t.hideIcon,t.changePW),void(t.switchPWMsg.textContent=ke("KEEP_WALLET_PASS"));Ne.hide(t.hideIcon,t.changePW),Ne.show(t.showIcon),t.switchPWMsg.textContent=ke("NEW_WALLET_PASS")}},{key:"assetVersionUsedByDEXes",value:function(){var e=this.selectedAssetID,t={},n=ft().exchanges;for(var r in n){var a=n[r],o=a.assets[e];o&&(t[o.version]||(t[o.version]=[]),t[o.version].push(a.host))}return t}},{key:"submitUnapproveTokenAllowance",value:(ie=s(f().mark((function e(){var t,n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,e.next=4,S("/api/unapprovetoken",{assetID:this.selectedAssetID,version:this.unapprovingTokenVersion});case 4:if(n=e.sent,ft().checkResponse(n)){e.next=9;break}return t.unapproveTokenErr.textContent=n.msg,Ne.show(t.unapproveTokenErr),e.abrupt("return");case 9:(r=En[this.selectedAssetID])&&r[Jr]&&(t.unapproveTokenTxID.href=r[Jr](n.txID)),t.unapproveTokenTxID.textContent=n.txID,Ne.hide(t.unapproveTokenSubmissionElements,t.unapproveTokenErr),Ne.show(t.unapproveTokenTxMsg);case 14:case"end":return e.stop()}}),e,this)}))),function(){return ie.apply(this,arguments)})},{key:"showUnapproveTokenAllowanceForm",value:(se=s(f().mark((function e(t){var n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,this.unapprovingTokenVersion=t,Ne.show(n.unapproveTokenSubmissionElements),Ne.hide(n.unapproveTokenTxMsg,n.unapproveTokenErr),(r=ft().assets[this.selectedAssetID])&&r.token){e.next=7;break}return e.abrupt("return");case 7:if(a=ft().assets[r.token.parentID]){e.next=10;break}return e.abrupt("return");case 10:return Ne.empty(n.tokenAllowanceRemoveSymbol),n.tokenAllowanceRemoveSymbol.appendChild(Ne.symbolize(r,!0)),n.tokenAllowanceRemoveVersion.textContent=t.toString(),e.next=16,S("/api/approvetokenfee",{assetID:this.selectedAssetID,version:t,approving:!1});case 16:o=e.sent,ft().checkResponse(o)?(s="".concat(Ne.formatCoinValue(o.txFee,a.unitInfo)," ").concat(a.unitInfo.conventional.unit),(i=ft().fiatRatesMap[a.id])&&(s+=" (".concat(Ne.formatFiatConversion(o.txFee,i,a.unitInfo)," USD)")),n.unapprovalFeeEstimate.textContent=s):(n.unapproveTokenErr.textContent=o.msg,Ne.show(n.unapproveTokenErr)),this.showForm(n.unapproveTokenForm);case 19:case"end":return e.stop()}}),e,this)}))),function(e){return se.apply(this,arguments)})},{key:"showUnapproveTokenAllowanceTableForm",value:(oe=s(f().mark((function e(){var t,n,r,a,o,s,i=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,(n=ft().assets[this.selectedAssetID])&&n.wallet&&n.wallet.approved){e.next=4;break}return e.abrupt("return");case 4:for(;t.tokenVersionBody.firstChild;)t.tokenVersionBody.removeChild(t.tokenVersionBody.firstChild);Ne.empty(t.tokenVersionTableAssetSymbol),t.tokenVersionTableAssetSymbol.appendChild(Ne.symbolize(n,!0)),r=this.assetVersionUsedByDEXes(),a=!1,o=f().mark((function e(o){var s,c,l,u;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(void 0!==(s=n.wallet.approved[o])&&s===dt.Approved){e.next=3;break}return e.abrupt("return","continue");case 3:a=!0,c=t.tokenVersionRow.cloneNode(!0),(l=Ne.parseTemplate(c)).version.textContent=o.toString(),r[o]&&(l.usedBy.textContent=r[o].join(", ")),u=i.page.removeIconTmpl.cloneNode(!0),Ne.bind(u,"click",(function(){i.showUnapproveTokenAllowanceForm(o)})),l.remove.appendChild(u),t.tokenVersionBody.appendChild(c);case 12:case"end":return e.stop()}}),e)})),s=0;case 11:if(!(s<=n.wallet.version)){e.next=19;break}return e.delegateYield(o(s),"t0",13);case 13:if("continue"!==e.t0){e.next=16;break}return e.abrupt("continue",16);case 16:s++,e.next=11;break;case 19:Ne.setVis(a,t.tokenVersionTable),Ne.setVis(!a,t.tokenVersionNone),this.showForm(t.unapproveTokenTableForm);case 22:case"end":return e.stop()}}),e,this)}))),function(){return oe.apply(this,arguments)})},{key:"updateWalletPeersTable",value:(ae=s(f().mark((function e(){var t,n,r,a,o,i,c=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,Ne.hide(t.peerSpinner),e.next=4,S("/api/getwalletpeers",{assetID:this.selectedAssetID});case 4:if(n=e.sent,ft().checkResponse(n)){e.next=9;break}return t.managePeersErr.textContent=n.msg,Ne.show(t.managePeersErr),e.abrupt("return");case 9:for(;t.peersTableBody.firstChild;)t.peersTableBody.removeChild(t.peersTableBody.firstChild);(r=n.peers||[]).sort((function(e,t){return e.source-t.source})),a=ke("DEFAULT"),o=ke("ADDED"),i=ke("DISCOVERED"),r.forEach((function(e){var n,r=t.peerTableRow.cloneNode(!0),l=Ne.parseTemplate(r);switch(l.addr.textContent=e.addr,e.source){case ht.WalletDefault:l.source.textContent=a;break;case ht.UserAdded:l.source.textContent=o;break;case ht.Discovered:l.source.textContent=i}if(n=e.connected?c.page.connectedIconTmpl.cloneNode(!0):c.page.disconnectedIconTmpl.cloneNode(!0),l.connected.appendChild(n),e.source===ht.UserAdded){var u=c.page.removeIconTmpl.cloneNode(!0);Ne.bind(u,"click",s(f().mark((function n(){var r;return f().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return Ne.hide(t.managePeersErr),n.next=3,S("/api/removewalletpeer",{assetID:c.selectedAssetID,addr:e.addr});case 3:if(r=n.sent,ft().checkResponse(r)){n.next=8;break}return t.managePeersErr.textContent=r.msg,Ne.show(t.managePeersErr),n.abrupt("return");case 8:c.spinUntilPeersUpdate();case 9:case"end":return n.stop()}}),n)})))),l.remove.appendChild(u)}t.peersTableBody.appendChild(r)}));case 16:case"end":return e.stop()}}),e,this)}))),function(){return ae.apply(this,arguments)})},{key:"showManagePeersForm",value:(re=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,e.next=3,this.updateWalletPeersTable();case 3:Ne.hide(t.managePeersErr),this.showForm(t.managePeersForm);case 5:case"end":return e.stop()}}),e,this)}))),function(){return re.apply(this,arguments)})},{key:"submitAddPeer",value:(ne=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,Ne.hide(t.managePeersErr),e.next=4,S("/api/addwalletpeer",{assetID:this.selectedAssetID,addr:t.addPeerInput.value});case 4:if(n=e.sent,ft().checkResponse(n)){e.next=9;break}return t.managePeersErr.textContent=n.msg,Ne.show(t.managePeersErr),e.abrupt("return");case 9:this.spinUntilPeersUpdate(),t.addPeerInput.value="";case 11:case"end":return e.stop()}}),e,this)}))),function(){return ne.apply(this,arguments)})},{key:"spinUntilPeersUpdate",value:(te=s(f().mark((function e(){var t,n=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.page,Ne.show(t.peerSpinner),setTimeout((function(){Ne.isDisplayed(t.peerSpinner)&&n.updateWalletPeersTable()}),1e4);case 3:case"end":return e.stop()}}),e,this)}))),function(){return te.apply(this,arguments)})},{key:"showToggleWalletStatus",value:function(e){var t=this.page;Ne.hide(t.toggleWalletStatusErr,t.walletStatusDisable,t.disableWalletMsg,t.walletStatusEnable,t.enableWalletMsg),e?Ne.show(t.walletStatusDisable,t.disableWalletMsg):Ne.show(t.walletStatusEnable,t.enableWalletMsg),this.showForm(t.toggleWalletStatusConfirm)}},{key:"toggleWalletStatus",value:(ee=s(f().mark((function e(){var t,n,r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,Ne.hide(t.toggleWalletStatusErr),n=ft().assets[this.selectedAssetID],r=!n.wallet.disabled,a={assetID:this.selectedAssetID,disable:r},o={assetName:n.name},s=ft().loading(t.toggleWalletStatusConfirm),e.next=10,S("/api/togglewalletstatus",a);case 10:if(i=e.sent,s(),ft().checkResponse(i)){e.next=16;break}return i.code===A.activeOrdersErr?t.toggleWalletStatusErr.textContent=ke("ACTIVE_ORDERS_ERR_MSG",o):t.toggleWalletStatusErr.textContent=i.msg,Ne.show(t.toggleWalletStatusErr),e.abrupt("return");case 16:c=ke("WALLET_DISABLED",o),r||(c=ke("WALLET_ENABLED",o)),this.assetUpdated(this.selectedAssetID,t.toggleWalletStatusConfirm,c);case 19:case"end":return e.stop()}}),e,this)}))),function(){return ee.apply(this,arguments)})},{key:"showBox",value:($=s(f().mark((function e(t,n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.style.opacity="0",Ne.show(t),n&&n.focus(),e.next=5,Ne.animate(300,(function(e){t.style.opacity="".concat(e)}),"easeOut");case 5:t.style.opacity="1",this.displayed=t;case 7:case"end":return e.stop()}}),e,this)}))),function(e,t){return $.apply(this,arguments)})},{key:"showForm",value:(Z=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,this.currentForm=t,this.forms.forEach((function(e){return Ne.hide(e)})),t.style.right="10000px",Ne.show(n.forms,t),r=(n.forms.offsetWidth+t.offsetWidth)/2,e.next=8,Ne.animate(300,(function(e){t.style.right="".concat((1-e)*r,"px")}),"easeOutHard");case 8:t.style.right="0";case 9:case"end":return e.stop()}}),e,this)}))),function(e){return Z.apply(this,arguments)})},{key:"showSuccess",value:(J=s(f().mark((function e(t){var n=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.forms.forEach((function(e){return Ne.hide(e)})),this.currentForm=this.page.checkmarkForm,this.animation=Er(this.page,t),e.next=5,this.animation.wait();case 5:this.animation=new We(1500,(function(){}),"",(function(){n.currentForm===n.page.checkmarkForm&&n.closePopups()}));case 6:case"end":return e.stop()}}),e,this)}))),function(e){return J.apply(this,arguments)})},{key:"showNewWallet",value:(Y=s(f().mark((function e(t){var n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,r=n.newWalletForm,this.newWalletForm.setAsset(t),a=this.newWalletForm.loadDefaults(),e.next=6,this.showForm(r);case 6:return e.next=8,a;case 8:case"end":return e.stop()}}),e,this)}))),function(e){return Y.apply(this,arguments)})},{key:"sortAssetButtons",value:function(){var e=this,t=this.page;this.assetButtons={},Ne.empty(t.assetSelect);var n=r(Object.values(ft().assets));n.sort((function(e,t){if(e.wallet&&!t.wallet)return-1;if(!e.wallet&&t.wallet)return 1;if(!e.wallet&&!t.wallet)return"dcr"===e.symbol?-1:1;var n=[e.wallet.balance,t.wallet.balance],r=n[0],a=n[1],o=r.available+r.immature+r.locked,s=a.available+a.immature+a.locked;if(0===o&&0===s)return e.symbol.localeCompare(t.symbol);if(0===o)return 1;if(0===o)return-1;var i=[ft().fiatRatesMap[e.id],ft().fiatRatesMap[t.id]],c=i[0],l=i[1];return c&&!l?-1:!c&&l?1:l*s-c*o}));var a,o=Nr(n);try{var s=function(){var n=a.value,r=t.iconSelectTmpl.cloneNode(!0);t.assetSelect.appendChild(r);var o=Ne.parseTemplate(r);e.assetButtons[n.id]={tmpl:o,bttn:r},e.updateAssetButton(n.id),Ne.bind(r,"click",(function(){e.setSelectedAsset(n.id),k.storeLocal(k.selectedAssetLK,String(n.id))}))};for(o.s();!(a=o.n()).done;)s()}catch(e){o.e(e)}finally{o.f()}return t.assetSelect.classList.remove("invisible"),n[0]}},{key:"updateAssetButton",value:function(e){var t,n=ft().assets[e],r=this.assetButtons[e],o=r.bttn,s=r.tmpl;Ne.hide(s.fiatBox,s.noWallet),o.classList.add("nowallet"),(t=s.img).src||(t.src=Ne.logoPath(n.symbol));var i=n.symbol.split(".");if(2===i.length){var c,l=i[1];s.parentImg.classList.remove("d-hide"),(c=s.parentImg).src||(c.src=Ne.logoPath(l))}if(this.selectedAssetID===e&&o.classList.add("selected"),s.name.textContent=n.name,n.wallet){o.classList.remove("nowallet");var u=n.wallet.balance,d=n.unitInfo,h=u.available+u.locked+u.immature,p=a(Ne.formatBestUnitsFourSigFigs(h,d),2),f=p[0],v=p[1];s.balance.textContent=f,s.unit.textContent=v,Ne.show(s.balanceBox);var m=ft().fiatRatesMap[n.id];m&&(Ne.show(s.fiatBox),s.fiat.textContent=Ne.formatFourSigFigs(h/d.conventional.conversionFactor*m))}else Ne.show(s.noWallet)}},{key:"setSelectedAsset",value:(Q=s(f().mark((function e(t){var n,r,a,o,s,i,c,l,u,d;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=this.page.assetSelect,r=Nr(n.children);try{for(r.s();!(a=r.n()).done;)a.value.classList.remove("selected")}catch(e){r.e(e)}finally{r.f()}this.assetButtons[t].bttn.classList.add("selected"),this.selectedAssetID=t,this.page.hideMixTxsCheckbox.checked=!0,this.updateDisplayedAsset(t),this.showAvailableMarkets(t),o=this.showRecentActivity(t),s=this.showTxHistory(t),i=this.updateTicketBuyer(t),c=this.updatePrivacy(t),l=0,u=[o,s,i,c];case 13:if(!(l<u.length)){e.next=20;break}return d=u[l],e.next=17,d;case 17:l++,e.next=13;break;case 20:case"end":return e.stop()}}),e,this)}))),function(e){return Q.apply(this,arguments)})},{key:"updateDisplayedAsset",value:function(e){if(e===this.selectedAssetID){var t=ft().assets[e],n=t.symbol,r=t.wallet,a=t.name,o=t.token,s=t.unitInfo,i=this.page,c=this.body;if(Ne.setText(c,"[data-asset-name]",a),Ne.setText(c,"[data-ticker]",s.conventional.unit),i.assetLogo.src=Ne.logoPath(n),Ne.hide(i.balanceBox,i.fiatBalanceBox,i.createWallet,i.walletDetails,i.sendReceive,i.connectBttnBox,i.statusLocked,i.statusReady,i.statusOff,i.unlockBttnBox,i.lockBttnBox,i.connectBttnBox,i.peerCountBox,i.syncProgressBox,i.statusDisabled,i.tokenInfoBox,i.needsProviderBox,i.feeStateBox,i.txSyncBox,i.txProgress,i.txFindingAddrs),this.checkNeedsProvider(e),o){var l=ft().assets[o.parentID];i.tokenParentLogo.src=Ne.logoPath(l.symbol),i.tokenParentName.textContent=l.name,i.contractAddress.textContent=o.contractAddress,Ne.show(i.tokenInfoBox)}if(r){this.updateDisplayedAssetBalance();var u=r.feeState,d=r.running,h=r.disabled,p=r.type,f=ft().walletDefinition(e,p);i.walletType.textContent=f.tab,u&&this.updateFeeState(u),h?Ne.show(i.statusDisabled):d?this.updateSyncAndPeers(r.assetID):Ne.show(i.statusOff,i.connectBttnBox)}else Ne.show(i.createWallet);i.walletDetailsBox.classList.remove("invisible")}}},{key:"updateSyncAndPeers",value:function(e){var t=this.page;if(e===this.selectedAssetID){var n=ft().walletMap[e],r=n.peerCount,a=n.syncProgress,o=n.syncStatus,s=n.encrypted,i=n.open;if(n.running&&(Ne.show(t.sendReceive,t.peerCountBox,t.syncProgressBox),t.peerCount.textContent=String(r),t.syncProgress.textContent="".concat((100*a).toFixed(1),"%"),i?(Ne.show(t.statusReady),!ft().haveActiveOrders(e)&&s&&Ne.show(t.lockBttnBox)):Ne.show(t.statusLocked,t.unlockBttnBox),Ne.setVis(void 0!==o.txs,t.txSyncBox),void 0!==o.txs))if(Ne.hide(t.txProgress,t.txFindingAddrs),0===o.txs&&o.blocks>=o.targetHeight)Ne.show(t.txFindingAddrs);else{Ne.show(t.txProgress);var c=o.txs/o.targetHeight;t.txProgress.textContent="".concat((100*c).toFixed(1),"%")}}}},{key:"updateFeeState",value:function(e){var t=this.page,n=this.selectedAssetID;Ne.hide(t.feeStateBox);var r=ft().assets[n],a=r.unitInfo,o=r.token,s=ft().fiatRatesMap[n];if(s){var i=o?o.parentID:n,c=ft().fiatRatesMap[i];if(!o||c){Ne.show(t.feeStateBox);var l=o?ft().assets[o.parentID].unitInfo:a;Ne.formatBestRateElement(t.feeStateNetRate,i,e.rate,l),Ne.formatBestValueElement(t.feeStateSendFees,i,e.send,l),Ne.formatBestValueElement(t.feeStateSwapFees,i,e.swap,l),Ne.formatBestValueElement(t.feeStateRedeemFees,i,e.redeem,l),t.feeStateXcRate.textContent=Ne.formatFourSigFigs(s);var u=e.send/l.conventional.conversionFactor*c;t.feeStateSendFiat.textContent=Ne.formatFourSigFigs(u);var d=e.swap/l.conventional.conversionFactor*c;t.feeStateSwapFiat.textContent=Ne.formatFourSigFigs(d);var h=e.redeem/l.conventional.conversionFactor*c;t.feeStateRedeemFiat.textContent=Ne.formatFourSigFigs(h),Ne.show(t.feeStateBox)}}}},{key:"checkNeedsProvider",value:(K=s(f().mark((function e(t){var n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ft().needsCustomProvider(t);case 2:if(n=e.sent,r=this.page,a=r.needsProviderBox,o=r.needsProviderBttn,Ne.setVis(n,a),n){e.next=7;break}return e.abrupt("return");case 7:Ne.blink(o);case 8:case"end":return e.stop()}}),e,this)}))),function(e){return K.apply(this,arguments)})},{key:"updateTicketBuyer",value:(X=s(f().mark((function e(t){var n,r,a,o,s,i,c,l;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.ticketPage={number:0,history:[],scanned:!1},r=ft().assets[t],a=r.wallet,o=r.unitInfo,s=this.page,Ne.hide(s.stakingBox,s.pickVSP,s.stakingSummary,s.stakingErr,s.vspDisplayBox,s.ticketPriceBox,s.purchaseTicketsBox,s.stakingRpcSpvMsg,s.ticketsDisabled),null!=a&&a.running&&32768&a.traits){e.next=6;break}return e.abrupt("return");case 6:return Ne.show(s.stakingBox),i=ft().loading(s.stakingBox),e.next=10,this.safePost("/api/stakestatus",t);case 10:if(c=e.sent,i(),ft().checkResponse(c)){e.next=19;break}if(!c.msg.includes("disconnected from consensus RPC")){e.next=16;break}return Ne.show(s.stakingRpcSpvMsg),e.abrupt("return");case 16:return Ne.show(s.stakingErr),s.stakingErr.textContent=c.msg,e.abrupt("return");case 19:if(Ne.show(s.stakingSummary,s.ticketPriceBox),l=c.status,this.stakeStatus=l,s.stakingAgendaCount.textContent=String(l.stances.agendas.length),s.stakingTspendCount.textContent=String(l.stances.tspends.length),s.purchaserCurrentPrice.textContent=Ne.formatFourSigFigs(l.ticketPrice/o.conventional.conversionFactor),s.purchaserBal.textContent=Ne.formatCoinValue(a.balance.available,o),this.updateTicketStats(l.stats,o,l.ticketPrice,l.votingSubsidy),!(null===(n=ft().extensionWallet(this.selectedAssetID))||void 0===n?void 0:n.disableStaking)){e.next=33;break}return Ne.hide(s.setVotes,s.showVSPs),Ne.show(s.ticketsDisabled),s.extensionModeAppName.textContent=ft().user.extensionModeConfig.name,e.abrupt("return");case 33:this.setVSPViz(l.vsp);case 34:case"end":return e.stop()}}),e,this)}))),function(e){return X.apply(this,arguments)})},{key:"setVSPViz",value:function(e){var t=this.page,n=this.stakeStatus;if(Ne.hide(t.vspDisplayBox),e)return Ne.show(t.vspDisplayBox,t.purchaseTicketsBox),Ne.hide(t.pickVSP),void(t.vspURL.textContent=e);Ne.setVis(!n.isRPC,t.pickVSP),Ne.setVis(n.isRPC,t.purchaseTicketsBox)}},{key:"updateTicketStats",value:function(e,t,n,r){var a=this.page,o=this.stakeStatus;o.stats=e,n&&(o.ticketPrice=n),r&&(o.votingSubsidy=r);var s=o.tickets.filter((function(e){return e.status<=3&&e.status>=1})).length;a.stakingTicketCount.textContent=String(s),a.immatureTicketCount.textContent=String(e.mempool),Ne.setVis(e.mempool>0,a.immatureTicketCountBox),a.queuedTicketCount.textContent=String(e.queued),a.formQueuedTix.textContent=String(e.queued),Ne.setVis(e.queued>0,a.formQueueTixBox,a.queuedTicketCountBox),a.totalTicketCount.textContent=String(e.ticketCount),a.totalTicketRewards.textContent=Ne.formatFourSigFigs(e.totalRewards/t.conventional.conversionFactor),a.totalTicketVotes.textContent=String(e.votes),n&&(a.ticketPrice.textContent=Ne.formatFourSigFigs(n/t.conventional.conversionFactor)),r&&(a.votingSubsidy.textContent=Ne.formatFourSigFigs(r/t.conventional.conversionFactor))}},{key:"showVSPPicker",value:(z=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.selectedAssetID,n=this.page,this.showForm(n.vspPicker),Ne.empty(n.vspPickerList),Ne.hide(n.stakingErr),r=ft().loading(n.vspPicker),e.next=8,this.safePost("/api/listvsps",t);case 8:if(a=e.sent,r(),ft().checkResponse(a)){e.next=14;break}return Ne.show(n.stakingErr),n.stakingErr.textContent=a.msg,e.abrupt("return");case 14:o=a.vsps,s=Nr(o),e.prev=16,c=f().mark((function e(){var r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=i.value,a=n.vspRowTmpl.cloneNode(!0),n.vspPickerList.appendChild(a),(o=Ne.parseTemplate(a)).url.textContent=r.url,o.feeRate.textContent=r.feePercentage.toFixed(2),o.voting.textContent=String(r.voting),Ne.bind(a,"click",(function(){Ne.hide(n.stakingErr),l.setVSP(t,r)}));case 8:case"end":return e.stop()}}),e)})),s.s();case 19:if((i=s.n()).done){e.next=23;break}return e.delegateYield(c(),"t0",21);case 21:e.next=19;break;case 23:e.next=28;break;case 25:e.prev=25,e.t1=e.catch(16),s.e(e.t1);case 28:return e.prev=28,s.f(),e.finish(28);case 31:case"end":return e.stop()}}),e,this,[[16,25,28,31]])}))),function(){return z.apply(this,arguments)})},{key:"showPurchaseTicketsDialog",value:function(){var e=this.page;e.purchaserInput.value="",Ne.hide(e.purchaserErr),this.showForm(this.page.purchaseTicketsForm),e.purchaserInput.focus()}},{key:"purchaserInputChanged",value:function(){var e=this.page,t=parseInt(e.purchaserInput.value||"0");e.purchaserInput.value=t<=1?"1":String(t)}},{key:"purchaseTickets",value:(j=s(f().mark((function e(){var t,n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n=this.selectedAssetID,!((r=parseInt(t.purchaserInput.value||"0"))<1)){e.next=4;break}return e.abrupt("return");case 4:return a=ft().loading(t.purchaseTicketsForm),e.next=7,this.safePost("/api/purchasetickets",{assetID:n,n:r});case 7:if(o=e.sent,a(),ft().checkResponse(o)){e.next=13;break}return t.purchaserErr.textContent=o.msg,Ne.show(t.purchaserErr),e.abrupt("return");case 13:this.showSuccess(ke("TICKETS_PURCHASED",{n:r.toLocaleString(Ne.languages())}));case 14:case"end":return e.stop()}}),e,this)}))),function(){return j.apply(this,arguments)})},{key:"processTicketPurchaseUpdate",value:function(e){var t=this.stakeStatus,n=this.selectedAssetID,r=this.page,a=e.assetID,o=e.payload,s=o.err,i=o.remaining,c=o.tickets,l=o.stats;if(a===n){if(s)return Ne.show(r.purchaseTicketsErrBox),void(r.purchaseTicketsErr.textContent=s);c&&(t.tickets=c.concat(t.tickets)),l&&this.updateTicketStats(l,ft().assets[a].unitInfo),t.stats.queued=i,r.queuedTicketCount.textContent=String(i),r.formQueuedTix.textContent=String(i),Ne.setVis(i>0,r.queuedTicketCountBox)}}},{key:"setVSP",value:(_=s(f().mark((function e(t,n){var r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.closePopups(),r=this.page,a=ft().loading(r.stakingBox),e.next=5,this.safePost("/api/setvsp",{assetID:t,url:n.url});case 5:if(o=e.sent,a(),ft().checkResponse(o)){e.next=11;break}return Ne.show(r.stakingErr),r.stakingErr.textContent=o.msg,e.abrupt("return");case 11:this.setVSPViz(n.url);case 12:case"end":return e.stop()}}),e,this)}))),function(e,t){return _.apply(this,arguments)})},{key:"setCustomVSP",value:function(){var e=this.selectedAssetID,t={url:this.page.customVspUrl.value};this.setVSP(e,t)}},{key:"pageOfTickets",value:function(e){var t=this.stakeStatus,n=this.ticketPage,a=e*Yr,o=[];if(a<t.tickets.length){if(o.push.apply(o,r(t.tickets.slice(a,a+Yr))),o.length<Yr){var s=Yr-o.length;o.push.apply(o,r(n.history.slice(0,s)))}}else a-=t.tickets.length,o.push.apply(o,r(n.history.slice(a,a+Yr)));return o}},{key:"displayTicketPage",value:function(e,t){var n=this.page,r=this.selectedAssetID,a=ft().unitInfo(r),o=En[r][ft().user.net];Ne.empty(n.ticketHistoryRows),n.ticketHistoryPage.textContent=String(e);var s,i=Nr(t);try{for(i.s();!(s=i.n()).done;){var c=s.value,l=c.tx,u=c.status,d=n.ticketHistoryRowTmpl.cloneNode(!0);n.ticketHistoryRows.appendChild(d),ft().bindUrlHandlers(d);var h=Ne.parseTemplate(d);h.age.textContent=Ne.timeSince(1e3*l.stamp),h.price.textContent=Ne.formatFullPrecision(l.ticketPrice,a),h.status.textContent=ke(Ur[u]),h.hashStart.textContent=l.hash.slice(0,6),h.hashEnd.textContent=l.hash.slice(-6),h.detailsLinkUrl.setAttribute("href",o(l.hash))}}catch(e){i.e(e)}finally{i.f()}}},{key:"ticketPageN",value:(U=s(f().mark((function e(t){var n,a,o,s,i,c,l,u,d,h,p,v,m,g;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,a=this.stakeStatus,o=this.ticketPage,s=this.selectedAssetID,!((i=this.pageOfTickets(t)).length<Yr)||o.scanned){e.next=18;break}return l=Yr-i.length,u=o.history.length>0?o.history:a.tickets,d=u.length>0?u[u.length-1].tx.blockHeight:-1,h=u.filter((function(e){return e.tx.blockHeight===d})).length,p=ft().loading(n.ticketHistoryForm),e.next=10,this.safePost("/api/ticketpage",{assetID:s,scanStart:d,n:l,skipN:h});case 10:if(v=e.sent,p(),ft().checkResponse(v)){e.next=15;break}return console.error("error fetching ticket page",v.msg),e.abrupt("return");case 15:(c=this.ticketPage.history).push.apply(c,r(v.tickets)),i.push.apply(i,r(v.tickets)),v.tickets.length<l&&(this.ticketPage.scanned=!0);case 18:if(m=a.tickets.length+o.history.length,Ne.setVis(m>=Yr,n.ticketHistoryPagination),Ne.setVis(m>0,n.ticketHistoryTable),Ne.setVis(0===m,n.noTicketsMessage),0!==i.length){e.next=25;break}return Ne.hide(n.ticketHistoryNextPage),e.abrupt("return");case 25:this.displayTicketPage(t,i),o.number=t,g=t*Yr+i.length===m,Ne.setVis(!g||!o.scanned,n.ticketHistoryNextPage),Ne.setVis(t>0,n.ticketHistoryPrevPage);case 30:case"end":return e.stop()}}),e,this)}))),function(e){return U.apply(this,arguments)})},{key:"showTicketHistory",value:(V=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.showForm(this.page.ticketHistoryForm),e.next=3,this.ticketPageN(this.ticketPage.number);case 3:case"end":return e.stop()}}),e,this)}))),function(){return V.apply(this,arguments)})},{key:"nextTicketPage",value:(W=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.ticketPageN(this.ticketPage.number+1);case 2:case"end":return e.stop()}}),e,this)}))),function(){return W.apply(this,arguments)})},{key:"prevTicketPage",value:(N=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.ticketPageN(this.ticketPage.number-1);case 2:case"end":return e.stop()}}),e,this)}))),function(){return N.apply(this,arguments)})},{key:"showSetVotesDialog",value:function(){var e,t=this,n=this.page,r=this.stakeStatus,a=this.selectedAssetID,o=ft().unitInfo(a);Ne.hide(n.votingFormErr);var i=En[a][ft().user.net],c=function(){var e=s(f().mark((function e(r){var a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return Ne.hide(n.votingFormErr),a=ft().loading(n.votingForm),e.next=4,t.safePost("/api/setvotes",r);case 4:if(o=e.sent,a(),ft().checkResponse(o)){e.next=10;break}throw Ne.show(n.votingFormErr),n.votingFormErr.textContent=o.msg,Error(o.msg);case 10:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),l=function(){var e=s(f().mark((function e(t,n){var o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c({assetID:a,choices:h({},t,n)});case 2:o=Nr(r.stances.agendas);try{for(o.s();!(s=o.n()).done;)(i=s.value).id===t&&(i.currentChoice=n)}catch(e){o.e(e)}finally{o.f()}case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}();Ne.empty(n.votingAgendas);var u,d=Nr(r.stances.agendas);try{var p=function(){var e=u.value,t=n.votingAgendaTmpl.cloneNode(!0);n.votingAgendas.appendChild(t);var r=Ne.parseTemplate(t);r.description.textContent=e.description;var a,o=Nr(e.choices);try{var s=function(){var t=a.value,o=n.votingChoiceTmpl.cloneNode(!0);r.choices.appendChild(o);var s,i=Ne.parseTemplate(o);i.id.textContent=(s=t.id).charAt(0).toUpperCase()+s.slice(1),i.id.dataset.tooltip=t.description,i.radio.value=t.id,i.radio.name=e.id,Ne.bind(i.radio,"change",(function(){i.radio.checked&&l(e.id,t.id)})),t.id===e.currentChoice&&(i.radio.checked=!0)};for(o.s();!(a=o.n()).done;)s()}catch(e){o.e(e)}finally{o.f()}ft().bindTooltips(r.choices)};for(d.s();!(u=d.n()).done;)p()}catch(e){d.e(e)}finally{d.f()}var v=function(){var e=s(f().mark((function e(t,n){var o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c({assetID:a,tSpendPolicy:h({},t,n)});case 2:o=Nr(r.stances.tspends);try{for(o.s();!(s=o.n()).done;)(i=s.value).hash===t&&(i.currentPolicy=n)}catch(e){o.e(e)}finally{o.f()}case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}();Ne.empty(n.votingTspends);var m,g=Nr(r.stances.tspends);try{var y=function(){var e=m.value,t=n.tspendTmpl.cloneNode(!0);n.votingTspends.appendChild(t),ft().bindUrlHandlers(t);for(var r=Ne.parseTemplate(t),a=function(){var t=c[s];t.name=e.hash,e.currentPolicy===t.value&&(t.checked=!0),Ne.bind(t,"change",(function(){var n;t.checked&&v(e.hash,null!==(n=t.value)&&void 0!==n?n:"")}))},s=0,c=[r.yes,r.no];s<c.length;s++)a();e.value>0?r.value.textContent=Ne.formatFourSigFigs(e.value/o.conventional.conversionFactor):Ne.hide(r.value),r.hash.textContent=e.hash,r.explorerLink.setAttribute("href",i(e.hash))};for(g.s();!(m=g.n()).done;)y()}catch(e){g.e(e)}finally{g.f()}var b=function(){var e=s(f().mark((function e(t,n){var o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c({assetID:a,treasuryPolicy:h({},t,n)});case 2:o=Nr(r.stances.treasuryKeys);try{for(o.s();!(s=o.n()).done;)(i=s.value).key===t&&(i.policy=n)}catch(e){o.e(e)}finally{o.f()}case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}();Ne.empty(n.votingTKeys);var x,k=Nr(null!==(e=r.stances.treasuryKeys)&&void 0!==e?e:[]);try{var w=function(){var e=x.value,t=n.tkeyTmpl.cloneNode(!0);n.votingTKeys.appendChild(t);for(var r=Ne.parseTemplate(t),a=function(){var t=s[o];t.name=e.key,e.policy===t.value&&(t.checked=!0),Ne.bind(t,"change",(function(){var n;t.checked&&b(e.key,null!==(n=t.value)&&void 0!==n?n:"")}))},o=0,s=[r.yes,r.no];o<s.length;o++)a();r.key.textContent=e.key};for(k.s();!(x=k.n()).done;)w()}catch(e){k.e(e)}finally{k.f()}this.showForm(n.votingForm)}},{key:"updatePrivacy",value:(q=s(f().mark((function e(t){var n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=null===(n=ft().extensionWallet(t))||void 0===n?void 0:n.disablePrivacy,this.mixing=!1,a=ft().assets[t].wallet,o=this.page,Ne.hide(o.mixingBox,o.mixerOff,o.mixerOn),!r&&null!=a&&a.running&&a.traits&Vr){e.next=7;break}return e.abrupt("return");case 7:return Ne.show(o.mixingBox,o.mixerLoading),e.next=10,this.safePost("/api/mixingstats",{assetID:t});case 10:if(s=e.sent,Ne.hide(o.mixerLoading),ft().checkResponse(s)){e.next=16;break}return Ne.show(o.mixingErr),o.mixingErr.textContent=s.msg,e.abrupt("return");case 16:this.mixing=s.stats.enabled,this.mixing?Ne.show(o.mixerOn):Ne.show(o.mixerOff),this.mixerToggle.setState(this.mixing);case 19:case"end":return e.stop()}}),e,this)}))),function(e){return q.apply(this,arguments)})},{key:"updateMixerState",value:(M=s(f().mark((function e(t){var n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,Ne.hide(n.mixingErr),r=ft().loading(n.mixingBox),e.next=5,S("/api/configuremixer",{assetID:this.selectedAssetID,enabled:t});case 5:if(a=e.sent,r(),ft().checkResponse(a)){e.next=11;break}return n.mixingErr.textContent=ke(H,{msg:a.msg}),Ne.show(n.mixingErr),e.abrupt("return");case 11:Ne.setVis(t,n.mixerOn),Ne.setVis(!t,n.mixerOff),this.mixerToggle.setState(t);case 14:case"end":return e.stop()}}),e,this)}))),function(e){return M.apply(this,arguments)})},{key:"updateDisplayedAssetBalance",value:function(){var e,t,n,r=this.page,a=ft().assets[this.selectedAssetID],o=a.wallet,s=a.unitInfo,i=a.id,c=o.balance;Ne.show(r.balanceBox,r.walletDetails);var l=c.locked+c.contractlocked+c.bondlocked,u=c.available+l+c.immature;r.balance.textContent=Ne.formatCoinValue(u,s),r.balanceUnit.textContent=s.conventional.unit;var d=ft().fiatRatesMap[i];d&&(Ne.show(r.fiatBalanceBox),r.fiatBalance.textContent=Ne.formatFiatConversion(u,d,s)),Ne.empty(r.balanceDetailBox);var h,p,f=function(e,t,n){var a=r.balanceDetailRow.cloneNode(!0);r.balanceDetailBox.appendChild(a);var o=Ne.parseTemplate(a);return o.name.textContent=e,n&&(o.tooltipMsg.dataset.tooltip=n,Ne.show(o.tooltipMsg)),o.balance.textContent=Ne.formatCoinValue(t,s),a},v=function(e,t,n){h=void 0,p=f(e,t,n)},m=function(e,t,n){(h=f(e,t,n)).classList.add("sub")},g=function(){h&&(p.classList.add("itemized"),h.classList.add("last"))};if(v(ke("AVAILABLE_TITLE"),c.available,""),void 0!==(null===(e=c.other)||void 0===e?void 0:e.Shielded)){var y=c.available-c.other.Shielded.amt;m(ke("TRANSPARENT"),y),m(ke("SHIELDED"),c.other.Shielded.amt)}g(),v(ke("LOCKED_TITLE"),l,ke("LOCKED_BAL_MSG")),c.orderlocked>0&&m(ke("ORDER"),c.orderlocked,ke("LOCKED_ORDER_BAL_MSG")),c.contractlocked>0&&m(ke("SWAPPING"),c.contractlocked,ke("LOCKED_SWAPPING_BAL_MSG")),c.bondlocked>0&&m(ke("BONDED"),c.bondlocked,ke("LOCKED_BOND_BAL_MSG")),c.bondReserves>0&&m(ke("BOND_RESERVES"),c.bondReserves,ke("BOND_RESERVES_MSG")),void 0!==(null==c||null===(t=c.other)||void 0===t?void 0:t.Staked)&&m("Staked",c.other.Staked.amt),g(),c.immature&&v(ke("IMMATURE_TITLE"),c.immature,ke("IMMATURE_BAL_MSG")),void 0!==(null==c||null===(n=c.other)||void 0===n?void 0:n.Unmixed)&&m("Unmixed",c.other.Unmixed.amt),g(),r.purchaserBal.textContent=Ne.formatFourSigFigs(c.available/s.conventional.conversionFactor),ft().bindTooltips(r.balanceDetailBox)}},{key:"showAvailableMarkets",value:function(e){for(var t=this.page,n=ft().user.exchanges,r=[],o=0,s=Object.values(n);o<s.length;o++){var i=s[o];if(i.markets)for(var c=0,l=Object.values(i.markets);c<l.length;c++){var u=l[c];u.baseid!==e&&u.quoteid!==e||r.push([i.host,i,u])}}var d=function(e,t){var n=t.spot;if(!n)return 0;var r=ft().unitInfo(e).conventional.conversionFactor;return(e===t.baseid?n.vol24:n.vol24*n.rate/Ft)/r};r.sort((function(t,n){var r=a(t,3),o=r[0],s=r[2],i=a(n,3),c=i[0],l=i[2];return s.spot||l.spot?d(e,l)-d(e,s):o.localeCompare(c)})),Ne.empty(t.availableMarkets);for(var h=function(){var r=a(f[p],3),o=r[0],s=r[1],i=r[2],c=i.spot,l=i.baseid,u=i.basesymbol,h=i.quoteid,v=i.quotesymbol,m=t.marketRow.cloneNode(!0);t.availableMarkets.appendChild(m);var g=Ne.parseTemplate(m);if(g.host.textContent=o,g.baseLogo.src=Ne.logoPath(u),g.quoteLogo.src=Ne.logoPath(v),Ne.empty(g.baseSymbol,g.quoteSymbol),g.baseSymbol.appendChild(Ne.symbolize(s.assets[l],!0)),g.quoteSymbol.appendChild(Ne.symbolize(s.assets[h],!0)),c){var y=ft().conventionalRate(l,h,c.rate,n[o]);g.price.textContent=Ne.formatFourSigFigs(y);var b=function(e){return e.split(".")[0].toUpperCase()};g.priceQuoteUnit.textContent=b(v),g.priceBaseUnit.textContent=b(u),g.volume.textContent=Ne.formatFourSigFigs(d(e,i)),g.volumeUnit.textContent=b(e===l?u:v)}else Ne.hide(g.priceBox,g.volumeBox);Ne.bind(m,"click",(function(){return ft().loadPage("markets",{host:o,baseID:l,quoteID:h})}))},p=0,f=r;p<f.length;p++)h();t.marketsOverviewBox.classList.remove("invisible")}},{key:"showRecentActivity",value:(O=s(f().mark((function e(t){var n,r,a,o,s,i,c,l,u,d,h,p,v,m,g,y;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,r=ft().loading(n.orderActivityBox),a={n:20,assets:[t],hosts:[],statuses:[]},e.next=5,S("/api/orders",a);case 5:if(o=e.sent,r(),Ne.hide(n.noActivity,n.orderActivity),o.orders&&0!==o.orders.length){e.next=12;break}return Ne.show(n.noActivity),n.orderActivityBox.classList.remove("invisible"),e.abrupt("return");case 12:for(Ne.show(n.orderActivity),Ne.empty(n.recentOrders),s=0,i=o.orders;s<i.length;s++)c=i[s],l=n.recentOrderTmpl.cloneNode(!0),n.recentOrders.appendChild(l),u=Ne.parseTemplate(l),d=void 0,h=void 0,p=[ft().unitInfo(c.baseID),ft().unitInfo(c.quoteID)],v=p[0],m=p[1],c.sell?(g=[ft().assets[c.baseID],ft().assets[c.quoteID]],d=g[0],h=g[1],u.fromQty.textContent=Ne.formatCoinValue(c.qty,v),1===c.type&&(u.toQty.textContent=Ne.formatCoinValue(c.qty/Ft*c.rate,m))):(y=[ft().assets[c.quoteID],ft().assets[c.baseID]],d=y[0],h=y[1],2===c.type?u.fromQty.textContent=Ne.formatCoinValue(c.qty,v):(u.fromQty.textContent=Ne.formatCoinValue(c.qty/Ft*c.rate,m),u.toQty.textContent=Ne.formatCoinValue(c.qty,v))),u.fromLogo.src=Ne.logoPath(d.symbol),Ne.empty(u.fromSymbol,u.toSymbol),u.fromSymbol.appendChild(Ne.symbolize(d,!0)),u.toLogo.src=Ne.logoPath(h.symbol),u.toSymbol.appendChild(Ne.symbolize(h,!0)),u.status.textContent=Rt(c),u.filled.textContent="".concat((Et(c)/c.qty*100).toFixed(1),"%"),u.age.textContent=Ne.timeSince(c.submitTime),u.link.href="order/".concat(c.id),ft().bindInternalNavigation(l);n.orderActivityBox.classList.remove("invisible");case 16:case"end":return e.stop()}}),e,this)}))),function(e){return O.apply(this,arguments)})},{key:"updateTxHistoryRow",value:function(e,t,n){var r=Ne.parseTemplate(e),o=n,s=n;if(t.tokenID)if(o=t.tokenID,n!==t.tokenID)s=n;else{var i=ft().assets[n];i.token?s=i.token.parentID:console.error("unable to determine fee asset for tx ".concat(t.id))}var c=ft().unitInfo(o),l=ft().unitInfo(s);r.age.textContent=Ne.timeSince(1e3*t.timestamp),r.age.dataset.timestamp=String(1e3*t.timestamp),Ne.setVis(0===t.timestamp,r.pending),Ne.setVis(0!==t.timestamp,r.age),t.timestamp>0&&(r.age.dataset.stamp=String(t.timestamp));var u=Xr(t.type);if(t.tokenID&&t.tokenID!==n){var d=ft().assets[t.tokenID].unitInfo.conventional.unit;u="".concat(d," ").concat(u)}if(r.type.textContent=u,r.id.textContent=$r(t.id,12),r.id.setAttribute("title",t.id),r.fees.textContent=Ne.formatCoinValue(t.fees,l),Hr.includes(t.type))r.amount.textContent="-";else{var h=a(zr(t.type),2),p=h[0],f=h[1],v=Ne.formatCoinValue(t.amount,c);r.amount.textContent="".concat(p).concat(v),""!==f&&r.amount.classList.add(f)}}},{key:"txHistoryRow",value:function(e,t){var n=this,r=this.page.txHistoryRowTmpl.cloneNode(!0);r.dataset.txid=e.id,Ne.bind(r,"click",(function(){return n.showTxDetailsPopup(e.id)})),this.updateTxHistoryRow(r,e,t);var a=Ne.parseTemplate(r);return this.stampers.push(a.age),r}},{key:"txHistoryDateRow",value:function(e){var t=this.page.txHistoryDateRowTmpl.cloneNode(!0);return Ne.parseTemplate(t).date.textContent=e,t}},{key:"setTxDetailsPopupElements",value:function(e){var t=this.page,n=En[this.selectedAssetID];n&&n[Jr]&&(t.txViewBlockExplorer.href=n[Jr](e.id));var r=Xr(e.type);if(e.tokenID&&e.tokenID!==this.selectedAssetID){var o=ft().assets[e.tokenID].symbol.split(".")[0].toUpperCase();r="".concat(o," ").concat(r)}if(t.txDetailsType.textContent=r,Ne.setVis(16===e.type,t.txTypeTooltip),t.txTypeTooltip.dataset.tooltip=ke("SWAP_OR_SEND_TOOLTIP"),Hr.includes(e.type))Ne.hide(t.txDetailsAmtSection);else{var s=this.selectedAssetID;e.tokenID&&(s=e.tokenID),Ne.show(t.txDetailsAmtSection);var i=ft().unitInfo(s),c=Ne.formatCoinValue(e.amount,i),l=a(zr(e.type),2),u=l[0],d=l[1];t.txDetailsAmount.textContent="".concat(u).concat(c," ").concat(i.conventional.unit),""!==d&&t.txDetailsAmount.classList.add(d)}var h=this.selectedAssetID;if(void 0!==e.tokenID){var p=ft().assets[e.tokenID];p.token?h=p.token.parentID:console.error("wallet transaction ".concat(e.id," is supposed to be a token tx, but asset ").concat(e.tokenID," is not a token"))}var f=ft().unitInfo(h),v=Ne.formatCoinValue(e.fees,f);t.txDetailsFee.textContent="".concat(v," ").concat(f.conventional.unit),t.txDetailsBlockNumber.textContent="".concat(e.blockNumber);var m=new Date(1e3*e.timestamp),g=m.toLocaleDateString(),y=m.toLocaleTimeString();if(t.txDetailsTimestamp.textContent="".concat(g," ").concat(y),Ne.setVis(0===e.blockNumber,t.timestampPending,t.blockNumberPending),Ne.setVis(0!==e.blockNumber,t.txDetailsBlockNumber,t.txDetailsTimestamp),t.txDetailsID.textContent=$r(e.id,20),t.txDetailsID.setAttribute("title",e.id),e.recipient?(Ne.show(t.txDetailsRecipientSection),t.txDetailsRecipient.textContent=$r(e.recipient,20),t.txDetailsRecipient.setAttribute("title",e.recipient)):Ne.hide(t.txDetailsRecipientSection),e.bondInfo){Ne.show(t.txDetailsBondIDSection,t.txDetailsBondLocktimeSection),Ne.setVis(""!==e.bondInfo.accountID,t.txDetailsBondAccountIDSection),t.txDetailsBondID.textContent=$r(e.bondInfo.bondID,20),t.txDetailsBondID.setAttribute("title",e.bondInfo.bondID);var b=new Date(1e3*e.bondInfo.lockTime),x=b.toLocaleDateString(),k=b.toLocaleTimeString();t.txDetailsBondLocktime.textContent="".concat(x," ").concat(k),t.txDetailsBondAccountID.textContent=$r(e.bondInfo.accountID,20),t.txDetailsBondAccountID.setAttribute("title",e.bondInfo.accountID)}else Ne.hide(t.txDetailsBondIDSection,t.txDetailsBondLocktimeSection,t.txDetailsBondAccountIDSection);e.additionalData&&e.additionalData.Nonce?(Ne.show(t.txDetailsNonceSection),t.txDetailsNonce.textContent="".concat(e.additionalData.Nonce)):Ne.hide(t.txDetailsNonceSection)}},{key:"showTxDetailsPopup",value:function(e){var t=ft().getWalletTx(this.selectedAssetID,e);t?(this.currTx=t,this.setTxDetailsPopupElements(t),this.showForm(this.page.txDetails)):console.error("wallet transaction ".concat(e," not found"))}},{key:"txHistoryTableNewestDate",value:function(){return this.page.txHistoryTableBody.children.length>=1&&Ne.parseTemplate(this.page.txHistoryTableBody.children[0]).date.textContent||""}},{key:"txDate",value:function(e){return 0===e.timestamp?(new Date).toLocaleDateString():new Date(1e3*e.timestamp).toLocaleDateString()}},{key:"handleTxNote",value:function(e,t){var n;if(!(ft().assets[this.selectedAssetID].wallet.traits&Vr&&this.page.hideMixTxs.checked)||17!==e.type)if(t)this.oldestTx?this.txDate(e)!==this.txHistoryTableNewestDate()?(this.page.txHistoryTableBody.insertBefore(this.txHistoryRow(e,this.selectedAssetID),this.page.txHistoryTableBody.children[0]),this.page.txHistoryTableBody.insertBefore(this.txHistoryDateRow(this.txDate(e)),this.page.txHistoryTableBody.children[0])):this.page.txHistoryTableBody.insertBefore(this.txHistoryRow(e,this.selectedAssetID),this.page.txHistoryTableBody.children[1]):(Ne.show(this.page.txHistoryTable),Ne.hide(this.page.noTxHistory),this.page.txHistoryTableBody.appendChild(this.txHistoryDateRow(this.txDate(e))),this.page.txHistoryTableBody.appendChild(this.txHistoryRow(e,this.selectedAssetID)),this.oldestTx=e);else{var r,a=Nr(this.page.txHistoryTableBody.children);try{for(a.s();!(r=a.n()).done;){var o=r.value;if(o.dataset.txid===e.id){this.updateTxHistoryRow(o,e,this.selectedAssetID);break}}}catch(e){a.e(e)}finally{a.f()}e.id===(null===(n=this.currTx)||void 0===n?void 0:n.id)&&this.setTxDetailsPopupElements(e)}}},{key:"getTxHistory",value:(L=s(f().mark((function e(t,n,a){var o,s,i,c,l,u,d,h,p;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o=10,n&&(o=15),s={txs:[],lastTx:!1},i=a,c=0;case 5:if(!(c<40)){e.next=18;break}return e.next=8,ft().txHistory(t,o,i);case 8:if((l=e.sent).txs.length>0&&(i=l.txs[l.txs.length-1].id),u=l.txs,n&&(u=u.filter((function(e){return 17!==e.type}))),s.txs.length+u.length>10?(h=10-s.txs.length,(d=s.txs).push.apply(d,r(u.slice(0,h)))):(l.lastTx&&(s.lastTx=!0),(p=s.txs).push.apply(p,r(u))),!(s.txs.length>=10||l.lastTx)){e.next=15;break}return e.abrupt("break",18);case 15:c++,e.next=5;break;case 18:return e.abrupt("return",s);case 19:case"end":return e.stop()}}),e)}))),function(e,t,n){return L.apply(this,arguments)})},{key:"showTxHistory",value:(P=s(f().mark((function e(t){var n,r,a,o,s,i,c,l,u,d,h;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,Ne.hide(n.txHistoryTable,n.txHistoryBox,n.noTxHistory,n.earlierTxs,n.txHistoryNotAvailable,n.hideMixTxs),Ne.empty(n.txHistoryTableBody),(a=ft().assets[t].wallet)&&!a.disabled&&65536&a.traits){e.next=7;break}return Ne.show(n.txHistoryNotAvailable),e.abrupt("return");case 7:return this.oldestTx=void 0,o=!!(a.traits&Vr),Ne.setVis(o,n.hideMixTxs),Ne.show(n.txHistoryBox),e.prev=11,s=o&&!!n.hideMixTxsCheckbox.checked,e.next=15,this.getTxHistory(t,s);case 15:r=e.sent,e.next=22;break;case 18:return e.prev=18,e.t0=e.catch(11),Ne.show(n.noTxHistory),e.abrupt("return");case 22:if(0!==r.txs.length){e.next=25;break}return Ne.show(n.noTxHistory),e.abrupt("return");case 25:i=this.txDate(r.txs[0]),n.txHistoryTableBody.appendChild(this.txHistoryDateRow(i)),c=Nr(r.txs);try{for(c.s();!(l=c.n()).done;)u=l.value,(d=this.txDate(u))!==i&&(i=d,n.txHistoryTableBody.appendChild(this.txHistoryDateRow(d))),h=this.txHistoryRow(u,t),n.txHistoryTableBody.appendChild(h)}catch(e){c.e(e)}finally{c.f()}this.oldestTx=r.txs[r.txs.length-1],Ne.show(n.txHistoryTable),Ne.setVis(!r.lastTx,n.earlierTxs);case 32:case"end":return e.stop()}}),e,this,[[11,18]])}))),function(e){return P.apply(this,arguments)})},{key:"loadEarlierTxs",value:(B=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l,u;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.oldestTx){e.next=2;break}return e.abrupt("return");case 2:return t=this.page,r=ft().assets[this.selectedAssetID].wallet,a=!!(r.traits&Vr)&&!!t.hideMixTxsCheckbox.checked,e.prev=5,e.next=8,this.getTxHistory(this.selectedAssetID,a,this.oldestTx.id);case 8:n=e.sent,e.next=15;break;case 11:return e.prev=11,e.t0=e.catch(5),console.error(e.t0),e.abrupt("return");case 15:o=this.txDate(this.oldestTx),s=Nr(n.txs);try{for(s.s();!(i=s.n()).done;)c=i.value,(l=this.txDate(c))!==o&&(o=l,t.txHistoryTableBody.appendChild(this.txHistoryDateRow(l))),u=this.txHistoryRow(c,this.selectedAssetID),t.txHistoryTableBody.appendChild(u)}catch(e){s.e(e)}finally{s.f()}Ne.setVis(!n.lastTx,t.earlierTxs),n.txs.length>0&&(this.oldestTx=n.txs[n.txs.length-1]);case 20:case"end":return e.stop()}}),e,this,[[5,11]])}))),function(){return B.apply(this,arguments)})},{key:"rescanWallet",value:(E=s(f().mark((function e(t){var n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,Ne.hide(n.reconfigErr),r="/api/rescanwallet",a={assetID:t},o=ft().loading(this.body),e.next=7,S(r,a);case 7:if(s=e.sent,o(),s.code!==A.activeOrdersErr){e.next=14;break}return this.forceUrl=r,this.forceReq=a,this.showConfirmForce(),e.abrupt("return");case 14:if(ft().checkResponse(s)){e.next=17;break}return Ne.showFormError(n.reconfigErr,s.msg),e.abrupt("return");case 17:this.assetUpdated(t,n.reconfigForm,ke("RESCAN_STARTED"));case 18:case"end":return e.stop()}}),e,this)}))),function(e){return E.apply(this,arguments)})},{key:"showConfirmForce",value:function(){Ne.hide(this.page.confirmForceErr),this.showForm(this.page.confirmForce)}},{key:"showRecoverWallet",value:function(){Ne.hide(this.page.recoverWalletErr),this.showForm(this.page.recoverWalletConfirm)}},{key:"openWallet",value:(I=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={assetID:t},e.next=3,S("/api/openwallet",n);case 3:if(r=e.sent,ft().checkResponse(r)){e.next=7;break}return console.error("openwallet error",r),e.abrupt("return");case 7:this.assetUpdated(t,void 0,ke("WALLET_UNLOCKED"));case 8:case"end":return e.stop()}}),e,this)}))),function(e){return I.apply(this,arguments)})},{key:"showReconfig",value:(D=s(f().mark((function e(t,n){var r,a,o,s,i,c,l,u,d,h,p,v,m,g,y,b,x;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=this.page,Ne.hide(a.changeWalletType,a.changeTypeHideIcon,a.reconfigErr,a.showChangeType,a.changeTypeHideIcon,a.reconfigErr,a.enableWallet,a.disableWallet),this.changeWalletPW=!1,this.setPWSettingViz(this.changeWalletPW),o=ft().assets[t],s=ft().currentWalletDefinition(t),i=o.token?[o.token.definition]:o.info?o.info.availablewallets:[],c=null===(r=ft().extensionWallet(t))||void 0===r?void 0:r.disableWalletType,i.length>1&&!c){Ne.empty(a.changeWalletTypeSelect),Ne.show(a.showChangeType,a.changeTypeShowIcon),a.changeTypeMsg.textContent=ke("CHANGE_WALLET_TYPE"),l=Nr(i);try{for(l.s();!(u=l.n()).done;)d=u.value,h=document.createElement("option"),d.type===s.type&&(h.selected=!0),h.value=h.textContent=d.type,a.changeWalletTypeSelect.appendChild(h)}catch(e){l.e(e)}finally{l.f()}}if(null!=n&&n.elevateProviders){p=Nr(s.configopts);try{for(p.s();!(v=p.n()).done;)"providers"===(m=v.value).key&&(m.required=!0)}catch(e){p.e(e)}finally{p.f()}}return g=ft().walletMap[t],Ne.setVis(4&g.traits,a.downloadLogs),Ne.setVis(32&g.traits,a.recoverWallet),Ne.setVis(256&g.traits,a.exportWallet),Ne.setVis(1&g.traits,a.rescanWallet),Ne.setVis(1024&g.traits&&!g.disabled,a.managePeers),Ne.setVis(8192&g.traits&&!g.disabled,a.unapproveTokenAllowance),Ne.setVis(9509&g.traits,a.otherActionsLabel),g.disabled?Ne.show(a.enableWallet):Ne.show(a.disableWallet),this.showOrHideRecoverySupportMsg(g,s.seeded),a.recfgAssetLogo.src=Ne.logoPath(o.symbol),a.recfgAssetName.textContent=o.name,null!=n&&n.skipAnimation||this.showForm(a.reconfigForm),y=ft().loading(a.reconfigForm),e.next=26,S("/api/walletsettings",{assetID:t});case 26:if(b=e.sent,y(),ft().checkResponse(b)){e.next=31;break}return Ne.showFormError(a.reconfigErr,b.msg),e.abrupt("return");case 31:x=ft().haveActiveOrders(t),this.reconfigForm.update(o.id,s.configopts||[],x),this.setGuideLink(s.guidelink),this.reconfigForm.setConfig(b.map),this.updateDisplayedReconfigFields(s);case 36:case"end":return e.stop()}}),e,this)}))),function(e,t){return D.apply(this,arguments)})},{key:"showOrHideRecoverySupportMsg",value:function(e,t){this.setRecoverySupportMsgViz(t&&!e.running&&!e.disabled&&Boolean(32&e.traits),e.symbol)}},{key:"setRecoverySupportMsgViz",value:function(e,t){var n=this.page;if(e)return n.reconfigSupportMsg.textContent=ke("WALLET_RECOVERY_SUPPORT_MSG",{walletSymbol:t.toLocaleUpperCase()}),Ne.show(n.reconfigSupportMsg),n.submitReconfig.setAttribute("disabled",""),void n.submitReconfig.classList.add("grey");n.submitReconfig.removeAttribute("disabled"),n.submitReconfig.classList.remove("grey"),Ne.empty(n.reconfigSupportMsg),Ne.hide(n.reconfigSupportMsg)}},{key:"changeWalletType",value:function(){var e=this.page.changeWalletTypeSelect.value||"",t=ft().walletDefinition(this.selectedAssetID,e);this.reconfigForm.update(this.selectedAssetID,t.configopts||[],!1);var n=ft().walletMap[this.selectedAssetID],r=ft().currentWalletDefinition(this.selectedAssetID);t.type!==r.type?this.setRecoverySupportMsgViz(!1,n.symbol):this.showOrHideRecoverySupportMsg(n,t.seeded),this.setGuideLink(t.guidelink),this.updateDisplayedReconfigFields(t)}},{key:"setGuideLink",value:function(e){Ne.hide(this.walletCfgGuide),""!==e&&(this.walletCfgGuide.href=e,Ne.show(this.walletCfgGuide))}},{key:"updateDisplayedReconfigFields",value:function(e){var t,n=null===(t=ft().extensionWallet(this.selectedAssetID))||void 0===t?void 0:t.disablePassword;e.seeded||"token"===e.type||n?(Ne.hide(this.page.showChangePW,this.reconfigForm.fileSelector),this.changeWalletPW=!1,this.setPWSettingViz(!1)):Ne.show(this.page.showChangePW,this.reconfigForm.fileSelector)}},{key:"showDeposit",value:(T=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.depositAddrForm.setAsset(t),this.showForm(this.page.deposit);case 2:case"end":return e.stop()}}),e,this)}))),function(e){return T.apply(this,arguments)})},{key:"showSendForm",value:(F=s(f().mark((function e(t){var n,r,a,o,s,i,c,l,u,d,h,p,v,m,g;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,r=n.sendForm,a=ft().assets[t],o=a.wallet,s=a.unitInfo,i=a.symbol,c=a.token,Ne.hide(n.toggleSubtract),n.subtractCheckBox.checked=!1,(l=!!(64&o.traits))&&Ne.show(n.toggleSubtract),Ne.hide(n.sendErr,n.maxSendDisplay,n.sendTokenMsgBox),n.sendAddr.classList.remove("border-danger","border-success"),n.sendAddr.value="",n.sendAmt.value="",u=ft().fiatRatesMap[t],Ne.showFiatValue(n.sendValue,0,u,s),n.walletBal.textContent=Ne.formatFullPrecision(o.balance.available,s),n.sendLogo.src=Ne.logoPath(i),n.sendName.textContent=s.conventional.unit,c&&(d=ft().assets[c.parentID],n.sendTokenParentLogo.src=Ne.logoPath(d.symbol),n.sendTokenParentName.textContent=d.name,Ne.show(n.sendTokenMsgBox)),!(o.balance.available>0&&512&o.traits)){e.next=25;break}return h={assetID:t,subtract:l,maxWithdraw:!0,value:o.balance.available},p=ft().loading(this.body),e.next=22,S("/api/txfee",h);case 22:v=e.sent,p(),ft().checkResponse(v)&&(m=o.balance.available,c||(m-=v.txfee)<0&&(m=0),this.maxSend=m,n.maxSend.textContent=Ne.formatFullPrecision(m,s),Ne.showFiatValue(n.maxSendFiat,m,u,s),c?(g=ft().assets[c.parentID].unitInfo,n.maxSendFee.textContent=Ne.formatFullPrecision(v.txfee,g)+" "+g.conventional.unit,Ne.showFiatValue(n.maxSendFeeFiat,v.txfee,ft().fiatRatesMap[c.parentID],g)):(n.maxSendFee.textContent=Ne.formatFullPrecision(v.txfee,s),Ne.showFiatValue(n.maxSendFeeFiat,v.txfee,u,s)),Ne.show(n.maxSendDisplay));case 25:Ne.showFiatValue(n.sendValue,0,u,s),n.walletBal.textContent=Ne.formatFullPrecision(o.balance.available,s),r.dataset.assetID=String(t),this.showForm(r);case 29:case"end":return e.stop()}}),e,this)}))),function(e){return F.apply(this,arguments)})},{key:"doConnect",value:(C=s(f().mark((function e(t){var n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=ft().loading(this.body),e.next=3,S("/api/connectwallet",{assetID:t});case 3:r=e.sent,n(),ft().checkResponse(r)||(a=ft().assets[t].symbol,(o=this.page).errorModalMsg.textContent=ke("CONNECTING_WALLET_ERR_MSG",{assetName:a,errMsg:r.msg}),this.showForm(o.errorModal)),this.updateDisplayedAsset(t);case 7:case"end":return e.stop()}}),e,this)}))),function(e){return C.apply(this,arguments)})},{key:"assetUpdated",value:function(e,t,n){e===this.selectedAssetID&&(this.updateDisplayedAsset(e),t&&Object.is(this.currentForm,t)&&(n?this.showSuccess(n):this.closePopups()))}},{key:"populateMaxSend",value:(w=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.page,n=ft().assets[this.selectedAssetID],r=n.id,a=n.unitInfo,o=n.wallet,s=ft().fiatRatesMap[r],64&o.traits?(i=o.balance.available,t.sendAmt.value=String(i/a.conventional.conversionFactor),Ne.showFiatValue(t.sendValue,i,s,a),t.subtractCheckBox.checked=!0):(t.sendAmt.value=String(this.maxSend/a.conventional.conversionFactor),Ne.showFiatValue(t.sendValue,this.maxSend,s,a),t.subtractCheckBox.checked=!1);case 4:case"end":return e.stop()}}),e,this)}))),function(){return w.apply(this,arguments)})},{key:"send",value:(x=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l,u,d;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=this.page,a=parseInt(null!==(t=r.sendForm.dataset.assetID)&&void 0!==t?t:""),o=null!==(n=r.subtractCheckBox.checked)&&void 0!==n&&n,s=ft().unitInfo(a).conventional.conversionFactor,i=r.vSendPw.value||"",r.vSendPw.value="",""!==i){e.next=9;break}return Ne.showFormError(r.vSendErr,ke(R)),e.abrupt("return");case 9:return c={assetID:a,address:r.sendAddr.value,subtract:o,value:Math.round(tt(r.sendAmt.value)*s),pw:i},l=ft().loading(r.vSendForm),e.next=13,S("/api/send",c);case 13:if(u=e.sent,l(),ft().checkResponse(u)){e.next=18;break}return Ne.showFormError(r.vSendErr,u.msg),e.abrupt("return");case 18:d=ft().assets[a].name,this.assetUpdated(a,r.vSendForm,ke("SEND_SUCCESS",{assetName:d}));case 20:case"end":return e.stop()}}),e,this)}))),function(){return x.apply(this,arguments)})},{key:"reconfig",value:(m=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,r=this.selectedAssetID,Ne.hide(n.reconfigErr),a=ft().currentWalletDefinition(r).type,Ne.isHidden(n.changeWalletType)||(a=n.changeWalletTypeSelect.value||""),o=ft().loading(n.reconfigForm),s={assetID:r,config:this.reconfigForm.map(r),walletType:a},this.changeWalletPW&&(s.newWalletPW=n.newPW.value),e.next=10,this.safePost("/api/reconfigurewallet",s);case 10:if(i=e.sent,n.newPW.value="",o(),ft().checkResponse(i)){e.next=16;break}return Ne.showFormError(n.reconfigErr,i.msg),e.abrupt("return");case 16:if(null===(t=this.data)||void 0===t||!t.goBack){e.next=19;break}return ft().loadPage(this.data.goBack),e.abrupt("return");case 19:this.assetUpdated(r,n.reconfigForm,ke("RECONFIG_SUCCESS")),this.updateTicketBuyer(r),ft().clearTxHistory(r),this.showTxHistory(r),this.updatePrivacy(r),this.checkNeedsProvider(r);case 25:case"end":return e.stop()}}),e,this)}))),function(){return m.apply(this,arguments)})},{key:"lock",value:(p=s(f().mark((function e(t){var n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,r=ft().loading(n.newWalletForm),e.next=4,S("/api/closewallet",{assetID:t});case 4:if(a=e.sent,r(),ft().checkResponse(a)){e.next=8;break}return e.abrupt("return");case 8:this.updateDisplayedAsset(t),this.updatePrivacy(t);case 10:case"end":return e.stop()}}),e,this)}))),function(e){return p.apply(this,arguments)})},{key:"downloadLogs",value:(u=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:(t=new URLSearchParams("")).append("assetid","".concat(this.selectedAssetID)),(n=new URL(window.location.href)).search=t.toString(),n.pathname="/wallets/logfile",window.open(n.toString());case 6:case"end":return e.stop()}}),e,this)}))),function(){return u.apply(this,arguments)})},{key:"displayExportWalletAuth",value:(l=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.page,Ne.hide(t.exportWalletErr),t.exportWalletPW.value="",this.showForm(t.exportWalletAuth);case 4:case"end":return e.stop()}}),e,this)}))),function(){return l.apply(this,arguments)})},{key:"exportWalletAuthSubmit",value:(c=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n={assetID:this.selectedAssetID,pass:t.exportWalletPW.value},r=ft().loading(t.forms),e.next=6,S("/api/restorewalletinfo",n);case 6:a=e.sent,r(),ft().checkResponse(a)?(t.exportWalletPW.value="",this.displayRestoreWalletInfo(a.restorationinfo)):Ne.showFormError(t.exportWalletErr,a.msg);case 9:case"end":return e.stop()}}),e,this)}))),function(){return c.apply(this,arguments)})},{key:"displayRestoreWalletInfo",value:(o=s(f().mark((function e(t){var n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=this.page,Ne.empty(n.restoreInfoCardsList),r=Nr(t);try{for(r.s();!(a=r.n()).done;)o=a.value,s=this.restoreInfoCard.cloneNode(!0),(i=Ne.parseTemplate(s)).name.textContent=o.target,i.seed.textContent=o.seed,i.seedName.textContent="".concat(o.seedName,":"),i.instructions.textContent=o.instructions,n.restoreInfoCardsList.appendChild(s)}catch(e){r.e(e)}finally{r.f()}this.showForm(n.restoreWalletInfo);case 5:case"end":return e.stop()}}),e,this)}))),function(e){return o.apply(this,arguments)})},{key:"recoverWallet",value:(n=s(f().mark((function e(){var t,n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,Ne.hide(t.recoverWalletErr),n={assetID:this.selectedAssetID},r="/api/recoverwallet",a=ft().loading(t.forms),e.next=7,S(r,n);case 7:o=e.sent,a(),o.code===A.activeOrdersErr?(this.forceUrl=r,this.forceReq=n,this.showConfirmForce()):ft().checkResponse(o)?this.closePopups():Ne.showFormError(t.recoverWalletErr,o.msg);case 10:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"confirmForceSubmit",value:(t=s(f().mark((function e(){var t,n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,this.forceReq.force=!0,n=ft().loading(t.forms),e.next=5,S(this.forceUrl,this.forceReq);case 5:r=e.sent,n(),ft().checkResponse(r)?this.closePopups():Ne.showFormError(t.confirmForceErr,r.msg);case 8:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"handleBalanceNote",value:function(e){this.updateAssetButton(e.assetID),e.assetID===this.selectedAssetID&&this.updateDisplayedAssetBalance()}},{key:"handleRatesNote",value:function(e){if(this.updateAssetButton(this.selectedAssetID),e.fiatRates[this.selectedAssetID]){this.updateDisplayedAssetBalance();var t=ft().walletMap[this.selectedAssetID].feeState;t&&this.updateFeeState(t)}}},{key:"handleWalletStateNote",value:function(e){var t=e.wallet,n=t.assetID,r=t.feeState;this.updateAssetButton(n),this.assetUpdated(n),"WalletPeersUpdate"===e.topic&&n===this.selectedAssetID&&Ne.isDisplayed(this.page.managePeersForm)&&this.updateWalletPeersTable(),r&&n===this.selectedAssetID&&this.updateFeeState(r)}},{key:"handleCreateWalletNote",value:function(e){this.updateAssetButton(e.assetID),this.assetUpdated(e.assetID),this.showTxHistory(e.assetID)}},{key:"handleCustomWalletNote",value:function(e){var t=e.payload;switch(t.route){case"tipChange":var n=t;if(42===n.assetID){if(!this.stakeStatus)return;var r=n.data;if(ft().walletMap[n.assetID].synced){var a=ft().unitInfo(n.assetID);this.updateTicketStats(r.stats,a,r.ticketPrice,r.votingSubsidy)}}break;case"ticketPurchaseUpdate":this.processTicketPurchaseUpdate(t);break;case"transaction":var o=t;o.assetID===this.selectedAssetID&&this.handleTxNote(o.transaction,o.new);break;case"transactionHistorySynced":var s=t;s.assetID===this.selectedAssetID&&this.showTxHistory(s.assetID)}}},{key:"unload",value:function(){clearInterval(this.secondTicker),Ne.unbind(document,"keyup",this.keyup)}}]),ve}(lt);function $r(e,t){return e.length<=t?e:"".concat(e.substring(0,t/2),"...").concat(e.substring(e.length-t/2))}function ea(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var ta="order",na="match",ra="bondpost",aa="conn";function oa(){return"desktop_notifications-".concat(window.location.host)}var sa,ia=(h(Kr={},ta,"BROWSER_NTFN_ORDERS"),h(Kr,na,"BROWSER_NTFN_MATCHES"),h(Kr,ra,"BROWSER_NTFN_BONDS"),h(Kr,aa,"BROWSER_NTFN_CONNECTIONS"),Kr),ca=(h(Qr={},ta,!0),h(Qr,na,!0),h(Qr,ra,!0),h(Qr,aa,!0),function(){function e(){i(this,e)}var t,n;return d(e,null,[{key:"ntfnPermissionGranted",value:function(){return"granted"===window.Notification.permission}},{key:"ntfnPermissionDenied",value:function(){return"denied"===window.Notification.permission}},{key:"requestNtfnPermission",value:(n=s(f().mark((function t(){return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if("Notification"in window){t.next=2;break}return t.abrupt("return");case 2:if(!e.ntfnPermissionGranted()){t.next=6;break}e.sendDesktopNotification(ke(ee)),t.next=10;break;case 6:if(e.ntfnPermissionDenied()){t.next=10;break}return t.next=9,Notification.requestPermission();case 9:e.sendDesktopNotification(ke(ee));case 10:case"end":return t.stop()}}),t)}))),function(){return n.apply(this,arguments)})},{key:"sendDesktopNotification",value:(t=s(f().mark((function t(n,r){var a;return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(e.ntfnPermissionGranted()){t.next=2;break}return t.abrupt("return");case 2:return a=new window.Notification(n,{body:r,icon:"/img/softened-icon.png"}),t.abrupt("return",a);case 4:case"end":return t.stop()}}),t)}))),function(e,n){return t.apply(this,arguments)})}]),e}()),la=function(){function e(){i(this,e)}var t,n;return d(e,null,[{key:"ntfnPermissionGranted",value:function(){return!0}},{key:"ntfnPermissionDenied",value:function(){return!1}},{key:"requestNtfnPermission",value:(n=s(f().mark((function t(){return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.sendDesktopNotification(ke(ee));case 2:return t.abrupt("return",Promise.resolve());case 3:case"end":return t.stop()}}),t)}))),function(){return n.apply(this,arguments)})},{key:"sendDesktopNotification",value:(t=s(f().mark((function e(t,n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!ua()){e.next=5;break}return e.next=3,window.sendOSNotification(t,n);case 3:e.next=11;break;case 5:if(!da()){e.next=10;break}return e.next=8,window.webkit.messageHandlers.bwHandler.postMessage(["sendOSNotification",t,n]);case 8:e.next=11;break;case 10:console.error("sendDesktopNotification: unknown environment");case 11:case"end":return e.stop()}}),e)}))),function(e,n){return t.apply(this,arguments)})}]),e}();function ua(){return void 0!==window.isWebview}function da(){var e,t;return void 0!==(null===(e=window.webkit)||void 0===e||null===(t=e.messageHandlers)||void 0===t?void 0:t.bwHandler)}var ha=ua()||da()?la:ca;function pa(){return(pa=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(sa.browserNtfnEnabled&&sa[t.type]){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,ha.sendDesktopNotification(t.subject,ya(t.details));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function fa(){var e;if(void 0!==sa)return sa;var t=oa();return sa=null!==(e=k.fetchLocal(t))&&void 0!==e?e:{}}var va=/\{\{\{([^|]+)\|([^}]+)\}\}\}/g,ma=/\{\{\{order\|([^}]+)\}\}\}/g;function ga(e,t){for(var n=t.replace(ma,(function(e,t){var n=document.createElement("a");return n.setAttribute("href","/order/"+t),n.setAttribute("class","subtlelink"),n.textContent=t.slice(0,8),n.outerHTML})).replace(va,(function(e,t,n){var r=document.createElement("a");return r.setAttribute("data-explorer-coin",n),r.setAttribute("target","_blank"),r.textContent=n.slice(0,8),Pn(t,r),r.outerHTML})),r=Ne.noderize(n).body;r.firstChild;)e.appendChild(r.firstChild)}function ya(e){return e.replace(va,(function(e,t,n){return n.slice(0,8)}))}var ba=["bonds"];var xa=function(e){g(A,e);var t,n,r,a,o,c,l,u,p,m,x,w,C,F,T,D,I=(T=A,D=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(T);if(D){var n=b(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return y(this,e)});function A(e){var t;i(this,A),h(v(t=I.call(this)),"body",void 0),h(v(t),"currentDEX",void 0),h(v(t),"page",void 0),h(v(t),"forms",void 0),h(v(t),"fiatRateSources",void 0),h(v(t),"regAssetForm",void 0),h(v(t),"confirmRegisterForm",void 0),h(v(t),"newWalletForm",void 0),h(v(t),"walletWaitForm",void 0),h(v(t),"dexAddrForm",void 0),h(v(t),"appPassResetForm",void 0),h(v(t),"currentForm",void 0),h(v(t),"keyup",void 0),t.body=e;var n=t.page=Ne.idDescendants(e);t.forms=Ne.applySelector(n.forms,":scope > form"),t.fiatRateSources=Ne.applySelector(n.fiatRateSources,"input[type=checkbox]"),n.darkMode.checked="1"===k.fetchLocal(k.darkModeLK),Ne.bind(n.darkMode,"click",(function(){k.storeLocal(k.darkModeLK,n.darkMode.checked?"1":"0"),n.darkMode.checked?document.body.classList.add("dark"):document.body.classList.remove("dark")})),n.showPokes.checked="1"===k.fetchLocal(k.popupsLK),Ne.bind(n.showPokes,"click",(function(){var e=n.showPokes.checked||!1;k.storeLocal(k.popupsLK,e?"1":"0"),ft().showPopups=e})),n.commitHash.textContent=ft().commitHash.substring(0,7),Ne.bind(n.addADex,"click",(function(){t.dexAddrForm.refresh(),t.showForm(n.dexAddrForm)})),t.fiatRateSources.forEach((function(e){Ne.bind(e,"change",s(f().mark((function t(){var n;return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,S("/api/toggleratesource",{disable:!e.checked,source:e.value});case 2:return n=t.sent,ft().checkResponse(n)||(e.checked=!e.checked),t.next=6,ft().fetchUser();case 6:case"end":return t.stop()}}),t)}))))})),t.regAssetForm=new gr(n.regAssetForm,function(){var e=s(f().mark((function e(r,a){var o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r!==pt){e.next=5;break}return e.next=3,ft().fetchUser();case 3:return window.location.reload(),e.abrupt("return");case 5:if(o=ft().assets[r],!(s=o.wallet)){e.next=19;break}return i=t.currentDEX.bondAssets[o.symbol],e.next=11,t.getBondsFeeBuffer(r,n.regAssetForm);case 11:if(c=e.sent,t.confirmRegisterForm.setAsset(r,a,c),!(s.synced&&s.balance.available>=2*i.amount+c)){e.next=16;break}return t.animateConfirmForm(n.regAssetForm),e.abrupt("return");case 16:return t.walletWaitForm.setWallet(r,c,a),t.slideSwap(n.walletWait),e.abrupt("return");case 19:t.confirmRegisterForm.setAsset(r,a,0),t.newWalletForm.setAsset(r),t.slideSwap(n.newWalletForm);case 22:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()),t.confirmRegisterForm=new mr(n.confirmRegForm,(function(){t.registerDEXSuccess()}),(function(){t.animateRegAsset(n.confirmRegForm)})),t.newWalletForm=new pr(n.newWalletForm,(function(e){return t.newWalletCreated(e,t.confirmRegisterForm.tier)}),(function(){return t.animateRegAsset(n.newWalletForm)})),t.walletWaitForm=new yr(n.walletWait,(function(){t.animateConfirmForm(n.walletWait)}),(function(){t.animateRegAsset(n.walletWait)})),t.dexAddrForm=new xr(n.dexAddrForm,function(){var e=s(f().mark((function e(r,a){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t.currentDEX=r,t.confirmRegisterForm.setExchange(r,a),t.walletWaitForm.setExchange(r),t.regAssetForm.setExchange(r,a),t.animateRegAsset(n.dexAddrForm);case 5:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()),Ne.bind(n.importAccount,"click",(function(){return t.prepareAccountImport(n.authorizeAccountImportForm)})),Br(n.authorizeAccountImportForm,n.authorizeImportAccountConfirm,(function(){return t.importAccount()})),Ne.bind(n.changeAppPW,"click",(function(){return t.showForm(n.changeAppPWForm)})),Br(n.changeAppPWForm,n.submitNewPW,(function(){return t.changeAppPW()})),t.appPassResetForm=new Sr(n.resetAppPWForm,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ft().loadPage("login");case 2:Ne.hide(n.forms);case 3:case"end":return e.stop()}}),e)})))),Ne.bind(n.resetAppPW,"click",(function(){t.appPassResetForm.refresh(),t.showForm(n.resetAppPWForm),t.appPassResetForm.focus()})),Ne.bind(n.accountFile,"change",(function(){return t.onAccountFileChange()})),Ne.bind(n.removeAccount,"click",(function(){return t.clearAccountFile()})),Ne.bind(n.addAccount,"click",(function(){return n.accountFile.click()})),Ne.bind(n.exportSeed,"click",(function(){Ne.hide(n.exportSeedErr),t.showForm(n.exportSeedAuth)})),Br(n.exportSeedAuth,n.exportSeedSubmit,(function(){return t.submitExportSeedReq()})),Ne.bind(n.gameCodeLink,"click",(function(){return t.showForm(n.gameCodeForm)})),Ne.bind(n.gameCodeSubmit,"click",(function(){return t.submitGameCode()}));var r=function(){Ne.hide(n.forms),n.exportSeedPW.value="",n.legacySeed.textContent="",n.mnemonic.textContent=""};return Ne.bind(n.forms,"mousedown",(function(e){Ne.mouseInElement(e,t.currentForm)||r()})),t.keyup=function(e){"Escape"===e.key&&r()},Ne.bind(document,"keyup",t.keyup),n.forms.querySelectorAll(".form-closer").forEach((function(e){Ne.bind(e,"click",(function(){r()}))})),t.renderDesktopNtfnSettings(),t}return d(A,[{key:"updateNtfnSetting",value:function(e){var t=e.target,n=t.getAttribute("name");null!==n&&function(e,t){fa(),sa[e]=t,k.storeLocal(oa(),sa)}(n,t.checked)}},{key:"getBrowserNtfnSettings",value:function(){return fa()}},{key:"renderDesktopNtfnSettings",value:(F=s(f().mark((function e(){var t,n,r,a,o,i,c=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.page,n=this.getBrowserNtfnSettings(),r=ia,(a=t.browserNtfnCheckboxTemplate).removeAttribute("id"),o=t.browserNtfnCheckboxContainer,Ne.empty(t.browserNtfnCheckboxContainer),Object.keys(r).forEach((function(e){var t=a.cloneNode(!0),s=n[e],i=Ne.tmplElement(t,"checkbox");Ne.tmplElement(t,"label").textContent=ke(r[e]),i.setAttribute("name",e),s&&i.setAttribute("checked","checked"),o.appendChild(t),Ne.bind(i,"click",c.updateNtfnSetting)})),i=t.browserNtfnEnabled,Ne.bind(i,"click",function(){var e=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!ha.ntfnPermissionDenied()){e.next=2;break}return e.abrupt("return");case 2:if(!(n=t.target).checked){e.next=7;break}return e.next=6,ha.requestNtfnPermission();case 6:n.checked=!ha.ntfnPermissionDenied();case 7:c.updateNtfnSetting(t),n.dispatchEvent(new Event("change"));case 9:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),Ne.bind(i,"change",(function(e){var n=e.target,r=ha.ntfnPermissionDenied();Ne.setVis(n.checked,t.browserNtfnCheckboxContainer),Ne.setVis(r,t.browserNtfnBlockedMsg),n.disabled=r})),i.checked=ha.ntfnPermissionGranted()&&n.browserNtfnEnabled,i.dispatchEvent(new Event("change"));case 13:case"end":return e.stop()}}),e,this)}))),function(){return F.apply(this,arguments)})},{key:"slideSwap",value:function(e){Ar(this.currentForm,e),this.currentForm=e}},{key:"getBondsFeeBuffer",value:(C=s(f().mark((function e(t,n){var r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=ft().loading(n),e.next=3,S("/api/bondsfeebuffer",{assetID:t});case 3:if(a=e.sent,r(),ft().checkResponse(a)){e.next=7;break}return e.abrupt("return",0);case 7:return e.abrupt("return",a.feeBuffer);case 8:case"end":return e.stop()}}),e)}))),function(e,t){return C.apply(this,arguments)})},{key:"newWalletCreated",value:(w=s(f().mark((function e(t,n){var r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ft().fetchUser();case 2:if(r=e.sent){e.next=5;break}return e.abrupt("return");case 5:return a=this.page,o=r.assets[t],s=o.wallet,i=this.currentDEX.bondAssets[o.symbol].amount,e.next=11,this.getBondsFeeBuffer(t,a.newWalletForm);case 11:if(c=e.sent,this.confirmRegisterForm.setFees(t,c),!(s.synced&&s.balance.available>=2*i+c)){e.next=17;break}return e.next=16,this.animateConfirmForm(a.newWalletForm);case 16:return e.abrupt("return");case 17:this.walletWaitForm.setWallet(t,c,n),this.slideSwap(a.walletWait);case 19:case"end":return e.stop()}}),e,this)}))),function(e,t){return w.apply(this,arguments)})},{key:"onAccountFileChange",value:(x=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,(n=t.accountFile.files)&&n.length){e.next=4;break}return e.abrupt("return");case 4:t.selectedAccount.textContent=n[0].name,Ne.show(t.removeAccount),Ne.hide(t.addAccount);case 7:case"end":return e.stop()}}),e,this)}))),function(){return x.apply(this,arguments)})},{key:"clearAccountFile",value:function(){var e=this.page;e.accountFile.value="",e.selectedAccount.textContent=ke(j),Ne.hide(e.removeAccount),Ne.show(e.addAccount)}},{key:"prepareAccountImport",value:(m=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.page.importAccountErr.textContent="",this.showForm(t);case 3:case"end":return e.stop()}}),e,this)}))),function(e){return m.apply(this,arguments)})},{key:"importAccount",value:(p=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l,u,d;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n="",!t.accountFile.value){e.next=10;break}if((r=t.accountFile.files)&&r.length){e.next=7;break}return console.error("importAccount: no file specified"),e.abrupt("return");case 7:return e.next=9,r[0].text();case 9:n=e.sent;case 10:e.prev=10,a=JSON.parse(n),e.next=19;break;case 14:return e.prev=14,e.t0=e.catch(10),t.importAccountErr.textContent=e.t0.message,Ne.show(t.importAccountErr),e.abrupt("return");case 19:if(void 0!==a){e.next=22;break}return Ne.showFormError(t.importAccountErr,ke("ACCT_UNDEFINED")),e.abrupt("return");case 22:return s=(o=a).bonds,i=void 0===s?[]:s,c=ea(o,ba),l={account:c,bonds:i},u=ft().loading(this.body),e.next=27,S("/api/importaccount",l);case 27:if(d=e.sent,u(),ft().checkResponse(d)){e.next=32;break}return Ne.showFormError(t.importAccountErr,d.msg),e.abrupt("return");case 32:return e.next=34,ft().fetchUser();case 34:Ne.hide(t.forms),window.location.reload();case 36:case"end":return e.stop()}}),e,this,[[10,14]])}))),function(){return p.apply(this,arguments)})},{key:"submitExportSeedReq",value:(u=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=t.exportSeedPW.value,r=ft().loading(this.body),e.next=5,S("/api/exportseed",{pass:n});case 5:if(a=e.sent,r(),ft().checkResponse(a)){e.next=10;break}return Ne.showFormError(t.exportSeedErr,a.msg),e.abrupt("return");case 10:t.exportSeedPW.value="",128===a.seed.length&&1===a.seed.split(" ").length?t.legacySeed.textContent=a.seed.match(/.{1,32}/g).map((function(e){var t;return null===(t=e.match(/.{1,8}/g))||void 0===t?void 0:t.join(" ")})).join("\n"):t.mnemonic.textContent=a.seed,this.showForm(t.authorizeSeedDisplay);case 13:case"end":return e.stop()}}),e,this)}))),function(){return u.apply(this,arguments)})},{key:"showForm",value:(l=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,this.currentForm=t,this.forms.forEach((function(e){return Ne.hide(e)})),t.style.right="10000px",Ne.show(n.forms,t),r=(n.forms.offsetWidth+t.offsetWidth)/2,e.next=8,Ne.animate(300,(function(e){t.style.right="".concat((1-e)*r,"px")}),"easeOutHard");case 8:t.style.right="0";case 9:case"end":return e.stop()}}),e,this)}))),function(e){return l.apply(this,arguments)})},{key:"getCertFile",value:(c=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t="",!this.dexAddrForm.page.certFile.value){e.next=7;break}if(!(n=this.dexAddrForm.page.certFile.files)||!n.length){e.next=7;break}return e.next=6,n[0].text();case 6:t=e.sent;case 7:return e.abrupt("return",t);case 8:case"end":return e.stop()}}),e,this)}))),function(){return c.apply(this,arguments)})},{key:"registerDEXSuccess",value:(o=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:window.location.reload();case 1:case"end":return e.stop()}}),e)}))),function(){return o.apply(this,arguments)})},{key:"changeAppPW",value:(a=s(f().mark((function e(){var t,n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,Ne.hide(t.changePWErrMsg),n=function(){t.appPW.value="",t.newAppPW.value="",t.confirmNewPW.value=""},t.appPW.value&&t.newAppPW.value&&t.confirmNewPW.value){e.next=7;break}return Ne.showFormError(t.changePWErrMsg,ke("NO_APP_PASS_ERROR_MSG")),n(),e.abrupt("return");case 7:if(t.newAppPW.value===t.confirmNewPW.value){e.next=11;break}return Ne.showFormError(t.changePWErrMsg,ke(N)),n(),e.abrupt("return");case 11:return r=ft().loading(t.changeAppPW),a={appPW:t.appPW.value,newAppPW:t.newAppPW.value},n(),e.next=16,S("/api/changeapppass",a);case 16:if(o=e.sent,r(),ft().checkResponse(o)){e.next=21;break}return Ne.showFormError(t.changePWErrMsg,o.msg),e.abrupt("return");case 21:Ne.hide(t.forms);case 22:case"end":return e.stop()}}),e,this)}))),function(){return a.apply(this,arguments)})},{key:"unload",value:function(){Ne.unbind(document,"keyup",this.keyup)}},{key:"animateRegAsset",value:(r=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:Ne.hide(t),n=this.page.regAssetForm,this.currentForm=n,this.regAssetForm.animate(),Ne.show(n);case 5:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"animateConfirmForm",value:(n=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.confirmRegisterForm.animate(),n=this.page.confirmRegForm,this.currentForm=n,Ne.hide(t),Ne.show(n);case 5:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"submitGameCode",value:(t=s(f().mark((function e(){var t,n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,Ne.hide(t.gameCodeErr),n=t.gameCodeInput.value){e.next=7;break}return t.gameCodeErr.textContent=ke("NO_CODE_PROVIDED"),Ne.show(t.gameCodeErr),e.abrupt("return");case 7:return r=t.gameCodeMsg.value||"",a=ft().loading(t.gameCodeForm),e.next=11,S("/api/redeemgamecode",{code:n,msg:r});case 11:if(o=e.sent,a(),ft().checkResponse(o)){e.next=17;break}return t.gameCodeErr.textContent=ke(H,{msg:o.msg}),Ne.show(t.gameCodeErr),e.abrupt("return");case 17:Ne.show(t.gameCodeSuccess),t.gameRedeemTx.dataset.explorerCoin=o.coinString,Pn(42,t.gameRedeemTx),t.gameRedeemTx.textContent=o.coinString,s=ft().unitInfo(42),t.gameRedeemValue.textContent=Ne.formatCoinValue(o.win,s);case 24:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),A}(lt);function ka(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var wa=function(){function e(t,n,r){i(this,e),h(this,"base",void 0),h(this,"baseSymbol",void 0),h(this,"quote",void 0),h(this,"quoteSymbol",void 0),h(this,"buys",void 0),h(this,"sells",void 0),this.base=t.base,this.baseSymbol=n,this.quote=t.quote,this.quoteSymbol=r,this.buys=t.book.buys||[],this.sells=t.book.sells||[]}return d(e,[{key:"add",value:function(e){if(0!==e.qtyAtomic){var t=e.sell?this.sells:this.buys;t.splice(function(e,t,n){for(var r=0;r<e.length;r++)if(e[r].rate<t===n)return r;return e.length}(t,e.rate,!e.sell),0,e)}else window.log("zeroqty","zero quantity order encountered",e)}},{key:"remove",value:function(e){this.removeFromSide(this.sells,e)||this.removeFromSide(this.buys,e)}},{key:"removeFromSide",value:function(e,t){var n=a(this.findOrder(e,t),2),r=n[0],o=n[1];return!!r&&(e.splice(o,1),!0)}},{key:"findOrder",value:function(e,t){for(var n=0;n<e.length;n++)if(e[n].token===t)return[e[n],n];return[null,-1]}},{key:"updateRemaining",value:function(e,t,n){this.updateRemainingSide(this.sells,e,t,n)||this.updateRemainingSide(this.buys,e,t,n)}},{key:"updateRemainingSide",value:function(e,t,n,r){var a=this.findOrder(e,t)[0];return!!a&&(a.qty=n,a.qtyAtomic=r,!0)}},{key:"setEpoch",value:function(e){var t=function(t){return void 0===t.epoch||0===t.epoch||t.epoch===e};this.sells=this.sells.filter(t),this.buys=this.buys.filter(t)}},{key:"empty",value:function(){return!this.sells.length&&!this.buys.length}},{key:"count",value:function(){return this.sells.length+this.buys.length}},{key:"bestGapOrder",value:function(e){var t,n=null,r=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return ka(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?ka(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}(e);try{for(r.s();!(t=r.n()).done;){var a=t.value;if(!a.epoch)return a;n||(n=a)}}catch(e){r.e(e)}finally{r.f()}return n}},{key:"bestGapBuy",value:function(){return this.bestGapOrder(this.buys)}},{key:"bestGapSell",value:function(){return this.bestGapOrder(this.sells)}}]),e}();function Ca(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Sa(e,t,n){if(e||!t.error){if(void 0!==n[e])for(var r=0;r<n[e].length;r++)n[e][r](t)}else{var a=t.error;console.error("websocket error (code ".concat(a.code,"): ").concat(a.message))}}var Fa=0;const Ta=new(function(){function e(){i(this,e),h(this,"uri",void 0),h(this,"connection",void 0),h(this,"handlers",void 0),h(this,"queue",void 0),h(this,"maxQlength",void 0),h(this,"reloader",void 0),this.handlers={},this.queue=[],this.maxQlength=5}return d(e,[{key:"registerRoute",value:function(e,t){this.handlers[e]=this.handlers[e]||[],this.handlers[e].push(t)}},{key:"deregisterRoute",value:function(e){this.handlers[e]=[]}},{key:"request",value:function(e,t){if(this.connection&&this.connection.readyState===window.WebSocket.OPEN){Fa++;var n=JSON.stringify({route:e,type:1,id:Fa,payload:t});window.log("ws","sending",n),this.connection.send(n)}else{for(;this.queue.length>this.maxQlength-1;)this.queue.shift();this.queue.push([e,t])}}},{key:"close",value:function(e){window.log("ws","close, reason:",e,this.handlers),this.handlers={},this.connection&&this.connection.close()}},{key:"connect",value:function(e,t){var n=this;this.uri=e,this.reloader=t;var r=0;!function o(){window.log("ws","connecting to ".concat(e));var s=n.connection=new window.WebSocket(e);if(s){var i=setTimeout((function(){s&&s.close()}),500);s.onmessage=function(e){var t=JSON.parse(e.data);Sa(t.route,t.payload,n.handlers)},s.onclose=function(e){window.log("ws","onclose"),clearTimeout(i),s=n.connection=null,Sa("close",null,n.handlers),r++;var t=Math.min(Math.pow(1.25,r),10);console.error("websocket disconnected (".concat(e.code,"), trying again in ").concat(t.toFixed(1)," seconds")),setTimeout((function(){o()}),1e3*t)},s.onopen=function(){window.log("ws","onopen"),clearTimeout(i),r>0&&(r=0,t()),Sa("open",null,n.handlers);var e=n.queue;n.queue=[];var o,s=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Ca(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Ca(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}(e);try{for(s.s();!(o=s.n()).done;){var c=a(o.value,2),l=c[0],u=c[1];n.request(l,u)}}catch(e){s.e(e)}finally{s.f()}},s.onerror=function(e){window.log("ws","onerror:",e),Sa("error",e,n.handlers)}}}()}}]),e}());function Da(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ia(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Da(Object(n),!0).forEach((function(t){h(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Da(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Aa(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Ra(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Ra(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){throw e})),f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){i=!0,o=e})),f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function Ra(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var Ea=Ne.bind,Ba="book",Pa="book_order",La="unbook_order",Oa="update_remaining",Ma="epoch_order",qa="candles",Na="candle_update",Wa="buygreen-bg",Va="sellred-bg",Ua="5m",_a=new Intl.NumberFormat(Ne.languages(),{minimumFractionDigits:1,maximumFractionDigits:2}),ja=4294967295,Ha=function(e){g(_,e);var t,n,o,c,l,u,p,m,x,w,C,F,T,D,I,A,R,q,N,W,V,U=(W=_,V=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(W);if(V){var n=b(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return y(this,e)});function _(e,t){var n;i(this,_),h(v(n=U.call(this)),"page",void 0),h(v(n),"main",void 0),h(v(n),"maxLoaded",void 0),h(v(n),"maxOrderUpdateCounter",void 0),h(v(n),"market",void 0),h(v(n),"openAsset",void 0),h(v(n),"currentCreate",void 0),h(v(n),"maxEstimateTimer",void 0),h(v(n),"book",void 0),h(v(n),"cancelData",void 0),h(v(n),"metaOrders",void 0),h(v(n),"preorderCache",void 0),h(v(n),"currentOrder",void 0),h(v(n),"depthLines",void 0),h(v(n),"activeMarkerRate",void 0),h(v(n),"hovers",void 0),h(v(n),"ogTitle",void 0),h(v(n),"depthChart",void 0),h(v(n),"candleChart",void 0),h(v(n),"candleDur",void 0),h(v(n),"balanceWgt",void 0),h(v(n),"mm",void 0),h(v(n),"marketList",void 0),h(v(n),"newWalletForm",void 0),h(v(n),"depositAddrForm",void 0),h(v(n),"approveTokenForm",void 0),h(v(n),"reputationMeter",void 0),h(v(n),"keyup",void 0),h(v(n),"secondTicker",void 0),h(v(n),"candlesLoading",void 0),h(v(n),"accelerateOrderForm",void 0),h(v(n),"recentMatches",void 0),h(v(n),"recentMatchesSortKey",void 0),h(v(n),"recentMatchesSortDirection",void 0),h(v(n),"stats",void 0),h(v(n),"loadingAnimations",void 0),h(v(n),"mmRunning",void 0),h(v(n),"forms",void 0);var r=n.page=Ne.idDescendants(e);if(n.main=e,!n.main.parentElement)return y(n);n.maxOrderUpdateCounter=0,n.metaOrders={},n.recentMatches=[],n.preorderCache={},n.depthLines={hover:[],input:[]},n.hovers=[],n.recentMatchesSortKey="age",n.recentMatchesSortDirection=-1,n.ogTitle=document.title,n.forms=new hr(r.forms,{closed:function(e){e===r.vDetailPane&&n.showVerifyForm()}});var a={click:function(e){n.reportDepthClick(e)},volume:function(e){n.reportDepthVolume(e)},mouse:function(e){n.reportDepthMouse(e)},zoom:function(e){n.reportDepthZoom(e)}};n.depthChart=new Kt(r.depthChart,a,k.fetchLocal(k.depthZoomLK));var o={mouse:function(e){n.reportMouseCandle(e)}};n.candleChart=new Qt(r.candlesChart,o),n.accelerateOrderForm=new br(r.accelerateForm,(function(){})),n.approveTokenForm=new Tr(r.approveTokenForm),n.candleDur=k.fetchLocal(k.lastCandleDurationLK)||"1h";var c=Ne.tmplElement(r.notRegistered,"registerBttn");Ea(c,"click",(function(){ft().loadPage("register",{host:n.market.dex.host})})),r.walletInfoTmpl.removeAttribute("id");var l=r.walletInfoTmpl,u=r.walletInfoTmpl.cloneNode(!0);l.after(u);var d=n.balanceWgt=new Xa(l,u),p=d.base.stateIcons.icons,m=d.quote.stateIcons.icons;Ea(d.base.tmpl.connect,"click",(function(){n.unlockWallet(n.market.base.id)})),Ea(d.quote.tmpl.connect,"click",(function(){n.unlockWallet(n.market.quote.id)})),Ea(d.base.tmpl.expired,"click",(function(){n.unlockWallet(n.market.base.id)})),Ea(d.quote.tmpl.expired,"click",(function(){n.unlockWallet(n.market.quote.id)})),Ea(p.sleeping,"click",(function(){n.unlockWallet(n.market.base.id)})),Ea(m.sleeping,"click",(function(){n.unlockWallet(n.market.quote.id)})),Ea(p.locked,"click",(function(){n.unlockWallet(n.market.base.id)})),Ea(m.locked,"click",(function(){n.unlockWallet(n.market.quote.id)})),Ea(p.disabled,"click",(function(){n.showToggleWalletStatus(n.market.base)})),Ea(m.disabled,"click",(function(){n.showToggleWalletStatus(n.market.quote)})),Ea(d.base.tmpl.newWalletBttn,"click",(function(){n.showCreate(n.market.base)})),Ea(d.quote.tmpl.newWalletBttn,"click",(function(){n.showCreate(n.market.quote)})),Ea(d.base.tmpl.walletAddr,"click",(function(){n.showDeposit(n.market.base.id)})),Ea(d.quote.tmpl.walletAddr,"click",(function(){n.showDeposit(n.market.quote.id)})),Ea(d.base.tmpl.wantProviders,"click",(function(){n.showCustomProviderDialog(n.market.base.id)})),Ea(d.quote.tmpl.wantProviders,"click",(function(){n.showCustomProviderDialog(n.market.quote.id)})),n.depositAddrForm=new Cr(r.deposit);var g={orderReportForm:r.orderReportForm,dexBalancesRowTmpl:r.dexBalancesRowTmpl,placementRowTmpl:r.placementRowTmpl,placementAmtRowTmpl:r.placementAmtRowTmpl};Ne.cleanTemplates(r.dexBalancesRowTmpl,r.placementRowTmpl,r.placementAmtRowTmpl),n.mm=new ar(r.mmRunning,n.forms,g,"markets"),n.reputationMeter=new un(r.reputationMeter),Br(r.toggleWalletStatusConfirm,r.toggleWalletStatusSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.toggleWalletStatus();case 1:case"end":return e.stop()}}),e)})))),mt(r),Ne.cleanTemplates(r.orderRowTmpl,r.durBttnTemplate,r.booleanOptTmpl,r.rangeOptTmpl,r.orderOptTmpl,r.userOrderTmpl,r.recentMatchesTemplate),Ea(r.approveBaseBttn,"click",(function(){n.showTokenApprovalForm(!0)})),Ea(r.approveQuoteBttn,"click",(function(){n.showTokenApprovalForm(!1)}));var b=function(e){Ne.setVis(!e,r.showTradingTier),Ne.setVis(e,r.tradingLimits,r.hideTradingTier)};Ea(r.showTradingTier,"click",(function(){b(!0)})),Ea(r.hideTradingTier,"click",(function(){b(!1)}));var x=function(e){Ne.setVis(!e,r.showTradingReputation),Ne.setVis(e,r.reputationMeter,r.hideTradingReputation)};Ea(r.showTradingReputation,"click",(function(){x(!0)})),Ea(r.hideTradingReputation,"click",(function(){x(!1)})),Ea(r.buyBttn,"click",(function(){n.setBuy()})),Ea(r.sellBttn,"click",(function(){n.setSell()})),Ea(r.limitBttn,"click",(function(){Ja(r.marketBttn,r.limitBttn),n.setOrderVisibility(),r.rateField.value&&(n.depthLines.input=[{rate:tt(r.rateField.value,0),color:n.isSell()?n.depthChart.theme.sellLine:n.depthChart.theme.buyLine}],n.drawChartLines())})),Ea(r.marketBttn,"click",(function(){Ja(r.limitBttn,r.marketBttn),n.setOrderVisibility(),n.setMarketBuyOrderEstimate(),n.depthLines.input=[],n.drawChartLines()})),Ea(r.maxOrd,"click",(function(){if(n.isSell()){var e=n.market.maxSell;if(!e)return;r.lotField.value=String(e.swap.lots)}else{var t=n.market.maxBuys[n.adjustedRate()];if(!t)return;r.lotField.value=String(t.swap.lots)}n.lotChanged()})),Ne.disableMouseWheel(r.rateField,r.lotField,r.qtyField,r.mktBuyField),Ta.registerRoute(Ba,(function(e){n.handleBookRoute(e)})),Ta.registerRoute(Pa,(function(e){n.handleBookOrderRoute(e)})),Ta.registerRoute(La,(function(e){n.handleUnbookOrderRoute(e)})),Ta.registerRoute(Oa,(function(e){n.handleUpdateRemainingRoute(e)})),Ta.registerRoute(Ma,(function(e){n.handleEpochOrderRoute(e)})),Ta.registerRoute(qa,(function(e){n.handleCandlesRoute(e)})),Ta.registerRoute(Na,(function(e){n.handleCandleUpdateRoute(e)})),Ta.registerRoute("epoch_match_summary",(function(e){n.handleEpochMatchSummary(e)})),n.newWalletForm=new pr(r.newWalletForm,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.createWallet();case 1:case"end":return e.stop()}}),e)})))),Br(r.orderForm,r.submitBttn,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.stepSubmit();case 1:case"end":return e.stop()}}),e)})))),Br(r.verifyForm,r.vSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.submitOrder();case 1:case"end":return e.stop()}}),e)})))),Br(r.cancelForm,r.cancelSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.submitCancel();case 1:case"end":return e.stop()}}),e)})))),Ne.bind(r.vFeeDetails,"click",(function(){return n.forms.show(r.vDetailPane)})),Ne.bind(r.closeDetailPane,"click",(function(){return n.showVerifyForm()})),r.recentMatchesTable.querySelectorAll("[data-ordercol]").forEach((function(e){return Ea(e,"click",(function(){return w(e.dataset.ordercol||"")}))}));var w=function(e){C(),n.recentMatchesSortKey===e?n.recentMatchesSortDirection*=-1:(n.recentMatchesSortKey=e,n.recentMatchesSortDirection=1),n.refreshRecentMatchesTable(),S()},C=function(){r.recentMatchesTable.querySelectorAll("[data-ordercol]").forEach((function(e){return e.classList.remove("sorted-asc","sorted-dsc")}))},S=function(){var e=n.recentMatchesSortKey,t=1===n.recentMatchesSortDirection?"sorted-asc":"sorted-dsc";Ne.safeSelector(r.recentMatchesTable,"[data-ordercol=".concat(e,"]")).classList.add(t)};S();var F=function(){n.forms.close()};n.keyup=function(e){"Escape"===e.key&&F()},Ea(document,"keyup",n.keyup),r.forms.querySelectorAll(".form-closer").forEach((function(e){Ne.bind(e,"click",(function(){F()}))})),Ea(r.lotField,["change","keyup"],(function(){n.lotChanged()})),Ea(r.qtyField,"change",(function(){n.quantityChanged(!0)})),Ea(r.qtyField,"keyup",(function(){n.quantityChanged(!1)})),Ea(r.mktBuyField,["change","keyup"],(function(){n.marketBuyChanged()})),Ea(r.rateField,"change",(function(){n.rateFieldChanged()})),Ea(r.rateField,"keyup",(function(){n.previewQuoteAmt(!0)})),Ea(r.marketSearchV1,["change","keyup"],(function(){n.filterMarkets()}));var T=function(e){Ne.setVis(!e,r.disclaimer,r.disclaimerAck),Ne.setVis(e,r.showDisclaimer)};Ea(r.disclaimerAck,"click",(function(){k.storeLocal(k.orderDisclaimerAckedLK,!0),T(!0)})),Ea(r.showDisclaimer,"click",(function(){k.storeLocal(k.orderDisclaimerAckedLK,!1),T(!1)})),T(k.fetchLocal(k.orderDisclaimerAckedLK));var D=function(){n.depthLines.hover=[],n.drawChartLines()};Ea(r.buyRows,"mouseleave",D),Ea(r.sellRows,"mouseleave",D),Ea(r.userOrders,"mouseleave",(function(){n.activeMarkerRate=null,n.setDepthMarkers()}));var I=r.marketStats,A=I.cloneNode(!0);A.classList.add("listopen"),Ne.hide(I,A),A.removeAttribute("id"),ft().headerSpace.appendChild(A),n.stats=[{row:I,tmpl:Ne.parseTemplate(I)},{row:A,tmpl:Ne.parseTemplate(A)}];var R=function(){k.storeLocal(k.leftMarketDockLK,"0"),r.leftMarketDock.classList.remove("default"),r.leftMarketDock.classList.add("stashed");var e,t=Aa(n.stats);try{for(t.s();!(e=t.n()).done;)e.value.row.classList.remove("listopen")}catch(e){t.e(e)}finally{t.f()}},E=function(){k.storeLocal(k.leftMarketDockLK,"1"),r.leftMarketDock.classList.remove("default","stashed");var e,t=Aa(n.stats);try{for(t.s();!(e=t.n()).done;)e.value.row.classList.add("listopen")}catch(e){t.e(e)}finally{t.f()}};Ne.bind(r.leftHider,"click",(function(){return R()})),Ne.bind(r.marketReopener,"click",(function(){return E()}));var B,P=Aa(n.stats);try{for(P.s();!(B=P.n()).done;){var L=B.value;Ne.bind(L.tmpl.marketSelect,"click",(function(){0===r.leftMarketDock.clientWidth?E():R()}))}}catch(e){P.e(e)}finally{P.f()}n.marketList=new za(r.marketListV1);var O,M=Aa(n.marketList.markets);try{var q=function(){var e=O.value;Ea(e.node,"click",(function(){var t,r,a,o,s=e.mkt,i=s.quoteid,c=s.baseid,l=s.xc.host;(null===(t=n.market)||void 0===t||null===(r=t.base)||void 0===r?void 0:r.id)===c&&(null===(a=n.market)||void 0===a||null===(o=a.quote)||void 0===o?void 0:o.id)===i||(n.startLoadingAnimations(),n.setMarket(l,c,i))}))};for(M.s();!(O=M.n()).done;)q()}catch(e){M.e(e)}finally{M.f()}return"1"!==k.fetchLocal(k.leftMarketDockLK)&&R(),ft().registerNoteFeeder({order:function(e){n.handleOrderNote(e)},match:function(e){n.handleMatchNote(e)},epoch:function(e){n.handleEpochNote(e)},conn:function(e){n.handleConnNote(e)},balance:function(e){n.handleBalanceNote(e)},bondpost:function(e){n.handleBondUpdate(e)},spots:function(e){n.handlePriceUpdate(e)},walletstate:function(e){n.handleWalletState(e)},reputation:function(){n.updateReputation()},feepayment:function(){n.updateReputation()},runstats:function(e){e.baseID===n.market.base.id&&e.quoteID===n.market.quote.id&&e.host===n.market.dex.host&&(n.mm.update(),Boolean(n.mmRunning)!==Boolean(e.stats)&&(n.mmRunning=Boolean(e.stats),n.resolveOrderFormVisibility()))},epochreport:function(e){e.baseID===n.market.base.id&&e.quoteID===n.market.quote.id&&e.host===n.market.dex.host&&n.mm.handleEpochReportNote(e)},cexproblems:function(e){e.baseID===n.market.base.id&&e.quoteID===n.market.quote.id&&e.host===n.market.dex.host&&n.mm.handleCexProblemsNote(e)},runevent:function(e){e.baseID===n.market.base.id&&e.quoteID===n.market.quote.id&&e.host===n.market.dex.host&&n.mm.update()}}),n.loadingAnimations={},n.startLoadingAnimations(),n.secondTicker=window.setInterval((function(){for(var e=0,t=Object.values(n.metaOrders);e<t.length;e++){var a=t[e];a.details.age.textContent=Ne.timeSince(a.ord.submitTime)}var o,s=Aa(Ne.applySelector(r.recentMatchesLiveList,"[data-tmpl=age]"));try{for(s.s();!(o=s.n()).done;){var i,c=o.value;c.textContent=Ne.timeSince(parseFloat(null!==(i=c.dataset.sinceStamp)&&void 0!==i?i:"0"))}}catch(e){s.e(e)}finally{s.f()}}),1e3),n.init(t),n}return d(_,[{key:"init",value:(N=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:(n=null!=t&&t.host?Ka(t.host,parseInt(t.baseID),parseInt(t.quoteID)):k.fetchLocal(k.lastMarketLK))&&this.marketList.exists(n.host,n.base,n.quote)||(r=this.marketList.first())&&(n={host:r.mkt.xc.host,base:r.mkt.baseid,quote:r.mkt.quoteid}),n?this.setMarket(n.host,n.base,n.quote):this.balanceWgt.setBalanceVisibility(!1),this.setRegistrationStatusVisibility();case 4:case"end":return e.stop()}}),e,this)}))),function(e){return N.apply(this,arguments)})},{key:"startLoadingAnimations",value:function(){var e=this.page,t=this.loadingAnimations,n=this.depthChart,r=this.candleChart;n.canvas.classList.add("invisible"),r.canvas.classList.add("invisible"),t.candles&&t.candles.stop(),t.candles=new Yt(e.candlesChart,{message:ke("CANDLES_LOADING")}),t.depth&&t.depth.stop(),t.depth=new Yt(e.depthChart,{message:ke("DEPTH_LOADING")})}},{key:"isSell",value:function(){return this.page.sellBttn.classList.contains("selected")}},{key:"isLimit",value:function(){return this.page.limitBttn.classList.contains("selected")}},{key:"setBuy",value:function(){var e=this.page;Ja(e.sellBttn,e.buyBttn),e.submitBttn.classList.remove(Va),e.submitBttn.classList.add(Wa),e.maxLbl.textContent=ke(E),this.setOrderBttnText(),this.setOrderVisibility(),this.drawChartLines(),this.isLimit()?(this.currentOrder=this.parseOrder(),this.updateOrderBttnState()):this.marketBuyChanged()}},{key:"setSell",value:function(){var e=this.page;Ja(e.buyBttn,e.sellBttn),e.submitBttn.classList.add(Va),e.submitBttn.classList.remove(Wa),e.maxLbl.textContent=ke(B),this.setOrderBttnText(),this.setOrderVisibility(),this.drawChartLines(),this.currentOrder=this.parseOrder(),this.updateOrderBttnState()}},{key:"hasPendingBonds",value:function(){return Object.keys(this.market.dex.auth.pendingBonds||[]).length>0}},{key:"setCurrMarketPrice",value:function(){var e=this.market;if(e){var t=ft().exchanges[e.dex.host],n=t.markets[e.cfg.name];if(n.spot){var r,a=Aa(this.stats);try{for(a.s();!(r=a.n()).done;){var o=r.value,s=t.assets[n.baseid].unitInfo.conventional,i=s.conversionFactor,c=s.unit,l=ft().fiatRatesMap[n.baseid];l?(o.tmpl.volume.textContent=Ne.formatFourSigFigs(n.spot.vol24/i*l),o.tmpl.volUnit.textContent="USD"):(o.tmpl.volume.textContent=Ne.formatFourSigFigs(n.spot.vol24/i),o.tmpl.volUnit.textContent=c),eo(o.tmpl,t,n)}}catch(e){a.e(e)}finally{a.f()}this.page.obPrice.textContent=Ne.formatFourSigFigs(n.spot.rate/this.market.rateConversionFactor),this.page.obPrice.classList.remove("sellcolor","buycolor"),this.page.obPrice.classList.add(n.spot.change24>=0?"buycolor":"sellcolor"),Ne.setVis(n.spot.change24>=0,this.page.obUp),Ne.setVis(n.spot.change24<0,this.page.obDown)}}}},{key:"setMarketDetails",value:function(){if(this.market){var e,t=Aa(this.stats);try{for(t.s();!(e=t.n()).done;){var n=e.value,r=this.market,a=r.baseCfg,o=r.quoteCfg;n.tmpl.baseIcon.src=Ne.logoPath(a.symbol),n.tmpl.quoteIcon.src=Ne.logoPath(o.symbol),Ne.empty(n.tmpl.baseSymbol,n.tmpl.quoteSymbol),n.tmpl.baseSymbol.appendChild(Ne.symbolize(a,!0)),n.tmpl.quoteSymbol.appendChild(Ne.symbolize(o,!0))}}catch(e){t.e(e)}finally{t.f()}}}},{key:"setHighLow",value:function(){var e=0,t=0,n=this.market.cfg.spot;if(n&&n.low24&&n.high24)e=n.high24,t=n.low24;else{var r,a=null===(r=this.market)||void 0===r?void 0:r.candleCaches[Ua];if(!a){if(this.candleDur!==Ua)return void this.requestCandles(Ua);var o,s=Aa(this.stats);try{for(s.s();!(o=s.n()).done;){var i=o.value;i.tmpl.high.textContent="-",i.tmpl.low.textContent="-"}}catch(e){s.e(e)}finally{s.f()}return}for(var c=(new Date).getTime()-864e5,l=a.candles.length-1;l>=0;l--){var u=a.candles[l];if(u.endStamp<c)break;(0===t||u.lowRate>0&&u.lowRate<t)&&(t=u.lowRate),u.highRate>e&&(e=u.highRate)}}var d,h=this.market.base.id,p=this.market.quote.id,f=this.market.dex,v=Aa(this.stats);try{for(v.s();!(d=v.n()).done;){var m=d.value;m.tmpl.high.textContent=e>0?Ne.formatFourSigFigs(ft().conventionalRate(h,p,e,f)):"-",m.tmpl.low.textContent=t>0?Ne.formatFourSigFigs(ft().conventionalRate(h,p,t,f)):"-"}}catch(e){v.e(e)}finally{v.f()}}},{key:"assetsAreSupported",value:function(){var e,t,n,r,a=this.market,o=a.base,s=a.quote,i=a.baseCfg,c=a.quoteCfg;if(!o||!s)return{isSupported:!1,text:ke("NOT_SUPPORTED",{asset:(o?c.symbol:i.symbol).toUpperCase()})};var l=o.token?null===(e=ft().assets[o.token.parentID].info)||void 0===e?void 0:e.versions:null===(t=o.info)||void 0===t?void 0:t.versions,u=s.token?null===(n=ft().assets[s.token.parentID].info)||void 0===n?void 0:n.versions:null===(r=s.info)||void 0===r?void 0:r.versions,d="";return l.includes(i.version)?u.includes(c.version)||(d=ke(P,{asset:s.symbol.toUpperCase(),version:c.version+""})):d=ke(P,{asset:o.symbol.toUpperCase(),version:i.version+""}),{isSupported:l.includes(i.version)&&u.includes(c.version),text:d}}},{key:"setOrderVisibility",value:function(){var e=this.page;this.isLimit()?(Ne.show(e.priceBox,e.tifBox,e.qtyBox,e.maxBox),Ne.hide(e.mktBuyBox),this.previewQuoteAmt(!0)):(Ne.hide(e.tifBox,e.maxBox,e.priceBox),this.isSell()?(Ne.hide(e.mktBuyBox),Ne.show(e.qtyBox),this.previewQuoteAmt(!0)):(Ne.show(e.mktBuyBox),Ne.hide(e.qtyBox),this.previewQuoteAmt(!1))),this.updateOrderBttnState()}},{key:"resolveOrderFormVisibility",value:(q=s(f().mark((function e(){var t,n,r,a,o,i,c,l,u,d,h,p=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=function(){var e=s(f().mark((function e(){var t,n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(p.assetsAreSupported().isSupported){e.next=2;break}return e.abrupt("return",!1);case 2:if(p.market&&!(p.market.dex.auth.effectiveTier<1)){e.next=4;break}return e.abrupt("return",!1);case 4:if(t=p.tokenAssetApprovalStatuses(),n=t.baseAssetApprovalStatus,r=t.quoteAssetApprovalStatus,n===dt.Approved&&r===dt.Approved){e.next=7;break}return e.abrupt("return",!1);case 7:if(a=p.market,o=a.base,s=a.quote,o&&ft().assets[o.id].wallet&&s&&ft().assets[s.id].wallet){e.next=11;break}return e.abrupt("return",!1);case 11:if(!p.mmRunning){e.next=13;break}return e.abrupt("return",!1);case 13:return e.abrupt("return",!0);case 14:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),e.t0=Ne,e.next=5,n();case 5:e.t1=e.sent,e.t2=t.orderForm,e.t3=t.orderTypeBttns,e.t0.setVis.call(e.t0,e.t1,e.t2,e.t3),this.market&&(r=this.market.dex.auth,a=r.effectiveTier,o=r.pendingStrength,Ne.setVis(a>0||o>0,t.reputationAndTradingTierBox)),(i=ft().mmStatus)&&void 0===this.mmRunning&&this.market.base&&this.market.quote&&(c=this.market,l=c.base.id,u=c.quote.id,d=c.dex.host,h=i.bots.find((function(e){var t=e.config;return t.baseID===l&&t.quoteID===u&&t.host===d})),this.mmRunning=Boolean(null==h?void 0:h.running)),Ne.setVis(this.mmRunning,t.mmRunning),this.mmRunning&&Ne.hide(t.orderForm,t.orderTypeBttns);case 14:case"end":return e.stop()}}),e,this)}))),function(){return q.apply(this,arguments)})},{key:"setLoaderMsgVisibility",value:function(){var e=this.page,t=this.assetsAreSupported(),n=t.isSupported,r=t.text;n?Ne.hide(e.loaderMsg):(e.loaderMsg.textContent=r,Ne.show(e.loaderMsg),Ne.hide(e.notRegistered),Ne.hide(e.noWallet))}},{key:"showTokenApprovalForm",value:(R=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=t?this.market.base.id:this.market.quote.id,this.approveTokenForm.setAsset(n,this.market.dex.host),this.forms.show(this.page.approveTokenForm);case 3:case"end":return e.stop()}}),e,this)}))),function(e){return R.apply(this,arguments)})},{key:"tokenAssetApprovalStatuses",value:function(){var e=this.market,t=e.base,n=e.quote,r=dt.Approved,a=dt.Approved;if(null!=t&&t.token){var o,s=ft().assets[t.id],i=this.market.dex.assets[t.id].version;null!=s&&null!==(o=s.wallet)&&void 0!==o&&o.approved&&void 0!==s.wallet.approved[i]&&(r=s.wallet.approved[i])}if(null!=n&&n.token){var c,l=ft().assets[n.id],u=this.market.dex.assets[n.id].version;null!=l&&null!==(c=l.wallet)&&void 0!==c&&c.approved&&void 0!==l.wallet.approved[u]&&(a=l.wallet.approved[u])}return{baseAssetApprovalStatus:r,quoteAssetApprovalStatus:a}}},{key:"setTokenApprovalVisibility",value:function(){var e=this.page,t=this.tokenAssetApprovalStatuses(),n=t.baseAssetApprovalStatus,r=t.quoteAssetApprovalStatus;if(n===dt.Approved&&r===dt.Approved)return Ne.hide(e.tokenApproval),e.sellBttn.removeAttribute("disabled"),void e.buyBttn.removeAttribute("disabled");n!==dt.Approved&&r===dt.Approved&&(e.sellBttn.setAttribute("disabled","disabled"),e.buyBttn.removeAttribute("disabled"),this.setBuy(),Ne.show(e.approvalRequiredSell),Ne.hide(e.approvalRequiredBuy,e.approvalRequiredBoth)),n===dt.Approved&&r!==dt.Approved&&(e.buyBttn.setAttribute("disabled","disabled"),e.sellBttn.removeAttribute("disabled"),this.setSell(),Ne.show(e.approvalRequiredBuy),Ne.hide(e.approvalRequiredSell,e.approvalRequiredBoth)),n!==dt.Approved&&r!==dt.Approved&&(Ne.show(e.approvalRequiredBoth),Ne.hide(e.approvalRequiredSell,e.approvalRequiredBuy)),Ne.show(e.tokenApproval),e.approvalPendingBaseSymbol.textContent=e.baseTokenAsset.textContent=this.market.base.symbol.toUpperCase(),e.approvalPendingQuoteSymbol.textContent=e.quoteTokenAsset.textContent=this.market.quote.symbol.toUpperCase(),Ne.setVis(n===dt.NotApproved,e.approveBaseBttn),Ne.setVis(r===dt.NotApproved,e.approveQuoteBttn),Ne.setVis(n===dt.Pending,e.approvalPendingBase),Ne.setVis(r===dt.Pending,e.approvalPendingQuote)}},{key:"setRegistrationStatusView",value:function(e,t,n){var r=this.page;r.regStatusTitle.textContent=e,r.regStatusConfsDisplay.textContent=t,r.registrationStatus.classList.remove("completed","error","waiting"),r.registrationStatus.classList.add(n)}},{key:"updateRegistrationStatusView",value:function(){var e=this.page,t=this.market.dex;if(e.regStatusDex.textContent=t.host,e.postingBondsDex.textContent=t.host,t.auth.effectiveTier>=1)this.setRegistrationStatusView(ke("REGISTRATION_FEE_SUCCESS"),"","completed");else{var n=(t.auth.pendingBonds||[]).map((function(e){var n=t.bondAssets[e.symbol].confs;return"".concat(e.confs," / ").concat(n)})).join(", ");this.setRegistrationStatusView(ke("WAITING_FOR_CONFS"),n,"waiting")}}},{key:"setRegistrationStatusVisibility",value:function(){var e=this,t=this.page,n=this.market;if(n&&n.dex&&n.dex.connectionStatus===ut.Connected){this.updateRegistrationStatusView();var r=function(e){for(var n=0,r=[t.registrationStatus,t.bondRequired,t.bondCreationPending,t.notRegistered,t.penaltyCompsRequired];n<r.length;n++){var a=r[n];Ne.setVis(a===e,a)}};if(n.dex.auth.effectiveTier>=1){var a=function(){var t=s(f().mark((function t(){return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:r(void 0),e.resolveOrderFormVisibility();case 2:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();if(Ne.isHidden(t.orderForm))return void setTimeout(a,5e3);a()}else n.dex.viewOnly?(t.unregisteredDex.textContent=n.dex.host,r(t.notRegistered)):n.dex.auth.targetTier>0&&n.dex.auth.rep.penalties>n.dex.auth.penaltyComps?(t.acctPenalties.textContent="".concat(n.dex.auth.rep.penalties),t.acctPenaltyComps.textContent="".concat(n.dex.auth.penaltyComps),t.compsDexSettingsLink.href="/dexsettings/".concat(n.dex.host),r(t.penaltyCompsRequired)):this.hasPendingBonds()?r(t.registrationStatus):n.dex.auth.targetTier>0?r(t.bondCreationPending):(t.acctTier.textContent="".concat(n.dex.auth.effectiveTier),t.dexSettingsLink.href="/dexsettings/".concat(n.dex.host),r(t.bondRequired))}}},{key:"setOrderBttnText",value:function(){this.isSell()?this.page.submitBttn.textContent=ke("SET_BUTTON_SELL",{asset:Ne.shortSymbol(this.market.baseCfg.unitInfo.conventional.unit)}):this.page.submitBttn.textContent=ke("SET_BUTTON_BUY",{asset:Ne.shortSymbol(this.market.baseCfg.unitInfo.conventional.unit)})}},{key:"setOrderBttnEnabled",value:function(e,t){var n=this.page.submitBttn;e?(n.removeAttribute("disabled"),n.removeAttribute("title")):(n.setAttribute("disabled","true"),t&&n.setAttribute("title",t))}},{key:"updateOrderBttnState",value:function(){var e=this.market,t=this.currentOrder,n=t.qty,r=t.rate,a=t.isLimit,o=t.sell,s=ft().assets[this.market.base.id].wallet,i=ft().assets[e.quote.id].wallet;if(s&&i)if(n<=0||n<e.cfg.lotsize)this.setOrderBttnEnabled(!1,ke(re));else if(a)if(r){if(o)return s.balance.available<e.cfg.lotsize?void this.setOrderBttnEnabled(!1,ke(ne)):void(e.maxSell&&this.setOrderBttnEnabled(n<=e.maxSell.swap.value,ke(ne)));var c=this.adjustedRate(),l=e.cfg.lotsize*(c/Ft);if(i.balance.available<l)this.setOrderBttnEnabled(!1,ke(te));else if(e.maxBuys[c]){var u=n<=e.maxBuys[c].swap.lots*e.cfg.lotsize;this.setOrderBttnEnabled(u,ke(te))}}else this.setOrderBttnEnabled(!1,ke(ae));else o?this.setOrderBttnEnabled(n<=s.balance.available,ke(ne)):this.setOrderBttnEnabled(n<=i.balance.available,ke(te))}},{key:"setCandleDurBttns",value:function(){var e=this,t=this.page,n=this.market;Ne.empty(t.durBttnBox);var r,a=Aa(n.dex.candleDurs);try{var o=function(){var n=r.value,a=t.durBttnTemplate.cloneNode(!0);a.textContent=n,Ne.bind(a,"click",(function(){return e.candleDurationSelected(n)})),t.durBttnBox.appendChild(a)};for(a.s();!(r=a.n()).done;)o()}catch(e){a.e(e)}finally{a.f()}this.loadCandles()}},{key:"setMarket",value:(A=s(f().mark((function e(t,n,r){var a,o,i,c,l,u,d,h,p,v,m,g,y,b,x,w;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=ft().user.exchanges[t],o=this.page,window.cexBook=s(f().mark((function e(){var a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/cexbook",{host:t,baseID:n,quoteID:r});case 2:a=e.sent,console.log(a.book);case 4:case"end":return e.stop()}}),e)}))),o.lotField.value="",o.qtyField.value="",o.rateField.value="",this.depthChart.clear(),Ne.empty(this.page.buyRows),Ne.empty(this.page.sellRows),this.recentMatches=[],Ne.empty(o.recentMatchesLiveList),this.balanceWgt.setBalanceVisibility(!1),Ne.hide(o.notRegistered,o.bondRequired,o.noWallet,o.penaltyCompsRequired),a&&a.markets&&a.connectionStatus===ut.Connected){e.next=19;break}return i=ke("CONNECTION_FAILED"),a.disabled&&(i=ke("DEX_DISABLED_MSG")),o.chartErrMsg.textContent=i,Ne.show(o.chartErrMsg),e.abrupt("return");case 19:c=Aa(this.stats);try{for(c.s();!(l=c.n()).done;)u=l.value,Ne.show(u.row)}catch(e){c.e(e)}finally{c.f()}d=a.assets[n],h=a.assets[r],p=[ft().unitInfo(n,a),ft().unitInfo(r,a)],m=p[1],g=Ft/(v=p[0]).conventional.conversionFactor*m.conventional.conversionFactor,Ne.hide(o.maxOrd,o.chartErrMsg),this.maxEstimateTimer&&(window.clearTimeout(this.maxEstimateTimer),this.maxEstimateTimer=null),y=Qa(d.symbol,h.symbol),b=ft().assets[n],x=ft().assets[r],w={dex:a,sid:y,cfg:a.markets[y],base:b,quote:x,baseUnitInfo:v,quoteUnitInfo:m,maxSell:null,maxBuys:{},maxSellRequested:!1,candleCaches:{},baseCfg:d,quoteCfg:h,rateConversionFactor:g,sellBalance:0,buyBalance:0,bookLoaded:!1},this.market=w,this.mm.setMarket(t,n,r),this.mmRunning=void 0,o.lotSize.textContent=Ne.formatCoinValue(w.cfg.lotsize,w.baseUnitInfo),o.rateStep.textContent=Ne.formatCoinValue(w.cfg.ratestep/g),this.displayMessageIfMissingWallet(),this.balanceWgt.setWallets(t,n,r),this.setMarketDetails(),this.setCurrMarketPrice(),Ta.request("loadmarket",Ka(t,n,r)),k.storeLocal(k.lastMarketLK,{host:t,base:n,quote:r}),ft().updateMarketElements(this.main,n,r,a),this.marketList.select(t,n,r),this.setLoaderMsgVisibility(),this.setTokenApprovalVisibility(),this.setRegistrationStatusVisibility(),this.resolveOrderFormVisibility(),this.setOrderBttnText(),this.setOrderBttnEnabled(!1,ke(ae)),this.setCandleDurBttns(),this.previewQuoteAmt(!1),this.updateTitle(),this.reputationMeter.setHost(a.host),this.updateReputation(),this.loadUserOrders();case 56:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return A.apply(this,arguments)})},{key:"displayMessageIfMissingWallet",value:function(){var e,t,n,r,a=this.page,o=this.market,s=o.baseCfg.symbol.toLocaleUpperCase(),i=o.quoteCfg.symbol.toLocaleUpperCase(),c="";if(Ne.hide(a.noWallet),null!==(e=o.base)&&void 0!==e&&e.wallet||null!==(t=o.quote)&&void 0!==t&&t.wallet)if(null!==(n=o.base)&&void 0!==n&&n.wallet){if(null!==(r=o.quote)&&void 0!==r&&r.wallet)return;c=ke(oe,{asset:i})}else c=ke(oe,{asset:s});else c=ke("NO_WALLET_MSG",{asset1:s,asset2:i});a.noWallet.textContent=c,Ne.show(a.noWallet)}},{key:"reportDepthClick",value:function(e){this.page.rateField.value=String(e),this.rateFieldChanged()}},{key:"reportDepthVolume",value:function(e){var t=this.page,n=this.market,r=n.baseUnitInfo,a=n.quoteUnitInfo;t.sellBookedBase.textContent=Ne.formatCoinValue(e.sellBase*r.conventional.conversionFactor,r),t.sellBookedQuote.textContent=Ne.formatCoinValue(e.sellQuote*a.conventional.conversionFactor,a),t.buyBookedBase.textContent=Ne.formatCoinValue(e.buyBase*r.conventional.conversionFactor,r),t.buyBookedQuote.textContent=Ne.formatCoinValue(e.buyQuote*a.conventional.conversionFactor,a)}},{key:"reportDepthMouse",value:function(e){for(;this.hovers.length;)this.hovers.shift().classList.remove("hover");var t=this.page;if(e){Ne.show(t.depthLegend);for(var n=0,r=Object.values(this.metaOrders);n<r.length;n++){var a=r[n],o=a.div,s=a.ord;2===s.status&&e.hoverMarkers.indexOf(s.rate)>-1&&(o.classList.add("hover"),this.hovers.push(o))}t.hoverPrice.textContent=Ne.formatCoinValue(e.rate),t.hoverVolume.textContent=Ne.formatCoinValue(e.depth),t.hoverVolume.style.color=e.dotColor}else Ne.hide(t.depthLegend)}},{key:"reportDepthZoom",value:function(e){k.storeLocal(k.depthZoomLK,e)}},{key:"reportMouseCandle",value:function(e){var t=this.page;e?(Ne.show(t.candlesLegend),t.candleStart.textContent=Ne.formatCoinValue(e.startRate/this.market.rateConversionFactor),t.candleEnd.textContent=Ne.formatCoinValue(e.endRate/this.market.rateConversionFactor),t.candleHigh.textContent=Ne.formatCoinValue(e.highRate/this.market.rateConversionFactor),t.candleLow.textContent=Ne.formatCoinValue(e.lowRate/this.market.rateConversionFactor),t.candleVol.textContent=Ne.formatCoinValue(e.matchVolume,this.market.baseUnitInfo)):Ne.hide(t.candlesLegend)}},{key:"parseOrder",value:function(){var e=this.page,t=e.qtyField,n=this.isLimit(),r=this.isSell(),a=this.market,o=a.baseUnitInfo.conventional.conversionFactor;return n||r||(t=e.mktBuyField,o=a.quoteUnitInfo.conventional.conversionFactor),{host:a.dex.host,isLimit:n,sell:r,base:a.base.id,quote:a.quote.id,qty:Ya(t.value||"",o),rate:Ya(e.rateField.value||"",a.rateConversionFactor),tifnow:e.tifNow.checked||!1,options:{}}}},{key:"previewQuoteAmt",value:function(e){var t=this.page;if(this.market.base&&this.market.quote){var n=this.currentOrder=this.parseOrder(),r=this.adjustedRate();if(t.orderErr.textContent="",r&&(n.sell?this.preSell():this.preBuy()),this.depthLines.input=[],r&&this.isLimit()&&(this.depthLines.input=[{rate:n.rate/this.market.rateConversionFactor,color:n.sell?this.depthChart.theme.sellLine:this.depthChart.theme.buyLine}]),this.drawChartLines(),!e||!r||!n.qty)return t.orderPreview.textContent="",void this.drawChartLines();var a=ft().assets[n.quote].unitInfo.conventional.unit,o=n.qty*n.rate/Ft,s=Ne.formatCoinValue(o,this.market.quoteUnitInfo);t.orderPreview.textContent=ke("ORDER_PREVIEW",{total:s,asset:a}),this.isSell()?this.preSell():this.preBuy()}}},{key:"preSell",value:function(){var e=this,t=this.market,n=ft().assets[t.base.id].wallet;return n.balance.available<t.cfg.lotsize?(this.setMaxOrder(null),void this.updateOrderBttnState()):t.maxSell?(this.setMaxOrder(t.maxSell.swap),void this.updateOrderBttnState()):void(t.maxSellRequested||(t.maxSellRequested=!0,this.scheduleMaxEstimate("/api/maxsell",{},0,(function(r){t.maxSellRequested=!1,t.maxSell=r.maxSell,t.sellBalance=n.balance.available,e.setMaxOrder(r.maxSell.swap),e.updateOrderBttnState()}))))}},{key:"preBuy",value:function(){var e=this,t=this.market,n=this.adjustedRate(),r=ft().assets[t.quote.id].wallet;if(r){var a=t.cfg.lotsize*(n/Ft);if(r.balance.available<a)return this.setMaxOrder(null),void this.updateOrderBttnState();if(t.maxBuys[n])return this.setMaxOrder(t.maxBuys[n].swap),void this.updateOrderBttnState();var o=Object.keys(t.maxBuys).length?350:0;this.scheduleMaxEstimate("/api/maxbuy",{rate:n},o,(function(r){t.maxBuys[n]=r.maxBuy,t.buyBalance=ft().assets[t.quote.id].wallet.balance.available,e.setMaxOrder(r.maxBuy.swap),e.updateOrderBttnState()}))}}},{key:"scheduleMaxEstimate",value:function(e,t,n,r){var a=this,o=this.page;this.maxLoaded||(this.maxLoaded=ft().loading(o.maxOrd));var i=[this.market.base.id,this.market.quote.id],c=i[0],l=i[1],u=[ft().assets[c].wallet,ft().assets[l].wallet],d=u[0],h=u[1];if(d&&d.running&&h&&h.running){this.maxEstimateTimer&&window.clearTimeout(this.maxEstimateTimer),Ne.show(o.maxOrd,o.maxLotBox),Ne.hide(o.maxAboveZero,o.maxZeroNoFees,o.maxZeroNoBal),o.maxFromLots.textContent=ke("CALCULATING"),o.maxFromLotsLbl.textContent="",this.maxOrderUpdateCounter++;var p=this.maxOrderUpdateCounter;this.maxEstimateTimer=window.setTimeout(s(f().mark((function n(){var s;return f().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(a.maxEstimateTimer=null,p===a.maxOrderUpdateCounter){n.next=3;break}return n.abrupt("return");case 3:return n.next=5,S(e,Ia({host:a.market.dex.host,base:c,quote:l},t));case 5:if(s=n.sent,p===a.maxOrderUpdateCounter){n.next=8;break}return n.abrupt("return");case 8:if(ft().checkResponse(s)){n.next=13;break}return console.warn("max order estimate not available:",s),o.maxFromLots.textContent=ke("ESTIMATE_UNAVAILABLE"),a.maxLoaded&&(a.maxLoaded(),a.maxLoaded=null),n.abrupt("return");case 13:r(s);case 14:case"end":return n.stop()}}),n)}))),n)}}},{key:"setMaxOrder",value:function(e){var t=this.page;this.maxLoaded&&(this.maxLoaded(),this.maxLoaded=null),Ne.show(t.maxOrd,t.maxLotBox);var n=this.isSell(),r=0;if(e&&(r=e.lots),t.maxFromLots.textContent=r.toString(),t.maxFromLotsLbl.textContent=ke(1===r?"LOT":"LOTS"),e){var a=n?this.market.base:this.market.quote;if(0===r){var o=this.market.cfg.lotsize;if(!n){var s=this.anyRate()[1];if(0===s)return;o*=s}if(a.wallet.balance.available/o>0){if(a.token){var i=ft().assets[a.token.parentID],c=i.wallet.balance.available,l=i.unitInfo;return void(c<e.feeReservesPerLot&&(Ne.show(t.maxZeroNoFees),t.maxZeroNoFeesTicker.textContent=l.conventional.unit,t.maxZeroMinFees.textContent=Ne.formatCoinValue(e.feeReservesPerLot,l)))}if(a.wallet.balance.available/(o+e.feeReservesPerLot)>0)return}return Ne.show(t.maxZeroNoBal),void(t.maxZeroNoBalTicker.textContent=a.unitInfo.conventional.unit)}Ne.show(t.maxAboveZero),t.maxFromAmt.textContent=Ne.formatCoinValue(e.value||0,a.unitInfo),t.maxFromTicker.textContent=a.unitInfo.conventional.unit}}},{key:"validateOrder",value:function(e){var t=this.page,n=this.market,r=n.cfg.minimumRate,a=n.rateConversionFactor;if(e.isLimit){if(!e.rate)return Ne.show(t.orderErr),t.orderErr.textContent=ke("NO_ZERO_RATE"),!1;if(e.rate<r){Ne.show(t.orderErr);var o=e.rate/a,s=r/a;return t.orderErr.textContent="rate is lower than the market's minimum rate. ".concat(o," < ").concat(s),!1}}return!!e.qty||(Ne.show(t.orderErr),t.orderErr.textContent=ke("NO_ZERO_QUANTITY"),!1)}},{key:"handleBook",value:function(e){var t,n=this.market,r=n.cfg,a=n.baseUnitInfo,o=n.quoteUnitInfo,s=n.baseCfg,i=n.quoteCfg;this.book=new wa(e,s.symbol,i.symbol),this.loadTable();var c,l=Aa(e.book.epoch||[]);try{for(l.s();!(c=l.n()).done;){var u=c.value;u.rate>0&&this.book.add(u),this.addTableOrder(u)}}catch(e){l.e(e)}finally{l.f()}if(!this.book)return this.depthChart.clear(),Ne.empty(this.page.buyRows),void Ne.empty(this.page.sellRows);Ne.show(this.page.epochLine),this.loadingAnimations.depth&&this.loadingAnimations.depth.stop(),this.depthChart.canvas.classList.remove("invisible"),this.depthChart.set(this.book,r.lotsize,r.ratestep,a,o),this.recentMatches=null!==(t=e.book.recentMatches)&&void 0!==t?t:[],this.refreshRecentMatchesTable()}},{key:"midGapConventional",value:function(){var e=this.midGap();if(!e)return e;var t=this.market,n=t.baseUnitInfo,r=t.quoteUnitInfo;return e*n.conventional.conversionFactor/r.conventional.conversionFactor}},{key:"midGap",value:function(){var e=this.book;if(e)return e.buys&&e.buys.length?e.sells&&e.sells.length?(e.buys[0].msgRate+e.sells[0].msgRate)/2/Ft:e.buys[0].msgRate/Ft:e.sells&&e.sells.length?e.sells[0].msgRate/Ft:null}},{key:"setMarketBuyOrderEstimate",value:function(){var e=this.market,t=e.cfg.lotsize,n=ft().user.exchanges[e.dex.host].markets[e.sid].buybuffer,r=this.midGapConventional();r&&(this.page.minMktBuy.textContent=Ne.formatCoinValue(t*n*r,e.baseUnitInfo))}},{key:"maxUserOrderCount",value:function(){var e=this.market,t=e.dex.host,n=e.cfg.name;return Math.max(10,ft().orders(t,n).length)}},{key:"loadUserOrders",value:(I=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l,u,d,h,p;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(s in t=this.market,n=t.base,r=t.quote,a=t.dex.host,o=t.cfg.name,this.metaOrders)delete this.metaOrders[s];if(n&&r){e.next=4;break}return e.abrupt("return",this.resolveUserOrders([]));case 4:if(!((i=ft().orders(a,o)).length>=10)){e.next=7;break}return e.abrupt("return",this.resolveUserOrders(i));case 7:return c={hosts:[a],market:{baseID:n.id,quoteID:r.id},n:this.maxUserOrderCount()},e.next=10,S("/api/orders",c);case 10:l=e.sent,u=l.orders||[],d=Aa(i),e.prev=13,p=f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=h.value,u.some((function(e){return e.id===t.id}))||u.push(t);case 2:case"end":return e.stop()}}),e)})),d.s();case 16:if((h=d.n()).done){e.next=20;break}return e.delegateYield(p(),"t0",18);case 18:e.next=16;break;case 20:e.next=25;break;case 22:e.prev=22,e.t1=e.catch(13),d.e(e.t1);case 25:return e.prev=25,d.f(),e.finish(25);case 28:return e.abrupt("return",this.resolveUserOrders(l.orders||[]));case 29:case"end":return e.stop()}}),e,this,[[13,22,25,28]])}))),function(){return I.apply(this,arguments)})},{key:"refreshActiveOrders",value:function(){var e=ft().orders(this.market.dex.host,Qa(this.market.baseCfg.symbol,this.market.quoteCfg.symbol));return this.resolveUserOrders(e)}},{key:"resolveUserOrders",value:function(e){var t,n,r,a=this,o=this.page,s=this.metaOrders,i=this.market,c=i.cfg,l=function(e){return e.status<3||At(e)},u=Aa(e);try{for(u.s();!(r=u.n()).done;){var d=r.value;s[d.id]={ord:d}}}catch(e){u.e(e)}finally{u.f()}var h=Object.keys(s).map((function(e){return s[e]}));h.sort((function(e,t){var n=[l(e.ord),l(t.ord)],r=n[0],a=n[1];return r&&!a?-1:!r&&a?1:t.ord.submitTime-e.ord.submitTime}));var p=this.maxUserOrderCount();for(var f in h.length>p&&(h=h.slice(0,p)),s)delete s[f];Ne.empty(o.userOrders),Ne.setVis(null===(t=h)||void 0===t?void 0:t.length,o.userOrders),Ne.setVis(!(null!==(n=h)&&void 0!==n&&n.length),o.userNoOrders);var v,m=!1,g=Aa(h);try{var y=function(){var e=v.value,t=o.userOrderTmpl.cloneNode(!0);o.userOrders.appendChild(t);var n=Ne.parseTemplate(t),r=Ne.parseTemplate(n.header),u=Ne.parseTemplate(n.details);e.div=t,e.header=r,e.details=u;var d,h=e.ord,p=h.id,f=l(h);p&&(s[p]=e),!h.readyToTick&&At(h)&&(n.header.classList.add("unready-user-order"),m=!0),r.sideLight.classList.add(h.sell?"sell":"buy"),f||r.sideLight.classList.add("inactive"),u.side.textContent=e.header.side.textContent=Tt(h),u.side.classList.add(h.sell?"sellcolor":"buycolor"),r.side.classList.add(h.sell?"sellcolor":"buycolor"),u.qty.textContent=e.header.qty.textContent=Ne.formatCoinValue(h.qty,i.baseUnitInfo),d=2===h.type?a.marketOrderRateString(h,i):Ne.formatRateFullPrecision(h.rate,i.baseUnitInfo,i.quoteUnitInfo,c.ratestep),u.rate.textContent=e.header.rate.textContent=d,r.baseSymbol.textContent=i.baseUnitInfo.conventional.unit,u.type.textContent=function(e){switch(e){case 1:return ke(X);case 2:return ke(K);default:return ke("CANCEL_ORDER")}}(h.type),a.updateMetaOrder(e),Ne.bind(t,"mouseenter",(function(){a.activeMarkerRate=h.rate,a.setDepthMarkers()}));var g,y=function(e){e.stopPropagation(),a.showCancel(t,p)},b=function(e){e.stopPropagation(),a.showAccelerate(h)};p?(qt(h)&&(Ne.show(u.cancelBttn),Ea(u.cancelBttn,"click",(function(e){y(e)}))),Ea(u.accelerateBttn,"click",(function(e){b(e)})),ft().canAccelerateOrder(h)&&Ne.show(u.accelerateBttn),u.link.href="order/".concat(p),ft().bindInternalNavigation(t)):(Ne.hide(u.accelerateBttn),Ne.hide(u.cancelBttn),Ne.hide(u.link)),Ne.bind(n.header,"click",(function(){if(Ne.isDisplayed(n.details))return Ne.hide(n.details),r.expander.classList.add("ico-arrowdown"),void r.expander.classList.remove("ico-arrowup");Ne.show(n.details),r.expander.classList.remove("ico-arrowdown"),r.expander.classList.add("ico-arrowup"),g&&g.remove()})),Ne.bind(n.header,"mouseenter",(function(){if(!Ne.isDisplayed(n.details)){g&&g.remove();var e=document.createElement("div");g=e,document.body.appendChild(e),e.className="user-order-floaty-menu";var r=Ne.layoutMetrics(n.header),s=r.bodyTop+r.height;e.style.top="".concat(s-1,"px"),e.style.left="".concat(r.bodyLeft,"px");var i=a.metaOrders[p].ord,c=function(t,n){var r=t.cloneNode(!0);e.appendChild(r),Ne.show(r),Ne.bind(r,"click",(function(e){n(e)}))};qt(i)&&c(u.cancelBttn,(function(e){y(e)})),ft().canAccelerateOrder(i)&&c(u.accelerateBttn,(function(e){b(e)})),e.appendChild(u.link.cloneNode(!0));var l=o.orderScroller.scrollTop,d=function n(r){var a=o.orderScroller.scrollTop-l;e.style.top="".concat(s+a,"px"),Ne.mouseInElement(r,e)||Ne.mouseInElement(r,t)||(e.remove(),g=null,document.removeEventListener("mousemove",n),o.orderScroller.removeEventListener("scroll",n))};document.addEventListener("mousemove",d),o.orderScroller.addEventListener("scroll",d)}})),ft().bindTooltips(t)};for(g.s();!(v=g.n()).done;)y()}catch(e){g.e(e)}finally{g.f()}Ne.setVis(m,o.unreadyOrdersMsg),this.setDepthMarkers()}},{key:"marketOrderRateString",value:function(e,t){var n;if(null===(n=e.matches)||void 0===n||!n.length)return ke(K);var r=Ne.formatRateFullPrecision(Lt(e),t.baseUnitInfo,t.quoteUnitInfo,t.cfg.ratestep);return e.matches.length>1&&(r="~ "+r),r}},{key:"updateMetaOrder",value:function(e){var t=e.header,n=e.details,r=e.ord;r.status<=2||At(r)?t.activeLight.classList.add("active"):t.activeLight.classList.remove("active"),n.status.textContent=t.status.textContent=Rt(r),n.age.textContent=Ne.timeSince(r.submitTime),n.filled.textContent="".concat((Et(r)/r.qty*100).toFixed(1),"%"),n.settled.textContent="".concat((Bt(r)/r.qty*100).toFixed(1),"%")}},{key:"setDepthMarkers",value:function(){for(var e={buys:[],sells:[]},t=this.market.rateConversionFactor,n=0,r=Object.values(this.metaOrders);n<r.length;n++){var a=r[n].ord;a.rate&&2===a.status&&(a.sell?e.sells.push({rate:a.rate/t,active:a.rate===this.activeMarkerRate}):e.buys.push({rate:a.rate/t,active:a.rate===this.activeMarkerRate}))}this.depthChart.setMarkers(e),this.book&&this.depthChart.draw()}},{key:"updateTitle",value:function(){var e=this.midGapConventional(),t=this.market,n=t.baseUnitInfo.conventional.unit,r=t.quoteUnitInfo.conventional.unit;document.title=e?"".concat(Ne.formatCoinValue(e)," | ").concat(n).concat(r," | ").concat(this.ogTitle):"".concat(n).concat(r," | ").concat(this.ogTitle)}},{key:"handleBookRoute",value:function(e){ft().log("book","handleBookRoute:",e);var t=e.payload,n=this.market,r=n.baseCfg,a=n.quoteCfg,o=n.dex.host;t.base===r.id&&t.quote===a.id&&e.host===o&&(this.handleBook(t),this.market.bookLoaded=!0,this.updateTitle(),this.setMarketBuyOrderEstimate())}},{key:"handleBookOrderRoute",value:function(e){if(ft().log("book","handleBookOrderRoute:",e),e.host===this.market.dex.host&&e.marketID===this.market.sid){var t=e.payload;t.rate>0&&this.book.add(t),this.addTableOrder(t),this.updateTitle(),this.depthChart.draw()}}},{key:"handleUnbookOrderRoute",value:function(e){if(ft().log("book","handleUnbookOrderRoute:",e),e.host===this.market.dex.host&&e.marketID===this.market.sid){var t=e.payload;this.book.remove(t.token),this.removeTableOrder(t),this.updateTitle(),this.depthChart.draw()}}},{key:"handleUpdateRemainingRoute",value:function(e){if(ft().log("book","handleUpdateRemainingRoute:",e),e.host===this.market.dex.host&&e.marketID===this.market.sid){var t=e.payload;this.book.updateRemaining(t.token,t.qty,t.qtyAtomic),this.updateTableOrder(t),this.depthChart.draw()}}},{key:"handleEpochOrderRoute",value:function(e){if(ft().log("book","handleEpochOrderRoute:",e),e.host===this.market.dex.host&&e.marketID===this.market.sid){var t=e.payload;t.msgRate>0&&this.book.add(t),t.qtyAtomic>0&&this.addTableOrder(t),this.depthChart.draw()}}},{key:"handleCandlesRoute",value:function(e){if(this.candlesLoading&&(clearTimeout(this.candlesLoading.timer),this.candlesLoading.loaded(),this.candlesLoading=null),e.host===this.market.dex.host&&e.marketID===this.market.cfg.name){var t=e.payload.dur;this.market.candleCaches[t]=e.payload,this.setHighLow(),this.candleDur===t&&(this.loadingAnimations.candles&&this.loadingAnimations.candles.stop(),this.candleChart.canvas.classList.remove("invisible"),this.candleChart.setCandles(e.payload,this.market.cfg,this.market.baseUnitInfo,this.market.quoteUnitInfo))}}},{key:"handleEpochMatchSummary",value:function(e){this.addRecentMatches(e.payload.matchSummaries),this.refreshRecentMatchesTable()}},{key:"handleCandleUpdateRoute",value:function(e){if(e.host===this.market.dex.host){var t=e.payload,n=t.dur,r=t.candle,a=this.market.candleCaches[n];if(a){var o=a.candles;0===o.length?o.push(r):o[o.length-1].startStamp===r.startStamp?o[o.length-1]=r:o.push(r),this.candleDur===n&&this.candleChart.draw()}}}},{key:"showToggleWalletStatus",value:function(e){var t=this.page;this.openAsset=e,Ne.hide(t.toggleWalletStatusErr,t.walletStatusDisable,t.disableWalletMsg),Ne.show(t.walletStatusEnable,t.enableWalletMsg),this.forms.show(t.toggleWalletStatusConfirm)}},{key:"toggleWalletStatus",value:(D=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,Ne.hide(t.toggleWalletStatusErr),n={assetID:this.openAsset.id,disable:!1},r=ft().loading(t.toggleWalletStatusConfirm),e.next=7,S("/api/togglewalletstatus",n);case 7:if(a=e.sent,r(),ft().checkResponse(a)){e.next=13;break}return t.toggleWalletStatusErr.textContent=a.msg,Ne.show(t.toggleWalletStatusErr),e.abrupt("return");case 13:Ne.hide(this.page.forms),this.balanceWgt.updateAsset(this.openAsset.id);case 15:case"end":return e.stop()}}),e,this)}))),function(){return D.apply(this,arguments)})},{key:"showVerify",value:function(){this.preorderCache={};var e,t=this.page,n=this.currentOrder=this.parseOrder(),r=n.sell,a=ft().assets[n.base],o=ft().assets[n.quote],s=r?o:a,i=r?a:o,c=function(e){switch(e.dataset.icon){case"from":if(i.token){var t=ft().assets[i.token.parentID];e.src=Ne.logoPath(t.symbol)}else e.src=Ne.logoPath(i.symbol);break;case"to":if(s.token){var n=ft().assets[s.token.parentID];e.src=Ne.logoPath(n.symbol)}else e.src=Ne.logoPath(s.symbol)}},l=Aa(Ne.applySelector(t.vDetailPane,"[data-icon]"));try{for(l.s();!(e=l.n()).done;)c(e.value)}catch(e){l.e(e)}finally{l.f()}var u,d=Aa(Ne.applySelector(t.vFeeSummary,"[data-icon]"));try{for(d.s();!(u=d.n()).done;)c(u.value)}catch(e){d.e(e)}finally{d.f()}Ne.hide(t.vPreorderErr),Ne.show(t.vPreorder),t.vBuySell.textContent=ke(r?"SELLING":"BUYING");var h=ke(r?B:E);if(t.vSideSubmit.textContent=h,t.vOrderHost.textContent=n.host,n.isLimit){Ne.show(t.verifyLimit),Ne.hide(t.verifyMarket);var p="Limit ".concat(h," Order");t.vOrderType.textContent=n.tifnow?p+" (immediate)":p,t.vRate.textContent=Ne.formatCoinValue(n.rate/this.market.rateConversionFactor),t.vQty.textContent=Ne.formatCoinValue(n.qty,a.unitInfo);var f=n.rate/Ft*n.qty;t.vTotal.textContent=Ne.formatCoinValue(f,o.unitInfo),this.showFiatValue(o.id,f,t.vFiatTotal)}else{Ne.hide(t.verifyLimit),Ne.show(t.verifyMarket),t.vOrderType.textContent="Market ".concat(h," Order");var v=n.sell?this.market.baseUnitInfo:this.market.quoteUnitInfo;t.vmFromTotal.textContent=Ne.formatCoinValue(n.qty,v),t.vmFromAsset.textContent=i.symbol.toUpperCase(),this.showFiatValue(i.id,n.qty,t.vmFromTotalFiat);var m=this.midGap();if(m){Ne.show(t.vMarketEstimate);var g=n.sell?n.qty*m:n.qty/m;t.vmToTotal.textContent=Ne.formatCoinValue(g,s.unitInfo),t.vmToAsset.textContent=s.symbol.toUpperCase(),this.showFiatValue(s.id,g,t.vmTotalFiat)}else Ne.hide(t.vMarketEstimate)}r?(t.vHeader.classList.add(Va),t.vHeader.classList.remove(Wa),t.vSubmit.classList.add(Va),t.vSubmit.classList.remove(Wa)):(t.vHeader.classList.add(Wa),t.vHeader.classList.remove(Va),t.vSubmit.classList.add(Wa),t.vSubmit.classList.remove(Va)),this.showVerifyForm(),a.wallet.open&&o.wallet.open?this.preOrder(n):(Ne.hide(t.vPreorder),this.unlockWalletsForEstimates())}},{key:"showFiatValue",value:function(e,t,n){if(n){var r=ft().fiatRatesMap[e];n.textContent=Ne.formatFiatConversion(t,r,ft().unitInfo(e)),r?Ne.show(n.parentElement):Ne.hide(n.parentElement)}}},{key:"showVerifyForm",value:(T=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.page,Ne.hide(t.vErr),this.forms.show(t.verifyForm);case 3:case"end":return e.stop()}}),e,this)}))),function(){return T.apply(this,arguments)})},{key:"unlockWalletsForEstimates",value:(F=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=ft().loading(t.verifyForm),e.next=4,this.unlockMarketWallets();case 4:n(),Ne.show(t.vPreorder),this.preOrder(this.parseOrder());case 7:case"end":return e.stop()}}),e,this)}))),function(){return F.apply(this,arguments)})},{key:"unlockWallet",value:(C=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/openwallet",{assetID:t});case 2:if(n=e.sent,ft().checkResponse(n)){e.next=5;break}throw Error("error unlocking wallet "+n.msg);case 5:this.balanceWgt.updateAsset(t);case 6:case"end":return e.stop()}}),e,this)}))),function(e){return C.apply(this,arguments)})},{key:"unlockMarketWallets",value:(w=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(t=this.market,n=t.base,r=t.quote,a=[],n.wallet.open||a.push(n.id),r.wallet.open||a.push(r.id),o=0,s=a;o<s.length;o++)i=s[o],this.unlockWallet(i);case 5:case"end":return e.stop()}}),e,this)}))),function(){return w.apply(this,arguments)})},{key:"fetchPreorder",value:(x=s(f().mark((function e(t){var n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,r=JSON.stringify(t.options),!(a=this.preorderCache[r])){e.next=5;break}return e.abrupt("return",a);case 5:return Ne.hide(n.vPreorderErr),o=ft().loading(n.verifyForm),e.next=9,S("/api/preorder",Za(t));case 9:if(s=e.sent,o(),ft().checkResponse(s)){e.next=13;break}return e.abrupt("return",{err:s.msg});case 13:return this.preorderCache[r]=s.estimate,e.abrupt("return",s.estimate);case 15:case"end":return e.stop()}}),e,this)}))),function(e){return x.apply(this,arguments)})},{key:"setPreorderErr",value:function(e){var t=this.page;Ne.hide(t.vPreorder),Ne.show(t.vPreorderErr),t.vPreorderErrTip.dataset.tooltip=e}},{key:"showPreOrderAdvancedOptions",value:function(){var e=this.page;Ne.hide(e.showAdvancedOptions),Ne.show(e.hideAdvancedOptions,e.vOtherOrderOpts)}},{key:"hidePreOrderAdvancedOptions",value:function(){var e=this.page;Ne.hide(e.hideAdvancedOptions,e.vOtherOrderOpts),Ne.show(e.showAdvancedOptions)}},{key:"reloadOrderOpts",value:function(e,t,n,r){var a=this.page;Ne.empty(a.vDefaultOrderOpts,a.vOtherOrderOpts);var o,s=function(t,n){var o=function(e,t,n,r){var a,o,s=r&&t.sell||!r&&!t.sell,i=(a=t.host,o=s?t.base:t.quote,ft().exchanges[a].assets[o].symbol);switch(!0){case!!e.boolean:return new bt(e,i,t.options,n).node;case!!e.xyRange:return new xt(e,i,t.options,n).node;default:console.error("no option type specified",e)}return console.error("unknown option type",e),document.createElement("div")}(t,e,r,n);t.showByDefault?a.vDefaultOrderOpts.appendChild(o):a.vOtherOrderOpts.appendChild(o)},i=Aa(t.options||[]);try{for(i.s();!(o=i.n()).done;)s(o.value,!0)}catch(e){i.e(e)}finally{i.f()}var c,l=Aa(n.options||[]);try{for(l.s();!(c=l.n()).done;)s(c.value,!1)}catch(e){l.e(e)}finally{l.f()}ft().bindTooltips(a.vDefaultOrderOpts),ft().bindTooltips(a.vOtherOrderOpts)}},{key:"preOrder",value:(m=s(f().mark((function e(t){var n,r,a=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=this.page,r=function(){var e=s(f().mark((function e(){var o,i,c,l,u;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,a.fetchPreorder(t);case 2:if(!(o=e.sent).err){e.next=5;break}return e.abrupt("return",a.setPreorderErr(o.err));case 5:i=o,Ne.hide(n.vPreorderErr),Ne.show(n.vPreorder),c=i.swap,l=i.redeem,c.options=c.options||[],l.options=l.options||[],a.setFeeEstimates(c,l,t),u=function(){var e=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,r();case 2:Ne.animate(400,(function(e){n.vFeeSummary.style.backgroundColor="rgba(128, 128, 128, ".concat(.5-.5*e,")")}));case 3:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),Ne.bind(n.showAdvancedOptions,"click",(function(){a.showPreOrderAdvancedOptions()})),Ne.bind(n.hideAdvancedOptions,"click",(function(){a.hidePreOrderAdvancedOptions()})),a.reloadOrderOpts(t,c,l,u);case 16:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),r();case 3:case"end":return e.stop()}}),e,this)}))),function(e){return m.apply(this,arguments)})},{key:"setFeeEstimates",value:function(e,t,n){var r=this.page,a=this.market;if(e.estimate&&t.estimate){Ne.show(r.vPreorderEstimates);var o=a.baseUnitInfo,s=a.quoteUnitInfo,i=a.rateConversionFactor,c=function(e){return e<.05?"< 0.1":_a.format(e)},l=1,u=1,d=o,h=s;if(a.base.token){var p=ft().assets[a.base.token.parentID];d=p.unitInfo;var f=ft().fiatRatesMap[a.base.id],v=ft().fiatRatesMap[p.id];l=f&&v?v/f*o.conventional.conversionFactor/p.unitInfo.conventional.conversionFactor:0}if(a.quote.token){var m=ft().assets[a.quote.token.parentID];h=m.unitInfo;var g=ft().fiatRatesMap[a.quote.id],y=ft().fiatRatesMap[m.id];u=g&&y?y/g*s.conventional.conversionFactor/m.unitInfo.conventional.conversionFactor:0}var b=d,x=h,k=l,w=u;if(this.currentOrder.sell){var C=[b,x];x=C[0],b=C[1];var S=[k,w];w=S[0],k=S[1]}var F=e.estimate.value||0,T=w>0?F/w:F,D=e.estimate.realisticBestCase/T*100;r.vSwapFeesLowPct.textContent=w<=0?"":"(".concat(c(D),"%)"),r.vSwapFeesLow.textContent=Ne.formatCoinValue(e.estimate.realisticBestCase,x);var I=e.estimate.realisticWorstCase/T*100;r.vSwapFeesHighPct.textContent=w<=0?"":"(".concat(c(I),"%)"),r.vSwapFeesHigh.textContent=Ne.formatCoinValue(e.estimate.realisticWorstCase,x);var A=e.estimate.maxFees/T*100;r.vSwapFeesMaxPct.textContent=w<=0?"":"(".concat(c(A),"%)"),r.vSwapFeesMax.textContent=Ne.formatCoinValue(e.estimate.maxFees,x);var R=this.midGap()||n.rate/i,E=n.sell?F*R:F/R,B=k>0?E/k:E,P=t.estimate.realisticBestCase/B*100;r.vRedeemFeesLowPct.textContent=k<=0?"":"(".concat(c(P),"%)"),r.vRedeemFeesLow.textContent=Ne.formatCoinValue(t.estimate.realisticBestCase,b);var L=t.estimate.realisticWorstCase/B*100;r.vRedeemFeesHighPct.textContent=k<=0?"":"(".concat(c(L),"%)"),r.vRedeemFeesHigh.textContent=Ne.formatCoinValue(t.estimate.realisticWorstCase,b),l&&u?(Ne.show(r.vFeeSummaryPct),Ne.hide(r.vFeeSummary),r.vFeeSummaryLow.textContent=c(D+P),r.vFeeSummaryHigh.textContent=c(I+L)):(Ne.hide(r.vFeeSummaryPct),Ne.show(r.vFeeSummary),r.summarySwapFeesLow.textContent=r.vSwapFeesLow.textContent,r.summarySwapFeesHigh.textContent=r.vSwapFeesHigh.textContent,r.summaryRedeemFeesLow.textContent=r.vRedeemFeesLow.textContent,r.summaryRedeemFeesHigh.textContent=r.vRedeemFeesHigh.textContent)}else Ne.hide(r.vPreorderEstimates)}},{key:"submitCancel",value:(p=s(f().mark((function e(){var t,n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.cancelData,r=n.order,a={orderID:r.id},o=ft().loading(t.cancelSubmit),e.next=7,S("/api/cancel",a);case 7:if(s=e.sent,o(),ft().checkResponse(s)){e.next=13;break}return t.cancelErr.textContent=s.msg,Ne.show(t.cancelErr),e.abrupt("return");case 13:Ne.hide(n.bttn,t.forms),r.cancelling=!0;case 15:case"end":return e.stop()}}),e,this)}))),function(){return p.apply(this,arguments)})},{key:"showCancel",value:function(e,t){var n=this.metaOrders[t].ord,r=this.page,a=n.qty-n.filled,o=It(n)?this.market.quote:this.market.base;r.cancelRemain.textContent=Ne.formatCoinValue(a,o.unitInfo),r.cancelUnit.textContent=o.symbol.toUpperCase(),Ne.hide(r.cancelErr),this.forms.show(r.cancelForm),this.cancelData={bttn:Ne.tmplElement(e,"cancelBttn"),order:n}}},{key:"showAccelerate",value:function(e){var t=ft().loading(this.main);this.accelerateOrderForm.refresh(e),t(),this.forms.show(this.page.accelerateForm)}},{key:"showCreate",value:function(e){var t=this.page;this.currentCreate=e,this.newWalletForm.setAsset(e.id),this.forms.show(t.newWalletForm)}},{key:"stepSubmit",value:function(){var e=this.page,t=this.market;if(Ne.hide(e.orderErr),this.validateOrder(this.parseOrder())){var n=ft().walletMap[t.base.id],r=ft().walletMap[t.quote.id];return n?r?void this.showVerify():(e.orderErr.textContent=ke(L,{asset:t.quote.symbol}),void Ne.show(e.orderErr)):(e.orderErr.textContent=ke(L,{asset:t.base.symbol}),void Ne.show(e.orderErr))}}},{key:"showDeposit",value:(u=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.depositAddrForm.setAsset(t),this.forms.show(this.page.deposit);case 2:case"end":return e.stop()}}),e,this)}))),function(e){return u.apply(this,arguments)})},{key:"showCustomProviderDialog",value:function(e){ft().loadPage("wallets",{promptProvider:e,goBack:"markets"})}},{key:"handlePriceUpdate",value:function(e){this.market&&(e.host===this.market.dex.host&&e.spots[this.market.cfg.name]&&this.setCurrMarketPrice(),this.marketList.updateSpots(e))}},{key:"handleWalletState",value:(l=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.market){e.next=2;break}return e.abrupt("return");case 2:if(t.wallet.assetID===(null===(n=this.market.base)||void 0===n?void 0:n.id)||t.wallet.assetID===(null===(r=this.market.quote)||void 0===r?void 0:r.id)){e.next=4;break}return e.abrupt("return");case 4:this.setTokenApprovalVisibility(),this.resolveOrderFormVisibility();case 6:case"end":return e.stop()}}),e,this)}))),function(e){return l.apply(this,arguments)})},{key:"handleBondUpdate",value:(c=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.dex,this.market){e.next=3;break}return e.abrupt("return");case 3:if(n===this.market.dex.host){e.next=5;break}return e.abrupt("return");case 5:if("AccountRegistered"!==t.topic){e.next=8;break}return e.next=8,ft().fetchUser();case 8:this.market.dex=ft().exchanges[n],this.setRegistrationStatusVisibility(),this.updateReputation();case 11:case"end":return e.stop()}}),e,this)}))),function(e){return c.apply(this,arguments)})},{key:"updateReputation",value:function(){var e=this.page,t=this.market,n=t.dex.host,r=t.cfg,o=t.baseCfg.unitInfo,s=t.quoteCfg.unitInfo,i=ft().exchanges[n].auth;e.parcelSizeLots.textContent=String(r.parcelsize),e.marketLimitBase.textContent=Ne.formatFourSigFigs(r.parcelsize*r.lotsize/o.conventional.conversionFactor),e.marketLimitBaseUnit.textContent=o.conventional.unit,e.marketLimitQuoteUnit.textContent=s.conventional.unit;var c=this.anyRate()[1];if(c){var l=r.lotsize*c;e.marketLimitQuote.textContent=Ne.formatFourSigFigs(r.parcelsize*l/s.conventional.conversionFactor)}else e.marketLimitQuote.textContent="-";var u=dn(i);e.tradingTier.textContent=String(u);var d=function(e){for(var t=ft().exchanges[e],n=t.auth,r=t.maxScore,a=t.markets,o=n.rep.score,s=dn(n),i=0,c=0,l=Object.values(a);c<l.length;c++){var u,d=l[c],h=0,p=cn(d.inflight||[]);try{for(p.s();!(u=p.n()).done;)h+=Fn(u.value,d)}catch(e){p.e(e)}finally{p.f()}var f,v=cn(d.orders||[]);try{for(v.s();!(f=v.n()).done;)h+=Fn(f.value,d)}catch(e){v.e(e)}finally{v.f()}i+=h/(d.parcelsize*d.lotsize)}return[i,2*Tn(o,r)*s]}(n),h=a(d,2),p=h[0],f=h[1];e.tradingLimit.textContent=(f*r.parcelsize).toFixed(2),e.limitUsage.textContent=f>0?(p/f*100).toFixed(1):"0",e.orderLimitRemain.textContent=((f-p)*r.parcelsize).toFixed(1),e.orderTradingTier.textContent=String(u),this.reputationMeter.update()}},{key:"anyRate",value:function(){var e=this.market,t=e.cfg.spot,n=e.baseCfg.id,r=e.quoteCfg.id,a=e.rateConversionFactor;if(e.bookLoaded){var o=this.midGap();if(o)return[o*Ft,o,this.midGapConventional()||0]}if(t&&t.rate)return[t.rate,t.rate/Ft,t.rate/a];var s=[ft().fiatRatesMap[n],ft().fiatRatesMap[r]],i=s[0],c=s[1];if(i&&c){var l=i/c,u=l*a;return[u,u/Ft,l]}return[0,0,0]}},{key:"handleMatchNote",value:function(e){var t=this.metaOrders[e.orderID],n=e.match;if(!t)return this.refreshActiveOrders();if(2===t.ord.type&&0===n.status){var r=ft().order(e.orderID);r&&(t.details.rate.textContent=t.header.rate.textContent=this.marketOrderRateString(r,this.market))}(0===n.side&&3===n.status||1===n.side&&4===n.status)&&this.updateReputation(),ft().canAccelerateOrder(t.ord)?Ne.show(t.details.accelerateBttn):Ne.hide(t.details.accelerateBttn)}},{key:"handleOrderNote",value:function(e){var t=e.order,n=this.metaOrders[t.id],r="AsyncOrderFailure"===e.topic||"AsyncOrderSubmitted"===e.topic;if(!n||r||"OrderLoaded"===e.topic&&t.readyToTick)return this.refreshActiveOrders();var a=n.ord.status;n.ord=t,"MissedCancel"===e.topic&&Ne.show(n.details.cancelBttn),t.filled===t.qty&&Ne.hide(n.details.cancelBttn),ft().canAccelerateOrder(t)?Ne.show(n.details.accelerateBttn):Ne.hide(n.details.accelerateBttn),this.updateMetaOrder(n),(1===a&&2===t.status||2===a&&t.status>2)&&(this.setDepthMarkers(),this.updateReputation(),this.mm.readBook())}},{key:"handleEpochNote",value:function(e){if(ft().log("book","handleEpochNote:",e),this.market&&e.host===this.market.dex.host&&e.marketID===this.market.sid){this.book&&(this.book.setEpoch(e.epoch),this.depthChart.draw()),this.clearOrderTableEpochs();for(var t=0,n=Object.values(this.metaOrders);t<n.length;t++){var r=n[t],a=r.ord,o=r.details,s=r.header,i=e.epoch>a.epoch;switch(!0){case 1===a.type&&1===a.status&&i:var c=0===a.tif?ke(O):ke(M);o.status.textContent=s.status.textContent=c,a.status=0===a.tif?3:2;break;case 2===a.type&&1===a.status:o.status.textContent=s.status.textContent=ke(O),a.status=3}}}}},{key:"recentMatchesSortCompare",value:function(){var e=this;switch(this.recentMatchesSortKey){case"rate":return function(t,n){return e.recentMatchesSortDirection*(t.rate-n.rate)};case"qty":return function(t,n){return e.recentMatchesSortDirection*(t.qty-n.qty)};case"age":return function(t,n){return e.recentMatchesSortDirection*(t.stamp-n.stamp)}}}},{key:"refreshRecentMatchesTable",value:function(){var e=this.page,t=this.recentMatches;if(Ne.empty(e.recentMatchesLiveList),t){var n=this.recentMatchesSortCompare();t.sort(n);var r,a=Aa(t);try{for(a.s();!(r=a.n()).done;){var o=r.value,s=e.recentMatchesTemplate.cloneNode(!0),i=Ne.parseTemplate(s);ft().bindTooltips(s),i.rate.textContent=Ne.formatCoinValue(o.rate/this.market.rateConversionFactor),i.qty.textContent=Ne.formatCoinValue(o.qty,this.market.baseUnitInfo),i.age.textContent=Ne.timeSince(o.stamp),i.age.dataset.sinceStamp=String(o.stamp),s.classList.add(o.sell?"sellcolor":"buycolor"),e.recentMatchesLiveList.append(s)}}catch(e){a.e(e)}finally{a.f()}}}},{key:"addRecentMatches",value:function(e){this.recentMatches=[].concat(r(e),r(this.recentMatches)).slice(0,100)}},{key:"handleBalanceNote",value:function(e){this.approveTokenForm.handleBalanceNote(e),this.preorderCache={};var t=this.market;if(t&&t.dex&&t.dex.connectionStatus===ut.Connected){this.mm.handleBalanceNote(e);var n=this.balanceWgt;e.assetID!==n.base.id&&e.assetID!==n.quote.id||n.setBalanceVisibility(!0);var r=e.balance.available;switch(e.assetID){case t.baseCfg.id:if(!t.maxSell)break;"number"==typeof t.sellBalance&&t.sellBalance!==r&&(t.maxSell=null),this.isSell()&&this.preSell();break;case t.quoteCfg.id:if(!Object.keys(t.maxBuys).length)break;"number"==typeof t.buyBalance&&t.buyBalance!==r&&(t.maxBuys={}),this.isSell()||this.preBuy()}}}},{key:"submitOrder",value:(o=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,Ne.hide(t.orderErr,t.vErr),n=this.currentOrder,r={order:Za(n)},this.validateOrder(n)){e.next=6;break}return e.abrupt("return");case 6:return t.vSubmit.classList.add("d-hide"),t.vLoader.classList.remove("d-hide"),e.next=10,S("/api/tradeasync",r);case 10:if(a=e.sent,t.vSubmit.classList.remove("d-hide"),t.vLoader.classList.add("d-hide"),ft().checkResponse(a)){e.next=17;break}return t.vErr.textContent=a.msg,Ne.show(t.vErr),e.abrupt("return");case 17:Ne.hide(t.forms),this.refreshActiveOrders();case 19:case"end":return e.stop()}}),e,this)}))),function(){return o.apply(this,arguments)})},{key:"createWallet",value:(n=s(f().mark((function e(){var t,n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ft().fetchUser();case 2:if(t=e.sent){e.next=5;break}return e.abrupt("return");case 5:n=t.assets[this.currentCreate.id],Ne.hide(this.page.forms),(r=this.market).baseCfg.id===n.id?r.base=n:r.quoteCfg.id===n.id&&(r.quote=n),this.balanceWgt.updateAsset(n.id),this.displayMessageIfMissingWallet(),this.resolveOrderFormVisibility();case 12:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"lotChanged",value:function(){var e=this.page,t=parseInt(e.lotField.value||"0");if(t<=0)return e.lotField.value=""===e.lotField.value?"":"0",e.qtyField.value="",this.previewQuoteAmt(!1),void this.setOrderBttnEnabled(!1,ke(re));var n=t*this.market.cfg.lotsize;if(e.lotField.value=String(t),e.qtyField.value=String(n/this.market.baseUnitInfo.conventional.conversionFactor),!this.isLimit()&&this.isSell()){var r=ft().assets[this.market.base.id].wallet;this.setOrderBttnEnabled(n<=r.balance.available,ke(ne))}this.previewQuoteAmt(!0)}},{key:"quantityChanged",value:function(e){var t=this.page,n=this.currentOrder=this.parseOrder();if(n.qty<0)return t.lotField.value="0",t.qtyField.value="",void this.previewQuoteAmt(!1);var r=this.market.cfg.lotsize,a=Math.floor(n.qty/r),o=n.qty=this.currentOrder.qty=a*r;t.lotField.value=String(a),(n.isLimit||n.sell)&&(e&&(t.qtyField.value=String(o/this.market.baseUnitInfo.conventional.conversionFactor)),this.previewQuoteAmt(!0))}},{key:"marketBuyChanged",value:function(){var e=this.page,t=Ya(e.mktBuyField.value||"",this.market.quoteUnitInfo.conventional.conversionFactor),n=this.midGap();if(t>0){var r=ft().assets[this.market.quote.id].wallet;this.setOrderBttnEnabled(t<=r.balance.available,ke(te))}else this.setOrderBttnEnabled(!1,ke(re));if(!n||!t)return e.mktBuyLots.textContent="0",void(e.mktBuyScore.textContent="0");var a=t/n,o=a/this.market.cfg.lotsize;e.mktBuyLots.textContent=o.toFixed(1),e.mktBuyScore.textContent=Ne.formatCoinValue(a,this.market.baseUnitInfo)}},{key:"rateFieldChanged",value:function(){var e=this.adjustedRate();if(e<=0)return this.depthLines.input=[],this.drawChartLines(),this.page.rateField.value="0",this.previewQuoteAmt(!0),void this.updateOrderBttnState();var t=this.currentOrder=this.parseOrder(),n=e/this.market.rateConversionFactor;this.page.rateField.value=String(n),this.depthLines.input=[{rate:n,color:t.sell?this.depthChart.theme.sellLine:this.depthChart.theme.buyLine}],this.drawChartLines(),this.previewQuoteAmt(!0),this.updateOrderBttnState()}},{key:"adjustedRate",value:function(){var e=this.page.rateField.value;if(!e)return NaN;var t=Ya(e,this.market.rateConversionFactor);return t-t%this.market.cfg.ratestep}},{key:"loadTable",value:function(){this.loadTableSide(!0),this.loadTableSide(!1)}},{key:"binOrdersByRateAndEpoch",value:function(e){if(!e||!e.length)return[];var t=[],n=[],r=[],a=e[0].msgRate;e[0].epoch?n.push(e[0]):r.push(e[0]);for(var o=1;o<e.length;o++)e[o].msgRate!==a&&(t.push(r),t.push(n),n=[],r=[],a=e[o].msgRate),e[o].epoch?n.push(e[o]):r.push(e[o]);return t.push(r),t.push(n),t.filter((function(e){return e.length>0}))}},{key:"loadTableSide",value:function(e){var t=this,n=e?this.book.sells:this.book.buys,r=e?this.page.sellRows:this.page.buyRows;Ne.empty(r),n&&n.length&&this.binOrdersByRateAndEpoch(n).forEach((function(e){r.appendChild(t.orderTableRow(e))}))}},{key:"addTableOrder",value:function(e){var t=e.sell?this.page.sellRows:this.page.buyRows,n=t.firstChild;if(0!==e.rate){for(n&&0===n.manager.getRate()&&(n=n.nextSibling);n;){if(0===n.manager.compare(e))return void n.manager.insertOrder(e);if(n.manager.compare(e)>0){var r=this.orderTableRow([e]);return void t.insertBefore(r,n)}n=n.nextSibling}var a=this.orderTableRow([e]);t.appendChild(a)}else{if(0===e.qtyAtomic)return;n&&0===n.manager.getRate()?n.manager.insertOrder(e):(n=this.orderTableRow([e]),t.insertBefore(n,t.firstChild))}}},{key:"removeTableOrder",value:function(e){for(var t=e.token,n=0,r=[this.page.sellRows,this.page.buyRows];n<r.length;n++)for(var a=r[n],o=0,s=Array.from(a.children);o<s.length;o++)if(s[o].manager.removeOrder(t))return}},{key:"updateTableOrder",value:function(e){for(var t=0,n=[this.page.sellRows,this.page.buyRows];t<n.length;t++)for(var r=n[t],a=0,o=Array.from(r.children);a<o.length;a++)if(o[a].manager.updateOrderQty(e))return}},{key:"clearOrderTableEpochs",value:function(){this.clearOrderTableEpochSide(this.page.sellRows),this.clearOrderTableEpochSide(this.page.buyRows)}},{key:"clearOrderTableEpochSide",value:function(e){for(var t=0,n=Array.from(e.children);t<n.length;t++)n[t].manager.removeEpochOrders()}},{key:"orderTableRow",value:function(e){var t=this,n=this.page.orderRowTmpl.cloneNode(!0),r=this.market,a=r.baseUnitInfo,o=r.quoteUnitInfo,s=r.rateConversionFactor,i=r.cfg.ratestep,c=new $a(n,e,a,o,i);return n.manager=c,Ea(n,"click",(function(){t.reportDepthClick(n.manager.getRate()/s)})),0!==n.manager.getRate()&&Ne.bind(n,"mouseenter",(function(){var e=t.depthChart;t.depthLines.hover=[{rate:n.manager.getRate()/s,color:n.manager.isSell()?e.theme.sellLine:e.theme.buyLine}],t.drawChartLines()})),n}},{key:"handleConnNote",value:(t=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.marketList.setConnectionStatus(t),t.connectionStatus!==ut.Connected){e.next=6;break}return e.next=4,ft().fetchUser();case 4:return e.next=6,ft().loadPage("markets");case 6:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})},{key:"filterMarkets",value:function(){var e,t=null===(e=this.page.marketSearchV1.value)||void 0===e?void 0:e.toLowerCase(),n=t?function(e){return e.name.includes(t)}:function(){return!0};this.marketList.setFilter(n)}},{key:"drawChartLines",value:function(){this.depthChart.setLines([].concat(r(this.depthLines.hover),r(this.depthLines.input))),this.depthChart.draw()}},{key:"candleDurationSelected",value:function(e){var t,n;null!==(t=this.market)&&void 0!==t&&null!==(n=t.dex)&&void 0!==n&&n.candleDurs.includes(e)||(e="1h"),this.candleDur=e,this.loadCandles(),k.storeLocal(k.lastCandleDurationLK,e)}},{key:"loadCandles",value:function(){var e,t=Aa(Ne.kids(this.page.durBttnBox));try{for(t.s();!(e=t.n()).done;){var n=e.value;n.textContent===this.candleDur?n.classList.add("selected"):n.classList.remove("selected")}}catch(e){t.e(e)}finally{t.f()}var r=this.market,a=r.candleCaches,o=r.cfg,s=r.baseUnitInfo,i=r.quoteUnitInfo,c=a[this.candleDur];c?this.candleChart.setCandles(c,o,s,i):this.requestCandles()}},{key:"requestCandles",value:function(e){var t=this;this.candlesLoading={loaded:function(){},timer:window.setTimeout((function(){t.candlesLoading&&(t.candlesLoading=null,console.error("candles not received"))}),1e4)};var n=this.market,r=n.dex,a=n.baseCfg,o=n.quoteCfg;Ta.request("loadcandles",{host:r.host,base:a.id,quote:o.id,dur:e||this.candleDur})}},{key:"unload",value:function(){Ta.request("unmarket",{}),Ta.deregisterRoute(Ba),Ta.deregisterRoute(Pa),Ta.deregisterRoute(La),Ta.deregisterRoute(Oa),Ta.deregisterRoute(Ma),Ta.deregisterRoute(qa),Ta.deregisterRoute(Na),this.depthChart.unattach(),this.candleChart.unattach(),Ne.unbind(document,"keyup",this.keyup),clearInterval(this.secondTicker)}}]),_}(lt),za=function(){function e(t){i(this,e),h(this,"div",void 0),h(this,"rowTmpl",void 0),h(this,"markets",void 0),h(this,"selected",void 0),this.div=t,this.rowTmpl=Ne.idel(t,"marketTmplV1"),Ne.cleanTemplates(this.rowTmpl),this.reloadMarketsPane()}return d(e,[{key:"updateSpots",value:function(e){var t,n=Aa(this.markets);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(r.mkt.xc.host===e.host){var a=ft().exchanges[r.mkt.xc.host],o=a.markets[r.mkt.name];eo(r.tmpl,a,o)}}}catch(e){n.e(e)}finally{n.f()}}},{key:"reloadMarketsPane",value:function(){Ne.empty(this.div),this.markets=[];for(var e,t,n,a,o,s=0,i=function(){for(var e=[],t=ft().assets,n=function(e,n){return n.map((function(n){var r=t[n.baseid],a=r?r.name:n.basesymbol,o=ft().unitInfo(n.baseid,e);return Object.assign({xc:e,baseName:a,bui:o},n)}))},a=0,o=Object.values(ft().exchanges);a<o.length;a++){var s=o[a];e.push.apply(e,r(n(s,Object.values(s.markets||{}))))}return e.sort((function(e,t){if(!e.spot)return t.spot?1:e.name===t.name?e.xc.host.localeCompare(t.xc.host):e.name.localeCompare(t.name);if(!t.spot)return-1;var n=e.spot.vol24/e.lotsize;return t.spot.vol24/t.lotsize-n})),e}();s<i.length;s++){var c=i[s];this.markets.push((e=c,void 0,void 0,void 0,void 0,t=ft().unitInfo(e.baseid,e.xc),n=ft().unitInfo(e.quoteid,e.xc),a=Ft/t.conventional.conversionFactor*n.conventional.conversionFactor,o=new Ga(this.rowTmpl,e,a),this.div.appendChild(o.node),o))}ft().bindTooltips(this.div)}},{key:"find",value:function(e,t,n){var r,a=Aa(this.markets);try{for(a.s();!(r=a.n()).done;){var o=r.value;if(o.mkt.xc.host===e&&o.mkt.baseid===t&&o.mkt.quoteid===n)return o}}catch(e){a.e(e)}finally{a.f()}return null}},{key:"exists",value:function(e,t,n){return null!==this.find(e,t,n)}},{key:"first",value:function(){return this.markets[0]}},{key:"select",value:function(e,t,n){var r=this.find(e,t,n);if(!r)return console.error("select: no market row for ".concat(e,", ").concat(t,"-").concat(n));var a,o=Aa(this.markets);try{for(o.s();!(a=o.n()).done;)a.value.node.classList.remove("selected")}catch(e){o.e(e)}finally{o.f()}this.selected=r,this.selected.node.classList.add("selected")}},{key:"setConnectionStatus",value:function(e){var t,n=Aa(this.markets);try{for(n.s();!(t=n.n()).done;){var r=t.value;r.mkt.xc.host===e.host&&(e.connectionStatus===ut.Connected?Ne.hide(r.tmpl.disconnectedIco):Ne.show(r.tmpl.disconnectedIco))}}catch(e){n.e(e)}finally{n.f()}}},{key:"setFilter",value:function(e){var t,n=Aa(this.markets);try{for(n.s();!(t=n.n()).done;){var r=t.value;e(r)?Ne.show(r.node):Ne.hide(r.node)}}catch(e){n.e(e)}finally{n.f()}}}]),e}(),Ga=d((function e(t,n,r){i(this,e),h(this,"node",void 0),h(this,"mkt",void 0),h(this,"name",void 0),h(this,"baseID",void 0),h(this,"quoteID",void 0),h(this,"lotSize",void 0),h(this,"tmpl",void 0),h(this,"rateConversionFactor",void 0),this.mkt=n,this.name=n.name,this.baseID=n.baseid,this.quoteID=n.quoteid,this.lotSize=n.lotsize,this.rateConversionFactor=r,this.node=t.cloneNode(!0);var a,o,s,c,l=this.tmpl=Ne.parseTemplate(this.node);l.baseIcon.src=Ne.logoPath(n.basesymbol),l.quoteIcon.src=Ne.logoPath(n.quotesymbol),l.baseSymbol.appendChild(Ne.symbolize(n.xc.assets[n.baseid],!0)),l.quoteSymbol.appendChild(Ne.symbolize(n.xc.assets[n.quoteid],!0)),l.baseName.textContent=n.baseName,l.host.textContent=n.xc.host,l.host.style.color=(s=n.xc.host,(c=Object.keys(ft().exchanges)).sort(),a=c.indexOf(s),o=to[a%to.length],"hsl(".concat(360*o,", 35%, 50%)")),l.host.dataset.tooltip=n.xc.host,eo(l,n.xc,n),this.mkt.xc.connectionStatus!==ut.Connected&&Ne.show(l.disconnectedIco)})),Xa=function(){function e(t,n){var r=this;i(this,e),h(this,"base",void 0),h(this,"quote",void 0),h(this,"dex",void 0),Ne.hide(t,n);var a=Ne.parseTemplate(t);this.base={id:0,parentID:ja,cfg:null,node:t,tmpl:a,iconBox:a.walletState,stateIcons:new Ue(a.walletState)},a.balanceRowTmpl.remove();var o=Ne.parseTemplate(n);this.quote={id:0,parentID:ja,cfg:null,node:n,tmpl:o,iconBox:o.walletState,stateIcons:new Ue(o.walletState)},o.balanceRowTmpl.remove(),ft().registerNoteFeeder({balance:function(e){r.updateAsset(e.assetID)},walletstate:function(e){r.updateAsset(e.wallet.assetID)},walletsync:function(e){r.updateAsset(e.assetID)},createwallet:function(e){r.updateAsset(e.assetID)}})}var t;return d(e,[{key:"setBalanceVisibility",value:function(e){e?Ne.show(this.base.node,this.quote.node):Ne.hide(this.base.node,this.quote.node)}},{key:"setWallets",value:function(e,t,n){var r=function(e){var t=ft().assets[e];return null!=t&&t.token?t.token.parentID:ja};this.dex=ft().user.exchanges[e],this.base.id=t,this.base.parentID=r(t),this.base.cfg=this.dex.assets[t],this.quote.id=n,this.quote.parentID=r(n),this.quote.cfg=this.dex.assets[n],this.updateWallet(this.base),this.updateWallet(this.quote),this.setBalanceVisibility(this.dex.connectionStatus===ut.Connected)}},{key:"updateWallet",value:function(e){var t=e.cfg,n=e.tmpl,r=e.iconBox,a=e.stateIcons,o=e.id;if(t){var s=ft().assets[o];if(Ne.hide(n.newWalletRow,n.expired,n.unsupported,n.connect,n.spinner,n.walletState,n.balanceRows,n.walletAddr,n.wantProvidersBox),this.checkNeedsProvider(o,n.wantProvidersBox),n.logo.src=Ne.logoPath(t.symbol),n.addWalletSymbol.textContent=t.symbol.toUpperCase(),Ne.empty(n.symbol),s){n.symbol.appendChild(Ne.symbolize(s,!0)),Ne.show(r);var i=s.wallet;if(a.readWallet(i),!i)return s.walletCreationPending?void Ne.show(n.spinner):void Ne.show(n.newWalletRow);Ne.show(n.walletAddr);var c=i.balance;if(c||i.running||i.disabled){if(!c)return ft().fetchBalance(o),void Ne.show(n.spinner);Ne.show(n.balanceRows),Ne.empty(n.balanceRows);var l=function(t,r,a,o){var s=n.balanceRowTmpl.cloneNode(!0);n.balanceRows.appendChild(s);var i=Ne.parseTemplate(s);i.title.textContent=t,i.bal.textContent=Ne.formatCoinValue(r,a),o&&(i.bal.append(o),e.parentBal=i.bal)};if(l(ke("AVAILABLE"),c.available,s.unitInfo),l(ke(z),c.locked+c.contractlocked+c.bondlocked,s.unitInfo),l(ke("IMMATURE"),c.immature,s.unitInfo),s.token){var u=ft().assets[s.token.parentID],d=u.wallet.balance,h=u.unitInfo,p=u.symbol,f=document.createElement("img");f.src=Ne.logoPath(p),f.classList.add("micro-icon","ms-1"),l(ke("FEE_BALANCE"),d.available,h,f)}(new Date).getTime()-new Date(c.stamp).getTime()>36e5&&!i.disabled?(Ne.show(n.expired),i.running&&ft().fetchBalance(o)):Ne.hide(n.expired)}else Ne.show(n.connect)}else Ne.show(n.unsupported)}}},{key:"checkNeedsProvider",value:(t=s(f().mark((function e(t,n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=Ne,e.next=3,ft().needsCustomProvider(t);case 3:e.t1=e.sent,e.t2=n,e.t0.setVis.call(e.t0,e.t1,e.t2);case 6:case"end":return e.stop()}}),e)}))),function(e,n){return t.apply(this,arguments)})},{key:"updateParent",value:function(e){var t,n=ft().assets[e.parentID],r=n.wallet.balance,a=n.unitInfo;null!==(t=e.parentBal)&&void 0!==t&&t.firstChild&&(e.parentBal.firstChild.textContent=Ne.formatCoinValue(r.available,a))}},{key:"updateAsset",value:function(e){e===this.base.id?this.updateWallet(this.base):e===this.quote.id&&this.updateWallet(this.quote),e===this.base.parentID&&this.updateParent(this.base),e===this.quote.parentID&&this.updateParent(this.quote)}}]),e}();function Ka(e,t,n){return{host:e,base:t,quote:n}}function Qa(e,t){return"".concat(e,"_").concat(t)}function Ya(e,t){return e?Math.round(parseFloat(e)*t):0}function Ja(e,t){e.classList.remove("selected"),t.classList.add("selected")}function Za(e){for(var t={},n=0,r=Object.entries(e.options);n<r.length;n++){var o=a(r[n],2),s=o[0],i=o[1];t[s]=JSON.stringify(i)}return Object.assign({},e,{options:t})}var $a=function(){function e(t,n,r,a,o){i(this,e),h(this,"tableRow",void 0),h(this,"page",void 0),h(this,"orderBin",void 0),h(this,"sell",void 0),h(this,"msgRate",void 0),h(this,"epoch",void 0),h(this,"baseUnitInfo",void 0),this.tableRow=t;var s=this.page=Ne.parseTemplate(t);this.orderBin=n,this.sell=n[0].sell,this.msgRate=n[0].msgRate,this.epoch=!!n[0].epoch,this.baseUnitInfo=r;var c=Ne.formatRateFullPrecision(this.msgRate,r,a,o);if(Ne.setVis(this.isEpoch(),this.page.epoch),0===this.msgRate)s.rate.innerText="market";else{var l=this.isSell()?"sellcolor":"buycolor";s.rate.innerText=c,s.rate.classList.add(l)}this.updateQtyNumOrdersEl()}return d(e,[{key:"updateQtyNumOrdersEl",value:function(){var e=this.page,t=this.orderBin,n=t.reduce((function(e,t){return e+t.qtyAtomic}),0),r=t.length;e.qty.innerText=Ne.formatFullPrecision(n,this.baseUnitInfo),r>1?(e.numOrders.removeAttribute("hidden"),e.numOrders.innerText=String(r),e.numOrders.title="quantity is comprised of ".concat(r," orders")):e.numOrders.setAttribute("hidden","true")}},{key:"insertOrder",value:function(e){this.orderBin.push(e),this.updateQtyNumOrdersEl()}},{key:"updateOrderQty",value:function(e){for(var t=e.token,n=e.qty,r=e.qtyAtomic,a=0;a<this.orderBin.length;a++)if(this.orderBin[a].token===t)return this.orderBin[a].qty=n,this.orderBin[a].qtyAtomic=r,this.updateQtyNumOrdersEl(),!0;return!1}},{key:"removeOrder",value:function(e){var t=this.orderBin.findIndex((function(t){return t.token===e}));return!(t<0||(this.orderBin.splice(t,1),this.orderBin.length?this.updateQtyNumOrdersEl():this.tableRow.remove(),0))}},{key:"removeEpochOrders",value:function(e){this.orderBin=this.orderBin.filter((function(t){return!(t.epoch&&t.epoch!==e)})),this.orderBin.length?this.updateQtyNumOrdersEl():this.tableRow.remove()}},{key:"getRate",value:function(){return this.msgRate}},{key:"isEpoch",value:function(){return this.epoch}},{key:"isSell",value:function(){return this.sell}},{key:"compare",value:function(e){return this.getRate()===e.msgRate&&this.isEpoch()===!!e.epoch?0:this.getRate()!==e.msgRate?this.getRate()>e.msgRate===e.sell?1:-1:this.isEpoch()?1:-1}}]),e}();function eo(e,t,n){if(n.spot){e.price.textContent=Ne.formatFourSigFigs(ft().conventionalRate(n.baseid,n.quoteid,n.spot.rate,t));var r=n.spot.change24>0?"+":"";e.change.classList.remove("buycolor","sellcolor"),e.change.classList.add(n.spot.change24>=0?"buycolor":"sellcolor"),e.change.textContent="".concat(r).concat((100*n.spot.change24).toFixed(1),"%")}}var to=[.5,1/4,3/4,1/8,5/8,3/8,7/8];function no(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return ro(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?ro(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function ro(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var ao=function(e){g(p,e);var t,n,r,a,o,c,l,u=(c=p,l=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(c);if(l){var n=b(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return y(this,e)});function p(e){var t;i(this,p),h(v(t=u.call(this)),"main",void 0),h(v(t),"offset",void 0),h(v(t),"loading",void 0),h(v(t),"currentForm",void 0),h(v(t),"orderTmpl",void 0),h(v(t),"filterState",void 0),h(v(t),"page",void 0),t.main=e,t.offset="",t.loading=!1;var n=t.page=Ne.idDescendants(e);t.orderTmpl=n.rowTmpl,t.orderTmpl.remove();var r=t.filterState={hosts:[],assets:[],statuses:[]},a=new URLSearchParams(window.location.search),o=function(e,t){var n=a.get(t);if(n&&0!==n.length){var o=n.split(",");n&&(r[t]=o),e.querySelectorAll("input").forEach((function(e){o.indexOf(e.value)>=0&&(e.checked=!0)}))}};o(n.hostFilter,"hosts"),o(n.assetFilter,"assets"),o(n.statusFilter,"statuses");var s=[],c=function(e,n){var a=e.querySelector(".apply-bttn");s.push(a),Ne.bind(a,"click",(function(){t.submitFilter(),s.forEach((function(e){return Ne.hide(e)}))})),e.querySelectorAll("input").forEach((function(t){Ne.bind(t,"change",(function(){!function(e,t){if(e.length!==t.length)return!1;var n,r=no(e);try{for(r.s();!(n=r.n()).done;){var a=n.value;if(-1===t.indexOf(a))return!1}}catch(e){r.e(e)}finally{r.f()}return!0}(oo(e),r[n])?Ne.show(a):Ne.hide(a)}))}))};return c(n.hostFilter,"hosts"),c(n.assetFilter,"assets"),c(n.statusFilter,"statuses"),Ne.bind(t.main,"scroll",(function(){t.loading||n.ordersTable.offsetHeight-t.main.offsetHeight-t.main.scrollTop<0&&t.nextPage()})),n.forms.querySelectorAll(".form-closer").forEach((function(e){Ne.bind(e,"click",(function(){Ne.hide(n.forms)}))})),Ne.bind(n.forms,"mousedown",(function(e){Ne.mouseInElement(e,t.currentForm)||Ne.hide(n.forms)})),Ne.bind(n.exportOrders,"click",(function(){t.exportOrders()})),n.showArchivedDateField.addEventListener("change",(function(){n.showArchivedDateField.checked?Ne.show(n.archivedDateField):Ne.hide(n.archivedDateField,n.deleteArchivedRecordsErr)})),Ne.bind(n.deleteArchivedRecords,"click",(function(){var e=t.page;e.showArchivedDateField.checked=!1,e.saveMatchesToFile.checked=!1,e.saveOrdersToFile.checked=!1,e.deleteArchivedRecordsErr.textContent="",e.archivedRecordsLocation.textContent="",e.deleteArchivedRecordsMsg.textContent="",Ne.hide(e.deleteArchivedResult,e.deleteArchivedRecordsErr,e.deleteArchivedRecordsMsg,e.archivedRecordsLocation,e.archivedDateField),t.showForm(e.deleteArchivedRecordsForm)})),Ne.bind(n.deleteArchivedRecordsSubmit,"click",(function(){var e=0;n.showArchivedDateField.checked&&(e=Date.parse(n.olderThan.value||""),isNaN(e)||e<=0)?Ne.showFormError(n.deleteArchivedRecordsErr,ke("INVALID_DATE_ERR_MSG")):t.deleteArchivedRecords(e)})),t.submitFilter(),t}return d(p,[{key:"showForm",value:(o=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.currentForm=t,n=this.page,Ne.hide(n.deleteArchivedRecordsForm),t.style.right="10000px",Ne.show(n.forms,t),r=(n.forms.offsetWidth+t.offsetWidth)/2,e.next=8,Ne.animate(500,(function(e){t.style.right="".concat((1-e)*r,"px")}),"easeOutHard");case 8:t.style.right="0px";case 9:case"end":return e.stop()}}),e,this)}))),function(e){return o.apply(this,arguments)})},{key:"setOrders",value:function(e){Ne.empty(this.page.tableBody),this.appendOrders(e)}},{key:"appendOrders",value:function(e){var t,n=this.page.tableBody,r=no(e);try{for(r.s();!(t=r.n()).done;){var a=t.value,o=this.orderTmpl.cloneNode(!0),s=Ne.parseTemplate(o),i=void 0,c=void 0,l=void 0,u=void 0,d=void 0,h="",p=ft().exchanges[a.host]||void 0;if((ft().assets[a.baseID]||p.assets[a.baseID])&&(ft().assets[a.quoteID]||p.assets[a.quoteID])){var f=[ft().unitInfo(a.baseID,p),ft().unitInfo(a.quoteID,p)],v=f[0],m=f[1];if(a.sell){var g=[a.baseSymbol,a.quoteSymbol];i=g[0],c=g[1];var y=[v.conventional.unit,m.conventional.unit];l=y[0],u=y[1],d=Ne.formatCoinValue(a.qty,v),1===a.type&&(h=Ne.formatCoinValue(a.qty/Ft*a.rate,m))}else{var b=[a.quoteSymbol,a.baseSymbol];i=b[0],c=b[1];var x=[m.conventional.unit,v.conventional.unit];l=x[0],u=x[1],2===a.type?d=Ne.formatCoinValue(a.qty,v):(d=Ne.formatCoinValue(a.qty/Ft*a.rate,m),h=Ne.formatCoinValue(a.qty,v))}var k="".concat(v.conventional.unit,"-").concat(m.conventional.unit);s.host.textContent="".concat(k," @ ").concat(a.host),s.fromQty.textContent=d,s.fromLogo.src=Ne.logoPath(i),s.fromSymbol.textContent=l,s.toQty.textContent=h,s.toLogo.src=Ne.logoPath(c),s.toSymbol.textContent=u,s.type.textContent="".concat(Dt(a)," ").concat(Tt(a));var w=Ne.formatCoinValue(ft().conventionalRate(a.baseID,a.quoteID,a.rate,p));2===a.type&&(w=Pt(a)),s.rate.textContent=w,s.status.textContent=Rt(a),s.filled.textContent="".concat((Et(a)/a.qty*100).toFixed(1),"%"),s.settled.textContent="".concat((Bt(a)/a.qty*100).toFixed(1),"%");var C=new Date(a.submitTime).toLocaleString();s.timeAgo.textContent="".concat(Ne.timeSince(a.submitTime)," ago"),s.time.textContent=C,Ne.tmplElement(o,"link").href="order/".concat(a.id),ft().bindInternalNavigation(o),n.appendChild(o)}}}catch(e){r.e(e)}finally{r.f()}50===e.length?this.offset=e[e.length-1].id:this.offset=""}},{key:"submitFilter",value:(a=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,this.offset="",(n=this.filterState).hosts=oo(t.hostFilter),n.assets=oo(t.assetFilter).map((function(e){return parseInt(e)})),n.statuses=oo(t.statusFilter).map((function(e){return parseInt(e)})),e.t0=this,e.next=9,this.fetchOrders();case 9:e.t1=e.sent,e.t0.setOrders.call(e.t0,e.t1);case 11:case"end":return e.stop()}}),e,this)}))),function(){return a.apply(this,arguments)})},{key:"fetchOrders",value:(r=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=ft().loading(this.main),e.next=3,S("/api/orders",this.currentFilter());case 3:return n=e.sent,t(),e.abrupt("return",n.orders);case 6:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"exportOrders",value:function(){this.offset="";var e=this.currentFilter(),t=new URL(window.location.href),n=new URLSearchParams(""),r=function(t){e[t].forEach((function(e){n.append(t,e)}))};r("hosts"),r("assets"),r("statuses"),t.search=n.toString(),t.pathname="/orders/export",window.open(t.toString())}},{key:"deleteArchivedRecords",value:(n=s(f().mark((function e(t){var n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,r=n.saveMatchesToFile.checked||!1,a=n.saveOrdersToFile.checked||!1,o={olderThanMs:t,saveMatchesToFile:r,saveOrdersToFile:a},s=ft().loading(this.main),e.next=7,S("/api/deletearchivedrecords",o);case 7:if(i=e.sent,s(),ft().checkResponse(i)){e.next=11;break}return e.abrupt("return",Ne.showFormError(n.deleteArchivedRecordsErr,i.msg));case 11:i.archivedRecordsDeleted>0?(n.deleteArchivedRecordsMsg.textContent=ke("DELETE_ARCHIVED_RECORDS_RESULT",{nRecords:i.archivedRecordsDeleted}),(r||a)&&(n.archivedRecordsLocation.textContent=ke("ARCHIVED_RECORDS_PATH",{path:i.archivedRecordsPath}),Ne.show(n.archivedRecordsLocation)),this.submitFilter()):n.deleteArchivedRecordsMsg.textContent=ke("NO_ARCHIVED_RECORDS"),Ne.show(n.deleteArchivedResult,n.deleteArchivedRecordsMsg);case 13:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"currentFilter",value:function(){var e,t,n=this.filterState;return{hosts:n.hosts,assets:null===(e=n.assets)||void 0===e?void 0:e.map((function(e){return parseInt(e)})),statuses:null===(t=n.statuses)||void 0===t?void 0:t.map((function(e){return parseInt(e)})),n:50,offset:this.offset}}},{key:"nextPage",value:(t=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(""!==this.offset&&!this.loading){e.next=2;break}return e.abrupt("return");case 2:return this.loading=!0,Ne.show(this.page.orderLoader),e.next=6,this.fetchOrders();case 6:t=e.sent,this.loading=!1,Ne.hide(this.page.orderLoader),this.appendOrders(t);case 10:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),p}(lt);function oo(e){var t=[];return e.querySelectorAll("input").forEach((function(e){e.checked&&t.push(e.value)})),t}function so(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return io(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?io(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function io(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var co=288e5,lo=function(e){g(p,e);var t,n,r,a,o,c,l,u=(c=p,l=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(c);if(l){var n=b(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return y(this,e)});function p(e){var t;i(this,p),h(v(t=u.call(this)),"orderID",void 0),h(v(t),"order",void 0),h(v(t),"page",void 0),h(v(t),"currentForm",void 0),h(v(t),"secondTicker",void 0),h(v(t),"refreshOnPopupClose",void 0),h(v(t),"accelerateOrderForm",void 0),h(v(t),"stampers",void 0);var n=t.page=Ne.idDescendants(e);t.stampers=Ne.applySelector(e,"[data-stamp]"),t.orderID=e.dataset.oid||"",Ne.cleanTemplates(n.matchCardTmpl);var r=function(){var e,n=so(t.stampers);try{for(n.s();!(e=n.n()).done;){var r=e.value;r.textContent=Ne.timeSince(parseInt(r.dataset.stamp||""))}}catch(e){n.e(e)}finally{n.f()}};return r(),n.forms.querySelectorAll(".form-closer").forEach((function(e){Ne.bind(e,"click",(function(){t.refreshOnPopupClose?window.location.replace(window.location.href):Ne.hide(n.forms)}))})),e.querySelectorAll("[data-explorer-id]").forEach((function(e){Pn(parseInt(e.dataset.explorerId||""),e)})),n.cancelBttn&&Ne.bind(n.cancelBttn,"click",(function(){t.showForm(n.cancelForm)})),Ne.bind(n.accelerateBttn,"click",(function(){t.showAccelerateForm()})),mt(n),t.accelerateOrderForm=new br(n.accelerateForm,(function(){t.refreshOnPopupClose=!0})),Ne.cleanTemplates(n.booleanOptTmpl,n.rangeOptTmpl,n.orderOptTmpl),Ne.bind(n.forms,"mousedown",(function(e){if(!Ne.mouseInElement(e,t.currentForm)){if(t.refreshOnPopupClose)return void window.location.reload();Ne.hide(n.forms)}})),Br(n.cancelForm,n.cancelSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t.submitCancel();case 1:case"end":return e.stop()}}),e)})))),t.secondTicker=window.setInterval((function(){r()}),1e4),ft().registerNoteFeeder({order:function(e){t.handleOrderNote(e)},match:function(e){t.handleMatchNote(e)}}),t.start(),t}return d(p,[{key:"start",value:(o=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(t=ft().order(this.orderID))){e.next=5;break}this.order=t,e.next=8;break;case 5:return e.next=7,this.fetchOrder();case 7:t=e.sent;case 8:this.page.mktBaseSymbol.replaceWith(Ne.symbolize(ft().assets[t.baseID])),this.page.mktQuoteSymbol.replaceWith(Ne.symbolize(ft().assets[t.quoteID])),this.setAccelerationButtonVis(),this.showMatchCards();case 12:case"end":return e.stop()}}),e,this)}))),function(){return o.apply(this,arguments)})},{key:"unload",value:function(){clearInterval(this.secondTicker)}},{key:"fetchOrder",value:(a=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/order",this.orderID);case 2:if(t=e.sent,ft().checkResponse(t)){e.next=5;break}throw t.msg;case 5:return this.order=t.order,e.abrupt("return",this.order);case 7:case"end":return e.stop()}}),e,this)}))),function(){return a.apply(this,arguments)})},{key:"setImmutableMatchCardElements",value:function(e,t){var n=Ne.parseTemplate(e);n.matchID.textContent=t.matchID;var r=new Date(t.stamp);n.matchTime.textContent=r.toLocaleTimeString(Ne.languages(),{year:"numeric",month:"short",day:"numeric"}),n.matchTimeAgo.dataset.stamp=t.stamp.toString(),n.matchTimeAgo.textContent=Ne.timeSince(t.stamp),this.stampers.push(n.matchTimeAgo);var a=function(e,t){var n=t.qty;return It(e)&&(n=Ot(t.rate,t.qty)),(n/e.qty*100).toFixed(1)+" %"}(this.order,t),o=Ne.bipSymbol(this.order.baseID),s=Ne.bipSymbol(this.order.quoteID),i=ft().unitInfo(this.order.baseID),c=ft().unitInfo(this.order.quoteID),l=[i.conventional.unit.toLowerCase(),c.conventional.unit.toLowerCase()],u=l[0],d=l[1],h=Ot(t.rate,t.qty);if(t.isCancel)return Ne.show(n.cancelInfoDiv),Ne.hide(n.infoDiv,n.status,n.statusHdr),this.order.sell?(n.cancelAmount.textContent=Ne.formatCoinValue(t.qty,i),n.cancelIcon.src=Ne.logoPathFromID(this.order.baseID)):(n.cancelAmount.textContent=Ne.formatCoinValue(h,c),n.cancelIcon.src=Ne.logoPathFromID(this.order.quoteID)),void(n.cancelOrderPortion.textContent=a);Ne.show(n.infoDiv),Ne.hide(n.cancelInfoDiv),n.orderPortion.textContent=a,0===t.side?(n.side.textContent=ke("MAKER"),Ne.show(n.makerSwapYou,n.makerRedeemYou,n.takerSwapThem,n.takerRedeemThem),Ne.hide(n.takerSwapYou,n.takerRedeemYou,n.makerSwapThem,n.makerRedeemThem)):(n.side.textContent=ke("TAKER"),Ne.hide(n.makerSwapYou,n.makerRedeemYou,n.takerSwapThem,n.takerRedeemThem),Ne.show(n.takerSwapYou,n.takerRedeemYou,n.makerSwapThem,n.makerRedeemThem)),0===t.side&&this.order.sell||1===t.side&&!this.order.sell?(n.makerSwapAsset.textContent=u,n.takerSwapAsset.textContent=d,n.makerRedeemAsset.textContent=d,n.takerRedeemAsset.textContent=u):(n.makerSwapAsset.textContent=d,n.takerSwapAsset.textContent=u,n.makerRedeemAsset.textContent=u,n.takerRedeemAsset.textContent=d);var p=ft().conventionalRate(this.order.baseID,this.order.quoteID,t.rate);n.rate.textContent="".concat(p," ").concat(u,"/").concat(d),this.order.sell?(n.refundAsset.textContent=o,n.fromAmount.textContent=Ne.formatCoinValue(t.qty,i),n.toAmount.textContent=Ne.formatCoinValue(h,c),n.fromIcon.src=Ne.logoPathFromID(this.order.baseID),n.toIcon.src=Ne.logoPathFromID(this.order.quoteID)):(n.refundAsset.textContent=s,n.fromAmount.textContent=Ne.formatCoinValue(h,c),n.toAmount.textContent=Ne.formatCoinValue(t.qty,i),n.fromIcon.src=Ne.logoPathFromID(this.order.quoteID),n.toIcon.src=Ne.logoPathFromID(this.order.baseID))}},{key:"setMutableMatchCardElements",value:function(e,t){if(!t.isCancel){var n=Ne.parseTemplate(e);n.status.textContent=function(e){if(e.revoked)return e.active?e.redeem?Mt(Q):0===e.side?Mt(J):e.counterRedeem?Mt("MATCH_STATUS_REDEEM_PENDING"):Mt(J):e.refund?Mt("MATCH_STATUS_REFUNDED"):e.redeem?Mt(Y):Mt("MATCH_STATUS_COMPLETE");switch(e.status){case 0:return ke("MATCH_STATUS_NEWLY_MATCHED");case 1:return ke("MATCH_STATUS_MAKER_SWAP_CAST");case 2:return ke("MATCH_STATUS_TAKER_SWAP_CAST");case 3:return 0===e.side?ke(Q):ke("MATCH_STATUS_MAKER_REDEEMED");case 4:return ke(Q);case 5:return ke(Y)}return ke(W)}(t);var r=function(e,t,n){if(!n)return Ne.hide(t),void Ne.show(e);t.textContent=Bn(n.stringID),t.dataset.explorerCoin=n.stringID,Pn(n.assetID,t),Ne.show(t),Ne.hide(e)};if(r(n.makerSwapPending,n.makerSwapCoin,ho(t)),r(n.takerSwapPending,n.takerSwapCoin,po(t)),r(n.makerRedeemPending,n.makerRedeemCoin,fo(t)),r(n.takerRedeemPending,n.takerRedeemCoin,vo(t)),t.refund)n.refundCoin.textContent=Bn(t.refund.stringID),n.refundCoin.dataset.explorerCoin=t.refund.stringID,Pn(t.refund.assetID,n.refundCoin),Ne.show(n.refundCoin),Ne.hide(n.refundPending);else{var a=72e6;1===t.side&&(a=co);var o=new Date(t.stamp+a);if(Date.now()>o.getTime())n.refundPending.textContent=ke("REFUND_IMMINENT");else{var s=o.toLocaleTimeString(Ne.languages(),{year:"numeric",month:"short",day:"numeric"});n.refundPending.textContent=ke("REFUND_WILL_HAPPEN_AFTER",{refundAfterTime:s})}Ne.hide(n.refundCoin),Ne.show(n.refundPending)}if(1!==t.status||t.revoked||t.refund)if(2!==t.status||t.revoked||t.refund)!function(e){return e.status<5&&0===e.side&&e.status>=3}(t)||t.revoked||t.refund?!function(e){return e.status<5&&1===e.side&&e.status>=4}(t)||t.revoked||t.refund?Ne.hide(n.makerSwapMsg,n.takerSwapMsg,n.makerRedeemMsg,n.takerRedeemMsg):(n.takerRedeemMsg.textContent=uo(t.redeem),Ne.hide(n.makerSwapMsg,n.takerSwapMsg,n.makerRedeemMsg),Ne.show(n.takerRedeemMsg)):(n.makerRedeemMsg.textContent=uo(t.redeem),Ne.hide(n.makerSwapMsg,n.takerSwapMsg,n.takerRedeemMsg),Ne.show(n.makerRedeemMsg));else{var i=po(t);n.takerSwapMsg.textContent=uo(i),Ne.hide(n.makerSwapMsg,n.makerRedeemMsg,n.takerRedeemMsg),Ne.show(n.takerSwapMsg)}else{var c=ho(t);n.makerSwapMsg.textContent=uo(c),Ne.hide(n.takerSwapMsg,n.makerRedeemMsg,n.takerRedeemMsg),Ne.show(n.makerSwapMsg)}if(t.revoked){Ne.setVis(ho(t),n.makerSwap),Ne.setVis(po(t),n.takerSwap);var l=new Date(t.stamp+co),u=Date.now()>l.getTime();Ne.setVis(fo(t)||po(t)&&t.active&&!t.refund&&!u,n.makerRedeem),Ne.setVis(vo(t)||fo(t)&&t.active&&!t.refund,n.takerRedeem);var d=Boolean(po(t));0===t.side&&(d=Boolean(ho(t)),po(t)&&(d=d&&u)),Ne.setVis(t.refund||t.active&&!t.redeem&&!t.counterRedeem&&d,n.refund)}else Ne.setVis(ho(t)||t.active,n.makerSwap),Ne.setVis(po(t)||t.active,n.takerSwap),Ne.setVis(fo(t)||t.active,n.makerRedeem),Ne.setVis(vo(t)||t.active,n.takerRedeem),Ne.setVis(t.refund,n.refund)}}},{key:"addNewMatchCard",value:function(e){var t=this.page,n=t.matchCardTmpl.cloneNode(!0);ft().bindUrlHandlers(n),n.dataset.matchID=e.matchID,this.setImmutableMatchCardElements(n,e),this.setMutableMatchCardElements(n,e),t.matchBox.appendChild(n)}},{key:"showMatchCards",value:function(){var e=this,t=this.order;t&&t.matches&&(t.matches.sort((function(e,t){return e.stamp-t.stamp})),t.matches.forEach((function(t){return e.addNewMatchCard(t)})))}},{key:"showCancel",value:function(){var e=this.order,t=this.page,n=e.qty-e.filled,r=It(e)?ft().assets[e.quoteID]:ft().assets[e.baseID];t.cancelRemain.textContent=Ne.formatCoinValue(n,r.unitInfo),t.cancelUnit.textContent=r.unitInfo.conventional.unit.toUpperCase(),this.showForm(t.cancelForm)}},{key:"showForm",value:(r=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.currentForm=t,n=this.page,Ne.hide(n.cancelForm,n.accelerateForm),t.style.right="10000px",Ne.show(n.forms,t),r=(n.forms.offsetWidth+t.offsetWidth)/2,e.next=8,Ne.animate(500,(function(e){t.style.right="".concat((1-e)*r,"px")}),"easeOutHard");case 8:t.style.right="0px";case 9:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"submitCancel",value:(n=s(f().mark((function e(){var t,n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.order,r={orderID:n.id},a=ft().loading(t.cancelForm),e.next=6,S("/api/cancel",r);case 6:if(o=e.sent,a(),ft().checkResponse(o)){e.next=10;break}return e.abrupt("return");case 10:t.status.textContent=ke(q),Ne.hide(t.forms),n.cancelling=!0;case 13:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"setAccelerationButtonVis",value:function(){var e=this.order;if(e){var t=this.page;Ne.setVis(ft().canAccelerateOrder(e),t.accelerateBttn,t.actionsLabel)}}},{key:"showAccelerateForm",value:(t=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=ft().loading(this.page.accelerateBttn),this.accelerateOrderForm.refresh(this.order),t(),this.showForm(this.page.accelerateForm);case 4:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"handleOrderNote",value:function(e){var t=this.page,n=e.order;if(n.id===this.orderID){this.order=n;var r=t.cancelBttn;r&&n.status>2&&Ne.hide(r),t.status.textContent=Rt(n);var a,o=so(n.matches||[]);try{for(o.s();!(a=o.n()).done;){var s=a.value;this.processMatch(s)}}catch(e){o.e(e)}finally{o.f()}this.setAccelerationButtonVis()}}},{key:"handleMatchNote",value:function(e){e.orderID===this.orderID&&(this.processMatch(e.match),this.setAccelerationButtonVis())}},{key:"processMatch",value:function(e){var t,n=null,r=so(Ne.applySelector(this.page.matchBox,".match-card"));try{for(r.s();!(t=r.n()).done;){var a=t.value;if(a.dataset.matchID===e.matchID){n=a;break}}}catch(e){r.e(e)}finally{r.f()}n?this.setMutableMatchCardElements(n,e):this.addNewMatchCard(e)}}]),p}(lt);function uo(e){return e.confs&&0!==e.confs.required?"".concat(e.confs.count," / ").concat(e.confs.required," ").concat(ke("CONFIRMATIONS")):""}function ho(e){return 0===e.side?e.swap:e.counterSwap}function po(e){return 0===e.side?e.counterSwap:e.swap}function fo(e){return 0===e.side?e.redeem:e.counterRedeem}function vo(e){return 0===e.side?e.counterRedeem:e.redeem}function mo(){return mo="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,n){var r=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=b(e)););return e}(e,t);if(r){var a=Object.getOwnPropertyDescriptor(r,t);return a.get?a.get.call(arguments.length<3?e:n):a.value}},mo.apply(this,arguments)}function go(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return yo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?yo(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){throw e})),f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){i=!0,o=e})),f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function yo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function bo(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=b(e);if(t){var a=b(this).constructor;n=Reflect.construct(r,arguments,a)}else n=r.apply(this,arguments);return y(this,n)}}function xo(e){var t,n=e.cex,r=n.avail,a=n.req,o=e.dex,s=o.avail,i=o.req,c=e.transferable,l=Math.min(s,i),u=Math.min(r,a);if(e.fundedAndNotBalanced)if(s>i){var d=a-r;if(s-i<d)throw Error("bad math has us with dex surplus + cex underfund invalid remains");l+=d+c}else{var h=i-s;if(r-a<h)throw Error("bad math got us with cex surplus + dex underfund invalid remains");u+=h+c}else if(e.fundedAndBalanced){if(c>0){var p=s-i,f=r-a;t={left:{cex:0,dex:0},right:{cex:0,dex:0},cexRange:0,dexRange:0},f>c&&p>c?(t.left.cex=c+a,t.left.dex=i,t.right.cex=a,t.right.dex=c+i):p<c&&f<c?(t.left.cex=c-p+a,t.left.dex=p+i,t.right.cex=f+a,t.right.dex=c-f+i):p>c?(t.left.cex=a,t.left.dex=c+i,t.right.cex=f+a,t.right.dex=c-f+i):(t.left.cex=c-p+a,t.left.dex=p+i,t.right.cex=c+a,t.right.dex=i),t.cexRange=t.right.cex-t.left.cex,t.dexRange=t.right.dex-t.left.dex,l=t.left.dex+t.dexRange/2,u=t.left.cex+t.cexRange/2}}else r<a?l=Math.min(s,i+c+(a-r)):s<i?u=Math.min(r,a+c+(i-s)):(l=Math.min(s,i+c),u=Math.min(r,i+a+c-l));return[l,u,t]}var ko=function(e){g(m,e);var t,n,o,c,l,u,p=bo(m);function m(e){var t;i(this,m),h(v(t=p.call(this)),"page",void 0),h(v(t),"forms",void 0),h(v(t),"currentForm",void 0),h(v(t),"keyup",void 0),h(v(t),"cexConfigForm",void 0),h(v(t),"bots",void 0),h(v(t),"sortedBots",void 0),h(v(t),"cexes",void 0),h(v(t),"twoColumn",void 0),h(v(t),"runningMMDisplayElements",void 0),h(v(t),"removingCfg",void 0),t.bots={},t.sortedBots=[],t.cexes={};var n=t.page=Ne.idDescendants(e);Ne.cleanTemplates(n.botTmpl,n.botRowTmpl,n.exchangeRowTmpl),t.forms=new hr(n.forms),t.cexConfigForm=new Dr(n.cexConfigForm,(function(e,n){return t.cexConfigured(e,n)})),t.runningMMDisplayElements={orderReportForm:n.orderReportForm,dexBalancesRowTmpl:n.dexBalancesRowTmpl,placementRowTmpl:n.placementRowTmpl,placementAmtRowTmpl:n.placementAmtRowTmpl},Ne.cleanTemplates(n.dexBalancesRowTmpl,n.placementRowTmpl,n.placementAmtRowTmpl),Ne.bind(n.newBot,"click",(function(){t.newBot()})),Ne.bind(n.archivedLogsBtn,"click",(function(){ft().loadPage("mmarchives")})),Ne.bind(n.confirmRemoveConfigBttn,"click",(function(){t.removeCfg()})),t.twoColumn=window.innerWidth>=768,new ResizeObserver((function(){t.resized()})).observe(e);for(var r=function(){var e=a(s[o],2),r=e[0],i=e[1],c=n.exchangeRowTmpl.cloneNode(!0);n.cexRows.appendChild(c);var l=Ne.parseTemplate(c),u=function(){t.cexConfigForm.setCEX(r),t.forms.show(n.cexConfigForm)};Ne.bind(l.configureBttn,"click",u),Ne.bind(l.reconfigBttn,"click",u),Ne.bind(l.errConfigureBttn,"click",u);var d=t.cexes[r]={tr:c,tmpl:l,dinfo:i,cexName:r};t.updateCexRow(d)},o=0,s=Object.entries(Gn);o<s.length;o++)r();return t.setup(),t}return d(m,[{key:"resized",value:function(){var e=window.innerWidth>=768;if(e!==this.twoColumn){this.twoColumn=e,this.clearBotBoxes();var t,n=go(this.sortedBots);try{for(n.s();!(t=n.n()).done;){var r=t.value.div;this.appendBotBox(r)}}catch(e){n.e(e)}finally{n.f()}}}},{key:"setup",value:(u=s(f().mark((function e(){var t,n,a,o,s,i,c,l,u=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n=ft().mmStatus,a=n.bots.map((function(e){return e.config})),ft().registerNoteFeeder({runstats:function(e){u.handleRunStatsNote(e)},runevent:function(e){var t=u.bots[$n(e.host,e.baseID,e.quoteID)];if(t)return t.handleRunStats()},epochreport:function(e){var t=u.bots[$n(e.host,e.baseID,e.quoteID)];t&&t.handleEpochReportNote(e)},cexproblems:function(e){var t=u.bots[$n(e.host,e.baseID,e.quoteID)];t&&t.handleCexProblemsNote(e)},cexnote:function(e){u.handleCEXNote(e)}}),o=!a||0===a.length,Ne.setVis(o,t.noBots),!o){e.next=8;break}return e.abrupt("return");case 8:t.noBots.remove(),s=r(n.bots).sort((function(e,t){var n,r,a,o;return e.running&&!t.running?-1:t.running&&!e.running?1:e.running||t.running?(null!==(n=null===(r=t.runStats)||void 0===r?void 0:r.startTime)&&void 0!==n?n:0)-(null!==(a=null===(o=e.runStats)||void 0===o?void 0:o.startTime)&&void 0!==a?a:0):e.config.baseID+e.config.quoteID-(t.config.baseID+t.config.quoteID)})),i=go(s);try{for(i.s();!(c=i.n()).done;)l=c.value,this.addBot(l)}catch(e){i.e(e)}finally{i.f()}case 12:case"end":return e.stop()}}),e,this)}))),function(){return u.apply(this,arguments)})},{key:"handleCEXNote",value:(l=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.t0=t.topic,e.next="BalanceUpdate"===e.t0?3:4;break;case 3:return e.abrupt("return",this.handleCEXBalanceUpdate(t.cexName));case 4:case"end":return e.stop()}}),e,this)}))),function(e){return l.apply(this,arguments)})},{key:"handleCEXBalanceUpdate",value:(c=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:(n=this.cexes[t])&&this.updateCexRow(n);case 2:case"end":return e.stop()}}),e,this)}))),function(e){return c.apply(this,arguments)})},{key:"handleRunStatsNote",value:(o=s(f().mark((function e(t){var n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.baseID,r=t.quoteID,a=t.host,!(o=this.bots[$n(a,n,r)])){e.next=4;break}return e.abrupt("return",o.handleRunStats());case 4:this.addBot(ft().botStatus(a,n,r));case 5:case"end":return e.stop()}}),e,this)}))),function(e){return o.apply(this,arguments)})},{key:"unload",value:function(){Ne.unbind(document,"keyup",this.keyup)}},{key:"addBot",value:function(e){var t,n=this.page,r=this.bots,a=this.sortedBots,o=e.config,s=o.baseID,i=o.quoteID,c=o.host,l=[ft().assets[s].symbol,ft().assets[i].symbol],u=l[1],d="".concat(l[0],"_").concat(u);if(null!==(t=ft().exchanges[c])&&void 0!==t&&t.markets[d]){var h=new wo(this,this.runningMMDisplayElements,e);n.botRows.appendChild(h.row.tr),a.push(h),r[h.id]=h,this.appendBotBox(h.div)}}},{key:"confirmRemoveCfg",value:function(e){var t=this.page;this.removingCfg=e,Ne.hide(t.removeCfgErr);var n=ft().assets[e.baseID].unitInfo.conventional.unit,r=ft().assets[e.quoteID].unitInfo.conventional.unit;t.confirmRemoveCfgMsg.textContent=ke("DELETE_BOT",{host:e.host,baseTicker:n,quoteTicker:r}),this.forms.show(this.page.confirmRemoveForm)}},{key:"removeCfg",value:(n=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,this.removingCfg){e.next=4;break}return this.forms.close(),e.abrupt("return");case 4:return e.next=6,Xn.removeBotConfig(this.removingCfg.host,this.removingCfg.baseID,this.removingCfg.quoteID);case 6:if(n=e.sent,ft().checkResponse(n)){e.next=11;break}return t.removeCfgErr.textContent=ke(H,{msg:n.msg}),Ne.show(t.removeCfgErr),e.abrupt("return");case 11:return e.next=13,ft().fetchMMStatus();case 13:ft().loadPage("mm");case 14:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"appendBotBox",value:function(e){var t=this.page,n=t.boxZero,r=t.boxOne;(this.twoColumn&&(n.children.length+r.children.length)%2!=0?r:n).append(e)}},{key:"clearBotBoxes",value:function(){for(var e=this.page,t=e.boxOne,n=e.boxZero;n.children.length>1;)n.removeChild(n.lastChild);for(;t.children.length>0;)t.removeChild(t.lastChild)}},{key:"showBot",value:function(e){var t=this.sortedBots,n=t.findIndex((function(t){return t.id===e}));t.splice(n,1),t.unshift(this.bots[e]),this.clearBotBoxes();var r,a=go(t);try{for(a.s();!(r=a.n()).done;){var o=r.value.div;this.appendBotBox(o)}}catch(e){a.e(e)}finally{a.f()}var s=this.bots[e].div;Ne.animate(250,(function(e){s.style.opacity="".concat(e),s.style.transform="scale(".concat(.8+.2*e,")")}))}},{key:"newBot",value:function(){ft().loadPage("mmsettings")}},{key:"cexConfigured",value:(t=s(f().mark((function e(t,n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ft().fetchMMStatus();case 2:this.updateCexRow(this.cexes[t]),n&&this.forms.close();case 4:case"end":return e.stop()}}),e,this)}))),function(e,n){return t.apply(this,arguments)})},{key:"updateCexRow",value:function(e){var t=e.tmpl,n=e.dinfo,r=e.cexName;t.logo.src=n.logo,t.name.textContent=n.name;var o=ft().mmStatus.cexes[r];if(Ne.setVis(!o,t.unconfigured),Ne.setVis(o&&!o.connectErr,t.configured),Ne.setVis(null==o?void 0:o.connectErr,t.connectErrBox),null!=o&&o.connectErr&&(t.connectErr.textContent="connection error",t.connectErr.dataset.tooltip=o.connectErr),t.logo.classList.toggle("greyscale",!o),o){for(var s=0,i={},c=0,l=Object.entries(o.balances);c<l.length;c++){var u=a(l[c],2),d=u[0],h=u[1],p=parseInt(d),f=Ne.bipCEXSymbol(p);if(!i[f]){i[f]=!0;var v=ft().assets[p].unitInfo,m=ft().fiatRatesMap[p];m&&(s+=m*(h.available+h.locked)/v.conventional.conversionFactor)}}t.usdBalance.textContent=Ne.formatFourSigFigs(s)}}},{key:"percentageBalanceStr",value:function(e,t,n){var r=ft().assets[e],a=r.unitInfo,o=Ne.formatCoinValue(t*n/100,a);return"".concat(Ne.formatFourSigFigs(n),"% - ").concat(o," ").concat(r.symbol.toUpperCase())}},{key:"walletBalanceStr",value:function(e,t){var n=ft().assets[e].wallet.balance.available;return this.percentageBalanceStr(e,n,t)}}]),m}(lt),wo=function(e){g(c,e);var t,n,o=bo(c);function c(e,t,n){var r;i(this,c),h(v(r=o.call(this,n.config)),"pg",void 0),h(v(r),"div",void 0),h(v(r),"page",void 0),h(v(r),"placementsChart",void 0),h(v(r),"baseAllocSlider",void 0),h(v(r),"quoteAllocSlider",void 0),h(v(r),"row",void 0),h(v(r),"runDisplay",void 0),r.pg=e;var a=v(r),s=a.baseID,l=a.quoteID,u=a.host,d=a.botType,p=a.nBuyPlacements,f=a.nSellPlacements,m=a.cexName;r.id=$n(u,s,l);var g=r.div=e.page.botTmpl.cloneNode(!0),y=r.page=Ne.parseTemplate(g);r.runDisplay=new ar(y.onBox,e.forms,t,"mm"),Qn(g,s,l,u),m&&Yn(g,m),d===Hn?y.botTypeDisplay.textContent=ke(pe):d===zn?y.botTypeDisplay.textContent=ke(fe):d===jn&&(y.botTypeDisplay.textContent=ke(he)),Ne.setVis(d!==zn,y.placementsChartBox,y.baseTokenSwapFeesBox),d!==zn&&(r.placementsChart=new Zn(y.placementsChart),y.buyPlacementCount.textContent=String(p),y.sellPlacementCount.textContent=String(f)),Ne.bind(y.startBttn,"click",(function(){return r.start()})),Ne.bind(y.allocationBttn,"click",(function(){return r.allocate()})),Ne.bind(y.reconfigureBttn,"click",(function(){return r.reconfigure()})),Ne.bind(y.removeBttn,"click",(function(){return r.pg.confirmRemoveCfg(n.config)})),Ne.bind(y.goBackFromAllocation,"click",(function(){return r.hideAllocationDialog()})),Ne.bind(y.marketLink,"click",(function(){return ft().loadPage("markets",{host:u,baseID:s,quoteID:l})})),r.baseAllocSlider=new Ze(y.baseAllocSlider,(function(){})),r.quoteAllocSlider=new Ze(y.quoteAllocSlider,(function(){}));var b=e.page.botRowTmpl.cloneNode(!0);Qn(b,s,l,u);var x=Ne.parseTemplate(b);return r.row={tr:b,tmpl:x},Ne.bind(x.allocateBttn,"click",(function(t){t.stopPropagation(),r.allocate(),e.showBot(r.id)})),Ne.bind(b,"click",(function(){return e.showBot(r.id)})),r.initialize(),r}return d(c,[{key:"initialize",value:(n=s(f().mark((function e(){var t,n,a,o,s,i,l,u,d,h,p,v,m,g,y,x,k,w,C,S,F,T,D;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,mo(b(c.prototype),"initialize",this).call(this);case 2:this.runDisplay.setBotMarket(this),t=this.page,n=this.host,a=this.cexName,o=this.botType,s=this.div,i=this.cfg,l=i.arbMarketMakingConfig,u=i.basicMarketMakingConfig,d=this.mktID,h=this.baseFactor,p=this.quoteFactor,v=this.marketReport.baseFiatRate,o!==zn&&(m=[],g=[],y=0,l?(m=l.buyPlacements.map((function(e){return{lots:e.lots,gapFactor:e.multiplier}})),g=l.sellPlacements.map((function(e){return{lots:e.lots,gapFactor:e.multiplier}})),y=l.profit):u&&(m=u.buyPlacements,g=u.sellPlacements,m.length>0&&(x=m.reduce((function(e,t){return t.gapFactor<e.gapFactor?t:e}))),g.length>0&&(k=g.reduce((function(e,t){return t.gapFactor<e.gapFactor?t:e}))),x&&k?y=(x.gapFactor+k.gapFactor)/2:x?y=x.gapFactor:k&&(y=k.gapFactor)),w={cexName:a,botType:o,baseFiatRate:v,dict:{profit:y,buyPlacements:m,sellPlacements:g}},this.placementsChart.setMarket(w)),Ne.setVis(o!==jn,t.cexDataBox),o!==jn&&(C=ft().mmStatus.cexes[a])&&(S=C.markets?C.markets[d]:void 0,Ne.setVis(null==S?void 0:S.day,t.cexDataBox),null!=S&&S.day&&(F=S.day,t.cexPrice.textContent=Ne.formatFourSigFigs(F.lastPrice),t.cexVol.textContent=Ne.formatFourSigFigs(v*F.vol))),Ne.setVis.apply(Ne,[Boolean(a)].concat(r(Ne.applySelector(s,"[data-cex-show]")))),(T=ft().exchanges[n].markets[d].spot)&&(Ne.show(t.dexDataBox),D=Ft/h*p,t.dexPrice.textContent=Ne.formatFourSigFigs(T.rate/D),t.dexVol.textContent=Ne.formatFourSigFigs(T.vol24/h*v)),this.updateDisplay(),this.updateTableRow(),Ne.hide(t.loadingBg);case 13:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"updateTableRow",value:function(){var e=this.row.tmpl,t=this.status(),n=t.running,r=t.runStats;Ne.setVis(n,e.profitLossBox),Ne.setVis(!n,e.allocateBttnBox),r&&(e.profitLoss.textContent=Ne.formatFourSigFigs(r.profitLoss.profit,2))}},{key:"updateDisplay",value:function(){var e=this.page,t=this.marketReport;if([t.baseFiatRate,t.quoteFiatRate,this.baseFeeFiatRate,this.quoteFeeFiatRate].some((function(e){return!e})))return Ne.hide(e.onBox,e.offBox),void Ne.show(e.noFiatDisplay);var n=this.status().running;Ne.setVis(n,e.onBox),Ne.setVis(!n,e.offBox),n?this.updateRunningDisplay():this.updateIdleDisplay()}},{key:"updateRunningDisplay",value:function(){this.runDisplay.update()}},{key:"updateIdleDisplay",value:function(){var e=this.page,t=this.proj,n=t.alloc,r=t.qProj,a=t.bProj,o=this.baseID,s=this.quoteID,i=this.cexName,c=this.bui,l=this.qui,u=this.baseFeeID,d=this.quoteFeeID,h=this.baseFactor,p=this.quoteFactor,f=this.baseFeeFactor,v=this.quoteFeeFactor,m=this.marketReport,g=m.baseFiatRate,y=m.quoteFiatRate,b=this.cfg.uiConfig,x=b.baseConfig,k=b.quoteConfig,w=this.quoteFeeUI,C=this.baseFeeUI;e.baseAlloc.textContent=Ne.formatFullPrecision(n[o],c);var S=n[o]/h*g,F=S;if(e.baseAllocUSD.textContent=Ne.formatFourSigFigs(S),e.baseBookAlloc.textContent=Ne.formatFullPrecision(a.book*h,c),e.baseOrderReservesAlloc.textContent=Ne.formatFullPrecision(a.orderReserves*h,c),e.baseOrderReservesPct.textContent=String(Math.round(100*x.orderReservesFactor)),Ne.setVis(i,e.baseCexAllocBox),i&&(e.baseCexAlloc.textContent=Ne.formatFullPrecision(a.cex*h,c)),Ne.setVis(u===o,e.baseBookingFeesAllocBox),Ne.setVis(u!==o,e.baseTokenFeesAllocBox),u===o){var T=o===d?a.bookingFees+r.bookingFees:a.bookingFees;e.baseBookingFeesAlloc.textContent=Ne.formatFullPrecision(T*f,C)}else{var D=n[u];e.baseTokenFeeAlloc.textContent=Ne.formatFullPrecision(D,C);var I=D/f*ft().fiatRatesMap[u];F+=I,e.baseTokenAllocUSD.textContent=Ne.formatFourSigFigs(I);var A=u===d,R=a.bookingFees+(A?r.bookingFees:0);e.baseTokenBookingFees.textContent=Ne.formatFullPrecision(R*f,C),e.baseTokenSwapFeeN.textContent=String(x.swapFeeN+(A?k.swapFeeN:0));var E=a.swapFeeReserves+(A?r.swapFeeReserves:0);e.baseTokenSwapFees.textContent=Ne.formatFullPrecision(E*f,C)}e.quoteAlloc.textContent=Ne.formatFullPrecision(n[s],l);var B=n[s]/p*y;if(F+=B,e.quoteAllocUSD.textContent=Ne.formatFourSigFigs(B),e.quoteBookAlloc.textContent=Ne.formatFullPrecision(r.book*p,l),e.quoteOrderReservesAlloc.textContent=Ne.formatFullPrecision(r.orderReserves*p,l),e.quoteOrderReservesPct.textContent=String(Math.round(100*k.orderReservesFactor)),e.quoteSlippageAlloc.textContent=Ne.formatFullPrecision(r.slippageBuffer*p,l),e.slippageBufferFactor.textContent=String(Math.round(100*k.slippageBufferFactor)),Ne.setVis(i,e.quoteCexAllocBox),i&&(e.quoteCexAlloc.textContent=Ne.formatFullPrecision(r.cex*p,l)),Ne.setVis(s===d,e.quoteBookingFeesAllocBox),Ne.setVis(d!==s&&d!==u,e.quoteTokenFeesAllocBox),s===d){var P=s===u?a.bookingFees+r.bookingFees:r.bookingFees;e.quoteBookingFeesAlloc.textContent=Ne.formatFullPrecision(P*v,w)}else if(d!==u){e.quoteTokenFeeAlloc.textContent=Ne.formatFullPrecision(n[d],w);var L=n[d]/v*ft().fiatRatesMap[d];F+=L,e.quoteTokenAllocUSD.textContent=Ne.formatFourSigFigs(L),e.quoteTokenBookingFees.textContent=Ne.formatFullPrecision(r.bookingFees*v,w),e.quoteTokenSwapFeeN.textContent=String(k.swapFeeN),e.quoteTokenSwapFees.textContent=Ne.formatFullPrecision(r.swapFeeReserves*v,w)}e.totalAllocUSD.textContent=Ne.formatFourSigFigs(F)}},{key:"allocate",value:function(){var e,t,n,o,s,i=this,c=this.page,l=this.marketReport,u=l.baseFiatRate,d=l.quoteFiatRate,p=this.baseID,f=this.quoteID,v=this.baseFeeID,m=this.quoteFeeID,g=this.baseFeeFiatRate,y=this.quoteFeeFiatRate,b=this.cexName,x=this.baseFactor,k=this.quoteFactor,w=this.baseFeeFactor,C=this.quoteFeeFactor,S=this.host,F=this.mktID;if(b){var T=ft().mmStatus.cexes[b];if(!T||!T.connected)return c.offError.textContent=ke(ye,{cexName:b}),void Ne.showTemporarily(3e3,c.offError)}var D=this.fundingState(),I=a(xo(D.base),3),A=I[0],R=I[1],E=I[2],B=a(xo(D.quote),3),P=B[0],L=B[1],O=B[2],M=this.alloc={dex:(e={},h(e,p,A*x),h(e,f,P*k),e),cex:(t={},h(t,p,R*x),h(t,f,L*k),t)};M.dex[v]=Math.min((null!==(n=M.dex[v])&&void 0!==n?n:0)+D.base.fees.req*w,D.base.fees.avail*w),M.dex[m]=Math.min((null!==(o=M.dex[m])&&void 0!==o?o:0)+D.quote.fees.req*C,D.quote.fees.avail*C);var q=M.dex[p]/x*u+M.dex[f]/k*d;q+=M.cex[p]/x*u+M.cex[f]/k*d,v!==p&&(q+=M.dex[v]/w*g),m!==f&&m!==v&&(q+=M.dex[m]/C*y),c.allocUSD.textContent=Ne.formatFourSigFigs(q),Ne.setVis.apply(Ne,[b].concat(r(Ne.applySelector(c.allocationDialog,"[data-cex-only]")))),Ne.setVis(D.fundedAndBalanced,c.fundedAndBalancedBox),Ne.setVis(D.base.transferable+D.quote.transferable>0,c.hasTransferable),Ne.setVis(D.fundedAndNotBalanced,c.fundedAndNotBalancedBox),Ne.setVis(D.starved,c.starvedBox),c.startBttn.classList.toggle("go",D.fundedAndBalanced),c.startBttn.classList.toggle("warning",!D.fundedAndBalanced),c.proposedDexBaseAlloc.classList.toggle("text-warning",!(D.base.fundedAndBalanced||D.base.fundedAndNotBalanced)),c.proposedDexQuoteAlloc.classList.toggle("text-warning",!(D.quote.fundedAndBalanced||D.quote.fundedAndNotBalanced));var N=function(e,t){c.proposedDexBaseAlloc.textContent=Ne.formatFourSigFigs(e),c.proposedDexBaseAllocUSD.textContent=Ne.formatFourSigFigs(e*u),c.proposedCexBaseAlloc.textContent=Ne.formatFourSigFigs(t),c.proposedCexBaseAllocUSD.textContent=Ne.formatFourSigFigs(t*u)};if(N(A,R),Ne.setVis(E,c.baseAllocSlider),E){var W=E.right.dex-E.left.dex,V=E.right.cex-E.left.cex;this.baseAllocSlider.setValue(.5),this.baseAllocSlider.changed=function(e){var t=E.left.dex+e*W,n=E.left.cex+e*V;M.dex[p]=t*x,M.cex[p]=n*x,N(t,n)}}var U=function(e,t){c.proposedDexQuoteAlloc.textContent=Ne.formatFourSigFigs(e),c.proposedDexQuoteAllocUSD.textContent=Ne.formatFourSigFigs(e*d),c.proposedCexQuoteAlloc.textContent=Ne.formatFourSigFigs(t),c.proposedCexQuoteAllocUSD.textContent=Ne.formatFourSigFigs(t*d)};if(U(P,L),Ne.setVis(O,c.quoteAllocSlider),O){var _=O.right.dex-O.left.dex,j=O.right.cex-O.left.cex;this.quoteAllocSlider.setValue(.5),this.quoteAllocSlider.changed=function(e){var t=O.left.dex+e*_,n=O.left.cex+e*j;M.dex[f]=t*k,M.cex[f]=n*k,U(t,n)}}if(Ne.setVis.apply(Ne,[v!==p].concat(r(Ne.applySelector(c.allocationDialog,"[data-base-token-fees]")))),v!==p){var H=D.base.fees.req+(v===m?D.quote.fees.req:0),z=Math.min(H,D.base.fees.avail);c.proposedDexBaseFeeAlloc.textContent=Ne.formatFourSigFigs(z),c.proposedDexBaseFeeAllocUSD.textContent=Ne.formatFourSigFigs(z*g),c.proposedDexBaseFeeAlloc.classList.toggle("text-warning",!D.base.fees.funded)}var G=m!==f&&m!==v;if(Ne.setVis.apply(Ne,[G].concat(r(Ne.applySelector(c.allocationDialog,"[data-quote-token-fees]")))),G){var X=Math.min(D.quote.fees.req,D.quote.fees.avail);c.proposedDexQuoteFeeAlloc.textContent=Ne.formatFourSigFigs(X),c.proposedDexQuoteFeeAllocUSD.textContent=Ne.formatFourSigFigs(X*y),c.proposedDexQuoteFeeAlloc.classList.toggle("text-warning",!D.quote.fees.funded)}var K=null===(s=ft().exchanges[S])||void 0===s?void 0:s.markets[F],Q=!1;if(K&&K.orders)for(var Y=0;Y<K.orders.length;Y++)if(K.orders[Y].status<=2){Q=!0;break}Ne.setVis(Q,c.existingOrdersBox),Ne.show(c.allocationDialog),Ne.bind(document,"click",(function e(t){Ne.mouseInElement(t,c.allocationDialog)||(i.hideAllocationDialog(),Ne.unbind(document,"click",e))}))}},{key:"hideAllocationDialog",value:function(){Ne.hide(this.page.allocationDialog)}},{key:"start",value:(t=s(f().mark((function e(){var t,n,r,o,s,i,c,l,u,d,h,p,v,m,g,y,b,x;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,r=this.alloc,o=this.baseID,s=this.quoteID,i=this.host,c=this.cexName,l=this.cfg.uiConfig.cexRebalance,Ne.hide(n.errMsg),!c||null!==(t=ft().mmStatus.cexes[c])&&void 0!==t&&t.connected){e.next=6;break}return n.errMsg.textContent="".concat(c," not connected"),Ne.show(n.errMsg),e.abrupt("return");case 6:for(u=0,d=[r.dex,r.cex];u<d.length;u++)for(h=d[u],p=0,v=Object.entries(h);p<v.length;p++)m=a(v[p],2),g=m[0],y=m[1],h[parseInt(g)]=Math.round(y);return b={baseID:o,quoteID:s,host:i,alloc:r},c&&l&&(b.autoRebalance=this.autoRebalanceSettings()),e.prev=9,ft().log("mm","starting mm bot",b),e.next=13,Xn.startBot(b);case 13:if(x=e.sent,ft().checkResponse(x)){e.next=16;break}throw x;case 16:e.next=23;break;case 18:return e.prev=18,e.t0=e.catch(9),n.errMsg.textContent=ke(H,e.t0),Ne.show(n.errMsg),e.abrupt("return");case 23:this.hideAllocationDialog();case 24:case"end":return e.stop()}}),e,this,[[9,18]])}))),function(){return t.apply(this,arguments)})},{key:"autoRebalanceSettings",value:function(){var e=this.proj,t=e.bProj,n=e.qProj,r=e.alloc,a=this.baseFeeID,o=this.quoteFeeID,s=this.cfg.uiConfig,i=s.baseConfig,c=s.quoteConfig,l=this.baseID,u=this.quoteID,d=this.cexName,h=this.mktID,p=r[l],f=t.book;l===a&&(f+=t.bookingFees),l===o&&(f+=n.bookingFees);var v=n.book;u===o&&(v+=n.bookingFees),u===a&&(v+=t.bookingFees);var m=Math.max(p-f,p-t.cex),g=r[u],y=Math.max(g-v,g-n.cex);if(m<0||y<0)throw Error("rebalance math doesn't work: ".concat(JSON.stringify({bProj:t,qProj:n,maxBase:m,maxQuote:y})));var b=ft().mmStatus.cexes[d].markets[h],x=[b.baseMinWithdraw,Math.max(2*b.baseMinWithdraw,m)],k=x[0],w=x[1],C=Math.round(k+i.transferFactor*(w-k)),S=[b.quoteMinWithdraw,Math.max(2*b.quoteMinWithdraw,y)],F=S[0],T=S[1];return{minBaseTransfer:C,minQuoteTransfer:Math.round(F+c.transferFactor*(T-F))}}},{key:"reconfigure",value:function(){var e=this.host,t=this.baseID,n=this.quoteID,r=this.cexName,a=this.botType,o=this.page;if(r){var s=ft().mmStatus.cexes[r];if(!s||!s.connected)return o.offError.textContent=ke(ye,{cexName:r}),void Ne.showTemporarily(3e3,o.offError)}ft().loadPage("mmsettings",{host:e,baseID:t,quoteID:n,cexName:r,botType:a})}},{key:"handleEpochReportNote",value:function(e){this.runDisplay.handleEpochReportNote(e)}},{key:"handleCexProblemsNote",value:function(e){this.runDisplay.handleCexProblemsNote(e)}},{key:"handleRunStats",value:function(){this.updateDisplay(),this.updateTableRow(),this.runDisplay.readBook()}}]),c}(rr);function Co(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function So(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Co(Object(n),!0).forEach((function(t){h(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Co(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Fo(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return To(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?To(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function To(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var Do="lastMMSpecs",Io="lastBots",Ao="lastArbExchange",Ro="arbmm",Eo=.001,Bo=.099,Po=.001,Lo=.0199,Oo={gapStrategy:_n,sellPlacements:[],buyPlacements:[],driftTolerance:.002,profit:.02,orderPersistence:20,cexRebalance:!0,simpleArbLots:1},Mo={swapFeeN:50,orderReservesFactor:1,slippageBufferFactor:.05,transferFactor:.1},qo=function(e){g(D,e);var t,n,o,l,u,p,m,x,w,C,S,F,T=(S=D,F=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(S);if(F){var n=b(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return y(this,e)});function D(e,t){var n;i(this,D),h(v(n=T.call(this)),"page",void 0),h(v(n),"forms",void 0),h(v(n),"opts",void 0),h(v(n),"newWalletForm",void 0),h(v(n),"approveTokenForm",void 0),h(v(n),"walletAddrForm",void 0),h(v(n),"cexConfigForm",void 0),h(v(n),"currentMarket",void 0),h(v(n),"originalConfig",void 0),h(v(n),"updatedConfig",void 0),h(v(n),"creatingNewBot",void 0),h(v(n),"marketReport",void 0),h(v(n),"qcProfit",void 0),h(v(n),"qcProfitSlider",void 0),h(v(n),"qcLevelSpacing",void 0),h(v(n),"qcLevelSpacingSlider",void 0),h(v(n),"qcMatchBuffer",void 0),h(v(n),"qcMatchBufferSlider",void 0),h(v(n),"qcLevelsPerSide",void 0),h(v(n),"qcLotsPerLevel",void 0),h(v(n),"qcUSDPerSide",void 0),h(v(n),"cexBaseBalance",void 0),h(v(n),"cexQuoteBalance",void 0),h(v(n),"specs",void 0),h(v(n),"mktID",void 0),h(v(n),"formSpecs",void 0),h(v(n),"formCexes",void 0),h(v(n),"placementsCache",void 0),h(v(n),"botTypeSelectors",void 0),h(v(n),"marketRows",void 0),h(v(n),"lotsPerLevelIncrement",void 0),h(v(n),"placementsChart",void 0),h(v(n),"basePane",void 0),h(v(n),"quotePane",void 0),h(v(n),"driftTolerance",void 0),h(v(n),"driftToleranceSlider",void 0),h(v(n),"orderPersistence",void 0),h(v(n),"orderPersistenceSlider",void 0),n.placementsCache={},n.opts={};var r=n.page=Ne.idDescendants(e);n.forms=new hr(r.forms,{closed:function(){var e,t;null!==(e=n.specs)&&void 0!==e&&e.host&&null!==(t=n.specs)&&void 0!==t&&t.botType||ft().loadPage("mm")}}),n.placementsChart=new Zn(r.placementsChart),n.approveTokenForm=new Tr(r.approveTokenForm,(function(){n.submitBotType()})),n.walletAddrForm=new Cr(r.walletAddrForm),n.cexConfigForm=new Dr(r.cexConfigForm,(function(e){return n.cexConfigured(e)})),r.quotePane=r.basePane.cloneNode(!0),r.assetPaneBox.appendChild(r.quotePane),n.basePane=new Uo(v(n),r.basePane),n.quotePane=new Uo(v(n),r.quotePane),ft().headerSpace.appendChild(r.mmTitle),mt(r),Ne.cleanTemplates(r.orderOptTmpl,r.booleanOptTmpl,r.rangeOptTmpl,r.placementRowTmpl,r.oracleTmpl,r.cexOptTmpl,r.arbBttnTmpl,r.marketRowTmpl,r.needRegTmpl),r.basePane.removeAttribute("id"),Ne.bind(r.resetButton,"click",(function(){n.setOriginalValues()})),Ne.bind(r.updateButton,"click",(function(){n.saveSettings()})),Ne.bind(r.createButton,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.saveSettings();case 1:case"end":return e.stop()}}),e)})))),Ne.bind(r.deleteBttn,"click",(function(){n.delete()})),Br(r.botTypeForm,r.botTypeSubmit,(function(){n.submitBotType()})),Ne.bind(r.noMarketBttn,"click",(function(){n.showMarketSelectForm()})),Ne.bind(r.botTypeHeader,"click",(function(){n.reshowBotTypeForm()})),Ne.bind(r.botTypeChangeMarket,"click",(function(){n.showMarketSelectForm()})),Ne.bind(r.marketHeader,"click",(function(){n.showMarketSelectForm()})),Ne.bind(r.marketFilterInput,"input",(function(){n.sortMarketRows()})),Ne.bind(r.cexRebalanceCheckbox,"change",(function(){n.autoRebalanceChanged()})),Ne.bind(r.switchToAdvanced,"click",(function(){n.showAdvancedConfig()})),Ne.bind(r.switchToQuickConfig,"click",(function(){n.switchToQuickConfig()})),Ne.bind(r.qcMatchBuffer,"change",(function(){n.matchBufferChanged()})),Ne.bind(r.switchToUSDPerSide,"click",(function(){n.changeSideCommitmentDialog()})),Ne.bind(r.switchToLotsPerLevel,"click",(function(){n.changeSideCommitmentDialog()})),Ne.bind(r.gapStrategySelect,"change",(function(){if(r.gapStrategySelect.value){var e=r.gapStrategySelect.value;n.clearPlacements(n.updatedConfig.gapStrategy),n.loadCachedPlacements(e),n.updatedConfig.gapStrategy=e,n.setGapFactorLabels(e),n.updateModifiedMarkers()}})),Ne.bind(r.addBuyPlacementBtn,"click",(function(){n.addPlacement(!0,null),r.addBuyPlacementLots.value="",r.addBuyPlacementGapFactor.value="",n.updateModifiedMarkers(),n.placementsChart.render(),n.updateAllocations()})),Ne.bind(r.addSellPlacementBtn,"click",(function(){n.addPlacement(!1,null),r.addSellPlacementLots.value="",r.addSellPlacementGapFactor.value="",n.updateModifiedMarkers(),n.placementsChart.render(),n.updateAllocations()})),n.driftTolerance=new Ye(r.driftToleranceInput,{prec:3,sigFigs:!0,min:0,changed:function(e){var t=a(et(e/100,5),1)[0];n.driftToleranceSlider.setValue((t-0)/.02),n.updatedConfig.driftTolerance=t}}),n.driftToleranceSlider=new Ze(r.driftToleranceSlider,(function(e){var t=a(et(0+.02*e,5),1)[0];n.updatedConfig.driftTolerance=t,n.driftTolerance.setValue(100*t)})),n.orderPersistence=new Ye(r.orderPersistence,{changed:function(e){n.updatedConfig.orderPersistence=e,n.orderPersistenceSlider.setValue((e-0)/40)}}),n.orderPersistenceSlider=new Ze(r.orderPersistenceSlider,(function(e){var t=a($e(0+40*e,0),1)[0];n.updatedConfig.orderPersistence=t,n.orderPersistence.setValue(t)})),n.qcProfit=new Ye(r.qcProfit,{prec:1,sigFigs:!0,min:.1,changed:function(e){var t=e/100;n.updatedConfig.profit=t,r.profitInput.value=n.qcProfit.input.value,n.qcProfitSlider.setValue((t-.001)/.099),n.quickConfigUpdated()}}),n.qcProfitSlider=new Ze(r.qcProfitSlider,(function(e){var t=a(et(100*(Eo+e*Bo),3),1)[0];n.updatedConfig.profit=t/100,n.qcProfit.setValue(t),r.profitInput.value=n.qcProfit.input.value,n.quickConfigUpdated()})),n.qcLevelSpacing=new Ye(r.qcLevelSpacing,{prec:1,sigFigs:!0,min:.1,changed:function(e){var t=Lo;n.qcLevelSpacingSlider.setValue((e/100-.001)/t),n.quickConfigUpdated()}}),n.qcLevelSpacingSlider=new Ze(r.qcLevelSpacingSlider,(function(e){var t=Lo;n.qcLevelSpacing.setValue(.001+e*t*100),n.quickConfigUpdated()})),n.qcMatchBuffer=new Ye(r.qcMatchBuffer,{prec:1,sigFigs:!0,min:0,changed:function(e){n.qcMatchBufferSlider.setValue((e/100-0)/1),n.quickConfigUpdated()}}),n.qcMatchBufferSlider=new Ze(r.qcMatchBufferSlider,(function(e){n.qcMatchBuffer.setValue(0+1*e*100),n.quickConfigUpdated()})),n.qcLevelsPerSide=new Je(r.qcLevelsPerSide,{prec:0,min:1,inc:1,changed:function(e){n.qcUSDPerSide.setValue(n.lotSizeUSD()*e*n.qcLotsPerLevel.value()),n.quickConfigUpdated()}}),n.qcLotsPerLevel=new Je(r.qcLotsPerLevel,{prec:0,min:1,inc:1,changed:function(e){n.qcUSDPerSide.setValue(n.lotSizeUSD()*e*n.qcLevelsPerSide.value()),r.qcUSDPerSideEcho.textContent=n.qcUSDPerSide.input.value,n.quickConfigUpdated()},set:function(e){var t=a(et(e*n.qcLevelsPerSide.value()*n.lotSizeUSD(),2),2)[1];r.qcUSDPerSideEcho.textContent=t,r.qcLotsPerLevelEcho.textContent=t}}),n.qcUSDPerSide=new Je(r.qcUSDPerSide,{prec:2,min:1,inc:1,changed:function(e){n.qcLotsPerLevel.setValue(e/n.qcLevelsPerSide.value()/n.lotSizeUSD()),r.qcLotsPerLevelEcho.textContent=n.qcLotsPerLevel.input.value,n.quickConfigUpdated()},set:function(e,t){r.qcUSDPerSideEcho.textContent=t,r.qcLotsPerLevelEcho.textContent=String(Math.round(e/n.lotSizeUSD()))}});var o=function(e){"Enter"===e.key&&(isNaN(parseFloat(r.addBuyPlacementGapFactor.value||""))||isNaN(parseFloat(r.addBuyPlacementLots.value||""))||r.addBuyPlacementBtn.click())};Ne.bind(r.addBuyPlacementGapFactor,"keyup",(function(e){o(e)})),Ne.bind(r.addBuyPlacementLots,"keyup",(function(e){o(e)}));var c=function(e){"Enter"===e.key&&(isNaN(parseFloat(r.addSellPlacementGapFactor.value||""))||isNaN(parseFloat(r.addSellPlacementLots.value||""))||r.addSellPlacementBtn.click())};Ne.bind(r.addSellPlacementGapFactor,"keyup",(function(e){c(e)})),Ne.bind(r.addSellPlacementLots,"keyup",(function(e){c(e)})),Ne.bind(r.profitInput,"change",(function(){Ne.hide(r.profitInputErr);var e=function(e){Ne.show(r.profitInputErr),r.profitInputErr.textContent=ke(e)},t=parseFloat(r.profitInput.value||"")/100;return isNaN(t)?e(ue):0===t?e(de):(n.updatedConfig.profit=t,void n.updateModifiedMarkers())})),n.botTypeSelectors=Ne.applySelector(r.botTypeForm,"[data-bot-type]");var l,u=Fo(n.botTypeSelectors);try{var d=function(){var e=l.value;Ne.bind(e,"click",(function(){e.classList.contains("disabled")||(Ne.hide(r.botTypeErr),r.cexSelection.classList.toggle("disabled",e.dataset.botType===jn),n.setBotTypeSelected(e.dataset.botType))}))};for(u.s();!(l=u.n()).done;)d()}catch(e){u.e(e)}finally{u.f()}return n.newWalletForm=new pr(r.newWalletForm,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ft().fetchUser();case 2:n.submitBotType();case 3:case"end":return e.stop()}}),e)})))),ft().registerNoteFeeder({balance:function(e){n.handleBalanceNote(e)}}),n.initialize(t),n}return d(D,[{key:"unload",value:function(){this.forms.exit()}},{key:"initialize",value:(C=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.setupCEXes(),this.initializeMarketRows(),t&&0===Object.keys(t).length&&(t=k.fetchLocal(Do)),t&&ft().walletMap[t.baseID]&&ft().walletMap[t.quoteID]){e.next=7;break}return this.showMarketSelectForm(),e.abrupt("return");case 7:return t&&!t.botType&&(r=er(t.host,t.baseID,t.quoteID),t.cexName=null!==(n=null==r?void 0:r.cexName)&&void 0!==n?n:"",t.botType=jn,null!=r&&r.arbMarketMakingConfig?t.botType=Hn:null!=r&&r.simpleArbConfig&&(t.botType=zn)),this.specs=t,e.next=11,this.fetchCEXBalances(t);case 11:this.configureUI();case 12:case"end":return e.stop()}}),e,this)}))),function(e){return C.apply(this,arguments)})},{key:"configureUI",value:(w=s(f().mark((function e(){var t,n,o,s,i,c,l,u,d,h,p,v,m,g,y,b,x,w,C,S,F,T,D,I,A,R,E,B,P,L,O,M,q,N,W,V,U,_,j,H,z;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(c=this.page,l=this.specs,u=l.host,d=l.baseID,h=l.quoteID,p=l.cexName,v=l.botType,m=[ft().assets[d],ft().assets[h]],y=(g=m[0]).symbol,b=g.token,w=(x=m[1]).symbol,C=x.token,this.mktID="".concat(y,"_").concat(w),Ne.hide(c.botSettingsContainer,c.marketBox,c.updateButton,c.resetButton,c.createButton,c.noMarket,c.missingFiatRates),![d,h,null!==(t=null==b?void 0:b.parentID)&&void 0!==t?t:d,null!==(n=null==C?void 0:C.parentID)&&void 0!==n?n:h].some((function(e){return!ft().fiatRatesMap[e]}))){e.next=8;break}return Ne.show(c.missingFiatRates),e.abrupt("return");case 8:if(Ne.show(c.marketLoading),k.storeLocal(Do,l),S=ft().mmStatus,F=No(l,S),(T=er(u,d,h))&&(T.arbMarketMakingConfig?Hn:T.basicMarketMakingConfig?jn:zn)!==v&&(T=void 0),Ne.setVis(T,c.deleteBttnBox),D=this.originalConfig=Object.assign({},Oo,{disabled:F,baseOptions:this.defaultWalletOptions(d),quoteOptions:this.defaultWalletOptions(h),buyPlacements:[],sellPlacements:[],baseConfig:Object.assign({},Mo),quoteConfig:Object.assign({},Mo)}),T){for(A=(I=T).basicMarketMakingConfig,R=I.arbMarketMakingConfig,E=I.simpleArbConfig,B=I.uiConfig.cexRebalance,this.creatingNewBot=!1,P=D,L=0,O=Object.entries(T);L<O.length;L++)M=a(O[L],2),q=M[0],N=M[1],void 0!==P[q]&&(P[q]=N);D.baseConfig=Object.assign({},Mo,T.uiConfig.baseConfig),D.quoteConfig=Object.assign({},Mo,T.uiConfig.quoteConfig),D.baseOptions=T.baseWalletOptions||{},D.quoteOptions=T.quoteWalletOptions||{},D.cexRebalance=B,A?(D.buyPlacements=A.buyPlacements,D.sellPlacements=A.sellPlacements,D.driftTolerance=A.driftTolerance,D.gapStrategy=A.gapStrategy):R?(W=R.buyPlacements,V=R.sellPlacements,D.buyPlacements=Array.from(W,(function(e){return{lots:e.lots,gapFactor:e.multiplier}})),D.sellPlacements=Array.from(V,(function(e){return{lots:e.lots,gapFactor:e.multiplier}})),D.profit=R.profit,D.driftTolerance=R.driftTolerance,D.orderPersistence=R.orderPersistence):E&&(D.profit=E.profitTrigger,D.orderPersistence=E.numEpochsLeaveOpen,D.simpleArbLots=null!==(U=T.uiConfig.simpleArbLots)&&void 0!==U?U:1),Ne.setVis(!F,c.updateButton,c.resetButton)}else this.creatingNewBot=!0,Ne.setVis(!F,c.createButton);this.updatedConfig=JSON.parse(JSON.stringify(D)),e.t0=v,e.next=e.t0===jn?21:e.t0===Hn?23:e.t0===zn?25:26;break;case 21:return c.botTypeDisplay.textContent=ke(he),e.abrupt("break",26);case 23:return c.botTypeDisplay.textContent=ke(pe),e.abrupt("break",26);case 25:c.botTypeDisplay.textContent=ke(fe);case 26:return Qn(document.body,d,h,u),Ne.setVis(v!==zn,c.driftToleranceBox,c.switchToAdvanced),Ne.setVis.apply(Ne,[Boolean(p)].concat(r(Ne.applySelector(document.body,"[data-cex-show]")))),Ne.setVis(F,c.viewOnlyRunning),Ne.setVis(p,c.cexRebalanceSettings),p&&Yn(document.body,p),e.next=34,this.fetchMarketReport();case 34:_=this.lotSizeUSD(),this.lotsPerLevelIncrement=Math.round(Math.max(1,100/_)),this.qcLotsPerLevel.inc=this.lotsPerLevelIncrement,this.qcUSDPerSide.inc=this.lotsPerLevelIncrement*_,this.qcUSDPerSide.min=_,this.basePane.setAsset(d,!1),this.quotePane.setAsset(h,!0),j=this.marketReport.baseFiatRate,this.placementsChart.setMarket({cexName:p,botType:v,baseFiatRate:j,dict:this.updatedConfig}),H=!T||this.isQuickPlacements(this.updatedConfig.buyPlacements,this.updatedConfig.sellPlacements),z=null!==(o=null===(s=T)||void 0===s||null===(i=s.basicMarketMakingConfig)||void 0===i?void 0:i.gapStrategy)&&void 0!==o?o:_n,c.gapStrategySelect.value=z,v===zn||H&&z===_n?this.showQuickConfig():this.showAdvancedConfig(),this.setOriginalValues(),Ne.hide(c.marketLoading),Ne.show(c.botSettingsContainer,c.marketBox);case 50:case"end":return e.stop()}}),e,this)}))),function(){return w.apply(this,arguments)})},{key:"initializeMarketRows",value:function(){var e=this;this.marketRows=[],Ne.empty(this.page.marketSelect);for(var t=function(){var t=r[n],o=t.host,s=t.markets,i=t.assets,c=t.auth;if(c.effectiveTier+c.pendingStrength===0){var l=e.page,u=l.needRegTmpl,d=l.needRegBox,h=u.cloneNode(!0),p=Ne.parseTemplate(h);return Ne.bind(h,"click",(function(){ft().loadPage("register",{host:o,backTo:"mmsettings"})})),p.host.textContent=o,d.appendChild(h),Ne.show(d),"continue"}for(var f=function(){var t=m[v],n=t.name,r=t.baseid,s=t.quoteid,c=t.spot,l=t.basesymbol,u=t.quotesymbol;if(!ft().assets[r]||!ft().assets[s])return"continue";var d=e.page.marketRowTmpl.cloneNode(!0),h=Ne.parseTemplate(d),p={tr:d,tmpl:h,host:o,name:n,baseID:r,quoteID:s,spot:c,arbs:[]};e.marketRows.push(p),e.page.marketSelect.appendChild(d),h.baseIcon.src=Ne.logoPath(l),h.quoteIcon.src=Ne.logoPath(u),h.baseSymbol.appendChild(Ne.symbolize(i[r],!0)),h.quoteSymbol.appendChild(Ne.symbolize(i[s],!0)),h.host.textContent=o;for(var f=e.cexMarketSupportFilter(r,s),g=0,y=Object.entries(Gn);g<y.length;g++){var b=a(y[g],2),x=b[0],k=b[1];if(f(x)){var w=e.page.arbBttnTmpl.cloneNode(!0);w.src=k.logo,h.arbs.appendChild(w),p.arbs.push(x)}}Ne.bind(d,"click",(function(){e.showBotTypeForm(o,r,s)}))},v=0,m=Object.values(s);v<m.length;v++)f()},n=0,r=Object.values(ft().exchanges);n<r.length;n++)t();if(0===this.marketRows.length){var o=this.page,s=o.marketSelectionTable,i=o.marketFilterBox,c=o.noMarkets;Ne.hide(s,i),Ne.show(c)}else Ne.hide(this.page.noMarkets);var l=ft().fiatRatesMap;this.marketRows.sort((function(e,t){var n,r,a,o,s=null!==(n=null===(r=e.spot)||void 0===r?void 0:r.vol24)&&void 0!==n?n:0,i=null!==(a=null===(o=t.spot)||void 0===o?void 0:o.vol24)&&void 0!==a?a:0;return l[e.baseID]&&l[t.baseID]&&(s*=l[e.baseID],i*=l[t.baseID]),i-s}))}},{key:"runningBotInventory",value:function(e){return Kn(e)}},{key:"adjustedBalances",value:function(e,t){var n=this.cexBaseBalance,r=this.cexQuoteBalance,a=[this.runningBotInventory(e.assetID),this.runningBotInventory(t.assetID)],o=a[0],s=a[1],i=((null==n?void 0:n.available)||0)-o.cex.total,c=((null==r?void 0:r.available)||0)-s.cex.total,l=e.balance.available-o.dex.total,u=t.balance.available-s.dex.total;return{baseAvail:l+i,quoteAvail:u+c,dexBaseAvail:l,dexQuoteAvail:u,cexBaseAvail:i,cexQuoteAvail:c}}},{key:"lotSizeUSD",value:function(){var e=this.specs,t=e.host,n=e.baseID,r=this.mktID,a=this.marketReport.baseFiatRate;return ft().exchanges[t].markets[r].lotsize/ft().assets[n].unitInfo.conventional.conversionFactor*a}},{key:"marketStuff",value:function(){var e=this.page,t=this.specs,n=t.host,r=t.baseID,a=t.quoteID,o=t.cexName,s=t.botType,i=this.basePane,c=this.quotePane,l=this.marketReport,u=l.baseFiatRate,d=l.quoteFiatRate,h=l.baseFees,p=l.quoteFees,f=this.lotsPerLevelIncrement,v=this.updatedConfig,m=this.originalConfig,g=this.mktID,y=ft().assets[r],b=y.symbol,x=y.unitInfo,k=ft().assets[a],w=k.symbol,C=k.unitInfo,S=ft().exchanges[n],F=S.markets[g],T=F.lotsize,D=F.spot,I=T/x.conventional.conversionFactor*u,A=1/x.conventional.conversionFactor*u/d*C.conventional.conversionFactor,R={conv:d/u,atomic:A,msg:Math.round(A*Ft),spot:D},E=[v.simpleArbLots,v.simpleArbLots],B=E[0],P=E[1];s!==zn&&(B=this.updatedConfig.sellPlacements.reduce((function(e,t){return e+t.lots}),0),P=this.updatedConfig.buyPlacements.reduce((function(e,t){return e+t.lots}),0));var L=Jn(T,r,a,D),O=this.walletStuff(),M=ir(r,a,h,p,T,B,P,O.baseFeeAssetID,O.quoteFeeAssetID,O.baseIsAccountLocker,O.quoteIsAccountLocker,v.baseConfig.orderReservesFactor,v.quoteConfig.orderReservesFactor);return So({page:e,cfg:v,oldCfg:m,host:n,xc:S,baseID:r,quoteID:a,botType:s,cexName:o,baseFiatRate:u,quoteFiatRate:d,xcRate:R,baseSymbol:b,quoteSymbol:w,mktID:g,lotSize:T,lotSizeUSD:I,lotsPerLevelIncrement:f,quoteLot:L,commit:M.commit,basePane:i,quotePane:c,fees:M.fees},O)}},{key:"walletStuff",value:function(){var e=this.specs,t=e.baseID,n=e.quoteID,r=[ft().walletMap[t],ft().walletMap[n]],a=r[0],o=r[1],s=[ft().assets[t],ft().assets[n]],i=s[0],c=i.token,l=i.unitInfo,u=s[1],d=u.token,h=u.unitInfo,p=c?c.parentID:t,f=d?d.parentID:n,v=[ft().assets[p].unitInfo,ft().assets[f].unitInfo];return So({baseWallet:a,quoteWallet:o,baseFeeUI:v[0],quoteFeeUI:v[1],baseToken:c,quoteToken:d,bui:l,qui:h,baseFeeAssetID:p,quoteFeeAssetID:f,baseIsAccountLocker:(16384&a.traits)>0,quoteIsAccountLocker:(16384&o.traits)>0},this.adjustedBalances(a,o))}},{key:"showAdvancedConfig",value:function(){var e=this.page;Ne.show(e.advancedConfig),Ne.hide(e.quickConfig),this.placementsChart.render()}},{key:"isQuickPlacements",value:function(e,t){if(0===e.length||e.length!==t.length)return!1;for(var n=0;n<e.length;n++){if(e[n].gapFactor!==t[n].gapFactor)return!1;if(e[n].lots!==t[n].lots)return!1}return!0}},{key:"switchToQuickConfig",value:function(){var e=this.marketStuff(),t=e.cfg,n=e.botType,r=e.lotSizeUSD,a=t.buyPlacements,o=t.sellPlacements;if(a.length>0&&o.length>0){var s=a.reduce((function(e,t){return t.gapFactor<e.gapFactor?t:e})),i=o.reduce((function(e,t){return t.gapFactor<e.gapFactor?t:e})),c=a.length+o.length,l=Math.max(1,Math.floor(c/2));if(n===jn){t.profit=(s.gapFactor+i.gapFactor)/2;var u=a.reduce((function(e,t){return t.gapFactor>e.gapFactor?t:e})),d=o.reduce((function(e,t){return t.gapFactor>e.gapFactor?t:e})),h=(u.gapFactor-s.gapFactor+(d.gapFactor-i.gapFactor))/2/(l-1);this.qcProfit.setValue(100*t.profit),this.qcProfitSlider.setValue((t.profit-Eo)/Bo),this.qcLevelSpacing.setValue(100*h),this.qcLevelSpacingSlider.setValue((h-Po)/Lo)}else if(n===Hn){var p=(a.reduce((function(e,t){return e+t.gapFactor}),0)+o.reduce((function(e,t){return e+t.gapFactor}),0))/c-1||0;this.qcMatchBuffer.setValue(100*p),this.qcMatchBufferSlider.setValue((p-0)/1)}var f=a.reduce((function(e,t){return e+t.lots}),0)+o.reduce((function(e,t){return e+t.lots}),0),v=Math.max(1,Math.round(f/2/l));this.qcLotsPerLevel.setValue(v),this.qcUSDPerSide.setValue(v*l*r),this.qcLevelsPerSide.setValue(l)}else n===zn&&this.qcLotsPerLevel.setValue(t.simpleArbLots);this.showQuickConfig(),this.quickConfigUpdated()}},{key:"showQuickConfig",value:function(){var e=this.marketStuff(),t=e.page,n=e.lotSizeUSD,r=e.botType,a=e.lotsPerLevelIncrement;this.qcLevelsPerSide.input.value||(this.qcLevelsPerSide.setValue(1),this.qcUSDPerSide.setValue(1*(this.qcLotsPerLevel.value()||a)*n)),this.qcLotsPerLevel.input.value||(this.qcLotsPerLevel.setValue(a),this.qcUSDPerSide.setValue(n*a*this.qcLevelsPerSide.value())),t.qcLevelSpacing.value||(this.qcLevelSpacing.setValue(.5),this.qcLevelSpacingSlider.setValue(.20100502512562812)),t.qcMatchBuffer.value||(t.qcMatchBuffer.value=String(0)),Ne.hide(t.advancedConfig),Ne.show(t.quickConfig),this.showInputsForBot(r)}},{key:"showInputsForBot",value:function(e){var t=this.page,n=this.opts.usingUSDPerSide;switch(Ne.hide(t.matchMultiplierBox,t.placementsChartBox,t.placementChartLegend,t.lotsPerLevelLabel,t.levelSpacingBox,t.arbLotsLabel,t.qcLevelPerSideBox),Ne.setVis(n,t.qcUSDPerSideBox),Ne.setVis(!n,t.qcLotsBox),e){case Hn:Ne.show(t.qcLevelPerSideBox,t.matchMultiplierBox,t.placementsChartBox,t.placementChartLegend,t.lotsPerLevelLabel);break;case jn:Ne.show(t.qcLevelPerSideBox,t.levelSpacingBox,t.placementsChartBox,t.lotsPerLevelLabel);break;case zn:Ne.show(t.arbLotsLabel)}}},{key:"quickConfigUpdated",value:function(){var e,t,n,r=this.marketStuff(),a=r.page,o=r.cfg,s=r.botType,i=r.cexName;Ne.hide(a.qcError);var c=function(e){a.qcError.textContent=e,Ne.show(a.qcError)},l=s===zn?1:this.qcLevelsPerSide.value();isNaN(l)&&c("invalid value for levels per side");var u=this.qcLotsPerLevel.value();isNaN(u)&&c("invalid value for lots per level");var d=parseFloat(null!==(e=a.qcProfit.value)&&void 0!==e?e:"")/100;isNaN(d)&&c("invalid value for profit");var h=s===jn?parseFloat(null!==(t=a.qcLevelSpacing.value)&&void 0!==t?t:"")/100:0;isNaN(h)&&c("invalid value for level spacing");var p=s===Hn?parseFloat(null!==(n=a.qcMatchBuffer.value)&&void 0!==n?n:"")/100:0;isNaN(p)&&c("invalid value for match buffer");var f=p+1,v=1===l;if(a.levelSpacingBox.classList.toggle("disabled",v),a.qcLevelSpacing.disabled=v,o.simpleArbLots=u,s!==zn){this.clearPlacements(i?Ro:o.gapStrategy);for(var m=0;m<l;m++){var g={lots:u};g.gapFactor=s===jn?d+h*m:f,o.buyPlacements.push(g),o.sellPlacements.push(g),this.addPlacement(!0,g),this.addPlacement(!1,g)}this.placementsChart.render()}this.updateAllocations()}},{key:"updateAllocations",value:function(){this.updateBaseAllocations(),this.updateQuoteAllocations()}},{key:"updateBaseAllocations",value:function(){var e=this.marketStuff(),t=e.commit,n=e.lotSize,r=e.basePane,a=e.fees;r.updateInventory(t.dex.base.lots,t.dex.quote.lots,n,t.dex.base.val,t.cex.base.val,a.base),r.updateCommitTotal()}},{key:"updateQuoteAllocations",value:function(){var e=this.marketStuff(),t=e.commit,n=e.quoteLot,r=e.quotePane,a=e.fees;r.updateInventory(t.dex.quote.lots,t.dex.base.lots,n,t.dex.quote.val,t.cex.quote.val,a.quote),r.updateCommitTotal()}},{key:"matchBufferChanged",value:function(){var e,t=this.page;t.qcMatchBuffer.value=Math.max(0,parseFloat(null!==(e=t.qcMatchBuffer.value)&&void 0!==e?e:"")||0).toFixed(2),this.quickConfigUpdated()}},{key:"showAddress",value:function(e){this.walletAddrForm.setAsset(e),this.forms.show(this.page.walletAddrForm)}},{key:"changeSideCommitmentDialog",value:function(){var e=this.page,t=this.opts;t.usingUSDPerSide=!t.usingUSDPerSide,Ne.setVis(t.usingUSDPerSide,e.qcUSDPerSideBox),Ne.setVis(!t.usingUSDPerSide,e.qcLotsBox)}},{key:"showBotTypeForm",value:(x=s(f().mark((function e(t,n,r,a,o){var s,i,c,l,u,d,h,p,v,m,g,y,b,x,w,C,S,F,T,D,I,A,R,E,B,P,L,O;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(s=this.page,this.formSpecs={host:t,baseID:n,quoteID:r,botType:""},!No(this.formSpecs,ft().mmStatus)){e.next=21;break}i=er(t,n,r),c=this.specs=this.formSpecs,e.t0=!0,e.next=e.t0===Boolean(null==i?void 0:i.simpleArbConfig)?9:e.t0===Boolean(null==i?void 0:i.arbMarketMakingConfig)?11:13;break;case 9:return c.botType=zn,e.abrupt("break",14);case 11:return c.botType=Hn,e.abrupt("break",14);case 13:c.botType=jn;case 14:return c.cexName=null==i?void 0:i.cexName,e.next=17,this.fetchCEXBalances(this.formSpecs);case 17:return e.next=19,this.configureUI();case 19:return this.forms.close(),e.abrupt("return");case 21:Qn(s.botTypeForm,n,r,t),Ne.empty(s.botTypeBaseSymbol,s.botTypeQuoteSymbol),l=[ft().assets[n],ft().assets[r]],u=l[0],d=l[1],s.botTypeBaseSymbol.appendChild(Ne.symbolize(u,!0)),s.botTypeQuoteSymbol.appendChild(Ne.symbolize(d,!0)),h=Fo(this.botTypeSelectors);try{for(h.s();!(p=h.n()).done;)p.value.classList.remove("selected")}catch(e){h.e(e)}finally{h.f()}for(v=0,m=Object.values(this.formCexes);v<m.length;v++)m[v].div.classList.remove("selected");for(this.setCEXAvailability(n,r),Ne.hide(s.noCexesConfigured,s.noCexMarket,s.noCexMarketConfigureMore,s.botTypeErr),g=this.cexMarketSupportFilter(n,r),y={},b=0,x=Object.values(ft().mmStatus.cexes);b<x.length;b++)w=x[b],g(w.config.name)&&(y[w.config.name]=w.config);C=Object.keys(y).length,S=C>0,F=Fo(this.botTypeSelectors);try{for(F.s();!(T=F.n()).done;)(D=T.value).classList.toggle("disabled",D.dataset.botType!==jn&&!S)}catch(e){F.e(e)}finally{F.f()}0===Object.keys(ft().mmStatus.cexes).length?(Ne.show(s.noCexesConfigured),this.setBotTypeSelected(jn)):(A=k.fetchLocal(Io)||{},R=A["".concat(n,"_").concat(r,"_").concat(t)],(a=null!==(I=a)&&void 0!==I?I:R?R.botType:Hn)!==jn&&(o&&(E=y[o]),!E&&R&&(E=y[null!==(B=R.cexName)&&void 0!==B?B:""]),E||(P=k.fetchLocal(Ao))&&(E=y[P]),!E&&C>0&&(E=Object.values(y)[0])),E?(s.cexSelection.classList.remove("disabled"),this.setBotTypeSelected(null!==(L=a)&&void 0!==L?L:R?R.botType:Hn),this.selectFormCEX(E.name)):(s.cexSelection.classList.add("disabled"),Ne.show(s.noCexMarket),this.setBotTypeSelected(jn),0===(O=Object.keys(Gn).filter((function(e){return!ft().mmStatus.cexes[e]}))).length||1===O.length&&("Binance"===O[0]||"BinanceUS"===O[0])||Ne.show(s.noCexMarketConfigureMore))),Ne.show(s.cexSelection),this.forms.show(s.botTypeForm);case 41:case"end":return e.stop()}}),e,this)}))),function(e,t,n,r,a){return x.apply(this,arguments)})},{key:"reshowBotTypeForm",value:function(){No(this.specs,ft().mmStatus)&&this.showMarketSelectForm();var e=this.specs,t=e.baseID,n=e.quoteID,r=e.host,a=e.cexName,o=e.botType;this.showBotTypeForm(r,t,n,o,a)}},{key:"setBotTypeSelected",value:function(e){var t,n=this.formSpecs,r=n.baseID,a=n.quoteID,o=n.host,s=this.botTypeSelectors,i=this.formCexes,c=Fo(s);try{for(c.s();!(t=c.n()).done;){var l=t.value,u=l.classList,d=l.dataset.botType;u.toggle("selected",d===e)}}catch(e){c.e(e)}finally{c.f()}if(e!==jn){var h=ft().mmStatus;if(0!==Object.keys(h.cexes).length){var p=this.cexMarketSupportFilter(r,a),f=Object.values(i).filter((function(e){return e.div.classList.contains("selected")}));if(!f.length||!p(f[0].name)){var v=(k.fetchLocal(Io)||{})["".concat(r,"_").concat(a,"_").concat(o)];if(v){var m,g=h.cexes[null!==(m=v.cexName)&&void 0!==m?m:""];if(g&&p(g.config.name))return void this.selectFormCEX(g.config.name)}var y=k.fetchLocal(Ao);if(y){var b=h.cexes[y];if(b&&p(b.config.name))return void this.selectFormCEX(b.config.name)}var x=Object.values(h.cexes).filter((function(e){return p(e.config.name)}));x.length&&this.selectFormCEX(x[0].config.name)}}}}},{key:"showMarketSelectForm",value:function(){this.page.marketFilterInput.value="",this.sortMarketRows(),this.forms.show(this.page.marketSelectForm)}},{key:"sortMarketRows",value:function(){var e,t=this.page,n=null===(e=t.marketFilterInput.value)||void 0===e?void 0:e.toLowerCase();Ne.empty(t.marketSelect);var r,a=Fo(this.marketRows);try{for(a.s();!(r=a.n()).done;){var o=r.value;o.tr.classList.remove("selected"),n&&!o.name.includes(n)||t.marketSelect.appendChild(o.tr)}}catch(e){a.e(e)}finally{a.f()}}},{key:"handleBalanceNote",value:function(e){if(this.approveTokenForm.handleBalanceNote(e),this.marketReport){var t=this.marketStuff(),n=t.baseID,r=t.quoteID,a=t.quoteToken,o=t.baseToken;e.assetID===n||e.assetID===(null==o?void 0:o.parentID)?this.basePane.updateBalances():e.assetID!==r&&e.assetID!==(null==a?void 0:a.parentID)||this.quotePane.updateBalances()}}},{key:"autoRebalanceChanged",value:function(){var e,t,n=this.page;this.updatedConfig.cexRebalance=null!==(e=null===(t=n.cexRebalanceCheckbox)||void 0===t?void 0:t.checked)&&void 0!==e&&e,this.updateAllocations()}},{key:"submitBotType",value:(m=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=ft().loading(this.page.botTypeForm),e.prev=1,e.next=4,this.submitBotWithValidation();case 4:return e.prev=4,t(),e.finish(4);case 7:case"end":return e.stop()}}),e,this,[[1,,4,7]])}))),function(){return m.apply(this,arguments)})},{key:"submitBotWithValidation",value:(p=s(f().mark((function e(){var t,n,r,o,s,i,c,l,u,d,h,p,v,m,g;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,r=this.forms,o=this.formSpecs,s=o.baseID,i=o.quoteID,c=o.host,ft().walletMap[s]){e.next=5;break}return this.newWalletForm.setAsset(s),r.show(this.page.newWalletForm),e.abrupt("return");case 5:if(ft().walletMap[i]){e.next=9;break}return this.newWalletForm.setAsset(i),r.show(this.page.newWalletForm),e.abrupt("return");case 9:if(l=Vo(c,ft().assets[s],ft().assets[i]),u=a(l,2),d=u[0],h=u[1],d!==dt.NotApproved){e.next=14;break}return this.approveTokenForm.setAsset(s,c),r.show(n.approveTokenForm),e.abrupt("return");case 14:if(h!==dt.NotApproved){e.next=18;break}return this.approveTokenForm.setAsset(i,c),r.show(n.approveTokenForm),e.abrupt("return");case 18:if(p=this.botTypeSelectors,!((v=p.filter((function(e){return e.classList.contains("selected")}))).length<1)){e.next=24;break}return n.botTypeErr.textContent=ke("NO_BOTTYPE"),Ne.show(n.botTypeErr),e.abrupt("return");case 24:if((this.formSpecs.botType=null!==(t=v[0].dataset.botType)&&void 0!==t?t:"")===jn){e.next=35;break}if(!((m=Object.values(this.formCexes).filter((function(e){return e.div.classList.contains("selected")}))).length<1)){e.next=31;break}return n.botTypeErr.textContent=ke("NO_CEX"),Ne.show(n.botTypeErr),e.abrupt("return");case 31:return g=m[0].name,this.formSpecs.cexName=g,e.next=35,this.fetchCEXBalances(this.formSpecs);case 35:this.specs=this.formSpecs,this.configureUI(),this.forms.close();case 38:case"end":return e.stop()}}),e,this)}))),function(){return p.apply(this,arguments)})},{key:"fetchCEXBalances",value:(u=s(f().mark((function e(t){var n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,r=t.baseID,a=t.quoteID,o=t.cexName,t.botType!==jn&&o){e.next=4;break}return e.abrupt("return");case 4:return e.prev=4,e.next=7,Xn.cexBalance(o,r);case 7:this.cexBaseBalance=e.sent,e.next=15;break;case 10:throw e.prev=10,e.t0=e.catch(4),n.botTypeErr.textContent=ke(ve,{cexName:o,assetID:String(r),err:String(e.t0)}),Ne.show(n.botTypeErr),e.t0;case 15:return e.prev=15,e.next=18,Xn.cexBalance(o,a);case 18:this.cexQuoteBalance=e.sent,e.next=26;break;case 21:throw e.prev=21,e.t1=e.catch(15),n.botTypeErr.textContent=ke(ve,{cexName:o,assetID:String(a),err:String(e.t1)}),Ne.show(n.botTypeErr),e.t1;case 26:case"end":return e.stop()}}),e,this,[[4,10],[15,21]])}))),function(e){return u.apply(this,arguments)})},{key:"defaultWalletOptions",value:function(e){var t=ft().currentWalletDefinition(e);if(!t.multifundingopts)return{};var n,r={},a=Fo(t.multifundingopts);try{for(a.s();!(n=a.n()).done;){var o=n.value;o.quoteAssetOnly&&e!==this.specs.quoteID||(r[o.key]="".concat(o.default))}}catch(e){a.e(e)}finally{a.f()}return r}},{key:"updateModifiedMarkers",value:function(){if(!this.creatingNewBot){var e=this.page,t=this.originalConfig,n=this.updatedConfig,r=t.gapStrategy!==n.gapStrategy;e.gapStrategySelect.classList.toggle("modified",r);var a=t.profit!==n.profit;e.profitInput.classList.toggle("modified",a);var o=!1;if(t.buyPlacements.length!==n.buyPlacements.length)o=!0;else for(var s=0;s<t.buyPlacements.length;s++)if(t.buyPlacements[s].lots!==n.buyPlacements[s].lots||t.buyPlacements[s].gapFactor!==n.buyPlacements[s].gapFactor){o=!0;break}e.buyPlacementsTableWrapper.classList.toggle("modified",o);var i=!1;if(t.sellPlacements.length!==n.sellPlacements.length)i=!0;else for(var c=0;c<t.sellPlacements.length;c++)if(t.sellPlacements[c].lots!==n.sellPlacements[c].lots||t.sellPlacements[c].gapFactor!==n.sellPlacements[c].gapFactor){i=!0;break}e.sellPlacementsTableWrapper.classList.toggle("modified",i)}}},{key:"gapFactorHeaderUnit",value:function(e){switch(e){case Nn:return["Multiplier","x"];case Wn:case Vn:return["Rate","".concat(ft().assets[this.specs.quoteID].symbol,"/").concat(ft().assets[this.specs.baseID].symbol)];case Un:case _n:return["Percent","%"];default:throw new Error("Unknown gap strategy ".concat(e))}}},{key:"checkGapFactorRange",value:function(e,t){switch(e){case Nn:return t<1||t>100?"Multiplier must be between 1 and 100":null;case Wn:case Vn:return t<=0?"Rate must be greater than 0":null;case Un:case _n:return t<=0||t>10?"Percent must be between 0 and 10":null;default:throw new Error("Unknown gap factor ".concat(e))}}},{key:"convertGapFactor",value:function(e,t,n){switch(t){case Nn:case Wn:case Vn:return e;case Un:case _n:return n?100*e:e/100;default:throw new Error("Unknown gap factor ".concat(t))}}},{key:"addPlacement",value:function(e,t,n){var r=this,a=this.page,o=this.updatedConfig,s=a.sellPlacementsTableBody,i=a.addSellPlacementRow,c=a.addSellPlacementLots,l=a.addSellPlacementGapFactor,u=a.sellPlacementsErr;e&&(s=a.buyPlacementsTableBody,i=a.addBuyPlacementRow,c=a.addBuyPlacementLots,l=a.addBuyPlacementGapFactor,u=a.buyPlacementsErr),Ne.hide(u);var d=function(){for(var e=0;e<s.children.length-1;e++){var t=Ne.parseTemplate(s.children[e]);Ne.setVis(0!==e,t.upBtn),Ne.setVis(e!==s.children.length-2,t.downBtn)}};Ne.hide(u);var h,p,f,v=function(e){u.textContent=e,Ne.show(u)};n||(n=this.specs.cexName?Nn:o.gapStrategy);var m=e?o.buyPlacements:o.sellPlacements,g=this.gapFactorHeaderUnit(n)[1];if(t)h=t.lots,p=t.gapFactor,f=this.convertGapFactor(p,n,!0);else{if(h=parseInt(c.value||"0"),f=parseFloat(l.value||"0"),p=this.convertGapFactor(f,n,!1),0===h)return void v("Lots must be greater than 0");var y=this.checkGapFactorRange(n,f);if(y)return void v(y);if(m.find((function(e){return e.gapFactor===p})))return void v("Duplicate placement");m.push({lots:h,gapFactor:p})}var b=a.placementRowTmpl.cloneNode(!0),x=Ne.parseTemplate(b);x.priority.textContent="".concat(s.children.length),x.lots.textContent="".concat(h),x.gapFactor.textContent="".concat(f," ").concat(g),Ne.bind(x.removeBtn,"click",(function(){var e=m.findIndex((function(e){return e.lots===h&&e.gapFactor===p}));-1!==e&&(m.splice(e,1),b.remove(),d(),r.updateModifiedMarkers(),r.placementsChart.render(),r.updateAllocations())})),Ne.bind(x.upBtn,"click",(function(){var e=m.findIndex((function(e){return e.lots===h&&e.gapFactor===p}));if(0!==e){var t=m[e-1];m[e-1]=m[e],m[e]=t,x.priority.textContent="".concat(e),b.remove(),s.insertBefore(b,s.children[e-1]),Ne.parseTemplate(s.children[e]).priority.textContent="".concat(e+1),d(),r.updateModifiedMarkers()}})),Ne.bind(x.downBtn,"click",(function(){var e=m.findIndex((function(e){return e.lots===h&&e.gapFactor===p}));if(e!==m.length-1){var t=m[e+1];m[e+1]=m[e],m[e]=t,x.priority.textContent="".concat(e+2),b.remove(),s.insertBefore(b,s.children[e+1]),Ne.parseTemplate(s.children[e]).priority.textContent="".concat(e+1),d(),r.updateModifiedMarkers()}})),s.insertBefore(b,i),d()}},{key:"setArbMMLabels",value:function(){this.page.buyGapFactorHdr.textContent=ke(ce),this.page.sellGapFactorHdr.textContent=ke(ce)}},{key:"setGapFactorLabels",value:function(e){var t=this.page,n=this.gapFactorHeaderUnit(e)[0];switch(t.buyGapFactorHdr.textContent=n,t.sellGapFactorHdr.textContent=n,Ne.hide(t.percentPlusInfo,t.percentInfo,t.absolutePlusInfo,t.absoluteInfo,t.multiplierInfo),e){case"percent-plus":return Ne.show(t.percentPlusInfo);case"percent":return Ne.show(t.percentInfo);case"absolute-plus":return Ne.show(t.absolutePlusInfo);case"absolute":return Ne.show(t.absoluteInfo);case"multiplier":return Ne.show(t.multiplierInfo)}}},{key:"clearPlacements",value:function(e){for(var t=this.page,n=this.updatedConfig;t.buyPlacementsTableBody.children.length>1;)t.buyPlacementsTableBody.children[0].remove();for(;t.sellPlacementsTableBody.children.length>1;)t.sellPlacementsTableBody.children[0].remove();this.placementsCache[e]=[n.buyPlacements,n.sellPlacements],n.buyPlacements.splice(0,n.buyPlacements.length),n.sellPlacements.splice(0,n.sellPlacements.length)}},{key:"loadCachedPlacements",value:function(e){var t,n,a=this.placementsCache[e];if(a){var o=this.updatedConfig;o.buyPlacements.splice(0,o.buyPlacements.length),o.sellPlacements.splice(0,o.sellPlacements.length),(t=o.buyPlacements).push.apply(t,r(a[0])),(n=o.sellPlacements).push.apply(n,r(a[1]));var s,i=e===Ro?Nn:e,c=Fo(o.buyPlacements);try{for(c.s();!(s=c.n()).done;){var l=s.value;this.addPlacement(!0,l,i)}}catch(e){c.e(e)}finally{c.f()}var u,d=Fo(o.sellPlacements);try{for(d.s();!(u=d.n()).done;){var h=u.value;this.addPlacement(!1,h,i)}}catch(e){d.e(e)}finally{d.f()}}}},{key:"setOriginalValues",value:function(){var e,t,n,r=this,o=this.page,s=this.originalConfig,i=this.updatedConfig,l=this.specs,u=l.cexName,d=l.botType;this.clearPlacements(u?Ro:i.gapStrategy),function(e,t){for(var n=0,r=Object.entries(t);n<r.length;n++){var o=a(r[n],2),s=o[0],i=o[1];if(Array.isArray(i)){e[s].splice(0,e[s].length);var l,u=Fo(i);try{for(u.s();!(l=u.n()).done;){var d=l.value;e[s].push(d)}}catch(e){u.e(e)}finally{u.f()}}else"object"===c(i)?Object.assign(e[s],i):e[s]=t[s]}}(i,JSON.parse(JSON.stringify(s)));var h=null!==(e=i.driftTolerance)&&void 0!==e?e:.002;this.driftTolerance.setValue(100*h),this.driftToleranceSlider.setValue(h/.02);var p=null!==(t=i.orderPersistence)&&void 0!==t?t:20;this.orderPersistence.setValue(p),this.orderPersistenceSlider.setValue(p/40);var f=null!==(n=i.profit)&&void 0!==n?n:.01;o.profitInput.value=String(100*f),this.qcProfit.setValue(100*f),this.qcProfitSlider.setValue((f-Eo)/Bo),u&&(o.cexRebalanceCheckbox.checked=i.cexRebalance,this.autoRebalanceChanged()),o.gapStrategySelect.options&&(Array.from(o.gapStrategySelect.options).forEach((function(e){e.selected=e.value===i.gapStrategy})),this.setGapFactorLabels(i.gapStrategy),d===jn?(Ne.show(o.gapStrategyBox),Ne.hide(o.profitSelectorBox,o.orderPersistenceBox),this.setGapFactorLabels(o.gapStrategySelect.value||"")):u&&ft().mmStatus.cexes[u]&&(Ne.hide(o.gapStrategyBox),Ne.show(o.profitSelectorBox,o.orderPersistenceBox),this.setArbMMLabels()),s.buyPlacements.forEach((function(e){r.addPlacement(!0,e)})),s.sellPlacements.forEach((function(e){r.addPlacement(!1,e)})),this.basePane.setupWalletSettings(),this.quotePane.setupWalletSettings(),this.updateModifiedMarkers(),Ne.isDisplayed(o.quickConfig)&&this.switchToQuickConfig())}},{key:"validateFields",value:function(e){var t=!0,n=this.page,r=this.specs.botType,a=this.updatedConfig,o=a.sellPlacements,s=a.buyPlacements,i=a.profit,c=function(n,r){t=!1,e&&(n.textContent=ke(r),Ne.show(n))};return e&&Ne.hide(n.buyPlacementsErr,n.sellPlacementsErr,n.profitInputErr),r!==zn&&s.length+o.length===0&&(c(n.buyPlacementsErr,le),c(n.sellPlacementsErr,le)),r!==jn&&(isNaN(i)?c(n.profitInputErr,ue):0===i&&c(n.profitInputErr,de)),t}},{key:"saveSettings",value:(l=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.validateFields(!0)){e.next=2;break}return e.abrupt("return");case 2:t=this.marketStuff(),n=t.cfg,r=t.baseID,a=t.quoteID,o=t.host,s=t.botType,i=t.cexName,c={host:o,baseID:r,quoteID:a,cexName:null!=i?i:"",uiConfig:{simpleArbLots:n.simpleArbLots,baseConfig:n.baseConfig,quoteConfig:n.quoteConfig,cexRebalance:n.cexRebalance},baseWalletOptions:n.baseOptions,quoteWalletOptions:n.quoteOptions},e.t0=s,e.next=e.t0===jn?7:e.t0===Hn?9:e.t0===zn?11:12;break;case 7:return c.basicMarketMakingConfig=this.basicMMConfig(),e.abrupt("break",12);case 9:return c.arbMarketMakingConfig=this.arbMMConfig(),e.abrupt("break",12);case 11:c.simpleArbConfig=this.basicArbConfig();case 12:return ft().log("mm","saving bot config",c),e.next=15,Xn.updateBotConfig(c);case 15:return e.next=17,ft().fetchMMStatus();case 17:this.originalConfig=JSON.parse(JSON.stringify(n)),this.updateModifiedMarkers(),(l=k.fetchLocal(Io)||{})["".concat(r,"_").concat(a,"_").concat(o)]=this.specs,k.storeLocal(Io,l),i&&k.storeLocal(Ao,i),ft().loadPage("mm");case 24:case"end":return e.stop()}}),e,this)}))),function(){return l.apply(this,arguments)})},{key:"delete",value:(o=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.specs,r=n.host,a=n.baseID,o=n.quoteID,Ne.hide(t.deleteErr),s=ft().loading(t.botSettingsContainer),e.next=5,Xn.removeBotConfig(r,a,o);case 5:if(i=e.sent,s(),ft().checkResponse(i)){e.next=11;break}return t.deleteErr.textContent=ke(H,{msg:i.msg}),Ne.show(t.deleteErr),e.abrupt("return");case 11:return e.next=13,ft().fetchMMStatus();case 13:ft().loadPage("mm");case 14:case"end":return e.stop()}}),e,this)}))),function(){return o.apply(this,arguments)})},{key:"arbMMConfig",value:function(){var e,t=this.updatedConfig,n={buyPlacements:[],sellPlacements:[],profit:t.profit,driftTolerance:t.driftTolerance,orderPersistence:t.orderPersistence},r=Fo(t.buyPlacements);try{for(r.s();!(e=r.n()).done;){var a=e.value;n.buyPlacements.push({lots:a.lots,multiplier:a.gapFactor})}}catch(e){r.e(e)}finally{r.f()}var o,s=Fo(t.sellPlacements);try{for(s.s();!(o=s.n()).done;){var i=o.value;n.sellPlacements.push({lots:i.lots,multiplier:i.gapFactor})}}catch(e){s.e(e)}finally{s.f()}return n}},{key:"basicArbConfig",value:function(){var e=this.updatedConfig;return{profitTrigger:e.profit,maxActiveArbs:100,numEpochsLeaveOpen:e.orderPersistence}}},{key:"basicMMConfig",value:function(){var e=this.updatedConfig;return{gapStrategy:e.gapStrategy,sellPlacements:e.sellPlacements,buyPlacements:e.buyPlacements,driftTolerance:e.driftTolerance}}},{key:"fetchMarketReport",value:(n=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l,u,d,h,p;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.specs,r=n.host,a=n.baseID,o=n.quoteID,e.next=3,Xn.report(r,a,o);case 3:if(s=e.sent,Ne.hide(t.oraclesLoading,t.oraclesTable,t.noOracles),ft().checkResponse(s)){e.next=9;break}return t.oraclesErrMsg.textContent=s.msg,Ne.show(t.oraclesErr),e.abrupt("return");case 9:if((i=this.marketReport=s.report).oracles&&0!==i.oracles.length){Ne.hide(t.noOracles),Ne.empty(t.oracles),l=Fo(null!==(c=i.oracles)&&void 0!==c?c:[]);try{for(l.s();!(u=l.n()).done;)d=u.value,h=t.oracleTmpl.cloneNode(!0),t.oracles.appendChild(h),(p=Ne.parseTemplate(h)).logo.src="img/"+d.host+".png",p.host.textContent=Wo[d.host],p.volume.textContent=Ne.formatFourSigFigs(d.usdVol),p.price.textContent=Ne.formatFourSigFigs((d.bestBuy+d.bestSell)/2)}catch(e){l.e(e)}finally{l.f()}t.avgPrice.textContent=i.price?Ne.formatFourSigFigs(i.price):"0",Ne.show(t.oraclesTable)}else Ne.show(t.noOracles);i.baseFiatRate>0?t.baseFiatRate.textContent=Ne.formatFourSigFigs(i.baseFiatRate):t.baseFiatRate.textContent="N/A",i.quoteFiatRate>0?t.quoteFiatRate.textContent=Ne.formatFourSigFigs(i.quoteFiatRate):t.quoteFiatRate.textContent="N/A",Ne.show(t.fiatRates);case 14:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"cexConfigured",value:(t=s(f().mark((function e(t){var n,r,a,o,s,i,c,l,u,d,h,p,v,m;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=this.page,r=this.formSpecs,a=r.host,o=r.baseID,s=r.quoteID,i=Gn[t],c=Fo(this.marketRows),e.prev=3,c.s();case 5:if((l=c.n()).done){e.next=13;break}if(u=l.value,d=u.baseID,h=u.quoteID,p=u.tmpl,-1===(v=u.arbs).indexOf(t)){e.next=9;break}return e.abrupt("continue",11);case 9:this.cexMarketSupportFilter(d,h)(t)&&((m=n.arbBttnTmpl.cloneNode(!0)).src=i.logo,p.arbs.appendChild(m),v.push(t));case 11:e.next=5;break;case 13:e.next=18;break;case 15:e.prev=15,e.t0=e.catch(3),c.e(e.t0);case 18:return e.prev=18,c.f(),e.finish(18);case 21:this.setCEXAvailability(o,s,t),this.showBotTypeForm(a,o,s,Hn,t);case 23:case"end":return e.stop()}}),e,this,[[3,15,18,21]])}))),function(e){return t.apply(this,arguments)})},{key:"setupCEXes",value:function(){this.formCexes={};for(var e=0,t=Object.keys(Gn);e<t.length;e++){var n=t[e];this.addCEX(n)}}},{key:"setCEXAvailability",value:function(e,t,n){for(var r=this.cexMarketSupportFilter(e,t),a=0,o=Object.values(this.formCexes);a<o.length;a++){var s=o[a],i=s.name,c=s.div,l=s.tmpl,u=r(i),d=ft().mmStatus.cexes[i];Ne.hide(l.unavailable,l.needsconfig,l.disconnected),Ne.setVis(Boolean(d),l.reconfig),l.logo.classList.remove("greyscal"),c.classList.toggle("configured",Boolean(d)&&!d.connectErr),d?d.connectErr?Ne.show(l.disconnected):u?i===n&&this.selectFormCEX(i):(Ne.show(l.unavailable),l.logo.classList.add("greyscal")):Ne.show(l.needsconfig)}}},{key:"selectFormCEX",value:function(e){for(var t=0,n=Object.values(this.formCexes);t<n.length;t++){var r=n[t],a=r.name;r.div.classList.toggle("selected",a===e)}}},{key:"addCEX",value:function(e){var t=this,n=Gn[e],r=this.page.cexOptTmpl.cloneNode(!0),a=Ne.parseTemplate(r);a.name.textContent=n.name,a.logo.src=n.logo,this.page.cexSelection.appendChild(r),this.formCexes[e]={name:e,div:r,tmpl:a},Ne.bind(r,"click",(function(){var n=ft().mmStatus.cexes[e];if(n&&!n.connectErr)if(t.formCexes[e].div.classList.contains("selected")){for(var r=0,a=Object.values(t.formCexes);r<a.length;r++)a[r].div.classList.remove("selected");var o=t.formSpecs,s=o.baseID,i=o.quoteID;t.setCEXAvailability(s,i)}else for(var c=0,l=Object.values(t.formCexes);c<l.length;c++){var u=l[c];u.div.classList.toggle("selected",u.name===e)}else t.showCEXConfigForm(e)})),Ne.bind(a.reconfig,"click",(function(n){n.stopPropagation(),t.showCEXConfigForm(e)}))}},{key:"showCEXConfigForm",value:function(e){var t=this.page;this.cexConfigForm.setCEX(e),this.forms.show(t.cexConfigForm)}},{key:"cexMarketSupportFilter",value:function(e,t){for(var n={},r=0,o=Object.entries(ft().mmStatus.cexes);r<o.length;r++)for(var s=a(o[r],2),i=s[0],c=s[1],l=0,u=Object.values(null!==(d=c.markets)&&void 0!==d?d:[]);l<u.length;l++){var d,h=u[l],p=h.baseID,f=h.quoteID;if(p===e&&f===t){n[i]=!0;break}}return function(e){return Boolean(n[e])}}}]),D}(lt);function No(e,t){var n=t.bots.find((function(t){var n=t.config;return n.host===e.host&&n.baseID===e.baseID&&n.quoteID===e.quoteID}));return Boolean(null==n?void 0:n.running)}var Wo={"binance.com":"Binance","coinbase.com":"Coinbase","bittrex.com":"Bittrex","hitbtc.com":"HitBTC","exmo.com":"EXMO"};function Vo(e,t,n){var r=dt.Approved,a=dt.Approved;if(null!=t&&t.token){var o,s=ft().assets[t.id],i=ft().exchanges[e].assets[t.id].version;null!=s&&null!==(o=s.wallet)&&void 0!==o&&o.approved&&void 0!==s.wallet.approved[i]&&(r=s.wallet.approved[i])}if(null!=n&&n.token){var c,l=ft().assets[n.id],u=ft().exchanges[e].assets[n.id].version;null!=l&&null!==(c=l.wallet)&&void 0!==c&&c.approved&&void 0!==l.wallet.approved[u]&&(a=l.wallet.approved[u])}return[r,a]}var Uo=function(){function e(t,n){var r=this;i(this,e),h(this,"pg",void 0),h(this,"div",void 0),h(this,"page",void 0),h(this,"assetID",void 0),h(this,"ui",void 0),h(this,"walletConfig",void 0),h(this,"feeAssetID",void 0),h(this,"feeUI",void 0),h(this,"isQuote",void 0),h(this,"isToken",void 0),h(this,"lotSize",void 0),h(this,"lotSizeConv",void 0),h(this,"cfg",void 0),h(this,"inv",void 0),h(this,"nSwapFees",void 0),h(this,"nSwapFeesSlider",void 0),h(this,"orderReserves",void 0),h(this,"orderReservesSlider",void 0),h(this,"slippageBuffer",void 0),h(this,"slippageBufferSlider",void 0),h(this,"minTransfer",void 0),h(this,"minTransferSlider",void 0),this.pg=t,this.div=n;var o=this.page=Ne.parseTemplate(n);this.nSwapFees=new Je(o.nSwapFees,{prec:0,inc:10,changed:function(e){r.cfg.swapFeeN=e,r.nSwapFeesSlider.setValue((e-0)/1e3),r.pg.updateAllocations()}}),this.nSwapFeesSlider=new Ze(o.nSwapFeesSlider,(function(e){var t=a($e(0+1e3*e,0),1)[0];r.cfg.swapFeeN=t,r.nSwapFees.setValue(t),r.pg.updateAllocations()})),this.orderReserves=new Ye(o.orderReservesFactor,{prec:3,min:0,changed:function(e){r.cfg.orderReservesFactor=e,r.orderReservesSlider.setValue((e-0)/3),r.pg.updateAllocations()}}),this.orderReservesSlider=new Ze(o.orderReservesSlider,(function(e){var t=a($e(0+3*e,3),1)[0];r.orderReserves.setValue(t),r.cfg.orderReservesFactor=t,r.pg.updateAllocations()})),this.slippageBuffer=new Ye(o.slippageBufferFactor,{prec:3,min:0,changed:function(e){r.cfg.slippageBufferFactor=e,r.slippageBufferSlider.setValue((e-0)/.3),r.pg.updateAllocations()}}),this.slippageBufferSlider=new Ze(o.slippageBufferSlider,(function(e){var t=a($e(0+.3*e,3),1)[0];r.slippageBuffer.setValue(0+.3*e),r.cfg.slippageBufferFactor=t,r.pg.updateAllocations()})),this.minTransfer=new Ye(o.minTransfer,{sigFigs:!0,min:0,changed:function(e){var t=r.cfg,n=r.commit(),a=[r.minTransfer.min,Math.max(2*r.minTransfer.min,n)],o=a[0],s=a[1];t.transferFactor=(e-o)/(s-o),r.minTransferSlider.setValue(t.transferFactor)}}),this.minTransferSlider=new Ze(o.minTransferSlider,(function(e){var t=r.cfg,n=r.commit(),a=[r.minTransfer.min,Math.max(r.minTransfer.min,n)],o=a[0],s=a[1];t.transferFactor=e,r.minTransfer.setValue(o+e*(s-o))})),Ne.bind(o.showBalance,"click",(function(){t.showAddress(r.assetID)}))}return d(e,[{key:"setLotSize",value:function(e){var t=this.ui;this.lotSize=e,this.lotSizeConv=e/t.conventional.conversionFactor}},{key:"setAsset",value:function(e,t){var n;this.assetID=e,this.isQuote=t;var r=this.cfg=t?this.pg.updatedConfig.quoteConfig:this.pg.updatedConfig.baseConfig,o=this.page,s=this.div,i=this.pg,c=i.specs,l=c.botType,u=c.baseID,d=c.cexName,h=i.mktID,p=i.updatedConfig,f=p.baseOptions,v=p.quoteOptions,m=ft().assets[e],g=m.symbol,y=m.name,b=m.token,x=m.unitInfo;this.ui=x,this.walletConfig=e===u?f:v;var k=x.conventional.unit;this.feeAssetID=b?b.parentID:e;var w=ft().assets[this.feeAssetID],C=w.unitInfo,S=w.name,F=w.symbol;this.feeUI=C,this.inv={book:0,bookingFees:0,swapFeeReserves:0,cex:0,orderReserves:0,slippageBuffer:0},this.isToken=Boolean(b),Ne.setVis(this.isToken,o.feeTotalBox,o.feeReservesBox,o.feeBalances),Ne.setVis(t,o.slippageBufferBox),Ne.setSrc(s,"[data-logo]",Ne.logoPath(g)),Ne.setText(s,"[data-name]",y),Ne.setText(s,"[data-ticker]",k);var T=C.conventional.unit;if(Ne.setText(s,"[data-fee-ticker]",T),Ne.setText(s,"[data-fee-name]",S),Ne.setSrc(s,"[data-fee-logo]",Ne.logoPath(F)),Ne.setVis(l!==jn,o.cexMinInvBox),Ne.setVis(l!==zn,o.orderReservesBox),this.nSwapFees.setValue(null!==(n=r.swapFeeN)&&void 0!==n?n:50),this.nSwapFeesSlider.setValue(r.swapFeeN/1e3),l!==zn){var D,I=a($e(null!==(D=r.orderReservesFactor)&&void 0!==D?D:1,3),1)[0];this.orderReserves.setValue(I),this.orderReservesSlider.setValue((I-0)/3)}if(l!==jn){this.minTransfer.prec=Math.log10(x.conventional.conversionFactor);var A=ft().mmStatus.cexes[d].markets[h];this.minTransfer.min=(t?A.quoteMinWithdraw:A.baseMinWithdraw)/x.conventional.conversionFactor}this.slippageBuffer.setValue(r.slippageBufferFactor);this.slippageBufferSlider.setValue((r.slippageBufferFactor-0)/.3),this.setupWalletSettings(),this.updateBalances()}},{key:"commit",value:function(){var e=this.inv,t=this.isToken,n=e.book+e.cex+e.orderReserves+e.slippageBuffer;return t||(n+=e.bookingFees+e.swapFeeReserves),n}},{key:"updateInventory",value:function(e,t,n,r,a,o){this.setLotSize(n);var s=this.page,i=this.cfg,c=this.lotSizeConv,l=this.inv,u=this.ui,d=this.feeUI,h=this.isToken,p=this.isQuote,f=this.pg.specs,v=f.cexName,m=f.botType;s.bookLots.textContent=String(e),s.bookLotSize.textContent=Ne.formatFourSigFigs(c),l.book=e*c,s.bookCommitment.textContent=Ne.formatFourSigFigs(l.book);var g=o.bookingFeesPerLot/d.conventional.conversionFactor;if(s.bookingFeesPerLot.textContent=Ne.formatFourSigFigs(g),s.swapReservesFactor.textContent=o.swapReservesFactor.toFixed(2),s.bookingFeesLots.textContent=String(e),l.bookingFees=o.bookingFees/d.conventional.conversionFactor,s.bookingFees.textContent=Ne.formatFourSigFigs(l.bookingFees),v&&(l.cex=a/u.conventional.conversionFactor,s.cexMinInv.textContent=Ne.formatFourSigFigs(l.cex)),m!==zn){var y=Math.max(a,r)/u.conventional.conversionFactor;s.orderReservesBasis.textContent=Ne.formatFourSigFigs(y);var b=y*i.orderReservesFactor;l.orderReserves=b,s.orderReserves.textContent=Ne.formatFourSigFigs(b)}if(h){var x=o.tokenFeesPerSwap/d.conventional.conversionFactor;s.feeReservesPerSwap.textContent=Ne.formatFourSigFigs(x),l.swapFeeReserves=x*i.swapFeeN,s.feeReserves.textContent=Ne.formatFourSigFigs(l.swapFeeReserves)}if(p){var k=l.book+l.cex+l.orderReserves;s.slippageBufferBasis.textContent=Ne.formatCoinValue(k*u.conventional.conversionFactor,u),l.slippageBuffer=k*i.slippageBufferFactor,s.slippageBuffer.textContent=Ne.formatCoinValue(l.slippageBuffer*u.conventional.conversionFactor,u)}if(Ne.setVis(o.bookingFeesPerCounterLot>0,s.redemptionFeesBox),o.bookingFeesPerCounterLot>0){var w=o.bookingFeesPerCounterLot/d.conventional.conversionFactor;s.redemptionFeesPerLot.textContent=Ne.formatFourSigFigs(w),s.redemptionFeesLots.textContent=String(t),s.redeemReservesFactor.textContent=o.redeemReservesFactor.toFixed(2)}this.updateCommitTotal(),this.updateTokenFees(),this.updateRebalance()}},{key:"updateCommitTotal",value:function(){var e=this.page,t=this.assetID,n=this.ui,r=this.commit();e.commitTotal.textContent=Ne.formatCoinValue(Math.round(r*n.conventional.conversionFactor),n),e.commitTotalFiat.textContent=Ne.formatFourSigFigs(r*ft().fiatRatesMap[t])}},{key:"updateTokenFees",value:function(){var e=this.page,t=this.inv,n=this.feeAssetID,r=this.feeUI;if(this.isToken){var a=t.bookingFees+t.swapFeeReserves;e.feeTotal.textContent=Ne.formatCoinValue(a*r.conventional.conversionFactor,r),e.feeTotalFiat.textContent=Ne.formatFourSigFigs(a*ft().fiatRatesMap[n])}}},{key:"updateRebalance",value:function(){var e=this.page,t=this.cfg,n=this.pg,r=n.updatedConfig.cexRebalance,a=n.specs.cexName&&r;if(Ne.setVis(a,e.rebalanceOpts),a){var o=this.commit(),s=[this.minTransfer.min,Math.max(2*this.minTransfer.min,o)],i=s[0],c=s[1]-i;this.minTransfer.setValue(i+t.transferFactor*c),this.minTransferSlider.setValue((t.transferFactor-0)/1)}}},{key:"setupWalletSettings",value:function(){var e=this,t=this.page,n=this.assetID,r=this.walletConfig,o=ft().currentWalletDefinition(n);if(Ne.empty(t.walletSettings),Ne.setVis(!o.multifundingopts,t.walletSettingsNone),o.multifundingopts){var s={},i={},c=function(n){if(!n.quoteAssetOnly||e.isQuote){var o,c,l,u,d=r[n.key];if(n.isboolean){o=t.boolSettingTmpl.cloneNode(!0);var h=Ne.parseTemplate(o);h.name.textContent=n.displayname,h.input.checked="true"===d,Ne.bind(h.input,"change",(function(){r[n.key]=h.input.checked?"true":"false",function(e,t){var n=i[e];if(n){var r,a=Fo(n);try{for(a.s();!(r=a.n()).done;){var o=r.value;Ne.setVis(t,s[o])}}catch(e){a.e(e)}finally{a.f()}}}(n.key,Boolean(h.input.checked))})),n.description&&(h.tooltip.dataset.tooltip=n.description)}else if(n.xyRange){var p=n.xyRange,f=p.start,v=p.end,m=p.xUnit,g=v.x-f.x;o=t.rangeSettingTmpl.cloneNode(!0);var y=Ne.parseTemplate(o);y.name.textContent=n.displayname,n.description&&(y.tooltip.dataset.tooltip=n.description),m?y.unit.textContent=m:Ne.hide(y.unit);var b=new Ye(y.value,{prec:1,changed:function(e){var t=a(et(e,1),2),o=t[0],s=t[1];r[n.key]=s,x.setValue((o-f.x)/g)}}),x=new Ze(y.slider,(function(e){var t=a(et(f.x+e*g,1),2),o=t[0],s=t[1];r[n.key]=s,b.setValue(o)})),k=a(et(tt(d,f.x),3),2),w=k[0],C=k[1];r[n.key]=C,x.setValue((w-f.x)/g),b.setValue(w),y.value.textContent=C}if(!o)return console.error("don't know how to handle opt",n);if(t.walletSettings.appendChild(o),n.dependsOn){c=n.key,l=o,u=n.dependsOn,i[u]||(i[u]=[]),i[u].push(c),s[c]=l;var S=r[n.dependsOn];Ne.setVis("true"===S,o)}}};if(o.multifundingopts&&o.multifundingopts.length>0){var l,u=Fo(o.multifundingopts);try{for(u.s();!(l=u.n()).done;)c(l.value)}catch(e){u.e(e)}finally{u.f()}}ft().bindTooltips(t.walletSettings)}}},{key:"updateBalances",value:function(){var e=this.page,t=this.assetID,n=this.ui,r=this.feeAssetID,a=this.feeUI,o=this.pg,s=o.specs,i=s.cexName,c=s.baseID,l=o.cexBaseBalance,u=o.cexQuoteBalance,d=ft().walletMap[t].balance.available,h=this.pg.runningBotInventory(t),p=d-h.dex.total,f=0;if(Ne.setVis(i,e.balanceBreakdown),i&&(e.dexAvail.textContent=Ne.formatFourSigFigs(p/n.conventional.conversionFactor),f=(t===c?l:u).available-h.cex.total,e.cexAvail.textContent=Ne.formatFourSigFigs(f/n.conventional.conversionFactor)),e.avail.textContent=Ne.formatFourSigFigs((p+f)/n.conventional.conversionFactor),t!==r){var v=ft().walletMap[r].balance.available;e.feeAvail.textContent=Ne.formatFourSigFigs(v/a.conventional.conversionFactor)}}}]),e}();var _o=function(e){g(I,e);var t,n,r,a,o,c,l,u,p,m,x,k,w,C,F,T,D=(F=I,T=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(F);if(T){var n=b(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return y(this,e)});function I(e){var t;i(this,I),h(v(t=D.call(this)),"body",void 0),h(v(t),"forms",void 0),h(v(t),"currentForm",void 0),h(v(t),"page",void 0),h(v(t),"host",void 0),h(v(t),"accountDisabled",void 0),h(v(t),"keyup",void 0),h(v(t),"dexAddrForm",void 0),h(v(t),"bondFeeBufferCache",void 0),h(v(t),"newWalletForm",void 0),h(v(t),"regAssetForm",void 0),h(v(t),"walletWaitForm",void 0),h(v(t),"confirmRegisterForm",void 0),h(v(t),"reputationMeter",void 0),h(v(t),"animation",void 0),h(v(t),"renewToggle",void 0),t.body=e;var n=t.host=e.dataset.host?e.dataset.host:"",r=ft().exchanges[n],a=t.page=Ne.idDescendants(e);t.forms=Ne.applySelector(a.forms,":scope > form"),t.confirmRegisterForm=new mr(a.confirmRegForm,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.showSuccess(ke(se)),t.renewToggle.setState(t.confirmRegisterForm.tier>0),e.next=4,ft().fetchUser();case 4:ft().updateMenuItemsDisplay();case 5:case"end":return e.stop()}}),e)}))),(function(){t.runAnimation(t.regAssetForm,a.regAssetForm)})),t.confirmRegisterForm.setExchange(r,""),t.walletWaitForm=new yr(a.walletWait,(function(){t.runAnimation(t.confirmRegisterForm,a.confirmRegForm)}),(function(){t.runAnimation(t.regAssetForm,a.regAssetForm)})),t.walletWaitForm.setExchange(r),t.newWalletForm=new pr(a.newWalletForm,(function(e){return t.newWalletCreated(e,t.confirmRegisterForm.tier)}),(function(){return t.runAnimation(t.regAssetForm,a.regAssetForm)})),t.regAssetForm=new gr(a.regAssetForm,function(){var e=s(f().mark((function e(n,r){var o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n!==pt){e.next=6;break}return e.next=3,ft().fetchUser();case 3:return t.updateReputation(),t.showSuccess(ke(se)),e.abrupt("return");case 6:if(o=ft().assets[n],!(s=o.wallet)){e.next=17;break}return i=ft().loading(a.regAssetForm),e.next=12,t.getBondsFeeBuffer(n,a.regAssetForm);case 12:return c=e.sent,t.confirmRegisterForm.setAsset(n,r,c),i(),t.progressTierFormsWithWallet(n,s),e.abrupt("return");case 17:t.confirmRegisterForm.setAsset(n,r,0),t.newWalletForm.setAsset(n),t.showForm(a.newWalletForm);case 20:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()),t.regAssetForm.setExchange(r,""),t.reputationMeter=new un(a.repMeter),t.reputationMeter.setHost(n),Ne.bind(a.exportDexBtn,"click",(function(){return t.exportAccount()})),t.accountDisabled="true"===e.dataset.disabled,Ne.bind(a.toggleAccountStatusBtn,"click",(function(){t.accountDisabled?t.toggleAccountStatus(!1):t.prepareAccountDisable(a.disableAccountForm)})),Ne.bind(a.updateCertBtn,"click",(function(){return a.certFileInput.click()})),Ne.bind(a.updateHostBtn,"click",(function(){return t.prepareUpdateHost()})),Ne.bind(a.certFileInput,"change",(function(){return t.onCertFileChange()})),Ne.bind(a.goBackToSettings,"click",(function(){return ft().loadPage("settings")}));var o=function(){t.regAssetForm.setExchange(ft().exchanges[n],""),t.showForm(a.regAssetForm)};Ne.bind(a.changeTier,"click",(function(){o()}));var c=r.auth.targetTier>0;return t.renewToggle=new _e(a.toggleAutoRenew,a.renewErr,c,function(){var e=s(f().mark((function e(n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!t.accountDisabled){e.next=2;break}return e.abrupt("return");case 2:if(!n){e.next=6;break}o(),e.next=7;break;case 6:return e.abrupt("return",t.disableAutoRenew());case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),Ne.bind(a.autoRenewBox,"click",(function(e){e.stopPropagation(),t.accountDisabled||a.toggleAutoRenew.click()})),a.penaltyCompInput.value=String(r.auth.penaltyComps),Ne.bind(a.penaltyCompBox,"click",(function(e){e.stopPropagation();var n=ft().exchanges[t.host];a.penaltyCompInput.value=String(n.auth.penaltyComps),a.penaltyCompInput.focus()})),Ne.bind(a.penaltyCompInput,"keyup",function(){var e=s(f().mark((function e(n){var r,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(Ne.hide(a.penaltyCompsErr),"Escape"!==n.key){e.next=3;break}return e.abrupt("return");case 3:if("Enter"===n.key){e.next=5;break}return e.abrupt("return");case 5:if(r=parseInt(a.penaltyCompInput.value||""),!isNaN(r)){e.next=10;break}return Ne.show(a.penaltyCompsErr),a.penaltyCompsErr.textContent=ke("INVALID_COMPS_VALUE"),e.abrupt("return");case 10:return o=ft().loading(a.otherBondSettings),e.prev=11,e.next=14,t.updateBondOptions({penaltyComps:r});case 14:o(),e.next=22;break;case 17:e.prev=17,e.t0=e.catch(11),o(),Ne.show(a.penaltyCompsErr),a.penaltyCompsErr.textContent=ke(H,{msg:e.t0.msg});case 22:case"end":return e.stop()}}),e,null,[[11,17]])})));return function(t){return e.apply(this,arguments)}}()),t.dexAddrForm=new xr(a.dexAddrForm,function(){var e=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:ft().loadPage("/dexsettings/".concat(t.host));case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),t.host),Br(a.disableAccountForm,a.disableAccountConfirm,(function(){return t.toggleAccountStatus(!0)})),Ne.bind(a.forms,"mousedown",(function(e){Ne.mouseInElement(e,t.currentForm)||t.closePopups()})),t.keyup=function(e){"Escape"===e.key&&t.closePopups()},Ne.bind(document,"keyup",t.keyup),Ne.applySelector(a.forms,".form-closer").forEach((function(e){Ne.bind(e,"click",(function(){t.closePopups()}))})),ft().registerNoteFeeder({conn:function(){t.setConnectionStatus()},reputation:function(){t.updateReputation()},feepayment:function(){t.updateReputation()},bondpost:function(){t.updateReputation()}}),t.setConnectionStatus(),t.updateReputation(),t}return d(I,[{key:"unload",value:function(){Ne.unbind(document,"keyup",this.keyup)}},{key:"progressTierFormsWithWallet",value:(C=s(f().mark((function e(t,n){var r,a,o,s,i,c,l;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=this.page,a=this.confirmRegisterForm.fees,o=ft().assets[t],s=this.regAssetForm.xc.bondAssets,i=s[o.symbol],n.open){e.next=12;break}return c=ft().loading(r.forms),e.next=8,S("/api/openwallet",{assetID:t});case 8:return l=e.sent,c(),ft().checkResponse(l)||(this.regAssetForm.setAssetError("error unlocking wallet: ".concat(l.msg)),this.runAnimation(this.regAssetForm,r.regAssetForm)),e.abrupt("return");case 12:if(!(n.synced&&n.balance.available>=2*i.amount+a)){e.next=15;break}return this.progressTierFormWithSyncedFundedWallet(t),e.abrupt("return");case 15:this.walletWaitForm.setWallet(t,a,this.confirmRegisterForm.tier),this.showForm(r.walletWait);case 17:case"end":return e.stop()}}),e,this)}))),function(e,t){return C.apply(this,arguments)})},{key:"progressTierFormWithSyncedFundedWallet",value:(w=s(f().mark((function e(t){var n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=ft().exchanges[this.host],r=this.confirmRegisterForm.tier,a=this.page,o=n.auth.liveStrength+n.auth.pendingStrength-n.auth.weakStrength,!(r>n.auth.targetTier&&r>o)){e.next=7;break}return this.runAnimation(this.confirmRegisterForm,a.confirmRegForm),e.abrupt("return");case 7:return s=ft().loading(this.body),e.prev=8,e.next=11,this.updateBondOptions({bondAssetID:t,targetTier:r});case 11:s(),e.next=19;break;case 14:return e.prev=14,e.t0=e.catch(8),s(),this.regAssetForm.setTierError(e.t0.msg),e.abrupt("return");case 19:this.showSuccess(ke(se));case 20:case"end":return e.stop()}}),e,this,[[8,14]])}))),function(e){return w.apply(this,arguments)})},{key:"updateReputation",value:function(){var e=this.page,t=ft().exchanges[this.host].auth,n=t.rep.penalties,r=t.targetTier,a=t.expiredBonds,o=dn(t);e.targetTier.textContent=String(r),e.effectiveTier.textContent=String(o),e.penalties.textContent=String(n),e.bondsPendingRefund.textContent="".concat((null==a?void 0:a.length)||0),this.reputationMeter.update()}},{key:"showForm",value:(k=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,this.currentForm=t,this.forms.forEach((function(e){return Ne.hide(e)})),t.style.right="10000px",Ne.show(n.forms,t),r=(n.forms.offsetWidth+t.offsetWidth)/2,e.next=8,Ne.animate(300,(function(e){t.style.right="".concat((1-e)*r,"px")}),"easeOutHard");case 8:t.style.right="0";case 9:case"end":return e.stop()}}),e,this)}))),function(e){return k.apply(this,arguments)})},{key:"runAnimation",value:(x=s(f().mark((function e(t,n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return Ne.hide(this.currentForm),e.next=3,t.animate();case 3:this.currentForm=n,Ne.show(n);case 5:case"end":return e.stop()}}),e,this)}))),function(e,t){return x.apply(this,arguments)})},{key:"closePopups",value:function(){Ne.hide(this.page.forms),this.animation&&this.animation.stop()}},{key:"showSuccess",value:(m=s(f().mark((function e(t){var n=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.forms.forEach((function(e){return Ne.hide(e)})),this.currentForm=this.page.checkmarkForm,this.animation=Er(this.page,t),e.next=5,this.animation.wait();case 5:this.animation=new We(1500,(function(){}),"",(function(){n.currentForm===n.page.checkmarkForm&&n.closePopups()}));case 6:case"end":return e.stop()}}),e,this)}))),function(e){return m.apply(this,arguments)})},{key:"exportAccount",value:(p=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.host,r={host:n},a=ft().loading(this.body),e.next=5,S("/api/exportaccount",r);case 5:if(o=e.sent,a(),ft().checkResponse(o)){e.next=11;break}return t.exportAccountErr.textContent=o.msg,Ne.show(t.exportAccountErr),e.abrupt("return");case 11:o.account.bonds=o.bonds,s=JSON.parse(JSON.stringify(o.account)),(i=document.createElement("a")).setAttribute("download","dcrAccount-"+n+".json"),i.setAttribute("href","data:text/json,"+JSON.stringify(s,null,2)),i.click(),Ne.hide(t.forms);case 18:case"end":return e.stop()}}),e,this)}))),function(){return p.apply(this,arguments)})},{key:"toggleAccountStatus",value:(u=s(f().mark((function e(t){var n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,Ne.hide(n.errMsg),r=this.host,t&&(r=n.disableAccountHost.textContent),a={host:r,disable:t},o=ft().loading(this.body),e.next=8,S("/api/toggleaccountstatus",a);case 8:if(s=e.sent,o(),ft().checkResponse(s)){e.next=13;break}return t?(n.disableAccountErr.textContent=s.msg,Ne.show(n.disableAccountErr)):(n.errMsg.textContent=s.msg,Ne.show(n.errMsg)),e.abrupt("return");case 13:return t?(this.page.toggleAccountStatusBtn.textContent=ke("ENABLE_ACCOUNT"),Ne.hide(n.forms)):this.page.toggleAccountStatusBtn.textContent=ke("DISABLE_ACCOUNT"),this.accountDisabled=t,e.next=17,ft().fetchUser();case 17:ft().loadPage("dexsettings/".concat(r));case 18:case"end":return e.stop()}}),e,this)}))),function(e){return u.apply(this,arguments)})},{key:"prepareAccountDisable",value:(l=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:(n=this.page).disableAccountHost.textContent=this.host,n.disableAccountErr.textContent="",this.showForm(t);case 4:case"end":return e.stop()}}),e,this)}))),function(e){return l.apply(this,arguments)})},{key:"getBondsFeeBuffer",value:(c=s(f().mark((function e(t,n){var r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=ft().loading(n),e.next=3,S("/api/bondsfeebuffer",{assetID:t});case 3:if(a=e.sent,r(),ft().checkResponse(a)){e.next=7;break}return e.abrupt("return",0);case 7:return e.abrupt("return",a.feeBuffer);case 8:case"end":return e.stop()}}),e)}))),function(e,t){return c.apply(this,arguments)})},{key:"prepareUpdateHost",value:(o=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.page,this.dexAddrForm.refresh(),this.showForm(t.dexAddrForm);case 3:case"end":return e.stop()}}),e,this)}))),function(){return o.apply(this,arguments)})},{key:"onCertFileChange",value:(a=s(f().mark((function e(){var t,n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,Ne.hide(t.errMsg),!(n=t.certFileInput.files)||!n.length){e.next=7;break}return e.next=6,n[0].text();case 6:r=e.sent;case 7:if(r){e.next=9;break}return e.abrupt("return");case 9:return a={host:this.host,cert:r},o=ft().loading(this.body),e.next=13,S("/api/updatecert",a);case 13:s=e.sent,o(),ft().checkResponse(s)?(Ne.show(t.updateCertMsg),setTimeout((function(){Ne.hide(t.updateCertMsg)}),5e3)):(t.errMsg.textContent=s.msg,Ne.show(t.errMsg));case 16:case"end":return e.stop()}}),e,this)}))),function(){return a.apply(this,arguments)})},{key:"setConnectionStatus",value:function(){var e=this.page,t=ft().user.exchanges[this.host],n=function(t){t?(Ne.hide(e.disconnectedIcon),Ne.show(e.connectedIcon)):(Ne.show(e.disconnectedIcon),Ne.hide(e.connectedIcon))};if(t)switch(t.connectionStatus){case ut.Connected:n(!0),e.connectionStatus.textContent=ke("CONNECTED");break;case ut.Disconnected:n(!1),this.accountDisabled?e.connectionStatus.textContent=ke("ACCOUNT_DISABLED_MSG"):e.connectionStatus.textContent=ke($);break;case ut.InvalidCert:n(!1),e.connectionStatus.textContent="".concat(ke($)," - ").concat(ke("INVALID_CERTIFICATE"))}}},{key:"disableAutoRenew",value:(r=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=ft().loading(this.page.otherBondSettings),e.prev=1,this.updateBondOptions({targetTier:0}),t(),e.next=10;break;case 6:throw e.prev=6,e.t0=e.catch(1),t(),e.t0;case 10:case"end":return e.stop()}}),e,this,[[1,6]])}))),function(){return r.apply(this,arguments)})},{key:"updateBondOptions",value:(n=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.host=this.host,e.next=3,S("/api/updatebondoptions",t);case 3:r=null!==(n=t.targetTier)&&void 0!==n?n:ft().exchanges[this.host].auth.targetTier,this.renewToggle.setState(r>0);case 5:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"newWalletCreated",value:(t=s(f().mark((function e(t,n){var r,a,o,s,i,c,l;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.regAssetForm.refresh(),e.next=3,ft().fetchUser();case 3:if(r=e.sent){e.next=6;break}return e.abrupt("return");case 6:return a=this.page,o=r.assets[t],s=o.wallet,i=ft().exchanges[this.host],c=i.bondAssets[o.symbol].amount,e.next=13,this.getBondsFeeBuffer(t,a.newWalletForm);case 13:if(l=e.sent,this.confirmRegisterForm.setFees(t,l),!(s.synced&&s.balance.available>=2*c+l)){e.next=18;break}return this.progressTierFormWithSyncedFundedWallet(t),e.abrupt("return");case 18:return this.walletWaitForm.setWallet(t,l,n),e.next=21,this.showForm(a.walletWait);case 21:case"end":return e.stop()}}),e,this)}))),function(e,n){return t.apply(this,arguments)})}]),I}(lt);var jo=function(e){g(o,e);var t,n,r,a=(n=o,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(n);if(r){var a=b(this).constructor;e=Reflect.construct(t,arguments,a)}else e=t.apply(this,arguments);return y(this,e)});function o(e){var t;i(this,o),h(v(t=a.call(this)),"page",void 0),h(v(t),"base",void 0),h(v(t),"quote",void 0),h(v(t),"host",void 0);var n=t.page=Ne.idDescendants(e);return Ne.cleanTemplates(n.runTableRowTmpl),Ne.bind(n.backButton,"click",(function(){ft().loadPage("mm")})),t.setup(),t}return d(o,[{key:"setup",value:(t=s(f().mark((function e(){var t,n,r,a,o=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T("/api/archivedmmruns");case 2:if(t=e.sent,ft().checkResponse(t)){e.next=6;break}return console.error("failed to get archived mm runs",t),e.abrupt("return");case 6:n=t.runs,r=f().mark((function e(){var t,r,s,i,c,l,u,d;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=n[a],r=t.startTime,s=t.market,i=s.baseID,c=s.quoteID,l=s.host,u=o.page.runTableRowTmpl.cloneNode(!0),(d=Ne.parseTemplate(u)).startTime.textContent=new Date(1e3*r).toLocaleString(),Qn(u,i,c,l),Ne.bind(d.logs,"click",(function(){ft().loadPage("mmlogs",{baseID:i,quoteID:c,host:l,startTime:r,returnPage:"mmarchives"})})),Ne.bind(d.settings,"click",(function(){ft().loadPage("mmsettings",{host:l,baseID:i,quoteID:c})})),o.page.runTableBody.appendChild(u);case 8:case"end":return e.stop()}}),e)})),a=0;case 9:if(!(a<n.length)){e.next=14;break}return e.delegateYield(r(),"t0",11);case 11:a++,e.next=9;break;case 14:case"end":return e.stop()}}),e)}))),function(){return t.apply(this,arguments)})}]),o}(lt);function Ho(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return zo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?zo(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function zo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Go(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}var Xo=0,Ko=function(e){g(p,e);var t,n,r,o,c,l,u=(c=p,l=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(c);if(l){var n=b(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return y(this,e)});function p(e,t){var n,r;i(this,p),h(v(r=u.call(this)),"page",void 0),h(v(r),"mkt",void 0),h(v(r),"startTime",void 0),h(v(r),"fiatRates",void 0),h(v(r),"liveBot",void 0),h(v(r),"overview",void 0),h(v(r),"events",void 0),h(v(r),"forms",void 0),h(v(r),"dexOrderIDCopyListener",void 0),h(v(r),"cexOrderIDCopyListener",void 0),h(v(r),"depositIDCopyListener",void 0),h(v(r),"withdrawalIDCopyListener",void 0),h(v(r),"filters",void 0),h(v(r),"loading",void 0),h(v(r),"refID",void 0),h(v(r),"doneScrolling",void 0),h(v(r),"statsRows",void 0);var a=r.page=Ne.idDescendants(e);if(Xo=ft().user.net,Ne.cleanTemplates(a.eventTableRowTmpl,a.dexOrderTxRowTmpl,a.performanceTableRowTmpl),Ne.bind(r.page.backButton,"click",(function(){var e;ft().loadPage(null!==(e=t.returnPage)&&void 0!==e?e:"mm")})),Ne.bind(r.page.filterButton,"click",(function(){r.applyFilters()})),null!==(n=t)&&void 0!==n&&n.host){var o=new URL(window.location.href);o.searchParams.set("host",t.host),o.searchParams.set("baseID",String(t.baseID)),o.searchParams.set("quoteID",String(t.quoteID)),o.searchParams.set("startTime",String(t.startTime)),window.history.replaceState(function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Go(Object(n),!0).forEach((function(t){h(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Go(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}({page:"mmsettings"},t),"",o)}else{var s=new URLSearchParams(window.location.search);t||(t={}),t.host=s.get("host")||"",t.baseID=parseInt(s.get("baseID")||"0"),t.quoteID=parseInt(s.get("quoteID")||"0"),t.startTime=parseInt(s.get("startTime")||"0")}var c=t,l=c.baseID,d=c.quoteID,f=c.host,m=c.startTime;return r.startTime=m,r.forms=new hr(a.forms),r.events={},r.statsRows={},r.mkt={baseID:l,quoteID:d,host:f},Qn(e,l,d,f),Ne.bind(e,"scroll",(function(){r.loading||r.doneScrolling||a.eventsTable.offsetHeight-e.offsetHeight-e.scrollTop<0&&r.nextPage()})),r.setup(f,l,d),r}return d(p,[{key:"nextPage",value:(o=s(f().mark((function e(){var t,n,r,o,s,i,c,l,u,d;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.loading=!0,e.next=3,this.getRunLogs();case 3:t=e.sent,n=a(t,3),r=n[0],o=n[1],s=n[2],i=this.mktAssets(),c=Ho(r),e.prev=10,c.s();case 12:if((l=c.n()).done){e.next=20;break}if(u=l.value,!this.events[u.id]){e.next=16;break}return e.abrupt("continue",18);case 16:d=this.newEventRow(u,!1,i),this.events[u.id]=[u,d];case 18:e.next=12;break;case 20:e.next=25;break;case 22:e.prev=22,e.t0=e.catch(10),c.e(e.t0);case 25:return e.prev=25,c.f(),e.finish(25);case 28:this.populateStats(s.profitLoss,s.endTime),this.updateExistingRows(o),this.loading=!1;case 31:case"end":return e.stop()}}),e,this,[[10,22,25,28]])}))),function(){return o.apply(this,arguments)})},{key:"getRunLogs",value:(r=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.mkt,n=this.startTime,r={market:t,startTime:n,n:50,filters:this.filters,refID:this.refID},e.next=4,S("/api/mmrunlogs",r);case 4:return a=e.sent,ft().checkResponse(a)||console.error("failed to get bot logs",a),a.logs.length<=1&&(this.doneScrolling=!0),a.logs.length>0&&(this.refID=a.logs[a.logs.length-1].id),e.abrupt("return",[a.logs,a.updatedLogs||[],a.overview]);case 9:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"applyFilters",value:(n=s(f().mark((function e(){var t,n,r,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,this.filters={dexSells:!!t.dexSellsCheckbox.checked,dexBuys:!!t.dexBuysCheckbox.checked,cexSells:!!t.cexSellsCheckbox.checked,cexBuys:!!t.cexBuysCheckbox.checked,deposits:!!t.depositsCheckbox.checked,withdrawals:!!t.withdrawalsCheckbox.checked},this.refID=void 0,e.next=5,this.getRunLogs();case 5:n=e.sent,r=a(n,3),o=r[0],s=r[2],this.populateTable(o),this.populateStats(s.profitLoss,s.endTime);case 11:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"setFilters",value:function(){var e=this.page;e.dexSellsCheckbox.checked=!0,e.dexBuysCheckbox.checked=!0,e.cexSellsCheckbox.checked=!0,e.cexBuysCheckbox.checked=!0,e.depositsCheckbox.checked=!0,e.withdrawalsCheckbox.checked=!0,this.filters={dexSells:!0,dexBuys:!0,cexSells:!0,cexBuys:!0,deposits:!0,withdrawals:!0}}},{key:"setup",value:(t=s(f().mark((function e(t,n,r){var o,s,i,c,l,u,d,h,p,v,m,g,y,b,x,k,w=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s=this.page,this.setFilters(),i=this.startTime,l=0,u=tr(t,n,r),e.next=7,this.getRunLogs();case 7:d=e.sent,h=a(d,3),p=h[0],v=h[2],(null==u||null===(o=u.runStats)||void 0===o?void 0:o.startTime)===i?(this.liveBot=!0,this.fiatRates=ft().fiatRatesMap,c=u.runStats.profitLoss):(this.fiatRates=v.finalState.fiatRates,c=v.profitLoss,l=v.endTime),this.populateStats(c,l),m=this.mktAssets(),g=s.sumUSDHeader.parentElement,y=Ho(m);try{for(y.s();!(b=y.n()).done;)x=b.value,(k=document.createElement("th")).textContent="".concat(x.symbol.toUpperCase()," Delta"),g&&g.insertBefore(k,s.sumUSDHeader)}catch(e){y.e(e)}finally{y.f()}this.populateTable(p),ft().registerNoteFeeder({runevent:function(e){w.handleRunEventNote(e)},runstats:function(e){w.handleRunStatsNote(e)}});case 19:case"end":return e.stop()}}),e,this)}))),function(e,n,r){return t.apply(this,arguments)})},{key:"handleRunEventNote",value:function(e){var t=this.mkt,n=t.baseID,r=t.quoteID,a=t.host;if(e.host===a&&e.baseID===n&&e.quoteID===r&&(o=e.event,s=this.filters,o.dexOrderEvent?o.dexOrderEvent.sell?s.dexSells:s.dexBuys:o.cexOrderEvent?o.cexOrderEvent.sell?s.cexSells:s.cexBuys:o.depositEvent?s.deposits:o.withdrawalEvent&&s.withdrawals)){var o,s,i=e.event,c=this.events[i.id];if(c)return this.setRowContents(c[1],i,this.mktAssets()),void(c[0]=i);var l=this.newEventRow(i,!0,this.mktAssets());this.events[i.id]=[i,l]}}},{key:"handleRunStatsNote",value:function(e){var t=this.mkt,n=t.baseID,r=t.quoteID,a=t.host,o=this.startTime;e.host===a&&e.baseID===n&&e.quoteID===r&&e.stats&&e.stats.startTime===o&&this.populateStats(e.stats.profitLoss,0)}},{key:"populateStats",value:function(e,t){var n=this.page;for(var r in n.startTime.textContent=new Date(1e3*this.startTime).toLocaleString(),0===t?Ne.hide(n.endTimeRow):n.endTime.textContent=new Date(1e3*t).toLocaleString(),e.diffs){var a=ft().assets[parseInt(r)],o=this.statsRows[r];if(!o){o=n.performanceTableRowTmpl.cloneNode(!0);var s=Ne.parseTemplate(o);s.logo.src=Ne.logoPath(a.symbol),s.ticker.textContent=a.symbol.toUpperCase(),this.statsRows[r]=o,n.performanceTableBody.appendChild(o)}var i=e.diffs[r],c=Ne.parseTemplate(o);c.diff.textContent=i.fmt,c.usdDiff.textContent=i.fmtUSD,c.fiatRate.textContent="".concat(Ne.formatFiatValue(this.fiatRates[a.id])," USD")}n.profitLoss.textContent="".concat(Ne.formatFiatValue(e.profit)," USD")}},{key:"mktAssets",value:function(){var e,t=ft().assets[this.mkt.baseID],n=ft().assets[this.mkt.quoteID],r=[t,n],a=(h(e={},t.id,!0),h(e,n.id,!0),e);if(t.token&&!a[t.token.parentID]){var o=ft().assets[t.token.parentID];a[o.id]=!0,r.push(o)}if(n.token&&!a[n.token.parentID]){var s=ft().assets[n.token.parentID];r.push(s)}return r}},{key:"updateExistingRows",value:function(e){var t,n=Ho(e);try{for(n.s();!(t=n.n()).done;){var r=t.value,a=this.events[r.id];a&&(this.setRowContents(a[1],r,this.mktAssets()),a[0]=r)}}catch(e){n.e(e)}finally{n.f()}}},{key:"populateTable",value:function(e){var t=this.page;Ne.empty(t.eventsTableBody),this.events={},this.doneScrolling=!1;var n,r=this.mktAssets(),a=Ho(e);try{for(a.s();!(n=a.n()).done;){var o=n.value,s=this.newEventRow(o,!1,r);this.events[o.id]=[o,s]}}catch(e){a.e(e)}finally{a.f()}}},{key:"setRowContents",value:function(e,t,n){var r,a=this,o=Ne.parseTemplate(e);o.time.textContent=new Date(1e3*t.timestamp).toLocaleString(),o.eventType.textContent=this.eventType(t),t.depositEvent?r=t.depositEvent.transaction.id:t.withdrawalEvent?r=t.withdrawalEvent.id:t.dexOrderEvent?r=t.dexOrderEvent.id:t.cexOrderEvent&&(r=t.cexOrderEvent.id),r&&(o.eventID.textContent=Qo(r,30),o.eventID.setAttribute("title",r));var s,i=0,c=Ho(n);try{for(c.s();!(s=c.n()).done;){var l,u=s.value,d=t.balanceEffects,h=Yo(u.id,d),p="sum".concat(u.symbol.toUpperCase()),f=void 0;if(o[p])f=o[p];else{(f=document.createElement("td")).dataset.tmpl=p;var v=o.sumUSD.parentElement;v&&v.insertBefore(f,o.sumUSD)}f.textContent=Ne.formatCoinValue(h,u.unitInfo),i+=null!==(l=h/u.unitInfo.conventional.conversionFactor*this.fiatRates[u.id])&&void 0!==l?l:0}}catch(e){c.e(e)}finally{c.f()}o.sumUSD.textContent=Ne.formatFourSigFigs(i),Ne.bind(o.details,"click",(function(){a.showEventDetails(t.id)}))}},{key:"newEventRow",value:function(e,t,n){var r=this.page,a=r.eventTableRowTmpl.cloneNode(!0);return a.id=e.id.toString(),this.setRowContents(a,e,n),t?r.eventsTableBody.insertBefore(a,r.eventsTableBody.firstChild):r.eventsTableBody.appendChild(a),a}},{key:"eventType",value:function(e){return e.depositEvent?"Deposit":e.withdrawalEvent?"Withdrawal":e.dexOrderEvent?e.dexOrderEvent.sell?"DEX Sell":"DEX Buy":e.cexOrderEvent?e.cexOrderEvent.sell?"CEX Sell":"CEX Buy":""}},{key:"showDexOrderEventDetails",value:function(e){var t=this.page,n=this.mkt,r=n.baseID,a=n.quoteID,o=ft().assets[r],s=ft().assets[a],i=[o.unitInfo,s.unitInfo],c=i[0],l=i[1],u=[c.conventional.unit,l.conventional.unit],d=u[0],h=u[1];void 0!==this.dexOrderIDCopyListener&&t.copyDexOrderID.removeEventListener("click",this.dexOrderIDCopyListener),this.dexOrderIDCopyListener=function(){rt(e.id,t.dexOrderID,t.copyDexOrderID,"#1e7d11")},t.copyDexOrderID.addEventListener("click",this.dexOrderIDCopyListener),t.dexOrderID.textContent=Qo(e.id,20),t.dexOrderID.setAttribute("title",e.id);var p=ft().conventionalRate(r,a,e.rate);t.dexOrderRate.textContent="".concat(p," ").concat(d,"/").concat(h),t.dexOrderQty.textContent="".concat(e.qty/c.conventional.conversionFactor," ").concat(d),e.sell?t.dexOrderSide.textContent=ke(B):t.dexOrderSide.textContent=ke(E),Ne.empty(t.dexOrderTxsTableBody),Ne.setVis(e.transactions&&e.transactions.length>0,t.dexOrderTxsTable);for(var f=function(e,t){switch(e){case 3:case 5:case 6:return t?o:s;case 4:return t?s:o}},v=0;e.transactions&&v<e.transactions.length;v++){var m=e.transactions[v],g=t.dexOrderTxRowTmpl.cloneNode(!0),y=Ne.parseTemplate(g);y.id.textContent=Qo(m.id,20),y.id.setAttribute("title",m.id),y.type.textContent=Xr(m.type);var b=f(m.type,e.sell);if(b){var x=En[b.id];x&&x[Xo]&&(y.explorerLink.href=x[Xo](m.id)),y.amt.textContent="".concat(Ne.formatCoinValue(m.amount,b.unitInfo)," ").concat(b.unitInfo.conventional.unit.toLowerCase()),y.fees.textContent="".concat(Ne.formatCoinValue(m.fees,b.unitInfo)," ").concat(b.unitInfo.conventional.unit.toLowerCase()),t.dexOrderTxsTableBody.appendChild(g)}else console.error("unexpected tx type in dex order event",m.type)}this.forms.show(t.dexOrderDetailsForm)}},{key:"showCexOrderEventDetails",value:function(e){var t=this.page,n=this.mkt,r=n.baseID,a=n.quoteID,o=ft().assets[r],s=ft().assets[a],i=[o.unitInfo,s.unitInfo],c=i[0],l=i[1],u=[c.conventional.unit,l.conventional.unit],d=u[0],h=u[1];t.cexOrderID.textContent=Qo(e.id,20),void 0!==this.cexOrderIDCopyListener&&t.copyCexOrderID.removeEventListener("click",this.cexOrderIDCopyListener),this.cexOrderIDCopyListener=function(){rt(e.id,t.cexOrderID,t.copyCexOrderID,"#1e7d11")},t.copyCexOrderID.addEventListener("click",this.cexOrderIDCopyListener),t.cexOrderID.setAttribute("title",e.id);var p=ft().conventionalRate(r,a,e.rate);t.cexOrderRate.textContent="".concat(p," ").concat(d,"/").concat(h),t.cexOrderQty.textContent="".concat(e.qty/c.conventional.conversionFactor," ").concat(d),e.sell?t.cexOrderSide.textContent=ke(B):t.cexOrderSide.textContent=ke(E),t.cexOrderBaseFilled.textContent="".concat(e.baseFilled/c.conventional.conversionFactor," ").concat(d),t.cexOrderQuoteFilled.textContent="".concat(e.quoteFilled/l.conventional.conversionFactor," ").concat(h),this.forms.show(t.cexOrderDetailsForm)}},{key:"showDepositEventDetails",value:function(e,t){var n=this.page;n.depositID.textContent=Qo(e.transaction.id,20),void 0!==this.depositIDCopyListener&&n.copyDepositID.removeEventListener("click",this.depositIDCopyListener),this.depositIDCopyListener=function(){rt(e.transaction.id,n.depositID,n.copyDepositID,"#1e7d11")},n.copyDepositID.addEventListener("click",this.depositIDCopyListener),n.depositID.setAttribute("title",e.transaction.id);var r=ft().assets[e.assetID].unitInfo,a=r.conventional.unit;n.depositAmt.textContent="".concat(Ne.formatCoinValue(e.transaction.amount,r)," ").concat(a),n.depositFees.textContent="".concat(Ne.formatCoinValue(e.transaction.fees,r)," ").concat(a),n.depositStatus.textContent=ke(t?me:ge),Ne.setVis(!t,n.depositCreditSection),t||(n.depositCredit.textContent="".concat(Ne.formatCoinValue(e.cexCredit,r)," ").concat(a)),this.forms.show(n.depositDetailsForm)}},{key:"showWithdrawalEventDetails",value:function(e,t){var n=this.page;n.withdrawalID.textContent=Qo(e.id,20),void 0!==this.withdrawalIDCopyListener&&n.copyWithdrawalID.removeEventListener("click",this.withdrawalIDCopyListener),this.withdrawalIDCopyListener=function(){rt(e.id,n.withdrawalID,n.copyWithdrawalID,"#1e7d11")},n.copyWithdrawalID.addEventListener("click",this.withdrawalIDCopyListener),n.withdrawalID.setAttribute("title",e.id);var r=ft().assets[e.assetID].unitInfo,a=r.conventional.unit;n.withdrawalAmt.textContent="".concat(Ne.formatCoinValue(e.cexDebit,r)," ").concat(a),n.withdrawalStatus.textContent=ke(t?me:ge),e.transaction&&(n.withdrawalTxID.textContent=Qo(e.transaction.id,20),n.withdrawalTxID.setAttribute("title",e.transaction.id),n.withdrawalReceived.textContent="".concat(Ne.formatCoinValue(e.transaction.amount,r)," ").concat(a)),this.forms.show(n.withdrawalDetailsForm)}},{key:"showEventDetails",value:function(e){var t=a(this.events[e],1)[0];t.dexOrderEvent&&this.showDexOrderEventDetails(t.dexOrderEvent),t.cexOrderEvent&&this.showCexOrderEventDetails(t.cexOrderEvent),t.depositEvent&&this.showDepositEventDetails(t.depositEvent,t.pending),t.withdrawalEvent&&this.showWithdrawalEventDetails(t.withdrawalEvent,t.pending)}}]),p}(lt);function Qo(e,t){return e.length<=t?e:"".concat(e.substring(0,t/2),"...").concat(e.substring(e.length-t/2))}function Yo(e,t){var n=0;return t.settled[e]&&(n+=t.settled[e]),t.pending[e]&&(n+=t.pending[e]),t.locked[e]&&(n+=t.locked[e]),t.reserved[e]&&(n+=t.reserved[e]),n}function Jo(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Zo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Zo(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function Zo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var $o,es=function(e){g(o,e);var t,n,r,a=(n=o,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(n);if(r){var a=b(this).constructor;e=Reflect.construct(t,arguments,a)}else e=t.apply(this,arguments);return y(this,e)});function o(e){var t;i(this,o),h(v(t=a.call(this)),"body",void 0),h(v(t),"page",void 0),h(v(t),"initForm",void 0),h(v(t),"quickConfigForm",void 0),h(v(t),"seedBackupForm",void 0),h(v(t),"mnemonic",void 0),t.body=e;var n=t.page=Ne.idDescendants(e);return t.initForm=new ts(n.appPWForm,(function(e,n,r){t.appInited(e,n,r)})),t.quickConfigForm=new rs(n.quickConfigForm,(function(){return t.quickConfigDone()})),t.seedBackupForm=new as(n.seedBackupForm,(function(){return t.seedBackedUp()})),t}return d(o,[{key:"appInited",value:(t=s(f().mark((function e(t,n,r){var a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.mnemonic=r,a=this.page,e.next=4,this.quickConfigForm.update(t,n);case 4:r&&this.seedBackupForm.update(r),Ar(a.appPWForm,a.quickConfigForm);case 6:case"end":return e.stop()}}),e,this)}))),function(e,n,r){return t.apply(this,arguments)})},{key:"quickConfigDone",value:function(){this.mnemonic?Ar(this.page.quickConfigForm,this.page.seedBackupForm):ft().loadPage("wallets")}},{key:"seedBackedUp",value:function(){ft().loadPage("wallets")}}]),o}(lt),ts=function(){function e(t,n){var r=this;i(this,e),h(this,"form",void 0),h(this,"page",void 0),h(this,"success",void 0),this.form=t,this.success=n;var a=this.page=Ne.idDescendants(t);Br(t,a.appPWSubmit,(function(){return r.setAppPass()})),Br(t,a.toggleSeedInput,(function(){Ne.isHidden(a.seedInputBox)?(a.toggleSeedInputIcon.classList.remove("ico-plus"),a.toggleSeedInputIcon.classList.add("ico-minus"),Ne.show(a.seedInputBox)):(a.toggleSeedInputIcon.classList.remove("ico-minus"),a.toggleSeedInputIcon.classList.add("ico-plus"),Ne.hide(a.seedInputBox))}))}var t;return d(e,[{key:"setAppPass",value:(t=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,Ne.hide(n.appPWErrMsg),r=n.appPW.value||"",a=n.appPWAgain.value,""!==r){e.next=8;break}return n.appPWErrMsg.textContent=ke(R),Ne.show(n.appPWErrMsg),e.abrupt("return");case 8:if(r===a){e.next=12;break}return n.appPWErrMsg.textContent=ke(N),Ne.show(n.appPWErrMsg),e.abrupt("return");case 12:return n.appPW.value="",n.appPWAgain.value="",o=ft().loading(this.form),s=null!==(t=n.seedInput.value)&&void 0!==t?t:"",e.next=18,S("/api/init",{pass:r,seed:s});case 18:if(i=e.sent,o(),ft().checkResponse(i)){e.next=24;break}return n.appPWErrMsg.textContent=i.msg,Ne.show(n.appPWErrMsg),e.abrupt("return");case 24:this.success(r,i.hosts,i.mnemonic);case 25:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),ns=0,rs=function(){function e(t,n){var r=this;i(this,e),h(this,"page",void 0),h(this,"form",void 0),h(this,"servers",void 0),h(this,"wallets",void 0),h(this,"pw",void 0),h(this,"success",void 0),this.form=t,this.success=n;var a=this.page=Ne.idDescendants(t);Ne.cleanTemplates(a.qcServerTmpl,a.qcWalletTmpl),Br(t,a.quickConfigSubmit,(function(){r.submit()})),Br(t,a.qcErrAck,(function(){r.success()}))}var t,n;return d(e,[{key:"update",value:(n=s(f().mark((function e(t,n){var r,a,o,s,i,c,l,u,d,h,p,v,m,g,y,b,x,k,w;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.pw=t,r=this.page,this.servers=[],a=Jo(n);try{for(a.s();!(o=a.n()).done;)s=o.value,i=r.qcServerTmpl.cloneNode(!0),r.qcServersBox.appendChild(i),c=Ne.parseTemplate(i),ns++,l="qcsrow".concat(ns),i.htmlFor=l,c.checkbox.id=l,c.host.textContent=s,this.servers.push({host:s,checkbox:c.checkbox})}catch(e){a.e(e)}finally{a.f()}return e.next=7,ft().fetchUser();case 7:u=e.sent,this.wallets=[],d=0,h=Object.values(u.assets);case 10:if(!(d<h.length)){e.next=52;break}if(!(p=h[d]).token){e.next=14;break}return e.abrupt("continue",49);case 14:v=p.info,m=null,g=Jo(v.availablewallets),e.prev=17,g.s();case 19:if((y=g.n()).done){e.next=29;break}if((b=y.value).seeded){e.next=23;break}return e.abrupt("continue",27);case 23:if(!b.configopts||!b.configopts.some((function(e){return e.required}))){e.next=25;break}return e.abrupt("continue",27);case 25:return m=b,e.abrupt("break",29);case 27:e.next=19;break;case 29:e.next=34;break;case 31:e.prev=31,e.t0=e.catch(17),g.e(e.t0);case 34:return e.prev=34,g.f(),e.finish(34);case 37:if(m){e.next=39;break}return e.abrupt("continue",49);case 39:x=r.qcWalletTmpl.cloneNode(!0),r.qcWalletsBox.appendChild(x),k=Ne.parseTemplate(x),ns++,w="qcwrow".concat(ns),x.htmlFor=w,k.checkbox.id=w,k.icon.src=Ne.logoPath(p.symbol),k.name.textContent=p.name,this.wallets.push({asset:p,type:m.type,checkbox:k.checkbox});case 49:d++,e.next=10;break;case 52:case"end":return e.stop()}}),e,this,[[17,31,34,37]])}))),function(e,t){return n.apply(this,arguments)})},{key:"submit",value:(t=s(f().mark((function e(){var t,n,r,a,o,i,c,l,u,d,h,p,v=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=[],n=[],(r=new Yt(this.form,{backgroundColor:!0,message:"..."})).opts.message=ke("ADDING_SERVER"),a=function(){var e=s(f().mark((function e(n){var r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n.checkbox.checked){e.next=2;break}return e.abrupt("return");case 2:return r={addr:n.host,appPW:v.pw},e.next=5,S("/api/adddex",r);case 5:a=e.sent,ft().checkResponse(a)||t.push(n.host);case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),e.next=6,Promise.all(this.servers.map(a));case 6:return r.opts.message=ke("CREATING_WALLETS"),o=function(){var e=s(f().mark((function e(t){var r,a,o,s,i,c,l,u,d,h;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=t.asset,o=t.type,t.checkbox.checked){e.next=3;break}return e.abrupt("return");case 3:s={},i=ft().walletDefinition(a.id,o),c=Jo(null!==(r=i.configopts)&&void 0!==r?r:[]),e.prev=6,c.s();case 8:if((l=c.n()).done){e.next=18;break}if((u=l.value).default){e.next=12;break}return e.abrupt("continue",16);case 12:if(!u.isboolean){e.next=15;break}return s[u.key]=u.default?"1":"0",e.abrupt("continue",16);case 15:u.repeatable&&s[u.key]?s[u.key]+=u.repeatable+u.default:s[u.key]=String(u.default);case 16:e.next=8;break;case 18:e.next=23;break;case 20:e.prev=20,e.t0=e.catch(6),c.e(e.t0);case 23:return e.prev=23,c.f(),e.finish(23);case 26:return d={assetID:a.id,appPass:v.pw,config:s,walletType:o},e.next=29,S("/api/newwallet",d);case 29:h=e.sent,ft().checkResponse(h)||n.push(a.name);case 31:case"end":return e.stop()}}),e,null,[[6,20,23,26]])})));return function(t){return e.apply(this,arguments)}}(),e.next=10,Promise.all(this.wallets.map(o));case 10:return r.stop(),e.next=13,ft().fetchUser();case 13:if(n.length+t.length!==0){e.next=15;break}return e.abrupt("return",this.success());case 15:if(i=this.page,Ne.hide(i.qcChoices),Ne.show(i.qcErrors),t.length){c=Jo(t);try{for(c.s();!(l=c.n()).done;)u=l.value,i.qcServerErrorList.appendChild(document.createTextNode(u)),i.qcServerErrorList.appendChild(document.createElement("br"))}catch(e){c.e(e)}finally{c.f()}}else Ne.hide(i.qcServerErrors);if(n.length){d=Jo(n);try{for(d.s();!(h=d.n()).done;)p=h.value,i.qcWalletErrorList.appendChild(document.createTextNode(p)),i.qcWalletErrorList.appendChild(document.createElement("br"))}catch(e){d.e(e)}finally{d.f()}}else Ne.hide(i.qcWalletErrors);case 20:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),as=function(){function e(t,n){var r=this;i(this,e),h(this,"form",void 0),h(this,"page",void 0),h(this,"mnemonic",void 0),this.form=t;var a=this.page=Ne.idDescendants(t);Br(t,a.seedAck,(function(){return n()})),Br(t,a.showSeed,(function(){return r.showSeed()}))}return d(e,[{key:"update",value:function(e){this.mnemonic=e}},{key:"showSeed",value:function(){var e=this.page;e.mnemonic.textContent=this.mnemonic,Ne.hide(e.sbWanna),Ne.show(e.sbSeed)}}]),e}();function os(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ss(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?os(Object(n),!0).forEach((function(t){h(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):os(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function is(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return cs(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?cs(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function cs(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var ls=Ne.idel,us=Ne.bind,ds=Ne.unbind,hs={login:qr,register:Mr,markets:Ha,wallets:Zr,settings:xa,orders:ao,order:lo,dexsettings:_o,init:es,mm:ko,mmsettings:qo,mmarchives:jo,mmlogs:Ko},ps={"en-US":{name:"English",flag:"🇺🇸"},"pt-BR":{name:"Portugese",flag:"🇧🇷"},"zh-CN":{name:"Chinese",flag:"🇨🇳"},"pl-PL":{name:"Polish",flag:"🇵🇱"},"de-DE":{name:"German",flag:"🇩🇪"},ar:{name:"Arabic",flag:"🇪🇬"}},fs=function(){function e(){var t=this;i(this,e),h(this,"notes",void 0),h(this,"pokes",void 0),h(this,"langs",void 0),h(this,"lang",void 0),h(this,"mmStatus",void 0),h(this,"inited",void 0),h(this,"authed",void 0),h(this,"user",void 0),h(this,"seedGenTime",void 0),h(this,"commitHash",void 0),h(this,"showPopups",void 0),h(this,"loggers",void 0),h(this,"recorders",void 0),h(this,"main",void 0),h(this,"header",void 0),h(this,"headerSpace",void 0),h(this,"assets",void 0),h(this,"exchanges",void 0),h(this,"walletMap",void 0),h(this,"fiatRatesMap",void 0),h(this,"tooltip",void 0),h(this,"page",void 0),h(this,"loadedPage",void 0),h(this,"popupNotes",void 0),h(this,"popupTmpl",void 0),h(this,"noteReceivers",void 0),h(this,"txHistoryMap",void 0),h(this,"requiredActions",void 0),this.notes=[],this.pokes=[],this.seedGenTime=0,this.commitHash="e65d4adb63fcdaab8f5a03a3bcea2ed984718e46",this.noteReceivers=[],this.fiatRatesMap={},this.showPopups="1"===k.fetchLocal(k.popupsLK),this.txHistoryMap={},this.requiredActions={},console.log("Bison Wallet, Build",this.commitHash.substring(0,7)),k.isDark()&&document.body.classList.add("dark"),this.loggers=k.fetchLocal(k.loggersLK)||{},window.enableLogger=function(e,n){return n?t.loggers[e]=!0:delete t.loggers[e],k.storeLocal(k.loggersLK,t.loggers),"".concat(e," logger ").concat(n?"enabled":"disabled")},window.log=function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];t.log.apply(t,[e].concat(r))},window.mmStatus=function(){return t.mmStatus};var n=k.fetchLocal(k.recordersLK)||[];this.recorders={};var r,a=is(n);try{for(a.s();!(r=a.n()).done;){var o=r.value;console.log("recording",o),this.recorders[o]=[]}}catch(e){a.e(e)}finally{a.f()}window.recordLogger=function(e,n){return n?t.recorders[e]=[]:delete t.recorders[e],k.storeLocal(k.recordersLK,Object.keys(t.recorders)),"".concat(e," recorder ").concat(n?"enabled":"disabled")},window.dumpLogger=function(e){var n=t.recorders[e];if(!n)return"no recorder for logger ".concat(e);var r=document.createElement("a");r.href="data:application/octet-stream;base64,".concat(window.btoa(JSON.stringify(n,null,4))),r.download="".concat(e,".json"),document.body.appendChild(r),r.click(),setTimeout((function(){document.body.removeChild(r)}),0)},window.user=function(){return t.user}}var t,n,o,c,l,u,p,v,m,g,y;return d(e,[{key:"start",value:(y=s(f().mark((function e(){var t,n,r=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return us(window,"popstate",(function(e){var t,n=null===(t=e.state)||void 0===t?void 0:t.page;(n||""===n)&&r.loadPage(n,e.state.data,!0)})),this.main=ls(document,"main"),t=this.main.dataset.handler,e.next=5,this.fetchUser();case 5:return e.next=8,be(this.lang,this.commitHash,!1);case 8:if(ms((n=new URL(window.location.href)).pathname)!==t&&(n.pathname="/".concat(t),n.search="",window.history.replaceState({page:t},"",n)),this.attachHeader(),this.attachActions(),this.attachCommon(this.header),this.attach({}),!this.authed){e.next=17;break}return e.next=17,this.fetchNotes();case 17:this.updateMenuItemsDisplay(),fa(),Ta.connect((void 0,a="https:"===window.location.protocol?"wss":"ws","".concat(a,"://").concat(window.location.host,"/ws")),(function(){return r.reconnected()})),Ta.registerRoute("notify",(function(e){r.notify(e)}));case 21:case"end":return e.stop()}var a}),e,this)}))),function(){return y.apply(this,arguments)})},{key:"reconnected",value:function(){var e;"settings"===(null===(e=this.main)||void 0===e?void 0:e.dataset.handler)?window.location.assign("/"):window.location.reload()}},{key:"fetchUser",value:(g=s(f().mark((function e(){var t,n,r,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T("/api/user");case 2:if(t=e.sent,this.checkResponse(t)){e.next=5;break}return e.abrupt("return");case 5:if(this.inited=t.inited,this.authed=Boolean(t.user),this.lang=t.lang,this.langs=t.langs,this.mmStatus=t.mmStatus,t.user){e.next=12;break}return e.abrupt("return");case 12:for(n=t.user,this.seedGenTime=n.seedgentime,this.user=n,this.assets=n.assets,this.exchanges=n.exchanges,this.walletMap={},this.fiatRatesMap=n.fiatRates,r=0,o=Object.entries(n.assets);r<o.length;r++)s=a(o[r],2),i=s[0],(c=s[1]).wallet&&(this.walletMap[i]=c.wallet);return this.updateMenuItemsDisplay(),e.abrupt("return",n);case 22:case"end":return e.stop()}}),e,this)}))),function(){return g.apply(this,arguments)})},{key:"fetchMMStatus",value:(m=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Xn.status();case 2:this.mmStatus=e.sent;case 3:case"end":return e.stop()}}),e,this)}))),function(){return m.apply(this,arguments)})},{key:"loadPage",value:(v=s(f().mark((function e(t,n,r){var a,o,s,i,c,l,u,d;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.tooltip.style.left="-10000px",Ne.hide(this.page.noteBox,this.page.profileBox),a=new URL("/".concat(t),window.location.origin),o=ms(t),e.next=6,window.fetch(a.toString());case 6:if((s=e.sent).ok){e.next=9;break}return e.abrupt("return",!1);case 9:return e.next=11,s.text();case 11:return i=e.sent,c=Ne.noderize(i),l=ls(c,"main"),u=l.dataset.handler,r||(d=u===o?a.toString():"/".concat(u),window.history.pushState({page:t,data:n},"",d)),document.title=c.title,this.main.replaceWith(l),this.main=l,this.noteReceivers=[],Ne.empty(this.headerSpace),this.attach(n),e.abrupt("return",!0);case 23:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return v.apply(this,arguments)})},{key:"attach",value:function(e){var t=this.main.dataset.handler;if(t){this.attachCommon(this.main),this.loadedPage&&this.loadedPage.unload();var n=hs[t];this.loadedPage=n?new n(this.main,e):null,this.bindTooltips(this.main),window.isWebview&&this.bindUrlHandlers(this.main),this.bindUnits(this.main)}else console.error("cannot attach to content with no specified handler")}},{key:"bindTooltips",value:function(e){var t=this;e.querySelectorAll("[data-tooltip]").forEach((function(e){us(e,"mouseenter",(function(){t.tooltip.textContent=e.dataset.tooltip||"";var n=Ne.layoutMetrics(e),r=n.centerX-t.tooltip.offsetWidth/2;r<0&&(r=5),r+t.tooltip.offsetWidth>document.body.offsetWidth&&(r=document.body.offsetWidth-t.tooltip.offsetWidth-5),t.tooltip.style.left="".concat(r,"px"),t.tooltip.style.top="".concat(n.bodyTop-t.tooltip.offsetHeight-5,"px")})),us(e,"mouseleave",(function(){t.tooltip.style.left="-10000px"}))}))}},{key:"bindUnits",value:function(e){var t=this,n=document.createElement("div");n.classList.add("position-absolute","p-3");var r=document.createElement("div");n.appendChild(r),r.classList.add("body-bg","border");var a,o=function(e,t,n){var a=Ne.safeSelector(e,"[data-unit-box]"),o=parseInt(a.dataset.atoms),s=document.createElement("div");s.textContent=t,r.appendChild(s),s.classList.add("p-2","hoverbg","pointer"),Ne.bind(s,"click",(function(){Ne.setText(e,"[data-value]",Ne.formatFourSigFigs(o/n,Math.round(Math.log10(n)))),Ne.setText(e,"[data-unit]",t)}))},s=is(Ne.applySelector(e,"[data-conversion-value]"));try{var i=function(){var e=a.value,s=Ne.safeSelector(e,"[data-unit-box]");Ne.bind(s,"mouseenter",(function(){Ne.empty(r),s.appendChild(n);var a=Ne.layoutMetrics(s),i=parseInt(s.dataset.assetID),c=t.assets[i].unitInfo;o(e,c.conventional.unit,c.conventional.conversionFactor);var l,u=is(c.denominations);try{for(u.s();!(l=u.n()).done;){var d=l.value,h=d.unit,p=d.conversionFactor;o(e,h,p)}}catch(e){u.e(e)}finally{u.f()}o(e,c.atomicUnit,1),a.bodyTop>n.offsetHeight+t.header.offsetHeight?(n.style.bottom="calc(100% - 1rem)",n.style.top="auto"):(n.style.top="calc(100% - 1rem)",n.style.bottom="auto")})),Ne.bind(s,"mouseleave",(function(){return n.remove()}))};for(s.s();!(a=s.n()).done;)i()}catch(e){s.e(e)}finally{s.f()}}},{key:"bindUrlHandlers",value:function(e){if(window.openUrl){var t,n=is(Ne.applySelector(e,"a[target=_blank]"));try{var r=function(){var e=t.value;Ne.bind(e,"click",(function(t){var n;t.preventDefault(),window.openUrl(null!==(n=e.href)&&void 0!==n?n:"")}))};for(n.s();!(t=n.n()).done;)r()}catch(e){n.e(e)}finally{n.f()}}}},{key:"attachHeader",value:function(){var e=this;this.header=ls(document.body,"header");var t=this.page=Ne.idDescendants(this.header);this.headerSpace=t.headerSpace,this.popupNotes=ls(document.body,"popupNotes"),this.popupTmpl=Ne.tmplElement(this.popupNotes,"note"),this.popupTmpl?this.popupTmpl.remove():console.error("popupTmpl element not found"),this.tooltip=ls(document.body,"tooltip"),t.noteTmpl.removeAttribute("id"),t.noteTmpl.remove(),t.pokeTmpl.removeAttribute("id"),t.pokeTmpl.remove(),t.loader.remove(),Ne.show(t.loader),us(t.noteBell,"click",s(f().mark((function n(){var r,a,o;return f().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:Ne.hide(t.pokeList),Ne.show(t.noteList),e.ackNotes(),t.noteCat.classList.add("active"),t.pokeCat.classList.remove("active"),e.showDropdown(t.noteBell,t.noteBox),Ne.hide(t.noteIndicator),r=is(e.notes);try{for(r.s();!(a=r.n()).done;)(o=a.value).acked&&o.el.classList.remove("firstview")}catch(e){r.e(e)}finally{r.f()}e.setNoteTimes(t.noteList),e.setNoteTimes(t.pokeList);case 11:case"end":return n.stop()}}),n)})))),us(t.burgerIcon,"click",(function(){Ne.hide(t.logoutErr),e.showDropdown(t.burgerIcon,t.profileBox)})),us(t.innerNoteIcon,"click",(function(){Ne.hide(t.noteBox)})),us(t.innerBurgerIcon,"click",(function(){Ne.hide(t.profileBox)})),us(t.profileSignout,"click",s(f().mark((function t(){return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.signOut();case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)})))),us(t.pokeCat,"click",(function(){e.setNoteTimes(t.pokeList),t.pokeCat.classList.add("active"),t.noteCat.classList.remove("active"),Ne.hide(t.noteList),Ne.show(t.pokeList),e.ackNotes()})),us(t.noteCat,"click",(function(){e.setNoteTimes(t.noteList),t.noteCat.classList.add("active"),t.pokeCat.classList.remove("active"),Ne.hide(t.pokeList),Ne.show(t.noteList),e.ackNotes()})),Ne.cleanTemplates(t.langBttnTmpl);var n=ps[this.lang],r=n.name,a=n.flag;t.langFlag.textContent=a,t.langName.textContent=r;var o,i=is(this.langs);try{var c=function(){var n=o.value;if(n===e.lang)return"continue";var r=t.langBttnTmpl.cloneNode(!0),a=ps[n],s=a.name,i=a.flag;r.textContent=i,r.title=s,Ne.bind(r,"click",(function(){return e.setLanguage(n)})),t.langBttns.appendChild(r)};for(i.s();!(o=i.n()).done;)c()}catch(e){i.e(e)}finally{i.f()}}},{key:"attachActions",value:function(){var e=this,t=this.page;Object.assign(t,Ne.idDescendants(Ne.idel(document.body,"requiredActions"))),Ne.cleanTemplates(t.missingNoncesTmpl,t.actionTxTableTmpl,t.tooCheapTmpl,t.lostNonceTmpl),Ne.bind(t.actionsCollapse,"click",(function(){Ne.hide(t.actionDialog),Ne.show(t.actionDialogCollapsed)})),Ne.bind(t.actionDialogCollapsed,"click",(function(){Ne.hide(t.actionDialogCollapsed),Ne.show(t.actionDialog),0===t.actionDialogContent.children.length&&e.showOldestAction()}));var n=function(t){var n=Object.values(e.requiredActions).filter((function(e){return e.selected}))[0],r=e.sortedActions(),a=r.indexOf(n);e.showRequestedAction(r[a+t].uniqueID)};Ne.bind(t.prevAction,"click",(function(){return n(-1)})),Ne.bind(t.nextAction,"click",(function(){return n(1)}))}},{key:"setRequiredActions",value:function(){var e=this.user.actions,t=this.requiredActions;if(e){var n,r=is(e);try{for(r.s();!(n=r.n()).done;){var a=n.value;this.addAction(a)}}catch(e){r.e(e)}finally{r.f()}Object.keys(t).length&&(this.showOldestAction(),this.blinkAction())}}},{key:"sortedActions",value:function(){var e=Object.values(this.requiredActions);return e.sort((function(e,t){return e.stamp-t.stamp})),e}},{key:"showOldestAction",value:function(){this.showRequestedAction(this.sortedActions()[0].uniqueID)}},{key:"addAction",value:function(e){var t=this.page,n=this.requiredActions,r=n[e.uniqueID];if(!r||r.actionID!==e.actionID){var a=this.actionForm(e);if(r)r.selected&&r.div.replaceWith(a),r.div=a;else{n[e.uniqueID]={div:a,stamp:(new Date).getTime(),uniqueID:e.uniqueID,actionID:e.actionID,selected:!1};var o=Object.keys(n).length;t.actionDialogCount.textContent=String(o),t.actionCount.textContent=String(o),Ne.isHidden(t.actionDialog)&&this.showRequestedAction(e.uniqueID)}}}},{key:"blinkAction",value:function(){Ne.blink(this.page.actionDialog),Ne.blink(this.page.actionDialogCollapsed)}},{key:"resolveAction",value:function(e){this.resolveActionWithID(e.uniqueID)}},{key:"resolveActionWithID",value:function(e){var t=this.page,n=this.requiredActions,r=n[e];if(r){delete n[e];var a=Object.keys(n).length;r.div.remove(),0!==a?(t.actionDialogCount.textContent=String(a),t.actionCount.textContent=String(a),r.selected&&this.showOldestAction()):Ne.hide(t.actionDialog,t.actionDialogCollapsed)}}},{key:"actionForm",value:function(e){switch(e.actionID){case"tooCheap":return this.tooCheapAction(e);case"missingNonces":return this.missingNoncesAction(e);case"lostNonce":return this.lostNonceAction(e);case"redeemRejected":return this.redeemRejectedAction(e)}throw Error("unknown required action ID "+e.actionID)}},{key:"actionTxTable",value:function(e){var t=e.assetID,n=e.payload,r=this.assets[t],a=r.unitInfo,o=r.token,s=this.page.actionTxTableTmpl.cloneNode(!0),i=Ne.parseTemplate(s);i.lostTxID.textContent=n.tx.id,i.lostTxID.dataset.explorerCoin=n.tx.id,Pn(o?o.parentID:t,i.lostTxID),i.txAmt.textContent=Ne.formatCoinValue(n.tx.amount,a),i.amtUnit.textContent=a.conventional.unit;var c=o?this.unitInfo(o.parentID):a;return i.type.textContent=Xr(n.tx.type),i.feeAmount.textContent=Ne.formatCoinValue(n.tx.fees,c),i.feeUnit.textContent=c.conventional.unit,"tooCheap"===e.actionID&&(Ne.show(i.newFeesRow),i.newFees.textContent=Ne.formatCoinValue(n.tx.fees,c),i.newFeesUnit.textContent=c.conventional.unit),s}},{key:"submitAction",value:(p=s(f().mark((function e(t,n,r){var a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return Ne.hide(r),a=this.loading(this.page.actionDialog),e.next=4,S("/api/takeaction",{assetID:t.assetID,actionID:t.actionID,action:n});case 4:if(o=e.sent,a(),this.checkResponse(o)){e.next=10;break}return r.textContent=o.msg,Ne.show(r),e.abrupt("return");case 10:this.resolveActionWithID(t.uniqueID);case 11:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return p.apply(this,arguments)})},{key:"missingNoncesAction",value:function(e){var t=this,n=e.assetID,r=this.page.missingNoncesTmpl.cloneNode(!0),a=Ne.parseTemplate(r),o=this.assets[n].name;return a.assetName.textContent=o,Ne.bind(a.doNothingBttn,"click",(function(){t.submitAction(e,{recover:!1},a.errMsg)})),Ne.bind(a.recoverBttn,"click",(function(){t.submitAction(e,{recover:!0},a.errMsg)})),r}},{key:"tooCheapAction",value:function(e){var t=this,n=e.assetID,r=e.payload,a=this.page.tooCheapTmpl.cloneNode(!0),o=Ne.parseTemplate(a),s=this.assets[n].name;o.assetName.textContent=s,o.txTable.appendChild(this.actionTxTable(e));var i=function(n){t.submitAction(e,{txID:r.tx.id,bump:n},o.errMsg)};return Ne.bind(o.keepWaitingBttn,"click",(function(){return i(!1)})),Ne.bind(o.addFeesBttn,"click",(function(){return i(!0)})),a}},{key:"lostNonceAction",value:function(e){var t=this,n=e.assetID,r=e.payload,a=this.page.lostNonceTmpl.cloneNode(!0),o=Ne.parseTemplate(a),s=this.assets[n].name;return o.assetName.textContent=s,o.nonce.textContent=String(r.nonce),o.txTable.appendChild(this.actionTxTable(e)),Ne.bind(o.abandonBttn,"click",(function(){t.submitAction(e,{txID:r.tx.id,abandon:!0},o.errMsg)})),Ne.bind(o.keepWaitingBttn,"click",(function(){t.submitAction(e,{txID:r.tx.id,abandon:!1},o.errMsg)})),Ne.bind(o.replaceBttn,"click",(function(){var n=o.idInput.value;if(!n)return o.idInput.focus(),void Ne.blink(o.idInput);t.submitAction(e,{txID:r.tx.id,abandon:!1,replacementID:n},o.errMsg)})),a}},{key:"redeemRejectedAction",value:function(e){var t=this,n=e.payload,r=n.orderID,a=n.coinID,o=n.coinFmt,s=n.assetID,i=this.page.rejectedRedemptionTmpl.cloneNode(!0),c=Ne.parseTemplate(i),l=this.assets[s],u=l.name,d=l.token;return c.assetName.textContent=u,c.txid.textContent=o,c.txid.dataset.explorerCoin=a,Pn(d?d.parentID:s,c.txid),Ne.bind(c.doNothingBttn,"click",(function(){t.submitAction(e,{orderID:r,coinID:a,retry:!1},c.errMsg)})),Ne.bind(c.tryAgainBttn,"click",(function(){t.submitAction(e,{orderID:r,coinID:a,retry:!0},c.errMsg)})),i}},{key:"showRequestedAction",value:function(e){var t=this.page,n=this.requiredActions;Ne.hide(t.actionDialogCollapsed);for(var r=0,a=Object.values(n);r<a.length;r++){var o=a[r];o.selected=o.uniqueID===e}Ne.empty(t.actionDialogContent);var s=n[e];t.actionDialogContent.appendChild(s.div),Ne.show(t.actionDialog);var i=this.sortedActions();if(1!==i.length){Ne.show(t.actionsNavigator);var c=i.indexOf(s);t.currentAction.textContent=String(c+1),t.prevAction.classList.toggle("invisible",0===c),t.nextAction.classList.toggle("invisible",c===i.length-1)}else Ne.hide(t.actionsNavigator)}},{key:"updateMarketElements",value:function(e,t,n,r){var a,o=this,s=function(e){var t=o.assets[e];if(t)return t;if(!r)throw Error("no asset found for asset ID ".concat(e));var n=r.assets[e];return{unitInfo:n.unitInfo,name:n.symbol,symbol:n.symbol}},i=s(t),c=i.unitInfo,l=i.name,u=i.symbol,d=is(Ne.applySelector(e,"[data-base-name"));try{for(d.s();!(a=d.n()).done;)a.value.textContent=l}catch(e){d.e(e)}finally{d.f()}var h,p=is(Ne.applySelector(e,"[data-base-logo]"));try{for(p.s();!(h=p.n()).done;)h.value.src=Ne.logoPath(u)}catch(e){p.e(e)}finally{p.f()}var f,v=is(Ne.applySelector(e,"[data-base-ticker]"));try{for(v.s();!(f=v.n()).done;)f.value.textContent=c.conventional.unit}catch(e){v.e(e)}finally{v.f()}var m,g=s(n),y=g.unitInfo,b=g.name,x=g.symbol,k=is(Ne.applySelector(e,"[data-quote-name"));try{for(k.s();!(m=k.n()).done;)m.value.textContent=b}catch(e){k.e(e)}finally{k.f()}var w,C=is(Ne.applySelector(e,"[data-quote-logo]"));try{for(C.s();!(w=C.n()).done;)w.value.src=Ne.logoPath(x)}catch(e){C.e(e)}finally{C.f()}var S,F=is(Ne.applySelector(e,"[data-quote-ticker]"));try{for(F.s();!(S=F.n()).done;)S.value.textContent=y.conventional.unit}catch(e){F.e(e)}finally{F.f()}}},{key:"setLanguage",value:(u=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/setlocale",t);case 2:window.location.reload();case 3:case"end":return e.stop()}}),e)}))),function(e){return u.apply(this,arguments)})},{key:"showDropdown",value:function(e,t){var n=this;if(Ne.hide(this.page.noteBox,this.page.profileBox),Ne.show(t),window.innerWidth<500)Object.assign(t.style,{left:"0",right:"0",top:"0"});else{var r=e.getBoundingClientRect(),a="".concat(window.innerWidth-r.left-r.width+5,"px");Object.assign(t.style,{left:"auto",right:a,top:"".concat(r.top-4,"px")})}us(document,"click",(function e(r){Ne.mouseInElement(r,t)||(Ne.hide(t),ds(document,"click",e),t===n.page.noteBox&&Ne.isDisplayed(n.page.noteList)&&n.ackNotes())}))}},{key:"ackNotes",value:function(){var e,t=[],n=is(this.notes);try{for(n.s();!(e=n.n()).done;){var r=e.value;r.acked?r.el.classList.remove("firstview"):(r.acked=!0,r.id&&r.severity>2&&t.push(r.id))}}catch(e){n.e(e)}finally{n.f()}t.length&&Ta.request("acknotes",t),Ne.hide(this.page.noteIndicator)}},{key:"setNoteTimes",value:function(e){for(var t=0,n=Array.from(e.children);t<n.length;t++){var r=n[t];Ne.safeSelector(r,"span.note-time").textContent=Ne.timeSince(r.note.stamp)}}},{key:"bindInternalNavigation",value:function(e){var t=this,n=new URL(window.location.href);e.querySelectorAll("a").forEach((function(e){if(e.href){var r=new URL(e.href);if(r.origin===n.origin){var a=r.pathname.substring(1),o={};r.search&&r.searchParams.forEach((function(e,t){o[t]=e})),Ne.bind(e,"click",(function(e){e.preventDefault(),t.loadPage(a,o)}))}}}))}},{key:"updateMenuItemsDisplay",value:function(){var e=this.page,t=this.authed,n=this.mmStatus;if(e){if(!t)return e.profileBox.classList.remove("authed"),void Ne.hide(e.noteBell,e.walletsMenuEntry,e.marketsMenuEntry);Ne.setVis(Object.keys(this.exchanges).length>0,e.marketsMenuEntry,e.mmLink),e.profileBox.classList.add("authed"),Ne.show(e.noteBell,e.walletsMenuEntry,e.marketsMenuEntry),Ne.setVis(n,e.mmLink)}}},{key:"fetchNotes",value:(l=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T("/api/notes");case 2:if(t=e.sent,this.checkResponse(t)){e.next=5;break}return e.abrupt("return",console.error("failed to fetch notes:",(null==t?void 0:t.msg)||String(t)));case 5:t.notes.reverse(),this.setNotes(t.notes),this.setPokes(t.pokes),this.setRequiredActions();case 9:case"end":return e.stop()}}),e,this)}))),function(){return l.apply(this,arguments)})},{key:"attachCommon",value:function(e){this.bindInternalNavigation(e)}},{key:"updateBondConfs",value:function(e,t,n){var r,a=is(this.exchanges[e].auth.pendingBonds);try{for(a.s();!(r=a.n()).done;){var o=r.value;o.coinID===t&&(o.confs=n)}}catch(e){a.e(e)}finally{a.f()}}},{key:"updateTier",value:function(e,t){this.exchanges[e].auth.rep.bondedTier=t}},{key:"handleBondNote",value:function(e){switch(e.auth&&(this.exchanges[e.dex].auth=e.auth),e.topic){case"RegUpdate":null!==e.coinID&&this.updateBondConfs(e.dex,e.coinID,e.confirmations);break;case"BondConfirmed":null!==e.tier&&this.updateTier(e.dex,e.tier)}}},{key:"handleTransactionNote",value:function(e,t){var n=this.txHistoryMap[e];if(n)if(t.new)n.txs.unshift(t.transaction);else for(var r=0;r<n.txs.length;r++)if(n.txs[r].id===t.transaction.id){n.txs[r]=t.transaction;break}}},{key:"handleTxHistorySyncedNote",value:function(e){delete this.txHistoryMap[e]}},{key:"loggedIn",value:function(e,t){this.setNotes(e),this.setPokes(t),this.setRequiredActions()}},{key:"setNotes",value:function(e){this.log("notes","setNotes",e),this.notes=[],Ne.empty(this.page.noteList);for(var t=0;t<e.length;t++)this.prependNoteElement(e[t])}},{key:"setPokes",value:function(e){this.log("pokes","setPokes",e),this.pokes=[],Ne.empty(this.page.pokeList);for(var t=0;t<e.length;t++)this.prependPokeElement(e[t])}},{key:"botStatus",value:function(e,t,n){var r,a,o,s=is(null!==(r=null===(a=this.mmStatus)||void 0===a?void 0:a.bots)&&void 0!==r?r:[]);try{for(s.s();!(o=s.n()).done;){var i=o.value,c=i.config;if(e===c.host&&t===c.baseID&&n===c.quoteID)return i}}catch(e){s.e(e)}finally{s.f()}}},{key:"updateUser",value:function(e){var t=this.user,n=this.assets,r=this.walletMap;if("fiatrateupdate"!==e.type){if(t)switch(e.type){case"order":var o=e,s=o.order,i=t.exchanges[s.host].markets[s.market],c=o.tempID;if("AsyncOrderSubmitted"===e.topic){var l=s;l.tempID=c,i.inflight?i.inflight.push(l):i.inflight=[l];break}if("AsyncOrderFailure"===e.topic){i.inflight=i.inflight.filter((function(e){return e.tempID!==c}));break}for(var u in i.inflight||[])if(i.inflight[u].tempID===c){i.inflight=i.inflight.filter((function(e){return e.tempID!==c}));break}i.orders=i.orders||[],function(t,n){var r=t.orders.findIndex((function(e){return e.id===n.id}));return-1!==r&&("OrderRetired"===e.topic?t.orders.splice(r,1):t.orders[r]=n,!0)}(i,s)||i.orders.push(s);break;case"balance":var d=e,h=t.assets[d.assetID];if(!h)break;var p=h.wallet;p&&(p.balance=d.balance);break;case"bondpost":this.handleBondNote(e);break;case"reputation":var f=e;this.exchanges[f.host].auth.rep=f.rep;break;case"walletstate":case"walletconfig":if(!n)return;var v=null==e?void 0:e.wallet;if(!v)return;n[v.assetID].wallet=v,r[v.assetID]=v;break;case"walletsync":var m=e,g=this.walletMap[m.assetID];g&&(g.syncStatus=m.syncStatus,g.synced=g.syncStatus.synced,g.syncProgress=m.syncProgress);break;case"match":var y=e,b=this.order(y.orderID);b&&function(e,t){for(var n in e.matches)if(e.matches[n].matchID===t.matchID)return void(e.matches[n]=t);e.matches=e.matches||[],e.matches.push(t)}(b,y.match);break;case"conn":var x=e,k=t.exchanges[x.host];k&&(k.connectionStatus=x.connectionStatus);break;case"spots":var w=e,C=t.exchanges[w.host];if(!C||!C.markets)break;for(var S=0,F=Object.entries(w.spots);S<F.length;S++){var T=a(F[S],2),D=T[0],I=T[1];C.markets[D].spot=I}break;case"fiatrateupdate":this.fiatRatesMap=e.fiatRates;break;case"actionrequired":var A=e;this.addAction(A.payload);break;case"walletnote":var R=e;switch(R.payload.route){case"transaction":var E=R.payload;this.handleTransactionNote(R.payload.assetID,E);break;case"actionRequired":var B=R.payload;this.addAction(B),this.blinkAction();break;case"actionResolved":this.resolveAction(R.payload)}"transactionHistorySynced"===R.payload.route&&this.handleTxHistorySyncedNote(R.payload.assetID);break;case"runstats":this.log("mm",{runstats:e});var P=e,L=this.botStatus(P.host,P.baseID,P.quoteID);L&&(L.runStats=P.stats,L.running=Boolean(P.stats),P.stats||(L.latestEpoch=void 0,L.cexProblems=void 0));break;case"cexnote":var O=e;if("BalanceUpdate"===O.topic){var M=O.note;this.mmStatus.cexes[O.cexName].balances[M.assetID]=M.balance}break;case"epochreport":var q=e,N=this.botStatus(q.host,q.baseID,q.quoteID);N&&(N.latestEpoch=q.report);break;case"cexproblems":var W=e,V=this.botStatus(W.host,W.baseID,W.quoteID);V&&(V.cexProblems=W.problems)}}else this.fiatRatesMap=e.fiatRates}},{key:"notify",value:function(e){this.log("notes","notify",e),this.updateUser(e);var t,n=is(this.noteReceivers);try{for(n.s();!(t=n.n()).done;){var r=t.value[e.type];if(r)try{r(e)}catch(t){console.error("note feeder error:",t.message?t.message:t),console.log(e),console.log(t.stack)}}}catch(e){n.e(e)}finally{n.f()}if(!(e.severity<2)){var a=this.popupTmpl,o=this.popupNotes;if(this.showPopups){var i=a.cloneNode(!0);Ne.tmplElement(i,"text").textContent="".concat(e.subject,": ").concat(ya(e.details));var c=Ne.tmplElement(i,"indicator");for(2===e.severity?Ne.hide(c):ys(c,e.severity),o.appendChild(i),Ne.show(o);o.children.length>5;)o.removeChild(o.firstChild);setTimeout(s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ne.animate(500,(function(e){i.style.opacity=String(1-e)}));case 2:i.remove(),0===o.children.length&&Ne.hide(o);case 4:case"end":return e.stop()}}),e)}))),6e3)}2===e.severity?this.prependPokeElement(e):this.prependNoteElement(e),function(e){pa.apply(this,arguments)}(e)}}},{key:"registerNoteFeeder",value:function(e){this.noteReceivers.push(e)}},{key:"log",value:function(e){for(var t,n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];this.loggers[e]&&(t=console).log.apply(t,["".concat(gs(),"[").concat(e,"]:")].concat(r)),this.recorders[e]&&this.recorders[e].push({time:gs(),msg:r})}},{key:"prependPokeElement",value:function(e){var t=a(this.makePoke(e),2),n=t[0],r=t[1];for(this.pokes.push(r);this.pokes.length>100;)this.pokes.shift();this.prependListElement(this.page.pokeList,r,n)}},{key:"prependNoteElement",value:function(e){var t=a(this.makeNote(e),2),n=t[0],r=t[1];for(this.notes.push(r);this.notes.length>100;)this.notes.shift();var o=this.page.noteList;if(this.prependListElement(o,r,n),this.bindUrlHandlers(n),!(0===this.notes.length||Ne.isDisplayed(this.page.noteBox)&&Ne.isDisplayed(o))){var s=0,i=this.notes.reduce((function(e,t){return t.acked||s++,!t.acked&&t.severity>e?t.severity:e}),0),c=this.page.noteIndicator;ys(c,i),s?(c.textContent=String(s>99?"".concat(99,"+"):s),Ne.show(c)):Ne.hide(c)}}},{key:"prependListElement",value:function(e,t,n){for(n.note=t,e.prepend(n);e.children.length>100;)e.removeChild(e.lastChild);this.setNoteTimes(e)}},{key:"makeNote",value:function(e){var t=this.page.noteTmpl.cloneNode(!0);if(e.severity>2){var n=3===e.severity?"good":4===e.severity?"warn":"bad";Ne.safeSelector(t,"div.note-indicator").classList.add(n)}return Ne.safeSelector(t,"div.note-subject").textContent=e.subject,ga(Ne.safeSelector(t,"div.note-details"),e.details),[t,ss({el:t},e)]}},{key:"makePoke",value:function(e){var t=this.page.pokeTmpl.cloneNode(!0);return Ne.tmplElement(t,"subject").textContent="".concat(e.subject,":"),ga(Ne.tmplElement(t,"details"),e.details),[t,ss({el:t},e)]}},{key:"loading",value:function(e){var t=this.page.loader.cloneNode(!0);return e.appendChild(t),function(){t.remove()}}},{key:"orders",value:function(e,t){var n=[],r=this.user.exchanges[e].markets[t];return r.orders&&(n=n.concat(r.orders)),r.inflight&&(n=n.concat(r.inflight)),n}},{key:"haveActiveOrders",value:function(e){for(var t=0,n=Object.values(this.user.exchanges);t<n.length;t++){var r=n[t];if(r.markets)for(var a=0,o=Object.values(r.markets);a<o.length;a++){var s=o[a];if(s.orders){var i,c=is(s.orders);try{for(c.s();!(i=c.n()).done;){var l=i.value;if((l.baseID===e||l.quoteID===e)&&(l.status<3||At(l)))return!0}}catch(e){c.e(e)}finally{c.f()}}}}return!1}},{key:"order",value:function(e){for(var t=0,n=Object.values(this.user.exchanges);t<n.length;t++){var r=n[t];if(r&&r.markets)for(var a=0,o=Object.values(r.markets);a<o.length;a++){var s=o[a];if(s.orders){var i,c=is(s.orders);try{for(c.s();!(i=c.n()).done;){var l=i.value;if(l.id===e)return l}}catch(e){c.e(e)}finally{c.f()}}}}return null}},{key:"canAccelerateOrder",value:function(e){var t;t=e.sell?e.baseID:e.quoteID;var n=this.walletMap[t];if(!(n&&16&n.traits))return!1;if(e.matches)for(var r=0;r<(null===(a=e.matches)||void 0===a?void 0:a.length);r++){var a,o=e.matches[r];if(o.swap&&o.swap.confs&&0===o.swap.confs.count&&!o.revoked)return!0}return!1}},{key:"unitInfo",value:function(e,t){var n=this.assets[e];if(n)return n.unitInfo;if(!t||!t.assets)throw Error(ke("UNSUPPORTED_ASSET_INFO_ERR_MSG",{assetID:"".concat(e)}));return t.assets[e].unitInfo}},{key:"parentAsset",value:function(e){var t=this.assets[e];return t.token?this.assets[t.token.parentID]:t}},{key:"baseChainSymbol",value:function(e){var t=this.user.assets[e];return t.token?this.user.assets[t.token.parentID].symbol:t.symbol}},{key:"extensionWallet",value:function(e){var t;return null===(t=this.user.extensionModeConfig)||void 0===t?void 0:t.restrictedWallets[this.baseChainSymbol(e)]}},{key:"conventionalRate",value:function(e,t,n,r){var a=[this.unitInfo(e,r),this.unitInfo(t,r)],o=a[1];return n*(a[0].conventional.conversionFactor/o.conventional.conversionFactor)/Ft}},{key:"walletDefinition",value:function(e,t){var n=this.assets[e];if(n.token)return n.token.definition;if(!n.info)throw Error("where's the wallet info?");return""===t?n.info.availablewallets[n.info.emptyidx]:n.info.availablewallets.filter((function(e){return e.type===t}))[0]}},{key:"currentWalletDefinition",value:function(e){var t=this.assets[e];return t.token?t.token.definition:this.walletDefinition(e,this.assets[e].wallet.type)}},{key:"fetchBalance",value:(c=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/balance",{assetID:t});case 2:if(n=e.sent,this.checkResponse(n)){e.next=5;break}throw new Error("failed to fetch balance for asset ID ".concat(t));case 5:return e.abrupt("return",n.balance);case 6:case"end":return e.stop()}}),e,this)}))),function(e){return c.apply(this,arguments)})},{key:"checkResponse",value:function(e){return e.requestSuccessful&&e.ok}},{key:"signOut",value:(o=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/logout");case 2:if(t=e.sent,this.checkResponse(t)){e.next=7;break}return t.code===A.activeOrdersErr?this.page.logoutErr.textContent=ke("ACTIVE_ORDERS_LOGOUT_ERR_MSG"):this.page.logoutErr.textContent=t.msg,Ne.show(this.page.logoutErr),e.abrupt("return");case 7:k.removeCookie(k.authCK),k.removeCookie(k.pwKeyCK),k.removeLocal(k.notificationsLK),window.location.href="/login";case 11:case"end":return e.stop()}}),e,this)}))),function(){return o.apply(this,arguments)})},{key:"txHistory",value:(n=s(f().mark((function e(t,n,a){var o,s,i,c,l,u,d,h,p,v,m,g;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(o="/api/txhistory",s=this.txHistoryMap[t]){e.next=12;break}return e.next=5,S(o,{n,assetID:t});case 5:if(i=e.sent,this.checkResponse(i)){e.next=8;break}throw new Error(i.msg);case 8:return(c=i.txs)||(c=[]),this.txHistoryMap[t]={txs:c,lastTx:c.length<n},e.abrupt("return",this.txHistoryMap[t]);case 12:if(l=[],u=!1,d=a?s.txs.findIndex((function(e){return e.id===a}))+1:0,!a||-1!==d){e.next=17;break}throw new Error("invalid after tx "+a);case 17:for(h=d,p=d;p<s.txs.length&&l.length<n;p++)l.push(s.txs[p]),h=p,a=s.txs[p].id;if(s.lastTx&&h===s.txs.length-1&&(u=!0),!(l.length<n)||s.lastTx){e.next=33;break}return e.next=23,S(o,{n:n-l.length+1,assetID:t,refID:a,past:!0});case 23:if(m=e.sent,this.checkResponse(m)){e.next=26;break}throw new Error(m.msg);case 26:(g=m.txs)||(g=[]),g.length>0&&a&&(g[0].id===a?g.shift():console.error("First tx history element != refID")),s.lastTx=g.length<n-l.length,u=s.lastTx,l.push.apply(l,r(g)),(v=s.txs).push.apply(v,r(g));case 33:return e.abrupt("return",{txs:l,lastTx:u});case 34:case"end":return e.stop()}}),e,this)}))),function(e,t,r){return n.apply(this,arguments)})},{key:"getWalletTx",value:function(e,t){var n=this.txHistoryMap[e];if(n)return n.txs.find((function(e){return e.id===t}))}},{key:"clearTxHistory",value:function(e){delete this.txHistoryMap[e]}},{key:"needsCustomProvider",value:(t=s(f().mark((function e(t){var n,r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(o=null!==(n=null===(r=this.assets[t])||void 0===r||null===(a=r.token)||void 0===a?void 0:a.parentID)&&void 0!==n?n:t){e.next=3;break}return e.abrupt("return",!1);case 3:if(s=this.walletMap[o]){e.next=6;break}return e.abrupt("return",!1);case 6:if(16384&s.traits){e.next=9;break}return e.abrupt("return",!1);case 9:return e.next=11,S("/api/walletsettings",{assetID:o});case 11:if(i=e.sent,this.checkResponse(i)){e.next=15;break}return console.error(i.msg),e.abrupt("return",!1);case 15:return c=i.map,e.abrupt("return",!c.providers);case 17:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})}]),e}(),vs=(h($o={},3,"good"),h($o,5,"bad"),h($o,4,"warn"),$o);function ms(e){return e.replace(/^\//,"").split("/")[0].split("?")[0].split("#")[0]}function gs(){var e=new Date,t=e.getHours().toString().padStart(2,"0"),n=e.getMinutes().toString().padStart(2,"0"),r=e.getSeconds().toString().padStart(2,"0"),a=e.getMilliseconds().toString().padStart(3,"0");return"".concat(t,":").concat(n,":").concat(r,".").concat(a)}function ys(e,t){e.classList.remove("bad","warn","good"),e.classList.add(vs[t])}var bs=new fs;ot=bs,bs.start()})()})(); +(()=>{var e={172:e=>{e.exports=function(e,t){this.v=e,this.k=t},e.exports.__esModule=!0,e.exports.default=e.exports},993:(e,t,n)=>{var r=n(546);function a(){var t,n,o="function"==typeof Symbol?Symbol:{},s=o.iterator||"@@iterator",i=o.toStringTag||"@@toStringTag";function c(e,a,o,s){var i=a&&a.prototype instanceof u?a:u,c=Object.create(i.prototype);return r(c,"_invoke",function(e,r,a){var o,s,i,c=0,u=a||[],d=!1,h={p:0,n:0,v:t,a:p,f:p.bind(t,4),d:function(e,n){return o=e,s=0,i=t,h.n=n,l}};function p(e,r){for(s=e,i=r,n=0;!d&&c&&!a&&n<u.length;n++){var a,o=u[n],p=h.p,f=o[2];e>3?(a=f===r)&&(i=o[(s=o[4])?5:(s=3,3)],o[4]=o[5]=t):o[0]<=p&&((a=e<2&&p<o[1])?(s=0,h.v=r,h.n=o[1]):p<f&&(a=e<3||o[0]>r||r>f)&&(o[4]=e,o[5]=r,h.n=f,s=0))}if(a||e>1)return l;throw d=!0,r}return function(a,u,f){if(c>1)throw TypeError("Generator is already running");for(d&&1===u&&p(u,f),s=u,i=f;(n=s<2?t:i)||!d;){o||(s?s<3?(s>1&&(h.n=-1),p(s,i)):h.n=i:h.v=i);try{if(c=2,o){if(s||(a="next"),n=o[a]){if(!(n=n.call(o,i)))throw TypeError("iterator result is not an object");if(!n.done)return n;i=n.value,s<2&&(s=0)}else 1===s&&(n=o.return)&&n.call(o),s<2&&(i=TypeError("The iterator does not provide a '"+a+"' method"),s=1);o=t}else if((n=(d=h.n<0)?i:e.call(r,h))!==l)break}catch(e){o=t,s=1,i=e}finally{c=1}}return{value:n,done:d}}}(e,o,s),!0),c}var l={};function u(){}function d(){}function h(){}n=Object.getPrototypeOf;var p=[][s]?n(n([][s]())):(r(n={},s,(function(){return this})),n),f=h.prototype=u.prototype=Object.create(p);function v(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,h):(e.__proto__=h,r(e,i,"GeneratorFunction")),e.prototype=Object.create(f),e}return d.prototype=h,r(f,"constructor",h),r(h,"constructor",d),d.displayName="GeneratorFunction",r(h,i,"GeneratorFunction"),r(f),r(f,i,"Generator"),r(f,s,(function(){return this})),r(f,"toString",(function(){return"[object Generator]"})),(e.exports=a=function(){return{w:c,m:v}},e.exports.__esModule=!0,e.exports.default=e.exports)()}e.exports=a,e.exports.__esModule=!0,e.exports.default=e.exports},869:(e,t,n)=>{var r=n(887);e.exports=function(e,t,n,a,o){var s=r(e,t,n,a,o);return s.next().then((function(e){return e.done?e.value:s.next()}))},e.exports.__esModule=!0,e.exports.default=e.exports},887:(e,t,n)=>{var r=n(993),a=n(791);e.exports=function(e,t,n,o,s){return new a(r().w(e,t,n,o),s||Promise)},e.exports.__esModule=!0,e.exports.default=e.exports},791:(e,t,n)=>{var r=n(172),a=n(546);e.exports=function e(t,n){function o(e,a,s,i){try{var c=t[e](a),l=c.value;return l instanceof r?n.resolve(l.v).then((function(e){o("next",e,s,i)}),(function(e){o("throw",e,s,i)})):n.resolve(l).then((function(e){c.value=e,s(c)}),(function(e){return o("throw",e,s,i)}))}catch(e){i(e)}}var s;this.next||(a(e.prototype),a(e.prototype,"function"==typeof Symbol&&Symbol.asyncIterator||"@asyncIterator",(function(){return this}))),a(this,"_invoke",(function(e,t,r){function a(){return new n((function(t,n){o(e,r,t,n)}))}return s=s?s.then(a,a):a()}),!0)},e.exports.__esModule=!0,e.exports.default=e.exports},546:e=>{function t(n,r,a,o){var s=Object.defineProperty;try{s({},"",{})}catch(n){s=0}e.exports=t=function(e,n,r,a){function o(n,r){t(e,n,(function(e){return this._invoke(n,r,e)}))}n?s?s(e,n,{value:r,enumerable:!a,configurable:!a,writable:!a}):e[n]=r:(o("next",0),o("throw",1),o("return",2))},e.exports.__esModule=!0,e.exports.default=e.exports,t(n,r,a,o)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},373:e=>{e.exports=function(e){var t=Object(e),n=[];for(var r in t)n.unshift(r);return function e(){for(;n.length;)if((r=n.pop())in t)return e.value=r,e.done=!1,e;return e.done=!0,e}},e.exports.__esModule=!0,e.exports.default=e.exports},633:(e,t,n)=>{var r=n(172),a=n(993),o=n(869),s=n(887),i=n(791),c=n(373),l=n(579);function u(){"use strict";var t=a(),n=t.m(u),d=(Object.getPrototypeOf?Object.getPrototypeOf(n):n.__proto__).constructor;function h(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===d||"GeneratorFunction"===(t.displayName||t.name))}var p={throw:1,return:2,break:3,continue:3};function f(e){var t,n;return function(r){t||(t={stop:function(){return n(r.a,2)},catch:function(){return r.v},abrupt:function(e,t){return n(r.a,p[e],t)},delegateYield:function(e,a,o){return t.resultName=a,n(r.d,l(e),o)},finish:function(e){return n(r.f,e)}},n=function(e,n,a){r.p=t.prev,r.n=t.next;try{return e(n,a)}finally{t.next=r.n}}),t.resultName&&(t[t.resultName]=r.v,t.resultName=void 0),t.sent=r.v,t.next=r.n;try{return e.call(this,t)}finally{r.p=t.prev,r.n=t.next}}}return(e.exports=u=function(){return{wrap:function(e,n,r,a){return t.w(f(e),n,r,a&&a.reverse())},isGeneratorFunction:h,mark:t.m,awrap:function(e,t){return new r(e,t)},AsyncIterator:i,async:function(e,t,n,r,a){return(h(t)?s:o)(f(e),t,n,r,a)},keys:c,values:l}},e.exports.__esModule=!0,e.exports.default=e.exports)()}e.exports=u,e.exports.__esModule=!0,e.exports.default=e.exports},579:(e,t,n)=>{var r=n(738).default;e.exports=function(e){if(null!=e){var t=e["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],n=0;if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length))return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}throw new TypeError(r(e)+" is not iterable")},e.exports.__esModule=!0,e.exports.default=e.exports},738:e=>{function t(n){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},756:(e,t,n)=>{var r=n(633)();e.exports=r;try{regeneratorRuntime=r}catch(e){"object"==typeof globalThis?globalThis.regeneratorRuntime=r:Function("r","regeneratorRuntime = r")(r)}}},t={};function n(r){var a=t[r];if(void 0!==a)return a.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function t(t,n){if(t){if("string"==typeof t)return e(t,n);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?e(t,n):void 0}}function r(n){return function(t){if(Array.isArray(t))return e(t)}(n)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(n)||t(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,o,s,i=[],c=!0,l=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=o.call(n)).done)&&(i.push(r.value),i.length!==t);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(l)throw a}}return i}}(e,n)||t(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(e,t,n,r,a,o,s){try{var i=e[o](s),c=i.value}catch(e){return void n(e)}i.done?t(c):Promise.resolve(c).then(r,a)}function s(e){return function(){var t=this,n=arguments;return new Promise((function(r,a){var s=e.apply(t,n);function i(e){o(s,r,a,i,c,"next",e)}function c(e){o(s,r,a,i,c,"throw",e)}i(void 0)}))}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c(e)}function l(e){var t=function(e){if("object"!=c(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=c(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==c(t)?t:t+""}function u(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,l(r.key),r)}}function d(e,t,n){return t&&u(e.prototype,t),n&&u(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}function h(e,t,n){return(t=l(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var p=n(756),f=n.n(p);function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function m(e,t){return m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},m(e,t)}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&m(e,t)}function y(e,t){if(t&&("object"==c(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return v(e)}function x(e){return x=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},x(e)}function b(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var k=function(){function e(){i(this,e)}return d(e,null,[{key:"setCookie",value:function(e,t){var n=new Date;n.setTime(n.getTime()+31536e7);var r="expires="+n.toUTCString();document.cookie=e+"="+t+";"+r+";path=/"}},{key:"getCookie",value:function(e){var t,n=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return b(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?b(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}(document.cookie.split(";"));try{for(n.s();!(t=n.n()).done;){var r=a(t.value.split("="),2),o=r[0],s=r[1];if(o.trim()===e)return s}}catch(e){n.e(e)}finally{n.f()}return null}},{key:"removeCookie",value:function(e){document.cookie="".concat(e,"=;expires=Thu, 01 Jan 1970 00:00:01 GMT;")}},{key:"isDark",value:function(){return"1"===e.fetchLocal(e.darkModeLK)}},{key:"storeLocal",value:function(e,t){window.localStorage.setItem(e,JSON.stringify(t))}},{key:"fetchLocal",value:function(e){var t=window.localStorage.getItem(e);return null!==t?JSON.parse(t):null}},{key:"removeLocal",value:function(e){window.localStorage.removeItem(e)}}]),e}();function w(e,t,n){return C.apply(this,arguments)}function C(){return(C=s(f().mark((function e(t,n,r){var a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,window.fetch(n,{method:t,headers:new window.Headers({"content-type":"application/json"}),body:r});case 3:if(200===(a=e.sent).status){e.next=6;break}throw a;case 6:return e.next=8,a.json();case 8:return(o=e.sent).requestSuccessful=!0,e.abrupt("return",o);case 13:return e.prev=13,e.t0=e.catch(0),e.t0.requestSuccessful=!1,e.next=18,e.t0.text();case 18:return e.t0.msg=e.sent,e.abrupt("return",e.t0);case 20:case"end":return e.stop()}}),e,null,[[0,13]])})))).apply(this,arguments)}function S(e,t){return F.apply(this,arguments)}function F(){return(F=s(f().mark((function e(t,n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",w("POST",t,JSON.stringify(n)));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function T(e){return D.apply(this,arguments)}function D(){return(D=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",w("GET",t));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}h(k,"darkModeLK","darkMode"),h(k,"authCK","dexauth"),h(k,"pwKeyCK","sessionkey"),h(k,"popupsLK","popups"),h(k,"loggersLK","loggers"),h(k,"recordersLK","recorders"),h(k,"lastMarketLK","selectedMarket"),h(k,"depthZoomLK","depthZoom"),h(k,"lastMMMarketLK","mmMarket"),h(k,"optionsExpansionLK","mmOptsExpand"),h(k,"leftMarketDockLK","leftmarketdock"),h(k,"selectedAssetLK","selectedasset"),h(k,"notificationsLK","notifications"),h(k,"orderDisclaimerAckedLK","ordAck"),h(k,"lastCandleDurationLK","lastCandleDuration"),h(k,"localeSpecsKey","localeSpecsLK"),h(k,"localeKey","localeLK"),null===k.fetchLocal(k.darkModeLK)&&k.storeLocal(k.darkModeLK,"1"),null===k.fetchLocal(k.popupsLK)&&k.storeLocal(k.popupsLK,"1"),null===k.fetchLocal(k.leftMarketDockLK)&&k.storeLocal(k.leftMarketDockLK,"1");var I,A=function(e){return e[e.walletErr=0]="walletErr",e[e.walletAuthErr=1]="walletAuthErr",e[e.noAuthErr=2]="noAuthErr",e[e.walletBalanceErr=3]="walletBalanceErr",e[e.dupeDEXErr=4]="dupeDEXErr",e[e.assetSupportErr=5]="assetSupportErr",e[e.registerErr=6]="registerErr",e[e.signatureErr=7]="signatureErr",e[e.zeroFeeErr=8]="zeroFeeErr",e[e.feeMismatchErr=9]="feeMismatchErr",e[e.feeSendErr=10]="feeSendErr",e[e.passwordErr=11]="passwordErr",e[e.emptyHostErr=12]="emptyHostErr",e[e.connectionErr=13]="connectionErr",e[e.acctKeyErr=14]="acctKeyErr",e[e.unknownOrderErr=15]="unknownOrderErr",e[e.orderParamsErr=16]="orderParamsErr",e[e.dbErr=17]="dbErr",e[e.authErr=18]="authErr",e[e.connectWalletErr=19]="connectWalletErr",e[e.missingWalletErr=20]="missingWalletErr",e[e.encryptionErr=21]="encryptionErr",e[e.decodeErr=22]="decodeErr",e[e.accountVerificationErr=23]="accountVerificationErr",e[e.accountProofErr=24]="accountProofErr",e[e.parseKeyErr=25]="parseKeyErr",e[e.marketErr=26]="marketErr",e[e.addressParseErr=27]="addressParseErr",e[e.addrErr=28]="addrErr",e[e.fileReadErr=29]="fileReadErr",e[e.unknownDEXErr=30]="unknownDEXErr",e[e.accountRetrieveErr=31]="accountRetrieveErr",e[e.accountDisableErr=32]="accountDisableErr",e[e.suspendedAcctErr=33]="suspendedAcctErr",e[e.existenceCheckErr=34]="existenceCheckErr",e[e.createWalletErr=35]="createWalletErr",e[e.activeOrdersErr=36]="activeOrdersErr",e[e.newAddrErr=37]="newAddrErr",e}({}),R="NO_PASS_ERROR_MSG",E="BUY",B="SELL",P="VERSION_NOT_SUPPORTED",L="NO_ASSET_WALLET",O="EXECUTED",M="BOOKED",q="CANCELING",N="PASSWORD_NOT_MATCH",W="UNKNOWN",V="SETTLING",U="CANCELED",_="REVOKED",j="NONE_SELECTED",H="API_ERROR",z="LOCKED",G="INVALID_ADDRESS_MSG",X="LIMIT_ORDER",K="MARKET_ORDER",Q="MATCH_STATUS_REDEMPTION_SENT",Y="MATCH_REDEMPTION_CONFIRMED",J="MATCH_STATUS_REFUND_PENDING",Z="ORDER_ACCELERATION_ERR_MSG",$="DISCONNECTED",ee="BROWSER_NTFN_ENABLED",te="ORDER_BUTTON_BUY_BALANCE_ERROR",ne="ORDER_BUTTON_SELL_BALANCE_ERROR",re="ORDER_BUTTON_QTY_ERROR",ae="ORDER_BUTTON_QTY_RATE_ERROR",oe="CREATE_ASSET_WALLET_MSG",se="TRADING_TIER_UPDATED",ie="INVALID_TIER_VALUE",ce="MATCH_BUFFER",le="NO_PLACEMENTS",ue="INVALID_VALUE",de="NO_ZERO",he="BOTTYPE_BASIC_MM",pe="BOTTYPE_ARB_MM",fe="BOTTYPE_SIMPLE_ARB",ve="CEXBALANCE_ERR",me="PENDING",ge="COMPLETE",ye="CEX_NOT_CONNECTED";function xe(e,t,n){return be.apply(this,arguments)}function be(){return(be=s(f().mark((function e(t,n,r){var a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r){e.next=5;break}if(!(a=k.fetchLocal(k.localeSpecsKey))||a.lang!==t||a.commitHash!==n){e.next=5;break}return I=k.fetchLocal(k.localeKey),e.abrupt("return");case 5:return e.next=7,S("/api/locale",t);case 7:I=e.sent,k.storeLocal(k.localeSpecsKey,{lang:t,commitHash:n}),k.storeLocal(k.localeKey,I);case 10:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ke(e,t){return function(e,t){return e.replace(/{{\s?([^{}\s]*)\s?}}/g,(function(e,n){return t[n]}))}(I[e],t||{})}function we(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(we=function(){return!!e})()}function Ce(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Se(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Se(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function Se(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}window.clearLocale=function(){k.removeLocal(k.localeSpecsKey),k.removeLocal(k.localeKey)};var Fe=new window.DOMParser,Te={0:"btc",42:"dcr",2:"ltc",5:"dash",20:"dgb",22:"mona",28:"vtc",3:"doge",145:"bch",60:"eth",60001:"usdc.eth",60002:"usdt.eth",60003:"matic.eth",136:"firo",133:"zec",966:"polygon",966001:"usdc.polygon",966002:"weth.polygon",966003:"wbtc.polygon",966004:"usdt.polygon",147:"zcl"},De={};!function(){for(var e=0,t=Object.keys(Te);e<t.length;e++){var n=t[e];De[Te[parseInt(n)]]=parseInt(n)}}();var Ie=Object.values(Te),Ae=1e8,Re=Math.round(Math.log10(Ae)),Ee=navigator.languages.filter((function(e){return"c"!==e})),Be=new Intl.NumberFormat(Ee,{maximumFractionDigits:0}),Pe=new Intl.NumberFormat(Ee,{minimumSignificantDigits:4,maximumSignificantDigits:4}),Le={},Oe={};function Me(e,t){return qe(Oe,e,e,t)}function qe(e,t,n,r){var a="".concat(t,"-").concat(n),o=e[a];return o||(o=new Intl.NumberFormat(null!=r?r:Ee,{minimumFractionDigits:t,maximumFractionDigits:n}),e[a]=o),o}function Ne(e,t){var n=8;if(t){var r=t.conventional.conversionFactor;e/=r,n=Math.round(Math.log10(r))}return[e,n]}var We=function(){function e(){i(this,e)}var t,n;return d(e,null,[{key:"idel",value:function(e,t){return e.querySelector("#".concat(t))}},{key:"bind",value:function(e,t,n,r){var a,o=Ce(Array.isArray(t)?t:[t]);try{for(o.s();!(a=o.n()).done;){var s=a.value;e.addEventListener(s,n,r)}}catch(e){o.e(e)}finally{o.f()}}},{key:"unbind",value:function(e,t,n){e.removeEventListener(t,n)}},{key:"noderize",value:function(e){return Fe.parseFromString(e,"text/html")}},{key:"mouseInElement",value:function(e,t){if(t.contains(e.target))return!0;var n=t.getBoundingClientRect();return e.pageX>=n.left&&e.pageX<=n.right&&e.pageY>=n.top&&e.pageY<=n.bottom}},{key:"layoutMetrics",value:function(e){var t=e.getBoundingClientRect(),n=document.documentElement,r=t.top+n.scrollTop,a=t.left+n.scrollLeft,o=e.offsetWidth,s=e.offsetHeight;return{bodyTop:r,bodyLeft:a,width:o,height:s,centerX:a+o/2,centerY:r+s/2}}},{key:"descendentMetrics",value:function(t,n){var r=e.layoutMetrics(t),a=e.layoutMetrics(n);return{bodyTop:a.bodyTop-r.bodyTop,bodyLeft:a.bodyLeft-r.bodyLeft,width:a.width,height:a.height,centerX:a.centerX-r.bodyLeft,centerY:a.centerY-r.bodyTop}}},{key:"empty",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];for(var r=0,a=t;r<a.length;r++)for(var o=a[r];o.firstChild;)o.removeChild(o.firstChild)}},{key:"setContent",value:function(t){e.empty(t);for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];for(var o=0,s=r;o<s.length;o++){var i=s[o];t.appendChild(i)}}},{key:"hide",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];for(var r=0,a=t;r<a.length;r++)a[r].classList.add("d-hide")}},{key:"show",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];for(var r=0,a=t;r<a.length;r++)a[r].classList.remove("d-hide")}},{key:"showTemporarily",value:function(e){for(var t=this,n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];this.show.apply(this,r),setTimeout((function(){t.hide.apply(t,r)}),e)}},{key:"setVis",value:function(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];t?e.show.apply(e,r):e.hide.apply(e,r)}},{key:"isHidden",value:function(e){return e.classList.contains("d-hide")}},{key:"isDisplayed",value:function(e){return!e.classList.contains("d-hide")}},{key:"animate",value:(n=s(f().mark((function e(t,n,r){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,new Ve(t,n,r).wait();case 2:case"end":return e.stop()}}),e)}))),function(e,t,r){return n.apply(this,arguments)})},{key:"blink",value:(t=s(f().mark((function t(n){var r,o,s,i,c;return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:r=k.isDark()?[255,255,255]:[0,0,0],o=a(r,3),s=o[0],i=o[1],c=o[2],e.animate(1e3,(function(e){n.style.outline="2px solid rgba(".concat(s,", ").concat(i,", ").concat(c,", ").concat((2-2*e)%1,")")}));case 3:case"end":return t.stop()}}),t)}))),function(e){return t.apply(this,arguments)})},{key:"applySelector",value:function(e,t){return Array.from(e.querySelectorAll(t))}},{key:"kids",value:function(e){return Array.from(e.children)}},{key:"safeSelector",value:function(e,t){return e.querySelector(t)||(console.warn("no element found for selector '".concat(t,"' on element ->"),e),document.createElement("div"))}},{key:"idDescendants",value:function(t){var n,r={},a=Ce(e.applySelector(t,"[id]"));try{for(a.s();!(n=a.n()).done;){var o=n.value;r[o.id]=o}}catch(e){a.e(e)}finally{a.f()}return r}},{key:"formatCoinValue",value:function(e,t){var n=a(Ne(e,t),2),r=n[0],o=n[1];return Number.isInteger(r)?Be.format(r):function(e){return qe(Le,2,e)}(o).format(r)}},{key:"conventionalCoinValue",value:function(e,t){return a(Ne(e,t),1)[0]}},{key:"formatRateFullPrecision",value:function(e,t,n,r){var a=e*(t.conventional.conversionFactor/n.conventional.conversionFactor)/Ae,o=Re-Math.floor(Math.log10(r))-Math.floor(Math.log10(t.conventional.conversionFactor)-Math.log10(n.conventional.conversionFactor));return o<=0?Be.format(a):Me(o).format(a)}},{key:"formatFourSigFigs",value:function(e,t){return function(e,t,n,r){var a,o;if(n>=1e3)return e.format(n);var s=t.format(n);return"number"!=typeof r||(null!==(a=null===(o=t.formatToParts(n).filter((function(e){return"fraction"===e.type}))[0])||void 0===o?void 0:o.value)&&void 0!==a?a:"").length<=r?s:Me(r,void 0).format(n)}(Be,Pe,e,t)}},{key:"formatInt",value:function(e){return Be.format(e)}},{key:"formatFullPrecision",value:function(e,t){var n=a(Ne(e,t),2),r=n[0];return Me(n[1]).format(r)}},{key:"formatFiatConversion",value:function(e,t,n){if(!t||0===t)return ke("UNAVAILABLE");var r=a(Ne(e,n),1)[0]*t;return Me(2).format(r)}},{key:"languages",value:function(){return Ee}},{key:"formatFiatValue",value:function(e){return Me(2).format(e)}},{key:"bestConversion",value:function(e,t,n){for(var r=function(e,t){var n,r=(h(n={},e.atomicUnit,1),h(n,e.conventional.unit,e.conventional.conversionFactor),n);if(e.denominations&&t){var a,o=Ce(e.denominations);try{for(o.s();!(a=o.n()).done;){var s=a.value;t[s.unit]&&(r[s.unit]=s.conversionFactor)}}catch(e){o.e(e)}finally{o.f()}}return r}(t,n),a=[],o=function(t){return Math.abs(Math.log10(e/t[1])-1)},s=0,i=Object.entries(r);s<i.length;s++){var c=i[s];a.push([c[0],o(c)])}var l=a.reduce((function(e,t){return t[1]<e[1]?t:e})),u=l[0],d=r[u];return[e/d,Math.round(Math.log10(d)),u]}},{key:"formatBestUnitsFullPrecision",value:function(e,t,n){var r=a(this.bestConversion(e,t,n),3),o=r[0],s=r[1],i=r[2];return Number.isInteger(o)?[Be.format(o),i]:[Me(s).format(o),i]}},{key:"formatBestUnitsFourSigFigs",value:function(t,n,r){var o=a(this.bestConversion(t,n,r),3),s=o[0],i=o[1],c=o[2];return[e.formatFourSigFigs(s,i),c]}},{key:"formatBestRateElement",value:function(t,n,r,a,o){e.formatBestValueElement(t,n,r,a,o),e.setText(t,"[data-denom]",a.feeRateDenom)}},{key:"formatBestValueElement",value:function(t,n,r,o,s){var i=a(this.formatBestUnitsFourSigFigs(r,o,s),2),c=i[0],l=i[1];e.setText(t,"[data-value]",c),e.setText(t,"[data-unit]",l);var u=e.safeSelector(t,"[data-unit-box]");u.dataset.atoms=String(r),u.dataset.assetID=String(n)}},{key:"conventionalRateStep",value:function(e,t,n){var r=[n.conventional.conversionFactor,t.conventional.conversionFactor];return e/Ae*(r[1]/r[0])}},{key:"logoPath",value:function(e){return-1===Ie.indexOf(e)&&(e=e.substring(0,1)),e=e.split(".")[0],"/img/coins/".concat(e,".png")}},{key:"bipSymbol",value:function(e){return Te[e]}},{key:"bipIDFromSymbol",value:function(e){return De[e]}},{key:"bipCEXSymbol",value:function(e){var t=Te[e];if(!t||""===t)return"";var n=t.split(".");return"weth"===n[0]?"eth":n[0]}},{key:"logoPathFromID",value:function(t){return e.logoPath(Te[t])}},{key:"symbolize",value:function(t,n){var r=t.unitInfo.conventional.unit,a=document.createElement("span");a.textContent=r.toUpperCase();var o=t.symbol.split(".");if(2!==o.length)return a;var s=o[1],i=document.createElement("span");if(i.appendChild(a),n){var c=document.createElement("img");return c.src=e.logoPath(s),c.classList.add("token-parent"),i.appendChild(c),i}var l=document.createElement("sup");return l.textContent=s.toUpperCase(),l.classList.add("token-parent"),i.appendChild(l),i}},{key:"shortSymbol",value:function(e){return e.split(".")[0].toUpperCase()}},{key:"setText",value:function(t,n,r){var a,o=Ce(e.applySelector(t,n));try{for(o.s();!(a=o.n()).done;)a.value.textContent=r}catch(e){o.e(e)}finally{o.f()}}},{key:"setSrc",value:function(t,n,r){var a,o=Ce(e.applySelector(t,n));try{for(o.s();!(a=o.n()).done;)a.value.src=r}catch(e){o.e(e)}finally{o.f()}}},{key:"cleanTemplates",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.forEach((function(e){e.remove(),e.removeAttribute("id")}))}},{key:"tmplElement",value:function(e,t){return e.querySelector('[data-tmpl="'.concat(t,'"]'))||document.createElement("div")}},{key:"parseTemplate",value:function(t){var n,r={},a=Ce(e.applySelector(t,"[data-tmpl]"));try{for(a.s();!(n=a.n()).done;){var o=n.value;r[o.dataset.tmpl||""]=o}}catch(e){a.e(e)}finally{a.f()}return r}},{key:"timeSince",value:function(t){return e.formatDuration((new Date).getTime()-t)}},{key:"hmsSince",value:function(e){var t=(new Date).getTime()/1e3-e,n=String(Math.floor(t/3600));t%=3600;var r=String(Math.floor(t/60)),a=String(Math.floor(t%60));return"".concat(n.padStart(2,"0"),":").concat(r.padStart(2,"0"),":").concat(a.padStart(2,"0"))}},{key:"formatDuration",value:function(e){var t,n,r,o,s,i,c=Math.floor(e),l="",u=0,d=function(e,t){return(e>0||u>0)&&u++,e>0&&(l+="".concat(e," ").concat(t," ")),u>=2},h=a(Ye(c,ze),2);if(t=h[0],c=h[1],d(t,"y"))return l;var p=a(Ye(c,Ge),2);if(n=p[0],c=p[1],d(n,"mo"))return l;var f=a(Ye(c,Xe),2);if(r=f[0],c=f[1],d(r,"d"))return l;var v=a(Ye(c,Ke),2);if(o=v[0],c=v[1],d(o,"h"))return l;var m=a(Ye(c,Qe),2);if(s=m[0],c=m[1],d(s,"m"))return l;var g=a(Ye(c,1e3),2);return i=g[0],c=g[1],d(i,"s"),l||"0 s"}},{key:"disableMouseWheel",value:function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];for(var a=0,o=n;a<o.length;a++){var s=o[a];e.bind(s,"wheel",(function(){}),{passive:!0})}}},{key:"showFormError",value:function(t,n){t.textContent=n,e.show(t)}},{key:"showFiatValue",value:function(t,n,r,a){r?(t.textContent=e.formatFiatConversion(n,r,a),e.show(t.parentElement)):e.hide(t.parentElement)}}]),e}(),Ve=function(){function e(t,n,r,a){i(this,e),h(this,"done",void 0),h(this,"endAnimation",void 0),h(this,"thread",void 0),this.done=a,this.thread=this.run(t,n,r)}var t,n,r;return d(e,[{key:"run",value:(r=s(f().mark((function t(n,r,a){var o,s,i,c,l,u;return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:n=n>=0?n:31536e7,o=a?Ue[a]:Ue.linear,s=(new Date).getTime(),i=n===e.Forever?Number.MAX_SAFE_INTEGER:s+n,c=i-s,l=1e3/30,u=s,this.endAnimation=!1;case 8:if(!(u<i)){t.next=17;break}if(!this.endAnimation){t.next=11;break}return t.abrupt("return",this.runCompletionFunction());case 11:return r(o((u-s)/c)),t.next=14,He(l);case 14:u=(new Date).getTime(),t.next=8;break;case 17:r(1),this.runCompletionFunction();case 19:case"end":return t.stop()}}),t,this)}))),function(e,t,n){return r.apply(this,arguments)})},{key:"wait",value:(n=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.thread;case 2:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"stop",value:function(){this.endAnimation=!0}},{key:"stopAndWait",value:(t=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.stop(),e.next=3,this.wait();case 3:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"runCompletionFunction",value:function(){this.done&&this.done()}}]),e}();h(Ve,"Forever",void 0),Ve.Forever=-1;var Ue={linear:function(e){return e},easeIn:function(e){return e*e},easeOut:function(e){return e*(2-e)},easeInHard:function(e){return e*e*e},easeOutHard:function(e){return--e*e*e+1},easeOutElastic:function(e){var t=2*Math.PI/3;return 0===e?0:1===e?1:Math.pow(2,-10*e)*Math.sin((10*e-.75)*t)+1}},_e=function(){function e(t){i(this,e),h(this,"icons",void 0),h(this,"status",void 0);var n=function(e){return t.querySelector("[data-state=".concat(e,"]"))};this.icons={},this.icons.sleeping=n("sleeping"),this.icons.locked=n("locked"),this.icons.unlocked=n("unlocked"),this.icons.nowallet=n("nowallet"),this.icons.syncing=n("syncing"),this.icons.nopeers=n("nopeers"),this.icons.disabled=n("disabled"),this.status=n("status")}return d(e,[{key:"sleeping",value:function(){var e=this.icons;We.hide(e.locked,e.unlocked,e.nowallet,e.syncing,e.disabled),We.show(e.sleeping),this.status&&(this.status.textContent=ke("OFF"))}},{key:"locked",value:function(){var e=this.icons;We.hide(e.unlocked,e.nowallet,e.sleeping,e.disabled),We.show(e.locked),this.status&&(this.status.textContent=ke(z))}},{key:"unlocked",value:function(){var e=this.icons;We.hide(e.locked,e.nowallet,e.sleeping,e.disabled),We.show(e.unlocked),this.status&&(this.status.textContent=ke("READY"))}},{key:"nowallet",value:function(){var e=this.icons;We.hide(e.locked,e.unlocked,e.sleeping,e.syncing,e.disabled),We.show(e.nowallet),this.status&&(this.status.textContent=ke("NO_WALLET"))}},{key:"disabled",value:function(){var e=this.icons;We.hide(e.locked,e.unlocked,e.sleeping,e.syncing,e.nowallet,e.nopeers),We.show(e.disabled),e.disabled.dataset.tooltip=ke("DISABLED_MSG")}},{key:"setSyncing",value:function(e){var t=this.icons.syncing;if(e&&e.running&&!e.disabled){if(0===e.peerCount)return We.show(this.icons.nopeers),void We.hide(t);if(We.hide(this.icons.nopeers),!e.synced)return We.show(t),void(t.dataset.tooltip=ke("WALLET_SYNC_PROGRESS",{syncProgress:(100*e.syncProgress).toFixed(1)}));We.hide(t)}else We.hide(t)}},{key:"readWallet",value:function(e){if(this.setSyncing(e),!e)return this.nowallet();switch(!0){case e.disabled:this.disabled();break;case!e.running:this.sleeping();break;case!e.open:this.locked();break;case e.open:this.unlocked();break;default:console.error("wallet in unknown state",e)}}}]),e}(),je=function(){function e(t,n,r,a){var o=this;i(this,e),h(this,"toggle",void 0),h(this,"toggling",void 0),this.toggle=t,0===t.children.length&&t.appendChild(document.createElement("div")),We.bind(t,"click",function(){var e=s(f().mark((function e(r){var s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r.stopPropagation(),We.hide(n),s=!t.classList.contains("on"),o.toggling=!0,e.prev=4,e.next=7,a(s);case 7:e.next=15;break;case 9:return e.prev=9,e.t0=e.catch(4),o.toggling=!1,We.show(n),n.textContent=ke(H,{msg:e.t0.msg||String(e.t0)}),e.abrupt("return");case 15:o.toggling=!1;case 16:case"end":return e.stop()}}),e,null,[[4,9]])})));return function(t){return e.apply(this,arguments)}}()),this.setState(r)}return d(e,[{key:"setState",value:function(e){e?this.toggle.classList.add("on"):this.toggle.classList.remove("on")}}]),e}();function He(e){return new Promise((function(t){return setTimeout(t,e)}))}var ze=31536e6,Ge=2592e6,Xe=864e5,Ke=36e5,Qe=6e4;function Ye(e,t){var n=Math.floor(e/t);return[n,e-n*t]}var Je=function(){function e(t,n){var r,a,o,s=this;i(this,e),h(this,"input",void 0),h(this,"prec",void 0),h(this,"fmt",void 0),h(this,"changed",void 0),h(this,"set",void 0),h(this,"min",void 0),this.input=t,this.prec=null!==(r=n.prec)&&void 0!==r?r:0,this.fmt=n.sigFigs?tt:et,this.changed=null!==(a=n.changed)&&void 0!==a?a:function(){},this.set=n.set,this.min=null!==(o=n.min)&&void 0!==o?o:0,We.bind(t,"change",(function(){s.inputChanged()}))}return d(e,[{key:"inputChanged",value:function(){var e=this.changed;e&&e(this.value())}},{key:"setValue",value:function(e){this.input.value=String(e),e=this.value(),this.set&&this.set(e,this.input.value)}},{key:"value",value:function(){var e=this.input,t=this.min,n=this.prec,r=a((0,this.fmt)(Math.max(nt(e.value,null!=t?t:0),null!=t?t:0),null!=n?n:0),2),o=r[0],s=r[1];return e.value=s,o}}]),e}(),Ze=function(e){g(a,e);var t,n,r=(t=a,n=we(),function(){var e,r=x(t);if(n){var a=x(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function a(e,t){var n,o;i(this,a),h(v(o=r.call(this,We.safeSelector(e,"input"),t)),"inc",void 0),h(v(o),"opts",void 0),o.opts=t,o.inc=null!==(n=t.inc)&&void 0!==n?n:1;var s=We.safeSelector(e,".ico-arrowup"),c=We.safeSelector(e,".ico-arrowdown");return We.bind(s,"click",(function(){o.increment(1)})),We.bind(c,"click",(function(){o.increment(-1)})),o}return d(a,[{key:"setIncrementAndMinimum",value:function(e,t){this.inc=e,this.min=t}},{key:"increment",value:function(e){var t=this.inc,n=this.min;this.input.value=String(Math.max(this.value()+e*t,n)),this.inputChanged()}}]),a}(Je),$e=function(){function e(t,n){var r=this;i(this,e),h(this,"track",void 0),h(this,"ball",void 0),h(this,"r",void 0),h(this,"changed",void 0),this.changed=n,this.r=0;var a=document.createElement("div");a.dataset.tmpl="color",t.appendChild(a);var o=this.track=document.createElement("div");o.dataset.tmpl="track",a.appendChild(o);var s=this.ball=document.createElement("div");s.dataset.tmpl="ball",o.appendChild(s),We.bind(t,"mousedown",(function(e){if(0===e.button){e.preventDefault(),e.stopPropagation();var t=e.pageX,n=o.clientWidth,a=r.r*n,i=function(e){e.preventDefault();var o=function(e){return Math.max(Math.min(a+(e.pageX-t),n),0)}(e);r.r=o/n,s.style.left="".concat(100*r.r,"%"),r.changed(r.r)};We.bind(document,"mousemove",i),We.bind(document,"mouseup",(function e(t){i(t),We.unbind(document,"mousemove",i),We.unbind(document,"mouseup",e)}))}})),We.bind(t,"click",(function(e){if(0===e.button){var t=e.pageX,n=We.layoutMetrics(o);r.r=rt((t-n.bodyLeft)/n.width,0,1),s.style.left="".concat(r.r*n.width,"px"),r.changed(r.r)}}))}return d(e,[{key:"setValue",value:function(e){this.r=rt(e,0,1),this.ball.style.left="".concat(100*this.r,"%")}}]),e}();function et(e,t){var n=Math.pow(10,null!=t?t:0),r=(e=Math.round(e*n)/n).toFixed(t);if(t>0){for(;r.endsWith("0");)r=r.substring(0,r.length-1);r.endsWith(".")&&(r=r.substring(0,r.length-1))}return[e,r]}function tt(e,t){var n=Math.floor(Math.log10(Math.abs(e)));return n>=3?[Math.round(e),e.toFixed(0)]:et(e,Math.min(4-n,t))}function nt(e,t){var n=parseFloat((null!=e?e:"").replace(/,/g,""));return isNaN(n)?null!=t?t:0:n}function rt(e,t,n){return e<t?t:e>n?n:e}function at(e,t,n,r){return ot.apply(this,arguments)}function ot(){return(ot=s(f().mark((function e(t,n,r,a){var o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,navigator.clipboard.writeText(t);case 3:e.next=8;break;case 5:e.prev=5,e.t0=e.catch(0),console.error("Unable to copy: ",e.t0);case 8:o=n.style.color,s=r.style.color,n.style.color=a,r.style.color=a,setTimeout((function(){n.style.color=o,r.style.color=s}),350);case 13:case"end":return e.stop()}}),e,null,[[0,5]])})))).apply(this,arguments)}var st,it,ct,lt,ut=function(){function e(){i(this,e)}return d(e,[{key:"unload",value:function(){}}]),e}(),dt=function(e){return e[e.Disconnected=0]="Disconnected",e[e.Connected=1]="Connected",e[e.InvalidCert=2]="InvalidCert",e}({}),ht=function(e){return e[e.Approved=0]="Approved",e[e.Pending=1]="Pending",e[e.NotApproved=2]="NotApproved",e}({}),pt=function(e){return e[e.WalletDefault=0]="WalletDefault",e[e.UserAdded=1]="UserAdded",e[e.Discovered=2]="Discovered",e}({}),ft=2147483647;function vt(){return st}function mt(e){var t=gt();return function(){var n,r=x(e);if(t){var a=x(this).constructor;n=Reflect.construct(r,arguments,a)}else n=r.apply(this,arguments);return y(this,n)}}function gt(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(gt=function(){return!!e})()}function yt(e){var t=[e.booleanOptTmpl,e.rangeOptTmpl,e.orderOptTmpl];ct=t[0],lt=t[1],it=t[2]}var xt=new Intl.NumberFormat(We.languages(),{minimumSignificantDigits:3,maximumSignificantDigits:3}),bt=d((function e(t,n,r){var a=this;i(this,e),h(this,"opt",void 0),h(this,"node",void 0),h(this,"tmpl",void 0),h(this,"on",void 0),this.opt=t;var o=this.node=it.cloneNode(!0),s=this.tmpl=We.parseTemplate(o);s.optName.textContent=t.displayname,s.tooltip.dataset.tooltip=t.description,n?s.chainIcon.src=We.logoPath(n):We.hide(s.chainIcon),this.on=!1,We.bind(o,"click",(function(){a.on||(a.on=!0,o.classList.add("selected"),r.enable())})),We.bind(s.toggle,"click",(function(e){a.on&&(e.stopPropagation(),a.on=!1,o.classList.remove("selected"),r.disable())}))})),kt=function(e){g(n,e);var t=mt(n);function n(e,r,a,o){var s;if(i(this,n),h(v(s=t.call(this,e,r,{enable:function(){return s.enable()},disable:function(){return s.disable()}})),"control",void 0),h(v(s),"changed",void 0),h(v(s),"dict",void 0),s.dict=a,s.changed=function(){return o()},void 0===e.boolean)throw Error("not a boolean opt");var c=e.boolean,l=s.control=ct.cloneNode(!0);return s.tmpl.controls.appendChild(l),We.parseTemplate(l).reason.textContent=c.reason,s.on=void 0!==a[e.key]?a[e.key]:e.default,s.on&&s.node.classList.add("selected"),s}return d(n,[{key:"store",value:function(){this.on===this.opt.default?delete this.dict[this.opt.key]:this.dict[this.opt.key]=this.on,this.changed()}},{key:"enable",value:function(){this.store()}},{key:"disable",value:function(){this.store()}}]),n}(bt),wt=function(e){g(n,e);var t=mt(n);function n(e,r,a,o){var s;if(i(this,n),h(v(s=t.call(this,e,r,{enable:function(){return s.enable()},disable:function(){return s.disable()}})),"handler",void 0),h(v(s),"x",void 0),h(v(s),"changed",void 0),h(v(s),"dict",void 0),s.dict=a,s.changed=o,void 0===e.xyRange)throw Error("not an xy range opt");var c=e.xyRange,l=a[e.key];return s.on=void 0!==l,s.on?(s.node.classList.add("selected"),s.x=l):s.x=e.default,s.handler=new Ct(c,s.x,{changed:o,selected:function(){s.node.classList.add("selected")},settingsDict:a,settingsKey:e.key}),s.tmpl.controls.appendChild(s.handler.control),s}return d(n,[{key:"enable",value:function(){this.dict[this.opt.key]=this.x,this.changed()}},{key:"disable",value:function(){delete this.dict[this.opt.key],this.changed()}},{key:"setValue",value:function(e){this.handler.setValue(e),this.on=!0,this.node.classList.add("selected")}}]),n}(bt),Ct=function(){function e(t,n,r){var a,o,s,c,l=this;i(this,e),h(this,"control",void 0),h(this,"range",void 0),h(this,"tmpl",void 0),h(this,"initVal",void 0),h(this,"settingsDict",void 0),h(this,"settingsKey",void 0),h(this,"x",void 0),h(this,"scrollingX",void 0),h(this,"y",void 0),h(this,"r",void 0),h(this,"roundX",void 0),h(this,"roundY",void 0),h(this,"disabled",void 0),h(this,"updated",void 0),h(this,"changed",void 0),h(this,"selected",void 0),h(this,"convert",void 0);var u=this.control=lt.cloneNode(!0),d=this.tmpl=We.parseTemplate(u);d.rangeLblStart.textContent=t.start.label,d.rangeLblEnd.textContent=t.end.label,d.xUnit.textContent=t.xUnit,d.yUnit.textContent=t.yUnit,this.range=t,this.initVal=n,this.settingsDict=r.settingsDict,this.settingsKey=null!==(a=r.settingsKey)&&void 0!==a?a:"",this.roundX=Boolean(r.roundX),this.roundY=Boolean(r.roundY),this.setDisabled(Boolean(r.disabled)),this.changed=null!==(o=r.changed)&&void 0!==o?o:function(){},this.selected=null!==(s=r.selected)&&void 0!==s?s:function(){},this.updated=null!==(c=r.updated)&&void 0!==c?c:function(){},this.convert=r.convert||function(e){return e};var p=d.slider,f=d.handle,v=t.end.x-t.start.x,m=t.end.y-t.start.y,g=function(e){return(e-t.start.x)/v};this.r=g(n),this.scrollingX=this.x=n,this.y=this.r*m+t.start.y,this.accept(this.scrollingX,{skipUpdate:!0});var y=function e(n){if(!l.disabled&&("change"===n.type||n.target!==d.xInput)){var r=d.xInput.value;if(r){var a=parseFloat(r);isNaN(a)||(l.scrollingX=St(a,t.start.x,t.end.x),l.r=g(l.scrollingX),l.y=l.r*m+t.start.y,l.accept(l.scrollingX))}We.hide(d.xInput),We.show(d.x),We.unbind(document,"click",e),l.changed()}};We.bind(d.x,"click",(function(e){l.disabled||(We.hide(d.x),We.show(d.xInput),d.xInput.focus(),d.xInput.value=xt.format(l.scrollingX),We.bind(document,"click",y),e.stopPropagation())})),We.bind(d.xInput,"change",y);var x=function e(n){if(!l.disabled&&("change"===n.type||n.target!==d.yInput)){var r=d.yInput.value;if(r){var a=parseFloat(r);isNaN(a)||(l.y=St(a,t.start.y,t.end.y),l.r=(l.y-t.start.y)/m,l.scrollingX=t.start.x+l.r*v,l.accept(l.scrollingX))}We.hide(d.yInput),We.show(d.y),We.unbind(document,"click",e),l.changed()}};We.bind(d.y,"click",(function(e){l.disabled||(We.hide(d.y),We.show(d.yInput),d.yInput.focus(),d.yInput.value=xt.format(l.y),We.bind(document,"click",x),e.stopPropagation())})),We.bind(d.yInput,"change",x),We.bind(f,"mousedown",(function(e){if(!l.disabled&&0===e.button){e.preventDefault(),e.stopPropagation(),l.selected();var n=e.pageX,r=p.clientWidth-f.offsetWidth,a=g(l.scrollingX)*r,o=function(e,o){e.preventDefault(),l.r=function(e){return Math.max(Math.min(a+(e.pageX-n),r),0)}(e)/r,l.scrollingX=l.r*v+t.start.x,l.y=l.r*m+t.start.y,l.accept(l.scrollingX,{skipChange:!o})};We.bind(document,"mousemove",o),We.bind(document,"mouseup",(function e(t){o(t,!0),We.unbind(document,"mousemove",o),We.unbind(document,"mouseup",e),l.changed()}))}})),We.bind(d.sliderBox,"click",(function(e){if(!l.disabled&&0===e.button){var n=e.pageX,r=We.layoutMetrics(d.slider);l.r=St((n-r.bodyLeft)/r.width,0,1),l.scrollingX=l.r*v+t.start.x,l.y=l.r*m+t.start.y,l.accept(l.scrollingX)}}))}return d(e,[{key:"setDisabled",value:function(e){this.control.classList.toggle("disabled",e),this.disabled=e}},{key:"setXLabel",value:function(e){this.tmpl.x.textContent=e}},{key:"setYLabel",value:function(e){this.tmpl.y.textContent=e}},{key:"accept",value:function(e,t){var n,r=this.tmpl;this.roundX&&(e=Math.round(e)),this.roundY&&(this.y=Math.round(this.y)),r.x.textContent=xt.format(e),r.y.textContent=xt.format(this.y),this.roundY&&(r.y.textContent="".concat(this.y));var a=St(this.r,0,1);r.handle.style.left="calc(".concat(100*a,"% - ").concat(14*a,"px)"),this.x=e,this.scrollingX=e,t=null!==(n=t)&&void 0!==n?n:{},this.settingsDict&&(this.settingsDict[this.settingsKey]=this.convert(this.x,this.y)),t.skipUpdate||(this.updated(e,this.y),t.skipChange||this.changed())}},{key:"setValue",value:function(e,t){var n=this.range;this.r=(e-n.start.x)/(n.end.x-n.start.x),this.y=n.start.y+this.r*(n.end.y-n.start.y),this.accept(e,{skipUpdate:t})}},{key:"modified",value:function(){return this.x!==this.initVal}},{key:"reset",value:function(){this.setValue(this.initVal,!0)}}]),e}(),St=function(e,t,n){return e<t?t:e>n?n:e};function Ft(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Tt(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Tt(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function Tt(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var Dt=1e8;function It(e){var t=e.sell?B:E,n=document.documentElement.lang.toLowerCase();return ke(t).toLocaleLowerCase(n)}function At(e){return 1===e.type?0===e.tif?ke("LIMIT_ORDER_IMMEDIATE_TIF"):ke(X):ke(K)}function Rt(e){return 2===e.type&&!e.sell}function Et(e){if(!e.matches)return!1;var t,n=Ft(e.matches);try{for(n.s();!(t=n.n()).done;)if(t.value.active)return!0}catch(e){n.e(e)}finally{n.f()}return!1}function Bt(e){if(!e.id)return ke("ORDER_SUBMITTING");var t=Et(e);switch(e.status){case 0:return ke(W);case 1:return ke("EPOCH");case 2:return e.cancelling?ke(q):t?"".concat(ke(M),"/").concat(ke(V)):ke(M);case 3:return t?ke(V):0===e.filled&&3!==e.type?ke("NO_MATCH"):ke(O);case 4:return t?"".concat(ke(U),"/").concat(ke(V)):ke(U);case 5:return t?"".concat(ke(_),"/").concat(ke(V)):ke(_)}return ke(W)}function Pt(e){if(!e.matches)return 0;var t=Rt(e)?function(e){return e.qty*e.rate/Dt}:function(e){return e.qty};return e.matches.reduce((function(e,n){return n.isCancel?e:e+t(n)}),0)}function Lt(e){if(!e.matches)return 0;var t=Rt(e)?function(e){return e.qty*e.rate/Dt}:function(e){return e.qty};return e.matches.reduce((function(e,n){return n.isCancel?e:0===n.side&&n.status>=3||1===n.side&&n.status>=4?e+t(n):e}),0)}function Ot(e){var t;if(null===(t=e.matches)||void 0===t||!t.length)return ke(K);var n=We.formatCoinValue(vt().conventionalRate(e.baseID,e.quoteID,Mt(e)));return e.matches.length>1&&(n="~ "+n),n}function Mt(e){var t;if(null===(t=e.matches)||void 0===t||!t.length)return 0;var n,r=0,a=0,o=Ft(e.matches);try{for(o.s();!(n=o.n()).done;){var s=n.value;a+=s.qty,r+=s.rate*s.qty}}catch(e){o.e(e)}finally{o.f()}return r/a}function qt(e,t){return e*t/Dt}function Nt(e){return ke("MATCH_STATUS_REVOKED",{status:ke(e)})}function Wt(e){return 1===e.type&&1===e.tif&&e.status<3}function Vt(e){var t=Ut();return function(){var n,r=x(e);if(t){var a=x(this).constructor;n=Reflect.construct(r,arguments,a)}else n=r.apply(this,arguments);return y(this,n)}}function Ut(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Ut=function(){return!!e})()}function _t(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return jt(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?jt(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function jt(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var Ht=We.bind,zt=2*Math.PI,Gt=String.fromCharCode(59914),Xt=String.fromCharCode(59915),Kt={body:"#0b2031",axisLabel:"#b1b1b1",gridBorder:"#383f4b",gridLines:"#383f4b",gapLine:"#6b6b6b",value:"#9a9a9a",zoom:"#5b5b5b",zoomHover:"#aaa",sellLine:"#ae3333",buyLine:"#05a35a",sellFill:"#591a1a",buyFill:"#02572f",crosshairs:"#888",legendFill:"black",legendText:"#d5d5d5"},Qt={body:"#f4f4f4",axisLabel:"#1b1b1b",gridBorder:"#ddd",gridLines:"#ddd",gapLine:"#595959",value:"#4d4d4d",zoom:"#777",zoomHover:"#333",sellLine:"#99302b",buyLine:"#207a46",sellFill:"#bd5959",buyFill:"#4cad75",crosshairs:"#595959",legendFill:"#e6e6e6",legendText:"#1b1b1b"},Yt=function(){function e(t,n){var r=this;i(this,e),h(this,"parent",void 0),h(this,"report",void 0),h(this,"theme",void 0),h(this,"canvas",void 0),h(this,"visible",void 0),h(this,"renderScheduled",void 0),h(this,"ctx",void 0),h(this,"mousePos",void 0),h(this,"rect",void 0),h(this,"wheelLimiter",void 0),h(this,"boundResizer",void 0),h(this,"plotRegion",void 0),h(this,"xRegion",void 0),h(this,"yRegion",void 0),h(this,"dataExtents",void 0),h(this,"unattachers",void 0),this.parent=t,this.report=n,this.theme=k.isDark()?Kt:Qt,this.canvas=document.createElement("canvas"),this.visible=!0,t.appendChild(this.canvas);var a=this.canvas.getContext("2d");if(a){this.ctx=a,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.mousePos=null,Ht(this.canvas,"mousemove",(function(e){r.rect&&(r.mousePos={x:e.clientX-r.rect.left,y:e.clientY-r.rect.y},r.draw())})),Ht(this.canvas,"mouseleave",(function(){r.mousePos=null,r.draw()})),new ResizeObserver((function(){return r.resize()})).observe(this.parent),this.wheelLimiter=null,Ht(this.canvas,"wheel",(function(e){r.wheel(e)}),{passive:!0}),Ht(this.canvas,"click",(function(e){r.click(e)}));var o=function(){r.visible="hidden"!==document.visibilityState,r.visible&&r.renderScheduled&&(r.renderScheduled=!1,r.draw())};Ht(document,"visibilitychange",o),this.unattachers=[function(){We.unbind(document,"visibilitychange",o)}]}else console.error("error getting canvas context")}return d(e,[{key:"wheeled",value:function(){var e=this;this.wheelLimiter=window.setTimeout((function(){e.wheelLimiter=null}),100)}},{key:"clear",value:function(){this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height)}},{key:"draw",value:function(){this.render()}},{key:"click",value:function(e){this.report.click(e)}},{key:"wheel",value:function(e){this.zoom(e.deltaY<0)}},{key:"resize",value:function(){var e=this;this.canvas.width=this.parent.clientWidth,this.canvas.height=this.parent.clientHeight;var t=new en(0,this.canvas.width,0,this.canvas.height-30),n=new en(0,this.canvas.width,this.canvas.height-30,this.canvas.height),r=new en(0,40,0,this.canvas.height-30);this.plotRegion=new tn(this.ctx,t),this.xRegion=new tn(this.ctx,n),this.yRegion=new tn(this.ctx,r),window.requestAnimationFrame((function(){e.rect=e.canvas.getBoundingClientRect(),e.report.resize()}))}},{key:"zoom",value:function(e){this.wheelLimiter||this.report.zoom(e)}},{key:"unattach",value:function(){var e,t=_t(this.unattachers);try{for(t.s();!(e=t.n()).done;)(0,e.value)()}catch(e){t.e(e)}finally{t.f()}this.unattachers=[]}},{key:"render",value:function(){console.error("child class must override render method")}},{key:"applyLabelStyle",value:function(e){this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.font="".concat(null!=e?e:"14","px 'sans', sans-serif"),this.ctx.fillStyle=this.theme.axisLabel}},{key:"plotXLabels",value:function(e,t,n,r){var a=this,o=new en(t,n,0,1);this.xRegion.plot(o,(function(o,s){a.applyLabelStyle();var i=(n+t)/2,c=t,l=i,u=[s.x(t),s.x(n)],d=u[0],h=u[1],p=s.y(.5);e.lbls.forEach((function(e){var t=o.measureText(e.txt),n=s.x(e.val);n-t.width/2<d||n+t.width/2>h||(o.fillText(e.txt,n,p),i>=c&&i<e.val&&(l=(c+e.val)/2),c=e.val)})),o.font="11px 'sans', sans-serif",2===r.length?(o.fillText(r[0],s.x(l),s.y(.63)),o.fillText(r[1],s.x(l),s.y(.23))):1===r.length&&o.fillText(r[0],s.x(l),p)}),!0)}},{key:"plotXGrid",value:function(e,t,n){var r=this,a=new en(t,n,0,1);this.plotRegion.plot(a,(function(t,n){t.lineWidth=1,t.strokeStyle=r.theme.gridLines,e.lbls.forEach((function(e){on(t,n.x(e.val),n.y(0),n.x(e.val),n.y(1))}))}),!0)}},{key:"plotYLabels",value:function(e,t,n,r){var a=this,o=new en(0,1,t,n),s=function(e,t,n,r,o,s){e.save(),e.fillStyle=a.theme.body,e.beginPath(),e.roundRect?e.roundRect(t,n,r,o,s):e.rect(t,n,r,o),e.fill(),e.restore()};this.yRegion.plot(o,(function(o,i){a.applyLabelStyle(),a.ctx.textAlign="left";var c=n/2,l=0,u=c,d=i.x(0);e.lbls.forEach((function(e){var r=i.y(e.val);if(!(r<i.y(n)+3+7||r>i.y(t)-3-7)){var a=o.measureText(e.txt);s(o,d,r-7-3,a.width+6,23,3),o.fillText(e.txt,d+3,r+2),c>=l&&c<e.val&&(u=(l+e.val)/2),l=e.val}}));var h=o.measureText(r),p=i.y(u);s(o,d,p-3-7,h.width+6,20,3),o.fillText(r,d+3,i.y(u))}),!0)}},{key:"plotYGrid",value:function(e,t,n,r){var a=this,o=new en(0,1,n,r);e.plot(o,(function(e,n){e.lineWidth=1,e.strokeStyle=a.theme.gridLines,t.lbls.forEach((function(t){on(e,n.x(0),n.y(t.val),n.x(1),n.y(t.val))}))}),!0)}},{key:"makeYLabels",value:function(e,t,n,r){this.applyLabelStyle();var a=nn(this.ctx,e.height(),this.dataExtents.y.min,this.dataExtents.y.max,50,t,n,r),o=(a.widest||0)+20;return this.yRegion.extents.x.max=o,this.yRegion.extents.y.max=e.extents.y.max,a}},{key:"line",value:function(e,t,n,r,a){on(this.ctx,e,t,n,r,a)}},{key:"dot",value:function(e,t,n,r){sn(this.ctx,e,t,n,r)}}]),e}(),Jt=function(e){g(n,e);var t=Vt(n);function n(e,r,a){var o;return i(this,n),h(v(o=t.call(this,e,{resize:function(){return o.resized()},click:function(e){return o.clicked(e)},zoom:function(e){return o.zoomed(e)}})),"reporters",void 0),h(v(o),"book",void 0),h(v(o),"zoomLevel",void 0),h(v(o),"lotSize",void 0),h(v(o),"conventionalRateStep",void 0),h(v(o),"lines",void 0),h(v(o),"markers",void 0),h(v(o),"zoomInBttn",void 0),h(v(o),"zoomOutBttn",void 0),h(v(o),"baseUnit",void 0),h(v(o),"quoteUnit",void 0),o.reporters=r,o.zoomLevel=a,o.lines=[],o.markers={buys:[],sells:[]},o.setZoomBttns(),o.resize(),o}return d(n,[{key:"setZoomBttns",value:function(){this.zoomInBttn=new tn(this.ctx,new en(0,0,0,0)),this.zoomOutBttn=new tn(this.ctx,new en(0,0,0,0))}},{key:"resized",value:function(){this.setZoomBttns(),this.book&&this.draw()}},{key:"zoomed",value:function(e){this.zoomLevel&&this.book.buys&&this.book.sells&&(this.wheeled(),this.zoomLevel*=e?2/3:1.5,this.zoomLevel=rt(this.zoomLevel,.005,2),this.draw(),this.reporters.zoom(this.zoomLevel))}},{key:"clicked",value:function(e){if(this.dataExtents){var t=e.clientX-this.rect.left,n=e.clientY-this.rect.y;if(this.zoomInBttn.contains(t,n))this.zoom(!0);else if(this.zoomOutBttn.contains(t,n))this.zoom(!1);else{var r=this.plotRegion.translator(this.dataExtents);this.reporters.click(r.unx(t))}}}},{key:"set",value:function(e,t,n,r,o){if(this.book=e,this.lotSize=t/r.conventional.conversionFactor,this.conventionalRateStep=We.conventionalRateStep(n,r,o),this.baseUnit=r.conventional.unit,this.quoteUnit=o.conventional.unit,!this.zoomLevel){var s=a(this.gap(),2),i=s[0],c=s[1],l=Math.max(c/i*5,.05);this.zoomLevel=Math.min(l,2)}this.draw()}},{key:"render",value:function(){var e=this;if(this.book&&this.visible&&0!==this.canvas.width){this.clear();var t=this.ctx,n=this.mousePos,o=this.book.buys,s=this.book.sells,i=a(this.gap(),2),c=i[0],l=i[1],u=this.zoomLevel*c/2,d=c+u,h=c-u,p=r(this.markers.buys),f=r(this.markers.sells);p.sort((function(e,t){return t.rate-e.rate})),f.sort((function(e,t){return e.rate-t.rate}));for(var v=[],m=[],g=[],y=[],x=[],b={buyBase:0,buyQuote:0,sellBase:0,sellQuote:0},k=0,w=0,C=0;C<o.length;C++){var S=o[C];if(w+=S.qty,S.rate>=h&&g.push([S.rate,w]),!S.epoch)for(k+=S.qty,m.push([S.rate,k]),b.buyBase+=S.qty,b.buyQuote+=S.qty*S.rate;p.length&&cn(p[0].rate,S.rate);){var F=p.shift();F&&v.push({rate:F.rate,qty:S.epoch?w:k,sell:S.sell,active:F.active})}}var T=m.length?an(m)[1]:0;m.push([h,T]);var D=g.length?an(g)[1]:0;g.push([h,D]),w=k=0;for(var I=0;I<s.length;I++){var A=s[I];if(w+=A.qty,A.rate<=d&&x.push([A.rate,w]),!A.epoch)for(k+=A.qty,y.push([A.rate,k]),b.sellBase+=A.qty,b.sellQuote+=A.qty*A.rate;f.length&&cn(f[0].rate,A.rate);){var R=f.shift();R&&v.push({rate:R.rate,qty:A.epoch?w:k,sell:A.sell,active:R.active})}}var E=y.length?an(y)[1]:0;y.push([d,E]);var B=x.length?an(x)[1]:0;x.push([d,B]);var P=this.xRegion.extents.y.min,L=(P+40)/P,O=(B&&D?Math.max(D,B):B||D||1)*L,M=new en(h,d,0,O);this.dataExtents=M;var q=null,N=nn(t,this.plotRegion.width(),M.x.min,M.x.max,100,this.conventionalRateStep,"");this.plotXGrid(N,h,d);var W=this.makeYLabels(this.plotRegion,this.lotSize,this.baseUnit);this.plotYGrid(this.plotRegion,W,this.dataExtents.y.min,this.dataExtents.y.max),this.plotRegion.plot(M,(function(t,r){t.lineWidth=1,t.strokeStyle=e.theme.gridBorder,t.lineWidth=2.5,t.strokeStyle=e.theme.gapLine,on(t,r.x(c),r.y(0),r.x(c),r.y(.3*M.y.max)),t.font="30px 'demi-sans', sans-serif",t.textAlign="center",t.textBaseline="middle",t.fillStyle=e.theme.value;var a=.5*M.y.max;t.fillText(We.formatFourSigFigs(c),r.x(c),r.y(a)),t.font="12px 'sans', sans-serif",t.fillText("".concat((l/c*100).toFixed(2),"% spread"),r.x(c),r.y(a)+24),t.textAlign="center",t.textBaseline="middle";var o=e.plotRegion.extents.midX,s=r.y(.9*O),i=M.xRange/c*100,u="".concat(i.toFixed(1),"%"),p=t.measureText(u).width;t.font="13px 'sans', sans-serif",t.fillText(u,o,s+1);var f=o-p/2-10-20,g=s-10;e.zoomOutBttn.setExtents(f,f+20,g,g+20);var x=n&&e.zoomOutBttn.contains(n.x,n.y);e.zoomOutBttn.plot(new en(0,1,0,1),(function(t){t.font="12px 'icomoon'",t.fillStyle=e.theme.zoom,x&&(t.fillStyle=e.theme.zoomHover,t.font="13px 'icomoon'"),t.fillText(Xt,e.zoomOutBttn.extents.midX,e.zoomOutBttn.extents.midY)})),f=o+p/2+10,e.zoomInBttn.setExtents(f,f+20,g,g+20),x=n&&e.zoomInBttn.contains(n.x,n.y),e.zoomInBttn.plot(new en(0,1,0,1),(function(t){t.font="12px 'icomoon'",t.fillStyle=e.theme.zoom,x&&(t.fillStyle=e.theme.zoomHover,t.font="14px 'icomoon'"),t.fillText(Gt,e.zoomInBttn.extents.midX,e.zoomInBttn.extents.midY)}));for(var b=.005*(d-h),k=[],w=0,C=v||[];w<C.length;w++){var S=C[w],F=n&&ln(S.rate,r.unx(n.x),b);F&&k.push(S.rate),t.save(),t.lineWidth=F||S.active?5:3,t.strokeStyle=S.sell?e.theme.sellLine:e.theme.buyLine,t.fillStyle=S.sell?e.theme.sellFill:e.theme.buyFill;var T=F||S.active?10:8;t.beginPath();var D={x:r.x(S.rate),y:r.y(S.qty)-8},I=D.y-Math.sqrt(3)*T/2;t.moveTo(D.x,D.y),t.lineTo(D.x-T/2,I),t.lineTo(D.x+T/2,I),t.closePath(),t.stroke(),t.fill(),t.restore()}if(n&&e.plotRegion.contains(n.x,n.y)){var A=r.unx(n.x),R=y,E=function(e){return e>=A},B=e.theme.sellLine;A<c&&(R=m,E=function(e){return e<=A},B=e.theme.buyLine);for(var P,L,N=R[0],W=0;W<R.length;W++){var V=R[W];if(E(V[0]))break;N=V}P=A,L=e.theme.crosshairs,P>d||P<h||(t.save(),t.setLineDash([3,5]),t.lineWidth=1.5,t.strokeStyle=L,on(t,r.x(P),r.y(0),r.x(P),r.y(O)),t.restore()),q={rate:A,depth:N[1],dotColor:B,hoverMarkers:k}}})),t.lineWidth=1.5,t.setLineDash([3,3]),t.fillStyle=this.theme.sellFill,t.strokeStyle=this.theme.sellLine,this.drawDepth(x),t.fillStyle=this.theme.buyFill,t.strokeStyle=this.theme.buyLine,this.drawDepth(g),t.lineWidth=2.5,t.setLineDash([]),t.fillStyle=this.theme.sellFill,t.strokeStyle=this.theme.sellLine,this.drawDepth(y),t.fillStyle=this.theme.buyFill,t.strokeStyle=this.theme.buyLine,this.drawDepth(m),this.plotYLabels(W,this.dataExtents.y.min,this.dataExtents.y.max,this.baseUnit),this.plotXLabels(N,h,d,["".concat(this.quoteUnit,"/"),this.baseUnit]),q&&this.plotRegion.plot(M,(function(e,t){q&&sn(e,t.x(q.rate),t.y(q.depth),q.dotColor,5)})),this.reporters.volume(b),this.reporters.mouse(q)}else this.renderScheduled=!0}},{key:"drawDepth",value:function(e){var t,n=e[0];this.plotRegion.plot(this.dataExtents,(function(r,a){var o=a.y(0),s=a.y(n[1]);r.beginPath(),r.moveTo(a.x(n[0]),a.y(n[1]));for(var i=0;i<e.length;i++)t=a.x(e[i][0]),r.lineTo(t,s),s=a.y(e[i][1]),r.lineTo(t,s);r.stroke(),r.lineTo(t,o),r.lineTo(a.x(n[0]),o),r.closePath(),r.globalAlpha=.25,r.fill()}))}},{key:"gap",value:function(){var e=[this.book.bestGapBuy(),this.book.bestGapSell()],t=e[0],n=e[1];return t?n?[(n.rate+t.rate)/2,n.rate-t.rate]:[t.rate,0]:n?[n.rate,0]:[1,0]}},{key:"setLines",value:function(e){this.lines=e}},{key:"setMarkers",value:function(e){this.markers=e}}]),n}(Yt),Zt=function(e){g(n,e);var t=Vt(n);function n(e,r){var a;return i(this,n),h(v(a=t.call(this,e,{resize:function(){return a.resized()},click:function(){a.clicked()},zoom:function(e){return a.zoomed(e)}})),"reporters",void 0),h(v(a),"data",void 0),h(v(a),"zoomLevel",void 0),h(v(a),"numToShow",void 0),h(v(a),"candleRegion",void 0),h(v(a),"volumeRegion",void 0),h(v(a),"resizeTimer",void 0),h(v(a),"zoomLevels",void 0),h(v(a),"market",void 0),h(v(a),"rateConversionFactor",void 0),a.reporters=r,a.zoomLevel=1,a.numToShow=100,a.resize(),a}return d(n,[{key:"resized",value:function(){var e=this,t=this.plotRegion.extents,n=new en(t.x.min,t.x.max,t.y.min,t.y.min+.85*t.yRange);this.candleRegion=new tn(this.ctx,n);var r=new en(t.x.min,t.x.max,t.y.min+.85*t.yRange,t.y.max);this.volumeRegion=new tn(this.ctx,r),this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=window.setTimeout((function(){return e.draw()}),100)}},{key:"clicked",value:function(){}},{key:"zoomed",value:function(e){var t=this.zoomLevels.indexOf(this.numToShow);if(e){if(0===t)return;this.numToShow=this.zoomLevels[t-1]}else{if(this.zoomLevels.length<=t+1||this.numToShow>this.data.candles.length)return;this.numToShow=this.zoomLevels[t+1]}this.draw()}},{key:"render",value:function(){var e,t=this,n=this.data;if(n&&this.visible&&0!==this.canvas.width){var r=n.ms,a=this.mousePos,o=n.candles||[],s=Math.min(this.numToShow,o.length),i=o.slice(o.length-s);if(this.clear(),0!==s){var c,l=function(e){return un(e.endStamp,r)},u=function(e){return l(e)+r},d=function(e){return l(e)+.2*r},h=.6*r,p=i[0],f=i[s-1],v=[p.highRate,p.lowRate,p.matchVolume],m=v[0],g=v[1],y=v[2],x=_t(i);try{for(x.s();!(c=x.n()).done;){var b=c.value;b.highRate>m&&(m=b.highRate),b.lowRate<g&&(g=b.lowRate),b.matchVolume>y&&(y=b.matchVolume)}}catch(e){x.e(e)}finally{x.f()}m+=.1*(m-g);var k=l(p),w=u(f);w+=.05*(w-k);var C=this.market.ratestep,S=new en(k,w,g,m);g===m&&(S.y.min-=C,S.y.max+=C),this.dataExtents=S;var F=null;a&&this.plotRegion.plot(new en(S.x.min,S.x.max,0,1),(function(e,n){var o,s=un(n.unx(a.x),r),c=_t(i);try{for(c.s();!(o=c.n()).done;){var u=o.value;if(l(u)===s){F=u,e.fillStyle=t.theme.gridLines,e.fillRect(n.x(l(u)),n.y(0),n.w(r),n.h(1));break}}}catch(e){c.e(e)}finally{c.f()}}));var T=this.rateConversionFactor,D=(null===(e=vt().assets[this.market.baseid])||void 0===e?void 0:e.unitInfo.conventional.unit)||this.market.basesymbol.toUpperCase(),I=function(e,t,n){var r=e[0],a=e[e.length-1],o=un(r.endStamp,t),s=un(a.endStamp,t)+t,i=s-o,c=Math.min(e.length,n/100),l=un(i/c,t);if(0===l)return console.error("zero tick",t,i,c),{lbls:[]};var u=o,d=(new Date).getTimezoneOffset(),h=function(e){return(e-=6e4*d)-e%864e5},p=h(o),f=0;h(r.endStamp)===h(a.endStamp)&&(p=0);var v,m=[];for(v=t<864e5?function(e,t){return h(t)!==p?"".concat(rn[e.getMonth()]).concat(e.getDate()," ").concat(e.getHours(),":").concat(String(e.getMinutes()).padStart(2,"0")):"".concat(e.getHours(),":").concat(String(e.getMinutes()).padStart(2,"0"))}:function(e){var t=e.getFullYear();return t!==f?"".concat(rn[e.getMonth()]).concat(e.getDate()," '").concat(String(t).slice(2,4)):"".concat(rn[e.getMonth()]).concat(e.getDate())};u<=s;){var g=new Date(u);m.push({val:u,txt:v(g,u)}),p=h(u),f=g.getFullYear(),u+=l}return{lbls:m}}(i,r,this.plotRegion.width());this.plotXGrid(I,k,w);var A=this.makeYLabels(this.candleRegion,C,D,(function(e){return We.formatFourSigFigs(e/T)}));this.plotYGrid(this.candleRegion,A,this.dataExtents.y.min,this.dataExtents.y.max);var R=new en(k,w,0,y);if(this.volumeRegion.plot(R,(function(e,n){e.fillStyle=t.theme.gridBorder;var r,a=_t(i);try{for(a.s();!(r=a.n()).done;){var o=r.value;e.fillRect(n.x(d(o)),n.y(0),n.w(h),n.h(o.matchVolume))}}catch(e){a.e(e)}finally{a.f()}})),this.candleRegion.plot(S,(function(e,n){e.lineWidth=1;var r,a=_t(i);try{for(a.s();!(r=a.n()).done;){var o=r.value,s=o.startRate>o.endRate,c=[n.x(d(o)),n.y(o.startRate),n.w(h),n.h(o.endRate-o.startRate)],l=c[0],u=c[1],p=c[2],f=c[3],v=[n.y(o.highRate),n.y(o.lowRate),p/2+l],m=v[0],g=v[1],y=v[2];e.strokeStyle=s?t.theme.sellLine:t.theme.buyLine,e.fillStyle=s?t.theme.sellFill:t.theme.buyFill,e.beginPath(),e.moveTo(y,m),e.lineTo(y,g),e.stroke(),e.fillRect(l,u,p,f),e.strokeRect(l,u,p,f)}}catch(e){a.e(e)}finally{a.f()}})),this.plotXLabels(I,k,w,[]),this.plotYLabels(A,this.dataExtents.y.min,this.dataExtents.y.max,D),F){var E=this.xRegion.extents.y;this.xRegion.plot(new en(S.x.min,S.x.max,E.min,E.max),(function(e,n){if(F){t.applyLabelStyle();var r="".concat(new Date(l(F)).toLocaleString()," - ").concat(new Date(u(F)).toLocaleString()),a=e.measureText(r).width+50,o=n.x((l(F)+u(F))/2),s=o-a/2,i=t.xRegion.extents.x;s<i.min?s=i.min:s+a>i.max&&(s=i.max-a),o=s+a/2;var c=E.min+(t.xRegion.height()-16)/2;e.fillStyle=t.theme.legendFill,e.strokeStyle=t.theme.gridBorder;var d=[s-25,c-2,a+50,20];e.fillRect.apply(e,d),e.strokeRect.apply(e,d),t.applyLabelStyle(),e.fillText(r,o,t.xRegion.extents.midY,a)}}))}this.reporters.mouse(F)}}else this.renderScheduled=!0}},{key:"setCandles",value:function(e,t,n,r){if(this.data=e,e.candles){this.market=t;var a=[r.conventional.conversionFactor,n.conventional.conversionFactor],o=a[0],s=a[1];this.rateConversionFactor=Dt*o/s;var i=25;this.zoomLevels=[];for(var c=Math.max(e.candles.length,1e3);i<c;)this.zoomLevels.push(i),i*=2;this.numToShow=100,this.draw()}}}]),n}(Yt),$t=function(e){g(n,e);var t=Vt(n);function n(e,r){var a;i(this,n),h(v(a=t.call(this,e,{resize:function(){return a.resized()},click:function(){},zoom:function(){}})),"ani",void 0),h(v(a),"size",void 0),h(v(a),"region",void 0),h(v(a),"colorShift",void 0),h(v(a),"opts",void 0),h(v(a),"msgRegion",void 0),h(v(a),"fontSize",void 0),a.canvas.classList.add("fill-abs"),a.canvas.style.zIndex="5",a.opts=null!=r?r:{};var o=1500*Math.random();a.colorShift=360*Math.random();var s=[1,.65,.75],c=[3,3,2],l=[Math.PI,10*Math.PI/9,Math.PI/2.5],u=[0,0,1.5*Math.PI],d=function(e,t,n){return s[e]*Math.cos(c[e]*t+l[e]*n+u[e])},p=function(e,t){var n=e*Math.PI*2;return(d(0,n,t)+d(1,n,t)+d(2,n,t))/3};return a.resize(),a.ani=new Ve(Ve.Forever,(function(){for(var e=((new Date).getTime()-o)/1500*Math.PI*2,t=[],n=0;n<75;n++)t.push(p(n/74,e));a.drawValues(t)})),a}return d(n,[{key:"resized",value:function(){var e=this.opts,t=[this.canvas.width,this.canvas.height],n=t[0],r=t[1],a=.8*n,o=.8*r;a>150&&(a=150),o>100&&(o=100);var s=(n-a)/2,i=(r-o)/2;if(e.message){this.fontSize=rt(.15*o,10,14),this.applyLabelStyle(this.fontSize);var c=.5*this.fontSize,l=this.fontSize/2+c;i-=l,this.msgRegion=new tn(this.ctx,new en(0,n,i+o,i+o+2*l))}this.region=new tn(this.ctx,new en(s,s+a,i,i+o))}},{key:"drawValues",value:function(e){var t=this;if(this.region){this.clear();var n=function(e){return"hsl(".concat(e,", 35%, 50%)")},r=this.region,a=this.msgRegion,o=this.canvas,s=o.width,i=o.height,c=this.opts,l=c.backgroundColor,u=c.message,d=this.colorShift,h=this.ctx;l&&(h.fillStyle=!0===l?k.isDark()?"#0a1e34":"#f0f0f0":l,h.fillRect(0,0,s,i)),r.plot(new en(0,1,-1,1),(function(t,r){t.lineWidth=4,t.lineCap="round";var a=d+(new Date).getTime()%2e3/2e3*360,o=t.createLinearGradient(r.x(0),0,r.x(1),0);o.addColorStop(0,n(a)),t.strokeStyle=o,t.beginPath(),t.moveTo(r.x(0),r.y(e[0]));for(var s=1;s<e.length;s++){var i=s/(e.length-1);o.addColorStop(i,n(300*i+a)),t.lineTo(r.x(i),r.y(e[s]))}t.stroke()})),u&&a.plot(new en(0,1,0,1),(function(e,n){t.applyLabelStyle(t.fontSize),e.fillText(u,n.x(.5),n.y(.5),t.msgRegion.width())}))}}},{key:"render",value:function(){}},{key:"stop",value:function(){this.ani.stop(),this.canvas.remove()}}]),n}(Yt),en=function(){function e(t,n,r,a){i(this,e),h(this,"x",void 0),h(this,"y",void 0),this.setExtents(t,n,r,a)}return d(e,[{key:"setExtents",value:function(e,t,n,r){this.x={min:e,max:t},this.y={min:n,max:r}}},{key:"xRange",get:function(){return this.x.max-this.x.min}},{key:"midX",get:function(){return(this.x.max+this.x.min)/2}},{key:"yRange",get:function(){return this.y.max-this.y.min}},{key:"midY",get:function(){return(this.y.max+this.y.min)/2}}]),e}(),tn=function(){function e(t,n){i(this,e),h(this,"context",void 0),h(this,"extents",void 0),this.context=t,this.extents=n}return d(e,[{key:"setExtents",value:function(e,t,n,r){this.extents.setExtents(e,t,n,r)}},{key:"width",value:function(){return this.extents.xRange}},{key:"height",value:function(){return this.extents.yRange}},{key:"contains",value:function(e,t){var n=this.extents;return e<n.x.max&&e>n.x.min&&t<n.y.max&&t>n.y.min}},{key:"translator",value:function(e){var t=this.extents,n=e.x.min,r=e.y.min,a=e.yRange,o=e.xRange,s=t.x.min,i=t.x.max-s,c=t.y.max,l=c-t.y.min,u=i/o,d=l/a;return{x:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){return(e-n)*u+s})),y:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){return c-(e-r)*d})),unx:function(e){return(e-s)/u+n},uny:function(e){return r-(e-c)/d},w:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){return e/o*i})),h:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){return-e/a*l}))}}},{key:"clear",value:function(){var e=this.extents;this.context.clearRect(e.x.min,e.y.min,e.xRange,e.yRange)}},{key:"plot",value:function(e,t,n){var r=this.context,a=this.extents;r.save(),n||(r.beginPath(),r.rect(a.x.min,a.y.min,a.xRange,a.yRange),r.clip());var o=this.translator(e);t(this.context,o),r.restore()}}]),e}();function nn(e,t,n,r,a,o,s,i){i=i||We.formatFourSigFigs;var c=t/a,l=r-n;if(c<1||l<=0)return{lbls:[]};for(var u=l/c,d=u+o-u%o,h=n+d-n%d,p=Math.max(Math.abs(r),Math.abs(n)),f=Math.round(Math.log10(p/d))+2,v=[],m=0;h<r;){var g=i(h=Number(h.toPrecision(f)));m=Math.max(m,e.measureText(g).width),v.push({val:h,txt:g}),h+=d}var y=e.measureText(s).width;return y>m&&(m=y),{widest:m,lbls:v}}var rn=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"];function an(e){return e[e.length-1]}function on(e,t,n,r,a,o){e.beginPath(),e.moveTo(t,n),e.lineTo(r,a),o||e.stroke()}function sn(e,t,n,r,a){e.fillStyle=r,e.beginPath(),e.arc(t,n,a,0,zt),e.fill()}function cn(e,t){return ln(e,t,1e-8)}function ln(e,t,n){return Math.abs(e-t)<Math.abs(n)}function un(e,t){return e-e%t}function dn(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return hn(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?hn(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function hn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var pn=function(){function e(t){i(this,e),h(this,"page",void 0),h(this,"host",void 0),this.page=We.parseTemplate(t),We.cleanTemplates(this.page.penaltyMarkerTmpl)}return d(e,[{key:"setHost",value:function(e){this.host=e}},{key:"update",value:function(){var e=this.page,t=this.host,n=vt().exchanges[t],r=n.auth,a=n.maxScore,o=n.penaltyThreshold,s=r.rep.score,i=fn(r),c=i?i*o*-1:-1*o,l=25;e.scoreWarn.style.width="".concat(l,"%");var u=s>=0?l+s/a*75:l-Math.min(l,s/c*l);e.scorePointer.style.left="".concat(u,"%"),e.scoreMin.textContent=String(c),e.scoreMax.textContent=String(a);var d=An(s,a);e.limitBonus.textContent=d.toFixed(1);var h,p=dn(We.applySelector(e.scoreTray,".penalty-marker"));try{for(p.s();!(h=p.n()).done;)h.value.remove()}catch(e){p.e(e)}finally{p.f()}if(i>1)for(var f=l/i,v=1;v<i;v++){var m=e.penaltyMarkerTmpl.cloneNode(!0);e.scoreTray.appendChild(m),m.style.left="".concat(f*v,"%")}e.score.textContent=String(s),e.scoreData.classList.remove("negative","positive"),s>0?e.scoreData.classList.add("positive"):e.scoreData.classList.add("negative")}}]),e}();function fn(e){var t=e.weakStrength,n=e.targetTier,r=e.effectiveTier;if(r>n){var a=r-n;return t>=a?n:n+(a-t)}return r}var vn,mn,gn,yn,xn,bn,kn,wn,Cn,Sn,Fn,Tn,Dn=function(e,t,n){var r,a,o=e.qty-e.filled;if(1===e.type)return o;if(e.sell)return o*e.rate/Dt;var s=n||(null==t||null===(r=t.spot)||void 0===r?void 0:r.rate)||0;return t?s&&((null==t||null===(a=t.spot)||void 0===a?void 0:a.bookVolume)||0)>0?o*Dt/s:t.lotsize:0};function In(e,t,n){return 3===e.type?0:function(e,t,n){var r;if(1!==e.status)return 0;var a=Dn(e,t,n);return function(e,t){return 2===e.type||0===e.tif||0!==t&&(e.sell?e.rate<t:e.rate>t)}(e,n||(null===(r=t.spot)||void 0===r?void 0:r.rate)||0)?2*a:a}(e,t,n)+function(e){return 2!==e.status?0:Dn(e)}(e)+function(e){var t,n=0,r=dn(e.matches||[]);try{for(r.s();!(t=r.n()).done;){var a=t.value;if(0===a.side){if(a.status>3)continue}else if(a.status>2)continue;n+=a.qty}}catch(e){r.e(e)}finally{r.f()}return n}(e)}function An(e,t){return e>0?1+e/t*2:1}var Rn="TakerFoundMakerRedemption:";function En(e){return e.startsWith(Rn)?[e.substring(26),!0]:42===e.length?[e,!0]:[e,!1]}var Bn=(h(vn={},0,(function(e){var t=a(En(e),2),n=t[0];return t[1]?"https://etherscan.io/address/".concat(n):"https://etherscan.io/tx/".concat(n)})),h(vn,1,(function(e){var t=a(En(e),2),n=t[0];return t[1]?"https://sepolia.etherscan.io/address/".concat(n):"https://sepolia.etherscan.io/tx/".concat(n)})),h(vn,2,(function(e){var t=a(En(e),2),n=t[0];return t[1]?"https://etherscan.io/address/".concat(n):"https://etherscan.io/tx/".concat(n)})),vn),Pn=(h(mn={},0,(function(e){var t=a(En(e),2),n=t[0];return t[1]?"https://polygonscan.com/address/".concat(n):"https://polygonscan.com/tx/".concat(n)})),h(mn,1,(function(e){var t=a(En(e),2),n=t[0];return t[1]?"https://amoy.polygonscan.com/address/".concat(n):"https://amoy.polygonscan.com/tx/".concat(n)})),h(mn,2,(function(e){var t=a(En(e),2),n=t[0];return t[1]?"https://polygonscan.com/address/".concat(n):"https://polygonscan.com/tx/".concat(n)})),mn),Ln={42:(gn={},h(gn,0,(function(e){var t=a(e.split(":"),2),n=t[0],r=t[1];return void 0!==r?"https://explorer.dcrdata.org/tx/".concat(n,"/out/").concat(r):"https://explorer.dcrdata.org/tx/".concat(n)})),h(gn,1,(function(e){var t=a(e.split(":"),2),n=t[0],r=t[1];return void 0!==r?"https://testnet.dcrdata.org/tx/".concat(n,"/out/").concat(r):"https://testnet.dcrdata.org/tx/".concat(n)})),h(gn,2,(function(e){var t=a(e.split(":"),2),n=t[0],r=t[1];return void 0!==r?"http://127.0.0.1:17779/tx/".concat(n,"/out/").concat(r):"https://127.0.0.1:17779/tx/".concat(n)})),gn),0:(yn={},h(yn,0,(function(e){return"https://mempool.space/tx/".concat(e.split(":")[0])})),h(yn,1,(function(e){return"https://mempool.space/testnet/tx/".concat(e.split(":")[0])})),h(yn,2,(function(e){return"https://mempool.space/tx/".concat(e.split(":")[0])})),yn),2:(xn={},h(xn,0,(function(e){return"https://ltc.bitaps.com/".concat(e.split(":")[0])})),h(xn,1,(function(e){return"https://sochain.com/tx/LTCTEST/".concat(e.split(":")[0])})),h(xn,2,(function(e){return"https://ltc.bitaps.com/".concat(e.split(":")[0])})),xn),20:(bn={},h(bn,0,(function(e){return"https://digiexplorer.info/tx/".concat(e.split(":")[0])})),h(bn,1,(function(e){return"https://testnetexplorer.digibyteservers.io/tx/".concat(e.split(":")[0])})),h(bn,2,(function(e){return"https://digiexplorer.info/tx/".concat(e.split(":")[0])})),bn),60:Bn,60001:Bn,60002:Bn,3:(kn={},h(kn,0,(function(e){return"https://dogeblocks.com/tx/".concat(e.split(":")[0])})),h(kn,1,(function(e){return"https://blockexplorer.one/dogecoin/testnet/tx/".concat(e.split(":")[0])})),h(kn,2,(function(e){return"https://dogeblocks.com/tx/".concat(e.split(":")[0])})),kn),5:(wn={},h(wn,0,(function(e){return"https://blockexplorer.one/dash/mainnet/tx/".concat(e.split(":")[0])})),h(wn,1,(function(e){return"https://blockexplorer.one/dash/testnet/tx/".concat(e.split(":")[0])})),h(wn,2,(function(e){return"https://blockexplorer.one/dash/mainnet/tx/".concat(e.split(":")[0])})),wn),133:(Cn={},h(Cn,0,(function(e){return"https://zcashblockexplorer.com/transactions/".concat(e.split(":")[0])})),h(Cn,1,(function(e){return"https://blockexplorer.one/zcash/testnet/tx/".concat(e.split(":")[0])})),h(Cn,2,(function(e){return"https://zcashblockexplorer.com/transactions/".concat(e.split(":")[0])})),Cn),147:(Sn={},h(Sn,0,(function(e){return"https://explorer.zcl.zelcore.io/tx/".concat(e.split(":")[0])})),h(Sn,2,(function(e){return"https://explorer.zcl.zelcore.io/tx/".concat(e.split(":")[0])})),Sn),136:(Fn={},h(Fn,0,(function(e){return"https://explorer.firo.org/tx/".concat(e.split(":")[0])})),h(Fn,1,(function(e){return"https://testexplorer.firo.org/tx/".concat(e.split(":")[0])})),h(Fn,2,(function(e){return"https://explorer.firo.org/tx/".concat(e.split(":")[0])})),Fn),145:(Tn={},h(Tn,0,(function(e){return"https://bch.loping.net/tx/".concat(e.split(":")[0])})),h(Tn,1,(function(e){return"https://tbch4.loping.net/tx/".concat(e.split(":")[0])})),h(Tn,2,(function(e){return"https://bch.loping.net/tx/".concat(e.split(":")[0])})),Tn),966:Pn,966001:Pn,966002:Pn,966003:Pn,966004:Pn};function On(e){return e.startsWith(Rn)?ke("TAKER_FOUND_MAKER_REDEMPTION",{makerAddr:e.substring(26)}):e}function Mn(e,t){var n=vt().user.net,r=Ln[function(e){var t=vt().user.assets[e];return t.token?t.token.parentID:e}(e)];if(r){var a=r[n];a&&(t.classList.remove("plainlink"),t.classList.add("subtlelink"),t.href=a(t.dataset.explorerCoin||""))}}function qn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Nn(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?qn(Object(n),!0).forEach((function(t){h(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):qn(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Wn(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Wn=function(){return!!e})()}function Vn(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Un(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Un(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function Un(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var _n="multiplier",jn="absolute",Hn="absolute-plus",zn="percent",Gn="percent-plus",Xn="basicMM",Kn="arbMM",Qn="basicArb",Yn={Binance:{name:"Binance",logo:"/img/binance.com.png"},BinanceUS:{name:"Binance U.S.",logo:"/img/binance.us.png"}},Jn=new(function(){function e(){i(this,e),h(this,"cexBalanceCache",{})}var t,n,r,a,o,c,l,u;return d(e,[{key:"updateBotConfig",value:(u=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",S("/api/updatebotconfig",t));case 1:case"end":return e.stop()}}),e)}))),function(e){return u.apply(this,arguments)})},{key:"updateCEXConfig",value:(l=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",S("/api/updatecexconfig",t));case 1:case"end":return e.stop()}}),e)}))),function(e){return l.apply(this,arguments)})},{key:"removeBotConfig",value:(c=s(f().mark((function e(t,n,r){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",S("/api/removebotconfig",{host:t,baseID:n,quoteID:r}));case 1:case"end":return e.stop()}}),e)}))),function(e,t,n){return c.apply(this,arguments)})},{key:"report",value:(o=s(f().mark((function e(t,n,r){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",S("/api/marketreport",{host:t,baseID:n,quoteID:r}));case 1:case"end":return e.stop()}}),e)}))),function(e,t,n){return o.apply(this,arguments)})},{key:"startBot",value:(a=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/startmarketmakingbot",{config:t});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}}),e)}))),function(e){return a.apply(this,arguments)})},{key:"stopBot",value:(r=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/stopmarketmakingbot",{market:t});case 2:case"end":return e.stop()}}),e)}))),function(e){return r.apply(this,arguments)})},{key:"status",value:(n=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T("/api/marketmakingstatus");case 2:return e.abrupt("return",e.sent.status);case 3:case"end":return e.stop()}}),e)}))),function(){return n.apply(this,arguments)})},{key:"botStats",value:function(e,t,n,r){for(var a=0,o=Object.values(vt().mmStatus.bots);a<o.length;a++){var s=o[a];if(s.runStats){var i=s.runStats,c=s.config;if(c.baseID===e&&c.quoteID===t&&c.host===n&&i.startTime===r)return i}}}},{key:"cachedCexBalance",value:function(e,t){var n;return null===(n=this.cexBalanceCache[e])||void 0===n?void 0:n[t]}},{key:"cexBalance",value:(t=s(f().mark((function e(t,n){var r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.cexBalanceCache[t]||(this.cexBalanceCache[t]={}),e.next=3,S("/api/cexbalance",{cexName:t,assetID:n});case 3:return r=e.sent.cexBalance,this.cexBalanceCache[t][n]=r,e.abrupt("return",r);case 6:case"end":return e.stop()}}),e,this)}))),function(e,n){return t.apply(this,arguments)})}]),e}());function Zn(e){return vt().mmStatus.bots.reduce((function(t,n){var r,a,o,s,i,c,l,u,d,h,p,f,v,m,g,y,x,b,k,w,C=n.runStats;if(!n.running||!C)return t;var S=C.dexBalances,F=C.cexBalances;return t.cex.locked+=null!==(r=null===(a=F[e])||void 0===a?void 0:a.locked)&&void 0!==r?r:0,t.cex.locked+=null!==(o=null===(s=F[e])||void 0===s?void 0:s.reserved)&&void 0!==o?o:0,t.cex.avail+=null!==(i=null===(c=F[e])||void 0===c?void 0:c.available)&&void 0!==i?i:0,t.cex.total=t.cex.avail+t.cex.locked,t.dex.locked+=null!==(l=null===(u=S[e])||void 0===u?void 0:u.locked)&&void 0!==l?l:0,t.dex.locked+=null!==(d=null===(h=S[e])||void 0===h?void 0:h.reserved)&&void 0!==d?d:0,t.dex.avail+=null!==(p=null===(f=S[e])||void 0===f?void 0:f.available)&&void 0!==p?p:0,t.dex.total=t.dex.avail+t.dex.locked,t.avail+=(null!==(v=null===(m=S[e])||void 0===m?void 0:m.available)&&void 0!==v?v:0)+(null!==(g=null===(y=F[e])||void 0===y?void 0:y.available)&&void 0!==g?g:0),t.locked+=(null!==(x=null===(b=S[e])||void 0===b?void 0:b.locked)&&void 0!==x?x:0)+(null!==(k=null===(w=F[e])||void 0===w?void 0:w.locked)&&void 0!==k?k:0),t}),{avail:0,locked:0,cex:{avail:0,locked:0,total:0},dex:{avail:0,locked:0,total:0}})}function $n(e,t,n,r){We.setText(e,"[data-host]",r);var a=vt().assets[t],o=a.unitInfo,s=a.name,i=a.symbol,c=a.token;We.setText(e,"[data-base-name]",s),We.setSrc(e,"[data-base-logo]",We.logoPath(i)),We.setText(e,"[data-base-ticker]",o.conventional.unit);var l=vt().assets[c?c.parentID:t],u=l.unitInfo,d=l.name,h=l.symbol;We.setText(e,"[data-base-fee-name]",d),We.setSrc(e,"[data-base-fee-logo]",We.logoPath(h)),We.setText(e,"[data-base-fee-ticker]",u.conventional.unit);var p=vt().assets[n],f=p.unitInfo,v=p.name,m=p.symbol,g=p.token;We.setText(e,"[data-quote-name]",v),We.setSrc(e,"[data-quote-logo]",We.logoPath(m)),We.setText(e,"[data-quote-ticker]",f.conventional.unit);var y=vt().assets[g?g.parentID:n],x=y.unitInfo,b=y.name,k=y.symbol;We.setText(e,"[data-quote-fee-name]",b),We.setSrc(e,"[data-quote-fee-logo]",We.logoPath(k)),We.setText(e,"[data-quote-fee-ticker]",x.conventional.unit)}function er(e,t){var n=Yn[t];We.setText(e,"[data-cex-name]",n.name),We.setSrc(e,"[data-cex-logo]",n.logo);var r,a=Vn(We.applySelector(e,"[data-cex-logo]"));try{for(a.s();!(r=a.n()).done;){var o=r.value;We.show(o)}}catch(e){a.e(e)}finally{a.f()}}function tr(e,t,n,r){var a=vt().fiatRatesMap[t],o=vt().fiatRatesMap[n],s=vt().assets[t].unitInfo.conventional.conversionFactor,i=vt().assets[n].unitInfo.conventional.conversionFactor;return a&&o?e*a/o*i/s:r?e*r.rate/Dt:i}var nr=function(e){g(s,e);var t,n,o=(t=s,n=Wn(),function(){var e,r=x(t);if(n){var a=x(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function s(e){var t;return i(this,s),h(v(t=o.call(this,e,{resize:function(){return t.resized()},click:function(){},zoom:function(){}})),"cfg",void 0),h(v(t),"loadedCEX",void 0),h(v(t),"cexLogo",void 0),t}return d(s,[{key:"resized",value:function(){this.render()}},{key:"draw",value:function(){}},{key:"setMarket",value:function(e){var t=this;this.cfg=e;var n=this.loadedCEX,r=this.cfg.cexName;r&&r!==n&&(this.loadedCEX=r,this.cexLogo=new Image,We.bind(this.cexLogo,"load",(function(){t.render()})),this.cexLogo.src=Yn[r||""].logo),this.render()}},{key:"render",value:function(){var e=this,t=this.ctx,n=this.canvas,o=this.theme,s=this.cfg;if(0!==n.width&&s){var i=s.dict,c=i.buyPlacements,l=i.sellPlacements,u=i.profit,d=s.baseFiatRate,h=s.botType;if(h!==Qn){this.clear();var p=function(n,r,a,o,s){t.save(),t.setLineDash([3,5]),t.lineWidth=1.5,t.strokeStyle=s,e.line(n,r,a,o),t.restore()},f=h===Xn,v=n.width/2,m=a(f?[v,v]:[.48*n.width,.52*n.width],2),g=m[0],y=m[1],x=c.reduce((function(e,t){return e+t.lots}),0),b=l.reduce((function(e,t){return e+t.lots}),0),k=Math.max(x,b),w=0,C=0;if(f){var S=c.reduce((function(e,t){return Math.max(e,t.gapFactor)}),0),F=l.reduce((function(e,t){return Math.max(e,t.gapFactor)}),0);w=Math.max(S,F)}else{var T=[].concat(r(c),r(l)),D=T.reduce((function(e,t){return e+t.gapFactor}),0)/T.length;C=.01*(1+D),w=Math.min(10,Math.max(c.length,l.length))*C}var I=u+w,A=Math.max(1.05*I,.155),R=k*d,E=.2+.7*Math.log(rt(R,0,1e6))/Math.log(1e6),B=new tn(t,new en(0,n.width,0,n.height));f?p(v,0,v,n.height,o.gapLine):B.plot(new en(0,1,0,1),(function(t,n){var r=[n.y(0),n.y(1)],a=r[0],s=r[1];p(g,a,g,s,o.gapLine),p(y,a,y,s,o.gapLine);var i=n.y(.95);t.drawImage(e.cexLogo,v-8,i,16,16),e.applyLabelStyle(18),t.fillText("δ",v,i+29)}));var P=function(e,r){if(null!=r&&r.length){var s=a(e?[0,g]:[y,n.width],2),i=s[0],c=s[1],l=new tn(t,new en(i,c,n.height*(1-E),n.height)),d=a(e?[-A,0]:[0,A],2),h=d[0],p=d[1];l.plot(new en(h,p,0,k),(function(t,a){t.lineWidth=2.5,t.strokeStyle=e?o.buyLine:o.sellLine,t.fillStyle=e?o.buyFill:o.sellFill,t.beginPath();var s=e?-1:1,i=r[0],c=a.y(0),l=a.x((f?i.gapFactor:u+C)*s);t.moveTo(l,c);for(var d=0,h=0;h<r.length;h++){var p=r[h],v=f?p.gapFactor:u+(h+1)*C,m=a.x(v*s);t.lineTo(m,a.y(d)),d+=p.lots,t.lineTo(m,a.y(d))}var g=e?-.1*n.width:1.1*n.width;t.lineTo(g,a.y(d)),t.stroke(),t.lineTo(g,c),t.lineTo(l,c),t.closePath(),t.globalAlpha=.25,t.fill()}),!0)}};P(!1,l),P(!0,c)}}}}]),s}(Yt);function rr(e,t,n){return"".concat(e,"-").concat(t,"-").concat(n)}function ar(e,t,n){var r=or(e,t,n);if(r)return r.config}function or(e,t,n){var r=(vt().mmStatus.bots||[]).filter((function(r){return r.config.baseID===t&&r.config.quoteID===n&&r.config.host===e}));if(r.length)return r[0]}function sr(e,t){return e+t.lots}var ir=function(){function e(t){i(this,e),h(this,"cfg",void 0),h(this,"host",void 0),h(this,"baseID",void 0),h(this,"baseSymbol",void 0),h(this,"baseTicker",void 0),h(this,"baseFeeID",void 0),h(this,"baseIsAccountLocker",void 0),h(this,"baseFeeSymbol",void 0),h(this,"baseFeeTicker",void 0),h(this,"baseToken",void 0),h(this,"quoteID",void 0),h(this,"quoteSymbol",void 0),h(this,"quoteTicker",void 0),h(this,"quoteFeeID",void 0),h(this,"quoteIsAccountLocker",void 0),h(this,"quoteFeeSymbol",void 0),h(this,"quoteFeeTicker",void 0),h(this,"quoteToken",void 0),h(this,"botType",void 0),h(this,"cexName",void 0),h(this,"dinfo",void 0),h(this,"alloc",void 0),h(this,"proj",void 0),h(this,"bui",void 0),h(this,"baseFactor",void 0),h(this,"baseFeeUI",void 0),h(this,"baseFeeFactor",void 0),h(this,"qui",void 0),h(this,"quoteFactor",void 0),h(this,"quoteFeeUI",void 0),h(this,"quoteFeeFactor",void 0),h(this,"id",void 0),h(this,"mktID",void 0),h(this,"lotSize",void 0),h(this,"lotSizeConv",void 0),h(this,"lotSizeUSD",void 0),h(this,"quoteLot",void 0),h(this,"quoteLotConv",void 0),h(this,"quoteLotUSD",void 0),h(this,"rateStep",void 0),h(this,"baseFeeFiatRate",void 0),h(this,"quoteFeeFiatRate",void 0),h(this,"baseLots",void 0),h(this,"quoteLots",void 0),h(this,"marketReport",void 0),h(this,"nBuyPlacements",void 0),h(this,"nSellPlacements",void 0);var n=this.host=t.host,r=this.baseID=t.baseID,a=this.quoteID=t.quoteID;this.cexName=t.cexName;var o=vt().mmStatus.bots.find((function(e){var t=e.config;return t.baseID===r&&t.quoteID===a&&t.host===n}));if(!o)throw Error("where's the bot status?");this.cfg=o.config;var s=vt().assets[r],c=s.token,l=s.symbol,u=s.unitInfo;this.baseSymbol=l,this.baseTicker=u.conventional.unit,this.bui=u,this.baseFactor=u.conventional.conversionFactor,this.baseToken=c;var d=this.baseFeeID=c?c.parentID:r,p=vt().assets[this.baseFeeID],f=p.unitInfo,v=p.symbol,m=p.wallet;this.baseIsAccountLocker=(16384&m.traits)>0,this.baseFeeUI=f,this.baseFeeTicker=f.conventional.unit,this.baseFeeSymbol=v,this.baseFeeFactor=this.baseFeeUI.conventional.conversionFactor;var g=vt().assets[a],y=g.token,x=g.symbol,b=g.unitInfo;this.quoteSymbol=x,this.quoteTicker=b.conventional.unit,this.qui=b,this.quoteFactor=b.conventional.conversionFactor,this.quoteToken=y;var k=this.quoteFeeID=y?y.parentID:a,w=vt().assets[this.quoteFeeID],C=w.unitInfo,S=w.symbol,F=w.wallet;this.quoteIsAccountLocker=(16384&F.traits)>0,this.quoteFeeUI=C,this.quoteFeeTicker=C.conventional.unit,this.quoteFeeSymbol=S,this.quoteFeeFactor=this.quoteFeeUI.conventional.conversionFactor,this.id=rr(n,r,a),this.mktID="".concat(l,"_").concat(x);var T=vt().exchanges[n].markets[this.mktID],D=T.lotsize,I=T.ratestep;this.lotSize=D,this.lotSizeConv=D/u.conventional.conversionFactor,this.rateStep=I,this.quoteLot=tr(D,r,a),this.quoteLotConv=this.quoteLot/b.conventional.conversionFactor,this.baseFeeFiatRate=vt().fiatRatesMap[d],this.quoteFeeFiatRate=vt().fiatRatesMap[k],t.arbMarketMakingConfig?(this.botType=Kn,this.baseLots=t.arbMarketMakingConfig.sellPlacements.reduce(sr,0),this.quoteLots=t.arbMarketMakingConfig.buyPlacements.reduce(sr,0),this.nBuyPlacements=t.arbMarketMakingConfig.buyPlacements.length,this.nSellPlacements=t.arbMarketMakingConfig.sellPlacements.length):t.simpleArbConfig?(this.botType=Qn,this.baseLots=t.uiConfig.simpleArbLots,this.quoteLots=t.uiConfig.simpleArbLots):t.basicMarketMakingConfig&&(this.botType=Xn,this.baseLots=t.basicMarketMakingConfig.sellPlacements.reduce(sr,0),this.quoteLots=t.basicMarketMakingConfig.buyPlacements.reduce(sr,0),this.nBuyPlacements=t.basicMarketMakingConfig.buyPlacements.length,this.nSellPlacements=t.basicMarketMakingConfig.sellPlacements.length)}var t;return d(e,[{key:"initialize",value:(t=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.host,n=this.baseID,r=this.quoteID,a=this.lotSizeConv,o=this.quoteLotConv,e.next=3,Jn.report(t,n,r);case 3:s=e.sent,i=this.marketReport=s.report,this.lotSizeUSD=a*i.baseFiatRate,this.quoteLotUSD=o*i.quoteFiatRate,this.proj=this.projectedAllocations();case 8:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"status",value:function(){var e=this.baseID,t=this.quoteID,n=vt().mmStatus.bots.find((function(n){return n.config.baseID===e&&n.config.quoteID===t}));return n?{botCfg:n.config,running:n.running,runStats:n.runStats,latestEpoch:n.latestEpoch,cexProblems:n.cexProblems}:{botCfg:{},running:!1,runStats:{}}}},{key:"adjustedBalances",value:function(){var e,t,n=this.baseID,r=this.quoteID,a=this.baseFeeID,o=this.quoteFeeID,s=this.cexName,i=this.baseFactor,c=this.quoteFactor,l=this.baseFeeFactor,u=this.quoteFeeFactor,d=[vt().walletMap[n],vt().walletMap[r]],h=d[0],p=d[1],f=[Zn(n),Zn(r)],v=f[0],m=f[1],g=0,y=0;if(s){var x=vt().mmStatus.cexes[s];if(!x)throw Error("where's the cex status?");e=x.balances[n],t=x.balances[r]}e&&(g=(e.available||0)-v.cex.avail),t&&(y=(t.available||0)-m.cex.avail);var b=h.balance.available-v.dex.avail,k=p.balance.available-m.dex.avail,w=b+g,C=k+y,S=a===n?h:vt().walletMap[a],F=o===r?p:vt().walletMap[o],T=w,D=b,I=g;if(a!==n){var A=Zn(n);D=S.balance.available-A.dex.total,e&&(I=(e.available||0)-A.cex.total),T=D+I}var R=C,E=k,B=y;if(o!==r){var P=Zn(r);E=F.balance.available-P.dex.total,t&&(B=(t.available||0)-P.cex.total),R=E+B}return{baseAvail:w/i,quoteAvail:C/c,dexBaseAvail:b/i,dexQuoteAvail:k/c,cexBaseAvail:g/i,cexQuoteAvail:y/c,baseFeeAvail:T/l,quoteFeeAvail:R/u,dexBaseFeeAvail:D/l,dexQuoteFeeAvail:E/u,cexBaseFeeAvail:I/l,cexQuoteFeeAvail:B/u}}},{key:"feesAndCommit",value:function(){var e=this.baseID,t=this.quoteID,n=this.marketReport,r=n.baseFees,a=n.quoteFees,o=this.lotSize,s=this.baseLots,i=this.quoteLots,c=this.baseFeeID,l=this.quoteFeeID,u=this.baseIsAccountLocker,d=this.quoteIsAccountLocker,h=this.cfg.uiConfig,p=h.baseConfig,f=h.quoteConfig;return dr(e,t,r,a,o,s,i,c,l,u,d,p.orderReservesFactor,f.orderReservesFactor)}},{key:"projectedAllocations",value:function(){var e=this.cfg.uiConfig,t=e.quoteConfig,n=e.baseConfig,r=this.baseFactor,a=this.quoteFactor,o=this.baseID,s=this.quoteID,i=this.lotSizeConv,c=this.quoteLotConv,l=this.baseFeeFactor,u=this.quoteFeeFactor,d=this.baseFeeID,h=this.quoteFeeID,p=this.baseToken,f=this.quoteToken,v=this.cexName,m=this.feesAndCommit(),g=m.commit,y=m.fees,x={book:0,bookingFees:0,swapFeeReserves:0,cex:0,orderReserves:0,slippageBuffer:0},b={book:0,bookingFees:0,swapFeeReserves:0,cex:0,orderReserves:0,slippageBuffer:0};x.book=g.dex.base.lots*i,b.book=g.cex.base.lots*c,x.orderReserves=Math.max(g.cex.base.val,g.dex.base.val)*n.orderReservesFactor/r,b.orderReserves=Math.max(g.cex.quote.val,g.dex.quote.val)*t.orderReservesFactor/a,v&&(x.cex=g.cex.base.lots*i,b.cex=g.cex.quote.lots*c),x.bookingFees=y.base.bookingFees/l,b.bookingFees=y.quote.bookingFees/u,p&&(x.swapFeeReserves=y.base.tokenFeesPerSwap*n.swapFeeN/l),f&&(b.swapFeeReserves=y.quote.tokenFeesPerSwap*t.swapFeeN/u),b.slippageBuffer=(b.book+b.cex+b.orderReserves)*t.slippageBufferFactor;var k={},w=function(e,t){var n;k[e]=(null!==(n=k[e])&&void 0!==n?n:0)+t};return w(o,Math.round((x.book+x.cex+x.orderReserves)*r)),w(d,Math.round((x.bookingFees+x.swapFeeReserves)*l)),w(s,Math.round((b.book+b.cex+b.orderReserves+b.slippageBuffer)*a)),w(h,Math.round((b.bookingFees+b.swapFeeReserves)*u)),{qProj:b,bProj:x,alloc:k}}},{key:"fundingState",value:function(){var e=this.proj,t=e.bProj,n=e.qProj,r=this.baseID,a=this.quoteID,o=this.baseFeeID,s=this.quoteFeeID,i=this.cfg.uiConfig.cexRebalance,c=this.cexName,l=this.adjustedBalances(),u=l.baseAvail,d=l.quoteAvail,h=l.dexBaseAvail,p=l.dexQuoteAvail,f=l.cexBaseAvail,v=l.cexQuoteAvail,m=l.dexBaseFeeAvail,g=l.dexQuoteFeeAvail,y=Boolean(c&&i),x=t.cex,b=[t.book,0,0],k=b[0],w=b[1],C=b[2];r===o?k+=t.bookingFees:C+=t.bookingFees+t.swapFeeReserves,y?w+=t.orderReserves:k+=t.orderReserves,r===s&&(y?w+=n.bookingFees+n.swapFeeReserves:k+=n.bookingFees+n.swapFeeReserves);var S=[n.book,n.cex,0,0],F=S[0],T=S[1],D=S[2],I=S[3];if(a===s?F+=n.bookingFees:I+=n.bookingFees+n.swapFeeReserves,y)D+=n.orderReserves+n.slippageBuffer;else{F+=n.orderReserves;var A=n.book+n.cex+n.orderReserves;F+=(n.book+n.orderReserves)/A*n.slippageBuffer,T+=n.cex/A*n.slippageBuffer}a===o&&(y?D+=t.bookingFees+t.swapFeeReserves:F+=t.bookingFees+t.swapFeeReserves);var R=h>=k,E=f>=x,B=p>=F,P=v>=T,L=k+x+w,O=F+T+D,M=R&&E&&u>=L,q=B&&P&&d>=O,N=m>=C,W=g>=I,V=M&&q&&N&&W,U=!V;return V||(U=u>=L&&d>=O&&N&&W&&y),{base:{dex:{avail:h,req:k,funded:R},cex:{avail:f,req:x,funded:E},transferable:w,fees:{avail:m,req:C,funded:N},fundedAndBalanced:M,fundedAndNotBalanced:!M&&u>=L&&y},quote:{dex:{avail:p,req:F,funded:B},cex:{avail:v,req:T,funded:P},transferable:D,fees:{avail:g,req:I,funded:W},fundedAndBalanced:q,fundedAndNotBalanced:!q&&d>=O&&y},fundedAndBalanced:V,fundedAndNotBalanced:U,starved:!V&&!U}}}]),e}(),cr=function(){function e(t,n,r,a){var o=this;i(this,e),h(this,"div",void 0),h(this,"page",void 0),h(this,"mkt",void 0),h(this,"startTime",void 0),h(this,"ticker",void 0),h(this,"currentForm",void 0),h(this,"forms",void 0),h(this,"latestEpoch",void 0),h(this,"cexProblems",void 0),h(this,"orderReportFormEl",void 0),h(this,"orderReportForm",void 0),h(this,"displayedOrderReportFormSide",void 0),h(this,"dexBalancesRowTmpl",void 0),h(this,"placementRowTmpl",void 0),h(this,"placementAmtRowTmpl",void 0),this.div=t,this.page=We.parseTemplate(t),this.orderReportFormEl=r.orderReportForm,this.orderReportForm=We.idDescendants(r.orderReportForm),this.dexBalancesRowTmpl=r.dexBalancesRowTmpl,this.placementRowTmpl=r.placementRowTmpl,this.placementAmtRowTmpl=r.placementAmtRowTmpl,We.cleanTemplates(this.dexBalancesRowTmpl,this.placementRowTmpl,this.placementAmtRowTmpl),this.forms=n,We.bind(this.page.stopBttn,"click",(function(){return o.stop()})),We.bind(this.page.runLogsBttn,"click",(function(){var e=o.mkt,t=e.baseID,n=e.quoteID,r=e.host,s=o.startTime;vt().loadPage("mmlogs",{baseID:t,quoteID:n,host:r,startTime:s,returnPage:a})})),We.bind(this.page.buyOrdersBttn,"click",(function(){return o.showOrderReport("buys")})),We.bind(this.page.sellOrdersBttn,"click",(function(){return o.showOrderReport("sells")}))}var t,n,o;return d(e,[{key:"stop",value:(o=s(f().mark((function e(){var t,n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.mkt,r=n.host,a=n.baseID,o=n.quoteID,s=vt().loading(t.stopBttn),e.next=4,Jn.stopBot({host:r,baseID:a,quoteID:o});case 4:s();case 5:case"end":return e.stop()}}),e,this)}))),function(){return o.apply(this,arguments)})},{key:"setMarket",value:(n=s(f().mark((function e(t,n,r){var a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=vt().mmStatus.bots.find((function(e){var a=e.config;return a.baseID===n&&a.quoteID===r&&a.host===t}))){e.next=3;break}return e.abrupt("return");case 3:return o=new ir(a.config),e.next=6,o.initialize();case 6:this.setBotMarket(o);case 7:case"end":return e.stop()}}),e,this)}))),function(e,t,r){return n.apply(this,arguments)})},{key:"setBotMarket",value:(t=s(f().mark((function e(t){var n,a,o,s,i,c,l,u,d,h,p,v,m,g,y,x,b,k,w,C,S,F,T,D,I,A;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.mkt=t,c=this.page,l=this.div,u=this.mkt,d=u.host,h=u.baseID,p=u.quoteID,v=u.baseFeeID,m=u.quoteFeeID,g=u.cexName,y=u.baseFeeSymbol,x=u.quoteFeeSymbol,b=u.baseFeeTicker,k=u.quoteFeeTicker,w=u.cfg,C=u.baseFactor,S=u.quoteFactor,$n(l,h,p,d),We.setVis(v!==h,c.baseFeeReservesBox),We.setVis(m!==p,c.quoteFeeReservesBox),We.setVis.apply(We,[Boolean(g)].concat(r(We.applySelector(l,"[data-cex-show]")))),c.baseFeeLogo.src=We.logoPath(y),c.baseFeeTicker.textContent=b,c.quoteFeeLogo.src=We.logoPath(x),c.quoteFeeTicker.textContent=k,F=w.basicMarketMakingConfig,T=null!==(n=null==F?void 0:F.gapStrategy)&&void 0!==n?n:zn,D=null!==(a=null!==(o=null===(s=w.arbMarketMakingConfig)||void 0===s?void 0:s.profit)&&void 0!==o?o:null===(i=w.simpleArbConfig)||void 0===i?void 0:i.profitTrigger)&&void 0!==a?a:0,F&&(I=r(F.buyPlacements).sort((function(e,t){return e.gapFactor-t.gapFactor})),A=r(F.sellPlacements).sort((function(e,t){return e.gapFactor-t.gapFactor})),D=I.length>0?A.length>0?(I[0].gapFactor+A[0].gapFactor)/2:I[0].gapFactor:A[0].gapFactor),We.hide(c.profitLabel,c.gapLabel,c.multiplierLabel,c.profitUnit,c.gapUnit,c.multiplierUnit),e.t0=T,e.next=e.t0===zn||e.t0===Gn?18:e.t0===_n?21:24;break;case 18:return We.show(c.profitLabel,c.profitUnit),c.gapFactor.textContent=(100*D).toFixed(2),e.abrupt("break",25);case 21:return We.show(c.multiplierLabel,c.multiplierUnit),c.gapFactor.textContent=(100*D).toFixed(2),e.abrupt("break",25);case 24:c.gapFactor.textContent=We.formatFourSigFigs(D/Dt*C/S);case 25:this.update(),this.readBook();case 27:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})},{key:"handleBalanceNote",value:function(e){if(this.mkt){var t=this.mkt,n=t.baseID,r=t.quoteID,a=t.baseFeeID,o=t.quoteFeeID;e.assetID!==n&&e.assetID!==a&&e.assetID!==r&&e.assetID!==o||this.update()}}},{key:"handleEpochReportNote",value:function(e){if(this.mkt){var t=this.mkt,n=t.baseID,r=t.quoteID,a=t.host;if(e.baseID===n&&e.quoteID===r&&e.host===a&&e.report){if(this.latestEpoch=e.report,this.forms.currentForm===this.orderReportFormEl&&this.forms.currentFormID===this.mkt.id){var o="buys"===this.displayedOrderReportFormSide?e.report.buysReport:e.report.sellsReport;o?this.updateOrderReport(o,this.displayedOrderReportFormSide,e.report.epochNum):this.forms.close()}this.update()}}}},{key:"handleCexProblemsNote",value:function(e){if(this.mkt){var t=this.mkt,n=t.baseID,r=t.quoteID,a=t.host;e.baseID===n&&e.quoteID===r&&e.host===a&&(this.cexProblems=e.problems,this.update())}}},{key:"setTicker",value:function(){this.page.runTime.textContent=We.hmsSince(this.startTime)}},{key:"update",value:function(){var e,t,n,r=this,o=this.div,s=this.page,i=this.mkt,c=i.baseID,l=i.quoteID,u=i.baseFeeID,d=i.quoteFeeID,h=i.baseFactor,p=i.quoteFactor,f=i.baseFeeFactor,v=i.quoteFeeFactor,m=i.marketReport,g=m.baseFiatRate,y=m.quoteFiatRate,x=this.mkt.status(),b=x.botCfg,k=b.cexName,w=b.basicMarketMakingConfig,C=x.runStats,S=x.latestEpoch,F=x.cexProblems;if(this.latestEpoch=S,this.cexProblems=F,We.hide(s.stats,s.cexRow,s.pendingDepositBox,s.pendingWithdrawalBox),C){this.ticker||(this.startTime=C.startTime,this.setTicker(),this.ticker=setInterval((function(){return r.setTicker()}),1e3)),We.show(s.stats),ur(100*C.profitLoss.profitRatio,s.profit,s.profitSign,2),ur(C.profitLoss.profit,s.profitLoss,s.plSign,2),this.startTime=C.startTime;var T=function(e){return e?e.available+e.locked+e.pending+e.reserved:0},D=T(C.dexBalances[c])/h;s.walletBaseInventory.textContent=We.formatFourSigFigs(D),s.walletBaseInvFiat.textContent=We.formatFourSigFigs(D*g,2);var I=T(C.dexBalances[l])/p;if(s.walletQuoteInventory.textContent=We.formatFourSigFigs(I),s.walletQuoteInvFiat.textContent=We.formatFourSigFigs(I*y,2),We.setVis(k,s.cexRow),k){We.show(s.pendingDepositBox,s.pendingWithdrawalBox),er(o,k);var A=T(C.cexBalances[c])/h;s.cexBaseInventory.textContent=We.formatFourSigFigs(A),s.cexBaseInventoryFiat.textContent=We.formatFourSigFigs(A*g,2);var R=T(C.cexBalances[l])/p;s.cexQuoteInventory.textContent=We.formatFourSigFigs(R),s.cexQuoteInventoryFiat.textContent=We.formatFourSigFigs(R*y,2)}if(u!==c){var E=T(C.dexBalances[u])/f;s.baseFeeReserves.textContent=We.formatFourSigFigs(E)}if(d!==l){var B=T(C.dexBalances[d])/v;s.quoteFeeReserves.textContent=We.formatFourSigFigs(B)}s.pendingDeposits.textContent=String(Math.round(C.pendingDeposits)),s.pendingWithdrawals.textContent=String(Math.round(C.pendingWithdrawals)),s.completedMatches.textContent=String(Math.round(C.completedMatches)),We.setVis(C.tradedUSD,s.tradedUSDBox),C.tradedUSD>0&&(s.tradedUSD.textContent=We.formatFourSigFigs(C.tradedUSD)),We.setVis(g,s.roundTripFeesBox),g&&(s.roundTripFeesUSD.textContent=We.formatFourSigFigs((null===(e=C.feeGap)||void 0===e?void 0:e.roundTripFees)/h*g||0));var P=vt().conventionalRate(c,l,(null===(t=C.feeGap)||void 0===t?void 0:t.basisPrice)||0);s.basisPrice.textContent=We.formatFourSigFigs(P);var L=!w||w.gapStrategy===Hn||w.gapStrategy===Gn;if(We.setVis(L,s.feeGapBox),L){var O,M=vt().conventionalRate(c,l,(null===(O=C.feeGap)||void 0===O?void 0:O.feeGap)||0);s.feeGap.textContent=We.formatFourSigFigs(M),s.feeGapPct.textContent=(M/P*100||0).toFixed(2)}We.setVis(w,s.gapStrategyBox),w&&(s.gapStrategy.textContent=w.gapStrategy);var q=vt().conventionalRate(c,l,(null===(n=C.feeGap)||void 0===n?void 0:n.remoteGap)||0);if(We.setVis(q,s.remoteGapBox),q&&(s.remoteGap.textContent=We.formatFourSigFigs(q),s.remoteGapPct.textContent=(q/P*100||0).toFixed(2)),We.setVis(null==S?void 0:S.buysReport,s.buyOrdersReportBox),null!=S&&S.buysReport){var N=lr(S.buysReport);We.setVis(N,s.buyOrdersSuccess),We.setVis(!N,s.buyOrdersFailed)}if(We.setVis(null==S?void 0:S.sellsReport,s.sellOrdersReportBox),null!=S&&S.sellsReport){var W=lr(S.sellsReport);We.setVis(W,s.sellOrdersSuccess),We.setVis(!W,s.sellOrdersFailed)}var V=hr(null==S?void 0:S.preOrderProblems,this.mkt.cexName,this.mkt.host),U=function(e){if(!e)return[];var t=[];if(e.depositErr)for(var n=0,r=Object.entries(e.depositErr);n<r.length;n++){var o=a(r[n],2),s=o[0],i=o[1];t.push(ke("DEPOSIT_ERROR",{assetSymbol:vt().assets[Number(s)].symbol.toUpperCase(),time:new Date(1e3*i.stamp).toLocaleString(),error:i.error}))}if(e.withdrawErr)for(var c=0,l=Object.entries(e.withdrawErr);c<l.length;c++){var u=a(l[c],2),d=u[0],h=u[1];t.push(ke("WITHDRAW_ERROR",{assetSymbol:vt().assets[Number(d)].symbol.toUpperCase(),time:new Date(1e3*h.stamp).toLocaleString(),error:h.error}))}return e.tradeErr&&t.push(ke("CEX_TRADE_ERROR",{time:new Date(1e3*e.tradeErr.stamp).toLocaleString(),error:e.tradeErr.error})),t}(this.cexProblems),_=[].concat(V,U);We.setVis(_.length>0,s.preOrderProblemsBox),We.empty(s.preOrderProblemsBox);var j,H=Vn(_);try{for(H.s();!(j=H.n()).done;){var z=j.value,G=document.createElement("span");G.textContent="- ".concat(z),s.preOrderProblemsBox.appendChild(G)}}catch(e){H.e(e)}finally{H.f()}}else this.ticker&&(clearInterval(this.ticker),this.ticker=void 0)}},{key:"updateOrderReport",value:function(e,t,n){var r=this,o=this.orderReportForm,s=ke("buys"===t?E:B);if(o.orderReportTitle.textContent=ke("ORDER_REPORT_TITLE",{side:s,epochNum:"".concat(n)}),We.setVis(e.error,o.orderReportError),We.setVis(!e.error,o.orderReportDetails),e.error){var i=hr(e.error,this.mkt.cexName,this.mkt.host);We.empty(o.orderReportError);for(var c=0,l=i;c<l.length;c++){var u=l[c],d=document.createElement("span");d.textContent="- ".concat(u),o.orderReportError.appendChild(d)}}else{We.empty(o.dexBalancesBody,o.placementsBody);var h=function(t){var n=r.dexBalancesRowTmpl.cloneNode(!0),a=We.parseTemplate(n),o=vt().assets[t];a.asset.textContent=o.symbol.toUpperCase(),a.assetLogo.src=We.logoPath(o.symbol);var s=o.unitInfo,i=e.availableDexBals[t]?e.availableDexBals[t].available:0,c=e.requiredDexBals[t]?e.requiredDexBals[t]:0,l=e.remainingDexBals[t]?e.remainingDexBals[t]:0,u=e.availableDexBals[t]?e.availableDexBals[t].pending:0,d=e.availableDexBals[t]?e.availableDexBals[t].locked:0,h=e.usedDexBals[t]?e.usedDexBals[t]:0;a.available.textContent=We.formatCoinValue(i,s),a.locked.textContent=We.formatCoinValue(d,s),a.required.textContent=We.formatCoinValue(c,s),a.remaining.textContent=We.formatCoinValue(l,s),a.pending.textContent=We.formatCoinValue(u,s),a.used.textContent=We.formatCoinValue(h,s);var p=pr(c,i);a.deficiency.textContent=We.formatCoinValue(p,s),p>0&&a.deficiency.classList.add("text-warning");var f=pr(p,u);return a.deficiencyWithPending.textContent=We.formatCoinValue(f,s),f>0&&a.deficiencyWithPending.classList.add("text-warning"),[n,p]},p=[this.mkt.baseID,this.mkt.quoteID];p.includes(this.mkt.baseFeeID)||p.push(this.mkt.baseFeeID),p.includes(this.mkt.quoteFeeID)||p.push(this.mkt.quoteFeeID);for(var f,v=0,m=[],g=0,y=p;g<y.length;g++){var x=a(h(y[g]),2),b=x[0];v+=x[1],o.dexBalancesBody.appendChild(b),m.push(b)}if(function(e,t){We.setVis(e,o.dexDeficiencyHeader,o.dexDeficiencyWithPendingHeader);var n,r=Vn(t);try{for(r.s();!(n=r.n()).done;){var a=n.value,s=We.parseTemplate(a);We.setVis(e,s.deficiency,s.deficiencyWithPending)}}catch(e){r.e(e)}finally{r.f()}}(v>0,m),We.setVis(this.mkt.cexName,o.cexSection,o.counterTradeRateHeader,o.requiredCEXHeader,o.usedCEXHeader),this.mkt.cexName){var k=Yn[this.mkt.cexName];k?(o.cexLogo.src=k.logo,o.cexBalancesTitle.textContent=ke("CEX_BALANCES",{cexName:k.name})):console.error("CEXDisplayInfo not found for ".concat(this.mkt.cexName));var w="buys"===t?this.mkt.baseID:this.mkt.quoteID;f=vt().assets[w],o.cexAsset.textContent=f.symbol.toUpperCase(),o.cexAssetLogo.src=We.logoPath(f.symbol);var C=e.availableCexBal?e.availableCexBal.available:0,S=e.requiredCexBal?e.requiredCexBal:0,F=e.remainingCexBal?e.remainingCexBal:0,T=e.availableCexBal?e.availableCexBal.pending:0,D=e.availableCexBal?e.availableCexBal.reserved:0,I=e.usedCexBal?e.usedCexBal:0,A=pr(S,C),R=pr(A,T);o.cexAvailable.textContent=We.formatCoinValue(C,f.unitInfo),o.cexLocked.textContent=We.formatCoinValue(D,f.unitInfo),o.cexRequired.textContent=We.formatCoinValue(S,f.unitInfo),o.cexRemaining.textContent=We.formatCoinValue(F,f.unitInfo),o.cexPending.textContent=We.formatCoinValue(T,f.unitInfo),o.cexUsed.textContent=We.formatCoinValue(I,f.unitInfo);var P=A>0;We.setVis(P,o.cexDeficiencyHeader,o.cexDeficiencyWithPendingHeader,o.cexDeficiency,o.cexDeficiencyWithPending),P&&(o.cexDeficiency.textContent=We.formatCoinValue(A,f.unitInfo),o.cexDeficiencyWithPending.textContent=We.formatCoinValue(R,f.unitInfo),R>0?o.cexDeficiencyWithPending.classList.add("text-warning"):o.cexDeficiencyWithPending.classList.remove("text-warning"))}var L,O=!1,M=Vn(e.placements);try{for(M.s();!(L=M.n()).done;)if(L.value.error){O=!0;break}}catch(e){M.e(e)}finally{M.f()}We.setVis(O,o.errorHeader);for(var q=function(e,t){var n=r.placementRowTmpl.cloneNode(!0),a=We.parseTemplate(n),o=vt().assets[r.mkt.baseID].unitInfo,s=vt().assets[r.mkt.quoteID].unitInfo;a.priority.textContent=String(t),a.rate.textContent=We.formatRateFullPrecision(e.rate,o,s,r.mkt.rateStep),a.lots.textContent=String(e.lots),a.standingLots.textContent=String(e.standingLots),a.orderedLots.textContent=String(e.orderedLots),e.standingLots+e.orderedLots<e.lots&&(a.lots.classList.add("text-warning"),a.standingLots.classList.add("text-warning"),a.orderedLots.classList.add("text-warning")),We.setVis(e.counterTradeRate>0,a.counterTradeRate),a.counterTradeRate.textContent=We.formatRateFullPrecision(e.counterTradeRate,o,s,r.mkt.rateStep);for(var i=0,c=p;i<c.length;i++){var l=c[i],u=vt().assets[l],d=u.unitInfo,h=e.requiredDex[l]?e.requiredDex[l]:0,v=e.usedDex[l]?e.usedDex[l]:0,m=r.placementAmtRowTmpl.cloneNode(!0),g=We.parseTemplate(m),y=r.placementAmtRowTmpl.cloneNode(!0),x=We.parseTemplate(y);g.amt.textContent=We.formatCoinValue(h,d),g.assetLogo.src=We.logoPath(u.symbol),g.assetSymbol.textContent=u.symbol.toUpperCase(),x.amt.textContent=We.formatCoinValue(v,d),x.assetLogo.src=We.logoPath(u.symbol),x.assetSymbol.textContent=u.symbol.toUpperCase(),a.requiredDEX.appendChild(m),a.usedDEX.appendChild(y)}if(We.setVis(r.mkt.cexName,a.requiredCEX,a.usedCEX),r.mkt.cexName){var b=We.formatCoinValue(e.requiredCex,f.unitInfo);a.requiredCEX.textContent="".concat(b," ").concat(f.symbol.toUpperCase());var k=We.formatCoinValue(e.usedCex,f.unitInfo);a.usedCEX.textContent="".concat(k," ").concat(f.symbol.toUpperCase())}if(We.setVis(O,a.error),e.error){var w=hr(e.error,r.mkt.cexName,r.mkt.host);a.error.textContent=w.join("\n")}return n},N=0;N<e.placements.length;N++)o.placementsBody.appendChild(q(e.placements[N],N+1))}}},{key:"showOrderReport",value:function(e){if(this.latestEpoch){var t="buys"===e?this.latestEpoch.buysReport:this.latestEpoch.sellsReport;t&&(this.updateOrderReport(t,e,this.latestEpoch.epochNum),this.displayedOrderReportFormSide=e,this.forms.show(this.orderReportFormEl,this.mkt.id))}}},{key:"readBook",value:function(){if(this.mkt){var e=this.page,t=this.mkt,n=t.host,r=t.mktID,a=vt().exchanges[n].markets[r].orders||[];e.nBookedOrders.textContent=String(a.filter((function(e){return 2===e.status})).length)}}}]),e}();function lr(e){if(e.error)return!1;for(var t=0;t<e.placements.length;t++){var n=e.placements[t];if(n.orderedLots+n.standingLots<n.lots)return!1;if(n.error)return!1}return!0}function ur(e,t,n,r){t.textContent=We.formatFourSigFigs(e,r),n.classList.toggle("ico-plus",e>0),n.classList.toggle("text-good",e>0)}function dr(e,t,n,r,a,o,s,i,c,l,u,d,h){var p=tr(a,e,t),f={dex:{base:{lots:o,val:o*a},quote:{lots:s,val:s*p}},cex:{base:{lots:s,val:s*a},quote:{lots:o,val:o*p}}},v=0,m=0;e!==i&&(v+=n.estimated.swap,i===c&&(v+=r.estimated.redeem));var g=n.max.swap;e===c&&(g+=r.max.redeem),l&&(g+=n.max.refund,u||i===c||(m=n.max.redeem));var y=0,x=0;t!==c&&(y+=r.estimated.swap,c===i&&(y+=n.estimated.redeem));var b=r.max.swap;t===i&&(b+=n.max.redeem),u&&(b+=r.max.refund,l||c===i||(x=r.max.redeem));var k=1+d,w=1+h,C=g*o*k,S=m*s*w,F=b*s*w,T=x*o*k;return{commit:f,fees:{base:Nn(Nn({},n),{},{bookingFeesPerLot:g,bookingFeesPerCounterLot:m,bookingFees:C+S,swapReservesFactor:k,redeemReservesFactor:w,tokenFeesPerSwap:v}),quote:Nn(Nn({},r),{},{bookingFeesPerLot:b,bookingFeesPerCounterLot:x,bookingFees:F+T,swapReservesFactor:w,redeemReservesFactor:k,tokenFeesPerSwap:y})}}}function hr(e,t,n){if(!e)return[];var r=[];if(e.walletNotSynced)for(var o=0,s=Object.entries(e.walletNotSynced);o<s.length;o++){var i=a(s[o],2),c=i[0];i[1]&&r.push(ke("WALLET_NOT_SYNCED",{assetSymbol:vt().assets[Number(c)].symbol.toUpperCase()}))}if(e.noWalletPeers)for(var l=0,u=Object.entries(e.noWalletPeers);l<u.length;l++){var d=a(u[l],2),h=d[0];d[1]&&r.push(ke("WALLET_NO_PEERS",{assetSymbol:vt().assets[Number(h)].symbol.toUpperCase()}))}return e.accountSuspended&&r.push(ke("ACCOUNT_SUSPENDED",{dexHost:n})),e.userLimitTooLow&&r.push(ke("USER_LIMIT_TOO_LOW",{dexHost:n})),e.noPriceSource&&r.push(ke("NO_PRICE_SOURCE")),e.cexOrderbookUnsynced&&r.push(ke("CEX_ORDERBOOK_UNSYNCED",{cexName:t})),e.causesSelfMatch&&r.push(ke("CAUSES_SELF_MATCH")),e.unknownError&&r.push(e.unknownError),r}function pr(e,t){return e-t>0?e-t:0}function fr(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return vr(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?vr(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function vr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}window.mmstatus=function(){return Jn.status()};var mr=function(){function e(t,n){var r=this;i(this,e),h(this,"formsDiv",void 0),h(this,"currentForm",void 0),h(this,"currentFormID",void 0),h(this,"keyup",void 0),h(this,"closed",void 0),this.formsDiv=t,this.closed=null==n?void 0:n.closed,t.querySelectorAll(".form-closer").forEach((function(e){We.bind(e,"click",(function(){r.close()}))})),We.bind(t,"mousedown",(function(e){r.currentForm&&(We.mouseInElement(e,r.currentForm)||r.close())})),this.keyup=function(e){"Escape"===e.key&&r.close()},We.bind(document,"keyup",this.keyup)}var t;return d(e,[{key:"show",value:(t=s(f().mark((function e(t,n){var a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.currentForm=t,this.currentFormID=n,We.hide.apply(We,r(Array.from(this.formsDiv.children))),t.style.right="10000px",We.show(this.formsDiv,t),a=(this.formsDiv.offsetWidth+t.offsetWidth)/2,e.next=8,We.animate(Br,(function(e){t.style.right="".concat((1-e)*a,"px")}),"easeOutHard");case 8:t.style.right="0";case 9:case"end":return e.stop()}}),e,this)}))),function(e,n){return t.apply(this,arguments)})},{key:"close",value:function(){We.hide(this.formsDiv);var e=this.currentForm;this.currentForm=void 0,this.currentFormID=void 0,this.closed&&this.closed(e)}},{key:"exit",value:function(){We.unbind(document,"keyup",this.keyup)}}]),e}(),gr=function(){function e(t,n,r){var a=this;i(this,e),h(this,"page",void 0),h(this,"form",void 0),h(this,"success",void 0),h(this,"current",void 0),h(this,"subform",void 0),h(this,"walletCfgGuide",void 0),h(this,"parentSyncer",void 0),h(this,"createUpdater",void 0),this.form=t,this.success=n;var o=this.page=We.parseTemplate(t);r&&(We.show(o.goBack),We.bind(o.goBack,"click",(function(){r()}))),We.empty(o.walletTabTmpl),o.walletTabTmpl.removeAttribute("id"),this.subform=new xr(o.walletSettings,!0),this.walletCfgGuide=We.tmplElement(t,"walletCfgGuide"),Mr(t,o.submitAdd,(function(){return a.submit()})),Mr(t,o.oneBttn,(function(){return a.submit()})),vt().registerNoteFeeder({walletstate:function(e){a.reportWalletState(e.wallet)},walletsync:function(e){a.parentSyncer&&a.parentSyncer(vt().walletMap[e.assetID])},createwallet:function(e){a.reportCreationUpdate(e)}})}var t,n,a,o,c,l,u;return d(e,[{key:"reportWalletState",value:function(e){this.parentSyncer&&this.parentSyncer(e)}},{key:"reportCreationUpdate",value:function(e){this.createUpdater&&this.createUpdater(e)}},{key:"createWallet",value:(u=s(f().mark((function e(t,n,r){var a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a={assetID:t,pass:this.page.newWalletPass.value||"",config:this.subform.map(t),walletType:n,parentForm:r},o=new $t(this.form,{backgroundColor:!0}),e.next=4,S("/api/newwallet",a);case 4:return s=e.sent,o.stop(),e.abrupt("return",s);case 7:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return u.apply(this,arguments)})},{key:"submit",value:(l=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=t.newWalletPass,We.hide(t.newWalletErr),r=this.current,a=r.asset,o=r.parentAsset,s=this.current.selectedDef,c=s.type,o&&(c=a.token.definition.type,i={assetID:o.id,config:this.subform.map(o.id),walletType:s.type}),e.next=9,this.createWallet(a.id,c,i);case 9:if(l=e.sent,vt().checkResponse(l)){e.next=13;break}return this.setError(l.msg),e.abrupt("return");case 13:if(n.value="",!o){e.next=19;break}return e.next=17,this.runParentSync();case 17:e.next=20;break;case 19:this.success(this.current.asset.id);case 20:case"end":return e.stop()}}),e,this)}))),function(){return l.apply(this,arguments)})},{key:"runParentSync",value:(c=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n=this.current,r=n.parentAsset,a=n.asset,r){e.next=3;break}return e.abrupt("return");case 3:return t.parentSyncPct.textContent="0",t.parentName.textContent=r.name,t.parentLogo.src=We.logoPath(r.symbol),t.childName.textContent=a.name,t.childLogo.src=We.logoPath(a.symbol),We.hide(t.mainForm),We.show(t.parentSyncing),e.prev=10,e.next=13,this.syncParent(r);case 13:this.success(this.current.asset.id),e.next=19;break;case 16:e.prev=16,e.t0=e.catch(10),this.setError(e.t0.message||e.t0);case 19:We.show(t.mainForm),We.hide(t.parentSyncing);case 21:case"end":return e.stop()}}),e,this,[[10,16]])}))),function(){return c.apply(this,arguments)})},{key:"syncParent",value:function(e){var t=this,n=this.page,r=this.current.asset;return new Promise((function(a,o){var s=vt().assets[e.id].wallet;if(s&&s.synced)return a();t.parentSyncer=function(t){t.assetID===e.id&&(n.parentSyncPct.textContent=(100*t.syncProgress).toFixed(1))},t.createUpdater=function(e){if(e.assetID===r.id){switch(e.topic){case"QueuedCreationFailed":o(new Error("".concat(e.subject,": ").concat(e.details)));break;case"QueuedCreationSuccess":a();break;default:return}t.parentSyncer=null,t.createUpdater=null}}}))}},{key:"setAsset",value:(o=s(f().mark((function e(t){var n,r,a,o,s,i,c,l,u,d,h,p=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.parseAsset(t)){e.next=2;break}return e.abrupt("return");case 2:if(n=this.page,r=n.walletTypeTabs,a=this.current,o=a.winfo,s=a.asset,i=a.parentAsset,n.assetName.textContent=o.name,n.newWalletPass.value="",We.empty(r),We.hide(r,n.newWalletErr,n.tokenMsgBox),this.page.assetLogo.src=We.logoPath(s.symbol),i&&(n.tokenParentLogo.src=We.logoPath(i.symbol),n.tokenParentName.textContent=i.name,We.show(n.tokenMsgBox)),c=i?i.info:null,!((l=c?c.availablewallets:o.availablewallets?o.availablewallets:[o.definition]).length>1)){e.next=34;break}We.show(r),u=fr(l),e.prev=16,h=f().mark((function e(){var t,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=d.value,(a=n.walletTabTmpl.cloneNode(!0)).dataset.tooltip=t.description,a.textContent=t.tab,r.appendChild(a),We.bind(a,"click",(function(){var e,n=fr(We.kids(r));try{for(n.s();!(e=n.n()).done;)e.value.classList.remove("selected")}catch(e){n.e(e)}finally{n.f()}a.classList.add("selected"),p.update(t)}));case 6:case"end":return e.stop()}}),e)})),u.s();case 19:if((d=u.n()).done){e.next=23;break}return e.delegateYield(h(),"t0",21);case 21:e.next=19;break;case 23:e.next=28;break;case 25:e.prev=25,e.t1=e.catch(16),u.e(e.t1);case 28:return e.prev=28,u.f(),e.finish(28);case 31:vt().bindTooltips(r),r.firstChild.classList.add("selected");case 34:return e.next=36,this.update(this.current.selectedDef);case 36:if(!s.walletCreationPending){e.next=39;break}return e.next=39,this.runParentSync();case 39:case"end":return e.stop()}}),e,this,[[16,25,28,31]])}))),function(e){return o.apply(this,arguments)})},{key:"parseAsset",value:function(e){if(this.current&&this.current.asset.id===e)return!1;var t=vt().assets[e],n=t.token;if(!n){if(!t.info)throw Error("this non-token asset has no wallet info!");return this.current={asset:t,winfo:t.info,selectedDef:t.info.availablewallets[0]},!0}var r=vt().user.assets[n.parentID];if(r.wallet)return this.current={asset:t,winfo:n,selectedDef:n.definition},!0;if(!r.info)throw Error("this parent has no wallet info!");return this.current={asset:t,parentAsset:r,winfo:n,selectedDef:r.info.availablewallets[0]},!0}},{key:"update",value:(a=s(f().mark((function e(t){var n,a,o,s,i,c,l,u,d,h,p,v,m,g,y,x,b,k;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=this.page,this.current.selectedDef=t,We.hide(n.walletPassAndSubmitBttn,n.oneBttnBox,n.newWalletPassBox),a=t.guidelink,(o=t.configopts||[]).map((function(e){return e.isBirthdayConfig&&vt().seedGenTime>0&&(e.default=qr(new Date)),e})),s=!1,i=fr(o),e.prev=8,i.s();case 10:if((c=i.n()).done){e.next=17;break}if(!c.value.required){e.next=15;break}return s=!0,e.abrupt("break",17);case 15:e.next=10;break;case 17:e.next=22;break;case 19:e.prev=19,e.t0=e.catch(8),i.e(e.t0);case 22:return e.prev=22,i.f(),e.finish(22);case 25:if(l=this.current,u=l.asset,d=l.parentAsset,h=l.winfo,(p=t.seeded||Boolean(u.token))&&!s?(We.hide(n.walletSettingsHeader),We.show(n.oneBttnBox)):p?(We.show(n.walletPassAndSubmitBttn,n.walletSettingsHeader),n.newWalletPass.value="",n.submitAdd.textContent=ke("CREATE")):(We.show(n.walletPassAndSubmitBttn,n.walletSettingsHeader),t.noauth||We.show(n.newWalletPassBox),n.submitAdd.textContent=ke("ADD")),d){v=JSON.parse(JSON.stringify(o)),m=fr(v);try{for(m.s();!(g=m.n()).done;)g.value.regAsset=d.id}catch(e){m.e(e)}finally{m.f()}if((y=h.definition.configopts||[]).length>0){x=JSON.parse(JSON.stringify(y)),b=fr(x);try{for(b.s();!(k=b.n()).done;)k.value.regAsset=u.id}catch(e){b.e(e)}finally{b.f()}v.push.apply(v,r(x))}this.subform.update(u.id,v,!1)}else this.subform.update(u.id,o,!1);return this.setGuideLink(a),t.seeded||Boolean(this.current.asset.token)?We.hide(this.subform.fileSelector):We.show(this.subform.fileSelector),e.next=33,this.loadDefaults();case 33:case"end":return e.stop()}}),e,this,[[8,19,22,25]])}))),function(e){return a.apply(this,arguments)})},{key:"setGuideLink",value:function(e){We.hide(this.walletCfgGuide),""!==e&&(this.walletCfgGuide.href=e,We.show(this.walletCfgGuide))}},{key:"setError",value:(n=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.page.newWalletErr.textContent=t,We.show(this.page.newWalletErr);case 2:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"loadDefaults",value:(t=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.current,n=t.asset,r=t.parentAsset,(a=t.selectedDef).configpath){e.next=3;break}return e.abrupt("return");case 3:if(o=n.id,!r){e.next=8;break}if(!a.seeded){e.next=7;break}return e.abrupt("return");case 7:o=r.id;case 8:return s=vt().loading(this.form),e.next=11,S("/api/defaultwalletcfg",{assetID:o,type:a.type});case 11:if(i=e.sent,s(),vt().checkResponse(i)){e.next=16;break}return this.setError(i.msg),e.abrupt("return");case 16:this.subform.setLoadedConfig(i.config);case 17:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),yr=0,xr=function(){function e(t,n){var r=this;i(this,e),h(this,"page",void 0),h(this,"form",void 0),h(this,"configElements",void 0),h(this,"configOpts",void 0),h(this,"sectionize",void 0),h(this,"allSettings",void 0),h(this,"dynamicOpts",void 0),h(this,"textInputTmpl",void 0),h(this,"dateInputTmpl",void 0),h(this,"checkboxTmpl",void 0),h(this,"repeatableTmpl",void 0),h(this,"fileSelector",void 0),h(this,"fileInput",void 0),h(this,"errMsg",void 0),h(this,"showOther",void 0),h(this,"showIcon",void 0),h(this,"hideIcon",void 0),h(this,"showHideMsg",void 0),h(this,"otherSettings",void 0),h(this,"loadedSettingsMsg",void 0),h(this,"loadedSettings",void 0),h(this,"defaultSettingsMsg",void 0),h(this,"defaultSettings",void 0),h(this,"assetHasActiveOrders",void 0),h(this,"assetID",void 0),this.page=We.idDescendants(t),this.form=t,this.configElements=[],this.configOpts=[],this.sectionize=n,this.allSettings=We.tmplElement(t,"allSettings"),this.dynamicOpts=We.tmplElement(t,"dynamicOpts"),this.textInputTmpl=We.tmplElement(t,"textInput"),this.textInputTmpl.remove(),this.dateInputTmpl=We.tmplElement(t,"dateInput"),this.dateInputTmpl.remove(),this.checkboxTmpl=We.tmplElement(t,"checkbox"),this.checkboxTmpl.remove(),this.repeatableTmpl=We.tmplElement(t,"repeatableInput"),this.repeatableTmpl.remove(),this.fileSelector=We.tmplElement(t,"fileSelector"),this.fileInput=We.tmplElement(t,"fileInput"),this.errMsg=We.tmplElement(t,"errMsg"),this.showOther=We.tmplElement(t,"showOther"),this.showIcon=We.tmplElement(t,"showIcon"),this.hideIcon=We.tmplElement(t,"hideIcon"),this.showHideMsg=We.tmplElement(t,"showHideMsg"),this.otherSettings=We.tmplElement(t,"otherSettings"),this.loadedSettingsMsg=We.tmplElement(t,"loadedSettingsMsg"),this.loadedSettings=We.tmplElement(t,"loadedSettings"),this.defaultSettingsMsg=We.tmplElement(t,"defaultSettingsMsg"),this.defaultSettings=We.tmplElement(t,"defaultSettings"),n||We.hide(this.showOther),We.bind(this.fileSelector,"click",(function(){return r.fileInput.click()})),We.bind(this.fileInput,"change",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",r.fileInputChanged());case 1:case"end":return e.stop()}}),e)})))),We.bind(this.showOther,"click",(function(){r.setOtherSettingsViz(r.hideIcon.classList.contains("d-hide"))}))}var t;return d(e,[{key:"fileInputChanged",value:(t=s(f().mark((function e(){var t,n,a,o,s,i,c,l;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(We.hide(this.errMsg),this.fileInput.value){e.next=3;break}return e.abrupt("return");case 3:if((n=this.fileInput.files)&&0!==n.length){e.next=6;break}return e.abrupt("return");case 6:return a=vt().loading(this.form),e.next=9,n[0].text();case 9:if(o=e.sent){e.next=12;break}return e.abrupt("return");case 12:return e.next=14,S("/api/parseconfig",{configtext:o});case 14:if(s=e.sent,a(),vt().checkResponse(s)){e.next=20;break}return this.errMsg.textContent=s.msg,We.show(this.errMsg),e.abrupt("return");case 20:if(0!==Object.keys(s.map).length){e.next=22;break}return e.abrupt("return");case 22:(t=this.dynamicOpts).append.apply(t,r(this.setConfig(s.map))),this.reorder(this.dynamicOpts),i=[this.loadedSettings.children.length,this.defaultSettings.children.length],l=i[1],0===(c=i[0])&&We.hide(this.loadedSettings,this.loadedSettingsMsg),0===l&&We.hide(this.defaultSettings,this.defaultSettingsMsg),c+l===0&&We.hide(this.showOther,this.otherSettings);case 28:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"addOpt",value:function(e,t,n,r){var a,o,s=this;if(t.isboolean)o=this.checkboxTmpl.cloneNode(!0);else if(t.isdate)o=this.dateInputTmpl.cloneNode(!0);else if(t.repeatable){if((o=this.repeatableTmpl.cloneNode(!0)).classList.add("repeatable"),We.bind(We.tmplElement(o,"add"),"click",(function(){s.addOpt(e,t,o,!0)})),!r)for(var i=0;i<(t.repeatN?t.repeatN-1:0);i++)this.addOpt(e,t,n,!0)}else o=this.textInputTmpl.cloneNode(!0);-1!==((null===(a=vt().extensionWallet(this.assetID))||void 0===a?void 0:a.hiddenFields)||[]).indexOf(t.key)&&We.hide(o),this.configElements.push([t,o]);var c=o.querySelector("input");c.dataset.configKey=t.key,yr++;var l="wcfg-"+String(yr);c.id=l;var u=We.safeSelector(o,"label");if(u.htmlFor=l,u.prepend(t.displayname),void 0!==t.regAsset){var d=new window.Image(15,15);d.src=We.logoPathFromID(t.regAsset||-1),u.prepend(d)}if(n?n.after(o):e.appendChild(o),t.noecho&&(c.type="password",c.autocomplete="off"),t.description&&(u.dataset.tooltip=t.description),t.isboolean)c.checked=t.default;else if(t.isdate){var h=function(e){return e?Nr("now"===e?new Date:new Date(1e3*e)):""};c.max=h(t.max),c.min=h(t.min);var p=t.default?new Date(1e3*t.default):new Date;c.value=Nr(p)}else c.value=null!==t.default?t.default:"";return c.disabled=Boolean(t.disablewhenactive&&this.assetHasActiveOrders),o}},{key:"update",value:function(e,t,n){if(this.assetHasActiveOrders=n,this.configElements=[],this.configOpts=t||[],this.assetID=e,We.empty(this.dynamicOpts,this.defaultSettings,this.loadedSettings),0===this.configOpts.length)return We.hide(this.form);We.show(this.form),this.setOtherSettingsViz(!1),We.hide(this.loadedSettingsMsg,this.loadedSettings,this.defaultSettingsMsg,this.defaultSettings,this.errMsg);var r,a=[],o=fr(this.configOpts);try{for(o.s();!(r=o.n()).done;){var s=r.value;this.sectionize&&null!==s.default?a.push(s):this.addOpt(this.dynamicOpts,s)}}catch(e){o.e(e)}finally{o.f()}if(a.length){var i,c=fr(a);try{for(c.s();!(i=c.n()).done;){var l=i.value;this.addOpt(this.defaultSettings,l)}}catch(e){c.e(e)}finally{c.f()}We.show(this.showOther,this.defaultSettingsMsg,this.defaultSettings)}else We.hide(this.showOther);vt().bindTooltips(this.allSettings),this.dynamicOpts.children.length?We.show(this.dynamicOpts):We.hide(this.dynamicOpts)}},{key:"setOtherSettingsViz",value:function(e){if(e)return We.hide(this.showIcon),We.show(this.hideIcon,this.otherSettings),void(this.showHideMsg.textContent=ke("HIDE_ADDITIONAL_SETTINGS"));We.hide(this.hideIcon,this.otherSettings),We.show(this.showIcon),this.showHideMsg.textContent=ke("SHOW_ADDITIONAL_SETTINGS")}},{key:"setConfig",value:function(e){for(var t,n=[],o={},s=[],i=0,c=r(this.configElements);i<c.length;i++){var l=c[i],u=a(l,2),d=u[0],h=u[1],p=e[d.key];if(void 0!==p)if(d.repeatable){if(o[d.key]){h.remove(),s.push(l);continue}o[d.key]=!0;var f=p.split(d.repeatable),v=f[0];n.push(h),We.safeSelector(h,"input").value=v;for(var m=1;m<(d.repeatN||1);m++)n.push(this.addOpt(h.parentElement,d,h,!0));for(var g=1;g<f.length;g++){var y=this.addOpt(h.parentElement,d,h,!0);We.safeSelector(y,"input").value=f[g],n.push(y)}}else{n.push(h);var x=We.safeSelector(h,"input");d.isboolean?x.checked="1"===(t=p)||"true"===t.toLowerCase():d.isdate?x.value=Nr(new Date(1e3*parseInt(p))):x.value=p}}for(var b=0,k=s;b<k.length;b++){var w=k[b],C=this.configElements.indexOf(w);C>=0&&this.configElements.splice(C,1)}return n}},{key:"setLoadedConfig",value:function(e){var t,n=this.setConfig(e);this.sectionize&&0!==n.length&&((t=this.loadedSettings).append.apply(t,r(n)),this.reorder(this.loadedSettings),We.show(this.loadedSettings,this.loadedSettingsMsg),0===this.defaultSettings.children.length&&We.hide(this.defaultSettings,this.defaultSettingsMsg))}},{key:"map",value:function(e){var t,n={},r=fr(this.configElements);try{for(r.s();!(t=r.n()).done;){var o=a(t.value,2),s=o[0],i=o[1],c=We.safeSelector(i,"input");if(void 0===s.regAsset||s.regAsset===e)if(s.isboolean&&s.key)n[s.key]=c.checked?"1":"0";else if(s.isdate&&s.key){var l=c.min?qr(new Date(c.min+"T00:00")):Number.MIN_SAFE_INTEGER,u=c.max?qr(new Date(c.max+"T00:00")):Number.MAX_SAFE_INTEGER,d=c.value?qr(new Date(c.value+"T00:00")):0;d<l?d=l:d>u&&(d=u),n[s.key]=String(d)}else c.value&&(s.repeatable&&n[s.key]?n[s.key]+=s.repeatable+c.value:n[s.key]=c.value)}}catch(e){r.e(e)}finally{r.f()}return n}},{key:"reorder",value:function(e){var t=this,n={};e.querySelectorAll("input").forEach((function(e){var r=e.dataset.configKey;if(r){var o,s=[],i=fr(t.configElements);try{for(i.s();!(o=i.n()).done;){var c=a(o.value,2),l=c[0],u=c[1];l.key===r&&s.push(u)}}catch(e){i.e(e)}finally{i.f()}n[r]=s}}));var r,o=fr(this.configOpts);try{for(o.s();!(r=o.n()).done;){var s,i=r.value,c=fr(n[i.key]||[]);try{for(c.s();!(s=c.n()).done;){var l=s.value;e.append(l)}}catch(e){c.e(e)}finally{c.f()}}}catch(e){o.e(e)}finally{o.f()}}}]),e}(),br=function(){function e(t,n,r){var a=this;i(this,e),h(this,"form",void 0),h(this,"success",void 0),h(this,"page",void 0),h(this,"xc",void 0),h(this,"certFile",void 0),h(this,"bondAssetID",void 0),h(this,"tier",void 0),h(this,"fees",void 0),this.form=t,this.success=n,this.page=We.parseTemplate(t),this.certFile="",We.bind(this.page.goBack,"click",(function(){return r()})),Mr(t,this.page.submit,(function(){return a.submitForm()}))}var t,n;return d(e,[{key:"setExchange",value:function(e,t){this.xc=e,this.certFile=t,this.page.host.textContent=e.host}},{key:"setAsset",value:function(e,t,n){var r=vt().assets[e],a=r.unitInfo.conventional,o=a.conversionFactor,s=a.unit;this.bondAssetID=r.id,this.tier=t,this.fees=n;var i=this.page,c=this.xc.bondAssets[r.symbol].amount*t*2/o;i.tradingTier.textContent=String(t),i.logo.src=We.logoPath(r.symbol),i.bondLock.textContent=We.formatFourSigFigs(c),i.bondUnit.textContent=s;var l=vt().fiatRatesMap[e];We.show(i.bondLockUSDBox),l?i.bondLockUSD.textContent=We.formatFourSigFigs(c*l):We.hide(i.bondLockUSDBox),n&&(i.feeReserves.textContent=We.formatFourSigFigs(n/o)),i.reservesUnit.textContent=s}},{key:"setFees",value:function(e,t){this.fees=t;var n=vt().assets[e].unitInfo.conventional.conversionFactor;this.page.feeReserves.textContent=We.formatFourSigFigs(t/n)}},{key:"animate",value:(n=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.form,We.animate(400,(function(e){t.style.transform="scale(".concat(e,")"),t.style.opacity=String(Math.pow(e,4));var n="".concat(500*(1-e),"px");t.style.top=n,t.style.left=n}));case 2:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"submitForm",value:(t=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l,u,d,h;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n=this.bondAssetID,r=this.xc,a=this.certFile,o=this.tier,s=vt().assets[n]){e.next=6;break}return t.regErr.innerText=ke("SELECT_WALLET_FOR_FEE_PAYMENT"),We.show(t.regErr),e.abrupt("return");case 6:return We.hide(t.regErr),i=r.bondAssets[s.wallet.symbol],c=r.host,!vt().exchanges[r.host]||vt().exchanges[r.host].viewOnly?(l={addr:c,cert:a,bond:i.amount*o,asset:i.id},u="/api/postbond"):(l={host:c,targetTier:o,bondAssetID:n},u="/api/updatebondoptions"),d=vt().loading(this.form),e.next=13,S(u,l);case 13:if(h=e.sent,d(),vt().checkResponse(h)){e.next=19;break}return t.regErr.textContent=h.msg,We.show(t.regErr),e.abrupt("return");case 19:this.success();case 20:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),kr=function(){function e(t,n){var r=this;i(this,e),h(this,"form",void 0),h(this,"success",void 0),h(this,"xc",void 0),h(this,"selectedAssetID",void 0),h(this,"certFile",void 0),h(this,"page",void 0),h(this,"assetRows",void 0),h(this,"marketRows",void 0),this.form=t,this.certFile="",this.success=n;var a=this.page=We.parseTemplate(t);We.cleanTemplates(a.currentBondTmpl,a.bondAssetTmpl,a.marketTmpl),We.bind(a.tradingTierInput,"input",(function(){r.setTier()})),We.bind(a.tradingTierInput,"keyup",(function(e){"Enter"===e.key&&r.acceptTier()})),We.bind(a.submitTradingTier,"click",(function(){r.acceptTier()})),We.bind(a.tierUp,"click",(function(){r.incrementTier(!0)})),We.bind(a.tierDown,"click",(function(){r.incrementTier(!1)})),We.bind(a.goBackToAssets,"click",(function(){We.hide(a.tradingTierForm),We.show(a.assetForm)})),We.bind(a.whatsABond,"click",(function(){We.hide(a.assetForm),We.show(a.whatsABondPanel)}));var o=function(){We.show(a.assetForm),We.hide(a.whatsABondPanel)};We.bind(a.bondGotIt,"click",(function(){o()})),We.bind(a.whatsABondBack,"click",(function(){o()})),We.bind(a.usePrepaidBond,"click",(function(){r.showPrepaidBondForm()})),We.bind(a.ppbGoBack,"click",(function(){r.hidePrepaidBondForm()})),We.bind(a.submitPrepaidBond,"click",(function(){r.submitPrepaidBond()})),vt().registerNoteFeeder({createwallet:function(e){"QueuedCreationSuccess"===e.topic&&r.walletCreated(e.assetID)}})}var t,n;return d(e,[{key:"setTierError",value:function(e){this.page.tradingTierErr.textContent=e,We.show(this.page.tradingTierErr)}},{key:"setAssetError",value:function(e){this.page.regAssetErr.textContent=e,We.show(this.page.regAssetErr)}},{key:"clearErrors",value:function(){We.hide(this.page.regAssetErr,this.page.tradingTierErr)}},{key:"setExchange",value:function(e,t){var n=this;this.xc=e,this.certFile=t,this.assetRows={},this.marketRows=[];var r=this.page;We.hide(r.assetForm,r.tradingTierForm,r.whatsABondPanel,r.prepaidBonds),We.empty(r.bondAssets,r.markets),this.clearErrors();for(var a=function(e,t){var a=vt().assets[e];if(a){var o=a.unitInfo.conventional,s=o.unit,i=o.conversionFactor,c=a.name,l=a.symbol,u=r.bondAssetTmpl.cloneNode(!0);r.bondAssets.appendChild(u);var d=We.parseTemplate(u);d.logo.src=We.logoPath(l),d.name.textContent=c,We.bind(u,"click",(function(){n.assetSelected(e)})),d.feeSymbol.textContent=s;var h=t.amount/i;d.feeAmt.textContent=We.formatFourSigFigs(h);var p=vt().fiatRatesMap[e];We.setVis(p,d.fiatBox),p&&(d.fiatBondAmount.textContent=We.formatFourSigFigs(h*p)),n.assetRows[e]={ready:d.ready}}},o=function(t){var a=t.baseid,o=t.quoteid,s=[vt().assets[a],vt().assets[o]];if(s[0]&&s[1]){var i=r.marketTmpl.cloneNode(!0);r.markets.appendChild(i);var c,l=e.assets[a],u=l.symbol,d=l.unitInfo,h=e.assets[o],p=h.symbol,f=h.unitInfo,v=fr(We.applySelector(i,"[data-base-ticker]"));try{for(v.s();!(c=v.n()).done;)c.value.textContent=d.conventional.unit}catch(e){v.e(e)}finally{v.f()}var m,g=fr(We.applySelector(i,"[data-quote-ticker]"));try{for(g.s();!(m=g.n()).done;)m.value.textContent=f.conventional.unit}catch(e){g.e(e)}finally{g.f()}var y=We.parseTemplate(i);y.baseLogo.src=We.logoPath(u),y.quoteLogo.src=We.logoPath(p);var x=function(e){var n=t.parcelsize,o=t.lotsize/d.conventional.conversionFactor,s=o*n*2*e,i=o*n*2*3*e;y.tradeLimitLow.textContent=We.formatFourSigFigs(s),y.tradeLimitHigh.textContent=We.formatFourSigFigs(i);var c=vt().fiatRatesMap[a];c&&(y.fiatTradeLimitLow.textContent=We.formatFourSigFigs(s*c),y.fiatTradeLimitHigh.textContent=We.formatFourSigFigs(i*c)),We.setVis(c,r.fiatTradeLowBox,r.fiatTradeHighBox)};x(fn(e.auth)||1),n.marketRows.push({mkt:t,tmpl:y,setTier:x})}},s=0,i=Object.values(e.assets||{});s<i.length;s++){var c=i[s],l=c.symbol,u=c.id;if(vt().assets[u]){var d=e.bondAssets[l];d&&a(u,d)}}for(var h=0,p=Object.values(e.markets||{});h<p.length;h++)o(p[h]);r.tradingTierInput.value=e.auth.targetTier?String(e.auth.targetTier):"1",this.validBondAssetSelected(e)?this.assetSelected(e.auth.bondAssetID):We.show(r.assetForm)}},{key:"validBondAssetSelected",value:function(e){if(e.viewOnly)return!1;var t=e.auth,n=t.targetTier,r=t.bondAssetID;if(n<1)return!1;var a=vt().assets[r];return a&&Boolean(e.bondAssets[a.symbol])}},{key:"walletCreated",value:function(e){var t=this.assetRows[e],n=vt().assets[e];!function(e,t){t.wallet?e.textContent=ke("WALLET_READY"):t.walletCreationPending?e.textContent=ke("WALLET_PENDING"):e.textContent=ke("SETUP_NEEDED"),e.classList.remove("readygreen","setuporange"),e.classList.add(t.wallet?"readygreen":"setuporange")}(t.ready,n)}},{key:"refresh",value:function(){this.setExchange(this.xc,this.certFile)}},{key:"assetSelected",value:function(e){this.selectedAssetID=e,this.setTier();var t=this.page,n=t.assetForm,r=t.tradingTierForm,a=t.tradingTierInput;We.hide(n),We.show(r),a.focus()}},{key:"setTier",value:function(){var e,t=this.page,n=this.xc.bondAssets,r=this.selectedAssetID,o=vt().assets[r],s=o.symbol,i=o.unitInfo,c=i.conventional,l=c.conversionFactor,u=c.unit,d=n[s],h=null!==(e=t.tradingTierInput.value)&&void 0!==e?e:"";if(h){var p=parseInt(h);if(isNaN(p))this.setTierError(ke(ie));else{t.tradingTierInput.value=String(p),t.bondSizeDisplay.textContent=We.formatCoinValue(d.amount,i);var f,v=fr(We.applySelector(t.tradingTierForm,"[data-tier]"));try{for(v.s();!(f=v.n()).done;)f.value.textContent=String(p)}catch(e){v.e(e)}finally{v.f()}var m,g=fr(We.applySelector(t.tradingTierForm,"[data-bond-asset-ticker]"));try{for(g.s();!(m=g.n()).done;)m.value.textContent=u}catch(e){g.e(e)}finally{g.f()}var y=d.amount*p*2;t.bondLockDisplay.textContent=We.formatCoinValue(y,i);var x=vt().fiatRatesMap[r];x&&(t.fiatLockDisplay.textContent=We.formatFourSigFigs(y/l*x));for(var b=0,k=Object.values(this.marketRows);b<k.length;b++)k[b].setTier(p);for(var w={},C=0,S=Object.entries(vt().assets);C<S.length;C++){var F=a(S[C],2),T=F[0],D=F[1].wallet;if(D){var I=D.balance,A=I.bondlocked+I.bondReserves;A>0&&(w[parseInt(T)]=A)}}var R=Object.keys(w).length>0;if(We.setVis(R,t.currentBondBox),R){We.empty(t.currentBonds);for(var E=0,B=Object.entries(w);E<B.length;E++){var P=a(B[E],2),L=P[0],O=P[1],M=parseInt(L),q=vt().assets[M],N=q.unitInfo,W=q.symbol,V=q.name,U=N.conventional,_=U.conversionFactor,j=U.unit,H=t.currentBondTmpl.cloneNode(!0);t.currentBonds.appendChild(H);var z=We.parseTemplate(H);z.icon.src=We.logoPath(W),z.name.textContent=V,z.amt.textContent=We.formatCoinValue(O,N),z.ticker.textContent=j,z.name.textContent=V;var G=vt().fiatRatesMap[M];We.setVis(z.fiatBox),G&&(z.fiatAmt.textContent=We.formatFourSigFigs(O/_*G))}}We.setVis(x,t.fiatLockBox)}}}},{key:"acceptTier",value:function(){var e,t=this.page,n=this.selectedAssetID;this.clearErrors();var r=null!==(e=t.tradingTierInput.value)&&void 0!==e?e:"";if(r){var a=parseInt(r);isNaN(a)?this.setTierError(ke(ie)):this.success(n,a)}}},{key:"incrementTier",value:function(e){var t,n=this.page.tradingTierInput;n.value=String(Math.max(1,(parseInt(null!==(t=n.value)&&void 0!==t?t:"")||1)+(e?1:-1))),this.setTier()}},{key:"animate",value:(n=s(f().mark((function e(){var t,n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.form,r=Array.from(t.bondAssets.children),n.style.opacity="0",e.next=8,We.animate(350,(function(e){for(var t=0,a=r;t<a.length;t++){var o=a[t];o.style.marginTop="".concat(75*(1-e),"px"),o.style.transform="scale(".concat(e,")")}n.style.opacity=Math.pow(e,4).toFixed(1),n.style.top="".concat(50*(1-e),"px")}),"easeOut");case 8:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"showPrepaidBondForm",value:function(){var e=this.page;We.hide(e.assetForm,e.prepaidBondErr),e.prepaidBondCode.value="",We.show(e.prepaidBonds)}},{key:"hidePrepaidBondForm",value:function(){var e=this.page;We.hide(e.prepaidBonds),We.show(e.assetForm)}},{key:"submitPrepaidBond",value:(t=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n=this.xc.host,We.hide(t.prepaidBondErr),r=t.prepaidBondCode.value){e.next=7;break}return t.prepaidBondErr.textContent=ke(ue),We.show(t.prepaidBondErr),e.abrupt("return");case 7:return e.next=9,S("/api/redeemprepaidbond",{host:n,code:r,cert:this.certFile});case 9:if(a=e.sent,vt().checkResponse(a)){e.next=14;break}return t.prepaidBondErr.textContent=a.msg,We.show(t.prepaidBondErr),e.abrupt("return");case 14:this.success(ft,a.tier);case 15:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),wr=function(){function e(t,n,r){var a=this;i(this,e),h(this,"form",void 0),h(this,"success",void 0),h(this,"goBack",void 0),h(this,"page",void 0),h(this,"assetID",void 0),h(this,"parentID",void 0),h(this,"xc",void 0),h(this,"bondAsset",void 0),h(this,"progressCache",void 0),h(this,"progressed",void 0),h(this,"funded",void 0),h(this,"bondFeeBuffer",void 0),h(this,"parentAssetSynced",void 0),this.form=t,this.success=n,this.page=We.parseTemplate(t),this.assetID=-1,this.progressCache=[],this.progressed=!1,this.funded=!1,We.bind(this.page.goBack,"click",(function(){a.assetID=-1,r()})),vt().registerNoteFeeder({walletstate:function(e){return a.reportWalletState(e.wallet)},walletsync:function(e){if(e.assetID===a.assetID){var t=vt().walletMap[e.assetID];a.reportProgress(t.synced,t.syncProgress)}},balance:function(e){return a.reportBalance(e.assetID)}})}return d(e,[{key:"setExchange",value:function(e){this.xc=e}},{key:"setWallet",value:function(e,t,n){this.assetID=e,this.progressCache=[],this.progressed=!1,this.funded=!1,this.bondFeeBuffer=t,this.parentAssetSynced=!1;var r=this.page,a=vt().assets[e],o=a.symbol,s=a.unitInfo,i=a.wallet,c=i.balance,l=i.address,u=i.synced,d=i.syncProgress,h=a.token;this.parentID=null==h?void 0:h.parentID;var p,f=this.bondAsset=this.xc.bondAssets[o],v=function(e,t){We.empty(e),e.appendChild(We.symbolize(t))},m=fr(We.applySelector(this.form,".unit"));try{for(m.s();!(p=m.n()).done;)v(p.value,a)}catch(e){m.e(e)}finally{m.f()}r.logo.src=We.logoPath(o),r.depoAddr.textContent=l,We.hide(r.syncUncheck,r.syncCheck,r.balUncheck,r.balCheck,r.syncRemainBox,r.bondCostBreakdown),We.show(r.balanceBox);var g=2*f.amount*n;if(t>0){We.show(r.bondCostBreakdown),r.bondLockNoFees.textContent=We.formatCoinValue(g,s),r.bondLockFees.textContent=We.formatCoinValue(t,s),g+=t;var y=Math.max(g-c.available+c.reservesDeficit,0);if(r.totalForBond.textContent=We.formatCoinValue(y,s),We.hide(r.sendEnough),We.hide(r.txFeeBox,r.sendEnoughForToken,r.txFeeBalanceBox),We.hide(r.sendEnoughWithEst),h){We.show(r.txFeeBox,r.sendEnoughForToken,r.txFeeBalanceBox);var x=vt().assets[h.parentID];r.txFee.textContent=We.formatCoinValue(t,x.unitInfo),r.parentFees.textContent=We.formatCoinValue(t,x.unitInfo),r.tokenFees.textContent=We.formatCoinValue(y,s),v(r.txFeeUnit,x),v(r.parentUnit,x),v(r.parentBalUnit,x),r.parentBal.textContent=x.wallet?We.formatCoinValue(x.wallet.balance.available,x.unitInfo):"0"}else We.show(r.sendEnoughWithEst);r.fee.textContent=We.formatCoinValue(g,s)}else We.show(r.sendEnough);We.show(u?r.syncCheck:d>=1?r.syncSpinner:r.syncUncheck),We.show(c.available>=2*f.amount+t?r.balCheck:r.balUncheck),r.progress.textContent=(100*d).toFixed(1),u&&(this.progressed=!0),this.reportBalance(e)}},{key:"reportWalletState",value:function(e){this.progressed&&this.funded||(e.assetID===this.assetID&&this.reportProgress(e.synced,e.syncProgress),this.reportBalance(e.assetID))}},{key:"reportBalance",value:function(e){if(!this.funded&&-1!==this.assetID&&(e===this.assetID||e===this.parentID)){var t=this.page,n=vt().assets[this.assetID],r=n.wallet.balance.available;if(t.balance.textContent=We.formatCoinValue(r,n.unitInfo),n.token){var a=vt().assets[n.token.parentID],o=a.wallet.balance.available;if(t.parentBal.textContent=We.formatCoinValue(o,a.unitInfo),o<this.bondFeeBuffer)return}r<2*this.bondAsset.amount+this.bondFeeBuffer||(We.show(t.balCheck),We.hide(t.balUncheck,t.balanceBox,t.sendEnough),this.funded=!0,this.progressed&&this.success())}}},{key:"reportProgress",value:function(e,t){var n=this.page;if(e)return n.progress.textContent="100",We.hide(n.syncUncheck,n.syncRemainBox,n.syncSpinner),We.show(n.syncCheck),this.progressed=!0,void(this.funded&&this.success());if(1===t?(We.hide(n.syncUncheck),We.show(n.syncSpinner)):(We.hide(n.syncSpinner),We.show(n.syncUncheck)),n.progress.textContent=(100*t).toFixed(1),t>=.999)return We.hide(n.syncRemaining),We.show(n.syncFinishingUp),We.show(n.syncRemainBox),void(n.syncFinishingUp.textContent=ke("WALLET_SYNC_FINISHING_UP"));var r=this.progressCache;if(r.push({stamp:(new Date).getTime(),progress:t}),!(r.length<2)){for(;r.length>20;)r.shift();var a=[r[0],r[r.length-1]],o=a[0],s=a[1],i=s.progress-o.progress;if(0!==i){We.hide(n.syncFinishingUp),We.show(n.syncRemaining),We.show(n.syncRemainBox);var c=i/(s.stamp-o.stamp),l=(1-s.progress)/c;n.syncRemain.textContent=We.formatDuration(l)}}}}]),e}(),Cr=function(){function e(t,n){var r=this;i(this,e),h(this,"form",void 0),h(this,"page",void 0),h(this,"order",void 0),h(this,"acceleratedRate",void 0),h(this,"earlyAcceleration",void 0),h(this,"currencyUnit",void 0),h(this,"success",void 0),this.form=t,this.success=n;var a=this.page=We.idDescendants(t);We.bind(a.accelerateSubmit,"click",(function(){r.submit()})),We.bind(a.submitEarlyConfirm,"click",(function(){r.sendAccelerateRequest()}))}var t,n,r,a;return d(e,[{key:"displayEarlyAccelerationMsg",value:function(){var e=this.page;this.earlyAcceleration&&(e.recentAccelerationTime.textContent="".concat(Math.floor(this.earlyAcceleration.timePast/60)),e.recentSwapTime.textContent="".concat(Math.floor(this.earlyAcceleration.timePast/60)),this.earlyAcceleration.wasAcceleration?(We.show(e.recentAccelerationMsg),We.hide(e.recentSwapMsg),e.recentAccelerationTime.textContent="".concat(Math.floor(this.earlyAcceleration.timePast/60))):(We.show(e.recentSwapMsg),We.hide(e.recentAccelerationMsg),e.recentSwapTime.textContent="".concat(Math.floor(this.earlyAcceleration.timePast/60))),We.hide(e.configureAccelerationDiv,e.accelerateErr),We.show(e.earlyAccelerationDiv))}},{key:"sendAccelerateRequest",value:(a=s(f().mark((function e(){var t,n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.order,n=this.page,r={orderID:t.id,newRate:this.acceleratedRate},a=vt().loading(n.accelerateMainDiv),e.next=6,S("/api/accelerateorder",r);case 6:o=e.sent,a(),vt().checkResponse(o)?(n.accelerateTxID.textContent=o.txID,We.hide(n.accelerateMainDiv,n.preAccelerateErr,n.accelerateErr),We.show(n.accelerateMsgDiv,n.accelerateSuccess),this.success()):(n.accelerateErr.textContent=ke(Z,{msg:o.msg}),We.hide(n.earlyAccelerationDiv),We.show(n.accelerateErr,n.configureAccelerationDiv));case 9:case"end":return e.stop()}}),e,this)}))),function(){return a.apply(this,arguments)})},{key:"submit",value:(r=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.earlyAcceleration?this.displayEarlyAccelerationMsg():this.sendAccelerateRequest();case 1:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"refresh",value:(n=s(f().mark((function e(t){var n,r,a,o,s,i,c=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,this.order=t,e.next=4,S("/api/preaccelerate",t.id);case 4:if(r=e.sent,vt().checkResponse(r)){e.next=10;break}return n.preAccelerateErr.textContent=ke(Z,{msg:r.msg}),We.hide(n.accelerateMainDiv,n.accelerateSuccess),We.show(n.accelerateMsgDiv,n.preAccelerateErr),e.abrupt("return");case 10:We.hide(n.accelerateMsgDiv,n.preAccelerateErr,n.accelerateErr,n.feeEstimateDiv,n.earlyAccelerationDiv),We.show(n.accelerateMainDiv,n.accelerateSuccess,n.configureAccelerationDiv),a=r.preAccelerate,this.earlyAcceleration=a.earlyAcceleration,this.currencyUnit=a.suggestedRange.yUnit,n.accelerateAvgFeeRate.textContent="".concat(a.swapRate," ").concat(a.suggestedRange.yUnit),n.accelerateCurrentFeeRate.textContent="".concat(a.suggestedRate," ").concat(a.suggestedRange.yUnit),this.acceleratedRate=a.suggestedRange.start.y,o=function(){},s=function(e,t){c.acceleratedRate=t},i=new Ct(a.suggestedRange,a.suggestedRange.start.x,{updated:s,changed:function(){return c.updateAccelerationEstimate()},selected:o,roundY:!0}),We.empty(n.sliderContainer),n.sliderContainer.appendChild(i.control),this.updateAccelerationEstimate();case 25:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"updateAccelerationEstimate",value:(t=s(f().mark((function e(){var t,n,r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.order,r={orderID:n.id,newRate:this.acceleratedRate},a=vt().loading(t.sliderContainer),e.next=6,S("/api/accelerationestimate",r);case 6:if(o=e.sent,a(),vt().checkResponse(o)){e.next=12;break}return t.accelerateErr.textContent=ke("ORDER_ACCELERATION_FEE_ERR_MSG",{msg:o.msg}),We.show(t.accelerateErr),e.abrupt("return");case 12:t.feeRateEstimate.textContent="".concat(this.acceleratedRate," ").concat(this.currencyUnit),n.sell?(s=n.baseID,i=n.baseSymbol):(s=n.quoteID,i=n.quoteSymbol),c=vt().unitInfo(s),t.feeEstimate.textContent="".concat(o.fee/c.conventional.conversionFactor," ").concat(i),We.show(t.feeEstimateDiv);case 17:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),Sr=function(){function e(t,n,r){var a=this;i(this,e),h(this,"form",void 0),h(this,"success",void 0),h(this,"page",void 0),h(this,"knownExchanges",void 0),h(this,"dexToUpdate",void 0),h(this,"certPicker",void 0),this.form=t,this.success=n;var o=this.page=We.parseTemplate(t);this.certPicker=new Ar(t),We.bind(o.skipRegistration,"change",(function(){return a.showOrHideSubmitBttn()})),We.bind(o.showCustom,"click",(function(){We.hide(o.showCustom),We.show(o.customBox,o.auth)})),this.knownExchanges=Array.from(o.knownXCs.querySelectorAll(".known-exchange"));var s,c=fr(this.knownExchanges);try{var l=function(){var e=s.value;We.bind(e,"click",(function(){var t,n=e.dataset.host,r=fr(a.knownExchanges);try{for(r.s();!(t=r.n()).done;)t.value.classList.remove("selected")}catch(e){r.e(e)}finally{r.f()}return a.checkDEX(n)}))};for(c.s();!(s=c.n()).done;)l()}catch(e){c.e(e)}finally{c.f()}Mr(t,o.submit,(function(){return a.checkDEX()})),r&&(We.hide(o.addDexHdr,o.skipRegistrationBox),We.show(o.updateDexHdr),this.dexToUpdate=r),this.refresh()}var t,n;return d(e,[{key:"refresh",value:function(){var e=this.page;e.addr.value="",this.certPicker.clearCertFile(),We.hide(e.err),0===this.knownExchanges.length||this.dexToUpdate?(We.show(e.customBox,e.auth),We.hide(e.showCustom,e.knownXCs,e.pickServerMsg,e.addCustomMsg)):(We.hide(e.customBox),We.show(e.showCustom));var t,n=fr(this.knownExchanges);try{for(n.s();!(t=n.n()).done;)t.value.classList.remove("selected")}catch(e){n.e(e)}finally{n.f()}this.showOrHideSubmitBttn()}},{key:"showOrHideSubmitBttn",value:function(){var e=this.page;We.setVis(We.isDisplayed(e.customBox),e.auth)}},{key:"skipRegistration",value:function(){var e;return null!==(e=this.page.skipRegistration.checked)&&void 0!==e&&e}},{key:"animate",value:(n=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.form,We.animate(550,(function(e){t.style.transform="scale(".concat(.9+.1*e,")"),t.style.opacity=String(Math.pow(e,4))}),"easeOut");case 2:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"checkDEX",value:(t=s(f().mark((function e(t){var n,r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,We.hide(n.err),""!==(t=t||n.addr.value)){e.next=7;break}return n.err.textContent=ke("EMPTY_DEX_ADDRESS_MSG"),We.show(n.err),e.abrupt("return");case 7:return e.next=9,this.certPicker.file();case 9:return r=e.sent,a=this.skipRegistration(),this.dexToUpdate?(o="/api/updatedexhost",s={newHost:t,cert:r,oldHost:this.dexToUpdate}):(o=a?"/api/adddex":"/api/discoveracct",s={addr:t,cert:r}),i=vt().loading(this.form),e.next=15,S(o,s);case 15:if(c=e.sent,i(),vt().checkResponse(c)){e.next=20;break}return String(c.msg).includes("certificate required")?We.show(n.needCert):(n.err.textContent=c.msg,We.show(n.err)),e.abrupt("return");case 20:return e.next=22,vt().fetchUser();case 22:if(this.dexToUpdate||!(a||c.paid||Object.keys(c.xc.auth.pendingBonds).length>0)){e.next=26;break}return e.next=25,vt().loadPage("markets");case 25:return e.abrupt("return");case 26:this.success(c.xc,r);case 27:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})}]),e}(),Fr=function(){function e(t,n,r){var a=this;i(this,e),h(this,"form",void 0),h(this,"addr",void 0),h(this,"success",void 0),h(this,"page",void 0),this.form=t,this.addr=n,this.success=r;var o=this.page=We.parseTemplate(t);o.dexHost.textContent=n,Mr(t,o.submit,(function(){return a.checkDEX()}))}var t,n;return d(e,[{key:"animate",value:(n=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.form,We.animate(550,(function(e){t.style.transform="scale(".concat(.9+.1*e,")"),t.style.opacity=String(Math.pow(e,4))}),"easeOut");case 2:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"checkDEX",value:(t=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,We.hide(t.err),n={addr:this.addr},r=vt().loading(this.form),e.next=6,S("/api/discoveracct",n);case 6:if(a=e.sent,r(),vt().checkResponse(a)){e.next=12;break}return t.err.textContent=a.msg,We.show(t.err),e.abrupt("return");case 12:if(!a.paid){e.next=18;break}return e.next=15,vt().fetchUser();case 15:return e.next=17,vt().loadPage("markets");case 17:return e.abrupt("return");case 18:this.success(a.xc);case 19:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),Tr=function(){function e(t,n){var r=this;i(this,e),h(this,"form",void 0),h(this,"success",void 0),h(this,"page",void 0),this.success=n,this.form=t,Mr(t,(this.page=We.parseTemplate(t)).submit,(function(){r.submit()})),vt().registerNoteFeeder({login:function(e){r.handleLoginNote(e)}})}var t,n;return d(e,[{key:"handleLoginNote",value:function(e){if(""!==e.details){var t=We.idel(this.form,"loaderMsg");We.show(t),t&&(t.textContent=e.details)}}},{key:"focus",value:function(){this.page.pw.focus()}},{key:"refresh",value:function(){We.hide(this.page.errMsg),this.page.pw.value=""}},{key:"submit",value:(n=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,We.hide(t.errMsg),""!==(n=t.pw.value||"")){e.next=6;break}return We.showFormError(t.errMsg,ke(R)),e.abrupt("return");case 6:return r=vt().loading(this.form),e.next=9,S("/api/login",{pass:n});case 9:if(a=e.sent,r(),t.pw.value="",vt().checkResponse(a)){e.next=15;break}return We.showFormError(t.errMsg,a.msg),e.abrupt("return");case 15:return e.next=17,vt().fetchUser();case 17:a.notes=a.notes||[],a.notes.reverse(),a.pokes=a.pokes||[],vt().loggedIn(a.notes,a.pokes),this.success();case 22:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"animate",value:(t=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.form,We.animate(550,(function(e){t.style.transform="scale(".concat(.9+.1*e,")"),t.style.opacity=String(Math.pow(e,4))}),"easeOut");case 2:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),Dr=function(){function e(t){var n=this;i(this,e),h(this,"form",void 0),h(this,"page",void 0),h(this,"assetID",void 0),h(this,"addr",void 0),this.form=t;var r=this.page=We.idDescendants(t);We.cleanTemplates(r.unifiedReceiverTmpl),We.bind(r.newDepAddrBttn,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.newDepositAddress();case 1:case"end":return e.stop()}}),e)})))),window.isSecureContext?We.bind(r.copyAddressBtn,"click",(function(){n.copyAddress()})):We.hide(r.copyAddressBtn)}var t,n,r;return d(e,[{key:"setAsset",value:(r=s(f().mark((function e(t){var n,r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.assetID=t,n=this.page,We.hide(n.depositErr,n.depositTokenMsgBox,n.addrUsed),r=vt().assets[t],n.depositLogo.src=We.logoPath(r.symbol),a=vt().walletMap[t],n.depositName.textContent=r.unitInfo.conventional.unit,o=this.addr=a.address,!(2&a.traits)){e.next=14;break}return e.next=11,S("/api/addressused",{assetID:t,addr:o});case 11:s=e.sent,i=vt().checkResponse(s)&&s.used,We.setVis(i,n.addrUsed);case 14:r.token&&(c=vt().assets[r.token.parentID],n.depositTokenParentLogo.src=We.logoPath(c.symbol),n.depositTokenParentName.textContent=c.name,We.show(n.depositTokenMsgBox)),We.setVis(!!(2&a.traits),n.newDepAddrBttnBox),this.setAddress(o);case 17:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"setAddress",value:function(e){var t=this,n=this.page;if(We.hide(n.unifiedReceivers),e.startsWith("unified:")){var r=JSON.parse(e.substring(8));We.empty(n.unifiedReceivers),We.show(n.unifiedReceivers);for(var o=function(){var e=a(i[s],2),r=e[0],o=e[1],c=n.unifiedReceiverTmpl.cloneNode(!0);n.unifiedReceivers.appendChild(c),c.textContent=r,c.dataset.type=r,"unified"===r&&c.classList.add("selected"),We.bind(c,"click",(function(){for(var e=0,a=Array.from(n.unifiedReceivers.children);e<a.length;e++){var s=a[e];s.classList.toggle("selected",s.dataset.type===r)}t.setCentralAddress(o)}))},s=0,i=Object.entries(r);s<i.length;s++)o();e=r.unified}this.setCentralAddress(e)}},{key:"setCentralAddress",value:function(e){var t=this.page;t.depositAddress.textContent=e,t.qrcode.src="/generateqrcode?address=".concat(e)}},{key:"newDepositAddress",value:(n=s(f().mark((function e(){var t,n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.assetID,r=this.form,We.hide(t.depositErr),a=vt().loading(r),e.next=5,S("/api/depositaddress",{assetID:n});case 5:if(o=e.sent,a(),vt().checkResponse(o)){e.next=11;break}return t.depositErr.textContent=o.msg,We.show(t.depositErr),e.abrupt("return");case 11:vt().walletMap[n].address=o.address,this.setAddress(o.address),We.hide(t.addrUsed);case 14:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"handleTx",value:function(e,t){if(e===this.assetID&&2&vt().walletMap[e].traits){var n=this.page,r=this.addr;t.amount>0&&t.recipient===r&&We.show(n.addrUsed)}}},{key:"copyAddress",value:(t=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.page,n=this.addr,navigator.clipboard.writeText(n).then((function(){We.show(t.copyAlert),setTimeout((function(){We.hide(t.copyAlert)}),800)})).catch((function(e){console.error("Unable to copy: ",e)}));case 2:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),Ir=function(){function e(t,n){var r=this;i(this,e),h(this,"form",void 0),h(this,"page",void 0),h(this,"success",void 0),this.form=t,this.success=n,Mr(t,(this.page=We.idDescendants(t)).resetAppPWSubmitBtn,(function(){return r.resetAppPW()}))}var t;return d(e,[{key:"resetAppPW",value:(t=s(f().mark((function e(){var t,n,r,a,o,s=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n=t.newAppPassword.value||"",r=t.confirmNewAppPassword.value,""!==n){e.next=6;break}return We.showFormError(t.appPWResetErrMsg,ke(R)),e.abrupt("return");case 6:if(n===r){e.next=9;break}return We.showFormError(t.appPWResetErrMsg,ke(N)),e.abrupt("return");case 9:return a=vt().loading(this.form),e.next=12,S("/api/resetapppassword",{newPass:n,seed:t.seedInput.value});case 12:if(o=e.sent,a(),vt().checkResponse(o)){e.next=17;break}return We.showFormError(t.appPWResetErrMsg,o.msg),e.abrupt("return");case 17:We.isDisplayed(t.appPWResetErrMsg)&&We.hide(t.appPWResetErrMsg),t.appPWResetSuccessMsg.textContent=ke("PASSWORD_RESET_SUCCESS_MSG"),We.show(t.appPWResetSuccessMsg),setTimeout((function(){return s.success()}),3e3);case 21:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"focus",value:function(){this.page.newAppPassword.focus()}},{key:"refresh",value:function(){var e=this.page;e.newAppPassword.value="",e.confirmNewAppPassword.value="",e.seedInput.value="",We.hide(e.appPWResetSuccessMsg,e.appPWResetErrMsg)}}]),e}(),Ar=function(){function e(t){var n=this;i(this,e),h(this,"page",void 0);var r=this.page=We.parseTemplate(t);r.selectedCert.textContent=ke(j),We.bind(r.certFile,"change",(function(){return n.onCertFileChange()})),We.bind(r.removeCert,"click",(function(){return n.clearCertFile()})),We.bind(r.addCert,"click",(function(){return r.certFile.click()}))}var t,n;return d(e,[{key:"onCertFileChange",value:(n=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,(n=t.certFile.files)&&n.length){e.next=4;break}return e.abrupt("return");case 4:t.selectedCert.textContent=n[0].name,We.show(t.removeCert),We.hide(t.addCert);case 7:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"clearCertFile",value:function(){var e=this.page;e.certFile.value="",e.selectedCert.textContent=ke(j),We.hide(e.removeCert),We.show(e.addCert)}},{key:"file",value:(t=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(t=this.page).certFile.value){e.next=7;break}if(!(n=t.certFile.files)||!n.length){e.next=7;break}return e.next=6,n[0].text();case 6:return e.abrupt("return",e.sent);case 7:return e.abrupt("return","");case 8:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),Rr=function(){function e(t,n){var r=this;i(this,e),h(this,"page",void 0),h(this,"success",void 0),h(this,"assetID",void 0),h(this,"parentID",void 0),h(this,"txFee",void 0),h(this,"host",void 0),this.page=We.parseTemplate(t),this.success=n,We.bind(this.page.submit,"click",(function(){r.approve()}))}var t,n;return d(e,[{key:"setAsset",value:(n=s(f().mark((function e(t,n){var r,a,o,s,i,c,l,u,d,h,p,v,m,g,y;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.assetID=t,this.host=n,a=vt().assets[t],o=this.parentID=null===(r=a.token)||void 0===r?void 0:r.parentID,s=this.page,We.show(s.submissionElements),We.hide(s.txMsg,s.errMsg,s.addressBox,s.balanceBox,s.addressBox),We.empty(s.tokenSymbol),s.tokenSymbol.appendChild(We.symbolize(a,!0)),i=vt().exchanges[n].assets[t].version,e.next=12,S("/api/approvetokenfee",{assetID:a.id,version:i,approving:!0});case 12:c=e.sent,vt().checkResponse(c)?(l=vt().assets[o],u=l.unitInfo,d=l.wallet,h=d.address,p=d.balance.available,v=l.name,m=this.txFee=c.txFee,g="".concat(We.formatCoinValue(m,u)," ").concat(u.conventional.unit),(y=vt().fiatRatesMap[o])&&(g+=" (".concat(We.formatFiatConversion(m,y,u)," USD)")),s.feeEstimate.textContent=g,We.show(s.balanceBox),s.balance.textContent=We.formatCoinValue(p,u),s.parentTicker.textContent=u.conventional.unit,s.parentName.textContent=v,p<m&&(We.show(s.addressBox),s.address.textContent=h)):(s.errMsg.textContent=c.msg,We.show(s.errMsg));case 14:case"end":return e.stop()}}),e,this)}))),function(e,t){return n.apply(this,arguments)})},{key:"approve",value:(t=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.assetID,r=this.host,a=this.success,o=vt().assets[n],e.next=5,S("/api/approvetoken",{assetID:o.id,dexAddr:r});case 5:if(s=e.sent,vt().checkResponse(s)){e.next=10;break}return t.errMsg.textContent=s.msg,We.show(t.errMsg),e.abrupt("return");case 10:t.txid.innerText=s.txID,(i=Ln[o.id])&&i[vt().user.net]&&(t.txid.href=i[vt().user.net](s.txID)),We.hide(t.submissionElements,t.balanceBox,t.addressBox),We.show(t.txMsg),a&&a();case 16:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"handleBalanceNote",value:function(e){var t=this.page,n=this.parentID,r=this.txFee;e.assetID===n&&(t.balance.textContent=We.formatCoinValue(e.balance.available,vt().assets[n].unitInfo),e.balance.available>=r?We.hide(t.addressBox):We.hide(t.errMsg))}}]),e}(),Er=function(){function e(t,n){var r=this;i(this,e),h(this,"form",void 0),h(this,"page",void 0),h(this,"updated",void 0),h(this,"cexName",void 0),this.form=t,this.updated=n,this.page=We.parseTemplate(t),We.bind(this.page.cexSubmit,"click",(function(){return r.submit()}))}var t;return d(e,[{key:"setCEX",value:function(e){this.cexName=e,er(this.form,e);var t=this.page;We.hide(t.cexConfigPrompt,t.cexConnectErrBox,t.cexFormErr),t.cexApiKeyInput.value="",t.cexSecretInput.value="";var n=vt().mmStatus.cexes[e],r=null==n?void 0:n.connectErr;r?(We.show(t.cexConnectErrBox),t.cexConnectErr.textContent=r,t.cexApiKeyInput.value=n.config.apiKey,t.cexSecretInput.value=n.config.apiSecret):We.show(t.cexConfigPrompt)}},{key:"submit",value:(t=s(f().mark((function e(){var t,n,r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n=this.cexName,r=this.form,We.hide(t.cexFormErr),a=t.cexApiKeyInput.value,o=t.cexSecretInput.value,a&&o){e.next=8;break}return We.show(t.cexFormErr),t.cexFormErr.textContent=ke(R),e.abrupt("return");case 8:return s=vt().loading(r),e.prev=9,e.next=12,Jn.updateCEXConfig({name:n,apiKey:a,apiSecret:o});case 12:if(i=e.sent,vt().checkResponse(i)){e.next=15;break}throw i;case 15:this.updated(n,!0),e.next=23;break;case 18:e.prev=18,e.t0=e.catch(9),We.show(t.cexFormErr),t.cexFormErr.textContent=ke(H,{msg:null!==(c=e.t0.msg)&&void 0!==c?c:String(e.t0)}),this.updated(n,!1);case 23:return e.prev=23,s(),e.finish(23);case 26:case"end":return e.stop()}}),e,this,[[9,18,23,26]])}))),function(){return t.apply(this,arguments)})}]),e}(),Br=300;function Pr(e,t){return Lr.apply(this,arguments)}function Lr(){return(Lr=s(f().mark((function e(t,n){var r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=document.body.offsetWidth/2,e.next=3,We.animate(Br,(function(e){t.style.right="".concat(e*r,"px")}),"easeInHard");case 3:return We.hide(t),t.style.right="0",n.style.right=String(-r),We.show(n),n.querySelector("input")&&We.safeSelector(n,"input").focus(),e.next=10,We.animate(Br,(function(e){n.style.right="".concat(e*r-r,"px")}),"easeOutHard");case 10:n.style.right="0";case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Or(e,t){e.successMessage.textContent=t,We.show(e.forms,e.checkmarkForm),e.checkmarkForm.style.right="0",e.checkmark.style.fontSize="0px";var n=a(k.isDark()?[223,226,225]:[51,51,51],3),r=n[0],o=n[1],s=n[2],i=16-r,c=163-o,l=16-s;return new Ve(1200,(function(t){e.checkmark.style.fontSize="".concat(80*t,"px"),e.checkmark.style.color="rgb(".concat(r+t*i,", ").concat(o+t*c,", ").concat(s+t*l,")")}),"easeOutElastic")}function Mr(e,t,n){var r=function(e){e.preventDefault&&e.preventDefault(),n(e)};We.bind(t,"click",r),We.bind(e,"submit",r)}function qr(e){return Math.floor(e.getTime()/1e3)}function Nr(e){return function(e){return new Date(e.getTime()-60*e.getTimezoneOffset()*1e3)}(e).toISOString().split("T")[0]}function Wr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function Vr(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Vr=function(){return!!e})()}var Ur=function(e){g(k,e);var t,n,r,a,o,c,l,u,p,m,b=(t=k,n=Vr(),function(){var e,r=x(t);if(n){var a=x(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function k(e,t){var n;i(this,k),h(v(n=b.call(this)),"body",void 0),h(v(n),"data",void 0),h(v(n),"xc",void 0),h(v(n),"page",void 0),h(v(n),"dexAddrForm",void 0),h(v(n),"discoverAcctForm",void 0),h(v(n),"newWalletForm",void 0),h(v(n),"regAssetForm",void 0),h(v(n),"walletWaitForm",void 0),h(v(n),"confirmRegisterForm",void 0),n.body=e,n.data=t;var r=n.page=We.idDescendants(e);t.host&&r.dexAddrForm.classList.contains("selected")&&(r.dexAddrForm.classList.remove("selected"),r.discoverAcctForm.classList.add("selected"),r.discoverAcctForm.dataset.host=t.host);var a,o=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Wr(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Wr(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}(e.querySelectorAll(".form-closer"));try{for(o.s();!(a=o.n()).done;){var c=a.value;c!==r.resetPassFormCloser&&We.hide(c)}}catch(e){o.e(e)}finally{o.f()}n.newWalletForm=new gr(r.newWalletForm,(function(e){return n.newWalletCreated(e,n.confirmRegisterForm.tier)}),(function(){return n.animateRegAsset(r.newWalletForm)})),n.dexAddrForm=new Sr(r.dexAddrForm,function(){var e=s(f().mark((function e(t,a){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.requestFeepayment(r.dexAddrForm,t,a);case 1:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}());var l=r.discoverAcctForm.dataset.host;l&&(n.discoverAcctForm=new Fr(r.discoverAcctForm,l,function(){var e=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.requestFeepayment(r.discoverAcctForm,t,"");case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())),n.regAssetForm=new kr(r.regAssetForm,function(){var e=s(f().mark((function e(t,a){var o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t!==ft){e.next=3;break}return n.registerDEXSuccess(),e.abrupt("return");case 3:if(o=vt().assets[t],!(s=o.wallet)){e.next=17;break}return i=n.xc.bondAssets[o.symbol],e.next=9,n.getBondsFeeBuffer(t,r.regAssetForm);case 9:if(c=e.sent,n.confirmRegisterForm.setAsset(t,a,c),!(s.synced&&s.balance.available>=2*i.amount+c)){e.next=14;break}return n.animateConfirmForm(r.regAssetForm),e.abrupt("return");case 14:return n.walletWaitForm.setWallet(t,c,a),Pr(r.regAssetForm,r.walletWait),e.abrupt("return");case 17:n.confirmRegisterForm.tier=a,n.newWalletForm.setAsset(t),Pr(r.regAssetForm,r.newWalletForm);case 20:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()),n.walletWaitForm=new wr(r.walletWait,(function(){n.animateConfirmForm(r.walletWait)}),(function(){n.animateRegAsset(r.walletWait)})),n.confirmRegisterForm=new br(r.confirmRegForm,(function(){n.registerDEXSuccess()}),(function(){n.animateRegAsset(r.confirmRegForm)}));var u=We.safeSelector(r.forms,":scope > form.selected");switch(u.classList.remove("selected"),u){case r.dexAddrForm:n.dexAddrForm.animate();break;case r.discoverAcctForm:n.discoverAcctForm.animate()}return We.show(u),u===r.discoverAcctForm&&n.discoverAcctForm.page.submit.click(),vt().authed&&n.auth(),n}return d(k,[{key:"auth",value:(m=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,vt().fetchUser();case 2:case"end":return e.stop()}}),e)}))),function(){return m.apply(this,arguments)})},{key:"requestFeepayment",value:(p=s(f().mark((function e(t,n,r){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.xc=n,this.confirmRegisterForm.setExchange(n,r),this.walletWaitForm.setExchange(n),this.regAssetForm.setExchange(n,r),this.animateRegAsset(t);case 5:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return p.apply(this,arguments)})},{key:"animateRegAsset",value:(u=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:We.hide(t),this.regAssetForm.animate(),We.show(this.page.regAssetForm);case 3:case"end":return e.stop()}}),e,this)}))),function(e){return u.apply(this,arguments)})},{key:"animateConfirmForm",value:(l=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.confirmRegisterForm.animate(),We.hide(t),We.show(this.page.confirmRegForm);case 3:case"end":return e.stop()}}),e,this)}))),function(e){return l.apply(this,arguments)})},{key:"getBondsFeeBuffer",value:(c=s(f().mark((function e(t,n){var r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=vt().loading(n),e.next=3,S("/api/bondsfeebuffer",{assetID:t});case 3:if(a=e.sent,r(),vt().checkResponse(a)){e.next=7;break}return e.abrupt("return",0);case 7:return e.abrupt("return",a.feeBuffer);case 8:case"end":return e.stop()}}),e)}))),function(e,t){return c.apply(this,arguments)})},{key:"getCertFile",value:(o=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t="",!this.dexAddrForm.page.certFile.value){e.next=7;break}if(!(n=this.dexAddrForm.page.certFile.files)||!n.length){e.next=7;break}return e.next=6,n[0].text();case 6:t=e.sent;case 7:return e.abrupt("return",t);case 8:case"end":return e.stop()}}),e,this)}))),function(){return o.apply(this,arguments)})},{key:"registerDEXSuccess",value:(a=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,vt().fetchUser();case 2:return vt().updateMenuItemsDisplay(),e.next=5,vt().loadPage(this.data.backTo||"markets");case 5:case"end":return e.stop()}}),e,this)}))),function(){return a.apply(this,arguments)})},{key:"newWalletCreated",value:(r=s(f().mark((function e(t,n){var r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.regAssetForm.refresh(),e.next=3,vt().fetchUser();case 3:if(r=e.sent){e.next=6;break}return e.abrupt("return");case 6:return a=this.page,o=r.assets[t],s=o.wallet,i=this.xc.bondAssets[o.symbol].amount,e.next=12,this.getBondsFeeBuffer(t,a.newWalletForm);case 12:if(c=e.sent,this.walletWaitForm.setWallet(t,c,n),this.confirmRegisterForm.setAsset(t,n,c),!(s.synced&&s.balance.available>=2*i+c)){e.next=19;break}return e.next=18,this.animateConfirmForm(a.newWalletForm);case 18:return e.abrupt("return");case 19:return e.next=21,Pr(a.newWalletForm,a.walletWait);case 21:case"end":return e.stop()}}),e,this)}))),function(e,t){return r.apply(this,arguments)})}]),k}(ut);function _r(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(_r=function(){return!!e})()}var jr=function(e){g(o,e);var t,n,r,a=(t=o,n=_r(),function(){var e,r=x(t);if(n){var a=x(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function o(e){var t;i(this,o),h(v(t=a.call(this)),"loginForm",void 0),h(v(t),"page",void 0),h(v(t),"appPassResetForm",void 0);var n=t.page=We.idDescendants(e);t.loginForm=new Tr(n.loginForm,(function(){t.loggedIn()}));var r=function(){We.hide(n.resetAppPWForm),t.loginForm.refresh(),We.show(n.loginForm),t.loginForm.focus()};return r(),t.appPassResetForm=new Ir(n.resetAppPWForm,(function(){r()})),We.bind(n.forgotPassBtn,"click",(function(){t.appPassResetForm.refresh(),Pr(n.loginForm,n.resetAppPWForm)})),We.bind(n.resetPassFormCloser,"click",(function(){r()})),We.bind(n.forms,"mousedown",(function(e){!We.mouseInElement(e,n.resetAppPWForm)&&We.isDisplayed(n.resetAppPWForm)&&r()})),t}return d(o,[{key:"loggedIn",value:(r=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,vt().loadPage("wallets");case 2:case"end":return e.stop()}}),e)}))),function(){return r.apply(this,arguments)})}]),o}(ut);function Hr(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return zr(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?zr(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function zr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function Gr(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Gr=function(){return!!e})()}var Xr=1<<17,Kr=["TICKET_STATUS_UNKNOWN","TICKET_STATUS_UNMINED","TICKET_STATUS_IMMATURE","TICKET_STATUS_LIVE","TICKET_STATUS_VOTED","TICKET_STATUS_MISSED","TICKET_STATUS_EXPIRED","TICKET_STATUS_UNSPENT","TICKET_STATUS_REVOKED"],Qr=[2,4,5,8,14,15],Yr=[1,3,7,13,16],Jr=[6,9,10,12];function Zr(e){return Qr.includes(e)?["+","positive-tx"]:Yr.includes(e)?["-","negative-tx"]:["",""]}var $r=["TX_TYPE_UNKNOWN","TX_TYPE_SEND","TX_TYPE_RECEIVE","TX_TYPE_SWAP","TX_TYPE_REDEEM","TX_TYPE_REFUND","TX_TYPE_SPLIT","TX_TYPE_CREATE_BOND","TX_TYPE_REDEEM_BOND","TX_TYPE_APPROVE_TOKEN","TX_TYPE_ACCELERATION","TX_TYPE_SELF_TRANSFER","TX_TYPE_REVOKE_TOKEN_APPROVAL","TX_TYPE_TICKET_PURCHASE","TX_TYPE_TICKET_VOTE","TX_TYPE_TICKET_REVOCATION","TX_TYPE_SWAP_OR_SEND","TX_TYPE_MIX"];function ea(e){return ke($r[e])}var ta,na,ra=10,aa=0,oa=function(e){g(ve,e);var t,n,o,c,l,u,p,m,b,w,C,F,T,D,I,E,B,P,L,O,M,q,N,W,V,U,_,j,z,X,K,Q,Y,J,Z,$,ee,te,ne,re,ae,oe,se,ie,ce,le,ue,de,he,pe,fe=(t=ve,n=Gr(),function(){var e,r=x(t);if(n){var a=x(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function ve(e,t){var n;i(this,ve),h(v(n=fe.call(this)),"body",void 0),h(v(n),"data",void 0),h(v(n),"page",void 0),h(v(n),"assetButtons",void 0),h(v(n),"newWalletForm",void 0),h(v(n),"reconfigForm",void 0),h(v(n),"walletCfgGuide",void 0),h(v(n),"depositAddrForm",void 0),h(v(n),"keyup",void 0),h(v(n),"changeWalletPW",void 0),h(v(n),"displayed",void 0),h(v(n),"animation",void 0),h(v(n),"forms",void 0),h(v(n),"forceReq",void 0),h(v(n),"forceUrl",void 0),h(v(n),"currentForm",void 0),h(v(n),"restoreInfoCard",void 0),h(v(n),"selectedAssetID",void 0),h(v(n),"stakeStatus",void 0),h(v(n),"maxSend",void 0),h(v(n),"unapprovingTokenVersion",void 0),h(v(n),"ticketPage",void 0),h(v(n),"oldestTx",void 0),h(v(n),"currTx",void 0),h(v(n),"mixing",void 0),h(v(n),"mixerToggle",void 0),h(v(n),"stampers",void 0),h(v(n),"secondTicker",void 0),n.body=e,n.data=t;var r=n.page=We.idDescendants(e);n.stampers=[],aa=vt().user.net,n.secondTicker=window.setInterval((function(){!function(){var e,t=Hr(n.stampers);try{for(t.s();!(e=t.n()).done;){var r=e.value;r.dataset.stamp&&(r.textContent=We.timeSince(1e3*parseInt(r.dataset.stamp||"")))}}catch(e){t.e(e)}finally{t.f()}}()}),1e4),We.cleanTemplates(r.restoreInfoCard,r.connectedIconTmpl,r.disconnectedIconTmpl,r.removeIconTmpl),n.restoreInfoCard=r.restoreInfoCard.cloneNode(!0),We.show(r.connectedIconTmpl,r.disconnectedIconTmpl,r.removeIconTmpl),n.forms=We.applySelector(r.forms,":scope > form"),r.forms.querySelectorAll(".form-closer").forEach((function(e){We.bind(e,"click",(function(){n.closePopups()}))})),We.bind(r.cancelForce,"click",(function(){n.closePopups()})),n.selectedAssetID=-1,We.cleanTemplates(r.iconSelectTmpl,r.balanceDetailRow,r.recentOrderTmpl,r.vspRowTmpl,r.ticketHistoryRowTmpl,r.votingChoiceTmpl,r.votingAgendaTmpl,r.tspendTmpl,r.tkeyTmpl,r.txHistoryRowTmpl,r.txHistoryDateRowTmpl),We.bind(r.createWallet,"click",(function(){return n.showNewWallet(n.selectedAssetID)})),We.bind(r.connectBttn,"click",(function(){return n.doConnect(n.selectedAssetID)})),We.bind(r.send,"click",(function(){return n.showSendForm(n.selectedAssetID)})),We.bind(r.receive,"click",(function(){return n.showDeposit(n.selectedAssetID)})),We.bind(r.unlockBttn,"click",(function(){return n.openWallet(n.selectedAssetID)})),We.bind(r.lockBttn,"click",(function(){return n.lock(n.selectedAssetID)})),We.bind(r.reconfigureBttn,"click",(function(){return n.showReconfig(n.selectedAssetID)})),We.bind(r.needsProviderBttn,"click",(function(){return n.showReconfig(n.selectedAssetID)})),We.bind(r.rescanWallet,"click",(function(){return n.rescanWallet(n.selectedAssetID)})),We.bind(r.earlierTxs,"click",(function(){return n.loadEarlierTxs()})),We.bind(r.copyTxIDBtn,"click",(function(){var e;at((null===(e=n.currTx)||void 0===e?void 0:e.id)||"",r.txDetailsID,r.copyTxIDBtn,"#1e7d11")})),We.bind(r.copyRecipientBtn,"click",(function(){var e;at((null===(e=n.currTx)||void 0===e?void 0:e.recipient)||"",r.txDetailsRecipient,r.copyRecipientBtn,"#1e7d11")})),We.bind(r.copyBondIDBtn,"click",(function(){var e,t;at((null===(e=n.currTx)||void 0===e||null===(t=e.bondInfo)||void 0===t?void 0:t.bondID)||"",r.txDetailsBondID,r.copyBondIDBtn,"#1e7d11")})),We.bind(r.copyBondAccountIDBtn,"click",(function(){var e,t;at((null===(e=n.currTx)||void 0===e||null===(t=e.bondInfo)||void 0===t?void 0:t.accountID)||"",r.txDetailsBondAccountID,r.copyBondAccountIDBtn,"#1e7d11")})),We.bind(r.hideMixTxsCheckbox,"change",(function(){n.showTxHistory(n.selectedAssetID)})),n.newWalletForm=new gr(r.newWalletForm,(function(e){var t={assetName:vt().assets[e].name};n.assetUpdated(e,r.newWalletForm,ke("NEW_WALLET_SUCCESS",t)),n.sortAssetButtons(),n.updateTicketBuyer(e),n.updatePrivacy(e)})),n.reconfigForm=new xr(r.reconfigInputs,!1),n.walletCfgGuide=We.tmplElement(r.reconfigForm,"walletCfgGuide"),Mr(r.sendForm,r.submitSendForm,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.stepSend();case 1:case"end":return e.stop()}}),e)})))),Mr(r.vSendForm,r.vSend,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.send();case 1:case"end":return e.stop()}}),e)})))),Mr(r.reconfigForm,r.submitReconfig,(function(){return n.reconfig()})),r.forms.querySelectorAll(".form-closer").forEach((function(e){We.bind(e,"click",(function(){return n.closePopups()}))})),We.bind(r.forms,"mousedown",(function(e){We.mouseInElement(e,n.currentForm)||n.closePopups()})),n.mixerToggle=new je(r.toggleMixer,r.mixingErr,!1,(function(e){return n.updateMixerState(e)})),n.keyup=function(e){"Escape"===e.key&&We.isDisplayed(n.page.forms)&&n.closePopups()},We.bind(document,"keyup",n.keyup),We.bind(r.downloadLogs,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.downloadLogs();case 1:case"end":return e.stop()}}),e)})))),We.bind(r.exportWallet,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.displayExportWalletAuth();case 1:case"end":return e.stop()}}),e)})))),We.bind(r.recoverWallet,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.showRecoverWallet();case 1:case"end":return e.stop()}}),e)})))),Mr(r.exportWalletAuth,r.exportWalletAuthSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.exportWalletAuthSubmit();case 1:case"end":return e.stop()}}),e)})))),Mr(r.recoverWalletConfirm,r.recoverWalletSubmit,(function(){n.recoverWallet()})),Mr(r.confirmForce,r.confirmForceSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.confirmForceSubmit();case 1:case"end":return e.stop()}}),e)})))),We.bind(r.disableWallet,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.showToggleWalletStatus(!0);case 1:case"end":return e.stop()}}),e)})))),We.bind(r.enableWallet,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.showToggleWalletStatus(!1);case 1:case"end":return e.stop()}}),e)})))),Mr(r.toggleWalletStatusConfirm,r.toggleWalletStatusSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.toggleWalletStatus();case 1:case"end":return e.stop()}}),e)})))),We.bind(r.managePeers,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.showManagePeersForm();case 1:case"end":return e.stop()}}),e)})))),We.bind(r.addPeerSubmit,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.submitAddPeer();case 1:case"end":return e.stop()}}),e)})))),We.bind(r.unapproveTokenAllowance,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.showUnapproveTokenAllowanceTableForm();case 1:case"end":return e.stop()}}),e)})))),We.bind(r.unapproveTokenSubmit,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.submitUnapproveTokenAllowance();case 1:case"end":return e.stop()}}),e)})))),We.bind(r.showVSPs,"click",(function(){n.showVSPPicker()})),We.bind(r.vspDisplay,"click",(function(){n.showVSPPicker()})),Mr(r.vspPicker,r.customVspSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.setCustomVSP();case 1:case"end":return e.stop()}}),e)})))),We.bind(r.purchaseTicketsBttn,"click",(function(){n.showPurchaseTicketsDialog()})),Mr(r.purchaseTicketsForm,r.purchaserSubmit,(function(){n.purchaseTickets()})),We.bind(r.purchaserInput,"change",(function(){n.purchaserInputChanged()})),We.bind(r.ticketHistory,"click",(function(){n.showTicketHistory()})),We.bind(r.ticketHistoryNextPage,"click",(function(){n.nextTicketPage()})),We.bind(r.ticketHistoryPrevPage,"click",(function(){n.prevTicketPage()})),We.bind(r.setVotes,"click",(function(){n.showSetVotesDialog()})),We.bind(r.purchaseTicketsErrCloser,"click",(function(){We.hide(r.purchaseTicketsErrBox)})),We.bind(r.privacyInfoBttn,"click",(function(){n.showForm(r.mixingInfo)})),n.depositAddrForm=new Dr(r.deposit),We.bind(r.walletBal,"click",(function(){n.populateMaxSend()})),We.bind(r.sendAmt,"input",(function(){var e=vt().assets[n.selectedAssetID].unitInfo,t=nt(r.sendAmt.value),a=e.conventional.conversionFactor;We.showFiatValue(r.sendValue,t*a,vt().fiatRatesMap[n.selectedAssetID],e)})),We.bind(r.maxSend,"click",(function(){n.populateMaxSend()})),We.bind(r.sendAddr,"input",s(f().mark((function e(){var t,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=vt().assets[n.selectedAssetID],r.sendAddr.classList.remove("border-danger","border-success"),a=r.sendAddr.value||"",t&&""!==a){e.next=5;break}return e.abrupt("return");case 5:return e.next=7,n.validateSendAddress(a,t.id);case 7:e.sent?r.sendAddr.classList.add("border-success"):r.sendAddr.classList.add("border-danger");case 9:case"end":return e.stop()}}),e)})))),We.bind(r.showChangePW,"click",(function(){n.changeWalletPW=!n.changeWalletPW,n.setPWSettingViz(n.changeWalletPW)})),We.bind(r.changeWalletTypeSelect,"change",(function(){n.changeWalletType()})),We.bind(r.showChangeType,"click",(function(){We.isHidden(r.changeWalletType)?(We.show(r.changeWalletType,r.changeTypeHideIcon),We.hide(r.changeTypeShowIcon),r.changeTypeMsg.textContent=ke("KEEP_WALLET_TYPE")):n.showReconfig(n.selectedAssetID,{skipAnimation:!0})})),vt().registerNoteFeeder({fiatrateupdate:function(e){n.handleRatesNote(e)},balance:function(e){n.handleBalanceNote(e)},walletstate:function(e){n.handleWalletStateNote(e)},walletconfig:function(e){n.handleWalletStateNote(e)},walletsync:function(e){n.updateSyncAndPeers(e.assetID)},createwallet:function(e){n.handleCreateWalletNote(e)},walletnote:function(e){n.handleCustomWalletNote(e)}});var a=n.sortAssetButtons().id,o=k.fetchLocal(k.selectedAssetLK);return o&&(a=Number(o)),n.setSelectedAsset(a),setInterval((function(){var e,t=Hr(n.page.txHistoryTableBody.children);try{for(t.s();!(e=t.n()).done;){var r=e.value,a=We.tmplElement(r,"age");a.textContent=We.timeSince(parseInt(a.dataset.timestamp))}}catch(e){t.e(e)}finally{t.f()}}),5e3),n}return d(ve,[{key:"closePopups",value:function(){We.hide(this.page.forms),this.currTx=void 0,this.animation&&this.animation.stop()}},{key:"safePost",value:(pe=s(f().mark((function e(t,n){var r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=this.selectedAssetID,e.next=3,S(t,n);case 3:if(a=e.sent,r===this.selectedAssetID){e.next=6;break}throw Error("asset changed during request. aborting");case 6:return e.abrupt("return",a);case 7:case"end":return e.stop()}}),e,this)}))),function(e,t){return pe.apply(this,arguments)})},{key:"stepSend",value:(he=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l,u,d,h,p,v,m,g,y,x,b,k,w,C;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,We.hide(t.vSendErr,t.sendErr,t.vSendEstimates,t.txFeeNotAvailable),n=parseInt(t.sendForm.dataset.assetID||""),r=vt().assets[n].token,a=t.subtractCheckBox.checked||!1,o=vt().unitInfo(n).conventional.conversionFactor,s=Math.round(nt(t.sendAmt.value,0)*o),""!==(i=t.sendAddr.value||"")){e.next=10;break}return e.abrupt("return",We.showFormError(t.sendErr,ke(G,{address:i})));case 10:if(c=vt().assets[n],l=c.wallet,u=c.unitInfo,d=c.symbol,h=0,!(512&l.traits)){e.next=36;break}return p={addr:t.sendAddr.value,assetID:n,subtract:a,value:s},v=vt().loading(t.sendForm),e.next=17,S("/api/txfee",p);case 17:if(m=e.sent,v(),vt().checkResponse(m)){e.next=29;break}return t.txFeeNotAvailable.dataset.tooltip=ke("TXFEE_ERR_MSG",{err:m.msg}),We.show(t.txFeeNotAvailable),e.next=24,this.validateSendAddress(i,n);case 24:if(e.sent){e.next=27;break}return e.abrupt("return",We.showFormError(t.sendErr,ke(G,{address:i||""})));case 27:e.next=34;break;case 29:if(!m.ok){e.next=34;break}if(m.validaddress){e.next=32;break}return e.abrupt("return",We.showFormError(t.sendErr,ke(G,{address:t.sendAddr.value||""})));case 32:h=m.txfee,We.show(t.vSendEstimates);case 34:e.next=41;break;case 36:return e.next=38,this.validateSendAddress(i,n);case 38:if(e.sent){e.next=41;break}return e.abrupt("return",We.showFormError(t.sendErr,ke(G,{address:i||""})));case 41:return t.vSendSymbol.textContent=d.toUpperCase(),t.vSendLogo.src=We.logoPath(d),r?(g=vt().assets[r.parentID],y=g.unitInfo,x=g.symbol,t.vSendFee.textContent=We.formatFullPrecision(h,y)+" "+x):t.vSendFee.textContent=We.formatFullPrecision(h,u),b=vt().fiatRatesMap[n],We.showFiatValue(t.vSendFeeFiat,h,b,u),t.vSendDestinationAmt.textContent=We.formatFullPrecision(s-h,u),t.vTotalSend.textContent=We.formatFullPrecision(s,u),We.showFiatValue(t.vTotalSendFiat,s,b,u),t.vSendAddr.textContent=t.sendAddr.value||"",k=l.balance.available-s,t.balanceAfterSend.textContent=We.formatFullPrecision(k,u),We.showFiatValue(t.balanceAfterSendFiat,k,b,u),We.show(t.approxSign),a||(We.hide(t.approxSign),t.vSendDestinationAmt.textContent=We.formatFullPrecision(s,u),w=s,r||(w+=h),t.vTotalSend.textContent=We.formatFullPrecision(w,u),We.showFiatValue(t.vTotalSendFiat,w,b,u),C=l.balance.available-s,r||(C-=h),C<=0?(t.balanceAfterSend.textContent=We.formatFullPrecision(0,u),We.showFiatValue(t.balanceAfterSendFiat,0,b,u)):(t.balanceAfterSend.textContent=We.formatFullPrecision(C,u),We.showFiatValue(t.balanceAfterSendFiat,C,b,u))),We.hide(t.sendForm),e.next=58,this.showForm(t.vSendForm);case 58:case"end":return e.stop()}}),e,this)}))),function(){return he.apply(this,arguments)})},{key:"cancelSend",value:(de=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,We.hide(t.vSendForm,t.sendErr),e.next=4,this.showForm(t.sendForm);case 4:case"end":return e.stop()}}),e,this)}))),function(){return de.apply(this,arguments)})},{key:"validateSendAddress",value:(ue=s(f().mark((function e(t,n){var r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/validateaddress",{addr:t,assetID:n});case 2:return r=e.sent,e.abrupt("return",vt().checkResponse(r));case 4:case"end":return e.stop()}}),e)}))),function(e,t){return ue.apply(this,arguments)})},{key:"setPWSettingViz",value:function(e){var t=this.page;if(e)return We.hide(t.showIcon),We.show(t.hideIcon,t.changePW),void(t.switchPWMsg.textContent=ke("KEEP_WALLET_PASS"));We.hide(t.hideIcon,t.changePW),We.show(t.showIcon),t.switchPWMsg.textContent=ke("NEW_WALLET_PASS")}},{key:"assetVersionUsedByDEXes",value:function(){var e=this.selectedAssetID,t={},n=vt().exchanges;for(var r in n){var a=n[r],o=a.assets[e];o&&(t[o.version]||(t[o.version]=[]),t[o.version].push(a.host))}return t}},{key:"submitUnapproveTokenAllowance",value:(le=s(f().mark((function e(){var t,n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,e.next=4,S("/api/unapprovetoken",{assetID:this.selectedAssetID,version:this.unapprovingTokenVersion});case 4:if(n=e.sent,vt().checkResponse(n)){e.next=9;break}return t.unapproveTokenErr.textContent=n.msg,We.show(t.unapproveTokenErr),e.abrupt("return");case 9:(r=Ln[this.selectedAssetID])&&r[aa]&&(t.unapproveTokenTxID.href=r[aa](n.txID)),t.unapproveTokenTxID.textContent=n.txID,We.hide(t.unapproveTokenSubmissionElements,t.unapproveTokenErr),We.show(t.unapproveTokenTxMsg);case 14:case"end":return e.stop()}}),e,this)}))),function(){return le.apply(this,arguments)})},{key:"showUnapproveTokenAllowanceForm",value:(ce=s(f().mark((function e(t){var n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,this.unapprovingTokenVersion=t,We.show(n.unapproveTokenSubmissionElements),We.hide(n.unapproveTokenTxMsg,n.unapproveTokenErr),(r=vt().assets[this.selectedAssetID])&&r.token){e.next=7;break}return e.abrupt("return");case 7:if(a=vt().assets[r.token.parentID]){e.next=10;break}return e.abrupt("return");case 10:return We.empty(n.tokenAllowanceRemoveSymbol),n.tokenAllowanceRemoveSymbol.appendChild(We.symbolize(r,!0)),n.tokenAllowanceRemoveVersion.textContent=t.toString(),e.next=16,S("/api/approvetokenfee",{assetID:this.selectedAssetID,version:t,approving:!1});case 16:o=e.sent,vt().checkResponse(o)?(s="".concat(We.formatCoinValue(o.txFee,a.unitInfo)," ").concat(a.unitInfo.conventional.unit),(i=vt().fiatRatesMap[a.id])&&(s+=" (".concat(We.formatFiatConversion(o.txFee,i,a.unitInfo)," USD)")),n.unapprovalFeeEstimate.textContent=s):(n.unapproveTokenErr.textContent=o.msg,We.show(n.unapproveTokenErr)),this.showForm(n.unapproveTokenForm);case 19:case"end":return e.stop()}}),e,this)}))),function(e){return ce.apply(this,arguments)})},{key:"showUnapproveTokenAllowanceTableForm",value:(ie=s(f().mark((function e(){var t,n,r,a,o,s,i=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,(n=vt().assets[this.selectedAssetID])&&n.wallet&&n.wallet.approved){e.next=4;break}return e.abrupt("return");case 4:for(;t.tokenVersionBody.firstChild;)t.tokenVersionBody.removeChild(t.tokenVersionBody.firstChild);We.empty(t.tokenVersionTableAssetSymbol),t.tokenVersionTableAssetSymbol.appendChild(We.symbolize(n,!0)),r=this.assetVersionUsedByDEXes(),a=!1,o=f().mark((function e(o){var s,c,l,u;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(void 0!==(s=n.wallet.approved[o])&&s===ht.Approved){e.next=3;break}return e.abrupt("return","continue");case 3:a=!0,c=t.tokenVersionRow.cloneNode(!0),(l=We.parseTemplate(c)).version.textContent=o.toString(),r[o]&&(l.usedBy.textContent=r[o].join(", ")),u=i.page.removeIconTmpl.cloneNode(!0),We.bind(u,"click",(function(){i.showUnapproveTokenAllowanceForm(o)})),l.remove.appendChild(u),t.tokenVersionBody.appendChild(c);case 12:case"end":return e.stop()}}),e)})),s=0;case 11:if(!(s<=n.wallet.version)){e.next=19;break}return e.delegateYield(o(s),"t0",13);case 13:if("continue"!==e.t0){e.next=16;break}return e.abrupt("continue",16);case 16:s++,e.next=11;break;case 19:We.setVis(a,t.tokenVersionTable),We.setVis(!a,t.tokenVersionNone),this.showForm(t.unapproveTokenTableForm);case 22:case"end":return e.stop()}}),e,this)}))),function(){return ie.apply(this,arguments)})},{key:"updateWalletPeersTable",value:(se=s(f().mark((function e(){var t,n,r,a,o,i,c=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,We.hide(t.peerSpinner),e.next=4,S("/api/getwalletpeers",{assetID:this.selectedAssetID});case 4:if(n=e.sent,vt().checkResponse(n)){e.next=9;break}return t.managePeersErr.textContent=n.msg,We.show(t.managePeersErr),e.abrupt("return");case 9:for(;t.peersTableBody.firstChild;)t.peersTableBody.removeChild(t.peersTableBody.firstChild);(r=n.peers||[]).sort((function(e,t){return e.source-t.source})),a=ke("DEFAULT"),o=ke("ADDED"),i=ke("DISCOVERED"),r.forEach((function(e){var n,r=t.peerTableRow.cloneNode(!0),l=We.parseTemplate(r);switch(l.addr.textContent=e.addr,e.source){case pt.WalletDefault:l.source.textContent=a;break;case pt.UserAdded:l.source.textContent=o;break;case pt.Discovered:l.source.textContent=i}if(n=e.connected?c.page.connectedIconTmpl.cloneNode(!0):c.page.disconnectedIconTmpl.cloneNode(!0),l.connected.appendChild(n),e.source===pt.UserAdded){var u=c.page.removeIconTmpl.cloneNode(!0);We.bind(u,"click",s(f().mark((function n(){var r;return f().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return We.hide(t.managePeersErr),n.next=3,S("/api/removewalletpeer",{assetID:c.selectedAssetID,addr:e.addr});case 3:if(r=n.sent,vt().checkResponse(r)){n.next=8;break}return t.managePeersErr.textContent=r.msg,We.show(t.managePeersErr),n.abrupt("return");case 8:c.spinUntilPeersUpdate();case 9:case"end":return n.stop()}}),n)})))),l.remove.appendChild(u)}t.peersTableBody.appendChild(r)}));case 16:case"end":return e.stop()}}),e,this)}))),function(){return se.apply(this,arguments)})},{key:"showManagePeersForm",value:(oe=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,e.next=3,this.updateWalletPeersTable();case 3:We.hide(t.managePeersErr),this.showForm(t.managePeersForm);case 5:case"end":return e.stop()}}),e,this)}))),function(){return oe.apply(this,arguments)})},{key:"submitAddPeer",value:(ae=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,We.hide(t.managePeersErr),e.next=4,S("/api/addwalletpeer",{assetID:this.selectedAssetID,addr:t.addPeerInput.value});case 4:if(n=e.sent,vt().checkResponse(n)){e.next=9;break}return t.managePeersErr.textContent=n.msg,We.show(t.managePeersErr),e.abrupt("return");case 9:this.spinUntilPeersUpdate(),t.addPeerInput.value="";case 11:case"end":return e.stop()}}),e,this)}))),function(){return ae.apply(this,arguments)})},{key:"spinUntilPeersUpdate",value:(re=s(f().mark((function e(){var t,n=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.page,We.show(t.peerSpinner),setTimeout((function(){We.isDisplayed(t.peerSpinner)&&n.updateWalletPeersTable()}),1e4);case 3:case"end":return e.stop()}}),e,this)}))),function(){return re.apply(this,arguments)})},{key:"showToggleWalletStatus",value:function(e){var t=this.page;We.hide(t.toggleWalletStatusErr,t.walletStatusDisable,t.disableWalletMsg,t.walletStatusEnable,t.enableWalletMsg),e?We.show(t.walletStatusDisable,t.disableWalletMsg):We.show(t.walletStatusEnable,t.enableWalletMsg),this.showForm(t.toggleWalletStatusConfirm)}},{key:"toggleWalletStatus",value:(ne=s(f().mark((function e(){var t,n,r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,We.hide(t.toggleWalletStatusErr),n=vt().assets[this.selectedAssetID],r=!n.wallet.disabled,a={assetID:this.selectedAssetID,disable:r},o={assetName:n.name},s=vt().loading(t.toggleWalletStatusConfirm),e.next=10,S("/api/togglewalletstatus",a);case 10:if(i=e.sent,s(),vt().checkResponse(i)){e.next=16;break}return i.code===A.activeOrdersErr?t.toggleWalletStatusErr.textContent=ke("ACTIVE_ORDERS_ERR_MSG",o):t.toggleWalletStatusErr.textContent=i.msg,We.show(t.toggleWalletStatusErr),e.abrupt("return");case 16:c=ke("WALLET_DISABLED",o),r||(c=ke("WALLET_ENABLED",o)),this.assetUpdated(this.selectedAssetID,t.toggleWalletStatusConfirm,c);case 19:case"end":return e.stop()}}),e,this)}))),function(){return ne.apply(this,arguments)})},{key:"showBox",value:(te=s(f().mark((function e(t,n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.style.opacity="0",We.show(t),n&&n.focus(),e.next=5,We.animate(300,(function(e){t.style.opacity="".concat(e)}),"easeOut");case 5:t.style.opacity="1",this.displayed=t;case 7:case"end":return e.stop()}}),e,this)}))),function(e,t){return te.apply(this,arguments)})},{key:"showForm",value:(ee=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,this.currentForm=t,this.forms.forEach((function(e){return We.hide(e)})),t.style.right="10000px",We.show(n.forms,t),r=(n.forms.offsetWidth+t.offsetWidth)/2,e.next=8,We.animate(300,(function(e){t.style.right="".concat((1-e)*r,"px")}),"easeOutHard");case 8:t.style.right="0";case 9:case"end":return e.stop()}}),e,this)}))),function(e){return ee.apply(this,arguments)})},{key:"showSuccess",value:($=s(f().mark((function e(t){var n=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.forms.forEach((function(e){return We.hide(e)})),this.currentForm=this.page.checkmarkForm,this.animation=Or(this.page,t),e.next=5,this.animation.wait();case 5:this.animation=new Ve(1500,(function(){}),"",(function(){n.currentForm===n.page.checkmarkForm&&n.closePopups()}));case 6:case"end":return e.stop()}}),e,this)}))),function(e){return $.apply(this,arguments)})},{key:"showNewWallet",value:(Z=s(f().mark((function e(t){var n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,r=n.newWalletForm,this.newWalletForm.setAsset(t),a=this.newWalletForm.loadDefaults(),e.next=6,this.showForm(r);case 6:return e.next=8,a;case 8:case"end":return e.stop()}}),e,this)}))),function(e){return Z.apply(this,arguments)})},{key:"sortAssetButtons",value:function(){var e=this,t=this.page;this.assetButtons={},We.empty(t.assetSelect);var n=r(Object.values(vt().assets));n.sort((function(e,t){if(e.wallet&&!t.wallet)return-1;if(!e.wallet&&t.wallet)return 1;if(!e.wallet&&!t.wallet)return"dcr"===e.symbol?-1:1;var n=[e.wallet.balance,t.wallet.balance],r=n[0],a=n[1],o=r.available+r.immature+r.locked,s=a.available+a.immature+a.locked;if(0===o&&0===s)return e.symbol.localeCompare(t.symbol);if(0===o)return 1;if(0===o)return-1;var i=[vt().fiatRatesMap[e.id],vt().fiatRatesMap[t.id]],c=i[0],l=i[1];return c&&!l?-1:!c&&l?1:l*s-c*o}));var a,o=Hr(n);try{var s=function(){var n=a.value,r=t.iconSelectTmpl.cloneNode(!0);t.assetSelect.appendChild(r);var o=We.parseTemplate(r);e.assetButtons[n.id]={tmpl:o,bttn:r},e.updateAssetButton(n.id),We.bind(r,"click",(function(){e.setSelectedAsset(n.id),k.storeLocal(k.selectedAssetLK,String(n.id))}))};for(o.s();!(a=o.n()).done;)s()}catch(e){o.e(e)}finally{o.f()}return t.assetSelect.classList.remove("invisible"),n[0]}},{key:"updateAssetButton",value:function(e){var t,n=vt().assets[e],r=this.assetButtons[e],o=r.bttn,s=r.tmpl;We.hide(s.fiatBox,s.noWallet),o.classList.add("nowallet"),(t=s.img).src||(t.src=We.logoPath(n.symbol));var i=n.symbol.split(".");if(2===i.length){var c,l=i[1];s.parentImg.classList.remove("d-hide"),(c=s.parentImg).src||(c.src=We.logoPath(l))}if(this.selectedAssetID===e&&o.classList.add("selected"),s.name.textContent=n.name,n.wallet){o.classList.remove("nowallet");var u=n.wallet.balance,d=n.unitInfo,h=u.available+u.locked+u.immature,p=a(We.formatBestUnitsFourSigFigs(h,d),2),f=p[0],v=p[1];s.balance.textContent=f,s.unit.textContent=v,We.show(s.balanceBox);var m=vt().fiatRatesMap[n.id];m&&(We.show(s.fiatBox),s.fiat.textContent=We.formatFourSigFigs(h/d.conventional.conversionFactor*m))}else We.show(s.noWallet)}},{key:"setSelectedAsset",value:(J=s(f().mark((function e(t){var n,r,a,o,s,i,c,l,u,d;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=this.page.assetSelect,r=Hr(n.children);try{for(r.s();!(a=r.n()).done;)a.value.classList.remove("selected")}catch(e){r.e(e)}finally{r.f()}this.assetButtons[t].bttn.classList.add("selected"),this.selectedAssetID=t,this.page.hideMixTxsCheckbox.checked=!0,this.updateDisplayedAsset(t),this.showAvailableMarkets(t),o=this.showRecentActivity(t),s=this.showTxHistory(t),i=this.updateTicketBuyer(t),c=this.updatePrivacy(t),l=0,u=[o,s,i,c];case 13:if(!(l<u.length)){e.next=20;break}return d=u[l],e.next=17,d;case 17:l++,e.next=13;break;case 20:case"end":return e.stop()}}),e,this)}))),function(e){return J.apply(this,arguments)})},{key:"updateDisplayedAsset",value:function(e){if(e===this.selectedAssetID){var t=vt().assets[e],n=t.symbol,r=t.wallet,a=t.name,o=t.token,s=t.unitInfo,i=this.page,c=this.body;if(We.setText(c,"[data-asset-name]",a),We.setText(c,"[data-ticker]",s.conventional.unit),i.assetLogo.src=We.logoPath(n),We.hide(i.balanceBox,i.fiatBalanceBox,i.createWallet,i.walletDetails,i.sendReceive,i.connectBttnBox,i.statusLocked,i.statusReady,i.statusOff,i.unlockBttnBox,i.lockBttnBox,i.connectBttnBox,i.peerCountBox,i.syncProgressBox,i.statusDisabled,i.tokenInfoBox,i.needsProviderBox,i.feeStateBox,i.txSyncBox,i.txProgress,i.txFindingAddrs),this.checkNeedsProvider(e),o){var l=vt().assets[o.parentID];i.tokenParentLogo.src=We.logoPath(l.symbol),i.tokenParentName.textContent=l.name,i.contractAddress.textContent=o.contractAddress,We.show(i.tokenInfoBox)}if(r){this.updateDisplayedAssetBalance();var u=r.feeState,d=r.running,h=r.disabled,p=r.type,f=vt().walletDefinition(e,p);i.walletType.textContent=f.tab,u&&this.updateFeeState(u),h?We.show(i.statusDisabled):d?this.updateSyncAndPeers(r.assetID):We.show(i.statusOff,i.connectBttnBox)}else We.show(i.createWallet);i.walletDetailsBox.classList.remove("invisible")}}},{key:"updateSyncAndPeers",value:function(e){var t=this.page;if(e===this.selectedAssetID){var n=vt().walletMap[e],r=n.peerCount,a=n.syncProgress,o=n.syncStatus,s=n.encrypted,i=n.open;if(n.running&&(We.show(t.sendReceive,t.peerCountBox,t.syncProgressBox),t.peerCount.textContent=String(r),t.syncProgress.textContent="".concat((100*a).toFixed(1),"%"),i?(We.show(t.statusReady),!vt().haveActiveOrders(e)&&s&&We.show(t.lockBttnBox)):We.show(t.statusLocked,t.unlockBttnBox),We.setVis(void 0!==o.txs,t.txSyncBox),void 0!==o.txs))if(We.hide(t.txProgress,t.txFindingAddrs),0===o.txs&&o.blocks>=o.targetHeight)We.show(t.txFindingAddrs);else{We.show(t.txProgress);var c=o.txs/o.targetHeight;t.txProgress.textContent="".concat((100*c).toFixed(1),"%")}}}},{key:"updateFeeState",value:function(e){var t=this.page,n=this.selectedAssetID;We.hide(t.feeStateBox);var r=vt().assets[n],a=r.unitInfo,o=r.token,s=vt().fiatRatesMap[n];if(s){var i=o?o.parentID:n,c=vt().fiatRatesMap[i];if(!o||c){We.show(t.feeStateBox);var l=o?vt().assets[o.parentID].unitInfo:a;We.formatBestRateElement(t.feeStateNetRate,i,e.rate,l),We.formatBestValueElement(t.feeStateSendFees,i,e.send,l),We.formatBestValueElement(t.feeStateSwapFees,i,e.swap,l),We.formatBestValueElement(t.feeStateRedeemFees,i,e.redeem,l),t.feeStateXcRate.textContent=We.formatFourSigFigs(s);var u=e.send/l.conventional.conversionFactor*c;t.feeStateSendFiat.textContent=We.formatFourSigFigs(u);var d=e.swap/l.conventional.conversionFactor*c;t.feeStateSwapFiat.textContent=We.formatFourSigFigs(d);var h=e.redeem/l.conventional.conversionFactor*c;t.feeStateRedeemFiat.textContent=We.formatFourSigFigs(h),We.show(t.feeStateBox)}}}},{key:"checkNeedsProvider",value:(Y=s(f().mark((function e(t){var n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,vt().needsCustomProvider(t);case 2:if(n=e.sent,r=this.page,a=r.needsProviderBox,o=r.needsProviderBttn,We.setVis(n,a),n){e.next=7;break}return e.abrupt("return");case 7:We.blink(o);case 8:case"end":return e.stop()}}),e,this)}))),function(e){return Y.apply(this,arguments)})},{key:"updateTicketBuyer",value:(Q=s(f().mark((function e(t){var n,r,a,o,s,i,c,l;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.ticketPage={number:0,history:[],scanned:!1},r=vt().assets[t],a=r.wallet,o=r.unitInfo,s=this.page,We.hide(s.stakingBox,s.pickVSP,s.stakingSummary,s.stakingErr,s.vspDisplayBox,s.ticketPriceBox,s.purchaseTicketsBox,s.stakingRpcSpvMsg,s.ticketsDisabled),null!=a&&a.running&&32768&a.traits){e.next=6;break}return e.abrupt("return");case 6:return We.show(s.stakingBox),i=vt().loading(s.stakingBox),e.next=10,this.safePost("/api/stakestatus",t);case 10:if(c=e.sent,i(),vt().checkResponse(c)){e.next=19;break}if(!c.msg.includes("disconnected from consensus RPC")){e.next=16;break}return We.show(s.stakingRpcSpvMsg),e.abrupt("return");case 16:return We.show(s.stakingErr),s.stakingErr.textContent=c.msg,e.abrupt("return");case 19:if(We.show(s.stakingSummary,s.ticketPriceBox),l=c.status,this.stakeStatus=l,s.stakingAgendaCount.textContent=String(l.stances.agendas.length),s.stakingTspendCount.textContent=String(l.stances.tspends.length),s.purchaserCurrentPrice.textContent=We.formatFourSigFigs(l.ticketPrice/o.conventional.conversionFactor),s.purchaserBal.textContent=We.formatCoinValue(a.balance.available,o),this.updateTicketStats(l.stats,o,l.ticketPrice,l.votingSubsidy),!(null===(n=vt().extensionWallet(this.selectedAssetID))||void 0===n?void 0:n.disableStaking)){e.next=33;break}return We.hide(s.setVotes,s.showVSPs),We.show(s.ticketsDisabled),s.extensionModeAppName.textContent=vt().user.extensionModeConfig.name,e.abrupt("return");case 33:this.setVSPViz(l.vsp);case 34:case"end":return e.stop()}}),e,this)}))),function(e){return Q.apply(this,arguments)})},{key:"setVSPViz",value:function(e){var t=this.page,n=this.stakeStatus;if(We.hide(t.vspDisplayBox),e)return We.show(t.vspDisplayBox,t.purchaseTicketsBox),We.hide(t.pickVSP),void(t.vspURL.textContent=e);We.setVis(!n.isRPC,t.pickVSP),We.setVis(n.isRPC,t.purchaseTicketsBox)}},{key:"updateTicketStats",value:function(e,t,n,r){var a=this.page,o=this.stakeStatus;o.stats=e,n&&(o.ticketPrice=n),r&&(o.votingSubsidy=r);var s=o.tickets.filter((function(e){return e.status<=3&&e.status>=1})).length;a.stakingTicketCount.textContent=String(s),a.immatureTicketCount.textContent=String(e.mempool),We.setVis(e.mempool>0,a.immatureTicketCountBox),a.queuedTicketCount.textContent=String(e.queued),a.formQueuedTix.textContent=String(e.queued),We.setVis(e.queued>0,a.formQueueTixBox,a.queuedTicketCountBox),a.totalTicketCount.textContent=String(e.ticketCount),a.totalTicketRewards.textContent=We.formatFourSigFigs(e.totalRewards/t.conventional.conversionFactor),a.totalTicketVotes.textContent=String(e.votes),n&&(a.ticketPrice.textContent=We.formatFourSigFigs(n/t.conventional.conversionFactor)),r&&(a.votingSubsidy.textContent=We.formatFourSigFigs(r/t.conventional.conversionFactor))}},{key:"showVSPPicker",value:(K=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.selectedAssetID,n=this.page,this.showForm(n.vspPicker),We.empty(n.vspPickerList),We.hide(n.stakingErr),r=vt().loading(n.vspPicker),e.next=8,this.safePost("/api/listvsps",t);case 8:if(a=e.sent,r(),vt().checkResponse(a)){e.next=14;break}return We.show(n.stakingErr),n.stakingErr.textContent=a.msg,e.abrupt("return");case 14:o=a.vsps,s=Hr(o),e.prev=16,c=f().mark((function e(){var r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=i.value,a=n.vspRowTmpl.cloneNode(!0),n.vspPickerList.appendChild(a),(o=We.parseTemplate(a)).url.textContent=r.url,o.feeRate.textContent=r.feePercentage.toFixed(2),o.voting.textContent=String(r.voting),We.bind(a,"click",(function(){We.hide(n.stakingErr),l.setVSP(t,r)}));case 8:case"end":return e.stop()}}),e)})),s.s();case 19:if((i=s.n()).done){e.next=23;break}return e.delegateYield(c(),"t0",21);case 21:e.next=19;break;case 23:e.next=28;break;case 25:e.prev=25,e.t1=e.catch(16),s.e(e.t1);case 28:return e.prev=28,s.f(),e.finish(28);case 31:case"end":return e.stop()}}),e,this,[[16,25,28,31]])}))),function(){return K.apply(this,arguments)})},{key:"showPurchaseTicketsDialog",value:function(){var e=this.page;e.purchaserInput.value="",We.hide(e.purchaserErr),this.showForm(this.page.purchaseTicketsForm),e.purchaserInput.focus()}},{key:"purchaserInputChanged",value:function(){var e=this.page,t=parseInt(e.purchaserInput.value||"0");e.purchaserInput.value=t<=1?"1":String(t)}},{key:"purchaseTickets",value:(X=s(f().mark((function e(){var t,n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n=this.selectedAssetID,!((r=parseInt(t.purchaserInput.value||"0"))<1)){e.next=4;break}return e.abrupt("return");case 4:return a=vt().loading(t.purchaseTicketsForm),e.next=7,this.safePost("/api/purchasetickets",{assetID:n,n:r});case 7:if(o=e.sent,a(),vt().checkResponse(o)){e.next=13;break}return t.purchaserErr.textContent=o.msg,We.show(t.purchaserErr),e.abrupt("return");case 13:this.showSuccess(ke("TICKETS_PURCHASED",{n:r.toLocaleString(We.languages())}));case 14:case"end":return e.stop()}}),e,this)}))),function(){return X.apply(this,arguments)})},{key:"processTicketPurchaseUpdate",value:function(e){var t=this.stakeStatus,n=this.selectedAssetID,r=this.page,a=e.assetID,o=e.payload,s=o.err,i=o.remaining,c=o.tickets,l=o.stats;if(a===n){if(s)return We.show(r.purchaseTicketsErrBox),void(r.purchaseTicketsErr.textContent=s);c&&(t.tickets=c.concat(t.tickets)),l&&this.updateTicketStats(l,vt().assets[a].unitInfo),t.stats.queued=i,r.queuedTicketCount.textContent=String(i),r.formQueuedTix.textContent=String(i),We.setVis(i>0,r.queuedTicketCountBox)}}},{key:"setVSP",value:(z=s(f().mark((function e(t,n){var r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.closePopups(),r=this.page,a=vt().loading(r.stakingBox),e.next=5,this.safePost("/api/setvsp",{assetID:t,url:n.url});case 5:if(o=e.sent,a(),vt().checkResponse(o)){e.next=11;break}return We.show(r.stakingErr),r.stakingErr.textContent=o.msg,e.abrupt("return");case 11:this.setVSPViz(n.url);case 12:case"end":return e.stop()}}),e,this)}))),function(e,t){return z.apply(this,arguments)})},{key:"setCustomVSP",value:function(){var e=this.selectedAssetID,t={url:this.page.customVspUrl.value};this.setVSP(e,t)}},{key:"pageOfTickets",value:function(e){var t=this.stakeStatus,n=this.ticketPage,a=e*ra,o=[];if(a<t.tickets.length){if(o.push.apply(o,r(t.tickets.slice(a,a+ra))),o.length<ra){var s=ra-o.length;o.push.apply(o,r(n.history.slice(0,s)))}}else a-=t.tickets.length,o.push.apply(o,r(n.history.slice(a,a+ra)));return o}},{key:"displayTicketPage",value:function(e,t){var n=this.page,r=this.selectedAssetID,a=vt().unitInfo(r),o=Ln[r][vt().user.net];We.empty(n.ticketHistoryRows),n.ticketHistoryPage.textContent=String(e);var s,i=Hr(t);try{for(i.s();!(s=i.n()).done;){var c=s.value,l=c.tx,u=c.status,d=n.ticketHistoryRowTmpl.cloneNode(!0);n.ticketHistoryRows.appendChild(d),vt().bindUrlHandlers(d);var h=We.parseTemplate(d);h.age.textContent=We.timeSince(1e3*l.stamp),h.price.textContent=We.formatFullPrecision(l.ticketPrice,a),h.status.textContent=ke(Kr[u]),h.hashStart.textContent=l.hash.slice(0,6),h.hashEnd.textContent=l.hash.slice(-6),h.detailsLinkUrl.setAttribute("href",o(l.hash))}}catch(e){i.e(e)}finally{i.f()}}},{key:"ticketPageN",value:(j=s(f().mark((function e(t){var n,a,o,s,i,c,l,u,d,h,p,v,m,g;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,a=this.stakeStatus,o=this.ticketPage,s=this.selectedAssetID,!((i=this.pageOfTickets(t)).length<ra)||o.scanned){e.next=18;break}return l=ra-i.length,u=o.history.length>0?o.history:a.tickets,d=u.length>0?u[u.length-1].tx.blockHeight:-1,h=u.filter((function(e){return e.tx.blockHeight===d})).length,p=vt().loading(n.ticketHistoryForm),e.next=10,this.safePost("/api/ticketpage",{assetID:s,scanStart:d,n:l,skipN:h});case 10:if(v=e.sent,p(),vt().checkResponse(v)){e.next=15;break}return console.error("error fetching ticket page",v.msg),e.abrupt("return");case 15:(c=this.ticketPage.history).push.apply(c,r(v.tickets)),i.push.apply(i,r(v.tickets)),v.tickets.length<l&&(this.ticketPage.scanned=!0);case 18:if(m=a.tickets.length+o.history.length,We.setVis(m>=ra,n.ticketHistoryPagination),We.setVis(m>0,n.ticketHistoryTable),We.setVis(0===m,n.noTicketsMessage),0!==i.length){e.next=25;break}return We.hide(n.ticketHistoryNextPage),e.abrupt("return");case 25:this.displayTicketPage(t,i),o.number=t,g=t*ra+i.length===m,We.setVis(!g||!o.scanned,n.ticketHistoryNextPage),We.setVis(t>0,n.ticketHistoryPrevPage);case 30:case"end":return e.stop()}}),e,this)}))),function(e){return j.apply(this,arguments)})},{key:"showTicketHistory",value:(_=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.showForm(this.page.ticketHistoryForm),e.next=3,this.ticketPageN(this.ticketPage.number);case 3:case"end":return e.stop()}}),e,this)}))),function(){return _.apply(this,arguments)})},{key:"nextTicketPage",value:(U=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.ticketPageN(this.ticketPage.number+1);case 2:case"end":return e.stop()}}),e,this)}))),function(){return U.apply(this,arguments)})},{key:"prevTicketPage",value:(V=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.ticketPageN(this.ticketPage.number-1);case 2:case"end":return e.stop()}}),e,this)}))),function(){return V.apply(this,arguments)})},{key:"showSetVotesDialog",value:function(){var e,t=this,n=this.page,r=this.stakeStatus,a=this.selectedAssetID,o=vt().unitInfo(a);We.hide(n.votingFormErr);var i=Ln[a][vt().user.net],c=function(){var e=s(f().mark((function e(r){var a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return We.hide(n.votingFormErr),a=vt().loading(n.votingForm),e.next=4,t.safePost("/api/setvotes",r);case 4:if(o=e.sent,a(),vt().checkResponse(o)){e.next=10;break}throw We.show(n.votingFormErr),n.votingFormErr.textContent=o.msg,Error(o.msg);case 10:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),l=function(){var e=s(f().mark((function e(t,n){var o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c({assetID:a,choices:h({},t,n)});case 2:o=Hr(r.stances.agendas);try{for(o.s();!(s=o.n()).done;)(i=s.value).id===t&&(i.currentChoice=n)}catch(e){o.e(e)}finally{o.f()}case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}();We.empty(n.votingAgendas);var u,d=Hr(r.stances.agendas);try{var p=function(){var e=u.value,t=n.votingAgendaTmpl.cloneNode(!0);n.votingAgendas.appendChild(t);var r=We.parseTemplate(t);r.description.textContent=e.description;var a,o=Hr(e.choices);try{var s=function(){var t=a.value,o=n.votingChoiceTmpl.cloneNode(!0);r.choices.appendChild(o);var s,i=We.parseTemplate(o);i.id.textContent=(s=t.id).charAt(0).toUpperCase()+s.slice(1),i.id.dataset.tooltip=t.description,i.radio.value=t.id,i.radio.name=e.id,We.bind(i.radio,"change",(function(){i.radio.checked&&l(e.id,t.id)})),t.id===e.currentChoice&&(i.radio.checked=!0)};for(o.s();!(a=o.n()).done;)s()}catch(e){o.e(e)}finally{o.f()}vt().bindTooltips(r.choices)};for(d.s();!(u=d.n()).done;)p()}catch(e){d.e(e)}finally{d.f()}var v=function(){var e=s(f().mark((function e(t,n){var o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c({assetID:a,tSpendPolicy:h({},t,n)});case 2:o=Hr(r.stances.tspends);try{for(o.s();!(s=o.n()).done;)(i=s.value).hash===t&&(i.currentPolicy=n)}catch(e){o.e(e)}finally{o.f()}case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}();We.empty(n.votingTspends);var m,g=Hr(r.stances.tspends);try{var y=function(){var e=m.value,t=n.tspendTmpl.cloneNode(!0);n.votingTspends.appendChild(t),vt().bindUrlHandlers(t);for(var r=We.parseTemplate(t),a=function(){var t=c[s];t.name=e.hash,e.currentPolicy===t.value&&(t.checked=!0),We.bind(t,"change",(function(){var n;t.checked&&v(e.hash,null!==(n=t.value)&&void 0!==n?n:"")}))},s=0,c=[r.yes,r.no];s<c.length;s++)a();e.value>0?r.value.textContent=We.formatFourSigFigs(e.value/o.conventional.conversionFactor):We.hide(r.value),r.hash.textContent=e.hash,r.explorerLink.setAttribute("href",i(e.hash))};for(g.s();!(m=g.n()).done;)y()}catch(e){g.e(e)}finally{g.f()}var x=function(){var e=s(f().mark((function e(t,n){var o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c({assetID:a,treasuryPolicy:h({},t,n)});case 2:o=Hr(r.stances.treasuryKeys);try{for(o.s();!(s=o.n()).done;)(i=s.value).key===t&&(i.policy=n)}catch(e){o.e(e)}finally{o.f()}case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}();We.empty(n.votingTKeys);var b,k=Hr(null!==(e=r.stances.treasuryKeys)&&void 0!==e?e:[]);try{var w=function(){var e=b.value,t=n.tkeyTmpl.cloneNode(!0);n.votingTKeys.appendChild(t);for(var r=We.parseTemplate(t),a=function(){var t=s[o];t.name=e.key,e.policy===t.value&&(t.checked=!0),We.bind(t,"change",(function(){var n;t.checked&&x(e.key,null!==(n=t.value)&&void 0!==n?n:"")}))},o=0,s=[r.yes,r.no];o<s.length;o++)a();r.key.textContent=e.key};for(k.s();!(b=k.n()).done;)w()}catch(e){k.e(e)}finally{k.f()}this.showForm(n.votingForm)}},{key:"updatePrivacy",value:(W=s(f().mark((function e(t){var n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=null===(n=vt().extensionWallet(t))||void 0===n?void 0:n.disablePrivacy,this.mixing=!1,a=vt().assets[t].wallet,o=this.page,We.hide(o.mixingBox,o.mixerOff,o.mixerOn),!r&&null!=a&&a.running&&a.traits&Xr){e.next=7;break}return e.abrupt("return");case 7:return We.show(o.mixingBox,o.mixerLoading),e.next=10,this.safePost("/api/mixingstats",{assetID:t});case 10:if(s=e.sent,We.hide(o.mixerLoading),vt().checkResponse(s)){e.next=16;break}return We.show(o.mixingErr),o.mixingErr.textContent=s.msg,e.abrupt("return");case 16:this.mixing=s.stats.enabled,this.mixing?We.show(o.mixerOn):We.show(o.mixerOff),this.mixerToggle.setState(this.mixing);case 19:case"end":return e.stop()}}),e,this)}))),function(e){return W.apply(this,arguments)})},{key:"updateMixerState",value:(N=s(f().mark((function e(t){var n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,We.hide(n.mixingErr),r=vt().loading(n.mixingBox),e.next=5,S("/api/configuremixer",{assetID:this.selectedAssetID,enabled:t});case 5:if(a=e.sent,r(),vt().checkResponse(a)){e.next=11;break}return n.mixingErr.textContent=ke(H,{msg:a.msg}),We.show(n.mixingErr),e.abrupt("return");case 11:We.setVis(t,n.mixerOn),We.setVis(!t,n.mixerOff),this.mixerToggle.setState(t);case 14:case"end":return e.stop()}}),e,this)}))),function(e){return N.apply(this,arguments)})},{key:"updateDisplayedAssetBalance",value:function(){var e,t,n,r=this.page,a=vt().assets[this.selectedAssetID],o=a.wallet,s=a.unitInfo,i=a.id,c=o.balance;We.show(r.balanceBox,r.walletDetails);var l=c.locked+c.contractlocked+c.bondlocked,u=c.available+l+c.immature;r.balance.textContent=We.formatCoinValue(u,s),r.balanceUnit.textContent=s.conventional.unit;var d=vt().fiatRatesMap[i];d&&(We.show(r.fiatBalanceBox),r.fiatBalance.textContent=We.formatFiatConversion(u,d,s)),We.empty(r.balanceDetailBox);var h,p,f=function(e,t,n){var a=r.balanceDetailRow.cloneNode(!0);r.balanceDetailBox.appendChild(a);var o=We.parseTemplate(a);return o.name.textContent=e,n&&(o.tooltipMsg.dataset.tooltip=n,We.show(o.tooltipMsg)),o.balance.textContent=We.formatCoinValue(t,s),a},v=function(e,t,n){h=void 0,p=f(e,t,n)},m=function(e,t,n){(h=f(e,t,n)).classList.add("sub")},g=function(){h&&(p.classList.add("itemized"),h.classList.add("last"))};if(v(ke("AVAILABLE_TITLE"),c.available,""),void 0!==(null===(e=c.other)||void 0===e?void 0:e.Shielded)){var y=c.available-c.other.Shielded.amt;m(ke("TRANSPARENT"),y),m(ke("SHIELDED"),c.other.Shielded.amt)}g(),v(ke("LOCKED_TITLE"),l,ke("LOCKED_BAL_MSG")),c.orderlocked>0&&m(ke("ORDER"),c.orderlocked,ke("LOCKED_ORDER_BAL_MSG")),c.contractlocked>0&&m(ke("SWAPPING"),c.contractlocked,ke("LOCKED_SWAPPING_BAL_MSG")),c.bondlocked>0&&m(ke("BONDED"),c.bondlocked,ke("LOCKED_BOND_BAL_MSG")),c.bondReserves>0&&m(ke("BOND_RESERVES"),c.bondReserves,ke("BOND_RESERVES_MSG")),void 0!==(null==c||null===(t=c.other)||void 0===t?void 0:t.Staked)&&m("Staked",c.other.Staked.amt),g(),c.immature&&v(ke("IMMATURE_TITLE"),c.immature,ke("IMMATURE_BAL_MSG")),void 0!==(null==c||null===(n=c.other)||void 0===n?void 0:n.Unmixed)&&m("Unmixed",c.other.Unmixed.amt),g(),r.purchaserBal.textContent=We.formatFourSigFigs(c.available/s.conventional.conversionFactor),vt().bindTooltips(r.balanceDetailBox)}},{key:"showAvailableMarkets",value:function(e){for(var t=this.page,n=vt().user.exchanges,r=[],o=0,s=Object.values(n);o<s.length;o++){var i=s[o];if(i.markets)for(var c=0,l=Object.values(i.markets);c<l.length;c++){var u=l[c];u.baseid!==e&&u.quoteid!==e||r.push([i.host,i,u])}}var d=function(e,t){var n=t.spot;if(!n)return 0;var r=vt().unitInfo(e).conventional.conversionFactor;return(e===t.baseid?n.vol24:n.vol24*n.rate/Dt)/r};r.sort((function(t,n){var r=a(t,3),o=r[0],s=r[2],i=a(n,3),c=i[0],l=i[2];return s.spot||l.spot?d(e,l)-d(e,s):o.localeCompare(c)})),We.empty(t.availableMarkets);for(var h=function(){var r=a(f[p],3),o=r[0],s=r[1],i=r[2],c=i.spot,l=i.baseid,u=i.basesymbol,h=i.quoteid,v=i.quotesymbol,m=t.marketRow.cloneNode(!0);t.availableMarkets.appendChild(m);var g=We.parseTemplate(m);if(g.host.textContent=o,g.baseLogo.src=We.logoPath(u),g.quoteLogo.src=We.logoPath(v),We.empty(g.baseSymbol,g.quoteSymbol),g.baseSymbol.appendChild(We.symbolize(s.assets[l],!0)),g.quoteSymbol.appendChild(We.symbolize(s.assets[h],!0)),c){var y=vt().conventionalRate(l,h,c.rate,n[o]);g.price.textContent=We.formatFourSigFigs(y);var x=function(e){return e.split(".")[0].toUpperCase()};g.priceQuoteUnit.textContent=x(v),g.priceBaseUnit.textContent=x(u),g.volume.textContent=We.formatFourSigFigs(d(e,i)),g.volumeUnit.textContent=x(e===l?u:v)}else We.hide(g.priceBox,g.volumeBox);We.bind(m,"click",(function(){return vt().loadPage("markets",{host:o,baseID:l,quoteID:h})}))},p=0,f=r;p<f.length;p++)h();t.marketsOverviewBox.classList.remove("invisible")}},{key:"showRecentActivity",value:(q=s(f().mark((function e(t){var n,r,a,o,s,i,c,l,u,d,h,p,v,m,g,y;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,r=vt().loading(n.orderActivityBox),a={n:20,assets:[t],hosts:[],statuses:[]},e.next=5,S("/api/orders",a);case 5:if(o=e.sent,r(),We.hide(n.noActivity,n.orderActivity),o.orders&&0!==o.orders.length){e.next=12;break}return We.show(n.noActivity),n.orderActivityBox.classList.remove("invisible"),e.abrupt("return");case 12:for(We.show(n.orderActivity),We.empty(n.recentOrders),s=0,i=o.orders;s<i.length;s++)c=i[s],l=n.recentOrderTmpl.cloneNode(!0),n.recentOrders.appendChild(l),u=We.parseTemplate(l),d=void 0,h=void 0,p=[vt().unitInfo(c.baseID),vt().unitInfo(c.quoteID)],v=p[0],m=p[1],c.sell?(g=[vt().assets[c.baseID],vt().assets[c.quoteID]],d=g[0],h=g[1],u.fromQty.textContent=We.formatCoinValue(c.qty,v),1===c.type&&(u.toQty.textContent=We.formatCoinValue(c.qty/Dt*c.rate,m))):(y=[vt().assets[c.quoteID],vt().assets[c.baseID]],d=y[0],h=y[1],2===c.type?u.fromQty.textContent=We.formatCoinValue(c.qty,v):(u.fromQty.textContent=We.formatCoinValue(c.qty/Dt*c.rate,m),u.toQty.textContent=We.formatCoinValue(c.qty,v))),u.fromLogo.src=We.logoPath(d.symbol),We.empty(u.fromSymbol,u.toSymbol),u.fromSymbol.appendChild(We.symbolize(d,!0)),u.toLogo.src=We.logoPath(h.symbol),u.toSymbol.appendChild(We.symbolize(h,!0)),u.status.textContent=Bt(c),u.filled.textContent="".concat((Pt(c)/c.qty*100).toFixed(1),"%"),u.age.textContent=We.timeSince(c.submitTime),u.link.href="order/".concat(c.id),vt().bindInternalNavigation(l);n.orderActivityBox.classList.remove("invisible");case 16:case"end":return e.stop()}}),e,this)}))),function(e){return q.apply(this,arguments)})},{key:"updateTxHistoryRow",value:function(e,t,n){var r=We.parseTemplate(e),o=n,s=n;if(t.tokenID)if(o=t.tokenID,n!==t.tokenID)s=n;else{var i=vt().assets[n];i.token?s=i.token.parentID:console.error("unable to determine fee asset for tx ".concat(t.id))}var c=vt().unitInfo(o),l=vt().unitInfo(s);r.age.textContent=We.timeSince(1e3*t.timestamp),r.age.dataset.timestamp=String(1e3*t.timestamp),We.setVis(0===t.timestamp,r.pending),We.setVis(0!==t.timestamp,r.age),t.timestamp>0&&(r.age.dataset.stamp=String(t.timestamp));var u=ea(t.type);if(t.tokenID&&t.tokenID!==n){var d=vt().assets[t.tokenID].unitInfo.conventional.unit;u="".concat(d," ").concat(u)}if(r.type.textContent=u,r.id.textContent=sa(t.id,12),r.id.setAttribute("title",t.id),r.fees.textContent=We.formatCoinValue(t.fees,l),Jr.includes(t.type))r.amount.textContent="-";else{var h=a(Zr(t.type),2),p=h[0],f=h[1],v=We.formatCoinValue(t.amount,c);r.amount.textContent="".concat(p).concat(v),""!==f&&r.amount.classList.add(f)}}},{key:"txHistoryRow",value:function(e,t){var n=this,r=this.page.txHistoryRowTmpl.cloneNode(!0);r.dataset.txid=e.id,We.bind(r,"click",(function(){return n.showTxDetailsPopup(e.id)})),this.updateTxHistoryRow(r,e,t);var a=We.parseTemplate(r);return this.stampers.push(a.age),r}},{key:"txHistoryDateRow",value:function(e){var t=this.page.txHistoryDateRowTmpl.cloneNode(!0);return We.parseTemplate(t).date.textContent=e,t}},{key:"setTxDetailsPopupElements",value:function(e){var t=this.page,n=Ln[this.selectedAssetID];n&&n[aa]&&(t.txViewBlockExplorer.href=n[aa](e.id));var r=ea(e.type);if(e.tokenID&&e.tokenID!==this.selectedAssetID){var o=vt().assets[e.tokenID].symbol.split(".")[0].toUpperCase();r="".concat(o," ").concat(r)}if(t.txDetailsType.textContent=r,We.setVis(16===e.type,t.txTypeTooltip),t.txTypeTooltip.dataset.tooltip=ke("SWAP_OR_SEND_TOOLTIP"),Jr.includes(e.type))We.hide(t.txDetailsAmtSection);else{var s=this.selectedAssetID;e.tokenID&&(s=e.tokenID),We.show(t.txDetailsAmtSection);var i=vt().unitInfo(s),c=We.formatCoinValue(e.amount,i),l=a(Zr(e.type),2),u=l[0],d=l[1];t.txDetailsAmount.textContent="".concat(u).concat(c," ").concat(i.conventional.unit),""!==d&&t.txDetailsAmount.classList.add(d)}var h=this.selectedAssetID;if(void 0!==e.tokenID){var p=vt().assets[e.tokenID];p.token?h=p.token.parentID:console.error("wallet transaction ".concat(e.id," is supposed to be a token tx, but asset ").concat(e.tokenID," is not a token"))}var f=vt().unitInfo(h),v=We.formatCoinValue(e.fees,f);t.txDetailsFee.textContent="".concat(v," ").concat(f.conventional.unit),t.txDetailsBlockNumber.textContent="".concat(e.blockNumber);var m=new Date(1e3*e.timestamp),g=m.toLocaleDateString(),y=m.toLocaleTimeString();if(t.txDetailsTimestamp.textContent="".concat(g," ").concat(y),We.setVis(0===e.blockNumber,t.timestampPending,t.blockNumberPending),We.setVis(0!==e.blockNumber,t.txDetailsBlockNumber,t.txDetailsTimestamp),t.txDetailsID.textContent=sa(e.id,20),t.txDetailsID.setAttribute("title",e.id),e.recipient?(We.show(t.txDetailsRecipientSection),t.txDetailsRecipient.textContent=sa(e.recipient,20),t.txDetailsRecipient.setAttribute("title",e.recipient)):We.hide(t.txDetailsRecipientSection),e.bondInfo){We.show(t.txDetailsBondIDSection,t.txDetailsBondLocktimeSection),We.setVis(""!==e.bondInfo.accountID,t.txDetailsBondAccountIDSection),t.txDetailsBondID.textContent=sa(e.bondInfo.bondID,20),t.txDetailsBondID.setAttribute("title",e.bondInfo.bondID);var x=new Date(1e3*e.bondInfo.lockTime),b=x.toLocaleDateString(),k=x.toLocaleTimeString();t.txDetailsBondLocktime.textContent="".concat(b," ").concat(k),t.txDetailsBondAccountID.textContent=sa(e.bondInfo.accountID,20),t.txDetailsBondAccountID.setAttribute("title",e.bondInfo.accountID)}else We.hide(t.txDetailsBondIDSection,t.txDetailsBondLocktimeSection,t.txDetailsBondAccountIDSection);e.additionalData&&e.additionalData.Nonce?(We.show(t.txDetailsNonceSection),t.txDetailsNonce.textContent="".concat(e.additionalData.Nonce)):We.hide(t.txDetailsNonceSection)}},{key:"showTxDetailsPopup",value:function(e){var t=vt().getWalletTx(this.selectedAssetID,e);t?(this.currTx=t,this.setTxDetailsPopupElements(t),this.showForm(this.page.txDetails)):console.error("wallet transaction ".concat(e," not found"))}},{key:"txHistoryTableNewestDate",value:function(){return this.page.txHistoryTableBody.children.length>=1&&We.parseTemplate(this.page.txHistoryTableBody.children[0]).date.textContent||""}},{key:"txDate",value:function(e){return 0===e.timestamp?(new Date).toLocaleDateString():new Date(1e3*e.timestamp).toLocaleDateString()}},{key:"handleTxNote",value:function(e,t){var n,r=this.selectedAssetID;if(this.depositAddrForm.handleTx(r,e),!(vt().assets[this.selectedAssetID].wallet.traits&Xr&&this.page.hideMixTxs.checked)||17!==e.type)if(t)this.oldestTx?this.txDate(e)!==this.txHistoryTableNewestDate()?(this.page.txHistoryTableBody.insertBefore(this.txHistoryRow(e,r),this.page.txHistoryTableBody.children[0]),this.page.txHistoryTableBody.insertBefore(this.txHistoryDateRow(this.txDate(e)),this.page.txHistoryTableBody.children[0])):this.page.txHistoryTableBody.insertBefore(this.txHistoryRow(e,r),this.page.txHistoryTableBody.children[1]):(We.show(this.page.txHistoryTable),We.hide(this.page.noTxHistory),this.page.txHistoryTableBody.appendChild(this.txHistoryDateRow(this.txDate(e))),this.page.txHistoryTableBody.appendChild(this.txHistoryRow(e,r)),this.oldestTx=e);else{var a,o=Hr(this.page.txHistoryTableBody.children);try{for(o.s();!(a=o.n()).done;){var s=a.value;if(s.dataset.txid===e.id){this.updateTxHistoryRow(s,e,r);break}}}catch(e){o.e(e)}finally{o.f()}e.id===(null===(n=this.currTx)||void 0===n?void 0:n.id)&&this.setTxDetailsPopupElements(e)}}},{key:"getTxHistory",value:(M=s(f().mark((function e(t,n,a){var o,s,i,c,l,u,d,h,p;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o=10,n&&(o=15),s={txs:[],lastTx:!1},i=a,c=0;case 5:if(!(c<40)){e.next=18;break}return e.next=8,vt().txHistory(t,o,i);case 8:if((l=e.sent).txs.length>0&&(i=l.txs[l.txs.length-1].id),u=l.txs,n&&(u=u.filter((function(e){return 17!==e.type}))),s.txs.length+u.length>10?(h=10-s.txs.length,(d=s.txs).push.apply(d,r(u.slice(0,h)))):(l.lastTx&&(s.lastTx=!0),(p=s.txs).push.apply(p,r(u))),!(s.txs.length>=10||l.lastTx)){e.next=15;break}return e.abrupt("break",18);case 15:c++,e.next=5;break;case 18:return e.abrupt("return",s);case 19:case"end":return e.stop()}}),e)}))),function(e,t,n){return M.apply(this,arguments)})},{key:"showTxHistory",value:(O=s(f().mark((function e(t){var n,r,a,o,s,i,c,l,u,d,h;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,We.hide(n.txHistoryTable,n.txHistoryBox,n.noTxHistory,n.earlierTxs,n.txHistoryNotAvailable,n.hideMixTxs),We.empty(n.txHistoryTableBody),(a=vt().assets[t].wallet)&&!a.disabled&&65536&a.traits){e.next=7;break}return We.show(n.txHistoryNotAvailable),e.abrupt("return");case 7:return this.oldestTx=void 0,o=!!(a.traits&Xr),We.setVis(o,n.hideMixTxs),We.show(n.txHistoryBox),e.prev=11,s=o&&!!n.hideMixTxsCheckbox.checked,e.next=15,this.getTxHistory(t,s);case 15:r=e.sent,e.next=22;break;case 18:return e.prev=18,e.t0=e.catch(11),We.show(n.noTxHistory),e.abrupt("return");case 22:if(0!==r.txs.length){e.next=25;break}return We.show(n.noTxHistory),e.abrupt("return");case 25:i=this.txDate(r.txs[0]),n.txHistoryTableBody.appendChild(this.txHistoryDateRow(i)),c=Hr(r.txs);try{for(c.s();!(l=c.n()).done;)u=l.value,(d=this.txDate(u))!==i&&(i=d,n.txHistoryTableBody.appendChild(this.txHistoryDateRow(d))),h=this.txHistoryRow(u,t),n.txHistoryTableBody.appendChild(h)}catch(e){c.e(e)}finally{c.f()}this.oldestTx=r.txs[r.txs.length-1],We.show(n.txHistoryTable),We.setVis(!r.lastTx,n.earlierTxs);case 32:case"end":return e.stop()}}),e,this,[[11,18]])}))),function(e){return O.apply(this,arguments)})},{key:"loadEarlierTxs",value:(L=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l,u;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.oldestTx){e.next=2;break}return e.abrupt("return");case 2:return t=this.page,r=vt().assets[this.selectedAssetID].wallet,a=!!(r.traits&Xr)&&!!t.hideMixTxsCheckbox.checked,e.prev=5,e.next=8,this.getTxHistory(this.selectedAssetID,a,this.oldestTx.id);case 8:n=e.sent,e.next=15;break;case 11:return e.prev=11,e.t0=e.catch(5),console.error(e.t0),e.abrupt("return");case 15:o=this.txDate(this.oldestTx),s=Hr(n.txs);try{for(s.s();!(i=s.n()).done;)c=i.value,(l=this.txDate(c))!==o&&(o=l,t.txHistoryTableBody.appendChild(this.txHistoryDateRow(l))),u=this.txHistoryRow(c,this.selectedAssetID),t.txHistoryTableBody.appendChild(u)}catch(e){s.e(e)}finally{s.f()}We.setVis(!n.lastTx,t.earlierTxs),n.txs.length>0&&(this.oldestTx=n.txs[n.txs.length-1]);case 20:case"end":return e.stop()}}),e,this,[[5,11]])}))),function(){return L.apply(this,arguments)})},{key:"rescanWallet",value:(P=s(f().mark((function e(t){var n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,We.hide(n.reconfigErr),r="/api/rescanwallet",a={assetID:t},o=vt().loading(this.body),e.next=7,S(r,a);case 7:if(s=e.sent,o(),s.code!==A.activeOrdersErr){e.next=14;break}return this.forceUrl=r,this.forceReq=a,this.showConfirmForce(),e.abrupt("return");case 14:if(vt().checkResponse(s)){e.next=17;break}return We.showFormError(n.reconfigErr,s.msg),e.abrupt("return");case 17:this.assetUpdated(t,n.reconfigForm,ke("RESCAN_STARTED"));case 18:case"end":return e.stop()}}),e,this)}))),function(e){return P.apply(this,arguments)})},{key:"showConfirmForce",value:function(){We.hide(this.page.confirmForceErr),this.showForm(this.page.confirmForce)}},{key:"showRecoverWallet",value:function(){We.hide(this.page.recoverWalletErr),this.showForm(this.page.recoverWalletConfirm)}},{key:"openWallet",value:(B=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={assetID:t},e.next=3,S("/api/openwallet",n);case 3:if(r=e.sent,vt().checkResponse(r)){e.next=7;break}return console.error("openwallet error",r),e.abrupt("return");case 7:this.assetUpdated(t,void 0,ke("WALLET_UNLOCKED"));case 8:case"end":return e.stop()}}),e,this)}))),function(e){return B.apply(this,arguments)})},{key:"showReconfig",value:(E=s(f().mark((function e(t,n){var r,a,o,s,i,c,l,u,d,h,p,v,m,g,y,x,b;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=this.page,We.hide(a.changeWalletType,a.changeTypeHideIcon,a.reconfigErr,a.showChangeType,a.changeTypeHideIcon,a.reconfigErr,a.enableWallet,a.disableWallet),this.changeWalletPW=!1,this.setPWSettingViz(this.changeWalletPW),o=vt().assets[t],s=vt().currentWalletDefinition(t),i=o.token?[o.token.definition]:o.info?o.info.availablewallets:[],c=null===(r=vt().extensionWallet(t))||void 0===r?void 0:r.disableWalletType,i.length>1&&!c){We.empty(a.changeWalletTypeSelect),We.show(a.showChangeType,a.changeTypeShowIcon),a.changeTypeMsg.textContent=ke("CHANGE_WALLET_TYPE"),l=Hr(i);try{for(l.s();!(u=l.n()).done;)d=u.value,h=document.createElement("option"),d.type===s.type&&(h.selected=!0),h.value=h.textContent=d.type,a.changeWalletTypeSelect.appendChild(h)}catch(e){l.e(e)}finally{l.f()}}if(null!=n&&n.elevateProviders){p=Hr(s.configopts);try{for(p.s();!(v=p.n()).done;)"providers"===(m=v.value).key&&(m.required=!0)}catch(e){p.e(e)}finally{p.f()}}return g=vt().walletMap[t],We.setVis(4&g.traits,a.downloadLogs),We.setVis(32&g.traits,a.recoverWallet),We.setVis(256&g.traits,a.exportWallet),We.setVis(1&g.traits,a.rescanWallet),We.setVis(1024&g.traits&&!g.disabled,a.managePeers),We.setVis(8192&g.traits&&!g.disabled,a.unapproveTokenAllowance),We.setVis(9509&g.traits,a.otherActionsLabel),g.disabled?We.show(a.enableWallet):We.show(a.disableWallet),this.showOrHideRecoverySupportMsg(g,s.seeded),a.recfgAssetLogo.src=We.logoPath(o.symbol),a.recfgAssetName.textContent=o.name,null!=n&&n.skipAnimation||this.showForm(a.reconfigForm),y=vt().loading(a.reconfigForm),e.next=26,S("/api/walletsettings",{assetID:t});case 26:if(x=e.sent,y(),vt().checkResponse(x)){e.next=31;break}return We.showFormError(a.reconfigErr,x.msg),e.abrupt("return");case 31:b=vt().haveActiveOrders(t),this.reconfigForm.update(o.id,s.configopts||[],b),this.setGuideLink(s.guidelink),this.reconfigForm.setConfig(x.map),this.updateDisplayedReconfigFields(s);case 36:case"end":return e.stop()}}),e,this)}))),function(e,t){return E.apply(this,arguments)})},{key:"showOrHideRecoverySupportMsg",value:function(e,t){this.setRecoverySupportMsgViz(t&&!e.running&&!e.disabled&&Boolean(32&e.traits),e.symbol)}},{key:"setRecoverySupportMsgViz",value:function(e,t){var n=this.page;if(e)return n.reconfigSupportMsg.textContent=ke("WALLET_RECOVERY_SUPPORT_MSG",{walletSymbol:t.toLocaleUpperCase()}),We.show(n.reconfigSupportMsg),n.submitReconfig.setAttribute("disabled",""),void n.submitReconfig.classList.add("grey");n.submitReconfig.removeAttribute("disabled"),n.submitReconfig.classList.remove("grey"),We.empty(n.reconfigSupportMsg),We.hide(n.reconfigSupportMsg)}},{key:"changeWalletType",value:function(){var e=this.page.changeWalletTypeSelect.value||"",t=vt().walletDefinition(this.selectedAssetID,e);this.reconfigForm.update(this.selectedAssetID,t.configopts||[],!1);var n=vt().walletMap[this.selectedAssetID],r=vt().currentWalletDefinition(this.selectedAssetID);t.type!==r.type?this.setRecoverySupportMsgViz(!1,n.symbol):this.showOrHideRecoverySupportMsg(n,t.seeded),this.setGuideLink(t.guidelink),this.updateDisplayedReconfigFields(t)}},{key:"setGuideLink",value:function(e){We.hide(this.walletCfgGuide),""!==e&&(this.walletCfgGuide.href=e,We.show(this.walletCfgGuide))}},{key:"updateDisplayedReconfigFields",value:function(e){var t,n=null===(t=vt().extensionWallet(this.selectedAssetID))||void 0===t?void 0:t.disablePassword;e.seeded||"token"===e.type||n?(We.hide(this.page.showChangePW,this.reconfigForm.fileSelector),this.changeWalletPW=!1,this.setPWSettingViz(!1)):We.show(this.page.showChangePW,this.reconfigForm.fileSelector)}},{key:"showDeposit",value:(I=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.depositAddrForm.setAsset(t),this.showForm(this.page.deposit);case 2:case"end":return e.stop()}}),e,this)}))),function(e){return I.apply(this,arguments)})},{key:"showSendForm",value:(D=s(f().mark((function e(t){var n,r,a,o,s,i,c,l,u,d,h,p,v,m,g;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,r=n.sendForm,a=vt().assets[t],o=a.wallet,s=a.unitInfo,i=a.symbol,c=a.token,We.hide(n.toggleSubtract),n.subtractCheckBox.checked=!1,(l=!!(64&o.traits))&&We.show(n.toggleSubtract),We.hide(n.sendErr,n.maxSendDisplay,n.sendTokenMsgBox),n.sendAddr.classList.remove("border-danger","border-success"),n.sendAddr.value="",n.sendAmt.value="",u=vt().fiatRatesMap[t],We.showFiatValue(n.sendValue,0,u,s),n.walletBal.textContent=We.formatFullPrecision(o.balance.available,s),n.sendLogo.src=We.logoPath(i),n.sendName.textContent=s.conventional.unit,c&&(d=vt().assets[c.parentID],n.sendTokenParentLogo.src=We.logoPath(d.symbol),n.sendTokenParentName.textContent=d.name,We.show(n.sendTokenMsgBox)),!(o.balance.available>0&&512&o.traits)){e.next=25;break}return h={assetID:t,subtract:l,maxWithdraw:!0,value:o.balance.available},p=vt().loading(this.body),e.next=22,S("/api/txfee",h);case 22:v=e.sent,p(),vt().checkResponse(v)&&(m=o.balance.available,c||(m-=v.txfee)<0&&(m=0),this.maxSend=m,n.maxSend.textContent=We.formatFullPrecision(m,s),We.showFiatValue(n.maxSendFiat,m,u,s),c?(g=vt().assets[c.parentID].unitInfo,n.maxSendFee.textContent=We.formatFullPrecision(v.txfee,g)+" "+g.conventional.unit,We.showFiatValue(n.maxSendFeeFiat,v.txfee,vt().fiatRatesMap[c.parentID],g)):(n.maxSendFee.textContent=We.formatFullPrecision(v.txfee,s),We.showFiatValue(n.maxSendFeeFiat,v.txfee,u,s)),We.show(n.maxSendDisplay));case 25:We.showFiatValue(n.sendValue,0,u,s),n.walletBal.textContent=We.formatFullPrecision(o.balance.available,s),r.dataset.assetID=String(t),this.showForm(r);case 29:case"end":return e.stop()}}),e,this)}))),function(e){return D.apply(this,arguments)})},{key:"doConnect",value:(T=s(f().mark((function e(t){var n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=vt().loading(this.body),e.next=3,S("/api/connectwallet",{assetID:t});case 3:r=e.sent,n(),vt().checkResponse(r)||(a=vt().assets[t].symbol,(o=this.page).errorModalMsg.textContent=ke("CONNECTING_WALLET_ERR_MSG",{assetName:a,errMsg:r.msg}),this.showForm(o.errorModal)),this.updateDisplayedAsset(t);case 7:case"end":return e.stop()}}),e,this)}))),function(e){return T.apply(this,arguments)})},{key:"assetUpdated",value:function(e,t,n){e===this.selectedAssetID&&(this.updateDisplayedAsset(e),t&&Object.is(this.currentForm,t)&&(n?this.showSuccess(n):this.closePopups()))}},{key:"populateMaxSend",value:(F=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.page,n=vt().assets[this.selectedAssetID],r=n.id,a=n.unitInfo,o=n.wallet,s=vt().fiatRatesMap[r],64&o.traits?(i=o.balance.available,t.sendAmt.value=String(i/a.conventional.conversionFactor),We.showFiatValue(t.sendValue,i,s,a),t.subtractCheckBox.checked=!0):(t.sendAmt.value=String(this.maxSend/a.conventional.conversionFactor),We.showFiatValue(t.sendValue,this.maxSend,s,a),t.subtractCheckBox.checked=!1);case 4:case"end":return e.stop()}}),e,this)}))),function(){return F.apply(this,arguments)})},{key:"send",value:(C=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l,u,d;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=this.page,a=parseInt(null!==(t=r.sendForm.dataset.assetID)&&void 0!==t?t:""),o=null!==(n=r.subtractCheckBox.checked)&&void 0!==n&&n,s=vt().unitInfo(a).conventional.conversionFactor,i=r.vSendPw.value||"",r.vSendPw.value="",""!==i){e.next=9;break}return We.showFormError(r.vSendErr,ke(R)),e.abrupt("return");case 9:return c={assetID:a,address:r.sendAddr.value,subtract:o,value:Math.round(nt(r.sendAmt.value)*s),pw:i},l=vt().loading(r.vSendForm),e.next=13,S("/api/send",c);case 13:if(u=e.sent,l(),vt().checkResponse(u)){e.next=18;break}return We.showFormError(r.vSendErr,u.msg),e.abrupt("return");case 18:d=vt().assets[a].name,this.assetUpdated(a,r.vSendForm,ke("SEND_SUCCESS",{assetName:d}));case 20:case"end":return e.stop()}}),e,this)}))),function(){return C.apply(this,arguments)})},{key:"reconfig",value:(w=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,r=this.selectedAssetID,We.hide(n.reconfigErr),a=vt().currentWalletDefinition(r).type,We.isHidden(n.changeWalletType)||(a=n.changeWalletTypeSelect.value||""),o=vt().loading(n.reconfigForm),s={assetID:r,config:this.reconfigForm.map(r),walletType:a},this.changeWalletPW&&(s.newWalletPW=n.newPW.value),e.next=10,this.safePost("/api/reconfigurewallet",s);case 10:if(i=e.sent,n.newPW.value="",o(),vt().checkResponse(i)){e.next=16;break}return We.showFormError(n.reconfigErr,i.msg),e.abrupt("return");case 16:if(null===(t=this.data)||void 0===t||!t.goBack){e.next=19;break}return vt().loadPage(this.data.goBack),e.abrupt("return");case 19:this.assetUpdated(r,n.reconfigForm,ke("RECONFIG_SUCCESS")),this.updateTicketBuyer(r),vt().clearTxHistory(r),this.showTxHistory(r),this.updatePrivacy(r),this.checkNeedsProvider(r);case 25:case"end":return e.stop()}}),e,this)}))),function(){return w.apply(this,arguments)})},{key:"lock",value:(b=s(f().mark((function e(t){var n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,r=vt().loading(n.newWalletForm),e.next=4,S("/api/closewallet",{assetID:t});case 4:if(a=e.sent,r(),vt().checkResponse(a)){e.next=8;break}return e.abrupt("return");case 8:this.updateDisplayedAsset(t),this.updatePrivacy(t);case 10:case"end":return e.stop()}}),e,this)}))),function(e){return b.apply(this,arguments)})},{key:"downloadLogs",value:(m=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:(t=new URLSearchParams("")).append("assetid","".concat(this.selectedAssetID)),(n=new URL(window.location.href)).search=t.toString(),n.pathname="/wallets/logfile",window.open(n.toString());case 6:case"end":return e.stop()}}),e,this)}))),function(){return m.apply(this,arguments)})},{key:"displayExportWalletAuth",value:(p=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.page,We.hide(t.exportWalletErr),t.exportWalletPW.value="",this.showForm(t.exportWalletAuth);case 4:case"end":return e.stop()}}),e,this)}))),function(){return p.apply(this,arguments)})},{key:"exportWalletAuthSubmit",value:(u=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n={assetID:this.selectedAssetID,pass:t.exportWalletPW.value},r=vt().loading(t.forms),e.next=6,S("/api/restorewalletinfo",n);case 6:a=e.sent,r(),vt().checkResponse(a)?(t.exportWalletPW.value="",this.displayRestoreWalletInfo(a.restorationinfo)):We.showFormError(t.exportWalletErr,a.msg);case 9:case"end":return e.stop()}}),e,this)}))),function(){return u.apply(this,arguments)})},{key:"displayRestoreWalletInfo",value:(l=s(f().mark((function e(t){var n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=this.page,We.empty(n.restoreInfoCardsList),r=Hr(t);try{for(r.s();!(a=r.n()).done;)o=a.value,s=this.restoreInfoCard.cloneNode(!0),(i=We.parseTemplate(s)).name.textContent=o.target,i.seed.textContent=o.seed,i.seedName.textContent="".concat(o.seedName,":"),i.instructions.textContent=o.instructions,n.restoreInfoCardsList.appendChild(s)}catch(e){r.e(e)}finally{r.f()}this.showForm(n.restoreWalletInfo);case 5:case"end":return e.stop()}}),e,this)}))),function(e){return l.apply(this,arguments)})},{key:"recoverWallet",value:(c=s(f().mark((function e(){var t,n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,We.hide(t.recoverWalletErr),n={assetID:this.selectedAssetID},r="/api/recoverwallet",a=vt().loading(t.forms),e.next=7,S(r,n);case 7:o=e.sent,a(),o.code===A.activeOrdersErr?(this.forceUrl=r,this.forceReq=n,this.showConfirmForce()):vt().checkResponse(o)?this.closePopups():We.showFormError(t.recoverWalletErr,o.msg);case 10:case"end":return e.stop()}}),e,this)}))),function(){return c.apply(this,arguments)})},{key:"confirmForceSubmit",value:(o=s(f().mark((function e(){var t,n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,this.forceReq.force=!0,n=vt().loading(t.forms),e.next=5,S(this.forceUrl,this.forceReq);case 5:r=e.sent,n(),vt().checkResponse(r)?this.closePopups():We.showFormError(t.confirmForceErr,r.msg);case 8:case"end":return e.stop()}}),e,this)}))),function(){return o.apply(this,arguments)})},{key:"handleBalanceNote",value:function(e){this.updateAssetButton(e.assetID),e.assetID===this.selectedAssetID&&this.updateDisplayedAssetBalance()}},{key:"handleRatesNote",value:function(e){if(this.updateAssetButton(this.selectedAssetID),e.fiatRates[this.selectedAssetID]){this.updateDisplayedAssetBalance();var t=vt().walletMap[this.selectedAssetID].feeState;t&&this.updateFeeState(t)}}},{key:"handleWalletStateNote",value:function(e){var t=e.wallet,n=t.assetID,r=t.feeState;this.updateAssetButton(n),this.assetUpdated(n),"WalletPeersUpdate"===e.topic&&n===this.selectedAssetID&&We.isDisplayed(this.page.managePeersForm)&&this.updateWalletPeersTable(),r&&n===this.selectedAssetID&&this.updateFeeState(r)}},{key:"handleCreateWalletNote",value:function(e){this.updateAssetButton(e.assetID),this.assetUpdated(e.assetID),this.showTxHistory(e.assetID)}},{key:"handleCustomWalletNote",value:function(e){var t=e.payload;switch(t.route){case"tipChange":var n=t;if(42===n.assetID){if(!this.stakeStatus)return;var r=n.data;if(vt().walletMap[n.assetID].synced){var a=vt().unitInfo(n.assetID);this.updateTicketStats(r.stats,a,r.ticketPrice,r.votingSubsidy)}}break;case"ticketPurchaseUpdate":this.processTicketPurchaseUpdate(t);break;case"transaction":var o=t;o.assetID===this.selectedAssetID&&this.handleTxNote(o.transaction,o.new);break;case"transactionHistorySynced":var s=t;s.assetID===this.selectedAssetID&&this.showTxHistory(s.assetID)}}},{key:"unload",value:function(){clearInterval(this.secondTicker),We.unbind(document,"keyup",this.keyup)}}]),ve}(ut);function sa(e,t){return e.length<=t?e:"".concat(e.substring(0,t/2),"...").concat(e.substring(e.length-t/2))}function ia(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==t.indexOf(r))continue;n[r]=e[r]}return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],-1===t.indexOf(n)&&{}.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var ca="order",la="match",ua="bondpost",da="conn";function ha(){return"desktop_notifications-".concat(window.location.host)}var pa,fa=(h(ta={},ca,"BROWSER_NTFN_ORDERS"),h(ta,la,"BROWSER_NTFN_MATCHES"),h(ta,ua,"BROWSER_NTFN_BONDS"),h(ta,da,"BROWSER_NTFN_CONNECTIONS"),ta),va=(h(na={},ca,!0),h(na,la,!0),h(na,ua,!0),h(na,da,!0),function(){function e(){i(this,e)}var t,n;return d(e,null,[{key:"ntfnPermissionGranted",value:function(){return"granted"===window.Notification.permission}},{key:"ntfnPermissionDenied",value:function(){return"denied"===window.Notification.permission}},{key:"requestNtfnPermission",value:(n=s(f().mark((function t(){return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if("Notification"in window){t.next=2;break}return t.abrupt("return");case 2:if(!e.ntfnPermissionGranted()){t.next=6;break}e.sendDesktopNotification(ke(ee)),t.next=10;break;case 6:if(e.ntfnPermissionDenied()){t.next=10;break}return t.next=9,Notification.requestPermission();case 9:e.sendDesktopNotification(ke(ee));case 10:case"end":return t.stop()}}),t)}))),function(){return n.apply(this,arguments)})},{key:"sendDesktopNotification",value:(t=s(f().mark((function t(n,r){var a;return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(e.ntfnPermissionGranted()){t.next=2;break}return t.abrupt("return");case 2:return a=new window.Notification(n,{body:r,icon:"/img/softened-icon.png"}),t.abrupt("return",a);case 4:case"end":return t.stop()}}),t)}))),function(e,n){return t.apply(this,arguments)})}]),e}()),ma=function(){function e(){i(this,e)}var t,n;return d(e,null,[{key:"ntfnPermissionGranted",value:function(){return!0}},{key:"ntfnPermissionDenied",value:function(){return!1}},{key:"requestNtfnPermission",value:(n=s(f().mark((function t(){return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.sendDesktopNotification(ke(ee));case 2:return t.abrupt("return",Promise.resolve());case 3:case"end":return t.stop()}}),t)}))),function(){return n.apply(this,arguments)})},{key:"sendDesktopNotification",value:(t=s(f().mark((function e(t,n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!ga()){e.next=5;break}return e.next=3,window.sendOSNotification(t,n);case 3:e.next=11;break;case 5:if(!ya()){e.next=10;break}return e.next=8,window.webkit.messageHandlers.bwHandler.postMessage(["sendOSNotification",t,n]);case 8:e.next=11;break;case 10:console.error("sendDesktopNotification: unknown environment");case 11:case"end":return e.stop()}}),e)}))),function(e,n){return t.apply(this,arguments)})}]),e}();function ga(){return void 0!==window.isWebview}function ya(){var e,t;return void 0!==(null===(e=window.webkit)||void 0===e||null===(t=e.messageHandlers)||void 0===t?void 0:t.bwHandler)}ya()&&(window.isWebview=function(){return!0},window.sendOSNotification=function(){var e=s(f().mark((function e(t,n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,window.webkit.messageHandlers.bwHandler.postMessage(["sendOSNotification",t,n]);case 2:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),window.openUrl=function(){var e=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,window.webkit.messageHandlers.bwHandler.postMessage(["openURL",t.toString()]);case 2:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),window.open=function(e,t,n){return void 0===e||(void 0===t&&""===n||console.warn("open: target and feature are not supported in webview"),window.webkit.messageHandlers.bwHandler.postMessage(["openURL",e.toString()])),null});var xa=ga()||ya()?ma:va;function ba(){return(ba=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(pa.browserNtfnEnabled&&pa[t.type]){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,xa.sendDesktopNotification(t.subject,Fa(t.details));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ka(){var e;if(void 0!==pa)return pa;var t=ha();return pa=null!==(e=k.fetchLocal(t))&&void 0!==e?e:{}}var wa=/\{\{\{([^|]+)\|([^}]+)\}\}\}/g,Ca=/\{\{\{order\|([^}]+)\}\}\}/g;function Sa(e,t){for(var n=t.replace(Ca,(function(e,t){var n=document.createElement("a");return n.setAttribute("href","/order/"+t),n.setAttribute("class","subtlelink"),n.textContent=t.slice(0,8),n.outerHTML})).replace(wa,(function(e,t,n){var r=document.createElement("a");return r.setAttribute("data-explorer-coin",n),r.setAttribute("target","_blank"),r.textContent=n.slice(0,8),Mn(t,r),r.outerHTML})),r=We.noderize(n).body;r.firstChild;)e.appendChild(r.firstChild)}function Fa(e){return e.replace(wa,(function(e,t,n){return n.slice(0,8)}))}var Ta=["bonds"];function Da(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Da=function(){return!!e})()}var Ia=function(e){g(A,e);var t,n,r,a,o,c,l,u,p,m,b,w,C,F,T,D,I=(t=A,n=Da(),function(){var e,r=x(t);if(n){var a=x(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function A(e){var t;i(this,A),h(v(t=I.call(this)),"body",void 0),h(v(t),"currentDEX",void 0),h(v(t),"page",void 0),h(v(t),"forms",void 0),h(v(t),"fiatRateSources",void 0),h(v(t),"regAssetForm",void 0),h(v(t),"confirmRegisterForm",void 0),h(v(t),"newWalletForm",void 0),h(v(t),"walletWaitForm",void 0),h(v(t),"dexAddrForm",void 0),h(v(t),"appPassResetForm",void 0),h(v(t),"currentForm",void 0),h(v(t),"keyup",void 0),t.body=e;var n=t.page=We.idDescendants(e);t.forms=We.applySelector(n.forms,":scope > form"),t.fiatRateSources=We.applySelector(n.fiatRateSources,"input[type=checkbox]"),n.darkMode.checked="1"===k.fetchLocal(k.darkModeLK),We.bind(n.darkMode,"click",(function(){k.storeLocal(k.darkModeLK,n.darkMode.checked?"1":"0"),n.darkMode.checked?document.body.classList.add("dark"):document.body.classList.remove("dark")})),n.showPokes.checked="1"===k.fetchLocal(k.popupsLK),We.bind(n.showPokes,"click",(function(){var e=n.showPokes.checked||!1;k.storeLocal(k.popupsLK,e?"1":"0"),vt().showPopups=e})),We.bind(n.addADex,"click",(function(){t.dexAddrForm.refresh(),t.showForm(n.dexAddrForm)})),t.fiatRateSources.forEach((function(e){We.bind(e,"change",s(f().mark((function t(){var n;return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,S("/api/toggleratesource",{disable:!e.checked,source:e.value});case 2:return n=t.sent,vt().checkResponse(n)||(e.checked=!e.checked),t.next=6,vt().fetchUser();case 6:case"end":return t.stop()}}),t)}))))})),t.regAssetForm=new kr(n.regAssetForm,function(){var e=s(f().mark((function e(r,a){var o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r!==ft){e.next=5;break}return e.next=3,vt().fetchUser();case 3:return window.location.reload(),e.abrupt("return");case 5:if(o=vt().assets[r],!(s=o.wallet)){e.next=19;break}return i=t.currentDEX.bondAssets[o.symbol],e.next=11,t.getBondsFeeBuffer(r,n.regAssetForm);case 11:if(c=e.sent,t.confirmRegisterForm.setAsset(r,a,c),!(s.synced&&s.balance.available>=2*i.amount+c)){e.next=16;break}return t.animateConfirmForm(n.regAssetForm),e.abrupt("return");case 16:return t.walletWaitForm.setWallet(r,c,a),t.slideSwap(n.walletWait),e.abrupt("return");case 19:t.confirmRegisterForm.setAsset(r,a,0),t.newWalletForm.setAsset(r),t.slideSwap(n.newWalletForm);case 22:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()),t.confirmRegisterForm=new br(n.confirmRegForm,(function(){t.registerDEXSuccess()}),(function(){t.animateRegAsset(n.confirmRegForm)})),t.newWalletForm=new gr(n.newWalletForm,(function(e){return t.newWalletCreated(e,t.confirmRegisterForm.tier)}),(function(){return t.animateRegAsset(n.newWalletForm)})),t.walletWaitForm=new wr(n.walletWait,(function(){t.animateConfirmForm(n.walletWait)}),(function(){t.animateRegAsset(n.walletWait)})),t.dexAddrForm=new Sr(n.dexAddrForm,function(){var e=s(f().mark((function e(r,a){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t.currentDEX=r,t.confirmRegisterForm.setExchange(r,a),t.walletWaitForm.setExchange(r),t.regAssetForm.setExchange(r,a),t.animateRegAsset(n.dexAddrForm);case 5:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()),We.bind(n.importAccount,"click",(function(){return t.prepareAccountImport(n.authorizeAccountImportForm)})),Mr(n.authorizeAccountImportForm,n.authorizeImportAccountConfirm,(function(){return t.importAccount()})),We.bind(n.changeAppPW,"click",(function(){return t.showForm(n.changeAppPWForm)})),Mr(n.changeAppPWForm,n.submitNewPW,(function(){return t.changeAppPW()})),t.appPassResetForm=new Ir(n.resetAppPWForm,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,vt().loadPage("login");case 2:We.hide(n.forms);case 3:case"end":return e.stop()}}),e)})))),We.bind(n.resetAppPW,"click",(function(){t.appPassResetForm.refresh(),t.showForm(n.resetAppPWForm),t.appPassResetForm.focus()})),We.bind(n.accountFile,"change",(function(){return t.onAccountFileChange()})),We.bind(n.removeAccount,"click",(function(){return t.clearAccountFile()})),We.bind(n.addAccount,"click",(function(){return n.accountFile.click()})),We.bind(n.exportSeed,"click",(function(){We.hide(n.exportSeedErr),t.showForm(n.exportSeedAuth)})),Mr(n.exportSeedAuth,n.exportSeedSubmit,(function(){return t.submitExportSeedReq()})),We.bind(n.gameCodeLink,"click",(function(){return t.showForm(n.gameCodeForm)})),We.bind(n.gameCodeSubmit,"click",(function(){return t.submitGameCode()}));var r=function(){We.hide(n.forms),n.exportSeedPW.value="",n.legacySeed.textContent="",n.mnemonic.textContent=""};return We.bind(n.forms,"mousedown",(function(e){We.mouseInElement(e,t.currentForm)||r()})),t.keyup=function(e){"Escape"===e.key&&r()},We.bind(document,"keyup",t.keyup),n.forms.querySelectorAll(".form-closer").forEach((function(e){We.bind(e,"click",(function(){r()}))})),t.renderDesktopNtfnSettings(),t}return d(A,[{key:"updateNtfnSetting",value:function(e){var t=e.target,n=t.getAttribute("name");null!==n&&function(e,t){ka(),pa[e]=t,k.storeLocal(ha(),pa)}(n,t.checked)}},{key:"getBrowserNtfnSettings",value:function(){return ka()}},{key:"renderDesktopNtfnSettings",value:(D=s(f().mark((function e(){var t,n,r,a,o,i,c=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.page,n=this.getBrowserNtfnSettings(),r=fa,(a=t.browserNtfnCheckboxTemplate).removeAttribute("id"),o=t.browserNtfnCheckboxContainer,We.empty(t.browserNtfnCheckboxContainer),Object.keys(r).forEach((function(e){var t=a.cloneNode(!0),s=n[e],i=We.tmplElement(t,"checkbox");We.tmplElement(t,"label").textContent=ke(r[e]),i.setAttribute("name",e),s&&i.setAttribute("checked","checked"),o.appendChild(t),We.bind(i,"click",c.updateNtfnSetting)})),i=t.browserNtfnEnabled,We.bind(i,"click",function(){var e=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!xa.ntfnPermissionDenied()){e.next=2;break}return e.abrupt("return");case 2:if(!(n=t.target).checked){e.next=7;break}return e.next=6,xa.requestNtfnPermission();case 6:n.checked=!xa.ntfnPermissionDenied();case 7:c.updateNtfnSetting(t),n.dispatchEvent(new Event("change"));case 9:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),We.bind(i,"change",(function(e){var n=e.target,r=xa.ntfnPermissionDenied();We.setVis(n.checked,t.browserNtfnCheckboxContainer),We.setVis(r,t.browserNtfnBlockedMsg),n.disabled=r})),i.checked=xa.ntfnPermissionGranted()&&n.browserNtfnEnabled,i.dispatchEvent(new Event("change"));case 13:case"end":return e.stop()}}),e,this)}))),function(){return D.apply(this,arguments)})},{key:"slideSwap",value:function(e){Pr(this.currentForm,e),this.currentForm=e}},{key:"getBondsFeeBuffer",value:(T=s(f().mark((function e(t,n){var r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=vt().loading(n),e.next=3,S("/api/bondsfeebuffer",{assetID:t});case 3:if(a=e.sent,r(),vt().checkResponse(a)){e.next=7;break}return e.abrupt("return",0);case 7:return e.abrupt("return",a.feeBuffer);case 8:case"end":return e.stop()}}),e)}))),function(e,t){return T.apply(this,arguments)})},{key:"newWalletCreated",value:(F=s(f().mark((function e(t,n){var r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,vt().fetchUser();case 2:if(r=e.sent){e.next=5;break}return e.abrupt("return");case 5:return a=this.page,o=r.assets[t],s=o.wallet,i=this.currentDEX.bondAssets[o.symbol].amount,e.next=11,this.getBondsFeeBuffer(t,a.newWalletForm);case 11:if(c=e.sent,this.confirmRegisterForm.setFees(t,c),!(s.synced&&s.balance.available>=2*i+c)){e.next=17;break}return e.next=16,this.animateConfirmForm(a.newWalletForm);case 16:return e.abrupt("return");case 17:this.walletWaitForm.setWallet(t,c,n),this.slideSwap(a.walletWait);case 19:case"end":return e.stop()}}),e,this)}))),function(e,t){return F.apply(this,arguments)})},{key:"onAccountFileChange",value:(C=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,(n=t.accountFile.files)&&n.length){e.next=4;break}return e.abrupt("return");case 4:t.selectedAccount.textContent=n[0].name,We.show(t.removeAccount),We.hide(t.addAccount);case 7:case"end":return e.stop()}}),e,this)}))),function(){return C.apply(this,arguments)})},{key:"clearAccountFile",value:function(){var e=this.page;e.accountFile.value="",e.selectedAccount.textContent=ke(j),We.hide(e.removeAccount),We.show(e.addAccount)}},{key:"prepareAccountImport",value:(w=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.page.importAccountErr.textContent="",this.showForm(t);case 3:case"end":return e.stop()}}),e,this)}))),function(e){return w.apply(this,arguments)})},{key:"importAccount",value:(b=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l,u,d;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n="",!t.accountFile.value){e.next=10;break}if((r=t.accountFile.files)&&r.length){e.next=7;break}return console.error("importAccount: no file specified"),e.abrupt("return");case 7:return e.next=9,r[0].text();case 9:n=e.sent;case 10:e.prev=10,a=JSON.parse(n),e.next=19;break;case 14:return e.prev=14,e.t0=e.catch(10),t.importAccountErr.textContent=e.t0.message,We.show(t.importAccountErr),e.abrupt("return");case 19:if(void 0!==a){e.next=22;break}return We.showFormError(t.importAccountErr,ke("ACCT_UNDEFINED")),e.abrupt("return");case 22:return s=(o=a).bonds,i=void 0===s?[]:s,c=ia(o,Ta),l={account:c,bonds:i},u=vt().loading(this.body),e.next=27,S("/api/importaccount",l);case 27:if(d=e.sent,u(),vt().checkResponse(d)){e.next=32;break}return We.showFormError(t.importAccountErr,d.msg),e.abrupt("return");case 32:return e.next=34,vt().fetchUser();case 34:We.hide(t.forms),window.location.reload();case 36:case"end":return e.stop()}}),e,this,[[10,14]])}))),function(){return b.apply(this,arguments)})},{key:"submitExportSeedReq",value:(m=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=t.exportSeedPW.value,r=vt().loading(this.body),e.next=5,S("/api/exportseed",{pass:n});case 5:if(a=e.sent,r(),vt().checkResponse(a)){e.next=10;break}return We.showFormError(t.exportSeedErr,a.msg),e.abrupt("return");case 10:t.exportSeedPW.value="",128===a.seed.length&&1===a.seed.split(" ").length?t.legacySeed.textContent=a.seed.match(/.{1,32}/g).map((function(e){var t;return null===(t=e.match(/.{1,8}/g))||void 0===t?void 0:t.join(" ")})).join("\n"):t.mnemonic.textContent=a.seed,this.showForm(t.authorizeSeedDisplay);case 13:case"end":return e.stop()}}),e,this)}))),function(){return m.apply(this,arguments)})},{key:"showForm",value:(p=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,this.currentForm=t,this.forms.forEach((function(e){return We.hide(e)})),t.style.right="10000px",We.show(n.forms,t),r=(n.forms.offsetWidth+t.offsetWidth)/2,e.next=8,We.animate(300,(function(e){t.style.right="".concat((1-e)*r,"px")}),"easeOutHard");case 8:t.style.right="0";case 9:case"end":return e.stop()}}),e,this)}))),function(e){return p.apply(this,arguments)})},{key:"getCertFile",value:(u=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t="",!this.dexAddrForm.page.certFile.value){e.next=7;break}if(!(n=this.dexAddrForm.page.certFile.files)||!n.length){e.next=7;break}return e.next=6,n[0].text();case 6:t=e.sent;case 7:return e.abrupt("return",t);case 8:case"end":return e.stop()}}),e,this)}))),function(){return u.apply(this,arguments)})},{key:"registerDEXSuccess",value:(l=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:window.location.reload();case 1:case"end":return e.stop()}}),e)}))),function(){return l.apply(this,arguments)})},{key:"changeAppPW",value:(c=s(f().mark((function e(){var t,n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,We.hide(t.changePWErrMsg),n=function(){t.appPW.value="",t.newAppPW.value="",t.confirmNewPW.value=""},t.appPW.value&&t.newAppPW.value&&t.confirmNewPW.value){e.next=7;break}return We.showFormError(t.changePWErrMsg,ke("NO_APP_PASS_ERROR_MSG")),n(),e.abrupt("return");case 7:if(t.newAppPW.value===t.confirmNewPW.value){e.next=11;break}return We.showFormError(t.changePWErrMsg,ke(N)),n(),e.abrupt("return");case 11:return r=vt().loading(t.changeAppPW),a={appPW:t.appPW.value,newAppPW:t.newAppPW.value},n(),e.next=16,S("/api/changeapppass",a);case 16:if(o=e.sent,r(),vt().checkResponse(o)){e.next=21;break}return We.showFormError(t.changePWErrMsg,o.msg),e.abrupt("return");case 21:We.hide(t.forms);case 22:case"end":return e.stop()}}),e,this)}))),function(){return c.apply(this,arguments)})},{key:"unload",value:function(){We.unbind(document,"keyup",this.keyup)}},{key:"animateRegAsset",value:(o=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:We.hide(t),n=this.page.regAssetForm,this.currentForm=n,this.regAssetForm.animate(),We.show(n);case 5:case"end":return e.stop()}}),e,this)}))),function(e){return o.apply(this,arguments)})},{key:"animateConfirmForm",value:(a=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.confirmRegisterForm.animate(),n=this.page.confirmRegForm,this.currentForm=n,We.hide(t),We.show(n);case 5:case"end":return e.stop()}}),e,this)}))),function(e){return a.apply(this,arguments)})},{key:"submitGameCode",value:(r=s(f().mark((function e(){var t,n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,We.hide(t.gameCodeErr),n=t.gameCodeInput.value){e.next=7;break}return t.gameCodeErr.textContent=ke("NO_CODE_PROVIDED"),We.show(t.gameCodeErr),e.abrupt("return");case 7:return r=t.gameCodeMsg.value||"",a=vt().loading(t.gameCodeForm),e.next=11,S("/api/redeemgamecode",{code:n,msg:r});case 11:if(o=e.sent,a(),vt().checkResponse(o)){e.next=17;break}return t.gameCodeErr.textContent=ke(H,{msg:o.msg}),We.show(t.gameCodeErr),e.abrupt("return");case 17:We.show(t.gameCodeSuccess),t.gameRedeemTx.dataset.explorerCoin=o.coinString,Mn(42,t.gameRedeemTx),t.gameRedeemTx.textContent=o.coinString,s=vt().unitInfo(42),t.gameRedeemValue.textContent=We.formatCoinValue(o.win,s);case 24:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})}]),A}(ut);function Aa(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var Ra=function(){function e(t,n,r){i(this,e),h(this,"base",void 0),h(this,"baseSymbol",void 0),h(this,"quote",void 0),h(this,"quoteSymbol",void 0),h(this,"buys",void 0),h(this,"sells",void 0),this.base=t.base,this.baseSymbol=n,this.quote=t.quote,this.quoteSymbol=r,this.buys=t.book.buys||[],this.sells=t.book.sells||[]}return d(e,[{key:"add",value:function(e){if(0!==e.qtyAtomic){var t=e.sell?this.sells:this.buys;t.splice(function(e,t,n){for(var r=0;r<e.length;r++)if(e[r].rate<t===n)return r;return e.length}(t,e.rate,!e.sell),0,e)}else window.log("zeroqty","zero quantity order encountered",e)}},{key:"remove",value:function(e){this.removeFromSide(this.sells,e)||this.removeFromSide(this.buys,e)}},{key:"removeFromSide",value:function(e,t){var n=a(this.findOrder(e,t),2),r=n[0],o=n[1];return!!r&&(e.splice(o,1),!0)}},{key:"findOrder",value:function(e,t){for(var n=0;n<e.length;n++)if(e[n].token===t)return[e[n],n];return[null,-1]}},{key:"updateRemaining",value:function(e,t,n){this.updateRemainingSide(this.sells,e,t,n)||this.updateRemainingSide(this.buys,e,t,n)}},{key:"updateRemainingSide",value:function(e,t,n,r){var a=this.findOrder(e,t)[0];return!!a&&(a.qty=n,a.qtyAtomic=r,!0)}},{key:"setEpoch",value:function(e){var t=function(t){return void 0===t.epoch||0===t.epoch||t.epoch===e};this.sells=this.sells.filter(t),this.buys=this.buys.filter(t)}},{key:"empty",value:function(){return!this.sells.length&&!this.buys.length}},{key:"count",value:function(){return this.sells.length+this.buys.length}},{key:"bestGapOrder",value:function(e){var t,n=null,r=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Aa(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Aa(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}(e);try{for(r.s();!(t=r.n()).done;){var a=t.value;if(!a.epoch)return a;n||(n=a)}}catch(e){r.e(e)}finally{r.f()}return n}},{key:"bestGapBuy",value:function(){return this.bestGapOrder(this.buys)}},{key:"bestGapSell",value:function(){return this.bestGapOrder(this.sells)}}]),e}();function Ea(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function Ba(e,t,n){if(e||!t.error){if(void 0!==n[e])for(var r=0;r<n[e].length;r++)n[e][r](t)}else{var a=t.error;console.error("websocket error (code ".concat(a.code,"): ").concat(a.message))}}var Pa=0;const La=new(function(){function e(){i(this,e),h(this,"uri",void 0),h(this,"connection",void 0),h(this,"handlers",void 0),h(this,"queue",void 0),h(this,"maxQlength",void 0),h(this,"reloader",void 0),this.handlers={},this.queue=[],this.maxQlength=5}return d(e,[{key:"registerRoute",value:function(e,t){this.handlers[e]=this.handlers[e]||[],this.handlers[e].push(t)}},{key:"deregisterRoute",value:function(e){this.handlers[e]=[]}},{key:"request",value:function(e,t){if(this.connection&&this.connection.readyState===window.WebSocket.OPEN){Pa++;var n=JSON.stringify({route:e,type:1,id:Pa,payload:t});window.log("ws","sending",n),this.connection.send(n)}else{for(;this.queue.length>this.maxQlength-1;)this.queue.shift();this.queue.push([e,t])}}},{key:"close",value:function(e){window.log("ws","close, reason:",e,this.handlers),this.handlers={},this.connection&&this.connection.close()}},{key:"connect",value:function(e,t){var n=this;this.uri=e,this.reloader=t;var r=0;!function o(){window.log("ws","connecting to ".concat(e));var s=n.connection=new window.WebSocket(e);if(s){var i=setTimeout((function(){s&&s.close()}),500);s.onmessage=function(e){var t=JSON.parse(e.data);Ba(t.route,t.payload,n.handlers)},s.onclose=function(e){window.log("ws","onclose"),clearTimeout(i),s=n.connection=null,Ba("close",null,n.handlers),r++;var t=Math.min(Math.pow(1.25,r),10);console.error("websocket disconnected (".concat(e.code,"), trying again in ").concat(t.toFixed(1)," seconds")),setTimeout((function(){o()}),1e3*t)},s.onopen=function(){window.log("ws","onopen"),clearTimeout(i),r>0&&(r=0,t()),Ba("open",null,n.handlers);var e=n.queue;n.queue=[];var o,s=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Ea(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Ea(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}(e);try{for(s.s();!(o=s.n()).done;){var c=a(o.value,2),l=c[0],u=c[1];n.request(l,u)}}catch(e){s.e(e)}finally{s.f()}},s.onerror=function(e){window.log("ws","onerror:",e),Ba("error",e,n.handlers)}}}()}}]),e}());function Oa(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ma(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Oa(Object(n),!0).forEach((function(t){h(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Oa(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function qa(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Na(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Na(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function Na(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function Wa(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Wa=function(){return!!e})()}var Va=We.bind,Ua="book",_a="book_order",ja="unbook_order",Ha="update_remaining",za="epoch_order",Ga="candles",Xa="candle_update",Ka="buygreen-bg",Qa="sellred-bg",Ya="5m",Ja=new Intl.NumberFormat(We.languages(),{minimumFractionDigits:1,maximumFractionDigits:2}),Za=4294967295,$a=function(e){g(_,e);var t,n,o,c,l,u,p,m,b,w,C,F,T,D,I,A,R,q,N,W,V,U=(t=_,n=Wa(),function(){var e,r=x(t);if(n){var a=x(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function _(e,t){var n;i(this,_),h(v(n=U.call(this)),"page",void 0),h(v(n),"main",void 0),h(v(n),"maxLoaded",void 0),h(v(n),"maxOrderUpdateCounter",void 0),h(v(n),"market",void 0),h(v(n),"openAsset",void 0),h(v(n),"currentCreate",void 0),h(v(n),"maxEstimateTimer",void 0),h(v(n),"book",void 0),h(v(n),"cancelData",void 0),h(v(n),"metaOrders",void 0),h(v(n),"preorderCache",void 0),h(v(n),"currentOrder",void 0),h(v(n),"depthLines",void 0),h(v(n),"activeMarkerRate",void 0),h(v(n),"hovers",void 0),h(v(n),"ogTitle",void 0),h(v(n),"depthChart",void 0),h(v(n),"candleChart",void 0),h(v(n),"candleDur",void 0),h(v(n),"balanceWgt",void 0),h(v(n),"mm",void 0),h(v(n),"marketList",void 0),h(v(n),"newWalletForm",void 0),h(v(n),"depositAddrForm",void 0),h(v(n),"approveTokenForm",void 0),h(v(n),"reputationMeter",void 0),h(v(n),"keyup",void 0),h(v(n),"secondTicker",void 0),h(v(n),"candlesLoading",void 0),h(v(n),"accelerateOrderForm",void 0),h(v(n),"recentMatches",void 0),h(v(n),"recentMatchesSortKey",void 0),h(v(n),"recentMatchesSortDirection",void 0),h(v(n),"stats",void 0),h(v(n),"loadingAnimations",void 0),h(v(n),"mmRunning",void 0),h(v(n),"forms",void 0);var r=n.page=We.idDescendants(e);if(n.main=e,!n.main.parentElement)return y(n);n.maxOrderUpdateCounter=0,n.metaOrders={},n.recentMatches=[],n.preorderCache={},n.depthLines={hover:[],input:[]},n.hovers=[],n.recentMatchesSortKey="age",n.recentMatchesSortDirection=-1,n.ogTitle=document.title,n.forms=new mr(r.forms,{closed:function(e){e===r.vDetailPane&&n.showVerifyForm()}});var a={click:function(e){n.reportDepthClick(e)},volume:function(e){n.reportDepthVolume(e)},mouse:function(e){n.reportDepthMouse(e)},zoom:function(e){n.reportDepthZoom(e)}};n.depthChart=new Jt(r.depthChart,a,k.fetchLocal(k.depthZoomLK));var o={mouse:function(e){n.reportMouseCandle(e)}};n.candleChart=new Zt(r.candlesChart,o),n.accelerateOrderForm=new Cr(r.accelerateForm,(function(){})),n.approveTokenForm=new Rr(r.approveTokenForm),n.candleDur=k.fetchLocal(k.lastCandleDurationLK)||"1h";var c=We.tmplElement(r.notRegistered,"registerBttn");Va(c,"click",(function(){vt().loadPage("register",{host:n.market.dex.host})})),r.walletInfoTmpl.removeAttribute("id");var l=r.walletInfoTmpl,u=r.walletInfoTmpl.cloneNode(!0);l.after(u);var d=n.balanceWgt=new no(l,u),p=d.base.stateIcons.icons,m=d.quote.stateIcons.icons;Va(d.base.tmpl.connect,"click",(function(){n.unlockWallet(n.market.base.id)})),Va(d.quote.tmpl.connect,"click",(function(){n.unlockWallet(n.market.quote.id)})),Va(d.base.tmpl.expired,"click",(function(){n.unlockWallet(n.market.base.id)})),Va(d.quote.tmpl.expired,"click",(function(){n.unlockWallet(n.market.quote.id)})),Va(p.sleeping,"click",(function(){n.unlockWallet(n.market.base.id)})),Va(m.sleeping,"click",(function(){n.unlockWallet(n.market.quote.id)})),Va(p.locked,"click",(function(){n.unlockWallet(n.market.base.id)})),Va(m.locked,"click",(function(){n.unlockWallet(n.market.quote.id)})),Va(p.disabled,"click",(function(){n.showToggleWalletStatus(n.market.base)})),Va(m.disabled,"click",(function(){n.showToggleWalletStatus(n.market.quote)})),Va(d.base.tmpl.newWalletBttn,"click",(function(){n.showCreate(n.market.base)})),Va(d.quote.tmpl.newWalletBttn,"click",(function(){n.showCreate(n.market.quote)})),Va(d.base.tmpl.walletAddr,"click",(function(){n.showDeposit(n.market.base.id)})),Va(d.quote.tmpl.walletAddr,"click",(function(){n.showDeposit(n.market.quote.id)})),Va(d.base.tmpl.wantProviders,"click",(function(){n.showCustomProviderDialog(n.market.base.id)})),Va(d.quote.tmpl.wantProviders,"click",(function(){n.showCustomProviderDialog(n.market.quote.id)})),n.depositAddrForm=new Dr(r.deposit);var g={orderReportForm:r.orderReportForm,dexBalancesRowTmpl:r.dexBalancesRowTmpl,placementRowTmpl:r.placementRowTmpl,placementAmtRowTmpl:r.placementAmtRowTmpl};We.cleanTemplates(r.dexBalancesRowTmpl,r.placementRowTmpl,r.placementAmtRowTmpl),n.mm=new cr(r.mmRunning,n.forms,g,"markets"),n.reputationMeter=new pn(r.reputationMeter),Mr(r.toggleWalletStatusConfirm,r.toggleWalletStatusSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.toggleWalletStatus();case 1:case"end":return e.stop()}}),e)})))),yt(r),We.cleanTemplates(r.orderRowTmpl,r.durBttnTemplate,r.booleanOptTmpl,r.rangeOptTmpl,r.orderOptTmpl,r.userOrderTmpl,r.recentMatchesTemplate),Va(r.approveBaseBttn,"click",(function(){n.showTokenApprovalForm(!0)})),Va(r.approveQuoteBttn,"click",(function(){n.showTokenApprovalForm(!1)}));var x=function(e){We.setVis(!e,r.showTradingTier),We.setVis(e,r.tradingLimits,r.hideTradingTier)};Va(r.showTradingTier,"click",(function(){x(!0)})),Va(r.hideTradingTier,"click",(function(){x(!1)}));var b=function(e){We.setVis(!e,r.showTradingReputation),We.setVis(e,r.reputationMeter,r.hideTradingReputation)};Va(r.showTradingReputation,"click",(function(){b(!0)})),Va(r.hideTradingReputation,"click",(function(){b(!1)})),Va(r.buyBttn,"click",(function(){n.setBuy()})),Va(r.sellBttn,"click",(function(){n.setSell()})),Va(r.limitBttn,"click",(function(){so(r.marketBttn,r.limitBttn),n.setOrderVisibility(),r.rateField.value&&(n.depthLines.input=[{rate:nt(r.rateField.value,0),color:n.isSell()?n.depthChart.theme.sellLine:n.depthChart.theme.buyLine}],n.drawChartLines())})),Va(r.marketBttn,"click",(function(){so(r.limitBttn,r.marketBttn),n.setOrderVisibility(),n.setMarketBuyOrderEstimate(),n.depthLines.input=[],n.drawChartLines()})),Va(r.maxOrd,"click",(function(){if(n.isSell()){var e=n.market.maxSell;if(!e)return;r.lotField.value=String(e.swap.lots)}else{var t=n.market.maxBuys[n.adjustedRate()];if(!t)return;r.lotField.value=String(t.swap.lots)}n.lotChanged()})),We.disableMouseWheel(r.rateField,r.lotField,r.qtyField,r.mktBuyField),La.registerRoute(Ua,(function(e){n.handleBookRoute(e)})),La.registerRoute(_a,(function(e){n.handleBookOrderRoute(e)})),La.registerRoute(ja,(function(e){n.handleUnbookOrderRoute(e)})),La.registerRoute(Ha,(function(e){n.handleUpdateRemainingRoute(e)})),La.registerRoute(za,(function(e){n.handleEpochOrderRoute(e)})),La.registerRoute(Ga,(function(e){n.handleCandlesRoute(e)})),La.registerRoute(Xa,(function(e){n.handleCandleUpdateRoute(e)})),La.registerRoute("epoch_match_summary",(function(e){n.handleEpochMatchSummary(e)})),n.newWalletForm=new gr(r.newWalletForm,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.createWallet();case 1:case"end":return e.stop()}}),e)})))),Mr(r.orderForm,r.submitBttn,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.stepSubmit();case 1:case"end":return e.stop()}}),e)})))),Mr(r.verifyForm,r.vSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.submitOrder();case 1:case"end":return e.stop()}}),e)})))),Mr(r.cancelForm,r.cancelSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.submitCancel();case 1:case"end":return e.stop()}}),e)})))),We.bind(r.vFeeDetails,"click",(function(){return n.forms.show(r.vDetailPane)})),We.bind(r.closeDetailPane,"click",(function(){return n.showVerifyForm()})),r.recentMatchesTable.querySelectorAll("[data-ordercol]").forEach((function(e){return Va(e,"click",(function(){return w(e.dataset.ordercol||"")}))}));var w=function(e){C(),n.recentMatchesSortKey===e?n.recentMatchesSortDirection*=-1:(n.recentMatchesSortKey=e,n.recentMatchesSortDirection=1),n.refreshRecentMatchesTable(),S()},C=function(){r.recentMatchesTable.querySelectorAll("[data-ordercol]").forEach((function(e){return e.classList.remove("sorted-asc","sorted-dsc")}))},S=function(){var e=n.recentMatchesSortKey,t=1===n.recentMatchesSortDirection?"sorted-asc":"sorted-dsc";We.safeSelector(r.recentMatchesTable,"[data-ordercol=".concat(e,"]")).classList.add(t)};S();var F=function(){n.forms.close()};n.keyup=function(e){"Escape"===e.key&&F()},Va(document,"keyup",n.keyup),r.forms.querySelectorAll(".form-closer").forEach((function(e){We.bind(e,"click",(function(){F()}))})),Va(r.lotField,["change","keyup"],(function(){n.lotChanged()})),Va(r.qtyField,"change",(function(){n.quantityChanged(!0)})),Va(r.qtyField,"keyup",(function(){n.quantityChanged(!1)})),Va(r.mktBuyField,["change","keyup"],(function(){n.marketBuyChanged()})),Va(r.rateField,"change",(function(){n.rateFieldChanged()})),Va(r.rateField,"keyup",(function(){n.previewQuoteAmt(!0)})),Va(r.marketSearchV1,["change","keyup"],(function(){n.filterMarkets()}));var T=function(e){We.setVis(!e,r.disclaimer,r.disclaimerAck),We.setVis(e,r.showDisclaimer)};Va(r.disclaimerAck,"click",(function(){k.storeLocal(k.orderDisclaimerAckedLK,!0),T(!0)})),Va(r.showDisclaimer,"click",(function(){k.storeLocal(k.orderDisclaimerAckedLK,!1),T(!1)})),T(k.fetchLocal(k.orderDisclaimerAckedLK));var D=function(){n.depthLines.hover=[],n.drawChartLines()};Va(r.buyRows,"mouseleave",D),Va(r.sellRows,"mouseleave",D),Va(r.userOrders,"mouseleave",(function(){n.activeMarkerRate=null,n.setDepthMarkers()}));var I=r.marketStats,A=I.cloneNode(!0);A.classList.add("listopen"),We.hide(I,A),A.removeAttribute("id"),vt().headerSpace.appendChild(A),n.stats=[{row:I,tmpl:We.parseTemplate(I)},{row:A,tmpl:We.parseTemplate(A)}];var R=function(){k.storeLocal(k.leftMarketDockLK,"0"),r.leftMarketDock.classList.remove("default"),r.leftMarketDock.classList.add("stashed");var e,t=qa(n.stats);try{for(t.s();!(e=t.n()).done;)e.value.row.classList.remove("listopen")}catch(e){t.e(e)}finally{t.f()}},E=function(){k.storeLocal(k.leftMarketDockLK,"1"),r.leftMarketDock.classList.remove("default","stashed");var e,t=qa(n.stats);try{for(t.s();!(e=t.n()).done;)e.value.row.classList.add("listopen")}catch(e){t.e(e)}finally{t.f()}};We.bind(r.leftHider,"click",(function(){return R()})),We.bind(r.marketReopener,"click",(function(){return E()}));var B,P=qa(n.stats);try{for(P.s();!(B=P.n()).done;){var L=B.value;We.bind(L.tmpl.marketSelect,"click",(function(){0===r.leftMarketDock.clientWidth?E():R()}))}}catch(e){P.e(e)}finally{P.f()}n.marketList=new eo(r.marketListV1);var O,M=qa(n.marketList.markets);try{var q=function(){var e=O.value;Va(e.node,"click",(function(){var t,r,a,o,s=e.mkt,i=s.quoteid,c=s.baseid,l=s.xc.host;(null===(t=n.market)||void 0===t||null===(r=t.base)||void 0===r?void 0:r.id)===c&&(null===(a=n.market)||void 0===a||null===(o=a.quote)||void 0===o?void 0:o.id)===i||(n.startLoadingAnimations(),n.setMarket(l,c,i))}))};for(M.s();!(O=M.n()).done;)q()}catch(e){M.e(e)}finally{M.f()}return"1"!==k.fetchLocal(k.leftMarketDockLK)&&R(),vt().registerNoteFeeder({order:function(e){n.handleOrderNote(e)},match:function(e){n.handleMatchNote(e)},epoch:function(e){n.handleEpochNote(e)},conn:function(e){n.handleConnNote(e)},balance:function(e){n.handleBalanceNote(e)},bondpost:function(e){n.handleBondUpdate(e)},spots:function(e){n.handlePriceUpdate(e)},walletstate:function(e){n.handleWalletState(e)},reputation:function(){n.updateReputation()},feepayment:function(){n.updateReputation()},runstats:function(e){e.baseID===n.market.base.id&&e.quoteID===n.market.quote.id&&e.host===n.market.dex.host&&(n.mm.update(),Boolean(n.mmRunning)!==Boolean(e.stats)&&(n.mmRunning=Boolean(e.stats),n.resolveOrderFormVisibility()))},epochreport:function(e){e.baseID===n.market.base.id&&e.quoteID===n.market.quote.id&&e.host===n.market.dex.host&&n.mm.handleEpochReportNote(e)},cexproblems:function(e){e.baseID===n.market.base.id&&e.quoteID===n.market.quote.id&&e.host===n.market.dex.host&&n.mm.handleCexProblemsNote(e)},runevent:function(e){e.baseID===n.market.base.id&&e.quoteID===n.market.quote.id&&e.host===n.market.dex.host&&n.mm.update()}}),n.loadingAnimations={},n.startLoadingAnimations(),n.secondTicker=window.setInterval((function(){for(var e=0,t=Object.values(n.metaOrders);e<t.length;e++){var a=t[e];a.details.age.textContent=We.timeSince(a.ord.submitTime)}var o,s=qa(We.applySelector(r.recentMatchesLiveList,"[data-tmpl=age]"));try{for(s.s();!(o=s.n()).done;){var i,c=o.value;c.textContent=We.timeSince(parseFloat(null!==(i=c.dataset.sinceStamp)&&void 0!==i?i:"0"))}}catch(e){s.e(e)}finally{s.f()}}),1e3),n.init(t),n}return d(_,[{key:"init",value:(V=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:(n=null!=t&&t.host?ro(t.host,parseInt(t.baseID),parseInt(t.quoteID)):k.fetchLocal(k.lastMarketLK))&&this.marketList.exists(n.host,n.base,n.quote)||(r=this.marketList.first())&&(n={host:r.mkt.xc.host,base:r.mkt.baseid,quote:r.mkt.quoteid}),n?this.setMarket(n.host,n.base,n.quote):this.balanceWgt.setBalanceVisibility(!1),this.setRegistrationStatusVisibility();case 4:case"end":return e.stop()}}),e,this)}))),function(e){return V.apply(this,arguments)})},{key:"startLoadingAnimations",value:function(){var e=this.page,t=this.loadingAnimations,n=this.depthChart,r=this.candleChart;n.canvas.classList.add("invisible"),r.canvas.classList.add("invisible"),t.candles&&t.candles.stop(),t.candles=new $t(e.candlesChart,{message:ke("CANDLES_LOADING")}),t.depth&&t.depth.stop(),t.depth=new $t(e.depthChart,{message:ke("DEPTH_LOADING")})}},{key:"isSell",value:function(){return this.page.sellBttn.classList.contains("selected")}},{key:"isLimit",value:function(){return this.page.limitBttn.classList.contains("selected")}},{key:"setBuy",value:function(){var e=this.page;so(e.sellBttn,e.buyBttn),e.submitBttn.classList.remove(Qa),e.submitBttn.classList.add(Ka),e.maxLbl.textContent=ke(E),this.setOrderBttnText(),this.setOrderVisibility(),this.drawChartLines(),this.isLimit()?(this.currentOrder=this.parseOrder(),this.updateOrderBttnState()):this.marketBuyChanged()}},{key:"setSell",value:function(){var e=this.page;so(e.buyBttn,e.sellBttn),e.submitBttn.classList.add(Qa),e.submitBttn.classList.remove(Ka),e.maxLbl.textContent=ke(B),this.setOrderBttnText(),this.setOrderVisibility(),this.drawChartLines(),this.currentOrder=this.parseOrder(),this.updateOrderBttnState()}},{key:"hasPendingBonds",value:function(){return Object.keys(this.market.dex.auth.pendingBonds||[]).length>0}},{key:"setCurrMarketPrice",value:function(){var e=this.market;if(e){var t=vt().exchanges[e.dex.host],n=t.markets[e.cfg.name];if(n.spot){var r,a=qa(this.stats);try{for(a.s();!(r=a.n()).done;){var o=r.value,s=t.assets[n.baseid].unitInfo.conventional,i=s.conversionFactor,c=s.unit,l=vt().fiatRatesMap[n.baseid];l?(o.tmpl.volume.textContent=We.formatFourSigFigs(n.spot.vol24/i*l),o.tmpl.volUnit.textContent="USD"):(o.tmpl.volume.textContent=We.formatFourSigFigs(n.spot.vol24/i),o.tmpl.volUnit.textContent=c),lo(o.tmpl,t,n)}}catch(e){a.e(e)}finally{a.f()}this.page.obPrice.textContent=We.formatFourSigFigs(n.spot.rate/this.market.rateConversionFactor),this.page.obPrice.classList.remove("sellcolor","buycolor"),this.page.obPrice.classList.add(n.spot.change24>=0?"buycolor":"sellcolor"),We.setVis(n.spot.change24>=0,this.page.obUp),We.setVis(n.spot.change24<0,this.page.obDown)}}}},{key:"setMarketDetails",value:function(){if(this.market){var e,t=qa(this.stats);try{for(t.s();!(e=t.n()).done;){var n=e.value,r=this.market,a=r.baseCfg,o=r.quoteCfg;n.tmpl.baseIcon.src=We.logoPath(a.symbol),n.tmpl.quoteIcon.src=We.logoPath(o.symbol),We.empty(n.tmpl.baseSymbol,n.tmpl.quoteSymbol),n.tmpl.baseSymbol.appendChild(We.symbolize(a,!0)),n.tmpl.quoteSymbol.appendChild(We.symbolize(o,!0))}}catch(e){t.e(e)}finally{t.f()}}}},{key:"setHighLow",value:function(){var e=0,t=0,n=this.market.cfg.spot;if(n&&n.low24&&n.high24)e=n.high24,t=n.low24;else{var r,a=null===(r=this.market)||void 0===r?void 0:r.candleCaches[Ya];if(!a){if(this.candleDur!==Ya)return void this.requestCandles(Ya);var o,s=qa(this.stats);try{for(s.s();!(o=s.n()).done;){var i=o.value;i.tmpl.high.textContent="-",i.tmpl.low.textContent="-"}}catch(e){s.e(e)}finally{s.f()}return}for(var c=(new Date).getTime()-864e5,l=a.candles.length-1;l>=0;l--){var u=a.candles[l];if(u.endStamp<c)break;(0===t||u.lowRate>0&&u.lowRate<t)&&(t=u.lowRate),u.highRate>e&&(e=u.highRate)}}var d,h=this.market.base.id,p=this.market.quote.id,f=this.market.dex,v=qa(this.stats);try{for(v.s();!(d=v.n()).done;){var m=d.value;m.tmpl.high.textContent=e>0?We.formatFourSigFigs(vt().conventionalRate(h,p,e,f)):"-",m.tmpl.low.textContent=t>0?We.formatFourSigFigs(vt().conventionalRate(h,p,t,f)):"-"}}catch(e){v.e(e)}finally{v.f()}}},{key:"assetsAreSupported",value:function(){var e,t,n,r,a=this.market,o=a.base,s=a.quote,i=a.baseCfg,c=a.quoteCfg;if(!o||!s)return{isSupported:!1,text:ke("NOT_SUPPORTED",{asset:(o?c.symbol:i.symbol).toUpperCase()})};var l=o.token?null===(e=vt().assets[o.token.parentID].info)||void 0===e?void 0:e.versions:null===(t=o.info)||void 0===t?void 0:t.versions,u=s.token?null===(n=vt().assets[s.token.parentID].info)||void 0===n?void 0:n.versions:null===(r=s.info)||void 0===r?void 0:r.versions,d="";return l.includes(i.version)?u.includes(c.version)||(d=ke(P,{asset:s.symbol.toUpperCase(),version:c.version+""})):d=ke(P,{asset:o.symbol.toUpperCase(),version:i.version+""}),{isSupported:l.includes(i.version)&&u.includes(c.version),text:d}}},{key:"setOrderVisibility",value:function(){var e=this.page;this.isLimit()?(We.show(e.priceBox,e.tifBox,e.qtyBox,e.maxBox),We.hide(e.mktBuyBox),this.previewQuoteAmt(!0)):(We.hide(e.tifBox,e.maxBox,e.priceBox),this.isSell()?(We.hide(e.mktBuyBox),We.show(e.qtyBox),this.previewQuoteAmt(!0)):(We.show(e.mktBuyBox),We.hide(e.qtyBox),this.previewQuoteAmt(!1))),this.updateOrderBttnState()}},{key:"resolveOrderFormVisibility",value:(W=s(f().mark((function e(){var t,n,r,a,o,i,c,l,u,d,h,p=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=function(){var e=s(f().mark((function e(){var t,n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(p.assetsAreSupported().isSupported){e.next=2;break}return e.abrupt("return",!1);case 2:if(p.market&&!(p.market.dex.auth.effectiveTier<1)){e.next=4;break}return e.abrupt("return",!1);case 4:if(t=p.tokenAssetApprovalStatuses(),n=t.baseAssetApprovalStatus,r=t.quoteAssetApprovalStatus,n===ht.Approved&&r===ht.Approved){e.next=7;break}return e.abrupt("return",!1);case 7:if(a=p.market,o=a.base,s=a.quote,o&&vt().assets[o.id].wallet&&s&&vt().assets[s.id].wallet){e.next=11;break}return e.abrupt("return",!1);case 11:if(!p.mmRunning){e.next=13;break}return e.abrupt("return",!1);case 13:return e.abrupt("return",!0);case 14:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),e.t0=We,e.next=5,n();case 5:e.t1=e.sent,e.t2=t.orderForm,e.t3=t.orderTypeBttns,e.t0.setVis.call(e.t0,e.t1,e.t2,e.t3),this.market&&(r=this.market.dex.auth,a=r.effectiveTier,o=r.pendingStrength,We.setVis(a>0||o>0,t.reputationAndTradingTierBox)),(i=vt().mmStatus)&&void 0===this.mmRunning&&this.market.base&&this.market.quote&&(c=this.market,l=c.base.id,u=c.quote.id,d=c.dex.host,h=i.bots.find((function(e){var t=e.config;return t.baseID===l&&t.quoteID===u&&t.host===d})),this.mmRunning=Boolean(null==h?void 0:h.running)),We.setVis(this.mmRunning,t.mmRunning),this.mmRunning&&We.hide(t.orderForm,t.orderTypeBttns);case 14:case"end":return e.stop()}}),e,this)}))),function(){return W.apply(this,arguments)})},{key:"setLoaderMsgVisibility",value:function(){var e=this.page,t=this.assetsAreSupported(),n=t.isSupported,r=t.text;n?We.hide(e.loaderMsg):(e.loaderMsg.textContent=r,We.show(e.loaderMsg),We.hide(e.notRegistered),We.hide(e.noWallet))}},{key:"showTokenApprovalForm",value:(N=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=t?this.market.base.id:this.market.quote.id,this.approveTokenForm.setAsset(n,this.market.dex.host),this.forms.show(this.page.approveTokenForm);case 3:case"end":return e.stop()}}),e,this)}))),function(e){return N.apply(this,arguments)})},{key:"tokenAssetApprovalStatuses",value:function(){var e=this.market,t=e.base,n=e.quote,r=ht.Approved,a=ht.Approved;if(null!=t&&t.token){var o,s=vt().assets[t.id],i=this.market.dex.assets[t.id].version;null!=s&&null!==(o=s.wallet)&&void 0!==o&&o.approved&&void 0!==s.wallet.approved[i]&&(r=s.wallet.approved[i])}if(null!=n&&n.token){var c,l=vt().assets[n.id],u=this.market.dex.assets[n.id].version;null!=l&&null!==(c=l.wallet)&&void 0!==c&&c.approved&&void 0!==l.wallet.approved[u]&&(a=l.wallet.approved[u])}return{baseAssetApprovalStatus:r,quoteAssetApprovalStatus:a}}},{key:"setTokenApprovalVisibility",value:function(){var e=this.page,t=this.tokenAssetApprovalStatuses(),n=t.baseAssetApprovalStatus,r=t.quoteAssetApprovalStatus;if(n===ht.Approved&&r===ht.Approved)return We.hide(e.tokenApproval),e.sellBttn.removeAttribute("disabled"),void e.buyBttn.removeAttribute("disabled");n!==ht.Approved&&r===ht.Approved&&(e.sellBttn.setAttribute("disabled","disabled"),e.buyBttn.removeAttribute("disabled"),this.setBuy(),We.show(e.approvalRequiredSell),We.hide(e.approvalRequiredBuy,e.approvalRequiredBoth)),n===ht.Approved&&r!==ht.Approved&&(e.buyBttn.setAttribute("disabled","disabled"),e.sellBttn.removeAttribute("disabled"),this.setSell(),We.show(e.approvalRequiredBuy),We.hide(e.approvalRequiredSell,e.approvalRequiredBoth)),n!==ht.Approved&&r!==ht.Approved&&(We.show(e.approvalRequiredBoth),We.hide(e.approvalRequiredSell,e.approvalRequiredBuy)),We.show(e.tokenApproval),e.approvalPendingBaseSymbol.textContent=e.baseTokenAsset.textContent=this.market.base.symbol.toUpperCase(),e.approvalPendingQuoteSymbol.textContent=e.quoteTokenAsset.textContent=this.market.quote.symbol.toUpperCase(),We.setVis(n===ht.NotApproved,e.approveBaseBttn),We.setVis(r===ht.NotApproved,e.approveQuoteBttn),We.setVis(n===ht.Pending,e.approvalPendingBase),We.setVis(r===ht.Pending,e.approvalPendingQuote)}},{key:"setRegistrationStatusView",value:function(e,t,n){var r=this.page;r.regStatusTitle.textContent=e,r.regStatusConfsDisplay.textContent=t,r.registrationStatus.classList.remove("completed","error","waiting"),r.registrationStatus.classList.add(n)}},{key:"updateRegistrationStatusView",value:function(){var e=this.page,t=this.market.dex;if(e.regStatusDex.textContent=t.host,e.postingBondsDex.textContent=t.host,t.auth.effectiveTier>=1)this.setRegistrationStatusView(ke("REGISTRATION_FEE_SUCCESS"),"","completed");else{var n=(t.auth.pendingBonds||[]).map((function(e){var n=t.bondAssets[e.symbol].confs;return"".concat(e.confs," / ").concat(n)})).join(", ");this.setRegistrationStatusView(ke("WAITING_FOR_CONFS"),n,"waiting")}}},{key:"setRegistrationStatusVisibility",value:function(){var e=this,t=this.page,n=this.market;if(n&&n.dex&&n.dex.connectionStatus===dt.Connected){this.updateRegistrationStatusView();var r=function(e){for(var n=0,r=[t.registrationStatus,t.bondRequired,t.bondCreationPending,t.notRegistered,t.penaltyCompsRequired];n<r.length;n++){var a=r[n];We.setVis(a===e,a)}};if(n.dex.auth.effectiveTier>=1){var a=function(){var t=s(f().mark((function t(){return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:r(void 0),e.resolveOrderFormVisibility();case 2:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();if(We.isHidden(t.orderForm))return void setTimeout(a,5e3);a()}else n.dex.viewOnly?(t.unregisteredDex.textContent=n.dex.host,r(t.notRegistered)):n.dex.auth.targetTier>0&&n.dex.auth.rep.penalties>n.dex.auth.penaltyComps?(t.acctPenalties.textContent="".concat(n.dex.auth.rep.penalties),t.acctPenaltyComps.textContent="".concat(n.dex.auth.penaltyComps),t.compsDexSettingsLink.href="/dexsettings/".concat(n.dex.host),r(t.penaltyCompsRequired)):this.hasPendingBonds()?r(t.registrationStatus):n.dex.auth.targetTier>0?r(t.bondCreationPending):(t.acctTier.textContent="".concat(n.dex.auth.effectiveTier),t.dexSettingsLink.href="/dexsettings/".concat(n.dex.host),r(t.bondRequired))}}},{key:"setOrderBttnText",value:function(){this.isSell()?this.page.submitBttn.textContent=ke("SET_BUTTON_SELL",{asset:We.shortSymbol(this.market.baseCfg.unitInfo.conventional.unit)}):this.page.submitBttn.textContent=ke("SET_BUTTON_BUY",{asset:We.shortSymbol(this.market.baseCfg.unitInfo.conventional.unit)})}},{key:"setOrderBttnEnabled",value:function(e,t){var n=this.page.submitBttn;e?(n.removeAttribute("disabled"),n.removeAttribute("title")):(n.setAttribute("disabled","true"),t&&n.setAttribute("title",t))}},{key:"updateOrderBttnState",value:function(){var e=this.market,t=this.currentOrder,n=t.qty,r=t.rate,a=t.isLimit,o=t.sell,s=vt().assets[this.market.base.id].wallet,i=vt().assets[e.quote.id].wallet;if(s&&i)if(n<=0||n<e.cfg.lotsize)this.setOrderBttnEnabled(!1,ke(re));else if(a)if(r){if(o)return s.balance.available<e.cfg.lotsize?void this.setOrderBttnEnabled(!1,ke(ne)):void(e.maxSell&&this.setOrderBttnEnabled(n<=e.maxSell.swap.value,ke(ne)));var c=this.adjustedRate(),l=e.cfg.lotsize*(c/Dt);if(i.balance.available<l)this.setOrderBttnEnabled(!1,ke(te));else if(e.maxBuys[c]){var u=n<=e.maxBuys[c].swap.lots*e.cfg.lotsize;this.setOrderBttnEnabled(u,ke(te))}}else this.setOrderBttnEnabled(!1,ke(ae));else o?this.setOrderBttnEnabled(n<=s.balance.available,ke(ne)):this.setOrderBttnEnabled(n<=i.balance.available,ke(te))}},{key:"setCandleDurBttns",value:function(){var e=this,t=this.page,n=this.market;We.empty(t.durBttnBox);var r,a=qa(n.dex.candleDurs);try{var o=function(){var n=r.value,a=t.durBttnTemplate.cloneNode(!0);a.textContent=n,We.bind(a,"click",(function(){return e.candleDurationSelected(n)})),t.durBttnBox.appendChild(a)};for(a.s();!(r=a.n()).done;)o()}catch(e){a.e(e)}finally{a.f()}this.loadCandles()}},{key:"setMarket",value:(q=s(f().mark((function e(t,n,r){var a,o,i,c,l,u,d,h,p,v,m,g,y,x,b,w;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=vt().user.exchanges[t],o=this.page,window.cexBook=s(f().mark((function e(){var a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/cexbook",{host:t,baseID:n,quoteID:r});case 2:a=e.sent,console.log(a.book);case 4:case"end":return e.stop()}}),e)}))),o.lotField.value="",o.qtyField.value="",o.rateField.value="",this.depthChart.clear(),We.empty(this.page.buyRows),We.empty(this.page.sellRows),this.recentMatches=[],We.empty(o.recentMatchesLiveList),this.balanceWgt.setBalanceVisibility(!1),We.hide(o.notRegistered,o.bondRequired,o.noWallet,o.penaltyCompsRequired),a&&a.markets&&a.connectionStatus===dt.Connected){e.next=19;break}return i=ke("CONNECTION_FAILED"),a.disabled&&(i=ke("DEX_DISABLED_MSG")),o.chartErrMsg.textContent=i,We.show(o.chartErrMsg),e.abrupt("return");case 19:c=qa(this.stats);try{for(c.s();!(l=c.n()).done;)u=l.value,We.show(u.row)}catch(e){c.e(e)}finally{c.f()}d=a.assets[n],h=a.assets[r],p=[vt().unitInfo(n,a),vt().unitInfo(r,a)],m=p[1],g=Dt/(v=p[0]).conventional.conversionFactor*m.conventional.conversionFactor,We.hide(o.maxOrd,o.chartErrMsg),this.maxEstimateTimer&&(window.clearTimeout(this.maxEstimateTimer),this.maxEstimateTimer=null),y=ao(d.symbol,h.symbol),x=vt().assets[n],b=vt().assets[r],w={dex:a,sid:y,cfg:a.markets[y],base:x,quote:b,baseUnitInfo:v,quoteUnitInfo:m,maxSell:null,maxBuys:{},maxSellRequested:!1,candleCaches:{},baseCfg:d,quoteCfg:h,rateConversionFactor:g,sellBalance:0,buyBalance:0,bookLoaded:!1},this.market=w,this.mm.setMarket(t,n,r),this.mmRunning=void 0,o.lotSize.textContent=We.formatCoinValue(w.cfg.lotsize,w.baseUnitInfo),o.rateStep.textContent=We.formatCoinValue(w.cfg.ratestep/g),this.displayMessageIfMissingWallet(),this.balanceWgt.setWallets(t,n,r),this.setMarketDetails(),this.setCurrMarketPrice(),La.request("loadmarket",ro(t,n,r)),k.storeLocal(k.lastMarketLK,{host:t,base:n,quote:r}),vt().updateMarketElements(this.main,n,r,a),this.marketList.select(t,n,r),this.setLoaderMsgVisibility(),this.setTokenApprovalVisibility(),this.setRegistrationStatusVisibility(),this.resolveOrderFormVisibility(),this.setOrderBttnText(),this.setOrderBttnEnabled(!1,ke(ae)),this.setCandleDurBttns(),this.previewQuoteAmt(!1),this.updateTitle(),this.reputationMeter.setHost(a.host),this.updateReputation(),this.loadUserOrders();case 56:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return q.apply(this,arguments)})},{key:"displayMessageIfMissingWallet",value:function(){var e,t,n,r,a=this.page,o=this.market,s=o.baseCfg.symbol.toLocaleUpperCase(),i=o.quoteCfg.symbol.toLocaleUpperCase(),c="";if(We.hide(a.noWallet),null!==(e=o.base)&&void 0!==e&&e.wallet||null!==(t=o.quote)&&void 0!==t&&t.wallet)if(null!==(n=o.base)&&void 0!==n&&n.wallet){if(null!==(r=o.quote)&&void 0!==r&&r.wallet)return;c=ke(oe,{asset:i})}else c=ke(oe,{asset:s});else c=ke("NO_WALLET_MSG",{asset1:s,asset2:i});a.noWallet.textContent=c,We.show(a.noWallet)}},{key:"reportDepthClick",value:function(e){this.page.rateField.value=String(e),this.rateFieldChanged()}},{key:"reportDepthVolume",value:function(e){var t=this.page,n=this.market,r=n.baseUnitInfo,a=n.quoteUnitInfo;t.sellBookedBase.textContent=We.formatCoinValue(e.sellBase*r.conventional.conversionFactor,r),t.sellBookedQuote.textContent=We.formatCoinValue(e.sellQuote*a.conventional.conversionFactor,a),t.buyBookedBase.textContent=We.formatCoinValue(e.buyBase*r.conventional.conversionFactor,r),t.buyBookedQuote.textContent=We.formatCoinValue(e.buyQuote*a.conventional.conversionFactor,a)}},{key:"reportDepthMouse",value:function(e){for(;this.hovers.length;)this.hovers.shift().classList.remove("hover");var t=this.page;if(e){We.show(t.depthLegend);for(var n=0,r=Object.values(this.metaOrders);n<r.length;n++){var a=r[n],o=a.div,s=a.ord;2===s.status&&e.hoverMarkers.indexOf(s.rate)>-1&&(o.classList.add("hover"),this.hovers.push(o))}t.hoverPrice.textContent=We.formatCoinValue(e.rate),t.hoverVolume.textContent=We.formatCoinValue(e.depth),t.hoverVolume.style.color=e.dotColor}else We.hide(t.depthLegend)}},{key:"reportDepthZoom",value:function(e){k.storeLocal(k.depthZoomLK,e)}},{key:"reportMouseCandle",value:function(e){var t=this.page;e?(We.show(t.candlesLegend),t.candleStart.textContent=We.formatCoinValue(e.startRate/this.market.rateConversionFactor),t.candleEnd.textContent=We.formatCoinValue(e.endRate/this.market.rateConversionFactor),t.candleHigh.textContent=We.formatCoinValue(e.highRate/this.market.rateConversionFactor),t.candleLow.textContent=We.formatCoinValue(e.lowRate/this.market.rateConversionFactor),t.candleVol.textContent=We.formatCoinValue(e.matchVolume,this.market.baseUnitInfo)):We.hide(t.candlesLegend)}},{key:"parseOrder",value:function(){var e=this.page,t=e.qtyField,n=this.isLimit(),r=this.isSell(),a=this.market,o=a.baseUnitInfo.conventional.conversionFactor;return n||r||(t=e.mktBuyField,o=a.quoteUnitInfo.conventional.conversionFactor),{host:a.dex.host,isLimit:n,sell:r,base:a.base.id,quote:a.quote.id,qty:oo(t.value||"",o),rate:oo(e.rateField.value||"",a.rateConversionFactor),tifnow:e.tifNow.checked||!1,options:{}}}},{key:"previewQuoteAmt",value:function(e){var t=this.page;if(this.market.base&&this.market.quote){var n=this.currentOrder=this.parseOrder(),r=this.adjustedRate();if(t.orderErr.textContent="",r&&(n.sell?this.preSell():this.preBuy()),this.depthLines.input=[],r&&this.isLimit()&&(this.depthLines.input=[{rate:n.rate/this.market.rateConversionFactor,color:n.sell?this.depthChart.theme.sellLine:this.depthChart.theme.buyLine}]),this.drawChartLines(),!e||!r||!n.qty)return t.orderPreview.textContent="",void this.drawChartLines();var a=vt().assets[n.quote].unitInfo.conventional.unit,o=n.qty*n.rate/Dt,s=We.formatCoinValue(o,this.market.quoteUnitInfo);t.orderPreview.textContent=ke("ORDER_PREVIEW",{total:s,asset:a}),this.isSell()?this.preSell():this.preBuy()}}},{key:"preSell",value:function(){var e=this,t=this.market,n=vt().assets[t.base.id].wallet;return n.balance.available<t.cfg.lotsize?(this.setMaxOrder(null),void this.updateOrderBttnState()):t.maxSell?(this.setMaxOrder(t.maxSell.swap),void this.updateOrderBttnState()):void(t.maxSellRequested||(t.maxSellRequested=!0,this.scheduleMaxEstimate("/api/maxsell",{},0,(function(r){t.maxSellRequested=!1,t.maxSell=r.maxSell,t.sellBalance=n.balance.available,e.setMaxOrder(r.maxSell.swap),e.updateOrderBttnState()}))))}},{key:"preBuy",value:function(){var e=this,t=this.market,n=this.adjustedRate(),r=vt().assets[t.quote.id].wallet;if(r){var a=t.cfg.lotsize*(n/Dt);if(r.balance.available<a)return this.setMaxOrder(null),void this.updateOrderBttnState();if(t.maxBuys[n])return this.setMaxOrder(t.maxBuys[n].swap),void this.updateOrderBttnState();var o=Object.keys(t.maxBuys).length?350:0;this.scheduleMaxEstimate("/api/maxbuy",{rate:n},o,(function(r){t.maxBuys[n]=r.maxBuy,t.buyBalance=vt().assets[t.quote.id].wallet.balance.available,e.setMaxOrder(r.maxBuy.swap),e.updateOrderBttnState()}))}}},{key:"scheduleMaxEstimate",value:function(e,t,n,r){var a=this,o=this.page;this.maxLoaded||(this.maxLoaded=vt().loading(o.maxOrd));var i=[this.market.base.id,this.market.quote.id],c=i[0],l=i[1],u=[vt().assets[c].wallet,vt().assets[l].wallet],d=u[0],h=u[1];if(d&&d.running&&h&&h.running){this.maxEstimateTimer&&window.clearTimeout(this.maxEstimateTimer),We.show(o.maxOrd,o.maxLotBox),We.hide(o.maxAboveZero,o.maxZeroNoFees,o.maxZeroNoBal),o.maxFromLots.textContent=ke("CALCULATING"),o.maxFromLotsLbl.textContent="",this.maxOrderUpdateCounter++;var p=this.maxOrderUpdateCounter;this.maxEstimateTimer=window.setTimeout(s(f().mark((function n(){var s;return f().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(a.maxEstimateTimer=null,p===a.maxOrderUpdateCounter){n.next=3;break}return n.abrupt("return");case 3:return n.next=5,S(e,Ma({host:a.market.dex.host,base:c,quote:l},t));case 5:if(s=n.sent,p===a.maxOrderUpdateCounter){n.next=8;break}return n.abrupt("return");case 8:if(vt().checkResponse(s)){n.next=13;break}return console.warn("max order estimate not available:",s),o.maxFromLots.textContent=ke("ESTIMATE_UNAVAILABLE"),a.maxLoaded&&(a.maxLoaded(),a.maxLoaded=null),n.abrupt("return");case 13:r(s);case 14:case"end":return n.stop()}}),n)}))),n)}}},{key:"setMaxOrder",value:function(e){var t=this.page;this.maxLoaded&&(this.maxLoaded(),this.maxLoaded=null),We.show(t.maxOrd,t.maxLotBox);var n=this.isSell(),r=0;if(e&&(r=e.lots),t.maxFromLots.textContent=r.toString(),t.maxFromLotsLbl.textContent=ke(1===r?"LOT":"LOTS"),e){var a=n?this.market.base:this.market.quote;if(0===r){var o=this.market.cfg.lotsize;if(!n){var s=this.anyRate()[1];if(0===s)return;o*=s}if(a.wallet.balance.available/o>0){if(a.token){var i=vt().assets[a.token.parentID],c=i.wallet.balance.available,l=i.unitInfo;return void(c<e.feeReservesPerLot&&(We.show(t.maxZeroNoFees),t.maxZeroNoFeesTicker.textContent=l.conventional.unit,t.maxZeroMinFees.textContent=We.formatCoinValue(e.feeReservesPerLot,l)))}if(a.wallet.balance.available/(o+e.feeReservesPerLot)>0)return}return We.show(t.maxZeroNoBal),void(t.maxZeroNoBalTicker.textContent=a.unitInfo.conventional.unit)}We.show(t.maxAboveZero),t.maxFromAmt.textContent=We.formatCoinValue(e.value||0,a.unitInfo),t.maxFromTicker.textContent=a.unitInfo.conventional.unit}}},{key:"validateOrder",value:function(e){var t=this.page,n=this.market,r=n.cfg.minimumRate,a=n.rateConversionFactor;if(e.isLimit){if(!e.rate)return We.show(t.orderErr),t.orderErr.textContent=ke("NO_ZERO_RATE"),!1;if(e.rate<r){We.show(t.orderErr);var o=e.rate/a,s=r/a;return t.orderErr.textContent="rate is lower than the market's minimum rate. ".concat(o," < ").concat(s),!1}}return!!e.qty||(We.show(t.orderErr),t.orderErr.textContent=ke("NO_ZERO_QUANTITY"),!1)}},{key:"handleBook",value:function(e){var t,n=this.market,r=n.cfg,a=n.baseUnitInfo,o=n.quoteUnitInfo,s=n.baseCfg,i=n.quoteCfg;this.book=new Ra(e,s.symbol,i.symbol),this.loadTable();var c,l=qa(e.book.epoch||[]);try{for(l.s();!(c=l.n()).done;){var u=c.value;u.rate>0&&this.book.add(u),this.addTableOrder(u)}}catch(e){l.e(e)}finally{l.f()}if(!this.book)return this.depthChart.clear(),We.empty(this.page.buyRows),void We.empty(this.page.sellRows);We.show(this.page.epochLine),this.loadingAnimations.depth&&this.loadingAnimations.depth.stop(),this.depthChart.canvas.classList.remove("invisible"),this.depthChart.set(this.book,r.lotsize,r.ratestep,a,o),this.recentMatches=null!==(t=e.book.recentMatches)&&void 0!==t?t:[],this.refreshRecentMatchesTable()}},{key:"midGapConventional",value:function(){var e=this.midGap();if(!e)return e;var t=this.market,n=t.baseUnitInfo,r=t.quoteUnitInfo;return e*n.conventional.conversionFactor/r.conventional.conversionFactor}},{key:"midGap",value:function(){var e=this.book;if(e)return e.buys&&e.buys.length?e.sells&&e.sells.length?(e.buys[0].msgRate+e.sells[0].msgRate)/2/Dt:e.buys[0].msgRate/Dt:e.sells&&e.sells.length?e.sells[0].msgRate/Dt:null}},{key:"setMarketBuyOrderEstimate",value:function(){var e=this.market,t=e.cfg.lotsize,n=vt().user.exchanges[e.dex.host].markets[e.sid].buybuffer,r=this.midGapConventional();r&&(this.page.minMktBuy.textContent=We.formatCoinValue(t*n*r,e.baseUnitInfo))}},{key:"maxUserOrderCount",value:function(){var e=this.market,t=e.dex.host,n=e.cfg.name;return Math.max(10,vt().orders(t,n).length)}},{key:"loadUserOrders",value:(R=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l,u,d,h,p;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(s in t=this.market,n=t.base,r=t.quote,a=t.dex.host,o=t.cfg.name,this.metaOrders)delete this.metaOrders[s];if(n&&r){e.next=4;break}return e.abrupt("return",this.resolveUserOrders([]));case 4:if(!((i=vt().orders(a,o)).length>=10)){e.next=7;break}return e.abrupt("return",this.resolveUserOrders(i));case 7:return c={hosts:[a],market:{baseID:n.id,quoteID:r.id},n:this.maxUserOrderCount()},e.next=10,S("/api/orders",c);case 10:l=e.sent,u=l.orders||[],d=qa(i),e.prev=13,p=f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=h.value,u.some((function(e){return e.id===t.id}))||u.push(t);case 2:case"end":return e.stop()}}),e)})),d.s();case 16:if((h=d.n()).done){e.next=20;break}return e.delegateYield(p(),"t0",18);case 18:e.next=16;break;case 20:e.next=25;break;case 22:e.prev=22,e.t1=e.catch(13),d.e(e.t1);case 25:return e.prev=25,d.f(),e.finish(25);case 28:return e.abrupt("return",this.resolveUserOrders(l.orders||[]));case 29:case"end":return e.stop()}}),e,this,[[13,22,25,28]])}))),function(){return R.apply(this,arguments)})},{key:"refreshActiveOrders",value:function(){var e=vt().orders(this.market.dex.host,ao(this.market.baseCfg.symbol,this.market.quoteCfg.symbol));return this.resolveUserOrders(e)}},{key:"resolveUserOrders",value:function(e){var t,n,r,a=this,o=this.page,s=this.metaOrders,i=this.market,c=i.cfg,l=function(e){return e.status<3||Et(e)},u=qa(e);try{for(u.s();!(r=u.n()).done;){var d=r.value;s[d.id]={ord:d}}}catch(e){u.e(e)}finally{u.f()}var h=Object.keys(s).map((function(e){return s[e]}));h.sort((function(e,t){var n=[l(e.ord),l(t.ord)],r=n[0],a=n[1];return r&&!a?-1:!r&&a?1:t.ord.submitTime-e.ord.submitTime}));var p=this.maxUserOrderCount();for(var f in h.length>p&&(h=h.slice(0,p)),s)delete s[f];We.empty(o.userOrders),We.setVis(null===(t=h)||void 0===t?void 0:t.length,o.userOrders),We.setVis(!(null!==(n=h)&&void 0!==n&&n.length),o.userNoOrders);var v,m=!1,g=qa(h);try{var y=function(){var e=v.value,t=o.userOrderTmpl.cloneNode(!0);o.userOrders.appendChild(t);var n=We.parseTemplate(t),r=We.parseTemplate(n.header),u=We.parseTemplate(n.details);e.div=t,e.header=r,e.details=u;var d,h=e.ord,p=h.id,f=l(h);p&&(s[p]=e),!h.readyToTick&&Et(h)&&(n.header.classList.add("unready-user-order"),m=!0),r.sideLight.classList.add(h.sell?"sell":"buy"),f||r.sideLight.classList.add("inactive"),u.side.textContent=e.header.side.textContent=It(h),u.side.classList.add(h.sell?"sellcolor":"buycolor"),r.side.classList.add(h.sell?"sellcolor":"buycolor"),u.qty.textContent=e.header.qty.textContent=We.formatCoinValue(h.qty,i.baseUnitInfo),d=2===h.type?a.marketOrderRateString(h,i):We.formatRateFullPrecision(h.rate,i.baseUnitInfo,i.quoteUnitInfo,c.ratestep),u.rate.textContent=e.header.rate.textContent=d,r.baseSymbol.textContent=i.baseUnitInfo.conventional.unit,u.type.textContent=function(e){switch(e){case 1:return ke(X);case 2:return ke(K);default:return ke("CANCEL_ORDER")}}(h.type),a.updateMetaOrder(e),We.bind(t,"mouseenter",(function(){a.activeMarkerRate=h.rate,a.setDepthMarkers()}));var g,y=function(e){e.stopPropagation(),a.showCancel(t,p)},x=function(e){e.stopPropagation(),a.showAccelerate(h)};p?(Wt(h)&&(We.show(u.cancelBttn),Va(u.cancelBttn,"click",(function(e){y(e)}))),Va(u.accelerateBttn,"click",(function(e){x(e)})),vt().canAccelerateOrder(h)&&We.show(u.accelerateBttn),u.link.href="order/".concat(p),vt().bindInternalNavigation(t)):(We.hide(u.accelerateBttn),We.hide(u.cancelBttn),We.hide(u.link)),We.bind(n.header,"click",(function(){if(We.isDisplayed(n.details))return We.hide(n.details),r.expander.classList.add("ico-arrowdown"),void r.expander.classList.remove("ico-arrowup");We.show(n.details),r.expander.classList.remove("ico-arrowdown"),r.expander.classList.add("ico-arrowup"),g&&g.remove()})),We.bind(n.header,"mouseenter",(function(){if(!We.isDisplayed(n.details)){g&&g.remove();var e=document.createElement("div");g=e,document.body.appendChild(e),e.className="user-order-floaty-menu";var r=We.layoutMetrics(n.header),s=r.bodyTop+r.height;e.style.top="".concat(s-1,"px"),e.style.left="".concat(r.bodyLeft,"px");var i=a.metaOrders[p].ord,c=function(t,n){var r=t.cloneNode(!0);e.appendChild(r),We.show(r),We.bind(r,"click",(function(e){n(e)}))};Wt(i)&&c(u.cancelBttn,(function(e){y(e)})),vt().canAccelerateOrder(i)&&c(u.accelerateBttn,(function(e){x(e)})),e.appendChild(u.link.cloneNode(!0));var l=o.orderScroller.scrollTop,d=function n(r){var a=o.orderScroller.scrollTop-l;e.style.top="".concat(s+a,"px"),We.mouseInElement(r,e)||We.mouseInElement(r,t)||(e.remove(),g=null,document.removeEventListener("mousemove",n),o.orderScroller.removeEventListener("scroll",n))};document.addEventListener("mousemove",d),o.orderScroller.addEventListener("scroll",d)}})),vt().bindTooltips(t)};for(g.s();!(v=g.n()).done;)y()}catch(e){g.e(e)}finally{g.f()}We.setVis(m,o.unreadyOrdersMsg),this.setDepthMarkers()}},{key:"marketOrderRateString",value:function(e,t){var n;if(null===(n=e.matches)||void 0===n||!n.length)return ke(K);var r=We.formatRateFullPrecision(Mt(e),t.baseUnitInfo,t.quoteUnitInfo,t.cfg.ratestep);return e.matches.length>1&&(r="~ "+r),r}},{key:"updateMetaOrder",value:function(e){var t=e.header,n=e.details,r=e.ord;r.status<=2||Et(r)?t.activeLight.classList.add("active"):t.activeLight.classList.remove("active"),n.status.textContent=t.status.textContent=Bt(r),n.age.textContent=We.timeSince(r.submitTime),n.filled.textContent="".concat((Pt(r)/r.qty*100).toFixed(1),"%"),n.settled.textContent="".concat((Lt(r)/r.qty*100).toFixed(1),"%")}},{key:"setDepthMarkers",value:function(){for(var e={buys:[],sells:[]},t=this.market.rateConversionFactor,n=0,r=Object.values(this.metaOrders);n<r.length;n++){var a=r[n].ord;a.rate&&2===a.status&&(a.sell?e.sells.push({rate:a.rate/t,active:a.rate===this.activeMarkerRate}):e.buys.push({rate:a.rate/t,active:a.rate===this.activeMarkerRate}))}this.depthChart.setMarkers(e),this.book&&this.depthChart.draw()}},{key:"updateTitle",value:function(){var e=this.midGapConventional(),t=this.market,n=t.baseUnitInfo.conventional.unit,r=t.quoteUnitInfo.conventional.unit;document.title=e?"".concat(We.formatCoinValue(e)," | ").concat(n).concat(r," | ").concat(this.ogTitle):"".concat(n).concat(r," | ").concat(this.ogTitle)}},{key:"handleBookRoute",value:function(e){vt().log("book","handleBookRoute:",e);var t=e.payload,n=this.market,r=n.baseCfg,a=n.quoteCfg,o=n.dex.host;t.base===r.id&&t.quote===a.id&&e.host===o&&(this.handleBook(t),this.market.bookLoaded=!0,this.updateTitle(),this.setMarketBuyOrderEstimate())}},{key:"handleBookOrderRoute",value:function(e){if(vt().log("book","handleBookOrderRoute:",e),e.host===this.market.dex.host&&e.marketID===this.market.sid){var t=e.payload;t.rate>0&&this.book.add(t),this.addTableOrder(t),this.updateTitle(),this.depthChart.draw()}}},{key:"handleUnbookOrderRoute",value:function(e){if(vt().log("book","handleUnbookOrderRoute:",e),e.host===this.market.dex.host&&e.marketID===this.market.sid){var t=e.payload;this.book.remove(t.token),this.removeTableOrder(t),this.updateTitle(),this.depthChart.draw()}}},{key:"handleUpdateRemainingRoute",value:function(e){if(vt().log("book","handleUpdateRemainingRoute:",e),e.host===this.market.dex.host&&e.marketID===this.market.sid){var t=e.payload;this.book.updateRemaining(t.token,t.qty,t.qtyAtomic),this.updateTableOrder(t),this.depthChart.draw()}}},{key:"handleEpochOrderRoute",value:function(e){if(vt().log("book","handleEpochOrderRoute:",e),e.host===this.market.dex.host&&e.marketID===this.market.sid){var t=e.payload;t.msgRate>0&&this.book.add(t),t.qtyAtomic>0&&this.addTableOrder(t),this.depthChart.draw()}}},{key:"handleCandlesRoute",value:function(e){if(this.candlesLoading&&(clearTimeout(this.candlesLoading.timer),this.candlesLoading.loaded(),this.candlesLoading=null),e.host===this.market.dex.host&&e.marketID===this.market.cfg.name){var t=e.payload.dur;this.market.candleCaches[t]=e.payload,this.setHighLow(),this.candleDur===t&&(this.loadingAnimations.candles&&this.loadingAnimations.candles.stop(),this.candleChart.canvas.classList.remove("invisible"),this.candleChart.setCandles(e.payload,this.market.cfg,this.market.baseUnitInfo,this.market.quoteUnitInfo))}}},{key:"handleEpochMatchSummary",value:function(e){this.addRecentMatches(e.payload.matchSummaries),this.refreshRecentMatchesTable()}},{key:"handleCandleUpdateRoute",value:function(e){if(e.host===this.market.dex.host){var t=e.payload,n=t.dur,r=t.candle,a=this.market.candleCaches[n];if(a){var o=a.candles;0===o.length?o.push(r):o[o.length-1].startStamp===r.startStamp?o[o.length-1]=r:o.push(r),this.candleDur===n&&this.candleChart.draw()}}}},{key:"showToggleWalletStatus",value:function(e){var t=this.page;this.openAsset=e,We.hide(t.toggleWalletStatusErr,t.walletStatusDisable,t.disableWalletMsg),We.show(t.walletStatusEnable,t.enableWalletMsg),this.forms.show(t.toggleWalletStatusConfirm)}},{key:"toggleWalletStatus",value:(A=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,We.hide(t.toggleWalletStatusErr),n={assetID:this.openAsset.id,disable:!1},r=vt().loading(t.toggleWalletStatusConfirm),e.next=7,S("/api/togglewalletstatus",n);case 7:if(a=e.sent,r(),vt().checkResponse(a)){e.next=13;break}return t.toggleWalletStatusErr.textContent=a.msg,We.show(t.toggleWalletStatusErr),e.abrupt("return");case 13:We.hide(this.page.forms),this.balanceWgt.updateAsset(this.openAsset.id);case 15:case"end":return e.stop()}}),e,this)}))),function(){return A.apply(this,arguments)})},{key:"showVerify",value:function(){this.preorderCache={};var e,t=this.page,n=this.currentOrder=this.parseOrder(),r=n.sell,a=vt().assets[n.base],o=vt().assets[n.quote],s=r?o:a,i=r?a:o,c=function(e){switch(e.dataset.icon){case"from":if(i.token){var t=vt().assets[i.token.parentID];e.src=We.logoPath(t.symbol)}else e.src=We.logoPath(i.symbol);break;case"to":if(s.token){var n=vt().assets[s.token.parentID];e.src=We.logoPath(n.symbol)}else e.src=We.logoPath(s.symbol)}},l=qa(We.applySelector(t.vDetailPane,"[data-icon]"));try{for(l.s();!(e=l.n()).done;)c(e.value)}catch(e){l.e(e)}finally{l.f()}var u,d=qa(We.applySelector(t.vFeeSummary,"[data-icon]"));try{for(d.s();!(u=d.n()).done;)c(u.value)}catch(e){d.e(e)}finally{d.f()}We.hide(t.vPreorderErr),We.show(t.vPreorder),t.vBuySell.textContent=ke(r?"SELLING":"BUYING");var h=ke(r?B:E);if(t.vSideSubmit.textContent=h,t.vOrderHost.textContent=n.host,n.isLimit){We.show(t.verifyLimit),We.hide(t.verifyMarket);var p="Limit ".concat(h," Order");t.vOrderType.textContent=n.tifnow?p+" (immediate)":p,t.vRate.textContent=We.formatCoinValue(n.rate/this.market.rateConversionFactor),t.vQty.textContent=We.formatCoinValue(n.qty,a.unitInfo);var f=n.rate/Dt*n.qty;t.vTotal.textContent=We.formatCoinValue(f,o.unitInfo),this.showFiatValue(o.id,f,t.vFiatTotal)}else{We.hide(t.verifyLimit),We.show(t.verifyMarket),t.vOrderType.textContent="Market ".concat(h," Order");var v=n.sell?this.market.baseUnitInfo:this.market.quoteUnitInfo;t.vmFromTotal.textContent=We.formatCoinValue(n.qty,v),t.vmFromAsset.textContent=i.symbol.toUpperCase(),this.showFiatValue(i.id,n.qty,t.vmFromTotalFiat);var m=this.midGap();if(m){We.show(t.vMarketEstimate);var g=n.sell?n.qty*m:n.qty/m;t.vmToTotal.textContent=We.formatCoinValue(g,s.unitInfo),t.vmToAsset.textContent=s.symbol.toUpperCase(),this.showFiatValue(s.id,g,t.vmTotalFiat)}else We.hide(t.vMarketEstimate)}r?(t.vHeader.classList.add(Qa),t.vHeader.classList.remove(Ka),t.vSubmit.classList.add(Qa),t.vSubmit.classList.remove(Ka)):(t.vHeader.classList.add(Ka),t.vHeader.classList.remove(Qa),t.vSubmit.classList.add(Ka),t.vSubmit.classList.remove(Qa)),this.showVerifyForm(),a.wallet.open&&o.wallet.open?this.preOrder(n):(We.hide(t.vPreorder),this.unlockWalletsForEstimates())}},{key:"showFiatValue",value:function(e,t,n){if(n){var r=vt().fiatRatesMap[e];n.textContent=We.formatFiatConversion(t,r,vt().unitInfo(e)),r?We.show(n.parentElement):We.hide(n.parentElement)}}},{key:"showVerifyForm",value:(I=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.page,We.hide(t.vErr),this.forms.show(t.verifyForm);case 3:case"end":return e.stop()}}),e,this)}))),function(){return I.apply(this,arguments)})},{key:"unlockWalletsForEstimates",value:(D=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=vt().loading(t.verifyForm),e.next=4,this.unlockMarketWallets();case 4:n(),We.show(t.vPreorder),this.preOrder(this.parseOrder());case 7:case"end":return e.stop()}}),e,this)}))),function(){return D.apply(this,arguments)})},{key:"unlockWallet",value:(T=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/openwallet",{assetID:t});case 2:if(n=e.sent,vt().checkResponse(n)){e.next=5;break}throw Error("error unlocking wallet "+n.msg);case 5:this.balanceWgt.updateAsset(t);case 6:case"end":return e.stop()}}),e,this)}))),function(e){return T.apply(this,arguments)})},{key:"unlockMarketWallets",value:(F=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(t=this.market,n=t.base,r=t.quote,a=[],n.wallet.open||a.push(n.id),r.wallet.open||a.push(r.id),o=0,s=a;o<s.length;o++)i=s[o],this.unlockWallet(i);case 5:case"end":return e.stop()}}),e,this)}))),function(){return F.apply(this,arguments)})},{key:"fetchPreorder",value:(C=s(f().mark((function e(t){var n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,r=JSON.stringify(t.options),!(a=this.preorderCache[r])){e.next=5;break}return e.abrupt("return",a);case 5:return We.hide(n.vPreorderErr),o=vt().loading(n.verifyForm),e.next=9,S("/api/preorder",io(t));case 9:if(s=e.sent,o(),vt().checkResponse(s)){e.next=13;break}return e.abrupt("return",{err:s.msg});case 13:return this.preorderCache[r]=s.estimate,e.abrupt("return",s.estimate);case 15:case"end":return e.stop()}}),e,this)}))),function(e){return C.apply(this,arguments)})},{key:"setPreorderErr",value:function(e){var t=this.page;We.hide(t.vPreorder),We.show(t.vPreorderErr),t.vPreorderErrTip.dataset.tooltip=e}},{key:"showPreOrderAdvancedOptions",value:function(){var e=this.page;We.hide(e.showAdvancedOptions),We.show(e.hideAdvancedOptions,e.vOtherOrderOpts)}},{key:"hidePreOrderAdvancedOptions",value:function(){var e=this.page;We.hide(e.hideAdvancedOptions,e.vOtherOrderOpts),We.show(e.showAdvancedOptions)}},{key:"reloadOrderOpts",value:function(e,t,n,r){var a=this.page;We.empty(a.vDefaultOrderOpts,a.vOtherOrderOpts);var o,s=function(t,n){var o=function(e,t,n,r){var a,o,s=r&&t.sell||!r&&!t.sell,i=(a=t.host,o=s?t.base:t.quote,vt().exchanges[a].assets[o].symbol);switch(!0){case!!e.boolean:return new kt(e,i,t.options,n).node;case!!e.xyRange:return new wt(e,i,t.options,n).node;default:console.error("no option type specified",e)}return console.error("unknown option type",e),document.createElement("div")}(t,e,r,n);t.showByDefault?a.vDefaultOrderOpts.appendChild(o):a.vOtherOrderOpts.appendChild(o)},i=qa(t.options||[]);try{for(i.s();!(o=i.n()).done;)s(o.value,!0)}catch(e){i.e(e)}finally{i.f()}var c,l=qa(n.options||[]);try{for(l.s();!(c=l.n()).done;)s(c.value,!1)}catch(e){l.e(e)}finally{l.f()}vt().bindTooltips(a.vDefaultOrderOpts),vt().bindTooltips(a.vOtherOrderOpts)}},{key:"preOrder",value:(w=s(f().mark((function e(t){var n,r,a=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=this.page,r=function(){var e=s(f().mark((function e(){var o,i,c,l,u;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,a.fetchPreorder(t);case 2:if(!(o=e.sent).err){e.next=5;break}return e.abrupt("return",a.setPreorderErr(o.err));case 5:i=o,We.hide(n.vPreorderErr),We.show(n.vPreorder),c=i.swap,l=i.redeem,c.options=c.options||[],l.options=l.options||[],a.setFeeEstimates(c,l,t),u=function(){var e=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,r();case 2:We.animate(400,(function(e){n.vFeeSummary.style.backgroundColor="rgba(128, 128, 128, ".concat(.5-.5*e,")")}));case 3:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),We.bind(n.showAdvancedOptions,"click",(function(){a.showPreOrderAdvancedOptions()})),We.bind(n.hideAdvancedOptions,"click",(function(){a.hidePreOrderAdvancedOptions()})),a.reloadOrderOpts(t,c,l,u);case 16:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),r();case 3:case"end":return e.stop()}}),e,this)}))),function(e){return w.apply(this,arguments)})},{key:"setFeeEstimates",value:function(e,t,n){var r=this.page,a=this.market;if(e.estimate&&t.estimate){We.show(r.vPreorderEstimates);var o=a.baseUnitInfo,s=a.quoteUnitInfo,i=a.rateConversionFactor,c=function(e){return e<.05?"< 0.1":Ja.format(e)},l=1,u=1,d=o,h=s;if(a.base.token){var p=vt().assets[a.base.token.parentID];d=p.unitInfo;var f=vt().fiatRatesMap[a.base.id],v=vt().fiatRatesMap[p.id];l=f&&v?v/f*o.conventional.conversionFactor/p.unitInfo.conventional.conversionFactor:0}if(a.quote.token){var m=vt().assets[a.quote.token.parentID];h=m.unitInfo;var g=vt().fiatRatesMap[a.quote.id],y=vt().fiatRatesMap[m.id];u=g&&y?y/g*s.conventional.conversionFactor/m.unitInfo.conventional.conversionFactor:0}var x=d,b=h,k=l,w=u;if(this.currentOrder.sell){var C=[x,b];b=C[0],x=C[1];var S=[k,w];w=S[0],k=S[1]}var F=e.estimate.value||0,T=w>0?F/w:F,D=e.estimate.realisticBestCase/T*100;r.vSwapFeesLowPct.textContent=w<=0?"":"(".concat(c(D),"%)"),r.vSwapFeesLow.textContent=We.formatCoinValue(e.estimate.realisticBestCase,b);var I=e.estimate.realisticWorstCase/T*100;r.vSwapFeesHighPct.textContent=w<=0?"":"(".concat(c(I),"%)"),r.vSwapFeesHigh.textContent=We.formatCoinValue(e.estimate.realisticWorstCase,b);var A=e.estimate.maxFees/T*100;r.vSwapFeesMaxPct.textContent=w<=0?"":"(".concat(c(A),"%)"),r.vSwapFeesMax.textContent=We.formatCoinValue(e.estimate.maxFees,b);var R=this.midGap()||n.rate/i,E=n.sell?F*R:F/R,B=k>0?E/k:E,P=t.estimate.realisticBestCase/B*100;r.vRedeemFeesLowPct.textContent=k<=0?"":"(".concat(c(P),"%)"),r.vRedeemFeesLow.textContent=We.formatCoinValue(t.estimate.realisticBestCase,x);var L=t.estimate.realisticWorstCase/B*100;r.vRedeemFeesHighPct.textContent=k<=0?"":"(".concat(c(L),"%)"),r.vRedeemFeesHigh.textContent=We.formatCoinValue(t.estimate.realisticWorstCase,x),l&&u?(We.show(r.vFeeSummaryPct),We.hide(r.vFeeSummary),r.vFeeSummaryLow.textContent=c(D+P),r.vFeeSummaryHigh.textContent=c(I+L)):(We.hide(r.vFeeSummaryPct),We.show(r.vFeeSummary),r.summarySwapFeesLow.textContent=r.vSwapFeesLow.textContent,r.summarySwapFeesHigh.textContent=r.vSwapFeesHigh.textContent,r.summaryRedeemFeesLow.textContent=r.vRedeemFeesLow.textContent,r.summaryRedeemFeesHigh.textContent=r.vRedeemFeesHigh.textContent)}else We.hide(r.vPreorderEstimates)}},{key:"submitCancel",value:(b=s(f().mark((function e(){var t,n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.cancelData,r=n.order,a={orderID:r.id},o=vt().loading(t.cancelSubmit),e.next=7,S("/api/cancel",a);case 7:if(s=e.sent,o(),vt().checkResponse(s)){e.next=13;break}return t.cancelErr.textContent=s.msg,We.show(t.cancelErr),e.abrupt("return");case 13:We.hide(n.bttn,t.forms),r.cancelling=!0;case 15:case"end":return e.stop()}}),e,this)}))),function(){return b.apply(this,arguments)})},{key:"showCancel",value:function(e,t){var n=this.metaOrders[t].ord,r=this.page,a=n.qty-n.filled,o=Rt(n)?this.market.quote:this.market.base;r.cancelRemain.textContent=We.formatCoinValue(a,o.unitInfo),r.cancelUnit.textContent=o.symbol.toUpperCase(),We.hide(r.cancelErr),this.forms.show(r.cancelForm),this.cancelData={bttn:We.tmplElement(e,"cancelBttn"),order:n}}},{key:"showAccelerate",value:function(e){var t=vt().loading(this.main);this.accelerateOrderForm.refresh(e),t(),this.forms.show(this.page.accelerateForm)}},{key:"showCreate",value:function(e){var t=this.page;this.currentCreate=e,this.newWalletForm.setAsset(e.id),this.forms.show(t.newWalletForm)}},{key:"stepSubmit",value:function(){var e=this.page,t=this.market;if(We.hide(e.orderErr),this.validateOrder(this.parseOrder())){var n=vt().walletMap[t.base.id],r=vt().walletMap[t.quote.id];return n?r?void this.showVerify():(e.orderErr.textContent=ke(L,{asset:t.quote.symbol}),void We.show(e.orderErr)):(e.orderErr.textContent=ke(L,{asset:t.base.symbol}),void We.show(e.orderErr))}}},{key:"showDeposit",value:(m=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.depositAddrForm.setAsset(t),this.forms.show(this.page.deposit);case 2:case"end":return e.stop()}}),e,this)}))),function(e){return m.apply(this,arguments)})},{key:"showCustomProviderDialog",value:function(e){vt().loadPage("wallets",{promptProvider:e,goBack:"markets"})}},{key:"handlePriceUpdate",value:function(e){this.market&&(e.host===this.market.dex.host&&e.spots[this.market.cfg.name]&&this.setCurrMarketPrice(),this.marketList.updateSpots(e))}},{key:"handleWalletState",value:(p=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.market){e.next=2;break}return e.abrupt("return");case 2:if(t.wallet.assetID===(null===(n=this.market.base)||void 0===n?void 0:n.id)||t.wallet.assetID===(null===(r=this.market.quote)||void 0===r?void 0:r.id)){e.next=4;break}return e.abrupt("return");case 4:this.setTokenApprovalVisibility(),this.resolveOrderFormVisibility();case 6:case"end":return e.stop()}}),e,this)}))),function(e){return p.apply(this,arguments)})},{key:"handleBondUpdate",value:(u=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.dex,this.market){e.next=3;break}return e.abrupt("return");case 3:if(n===this.market.dex.host){e.next=5;break}return e.abrupt("return");case 5:if("AccountRegistered"!==t.topic){e.next=8;break}return e.next=8,vt().fetchUser();case 8:this.market.dex=vt().exchanges[n],this.setRegistrationStatusVisibility(),this.updateReputation();case 11:case"end":return e.stop()}}),e,this)}))),function(e){return u.apply(this,arguments)})},{key:"updateReputation",value:function(){var e=this.page,t=this.market,n=t.dex.host,r=t.cfg,o=t.baseCfg.unitInfo,s=t.quoteCfg.unitInfo,i=vt().exchanges[n].auth;e.parcelSizeLots.textContent=String(r.parcelsize),e.marketLimitBase.textContent=We.formatFourSigFigs(r.parcelsize*r.lotsize/o.conventional.conversionFactor),e.marketLimitBaseUnit.textContent=o.conventional.unit,e.marketLimitQuoteUnit.textContent=s.conventional.unit;var c=this.anyRate()[1];if(c){var l=r.lotsize*c;e.marketLimitQuote.textContent=We.formatFourSigFigs(r.parcelsize*l/s.conventional.conversionFactor)}else e.marketLimitQuote.textContent="-";var u=fn(i);e.tradingTier.textContent=String(u);var d=function(e){for(var t=vt().exchanges[e],n=t.auth,r=t.maxScore,a=t.markets,o=n.rep.score,s=fn(n),i=0,c=0,l=Object.values(a);c<l.length;c++){var u,d=l[c],h=0,p=dn(d.inflight||[]);try{for(p.s();!(u=p.n()).done;)h+=In(u.value,d)}catch(e){p.e(e)}finally{p.f()}var f,v=dn(d.orders||[]);try{for(v.s();!(f=v.n()).done;)h+=In(f.value,d)}catch(e){v.e(e)}finally{v.f()}i+=h/(d.parcelsize*d.lotsize)}return[i,2*An(o,r)*s]}(n),h=a(d,2),p=h[0],f=h[1];e.tradingLimit.textContent=(f*r.parcelsize).toFixed(2),e.limitUsage.textContent=f>0?(p/f*100).toFixed(1):"0",e.orderLimitRemain.textContent=((f-p)*r.parcelsize).toFixed(1),e.orderTradingTier.textContent=String(u),this.reputationMeter.update()}},{key:"anyRate",value:function(){var e=this.market,t=e.cfg.spot,n=e.baseCfg.id,r=e.quoteCfg.id,a=e.rateConversionFactor;if(e.bookLoaded){var o=this.midGap();if(o)return[o*Dt,o,this.midGapConventional()||0]}if(t&&t.rate)return[t.rate,t.rate/Dt,t.rate/a];var s=[vt().fiatRatesMap[n],vt().fiatRatesMap[r]],i=s[0],c=s[1];if(i&&c){var l=i/c,u=l*a;return[u,u/Dt,l]}return[0,0,0]}},{key:"handleMatchNote",value:function(e){var t=this.metaOrders[e.orderID],n=e.match;if(!t)return this.refreshActiveOrders();if(2===t.ord.type&&0===n.status){var r=vt().order(e.orderID);r&&(t.details.rate.textContent=t.header.rate.textContent=this.marketOrderRateString(r,this.market))}(0===n.side&&3===n.status||1===n.side&&4===n.status)&&this.updateReputation(),vt().canAccelerateOrder(t.ord)?We.show(t.details.accelerateBttn):We.hide(t.details.accelerateBttn)}},{key:"handleOrderNote",value:function(e){var t=e.order,n=this.metaOrders[t.id],r="AsyncOrderFailure"===e.topic||"AsyncOrderSubmitted"===e.topic;if(!n||r||"OrderLoaded"===e.topic&&t.readyToTick)return this.refreshActiveOrders();var a=n.ord.status;n.ord=t,"MissedCancel"===e.topic&&We.show(n.details.cancelBttn),t.filled===t.qty&&We.hide(n.details.cancelBttn),vt().canAccelerateOrder(t)?We.show(n.details.accelerateBttn):We.hide(n.details.accelerateBttn),this.updateMetaOrder(n),(1===a&&2===t.status||2===a&&t.status>2)&&(this.setDepthMarkers(),this.updateReputation(),this.mm.readBook())}},{key:"handleEpochNote",value:function(e){if(vt().log("book","handleEpochNote:",e),this.market&&e.host===this.market.dex.host&&e.marketID===this.market.sid){this.book&&(this.book.setEpoch(e.epoch),this.depthChart.draw()),this.clearOrderTableEpochs();for(var t=0,n=Object.values(this.metaOrders);t<n.length;t++){var r=n[t],a=r.ord,o=r.details,s=r.header,i=e.epoch>a.epoch;switch(!0){case 1===a.type&&1===a.status&&i:var c=0===a.tif?ke(O):ke(M);o.status.textContent=s.status.textContent=c,a.status=0===a.tif?3:2;break;case 2===a.type&&1===a.status:o.status.textContent=s.status.textContent=ke(O),a.status=3}}}}},{key:"recentMatchesSortCompare",value:function(){var e=this;switch(this.recentMatchesSortKey){case"rate":return function(t,n){return e.recentMatchesSortDirection*(t.rate-n.rate)};case"qty":return function(t,n){return e.recentMatchesSortDirection*(t.qty-n.qty)};case"age":return function(t,n){return e.recentMatchesSortDirection*(t.stamp-n.stamp)}}}},{key:"refreshRecentMatchesTable",value:function(){var e=this.page,t=this.recentMatches;if(We.empty(e.recentMatchesLiveList),t){var n=this.recentMatchesSortCompare();t.sort(n);var r,a=qa(t);try{for(a.s();!(r=a.n()).done;){var o=r.value,s=e.recentMatchesTemplate.cloneNode(!0),i=We.parseTemplate(s);vt().bindTooltips(s),i.rate.textContent=We.formatCoinValue(o.rate/this.market.rateConversionFactor),i.qty.textContent=We.formatCoinValue(o.qty,this.market.baseUnitInfo),i.age.textContent=We.timeSince(o.stamp),i.age.dataset.sinceStamp=String(o.stamp),s.classList.add(o.sell?"sellcolor":"buycolor"),e.recentMatchesLiveList.append(s)}}catch(e){a.e(e)}finally{a.f()}}}},{key:"addRecentMatches",value:function(e){this.recentMatches=[].concat(r(e),r(this.recentMatches)).slice(0,100)}},{key:"handleBalanceNote",value:function(e){this.approveTokenForm.handleBalanceNote(e),this.preorderCache={};var t=this.market;if(t&&t.dex&&t.dex.connectionStatus===dt.Connected){this.mm.handleBalanceNote(e);var n=this.balanceWgt;e.assetID!==n.base.id&&e.assetID!==n.quote.id||n.setBalanceVisibility(!0);var r=e.balance.available;switch(e.assetID){case t.baseCfg.id:if(!t.maxSell)break;"number"==typeof t.sellBalance&&t.sellBalance!==r&&(t.maxSell=null),this.isSell()&&this.preSell();break;case t.quoteCfg.id:if(!Object.keys(t.maxBuys).length)break;"number"==typeof t.buyBalance&&t.buyBalance!==r&&(t.maxBuys={}),this.isSell()||this.preBuy()}}}},{key:"submitOrder",value:(l=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,We.hide(t.orderErr,t.vErr),n=this.currentOrder,r={order:io(n)},this.validateOrder(n)){e.next=6;break}return e.abrupt("return");case 6:return t.vSubmit.classList.add("d-hide"),t.vLoader.classList.remove("d-hide"),e.next=10,S("/api/tradeasync",r);case 10:if(a=e.sent,t.vSubmit.classList.remove("d-hide"),t.vLoader.classList.add("d-hide"),vt().checkResponse(a)){e.next=17;break}return t.vErr.textContent=a.msg,We.show(t.vErr),e.abrupt("return");case 17:We.hide(t.forms),this.refreshActiveOrders();case 19:case"end":return e.stop()}}),e,this)}))),function(){return l.apply(this,arguments)})},{key:"createWallet",value:(c=s(f().mark((function e(){var t,n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,vt().fetchUser();case 2:if(t=e.sent){e.next=5;break}return e.abrupt("return");case 5:n=t.assets[this.currentCreate.id],We.hide(this.page.forms),(r=this.market).baseCfg.id===n.id?r.base=n:r.quoteCfg.id===n.id&&(r.quote=n),this.balanceWgt.updateAsset(n.id),this.displayMessageIfMissingWallet(),this.resolveOrderFormVisibility();case 12:case"end":return e.stop()}}),e,this)}))),function(){return c.apply(this,arguments)})},{key:"lotChanged",value:function(){var e=this.page,t=parseInt(e.lotField.value||"0");if(t<=0)return e.lotField.value=""===e.lotField.value?"":"0",e.qtyField.value="",this.previewQuoteAmt(!1),void this.setOrderBttnEnabled(!1,ke(re));var n=t*this.market.cfg.lotsize;if(e.lotField.value=String(t),e.qtyField.value=String(n/this.market.baseUnitInfo.conventional.conversionFactor),!this.isLimit()&&this.isSell()){var r=vt().assets[this.market.base.id].wallet;this.setOrderBttnEnabled(n<=r.balance.available,ke(ne))}this.previewQuoteAmt(!0)}},{key:"quantityChanged",value:function(e){var t=this.page,n=this.currentOrder=this.parseOrder();if(n.qty<0)return t.lotField.value="0",t.qtyField.value="",void this.previewQuoteAmt(!1);var r=this.market.cfg.lotsize,a=Math.floor(n.qty/r),o=n.qty=this.currentOrder.qty=a*r;t.lotField.value=String(a),(n.isLimit||n.sell)&&(e&&(t.qtyField.value=String(o/this.market.baseUnitInfo.conventional.conversionFactor)),this.previewQuoteAmt(!0))}},{key:"marketBuyChanged",value:function(){var e=this.page,t=oo(e.mktBuyField.value||"",this.market.quoteUnitInfo.conventional.conversionFactor),n=this.midGap();if(t>0){var r=vt().assets[this.market.quote.id].wallet;this.setOrderBttnEnabled(t<=r.balance.available,ke(te))}else this.setOrderBttnEnabled(!1,ke(re));if(!n||!t)return e.mktBuyLots.textContent="0",void(e.mktBuyScore.textContent="0");var a=t/n,o=a/this.market.cfg.lotsize;e.mktBuyLots.textContent=o.toFixed(1),e.mktBuyScore.textContent=We.formatCoinValue(a,this.market.baseUnitInfo)}},{key:"rateFieldChanged",value:function(){var e=this.adjustedRate();if(e<=0)return this.depthLines.input=[],this.drawChartLines(),this.page.rateField.value="0",this.previewQuoteAmt(!0),void this.updateOrderBttnState();var t=this.currentOrder=this.parseOrder(),n=e/this.market.rateConversionFactor;this.page.rateField.value=String(n),this.depthLines.input=[{rate:n,color:t.sell?this.depthChart.theme.sellLine:this.depthChart.theme.buyLine}],this.drawChartLines(),this.previewQuoteAmt(!0),this.updateOrderBttnState()}},{key:"adjustedRate",value:function(){var e=this.page.rateField.value;if(!e)return NaN;var t=oo(e,this.market.rateConversionFactor);return t-t%this.market.cfg.ratestep}},{key:"loadTable",value:function(){this.loadTableSide(!0),this.loadTableSide(!1)}},{key:"binOrdersByRateAndEpoch",value:function(e){if(!e||!e.length)return[];var t=[],n=[],r=[],a=e[0].msgRate;e[0].epoch?n.push(e[0]):r.push(e[0]);for(var o=1;o<e.length;o++)e[o].msgRate!==a&&(t.push(r),t.push(n),n=[],r=[],a=e[o].msgRate),e[o].epoch?n.push(e[o]):r.push(e[o]);return t.push(r),t.push(n),t.filter((function(e){return e.length>0}))}},{key:"loadTableSide",value:function(e){var t=this,n=e?this.book.sells:this.book.buys,r=e?this.page.sellRows:this.page.buyRows;We.empty(r),n&&n.length&&this.binOrdersByRateAndEpoch(n).forEach((function(e){r.appendChild(t.orderTableRow(e))}))}},{key:"addTableOrder",value:function(e){var t=e.sell?this.page.sellRows:this.page.buyRows,n=t.firstChild;if(0!==e.rate){for(n&&0===n.manager.getRate()&&(n=n.nextSibling);n;){if(0===n.manager.compare(e))return void n.manager.insertOrder(e);if(n.manager.compare(e)>0){var r=this.orderTableRow([e]);return void t.insertBefore(r,n)}n=n.nextSibling}var a=this.orderTableRow([e]);t.appendChild(a)}else{if(0===e.qtyAtomic)return;n&&0===n.manager.getRate()?n.manager.insertOrder(e):(n=this.orderTableRow([e]),t.insertBefore(n,t.firstChild))}}},{key:"removeTableOrder",value:function(e){for(var t=e.token,n=0,r=[this.page.sellRows,this.page.buyRows];n<r.length;n++)for(var a=r[n],o=0,s=Array.from(a.children);o<s.length;o++)if(s[o].manager.removeOrder(t))return}},{key:"updateTableOrder",value:function(e){for(var t=0,n=[this.page.sellRows,this.page.buyRows];t<n.length;t++)for(var r=n[t],a=0,o=Array.from(r.children);a<o.length;a++)if(o[a].manager.updateOrderQty(e))return}},{key:"clearOrderTableEpochs",value:function(){this.clearOrderTableEpochSide(this.page.sellRows),this.clearOrderTableEpochSide(this.page.buyRows)}},{key:"clearOrderTableEpochSide",value:function(e){for(var t=0,n=Array.from(e.children);t<n.length;t++)n[t].manager.removeEpochOrders()}},{key:"orderTableRow",value:function(e){var t=this,n=this.page.orderRowTmpl.cloneNode(!0),r=this.market,a=r.baseUnitInfo,o=r.quoteUnitInfo,s=r.rateConversionFactor,i=r.cfg.ratestep,c=new co(n,e,a,o,i);return n.manager=c,Va(n,"click",(function(){t.reportDepthClick(n.manager.getRate()/s)})),0!==n.manager.getRate()&&We.bind(n,"mouseenter",(function(){var e=t.depthChart;t.depthLines.hover=[{rate:n.manager.getRate()/s,color:n.manager.isSell()?e.theme.sellLine:e.theme.buyLine}],t.drawChartLines()})),n}},{key:"handleConnNote",value:(o=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.marketList.setConnectionStatus(t),"DEXDisabled"!==t.topic&&"DEXEnabled"!==t.topic&&t.connectionStatus!==dt.Connected){e.next=6;break}return e.next=4,vt().fetchUser();case 4:return e.next=6,vt().loadPage("markets");case 6:case"end":return e.stop()}}),e,this)}))),function(e){return o.apply(this,arguments)})},{key:"filterMarkets",value:function(){var e,t=null===(e=this.page.marketSearchV1.value)||void 0===e?void 0:e.toLowerCase(),n=t?function(e){return e.name.includes(t)}:function(){return!0};this.marketList.setFilter(n)}},{key:"drawChartLines",value:function(){this.depthChart.setLines([].concat(r(this.depthLines.hover),r(this.depthLines.input))),this.depthChart.draw()}},{key:"candleDurationSelected",value:function(e){var t,n;null!==(t=this.market)&&void 0!==t&&null!==(n=t.dex)&&void 0!==n&&n.candleDurs.includes(e)||(e="1h"),this.candleDur=e,this.loadCandles(),k.storeLocal(k.lastCandleDurationLK,e)}},{key:"loadCandles",value:function(){var e,t=qa(We.kids(this.page.durBttnBox));try{for(t.s();!(e=t.n()).done;){var n=e.value;n.textContent===this.candleDur?n.classList.add("selected"):n.classList.remove("selected")}}catch(e){t.e(e)}finally{t.f()}var r=this.market,a=r.candleCaches,o=r.cfg,s=r.baseUnitInfo,i=r.quoteUnitInfo,c=a[this.candleDur];c?this.candleChart.setCandles(c,o,s,i):this.requestCandles()}},{key:"requestCandles",value:function(e){var t=this;this.candlesLoading={loaded:function(){},timer:window.setTimeout((function(){t.candlesLoading&&(t.candlesLoading=null,console.error("candles not received"))}),1e4)};var n=this.market,r=n.dex,a=n.baseCfg,o=n.quoteCfg;La.request("loadcandles",{host:r.host,base:a.id,quote:o.id,dur:e||this.candleDur})}},{key:"unload",value:function(){La.request("unmarket",{}),La.deregisterRoute(Ua),La.deregisterRoute(_a),La.deregisterRoute(ja),La.deregisterRoute(Ha),La.deregisterRoute(za),La.deregisterRoute(Ga),La.deregisterRoute(Xa),this.depthChart.unattach(),this.candleChart.unattach(),We.unbind(document,"keyup",this.keyup),clearInterval(this.secondTicker)}}]),_}(ut),eo=function(){function e(t){i(this,e),h(this,"div",void 0),h(this,"rowTmpl",void 0),h(this,"markets",void 0),h(this,"selected",void 0),this.div=t,this.rowTmpl=We.idel(t,"marketTmplV1"),We.cleanTemplates(this.rowTmpl),this.reloadMarketsPane()}return d(e,[{key:"updateSpots",value:function(e){var t,n=qa(this.markets);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(r.mkt.xc.host===e.host){var a=vt().exchanges[r.mkt.xc.host],o=a.markets[r.mkt.name];lo(r.tmpl,a,o)}}}catch(e){n.e(e)}finally{n.f()}}},{key:"reloadMarketsPane",value:function(){We.empty(this.div),this.markets=[];for(var e,t,n,a,o,s=0,i=function(){for(var e=[],t=vt().assets,n=function(e,n){return n.map((function(n){var r=t[n.baseid],a=r?r.name:n.basesymbol,o=vt().unitInfo(n.baseid,e);return Object.assign({xc:e,baseName:a,bui:o},n)}))},a=0,o=Object.values(vt().exchanges);a<o.length;a++){var s=o[a];e.push.apply(e,r(n(s,Object.values(s.markets||{}))))}return e.sort((function(e,t){if(!e.spot)return t.spot?1:e.name===t.name?e.xc.host.localeCompare(t.xc.host):e.name.localeCompare(t.name);if(!t.spot)return-1;var n=e.spot.vol24/e.lotsize;return t.spot.vol24/t.lotsize-n})),e}();s<i.length;s++){var c=i[s];this.markets.push((e=c,void 0,void 0,void 0,void 0,t=vt().unitInfo(e.baseid,e.xc),n=vt().unitInfo(e.quoteid,e.xc),a=Dt/t.conventional.conversionFactor*n.conventional.conversionFactor,o=new to(this.rowTmpl,e,a),this.div.appendChild(o.node),o))}vt().bindTooltips(this.div)}},{key:"find",value:function(e,t,n){var r,a=qa(this.markets);try{for(a.s();!(r=a.n()).done;){var o=r.value;if(o.mkt.xc.host===e&&o.mkt.baseid===t&&o.mkt.quoteid===n)return o}}catch(e){a.e(e)}finally{a.f()}return null}},{key:"exists",value:function(e,t,n){return null!==this.find(e,t,n)}},{key:"first",value:function(){return this.markets[0]}},{key:"select",value:function(e,t,n){var r=this.find(e,t,n);if(!r)return console.error("select: no market row for ".concat(e,", ").concat(t,"-").concat(n));var a,o=qa(this.markets);try{for(o.s();!(a=o.n()).done;)a.value.node.classList.remove("selected")}catch(e){o.e(e)}finally{o.f()}this.selected=r,this.selected.node.classList.add("selected")}},{key:"setConnectionStatus",value:function(e){var t,n=qa(this.markets);try{for(n.s();!(t=n.n()).done;){var r=t.value;r.mkt.xc.host===e.host&&(e.connectionStatus===dt.Connected?We.hide(r.tmpl.disconnectedIco):We.show(r.tmpl.disconnectedIco))}}catch(e){n.e(e)}finally{n.f()}}},{key:"setFilter",value:function(e){var t,n=qa(this.markets);try{for(n.s();!(t=n.n()).done;){var r=t.value;e(r)?We.show(r.node):We.hide(r.node)}}catch(e){n.e(e)}finally{n.f()}}}]),e}(),to=d((function e(t,n,r){i(this,e),h(this,"node",void 0),h(this,"mkt",void 0),h(this,"name",void 0),h(this,"baseID",void 0),h(this,"quoteID",void 0),h(this,"lotSize",void 0),h(this,"tmpl",void 0),h(this,"rateConversionFactor",void 0),this.mkt=n,this.name=n.name,this.baseID=n.baseid,this.quoteID=n.quoteid,this.lotSize=n.lotsize,this.rateConversionFactor=r,this.node=t.cloneNode(!0);var a,o,s,c,l=this.tmpl=We.parseTemplate(this.node);l.baseIcon.src=We.logoPath(n.basesymbol),l.quoteIcon.src=We.logoPath(n.quotesymbol),l.baseSymbol.appendChild(We.symbolize(n.xc.assets[n.baseid],!0)),l.quoteSymbol.appendChild(We.symbolize(n.xc.assets[n.quoteid],!0)),l.baseName.textContent=n.baseName,l.host.textContent=n.xc.host,l.host.style.color=(s=n.xc.host,(c=Object.keys(vt().exchanges)).sort(),a=c.indexOf(s),o=uo[a%uo.length],"hsl(".concat(360*o,", 35%, 50%)")),l.host.dataset.tooltip=n.xc.host,lo(l,n.xc,n),this.mkt.xc.connectionStatus!==dt.Connected&&We.show(l.disconnectedIco)})),no=function(){function e(t,n){var r=this;i(this,e),h(this,"base",void 0),h(this,"quote",void 0),h(this,"dex",void 0),We.hide(t,n);var a=We.parseTemplate(t);this.base={id:0,parentID:Za,cfg:null,node:t,tmpl:a,iconBox:a.walletState,stateIcons:new _e(a.walletState)},a.balanceRowTmpl.remove();var o=We.parseTemplate(n);this.quote={id:0,parentID:Za,cfg:null,node:n,tmpl:o,iconBox:o.walletState,stateIcons:new _e(o.walletState)},o.balanceRowTmpl.remove(),vt().registerNoteFeeder({balance:function(e){r.updateAsset(e.assetID)},walletstate:function(e){r.updateAsset(e.wallet.assetID)},walletsync:function(e){r.updateAsset(e.assetID)},createwallet:function(e){r.updateAsset(e.assetID)}})}var t;return d(e,[{key:"setBalanceVisibility",value:function(e){e?We.show(this.base.node,this.quote.node):We.hide(this.base.node,this.quote.node)}},{key:"setWallets",value:function(e,t,n){var r=function(e){var t=vt().assets[e];return null!=t&&t.token?t.token.parentID:Za};this.dex=vt().user.exchanges[e],this.base.id=t,this.base.parentID=r(t),this.base.cfg=this.dex.assets[t],this.quote.id=n,this.quote.parentID=r(n),this.quote.cfg=this.dex.assets[n],this.updateWallet(this.base),this.updateWallet(this.quote),this.setBalanceVisibility(this.dex.connectionStatus===dt.Connected)}},{key:"updateWallet",value:function(e){var t=e.cfg,n=e.tmpl,r=e.iconBox,a=e.stateIcons,o=e.id;if(t){var s=vt().assets[o];if(We.hide(n.newWalletRow,n.expired,n.unsupported,n.connect,n.spinner,n.walletState,n.balanceRows,n.walletAddr,n.wantProvidersBox),this.checkNeedsProvider(o,n.wantProvidersBox),n.logo.src=We.logoPath(t.symbol),n.addWalletSymbol.textContent=t.symbol.toUpperCase(),We.empty(n.symbol),s){n.symbol.appendChild(We.symbolize(s,!0)),We.show(r);var i=s.wallet;if(a.readWallet(i),!i)return s.walletCreationPending?void We.show(n.spinner):void We.show(n.newWalletRow);We.show(n.walletAddr);var c=i.balance;if(c||i.running||i.disabled){if(!c)return vt().fetchBalance(o),void We.show(n.spinner);We.show(n.balanceRows),We.empty(n.balanceRows);var l=function(t,r,a,o){var s=n.balanceRowTmpl.cloneNode(!0);n.balanceRows.appendChild(s);var i=We.parseTemplate(s);i.title.textContent=t,i.bal.textContent=We.formatCoinValue(r,a),o&&(i.bal.append(o),e.parentBal=i.bal)};if(l(ke("AVAILABLE"),c.available,s.unitInfo),l(ke(z),c.locked+c.contractlocked+c.bondlocked,s.unitInfo),l(ke("IMMATURE"),c.immature,s.unitInfo),s.token){var u=vt().assets[s.token.parentID],d=u.wallet.balance,h=u.unitInfo,p=u.symbol,f=document.createElement("img");f.src=We.logoPath(p),f.classList.add("micro-icon","ms-1"),l(ke("FEE_BALANCE"),d.available,h,f)}(new Date).getTime()-new Date(c.stamp).getTime()>36e5&&!i.disabled?(We.show(n.expired),i.running&&vt().fetchBalance(o)):We.hide(n.expired)}else We.show(n.connect)}else We.show(n.unsupported)}}},{key:"checkNeedsProvider",value:(t=s(f().mark((function e(t,n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=We,e.next=3,vt().needsCustomProvider(t);case 3:e.t1=e.sent,e.t2=n,e.t0.setVis.call(e.t0,e.t1,e.t2);case 6:case"end":return e.stop()}}),e)}))),function(e,n){return t.apply(this,arguments)})},{key:"updateParent",value:function(e){var t,n=vt().assets[e.parentID],r=n.wallet.balance,a=n.unitInfo;null!==(t=e.parentBal)&&void 0!==t&&t.firstChild&&(e.parentBal.firstChild.textContent=We.formatCoinValue(r.available,a))}},{key:"updateAsset",value:function(e){e===this.base.id?this.updateWallet(this.base):e===this.quote.id&&this.updateWallet(this.quote),e===this.base.parentID&&this.updateParent(this.base),e===this.quote.parentID&&this.updateParent(this.quote)}}]),e}();function ro(e,t,n){return{host:e,base:t,quote:n}}function ao(e,t){return"".concat(e,"_").concat(t)}function oo(e,t){return e?Math.round(parseFloat(e)*t):0}function so(e,t){e.classList.remove("selected"),t.classList.add("selected")}function io(e){for(var t={},n=0,r=Object.entries(e.options);n<r.length;n++){var o=a(r[n],2),s=o[0],i=o[1];t[s]=JSON.stringify(i)}return Object.assign({},e,{options:t})}var co=function(){function e(t,n,r,a,o){i(this,e),h(this,"tableRow",void 0),h(this,"page",void 0),h(this,"orderBin",void 0),h(this,"sell",void 0),h(this,"msgRate",void 0),h(this,"epoch",void 0),h(this,"baseUnitInfo",void 0),this.tableRow=t;var s=this.page=We.parseTemplate(t);this.orderBin=n,this.sell=n[0].sell,this.msgRate=n[0].msgRate,this.epoch=!!n[0].epoch,this.baseUnitInfo=r;var c=We.formatRateFullPrecision(this.msgRate,r,a,o);if(We.setVis(this.isEpoch(),this.page.epoch),0===this.msgRate)s.rate.innerText="market";else{var l=this.isSell()?"sellcolor":"buycolor";s.rate.innerText=c,s.rate.classList.add(l)}this.updateQtyNumOrdersEl()}return d(e,[{key:"updateQtyNumOrdersEl",value:function(){var e=this.page,t=this.orderBin,n=t.reduce((function(e,t){return e+t.qtyAtomic}),0),r=t.length;e.qty.innerText=We.formatFullPrecision(n,this.baseUnitInfo),r>1?(e.numOrders.removeAttribute("hidden"),e.numOrders.innerText=String(r),e.numOrders.title="quantity is comprised of ".concat(r," orders")):e.numOrders.setAttribute("hidden","true")}},{key:"insertOrder",value:function(e){this.orderBin.push(e),this.updateQtyNumOrdersEl()}},{key:"updateOrderQty",value:function(e){for(var t=e.token,n=e.qty,r=e.qtyAtomic,a=0;a<this.orderBin.length;a++)if(this.orderBin[a].token===t)return this.orderBin[a].qty=n,this.orderBin[a].qtyAtomic=r,this.updateQtyNumOrdersEl(),!0;return!1}},{key:"removeOrder",value:function(e){var t=this.orderBin.findIndex((function(t){return t.token===e}));return!(t<0||(this.orderBin.splice(t,1),this.orderBin.length?this.updateQtyNumOrdersEl():this.tableRow.remove(),0))}},{key:"removeEpochOrders",value:function(e){this.orderBin=this.orderBin.filter((function(t){return!(t.epoch&&t.epoch!==e)})),this.orderBin.length?this.updateQtyNumOrdersEl():this.tableRow.remove()}},{key:"getRate",value:function(){return this.msgRate}},{key:"isEpoch",value:function(){return this.epoch}},{key:"isSell",value:function(){return this.sell}},{key:"compare",value:function(e){return this.getRate()===e.msgRate&&this.isEpoch()===!!e.epoch?0:this.getRate()!==e.msgRate?this.getRate()>e.msgRate===e.sell?1:-1:this.isEpoch()?1:-1}}]),e}();function lo(e,t,n){if(n.spot){e.price.textContent=We.formatFourSigFigs(vt().conventionalRate(n.baseid,n.quoteid,n.spot.rate,t));var r=n.spot.change24>0?"+":"";e.change.classList.remove("buycolor","sellcolor"),e.change.classList.add(n.spot.change24>=0?"buycolor":"sellcolor"),e.change.textContent="".concat(r).concat((100*n.spot.change24).toFixed(1),"%")}}var uo=[.5,1/4,3/4,1/8,5/8,3/8,7/8];function ho(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return po(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?po(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function po(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function fo(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(fo=function(){return!!e})()}var vo=function(e){g(p,e);var t,n,r,a,o,c,l,u=(t=p,n=fo(),function(){var e,r=x(t);if(n){var a=x(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function p(e){var t;i(this,p),h(v(t=u.call(this)),"main",void 0),h(v(t),"offset",void 0),h(v(t),"loading",void 0),h(v(t),"currentForm",void 0),h(v(t),"orderTmpl",void 0),h(v(t),"filterState",void 0),h(v(t),"page",void 0),t.main=e,t.offset="",t.loading=!1;var n=t.page=We.idDescendants(e);t.orderTmpl=n.rowTmpl,t.orderTmpl.remove();var r=t.filterState={hosts:[],assets:[],statuses:[]},a=new URLSearchParams(window.location.search),o=function(e,t){var n=a.get(t);if(n&&0!==n.length){var o=n.split(",");n&&(r[t]=o),e.querySelectorAll("input").forEach((function(e){o.indexOf(e.value)>=0&&(e.checked=!0)}))}};o(n.hostFilter,"hosts"),o(n.assetFilter,"assets"),o(n.statusFilter,"statuses");var s=[],c=function(e,n){var a=e.querySelector(".apply-bttn");s.push(a),We.bind(a,"click",(function(){t.submitFilter(),s.forEach((function(e){return We.hide(e)}))})),e.querySelectorAll("input").forEach((function(t){We.bind(t,"change",(function(){!function(e,t){if(e.length!==t.length)return!1;var n,r=ho(e);try{for(r.s();!(n=r.n()).done;){var a=n.value;if(-1===t.indexOf(a))return!1}}catch(e){r.e(e)}finally{r.f()}return!0}(mo(e),r[n])?We.show(a):We.hide(a)}))}))};return c(n.hostFilter,"hosts"),c(n.assetFilter,"assets"),c(n.statusFilter,"statuses"),We.bind(t.main,"scroll",(function(){t.loading||n.ordersTable.offsetHeight-t.main.offsetHeight-t.main.scrollTop<0&&t.nextPage()})),n.forms.querySelectorAll(".form-closer").forEach((function(e){We.bind(e,"click",(function(){We.hide(n.forms)}))})),We.bind(n.forms,"mousedown",(function(e){We.mouseInElement(e,t.currentForm)||We.hide(n.forms)})),We.bind(n.exportOrders,"click",(function(){t.exportOrders()})),n.showArchivedDateField.addEventListener("change",(function(){n.showArchivedDateField.checked?We.show(n.archivedDateField):We.hide(n.archivedDateField,n.deleteArchivedRecordsErr)})),We.bind(n.deleteArchivedRecords,"click",(function(){var e=t.page;e.showArchivedDateField.checked=!1,e.saveMatchesToFile.checked=!1,e.saveOrdersToFile.checked=!1,e.deleteArchivedRecordsErr.textContent="",e.archivedRecordsLocation.textContent="",e.deleteArchivedRecordsMsg.textContent="",We.hide(e.deleteArchivedResult,e.deleteArchivedRecordsErr,e.deleteArchivedRecordsMsg,e.archivedRecordsLocation,e.archivedDateField),t.showForm(e.deleteArchivedRecordsForm)})),We.bind(n.deleteArchivedRecordsSubmit,"click",(function(){var e=0;n.showArchivedDateField.checked&&(e=Date.parse(n.olderThan.value||""),isNaN(e)||e<=0)?We.showFormError(n.deleteArchivedRecordsErr,ke("INVALID_DATE_ERR_MSG")):t.deleteArchivedRecords(e)})),t.submitFilter(),t}return d(p,[{key:"showForm",value:(l=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.currentForm=t,n=this.page,We.hide(n.deleteArchivedRecordsForm),t.style.right="10000px",We.show(n.forms,t),r=(n.forms.offsetWidth+t.offsetWidth)/2,e.next=8,We.animate(500,(function(e){t.style.right="".concat((1-e)*r,"px")}),"easeOutHard");case 8:t.style.right="0px";case 9:case"end":return e.stop()}}),e,this)}))),function(e){return l.apply(this,arguments)})},{key:"setOrders",value:function(e){We.empty(this.page.tableBody),this.appendOrders(e)}},{key:"appendOrders",value:function(e){var t,n=this.page.tableBody,r=ho(e);try{for(r.s();!(t=r.n()).done;){var a=t.value,o=this.orderTmpl.cloneNode(!0),s=We.parseTemplate(o),i=void 0,c=void 0,l=void 0,u=void 0,d=void 0,h="",p=vt().exchanges[a.host]||void 0;if((vt().assets[a.baseID]||p.assets[a.baseID])&&(vt().assets[a.quoteID]||p.assets[a.quoteID])){var f=[vt().unitInfo(a.baseID,p),vt().unitInfo(a.quoteID,p)],v=f[0],m=f[1];if(a.sell){var g=[a.baseSymbol,a.quoteSymbol];i=g[0],c=g[1];var y=[v.conventional.unit,m.conventional.unit];l=y[0],u=y[1],d=We.formatCoinValue(a.qty,v),1===a.type&&(h=We.formatCoinValue(a.qty/Dt*a.rate,m))}else{var x=[a.quoteSymbol,a.baseSymbol];i=x[0],c=x[1];var b=[m.conventional.unit,v.conventional.unit];l=b[0],u=b[1],2===a.type?d=We.formatCoinValue(a.qty,v):(d=We.formatCoinValue(a.qty/Dt*a.rate,m),h=We.formatCoinValue(a.qty,v))}var k="".concat(v.conventional.unit,"-").concat(m.conventional.unit);s.host.textContent="".concat(k," @ ").concat(a.host),s.fromQty.textContent=d,s.fromLogo.src=We.logoPath(i),s.fromSymbol.textContent=l,s.toQty.textContent=h,s.toLogo.src=We.logoPath(c),s.toSymbol.textContent=u,s.type.textContent="".concat(At(a)," ").concat(It(a));var w=We.formatCoinValue(vt().conventionalRate(a.baseID,a.quoteID,a.rate,p));2===a.type&&(w=Ot(a)),s.rate.textContent=w,s.status.textContent=Bt(a),s.filled.textContent="".concat((Pt(a)/a.qty*100).toFixed(1),"%"),s.settled.textContent="".concat((Lt(a)/a.qty*100).toFixed(1),"%");var C=new Date(a.submitTime).toLocaleString();s.timeAgo.textContent="".concat(We.timeSince(a.submitTime)," ago"),s.time.textContent=C,We.tmplElement(o,"link").href="order/".concat(a.id),vt().bindInternalNavigation(o),n.appendChild(o)}}}catch(e){r.e(e)}finally{r.f()}50===e.length?this.offset=e[e.length-1].id:this.offset=""}},{key:"submitFilter",value:(c=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,this.offset="",(n=this.filterState).hosts=mo(t.hostFilter),n.assets=mo(t.assetFilter).map((function(e){return parseInt(e)})),n.statuses=mo(t.statusFilter).map((function(e){return parseInt(e)})),e.t0=this,e.next=9,this.fetchOrders();case 9:e.t1=e.sent,e.t0.setOrders.call(e.t0,e.t1);case 11:case"end":return e.stop()}}),e,this)}))),function(){return c.apply(this,arguments)})},{key:"fetchOrders",value:(o=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=vt().loading(this.main),e.next=3,S("/api/orders",this.currentFilter());case 3:return n=e.sent,t(),e.abrupt("return",n.orders);case 6:case"end":return e.stop()}}),e,this)}))),function(){return o.apply(this,arguments)})},{key:"exportOrders",value:function(){this.offset="";var e=this.currentFilter(),t=new URL(window.location.href),n=new URLSearchParams(""),r=function(t){e[t].forEach((function(e){n.append(t,e)}))};r("hosts"),r("assets"),r("statuses"),t.search=n.toString(),t.pathname="/orders/export",window.open(t.toString())}},{key:"deleteArchivedRecords",value:(a=s(f().mark((function e(t){var n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,r=n.saveMatchesToFile.checked||!1,a=n.saveOrdersToFile.checked||!1,o={olderThanMs:t,saveMatchesToFile:r,saveOrdersToFile:a},s=vt().loading(this.main),e.next=7,S("/api/deletearchivedrecords",o);case 7:if(i=e.sent,s(),vt().checkResponse(i)){e.next=11;break}return e.abrupt("return",We.showFormError(n.deleteArchivedRecordsErr,i.msg));case 11:i.archivedRecordsDeleted>0?(n.deleteArchivedRecordsMsg.textContent=ke("DELETE_ARCHIVED_RECORDS_RESULT",{nRecords:i.archivedRecordsDeleted}),(r||a)&&(n.archivedRecordsLocation.textContent=ke("ARCHIVED_RECORDS_PATH",{path:i.archivedRecordsPath}),We.show(n.archivedRecordsLocation)),this.submitFilter()):n.deleteArchivedRecordsMsg.textContent=ke("NO_ARCHIVED_RECORDS"),We.show(n.deleteArchivedResult,n.deleteArchivedRecordsMsg);case 13:case"end":return e.stop()}}),e,this)}))),function(e){return a.apply(this,arguments)})},{key:"currentFilter",value:function(){var e,t,n=this.filterState;return{hosts:n.hosts,assets:null===(e=n.assets)||void 0===e?void 0:e.map((function(e){return parseInt(e)})),statuses:null===(t=n.statuses)||void 0===t?void 0:t.map((function(e){return parseInt(e)})),n:50,offset:this.offset}}},{key:"nextPage",value:(r=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(""!==this.offset&&!this.loading){e.next=2;break}return e.abrupt("return");case 2:return this.loading=!0,We.show(this.page.orderLoader),e.next=6,this.fetchOrders();case 6:t=e.sent,this.loading=!1,We.hide(this.page.orderLoader),this.appendOrders(t);case 10:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})}]),p}(ut);function mo(e){var t=[];return e.querySelectorAll("input").forEach((function(e){e.checked&&t.push(e.value)})),t}function go(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return yo(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?yo(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function yo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function xo(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(xo=function(){return!!e})()}var bo=288e5,ko=function(e){g(p,e);var t,n,r,a,o,c,l,u=(t=p,n=xo(),function(){var e,r=x(t);if(n){var a=x(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function p(e){var t;i(this,p),h(v(t=u.call(this)),"orderID",void 0),h(v(t),"order",void 0),h(v(t),"page",void 0),h(v(t),"currentForm",void 0),h(v(t),"secondTicker",void 0),h(v(t),"refreshOnPopupClose",void 0),h(v(t),"accelerateOrderForm",void 0),h(v(t),"stampers",void 0);var n=t.page=We.idDescendants(e);t.stampers=We.applySelector(e,"[data-stamp]"),t.orderID=e.dataset.oid||"",We.cleanTemplates(n.matchCardTmpl);var r=function(){var e,n=go(t.stampers);try{for(n.s();!(e=n.n()).done;){var r=e.value;r.textContent=We.timeSince(parseInt(r.dataset.stamp||""))}}catch(e){n.e(e)}finally{n.f()}};return r(),n.forms.querySelectorAll(".form-closer").forEach((function(e){We.bind(e,"click",(function(){t.refreshOnPopupClose?window.location.replace(window.location.href):We.hide(n.forms)}))})),e.querySelectorAll("[data-explorer-id]").forEach((function(e){Mn(parseInt(e.dataset.explorerId||""),e)})),n.cancelBttn&&We.bind(n.cancelBttn,"click",(function(){t.showForm(n.cancelForm)})),We.bind(n.accelerateBttn,"click",(function(){t.showAccelerateForm()})),yt(n),t.accelerateOrderForm=new Cr(n.accelerateForm,(function(){t.refreshOnPopupClose=!0})),We.cleanTemplates(n.booleanOptTmpl,n.rangeOptTmpl,n.orderOptTmpl),We.bind(n.forms,"mousedown",(function(e){if(!We.mouseInElement(e,t.currentForm)){if(t.refreshOnPopupClose)return void window.location.reload();We.hide(n.forms)}})),Mr(n.cancelForm,n.cancelSubmit,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t.submitCancel();case 1:case"end":return e.stop()}}),e)})))),t.secondTicker=window.setInterval((function(){r()}),1e4),vt().registerNoteFeeder({order:function(e){t.handleOrderNote(e)},match:function(e){t.handleMatchNote(e)}}),t.start(),t}return d(p,[{key:"start",value:(l=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(t=vt().order(this.orderID))){e.next=5;break}this.order=t,e.next=8;break;case 5:return e.next=7,this.fetchOrder();case 7:t=e.sent;case 8:this.page.mktBaseSymbol.replaceWith(We.symbolize(vt().assets[t.baseID])),this.page.mktQuoteSymbol.replaceWith(We.symbolize(vt().assets[t.quoteID])),this.setAccelerationButtonVis(),this.showMatchCards();case 12:case"end":return e.stop()}}),e,this)}))),function(){return l.apply(this,arguments)})},{key:"unload",value:function(){clearInterval(this.secondTicker)}},{key:"fetchOrder",value:(c=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/order",this.orderID);case 2:if(t=e.sent,vt().checkResponse(t)){e.next=5;break}throw t.msg;case 5:return this.order=t.order,e.abrupt("return",this.order);case 7:case"end":return e.stop()}}),e,this)}))),function(){return c.apply(this,arguments)})},{key:"setImmutableMatchCardElements",value:function(e,t){var n=We.parseTemplate(e);n.matchID.textContent=t.matchID;var r=new Date(t.stamp);n.matchTime.textContent=r.toLocaleTimeString(We.languages(),{year:"numeric",month:"short",day:"numeric"}),n.matchTimeAgo.dataset.stamp=t.stamp.toString(),n.matchTimeAgo.textContent=We.timeSince(t.stamp),this.stampers.push(n.matchTimeAgo);var a=function(e,t){var n=t.qty;return Rt(e)&&(n=qt(t.rate,t.qty)),(n/e.qty*100).toFixed(1)+" %"}(this.order,t),o=We.bipSymbol(this.order.baseID),s=We.bipSymbol(this.order.quoteID),i=vt().unitInfo(this.order.baseID),c=vt().unitInfo(this.order.quoteID),l=[i.conventional.unit.toLowerCase(),c.conventional.unit.toLowerCase()],u=l[0],d=l[1],h=qt(t.rate,t.qty);if(t.isCancel)return We.show(n.cancelInfoDiv),We.hide(n.infoDiv,n.status,n.statusHdr),this.order.sell?(n.cancelAmount.textContent=We.formatCoinValue(t.qty,i),n.cancelIcon.src=We.logoPathFromID(this.order.baseID)):(n.cancelAmount.textContent=We.formatCoinValue(h,c),n.cancelIcon.src=We.logoPathFromID(this.order.quoteID)),void(n.cancelOrderPortion.textContent=a);We.show(n.infoDiv),We.hide(n.cancelInfoDiv),n.orderPortion.textContent=a,0===t.side?(n.side.textContent=ke("MAKER"),We.show(n.makerSwapYou,n.makerRedeemYou,n.takerSwapThem,n.takerRedeemThem),We.hide(n.takerSwapYou,n.takerRedeemYou,n.makerSwapThem,n.makerRedeemThem)):(n.side.textContent=ke("TAKER"),We.hide(n.makerSwapYou,n.makerRedeemYou,n.takerSwapThem,n.takerRedeemThem),We.show(n.takerSwapYou,n.takerRedeemYou,n.makerSwapThem,n.makerRedeemThem)),0===t.side&&this.order.sell||1===t.side&&!this.order.sell?(n.makerSwapAsset.textContent=u,n.takerSwapAsset.textContent=d,n.makerRedeemAsset.textContent=d,n.takerRedeemAsset.textContent=u):(n.makerSwapAsset.textContent=d,n.takerSwapAsset.textContent=u,n.makerRedeemAsset.textContent=u,n.takerRedeemAsset.textContent=d);var p=vt().conventionalRate(this.order.baseID,this.order.quoteID,t.rate);n.rate.textContent="".concat(p," ").concat(u,"/").concat(d),this.order.sell?(n.refundAsset.textContent=o,n.fromAmount.textContent=We.formatCoinValue(t.qty,i),n.toAmount.textContent=We.formatCoinValue(h,c),n.fromIcon.src=We.logoPathFromID(this.order.baseID),n.toIcon.src=We.logoPathFromID(this.order.quoteID)):(n.refundAsset.textContent=s,n.fromAmount.textContent=We.formatCoinValue(h,c),n.toAmount.textContent=We.formatCoinValue(t.qty,i),n.fromIcon.src=We.logoPathFromID(this.order.quoteID),n.toIcon.src=We.logoPathFromID(this.order.baseID))}},{key:"setMutableMatchCardElements",value:function(e,t){if(!t.isCancel){var n=We.parseTemplate(e);n.status.textContent=function(e){if(e.revoked)return e.active?e.redeem?Nt(Q):0===e.side?Nt(J):e.counterRedeem?Nt("MATCH_STATUS_REDEEM_PENDING"):Nt(J):e.refund?Nt("MATCH_STATUS_REFUNDED"):e.redeem?Nt(Y):Nt("MATCH_STATUS_COMPLETE");switch(e.status){case 0:return ke("MATCH_STATUS_NEWLY_MATCHED");case 1:return ke("MATCH_STATUS_MAKER_SWAP_CAST");case 2:return ke("MATCH_STATUS_TAKER_SWAP_CAST");case 3:return 0===e.side?ke(Q):ke("MATCH_STATUS_MAKER_REDEEMED");case 4:return ke(Q);case 5:return ke(Y)}return ke(W)}(t);var r=function(e,t,n){if(!n)return We.hide(t),void We.show(e);t.textContent=On(n.stringID),t.dataset.explorerCoin=n.stringID,Mn(n.assetID,t),We.show(t),We.hide(e)};if(r(n.makerSwapPending,n.makerSwapCoin,Co(t)),r(n.takerSwapPending,n.takerSwapCoin,So(t)),r(n.makerRedeemPending,n.makerRedeemCoin,Fo(t)),r(n.takerRedeemPending,n.takerRedeemCoin,To(t)),t.refund)n.refundCoin.textContent=On(t.refund.stringID),n.refundCoin.dataset.explorerCoin=t.refund.stringID,Mn(t.refund.assetID,n.refundCoin),We.show(n.refundCoin),We.hide(n.refundPending);else{var a=72e6;1===t.side&&(a=bo);var o=new Date(t.stamp+a);if(Date.now()>o.getTime())n.refundPending.textContent=ke("REFUND_IMMINENT");else{var s=o.toLocaleTimeString(We.languages(),{year:"numeric",month:"short",day:"numeric"});n.refundPending.textContent=ke("REFUND_WILL_HAPPEN_AFTER",{refundAfterTime:s})}We.hide(n.refundCoin),We.show(n.refundPending)}if(1!==t.status||t.revoked||t.refund)if(2!==t.status||t.revoked||t.refund)!function(e){return e.status<5&&0===e.side&&e.status>=3}(t)||t.revoked||t.refund?!function(e){return e.status<5&&1===e.side&&e.status>=4}(t)||t.revoked||t.refund?We.hide(n.makerSwapMsg,n.takerSwapMsg,n.makerRedeemMsg,n.takerRedeemMsg):(n.takerRedeemMsg.textContent=wo(t.redeem),We.hide(n.makerSwapMsg,n.takerSwapMsg,n.makerRedeemMsg),We.show(n.takerRedeemMsg)):(n.makerRedeemMsg.textContent=wo(t.redeem),We.hide(n.makerSwapMsg,n.takerSwapMsg,n.takerRedeemMsg),We.show(n.makerRedeemMsg));else{var i=So(t);n.takerSwapMsg.textContent=wo(i),We.hide(n.makerSwapMsg,n.makerRedeemMsg,n.takerRedeemMsg),We.show(n.takerSwapMsg)}else{var c=Co(t);n.makerSwapMsg.textContent=wo(c),We.hide(n.takerSwapMsg,n.makerRedeemMsg,n.takerRedeemMsg),We.show(n.makerSwapMsg)}if(t.revoked){We.setVis(Co(t),n.makerSwap),We.setVis(So(t),n.takerSwap);var l=new Date(t.stamp+bo),u=Date.now()>l.getTime();We.setVis(Fo(t)||So(t)&&t.active&&!t.refund&&!u,n.makerRedeem),We.setVis(To(t)||Fo(t)&&t.active&&!t.refund,n.takerRedeem);var d=Boolean(So(t));0===t.side&&(d=Boolean(Co(t)),So(t)&&(d=d&&u)),We.setVis(t.refund||t.active&&!t.redeem&&!t.counterRedeem&&d,n.refund)}else We.setVis(Co(t)||t.active,n.makerSwap),We.setVis(So(t)||t.active,n.takerSwap),We.setVis(Fo(t)||t.active,n.makerRedeem),We.setVis(To(t)||t.active,n.takerRedeem),We.setVis(t.refund,n.refund)}}},{key:"addNewMatchCard",value:function(e){var t=this.page,n=t.matchCardTmpl.cloneNode(!0);vt().bindUrlHandlers(n),n.dataset.matchID=e.matchID,this.setImmutableMatchCardElements(n,e),this.setMutableMatchCardElements(n,e),t.matchBox.appendChild(n)}},{key:"showMatchCards",value:function(){var e=this,t=this.order;t&&t.matches&&(t.matches.sort((function(e,t){return e.stamp-t.stamp})),t.matches.forEach((function(t){return e.addNewMatchCard(t)})))}},{key:"showCancel",value:function(){var e=this.order,t=this.page,n=e.qty-e.filled,r=Rt(e)?vt().assets[e.quoteID]:vt().assets[e.baseID];t.cancelRemain.textContent=We.formatCoinValue(n,r.unitInfo),t.cancelUnit.textContent=r.unitInfo.conventional.unit.toUpperCase(),this.showForm(t.cancelForm)}},{key:"showForm",value:(o=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.currentForm=t,n=this.page,We.hide(n.cancelForm,n.accelerateForm),t.style.right="10000px",We.show(n.forms,t),r=(n.forms.offsetWidth+t.offsetWidth)/2,e.next=8,We.animate(500,(function(e){t.style.right="".concat((1-e)*r,"px")}),"easeOutHard");case 8:t.style.right="0px";case 9:case"end":return e.stop()}}),e,this)}))),function(e){return o.apply(this,arguments)})},{key:"submitCancel",value:(a=s(f().mark((function e(){var t,n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.order,r={orderID:n.id},a=vt().loading(t.cancelForm),e.next=6,S("/api/cancel",r);case 6:if(o=e.sent,a(),vt().checkResponse(o)){e.next=10;break}return e.abrupt("return");case 10:t.status.textContent=ke(q),We.hide(t.forms),n.cancelling=!0;case 13:case"end":return e.stop()}}),e,this)}))),function(){return a.apply(this,arguments)})},{key:"setAccelerationButtonVis",value:function(){var e=this.order;if(e){var t=this.page;We.setVis(vt().canAccelerateOrder(e),t.accelerateBttn,t.actionsLabel)}}},{key:"showAccelerateForm",value:(r=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=vt().loading(this.page.accelerateBttn),this.accelerateOrderForm.refresh(this.order),t(),this.showForm(this.page.accelerateForm);case 4:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"handleOrderNote",value:function(e){var t=this.page,n=e.order;if(n.id===this.orderID){this.order=n;var r=t.cancelBttn;r&&n.status>2&&We.hide(r),t.status.textContent=Bt(n);var a,o=go(n.matches||[]);try{for(o.s();!(a=o.n()).done;){var s=a.value;this.processMatch(s)}}catch(e){o.e(e)}finally{o.f()}this.setAccelerationButtonVis()}}},{key:"handleMatchNote",value:function(e){e.orderID===this.orderID&&(this.processMatch(e.match),this.setAccelerationButtonVis())}},{key:"processMatch",value:function(e){var t,n=null,r=go(We.applySelector(this.page.matchBox,".match-card"));try{for(r.s();!(t=r.n()).done;){var a=t.value;if(a.dataset.matchID===e.matchID){n=a;break}}}catch(e){r.e(e)}finally{r.f()}n?this.setMutableMatchCardElements(n,e):this.addNewMatchCard(e)}}]),p}(ut);function wo(e){return e.confs&&0!==e.confs.required?"".concat(e.confs.count," / ").concat(e.confs.required," ").concat(ke("CONFIRMATIONS")):""}function Co(e){return 0===e.side?e.swap:e.counterSwap}function So(e){return 0===e.side?e.counterSwap:e.swap}function Fo(e){return 0===e.side?e.redeem:e.counterRedeem}function To(e){return 0===e.side?e.counterRedeem:e.redeem}function Do(){return Do="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,n){var r=function(e,t){for(;!{}.hasOwnProperty.call(e,t)&&null!==(e=x(e)););return e}(e,t);if(r){var a=Object.getOwnPropertyDescriptor(r,t);return a.get?a.get.call(arguments.length<3?e:n):a.value}},Do.apply(null,arguments)}function Io(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Ao(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Ao(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function Ao(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function Ro(e){var t=Eo();return function(){var n,r=x(e);if(t){var a=x(this).constructor;n=Reflect.construct(r,arguments,a)}else n=r.apply(this,arguments);return y(this,n)}}function Eo(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Eo=function(){return!!e})()}function Bo(e){var t,n=e.cex,r=n.avail,a=n.req,o=e.dex,s=o.avail,i=o.req,c=e.transferable,l=Math.min(s,i),u=Math.min(r,a);if(e.fundedAndNotBalanced)if(s>i){var d=a-r;if(s-i<d)throw Error("bad math has us with dex surplus + cex underfund invalid remains");l+=d+c}else{var h=i-s;if(r-a<h)throw Error("bad math got us with cex surplus + dex underfund invalid remains");u+=h+c}else if(e.fundedAndBalanced){if(c>0){var p=s-i,f=r-a;t={left:{cex:0,dex:0},right:{cex:0,dex:0},cexRange:0,dexRange:0},f>c&&p>c?(t.left.cex=c+a,t.left.dex=i,t.right.cex=a,t.right.dex=c+i):p<c&&f<c?(t.left.cex=c-p+a,t.left.dex=p+i,t.right.cex=f+a,t.right.dex=c-f+i):p>c?(t.left.cex=a,t.left.dex=c+i,t.right.cex=f+a,t.right.dex=c-f+i):(t.left.cex=c-p+a,t.left.dex=p+i,t.right.cex=c+a,t.right.dex=i),t.cexRange=t.right.cex-t.left.cex,t.dexRange=t.right.dex-t.left.dex,l=t.left.dex+t.dexRange/2,u=t.left.cex+t.cexRange/2}}else r<a?l=Math.min(s,i+c+(a-r)):s<i?u=Math.min(r,a+c+(i-s)):(l=Math.min(s,i+c),u=Math.min(r,i+a+c-l));return[l,u,t]}var Po=function(e){g(m,e);var t,n,o,c,l,u,p=Ro(m);function m(e){var t;i(this,m),h(v(t=p.call(this)),"page",void 0),h(v(t),"forms",void 0),h(v(t),"currentForm",void 0),h(v(t),"keyup",void 0),h(v(t),"cexConfigForm",void 0),h(v(t),"bots",void 0),h(v(t),"sortedBots",void 0),h(v(t),"cexes",void 0),h(v(t),"twoColumn",void 0),h(v(t),"runningMMDisplayElements",void 0),h(v(t),"removingCfg",void 0),t.bots={},t.sortedBots=[],t.cexes={};var n=t.page=We.idDescendants(e);We.cleanTemplates(n.botTmpl,n.botRowTmpl,n.exchangeRowTmpl),t.forms=new mr(n.forms),t.cexConfigForm=new Er(n.cexConfigForm,(function(e,n){return t.cexConfigured(e,n)})),t.runningMMDisplayElements={orderReportForm:n.orderReportForm,dexBalancesRowTmpl:n.dexBalancesRowTmpl,placementRowTmpl:n.placementRowTmpl,placementAmtRowTmpl:n.placementAmtRowTmpl},We.cleanTemplates(n.dexBalancesRowTmpl,n.placementRowTmpl,n.placementAmtRowTmpl),We.bind(n.newBot,"click",(function(){t.newBot()})),We.bind(n.archivedLogsBtn,"click",(function(){vt().loadPage("mmarchives")})),We.bind(n.confirmRemoveConfigBttn,"click",(function(){t.removeCfg()})),t.twoColumn=window.innerWidth>=768,new ResizeObserver((function(){t.resized()})).observe(e);for(var r=function(){var e=a(s[o],2),r=e[0],i=e[1],c=n.exchangeRowTmpl.cloneNode(!0);n.cexRows.appendChild(c);var l=We.parseTemplate(c),u=function(){t.cexConfigForm.setCEX(r),t.forms.show(n.cexConfigForm)};We.bind(l.configureBttn,"click",u),We.bind(l.reconfigBttn,"click",u),We.bind(l.errConfigureBttn,"click",u);var d=t.cexes[r]={tr:c,tmpl:l,dinfo:i,cexName:r};t.updateCexRow(d)},o=0,s=Object.entries(Yn);o<s.length;o++)r();return t.setup(),t}return d(m,[{key:"resized",value:function(){var e=window.innerWidth>=768;if(e!==this.twoColumn){this.twoColumn=e,this.clearBotBoxes();var t,n=Io(this.sortedBots);try{for(n.s();!(t=n.n()).done;){var r=t.value.div;this.appendBotBox(r)}}catch(e){n.e(e)}finally{n.f()}}}},{key:"setup",value:(u=s(f().mark((function e(){var t,n,a,o,s,i,c,l,u=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,n=vt().mmStatus,a=n.bots.map((function(e){return e.config})),vt().registerNoteFeeder({runstats:function(e){u.handleRunStatsNote(e)},runevent:function(e){var t=u.bots[rr(e.host,e.baseID,e.quoteID)];if(t)return t.handleRunStats()},epochreport:function(e){var t=u.bots[rr(e.host,e.baseID,e.quoteID)];t&&t.handleEpochReportNote(e)},cexproblems:function(e){var t=u.bots[rr(e.host,e.baseID,e.quoteID)];t&&t.handleCexProblemsNote(e)},cexnote:function(e){u.handleCEXNote(e)}}),o=!a||0===a.length,We.setVis(o,t.noBots),!o){e.next=8;break}return e.abrupt("return");case 8:t.noBots.remove(),s=r(n.bots).sort((function(e,t){var n,r,a,o;return e.running&&!t.running?-1:t.running&&!e.running?1:e.running||t.running?(null!==(n=null===(r=t.runStats)||void 0===r?void 0:r.startTime)&&void 0!==n?n:0)-(null!==(a=null===(o=e.runStats)||void 0===o?void 0:o.startTime)&&void 0!==a?a:0):e.config.baseID+e.config.quoteID-(t.config.baseID+t.config.quoteID)})),i=Io(s);try{for(i.s();!(c=i.n()).done;)l=c.value,this.addBot(l)}catch(e){i.e(e)}finally{i.f()}case 12:case"end":return e.stop()}}),e,this)}))),function(){return u.apply(this,arguments)})},{key:"handleCEXNote",value:(l=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.t0=t.topic,e.next="BalanceUpdate"===e.t0?3:4;break;case 3:return e.abrupt("return",this.handleCEXBalanceUpdate(t.cexName));case 4:case"end":return e.stop()}}),e,this)}))),function(e){return l.apply(this,arguments)})},{key:"handleCEXBalanceUpdate",value:(c=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:(n=this.cexes[t])&&this.updateCexRow(n);case 2:case"end":return e.stop()}}),e,this)}))),function(e){return c.apply(this,arguments)})},{key:"handleRunStatsNote",value:(o=s(f().mark((function e(t){var n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.baseID,r=t.quoteID,a=t.host,!(o=this.bots[rr(a,n,r)])){e.next=4;break}return e.abrupt("return",o.handleRunStats());case 4:this.addBot(vt().botStatus(a,n,r));case 5:case"end":return e.stop()}}),e,this)}))),function(e){return o.apply(this,arguments)})},{key:"unload",value:function(){We.unbind(document,"keyup",this.keyup)}},{key:"addBot",value:function(e){var t,n=this.page,r=this.bots,a=this.sortedBots,o=e.config,s=o.baseID,i=o.quoteID,c=o.host,l=[vt().assets[s].symbol,vt().assets[i].symbol],u=l[1],d="".concat(l[0],"_").concat(u);if(null!==(t=vt().exchanges[c])&&void 0!==t&&t.markets[d]){var h=new Lo(this,this.runningMMDisplayElements,e);n.botRows.appendChild(h.row.tr),a.push(h),r[h.id]=h,this.appendBotBox(h.div)}}},{key:"confirmRemoveCfg",value:function(e){var t=this.page;this.removingCfg=e,We.hide(t.removeCfgErr);var n=vt().assets[e.baseID].unitInfo.conventional.unit,r=vt().assets[e.quoteID].unitInfo.conventional.unit;t.confirmRemoveCfgMsg.textContent=ke("DELETE_BOT",{host:e.host,baseTicker:n,quoteTicker:r}),this.forms.show(this.page.confirmRemoveForm)}},{key:"removeCfg",value:(n=s(f().mark((function e(){var t,n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,this.removingCfg){e.next=4;break}return this.forms.close(),e.abrupt("return");case 4:return e.next=6,Jn.removeBotConfig(this.removingCfg.host,this.removingCfg.baseID,this.removingCfg.quoteID);case 6:if(n=e.sent,vt().checkResponse(n)){e.next=11;break}return t.removeCfgErr.textContent=ke(H,{msg:n.msg}),We.show(t.removeCfgErr),e.abrupt("return");case 11:return e.next=13,vt().fetchMMStatus();case 13:vt().loadPage("mm");case 14:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"appendBotBox",value:function(e){var t=this.page,n=t.boxZero,r=t.boxOne;(this.twoColumn&&(n.children.length+r.children.length)%2!=0?r:n).append(e)}},{key:"clearBotBoxes",value:function(){for(var e=this.page,t=e.boxOne,n=e.boxZero;n.children.length>1;)n.removeChild(n.lastChild);for(;t.children.length>0;)t.removeChild(t.lastChild)}},{key:"showBot",value:function(e){var t=this.sortedBots,n=t.findIndex((function(t){return t.id===e}));t.splice(n,1),t.unshift(this.bots[e]),this.clearBotBoxes();var r,a=Io(t);try{for(a.s();!(r=a.n()).done;){var o=r.value.div;this.appendBotBox(o)}}catch(e){a.e(e)}finally{a.f()}var s=this.bots[e].div;We.animate(250,(function(e){s.style.opacity="".concat(e),s.style.transform="scale(".concat(.8+.2*e,")")}))}},{key:"newBot",value:function(){vt().loadPage("mmsettings")}},{key:"cexConfigured",value:(t=s(f().mark((function e(t,n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,vt().fetchMMStatus();case 2:this.updateCexRow(this.cexes[t]),n&&this.forms.close();case 4:case"end":return e.stop()}}),e,this)}))),function(e,n){return t.apply(this,arguments)})},{key:"updateCexRow",value:function(e){var t=e.tmpl,n=e.dinfo,r=e.cexName;t.logo.src=n.logo,t.name.textContent=n.name;var o=vt().mmStatus.cexes[r];if(We.setVis(!o,t.unconfigured),We.setVis(o&&!o.connectErr,t.configured),We.setVis(null==o?void 0:o.connectErr,t.connectErrBox),null!=o&&o.connectErr&&(t.connectErr.textContent="connection error",t.connectErr.dataset.tooltip=o.connectErr),t.logo.classList.toggle("greyscale",!o),o){for(var s=0,i={},c=0,l=Object.entries(o.balances);c<l.length;c++){var u=a(l[c],2),d=u[0],h=u[1],p=parseInt(d),f=We.bipCEXSymbol(p);if(!i[f]){i[f]=!0;var v=vt().assets[p].unitInfo,m=vt().fiatRatesMap[p];m&&(s+=m*(h.available+h.locked)/v.conventional.conversionFactor)}}t.usdBalance.textContent=We.formatFourSigFigs(s)}}},{key:"percentageBalanceStr",value:function(e,t,n){var r=vt().assets[e],a=r.unitInfo,o=We.formatCoinValue(t*n/100,a);return"".concat(We.formatFourSigFigs(n),"% - ").concat(o," ").concat(r.symbol.toUpperCase())}},{key:"walletBalanceStr",value:function(e,t){var n=vt().assets[e].wallet.balance.available;return this.percentageBalanceStr(e,n,t)}}]),m}(ut),Lo=function(e){g(c,e);var t,n,o=Ro(c);function c(e,t,n){var r;i(this,c),h(v(r=o.call(this,n.config)),"pg",void 0),h(v(r),"div",void 0),h(v(r),"page",void 0),h(v(r),"placementsChart",void 0),h(v(r),"baseAllocSlider",void 0),h(v(r),"quoteAllocSlider",void 0),h(v(r),"row",void 0),h(v(r),"runDisplay",void 0),r.pg=e;var a=v(r),s=a.baseID,l=a.quoteID,u=a.host,d=a.botType,p=a.nBuyPlacements,f=a.nSellPlacements,m=a.cexName;r.id=rr(u,s,l);var g=r.div=e.page.botTmpl.cloneNode(!0),y=r.page=We.parseTemplate(g);r.runDisplay=new cr(y.onBox,e.forms,t,"mm"),$n(g,s,l,u),m&&er(g,m),d===Kn?y.botTypeDisplay.textContent=ke(pe):d===Qn?y.botTypeDisplay.textContent=ke(fe):d===Xn&&(y.botTypeDisplay.textContent=ke(he)),We.setVis(d!==Qn,y.placementsChartBox,y.baseTokenSwapFeesBox),d!==Qn&&(r.placementsChart=new nr(y.placementsChart),y.buyPlacementCount.textContent=String(p),y.sellPlacementCount.textContent=String(f)),We.bind(y.startBttn,"click",(function(){return r.start()})),We.bind(y.allocationBttn,"click",(function(){return r.allocate()})),We.bind(y.reconfigureBttn,"click",(function(){return r.reconfigure()})),We.bind(y.removeBttn,"click",(function(){return r.pg.confirmRemoveCfg(n.config)})),We.bind(y.goBackFromAllocation,"click",(function(){return r.hideAllocationDialog()})),We.bind(y.marketLink,"click",(function(){return vt().loadPage("markets",{host:u,baseID:s,quoteID:l})})),r.baseAllocSlider=new $e(y.baseAllocSlider,(function(){})),r.quoteAllocSlider=new $e(y.quoteAllocSlider,(function(){}));var x=e.page.botRowTmpl.cloneNode(!0);$n(x,s,l,u);var b=We.parseTemplate(x);return r.row={tr:x,tmpl:b},We.bind(b.allocateBttn,"click",(function(t){t.stopPropagation(),r.allocate(),e.showBot(r.id)})),We.bind(x,"click",(function(){return e.showBot(r.id)})),r.initialize(),r}return d(c,[{key:"initialize",value:(n=s(f().mark((function e(){var t,n,a,o,s,i,l,u,d,h,p,v,m,g,y,b,k,w,C,S,F,T,D;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Do(x(c.prototype),"initialize",this).call(this);case 2:this.runDisplay.setBotMarket(this),t=this.page,n=this.host,a=this.cexName,o=this.botType,s=this.div,i=this.cfg,l=i.arbMarketMakingConfig,u=i.basicMarketMakingConfig,d=this.mktID,h=this.baseFactor,p=this.quoteFactor,v=this.marketReport.baseFiatRate,o!==Qn&&(m=[],g=[],y=0,l?(m=l.buyPlacements.map((function(e){return{lots:e.lots,gapFactor:e.multiplier}})),g=l.sellPlacements.map((function(e){return{lots:e.lots,gapFactor:e.multiplier}})),y=l.profit):u&&(m=u.buyPlacements,g=u.sellPlacements,m.length>0&&(b=m.reduce((function(e,t){return t.gapFactor<e.gapFactor?t:e}))),g.length>0&&(k=g.reduce((function(e,t){return t.gapFactor<e.gapFactor?t:e}))),b&&k?y=(b.gapFactor+k.gapFactor)/2:b?y=b.gapFactor:k&&(y=k.gapFactor)),w={cexName:a,botType:o,baseFiatRate:v,dict:{profit:y,buyPlacements:m,sellPlacements:g}},this.placementsChart.setMarket(w)),We.setVis(o!==Xn,t.cexDataBox),o!==Xn&&(C=vt().mmStatus.cexes[a])&&(S=C.markets?C.markets[d]:void 0,We.setVis(null==S?void 0:S.day,t.cexDataBox),null!=S&&S.day&&(F=S.day,t.cexPrice.textContent=We.formatFourSigFigs(F.lastPrice),t.cexVol.textContent=We.formatFourSigFigs(v*F.vol))),We.setVis.apply(We,[Boolean(a)].concat(r(We.applySelector(s,"[data-cex-show]")))),(T=vt().exchanges[n].markets[d].spot)&&(We.show(t.dexDataBox),D=Dt/h*p,t.dexPrice.textContent=We.formatFourSigFigs(T.rate/D),t.dexVol.textContent=We.formatFourSigFigs(T.vol24/h*v)),this.updateDisplay(),this.updateTableRow(),We.hide(t.loadingBg);case 13:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"updateTableRow",value:function(){var e=this.row.tmpl,t=this.status(),n=t.running,r=t.runStats;We.setVis(n,e.profitLossBox),We.setVis(!n,e.allocateBttnBox),r&&(e.profitLoss.textContent=We.formatFourSigFigs(r.profitLoss.profit,2))}},{key:"updateDisplay",value:function(){var e=this.page,t=this.marketReport;if([t.baseFiatRate,t.quoteFiatRate,this.baseFeeFiatRate,this.quoteFeeFiatRate].some((function(e){return!e})))return We.hide(e.onBox,e.offBox),void We.show(e.noFiatDisplay);var n=this.status().running;We.setVis(n,e.onBox),We.setVis(!n,e.offBox),n?this.updateRunningDisplay():this.updateIdleDisplay()}},{key:"updateRunningDisplay",value:function(){this.runDisplay.update()}},{key:"updateIdleDisplay",value:function(){var e=this.page,t=this.proj,n=t.alloc,r=t.qProj,a=t.bProj,o=this.baseID,s=this.quoteID,i=this.cexName,c=this.bui,l=this.qui,u=this.baseFeeID,d=this.quoteFeeID,h=this.baseFactor,p=this.quoteFactor,f=this.baseFeeFactor,v=this.quoteFeeFactor,m=this.marketReport,g=m.baseFiatRate,y=m.quoteFiatRate,x=this.cfg.uiConfig,b=x.baseConfig,k=x.quoteConfig,w=this.quoteFeeUI,C=this.baseFeeUI;e.baseAlloc.textContent=We.formatFullPrecision(n[o],c);var S=n[o]/h*g,F=S;if(e.baseAllocUSD.textContent=We.formatFourSigFigs(S),e.baseBookAlloc.textContent=We.formatFullPrecision(a.book*h,c),e.baseOrderReservesAlloc.textContent=We.formatFullPrecision(a.orderReserves*h,c),e.baseOrderReservesPct.textContent=String(Math.round(100*b.orderReservesFactor)),We.setVis(i,e.baseCexAllocBox),i&&(e.baseCexAlloc.textContent=We.formatFullPrecision(a.cex*h,c)),We.setVis(u===o,e.baseBookingFeesAllocBox),We.setVis(u!==o,e.baseTokenFeesAllocBox),u===o){var T=o===d?a.bookingFees+r.bookingFees:a.bookingFees;e.baseBookingFeesAlloc.textContent=We.formatFullPrecision(T*f,C)}else{var D=n[u];e.baseTokenFeeAlloc.textContent=We.formatFullPrecision(D,C);var I=D/f*vt().fiatRatesMap[u];F+=I,e.baseTokenAllocUSD.textContent=We.formatFourSigFigs(I);var A=u===d,R=a.bookingFees+(A?r.bookingFees:0);e.baseTokenBookingFees.textContent=We.formatFullPrecision(R*f,C),e.baseTokenSwapFeeN.textContent=String(b.swapFeeN+(A?k.swapFeeN:0));var E=a.swapFeeReserves+(A?r.swapFeeReserves:0);e.baseTokenSwapFees.textContent=We.formatFullPrecision(E*f,C)}e.quoteAlloc.textContent=We.formatFullPrecision(n[s],l);var B=n[s]/p*y;if(F+=B,e.quoteAllocUSD.textContent=We.formatFourSigFigs(B),e.quoteBookAlloc.textContent=We.formatFullPrecision(r.book*p,l),e.quoteOrderReservesAlloc.textContent=We.formatFullPrecision(r.orderReserves*p,l),e.quoteOrderReservesPct.textContent=String(Math.round(100*k.orderReservesFactor)),e.quoteSlippageAlloc.textContent=We.formatFullPrecision(r.slippageBuffer*p,l),e.slippageBufferFactor.textContent=String(Math.round(100*k.slippageBufferFactor)),We.setVis(i,e.quoteCexAllocBox),i&&(e.quoteCexAlloc.textContent=We.formatFullPrecision(r.cex*p,l)),We.setVis(s===d,e.quoteBookingFeesAllocBox),We.setVis(d!==s&&d!==u,e.quoteTokenFeesAllocBox),s===d){var P=s===u?a.bookingFees+r.bookingFees:r.bookingFees;e.quoteBookingFeesAlloc.textContent=We.formatFullPrecision(P*v,w)}else if(d!==u){e.quoteTokenFeeAlloc.textContent=We.formatFullPrecision(n[d],w);var L=n[d]/v*vt().fiatRatesMap[d];F+=L,e.quoteTokenAllocUSD.textContent=We.formatFourSigFigs(L),e.quoteTokenBookingFees.textContent=We.formatFullPrecision(r.bookingFees*v,w),e.quoteTokenSwapFeeN.textContent=String(k.swapFeeN),e.quoteTokenSwapFees.textContent=We.formatFullPrecision(r.swapFeeReserves*v,w)}e.totalAllocUSD.textContent=We.formatFourSigFigs(F)}},{key:"allocate",value:function(){var e,t,n,o,s,i=this,c=this.page,l=this.marketReport,u=l.baseFiatRate,d=l.quoteFiatRate,p=this.baseID,f=this.quoteID,v=this.baseFeeID,m=this.quoteFeeID,g=this.baseFeeFiatRate,y=this.quoteFeeFiatRate,x=this.cexName,b=this.baseFactor,k=this.quoteFactor,w=this.baseFeeFactor,C=this.quoteFeeFactor,S=this.host,F=this.mktID;if(x){var T=vt().mmStatus.cexes[x];if(!T||!T.connected)return c.offError.textContent=ke(ye,{cexName:x}),void We.showTemporarily(3e3,c.offError)}var D=this.fundingState(),I=a(Bo(D.base),3),A=I[0],R=I[1],E=I[2],B=a(Bo(D.quote),3),P=B[0],L=B[1],O=B[2],M=this.alloc={dex:(e={},h(e,p,A*b),h(e,f,P*k),e),cex:(t={},h(t,p,R*b),h(t,f,L*k),t)};M.dex[v]=Math.min((null!==(n=M.dex[v])&&void 0!==n?n:0)+D.base.fees.req*w,D.base.fees.avail*w),M.dex[m]=Math.min((null!==(o=M.dex[m])&&void 0!==o?o:0)+D.quote.fees.req*C,D.quote.fees.avail*C);var q=M.dex[p]/b*u+M.dex[f]/k*d;q+=M.cex[p]/b*u+M.cex[f]/k*d,v!==p&&(q+=M.dex[v]/w*g),m!==f&&m!==v&&(q+=M.dex[m]/C*y),c.allocUSD.textContent=We.formatFourSigFigs(q),We.setVis.apply(We,[x].concat(r(We.applySelector(c.allocationDialog,"[data-cex-only]")))),We.setVis(D.fundedAndBalanced,c.fundedAndBalancedBox),We.setVis(D.base.transferable+D.quote.transferable>0,c.hasTransferable),We.setVis(D.fundedAndNotBalanced,c.fundedAndNotBalancedBox),We.setVis(D.starved,c.starvedBox),c.startBttn.classList.toggle("go",D.fundedAndBalanced),c.startBttn.classList.toggle("warning",!D.fundedAndBalanced),c.proposedDexBaseAlloc.classList.toggle("text-warning",!(D.base.fundedAndBalanced||D.base.fundedAndNotBalanced)),c.proposedDexQuoteAlloc.classList.toggle("text-warning",!(D.quote.fundedAndBalanced||D.quote.fundedAndNotBalanced));var N=function(e,t){c.proposedDexBaseAlloc.textContent=We.formatFourSigFigs(e),c.proposedDexBaseAllocUSD.textContent=We.formatFourSigFigs(e*u),c.proposedCexBaseAlloc.textContent=We.formatFourSigFigs(t),c.proposedCexBaseAllocUSD.textContent=We.formatFourSigFigs(t*u)};if(N(A,R),We.setVis(E,c.baseAllocSlider),E){var W=E.right.dex-E.left.dex,V=E.right.cex-E.left.cex;this.baseAllocSlider.setValue(.5),this.baseAllocSlider.changed=function(e){var t=E.left.dex+e*W,n=E.left.cex+e*V;M.dex[p]=t*b,M.cex[p]=n*b,N(t,n)}}var U=function(e,t){c.proposedDexQuoteAlloc.textContent=We.formatFourSigFigs(e),c.proposedDexQuoteAllocUSD.textContent=We.formatFourSigFigs(e*d),c.proposedCexQuoteAlloc.textContent=We.formatFourSigFigs(t),c.proposedCexQuoteAllocUSD.textContent=We.formatFourSigFigs(t*d)};if(U(P,L),We.setVis(O,c.quoteAllocSlider),O){var _=O.right.dex-O.left.dex,j=O.right.cex-O.left.cex;this.quoteAllocSlider.setValue(.5),this.quoteAllocSlider.changed=function(e){var t=O.left.dex+e*_,n=O.left.cex+e*j;M.dex[f]=t*k,M.cex[f]=n*k,U(t,n)}}if(We.setVis.apply(We,[v!==p].concat(r(We.applySelector(c.allocationDialog,"[data-base-token-fees]")))),v!==p){var H=D.base.fees.req+(v===m?D.quote.fees.req:0),z=Math.min(H,D.base.fees.avail);c.proposedDexBaseFeeAlloc.textContent=We.formatFourSigFigs(z),c.proposedDexBaseFeeAllocUSD.textContent=We.formatFourSigFigs(z*g),c.proposedDexBaseFeeAlloc.classList.toggle("text-warning",!D.base.fees.funded)}var G=m!==f&&m!==v;if(We.setVis.apply(We,[G].concat(r(We.applySelector(c.allocationDialog,"[data-quote-token-fees]")))),G){var X=Math.min(D.quote.fees.req,D.quote.fees.avail);c.proposedDexQuoteFeeAlloc.textContent=We.formatFourSigFigs(X),c.proposedDexQuoteFeeAllocUSD.textContent=We.formatFourSigFigs(X*y),c.proposedDexQuoteFeeAlloc.classList.toggle("text-warning",!D.quote.fees.funded)}var K=null===(s=vt().exchanges[S])||void 0===s?void 0:s.markets[F],Q=!1;if(K&&K.orders)for(var Y=0;Y<K.orders.length;Y++)if(K.orders[Y].status<=2){Q=!0;break}We.setVis(Q,c.existingOrdersBox),We.show(c.allocationDialog),We.bind(document,"click",(function e(t){We.mouseInElement(t,c.allocationDialog)||(i.hideAllocationDialog(),We.unbind(document,"click",e))}))}},{key:"hideAllocationDialog",value:function(){We.hide(this.page.allocationDialog)}},{key:"start",value:(t=s(f().mark((function e(){var t,n,r,o,s,i,c,l,u,d,h,p,v,m,g,y,x,b;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,r=this.alloc,o=this.baseID,s=this.quoteID,i=this.host,c=this.cexName,l=this.cfg.uiConfig.cexRebalance,We.hide(n.errMsg),!c||null!==(t=vt().mmStatus.cexes[c])&&void 0!==t&&t.connected){e.next=6;break}return n.errMsg.textContent="".concat(c," not connected"),We.show(n.errMsg),e.abrupt("return");case 6:for(u=0,d=[r.dex,r.cex];u<d.length;u++)for(h=d[u],p=0,v=Object.entries(h);p<v.length;p++)m=a(v[p],2),g=m[0],y=m[1],h[parseInt(g)]=Math.round(y);return x={baseID:o,quoteID:s,host:i,alloc:r},c&&l&&(x.autoRebalance=this.autoRebalanceSettings()),e.prev=9,vt().log("mm","starting mm bot",x),e.next=13,Jn.startBot(x);case 13:if(b=e.sent,vt().checkResponse(b)){e.next=16;break}throw b;case 16:e.next=23;break;case 18:return e.prev=18,e.t0=e.catch(9),n.errMsg.textContent=ke(H,e.t0),We.show(n.errMsg),e.abrupt("return");case 23:this.hideAllocationDialog();case 24:case"end":return e.stop()}}),e,this,[[9,18]])}))),function(){return t.apply(this,arguments)})},{key:"autoRebalanceSettings",value:function(){var e=this.proj,t=e.bProj,n=e.qProj,r=e.alloc,a=this.baseFeeID,o=this.quoteFeeID,s=this.cfg.uiConfig,i=s.baseConfig,c=s.quoteConfig,l=this.baseID,u=this.quoteID,d=this.cexName,h=this.mktID,p=r[l],f=t.book;l===a&&(f+=t.bookingFees),l===o&&(f+=n.bookingFees);var v=n.book;u===o&&(v+=n.bookingFees),u===a&&(v+=t.bookingFees);var m=Math.max(p-f,p-t.cex),g=r[u],y=Math.max(g-v,g-n.cex);if(m<0||y<0)throw Error("rebalance math doesn't work: ".concat(JSON.stringify({bProj:t,qProj:n,maxBase:m,maxQuote:y})));var x=vt().mmStatus.cexes[d].markets[h],b=[x.baseMinWithdraw,Math.max(2*x.baseMinWithdraw,m)],k=b[0],w=b[1],C=Math.round(k+i.transferFactor*(w-k)),S=[x.quoteMinWithdraw,Math.max(2*x.quoteMinWithdraw,y)],F=S[0],T=S[1];return{minBaseTransfer:C,minQuoteTransfer:Math.round(F+c.transferFactor*(T-F))}}},{key:"reconfigure",value:function(){var e=this.host,t=this.baseID,n=this.quoteID,r=this.cexName,a=this.botType,o=this.page;if(r){var s=vt().mmStatus.cexes[r];if(!s||!s.connected)return o.offError.textContent=ke(ye,{cexName:r}),void We.showTemporarily(3e3,o.offError)}vt().loadPage("mmsettings",{host:e,baseID:t,quoteID:n,cexName:r,botType:a})}},{key:"handleEpochReportNote",value:function(e){this.runDisplay.handleEpochReportNote(e)}},{key:"handleCexProblemsNote",value:function(e){this.runDisplay.handleCexProblemsNote(e)}},{key:"handleRunStats",value:function(){this.updateDisplay(),this.updateTableRow(),this.runDisplay.readBook()}}]),c}(ir);function Oo(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Mo(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Oo(Object(n),!0).forEach((function(t){h(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Oo(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function qo(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return No(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?No(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function No(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function Wo(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Wo=function(){return!!e})()}var Vo="lastMMSpecs",Uo="lastBots",_o="lastArbExchange",jo="arbmm",Ho=.001,zo=.099,Go=.001,Xo=.0199,Ko={gapStrategy:Gn,sellPlacements:[],buyPlacements:[],driftTolerance:.002,profit:.02,orderPersistence:20,cexRebalance:!0,simpleArbLots:1},Qo={swapFeeN:50,orderReservesFactor:1,slippageBufferFactor:.05,transferFactor:.1},Yo=function(e){g(D,e);var t,n,o,l,u,p,m,b,w,C,S,F,T=(t=D,n=Wo(),function(){var e,r=x(t);if(n){var a=x(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function D(e,t){var n;i(this,D),h(v(n=T.call(this)),"page",void 0),h(v(n),"forms",void 0),h(v(n),"opts",void 0),h(v(n),"newWalletForm",void 0),h(v(n),"approveTokenForm",void 0),h(v(n),"walletAddrForm",void 0),h(v(n),"cexConfigForm",void 0),h(v(n),"currentMarket",void 0),h(v(n),"originalConfig",void 0),h(v(n),"updatedConfig",void 0),h(v(n),"creatingNewBot",void 0),h(v(n),"marketReport",void 0),h(v(n),"qcProfit",void 0),h(v(n),"qcProfitSlider",void 0),h(v(n),"qcLevelSpacing",void 0),h(v(n),"qcLevelSpacingSlider",void 0),h(v(n),"qcMatchBuffer",void 0),h(v(n),"qcMatchBufferSlider",void 0),h(v(n),"qcLevelsPerSide",void 0),h(v(n),"qcLotsPerLevel",void 0),h(v(n),"qcUSDPerSide",void 0),h(v(n),"cexBaseBalance",void 0),h(v(n),"cexQuoteBalance",void 0),h(v(n),"specs",void 0),h(v(n),"mktID",void 0),h(v(n),"formSpecs",void 0),h(v(n),"formCexes",void 0),h(v(n),"placementsCache",void 0),h(v(n),"botTypeSelectors",void 0),h(v(n),"marketRows",void 0),h(v(n),"lotsPerLevelIncrement",void 0),h(v(n),"placementsChart",void 0),h(v(n),"basePane",void 0),h(v(n),"quotePane",void 0),h(v(n),"driftTolerance",void 0),h(v(n),"driftToleranceSlider",void 0),h(v(n),"orderPersistence",void 0),h(v(n),"orderPersistenceSlider",void 0),n.placementsCache={},n.opts={};var r=n.page=We.idDescendants(e);n.forms=new mr(r.forms,{closed:function(){var e,t;null!==(e=n.specs)&&void 0!==e&&e.host&&null!==(t=n.specs)&&void 0!==t&&t.botType||vt().loadPage("mm")}}),n.placementsChart=new nr(r.placementsChart),n.approveTokenForm=new Rr(r.approveTokenForm,(function(){n.submitBotType()})),n.walletAddrForm=new Dr(r.walletAddrForm),n.cexConfigForm=new Er(r.cexConfigForm,(function(e){return n.cexConfigured(e)})),r.quotePane=r.basePane.cloneNode(!0),r.assetPaneBox.appendChild(r.quotePane),n.basePane=new es(v(n),r.basePane),n.quotePane=new es(v(n),r.quotePane),vt().headerSpace.appendChild(r.mmTitle),yt(r),We.cleanTemplates(r.orderOptTmpl,r.booleanOptTmpl,r.rangeOptTmpl,r.placementRowTmpl,r.oracleTmpl,r.cexOptTmpl,r.arbBttnTmpl,r.marketRowTmpl,r.needRegTmpl),r.basePane.removeAttribute("id"),We.bind(r.resetButton,"click",(function(){n.setOriginalValues()})),We.bind(r.updateButton,"click",(function(){n.saveSettings()})),We.bind(r.createButton,"click",s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.saveSettings();case 1:case"end":return e.stop()}}),e)})))),We.bind(r.deleteBttn,"click",(function(){n.delete()})),Mr(r.botTypeForm,r.botTypeSubmit,(function(){n.submitBotType()})),We.bind(r.noMarketBttn,"click",(function(){n.showMarketSelectForm()})),We.bind(r.botTypeHeader,"click",(function(){n.reshowBotTypeForm()})),We.bind(r.botTypeChangeMarket,"click",(function(){n.showMarketSelectForm()})),We.bind(r.marketHeader,"click",(function(){n.showMarketSelectForm()})),We.bind(r.marketFilterInput,"input",(function(){n.sortMarketRows()})),We.bind(r.cexRebalanceCheckbox,"change",(function(){n.autoRebalanceChanged()})),We.bind(r.switchToAdvanced,"click",(function(){n.showAdvancedConfig()})),We.bind(r.switchToQuickConfig,"click",(function(){n.switchToQuickConfig()})),We.bind(r.qcMatchBuffer,"change",(function(){n.matchBufferChanged()})),We.bind(r.switchToUSDPerSide,"click",(function(){n.changeSideCommitmentDialog()})),We.bind(r.switchToLotsPerLevel,"click",(function(){n.changeSideCommitmentDialog()})),We.bind(r.gapStrategySelect,"change",(function(){if(r.gapStrategySelect.value){var e=r.gapStrategySelect.value;n.clearPlacements(n.updatedConfig.gapStrategy),n.loadCachedPlacements(e),n.updatedConfig.gapStrategy=e,n.setGapFactorLabels(e),n.updateModifiedMarkers()}})),We.bind(r.addBuyPlacementBtn,"click",(function(){n.addPlacement(!0,null),r.addBuyPlacementLots.value="",r.addBuyPlacementGapFactor.value="",n.updateModifiedMarkers(),n.placementsChart.render(),n.updateAllocations()})),We.bind(r.addSellPlacementBtn,"click",(function(){n.addPlacement(!1,null),r.addSellPlacementLots.value="",r.addSellPlacementGapFactor.value="",n.updateModifiedMarkers(),n.placementsChart.render(),n.updateAllocations()})),n.driftTolerance=new Je(r.driftToleranceInput,{prec:3,sigFigs:!0,min:0,changed:function(e){var t=a(tt(e/100,5),1)[0];n.driftToleranceSlider.setValue((t-0)/.02),n.updatedConfig.driftTolerance=t}}),n.driftToleranceSlider=new $e(r.driftToleranceSlider,(function(e){var t=a(tt(0+.02*e,5),1)[0];n.updatedConfig.driftTolerance=t,n.driftTolerance.setValue(100*t)})),n.orderPersistence=new Je(r.orderPersistence,{changed:function(e){n.updatedConfig.orderPersistence=e,n.orderPersistenceSlider.setValue((e-0)/40)}}),n.orderPersistenceSlider=new $e(r.orderPersistenceSlider,(function(e){var t=a(et(0+40*e,0),1)[0];n.updatedConfig.orderPersistence=t,n.orderPersistence.setValue(t)})),n.qcProfit=new Je(r.qcProfit,{prec:1,sigFigs:!0,min:.1,changed:function(e){var t=e/100;n.updatedConfig.profit=t,r.profitInput.value=n.qcProfit.input.value,n.qcProfitSlider.setValue((t-.001)/.099),n.quickConfigUpdated()}}),n.qcProfitSlider=new $e(r.qcProfitSlider,(function(e){var t=a(tt(100*(Ho+e*zo),3),1)[0];n.updatedConfig.profit=t/100,n.qcProfit.setValue(t),r.profitInput.value=n.qcProfit.input.value,n.quickConfigUpdated()})),n.qcLevelSpacing=new Je(r.qcLevelSpacing,{prec:1,sigFigs:!0,min:.1,changed:function(e){var t=Xo;n.qcLevelSpacingSlider.setValue((e/100-.001)/t),n.quickConfigUpdated()}}),n.qcLevelSpacingSlider=new $e(r.qcLevelSpacingSlider,(function(e){var t=Xo;n.qcLevelSpacing.setValue(.001+e*t*100),n.quickConfigUpdated()})),n.qcMatchBuffer=new Je(r.qcMatchBuffer,{prec:1,sigFigs:!0,min:0,changed:function(e){n.qcMatchBufferSlider.setValue((e/100-0)/1),n.quickConfigUpdated()}}),n.qcMatchBufferSlider=new $e(r.qcMatchBufferSlider,(function(e){n.qcMatchBuffer.setValue(0+1*e*100),n.quickConfigUpdated()})),n.qcLevelsPerSide=new Ze(r.qcLevelsPerSide,{prec:0,min:1,inc:1,changed:function(e){n.qcUSDPerSide.setValue(n.lotSizeUSD()*e*n.qcLotsPerLevel.value()),n.quickConfigUpdated()}}),n.qcLotsPerLevel=new Ze(r.qcLotsPerLevel,{prec:0,min:1,inc:1,changed:function(e){n.qcUSDPerSide.setValue(n.lotSizeUSD()*e*n.qcLevelsPerSide.value()),r.qcUSDPerSideEcho.textContent=n.qcUSDPerSide.input.value,n.quickConfigUpdated()},set:function(e){var t=a(tt(e*n.qcLevelsPerSide.value()*n.lotSizeUSD(),2),2)[1];r.qcUSDPerSideEcho.textContent=t,r.qcLotsPerLevelEcho.textContent=t}}),n.qcUSDPerSide=new Ze(r.qcUSDPerSide,{prec:2,min:1,inc:1,changed:function(e){n.qcLotsPerLevel.setValue(e/n.qcLevelsPerSide.value()/n.lotSizeUSD()),r.qcLotsPerLevelEcho.textContent=n.qcLotsPerLevel.input.value,n.quickConfigUpdated()},set:function(e,t){r.qcUSDPerSideEcho.textContent=t,r.qcLotsPerLevelEcho.textContent=String(Math.round(e/n.lotSizeUSD()))}});var o=function(e){"Enter"===e.key&&(isNaN(parseFloat(r.addBuyPlacementGapFactor.value||""))||isNaN(parseFloat(r.addBuyPlacementLots.value||""))||r.addBuyPlacementBtn.click())};We.bind(r.addBuyPlacementGapFactor,"keyup",(function(e){o(e)})),We.bind(r.addBuyPlacementLots,"keyup",(function(e){o(e)}));var c=function(e){"Enter"===e.key&&(isNaN(parseFloat(r.addSellPlacementGapFactor.value||""))||isNaN(parseFloat(r.addSellPlacementLots.value||""))||r.addSellPlacementBtn.click())};We.bind(r.addSellPlacementGapFactor,"keyup",(function(e){c(e)})),We.bind(r.addSellPlacementLots,"keyup",(function(e){c(e)})),We.bind(r.profitInput,"change",(function(){We.hide(r.profitInputErr);var e=function(e){We.show(r.profitInputErr),r.profitInputErr.textContent=ke(e)},t=parseFloat(r.profitInput.value||"")/100;return isNaN(t)?e(ue):0===t?e(de):(n.updatedConfig.profit=t,void n.updateModifiedMarkers())})),n.botTypeSelectors=We.applySelector(r.botTypeForm,"[data-bot-type]");var l,u=qo(n.botTypeSelectors);try{var d=function(){var e=l.value;We.bind(e,"click",(function(){e.classList.contains("disabled")||(We.hide(r.botTypeErr),r.cexSelection.classList.toggle("disabled",e.dataset.botType===Xn),n.setBotTypeSelected(e.dataset.botType))}))};for(u.s();!(l=u.n()).done;)d()}catch(e){u.e(e)}finally{u.f()}return n.newWalletForm=new gr(r.newWalletForm,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,vt().fetchUser();case 2:n.submitBotType();case 3:case"end":return e.stop()}}),e)})))),vt().registerNoteFeeder({balance:function(e){n.handleBalanceNote(e)}}),n.initialize(t),n}return d(D,[{key:"unload",value:function(){this.forms.exit()}},{key:"initialize",value:(F=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.setupCEXes(),this.initializeMarketRows(),t&&0===Object.keys(t).length&&(t=k.fetchLocal(Vo)),t&&vt().walletMap[t.baseID]&&vt().walletMap[t.quoteID]){e.next=7;break}return this.showMarketSelectForm(),e.abrupt("return");case 7:return t&&!t.botType&&(r=ar(t.host,t.baseID,t.quoteID),t.cexName=null!==(n=null==r?void 0:r.cexName)&&void 0!==n?n:"",t.botType=Xn,null!=r&&r.arbMarketMakingConfig?t.botType=Kn:null!=r&&r.simpleArbConfig&&(t.botType=Qn)),this.specs=t,e.next=11,this.fetchCEXBalances(t);case 11:this.configureUI();case 12:case"end":return e.stop()}}),e,this)}))),function(e){return F.apply(this,arguments)})},{key:"configureUI",value:(S=s(f().mark((function e(){var t,n,o,s,i,c,l,u,d,h,p,v,m,g,y,x,b,w,C,S,F,T,D,I,A,R,E,B,P,L,O,M,q,N,W,V,U,_,j,H,z;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(c=this.page,l=this.specs,u=l.host,d=l.baseID,h=l.quoteID,p=l.cexName,v=l.botType,m=[vt().assets[d],vt().assets[h]],y=(g=m[0]).symbol,x=g.token,w=(b=m[1]).symbol,C=b.token,this.mktID="".concat(y,"_").concat(w),We.hide(c.botSettingsContainer,c.marketBox,c.updateButton,c.resetButton,c.createButton,c.noMarket,c.missingFiatRates),![d,h,null!==(t=null==x?void 0:x.parentID)&&void 0!==t?t:d,null!==(n=null==C?void 0:C.parentID)&&void 0!==n?n:h].some((function(e){return!vt().fiatRatesMap[e]}))){e.next=8;break}return We.show(c.missingFiatRates),e.abrupt("return");case 8:if(We.show(c.marketLoading),k.storeLocal(Vo,l),S=vt().mmStatus,F=Jo(l,S),(T=ar(u,d,h))&&(T.arbMarketMakingConfig?Kn:T.basicMarketMakingConfig?Xn:Qn)!==v&&(T=void 0),We.setVis(T,c.deleteBttnBox),D=this.originalConfig=Object.assign({},Ko,{disabled:F,baseOptions:this.defaultWalletOptions(d),quoteOptions:this.defaultWalletOptions(h),buyPlacements:[],sellPlacements:[],baseConfig:Object.assign({},Qo),quoteConfig:Object.assign({},Qo)}),T){for(A=(I=T).basicMarketMakingConfig,R=I.arbMarketMakingConfig,E=I.simpleArbConfig,B=I.uiConfig.cexRebalance,this.creatingNewBot=!1,P=D,L=0,O=Object.entries(T);L<O.length;L++)M=a(O[L],2),q=M[0],N=M[1],void 0!==P[q]&&(P[q]=N);D.baseConfig=Object.assign({},Qo,T.uiConfig.baseConfig),D.quoteConfig=Object.assign({},Qo,T.uiConfig.quoteConfig),D.baseOptions=T.baseWalletOptions||{},D.quoteOptions=T.quoteWalletOptions||{},D.cexRebalance=B,A?(D.buyPlacements=A.buyPlacements,D.sellPlacements=A.sellPlacements,D.driftTolerance=A.driftTolerance,D.gapStrategy=A.gapStrategy):R?(W=R.buyPlacements,V=R.sellPlacements,D.buyPlacements=Array.from(W,(function(e){return{lots:e.lots,gapFactor:e.multiplier}})),D.sellPlacements=Array.from(V,(function(e){return{lots:e.lots,gapFactor:e.multiplier}})),D.profit=R.profit,D.driftTolerance=R.driftTolerance,D.orderPersistence=R.orderPersistence):E&&(D.profit=E.profitTrigger,D.orderPersistence=E.numEpochsLeaveOpen,D.simpleArbLots=null!==(U=T.uiConfig.simpleArbLots)&&void 0!==U?U:1),We.setVis(!F,c.updateButton,c.resetButton)}else this.creatingNewBot=!0,We.setVis(!F,c.createButton);this.updatedConfig=JSON.parse(JSON.stringify(D)),e.t0=v,e.next=e.t0===Xn?21:e.t0===Kn?23:e.t0===Qn?25:26;break;case 21:return c.botTypeDisplay.textContent=ke(he),e.abrupt("break",26);case 23:return c.botTypeDisplay.textContent=ke(pe),e.abrupt("break",26);case 25:c.botTypeDisplay.textContent=ke(fe);case 26:return $n(document.body,d,h,u),We.setVis(v!==Qn,c.driftToleranceBox,c.switchToAdvanced),We.setVis.apply(We,[Boolean(p)].concat(r(We.applySelector(document.body,"[data-cex-show]")))),We.setVis(F,c.viewOnlyRunning),We.setVis(p,c.cexRebalanceSettings),p&&er(document.body,p),e.next=34,this.fetchMarketReport();case 34:_=this.lotSizeUSD(),this.lotsPerLevelIncrement=Math.round(Math.max(1,100/_)),this.qcLotsPerLevel.inc=this.lotsPerLevelIncrement,this.qcUSDPerSide.inc=this.lotsPerLevelIncrement*_,this.qcUSDPerSide.min=_,this.basePane.setAsset(d,!1),this.quotePane.setAsset(h,!0),j=this.marketReport.baseFiatRate,this.placementsChart.setMarket({cexName:p,botType:v,baseFiatRate:j,dict:this.updatedConfig}),H=!T||this.isQuickPlacements(this.updatedConfig.buyPlacements,this.updatedConfig.sellPlacements),z=null!==(o=null===(s=T)||void 0===s||null===(i=s.basicMarketMakingConfig)||void 0===i?void 0:i.gapStrategy)&&void 0!==o?o:Gn,c.gapStrategySelect.value=z,v===Qn||H&&z===Gn?this.showQuickConfig():this.showAdvancedConfig(),this.setOriginalValues(),We.hide(c.marketLoading),We.show(c.botSettingsContainer,c.marketBox);case 50:case"end":return e.stop()}}),e,this)}))),function(){return S.apply(this,arguments)})},{key:"initializeMarketRows",value:function(){var e=this;this.marketRows=[],We.empty(this.page.marketSelect);for(var t=function(){var t=r[n],o=t.host,s=t.markets,i=t.assets,c=t.auth;if(c.effectiveTier+c.pendingStrength===0){var l=e.page,u=l.needRegTmpl,d=l.needRegBox,h=u.cloneNode(!0),p=We.parseTemplate(h);return We.bind(h,"click",(function(){vt().loadPage("register",{host:o,backTo:"mmsettings"})})),p.host.textContent=o,d.appendChild(h),We.show(d),"continue"}for(var f=function(){var t=m[v],n=t.name,r=t.baseid,s=t.quoteid,c=t.spot,l=t.basesymbol,u=t.quotesymbol;if(!vt().assets[r]||!vt().assets[s])return"continue";var d=e.page.marketRowTmpl.cloneNode(!0),h=We.parseTemplate(d),p={tr:d,tmpl:h,host:o,name:n,baseID:r,quoteID:s,spot:c,arbs:[]};e.marketRows.push(p),e.page.marketSelect.appendChild(d),h.baseIcon.src=We.logoPath(l),h.quoteIcon.src=We.logoPath(u),h.baseSymbol.appendChild(We.symbolize(i[r],!0)),h.quoteSymbol.appendChild(We.symbolize(i[s],!0)),h.host.textContent=o;for(var f=e.cexMarketSupportFilter(r,s),g=0,y=Object.entries(Yn);g<y.length;g++){var x=a(y[g],2),b=x[0],k=x[1];if(f(b)){var w=e.page.arbBttnTmpl.cloneNode(!0);w.src=k.logo,h.arbs.appendChild(w),p.arbs.push(b)}}We.bind(d,"click",(function(){e.showBotTypeForm(o,r,s)}))},v=0,m=Object.values(s);v<m.length;v++)f()},n=0,r=Object.values(vt().exchanges);n<r.length;n++)t();if(0===this.marketRows.length){var o=this.page,s=o.marketSelectionTable,i=o.marketFilterBox,c=o.noMarkets;We.hide(s,i),We.show(c)}else We.hide(this.page.noMarkets);var l=vt().fiatRatesMap;this.marketRows.sort((function(e,t){var n,r,a,o,s=null!==(n=null===(r=e.spot)||void 0===r?void 0:r.vol24)&&void 0!==n?n:0,i=null!==(a=null===(o=t.spot)||void 0===o?void 0:o.vol24)&&void 0!==a?a:0;return l[e.baseID]&&l[t.baseID]&&(s*=l[e.baseID],i*=l[t.baseID]),i-s}))}},{key:"runningBotInventory",value:function(e){return Zn(e)}},{key:"adjustedBalances",value:function(e,t){var n=this.cexBaseBalance,r=this.cexQuoteBalance,a=[this.runningBotInventory(e.assetID),this.runningBotInventory(t.assetID)],o=a[0],s=a[1],i=((null==n?void 0:n.available)||0)-o.cex.total,c=((null==r?void 0:r.available)||0)-s.cex.total,l=e.balance.available-o.dex.total,u=t.balance.available-s.dex.total;return{baseAvail:l+i,quoteAvail:u+c,dexBaseAvail:l,dexQuoteAvail:u,cexBaseAvail:i,cexQuoteAvail:c}}},{key:"lotSizeUSD",value:function(){var e=this.specs,t=e.host,n=e.baseID,r=this.mktID,a=this.marketReport.baseFiatRate;return vt().exchanges[t].markets[r].lotsize/vt().assets[n].unitInfo.conventional.conversionFactor*a}},{key:"marketStuff",value:function(){var e=this.page,t=this.specs,n=t.host,r=t.baseID,a=t.quoteID,o=t.cexName,s=t.botType,i=this.basePane,c=this.quotePane,l=this.marketReport,u=l.baseFiatRate,d=l.quoteFiatRate,h=l.baseFees,p=l.quoteFees,f=this.lotsPerLevelIncrement,v=this.updatedConfig,m=this.originalConfig,g=this.mktID,y=vt().assets[r],x=y.symbol,b=y.unitInfo,k=vt().assets[a],w=k.symbol,C=k.unitInfo,S=vt().exchanges[n],F=S.markets[g],T=F.lotsize,D=F.spot,I=T/b.conventional.conversionFactor*u,A=1/b.conventional.conversionFactor*u/d*C.conventional.conversionFactor,R={conv:d/u,atomic:A,msg:Math.round(A*Dt),spot:D},E=[v.simpleArbLots,v.simpleArbLots],B=E[0],P=E[1];s!==Qn&&(B=this.updatedConfig.sellPlacements.reduce((function(e,t){return e+t.lots}),0),P=this.updatedConfig.buyPlacements.reduce((function(e,t){return e+t.lots}),0));var L=tr(T,r,a,D),O=this.walletStuff(),M=dr(r,a,h,p,T,B,P,O.baseFeeAssetID,O.quoteFeeAssetID,O.baseIsAccountLocker,O.quoteIsAccountLocker,v.baseConfig.orderReservesFactor,v.quoteConfig.orderReservesFactor);return Mo({page:e,cfg:v,oldCfg:m,host:n,xc:S,baseID:r,quoteID:a,botType:s,cexName:o,baseFiatRate:u,quoteFiatRate:d,xcRate:R,baseSymbol:x,quoteSymbol:w,mktID:g,lotSize:T,lotSizeUSD:I,lotsPerLevelIncrement:f,quoteLot:L,commit:M.commit,basePane:i,quotePane:c,fees:M.fees},O)}},{key:"walletStuff",value:function(){var e=this.specs,t=e.baseID,n=e.quoteID,r=[vt().walletMap[t],vt().walletMap[n]],a=r[0],o=r[1],s=[vt().assets[t],vt().assets[n]],i=s[0],c=i.token,l=i.unitInfo,u=s[1],d=u.token,h=u.unitInfo,p=c?c.parentID:t,f=d?d.parentID:n,v=[vt().assets[p].unitInfo,vt().assets[f].unitInfo];return Mo({baseWallet:a,quoteWallet:o,baseFeeUI:v[0],quoteFeeUI:v[1],baseToken:c,quoteToken:d,bui:l,qui:h,baseFeeAssetID:p,quoteFeeAssetID:f,baseIsAccountLocker:(16384&a.traits)>0,quoteIsAccountLocker:(16384&o.traits)>0},this.adjustedBalances(a,o))}},{key:"showAdvancedConfig",value:function(){var e=this.page;We.show(e.advancedConfig),We.hide(e.quickConfig),this.placementsChart.render()}},{key:"isQuickPlacements",value:function(e,t){if(0===e.length||e.length!==t.length)return!1;for(var n=0;n<e.length;n++){if(e[n].gapFactor!==t[n].gapFactor)return!1;if(e[n].lots!==t[n].lots)return!1}return!0}},{key:"switchToQuickConfig",value:function(){var e=this.marketStuff(),t=e.cfg,n=e.botType,r=e.lotSizeUSD,a=t.buyPlacements,o=t.sellPlacements;if(a.length>0&&o.length>0){var s=a.reduce((function(e,t){return t.gapFactor<e.gapFactor?t:e})),i=o.reduce((function(e,t){return t.gapFactor<e.gapFactor?t:e})),c=a.length+o.length,l=Math.max(1,Math.floor(c/2));if(n===Xn){t.profit=(s.gapFactor+i.gapFactor)/2;var u=a.reduce((function(e,t){return t.gapFactor>e.gapFactor?t:e})),d=o.reduce((function(e,t){return t.gapFactor>e.gapFactor?t:e})),h=(u.gapFactor-s.gapFactor+(d.gapFactor-i.gapFactor))/2/(l-1);this.qcProfit.setValue(100*t.profit),this.qcProfitSlider.setValue((t.profit-Ho)/zo),this.qcLevelSpacing.setValue(100*h),this.qcLevelSpacingSlider.setValue((h-Go)/Xo)}else if(n===Kn){var p=(a.reduce((function(e,t){return e+t.gapFactor}),0)+o.reduce((function(e,t){return e+t.gapFactor}),0))/c-1||0;this.qcMatchBuffer.setValue(100*p),this.qcMatchBufferSlider.setValue((p-0)/1)}var f=a.reduce((function(e,t){return e+t.lots}),0)+o.reduce((function(e,t){return e+t.lots}),0),v=Math.max(1,Math.round(f/2/l));this.qcLotsPerLevel.setValue(v),this.qcUSDPerSide.setValue(v*l*r),this.qcLevelsPerSide.setValue(l)}else n===Qn&&this.qcLotsPerLevel.setValue(t.simpleArbLots);this.showQuickConfig(),this.quickConfigUpdated()}},{key:"showQuickConfig",value:function(){var e=this.marketStuff(),t=e.page,n=e.lotSizeUSD,r=e.botType,a=e.lotsPerLevelIncrement;this.qcLevelsPerSide.input.value||(this.qcLevelsPerSide.setValue(1),this.qcUSDPerSide.setValue(1*(this.qcLotsPerLevel.value()||a)*n)),this.qcLotsPerLevel.input.value||(this.qcLotsPerLevel.setValue(a),this.qcUSDPerSide.setValue(n*a*this.qcLevelsPerSide.value())),t.qcLevelSpacing.value||(this.qcLevelSpacing.setValue(.5),this.qcLevelSpacingSlider.setValue(.20100502512562812)),t.qcMatchBuffer.value||(t.qcMatchBuffer.value=String(0)),We.hide(t.advancedConfig),We.show(t.quickConfig),this.showInputsForBot(r)}},{key:"showInputsForBot",value:function(e){var t=this.page,n=this.opts.usingUSDPerSide;switch(We.hide(t.matchMultiplierBox,t.placementsChartBox,t.placementChartLegend,t.lotsPerLevelLabel,t.levelSpacingBox,t.arbLotsLabel,t.qcLevelPerSideBox),We.setVis(n,t.qcUSDPerSideBox),We.setVis(!n,t.qcLotsBox),e){case Kn:We.show(t.qcLevelPerSideBox,t.matchMultiplierBox,t.placementsChartBox,t.placementChartLegend,t.lotsPerLevelLabel);break;case Xn:We.show(t.qcLevelPerSideBox,t.levelSpacingBox,t.placementsChartBox,t.lotsPerLevelLabel);break;case Qn:We.show(t.arbLotsLabel)}}},{key:"quickConfigUpdated",value:function(){var e,t,n,r=this.marketStuff(),a=r.page,o=r.cfg,s=r.botType,i=r.cexName;We.hide(a.qcError);var c=function(e){a.qcError.textContent=e,We.show(a.qcError)},l=s===Qn?1:this.qcLevelsPerSide.value();isNaN(l)&&c("invalid value for levels per side");var u=this.qcLotsPerLevel.value();isNaN(u)&&c("invalid value for lots per level");var d=parseFloat(null!==(e=a.qcProfit.value)&&void 0!==e?e:"")/100;isNaN(d)&&c("invalid value for profit");var h=s===Xn?parseFloat(null!==(t=a.qcLevelSpacing.value)&&void 0!==t?t:"")/100:0;isNaN(h)&&c("invalid value for level spacing");var p=s===Kn?parseFloat(null!==(n=a.qcMatchBuffer.value)&&void 0!==n?n:"")/100:0;isNaN(p)&&c("invalid value for match buffer");var f=p+1,v=1===l;if(a.levelSpacingBox.classList.toggle("disabled",v),a.qcLevelSpacing.disabled=v,o.simpleArbLots=u,s!==Qn){this.clearPlacements(i?jo:o.gapStrategy);for(var m=0;m<l;m++){var g={lots:u};g.gapFactor=s===Xn?d+h*m:f,o.buyPlacements.push(g),o.sellPlacements.push(g),this.addPlacement(!0,g),this.addPlacement(!1,g)}this.placementsChart.render()}this.updateAllocations()}},{key:"updateAllocations",value:function(){this.updateBaseAllocations(),this.updateQuoteAllocations()}},{key:"updateBaseAllocations",value:function(){var e=this.marketStuff(),t=e.commit,n=e.lotSize,r=e.basePane,a=e.fees;r.updateInventory(t.dex.base.lots,t.dex.quote.lots,n,t.dex.base.val,t.cex.base.val,a.base),r.updateCommitTotal()}},{key:"updateQuoteAllocations",value:function(){var e=this.marketStuff(),t=e.commit,n=e.quoteLot,r=e.quotePane,a=e.fees;r.updateInventory(t.dex.quote.lots,t.dex.base.lots,n,t.dex.quote.val,t.cex.quote.val,a.quote),r.updateCommitTotal()}},{key:"matchBufferChanged",value:function(){var e,t=this.page;t.qcMatchBuffer.value=Math.max(0,parseFloat(null!==(e=t.qcMatchBuffer.value)&&void 0!==e?e:"")||0).toFixed(2),this.quickConfigUpdated()}},{key:"showAddress",value:function(e){this.walletAddrForm.setAsset(e),this.forms.show(this.page.walletAddrForm)}},{key:"changeSideCommitmentDialog",value:function(){var e=this.page,t=this.opts;t.usingUSDPerSide=!t.usingUSDPerSide,We.setVis(t.usingUSDPerSide,e.qcUSDPerSideBox),We.setVis(!t.usingUSDPerSide,e.qcLotsBox)}},{key:"showBotTypeForm",value:(C=s(f().mark((function e(t,n,r,a,o){var s,i,c,l,u,d,h,p,v,m,g,y,x,b,w,C,S,F,T,D,I,A,R,E,B,P,L,O;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(s=this.page,this.formSpecs={host:t,baseID:n,quoteID:r,botType:""},!Jo(this.formSpecs,vt().mmStatus)){e.next=21;break}i=ar(t,n,r),c=this.specs=this.formSpecs,e.t0=!0,e.next=e.t0===Boolean(null==i?void 0:i.simpleArbConfig)?9:e.t0===Boolean(null==i?void 0:i.arbMarketMakingConfig)?11:13;break;case 9:return c.botType=Qn,e.abrupt("break",14);case 11:return c.botType=Kn,e.abrupt("break",14);case 13:c.botType=Xn;case 14:return c.cexName=null==i?void 0:i.cexName,e.next=17,this.fetchCEXBalances(this.formSpecs);case 17:return e.next=19,this.configureUI();case 19:return this.forms.close(),e.abrupt("return");case 21:$n(s.botTypeForm,n,r,t),We.empty(s.botTypeBaseSymbol,s.botTypeQuoteSymbol),l=[vt().assets[n],vt().assets[r]],u=l[0],d=l[1],s.botTypeBaseSymbol.appendChild(We.symbolize(u,!0)),s.botTypeQuoteSymbol.appendChild(We.symbolize(d,!0)),h=qo(this.botTypeSelectors);try{for(h.s();!(p=h.n()).done;)p.value.classList.remove("selected")}catch(e){h.e(e)}finally{h.f()}for(v=0,m=Object.values(this.formCexes);v<m.length;v++)m[v].div.classList.remove("selected");for(this.setCEXAvailability(n,r),We.hide(s.noCexesConfigured,s.noCexMarket,s.noCexMarketConfigureMore,s.botTypeErr),g=this.cexMarketSupportFilter(n,r),y={},x=0,b=Object.values(vt().mmStatus.cexes);x<b.length;x++)w=b[x],g(w.config.name)&&(y[w.config.name]=w.config);C=Object.keys(y).length,S=C>0,F=qo(this.botTypeSelectors);try{for(F.s();!(T=F.n()).done;)(D=T.value).classList.toggle("disabled",D.dataset.botType!==Xn&&!S)}catch(e){F.e(e)}finally{F.f()}0===Object.keys(vt().mmStatus.cexes).length?(We.show(s.noCexesConfigured),this.setBotTypeSelected(Xn)):(A=k.fetchLocal(Uo)||{},R=A["".concat(n,"_").concat(r,"_").concat(t)],(a=null!==(I=a)&&void 0!==I?I:R?R.botType:Kn)!==Xn&&(o&&(E=y[o]),!E&&R&&(E=y[null!==(B=R.cexName)&&void 0!==B?B:""]),E||(P=k.fetchLocal(_o))&&(E=y[P]),!E&&C>0&&(E=Object.values(y)[0])),E?(s.cexSelection.classList.remove("disabled"),this.setBotTypeSelected(null!==(L=a)&&void 0!==L?L:R?R.botType:Kn),this.selectFormCEX(E.name)):(s.cexSelection.classList.add("disabled"),We.show(s.noCexMarket),this.setBotTypeSelected(Xn),0===(O=Object.keys(Yn).filter((function(e){return!vt().mmStatus.cexes[e]}))).length||1===O.length&&("Binance"===O[0]||"BinanceUS"===O[0])||We.show(s.noCexMarketConfigureMore))),We.show(s.cexSelection),this.forms.show(s.botTypeForm);case 41:case"end":return e.stop()}}),e,this)}))),function(e,t,n,r,a){return C.apply(this,arguments)})},{key:"reshowBotTypeForm",value:function(){Jo(this.specs,vt().mmStatus)&&this.showMarketSelectForm();var e=this.specs,t=e.baseID,n=e.quoteID,r=e.host,a=e.cexName,o=e.botType;this.showBotTypeForm(r,t,n,o,a)}},{key:"setBotTypeSelected",value:function(e){var t,n=this.formSpecs,r=n.baseID,a=n.quoteID,o=n.host,s=this.botTypeSelectors,i=this.formCexes,c=qo(s);try{for(c.s();!(t=c.n()).done;){var l=t.value,u=l.classList,d=l.dataset.botType;u.toggle("selected",d===e)}}catch(e){c.e(e)}finally{c.f()}if(e!==Xn){var h=vt().mmStatus;if(0!==Object.keys(h.cexes).length){var p=this.cexMarketSupportFilter(r,a),f=Object.values(i).filter((function(e){return e.div.classList.contains("selected")}));if(!f.length||!p(f[0].name)){var v=(k.fetchLocal(Uo)||{})["".concat(r,"_").concat(a,"_").concat(o)];if(v){var m,g=h.cexes[null!==(m=v.cexName)&&void 0!==m?m:""];if(g&&p(g.config.name))return void this.selectFormCEX(g.config.name)}var y=k.fetchLocal(_o);if(y){var x=h.cexes[y];if(x&&p(x.config.name))return void this.selectFormCEX(x.config.name)}var b=Object.values(h.cexes).filter((function(e){return p(e.config.name)}));b.length&&this.selectFormCEX(b[0].config.name)}}}}},{key:"showMarketSelectForm",value:function(){this.page.marketFilterInput.value="",this.sortMarketRows(),this.forms.show(this.page.marketSelectForm)}},{key:"sortMarketRows",value:function(){var e,t=this.page,n=null===(e=t.marketFilterInput.value)||void 0===e?void 0:e.toLowerCase();We.empty(t.marketSelect);var r,a=qo(this.marketRows);try{for(a.s();!(r=a.n()).done;){var o=r.value;o.tr.classList.remove("selected"),n&&!o.name.includes(n)||t.marketSelect.appendChild(o.tr)}}catch(e){a.e(e)}finally{a.f()}}},{key:"handleBalanceNote",value:function(e){if(this.approveTokenForm.handleBalanceNote(e),this.marketReport){var t=this.marketStuff(),n=t.baseID,r=t.quoteID,a=t.quoteToken,o=t.baseToken;e.assetID===n||e.assetID===(null==o?void 0:o.parentID)?this.basePane.updateBalances():e.assetID!==r&&e.assetID!==(null==a?void 0:a.parentID)||this.quotePane.updateBalances()}}},{key:"autoRebalanceChanged",value:function(){var e,t,n=this.page;this.updatedConfig.cexRebalance=null!==(e=null===(t=n.cexRebalanceCheckbox)||void 0===t?void 0:t.checked)&&void 0!==e&&e,this.updateAllocations()}},{key:"submitBotType",value:(w=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=vt().loading(this.page.botTypeForm),e.prev=1,e.next=4,this.submitBotWithValidation();case 4:return e.prev=4,t(),e.finish(4);case 7:case"end":return e.stop()}}),e,this,[[1,,4,7]])}))),function(){return w.apply(this,arguments)})},{key:"submitBotWithValidation",value:(b=s(f().mark((function e(){var t,n,r,o,s,i,c,l,u,d,h,p,v,m,g;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,r=this.forms,o=this.formSpecs,s=o.baseID,i=o.quoteID,c=o.host,vt().walletMap[s]){e.next=5;break}return this.newWalletForm.setAsset(s),r.show(this.page.newWalletForm),e.abrupt("return");case 5:if(vt().walletMap[i]){e.next=9;break}return this.newWalletForm.setAsset(i),r.show(this.page.newWalletForm),e.abrupt("return");case 9:if(l=$o(c,vt().assets[s],vt().assets[i]),u=a(l,2),d=u[0],h=u[1],d!==ht.NotApproved){e.next=14;break}return this.approveTokenForm.setAsset(s,c),r.show(n.approveTokenForm),e.abrupt("return");case 14:if(h!==ht.NotApproved){e.next=18;break}return this.approveTokenForm.setAsset(i,c),r.show(n.approveTokenForm),e.abrupt("return");case 18:if(p=this.botTypeSelectors,!((v=p.filter((function(e){return e.classList.contains("selected")}))).length<1)){e.next=24;break}return n.botTypeErr.textContent=ke("NO_BOTTYPE"),We.show(n.botTypeErr),e.abrupt("return");case 24:if((this.formSpecs.botType=null!==(t=v[0].dataset.botType)&&void 0!==t?t:"")===Xn){e.next=35;break}if(!((m=Object.values(this.formCexes).filter((function(e){return e.div.classList.contains("selected")}))).length<1)){e.next=31;break}return n.botTypeErr.textContent=ke("NO_CEX"),We.show(n.botTypeErr),e.abrupt("return");case 31:return g=m[0].name,this.formSpecs.cexName=g,e.next=35,this.fetchCEXBalances(this.formSpecs);case 35:this.specs=this.formSpecs,this.configureUI(),this.forms.close();case 38:case"end":return e.stop()}}),e,this)}))),function(){return b.apply(this,arguments)})},{key:"fetchCEXBalances",value:(m=s(f().mark((function e(t){var n,r,a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,r=t.baseID,a=t.quoteID,o=t.cexName,t.botType!==Xn&&o){e.next=4;break}return e.abrupt("return");case 4:return e.prev=4,e.next=7,Jn.cexBalance(o,r);case 7:this.cexBaseBalance=e.sent,e.next=15;break;case 10:throw e.prev=10,e.t0=e.catch(4),n.botTypeErr.textContent=ke(ve,{cexName:o,assetID:String(r),err:String(e.t0)}),We.show(n.botTypeErr),e.t0;case 15:return e.prev=15,e.next=18,Jn.cexBalance(o,a);case 18:this.cexQuoteBalance=e.sent,e.next=26;break;case 21:throw e.prev=21,e.t1=e.catch(15),n.botTypeErr.textContent=ke(ve,{cexName:o,assetID:String(a),err:String(e.t1)}),We.show(n.botTypeErr),e.t1;case 26:case"end":return e.stop()}}),e,this,[[4,10],[15,21]])}))),function(e){return m.apply(this,arguments)})},{key:"defaultWalletOptions",value:function(e){var t=vt().currentWalletDefinition(e);if(!t.multifundingopts)return{};var n,r={},a=qo(t.multifundingopts);try{for(a.s();!(n=a.n()).done;){var o=n.value;o.quoteAssetOnly&&e!==this.specs.quoteID||(r[o.key]="".concat(o.default))}}catch(e){a.e(e)}finally{a.f()}return r}},{key:"updateModifiedMarkers",value:function(){if(!this.creatingNewBot){var e=this.page,t=this.originalConfig,n=this.updatedConfig,r=t.gapStrategy!==n.gapStrategy;e.gapStrategySelect.classList.toggle("modified",r);var a=t.profit!==n.profit;e.profitInput.classList.toggle("modified",a);var o=!1;if(t.buyPlacements.length!==n.buyPlacements.length)o=!0;else for(var s=0;s<t.buyPlacements.length;s++)if(t.buyPlacements[s].lots!==n.buyPlacements[s].lots||t.buyPlacements[s].gapFactor!==n.buyPlacements[s].gapFactor){o=!0;break}e.buyPlacementsTableWrapper.classList.toggle("modified",o);var i=!1;if(t.sellPlacements.length!==n.sellPlacements.length)i=!0;else for(var c=0;c<t.sellPlacements.length;c++)if(t.sellPlacements[c].lots!==n.sellPlacements[c].lots||t.sellPlacements[c].gapFactor!==n.sellPlacements[c].gapFactor){i=!0;break}e.sellPlacementsTableWrapper.classList.toggle("modified",i)}}},{key:"gapFactorHeaderUnit",value:function(e){switch(e){case _n:return["Multiplier","x"];case jn:case Hn:return["Rate","".concat(vt().assets[this.specs.quoteID].symbol,"/").concat(vt().assets[this.specs.baseID].symbol)];case zn:case Gn:return["Percent","%"];default:throw new Error("Unknown gap strategy ".concat(e))}}},{key:"checkGapFactorRange",value:function(e,t){switch(e){case _n:return t<1||t>100?"Multiplier must be between 1 and 100":null;case jn:case Hn:return t<=0?"Rate must be greater than 0":null;case zn:case Gn:return t<=0||t>10?"Percent must be between 0 and 10":null;default:throw new Error("Unknown gap factor ".concat(e))}}},{key:"convertGapFactor",value:function(e,t,n){switch(t){case _n:case jn:case Hn:return e;case zn:case Gn:return n?100*e:e/100;default:throw new Error("Unknown gap factor ".concat(t))}}},{key:"addPlacement",value:function(e,t,n){var r=this,a=this.page,o=this.updatedConfig,s=a.sellPlacementsTableBody,i=a.addSellPlacementRow,c=a.addSellPlacementLots,l=a.addSellPlacementGapFactor,u=a.sellPlacementsErr;e&&(s=a.buyPlacementsTableBody,i=a.addBuyPlacementRow,c=a.addBuyPlacementLots,l=a.addBuyPlacementGapFactor,u=a.buyPlacementsErr),We.hide(u);var d=function(){for(var e=0;e<s.children.length-1;e++){var t=We.parseTemplate(s.children[e]);We.setVis(0!==e,t.upBtn),We.setVis(e!==s.children.length-2,t.downBtn)}};We.hide(u);var h,p,f,v=function(e){u.textContent=e,We.show(u)};n||(n=this.specs.cexName?_n:o.gapStrategy);var m=e?o.buyPlacements:o.sellPlacements,g=this.gapFactorHeaderUnit(n)[1];if(t)h=t.lots,p=t.gapFactor,f=this.convertGapFactor(p,n,!0);else{if(h=parseInt(c.value||"0"),f=parseFloat(l.value||"0"),p=this.convertGapFactor(f,n,!1),0===h)return void v("Lots must be greater than 0");var y=this.checkGapFactorRange(n,f);if(y)return void v(y);if(m.find((function(e){return e.gapFactor===p})))return void v("Duplicate placement");m.push({lots:h,gapFactor:p})}var x=a.placementRowTmpl.cloneNode(!0),b=We.parseTemplate(x);b.priority.textContent="".concat(s.children.length),b.lots.textContent="".concat(h),b.gapFactor.textContent="".concat(f," ").concat(g),We.bind(b.removeBtn,"click",(function(){var e=m.findIndex((function(e){return e.lots===h&&e.gapFactor===p}));-1!==e&&(m.splice(e,1),x.remove(),d(),r.updateModifiedMarkers(),r.placementsChart.render(),r.updateAllocations())})),We.bind(b.upBtn,"click",(function(){var e=m.findIndex((function(e){return e.lots===h&&e.gapFactor===p}));if(0!==e){var t=m[e-1];m[e-1]=m[e],m[e]=t,b.priority.textContent="".concat(e),x.remove(),s.insertBefore(x,s.children[e-1]),We.parseTemplate(s.children[e]).priority.textContent="".concat(e+1),d(),r.updateModifiedMarkers()}})),We.bind(b.downBtn,"click",(function(){var e=m.findIndex((function(e){return e.lots===h&&e.gapFactor===p}));if(e!==m.length-1){var t=m[e+1];m[e+1]=m[e],m[e]=t,b.priority.textContent="".concat(e+2),x.remove(),s.insertBefore(x,s.children[e+1]),We.parseTemplate(s.children[e]).priority.textContent="".concat(e+1),d(),r.updateModifiedMarkers()}})),s.insertBefore(x,i),d()}},{key:"setArbMMLabels",value:function(){this.page.buyGapFactorHdr.textContent=ke(ce),this.page.sellGapFactorHdr.textContent=ke(ce)}},{key:"setGapFactorLabels",value:function(e){var t=this.page,n=this.gapFactorHeaderUnit(e)[0];switch(t.buyGapFactorHdr.textContent=n,t.sellGapFactorHdr.textContent=n,We.hide(t.percentPlusInfo,t.percentInfo,t.absolutePlusInfo,t.absoluteInfo,t.multiplierInfo),e){case"percent-plus":return We.show(t.percentPlusInfo);case"percent":return We.show(t.percentInfo);case"absolute-plus":return We.show(t.absolutePlusInfo);case"absolute":return We.show(t.absoluteInfo);case"multiplier":return We.show(t.multiplierInfo)}}},{key:"clearPlacements",value:function(e){for(var t=this.page,n=this.updatedConfig;t.buyPlacementsTableBody.children.length>1;)t.buyPlacementsTableBody.children[0].remove();for(;t.sellPlacementsTableBody.children.length>1;)t.sellPlacementsTableBody.children[0].remove();this.placementsCache[e]=[n.buyPlacements,n.sellPlacements],n.buyPlacements.splice(0,n.buyPlacements.length),n.sellPlacements.splice(0,n.sellPlacements.length)}},{key:"loadCachedPlacements",value:function(e){var t,n,a=this.placementsCache[e];if(a){var o=this.updatedConfig;o.buyPlacements.splice(0,o.buyPlacements.length),o.sellPlacements.splice(0,o.sellPlacements.length),(t=o.buyPlacements).push.apply(t,r(a[0])),(n=o.sellPlacements).push.apply(n,r(a[1]));var s,i=e===jo?_n:e,c=qo(o.buyPlacements);try{for(c.s();!(s=c.n()).done;){var l=s.value;this.addPlacement(!0,l,i)}}catch(e){c.e(e)}finally{c.f()}var u,d=qo(o.sellPlacements);try{for(d.s();!(u=d.n()).done;){var h=u.value;this.addPlacement(!1,h,i)}}catch(e){d.e(e)}finally{d.f()}}}},{key:"setOriginalValues",value:function(){var e,t,n,r=this,o=this.page,s=this.originalConfig,i=this.updatedConfig,l=this.specs,u=l.cexName,d=l.botType;this.clearPlacements(u?jo:i.gapStrategy),function(e,t){for(var n=0,r=Object.entries(t);n<r.length;n++){var o=a(r[n],2),s=o[0],i=o[1];if(Array.isArray(i)){e[s].splice(0,e[s].length);var l,u=qo(i);try{for(u.s();!(l=u.n()).done;){var d=l.value;e[s].push(d)}}catch(e){u.e(e)}finally{u.f()}}else"object"===c(i)?Object.assign(e[s],i):e[s]=t[s]}}(i,JSON.parse(JSON.stringify(s)));var h=null!==(e=i.driftTolerance)&&void 0!==e?e:.002;this.driftTolerance.setValue(100*h),this.driftToleranceSlider.setValue(h/.02);var p=null!==(t=i.orderPersistence)&&void 0!==t?t:20;this.orderPersistence.setValue(p),this.orderPersistenceSlider.setValue(p/40);var f=null!==(n=i.profit)&&void 0!==n?n:.01;o.profitInput.value=String(100*f),this.qcProfit.setValue(100*f),this.qcProfitSlider.setValue((f-Ho)/zo),u&&(o.cexRebalanceCheckbox.checked=i.cexRebalance,this.autoRebalanceChanged()),o.gapStrategySelect.options&&(Array.from(o.gapStrategySelect.options).forEach((function(e){e.selected=e.value===i.gapStrategy})),this.setGapFactorLabels(i.gapStrategy),d===Xn?(We.show(o.gapStrategyBox),We.hide(o.profitSelectorBox,o.orderPersistenceBox),this.setGapFactorLabels(o.gapStrategySelect.value||"")):u&&vt().mmStatus.cexes[u]&&(We.hide(o.gapStrategyBox),We.show(o.profitSelectorBox,o.orderPersistenceBox),this.setArbMMLabels()),s.buyPlacements.forEach((function(e){r.addPlacement(!0,e)})),s.sellPlacements.forEach((function(e){r.addPlacement(!1,e)})),this.basePane.setupWalletSettings(),this.quotePane.setupWalletSettings(),this.updateModifiedMarkers(),We.isDisplayed(o.quickConfig)&&this.switchToQuickConfig())}},{key:"validateFields",value:function(e){var t=!0,n=this.page,r=this.specs.botType,a=this.updatedConfig,o=a.sellPlacements,s=a.buyPlacements,i=a.profit,c=function(n,r){t=!1,e&&(n.textContent=ke(r),We.show(n))};return e&&We.hide(n.buyPlacementsErr,n.sellPlacementsErr,n.profitInputErr),r!==Qn&&s.length+o.length===0&&(c(n.buyPlacementsErr,le),c(n.sellPlacementsErr,le)),r!==Xn&&(isNaN(i)?c(n.profitInputErr,ue):0===i&&c(n.profitInputErr,de)),t}},{key:"saveSettings",value:(p=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.validateFields(!0)){e.next=2;break}return e.abrupt("return");case 2:t=this.marketStuff(),n=t.cfg,r=t.baseID,a=t.quoteID,o=t.host,s=t.botType,i=t.cexName,c={host:o,baseID:r,quoteID:a,cexName:null!=i?i:"",uiConfig:{simpleArbLots:n.simpleArbLots,baseConfig:n.baseConfig,quoteConfig:n.quoteConfig,cexRebalance:n.cexRebalance},baseWalletOptions:n.baseOptions,quoteWalletOptions:n.quoteOptions},e.t0=s,e.next=e.t0===Xn?7:e.t0===Kn?9:e.t0===Qn?11:12;break;case 7:return c.basicMarketMakingConfig=this.basicMMConfig(),e.abrupt("break",12);case 9:return c.arbMarketMakingConfig=this.arbMMConfig(),e.abrupt("break",12);case 11:c.simpleArbConfig=this.basicArbConfig();case 12:return vt().log("mm","saving bot config",c),e.next=15,Jn.updateBotConfig(c);case 15:return e.next=17,vt().fetchMMStatus();case 17:this.originalConfig=JSON.parse(JSON.stringify(n)),this.updateModifiedMarkers(),(l=k.fetchLocal(Uo)||{})["".concat(r,"_").concat(a,"_").concat(o)]=this.specs,k.storeLocal(Uo,l),i&&k.storeLocal(_o,i),vt().loadPage("mm");case 24:case"end":return e.stop()}}),e,this)}))),function(){return p.apply(this,arguments)})},{key:"delete",value:(u=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.specs,r=n.host,a=n.baseID,o=n.quoteID,We.hide(t.deleteErr),s=vt().loading(t.botSettingsContainer),e.next=5,Jn.removeBotConfig(r,a,o);case 5:if(i=e.sent,s(),vt().checkResponse(i)){e.next=11;break}return t.deleteErr.textContent=ke(H,{msg:i.msg}),We.show(t.deleteErr),e.abrupt("return");case 11:return e.next=13,vt().fetchMMStatus();case 13:vt().loadPage("mm");case 14:case"end":return e.stop()}}),e,this)}))),function(){return u.apply(this,arguments)})},{key:"arbMMConfig",value:function(){var e,t=this.updatedConfig,n={buyPlacements:[],sellPlacements:[],profit:t.profit,driftTolerance:t.driftTolerance,orderPersistence:t.orderPersistence},r=qo(t.buyPlacements);try{for(r.s();!(e=r.n()).done;){var a=e.value;n.buyPlacements.push({lots:a.lots,multiplier:a.gapFactor})}}catch(e){r.e(e)}finally{r.f()}var o,s=qo(t.sellPlacements);try{for(s.s();!(o=s.n()).done;){var i=o.value;n.sellPlacements.push({lots:i.lots,multiplier:i.gapFactor})}}catch(e){s.e(e)}finally{s.f()}return n}},{key:"basicArbConfig",value:function(){var e=this.updatedConfig;return{profitTrigger:e.profit,maxActiveArbs:100,numEpochsLeaveOpen:e.orderPersistence}}},{key:"basicMMConfig",value:function(){var e=this.updatedConfig;return{gapStrategy:e.gapStrategy,sellPlacements:e.sellPlacements,buyPlacements:e.buyPlacements,driftTolerance:e.driftTolerance}}},{key:"fetchMarketReport",value:(l=s(f().mark((function e(){var t,n,r,a,o,s,i,c,l,u,d,h,p;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.specs,r=n.host,a=n.baseID,o=n.quoteID,e.next=3,Jn.report(r,a,o);case 3:if(s=e.sent,We.hide(t.oraclesLoading,t.oraclesTable,t.noOracles),vt().checkResponse(s)){e.next=9;break}return t.oraclesErrMsg.textContent=s.msg,We.show(t.oraclesErr),e.abrupt("return");case 9:if((i=this.marketReport=s.report).oracles&&0!==i.oracles.length){We.hide(t.noOracles),We.empty(t.oracles),l=qo(null!==(c=i.oracles)&&void 0!==c?c:[]);try{for(l.s();!(u=l.n()).done;)d=u.value,h=t.oracleTmpl.cloneNode(!0),t.oracles.appendChild(h),(p=We.parseTemplate(h)).logo.src="img/"+d.host+".png",p.host.textContent=Zo[d.host],p.volume.textContent=We.formatFourSigFigs(d.usdVol),p.price.textContent=We.formatFourSigFigs((d.bestBuy+d.bestSell)/2)}catch(e){l.e(e)}finally{l.f()}t.avgPrice.textContent=i.price?We.formatFourSigFigs(i.price):"0",We.show(t.oraclesTable)}else We.show(t.noOracles);i.baseFiatRate>0?t.baseFiatRate.textContent=We.formatFourSigFigs(i.baseFiatRate):t.baseFiatRate.textContent="N/A",i.quoteFiatRate>0?t.quoteFiatRate.textContent=We.formatFourSigFigs(i.quoteFiatRate):t.quoteFiatRate.textContent="N/A",We.show(t.fiatRates);case 14:case"end":return e.stop()}}),e,this)}))),function(){return l.apply(this,arguments)})},{key:"cexConfigured",value:(o=s(f().mark((function e(t){var n,r,a,o,s,i,c,l,u,d,h,p,v,m;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=this.page,r=this.formSpecs,a=r.host,o=r.baseID,s=r.quoteID,i=Yn[t],c=qo(this.marketRows),e.prev=3,c.s();case 5:if((l=c.n()).done){e.next=13;break}if(u=l.value,d=u.baseID,h=u.quoteID,p=u.tmpl,-1===(v=u.arbs).indexOf(t)){e.next=9;break}return e.abrupt("continue",11);case 9:this.cexMarketSupportFilter(d,h)(t)&&((m=n.arbBttnTmpl.cloneNode(!0)).src=i.logo,p.arbs.appendChild(m),v.push(t));case 11:e.next=5;break;case 13:e.next=18;break;case 15:e.prev=15,e.t0=e.catch(3),c.e(e.t0);case 18:return e.prev=18,c.f(),e.finish(18);case 21:this.setCEXAvailability(o,s,t),this.showBotTypeForm(a,o,s,Kn,t);case 23:case"end":return e.stop()}}),e,this,[[3,15,18,21]])}))),function(e){return o.apply(this,arguments)})},{key:"setupCEXes",value:function(){this.formCexes={};for(var e=0,t=Object.keys(Yn);e<t.length;e++){var n=t[e];this.addCEX(n)}}},{key:"setCEXAvailability",value:function(e,t,n){for(var r=this.cexMarketSupportFilter(e,t),a=0,o=Object.values(this.formCexes);a<o.length;a++){var s=o[a],i=s.name,c=s.div,l=s.tmpl,u=r(i),d=vt().mmStatus.cexes[i];We.hide(l.unavailable,l.needsconfig,l.disconnected),We.setVis(Boolean(d),l.reconfig),l.logo.classList.remove("greyscal"),c.classList.toggle("configured",Boolean(d)&&!d.connectErr),d?d.connectErr?We.show(l.disconnected):u?i===n&&this.selectFormCEX(i):(We.show(l.unavailable),l.logo.classList.add("greyscal")):We.show(l.needsconfig)}}},{key:"selectFormCEX",value:function(e){for(var t=0,n=Object.values(this.formCexes);t<n.length;t++){var r=n[t],a=r.name;r.div.classList.toggle("selected",a===e)}}},{key:"addCEX",value:function(e){var t=this,n=Yn[e],r=this.page.cexOptTmpl.cloneNode(!0),a=We.parseTemplate(r);a.name.textContent=n.name,a.logo.src=n.logo,this.page.cexSelection.appendChild(r),this.formCexes[e]={name:e,div:r,tmpl:a},We.bind(r,"click",(function(){var n=vt().mmStatus.cexes[e];if(n&&!n.connectErr)if(t.formCexes[e].div.classList.contains("selected")){for(var r=0,a=Object.values(t.formCexes);r<a.length;r++)a[r].div.classList.remove("selected");var o=t.formSpecs,s=o.baseID,i=o.quoteID;t.setCEXAvailability(s,i)}else for(var c=0,l=Object.values(t.formCexes);c<l.length;c++){var u=l[c];u.div.classList.toggle("selected",u.name===e)}else t.showCEXConfigForm(e)})),We.bind(a.reconfig,"click",(function(n){n.stopPropagation(),t.showCEXConfigForm(e)}))}},{key:"showCEXConfigForm",value:function(e){var t=this.page;this.cexConfigForm.setCEX(e),this.forms.show(t.cexConfigForm)}},{key:"cexMarketSupportFilter",value:function(e,t){for(var n={},r=0,o=Object.entries(vt().mmStatus.cexes);r<o.length;r++)for(var s=a(o[r],2),i=s[0],c=s[1],l=0,u=Object.values(null!==(d=c.markets)&&void 0!==d?d:[]);l<u.length;l++){var d,h=u[l],p=h.baseID,f=h.quoteID;if(p===e&&f===t){n[i]=!0;break}}return function(e){return Boolean(n[e])}}}]),D}(ut);function Jo(e,t){var n=t.bots.find((function(t){var n=t.config;return n.host===e.host&&n.baseID===e.baseID&&n.quoteID===e.quoteID}));return Boolean(null==n?void 0:n.running)}var Zo={"binance.com":"Binance","coinbase.com":"Coinbase","bittrex.com":"Bittrex","hitbtc.com":"HitBTC","exmo.com":"EXMO"};function $o(e,t,n){var r=ht.Approved,a=ht.Approved;if(null!=t&&t.token){var o,s=vt().assets[t.id],i=vt().exchanges[e].assets[t.id].version;null!=s&&null!==(o=s.wallet)&&void 0!==o&&o.approved&&void 0!==s.wallet.approved[i]&&(r=s.wallet.approved[i])}if(null!=n&&n.token){var c,l=vt().assets[n.id],u=vt().exchanges[e].assets[n.id].version;null!=l&&null!==(c=l.wallet)&&void 0!==c&&c.approved&&void 0!==l.wallet.approved[u]&&(a=l.wallet.approved[u])}return[r,a]}var es=function(){function e(t,n){var r=this;i(this,e),h(this,"pg",void 0),h(this,"div",void 0),h(this,"page",void 0),h(this,"assetID",void 0),h(this,"ui",void 0),h(this,"walletConfig",void 0),h(this,"feeAssetID",void 0),h(this,"feeUI",void 0),h(this,"isQuote",void 0),h(this,"isToken",void 0),h(this,"lotSize",void 0),h(this,"lotSizeConv",void 0),h(this,"cfg",void 0),h(this,"inv",void 0),h(this,"nSwapFees",void 0),h(this,"nSwapFeesSlider",void 0),h(this,"orderReserves",void 0),h(this,"orderReservesSlider",void 0),h(this,"slippageBuffer",void 0),h(this,"slippageBufferSlider",void 0),h(this,"minTransfer",void 0),h(this,"minTransferSlider",void 0),this.pg=t,this.div=n;var o=this.page=We.parseTemplate(n);this.nSwapFees=new Ze(o.nSwapFees,{prec:0,inc:10,changed:function(e){r.cfg.swapFeeN=e,r.nSwapFeesSlider.setValue((e-0)/1e3),r.pg.updateAllocations()}}),this.nSwapFeesSlider=new $e(o.nSwapFeesSlider,(function(e){var t=a(et(0+1e3*e,0),1)[0];r.cfg.swapFeeN=t,r.nSwapFees.setValue(t),r.pg.updateAllocations()})),this.orderReserves=new Je(o.orderReservesFactor,{prec:3,min:0,changed:function(e){r.cfg.orderReservesFactor=e,r.orderReservesSlider.setValue((e-0)/3),r.pg.updateAllocations()}}),this.orderReservesSlider=new $e(o.orderReservesSlider,(function(e){var t=a(et(0+3*e,3),1)[0];r.orderReserves.setValue(t),r.cfg.orderReservesFactor=t,r.pg.updateAllocations()})),this.slippageBuffer=new Je(o.slippageBufferFactor,{prec:3,min:0,changed:function(e){r.cfg.slippageBufferFactor=e,r.slippageBufferSlider.setValue((e-0)/.3),r.pg.updateAllocations()}}),this.slippageBufferSlider=new $e(o.slippageBufferSlider,(function(e){var t=a(et(0+.3*e,3),1)[0];r.slippageBuffer.setValue(0+.3*e),r.cfg.slippageBufferFactor=t,r.pg.updateAllocations()})),this.minTransfer=new Je(o.minTransfer,{sigFigs:!0,min:0,changed:function(e){var t=r.cfg,n=r.commit(),a=[r.minTransfer.min,Math.max(2*r.minTransfer.min,n)],o=a[0],s=a[1];t.transferFactor=(e-o)/(s-o),r.minTransferSlider.setValue(t.transferFactor)}}),this.minTransferSlider=new $e(o.minTransferSlider,(function(e){var t=r.cfg,n=r.commit(),a=[r.minTransfer.min,Math.max(r.minTransfer.min,n)],o=a[0],s=a[1];t.transferFactor=e,r.minTransfer.setValue(o+e*(s-o))})),We.bind(o.showBalance,"click",(function(){t.showAddress(r.assetID)}))}return d(e,[{key:"setLotSize",value:function(e){var t=this.ui;this.lotSize=e,this.lotSizeConv=e/t.conventional.conversionFactor}},{key:"setAsset",value:function(e,t){var n;this.assetID=e,this.isQuote=t;var r=this.cfg=t?this.pg.updatedConfig.quoteConfig:this.pg.updatedConfig.baseConfig,o=this.page,s=this.div,i=this.pg,c=i.specs,l=c.botType,u=c.baseID,d=c.cexName,h=i.mktID,p=i.updatedConfig,f=p.baseOptions,v=p.quoteOptions,m=vt().assets[e],g=m.symbol,y=m.name,x=m.token,b=m.unitInfo;this.ui=b,this.walletConfig=e===u?f:v;var k=b.conventional.unit;this.feeAssetID=x?x.parentID:e;var w=vt().assets[this.feeAssetID],C=w.unitInfo,S=w.name,F=w.symbol;this.feeUI=C,this.inv={book:0,bookingFees:0,swapFeeReserves:0,cex:0,orderReserves:0,slippageBuffer:0},this.isToken=Boolean(x),We.setVis(this.isToken,o.feeTotalBox,o.feeReservesBox,o.feeBalances),We.setVis(t,o.slippageBufferBox),We.setSrc(s,"[data-logo]",We.logoPath(g)),We.setText(s,"[data-name]",y),We.setText(s,"[data-ticker]",k);var T=C.conventional.unit;if(We.setText(s,"[data-fee-ticker]",T),We.setText(s,"[data-fee-name]",S),We.setSrc(s,"[data-fee-logo]",We.logoPath(F)),We.setVis(l!==Xn,o.cexMinInvBox),We.setVis(l!==Qn,o.orderReservesBox),this.nSwapFees.setValue(null!==(n=r.swapFeeN)&&void 0!==n?n:50),this.nSwapFeesSlider.setValue(r.swapFeeN/1e3),l!==Qn){var D,I=a(et(null!==(D=r.orderReservesFactor)&&void 0!==D?D:1,3),1)[0];this.orderReserves.setValue(I),this.orderReservesSlider.setValue((I-0)/3)}if(l!==Xn){this.minTransfer.prec=Math.log10(b.conventional.conversionFactor);var A=vt().mmStatus.cexes[d].markets[h];this.minTransfer.min=(t?A.quoteMinWithdraw:A.baseMinWithdraw)/b.conventional.conversionFactor}this.slippageBuffer.setValue(r.slippageBufferFactor);this.slippageBufferSlider.setValue((r.slippageBufferFactor-0)/.3),this.setupWalletSettings(),this.updateBalances()}},{key:"commit",value:function(){var e=this.inv,t=this.isToken,n=e.book+e.cex+e.orderReserves+e.slippageBuffer;return t||(n+=e.bookingFees+e.swapFeeReserves),n}},{key:"updateInventory",value:function(e,t,n,r,a,o){this.setLotSize(n);var s=this.page,i=this.cfg,c=this.lotSizeConv,l=this.inv,u=this.ui,d=this.feeUI,h=this.isToken,p=this.isQuote,f=this.pg.specs,v=f.cexName,m=f.botType;s.bookLots.textContent=String(e),s.bookLotSize.textContent=We.formatFourSigFigs(c),l.book=e*c,s.bookCommitment.textContent=We.formatFourSigFigs(l.book);var g=o.bookingFeesPerLot/d.conventional.conversionFactor;if(s.bookingFeesPerLot.textContent=We.formatFourSigFigs(g),s.swapReservesFactor.textContent=o.swapReservesFactor.toFixed(2),s.bookingFeesLots.textContent=String(e),l.bookingFees=o.bookingFees/d.conventional.conversionFactor,s.bookingFees.textContent=We.formatFourSigFigs(l.bookingFees),v&&(l.cex=a/u.conventional.conversionFactor,s.cexMinInv.textContent=We.formatFourSigFigs(l.cex)),m!==Qn){var y=Math.max(a,r)/u.conventional.conversionFactor;s.orderReservesBasis.textContent=We.formatFourSigFigs(y);var x=y*i.orderReservesFactor;l.orderReserves=x,s.orderReserves.textContent=We.formatFourSigFigs(x)}if(h){var b=o.tokenFeesPerSwap/d.conventional.conversionFactor;s.feeReservesPerSwap.textContent=We.formatFourSigFigs(b),l.swapFeeReserves=b*i.swapFeeN,s.feeReserves.textContent=We.formatFourSigFigs(l.swapFeeReserves)}if(p){var k=l.book+l.cex+l.orderReserves;s.slippageBufferBasis.textContent=We.formatCoinValue(k*u.conventional.conversionFactor,u),l.slippageBuffer=k*i.slippageBufferFactor,s.slippageBuffer.textContent=We.formatCoinValue(l.slippageBuffer*u.conventional.conversionFactor,u)}if(We.setVis(o.bookingFeesPerCounterLot>0,s.redemptionFeesBox),o.bookingFeesPerCounterLot>0){var w=o.bookingFeesPerCounterLot/d.conventional.conversionFactor;s.redemptionFeesPerLot.textContent=We.formatFourSigFigs(w),s.redemptionFeesLots.textContent=String(t),s.redeemReservesFactor.textContent=o.redeemReservesFactor.toFixed(2)}this.updateCommitTotal(),this.updateTokenFees(),this.updateRebalance()}},{key:"updateCommitTotal",value:function(){var e=this.page,t=this.assetID,n=this.ui,r=this.commit();e.commitTotal.textContent=We.formatCoinValue(Math.round(r*n.conventional.conversionFactor),n),e.commitTotalFiat.textContent=We.formatFourSigFigs(r*vt().fiatRatesMap[t])}},{key:"updateTokenFees",value:function(){var e=this.page,t=this.inv,n=this.feeAssetID,r=this.feeUI;if(this.isToken){var a=t.bookingFees+t.swapFeeReserves;e.feeTotal.textContent=We.formatCoinValue(a*r.conventional.conversionFactor,r),e.feeTotalFiat.textContent=We.formatFourSigFigs(a*vt().fiatRatesMap[n])}}},{key:"updateRebalance",value:function(){var e=this.page,t=this.cfg,n=this.pg,r=n.updatedConfig.cexRebalance,a=n.specs.cexName&&r;if(We.setVis(a,e.rebalanceOpts),a){var o=this.commit(),s=[this.minTransfer.min,Math.max(2*this.minTransfer.min,o)],i=s[0],c=s[1]-i;this.minTransfer.setValue(i+t.transferFactor*c),this.minTransferSlider.setValue((t.transferFactor-0)/1)}}},{key:"setupWalletSettings",value:function(){var e=this,t=this.page,n=this.assetID,r=this.walletConfig,o=vt().currentWalletDefinition(n);if(We.empty(t.walletSettings),We.setVis(!o.multifundingopts,t.walletSettingsNone),o.multifundingopts){var s={},i={},c=function(n){if(!n.quoteAssetOnly||e.isQuote){var o,c,l,u,d=r[n.key];if(n.isboolean){o=t.boolSettingTmpl.cloneNode(!0);var h=We.parseTemplate(o);h.name.textContent=n.displayname,h.input.checked="true"===d,We.bind(h.input,"change",(function(){r[n.key]=h.input.checked?"true":"false",function(e,t){var n=i[e];if(n){var r,a=qo(n);try{for(a.s();!(r=a.n()).done;){var o=r.value;We.setVis(t,s[o])}}catch(e){a.e(e)}finally{a.f()}}}(n.key,Boolean(h.input.checked))})),n.description&&(h.tooltip.dataset.tooltip=n.description)}else if(n.xyRange){var p=n.xyRange,f=p.start,v=p.end,m=p.xUnit,g=v.x-f.x;o=t.rangeSettingTmpl.cloneNode(!0);var y=We.parseTemplate(o);y.name.textContent=n.displayname,n.description&&(y.tooltip.dataset.tooltip=n.description),m?y.unit.textContent=m:We.hide(y.unit);var x=new Je(y.value,{prec:1,changed:function(e){var t=a(tt(e,1),2),o=t[0],s=t[1];r[n.key]=s,b.setValue((o-f.x)/g)}}),b=new $e(y.slider,(function(e){var t=a(tt(f.x+e*g,1),2),o=t[0],s=t[1];r[n.key]=s,x.setValue(o)})),k=a(tt(nt(d,f.x),3),2),w=k[0],C=k[1];r[n.key]=C,b.setValue((w-f.x)/g),x.setValue(w),y.value.textContent=C}if(!o)return console.error("don't know how to handle opt",n);if(t.walletSettings.appendChild(o),n.dependsOn){c=n.key,l=o,u=n.dependsOn,i[u]||(i[u]=[]),i[u].push(c),s[c]=l;var S=r[n.dependsOn];We.setVis("true"===S,o)}}};if(o.multifundingopts&&o.multifundingopts.length>0){var l,u=qo(o.multifundingopts);try{for(u.s();!(l=u.n()).done;)c(l.value)}catch(e){u.e(e)}finally{u.f()}}vt().bindTooltips(t.walletSettings)}}},{key:"updateBalances",value:function(){var e=this.page,t=this.assetID,n=this.ui,r=this.feeAssetID,a=this.feeUI,o=this.pg,s=o.specs,i=s.cexName,c=s.baseID,l=o.cexBaseBalance,u=o.cexQuoteBalance,d=vt().walletMap[t].balance.available,h=this.pg.runningBotInventory(t),p=d-h.dex.total,f=0;if(We.setVis(i,e.balanceBreakdown),i&&(e.dexAvail.textContent=We.formatFourSigFigs(p/n.conventional.conversionFactor),f=(t===c?l:u).available-h.cex.total,e.cexAvail.textContent=We.formatFourSigFigs(f/n.conventional.conversionFactor)),e.avail.textContent=We.formatFourSigFigs((p+f)/n.conventional.conversionFactor),t!==r){var v=vt().walletMap[r].balance.available;e.feeAvail.textContent=We.formatFourSigFigs(v/a.conventional.conversionFactor)}}}]),e}();function ts(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(ts=function(){return!!e})()}var ns=function(e){g(I,e);var t,n,r,a,o,c,l,u,p,m,b,k,w,C,F,T,D=(t=I,n=ts(),function(){var e,r=x(t);if(n){var a=x(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function I(e){var t;i(this,I),h(v(t=D.call(this)),"body",void 0),h(v(t),"forms",void 0),h(v(t),"currentForm",void 0),h(v(t),"page",void 0),h(v(t),"host",void 0),h(v(t),"accountDisabled",void 0),h(v(t),"keyup",void 0),h(v(t),"dexAddrForm",void 0),h(v(t),"bondFeeBufferCache",void 0),h(v(t),"newWalletForm",void 0),h(v(t),"regAssetForm",void 0),h(v(t),"walletWaitForm",void 0),h(v(t),"confirmRegisterForm",void 0),h(v(t),"reputationMeter",void 0),h(v(t),"animation",void 0),h(v(t),"renewToggle",void 0),t.body=e;var n=t.host=e.dataset.host?e.dataset.host:"",r=vt().exchanges[n],a=t.page=We.idDescendants(e);t.forms=We.applySelector(a.forms,":scope > form"),t.confirmRegisterForm=new br(a.confirmRegForm,s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.showSuccess(ke(se)),t.renewToggle.setState(t.confirmRegisterForm.tier>0),e.next=4,vt().fetchUser();case 4:vt().updateMenuItemsDisplay();case 5:case"end":return e.stop()}}),e)}))),(function(){t.runAnimation(t.regAssetForm,a.regAssetForm)})),t.confirmRegisterForm.setExchange(r,""),t.walletWaitForm=new wr(a.walletWait,(function(){t.runAnimation(t.confirmRegisterForm,a.confirmRegForm)}),(function(){t.runAnimation(t.regAssetForm,a.regAssetForm)})),t.walletWaitForm.setExchange(r),t.newWalletForm=new gr(a.newWalletForm,(function(e){return t.newWalletCreated(e,t.confirmRegisterForm.tier)}),(function(){return t.runAnimation(t.regAssetForm,a.regAssetForm)})),t.regAssetForm=new kr(a.regAssetForm,function(){var e=s(f().mark((function e(n,r){var o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n!==ft){e.next=6;break}return e.next=3,vt().fetchUser();case 3:return t.updateReputation(),t.showSuccess(ke(se)),e.abrupt("return");case 6:if(o=vt().assets[n],!(s=o.wallet)){e.next=17;break}return i=vt().loading(a.regAssetForm),e.next=12,t.getBondsFeeBuffer(n,a.regAssetForm);case 12:return c=e.sent,t.confirmRegisterForm.setAsset(n,r,c),i(),t.progressTierFormsWithWallet(n,s),e.abrupt("return");case 17:t.confirmRegisterForm.setAsset(n,r,0),t.newWalletForm.setAsset(n),t.showForm(a.newWalletForm);case 20:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()),t.regAssetForm.setExchange(r,""),t.reputationMeter=new pn(a.repMeter),t.reputationMeter.setHost(n),We.bind(a.exportDexBtn,"click",(function(){return t.exportAccount()})),t.accountDisabled="true"===e.dataset.disabled,We.bind(a.toggleAccountStatusBtn,"click",(function(){t.accountDisabled?t.toggleAccountStatus(!1):t.prepareAccountDisable(a.disableAccountForm)})),We.bind(a.updateCertBtn,"click",(function(){return a.certFileInput.click()})),We.bind(a.updateHostBtn,"click",(function(){return t.prepareUpdateHost()})),We.bind(a.certFileInput,"change",(function(){return t.onCertFileChange()})),We.bind(a.goBackToSettings,"click",(function(){return vt().loadPage("settings")}));var o=function(){t.regAssetForm.setExchange(vt().exchanges[n],""),t.showForm(a.regAssetForm)};We.bind(a.changeTier,"click",(function(){o()}));var c=r.auth.targetTier>0;return t.renewToggle=new je(a.toggleAutoRenew,a.renewErr,c,function(){var e=s(f().mark((function e(n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!t.accountDisabled){e.next=2;break}return e.abrupt("return");case 2:if(!n){e.next=6;break}o(),e.next=7;break;case 6:return e.abrupt("return",t.disableAutoRenew());case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),We.bind(a.autoRenewBox,"click",(function(e){e.stopPropagation(),t.accountDisabled||a.toggleAutoRenew.click()})),a.penaltyCompInput.value=String(r.auth.penaltyComps),We.bind(a.penaltyCompBox,"click",(function(e){e.stopPropagation();var n=vt().exchanges[t.host];a.penaltyCompInput.value=String(n.auth.penaltyComps),a.penaltyCompInput.focus()})),We.bind(a.penaltyCompInput,"keyup",function(){var e=s(f().mark((function e(n){var r,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(We.hide(a.penaltyCompsErr),"Escape"!==n.key){e.next=3;break}return e.abrupt("return");case 3:if("Enter"===n.key){e.next=5;break}return e.abrupt("return");case 5:if(r=parseInt(a.penaltyCompInput.value||""),!isNaN(r)){e.next=10;break}return We.show(a.penaltyCompsErr),a.penaltyCompsErr.textContent=ke("INVALID_COMPS_VALUE"),e.abrupt("return");case 10:return o=vt().loading(a.otherBondSettings),e.prev=11,e.next=14,t.updateBondOptions({penaltyComps:r});case 14:o(),e.next=22;break;case 17:e.prev=17,e.t0=e.catch(11),o(),We.show(a.penaltyCompsErr),a.penaltyCompsErr.textContent=ke(H,{msg:e.t0.msg});case 22:case"end":return e.stop()}}),e,null,[[11,17]])})));return function(t){return e.apply(this,arguments)}}()),t.dexAddrForm=new Sr(a.dexAddrForm,function(){var e=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:vt().loadPage("/dexsettings/".concat(t.host));case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),t.host),Mr(a.disableAccountForm,a.disableAccountConfirm,(function(){return t.toggleAccountStatus(!0)})),We.bind(a.forms,"mousedown",(function(e){We.mouseInElement(e,t.currentForm)||t.closePopups()})),t.keyup=function(e){"Escape"===e.key&&t.closePopups()},We.bind(document,"keyup",t.keyup),We.applySelector(a.forms,".form-closer").forEach((function(e){We.bind(e,"click",(function(){t.closePopups()}))})),vt().registerNoteFeeder({conn:function(){t.setConnectionStatus()},reputation:function(){t.updateReputation()},feepayment:function(){t.updateReputation()},bondpost:function(){t.updateReputation()}}),t.setConnectionStatus(),t.updateReputation(),t}return d(I,[{key:"unload",value:function(){We.unbind(document,"keyup",this.keyup)}},{key:"progressTierFormsWithWallet",value:(T=s(f().mark((function e(t,n){var r,a,o,s,i,c,l;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=this.page,a=this.confirmRegisterForm.fees,o=vt().assets[t],s=this.regAssetForm.xc.bondAssets,i=s[o.symbol],n.open){e.next=12;break}return c=vt().loading(r.forms),e.next=8,S("/api/openwallet",{assetID:t});case 8:return l=e.sent,c(),vt().checkResponse(l)||(this.regAssetForm.setAssetError("error unlocking wallet: ".concat(l.msg)),this.runAnimation(this.regAssetForm,r.regAssetForm)),e.abrupt("return");case 12:if(!(n.synced&&n.balance.available>=2*i.amount+a)){e.next=15;break}return this.progressTierFormWithSyncedFundedWallet(t),e.abrupt("return");case 15:this.walletWaitForm.setWallet(t,a,this.confirmRegisterForm.tier),this.showForm(r.walletWait);case 17:case"end":return e.stop()}}),e,this)}))),function(e,t){return T.apply(this,arguments)})},{key:"progressTierFormWithSyncedFundedWallet",value:(F=s(f().mark((function e(t){var n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=vt().exchanges[this.host],r=this.confirmRegisterForm.tier,a=this.page,o=n.auth.liveStrength+n.auth.pendingStrength-n.auth.weakStrength,!(r>n.auth.targetTier&&r>o)){e.next=7;break}return this.runAnimation(this.confirmRegisterForm,a.confirmRegForm),e.abrupt("return");case 7:return s=vt().loading(this.body),e.prev=8,e.next=11,this.updateBondOptions({bondAssetID:t,targetTier:r});case 11:s(),e.next=19;break;case 14:return e.prev=14,e.t0=e.catch(8),s(),this.regAssetForm.setTierError(e.t0.msg),e.abrupt("return");case 19:this.showSuccess(ke(se));case 20:case"end":return e.stop()}}),e,this,[[8,14]])}))),function(e){return F.apply(this,arguments)})},{key:"updateReputation",value:function(){var e=this.page,t=vt().exchanges[this.host].auth,n=t.rep.penalties,r=t.targetTier,a=t.expiredBonds,o=fn(t);e.targetTier.textContent=String(r),e.effectiveTier.textContent=String(o),e.penalties.textContent=String(n),e.bondsPendingRefund.textContent="".concat((null==a?void 0:a.length)||0),this.reputationMeter.update()}},{key:"showForm",value:(C=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,this.currentForm=t,this.forms.forEach((function(e){return We.hide(e)})),t.style.right="10000px",We.show(n.forms,t),r=(n.forms.offsetWidth+t.offsetWidth)/2,e.next=8,We.animate(300,(function(e){t.style.right="".concat((1-e)*r,"px")}),"easeOutHard");case 8:t.style.right="0";case 9:case"end":return e.stop()}}),e,this)}))),function(e){return C.apply(this,arguments)})},{key:"runAnimation",value:(w=s(f().mark((function e(t,n){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return We.hide(this.currentForm),e.next=3,t.animate();case 3:this.currentForm=n,We.show(n);case 5:case"end":return e.stop()}}),e,this)}))),function(e,t){return w.apply(this,arguments)})},{key:"closePopups",value:function(){We.hide(this.page.forms),this.animation&&this.animation.stop()}},{key:"showSuccess",value:(k=s(f().mark((function e(t){var n=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.forms.forEach((function(e){return We.hide(e)})),this.currentForm=this.page.checkmarkForm,this.animation=Or(this.page,t),e.next=5,this.animation.wait();case 5:this.animation=new Ve(1500,(function(){}),"",(function(){n.currentForm===n.page.checkmarkForm&&n.closePopups()}));case 6:case"end":return e.stop()}}),e,this)}))),function(e){return k.apply(this,arguments)})},{key:"exportAccount",value:(b=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,n=this.host,r={host:n},a=vt().loading(this.body),e.next=5,S("/api/exportaccount",r);case 5:if(o=e.sent,a(),vt().checkResponse(o)){e.next=11;break}return t.exportAccountErr.textContent=o.msg,We.show(t.exportAccountErr),e.abrupt("return");case 11:o.account.bonds=o.bonds,s=JSON.parse(JSON.stringify(o.account)),(i=document.createElement("a")).setAttribute("download","dcrAccount-"+n+".json"),i.setAttribute("href","data:text/json,"+JSON.stringify(s,null,2)),i.click(),We.hide(t.forms);case 18:case"end":return e.stop()}}),e,this)}))),function(){return b.apply(this,arguments)})},{key:"toggleAccountStatus",value:(m=s(f().mark((function e(t){var n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.page,We.hide(n.errMsg),r=this.host,t&&(r=n.disableAccountHost.textContent),a={host:r,disable:t},o=vt().loading(this.body),e.next=8,S("/api/toggleaccountstatus",a);case 8:if(s=e.sent,o(),vt().checkResponse(s)){e.next=13;break}return t?(n.disableAccountErr.textContent=s.msg,We.show(n.disableAccountErr)):(n.errMsg.textContent=s.msg,We.show(n.errMsg)),e.abrupt("return");case 13:return t?(this.page.toggleAccountStatusBtn.textContent=ke("ENABLE_ACCOUNT"),We.hide(n.forms)):this.page.toggleAccountStatusBtn.textContent=ke("DISABLE_ACCOUNT"),this.accountDisabled=t,e.next=17,vt().fetchUser();case 17:vt().loadPage("dexsettings/".concat(r));case 18:case"end":return e.stop()}}),e,this)}))),function(e){return m.apply(this,arguments)})},{key:"prepareAccountDisable",value:(p=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:(n=this.page).disableAccountHost.textContent=this.host,n.disableAccountErr.textContent="",this.showForm(t);case 4:case"end":return e.stop()}}),e,this)}))),function(e){return p.apply(this,arguments)})},{key:"getBondsFeeBuffer",value:(u=s(f().mark((function e(t,n){var r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=vt().loading(n),e.next=3,S("/api/bondsfeebuffer",{assetID:t});case 3:if(a=e.sent,r(),vt().checkResponse(a)){e.next=7;break}return e.abrupt("return",0);case 7:return e.abrupt("return",a.feeBuffer);case 8:case"end":return e.stop()}}),e)}))),function(e,t){return u.apply(this,arguments)})},{key:"prepareUpdateHost",value:(l=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=this.page,this.dexAddrForm.refresh(),this.showForm(t.dexAddrForm);case 3:case"end":return e.stop()}}),e,this)}))),function(){return l.apply(this,arguments)})},{key:"onCertFileChange",value:(c=s(f().mark((function e(){var t,n,r,a,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.page,We.hide(t.errMsg),!(n=t.certFileInput.files)||!n.length){e.next=7;break}return e.next=6,n[0].text();case 6:r=e.sent;case 7:if(r){e.next=9;break}return e.abrupt("return");case 9:return a={host:this.host,cert:r},o=vt().loading(this.body),e.next=13,S("/api/updatecert",a);case 13:s=e.sent,o(),vt().checkResponse(s)?(We.show(t.updateCertMsg),setTimeout((function(){We.hide(t.updateCertMsg)}),5e3)):(t.errMsg.textContent=s.msg,We.show(t.errMsg));case 16:case"end":return e.stop()}}),e,this)}))),function(){return c.apply(this,arguments)})},{key:"setConnectionStatus",value:function(){var e=this.page,t=vt().user.exchanges[this.host],n=function(t){t?(We.hide(e.disconnectedIcon),We.show(e.connectedIcon)):(We.show(e.disconnectedIcon),We.hide(e.connectedIcon))};if(t)switch(t.connectionStatus){case dt.Connected:n(!0),e.connectionStatus.textContent=ke("CONNECTED");break;case dt.Disconnected:n(!1),this.accountDisabled?e.connectionStatus.textContent=ke("ACCOUNT_DISABLED_MSG"):e.connectionStatus.textContent=ke($);break;case dt.InvalidCert:n(!1),e.connectionStatus.textContent="".concat(ke($)," - ").concat(ke("INVALID_CERTIFICATE"))}}},{key:"disableAutoRenew",value:(o=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=vt().loading(this.page.otherBondSettings),e.prev=1,this.updateBondOptions({targetTier:0}),t(),e.next=10;break;case 6:throw e.prev=6,e.t0=e.catch(1),t(),e.t0;case 10:case"end":return e.stop()}}),e,this,[[1,6]])}))),function(){return o.apply(this,arguments)})},{key:"updateBondOptions",value:(a=s(f().mark((function e(t){var n,r;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.host=this.host,e.next=3,S("/api/updatebondoptions",t);case 3:r=null!==(n=t.targetTier)&&void 0!==n?n:vt().exchanges[this.host].auth.targetTier,this.renewToggle.setState(r>0);case 5:case"end":return e.stop()}}),e,this)}))),function(e){return a.apply(this,arguments)})},{key:"newWalletCreated",value:(r=s(f().mark((function e(t,n){var r,a,o,s,i,c,l;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.regAssetForm.refresh(),e.next=3,vt().fetchUser();case 3:if(r=e.sent){e.next=6;break}return e.abrupt("return");case 6:return a=this.page,o=r.assets[t],s=o.wallet,i=vt().exchanges[this.host],c=i.bondAssets[o.symbol].amount,e.next=13,this.getBondsFeeBuffer(t,a.newWalletForm);case 13:if(l=e.sent,this.confirmRegisterForm.setFees(t,l),!(s.synced&&s.balance.available>=2*c+l)){e.next=18;break}return this.progressTierFormWithSyncedFundedWallet(t),e.abrupt("return");case 18:return this.walletWaitForm.setWallet(t,l,n),e.next=21,this.showForm(a.walletWait);case 21:case"end":return e.stop()}}),e,this)}))),function(e,t){return r.apply(this,arguments)})}]),I}(ut);function rs(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(rs=function(){return!!e})()}var as=function(e){g(o,e);var t,n,r,a=(t=o,n=rs(),function(){var e,r=x(t);if(n){var a=x(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function o(e){var t;i(this,o),h(v(t=a.call(this)),"page",void 0),h(v(t),"base",void 0),h(v(t),"quote",void 0),h(v(t),"host",void 0);var n=t.page=We.idDescendants(e);return We.cleanTemplates(n.runTableRowTmpl),We.bind(n.backButton,"click",(function(){vt().loadPage("mm")})),t.setup(),t}return d(o,[{key:"setup",value:(r=s(f().mark((function e(){var t,n,r,a,o=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T("/api/archivedmmruns");case 2:if(t=e.sent,vt().checkResponse(t)){e.next=6;break}return console.error("failed to get archived mm runs",t),e.abrupt("return");case 6:n=t.runs,r=f().mark((function e(){var t,r,s,i,c,l,u,d;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=n[a],r=t.startTime,s=t.market,i=s.baseID,c=s.quoteID,l=s.host,u=o.page.runTableRowTmpl.cloneNode(!0),(d=We.parseTemplate(u)).startTime.textContent=new Date(1e3*r).toLocaleString(),$n(u,i,c,l),We.bind(d.logs,"click",(function(){vt().loadPage("mmlogs",{baseID:i,quoteID:c,host:l,startTime:r,returnPage:"mmarchives"})})),We.bind(d.settings,"click",(function(){vt().loadPage("mmsettings",{host:l,baseID:i,quoteID:c})})),o.page.runTableBody.appendChild(u);case 8:case"end":return e.stop()}}),e)})),a=0;case 9:if(!(a<n.length)){e.next=14;break}return e.delegateYield(r(),"t0",11);case 11:a++,e.next=9;break;case 14:case"end":return e.stop()}}),e)}))),function(){return r.apply(this,arguments)})}]),o}(ut);function os(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return ss(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?ss(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function ss(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function is(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function cs(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(cs=function(){return!!e})()}var ls=0,us=function(e){g(p,e);var t,n,r,o,c,l,u=(t=p,n=cs(),function(){var e,r=x(t);if(n){var a=x(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function p(e,t){var n,r;i(this,p),h(v(r=u.call(this)),"page",void 0),h(v(r),"mkt",void 0),h(v(r),"startTime",void 0),h(v(r),"fiatRates",void 0),h(v(r),"liveBot",void 0),h(v(r),"overview",void 0),h(v(r),"events",void 0),h(v(r),"forms",void 0),h(v(r),"dexOrderIDCopyListener",void 0),h(v(r),"cexOrderIDCopyListener",void 0),h(v(r),"depositIDCopyListener",void 0),h(v(r),"withdrawalIDCopyListener",void 0),h(v(r),"filters",void 0),h(v(r),"loading",void 0),h(v(r),"refID",void 0),h(v(r),"doneScrolling",void 0),h(v(r),"statsRows",void 0);var a=r.page=We.idDescendants(e);if(ls=vt().user.net,We.cleanTemplates(a.eventTableRowTmpl,a.dexOrderTxRowTmpl,a.performanceTableRowTmpl),We.bind(r.page.backButton,"click",(function(){var e;vt().loadPage(null!==(e=t.returnPage)&&void 0!==e?e:"mm")})),We.bind(r.page.filterButton,"click",(function(){r.applyFilters()})),null!==(n=t)&&void 0!==n&&n.host){var o=new URL(window.location.href);o.searchParams.set("host",t.host),o.searchParams.set("baseID",String(t.baseID)),o.searchParams.set("quoteID",String(t.quoteID)),o.searchParams.set("startTime",String(t.startTime)),window.history.replaceState(function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?is(Object(n),!0).forEach((function(t){h(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):is(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}({page:"mmsettings"},t),"",o)}else{var s=new URLSearchParams(window.location.search);t||(t={}),t.host=s.get("host")||"",t.baseID=parseInt(s.get("baseID")||"0"),t.quoteID=parseInt(s.get("quoteID")||"0"),t.startTime=parseInt(s.get("startTime")||"0")}var c=t,l=c.baseID,d=c.quoteID,f=c.host,m=c.startTime;return r.startTime=m,r.forms=new mr(a.forms),r.events={},r.statsRows={},r.mkt={baseID:l,quoteID:d,host:f},$n(e,l,d,f),We.bind(e,"scroll",(function(){r.loading||r.doneScrolling||a.eventsTable.offsetHeight-e.offsetHeight-e.scrollTop<0&&r.nextPage()})),r.setup(f,l,d),r}return d(p,[{key:"nextPage",value:(l=s(f().mark((function e(){var t,n,r,o,s,i,c,l,u,d;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.loading=!0,e.next=3,this.getRunLogs();case 3:t=e.sent,n=a(t,3),r=n[0],o=n[1],s=n[2],i=this.mktAssets(),c=os(r),e.prev=10,c.s();case 12:if((l=c.n()).done){e.next=20;break}if(u=l.value,!this.events[u.id]){e.next=16;break}return e.abrupt("continue",18);case 16:d=this.newEventRow(u,!1,i),this.events[u.id]=[u,d];case 18:e.next=12;break;case 20:e.next=25;break;case 22:e.prev=22,e.t0=e.catch(10),c.e(e.t0);case 25:return e.prev=25,c.f(),e.finish(25);case 28:this.populateStats(s.profitLoss,s.endTime),this.updateExistingRows(o),this.loading=!1;case 31:case"end":return e.stop()}}),e,this,[[10,22,25,28]])}))),function(){return l.apply(this,arguments)})},{key:"getRunLogs",value:(c=s(f().mark((function e(){var t,n,r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.mkt,n=this.startTime,r={market:t,startTime:n,n:50,filters:this.filters,refID:this.refID},e.next=4,S("/api/mmrunlogs",r);case 4:return a=e.sent,vt().checkResponse(a)||console.error("failed to get bot logs",a),a.logs.length<=1&&(this.doneScrolling=!0),a.logs.length>0&&(this.refID=a.logs[a.logs.length-1].id),e.abrupt("return",[a.logs,a.updatedLogs||[],a.overview]);case 9:case"end":return e.stop()}}),e,this)}))),function(){return c.apply(this,arguments)})},{key:"applyFilters",value:(o=s(f().mark((function e(){var t,n,r,o,s;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.page,this.filters={dexSells:!!t.dexSellsCheckbox.checked,dexBuys:!!t.dexBuysCheckbox.checked,cexSells:!!t.cexSellsCheckbox.checked,cexBuys:!!t.cexBuysCheckbox.checked,deposits:!!t.depositsCheckbox.checked,withdrawals:!!t.withdrawalsCheckbox.checked},this.refID=void 0,e.next=5,this.getRunLogs();case 5:n=e.sent,r=a(n,3),o=r[0],s=r[2],this.populateTable(o),this.populateStats(s.profitLoss,s.endTime);case 11:case"end":return e.stop()}}),e,this)}))),function(){return o.apply(this,arguments)})},{key:"setFilters",value:function(){var e=this.page;e.dexSellsCheckbox.checked=!0,e.dexBuysCheckbox.checked=!0,e.cexSellsCheckbox.checked=!0,e.cexBuysCheckbox.checked=!0,e.depositsCheckbox.checked=!0,e.withdrawalsCheckbox.checked=!0,this.filters={dexSells:!0,dexBuys:!0,cexSells:!0,cexBuys:!0,deposits:!0,withdrawals:!0}}},{key:"setup",value:(r=s(f().mark((function e(t,n,r){var o,s,i,c,l,u,d,h,p,v,m,g,y,x,b,k,w=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s=this.page,this.setFilters(),i=this.startTime,l=0,u=or(t,n,r),e.next=7,this.getRunLogs();case 7:d=e.sent,h=a(d,3),p=h[0],v=h[2],(null==u||null===(o=u.runStats)||void 0===o?void 0:o.startTime)===i?(this.liveBot=!0,this.fiatRates=vt().fiatRatesMap,c=u.runStats.profitLoss):(this.fiatRates=v.finalState.fiatRates,c=v.profitLoss,l=v.endTime),this.populateStats(c,l),m=this.mktAssets(),g=s.sumUSDHeader.parentElement,y=os(m);try{for(y.s();!(x=y.n()).done;)b=x.value,(k=document.createElement("th")).textContent="".concat(b.symbol.toUpperCase()," Delta"),g&&g.insertBefore(k,s.sumUSDHeader)}catch(e){y.e(e)}finally{y.f()}this.populateTable(p),vt().registerNoteFeeder({runevent:function(e){w.handleRunEventNote(e)},runstats:function(e){w.handleRunStatsNote(e)}});case 19:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return r.apply(this,arguments)})},{key:"handleRunEventNote",value:function(e){var t=this.mkt,n=t.baseID,r=t.quoteID,a=t.host;if(e.host===a&&e.baseID===n&&e.quoteID===r&&(o=e.event,s=this.filters,o.dexOrderEvent?o.dexOrderEvent.sell?s.dexSells:s.dexBuys:o.cexOrderEvent?o.cexOrderEvent.sell?s.cexSells:s.cexBuys:o.depositEvent?s.deposits:o.withdrawalEvent&&s.withdrawals)){var o,s,i=e.event,c=this.events[i.id];if(c)return this.setRowContents(c[1],i,this.mktAssets()),void(c[0]=i);var l=this.newEventRow(i,!0,this.mktAssets());this.events[i.id]=[i,l]}}},{key:"handleRunStatsNote",value:function(e){var t=this.mkt,n=t.baseID,r=t.quoteID,a=t.host,o=this.startTime;e.host===a&&e.baseID===n&&e.quoteID===r&&e.stats&&e.stats.startTime===o&&this.populateStats(e.stats.profitLoss,0)}},{key:"populateStats",value:function(e,t){var n=this.page;for(var r in n.startTime.textContent=new Date(1e3*this.startTime).toLocaleString(),0===t?We.hide(n.endTimeRow):n.endTime.textContent=new Date(1e3*t).toLocaleString(),e.diffs){var a=vt().assets[parseInt(r)],o=this.statsRows[r];if(!o){o=n.performanceTableRowTmpl.cloneNode(!0);var s=We.parseTemplate(o);s.logo.src=We.logoPath(a.symbol),s.ticker.textContent=a.symbol.toUpperCase(),this.statsRows[r]=o,n.performanceTableBody.appendChild(o)}var i=e.diffs[r],c=We.parseTemplate(o);c.diff.textContent=i.fmt,c.usdDiff.textContent=i.fmtUSD,c.fiatRate.textContent="".concat(We.formatFiatValue(this.fiatRates[a.id])," USD")}n.profitLoss.textContent="".concat(We.formatFiatValue(e.profit)," USD")}},{key:"mktAssets",value:function(){var e,t=vt().assets[this.mkt.baseID],n=vt().assets[this.mkt.quoteID],r=[t,n],a=(h(e={},t.id,!0),h(e,n.id,!0),e);if(t.token&&!a[t.token.parentID]){var o=vt().assets[t.token.parentID];a[o.id]=!0,r.push(o)}if(n.token&&!a[n.token.parentID]){var s=vt().assets[n.token.parentID];r.push(s)}return r}},{key:"updateExistingRows",value:function(e){var t,n=os(e);try{for(n.s();!(t=n.n()).done;){var r=t.value,a=this.events[r.id];a&&(this.setRowContents(a[1],r,this.mktAssets()),a[0]=r)}}catch(e){n.e(e)}finally{n.f()}}},{key:"populateTable",value:function(e){var t=this.page;We.empty(t.eventsTableBody),this.events={},this.doneScrolling=!1;var n,r=this.mktAssets(),a=os(e);try{for(a.s();!(n=a.n()).done;){var o=n.value,s=this.newEventRow(o,!1,r);this.events[o.id]=[o,s]}}catch(e){a.e(e)}finally{a.f()}}},{key:"setRowContents",value:function(e,t,n){var r,a=this,o=We.parseTemplate(e);o.time.textContent=new Date(1e3*t.timestamp).toLocaleString(),o.eventType.textContent=this.eventType(t),t.depositEvent?r=t.depositEvent.transaction.id:t.withdrawalEvent?r=t.withdrawalEvent.id:t.dexOrderEvent?r=t.dexOrderEvent.id:t.cexOrderEvent&&(r=t.cexOrderEvent.id),r&&(o.eventID.textContent=ds(r,30),o.eventID.setAttribute("title",r));var s,i=0,c=os(n);try{for(c.s();!(s=c.n()).done;){var l,u=s.value,d=t.balanceEffects,h=hs(u.id,d),p="sum".concat(u.symbol.toUpperCase()),f=void 0;if(o[p])f=o[p];else{(f=document.createElement("td")).dataset.tmpl=p;var v=o.sumUSD.parentElement;v&&v.insertBefore(f,o.sumUSD)}f.textContent=We.formatCoinValue(h,u.unitInfo),i+=null!==(l=h/u.unitInfo.conventional.conversionFactor*this.fiatRates[u.id])&&void 0!==l?l:0}}catch(e){c.e(e)}finally{c.f()}o.sumUSD.textContent=We.formatFourSigFigs(i),We.bind(o.details,"click",(function(){a.showEventDetails(t.id)}))}},{key:"newEventRow",value:function(e,t,n){var r=this.page,a=r.eventTableRowTmpl.cloneNode(!0);return a.id=e.id.toString(),this.setRowContents(a,e,n),t?r.eventsTableBody.insertBefore(a,r.eventsTableBody.firstChild):r.eventsTableBody.appendChild(a),a}},{key:"eventType",value:function(e){return e.depositEvent?"Deposit":e.withdrawalEvent?"Withdrawal":e.dexOrderEvent?e.dexOrderEvent.sell?"DEX Sell":"DEX Buy":e.cexOrderEvent?e.cexOrderEvent.sell?"CEX Sell":"CEX Buy":""}},{key:"showDexOrderEventDetails",value:function(e){var t=this.page,n=this.mkt,r=n.baseID,a=n.quoteID,o=vt().assets[r],s=vt().assets[a],i=[o.unitInfo,s.unitInfo],c=i[0],l=i[1],u=[c.conventional.unit,l.conventional.unit],d=u[0],h=u[1];void 0!==this.dexOrderIDCopyListener&&t.copyDexOrderID.removeEventListener("click",this.dexOrderIDCopyListener),this.dexOrderIDCopyListener=function(){at(e.id,t.dexOrderID,t.copyDexOrderID,"#1e7d11")},t.copyDexOrderID.addEventListener("click",this.dexOrderIDCopyListener),t.dexOrderID.textContent=ds(e.id,20),t.dexOrderID.setAttribute("title",e.id);var p=vt().conventionalRate(r,a,e.rate);t.dexOrderRate.textContent="".concat(p," ").concat(d,"/").concat(h),t.dexOrderQty.textContent="".concat(e.qty/c.conventional.conversionFactor," ").concat(d),e.sell?t.dexOrderSide.textContent=ke(B):t.dexOrderSide.textContent=ke(E),We.empty(t.dexOrderTxsTableBody),We.setVis(e.transactions&&e.transactions.length>0,t.dexOrderTxsTable);for(var f=function(e,t){switch(e){case 3:case 5:case 6:return t?o:s;case 4:return t?s:o}},v=0;e.transactions&&v<e.transactions.length;v++){var m=e.transactions[v],g=t.dexOrderTxRowTmpl.cloneNode(!0),y=We.parseTemplate(g);y.id.textContent=ds(m.id,20),y.id.setAttribute("title",m.id),y.type.textContent=ea(m.type);var x=f(m.type,e.sell);if(x){var b=Ln[x.id];b&&b[ls]&&(y.explorerLink.href=b[ls](m.id)),y.amt.textContent="".concat(We.formatCoinValue(m.amount,x.unitInfo)," ").concat(x.unitInfo.conventional.unit.toLowerCase()),y.fees.textContent="".concat(We.formatCoinValue(m.fees,x.unitInfo)," ").concat(x.unitInfo.conventional.unit.toLowerCase()),t.dexOrderTxsTableBody.appendChild(g)}else console.error("unexpected tx type in dex order event",m.type)}this.forms.show(t.dexOrderDetailsForm)}},{key:"showCexOrderEventDetails",value:function(e){var t=this.page,n=this.mkt,r=n.baseID,a=n.quoteID,o=vt().assets[r],s=vt().assets[a],i=[o.unitInfo,s.unitInfo],c=i[0],l=i[1],u=[c.conventional.unit,l.conventional.unit],d=u[0],h=u[1];t.cexOrderID.textContent=ds(e.id,20),void 0!==this.cexOrderIDCopyListener&&t.copyCexOrderID.removeEventListener("click",this.cexOrderIDCopyListener),this.cexOrderIDCopyListener=function(){at(e.id,t.cexOrderID,t.copyCexOrderID,"#1e7d11")},t.copyCexOrderID.addEventListener("click",this.cexOrderIDCopyListener),t.cexOrderID.setAttribute("title",e.id);var p=vt().conventionalRate(r,a,e.rate);t.cexOrderRate.textContent="".concat(p," ").concat(d,"/").concat(h),t.cexOrderQty.textContent="".concat(e.qty/c.conventional.conversionFactor," ").concat(d),e.sell?t.cexOrderSide.textContent=ke(B):t.cexOrderSide.textContent=ke(E),t.cexOrderBaseFilled.textContent="".concat(e.baseFilled/c.conventional.conversionFactor," ").concat(d),t.cexOrderQuoteFilled.textContent="".concat(e.quoteFilled/l.conventional.conversionFactor," ").concat(h),this.forms.show(t.cexOrderDetailsForm)}},{key:"showDepositEventDetails",value:function(e,t){var n=this.page;n.depositID.textContent=ds(e.transaction.id,20),void 0!==this.depositIDCopyListener&&n.copyDepositID.removeEventListener("click",this.depositIDCopyListener),this.depositIDCopyListener=function(){at(e.transaction.id,n.depositID,n.copyDepositID,"#1e7d11")},n.copyDepositID.addEventListener("click",this.depositIDCopyListener),n.depositID.setAttribute("title",e.transaction.id);var r=vt().assets[e.assetID].unitInfo,a=r.conventional.unit;n.depositAmt.textContent="".concat(We.formatCoinValue(e.transaction.amount,r)," ").concat(a),n.depositFees.textContent="".concat(We.formatCoinValue(e.transaction.fees,r)," ").concat(a),n.depositStatus.textContent=ke(t?me:ge),We.setVis(!t,n.depositCreditSection),t||(n.depositCredit.textContent="".concat(We.formatCoinValue(e.cexCredit,r)," ").concat(a)),this.forms.show(n.depositDetailsForm)}},{key:"showWithdrawalEventDetails",value:function(e,t){var n=this.page;n.withdrawalID.textContent=ds(e.id,20),void 0!==this.withdrawalIDCopyListener&&n.copyWithdrawalID.removeEventListener("click",this.withdrawalIDCopyListener),this.withdrawalIDCopyListener=function(){at(e.id,n.withdrawalID,n.copyWithdrawalID,"#1e7d11")},n.copyWithdrawalID.addEventListener("click",this.withdrawalIDCopyListener),n.withdrawalID.setAttribute("title",e.id);var r=vt().assets[e.assetID].unitInfo,a=r.conventional.unit;n.withdrawalAmt.textContent="".concat(We.formatCoinValue(e.cexDebit,r)," ").concat(a),n.withdrawalStatus.textContent=ke(t?me:ge),e.transaction&&(n.withdrawalTxID.textContent=ds(e.transaction.id,20),n.withdrawalTxID.setAttribute("title",e.transaction.id),n.withdrawalReceived.textContent="".concat(We.formatCoinValue(e.transaction.amount,r)," ").concat(a)),this.forms.show(n.withdrawalDetailsForm)}},{key:"showEventDetails",value:function(e){var t=a(this.events[e],1)[0];t.dexOrderEvent&&this.showDexOrderEventDetails(t.dexOrderEvent),t.cexOrderEvent&&this.showCexOrderEventDetails(t.cexOrderEvent),t.depositEvent&&this.showDepositEventDetails(t.depositEvent,t.pending),t.withdrawalEvent&&this.showWithdrawalEventDetails(t.withdrawalEvent,t.pending)}}]),p}(ut);function ds(e,t){return e.length<=t?e:"".concat(e.substring(0,t/2),"...").concat(e.substring(e.length-t/2))}function hs(e,t){var n=0;return t.settled[e]&&(n+=t.settled[e]),t.pending[e]&&(n+=t.pending[e]),t.locked[e]&&(n+=t.locked[e]),t.reserved[e]&&(n+=t.reserved[e]),n}function ps(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return fs(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?fs(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function fs(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function vs(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(vs=function(){return!!e})()}var ms,gs=function(e){g(o,e);var t,n,r,a=(t=o,n=vs(),function(){var e,r=x(t);if(n){var a=x(this).constructor;e=Reflect.construct(r,arguments,a)}else e=r.apply(this,arguments);return y(this,e)});function o(e){var t;i(this,o),h(v(t=a.call(this)),"body",void 0),h(v(t),"page",void 0),h(v(t),"initForm",void 0),h(v(t),"quickConfigForm",void 0),h(v(t),"seedBackupForm",void 0),h(v(t),"mnemonic",void 0),t.body=e;var n=t.page=We.idDescendants(e);return t.initForm=new ys(n.appPWForm,(function(e,n,r){t.appInited(e,n,r)})),t.quickConfigForm=new bs(n.quickConfigForm,(function(){return t.quickConfigDone()})),t.seedBackupForm=new ks(n.seedBackupForm,(function(){return t.seedBackedUp()})),t}return d(o,[{key:"appInited",value:(r=s(f().mark((function e(t,n,r){var a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.mnemonic=r,a=this.page,e.next=4,this.quickConfigForm.update(t,n);case 4:r&&this.seedBackupForm.update(r),Pr(a.appPWForm,a.quickConfigForm);case 6:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return r.apply(this,arguments)})},{key:"quickConfigDone",value:function(){this.mnemonic?Pr(this.page.quickConfigForm,this.page.seedBackupForm):vt().loadPage("wallets")}},{key:"seedBackedUp",value:function(){vt().loadPage("wallets")}}]),o}(ut),ys=function(){function e(t,n){var r=this;i(this,e),h(this,"form",void 0),h(this,"page",void 0),h(this,"success",void 0),this.form=t,this.success=n;var a=this.page=We.idDescendants(t);Mr(t,a.appPWSubmit,(function(){return r.setAppPass()})),Mr(t,a.toggleSeedInput,(function(){We.isHidden(a.seedInputBox)?(a.toggleSeedInputIcon.classList.remove("ico-plus"),a.toggleSeedInputIcon.classList.add("ico-minus"),We.show(a.seedInputBox)):(a.toggleSeedInputIcon.classList.remove("ico-minus"),a.toggleSeedInputIcon.classList.add("ico-plus"),We.hide(a.seedInputBox))}))}var t;return d(e,[{key:"setAppPass",value:(t=s(f().mark((function e(){var t,n,r,a,o,s,i;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.page,We.hide(n.appPWErrMsg),r=n.appPW.value||"",a=n.appPWAgain.value,""!==r){e.next=8;break}return n.appPWErrMsg.textContent=ke(R),We.show(n.appPWErrMsg),e.abrupt("return");case 8:if(r===a){e.next=12;break}return n.appPWErrMsg.textContent=ke(N),We.show(n.appPWErrMsg),e.abrupt("return");case 12:return n.appPW.value="",n.appPWAgain.value="",o=vt().loading(this.form),s=null!==(t=n.seedInput.value)&&void 0!==t?t:"",e.next=18,S("/api/init",{pass:r,seed:s});case 18:if(i=e.sent,o(),vt().checkResponse(i)){e.next=24;break}return n.appPWErrMsg.textContent=i.msg,We.show(n.appPWErrMsg),e.abrupt("return");case 24:this.success(r,i.hosts,i.mnemonic);case 25:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),xs=0,bs=function(){function e(t,n){var r=this;i(this,e),h(this,"page",void 0),h(this,"form",void 0),h(this,"servers",void 0),h(this,"wallets",void 0),h(this,"pw",void 0),h(this,"success",void 0),this.form=t,this.success=n;var a=this.page=We.idDescendants(t);We.cleanTemplates(a.qcServerTmpl,a.qcWalletTmpl),Mr(t,a.quickConfigSubmit,(function(){r.submit()})),Mr(t,a.qcErrAck,(function(){r.success()}))}var t,n;return d(e,[{key:"update",value:(n=s(f().mark((function e(t,n){var r,a,o,s,i,c,l,u,d,h,p,v,m,g,y,x,b,k,w;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:this.pw=t,r=this.page,this.servers=[],a=ps(n);try{for(a.s();!(o=a.n()).done;)s=o.value,i=r.qcServerTmpl.cloneNode(!0),r.qcServersBox.appendChild(i),c=We.parseTemplate(i),xs++,l="qcsrow".concat(xs),i.htmlFor=l,c.checkbox.id=l,c.host.textContent=s,this.servers.push({host:s,checkbox:c.checkbox})}catch(e){a.e(e)}finally{a.f()}return e.next=7,vt().fetchUser();case 7:u=e.sent,this.wallets=[],d=0,h=Object.values(u.assets);case 10:if(!(d<h.length)){e.next=52;break}if(!(p=h[d]).token){e.next=14;break}return e.abrupt("continue",49);case 14:v=p.info,m=null,g=ps(v.availablewallets),e.prev=17,g.s();case 19:if((y=g.n()).done){e.next=29;break}if((x=y.value).seeded){e.next=23;break}return e.abrupt("continue",27);case 23:if(!x.configopts||!x.configopts.some((function(e){return e.required}))){e.next=25;break}return e.abrupt("continue",27);case 25:return m=x,e.abrupt("break",29);case 27:e.next=19;break;case 29:e.next=34;break;case 31:e.prev=31,e.t0=e.catch(17),g.e(e.t0);case 34:return e.prev=34,g.f(),e.finish(34);case 37:if(m){e.next=39;break}return e.abrupt("continue",49);case 39:b=r.qcWalletTmpl.cloneNode(!0),r.qcWalletsBox.appendChild(b),k=We.parseTemplate(b),xs++,w="qcwrow".concat(xs),b.htmlFor=w,k.checkbox.id=w,k.icon.src=We.logoPath(p.symbol),k.name.textContent=p.name,this.wallets.push({asset:p,type:m.type,checkbox:k.checkbox});case 49:d++,e.next=10;break;case 52:case"end":return e.stop()}}),e,this,[[17,31,34,37]])}))),function(e,t){return n.apply(this,arguments)})},{key:"submit",value:(t=s(f().mark((function e(){var t,n,r,a,o,i,c,l,u,d,h,p,v=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=[],n=[],(r=new $t(this.form,{backgroundColor:!0,message:"..."})).opts.message=ke("ADDING_SERVER"),a=function(){var e=s(f().mark((function e(n){var r,a;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n.checkbox.checked){e.next=2;break}return e.abrupt("return");case 2:return r={addr:n.host,appPW:v.pw},e.next=5,S("/api/adddex",r);case 5:a=e.sent,vt().checkResponse(a)||t.push(n.host);case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),e.next=6,Promise.all(this.servers.map(a));case 6:return r.opts.message=ke("CREATING_WALLETS"),o=function(){var e=s(f().mark((function e(t){var r,a,o,s,i,c,l,u,d,h;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=t.asset,o=t.type,t.checkbox.checked){e.next=3;break}return e.abrupt("return");case 3:s={},i=vt().walletDefinition(a.id,o),c=ps(null!==(r=i.configopts)&&void 0!==r?r:[]),e.prev=6,c.s();case 8:if((l=c.n()).done){e.next=18;break}if((u=l.value).default){e.next=12;break}return e.abrupt("continue",16);case 12:if(!u.isboolean){e.next=15;break}return s[u.key]=u.default?"1":"0",e.abrupt("continue",16);case 15:u.repeatable&&s[u.key]?s[u.key]+=u.repeatable+u.default:s[u.key]=String(u.default);case 16:e.next=8;break;case 18:e.next=23;break;case 20:e.prev=20,e.t0=e.catch(6),c.e(e.t0);case 23:return e.prev=23,c.f(),e.finish(23);case 26:return d={assetID:a.id,appPass:v.pw,config:s,walletType:o},e.next=29,S("/api/newwallet",d);case 29:h=e.sent,vt().checkResponse(h)||n.push(a.name);case 31:case"end":return e.stop()}}),e,null,[[6,20,23,26]])})));return function(t){return e.apply(this,arguments)}}(),e.next=10,Promise.all(this.wallets.map(o));case 10:return r.stop(),e.next=13,vt().fetchUser();case 13:if(n.length+t.length!==0){e.next=15;break}return e.abrupt("return",this.success());case 15:if(i=this.page,We.hide(i.qcChoices),We.show(i.qcErrors),t.length){c=ps(t);try{for(c.s();!(l=c.n()).done;)u=l.value,i.qcServerErrorList.appendChild(document.createTextNode(u)),i.qcServerErrorList.appendChild(document.createElement("br"))}catch(e){c.e(e)}finally{c.f()}}else We.hide(i.qcServerErrors);if(n.length){d=ps(n);try{for(d.s();!(h=d.n()).done;)p=h.value,i.qcWalletErrorList.appendChild(document.createTextNode(p)),i.qcWalletErrorList.appendChild(document.createElement("br"))}catch(e){d.e(e)}finally{d.f()}}else We.hide(i.qcWalletErrors);case 20:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}(),ks=function(){function e(t,n){var r=this;i(this,e),h(this,"form",void 0),h(this,"page",void 0),h(this,"mnemonic",void 0),this.form=t;var a=this.page=We.idDescendants(t);Mr(t,a.seedAck,(function(){return n()})),Mr(t,a.showSeed,(function(){return r.showSeed()}))}return d(e,[{key:"update",value:function(e){this.mnemonic=e}},{key:"showSeed",value:function(){var e=this.page;e.mnemonic.textContent=this.mnemonic,We.hide(e.sbWanna),We.show(e.sbSeed)}}]),e}();function ws(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Cs(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ws(Object(n),!0).forEach((function(t){h(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ws(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Ss(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return Fs(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Fs(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}})),e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){i=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(i)throw o}}}}function Fs(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var Ts=We.idel,Ds=We.bind,Is=We.unbind,As={login:jr,register:Ur,markets:$a,wallets:oa,settings:Ia,orders:vo,order:ko,dexsettings:ns,init:gs,mm:Po,mmsettings:Yo,mmarchives:as,mmlogs:us},Rs={"en-US":{name:"English",flag:"🇺🇸"},"pt-BR":{name:"Portugese",flag:"🇧🇷"},"zh-CN":{name:"Chinese",flag:"🇨🇳"},"pl-PL":{name:"Polish",flag:"🇵🇱"},"de-DE":{name:"German",flag:"🇩🇪"},ar:{name:"Arabic",flag:"🇪🇬"}},Es=function(){function e(){var t=this;i(this,e),h(this,"notes",void 0),h(this,"pokes",void 0),h(this,"langs",void 0),h(this,"lang",void 0),h(this,"mmStatus",void 0),h(this,"inited",void 0),h(this,"authed",void 0),h(this,"user",void 0),h(this,"seedGenTime",void 0),h(this,"commitHash",void 0),h(this,"showPopups",void 0),h(this,"loggers",void 0),h(this,"recorders",void 0),h(this,"main",void 0),h(this,"header",void 0),h(this,"headerSpace",void 0),h(this,"assets",void 0),h(this,"exchanges",void 0),h(this,"walletMap",void 0),h(this,"fiatRatesMap",void 0),h(this,"tooltip",void 0),h(this,"page",void 0),h(this,"loadedPage",void 0),h(this,"popupNotes",void 0),h(this,"popupTmpl",void 0),h(this,"noteReceivers",void 0),h(this,"txHistoryMap",void 0),h(this,"requiredActions",void 0),this.notes=[],this.pokes=[],this.seedGenTime=0,this.commitHash="",this.noteReceivers=[],this.fiatRatesMap={},this.showPopups="1"===k.fetchLocal(k.popupsLK),this.txHistoryMap={},this.requiredActions={},document.body.classList.toggle("dark",k.isDark()),this.loggers=k.fetchLocal(k.loggersLK)||{},window.enableLogger=function(e,n){return n?t.loggers[e]=!0:delete t.loggers[e],k.storeLocal(k.loggersLK,t.loggers),"".concat(e," logger ").concat(n?"enabled":"disabled")},window.log=function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];t.log.apply(t,[e].concat(r))},window.mmStatus=function(){return t.mmStatus};var n=k.fetchLocal(k.recordersLK)||[];this.recorders={};var r,a=Ss(n);try{for(a.s();!(r=a.n()).done;){var o=r.value;console.log("recording",o),this.recorders[o]=[]}}catch(e){a.e(e)}finally{a.f()}window.recordLogger=function(e,n){return n?t.recorders[e]=[]:delete t.recorders[e],k.storeLocal(k.recordersLK,Object.keys(t.recorders)),"".concat(e," recorder ").concat(n?"enabled":"disabled")},window.dumpLogger=function(e){var n=t.recorders[e];if(!n)return"no recorder for logger ".concat(e);var r=document.createElement("a");r.href="data:application/octet-stream;base64,".concat(window.btoa(JSON.stringify(n,null,4))),r.download="".concat(e,".json"),document.body.appendChild(r),r.click(),setTimeout((function(){document.body.removeChild(r)}),0)},window.user=function(){return t.user}}var t,n,o,c,l,u,p,v,m,g,y,x;return d(e,[{key:"start",value:(x=s(f().mark((function e(){var t,n,r=this;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.fetchBuildInfo();case 2:return console.log("Bison Wallet, Build",this.commitHash.substring(0,8)),Ds(window,"popstate",(function(e){var t,n=null===(t=e.state)||void 0===t?void 0:t.page;(n||""===n)&&r.loadPage(n,e.state.data,!0)})),this.main=Ts(document,"main"),t=this.main.dataset.handler,e.next=8,this.fetchUser();case 8:return e.next=11,xe(this.lang,this.commitHash,!1);case 11:if(Ps((n=new URL(window.location.href)).pathname)!==t&&(n.pathname="/".concat(t),n.search="",window.history.replaceState({page:t},"",n)),this.attachHeader(),this.attachActions(),this.attachCommon(this.header),this.attach({}),!this.authed){e.next=20;break}return e.next=20,this.fetchNotes();case 20:this.updateMenuItemsDisplay(),ka(),La.connect((void 0,a="https:"===window.location.protocol?"wss":"ws","".concat(a,"://").concat(window.location.host,"/ws")),(function(){return r.reconnected()})),La.registerRoute("notify",(function(e){r.notify(e)}));case 24:case"end":return e.stop()}var a}),e,this)}))),function(){return x.apply(this,arguments)})},{key:"reconnected",value:function(){var e;"settings"===(null===(e=this.main)||void 0===e?void 0:e.dataset.handler)?window.location.assign("/"):window.location.reload()}},{key:"fetchUser",value:(y=s(f().mark((function e(){var t,n,r,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T("/api/user");case 2:if(t=e.sent,this.checkResponse(t)){e.next=5;break}return e.abrupt("return");case 5:if(this.inited=t.inited,this.authed=Boolean(t.user),this.lang=t.lang,this.langs=t.langs,this.mmStatus=t.mmStatus,t.user){e.next=12;break}return e.abrupt("return");case 12:for(n=t.user,this.seedGenTime=n.seedgentime,this.user=n,this.assets=n.assets,this.exchanges=n.exchanges,this.walletMap={},this.fiatRatesMap=n.fiatRates,r=0,o=Object.entries(n.assets);r<o.length;r++)s=a(o[r],2),i=s[0],(c=s[1]).wallet&&(this.walletMap[i]=c.wallet);return this.updateMenuItemsDisplay(),e.abrupt("return",n);case 22:case"end":return e.stop()}}),e,this)}))),function(){return y.apply(this,arguments)})},{key:"fetchBuildInfo",value:(g=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T("/api/buildinfo");case 2:if(t=e.sent,this.checkResponse(t)){e.next=5;break}return e.abrupt("return");case 5:this.commitHash=t.revision;case 6:case"end":return e.stop()}}),e,this)}))),function(){return g.apply(this,arguments)})},{key:"fetchMMStatus",value:(m=s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Jn.status();case 2:this.mmStatus=e.sent;case 3:case"end":return e.stop()}}),e,this)}))),function(){return m.apply(this,arguments)})},{key:"loadPage",value:(v=s(f().mark((function e(t,n,r){var a,o,s,i,c,l,u,d;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.tooltip.style.left="-10000px",We.hide(this.page.noteBox,this.page.profileBox),a=new URL("/".concat(t),window.location.origin),o=Ps(t),e.next=6,window.fetch(a.toString());case 6:if((s=e.sent).ok){e.next=9;break}return e.abrupt("return",!1);case 9:return e.next=11,s.text();case 11:return i=e.sent,c=We.noderize(i),l=Ts(c,"main"),u=l.dataset.handler,r||(d=u===o?a.toString():"/".concat(u),window.history.pushState({page:t,data:n},"",d)),document.title=c.title,this.main.replaceWith(l),this.main=l,this.noteReceivers=[],We.empty(this.headerSpace),this.attach(n),e.abrupt("return",!0);case 23:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return v.apply(this,arguments)})},{key:"attach",value:function(e){var t=this.main.dataset.handler;if(t){this.attachCommon(this.main),this.loadedPage&&this.loadedPage.unload();var n=As[t];this.loadedPage=n?new n(this.main,e):null,this.bindTooltips(this.main),window.isWebview&&this.bindUrlHandlers(this.main),this.bindUnits(this.main)}else console.error("cannot attach to content with no specified handler")}},{key:"bindTooltips",value:function(e){var t=this;e.querySelectorAll("[data-tooltip]").forEach((function(e){Ds(e,"mouseenter",(function(){t.tooltip.textContent=e.dataset.tooltip||"";var n=We.layoutMetrics(e),r=n.centerX-t.tooltip.offsetWidth/2;r<0&&(r=5),r+t.tooltip.offsetWidth>document.body.offsetWidth&&(r=document.body.offsetWidth-t.tooltip.offsetWidth-5),t.tooltip.style.left="".concat(r,"px"),t.tooltip.style.top="".concat(n.bodyTop-t.tooltip.offsetHeight-5,"px")})),Ds(e,"mouseleave",(function(){t.tooltip.style.left="-10000px"}))}))}},{key:"bindUnits",value:function(e){var t=this,n=document.createElement("div");n.classList.add("position-absolute","p-3");var r=document.createElement("div");n.appendChild(r),r.classList.add("body-bg","border");var a,o=function(e,t,n){var a=We.safeSelector(e,"[data-unit-box]"),o=parseInt(a.dataset.atoms),s=document.createElement("div");s.textContent=t,r.appendChild(s),s.classList.add("p-2","hoverbg","pointer"),We.bind(s,"click",(function(){We.setText(e,"[data-value]",We.formatFourSigFigs(o/n,Math.round(Math.log10(n)))),We.setText(e,"[data-unit]",t)}))},s=Ss(We.applySelector(e,"[data-conversion-value]"));try{var i=function(){var e=a.value,s=We.safeSelector(e,"[data-unit-box]");We.bind(s,"mouseenter",(function(){We.empty(r),s.appendChild(n);var a=We.layoutMetrics(s),i=parseInt(s.dataset.assetID),c=t.assets[i].unitInfo;o(e,c.conventional.unit,c.conventional.conversionFactor);var l,u=Ss(c.denominations);try{for(u.s();!(l=u.n()).done;){var d=l.value,h=d.unit,p=d.conversionFactor;o(e,h,p)}}catch(e){u.e(e)}finally{u.f()}o(e,c.atomicUnit,1),a.bodyTop>n.offsetHeight+t.header.offsetHeight?(n.style.bottom="calc(100% - 1rem)",n.style.top="auto"):(n.style.top="calc(100% - 1rem)",n.style.bottom="auto")})),We.bind(s,"mouseleave",(function(){return n.remove()}))};for(s.s();!(a=s.n()).done;)i()}catch(e){s.e(e)}finally{s.f()}}},{key:"bindUrlHandlers",value:function(e){if(window.openUrl){var t,n=Ss(We.applySelector(e,"a[target=_blank]"));try{var r=function(){var e=t.value;We.bind(e,"click",(function(t){var n;t.preventDefault(),window.openUrl(null!==(n=e.href)&&void 0!==n?n:"")}))};for(n.s();!(t=n.n()).done;)r()}catch(e){n.e(e)}finally{n.f()}}}},{key:"attachHeader",value:function(){var e=this;this.header=Ts(document.body,"header");var t=this.page=We.idDescendants(this.header);this.headerSpace=t.headerSpace,this.popupNotes=Ts(document.body,"popupNotes"),this.popupTmpl=We.tmplElement(this.popupNotes,"note"),this.popupTmpl?this.popupTmpl.remove():console.error("popupTmpl element not found"),this.tooltip=Ts(document.body,"tooltip"),t.noteTmpl.removeAttribute("id"),t.noteTmpl.remove(),t.pokeTmpl.removeAttribute("id"),t.pokeTmpl.remove(),t.loader.remove(),We.show(t.loader),Ds(t.noteBell,"click",s(f().mark((function n(){var r,a,o;return f().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:We.hide(t.pokeList),We.show(t.noteList),e.ackNotes(),t.noteCat.classList.add("active"),t.pokeCat.classList.remove("active"),e.showDropdown(t.noteBell,t.noteBox),We.hide(t.noteIndicator),r=Ss(e.notes);try{for(r.s();!(a=r.n()).done;)(o=a.value).acked&&o.el.classList.remove("firstview")}catch(e){r.e(e)}finally{r.f()}e.setNoteTimes(t.noteList),e.setNoteTimes(t.pokeList);case 11:case"end":return n.stop()}}),n)})))),Ds(t.burgerIcon,"click",(function(){We.hide(t.logoutErr),e.showDropdown(t.burgerIcon,t.profileBox)})),Ds(t.innerNoteIcon,"click",(function(){We.hide(t.noteBox)})),Ds(t.innerBurgerIcon,"click",(function(){We.hide(t.profileBox)})),Ds(t.profileSignout,"click",s(f().mark((function t(){return f().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.signOut();case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)})))),Ds(t.pokeCat,"click",(function(){e.setNoteTimes(t.pokeList),t.pokeCat.classList.add("active"),t.noteCat.classList.remove("active"),We.hide(t.noteList),We.show(t.pokeList),e.ackNotes()})),Ds(t.noteCat,"click",(function(){e.setNoteTimes(t.noteList),t.noteCat.classList.add("active"),t.pokeCat.classList.remove("active"),We.hide(t.pokeList),We.show(t.noteList),e.ackNotes()})),We.cleanTemplates(t.langBttnTmpl);var n=Rs[this.lang],r=n.name,a=n.flag;t.langFlag.textContent=a,t.langName.textContent=r;var o,i=Ss(this.langs);try{var c=function(){var n=o.value;if(n===e.lang)return"continue";var r=t.langBttnTmpl.cloneNode(!0),a=Rs[n],s=a.name,i=a.flag;r.textContent=i,r.title=s,We.bind(r,"click",(function(){return e.setLanguage(n)})),t.langBttns.appendChild(r)};for(i.s();!(o=i.n()).done;)c()}catch(e){i.e(e)}finally{i.f()}}},{key:"attachActions",value:function(){var e=this,t=this.page;Object.assign(t,We.idDescendants(We.idel(document.body,"requiredActions"))),We.cleanTemplates(t.missingNoncesTmpl,t.actionTxTableTmpl,t.tooCheapTmpl,t.lostNonceTmpl),We.bind(t.actionsCollapse,"click",(function(){We.hide(t.actionDialog),We.show(t.actionDialogCollapsed)})),We.bind(t.actionDialogCollapsed,"click",(function(){We.hide(t.actionDialogCollapsed),We.show(t.actionDialog),0===t.actionDialogContent.children.length&&e.showOldestAction()}));var n=function(t){var n=Object.values(e.requiredActions).filter((function(e){return e.selected}))[0],r=e.sortedActions(),a=r.indexOf(n);e.showRequestedAction(r[a+t].uniqueID)};We.bind(t.prevAction,"click",(function(){return n(-1)})),We.bind(t.nextAction,"click",(function(){return n(1)}))}},{key:"setRequiredActions",value:function(){var e=this.user.actions,t=this.requiredActions;if(e){var n,r=Ss(e);try{for(r.s();!(n=r.n()).done;){var a=n.value;this.addAction(a)}}catch(e){r.e(e)}finally{r.f()}Object.keys(t).length&&(this.showOldestAction(),this.blinkAction())}}},{key:"sortedActions",value:function(){var e=Object.values(this.requiredActions);return e.sort((function(e,t){return e.stamp-t.stamp})),e}},{key:"showOldestAction",value:function(){this.showRequestedAction(this.sortedActions()[0].uniqueID)}},{key:"addAction",value:function(e){var t=this.page,n=this.requiredActions,r=n[e.uniqueID];if(!r||r.actionID!==e.actionID){var a=this.actionForm(e);if(r)r.selected&&r.div.replaceWith(a),r.div=a;else{n[e.uniqueID]={div:a,stamp:(new Date).getTime(),uniqueID:e.uniqueID,actionID:e.actionID,selected:!1};var o=Object.keys(n).length;t.actionDialogCount.textContent=String(o),t.actionCount.textContent=String(o),We.isHidden(t.actionDialog)&&this.showRequestedAction(e.uniqueID)}}}},{key:"blinkAction",value:function(){We.blink(this.page.actionDialog),We.blink(this.page.actionDialogCollapsed)}},{key:"resolveAction",value:function(e){this.resolveActionWithID(e.uniqueID)}},{key:"resolveActionWithID",value:function(e){var t=this.page,n=this.requiredActions,r=n[e];if(r){delete n[e];var a=Object.keys(n).length;r.div.remove(),0!==a?(t.actionDialogCount.textContent=String(a),t.actionCount.textContent=String(a),r.selected&&this.showOldestAction()):We.hide(t.actionDialog,t.actionDialogCollapsed)}}},{key:"actionForm",value:function(e){switch(e.actionID){case"tooCheap":return this.tooCheapAction(e);case"missingNonces":return this.missingNoncesAction(e);case"lostNonce":return this.lostNonceAction(e);case"redeemRejected":return this.redeemRejectedAction(e)}throw Error("unknown required action ID "+e.actionID)}},{key:"actionTxTable",value:function(e){var t=e.assetID,n=e.payload,r=this.assets[t],a=r.unitInfo,o=r.token,s=this.page.actionTxTableTmpl.cloneNode(!0),i=We.parseTemplate(s);i.lostTxID.textContent=n.tx.id,i.lostTxID.dataset.explorerCoin=n.tx.id,Mn(o?o.parentID:t,i.lostTxID),i.txAmt.textContent=We.formatCoinValue(n.tx.amount,a),i.amtUnit.textContent=a.conventional.unit;var c=o?this.unitInfo(o.parentID):a;return i.type.textContent=ea(n.tx.type),i.feeAmount.textContent=We.formatCoinValue(n.tx.fees,c),i.feeUnit.textContent=c.conventional.unit,"tooCheap"===e.actionID&&(We.show(i.newFeesRow),i.newFees.textContent=We.formatCoinValue(n.tx.fees,c),i.newFeesUnit.textContent=c.conventional.unit),s}},{key:"submitAction",value:(p=s(f().mark((function e(t,n,r){var a,o;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return We.hide(r),a=this.loading(this.page.actionDialog),e.next=4,S("/api/takeaction",{assetID:t.assetID,actionID:t.actionID,action:n});case 4:if(o=e.sent,a(),this.checkResponse(o)){e.next=10;break}return r.textContent=o.msg,We.show(r),e.abrupt("return");case 10:this.resolveActionWithID(t.uniqueID);case 11:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return p.apply(this,arguments)})},{key:"missingNoncesAction",value:function(e){var t=this,n=e.assetID,r=this.page.missingNoncesTmpl.cloneNode(!0),a=We.parseTemplate(r),o=this.assets[n].name;return a.assetName.textContent=o,We.bind(a.doNothingBttn,"click",(function(){t.submitAction(e,{recover:!1},a.errMsg)})),We.bind(a.recoverBttn,"click",(function(){t.submitAction(e,{recover:!0},a.errMsg)})),r}},{key:"tooCheapAction",value:function(e){var t=this,n=e.assetID,r=e.payload,a=this.page.tooCheapTmpl.cloneNode(!0),o=We.parseTemplate(a),s=this.assets[n].name;o.assetName.textContent=s,o.txTable.appendChild(this.actionTxTable(e));var i=function(n){t.submitAction(e,{txID:r.tx.id,bump:n},o.errMsg)};return We.bind(o.keepWaitingBttn,"click",(function(){return i(!1)})),We.bind(o.addFeesBttn,"click",(function(){return i(!0)})),a}},{key:"lostNonceAction",value:function(e){var t=this,n=e.assetID,r=e.payload,a=this.page.lostNonceTmpl.cloneNode(!0),o=We.parseTemplate(a),s=this.assets[n].name;return o.assetName.textContent=s,o.nonce.textContent=String(r.nonce),o.txTable.appendChild(this.actionTxTable(e)),We.bind(o.abandonBttn,"click",(function(){t.submitAction(e,{txID:r.tx.id,abandon:!0},o.errMsg)})),We.bind(o.keepWaitingBttn,"click",(function(){t.submitAction(e,{txID:r.tx.id,abandon:!1},o.errMsg)})),We.bind(o.replaceBttn,"click",(function(){var n=o.idInput.value;if(!n)return o.idInput.focus(),void We.blink(o.idInput);t.submitAction(e,{txID:r.tx.id,abandon:!1,replacementID:n},o.errMsg)})),a}},{key:"redeemRejectedAction",value:function(e){var t=this,n=e.payload,r=n.orderID,a=n.coinID,o=n.coinFmt,s=n.assetID,i=this.page.rejectedRedemptionTmpl.cloneNode(!0),c=We.parseTemplate(i),l=this.assets[s],u=l.name,d=l.token;return c.assetName.textContent=u,c.txid.textContent=o,c.txid.dataset.explorerCoin=a,Mn(d?d.parentID:s,c.txid),We.bind(c.doNothingBttn,"click",(function(){t.submitAction(e,{orderID:r,coinID:a,retry:!1},c.errMsg)})),We.bind(c.tryAgainBttn,"click",(function(){t.submitAction(e,{orderID:r,coinID:a,retry:!0},c.errMsg)})),i}},{key:"showRequestedAction",value:function(e){var t=this.page,n=this.requiredActions;We.hide(t.actionDialogCollapsed);for(var r=0,a=Object.values(n);r<a.length;r++){var o=a[r];o.selected=o.uniqueID===e}We.empty(t.actionDialogContent);var s=n[e];t.actionDialogContent.appendChild(s.div),We.show(t.actionDialog);var i=this.sortedActions();if(1!==i.length){We.show(t.actionsNavigator);var c=i.indexOf(s);t.currentAction.textContent=String(c+1),t.prevAction.classList.toggle("invisible",0===c),t.nextAction.classList.toggle("invisible",c===i.length-1)}else We.hide(t.actionsNavigator)}},{key:"updateMarketElements",value:function(e,t,n,r){var a,o=this,s=function(e){var t=o.assets[e];if(t)return t;if(!r)throw Error("no asset found for asset ID ".concat(e));var n=r.assets[e];return{unitInfo:n.unitInfo,name:n.symbol,symbol:n.symbol}},i=s(t),c=i.unitInfo,l=i.name,u=i.symbol,d=Ss(We.applySelector(e,"[data-base-name"));try{for(d.s();!(a=d.n()).done;)a.value.textContent=l}catch(e){d.e(e)}finally{d.f()}var h,p=Ss(We.applySelector(e,"[data-base-logo]"));try{for(p.s();!(h=p.n()).done;)h.value.src=We.logoPath(u)}catch(e){p.e(e)}finally{p.f()}var f,v=Ss(We.applySelector(e,"[data-base-ticker]"));try{for(v.s();!(f=v.n()).done;)f.value.textContent=c.conventional.unit}catch(e){v.e(e)}finally{v.f()}var m,g=s(n),y=g.unitInfo,x=g.name,b=g.symbol,k=Ss(We.applySelector(e,"[data-quote-name"));try{for(k.s();!(m=k.n()).done;)m.value.textContent=x}catch(e){k.e(e)}finally{k.f()}var w,C=Ss(We.applySelector(e,"[data-quote-logo]"));try{for(C.s();!(w=C.n()).done;)w.value.src=We.logoPath(b)}catch(e){C.e(e)}finally{C.f()}var S,F=Ss(We.applySelector(e,"[data-quote-ticker]"));try{for(F.s();!(S=F.n()).done;)S.value.textContent=y.conventional.unit}catch(e){F.e(e)}finally{F.f()}}},{key:"setLanguage",value:(u=s(f().mark((function e(t){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/setlocale",t);case 2:window.location.reload();case 3:case"end":return e.stop()}}),e)}))),function(e){return u.apply(this,arguments)})},{key:"showDropdown",value:function(e,t){var n=this;if(We.hide(this.page.noteBox,this.page.profileBox),We.show(t),window.innerWidth<500)Object.assign(t.style,{left:"0",right:"0",top:"0"});else{var r=e.getBoundingClientRect(),a="".concat(window.innerWidth-r.left-r.width+5,"px");Object.assign(t.style,{left:"auto",right:a,top:"".concat(r.top-4,"px")})}Ds(document,"click",(function e(r){We.mouseInElement(r,t)||(We.hide(t),Is(document,"click",e),t===n.page.noteBox&&We.isDisplayed(n.page.noteList)&&n.ackNotes())}))}},{key:"ackNotes",value:function(){var e,t=[],n=Ss(this.notes);try{for(n.s();!(e=n.n()).done;){var r=e.value;r.acked?r.el.classList.remove("firstview"):(r.acked=!0,r.id&&r.severity>2&&t.push(r.id))}}catch(e){n.e(e)}finally{n.f()}t.length&&La.request("acknotes",t),We.hide(this.page.noteIndicator)}},{key:"setNoteTimes",value:function(e){for(var t=0,n=Array.from(e.children);t<n.length;t++){var r=n[t];We.safeSelector(r,"span.note-time").textContent=We.timeSince(r.note.stamp)}}},{key:"bindInternalNavigation",value:function(e){var t=this,n=new URL(window.location.href);e.querySelectorAll("a").forEach((function(e){if(e.href){var r=new URL(e.href);if(r.origin===n.origin){var a=r.pathname.substring(1),o={};r.search&&r.searchParams.forEach((function(e,t){o[t]=e})),We.bind(e,"click",(function(e){e.preventDefault(),t.loadPage(a,o)}))}}}))}},{key:"updateMenuItemsDisplay",value:function(){var e=this.page,t=this.authed,n=this.mmStatus;if(e){if(!t)return e.profileBox.classList.remove("authed"),void We.hide(e.noteBell,e.walletsMenuEntry,e.marketsMenuEntry);We.setVis(Object.keys(this.exchanges).length>0,e.marketsMenuEntry,e.mmLink),e.profileBox.classList.add("authed"),We.show(e.noteBell,e.walletsMenuEntry,e.marketsMenuEntry),We.setVis(n,e.mmLink)}}},{key:"fetchNotes",value:(l=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T("/api/notes");case 2:if(t=e.sent,this.checkResponse(t)){e.next=5;break}return e.abrupt("return",console.error("failed to fetch notes:",(null==t?void 0:t.msg)||String(t)));case 5:t.notes.reverse(),this.setNotes(t.notes),this.setPokes(t.pokes),this.setRequiredActions();case 9:case"end":return e.stop()}}),e,this)}))),function(){return l.apply(this,arguments)})},{key:"attachCommon",value:function(e){this.bindInternalNavigation(e)}},{key:"updateBondConfs",value:function(e,t,n){var r,a=Ss(this.exchanges[e].auth.pendingBonds);try{for(a.s();!(r=a.n()).done;){var o=r.value;o.coinID===t&&(o.confs=n)}}catch(e){a.e(e)}finally{a.f()}}},{key:"updateTier",value:function(e,t){this.exchanges[e].auth.rep.bondedTier=t}},{key:"handleBondNote",value:function(e){switch(e.auth&&(this.exchanges[e.dex].auth=e.auth),e.topic){case"RegUpdate":null!==e.coinID&&this.updateBondConfs(e.dex,e.coinID,e.confirmations);break;case"BondConfirmed":null!==e.tier&&this.updateTier(e.dex,e.tier)}}},{key:"handleTransactionNote",value:function(e,t){var n=this.txHistoryMap[e];if(n)if(t.new)n.txs.unshift(t.transaction);else for(var r=0;r<n.txs.length;r++)if(n.txs[r].id===t.transaction.id){n.txs[r]=t.transaction;break}}},{key:"handleTxHistorySyncedNote",value:function(e){delete this.txHistoryMap[e]}},{key:"loggedIn",value:function(e,t){this.setNotes(e),this.setPokes(t),this.setRequiredActions()}},{key:"setNotes",value:function(e){this.log("notes","setNotes",e),this.notes=[],We.empty(this.page.noteList);for(var t=0;t<e.length;t++)this.prependNoteElement(e[t])}},{key:"setPokes",value:function(e){this.log("pokes","setPokes",e),this.pokes=[],We.empty(this.page.pokeList);for(var t=0;t<e.length;t++)this.prependPokeElement(e[t])}},{key:"botStatus",value:function(e,t,n){var r,a,o,s=Ss(null!==(r=null===(a=this.mmStatus)||void 0===a?void 0:a.bots)&&void 0!==r?r:[]);try{for(s.s();!(o=s.n()).done;){var i=o.value,c=i.config;if(e===c.host&&t===c.baseID&&n===c.quoteID)return i}}catch(e){s.e(e)}finally{s.f()}}},{key:"updateUser",value:function(e){var t=this.user,n=this.assets,r=this.walletMap;if("fiatrateupdate"!==e.type){if(t)switch(e.type){case"order":var o=e,s=o.order,i=t.exchanges[s.host].markets[s.market],c=o.tempID;if("AsyncOrderSubmitted"===e.topic){var l=s;l.tempID=c,i.inflight?i.inflight.push(l):i.inflight=[l];break}if("AsyncOrderFailure"===e.topic){i.inflight=i.inflight.filter((function(e){return e.tempID!==c}));break}for(var u in i.inflight||[])if(i.inflight[u].tempID===c){i.inflight=i.inflight.filter((function(e){return e.tempID!==c}));break}i.orders=i.orders||[],function(t,n){var r=t.orders.findIndex((function(e){return e.id===n.id}));return-1!==r&&("OrderRetired"===e.topic?t.orders.splice(r,1):t.orders[r]=n,!0)}(i,s)||i.orders.push(s);break;case"balance":var d=e,h=t.assets[d.assetID];if(!h)break;var p=h.wallet;p&&(p.balance=d.balance);break;case"bondpost":this.handleBondNote(e);break;case"reputation":var f=e;this.exchanges[f.host].auth.rep=f.rep;break;case"walletstate":case"walletconfig":if(!n)return;var v=null==e?void 0:e.wallet;if(!v)return;n[v.assetID].wallet=v,r[v.assetID]=v;break;case"walletsync":var m=e,g=this.walletMap[m.assetID];g&&(g.syncStatus=m.syncStatus,g.synced=g.syncStatus.synced,g.syncProgress=m.syncProgress);break;case"match":var y=e,x=this.order(y.orderID);x&&function(e,t){for(var n in e.matches)if(e.matches[n].matchID===t.matchID)return void(e.matches[n]=t);e.matches=e.matches||[],e.matches.push(t)}(x,y.match);break;case"conn":var b=e,k=t.exchanges[b.host];k&&(k.connectionStatus=b.connectionStatus);break;case"spots":var w=e,C=t.exchanges[w.host];if(!C||!C.markets)break;for(var S=0,F=Object.entries(w.spots);S<F.length;S++){var T=a(F[S],2),D=T[0],I=T[1];C.markets[D].spot=I}break;case"fiatrateupdate":this.fiatRatesMap=e.fiatRates;break;case"actionrequired":var A=e;this.addAction(A.payload);break;case"walletnote":var R=e;switch(R.payload.route){case"transaction":var E=R.payload;this.handleTransactionNote(R.payload.assetID,E);break;case"actionRequired":var B=R.payload;this.addAction(B),this.blinkAction();break;case"actionResolved":this.resolveAction(R.payload)}"transactionHistorySynced"===R.payload.route&&this.handleTxHistorySyncedNote(R.payload.assetID);break;case"runstats":this.log("mm",{runstats:e});var P=e,L=this.botStatus(P.host,P.baseID,P.quoteID);L&&(L.runStats=P.stats,L.running=Boolean(P.stats),P.stats||(L.latestEpoch=void 0,L.cexProblems=void 0));break;case"cexnote":var O=e;if("BalanceUpdate"===O.topic){var M=O.note;this.mmStatus.cexes[O.cexName].balances[M.assetID]=M.balance}break;case"epochreport":var q=e,N=this.botStatus(q.host,q.baseID,q.quoteID);N&&(N.latestEpoch=q.report);break;case"cexproblems":var W=e,V=this.botStatus(W.host,W.baseID,W.quoteID);V&&(V.cexProblems=W.problems)}}else this.fiatRatesMap=e.fiatRates}},{key:"notify",value:function(e){this.log("notes","notify",e),this.updateUser(e);var t,n=Ss(this.noteReceivers);try{for(n.s();!(t=n.n()).done;){var r=t.value[e.type];if(r)try{r(e)}catch(t){console.error("note feeder error:",t.message?t.message:t),console.log(e),console.log(t.stack)}}}catch(e){n.e(e)}finally{n.f()}if(!(e.severity<2)){var a=this.popupTmpl,o=this.popupNotes;if(this.showPopups){var i=a.cloneNode(!0);We.tmplElement(i,"text").textContent="".concat(e.subject,": ").concat(Fa(e.details));var c=We.tmplElement(i,"indicator");for(2===e.severity?We.hide(c):Os(c,e.severity),o.appendChild(i),We.show(o);o.children.length>5;)o.removeChild(o.firstChild);setTimeout(s(f().mark((function e(){return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,We.animate(500,(function(e){i.style.opacity=String(1-e)}));case 2:i.remove(),0===o.children.length&&We.hide(o);case 4:case"end":return e.stop()}}),e)}))),6e3)}2===e.severity?this.prependPokeElement(e):this.prependNoteElement(e),function(e){ba.apply(this,arguments)}(e)}}},{key:"registerNoteFeeder",value:function(e){this.noteReceivers.push(e)}},{key:"log",value:function(e){for(var t,n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];this.loggers[e]&&(t=console).log.apply(t,["".concat(Ls(),"[").concat(e,"]:")].concat(r)),this.recorders[e]&&this.recorders[e].push({time:Ls(),msg:r})}},{key:"prependPokeElement",value:function(e){var t=a(this.makePoke(e),2),n=t[0],r=t[1];for(this.pokes.push(r);this.pokes.length>100;)this.pokes.shift();this.prependListElement(this.page.pokeList,r,n)}},{key:"prependNoteElement",value:function(e){var t=a(this.makeNote(e),2),n=t[0],r=t[1];for(this.notes.push(r);this.notes.length>100;)this.notes.shift();var o=this.page.noteList;if(this.prependListElement(o,r,n),this.bindUrlHandlers(n),!(0===this.notes.length||We.isDisplayed(this.page.noteBox)&&We.isDisplayed(o))){var s=0,i=this.notes.reduce((function(e,t){return t.acked||s++,!t.acked&&t.severity>e?t.severity:e}),0),c=this.page.noteIndicator;Os(c,i),s?(c.textContent=String(s>99?"".concat(99,"+"):s),We.show(c)):We.hide(c)}}},{key:"prependListElement",value:function(e,t,n){for(n.note=t,e.prepend(n);e.children.length>100;)e.removeChild(e.lastChild);this.setNoteTimes(e)}},{key:"makeNote",value:function(e){var t=this.page.noteTmpl.cloneNode(!0);if(e.severity>2){var n=3===e.severity?"good":4===e.severity?"warn":"bad";We.safeSelector(t,"div.note-indicator").classList.add(n)}return We.safeSelector(t,"div.note-subject").textContent=e.subject,Sa(We.safeSelector(t,"div.note-details"),e.details),[t,Cs({el:t},e)]}},{key:"makePoke",value:function(e){var t=this.page.pokeTmpl.cloneNode(!0);return We.tmplElement(t,"subject").textContent="".concat(e.subject,":"),Sa(We.tmplElement(t,"details"),e.details),[t,Cs({el:t},e)]}},{key:"loading",value:function(e){var t=this.page.loader.cloneNode(!0);return e.appendChild(t),function(){t.remove()}}},{key:"orders",value:function(e,t){var n=[],r=this.user.exchanges[e].markets[t];return r.orders&&(n=n.concat(r.orders)),r.inflight&&(n=n.concat(r.inflight)),n}},{key:"haveActiveOrders",value:function(e){for(var t=0,n=Object.values(this.user.exchanges);t<n.length;t++){var r=n[t];if(r.markets)for(var a=0,o=Object.values(r.markets);a<o.length;a++){var s=o[a];if(s.orders){var i,c=Ss(s.orders);try{for(c.s();!(i=c.n()).done;){var l=i.value;if((l.baseID===e||l.quoteID===e)&&(l.status<3||Et(l)))return!0}}catch(e){c.e(e)}finally{c.f()}}}}return!1}},{key:"order",value:function(e){for(var t=0,n=Object.values(this.user.exchanges);t<n.length;t++){var r=n[t];if(r&&r.markets)for(var a=0,o=Object.values(r.markets);a<o.length;a++){var s=o[a];if(s.orders){var i,c=Ss(s.orders);try{for(c.s();!(i=c.n()).done;){var l=i.value;if(l.id===e)return l}}catch(e){c.e(e)}finally{c.f()}}}}return null}},{key:"canAccelerateOrder",value:function(e){var t;t=e.sell?e.baseID:e.quoteID;var n=this.walletMap[t];if(!(n&&16&n.traits))return!1;if(e.matches)for(var r=0;r<(null===(a=e.matches)||void 0===a?void 0:a.length);r++){var a,o=e.matches[r];if(o.swap&&o.swap.confs&&0===o.swap.confs.count&&!o.revoked)return!0}return!1}},{key:"unitInfo",value:function(e,t){var n=this.assets[e];if(n)return n.unitInfo;if(!t||!t.assets)throw Error(ke("UNSUPPORTED_ASSET_INFO_ERR_MSG",{assetID:"".concat(e)}));return t.assets[e].unitInfo}},{key:"parentAsset",value:function(e){var t=this.assets[e];return t.token?this.assets[t.token.parentID]:t}},{key:"baseChainSymbol",value:function(e){var t=this.user.assets[e];return t.token?this.user.assets[t.token.parentID].symbol:t.symbol}},{key:"extensionWallet",value:function(e){var t;return null===(t=this.user.extensionModeConfig)||void 0===t?void 0:t.restrictedWallets[this.baseChainSymbol(e)]}},{key:"conventionalRate",value:function(e,t,n,r){var a=[this.unitInfo(e,r),this.unitInfo(t,r)],o=a[1];return n*(a[0].conventional.conversionFactor/o.conventional.conversionFactor)/Dt}},{key:"walletDefinition",value:function(e,t){var n=this.assets[e];if(n.token)return n.token.definition;if(!n.info)throw Error("where's the wallet info?");return""===t?n.info.availablewallets[n.info.emptyidx]:n.info.availablewallets.filter((function(e){return e.type===t}))[0]}},{key:"currentWalletDefinition",value:function(e){var t=this.assets[e];return t.token?t.token.definition:this.walletDefinition(e,this.assets[e].wallet.type)}},{key:"fetchBalance",value:(c=s(f().mark((function e(t){var n;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/balance",{assetID:t});case 2:if(n=e.sent,this.checkResponse(n)){e.next=5;break}throw new Error("failed to fetch balance for asset ID ".concat(t));case 5:return e.abrupt("return",n.balance);case 6:case"end":return e.stop()}}),e,this)}))),function(e){return c.apply(this,arguments)})},{key:"checkResponse",value:function(e){return e.requestSuccessful&&e.ok}},{key:"signOut",value:(o=s(f().mark((function e(){var t;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,S("/api/logout");case 2:if(t=e.sent,this.checkResponse(t)){e.next=7;break}return t.code===A.activeOrdersErr?this.page.logoutErr.textContent=ke("ACTIVE_ORDERS_LOGOUT_ERR_MSG"):this.page.logoutErr.textContent=t.msg,We.show(this.page.logoutErr),e.abrupt("return");case 7:k.removeCookie(k.authCK),k.removeCookie(k.pwKeyCK),k.removeLocal(k.notificationsLK),window.location.href="/login";case 11:case"end":return e.stop()}}),e,this)}))),function(){return o.apply(this,arguments)})},{key:"txHistory",value:(n=s(f().mark((function e(t,n,a){var o,s,i,c,l,u,d,h,p,v,m,g;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(o="/api/txhistory",s=this.txHistoryMap[t]){e.next=12;break}return e.next=5,S(o,{n,assetID:t});case 5:if(i=e.sent,this.checkResponse(i)){e.next=8;break}throw new Error(i.msg);case 8:return(c=i.txs)||(c=[]),this.txHistoryMap[t]={txs:c,lastTx:c.length<n},e.abrupt("return",this.txHistoryMap[t]);case 12:if(l=[],u=!1,d=a?s.txs.findIndex((function(e){return e.id===a}))+1:0,!a||-1!==d){e.next=17;break}throw new Error("invalid after tx "+a);case 17:for(h=d,p=d;p<s.txs.length&&l.length<n;p++)l.push(s.txs[p]),h=p,a=s.txs[p].id;if(s.lastTx&&h===s.txs.length-1&&(u=!0),!(l.length<n)||s.lastTx){e.next=33;break}return e.next=23,S(o,{n:n-l.length+1,assetID:t,refID:a,past:!0});case 23:if(m=e.sent,this.checkResponse(m)){e.next=26;break}throw new Error(m.msg);case 26:(g=m.txs)||(g=[]),g.length>0&&a&&(g[0].id===a?g.shift():console.error("First tx history element != refID")),s.lastTx=g.length<n-l.length,u=s.lastTx,l.push.apply(l,r(g)),(v=s.txs).push.apply(v,r(g));case 33:return e.abrupt("return",{txs:l,lastTx:u});case 34:case"end":return e.stop()}}),e,this)}))),function(e,t,r){return n.apply(this,arguments)})},{key:"getWalletTx",value:function(e,t){var n=this.txHistoryMap[e];if(n)return n.txs.find((function(e){return e.id===t}))}},{key:"clearTxHistory",value:function(e){delete this.txHistoryMap[e]}},{key:"needsCustomProvider",value:(t=s(f().mark((function e(t){var n,r,a,o,s,i,c;return f().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(o=null!==(n=null===(r=this.assets[t])||void 0===r||null===(a=r.token)||void 0===a?void 0:a.parentID)&&void 0!==n?n:t){e.next=3;break}return e.abrupt("return",!1);case 3:if(s=this.walletMap[o]){e.next=6;break}return e.abrupt("return",!1);case 6:if(16384&s.traits){e.next=9;break}return e.abrupt("return",!1);case 9:return e.next=11,S("/api/walletsettings",{assetID:o});case 11:if(i=e.sent,this.checkResponse(i)){e.next=15;break}return console.error(i.msg),e.abrupt("return",!1);case 15:return c=i.map,e.abrupt("return",!c.providers);case 17:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})}]),e}(),Bs=(h(ms={},3,"good"),h(ms,5,"bad"),h(ms,4,"warn"),ms);function Ps(e){return e.replace(/^\//,"").split("/")[0].split("?")[0].split("#")[0]}function Ls(){var e=new Date,t=e.getHours().toString().padStart(2,"0"),n=e.getMinutes().toString().padStart(2,"0"),r=e.getSeconds().toString().padStart(2,"0"),a=e.getMilliseconds().toString().padStart(3,"0");return"".concat(t,":").concat(n,":").concat(r,".").concat(a)}function Os(e,t){e.classList.remove("bad","warn","good"),e.classList.add(Bs[t])}var Ms=new Es;st=Ms,Ms.start()})()})(); //# sourceMappingURL=entry.js.map \ No newline at end of file diff --git a/client/webserver/site/dist/entry.js.map b/client/webserver/site/dist/entry.js.map index d5509f7853..8add854712 100644 --- a/client/webserver/site/dist/entry.js.map +++ b/client/webserver/site/dist/entry.js.map @@ -1 +1 @@ -{"version":3,"file":"entry.js","mappings":"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","sources":["webpack://bisonw/./node_modules/@babel/runtime/helpers/regeneratorRuntime.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/typeof.js","webpack://bisonw/./node_modules/@babel/runtime/regenerator/index.js","webpack://bisonw/webpack/bootstrap","webpack://bisonw/webpack/runtime/compat get default export","webpack://bisonw/webpack/runtime/define property getters","webpack://bisonw/webpack/runtime/hasOwnProperty shorthand","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://bisonw/./src/js/state.ts","webpack://bisonw/./src/js/http.ts","webpack://bisonw/./src/js/locales.ts","webpack://bisonw/./src/js/doc.ts","webpack://bisonw/./src/js/registry.ts","webpack://bisonw/./src/js/opts.ts","webpack://bisonw/./src/js/basepage.ts","webpack://bisonw/./src/js/orderutil.ts","webpack://bisonw/./src/js/charts.ts","webpack://bisonw/./src/js/account.ts","webpack://bisonw/./src/js/coinexplorers.ts","webpack://bisonw/./src/js/mmutil.ts","webpack://bisonw/./src/js/forms.ts","webpack://bisonw/./src/js/register.ts","webpack://bisonw/./src/js/login.ts","webpack://bisonw/./src/js/wallets.ts","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://bisonw/./src/js/notifications.ts","webpack://bisonw/./src/js/settings.ts","webpack://bisonw/./src/js/orderbook.ts","webpack://bisonw/./src/js/ws.ts","webpack://bisonw/./src/js/markets.ts","webpack://bisonw/./src/js/orders.ts","webpack://bisonw/./src/js/order.ts","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/get.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/superPropBase.js","webpack://bisonw/./src/js/mm.ts","webpack://bisonw/./src/js/mmsettings.ts","webpack://bisonw/./src/js/dexsettings.ts","webpack://bisonw/./src/js/mmarchives.ts","webpack://bisonw/./src/js/mmlogs.ts","webpack://bisonw/./src/js/init.ts","webpack://bisonw/./src/js/app.ts","webpack://bisonw/./src/index.ts"],"sourcesContent":["var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorRuntime() {\n \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n return exports;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n var exports = {},\n Op = Object.prototype,\n hasOwn = Op.hasOwnProperty,\n defineProperty = Object.defineProperty || function (obj, key, desc) {\n obj[key] = desc.value;\n },\n $Symbol = \"function\" == typeof Symbol ? Symbol : {},\n iteratorSymbol = $Symbol.iterator || \"@@iterator\",\n asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\",\n toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n function define(obj, key, value) {\n return Object.defineProperty(obj, key, {\n value: value,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }), obj[key];\n }\n try {\n define({}, \"\");\n } catch (err) {\n define = function define(obj, key, value) {\n return obj[key] = value;\n };\n }\n function wrap(innerFn, outerFn, self, tryLocsList) {\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,\n generator = Object.create(protoGenerator.prototype),\n context = new Context(tryLocsList || []);\n return defineProperty(generator, \"_invoke\", {\n value: makeInvokeMethod(innerFn, self, context)\n }), generator;\n }\n function tryCatch(fn, obj, arg) {\n try {\n return {\n type: \"normal\",\n arg: fn.call(obj, arg)\n };\n } catch (err) {\n return {\n type: \"throw\",\n arg: err\n };\n }\n }\n exports.wrap = wrap;\n var ContinueSentinel = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n var getProto = Object.getPrototypeOf,\n NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);\n var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function (method) {\n define(prototype, method, function (arg) {\n return this._invoke(method, arg);\n });\n });\n }\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (\"throw\" !== record.type) {\n var result = record.arg,\n value = result.value;\n return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) {\n invoke(\"next\", value, resolve, reject);\n }, function (err) {\n invoke(\"throw\", err, resolve, reject);\n }) : PromiseImpl.resolve(value).then(function (unwrapped) {\n result.value = unwrapped, resolve(result);\n }, function (error) {\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n reject(record.arg);\n }\n var previousPromise;\n defineProperty(this, \"_invoke\", {\n value: function value(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function (resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n }\n });\n }\n function makeInvokeMethod(innerFn, self, context) {\n var state = \"suspendedStart\";\n return function (method, arg) {\n if (\"executing\" === state) throw new Error(\"Generator is already running\");\n if (\"completed\" === state) {\n if (\"throw\" === method) throw arg;\n return doneResult();\n }\n for (context.method = method, context.arg = arg;;) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) {\n if (\"suspendedStart\" === state) throw state = \"completed\", context.arg;\n context.dispatchException(context.arg);\n } else \"return\" === context.method && context.abrupt(\"return\", context.arg);\n state = \"executing\";\n var record = tryCatch(innerFn, self, context);\n if (\"normal\" === record.type) {\n if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue;\n return {\n value: record.arg,\n done: context.done\n };\n }\n \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg);\n }\n };\n }\n function maybeInvokeDelegate(delegate, context) {\n var methodName = context.method,\n method = delegate.iterator[methodName];\n if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel;\n var record = tryCatch(method, delegate.iterator, context.arg);\n if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel;\n var info = record.arg;\n return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel);\n }\n function pushTryEntry(locs) {\n var entry = {\n tryLoc: locs[0]\n };\n 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);\n }\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\", delete record.arg, entry.completion = record;\n }\n function Context(tryLocsList) {\n this.tryEntries = [{\n tryLoc: \"root\"\n }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);\n }\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) return iteratorMethod.call(iterable);\n if (\"function\" == typeof iterable.next) return iterable;\n if (!isNaN(iterable.length)) {\n var i = -1,\n next = function next() {\n for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;\n return next.value = undefined, next.done = !0, next;\n };\n return next.next = next;\n }\n }\n return {\n next: doneResult\n };\n }\n function doneResult() {\n return {\n value: undefined,\n done: !0\n };\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", {\n value: GeneratorFunctionPrototype,\n configurable: !0\n }), defineProperty(GeneratorFunctionPrototype, \"constructor\", {\n value: GeneratorFunction,\n configurable: !0\n }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) {\n var ctor = \"function\" == typeof genFun && genFun.constructor;\n return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name));\n }, exports.mark = function (genFun) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun;\n }, exports.awrap = function (arg) {\n return {\n __await: arg\n };\n }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n void 0 === PromiseImpl && (PromiseImpl = Promise);\n var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {\n return result.done ? result.value : iter.next();\n });\n }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () {\n return this;\n }), define(Gp, \"toString\", function () {\n return \"[object Generator]\";\n }), exports.keys = function (val) {\n var object = Object(val),\n keys = [];\n for (var key in object) keys.push(key);\n return keys.reverse(), function next() {\n for (; keys.length;) {\n var key = keys.pop();\n if (key in object) return next.value = key, next.done = !1, next;\n }\n return next.done = !0, next;\n };\n }, exports.values = values, Context.prototype = {\n constructor: Context,\n reset: function reset(skipTempReset) {\n if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);\n },\n stop: function stop() {\n this.done = !0;\n var rootRecord = this.tryEntries[0].completion;\n if (\"throw\" === rootRecord.type) throw rootRecord.arg;\n return this.rval;\n },\n dispatchException: function dispatchException(exception) {\n if (this.done) throw exception;\n var context = this;\n function handle(loc, caught) {\n return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught;\n }\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i],\n record = entry.completion;\n if (\"root\" === entry.tryLoc) return handle(\"end\");\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\"),\n hasFinally = hasOwn.call(entry, \"finallyLoc\");\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n } else {\n if (!hasFinally) throw new Error(\"try statement without catch or finally\");\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n }\n }\n }\n },\n abrupt: function abrupt(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);\n var record = finallyEntry ? finallyEntry.completion : {};\n return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);\n },\n complete: function complete(record, afterLoc) {\n if (\"throw\" === record.type) throw record.arg;\n return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;\n },\n finish: function finish(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;\n }\n },\n \"catch\": function _catch(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (\"throw\" === record.type) {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n throw new Error(\"illegal catch attempt\");\n },\n delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n return this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel;\n }\n }, exports;\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(obj);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// TODO(Babel 8): Remove this file.\n\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (null != _i) {\n var _s,\n _e,\n _x,\n _r,\n _arr = [],\n _n = !0,\n _d = !1;\n try {\n if (_x = (_i = _i.call(arr)).next, 0 === i) {\n if (Object(_i) !== _i) return;\n _n = !1;\n } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0);\n } catch (err) {\n _d = !0, _e = err;\n } finally {\n try {\n if (!_n && null != _i[\"return\"] && (_r = _i[\"return\"](), Object(_r) !== _r)) return;\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n }\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n Object.defineProperty(subClass, \"prototype\", {\n writable: false\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n return assertThisInitialized(self);\n}","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","// State is a set of static methods for working with the user state. It has\n// utilities for setting and retrieving cookies and storing user configuration\n// to localStorage.\nexport default class State {\n // Cookie keys.\n static darkModeLK = 'darkMode'\n static authCK = 'dexauth'\n static pwKeyCK = 'sessionkey'\n // Local storage keys (for data that we don't need at the server).\n static popupsLK = 'popups'\n static loggersLK = 'loggers'\n static recordersLK = 'recorders'\n static lastMarketLK = 'selectedMarket'\n static depthZoomLK = 'depthZoom'\n static lastMMMarketLK = 'mmMarket'\n static optionsExpansionLK = 'mmOptsExpand'\n static leftMarketDockLK = 'leftmarketdock'\n static selectedAssetLK = 'selectedasset'\n static notificationsLK = 'notifications' // DEPRECATED before v1\n static orderDisclaimerAckedLK = 'ordAck'\n static lastCandleDurationLK = 'lastCandleDuration'\n static localeSpecsKey = 'localeSpecsLK'\n static localeKey = 'localeLK'\n\n static setCookie (cname: string, cvalue: string) {\n const d = new Date()\n // Set cookie to expire in ten years.\n d.setTime(d.getTime() + (86400 * 365 * 10 * 1000))\n const expires = 'expires=' + d.toUTCString()\n document.cookie = cname + '=' + cvalue + ';' + expires + ';path=/'\n }\n\n /*\n * getCookie returns the value at the specified cookie name, otherwise null.\n */\n static getCookie (cname: string) {\n for (const cstr of document.cookie.split(';')) {\n const [k, v] = cstr.split('=')\n if (k.trim() === cname) return v\n }\n return null\n }\n\n /*\n * removeCookie tells the browser to stop using cookie. It's not enough to simply\n * erase cookie value because browser will still send it to the server (with empty\n * value), and that's not what server expects.\n */\n static removeCookie (cKey: string) {\n document.cookie = `${cKey}=;expires=Thu, 01 Jan 1970 00:00:01 GMT;`\n }\n\n /*\n * isDark returns true if the dark-mode cookie is currently set to '1' = true.\n */\n static isDark (): boolean {\n return State.fetchLocal(State.darkModeLK) === '1'\n }\n\n /* storeLocal puts the key-value pair into Window.localStorage. */\n static storeLocal (k: string, v: any) {\n window.localStorage.setItem(k, JSON.stringify(v))\n }\n\n /*\n * fetchLocal the value associated with the key in Window.localStorage, or\n * null if the no value exists for the key.\n */\n static fetchLocal (k: string) {\n const v = window.localStorage.getItem(k)\n if (v !== null) {\n return JSON.parse(v)\n }\n return null\n }\n\n /* removeLocal removes the key-value pair from Window.localStorage. */\n static removeLocal (k: string) {\n window.localStorage.removeItem(k)\n }\n}\n\n// Setting defaults here, unless specific cookie (or local storage) value was already chosen by the user.\nif (State.fetchLocal(State.darkModeLK) === null) State.storeLocal(State.darkModeLK, '1')\nif (State.fetchLocal(State.popupsLK) === null) State.storeLocal(State.popupsLK, '1')\nif (State.fetchLocal(State.leftMarketDockLK) === null) State.storeLocal(State.leftMarketDockLK, '1')\n","/*\n * requestJSON encodes the object and sends the JSON to the specified address.\n */\nexport async function requestJSON (method: string, addr: string, reqBody?: any): Promise<any> {\n try {\n const response = await window.fetch(addr, {\n method: method,\n headers: new window.Headers({ 'content-type': 'application/json' }),\n // credentials: \"same-origin\",\n body: reqBody\n })\n if (response.status !== 200) { throw response }\n const obj = await response.json()\n obj.requestSuccessful = true\n return obj\n } catch (response) {\n response.requestSuccessful = false\n response.msg = await response.text()\n return response\n }\n}\n\n/*\n * postJSON sends a POST request with JSON-formatted data and returns the\n * response.\n */\nexport async function postJSON (addr: string, data?: any) {\n return requestJSON('POST', addr, JSON.stringify(data))\n}\n\n/*\n * getJSON sends a GET request and returns the response.\n */\nexport async function getJSON (addr: string): Promise<any> {\n return requestJSON('GET', addr)\n}\n\nexport enum Errors {\n walletErr,\n walletAuthErr,\n walletBalanceErr,\n dupeDEXErr,\n assetSupportErr,\n registerErr,\n signatureErr,\n zeroFeeErr,\n feeMismatchErr,\n feeSendErr,\n passwordErr,\n emptyHostErr,\n connectionErr,\n acctKeyErr,\n unknownOrderErr,\n orderParamsErr,\n dbErr,\n authErr,\n connectWalletErr,\n missingWalletErr,\n encryptionErr,\n decodeErr,\n accountVerificationErr,\n accountProofErr,\n parseKeyErr,\n marketErr,\n addressParseErr,\n addrErr,\n fileReadErr,\n unknownDEXErr,\n accountRetrieveErr,\n accountDisableErr,\n suspendedAcctErr,\n existenceCheckErr,\n createWalletErr,\n activeOrdersErr,\n newAddrErr,\n}\n","import State from './state'\nimport { postJSON } from './http'\n\ntype Locale = Record<string, string>\n\nexport const ID_NO_PASS_ERROR_MSG = 'NO_PASS_ERROR_MSG'\nexport const ID_NO_APP_PASS_ERROR_MSG = 'NO_APP_PASS_ERROR_MSG'\nexport const ID_SET_BUTTON_BUY = 'SET_BUTTON_BUY'\nexport const ID_SET_BUTTON_SELL = 'SET_BUTTON_SELL'\nexport const ID_OFF = 'OFF'\nexport const ID_MAX = 'MAX'\nexport const ID_READY = 'READY'\nexport const ID_NO_WALLET = 'NO_WALLET'\nexport const ID_DISABLED_MSG = 'DISABLED_MSG'\nexport const ID_WALLET_SYNC_PROGRESS = 'WALLET_SYNC_PROGRESS'\nexport const ID_HIDE_ADDITIONAL_SETTINGS = 'HIDE_ADDITIONAL_SETTINGS'\nexport const ID_SHOW_ADDITIONAL_SETTINGS = 'SHOW_ADDITIONAL_SETTINGS'\nexport const ID_BUY = 'BUY'\nexport const ID_SELL = 'SELL'\nexport const ID_NOT_SUPPORTED = 'NOT_SUPPORTED'\nexport const ID_VERSION_NOT_SUPPORTED = 'VERSION_NOT_SUPPORTED'\nexport const ID_CONNECTION_FAILED = 'CONNECTION_FAILED'\nexport const ID_ORDER_PREVIEW = 'ORDER_PREVIEW'\nexport const ID_CALCULATING = 'CALCULATING'\nexport const ID_ESTIMATE_UNAVAILABLE = 'ESTIMATE_UNAVAILABLE'\nexport const ID_NO_ZERO_RATE = 'NO_ZERO_RATE'\nexport const ID_NO_ZERO_QUANTITY = 'NO_ZERO_QUANTITY'\nexport const ID_TRADE = 'TRADE'\nexport const ID_NO_ASSET_WALLET = 'NO_ASSET_WALLET'\nexport const ID_EXECUTED = 'EXECUTED'\nexport const ID_BOOKED = 'BOOKED'\nexport const ID_CANCELING = 'CANCELING'\nexport const ID_PASSWORD_NOT_MATCH = 'PASSWORD_NOT_MATCH'\nexport const ID_ACCT_UNDEFINED = 'ACCT_UNDEFINED'\nexport const ID_KEEP_WALLET_PASS = 'KEEP_WALLET_PASS'\nexport const ID_NEW_WALLET_PASS = 'NEW_WALLET_PASS'\nexport const ID_LOT = 'LOT'\nexport const ID_LOTS = 'LOTS'\nexport const ID_UNKNOWN = 'UNKNOWN'\nexport const ID_EPOCH = 'EPOCH'\nexport const ID_ORDER_SUBMITTING = 'ORDER_SUBMITTING'\nexport const ID_SETTLING = 'SETTLING'\nexport const ID_NO_MATCH = 'NO_MATCH'\nexport const ID_CANCELED = 'CANCELED'\nexport const ID_REVOKED = 'REVOKED'\nexport const ID_WAITING_FOR_CONFS = 'WAITING_FOR_CONFS'\nexport const ID_NONE_SELECTED = 'NONE_SELECTED'\nexport const ID_REGISTRATION_FEE_SUCCESS = 'REGISTRATION_FEE_SUCCESS'\nexport const ID_API_ERROR = 'API_ERROR'\nexport const ID_ADD = 'ADD'\nexport const ID_CREATE = 'CREATE'\nexport const ID_SETUP_WALLET = 'SETUP_WALLET'\nexport const ID_WALLET_READY = 'WALLET_READY'\nexport const ID_CHANGE_WALLET_TYPE = 'CHANGE_WALLET_TYPE'\nexport const ID_KEEP_WALLET_TYPE = 'KEEP_WALLET_TYPE'\nexport const ID_WALLET_PENDING = 'WALLET_PENDING'\nexport const ID_SETUP_NEEDED = 'SETUP_NEEDED'\nexport const ID_SEND_SUCCESS = 'SEND_SUCCESS'\nexport const ID_RECONFIG_SUCCESS = 'RECONFIG_SUCCESS'\nexport const ID_RESCAN_STARTED = 'RESCAN_STARTED'\nexport const ID_NEW_WALLET_SUCCESS = 'NEW_WALLET_SUCCESS'\nexport const ID_WALLET_UNLOCKED = 'WALLET_UNLOCKED'\nexport const ID_SELLING = 'SELLING'\nexport const ID_BUYING = 'BUYING'\nexport const ID_WALLET_DISABLED_MSG = 'WALLET_DISABLED'\nexport const ID_WALLET_ENABLED_MSG = 'WALLET_ENABLED'\nexport const ID_ACTIVE_ORDERS_ERR_MSG = 'ACTIVE_ORDERS_ERR_MSG'\nexport const ID_AVAILABLE = 'AVAILABLE'\nexport const ID_LOCKED = 'LOCKED'\nexport const ID_IMMATURE = 'IMMATURE'\nexport const ID_FEE_BALANCE = 'FEE_BALANCE'\nexport const ID_CANDLES_LOADING = 'CANDLES_LOADING'\nexport const ID_DEPTH_LOADING = 'DEPTH_LOADING'\nexport const ID_INVALID_ADDRESS_MSG = 'INVALID_ADDRESS_MSG'\nexport const ID_TXFEE_UNSUPPORTED = 'TXFEE_UNSUPPORTED'\nexport const ID_TXFEE_ERR_MSG = 'TXFEE_ERR_MSG'\nexport const ID_ACTIVE_ORDERS_LOGOUT_ERR_MSG = 'ACTIVE_ORDERS_LOGOUT_ERR_MSG'\nexport const ID_INVALID_DATE_ERR_MSG = 'INVALID_DATE_ERR_MSG'\nexport const ID_NO_ARCHIVED_RECORDS = 'NO_ARCHIVED_RECORDS'\nexport const ID_DELETE_ARCHIVED_RECORDS_RESULT = 'DELETE_ARCHIVED_RECORDS_RESULT'\nexport const ID_ARCHIVED_RECORDS_PATH = 'ARCHIVED_RECORDS_PATH'\nexport const ID_DEFAULT = 'DEFAULT'\nexport const ID_ADDED = 'ADDED'\nexport const ID_DISCOVERED = 'DISCOVERED'\nexport const ID_UNSUPPORTED_ASSET_INFO_ERR_MSG = 'UNSUPPORTED_ASSET_INFO_ERR_MSG'\nexport const ID_LIMIT_ORDER = 'LIMIT_ORDER'\nexport const ID_LIMIT_ORDER_IMMEDIATE_TIF = 'LIMIT_ORDER_IMMEDIATE_TIF'\nexport const ID_MARKET_ORDER = 'MARKET_ORDER'\nexport const ID_CANCEL_ORDER = 'CANCEL_ORDER'\nexport const ID_MATCH_STATUS_NEWLY_MATCHED = 'MATCH_STATUS_NEWLY_MATCHED'\nexport const ID_MATCH_STATUS_MAKER_SWAP_CAST = 'MATCH_STATUS_MAKER_SWAP_CAST'\nexport const ID_MATCH_STATUS_TAKER_SWAP_CAST = 'MATCH_STATUS_TAKER_SWAP_CAST'\nexport const ID_MATCH_STATUS_MAKER_REDEEMED = 'MATCH_STATUS_MAKER_REDEEMED'\nexport const ID_MATCH_STATUS_REDEMPTION_SENT = 'MATCH_STATUS_REDEMPTION_SENT'\nexport const ID_MATCH_STATUS_REDEMPTION_CONFIRMED = 'MATCH_REDEMPTION_CONFIRMED'\nexport const ID_MATCH_STATUS_REVOKED = 'MATCH_STATUS_REVOKED'\nexport const ID_MATCH_STATUS_REFUNDED = 'MATCH_STATUS_REFUNDED'\nexport const ID_MATCH_STATUS_REFUND_PENDING = 'MATCH_STATUS_REFUND_PENDING'\nexport const ID_MATCH_STATUS_REDEEM_PENDING = 'MATCH_STATUS_REDEEM_PENDING'\nexport const ID_MATCH_STATUS_COMPLETE = 'MATCH_STATUS_COMPLETE'\nexport const ID_TAKER_FOUND_MAKER_REDEMPTION = 'TAKER_FOUND_MAKER_REDEMPTION'\nexport const ID_OPEN_WALLET_ERR_MSG = 'OPEN_WALLET_ERR_MSG'\nexport const ID_ORDER_ACCELERATION_FEE_ERR_MSG = 'ORDER_ACCELERATION_FEE_ERR_MSG'\nexport const ID_ORDER_ACCELERATION_ERR_MSG = 'ORDER_ACCELERATION_ERR_MSG'\nexport const ID_CONNECTED = 'CONNECTED'\nexport const ID_DISCONNECTED = 'DISCONNECTED'\nexport const ID_INVALID_CERTIFICATE = 'INVALID_CERTIFICATE'\nexport const ID_CONFIRMATIONS = 'CONFIRMATIONS'\nexport const ID_TAKER = 'TAKER'\nexport const ID_MAKER = 'MAKER'\nexport const ID_EMPTY_DEX_ADDRESS_MSG = 'EMPTY_DEX_ADDRESS_MSG'\nexport const ID_SELECT_WALLET_FOR_FEE_PAYMENT = 'SELECT_WALLET_FOR_FEE_PAYMENT'\nexport const ID_UNAVAILABLE = 'UNAVAILABLE'\nexport const ID_WALLET_SYNC_FINISHING_UP = 'WALLET_SYNC_FINISHING_UP'\nexport const ID_CONNECT_WALLET_ERR_MSG = 'CONNECTING_WALLET_ERR_MSG'\nexport const ID_REFUND_IMMINENT = 'REFUND_IMMINENT'\nexport const ID_REFUND_WILL_HAPPEN_AFTER = 'REFUND_WILL_HAPPEN_AFTER'\nexport const ID_AVAILABLE_TITLE = 'AVAILABLE_TITLE'\nexport const ID_LOCKED_TITLE = 'LOCKED_TITLE'\nexport const ID_IMMATURE_TITLE = 'IMMATURE_TITLE'\nexport const ID_SWAPPING = 'SWAPPING'\nexport const ID_BONDED = 'BONDED'\nexport const ID_LOCKED_BAL_MSG = 'LOCKED_BAL_MSG'\nexport const ID_IMMATURE_BAL_MSG = 'IMMATURE_BAL_MSG'\nexport const ID_LOCKED_SWAPPING_BAL_MSG = 'LOCKED_SWAPPING_BAL_MSG'\nexport const ID_LOCKED_BOND_BAL_MSG = 'LOCKED_BOND_BAL_MSG'\nexport const ID_RESERVES_DEFICIT = 'RESERVES_DEFICIT'\nexport const ID_RESERVES_DEFICIT_MSG = 'RESERVES_DEFICIT_MSG'\nexport const ID_BOND_RESERVES = 'BOND_RESERVES'\nexport const ID_BOND_RESERVES_MSG = 'BOND_RESERVES_MSG'\nexport const ID_SHIELDED = 'SHIELDED'\nexport const ID_TRANSPARENT = 'TRANSPARENT'\nexport const ID_SHIELDED_MSG = 'SHIELDED_MSG'\nexport const ID_ORDER = 'ORDER'\nexport const ID_LOCKED_ORDER_BAL_MSG = 'LOCKED_ORDER_BAL_MSG'\nexport const ID_CREATING_WALLETS = 'CREATING_WALLETS'\nexport const ID_ADDING_SERVERS = 'ADDING_SERVER'\nexport const ID_WALLET_RECOVERY_SUPPORT_MSG = 'WALLET_RECOVERY_SUPPORT_MSG'\nexport const ID_TICKETS_PURCHASED = 'TICKETS_PURCHASED'\nexport const ID_TICKET_STATUS_UNKNOWN = 'TICKET_STATUS_UNKNOWN'\nexport const ID_TICKET_STATUS_UNMINED = 'TICKET_STATUS_UNMINED'\nexport const ID_TICKET_STATUS_IMMATURE = 'TICKET_STATUS_IMMATURE'\nexport const ID_TICKET_STATUS_LIVE = 'TICKET_STATUS_LIVE'\nexport const ID_TICKET_STATUS_VOTED = 'TICKET_STATUS_VOTED'\nexport const ID_TICKET_STATUS_MISSED = 'TICKET_STATUS_MISSED'\nexport const ID_TICKET_STATUS_EXPIRED = 'TICKET_STATUS_EXPIRED'\nexport const ID_TICKET_STATUS_UNSPENT = 'TICKET_STATUS_UNSPENT'\nexport const ID_TICKET_STATUS_REVOKED = 'TICKET_STATUS_REVOKED'\nexport const ID_PASSWORD_RESET_SUCCESS_MSG = 'PASSWORD_RESET_SUCCESS_MSG'\nexport const ID_BROWSER_NTFN_ENABLED = 'BROWSER_NTFN_ENABLED'\nexport const ID_BROWSER_NTFN_ORDERS = 'BROWSER_NTFN_ORDERS'\nexport const ID_BROWSER_NTFN_MATCHES = 'BROWSER_NTFN_MATCHES'\nexport const ID_BROWSER_NTFN_BONDS = 'BROWSER_NTFN_BONDS'\nexport const ID_BROWSER_NTFN_CONNECTIONS = 'BROWSER_NTFN_CONNECTIONS'\nexport const ID_ORDER_BUTTON_BUY_BALANCE_ERROR = 'ORDER_BUTTON_BUY_BALANCE_ERROR'\nexport const ID_ORDER_BUTTON_SELL_BALANCE_ERROR = 'ORDER_BUTTON_SELL_BALANCE_ERROR'\nexport const ID_ORDER_BUTTON_QTY_ERROR = 'ORDER_BUTTON_QTY_ERROR'\nexport const ID_ORDER_BUTTON_QTY_RATE_ERROR = 'ORDER_BUTTON_QTY_RATE_ERROR'\nexport const ID_CREATE_ASSET_WALLET_MSG = 'CREATE_ASSET_WALLET_MSG'\nexport const ID_NO_WALLET_MSG = 'NO_WALLET_MSG'\nexport const ID_TRADING_TIER_UPDATED = 'TRADING_TIER_UPDATED'\nexport const ID_INVALID_TIER_VALUE = 'INVALID_TIER_VALUE'\nexport const ID_INVALID_COMPS_VALUE = 'INVALID_COMPS_VALUE'\nexport const ID_TX_TYPE_UNKNOWN = 'TX_TYPE_UNKNOWN'\nexport const ID_TX_TYPE_SEND = 'TX_TYPE_SEND'\nexport const ID_TX_TYPE_RECEIVE = 'TX_TYPE_RECEIVE'\nexport const ID_TX_TYPE_SWAP = 'TX_TYPE_SWAP'\nexport const ID_TX_TYPE_REDEEM = 'TX_TYPE_REDEEM'\nexport const ID_TX_TYPE_REFUND = 'TX_TYPE_REFUND'\nexport const ID_TX_TYPE_SPLIT = 'TX_TYPE_SPLIT'\nexport const ID_TX_TYPE_CREATE_BOND = 'TX_TYPE_CREATE_BOND'\nexport const ID_TX_TYPE_REDEEM_BOND = 'TX_TYPE_REDEEM_BOND'\nexport const ID_TX_TYPE_APPROVE_TOKEN = 'TX_TYPE_APPROVE_TOKEN'\nexport const ID_TX_TYPE_ACCELERATION = 'TX_TYPE_ACCELERATION'\nexport const ID_TX_TYPE_SELF_TRANSFER = 'TX_TYPE_SELF_TRANSFER'\nexport const ID_TX_TYPE_REVOKE_TOKEN_APPROVAL = 'TX_TYPE_REVOKE_TOKEN_APPROVAL'\nexport const ID_TX_TYPE_TICKET_PURCHASE = 'TX_TYPE_TICKET_PURCHASE'\nexport const ID_TX_TYPE_TICKET_VOTE = 'TX_TYPE_TICKET_VOTE'\nexport const ID_TX_TYPE_TICKET_REVOCATION = 'TX_TYPE_TICKET_REVOCATION'\nexport const ID_TX_TYPE_SWAP_OR_SEND = 'TX_TYPE_SWAP_OR_SEND'\nexport const ID_TX_TYPE_MIX = 'TX_TYPE_MIX'\nexport const ID_SWAP_OR_SEND_TOOLTIP = 'SWAP_OR_SEND_TOOLTIP'\nexport const ID_MISSING_CEX_CREDS = 'MISSING_CEX_CREDS'\nexport const ID_MATCH_BUFFER = 'MATCH_BUFFER'\nexport const ID_NO_PLACEMENTS = 'NO_PLACEMENTS'\nexport const ID_INVALID_VALUE = 'INVALID_VALUE'\nexport const ID_NO_ZERO = 'NO_ZERO'\nexport const ID_BOTTYPE_BASIC_MM = 'BOTTYPE_BASIC_MM'\nexport const ID_BOTTYPE_ARB_MM = 'BOTTYPE_ARB_MM'\nexport const ID_BOTTYPE_SIMPLE_ARB = 'BOTTYPE_SIMPLE_ARB'\nexport const ID_NO_BOTTYPE = 'NO_BOTTYPE'\nexport const ID_NO_CEX = 'NO_CEX'\nexport const ID_CEXBALANCE_ERR = 'CEXBALANCE_ERR'\nexport const ID_PENDING = 'PENDING'\nexport const ID_COMPLETE = 'COMPLETE'\nexport const ID_ARCHIVED_SETTINGS = 'ARCHIVED_SETTINGS'\nexport const ID_NO_CODE_PROVIDED = 'NO_CODE_PROVIDED'\nexport const ID_ENABLE_ACCOUNT = 'ENABLE_ACCOUNT'\nexport const ID_DISABLE_ACCOUNT = 'DISABLE_ACCOUNT'\nexport const ID_ACCOUNT_DISABLED_MSG = 'ACCOUNT_DISABLED_MSG'\nexport const ID_DEX_DISABLED_MSG = 'DEX_DISABLED_MSG'\nexport const ID_WALLET_NOT_SYNCED = 'WALLET_NOT_SYNCED'\nexport const ID_WALLET_NO_PEERS = 'WALLET_NO_PEERS'\nexport const ID_DEPOSIT_ERROR = 'DEPOSIT_ERROR'\nexport const ID_WITHDRAW_ERROR = 'WITHDRAW_ERROR'\nexport const ID_DEX_UNDERFUNDED = 'DEX_UNDERFUNDED'\nexport const ID_CEX_UNDERFUNDED = 'CEX_UNDERFUNDED'\nexport const ID_CEX_TOO_SHALLOW = 'CEX_TOO_SHALLOW'\nexport const ID_ACCOUNT_SUSPENDED = 'ACCOUNT_SUSPENDED'\nexport const ID_USER_LIMIT_TOO_LOW = 'USER_LIMIT_TOO_LOW'\nexport const ID_NO_PRICE_SOURCE = 'NO_PRICE_SOURCE'\nexport const ID_CEX_ORDERBOOK_UNSYNCED = 'CEX_ORDERBOOK_UNSYNCED'\nexport const ID_DETERMINE_PLACEMENTS_ERROR = 'DETERMINE_PLACEMENTS_ERROR'\nexport const ID_PLACE_BUY_ORDERS_ERROR = 'PLACE_BUY_ORDERS_ERROR'\nexport const ID_PLACE_SELL_ORDERS_ERROR = 'PLACE_SELL_ORDERS_ERROR'\nexport const ID_CEX_TRADE_ERROR = 'CEX_TRADE_ERROR'\nexport const ID_ORDER_REPORT_TITLE = 'ORDER_REPORT_TITLE'\nexport const ID_CEX_BALANCES = 'CEX_BALANCES'\nexport const ID_CAUSES_SELF_MATCH = 'CAUSES_SELF_MATCH'\nexport const ID_CEX_NOT_CONNECTED = 'CEX_NOT_CONNECTED'\nexport const ID_DELETE_BOT = 'DELETE_BOT'\n\nlet locale: Locale\n\nexport async function loadLocale (lang: string, commitHash: string, skipCache: boolean) {\n if (!skipCache) {\n const specs = State.fetchLocal(State.localeSpecsKey)\n if (specs && specs.lang === lang && specs.commitHash === commitHash) {\n locale = State.fetchLocal(State.localeKey)\n return\n }\n }\n locale = await postJSON('/api/locale', lang)\n State.storeLocal(State.localeSpecsKey, { lang, commitHash })\n State.storeLocal(State.localeKey, locale)\n}\n\n/* prep will format the message to the current locale. */\nexport function prep (k: string, args?: Record<string, string>) {\n return stringTemplateParser(locale[k], args || {})\n}\n\nwindow.clearLocale = () => {\n State.removeLocal(State.localeSpecsKey)\n State.removeLocal(State.localeKey)\n}\n\n/*\n * stringTemplateParser is a template string matcher, where expression is any\n * text. It switches what is inside double brackets (e.g. 'buy {{ asset }}')\n * for the value described into args. args is an object with keys\n * equal to the placeholder keys. (e.g. {\"asset\": \"dcr\"}).\n * So that will be switched for: 'asset dcr'.\n */\nfunction stringTemplateParser (expression: string, args: Record<string, string>) {\n // templateMatcher matches any text which:\n // is some {{ text }} between two brackets, and a space between them.\n // It is global, therefore it will change all occurrences found.\n // text can be anything, but brackets '{}' and space '\\s'\n const templateMatcher = /{{\\s?([^{}\\s]*)\\s?}}/g\n return expression.replace(templateMatcher, (_, value) => args[value])\n}\n","import * as intl from './locales'\nimport {\n UnitInfo,\n LayoutMetrics,\n WalletState,\n PageElement\n} from './registry'\nimport State from './state'\n\n// Symbolizer is satisfied by both dex.Asset and core.SupportedAsset. Used by\n// Doc.symbolize.\ninterface Symbolizer {\n symbol: string\n unitInfo: UnitInfo\n}\n\nconst parser = new window.DOMParser()\n\nconst FPS = 30\n\nconst BipIDs: Record<number, string> = {\n 0: 'btc',\n 42: 'dcr',\n 2: 'ltc',\n 5: 'dash',\n 20: 'dgb',\n 22: 'mona',\n 28: 'vtc',\n 3: 'doge',\n 145: 'bch',\n 60: 'eth',\n 60001: 'usdc.eth',\n 60002: 'usdt.eth',\n 60003: 'matic.eth',\n 136: 'firo',\n 133: 'zec',\n 966: 'polygon',\n 966001: 'usdc.polygon',\n 966002: 'weth.polygon',\n 966003: 'wbtc.polygon',\n 966004: 'usdt.polygon',\n 147: 'zcl'\n}\n\nconst BipSymbolIDs: Record<string, number> = {};\n(function () {\n for (const k of Object.keys(BipIDs)) {\n BipSymbolIDs[BipIDs[parseInt(k)]] = parseInt(k)\n }\n})()\n\nconst BipSymbols = Object.values(BipIDs)\n\nconst RateEncodingFactor = 1e8 // same as value defined in ./orderutil\n\nconst log10RateEncodingFactor = Math.round(Math.log10(RateEncodingFactor))\n\nconst languages = navigator.languages.filter((locale: string) => locale !== 'c')\n\nconst intFormatter = new Intl.NumberFormat(languages, { maximumFractionDigits: 0 })\n\nconst fourSigFigs = new Intl.NumberFormat(languages, {\n minimumSignificantDigits: 4,\n maximumSignificantDigits: 4\n})\n\n/* A cache for formatters used for Doc.formatCoinValue. */\nconst decimalFormatters: Record<number, Intl.NumberFormat> = {}\n\n/*\n * decimalFormatter gets the formatCoinValue formatter for the specified decimal\n * precision.\n */\nfunction decimalFormatter (prec: number) {\n return formatter(decimalFormatters, 2, prec)\n}\n\n/* A cache for formatters used for Doc.formatFullPrecision. */\nconst fullPrecisionFormatters: Record<number, Intl.NumberFormat> = {}\n\n/*\n * fullPrecisionFormatter gets the formatFullPrecision formatter for the\n * specified decimal precision.\n */\nfunction fullPrecisionFormatter (prec: number, locales?: string | string[]) {\n return formatter(fullPrecisionFormatters, prec, prec, locales)\n}\n\n/*\n * formatter gets the formatter from the supplied cache if it already exists,\n * else creates it.\n */\nfunction formatter (formatters: Record<string, Intl.NumberFormat>, min: number, max: number, locales?: string | string[]): Intl.NumberFormat {\n const k = `${min}-${max}`\n let fmt = formatters[k]\n if (!fmt) {\n fmt = new Intl.NumberFormat(locales ?? languages, {\n minimumFractionDigits: min,\n maximumFractionDigits: max\n })\n formatters[k] = fmt\n }\n return fmt\n}\n\n/*\n * convertToConventional converts the value in atomic units to conventional\n * units.\n */\nfunction convertToConventional (v: number, unitInfo?: UnitInfo) {\n let prec = 8\n if (unitInfo) {\n const f = unitInfo.conventional.conversionFactor\n v /= f\n prec = Math.round(Math.log10(f))\n }\n return [v, prec]\n}\n\n/*\n * bestDisplayOrder is used in bestConversion, and is the order of magnitude\n * that is considered the best for display. For example, if bestDisplayOrder is\n * 1, and the choices for display are 1,000 BTC or 0.00001 Sats, the algorithm\n * will look at the orders of the conversions, 1000 => 10^3 => order 3, and\n * 0.00001 => 10^-5 => order 5, and see which is closest to bestDisplayOrder and\n * choose that conversion. In the example, 3 - bestDisplayOrder = 2 and\n * 1 - (-5) = 6, so the conversion that has the order closest to\n * bestDisplayOrder is the first one, 1,000 BTC.\n */\nconst bestDisplayOrder = 1 // 10^1 => 1\n\n/*\n * resolveUnitConversions creates a lookup object mapping unit -> conversion\n * factor. By default, resolveUnitConversions only maps the atomic and\n * conventional units. If a prefs dict is provided, additional units can be\n * included.\n */\nfunction resolveUnitConversions (ui: UnitInfo, prefs?: Record<string, boolean>): Record<string, number> {\n const unitFactors: Record<string, number> = {\n [ui.atomicUnit]: 1,\n [ui.conventional.unit]: ui.conventional.conversionFactor\n }\n if (ui.denominations && prefs) {\n for (const alt of ui.denominations) if (prefs[alt.unit]) unitFactors[alt.unit] = alt.conversionFactor\n }\n return unitFactors\n}\n\n// Helpers for working with the DOM.\nexport default class Doc {\n /*\n * idel is the element with the specified id that is the descendent of the\n * specified node.\n */\n static idel (el: Document | Element, id: string): HTMLElement {\n return el.querySelector(`#${id}`) as HTMLElement\n }\n\n /* bind binds the function to the event for the element. */\n static bind (el: EventTarget, ev: string | string[], f: EventListenerOrEventListenerObject, opts?: any /* EventListenerOptions */): void {\n for (const e of (Array.isArray(ev) ? ev : [ev])) el.addEventListener(e, f, opts)\n }\n\n /* unbind removes the handler for the event from the element. */\n static unbind (el: EventTarget, ev: string, f: (e: Event) => void): void {\n el.removeEventListener(ev, f)\n }\n\n /* noderize creates a Document object from a string of HTML. */\n static noderize (html: string): Document {\n return parser.parseFromString(html, 'text/html')\n }\n\n /*\n * mouseInElement returns true if the position of mouse event, e, is within\n * the bounds of the specified element or any of its descendents.\n */\n static mouseInElement (e: MouseEvent, el: HTMLElement): boolean {\n if (el.contains(e.target as Node)) return true\n const rect = el.getBoundingClientRect()\n return e.pageX >= rect.left && e.pageX <= rect.right &&\n e.pageY >= rect.top && e.pageY <= rect.bottom\n }\n\n /*\n * layoutMetrics gets information about the elements position on the page.\n */\n static layoutMetrics (el: HTMLElement): LayoutMetrics {\n const box = el.getBoundingClientRect()\n const docEl = document.documentElement\n const top = box.top + docEl.scrollTop\n const left = box.left + docEl.scrollLeft\n const w = el.offsetWidth\n const h = el.offsetHeight\n return {\n bodyTop: top,\n bodyLeft: left,\n width: w,\n height: h,\n centerX: left + w / 2,\n centerY: top + h / 2\n }\n }\n\n static descendentMetrics (parent: PageElement, kid: PageElement): LayoutMetrics {\n const parentMetrics = Doc.layoutMetrics(parent)\n const kidMetrics = Doc.layoutMetrics(kid)\n return {\n bodyTop: kidMetrics.bodyTop - parentMetrics.bodyTop,\n bodyLeft: kidMetrics.bodyLeft - parentMetrics.bodyLeft,\n width: kidMetrics.width,\n height: kidMetrics.height,\n centerX: kidMetrics.centerX - parentMetrics.bodyLeft,\n centerY: kidMetrics.centerY - parentMetrics.bodyTop\n }\n }\n\n /* empty removes all child nodes from the specified element. */\n static empty (...els: Element[]) {\n for (const el of els) while (el.firstChild) el.removeChild(el.firstChild)\n }\n\n /*\n * setContent removes all child nodes from the specified element and appends\n * passed elements.\n */\n static setContent (ancestor: PageElement, ...kids: PageElement[]) {\n Doc.empty(ancestor)\n for (const k of kids) ancestor.appendChild(k)\n }\n\n /*\n * hide hides the specified elements. This is accomplished by adding the\n * bootstrap d-hide class to the element. Use Doc.show to undo.\n */\n static hide (...els: Element[]) {\n for (const el of els) el.classList.add('d-hide')\n }\n\n /*\n * show shows the specified elements. This is accomplished by removing the\n * bootstrap d-hide class as added with Doc.hide.\n */\n static show (...els: Element[]) {\n for (const el of els) el.classList.remove('d-hide')\n }\n\n /*\n * showTemporarily shows the specified elements for the specified time, then\n * hides it again.\n */\n static showTemporarily (timeout: number, ...els: Element[]) {\n this.show(...els)\n setTimeout(() => {\n this.hide(...els)\n }, timeout)\n }\n\n /*\n * show or hide the specified elements, based on value of the truthiness of\n * vis.\n */\n static setVis (vis: any, ...els: Element[]) {\n if (vis) Doc.show(...els)\n else Doc.hide(...els)\n }\n\n /* isHidden returns true if the specified element is hidden */\n static isHidden (el: Element): boolean {\n return el.classList.contains('d-hide')\n }\n\n /* isDisplayed returns true if the specified element is not hidden */\n static isDisplayed (el: Element): boolean {\n return !el.classList.contains('d-hide')\n }\n\n /*\n * animate runs the supplied function, which should be a \"progress\" function\n * accepting one argument. The progress function will be called repeatedly\n * with the argument varying from 0.0 to 1.0. The exact path that animate\n * takes from 0.0 to 1.0 will vary depending on the choice of easing\n * algorithm. See the Easing object for the available easing algo choices. The\n * default easing algorithm is linear.\n */\n static async animate (duration: number, f: (progress: number) => void, easingAlgo?: string) {\n await new Animation(duration, f, easingAlgo).wait()\n }\n\n static async blink (el: PageElement) {\n const [r, g, b] = State.isDark() ? [255, 255, 255] : [0, 0, 0]\n const cycles = 2\n Doc.animate(1000, (p: number) => {\n el.style.outline = `2px solid rgba(${r}, ${g}, ${b}, ${(cycles - p * cycles) % 1})`\n })\n }\n\n static applySelector (ancestor: HTMLElement, k: string): PageElement[] {\n return Array.from(ancestor.querySelectorAll(k)) as PageElement[]\n }\n\n static kids (ancestor: HTMLElement): PageElement[] {\n return Array.from(ancestor.children) as PageElement[]\n }\n\n static safeSelector (ancestor: HTMLElement, k: string): PageElement {\n const el = ancestor.querySelector(k)\n if (el) return el as PageElement\n console.warn(`no element found for selector '${k}' on element ->`, ancestor)\n return document.createElement('div')\n }\n\n /*\n * idDescendants creates an object mapping to elements which are descendants\n * of the ancestor and have id attributes. Elements are keyed by their id\n * value.\n */\n static idDescendants (ancestor: HTMLElement): Record<string, PageElement> {\n const d: Record<string, PageElement> = {}\n for (const el of Doc.applySelector(ancestor, '[id]')) d[el.id] = el\n return d\n }\n\n /*\n * formatCoinValue formats the value in atomic units into a string\n * representation in conventional units. If the value happens to be an\n * integer, no decimals are displayed. Trailing zeros may be truncated.\n */\n static formatCoinValue (vAtomic: number, unitInfo?: UnitInfo): string {\n const [v, prec] = convertToConventional(vAtomic, unitInfo)\n if (Number.isInteger(v)) return intFormatter.format(v)\n return decimalFormatter(prec).format(v)\n }\n\n static conventionalCoinValue (vAtomic: number, unitInfo?: UnitInfo): number {\n const [v] = convertToConventional(vAtomic, unitInfo)\n return v\n }\n\n /*\n * formatRateFullPrecision formats rate to represent it exactly at rate step\n * precision, trimming non-effectual zeros if there are any.\n */\n static formatRateFullPrecision (encRate: number, bui: UnitInfo, qui: UnitInfo, rateStepEnc: number) {\n const r = bui.conventional.conversionFactor / qui.conventional.conversionFactor\n const convRate = encRate * r / RateEncodingFactor\n const rateStepDigits = log10RateEncodingFactor - Math.floor(Math.log10(rateStepEnc)) -\n Math.floor(Math.log10(bui.conventional.conversionFactor) - Math.log10(qui.conventional.conversionFactor))\n if (rateStepDigits <= 0) return intFormatter.format(convRate)\n return fullPrecisionFormatter(rateStepDigits).format(convRate)\n }\n\n static formatFourSigFigs (n: number, maxDecimals?: number): string {\n return formatSigFigsWithFormatters(intFormatter, fourSigFigs, n, maxDecimals)\n }\n\n static formatInt (i: number): string {\n return intFormatter.format(i)\n }\n\n /*\n * formatFullPrecision formats the value in atomic units into a string\n * representation in conventional units using the full decimal precision\n * associated with the conventional unit's conversion factor.\n */\n static formatFullPrecision (vAtomic: number, unitInfo?: UnitInfo): string {\n const [v, prec] = convertToConventional(vAtomic, unitInfo)\n return fullPrecisionFormatter(prec).format(v)\n }\n\n /*\n * formatFiatConversion formats the value in atomic units to its representation in\n * conventional units and returns the fiat value as a string.\n */\n static formatFiatConversion (vAtomic: number, rate: number, unitInfo?: UnitInfo): string {\n if (!rate || rate === 0) return intl.prep(intl.ID_UNAVAILABLE)\n const prec = 2\n const [v] = convertToConventional(vAtomic, unitInfo)\n const value = v * rate\n return fullPrecisionFormatter(prec).format(value)\n }\n\n static languages (): string[] {\n return languages\n }\n\n static formatFiatValue (value: number): string {\n return fullPrecisionFormatter(2).format(value)\n }\n\n /*\n * bestConversion picks the best conversion factor for the atomic value. The\n * best is the one in which log10(converted_value) is closest to\n * bestDisplayOrder. Return: [converted_value, precision, unit].\n */\n static bestConversion (atoms: number, ui: UnitInfo, prefs?: Record<string, boolean>): [number, number, string] {\n const unitFactors = resolveUnitConversions(ui, prefs)\n const logDiffs: [string, number][] = []\n const entryDiff = (entry: [string, number]) => Math.abs(Math.log10(atoms / entry[1]) - bestDisplayOrder)\n for (const entry of Object.entries(unitFactors)) logDiffs.push([entry[0], entryDiff(entry)])\n const best = logDiffs.reduce((best: [string, number], entry: [string, number]) => entry[1] < best[1] ? entry : best)\n const unit = best[0]\n const cFactor = unitFactors[unit]\n const v = atoms / cFactor\n return [v, Math.round(Math.log10(cFactor)), unit]\n }\n\n /*\n * formatBestUnitsFullPrecision formats the value with the best choice of\n * units, at full precision.\n */\n static formatBestUnitsFullPrecision (atoms: number, ui: UnitInfo, prefs?: Record<string, boolean>): [string, string] {\n const [v, prec, unit] = this.bestConversion(atoms, ui, prefs)\n if (Number.isInteger(v)) return [intFormatter.format(v), unit]\n return [fullPrecisionFormatter(prec).format(v), unit]\n }\n\n /*\n * formatBestUnitsFourSigFigs formats the value with the best choice of\n * units and rounded to four significant figures.\n */\n static formatBestUnitsFourSigFigs (atoms: number, ui: UnitInfo, prefs?: Record<string, boolean>): [string, string] {\n const [v, prec, unit] = this.bestConversion(atoms, ui, prefs)\n return [Doc.formatFourSigFigs(v, prec), unit]\n }\n\n /*\n * formatBestRateElement formats a rate using the best available units and\n * updates the UI element. The ancestor should have descendents with data\n * attributes [best-value, data-unit, data-unit-box, data-denom].\n */\n static formatBestRateElement (ancestor: PageElement, assetID: number, atoms: number, ui: UnitInfo, prefs?: Record<string, boolean>) {\n Doc.formatBestValueElement(ancestor, assetID, atoms, ui, prefs)\n Doc.setText(ancestor, '[data-denom]', ui.feeRateDenom)\n }\n\n /*\n * formatBestRateElement formats a value using the best available units and\n * updates the UI element. The ancestor should have descendents with data\n * attributes [best-value, data-unit, data-unit-box].\n */\n static formatBestValueElement (ancestor: PageElement, assetID: number, atoms: number, ui: UnitInfo, prefs?: Record<string, boolean>) {\n const [v, unit] = this.formatBestUnitsFourSigFigs(atoms, ui, prefs)\n Doc.setText(ancestor, '[data-value]', v)\n Doc.setText(ancestor, '[data-unit]', unit)\n const span = Doc.safeSelector(ancestor, '[data-unit-box]')\n span.dataset.atoms = String(atoms)\n span.dataset.assetID = String(assetID)\n }\n\n static conventionalRateStep (rateStepEnc: number, baseUnitInfo: UnitInfo, quoteUnitInfo: UnitInfo) {\n const [qFactor, bFactor] = [quoteUnitInfo.conventional.conversionFactor, baseUnitInfo.conventional.conversionFactor]\n return rateStepEnc / RateEncodingFactor * (bFactor / qFactor)\n }\n\n /*\n * logoPath creates a path to a png logo for the specified ticker symbol. If\n * the symbol is not a supported asset, the generic letter logo will be\n * requested instead.\n */\n static logoPath (symbol: string): string {\n if (BipSymbols.indexOf(symbol) === -1) symbol = symbol.substring(0, 1)\n symbol = symbol.split('.')[0] // e.g. usdc.eth => usdc\n return `/img/coins/${symbol}.png`\n }\n\n static bipSymbol (assetID: number): string {\n return BipIDs[assetID]\n }\n\n static bipIDFromSymbol (symbol: string): number {\n return BipSymbolIDs[symbol]\n }\n\n static bipCEXSymbol (assetID: number): string {\n const bipSymbol = BipIDs[assetID]\n if (!bipSymbol || bipSymbol === '') return ''\n const parts = bipSymbol.split('.')\n if (parts[0] === 'weth') return 'eth'\n return parts[0]\n }\n\n static logoPathFromID (assetID: number): string {\n return Doc.logoPath(BipIDs[assetID])\n }\n\n /*\n * symbolize creates a token-aware symbol element for the asset's symbol. For\n * non-token assets, this is simply a <span>SYMBOL</span>. For tokens, it'll\n * be <span><span>SYMBOL</span><sup>PARENT</sup></span>.\n */\n static symbolize (asset: Symbolizer, useLogo?: boolean): PageElement {\n const ticker = asset.unitInfo.conventional.unit\n const symbolSpan = document.createElement('span')\n symbolSpan.textContent = ticker.toUpperCase()\n const parts = asset.symbol.split('.')\n const isToken = parts.length === 2\n if (!isToken) return symbolSpan\n const parentSymbol = parts[1]\n const span = document.createElement('span')\n span.appendChild(symbolSpan)\n if (useLogo) {\n const parentLogo = document.createElement('img')\n parentLogo.src = Doc.logoPath(parentSymbol)\n parentLogo.classList.add('token-parent')\n span.appendChild(parentLogo)\n return span\n }\n const parentSup = document.createElement('sup')\n parentSup.textContent = parentSymbol.toUpperCase()\n parentSup.classList.add('token-parent')\n span.appendChild(parentSup)\n return span\n }\n\n /*\n * shortSymbol removes the short format of a symbol, with any parent chain\n * identifier removed\n */\n static shortSymbol (symbol: string): string {\n return symbol.split('.')[0].toUpperCase()\n }\n\n /*\n * setText sets the textContent for all descendant elements that match the\n * specified CSS selector.\n */\n static setText (ancestor: PageElement, selector: string, textContent: string) {\n for (const el of Doc.applySelector(ancestor, selector)) el.textContent = textContent\n }\n\n static setSrc (ancestor: PageElement, selector: string, textContent: string) {\n for (const img of Doc.applySelector(ancestor, selector)) img.src = textContent\n }\n\n /*\n * cleanTemplates removes the elements from the DOM and deletes the id\n * attribute.\n */\n static cleanTemplates (...tmpls: HTMLElement[]) {\n tmpls.forEach(tmpl => {\n tmpl.remove()\n tmpl.removeAttribute('id')\n })\n }\n\n /*\n * tmplElement is a helper function for grabbing sub-elements of the market list\n * template.\n */\n static tmplElement (ancestor: Document | HTMLElement, s: string): PageElement {\n return ancestor.querySelector(`[data-tmpl=\"${s}\"]`) || document.createElement('div')\n }\n\n /*\n * parseTemplate returns an object of data-tmpl elements, keyed by their\n * data-tmpl values.\n */\n static parseTemplate (ancestor: HTMLElement): Record<string, PageElement> {\n const d: Record<string, PageElement> = {}\n for (const el of Doc.applySelector(ancestor, '[data-tmpl]')) d[el.dataset.tmpl || ''] = el\n return d\n }\n\n /*\n * timeSince returns a string representation of the duration since the\n * specified unix timestamp (milliseconds).\n */\n static timeSince (ms: number): string {\n return Doc.formatDuration((new Date().getTime()) - ms)\n }\n\n /*\n * hmsSince returns a time duration since the specified unix timestamp\n * formatted as HH:MM:SS\n */\n static hmsSince (secs: number) {\n let r = (new Date().getTime() / 1000) - secs\n const h = String(Math.floor(r / 3600))\n r = r % 3600\n const m = String(Math.floor(r / 60))\n const s = String(Math.floor(r % 60))\n return `${h.padStart(2, '0')}:${m.padStart(2, '0')}:${s.padStart(2, '0')}`\n }\n\n /* formatDuration returns a string representation of the duration */\n static formatDuration (dur: number): string {\n let seconds = Math.floor(dur)\n let result = ''\n let count = 0\n const add = (n: number, s: string) => {\n if (n > 0 || count > 0) count++\n if (n > 0) result += `${n} ${s} `\n return count >= 2\n }\n let y, mo, d, h, m, s\n [y, seconds] = timeMod(seconds, aYear)\n if (add(y, 'y')) { return result }\n [mo, seconds] = timeMod(seconds, aMonth)\n if (add(mo, 'mo')) { return result }\n [d, seconds] = timeMod(seconds, aDay)\n if (add(d, 'd')) { return result }\n [h, seconds] = timeMod(seconds, anHour)\n if (add(h, 'h')) { return result }\n [m, seconds] = timeMod(seconds, aMinute)\n if (add(m, 'm')) { return result }\n [s, seconds] = timeMod(seconds, 1000)\n add(s, 's')\n return result || '0 s'\n }\n\n /*\n * disableMouseWheel can be used to disable the mouse wheel for any\n * input. It is very easy to unknowingly scroll up on a number input\n * and then submit an unexpected value. This function prevents the\n * scroll increment/decrement behavior for a wheel action on a\n * number input.\n */\n static disableMouseWheel (...inputFields: Element[]) {\n for (const inputField of inputFields) {\n Doc.bind(inputField, 'wheel', () => { /* pass */ }, { passive: true })\n }\n }\n\n // showFormError can be used to set and display error message on forms.\n static showFormError (el: PageElement, msg: any) {\n el.textContent = msg\n Doc.show(el)\n }\n\n // showFiatValue displays the fiat equivalent for the provided amount.\n static showFiatValue (display: PageElement, amount: number, rate: number, ui: UnitInfo): void {\n if (rate) {\n display.textContent = Doc.formatFiatConversion(amount, rate, ui)\n Doc.show(display.parentElement as Element)\n } else Doc.hide(display.parentElement as Element)\n }\n}\n\n/*\n * Animation is a handler for starting and stopping animations.\n */\nexport class Animation {\n done: (() => void) | undefined\n endAnimation: boolean\n thread: Promise<void>\n static Forever: number\n\n constructor (duration: number, f: (progress: number) => void, easingAlgo?: string, done?: () => void) {\n this.done = done\n this.thread = this.run(duration, f, easingAlgo)\n }\n\n /*\n * run runs the animation function, increasing progress from 0 to 1 in a\n * manner dictated by easingAlgo.\n */\n async run (duration: number, f: (progress: number) => void, easingAlgo?: string) {\n duration = duration >= 0 ? duration : 1000 * 86400 * 365 * 10 // 10 years, in ms\n const easer = easingAlgo ? Easing[easingAlgo] : Easing.linear\n const start = new Date().getTime()\n const end = (duration === Animation.Forever) ? Number.MAX_SAFE_INTEGER : start + duration\n const range = end - start\n const frameDuration = 1000 / FPS\n let now = start\n this.endAnimation = false\n while (now < end) {\n if (this.endAnimation) return this.runCompletionFunction()\n f(easer((now - start) / range))\n await sleep(frameDuration)\n now = new Date().getTime()\n }\n f(1)\n this.runCompletionFunction()\n }\n\n /* wait returns a promise that will resolve when the animation completes. */\n async wait () {\n await this.thread\n }\n\n /* stop schedules the animation to exit at its next frame. */\n stop () {\n this.endAnimation = true\n }\n\n /*\n * stopAndWait stops the animations and returns a promise that will resolve\n * when the animation exits.\n */\n async stopAndWait () {\n this.stop()\n await this.wait()\n }\n\n /* runCompletionFunction runs any registered callback function */\n runCompletionFunction () {\n if (this.done) this.done()\n }\n}\nAnimation.Forever = -1\n\n/* Easing algorithms for animations. */\nexport const Easing: Record<string, (t: number) => number> = {\n linear: t => t,\n easeIn: t => t * t,\n easeOut: t => t * (2 - t),\n easeInHard: t => t * t * t,\n easeOutHard: t => (--t) * t * t + 1,\n easeOutElastic: t => {\n const c4 = (2 * Math.PI) / 3\n return t === 0\n ? 0\n : t === 1\n ? 1\n : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c4) + 1\n }\n}\n\n/* WalletIcons are used for controlling wallets in various places. */\nexport class WalletIcons {\n icons: Record<string, HTMLElement>\n status: Element\n\n constructor (box: HTMLElement) {\n const stateElement = (name: string) => box.querySelector(`[data-state=${name}]`) as HTMLElement\n this.icons = {}\n this.icons.sleeping = stateElement('sleeping')\n this.icons.locked = stateElement('locked')\n this.icons.unlocked = stateElement('unlocked')\n this.icons.nowallet = stateElement('nowallet')\n this.icons.syncing = stateElement('syncing')\n this.icons.nopeers = stateElement('nopeers')\n this.icons.disabled = stateElement('disabled')\n this.status = stateElement('status')\n }\n\n /* sleeping sets the icons to indicate that the wallet is not connected. */\n sleeping () {\n const i = this.icons\n Doc.hide(i.locked, i.unlocked, i.nowallet, i.syncing, i.disabled)\n Doc.show(i.sleeping)\n if (this.status) this.status.textContent = intl.prep(intl.ID_OFF)\n }\n\n /*\n * locked sets the icons to indicate that the wallet is connected, but locked.\n */\n locked () {\n const i = this.icons\n Doc.hide(i.unlocked, i.nowallet, i.sleeping, i.disabled)\n Doc.show(i.locked)\n if (this.status) this.status.textContent = intl.prep(intl.ID_LOCKED)\n }\n\n /*\n * unlocked sets the icons to indicate that the wallet is connected and\n * unlocked.\n */\n unlocked () {\n const i = this.icons\n Doc.hide(i.locked, i.nowallet, i.sleeping, i.disabled)\n Doc.show(i.unlocked)\n if (this.status) this.status.textContent = intl.prep(intl.ID_READY)\n }\n\n /* nowallet sets the icons to indicate that no wallet exists. */\n nowallet () {\n const i = this.icons\n Doc.hide(i.locked, i.unlocked, i.sleeping, i.syncing, i.disabled)\n Doc.show(i.nowallet)\n if (this.status) this.status.textContent = intl.prep(intl.ID_NO_WALLET)\n }\n\n /* set the icons to indicate that the wallet is disabled */\n disabled () {\n const i = this.icons\n Doc.hide(i.locked, i.unlocked, i.sleeping, i.syncing, i.nowallet, i.nopeers)\n Doc.show(i.disabled)\n i.disabled.dataset.tooltip = intl.prep(intl.ID_DISABLED_MSG)\n }\n\n setSyncing (wallet: WalletState | null) {\n const syncIcon = this.icons.syncing\n if (!wallet || !wallet.running || wallet.disabled) {\n Doc.hide(syncIcon)\n return\n }\n\n if (wallet.peerCount === 0) {\n Doc.show(this.icons.nopeers)\n Doc.hide(syncIcon) // potentially misleading with no peers\n return\n }\n Doc.hide(this.icons.nopeers)\n\n if (!wallet.synced) {\n Doc.show(syncIcon)\n syncIcon.dataset.tooltip = intl.prep(intl.ID_WALLET_SYNC_PROGRESS, { syncProgress: (wallet.syncProgress * 100).toFixed(1) })\n return\n }\n Doc.hide(syncIcon)\n }\n\n /* reads the core.Wallet state and sets the icon visibility. */\n readWallet (wallet: WalletState | null) {\n this.setSyncing(wallet)\n if (!wallet) return this.nowallet()\n switch (true) {\n case (wallet.disabled):\n this.disabled()\n break\n case (!wallet.running):\n this.sleeping()\n break\n case (!wallet.open):\n this.locked()\n break\n case (wallet.open):\n this.unlocked()\n break\n default:\n console.error('wallet in unknown state', wallet)\n }\n }\n}\n\n/*\n * AniToggle is a small toggle switch, defined in HTML with the element\n * <div class=\"anitoggle\"></div>. The animations are defined in the anitoggle\n * CSS class. AniToggle triggers the callback on click events, but does not\n * update toggle appearance, so the caller must call the setState method from\n * the callback or elsewhere if the newState\n * is accepted.\n */\nexport class AniToggle {\n toggle: PageElement\n toggling: boolean\n\n constructor (toggle: PageElement, errorEl: PageElement, initialState: boolean, callback: (newState: boolean) => Promise<any>) {\n this.toggle = toggle\n if (toggle.children.length === 0) toggle.appendChild(document.createElement('div'))\n\n Doc.bind(toggle, 'click', async (e: MouseEvent) => {\n e.stopPropagation()\n Doc.hide(errorEl)\n const newState = !toggle.classList.contains('on')\n this.toggling = true\n try {\n await callback(newState)\n } catch (e) {\n this.toggling = false\n Doc.show(errorEl)\n errorEl.textContent = intl.prep(intl.ID_API_ERROR, { msg: e.msg || String(e) })\n return\n }\n this.toggling = false\n })\n this.setState(initialState)\n }\n\n setState (state: boolean) {\n if (state) this.toggle.classList.add('on')\n else this.toggle.classList.remove('on')\n }\n}\n\n/* sleep can be used by async functions to pause for a specified period. */\nfunction sleep (ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nconst aYear = 31536000000\nconst aMonth = 2592000000\nconst aDay = 86400000\nconst anHour = 3600000\nconst aMinute = 60000\n\n/* timeMod returns the quotient and remainder of t / dur. */\nfunction timeMod (t: number, dur: number) {\n const n = Math.floor(t / dur)\n return [n, t - n * dur]\n}\n\nfunction formatSigFigsWithFormatters (intFormatter: Intl.NumberFormat, sigFigFormatter: Intl.NumberFormat, n: number, maxDecimals?: number, locales?: string | string[]): string {\n if (n >= 1000) return intFormatter.format(n)\n const s = sigFigFormatter.format(n)\n if (typeof maxDecimals !== 'number') return s\n const fractional = sigFigFormatter.formatToParts(n).filter((part: Intl.NumberFormatPart) => part.type === 'fraction')[0]?.value ?? ''\n if (fractional.length <= maxDecimals) return s\n return fullPrecisionFormatter(maxDecimals, locales).format(n)\n}\n\nif (process.env.NODE_ENV === 'development') {\n // Code will only appear in dev build.\n // https://webpack.js.org/guides/production/\n window.testFormatFourSigFigs = () => {\n const tests: [string, string, number | undefined, string][] = [\n ['en-US', '1.234567', undefined, '1.235'], // sigFigFormatter\n ['en-US', '1.234567', 2, '1.23'], // decimalFormatter\n ['en-US', '1234', undefined, '1,234.0'], // oneFractionalDigit\n ['en-US', '12', undefined, '12.00'], // sigFigFormatter\n ['fr-FR', '123.45678', undefined, '123,5'], // oneFractionalDigit\n ['fr-FR', '1234.5', undefined, '1 234,5'], // U+202F for thousands separator\n // For Arabic, https://www.saitak.com/number is useful, but seems to use\n // slightly different unicode points and no thousands separator. I think\n // the Arabic decimal separator is supposed to be more like a point, not\n // a comma, but Google Chrome uses U+066B (Arabic Decimal Separator),\n // which looks like a comma to me. ¯\\_(ツ)_/¯\n ['ar-EG', '123.45678', undefined, '١٢٣٫٥'],\n ['ar-EG', '1234', undefined, '١٬٢٣٤٫٠'],\n ['ar-EG', '0.12345', 3, '٠٫١٢٣']\n ]\n\n // Reproduce the NumberFormats with ONLY our desired language.\n for (const [code, unformatted, maxDecimals, expected] of tests) {\n const intFormatter = new Intl.NumberFormat(code, { // oneFractionalDigit\n minimumFractionDigits: 1,\n maximumFractionDigits: 1\n })\n const sigFigFormatter = new Intl.NumberFormat(code, {\n minimumSignificantDigits: 4,\n maximumSignificantDigits: 4\n })\n for (const k in decimalFormatters) delete decimalFormatters[k] // cleanup\n for (const k in fullPrecisionFormatters) delete fullPrecisionFormatters[k] // cleanup\n const s = formatSigFigsWithFormatters(intFormatter, sigFigFormatter, parseFloatDefault(unformatted), maxDecimals, code)\n if (s !== expected) console.log(`TEST FAILED: f('${code}', ${unformatted}, ${maxDecimals}) => '${s}' != '${expected}'}`)\n else console.log(`✔️ f('${code}', ${unformatted}, ${maxDecimals}) => ${s} ✔️`)\n }\n }\n\n window.testFormatRateFullPrecision = () => {\n const tests: [number, number, number, number, string][] = [\n // Two utxo assets with a conventional rate of 0.15. Conventional rate\n // step is 100 / 1e8 = 1e-6, so there should be 6 decimal digits.\n [1.5e7, 100, 1e8, 1e8, '0.150000'],\n // USDC quote -> utxo base with a rate of $10 / 1 XYZ. USDC has an\n // conversion factor of 1e6, so $10 encodes to 1e7, 1 XYZ encodes to 1e8,\n // encoded rate is 1e7 / 1e8 * 1e8 = 1e7, bFactor / qFactor is 1e2.\n // The conventional rate step is 200 / 1e8 * 1e2 = 2e-4, so using\n // rateStepDigits, we should get 4 decimal digits.\n [1e7, 200, 1e6, 1e8, '10.0000'],\n // Set a rate of 1 atom USDC for 0.01 BTC. That atomic rate will be 1 /\n // 1e6 = 1e-6. The encoded rate will be 1e-6 * 1e8 = 1e2. As long as our\n // rate step divides evenly into 100, this should work. The conventional\n // rate is 1e-6 / 1e-2 = 1e-4, so expect 4 decimal digits.\n [1e2, 100, 1e6, 1e8, '0.0001'],\n // DCR-ETH, expect 6 decimals.\n [1.5e7, 1000, 1e9, 1e8, '0.015000'],\n [1e6, 1000, 1e9, 1e8, '0.001000'],\n [1e3, 1000, 1e9, 1e8, '0.000001'],\n [100001000, 1000, 1e9, 1e8, '0.100001'],\n [1000001000, 1000, 1e9, 1e8, '1.000001'],\n // DCR-USDC, expect 3 decimals.\n [1.5e7, 1000, 1e6, 1e8, '15.000'],\n [1e6, 1000, 1e6, 1e8, '1.000'],\n [1e3, 1000, 1e6, 1e8, '0.001'],\n [101000, 1000, 1e6, 1e8, '0.101'],\n [1001000, 1000, 1e6, 1e8, '1.001'],\n // UTXO assets but with a rate step that's not a perfect power of 10.\n // For a rate step of 500, a min rate would be e.g. rate step = 500.\n // 5e2 / 1e8 = 5e-6 = 0.000005\n [5e2, 500, 1e8, 1e8, '0.000005']\n ]\n\n for (const [encRate, rateStep, qFactor, bFactor, expEncoding] of tests) {\n for (const k in fullPrecisionFormatters) delete fullPrecisionFormatters[k] // cleanup\n const bui = { conventional: { conversionFactor: bFactor } } as any as UnitInfo\n const qui = { conventional: { conversionFactor: qFactor } } as any as UnitInfo\n const enc = Doc.formatRateFullPrecision(encRate, bui, qui, rateStep)\n if (enc !== expEncoding) console.log(`TEST FAILED: f(${encRate}, ${bFactor}, ${qFactor}, ${rateStep}) => ${enc} != ${expEncoding}`)\n else console.log(`✔️ f(${encRate}, ${bFactor}, ${qFactor}, ${rateStep}) => ${enc} ✔️`)\n }\n }\n}\n\nexport interface NumberInputOpts {\n prec?: number\n sigFigs?: boolean\n changed?: (v: number) => void\n min?: number\n set?: (v: number, s: string) => void // called when setValue is called\n}\n\nexport class NumberInput {\n input: PageElement\n prec: number\n fmt: (v: number, prec: number) => [number, string]\n changed: (v: number) => void\n set?: (v: number, s: string) => void\n min: number\n\n constructor (input: PageElement, opts: NumberInputOpts) {\n this.input = input\n this.prec = opts.prec ?? 0\n this.fmt = opts.sigFigs ? toFourSigFigs : toPrecision\n this.changed = opts.changed ?? (() => { /* pass */ })\n this.set = opts.set\n this.min = opts.min ?? 0\n\n Doc.bind(input, 'change', () => { this.inputChanged() })\n }\n\n inputChanged () {\n const { changed } = this\n if (changed) changed(this.value())\n }\n\n setValue (v: number) {\n this.input.value = String(v)\n v = this.value()\n if (this.set) this.set(v, this.input.value)\n }\n\n value () {\n const { input, min, prec, fmt } = this\n const rawV = Math.max(parseFloatDefault(input.value, min ?? 0), min ?? 0)\n const [v, s] = fmt(rawV, prec ?? 0)\n input.value = s\n return v\n }\n}\n\nexport interface IncrementalInputOpts extends NumberInputOpts {\n inc?: number\n}\n\nexport class IncrementalInput extends NumberInput {\n inc: number\n opts: IncrementalInputOpts\n\n constructor (box: PageElement, opts: IncrementalInputOpts) {\n super(Doc.safeSelector(box, 'input'), opts)\n this.opts = opts\n this.inc = opts.inc ?? 1\n\n const up = Doc.safeSelector(box, '.ico-arrowup')\n const down = Doc.safeSelector(box, '.ico-arrowdown')\n\n Doc.bind(up, 'click', () => { this.increment(1) })\n Doc.bind(down, 'click', () => { this.increment(-1) })\n }\n\n setIncrementAndMinimum (inc: number, min: number) {\n this.inc = inc\n this.min = min\n }\n\n increment (sign: number) {\n const { inc, min, input } = this\n input.value = String(Math.max(this.value() + sign * inc, min))\n this.inputChanged()\n }\n}\n\nexport class MiniSlider {\n track: PageElement\n ball: PageElement\n r: number\n changed: (r: number) => void\n\n constructor (box: PageElement, changed: (r: number) => void) {\n this.changed = changed\n this.r = 0\n\n const color = document.createElement('div')\n color.dataset.tmpl = 'color'\n box.appendChild(color)\n const track = this.track = document.createElement('div')\n track.dataset.tmpl = 'track'\n color.appendChild(track)\n const ball = this.ball = document.createElement('div')\n ball.dataset.tmpl = 'ball'\n track.appendChild(ball)\n\n Doc.bind(box, 'mousedown', (e: MouseEvent) => {\n if (e.button !== 0) return\n e.preventDefault()\n e.stopPropagation()\n const startX = e.pageX\n const w = track.clientWidth\n const startLeft = this.r * w\n const left = (ee: MouseEvent) => Math.max(Math.min(startLeft + (ee.pageX - startX), w), 0)\n const trackMouse = (ee: MouseEvent) => {\n ee.preventDefault()\n const l = left(ee)\n this.r = l / w\n ball.style.left = `${this.r * 100}%`\n this.changed(this.r)\n }\n const mouseUp = (ee: MouseEvent) => {\n trackMouse(ee)\n Doc.unbind(document, 'mousemove', trackMouse)\n Doc.unbind(document, 'mouseup', mouseUp)\n }\n Doc.bind(document, 'mousemove', trackMouse)\n Doc.bind(document, 'mouseup', mouseUp)\n })\n\n Doc.bind(box, 'click', (e: MouseEvent) => {\n if (e.button !== 0) return\n const x = e.pageX\n const m = Doc.layoutMetrics(track)\n this.r = clamp((x - m.bodyLeft) / m.width, 0, 1)\n ball.style.left = `${this.r * m.width}px`\n this.changed(this.r)\n })\n }\n\n setValue (r: number) {\n this.r = clamp(r, 0, 1)\n this.ball.style.left = `${this.r * 100}%`\n }\n}\n\nexport function toPrecision (v: number, prec: number): [number, string] {\n const ord = Math.pow(10, prec ?? 0)\n v = Math.round(v * ord) / ord\n let s = v.toFixed(prec)\n if (prec > 0) {\n while (s.endsWith('0')) s = s.substring(0, s.length - 1)\n if (s.endsWith('.')) s = s.substring(0, s.length - 1)\n }\n return [v, s]\n}\n\nexport function toFourSigFigs (v: number, maxPrec: number): [number, string] {\n const ord = Math.floor(Math.log10(Math.abs(v)))\n if (ord >= 3) return [Math.round(v), v.toFixed(0)]\n const prec = Math.min(4 - ord, maxPrec)\n return toPrecision(v, prec)\n}\n\nexport function parseFloatDefault (inputValue: string | undefined, defaultValue?: number) {\n const v = parseFloat((inputValue ?? '').replace(/,/g, ''))\n if (!isNaN(v)) return v\n return defaultValue ?? 0\n}\n\n/* clamp returns v if min <= v <= max, else min or max. */\nexport function clamp (v: number, min: number, max: number): number {\n if (v < min) return min\n if (v > max) return max\n return v\n}\n\nexport async function setupCopyBtn (txt: string, textEl: PageElement, btnEl: PageElement, color: string) {\n try {\n await navigator.clipboard.writeText(txt)\n } catch (err) {\n console.error('Unable to copy: ', err)\n }\n const textOriginalColor = textEl.style.color\n const btnOriginalColor = btnEl.style.color\n textEl.style.color = color\n btnEl.style.color = color\n setTimeout(() => {\n textEl.style.color = textOriginalColor\n btnEl.style.color = btnOriginalColor\n }, 350)\n}\n","declare global {\n interface Window {\n log: (...args: any) => void\n enableLogger: (loggerID: string, enable: boolean) => void\n recordLogger: (loggerID: string, enable: boolean) => void\n dumpLogger: (loggerID: string) => void\n mmstatus: () => Promise<MarketMakingStatus>\n testFormatFourSigFigs: () => void\n testFormatRateFullPrecision: () => void\n user: () => User\n cexBook: () => Promise<void>\n mmStatus: () => MarketMakingStatus\n isWebview?: () => boolean\n webkit: any | undefined\n openUrl: (url: string) => void\n sendOSNotification (title: string, body?: string): void\n clearLocale (): void\n }\n}\n\nexport enum ConnectionStatus {\n Disconnected = 0,\n Connected = 1,\n InvalidCert = 2,\n}\n\nexport interface BondOptions {\n bondAssetID: number\n targetTier: number\n maxBondedAmt: number\n}\n\nexport interface Reputation {\n bondedTier: number\n penalties: number\n legacyTier: boolean\n score: number\n}\n\nexport interface ExchangeAuth {\n rep: Reputation\n bondAssetID: number\n pendingStrength: number\n weakStrength: number\n liveStrength: number\n targetTier: number\n effectiveTier: number\n maxBondedAmt: number\n penaltyComps: number\n pendingBonds: PendingBondState[]\n expiredBonds: any[]\n compensation: number\n}\n\nexport interface Exchange {\n host: string\n acctID: string\n auth: ExchangeAuth\n markets: Record<string, Market>\n assets: Record<number, Asset>\n connectionStatus: ConnectionStatus\n viewOnly: boolean\n bondAssets: Record<string, BondAsset>\n candleDurs: string[]\n maxScore: number\n penaltyThreshold: number\n disabled:boolean\n}\n\nexport interface Candle {\n startStamp: number\n endStamp: number\n matchVolume: number\n quoteVolume: number\n highRate: number\n lowRate: number\n startRate: number\n endRate: number\n}\n\nexport interface CandlesPayload {\n dur: string\n ms: number\n candles: Candle[]\n}\n\nexport interface Market {\n name: string\n baseid: number\n basesymbol: string\n quoteid: number\n quotesymbol: string\n lotsize: number\n parcelsize: number\n ratestep: number\n epochlen: number\n startepoch: number\n buybuffer: number\n orders: Order[]\n spot: Spot | undefined\n atomToConv: number\n inflight: InFlightOrder[]\n minimumRate: number\n}\n\nexport interface InFlightOrder extends Order {\n tempID: number\n}\n\nexport interface Order {\n host: string\n baseID: number\n baseSymbol: string\n quoteID: number\n quoteSymbol: string\n market: string\n type: number\n id: string\n stamp: number\n submitTime: number\n sig: string\n status: number\n epoch: number\n qty: number\n sell: boolean\n filled: number\n matches: Match[]\n cancelling: boolean\n canceled: boolean\n feesPaid: FeeBreakdown\n fundingCoins: Coin[]\n accelerationCoins: Coin[]\n lockedamt: number\n rate: number // limit only\n tif: number // limit only\n targetOrderID: string // cancel only\n readyToTick: boolean\n}\n\nexport interface Match {\n matchID: string\n status: number\n active: boolean\n revoked: boolean\n rate: number\n qty: number\n side: number\n feeRate: number\n swap: Coin\n counterSwap: Coin\n redeem: Coin\n counterRedeem: Coin\n refund: Coin\n stamp: number\n isCancel: boolean\n}\n\nexport interface Spot {\n stamp: number\n baseID: number\n quoteID: number\n rate: number\n bookVolume: number // Unused?\n change24: number\n vol24: number\n low24: number\n high24: number\n}\n\nexport interface Asset {\n id: number\n symbol: string\n version: number\n maxFeeRate: number\n swapSize: number\n swapSizeBase: number\n redeemSize: number\n swapConf: number\n unitInfo: UnitInfo\n}\n\nexport interface BondAsset {\n ver: number\n id: number\n confs: number\n amount: number\n}\n\nexport interface PendingBondState {\n symbol: string\n assetID: number\n coinID: string\n confs: number\n}\n\nexport interface FeeBreakdown {\n swap: number\n redemption: number\n}\n\nexport interface SupportedAsset {\n id: number\n symbol: string\n name: string\n wallet: WalletState\n info?: WalletInfo\n token?: Token\n unitInfo: UnitInfo\n walletCreationPending: boolean\n}\n\nexport interface Token {\n parentID: number\n name: string\n unitInfo: UnitInfo\n contractAddress: string\n definition: WalletDefinition\n}\n\nexport enum ApprovalStatus {\n Approved = 0,\n Pending = 1,\n NotApproved = 2\n}\n\nexport interface FeeState {\n rate: number\n send: number\n swap: number\n redeem: number\n refund: number\n stampMS: number\n}\n\nexport interface SyncStatus {\n synced: boolean\n targetHeight: number\n startingBlocks: number\n blocks: number\n txs: number | undefined\n}\n\nexport interface WalletState {\n symbol: string\n assetID: number\n version: number\n type: string\n traits: number\n open: boolean\n running: boolean\n disabled: boolean\n balance: WalletBalance\n address: string\n units: string\n encrypted: boolean\n peerCount: number\n synced: boolean\n syncProgress: number\n syncStatus: SyncStatus\n approved: Record<number, ApprovalStatus>\n feeState?: FeeState\n}\n\nexport interface WalletInfo {\n name: string\n version: number\n availablewallets: WalletDefinition[]\n versions: number[]\n emptyidx: number\n unitinfo: UnitInfo\n}\n\nexport interface WalletBalance {\n available: number\n immature: number\n locked: number\n stamp: string // time.Time\n orderlocked: number\n contractlocked: number\n bondlocked: number\n bondReserves: number\n reservesDeficit: number\n other: Record<string, CustomBalance>\n}\n\nexport interface CustomBalance {\n amt: number\n locked: boolean\n}\n\nexport interface WalletDefinition {\n seeded: boolean\n type: string\n tab: string\n description: string\n configpath: string\n configopts: ConfigOption[]\n multifundingopts: OrderOption[]\n noauth: boolean\n guidelink: string\n}\n\nexport interface ConfigOption {\n key: string\n displayname: string\n description: string\n default: any\n max: any\n min: any\n noecho: boolean\n isboolean: boolean\n isdate: boolean\n disablewhenactive: boolean\n isBirthdayConfig: boolean\n repeatable?: string\n repeatN?: number\n regAsset?: number\n required?: boolean\n dependsOn?: string\n}\n\nexport interface Coin {\n id: string\n stringID: string\n assetID: number\n symbol: string\n confs: Confirmations\n}\n\nexport interface Confirmations {\n required: number\n count: number\n}\n\nexport interface UnitInfo {\n atomicUnit: string\n conventional: Denomination\n denominations: Denomination[]\n feeRateDenom: string\n}\n\nexport interface Denomination {\n unit: string\n conversionFactor: number\n}\n\nexport interface ExtensionConfiguredWallet {\n hiddenFields: string[]\n disableWalletType: boolean\n disablePassword: boolean\n disableStaking: boolean\n disablePrivacy: boolean\n}\n\nexport interface ExtensionModeConfig {\n name: string\n restrictedWallets: Record<string, ExtensionConfiguredWallet>\n}\n\nexport interface User {\n exchanges: Record<string, Exchange>\n inited: boolean\n seedgentime: number\n assets: Record<number, SupportedAsset>\n fiatRates: Record<number, number>\n bots: BotReport[]\n net: number\n extensionModeConfig: ExtensionModeConfig\n actions: ActionRequiredNote[]\n}\n\nexport interface CoreNote {\n type: string\n topic: string\n subject: string\n details: string\n severity: number\n stamp: number\n acked: boolean\n id: string\n}\n\nexport interface BondNote extends CoreNote {\n asset: number\n confirmations: number\n dex: string\n coinID: string | null\n tier: number | null\n auth: ExchangeAuth | null\n}\n\nexport interface ReputationNote extends CoreNote {\n host: string\n rep: Reputation\n}\n\nexport interface BalanceNote extends CoreNote {\n assetID: number\n balance: WalletBalance\n}\n\nexport interface RateNote extends CoreNote {\n fiatRates: Record<number, number>\n}\n\nexport interface WalletConfigNote extends CoreNote {\n wallet: WalletState\n}\n\nexport interface WalletSyncNote extends CoreNote {\n assetID: number\n syncStatus: SyncStatus\n syncProgress: number\n}\n\nexport type WalletStateNote = WalletConfigNote\n\nexport interface WalletCreationNote extends CoreNote {\n assetID: number\n}\n\nexport interface BaseWalletNote {\n route: string\n assetID: number\n}\n\nexport interface TipChangeNote extends BaseWalletNote {\n tip: number\n data: any\n}\n\nexport interface CustomWalletNote extends BaseWalletNote {\n payload: any\n}\n\nexport interface TransactionNote extends BaseWalletNote {\n transaction: WalletTransaction\n new: boolean\n}\n\nexport interface ActionRequiredNote extends BaseWalletNote {\n uniqueID: string\n actionID: string\n payload: any\n}\n\nexport interface ActionResolvedNote extends BaseWalletNote {\n uniqueID: string\n}\n\nexport interface TransactionActionNote {\n tx: WalletTransaction\n nonce: number\n newFees: number\n}\n\nexport interface WalletNote extends CoreNote {\n payload: BaseWalletNote\n}\n\nexport interface CoreActionRequiredNote extends CoreNote {\n payload: ActionRequiredNote\n}\n\nexport interface RejectedRedemptionData {\n assetID: number\n orderID: string\n coinID: string\n coinFmt: string\n}\n\nexport interface SpotPriceNote extends CoreNote {\n host: string\n spots: Record<string, Spot>\n}\n\nexport interface RunStatsNote extends CoreNote {\n host: string\n baseID: number\n quoteID: number\n stats?: RunStats\n}\n\nexport interface RunEventNote extends CoreNote {\n host: string\n baseID: number\n quoteID: number\n startTime: number\n event: MarketMakingEvent\n}\n\nexport interface MakerProgram {\n host: string\n baseID: number\n quoteID: number\n lots: number\n oracleWeighting: number\n oracleBias: number\n driftTolerance: number\n gapFactor: number\n gapStrategy: string\n}\n\nexport interface BotOrder {\n host: string\n marketID: string\n orderID: string\n}\n\nexport interface BotReport {\n programID: number\n program: MakerProgram\n running: boolean\n orders: BotOrder\n}\n\nexport interface LotFees {\n swap: number\n redeem: number\n refund: number\n}\n\nexport interface LotFeeRange {\n max: LotFees\n estimated: LotFees\n}\n\nexport interface AssetBookingFees extends LotFeeRange {\n bookingFeesPerLot: number\n bookingFeesPerCounterLot: number\n bookingFees: number\n swapReservesFactor: number // (1 + orderReservesFactor)\n redeemReservesFactor: number\n tokenFeesPerSwap: number\n}\n\nexport interface BookingFees {\n base: AssetBookingFees\n quote:AssetBookingFees\n}\n\nexport interface MarketReport {\n price: number\n oracles: OracleReport[]\n baseFiatRate: number\n quoteFiatRate: number\n baseFees: LotFeeRange\n quoteFees: LotFeeRange\n}\n\nexport interface MatchNote extends CoreNote {\n orderID: string\n match: Match\n host: string\n marketID: string\n}\n\nexport interface ConnEventNote extends CoreNote {\n host: string\n connectionStatus: ConnectionStatus\n}\n\nexport interface OrderNote extends CoreNote {\n order: Order\n tempID: number\n}\n\nexport interface RecentMatch {\n rate: number\n qty: number\n stamp: number\n sell: boolean\n}\n\nexport interface EpochNote extends CoreNote {\n host: string\n marketID: string\n epoch: number\n}\n\nexport interface APIResponse {\n requestSuccessful: boolean\n ok: boolean\n msg: string\n err?: string\n}\n\nexport interface LogMessage {\n time: string\n msg: string\n}\n\nexport interface NoteElement extends HTMLElement {\n note: CoreNote\n}\n\nexport interface BalanceResponse extends APIResponse {\n balance: WalletBalance\n}\n\nexport interface LayoutMetrics {\n bodyTop: number\n bodyLeft: number\n width: number\n height: number\n centerX: number\n centerY: number\n}\n\nexport interface PageElement extends HTMLElement {\n value?: string\n src?: string\n files?: FileList\n checked?: boolean\n href?: string\n htmlFor?: string\n name?: string\n options?: HTMLOptionElement[]\n selectedIndex?: number\n disabled?: boolean\n}\n\nexport interface BooleanConfig {\n reason: string\n}\n\nexport interface XYRangePoint {\n label: string\n x: number\n y: number\n}\n\nexport interface XYRange {\n start: XYRangePoint\n end: XYRangePoint\n xUnit: string\n yUnit: string\n roundX?: boolean\n roundY?: boolean\n}\n\nexport interface OrderOption extends ConfigOption {\n boolean?: BooleanConfig\n xyRange?: XYRange\n showByDefault?: boolean\n quoteAssetOnly?: boolean\n}\n\nexport interface SwapEstimate {\n lots: number\n value: number\n maxFees: number\n realisticWorstCase: number\n realisticBestCase: number\n feeReservesPerLot: number\n}\n\nexport interface RedeemEstimate {\n realisticBestCase: number\n realisticWorstCase: number\n}\n\nexport interface PreSwap {\n estimate: SwapEstimate\n options: OrderOption[]\n}\n\nexport interface PreRedeem {\n estimate: RedeemEstimate\n options: OrderOption[]\n}\n\nexport interface OrderEstimate {\n swap: PreSwap\n redeem: PreRedeem\n}\n\nexport interface MaxOrderEstimate {\n swap: SwapEstimate\n redeem: RedeemEstimate\n}\n\nexport interface MaxSell {\n maxSell: MaxOrderEstimate\n}\n\nexport interface MaxBuy {\n maxBuy: MaxOrderEstimate\n}\n\nexport interface TradeForm {\n host: string\n isLimit: boolean\n sell: boolean\n base: number\n quote: number\n qty: number\n rate: number\n tifnow: boolean\n options: Record<string, any>\n}\n\nexport interface BookUpdate {\n action: string\n host: string\n marketID: string\n matchesSummary: RecentMatch[]\n payload: any\n}\n\nexport interface MiniOrder {\n qty: number\n qtyAtomic: number\n rate: number\n msgRate: number\n epoch: number\n sell: boolean\n token: string\n}\n\nexport interface CoreOrderBook {\n sells: MiniOrder[]\n buys: MiniOrder[]\n epoch: MiniOrder[]\n recentMatches: RecentMatch[]\n}\n\nexport interface MarketOrderBook {\n base: number\n quote: number\n book: CoreOrderBook\n}\n\nexport interface RemainderUpdate {\n token: string\n qty: number\n qtyAtomic: number\n}\n\nexport interface OrderFilterMarket {\n baseID: number\n quoteID: number\n}\n\nexport interface OrderFilter {\n n?: number\n offset?: string\n hosts?: string[]\n assets?: number[]\n market?: OrderFilterMarket\n statuses?: number[]\n}\n\nexport interface OrderPlacement {\n lots: number\n gapFactor: number\n}\n\nexport interface AutoRebalanceConfig {\n minBaseTransfer: number\n minQuoteTransfer: number\n}\n\nexport interface BasicMarketMakingConfig {\n gapStrategy: string\n sellPlacements: OrderPlacement[]\n buyPlacements: OrderPlacement[]\n driftTolerance: number\n}\n\nexport interface ArbMarketMakingPlacement {\n lots: number\n multiplier: number\n}\n\nexport interface ArbMarketMakingConfig {\n buyPlacements: ArbMarketMakingPlacement[]\n sellPlacements: ArbMarketMakingPlacement[]\n profit: number\n driftTolerance: number\n orderPersistence: number\n}\n\nexport interface SimpleArbConfig {\n profitTrigger: number\n maxActiveArbs: number\n numEpochsLeaveOpen: number\n}\n\nexport interface BotCEXCfg {\n name: string\n autoRebalance?: AutoRebalanceConfig\n}\n\nexport interface BotBalanceAllocation {\n dex: Record<number, number>\n cex: Record<number, number>\n}\n\nexport interface BotAssetConfig {\n swapFeeN: number\n orderReservesFactor: number\n slippageBufferFactor: number\n transferFactor: number\n}\n\nexport interface UIConfig {\n baseConfig: BotAssetConfig\n quoteConfig: BotAssetConfig\n simpleArbLots?: number\n cexRebalance: boolean\n}\n\nexport interface StartConfig extends MarketWithHost {\n autoRebalance?: AutoRebalanceConfig\n alloc: BotBalanceAllocation\n}\n\nexport interface BotConfig {\n host: string\n baseID: number\n quoteID: number\n baseWalletOptions?: Record<string, string>\n quoteWalletOptions?: Record<string, string>\n cexName: string\n uiConfig: UIConfig\n basicMarketMakingConfig?: BasicMarketMakingConfig\n arbMarketMakingConfig?: ArbMarketMakingConfig\n simpleArbConfig?: SimpleArbConfig\n}\n\nexport interface CEXConfig {\n name: string\n apiKey: string\n apiSecret: string\n}\n\nexport interface MarketWithHost {\n host: string\n baseID: number\n quoteID: number\n}\n\nexport interface MMCEXStatus {\n config: CEXConfig\n connected: boolean\n connectErr: string\n markets: Record<string, CEXMarket>\n balances: Record<number, ExchangeBalance>\n}\n\nexport interface BotBalance {\n available: number\n locked: number\n pending: number\n reserved: number\n}\n\nexport interface BotBalances {\n dex: BotBalance\n cex: BotBalance\n}\n\nexport interface BotInventory {\n avail: number\n locked: number // includes BotBalance.reserved\n total: number // avail + locked\n}\n\nexport interface RunningBotInventory {\n avail: number\n locked: number\n dex: BotInventory\n cex: BotInventory\n}\n\nexport interface CEXNotification extends CoreNote {\n cexName: string\n note: any\n}\n\nexport interface CEXBalanceUpdate {\n assetID: number\n balance: ExchangeBalance\n}\n\nexport interface EpochReportNote extends CoreNote {\n host: string\n baseID: number\n quoteID: number\n report?: EpochReport\n}\n\nexport interface CEXProblemsNote extends CoreNote {\n host: string\n baseID: number\n quoteID: number\n problems?: CEXProblems\n}\n\nexport interface FeeEstimates extends LotFeeRange {\n bookingFeesPerLot: number\n bookingFees: number\n tokenFeesPerSwap: number\n}\n\nexport interface ProjectedAlloc {\n // book is inventory dedicated either to active orders for basicmm and arbmm,\n // or on reserve for orders in the case of basicarb. book + bookingFees is the\n // starvation threshold for DEX, meaning it's impossible to start a bot\n // unstarved if there no way to get book + bookingFees to Bison Wallet. A user\n // could potentially adjust order reserves or swap fee reserves to free up\n // more funds, but with possible degradation of bot performance.\n book: number\n // booking fees is funding dedicated to covering the fees for funded orders.\n // bookingFees are in the units of the parent chain for token assets.\n bookingFees: number\n // swapFeeReserves is only required for token assets. These are fees\n // reserved for funding swaps. These fees are only debited, so will definitely\n // run out eventually, but we'll get a UI that enabled manual and/or auto\n // refill soon. swapFeeReserves are in the units of the parent chain.\n swapFeeReserves: number\n // cex is the inventory dedicated to funding counter-orders on cex for an\n // arbmm or simplearb bot. cex is the starvation threshold for CEX.\n cex: number\n // orderReserves is inventory reserved for facilitating withdraws and\n // deposits or for replacing matched orders. It's a good idea to have a\n // little extra around, otherwise a trade sequence gone wrong could put\n // the bot in a starved or unbalanced state.\n orderReserves: number\n // slippageBuffer is only required for the quote asset. This accounts for\n // variations in rate, because the quote asset's \"lot size\" varies with\n // rate. If the rate goes down, the quote-converted lot size goes up, so\n // we'll let the user choose to reserve a little extra for this case.\n slippageBuffer: number\n}\n\nexport interface FeeGapStats {\n basisPrice: number\n feeGap: number\n remoteGap: number\n roundTripFees: number\n}\n\nexport interface RunStats {\n initialBalances: Record<number, number>\n dexBalances: Record<number, BotBalance>\n cexBalances: Record<number, BotBalance>\n profitLoss: ProfitLoss\n startTime: number\n pendingDeposits: number\n pendingWithdrawals: number\n completedMatches: number\n tradedUSD: number\n feeGap: FeeGapStats\n}\n\nexport interface StampedError {\n stamp: number\n error: string\n}\n\nexport interface BotProblems {\n walletNotSynced: Record<number, boolean>\n noWalletPeers: Record<number, boolean>\n accountSuspended: boolean\n userLimitTooLow: boolean\n noPriceSource: boolean\n oracleFiatMismatch: boolean\n cexOrderbookUnsynced: boolean\n causesSelfMatch: boolean\n unknownError: string\n}\n\nexport interface TradePlacement {\n rate: number\n lots: number\n standingLots: number\n orderedLots: number\n counterTradeRate: number\n requiredDex: Record<number, number>\n requiredCex: number\n usedDex: Record<number, number>\n usedCex: number\n error?: BotProblems\n}\n\nexport interface OrderReport {\n placements: TradePlacement[]\n fees: LotFeeRange\n availableDexBals: Record<number, BotBalance>\n requiredDexBals: Record<number, number>\n remainingDexBals: Record<number, number>\n usedDexBals: Record<number, number>\n availableCexBal: BotBalance\n requiredCexBal: number\n remainingCexBal: number\n usedCexBal: number\n error?: BotProblems\n}\n\nexport interface EpochReport {\n epochNum: number\n preOrderProblems?: BotProblems\n buysReport?: OrderReport\n sellsReport?: OrderReport\n}\n\nexport interface CEXProblems {\n depositErr: Record<number, StampedError>\n withdrawErr: Record<number, StampedError>\n tradeErr: StampedError\n}\n\nexport interface MMBotStatus {\n config: BotConfig\n running: boolean\n runStats?: RunStats\n latestEpoch?: EpochReport\n cexProblems?: CEXProblems\n}\n\nexport interface MarketMakingStatus {\n cexes: Record<string, MMCEXStatus>\n bots: MMBotStatus[]\n}\n\nexport interface DEXOrderEvent {\n id: string\n rate: number\n qty: number\n sell: boolean\n transactions: WalletTransaction[]\n}\n\nexport interface CEXOrderEvent {\n id: string\n rate: number\n qty: number\n sell: boolean\n baseFilled: number\n quoteFilled: number\n}\n\nexport interface DepositEvent {\n assetID: number\n transaction: WalletTransaction\n cexCredit: number\n}\n\nexport interface WithdrawalEvent {\n id: string\n assetID: number\n transaction: WalletTransaction\n cexDebit: number\n}\n\nexport interface BalanceEffects {\n settled: Record<number, number>\n pending: Record<number, number>\n locked: Record<number, number>\n reserved: Record<number, number>\n}\n\nexport interface MarketMakingEvent {\n id: number\n timestamp: number\n balanceEffects: BalanceEffects\n pending: boolean\n dexOrderEvent?: DEXOrderEvent\n cexOrderEvent?: CEXOrderEvent\n depositEvent?: DepositEvent\n withdrawalEvent?: WithdrawalEvent\n}\n\ninterface MarketDay {\n vol: number\n quoteVol: number\n priceChange: number\n priceChangePct: number\n avgPrice: number\n lastPrice: number\n openPrice: number\n highPrice: number\n lowPrice: number\n}\n\nexport interface CEXMarket {\n baseID: number\n quoteID: number\n baseMinWithdraw: number\n quoteMinWithdraw: number\n day: MarketDay\n}\n\nexport interface OracleReport {\n host: string\n usdVol: number\n bestBuy: number\n bestSell: number\n}\n\nexport interface ExchangeBalance {\n available: number\n locked: number\n}\n\n// changing the order of the elements in this enum will affect\n// the sorting of the peers table in wallets.ts.\nexport enum PeerSource {\n WalletDefault,\n UserAdded,\n Discovered,\n}\n\nexport interface BalanceState {\n fiatRates: Record<number, number>\n balances: Record<number, BotBalance>\n invMods: Record<number, number>\n}\n\nexport interface Amount {\n atoms: number\n conventional: number\n fmt: string\n usd: number\n fmtUSD: string\n}\n\nexport interface ProfitLoss {\n initial: Record<number, Amount>\n initialUSD: number\n mods: Record<number, Amount>\n modsUSD: number\n final: Record<number, Amount>\n finalUSD: number\n diffs: Record<number, Amount>\n profit: number\n profitRatio: number\n}\n\nexport interface StampedBotConfig {\n timestamp: number\n cfg: BotConfig\n}\n\nexport interface MarketMakingRunOverview {\n endTime: number\n cfgs: StampedBotConfig[]\n initialBalances: Record<number, number>\n profitLoss: ProfitLoss\n finalState: BalanceState\n}\n\nexport interface WalletPeer {\n addr: string\n source: PeerSource\n connected: boolean\n}\n\nexport interface TicketTransaction {\n hash: string\n ticketPrice: number\n fees: number\n stamp: number\n blockHeight: number\n}\n\nexport interface Ticket {\n tx: TicketTransaction\n status: number\n spender: string\n}\n\nexport interface TBChoice {\n id: string\n description: string\n}\n\nexport interface TBAgenda {\n id: string\n description: string\n currentChoice: string\n choices: TBChoice[]\n}\n\nexport interface TKeyPolicyResult {\n key: string\n policy: string\n ticket?: string\n}\n\nexport interface TBTreasurySpend {\n hash: string\n value: number\n currentPolicy: string\n}\n\nexport interface Stances {\n agendas: TBAgenda[]\n tspends: TBTreasurySpend[]\n treasuryKeys: TKeyPolicyResult[]\n}\n\nexport interface TicketStats {\n totalRewards: number\n ticketCount: number\n votes: number\n revokes: number\n mempool: number\n queued: number\n}\n\nexport interface TicketStakingStatus {\n ticketPrice: number\n votingSubsidy: number\n vsp: string\n isRPC: boolean\n tickets: Ticket[]\n stances: Stances\n stats: TicketStats\n}\n\n// VotingServiceProvider is information about a voting service provider.\nexport interface VotingServiceProvider {\n url: string\n network: number\n launched: number\n lastUpdated: number\n apiVersions: number[]\n feePercentage: number\n closed: boolean\n voting: number\n voted: number\n revoked: number\n vspdVersion: string\n blockHeight: number\n netShare: number\n}\n\nexport interface BondTxInfo {\n bondID: string\n lockTime: number\n accountID: string\n}\n\nexport interface WalletTransaction {\n type: number\n id: string\n amount: number\n fees: number\n timestamp: number\n blockNumber: number\n tokenID?: number\n recipient?: string\n bondInfo?: BondTxInfo\n additionalData: Record<string, string>\n}\n\nexport interface TxHistoryResult {\n txs : WalletTransaction[]\n lastTx: boolean\n}\n\nexport const PrepaidBondID = 2147483647\n\nexport interface Application {\n assets: Record<number, SupportedAsset>\n seedGenTime: number\n user: User\n mmStatus: MarketMakingStatus\n header: HTMLElement\n headerSpace: HTMLElement\n walletMap: Record<number, WalletState>\n exchanges: Record<string, Exchange>\n fiatRatesMap: Record<number, number>\n showPopups: boolean\n commitHash: string\n authed: boolean\n start (): Promise<void>\n reconnected (): void\n fetchUser (): Promise<User | void>\n fetchMMStatus (): Promise<User | void>\n loadPage (page: string, data?: any, skipPush?: boolean): Promise<boolean>\n attach (data: any): void\n bindTooltips (ancestor: HTMLElement): void\n bindUrlHandlers (ancestor: HTMLElement): void\n attachHeader (): void\n updateMarketElements (ancestor: PageElement, baseID: number, quoteID: number, xc?: Exchange): void\n showDropdown (icon: HTMLElement, dialog: HTMLElement): void\n ackNotes (): void\n setNoteTimes (noteList: HTMLElement): void\n bindInternalNavigation (ancestor: HTMLElement): void\n updateMenuItemsDisplay (): void\n attachCommon (node: HTMLElement): void\n updateBondConfs (dexAddr: string, coinID: string, confs: number, assetID: number): void\n handleBondNote (note: BondNote): void\n loggedIn (notes: CoreNote[], pokes: CoreNote[]): void\n setPokes(pokes: CoreNote[]): void\n botStatus (host: string, baseID: number, quoteID: number): MMBotStatus | undefined\n notify (note: CoreNote): void\n log (loggerID: string, ...msg: any): void\n prependPokeElement (note: CoreNote): void\n prependNoteElement (note: CoreNote, skipSave?: boolean): void\n prependListElement (noteList: HTMLElement, note: CoreNote, el: NoteElement): void\n loading (el: HTMLElement): () => void\n orders (host: string, mktID: string): Order[]\n haveActiveOrders (assetID: number): boolean\n order (oid: string): Order | null\n canAccelerateOrder(order: Order): boolean\n unitInfo (assetID: number, xc?: Exchange): UnitInfo\n baseChainSymbol (assetID: number): string\n extensionWallet (assetID: number): ExtensionConfiguredWallet | undefined\n conventionalRate (baseID: number, quoteID: number, encRate: number, xc?: Exchange): number\n walletDefinition (assetID: number, walletType: string): WalletDefinition\n currentWalletDefinition (assetID: number): WalletDefinition\n fetchBalance (assetID: number): Promise<WalletBalance>\n checkResponse (resp: APIResponse): boolean\n signOut (): Promise<void>\n registerNoteFeeder (receivers: Record<string, (n: CoreNote) => void>): void\n txHistory(assetID: number, n: number, after?: string): Promise<TxHistoryResult>\n getWalletTx(assetID: number, txid: string): WalletTransaction | undefined\n clearTxHistory(assetID: number): void\n parentAsset(assetID: number): SupportedAsset\n needsCustomProvider (assetID: number): Promise<boolean>\n}\n\n// TODO: Define an interface for Application?\nlet application: Application\n\nexport function registerApplication (a: Application) {\n application = a\n}\n\nexport function app (): Application {\n return application\n}\n","import Doc from './doc'\nimport {\n PageElement,\n XYRange,\n OrderOption\n} from './registry'\n\ninterface OptionsReporters {\n enable: () => void\n disable: () => void\n}\n\n// Having the caller set these vars on load using an exported function makes\n// life easier.\nlet orderOptTmpl: HTMLElement, booleanOptTmpl: HTMLElement, rangeOptTmpl: HTMLElement\n\n// setOptionTemplates sets the package vars for the templates and application.\nexport function setOptionTemplates (page: Record<string, PageElement>): void {\n [booleanOptTmpl, rangeOptTmpl, orderOptTmpl] = [page.booleanOptTmpl, page.rangeOptTmpl, page.orderOptTmpl]\n}\n\nconst threeSigFigs = new Intl.NumberFormat(Doc.languages(), {\n minimumSignificantDigits: 3,\n maximumSignificantDigits: 3\n})\n\n/*\n * Option is a base class for option elements. Option stores some common\n * parameters and monitors the toggle switch, calling the child class's\n * enable/disable methods when the user manually turns the option on or off.\n */\nexport class Option {\n opt: OrderOption\n node: HTMLElement\n tmpl: Record<string, PageElement>\n on: boolean\n\n constructor (opt: OrderOption, symbol: string, report: OptionsReporters) {\n this.opt = opt\n const node = this.node = orderOptTmpl.cloneNode(true) as HTMLElement\n const tmpl = this.tmpl = Doc.parseTemplate(node)\n\n tmpl.optName.textContent = opt.displayname\n tmpl.tooltip.dataset.tooltip = opt.description\n\n // const isBaseChain = (isSwapOption && order.sell) || (!isSwapOption && !order.sell)\n // const symbol = isBaseChain ? this.baseSymbol() : this.quoteSymbol()\n if (symbol) tmpl.chainIcon.src = Doc.logoPath(symbol)\n else Doc.hide(tmpl.chainIcon)\n\n this.on = false\n Doc.bind(node, 'click', () => {\n if (this.on) return\n this.on = true\n node.classList.add('selected')\n report.enable()\n })\n Doc.bind(tmpl.toggle, 'click', e => {\n if (!this.on) return\n e.stopPropagation()\n this.on = false\n node.classList.remove('selected')\n report.disable()\n })\n }\n}\n\n/*\n * BooleanOption is a simple on/off option with a short summary of it's effects.\n * BooleanOrderOption is the handler for a *BooleanConfig from client/asset.\n */\nexport class BooleanOption extends Option {\n control: HTMLElement\n changed: () => void\n dict: Record<string, any>\n\n constructor (opt: OrderOption, symbol: string, dict: Record<string, any>, changed: () => void) {\n super(opt, symbol, {\n enable: () => this.enable(),\n disable: () => this.disable()\n })\n this.dict = dict\n this.changed = () => changed()\n if (opt.boolean === undefined) throw Error('not a boolean opt')\n const cfg = opt.boolean\n const control = this.control = booleanOptTmpl.cloneNode(true) as HTMLElement\n // Append to parent's options div.\n this.tmpl.controls.appendChild(control)\n const tmpl = Doc.parseTemplate(control)\n tmpl.reason.textContent = cfg.reason\n this.on = typeof dict[opt.key] !== 'undefined' ? dict[opt.key] : opt.default\n if (this.on) this.node.classList.add('selected')\n }\n\n store (): void {\n if (this.on === this.opt.default) delete this.dict[this.opt.key]\n else this.dict[this.opt.key] = this.on\n this.changed()\n }\n\n enable (): void {\n this.store()\n }\n\n disable (): void {\n this.store()\n }\n}\n\n/*\n * XYRangeOption is an order option that contains an XYRangeHandler. The logic\n * for handling the slider to is defined in XYRangeHandler so that the slider\n * can be used without being contained in an order option.\n */\nexport class XYRangeOption extends Option {\n handler: XYRangeHandler\n x: number\n changed: () => void\n dict: Record<string, any>\n\n constructor (opt: OrderOption, symbol: string, dict: Record<string, any>, changed: () => void) {\n super(opt, symbol, {\n enable: () => this.enable(),\n disable: () => this.disable()\n })\n this.dict = dict\n this.changed = changed\n if (opt.xyRange === undefined) throw Error('not an xy range opt')\n const cfg = opt.xyRange\n const setVal = dict[opt.key]\n this.on = typeof setVal !== 'undefined'\n if (this.on) {\n this.node.classList.add('selected')\n this.x = setVal\n } else {\n this.x = opt.default\n }\n const selected = () => { this.node.classList.add('selected') }\n this.handler = new XYRangeHandler(cfg, this.x, { changed, selected, settingsDict: dict, settingsKey: opt.key })\n this.tmpl.controls.appendChild(this.handler.control)\n }\n\n enable (): void {\n this.dict[this.opt.key] = this.x\n this.changed()\n }\n\n disable (): void {\n delete this.dict[this.opt.key]\n this.changed()\n }\n\n setValue (x: number): void {\n this.handler.setValue(x)\n this.on = true\n this.node.classList.add('selected')\n }\n}\n\ninterface AcceptOpts {\n skipChange?: boolean\n skipUpdate?: boolean // Implies skipChange\n}\n\ninterface RangeHandlerOpts {\n roundY?: boolean\n roundX?: boolean\n updated?: (x:number, y:number) => void, // fires while dragging.\n changed?: () => void, // does not fire while dragging but does when dragging ends.\n selected?: () => void,\n disabled?: boolean\n settingsDict?: {[key: string]: any}\n settingsKey?: string\n convert?: (x: number, y: number) => any\n}\n\n/*\n * XYRangeHandler is the handler for an *XYRange from client/asset. XYRange\n * has a slider which allows adjusting the x and y, linearly between two limits.\n * The user can also manually enter values for x or y.\n */\nexport class XYRangeHandler {\n control: HTMLElement\n range: XYRange\n tmpl: Record<string, PageElement>\n initVal: number\n settingsDict?: {[key: string]: any}\n settingsKey: string\n x: number\n scrollingX: number\n y: number\n r: number\n roundX: boolean\n roundY: boolean\n disabled: boolean\n updated: (x:number, y:number) => void // called while dragging\n changed: () => void // not called while dragging, but called when done dragging\n selected: () => void\n convert: (x: number, y: number) => any\n\n constructor (\n range: XYRange,\n initVal: number,\n opts: RangeHandlerOpts\n ) {\n const control = this.control = rangeOptTmpl.cloneNode(true) as HTMLElement\n const tmpl = this.tmpl = Doc.parseTemplate(control)\n tmpl.rangeLblStart.textContent = range.start.label\n tmpl.rangeLblEnd.textContent = range.end.label\n tmpl.xUnit.textContent = range.xUnit\n tmpl.yUnit.textContent = range.yUnit\n this.range = range\n this.initVal = initVal\n this.settingsDict = opts.settingsDict\n this.settingsKey = opts.settingsKey ?? ''\n this.roundX = Boolean(opts.roundX)\n this.roundY = Boolean(opts.roundY)\n\n this.setDisabled(Boolean(opts.disabled))\n this.changed = opts.changed ?? (() => { /* pass */ })\n this.selected = opts.selected ?? (() => { /* pass */ })\n this.updated = opts.updated ?? (() => { /* pass */ })\n this.convert = opts.convert || ((x: number) => x)\n\n const { slider, handle } = tmpl\n const rangeX = range.end.x - range.start.x\n const rangeY = range.end.y - range.start.y\n const normalizeX = (x: number) => (x - range.start.x) / rangeX\n\n // r, x, and y will be updated by the various input event handlers. r is\n // x (or y) normalized on its range, e.g. [x_min, x_max] -> [0, 1]\n this.r = normalizeX(initVal)\n this.scrollingX = this.x = initVal\n this.y = this.r * rangeY + range.start.y\n this.accept(this.scrollingX, { skipUpdate: true })\n\n // Set up the handlers for the x and y text input fields.\n const clickOutX = (e: MouseEvent) => {\n if (this.disabled) return\n if (e.type !== 'change' && e.target === tmpl.xInput) return\n const s = tmpl.xInput.value\n if (s) {\n const xx = parseFloat(s)\n if (!isNaN(xx)) {\n this.scrollingX = clamp(xx, range.start.x, range.end.x)\n this.r = normalizeX(this.scrollingX)\n this.y = this.r * rangeY + range.start.y\n this.accept(this.scrollingX)\n }\n }\n Doc.hide(tmpl.xInput)\n Doc.show(tmpl.x)\n Doc.unbind(document, 'click', clickOutX)\n this.changed()\n }\n\n Doc.bind(tmpl.x, 'click', e => {\n if (this.disabled) return\n Doc.hide(tmpl.x)\n Doc.show(tmpl.xInput)\n tmpl.xInput.focus()\n tmpl.xInput.value = threeSigFigs.format(this.scrollingX)\n Doc.bind(document, 'click', clickOutX)\n e.stopPropagation()\n })\n\n Doc.bind(tmpl.xInput, 'change', clickOutX)\n\n const clickOutY = (e: MouseEvent) => {\n if (this.disabled) return\n if (e.type !== 'change' && e.target === tmpl.yInput) return\n const s = tmpl.yInput.value\n if (s) {\n const yy = parseFloat(s)\n if (!isNaN(yy)) {\n this.y = clamp(yy, range.start.y, range.end.y)\n this.r = (this.y - range.start.y) / rangeY\n this.scrollingX = range.start.x + this.r * rangeX\n this.accept(this.scrollingX)\n }\n }\n Doc.hide(tmpl.yInput)\n Doc.show(tmpl.y)\n Doc.unbind(document, 'click', clickOutY)\n this.changed()\n }\n\n Doc.bind(tmpl.y, 'click', e => {\n if (this.disabled) return\n Doc.hide(tmpl.y)\n Doc.show(tmpl.yInput)\n tmpl.yInput.focus()\n tmpl.yInput.value = threeSigFigs.format(this.y)\n Doc.bind(document, 'click', clickOutY)\n e.stopPropagation()\n })\n\n Doc.bind(tmpl.yInput, 'change', clickOutY)\n\n // Read the slider.\n Doc.bind(handle, 'mousedown', (e: MouseEvent) => {\n if (this.disabled) return\n if (e.button !== 0) return\n e.preventDefault()\n e.stopPropagation()\n this.selected()\n const startX = e.pageX\n const w = slider.clientWidth - handle.offsetWidth\n const startLeft = normalizeX(this.scrollingX) * w\n const left = (ee: MouseEvent) => Math.max(Math.min(startLeft + (ee.pageX - startX), w), 0)\n const trackMouse = (ee: MouseEvent, emit?: boolean) => {\n ee.preventDefault()\n this.r = left(ee) / w\n this.scrollingX = this.r * rangeX + range.start.x\n this.y = this.r * rangeY + range.start.y\n this.accept(this.scrollingX, { skipChange: !emit })\n }\n const mouseUp = (ee: MouseEvent) => {\n trackMouse(ee, true)\n Doc.unbind(document, 'mousemove', trackMouse)\n Doc.unbind(document, 'mouseup', mouseUp)\n this.changed()\n }\n Doc.bind(document, 'mousemove', trackMouse)\n Doc.bind(document, 'mouseup', mouseUp)\n })\n\n Doc.bind(tmpl.sliderBox, 'click', (e: MouseEvent) => {\n if (this.disabled) return\n if (e.button !== 0) return\n const x = e.pageX\n const m = Doc.layoutMetrics(tmpl.slider)\n this.r = clamp((x - m.bodyLeft) / m.width, 0, 1)\n this.scrollingX = this.r * rangeX + range.start.x\n this.y = this.r * rangeY + range.start.y\n this.accept(this.scrollingX)\n })\n }\n\n setDisabled (disabled: boolean) {\n this.control.classList.toggle('disabled', disabled)\n this.disabled = disabled\n }\n\n setXLabel (s: string) {\n this.tmpl.x.textContent = s\n }\n\n setYLabel (s: string) {\n this.tmpl.y.textContent = s\n }\n\n accept (x: number, cfg?: AcceptOpts): void {\n const tmpl = this.tmpl\n if (this.roundX) x = Math.round(x)\n if (this.roundY) this.y = Math.round(this.y)\n tmpl.x.textContent = threeSigFigs.format(x)\n tmpl.y.textContent = threeSigFigs.format(this.y)\n if (this.roundY) tmpl.y.textContent = `${this.y}`\n const rEffective = clamp(this.r, 0, 1)\n tmpl.handle.style.left = `calc(${rEffective * 100}% - ${rEffective * 14}px)`\n this.x = x\n this.scrollingX = x\n cfg = cfg ?? {}\n if (this.settingsDict) this.settingsDict[this.settingsKey] = this.convert(this.x, this.y)\n if (!cfg.skipUpdate) {\n this.updated(x, this.y)\n if (!cfg.skipChange) this.changed()\n }\n }\n\n setValue (x: number, skipUpdate?: boolean) {\n const range = this.range\n this.r = (x - range.start.x) / (range.end.x - range.start.x)\n this.y = range.start.y + this.r * (range.end.y - range.start.y)\n this.accept(x, { skipUpdate })\n }\n\n modified (): boolean {\n return this.x !== this.initVal\n }\n\n reset () {\n this.setValue(this.initVal, true)\n }\n}\n\nconst clamp = (v: number, min: number, max: number): number => v < min ? min : v > max ? max : v\n","export default class BasePage {\n /* unload is called when the user navigates away from the page. */\n unload () {\n // should be implemented by inheriting class.\n }\n}\n","import * as intl from './locales'\nimport {\n app,\n Order,\n TradeForm,\n OrderOption,\n Match\n} from './registry'\nimport { BooleanOption, XYRangeOption } from './opts'\nimport Doc from './doc'\n\nexport const Limit = 1 // TODO: Delete for the versions below\nexport const Market = 2 // TODO: Delete for the versions below\nexport const Cancel = 3 // TODO: Delete for the versions below\n\nexport const OrderTypeLimit = 1\nexport const OrderTypeMarket = 2\nexport const OrderTypeCancel = 3\n\n/* The time-in-force specifiers are a mirror of dex/order.TimeInForce. */\nexport const ImmediateTiF = 0\nexport const StandingTiF = 1\n\n/* The order statuses are a mirror of dex/order.OrderStatus. */\nexport const StatusUnknown = 0\nexport const StatusEpoch = 1\nexport const StatusBooked = 2\nexport const StatusExecuted = 3\nexport const StatusCanceled = 4\nexport const StatusRevoked = 5\n\n/* The match statuses are a mirror of dex/order.MatchStatus. */\nexport const NewlyMatched = 0\nexport const MakerSwapCast = 1\nexport const TakerSwapCast = 2\nexport const MakerRedeemed = 3\nexport const MatchComplete = 4\nexport const MatchConfirmed = 5\n\n/* The match sides are a mirror of dex/order.MatchSide. */\nexport const Maker = 0 // TODO: Delete for the versions below\nexport const Taker = 1 // TODO: Delete for the versions below\n\nexport const MatchSideMaker = 0\nexport const MatchSideTaker = 1\n\n/*\n * RateEncodingFactor is used when encoding an atomic exchange rate as an\n * integer. See docs on message-rate encoding @\n * https://github.com/decred/dcrdex/blob/master/spec/comm.mediawiki#Rate_Encoding\n */\nexport const RateEncodingFactor = 1e8\n\nexport function sellString (ord: Order) {\n const key = ord.sell ? intl.ID_SELL : intl.ID_BUY\n const lang = document.documentElement.lang.toLowerCase()\n return intl.prep(key).toLocaleLowerCase(lang)\n}\n\nexport function typeString (ord: Order) {\n return ord.type === Limit ? (ord.tif === ImmediateTiF ? intl.prep(intl.ID_LIMIT_ORDER_IMMEDIATE_TIF) : intl.prep(intl.ID_LIMIT_ORDER)) : intl.prep(intl.ID_MARKET_ORDER)\n}\n\n/* isMarketBuy will return true if the order is a market buy order. */\nexport function isMarketBuy (ord: Order) {\n return ord.type === Market && !ord.sell\n}\n\n/*\n * hasActiveMatches returns true if the order has matches that have not completed\n * settlement yet.\n */\nexport function hasActiveMatches (order: Order) {\n if (!order.matches) return false\n for (const match of order.matches) {\n if (match.active) return true\n }\n return false\n}\n\n/**\n * statusString converts the order status to a string.\n *\n * IMPORTANT: we have similar function in Golang, it must match this one exactly,\n * when updating make sure to update both!\n */\nexport function statusString (order: Order): string {\n if (!order.id) return intl.prep(intl.ID_ORDER_SUBMITTING) // order ID is empty.\n const isLive = hasActiveMatches(order)\n switch (order.status) {\n case StatusUnknown: return intl.prep(intl.ID_UNKNOWN)\n case StatusEpoch: return intl.prep(intl.ID_EPOCH)\n case StatusBooked:\n if (order.cancelling) return intl.prep(intl.ID_CANCELING)\n return isLive ? `${intl.prep(intl.ID_BOOKED)}/${intl.prep(intl.ID_SETTLING)}` : intl.prep(intl.ID_BOOKED)\n case StatusExecuted:\n if (isLive) return intl.prep(intl.ID_SETTLING)\n if (order.filled === 0 && order.type !== Cancel) return intl.prep(intl.ID_NO_MATCH)\n return intl.prep(intl.ID_EXECUTED)\n case StatusCanceled:\n return isLive ? `${intl.prep(intl.ID_CANCELED)}/${intl.prep(intl.ID_SETTLING)}` : intl.prep(intl.ID_CANCELED)\n case StatusRevoked:\n return isLive ? `${intl.prep(intl.ID_REVOKED)}/${intl.prep(intl.ID_SETTLING)}` : intl.prep(intl.ID_REVOKED)\n }\n return intl.prep(intl.ID_UNKNOWN)\n}\n\n/* filled sums the quantities of non-cancel matches available. */\nexport function filled (order: Order) {\n if (!order.matches) return 0\n const qty = isMarketBuy(order) ? (m: Match) => m.qty * m.rate / RateEncodingFactor : (m: Match) => m.qty\n return order.matches.reduce((filled, match) => {\n if (match.isCancel) return filled\n return filled + qty(match)\n }, 0)\n}\n\n/* settled sums the quantities of the matches that have completed. */\nexport function settled (order: Order) {\n if (!order.matches) return 0\n const qty = isMarketBuy(order) ? (m: Match) => m.qty * m.rate / RateEncodingFactor : (m: Match) => m.qty\n return order.matches.reduce((settled, match) => {\n if (match.isCancel) return settled\n const redeemed = (match.side === Maker && match.status >= MakerRedeemed) ||\n (match.side === Taker && match.status >= MatchComplete)\n return redeemed ? settled + qty(match) : settled\n }, 0)\n}\n\n/* averageRateString returns a formatting string containing the average rate of\nthe matches that have been filled for a market order. */\nexport function averageMarketOrderRateString (ord: Order): string {\n if (!ord.matches?.length) return intl.prep(intl.ID_MARKET_ORDER)\n let rateStr = Doc.formatCoinValue(app().conventionalRate(ord.baseID, ord.quoteID, averageRate(ord)))\n if (ord.matches.length > 1) rateStr = '~ ' + rateStr // \"~\" only makes sense if the order has more than one match.\n return rateStr\n}\n\n/* averageRate returns a the average rate of the matches that have been filled\nin an order. */\nexport function averageRate (ord: Order): number {\n if (!ord.matches?.length) return 0\n let rateProduct = 0\n let baseQty = 0\n for (const m of ord.matches) {\n baseQty += m.qty\n rateProduct += (m.rate * m.qty) // order ~ 1e16\n }\n return rateProduct / baseQty\n}\n\n/* baseToQuote returns the quantity of the quote asset. */\nexport function baseToQuote (rate: number, base: number) : number {\n return rate * base / RateEncodingFactor\n}\n\n/* orderPortion returns a string stating the percentage of the order a match\n makes up. */\nexport function orderPortion (order: Order, match: Match) : string {\n let matchQty = match.qty\n if (isMarketBuy(order)) {\n matchQty = baseToQuote(match.rate, match.qty)\n }\n return ((matchQty / order.qty) * 100).toFixed(1) + ' %'\n}\n\n/*\n * matchStatusString is a string used to create a displayable string describing\n * describing the match status.\n */\nexport function matchStatusString (m: Match) {\n if (m.revoked) {\n // When revoked, match status is less important than pending action if still\n // active, or the outcome if inactive.\n if (m.active) {\n if (m.redeem) return revokedMatchStatus(intl.ID_MATCH_STATUS_REDEMPTION_SENT) // must require confirmation if active\n // If maker and we have not redeemed, waiting to refund, assuming it's not\n // revoked while waiting for confs on an unspent/unexpired taker swap.\n if (m.side === Maker) return revokedMatchStatus(intl.ID_MATCH_STATUS_REFUND_PENDING)\n // As taker, resolution depends on maker's actions while waiting to refund.\n if (m.counterRedeem) return revokedMatchStatus(intl.ID_MATCH_STATUS_REDEEM_PENDING) // this should be very brief if we see the maker's redeem\n return revokedMatchStatus(intl.ID_MATCH_STATUS_REFUND_PENDING) // may switch to redeem if maker redeems on the sly\n }\n if (m.refund) {\n return revokedMatchStatus(intl.ID_MATCH_STATUS_REFUNDED)\n }\n if (m.redeem) {\n return revokedMatchStatus(intl.ID_MATCH_STATUS_REDEMPTION_CONFIRMED)\n }\n return revokedMatchStatus(intl.ID_MATCH_STATUS_COMPLETE) // i.e. we sent no swap\n }\n\n switch (m.status) {\n case NewlyMatched:\n return intl.prep(intl.ID_MATCH_STATUS_NEWLY_MATCHED)\n case MakerSwapCast:\n return intl.prep(intl.ID_MATCH_STATUS_MAKER_SWAP_CAST)\n case TakerSwapCast:\n return intl.prep(intl.ID_MATCH_STATUS_TAKER_SWAP_CAST)\n case MakerRedeemed:\n if (m.side === Maker) {\n return intl.prep(intl.ID_MATCH_STATUS_REDEMPTION_SENT)\n }\n return intl.prep(intl.ID_MATCH_STATUS_MAKER_REDEEMED)\n case MatchComplete:\n return intl.prep(intl.ID_MATCH_STATUS_REDEMPTION_SENT)\n case MatchConfirmed:\n return intl.prep(intl.ID_MATCH_STATUS_REDEMPTION_CONFIRMED)\n }\n return intl.prep(intl.ID_UNKNOWN)\n}\n\n// revokedMatchStatus is a helper function that returns the revoked match status\n// string.\nfunction revokedMatchStatus (matchStatus: string): string {\n return intl.prep(intl.ID_MATCH_STATUS_REVOKED, { status: intl.prep(matchStatus) })\n}\n\n/*\n * optionElement is a getter for an element matching the *OrderOption from\n * client/asset. change is a function with no arguments that is called when the\n * returned option's value has changed.\n */\nexport function optionElement (opt: OrderOption, order: TradeForm, change: () => void, isSwap: boolean): HTMLElement {\n const isBaseChain = (isSwap && order.sell) || (!isSwap && !order.sell)\n const symbol = isBaseChain ? dexAssetSymbol(order.host, order.base) : dexAssetSymbol(order.host, order.quote)\n\n switch (true) {\n case !!opt.boolean:\n return new BooleanOption(opt, symbol, order.options, change).node\n case !!opt.xyRange:\n return new XYRangeOption(opt, symbol, order.options, change).node\n default:\n console.error('no option type specified', opt)\n }\n console.error('unknown option type', opt)\n return document.createElement('div')\n}\n\nfunction dexAssetSymbol (host: string, assetID: number): string {\n return app().exchanges[host].assets[assetID].symbol\n}\n\nexport function isCancellable (ord: Order): boolean {\n return ord.type === Limit && ord.tif === StandingTiF && ord.status < StatusExecuted\n}\n\nexport function orderTypeText (ordType: number): string {\n switch (ordType) {\n case OrderTypeLimit:\n return intl.prep(intl.ID_LIMIT_ORDER)\n case OrderTypeMarket:\n return intl.prep(intl.ID_MARKET_ORDER)\n default: // OrderTypeCancel\n return intl.prep(intl.ID_CANCEL_ORDER)\n }\n}\n","import Doc, { Animation, clamp } from './doc'\nimport { RateEncodingFactor } from './orderutil'\nimport OrderBook from './orderbook'\nimport State from './state'\nimport { UnitInfo, Market, Candle, CandlesPayload, app } from './registry'\n\nconst bind = Doc.bind\nconst PIPI = 2 * Math.PI\nconst plusChar = String.fromCharCode(59914)\nconst minusChar = String.fromCharCode(59915)\n\ninterface Point {\n x: number\n y: number\n}\n\ninterface MinMax {\n min: number\n max: number\n}\n\ninterface Label {\n val: number\n txt: string\n}\n\ninterface LabelSet {\n widest?: number\n lbls: Label[]\n}\n\nexport interface Translator {\n x: (x: number) => number\n y: (y: number) => number\n unx: (x: number) => number\n uny: (y: number) => number\n w: (w: number) => number\n h: (h: number) => number\n}\n\nexport interface MouseReport {\n rate: number\n depth: number\n dotColor: string\n hoverMarkers: number[]\n}\n\nexport interface VolumeReport {\n buyBase: number\n buyQuote: number\n sellBase: number\n sellQuote: number\n}\n\nexport interface DepthReporters {\n mouse: (r: MouseReport | null) => void\n click: (x: number) => void\n volume: (r: VolumeReport) => void\n zoom: (z: number) => void\n}\n\nexport interface CandleReporters {\n mouse: (r: Candle | null) => void\n}\n\nexport interface ChartReporters {\n resize: () => void,\n click: (e: MouseEvent) => void,\n zoom: (bigger: boolean) => void\n}\n\nexport interface DepthLine {\n rate: number\n color: string\n}\n\nexport interface DepthMarker {\n rate: number\n active: boolean\n}\n\ninterface DepthMark extends DepthMarker {\n qty: number\n sell: boolean\n}\n\ninterface Theme {\n body: string\n axisLabel: string\n gridBorder: string\n gridLines: string\n gapLine: string\n value: string\n zoom: string\n zoomHover: string\n sellLine: string\n buyLine: string\n sellFill: string\n buyFill: string\n crosshairs: string\n legendFill: string\n legendText: string\n}\n\nconst darkTheme: Theme = {\n body: '#0b2031',\n axisLabel: '#b1b1b1',\n gridBorder: '#383f4b',\n gridLines: '#383f4b',\n gapLine: '#6b6b6b',\n value: '#9a9a9a',\n zoom: '#5b5b5b',\n zoomHover: '#aaa',\n sellLine: '#ae3333',\n buyLine: '#05a35a',\n sellFill: '#591a1a',\n buyFill: '#02572f',\n crosshairs: '#888',\n legendFill: 'black',\n legendText: '#d5d5d5'\n}\n\nconst lightTheme: Theme = {\n body: '#f4f4f4',\n axisLabel: '#1b1b1b',\n gridBorder: '#ddd',\n gridLines: '#ddd',\n gapLine: '#595959',\n value: '#4d4d4d',\n zoom: '#777',\n zoomHover: '#333',\n sellLine: '#99302b',\n buyLine: '#207a46',\n sellFill: '#bd5959',\n buyFill: '#4cad75',\n crosshairs: '#595959',\n legendFill: '#e6e6e6',\n legendText: '#1b1b1b'\n}\n\n// Chart is the base class for charts.\nexport class Chart {\n parent: HTMLElement\n report: ChartReporters\n theme: Theme\n canvas: HTMLCanvasElement\n visible: boolean\n renderScheduled: boolean\n ctx: CanvasRenderingContext2D\n mousePos: Point | null\n rect: DOMRect\n wheelLimiter: number | null\n boundResizer: () => void\n plotRegion: Region\n xRegion: Region\n yRegion: Region\n dataExtents: Extents\n unattachers: (() => void)[]\n\n constructor (parent: HTMLElement, reporters: ChartReporters) {\n this.parent = parent\n this.report = reporters\n this.theme = State.isDark() ? darkTheme : lightTheme\n this.canvas = document.createElement('canvas')\n this.visible = true\n parent.appendChild(this.canvas)\n const ctx = this.canvas.getContext('2d')\n if (!ctx) {\n console.error('error getting canvas context')\n return\n }\n this.ctx = ctx\n this.ctx.textAlign = 'center'\n this.ctx.textBaseline = 'middle'\n // Mouse handling\n this.mousePos = null\n bind(this.canvas, 'mousemove', (e: MouseEvent) => {\n // this.rect will be set in resize().\n if (!this.rect) return\n this.mousePos = {\n x: e.clientX - this.rect.left,\n y: e.clientY - this.rect.y\n }\n this.draw()\n })\n bind(this.canvas, 'mouseleave', () => {\n this.mousePos = null\n this.draw()\n })\n\n // Bind resize.\n const resizeObserver = new ResizeObserver(() => this.resize())\n resizeObserver.observe(this.parent)\n\n // Scrolling by wheel is smoother when the rate is slightly limited.\n this.wheelLimiter = null\n bind(this.canvas, 'wheel', (e: WheelEvent) => { this.wheel(e) }, { passive: true })\n bind(this.canvas, 'click', (e: MouseEvent) => { this.click(e) })\n const setVis = () => {\n this.visible = document.visibilityState !== 'hidden'\n if (this.visible && this.renderScheduled) {\n this.renderScheduled = false\n this.draw()\n }\n }\n bind(document, 'visibilitychange', setVis)\n this.unattachers = [() => { Doc.unbind(document, 'visibilitychange', setVis) }]\n }\n\n wheeled () {\n this.wheelLimiter = window.setTimeout(() => { this.wheelLimiter = null }, 100)\n }\n\n /* clear the canvas. */\n clear () {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\n }\n\n /* draw calls the child class's render method. */\n draw () {\n this.render()\n }\n\n /* click is the handler for a click event on the canvas. */\n click (e: MouseEvent) {\n this.report.click(e)\n }\n\n /* wheel is a mousewheel event handler. */\n wheel (e: WheelEvent) {\n this.zoom(e.deltaY < 0)\n }\n\n /*\n * resize updates the chart size. The parentHeight is an argument to support\n * updating the height programmatically after the caller sets a style.height\n * but before the clientHeight has been updated.\n */\n resize () {\n this.canvas.width = this.parent.clientWidth\n this.canvas.height = this.parent.clientHeight\n const xLblHeight = 30\n const yGuess = 40 // y label width guess. Will be adjusted when drawn.\n const plotExtents = new Extents(0, this.canvas.width, 0, this.canvas.height - xLblHeight)\n const xLblExtents = new Extents(0, this.canvas.width, this.canvas.height - xLblHeight, this.canvas.height)\n const yLblExtents = new Extents(0, yGuess, 0, this.canvas.height - xLblHeight)\n this.plotRegion = new Region(this.ctx, plotExtents)\n this.xRegion = new Region(this.ctx, xLblExtents)\n this.yRegion = new Region(this.ctx, yLblExtents)\n // After changing the visibility, this.canvas.getBoundingClientRect will\n // return nonsense until a render.\n window.requestAnimationFrame(() => {\n this.rect = this.canvas.getBoundingClientRect()\n this.report.resize()\n })\n }\n\n /* zoom is called when the user scrolls the mouse wheel on the canvas. */\n zoom (bigger: boolean) {\n if (this.wheelLimiter) return\n this.report.zoom(bigger)\n }\n\n /* The market handler will call unattach when the markets page is unloaded. */\n unattach () {\n for (const u of this.unattachers) u()\n this.unattachers = []\n }\n\n /* render must be implemented by the child class. */\n render () {\n console.error('child class must override render method')\n }\n\n /* applyLabelStyle applies the style used for axis tick labels. */\n applyLabelStyle (fontSize?: number) {\n this.ctx.textAlign = 'center'\n this.ctx.textBaseline = 'middle'\n this.ctx.font = `${fontSize ?? '14'}px 'sans', sans-serif`\n this.ctx.fillStyle = this.theme.axisLabel\n }\n\n /* plotXLabels applies the provided labels to the x axis and draws the grid. */\n plotXLabels (labels: LabelSet, minX: number, maxX: number, unitLines: string[]) {\n const extents = new Extents(minX, maxX, 0, 1)\n this.xRegion.plot(extents, (ctx: CanvasRenderingContext2D, tools: Translator) => {\n this.applyLabelStyle()\n const centerX = (maxX + minX) / 2\n let lastX = minX\n let unitCenter = centerX\n const [leftEdge, rightEdge] = [tools.x(minX), tools.x(maxX)]\n const centerY = tools.y(0.5)\n labels.lbls.forEach(lbl => {\n const m = ctx.measureText(lbl.txt)\n const x = tools.x(lbl.val)\n if (x - m.width / 2 < leftEdge || x + m.width / 2 > rightEdge) return\n ctx.fillText(lbl.txt, x, centerY)\n if (centerX >= lastX && centerX < lbl.val) {\n unitCenter = (lastX + lbl.val) / 2\n }\n lastX = lbl.val\n })\n ctx.font = '11px \\'sans\\', sans-serif'\n if (unitLines.length === 2) {\n ctx.fillText(unitLines[0], tools.x(unitCenter), tools.y(0.63))\n ctx.fillText(unitLines[1], tools.x(unitCenter), tools.y(0.23))\n } else if (unitLines.length === 1) {\n ctx.fillText(unitLines[0], tools.x(unitCenter), centerY)\n }\n }, true)\n }\n\n plotXGrid (labels: LabelSet, minX: number, maxX: number) {\n const extents = new Extents(minX, maxX, 0, 1)\n this.plotRegion.plot(extents, (ctx: CanvasRenderingContext2D, tools: Translator) => {\n ctx.lineWidth = 1\n ctx.strokeStyle = this.theme.gridLines\n labels.lbls.forEach(lbl => {\n line(ctx, tools.x(lbl.val), tools.y(0), tools.x(lbl.val), tools.y(1))\n })\n }, true)\n }\n\n /*\n * plotYLabels applies the y labels based on the provided plot region, and\n * draws the grid.\n */\n plotYLabels (labels: LabelSet, minY: number, maxY: number, unit: string) {\n const extents = new Extents(0, 1, minY, maxY)\n\n const fillRect = (ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, r: number) => {\n ctx.save()\n ctx.fillStyle = this.theme.body\n ctx.beginPath()\n if (ctx.roundRect) ctx.roundRect(x, y, w, h, r) // Safari < 16 doesn't support\n else ctx.rect(x, y, w, h)\n ctx.fill()\n ctx.restore()\n }\n\n this.yRegion.plot(extents, (ctx: CanvasRenderingContext2D, tools: Translator) => {\n this.applyLabelStyle()\n this.ctx.textAlign = 'left'\n const centerY = maxY / 2\n let lastY = 0\n let unitCenter = centerY\n const x = tools.x(0)\n const [xPad, yPad] = [3, 3]\n labels.lbls.forEach(lbl => {\n const y = tools.y(lbl.val)\n if (y < tools.y(maxY) + yPad + 7 || y > tools.y(minY) - yPad - 7) return\n const m = ctx.measureText(lbl.txt)\n fillRect(ctx, x, y - 7 - yPad, m.width + xPad * 2, 14 + yPad * 3, 3)\n ctx.fillText(lbl.txt, x + xPad, y + 2)\n if (centerY >= lastY && centerY < lbl.val) {\n unitCenter = (lastY + lbl.val) / 2\n }\n lastY = lbl.val\n })\n const m = ctx.measureText(unit)\n const y = tools.y(unitCenter)\n fillRect(ctx, x, y - yPad - 7, m.width + xPad * 2, 14 + yPad * 2, 3)\n ctx.fillText(unit, x + xPad, tools.y(unitCenter))\n }, true)\n }\n\n plotYGrid (region: Region, labels: LabelSet, minY: number, maxY: number) {\n const extents = new Extents(0, 1, minY, maxY)\n region.plot(extents, (ctx: CanvasRenderingContext2D, tools: Translator) => {\n ctx.lineWidth = 1\n ctx.strokeStyle = this.theme.gridLines\n labels.lbls.forEach(lbl => {\n line(ctx, tools.x(0), tools.y(lbl.val), tools.x(1), tools.y(lbl.val))\n })\n }, true)\n }\n\n /*\n * doYLabels generates and applies the y-axis labels, based upon the\n * provided plot region.\n */\n makeYLabels (region: Region, step: number, unit: string, valFmt?: (v: number) => string): LabelSet {\n this.applyLabelStyle()\n const yLabels = makeLabels(this.ctx, region.height(), this.dataExtents.y.min,\n this.dataExtents.y.max, 50, step, unit, valFmt)\n\n // Reassign the width of the y-label column to accommodate the widest text.\n const yAxisWidth = (yLabels.widest || 0) + 20 /* x padding */\n this.yRegion.extents.x.max = yAxisWidth\n this.yRegion.extents.y.max = region.extents.y.max\n\n return yLabels\n }\n\n line (x0: number, y0: number, x1: number, y1: number, skipStroke?: boolean) {\n line(this.ctx, x0, y0, x1, y1, skipStroke)\n }\n\n /* dot draws a circle with the provided context. */\n dot (x: number, y: number, color: string, radius: number) {\n dot(this.ctx, x, y, color, radius)\n }\n}\n\n/* DepthChart is a javascript Canvas-based depth chart renderer. */\nexport class DepthChart extends Chart {\n reporters: DepthReporters\n book: OrderBook\n zoomLevel: number\n lotSize: number\n conventionalRateStep: number\n lines: DepthLine[]\n markers: Record<string, DepthMarker[]>\n zoomInBttn: Region\n zoomOutBttn: Region\n baseUnit: string\n quoteUnit: string\n\n constructor (parent: HTMLElement, reporters: DepthReporters, zoom: number) {\n super(parent, {\n resize: () => this.resized(),\n click: (e: MouseEvent) => this.clicked(e),\n zoom: (bigger: boolean) => this.zoomed(bigger)\n })\n this.reporters = reporters\n this.zoomLevel = zoom\n this.lines = []\n this.markers = {\n buys: [],\n sells: []\n }\n this.setZoomBttns() // can't wait for requestAnimationFrame -> resized\n this.resize()\n }\n\n // setZoomBttns creates new regions for zoom in and zoom out buttons. It is\n // used in initiation of the buttons and resizing.\n setZoomBttns () {\n this.zoomInBttn = new Region(this.ctx, new Extents(0, 0, 0, 0))\n this.zoomOutBttn = new Region(this.ctx, new Extents(0, 0, 0, 0))\n }\n\n /* resized is called when the window or parent element are resized. */\n resized () {\n // The button region extents are set during drawing.\n this.setZoomBttns()\n if (this.book) this.draw()\n }\n\n /* zoomed zooms the current view in or out. bigger=true is zoom in. */\n zoomed (bigger: boolean) {\n if (!this.zoomLevel) return\n if (!this.book.buys || !this.book.sells) return\n this.wheeled()\n // Zoom in to 66%, but out to 150% = 1 / (2/3) so that the same zoom levels\n // are hit when reversing direction.\n this.zoomLevel *= bigger ? 2 / 3 : 3 / 2\n this.zoomLevel = clamp(this.zoomLevel, 0.005, 2)\n this.draw()\n this.reporters.zoom(this.zoomLevel)\n }\n\n /* clicked is the canvas 'click' event handler. */\n clicked (e: MouseEvent) {\n if (!this.dataExtents) return\n const x = e.clientX - this.rect.left\n const y = e.clientY - this.rect.y\n if (this.zoomInBttn.contains(x, y)) { this.zoom(true); return }\n if (this.zoomOutBttn.contains(x, y)) { this.zoom(false); return }\n const translator = this.plotRegion.translator(this.dataExtents)\n this.reporters.click(translator.unx(x))\n }\n\n // set sets the current data set and draws.\n set (book: OrderBook, lotSize: number, rateStepEnc: number, baseUnitInfo: UnitInfo, quoteUnitInfo: UnitInfo) {\n this.book = book\n this.lotSize = lotSize / baseUnitInfo.conventional.conversionFactor\n this.conventionalRateStep = Doc.conventionalRateStep(rateStepEnc, baseUnitInfo, quoteUnitInfo)\n this.baseUnit = baseUnitInfo.conventional.unit\n this.quoteUnit = quoteUnitInfo.conventional.unit\n if (!this.zoomLevel) {\n const [midGap, gapWidth] = this.gap()\n // Default to 5% zoom, but with a minimum of 5 * midGap, but still observing\n // the hard cap of 200%.\n const minZoom = Math.max(gapWidth / midGap * 5, 0.05)\n this.zoomLevel = Math.min(minZoom, 2)\n }\n this.draw()\n }\n\n /*\n * render draws the chart.\n * 1. Calculate the data extents and translate the order book data to a\n * cumulative form.\n * 2. Draw axis ticks and grid, mid-gap line and value, zoom buttons, mouse\n * position indicator...\n * 4. Tick labels.\n * 5. Data.\n * 6. Epoch line legend.\n * 7. Hover legend.\n */\n render () {\n // if connection fails it is not possible to get book.\n if (!this.book || !this.visible || this.canvas.width === 0) {\n this.renderScheduled = true\n return\n }\n\n this.clear()\n // if (!this.book || this.book.empty()) return\n const ctx = this.ctx\n const mousePos = this.mousePos\n const buys = this.book.buys\n const sells = this.book.sells\n\n const [midGap, gapWidth] = this.gap()\n\n const halfWindow = this.zoomLevel * midGap / 2\n const high = midGap + halfWindow\n const low = midGap - halfWindow\n\n // Get a sorted copy of the markers list.\n const buyMarkers = [...this.markers.buys]\n const sellMarkers = [...this.markers.sells]\n buyMarkers.sort((a, b) => b.rate - a.rate)\n sellMarkers.sort((a, b) => a.rate - b.rate)\n const markers: DepthMark[] = []\n\n const buyDepth: [number, number][] = []\n const buyEpoch: [number, number][] = []\n const sellDepth: [number, number][] = []\n const sellEpoch: [number, number][] = []\n const volumeReport = {\n buyBase: 0,\n buyQuote: 0,\n sellBase: 0,\n sellQuote: 0\n }\n let sum = 0\n // The epoch line is above the non-epoch region, so the epochSum y value\n // must account for non-epoch orders too.\n let epochSum = 0\n\n for (let i = 0; i < buys.length; i++) {\n const ord = buys[i]\n epochSum += ord.qty\n if (ord.rate >= low) buyEpoch.push([ord.rate, epochSum])\n if (ord.epoch) continue\n sum += ord.qty\n buyDepth.push([ord.rate, sum])\n volumeReport.buyBase += ord.qty\n volumeReport.buyQuote += ord.qty * ord.rate\n while (buyMarkers.length && floatCompare(buyMarkers[0].rate, ord.rate)) {\n const mark = buyMarkers.shift()\n if (!mark) continue\n markers.push({\n rate: mark.rate,\n qty: ord.epoch ? epochSum : sum,\n sell: ord.sell,\n active: mark.active\n })\n }\n }\n const buySum = buyDepth.length ? last(buyDepth)[1] : 0\n buyDepth.push([low, buySum])\n const epochBuySum = buyEpoch.length ? last(buyEpoch)[1] : 0\n buyEpoch.push([low, epochBuySum])\n\n epochSum = sum = 0\n for (let i = 0; i < sells.length; i++) {\n const ord = sells[i]\n epochSum += ord.qty\n if (ord.rate <= high) sellEpoch.push([ord.rate, epochSum])\n if (ord.epoch) continue\n sum += ord.qty\n sellDepth.push([ord.rate, sum])\n volumeReport.sellBase += ord.qty\n volumeReport.sellQuote += ord.qty * ord.rate\n while (sellMarkers.length && floatCompare(sellMarkers[0].rate, ord.rate)) {\n const mark = sellMarkers.shift()\n if (!mark) continue\n markers.push({\n rate: mark.rate,\n qty: ord.epoch ? epochSum : sum,\n sell: ord.sell,\n active: mark.active\n })\n }\n }\n // Add a data point going to the left so that the data doesn't end with a\n // vertical line.\n const sellSum = sellDepth.length ? last(sellDepth)[1] : 0\n sellDepth.push([high, sellSum])\n const epochSellSum = sellEpoch.length ? last(sellEpoch)[1] : 0\n sellEpoch.push([high, epochSellSum])\n\n // Add ~30px padding to the top of the chart.\n const h = this.xRegion.extents.y.min\n const growthFactor = (h + 40) / h\n const maxY = (epochSellSum && epochBuySum ? Math.max(epochBuySum, epochSellSum) : epochSellSum || epochBuySum || 1) * growthFactor\n\n const dataExtents = new Extents(low, high, 0, maxY)\n this.dataExtents = dataExtents\n\n // A function to be run at the end if there is legend data to display.\n let mouseData: MouseReport | null = null\n\n // Draw the grid.\n const xLabels = makeLabels(ctx, this.plotRegion.width(), dataExtents.x.min, dataExtents.x.max, 100, this.conventionalRateStep, '')\n this.plotXGrid(xLabels, low, high)\n const yLabels = this.makeYLabels(this.plotRegion, this.lotSize, this.baseUnit)\n this.plotYGrid(this.plotRegion, yLabels, this.dataExtents.y.min, this.dataExtents.y.max)\n\n this.plotRegion.plot(dataExtents, (ctx, tools) => {\n ctx.lineWidth = 1\n // first, a square around the plot area.\n ctx.strokeStyle = this.theme.gridBorder\n // draw a line to indicate mid-gap\n ctx.lineWidth = 2.5\n ctx.strokeStyle = this.theme.gapLine\n line(ctx, tools.x(midGap), tools.y(0), tools.x(midGap), tools.y(0.3 * dataExtents.y.max))\n\n ctx.font = '30px \\'demi-sans\\', sans-serif'\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillStyle = this.theme.value\n const y = 0.5 * dataExtents.y.max\n ctx.fillText(Doc.formatFourSigFigs(midGap), tools.x(midGap), tools.y(y))\n ctx.font = '12px \\'sans\\', sans-serif'\n // ctx.fillText('mid-market price', tools.x(midGap), tools.y(y) + 24)\n ctx.fillText(`${(gapWidth / midGap * 100).toFixed(2)}% spread`,\n tools.x(midGap), tools.y(y) + 24)\n\n // Draw zoom buttons.\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n const topCenterX = this.plotRegion.extents.midX\n const topCenterY = tools.y(maxY * 0.9)\n const zoomPct = dataExtents.xRange / midGap * 100\n const zoomText = `${zoomPct.toFixed(1)}%`\n const w = ctx.measureText(zoomText).width\n ctx.font = '13px \\'sans\\', sans-serif'\n ctx.fillText(zoomText, topCenterX, topCenterY + 1)\n // define the region for the zoom button\n const bttnSize = 20\n const xPad = 10\n let bttnLeft = topCenterX - w / 2 - xPad - bttnSize\n const bttnTop = topCenterY - bttnSize / 2\n this.zoomOutBttn.setExtents(\n bttnLeft,\n bttnLeft + bttnSize,\n bttnTop,\n bttnTop + bttnSize\n )\n let hover = mousePos && this.zoomOutBttn.contains(mousePos.x, mousePos.y)\n this.zoomOutBttn.plot(new Extents(0, 1, 0, 1), ctx => {\n ctx.font = '12px \\'icomoon\\''\n ctx.fillStyle = this.theme.zoom\n if (hover) {\n ctx.fillStyle = this.theme.zoomHover\n ctx.font = '13px \\'icomoon\\''\n }\n ctx.fillText(minusChar, this.zoomOutBttn.extents.midX, this.zoomOutBttn.extents.midY)\n })\n bttnLeft = topCenterX + w / 2 + xPad\n this.zoomInBttn.setExtents(\n bttnLeft,\n bttnLeft + bttnSize,\n bttnTop,\n bttnTop + bttnSize\n )\n hover = mousePos && this.zoomInBttn.contains(mousePos.x, mousePos.y)\n this.zoomInBttn.plot(new Extents(0, 1, 0, 1), ctx => {\n ctx.font = '12px \\'icomoon\\''\n ctx.fillStyle = this.theme.zoom\n if (hover) {\n ctx.fillStyle = this.theme.zoomHover\n ctx.font = '14px \\'icomoon\\''\n }\n ctx.fillText(plusChar, this.zoomInBttn.extents.midX, this.zoomInBttn.extents.midY)\n })\n\n // Draw a dotted vertical line where the mouse is, and a dot at the level\n // of the depth line.\n const drawLine = (x: number, color: string) => {\n if (x > high || x < low) return\n ctx.save()\n ctx.setLineDash([3, 5])\n ctx.lineWidth = 1.5\n ctx.strokeStyle = color\n line(ctx, tools.x(x), tools.y(0), tools.x(x), tools.y(maxY))\n ctx.restore()\n }\n\n // for (const line of this.lines || []) {\n // drawLine(line.rate, line.color)\n // }\n\n const tolerance = (high - low) * 0.005\n const hoverMarkers = []\n for (const marker of markers || []) {\n const hovered = (mousePos && withinTolerance(marker.rate, tools.unx(mousePos.x), tolerance))\n if (hovered) hoverMarkers.push(marker.rate)\n ctx.save()\n ctx.lineWidth = (hovered || marker.active) ? 5 : 3\n ctx.strokeStyle = marker.sell ? this.theme.sellLine : this.theme.buyLine\n ctx.fillStyle = marker.sell ? this.theme.sellFill : this.theme.buyFill\n const size = (hovered || marker.active) ? 10 : 8\n ctx.beginPath()\n const tip = {\n x: tools.x(marker.rate),\n y: tools.y(marker.qty) - 8\n }\n const top = tip.y - (Math.sqrt(3) * size / 2) // cos(30)\n ctx.moveTo(tip.x, tip.y)\n ctx.lineTo(tip.x - size / 2, top)\n ctx.lineTo(tip.x + size / 2, top)\n ctx.closePath()\n ctx.stroke()\n ctx.fill()\n ctx.restore()\n }\n\n // If the mouse is in the chart area, draw the crosshairs.\n if (!mousePos) return\n if (!this.plotRegion.contains(mousePos.x, mousePos.y)) return\n // The mouse is in the plot region. Get the data coordinates and find the\n // side and depth for the x value.\n const dataX = tools.unx(mousePos.x)\n let evalSide = sellDepth\n let trigger = (ptX: number) => ptX >= dataX\n let dotColor = this.theme.sellLine\n if (dataX < midGap) {\n evalSide = buyDepth\n trigger = (ptX) => ptX <= dataX\n dotColor = this.theme.buyLine\n }\n let bestDepth = evalSide[0]\n for (let i = 0; i < evalSide.length; i++) {\n const pt = evalSide[i]\n if (trigger(pt[0])) break\n bestDepth = pt\n }\n drawLine(dataX, this.theme.crosshairs)\n mouseData = {\n rate: dataX,\n depth: bestDepth[1],\n dotColor: dotColor,\n hoverMarkers: hoverMarkers\n }\n })\n\n // Draw the epoch lines\n ctx.lineWidth = 1.5\n ctx.setLineDash([3, 3])\n // epoch sells\n ctx.fillStyle = this.theme.sellFill\n ctx.strokeStyle = this.theme.sellLine\n this.drawDepth(sellEpoch)\n // epoch buys\n ctx.fillStyle = this.theme.buyFill\n ctx.strokeStyle = this.theme.buyLine\n this.drawDepth(buyEpoch)\n\n // Draw the book depth.\n ctx.lineWidth = 2.5\n ctx.setLineDash([])\n // book sells\n ctx.fillStyle = this.theme.sellFill\n ctx.strokeStyle = this.theme.sellLine\n this.drawDepth(sellDepth)\n // book buys\n ctx.fillStyle = this.theme.buyFill\n ctx.strokeStyle = this.theme.buyLine\n this.drawDepth(buyDepth)\n\n this.plotYLabels(yLabels, this.dataExtents.y.min, this.dataExtents.y.max, this.baseUnit)\n this.plotXLabels(xLabels, low, high, [`${this.quoteUnit}/`, this.baseUnit])\n\n // Display the dot at the intersection of the mouse hover line and the depth\n // line. This should be drawn after the depths.\n if (mouseData) {\n this.plotRegion.plot(dataExtents, (ctx, tools) => {\n if (!mouseData) return // For TypeScript. Duh.\n dot(ctx, tools.x(mouseData.rate), tools.y(mouseData.depth), mouseData.dotColor, 5)\n })\n }\n\n // Report the book volumes.\n this.reporters.volume(volumeReport)\n this.reporters.mouse(mouseData)\n }\n\n /* drawDepth draws a single side's depth chart data. */\n drawDepth (depth: [number, number][]) {\n const firstPt = depth[0]\n let x: number\n this.plotRegion.plot(this.dataExtents, (ctx, tools) => {\n const yZero = tools.y(0)\n let y = tools.y(firstPt[1])\n ctx.beginPath()\n ctx.moveTo(tools.x(firstPt[0]), tools.y(firstPt[1]))\n for (let i = 0; i < depth.length; i++) {\n // Set x, but don't set y until we draw the horizontal line.\n x = tools.x(depth[i][0])\n ctx.lineTo(x, y)\n // If this is past the render edge, quit drawing.\n y = tools.y(depth[i][1])\n ctx.lineTo(x, y)\n }\n ctx.stroke()\n ctx.lineTo(x, yZero)\n ctx.lineTo(tools.x(firstPt[0]), yZero)\n ctx.closePath()\n ctx.globalAlpha = 0.25\n ctx.fill()\n })\n }\n\n /* returns the mid-gap rate and gap width as a tuple. */\n gap () {\n const [b, s] = [this.book.bestGapBuy(), this.book.bestGapSell()]\n if (!b) {\n if (!s) return [1, 0]\n return [s.rate, 0]\n } else if (!s) return [b.rate, 0]\n return [(s.rate + b.rate) / 2, s.rate - b.rate]\n }\n\n /* setLines stores the indicator lines to draw. */\n setLines (lines: DepthLine[]) {\n this.lines = lines\n }\n\n /* setMarkers sets the indicator markers to draw. */\n setMarkers (markers: Record<string, DepthMarker[]>) {\n this.markers = markers\n }\n}\n\n/* CandleChart is a candlestick data renderer. */\nexport class CandleChart extends Chart {\n reporters: CandleReporters\n data: CandlesPayload\n zoomLevel: number\n numToShow: number\n candleRegion: Region\n volumeRegion: Region\n resizeTimer: number\n zoomLevels: number[]\n market: Market\n rateConversionFactor: number\n\n constructor (parent: HTMLElement, reporters: CandleReporters) {\n super(parent, {\n resize: () => this.resized(),\n click: (/* e: MouseEvent */) => { this.clicked() },\n zoom: (bigger: boolean) => this.zoomed(bigger)\n })\n this.reporters = reporters\n this.zoomLevel = 1\n this.numToShow = 100\n this.resize()\n }\n\n /* resized is called when the window or parent element are resized. */\n resized () {\n const ext = this.plotRegion.extents\n const candleExtents = new Extents(ext.x.min, ext.x.max, ext.y.min, ext.y.min + ext.yRange * 0.85)\n this.candleRegion = new Region(this.ctx, candleExtents)\n const volumeExtents = new Extents(ext.x.min, ext.x.max, ext.y.min + 0.85 * ext.yRange, ext.y.max)\n this.volumeRegion = new Region(this.ctx, volumeExtents)\n // Set a delay on the render to prevent lag.\n if (this.resizeTimer) clearTimeout(this.resizeTimer)\n this.resizeTimer = window.setTimeout(() => this.draw(), 100)\n }\n\n clicked (/* e: MouseEvent */) {\n // handle clicks\n }\n\n /* zoomed zooms the current view in or out. bigger=true is zoom in. */\n zoomed (bigger: boolean) {\n // bigger actually means fewer candles -> reduce zoomLevels index.\n const idx = this.zoomLevels.indexOf(this.numToShow)\n if (bigger) {\n if (idx === 0) return\n this.numToShow = this.zoomLevels[idx - 1]\n } else {\n if (this.zoomLevels.length <= idx + 1 || this.numToShow > this.data.candles.length) return\n this.numToShow = this.zoomLevels[idx + 1]\n }\n this.draw()\n }\n\n /* render draws the chart */\n render () {\n const data = this.data\n if (!data || !this.visible || this.canvas.width === 0) {\n this.renderScheduled = true\n return\n }\n const candleWidth = data.ms\n const mousePos = this.mousePos\n const allCandles = data.candles || []\n\n const n = Math.min(this.numToShow, allCandles.length)\n const candles = allCandles.slice(allCandles.length - n)\n\n this.clear()\n\n // If there are no candles. just don't draw anything.\n if (n === 0) return\n\n // padding definition and some helper functions to parse candles.\n const candleWidthPadding = 0.2\n const start = (c: Candle) => truncate(c.endStamp, candleWidth)\n const end = (c: Candle) => start(c) + candleWidth\n const paddedStart = (c: Candle) => start(c) + candleWidthPadding * candleWidth\n const paddedWidth = (1 - 2 * candleWidthPadding) * candleWidth\n\n const first = candles[0]\n const last = candles[n - 1]\n\n let [high, low, highVol] = [first.highRate, first.lowRate, first.matchVolume]\n for (const c of candles) {\n if (c.highRate > high) high = c.highRate\n if (c.lowRate < low) low = c.lowRate\n if (c.matchVolume > highVol) highVol = c.matchVolume\n }\n\n high += (high - low) * 0.1 // a little padding\n const xStart = start(first)\n let xEnd = end(last)\n xEnd += (xEnd - xStart) * 0.05 // a little padding\n\n // Calculate data extents and store them. They are used to apply labels.\n const rateStep = this.market.ratestep\n const dataExtents = new Extents(xStart, xEnd, low, high)\n if (low === high) {\n // If there is no price movement at all in the window, show a little more\n // top and bottom so things render nicely.\n dataExtents.y.min -= rateStep\n dataExtents.y.max += rateStep\n }\n this.dataExtents = dataExtents\n\n let mouseCandle: Candle | null = null\n if (mousePos) {\n this.plotRegion.plot(new Extents(dataExtents.x.min, dataExtents.x.max, 0, 1), (ctx, tools) => {\n const selectedStartStamp = truncate(tools.unx(mousePos.x), candleWidth)\n for (const c of candles) {\n if (start(c) === selectedStartStamp) {\n mouseCandle = c\n ctx.fillStyle = this.theme.gridLines\n ctx.fillRect(tools.x(start(c)), tools.y(0), tools.w(candleWidth), tools.h(1))\n break\n }\n }\n })\n }\n\n // Draw the grid\n const rFactor = this.rateConversionFactor\n const baseUnit = app().assets[this.market.baseid]?.unitInfo.conventional.unit || this.market.basesymbol.toUpperCase()\n const xLabels = makeCandleTimeLabels(candles, candleWidth, this.plotRegion.width(), 100)\n this.plotXGrid(xLabels, xStart, xEnd)\n const yLabels = this.makeYLabels(this.candleRegion, rateStep, baseUnit, v => Doc.formatFourSigFigs(v / rFactor))\n this.plotYGrid(this.candleRegion, yLabels, this.dataExtents.y.min, this.dataExtents.y.max)\n\n // Draw the volume bars.\n const volDataExtents = new Extents(xStart, xEnd, 0, highVol)\n this.volumeRegion.plot(volDataExtents, (ctx, tools) => {\n ctx.fillStyle = this.theme.gridBorder\n for (const c of candles) {\n ctx.fillRect(tools.x(paddedStart(c)), tools.y(0), tools.w(paddedWidth), tools.h(c.matchVolume))\n }\n })\n\n // Draw the candles.\n this.candleRegion.plot(dataExtents, (ctx, tools) => {\n ctx.lineWidth = 1\n for (const c of candles) {\n const desc = c.startRate > c.endRate\n const [x, y, w, h] = [tools.x(paddedStart(c)), tools.y(c.startRate), tools.w(paddedWidth), tools.h(c.endRate - c.startRate)]\n const [high, low, cx] = [tools.y(c.highRate), tools.y(c.lowRate), w / 2 + x]\n ctx.strokeStyle = desc ? this.theme.sellLine : this.theme.buyLine\n ctx.fillStyle = desc ? this.theme.sellFill : this.theme.buyFill\n\n ctx.beginPath()\n ctx.moveTo(cx, high)\n ctx.lineTo(cx, low)\n ctx.stroke()\n\n ctx.fillRect(x, y, w, h)\n ctx.strokeRect(x, y, w, h)\n }\n })\n\n // Apply labels.\n this.plotXLabels(xLabels, xStart, xEnd, [])\n this.plotYLabels(yLabels, this.dataExtents.y.min, this.dataExtents.y.max, baseUnit)\n\n // Highlight the candle if the user mouse is over the canvas.\n if (mouseCandle) {\n const yExt = this.xRegion.extents.y\n this.xRegion.plot(new Extents(dataExtents.x.min, dataExtents.x.max, yExt.min, yExt.max), (ctx, tools) => {\n if (!mouseCandle) return // For TypeScript. Duh.\n this.applyLabelStyle()\n const rangeTxt = `${new Date(start(mouseCandle)).toLocaleString()} - ${new Date(end(mouseCandle)).toLocaleString()}`\n const [xPad, yPad] = [25, 2]\n const rangeWidth = ctx.measureText(rangeTxt).width + 2 * xPad\n const rangeHeight = 16\n let centerX = tools.x((start(mouseCandle) + end(mouseCandle)) / 2)\n let left = centerX - rangeWidth / 2\n const xExt = this.xRegion.extents.x\n if (left < xExt.min) left = xExt.min\n else if (left + rangeWidth > xExt.max) left = xExt.max - rangeWidth\n centerX = left + rangeWidth / 2\n const top = yExt.min + (this.xRegion.height() - rangeHeight) / 2\n ctx.fillStyle = this.theme.legendFill\n ctx.strokeStyle = this.theme.gridBorder\n const rectArgs: [number, number, number, number] = [left - xPad, top - yPad, rangeWidth + 2 * xPad, rangeHeight + 2 * yPad]\n ctx.fillRect(...rectArgs)\n ctx.strokeRect(...rectArgs)\n this.applyLabelStyle()\n ctx.fillText(rangeTxt, centerX, this.xRegion.extents.midY, rangeWidth)\n })\n }\n\n // Report the mouse candle.\n this.reporters.mouse(mouseCandle)\n }\n\n /* setCandles sets the candle data and redraws the chart. */\n setCandles (data: CandlesPayload, market: Market, baseUnitInfo: UnitInfo, quoteUnitInfo: UnitInfo) {\n this.data = data\n if (!data.candles) return\n this.market = market\n const [qFactor, bFactor] = [quoteUnitInfo.conventional.conversionFactor, baseUnitInfo.conventional.conversionFactor]\n this.rateConversionFactor = RateEncodingFactor * qFactor / bFactor\n let n = 25\n this.zoomLevels = []\n const maxCandles = Math.max(data.candles.length, 1000)\n while (n < maxCandles) {\n this.zoomLevels.push(n)\n n *= 2\n }\n this.numToShow = 100\n this.draw()\n }\n}\n\ninterface WaveOpts {\n message?: string\n backgroundColor?: string | boolean // true for <body> background color\n}\n\n/* Wave is a loading animation that displays a colorful line that oscillates */\nexport class Wave extends Chart {\n ani: Animation\n size: [number, number]\n region: Region\n colorShift: number\n opts: WaveOpts\n msgRegion: Region\n fontSize: number\n\n constructor (parent: HTMLElement, opts?: WaveOpts) {\n super(parent, {\n resize: () => this.resized(),\n click: (/* e: MouseEvent */) => { /* pass */ },\n zoom: (/* bigger: boolean */) => { /* pass */ }\n })\n this.canvas.classList.add('fill-abs')\n this.canvas.style.zIndex = '5'\n\n this.opts = opts ?? {}\n\n const period = 1500 // ms\n const start = Math.random() * period\n this.colorShift = Math.random() * 360\n\n // y = A*cos(k*x + theta*t + c)\n // combine three waves with different periods and speeds and phases.\n const amplitudes = [1, 0.65, 0.75]\n const ks = [3, 3, 2]\n const speeds = [Math.PI, Math.PI * 10 / 9, Math.PI / 2.5]\n const phases = [0, 0, Math.PI * 1.5]\n const n = 75\n const single = (n: number, angularX: number, angularTime: number): number => {\n return amplitudes[n] * Math.cos(ks[n] * angularX + speeds[n] * angularTime + phases[n])\n }\n const value = (x: number, angularTime: number): number => {\n const angularX = x * Math.PI * 2\n return (single(0, angularX, angularTime) + single(1, angularX, angularTime) + single(2, angularX, angularTime)) / 3\n }\n this.resize()\n this.ani = new Animation(Animation.Forever, () => {\n const angularTime = (new Date().getTime() - start) / period * Math.PI * 2\n const values = []\n for (let i = 0; i < n; i++) {\n values.push(value(i / (n - 1), angularTime))\n }\n this.drawValues(values)\n })\n }\n\n resized () {\n const opts = this.opts\n const [maxW, maxH] = [150, 100]\n const [cw, ch] = [this.canvas.width, this.canvas.height]\n let [w, h] = [cw * 0.8, ch * 0.8]\n if (w > maxW) w = maxW\n if (h > maxH) h = maxH\n let [l, t] = [(cw - w) / 2, (ch - h) / 2]\n if (opts.message) {\n this.fontSize = clamp(h * 0.15, 10, 14)\n this.applyLabelStyle(this.fontSize)\n const ypad = this.fontSize * 0.5\n const halfH = (this.fontSize / 2) + ypad\n t -= halfH\n this.msgRegion = new Region(this.ctx, new Extents(0, cw, t + h, t + h + 2 * halfH))\n }\n this.region = new Region(this.ctx, new Extents(l, l + w, t, t + h))\n }\n\n drawValues (values: number[]) {\n if (!this.region) return\n this.clear()\n const hsl = (h: number) => `hsl(${h}, 35%, 50%)`\n\n const { region, msgRegion, canvas: { width: w, height: h }, opts: { backgroundColor: bg, message: msg }, colorShift, ctx } = this\n\n if (bg) {\n if (bg === true) ctx.fillStyle = State.isDark() ? '#0a1e34' : '#f0f0f0'\n else ctx.fillStyle = bg\n ctx.fillRect(0, 0, w, h)\n }\n\n region.plot(new Extents(0, 1, -1, 1), (ctx: CanvasRenderingContext2D, t: Translator) => {\n ctx.lineWidth = 4\n ctx.lineCap = 'round'\n\n const shift = colorShift + (new Date().getTime() % 2000) / 2000 * 360 // colors move with frequency 1 / 2s\n const grad = ctx.createLinearGradient(t.x(0), 0, t.x(1), 0)\n grad.addColorStop(0, hsl(shift))\n ctx.strokeStyle = grad\n\n ctx.beginPath()\n ctx.moveTo(t.x(0), t.y(values[0]))\n for (let i = 1; i < values.length; i++) {\n const prog = i / (values.length - 1)\n grad.addColorStop(prog, hsl(prog * 300 + shift))\n ctx.lineTo(t.x(prog), t.y(values[i]))\n }\n ctx.stroke()\n })\n if (!msg) return\n msgRegion.plot(new Extents(0, 1, 0, 1), (ctx: CanvasRenderingContext2D, t: Translator) => {\n this.applyLabelStyle(this.fontSize)\n ctx.fillText(msg, t.x(0.5), t.y(0.5), this.msgRegion.width())\n })\n }\n\n render () { /* pass */ }\n\n stop () {\n this.ani.stop()\n this.canvas.remove()\n }\n}\n\n/*\n * Extents holds a min and max in both the x and y directions, and provides\n * getters for related data.\n */\nexport class Extents {\n x: MinMax\n y: MinMax\n\n constructor (xMin: number, xMax: number, yMin: number, yMax: number) {\n this.setExtents(xMin, xMax, yMin, yMax)\n }\n\n setExtents (xMin: number, xMax: number, yMin: number, yMax: number) {\n this.x = {\n min: xMin,\n max: xMax\n }\n this.y = {\n min: yMin,\n max: yMax\n }\n }\n\n get xRange (): number {\n return this.x.max - this.x.min\n }\n\n get midX (): number {\n return (this.x.max + this.x.min) / 2\n }\n\n get yRange (): number {\n return this.y.max - this.y.min\n }\n\n get midY (): number {\n return (this.y.max + this.y.min) / 2\n }\n}\n\n/*\n * Region applies an Extents to the canvas, providing utilities for coordinate\n * transformations and restricting drawing to a specified region of the canvas.\n */\nexport class Region {\n context: CanvasRenderingContext2D\n extents: Extents\n\n constructor (context: CanvasRenderingContext2D, extents: Extents) {\n this.context = context\n this.extents = extents\n }\n\n setExtents (xMin: number, xMax: number, yMin: number, yMax: number) {\n this.extents.setExtents(xMin, xMax, yMin, yMax)\n }\n\n width (): number {\n return this.extents.xRange\n }\n\n height (): number {\n return this.extents.yRange\n }\n\n contains (x: number, y: number): boolean {\n const ext = this.extents\n return (x < ext.x.max && x > ext.x.min &&\n y < ext.y.max && y > ext.y.min)\n }\n\n /*\n * A translator provides 4 function for coordinate transformations. x and y\n * translate data coordinates to canvas coordinates for the specified data\n * Extents. unx and uny translate canvas coordinates to data coordinates.\n */\n translator (dataExtents: Extents): Translator {\n const region = this.extents\n const xMin = dataExtents.x.min\n // const xMax = dataExtents.x.max\n const yMin = dataExtents.y.min\n // const yMax = dataExtents.y.max\n const yRange = dataExtents.yRange\n const xRange = dataExtents.xRange\n const screenMinX = region.x.min\n const screenW = region.x.max - screenMinX\n const screenMaxY = region.y.max\n const screenH = screenMaxY - region.y.min\n const xFactor = screenW / xRange\n const yFactor = screenH / yRange\n return {\n x: (x: number) => (x - xMin) * xFactor + screenMinX,\n y: (y: number) => screenMaxY - (y - yMin) * yFactor,\n unx: (x: number) => (x - screenMinX) / xFactor + xMin,\n uny: (y: number) => yMin - (y - screenMaxY) / yFactor,\n w: (w: number) => w / xRange * screenW,\n h: (h: number) => -h / yRange * screenH\n }\n }\n\n /* clear clears the region. */\n clear () {\n const ext = this.extents\n this.context.clearRect(ext.x.min, ext.y.min, ext.xRange, ext.yRange)\n }\n\n /* plot prepares tools for drawing using data coordinates. */\n plot (dataExtents: Extents, drawFunc: (ctx: CanvasRenderingContext2D, tools: Translator) => void, skipMask?: boolean) {\n const ctx = this.context\n const region = this.extents\n ctx.save() // Save the original state\n if (!skipMask) {\n ctx.beginPath()\n ctx.rect(region.x.min, region.y.min, region.xRange, region.yRange)\n ctx.clip()\n }\n\n // The drawFunc will be passed a set of tool that can be used to assist\n // drawing. The tools start with the transformation functions.\n const tools = this.translator(dataExtents)\n\n // Create a transformation that allows drawing in data coordinates. It's\n // not advisable to stroke or add text with this transform in place, as the\n // result will be distorted. You can however use ctx.moveTo and ctx.lineTo\n // with this transform in place using data coordinates, and remove the\n // transform before stroking. The dataCoords method of the supplied tool\n // provides this functionality.\n\n // TODO: Figure out why this doesn't work on WebView.\n // const yRange = dataExtents.yRange\n // const xFactor = region.xRange / dataExtents.xRange\n // const yFactor = region.yRange / yRange\n // const xMin = dataExtents.x.min\n // const yMin = dataExtents.y.min\n // // These translation factors are complicated because the (0, 0) of the\n // // region is not necessarily the (0, 0) of the canvas.\n // const tx = (region.x.min + xMin) - xMin * xFactor\n // const ty = -region.y.min - (yRange - yMin) * yFactor\n // const setTransform = () => {\n // // Data coordinates are flipped about y. Flip the coordinates and\n // // translate top left corner to canvas (0, 0).\n // ctx.transform(1, 0, 0, -1, -xMin, yMin)\n // // Scale to data coordinates and shift into place for the region's offset\n // // on the canvas.\n // ctx.transform(xFactor, 0, 0, yFactor, tx, ty)\n // }\n // // dataCoords allows some drawing to be performed directly in data\n // // coordinates. Most actual drawing functions like ctx.stroke and\n // // ctx.fillRect should not be called from inside dataCoords, but\n // // ctx.moveTo and ctx.LineTo are fine.\n // tools.dataCoords = f => {\n // ctx.save()\n // setTransform()\n // f()\n // ctx.restore()\n // }\n\n drawFunc(this.context, tools)\n ctx.restore()\n }\n}\n\n/*\n * makeLabels attempts to create the appropriate labels for the specified\n * screen size, context, and label spacing.\n */\nfunction makeLabels (\n ctx: CanvasRenderingContext2D,\n screenW: number,\n min: number,\n max: number,\n spacingGuess: number,\n step: number,\n unit: string,\n valFmt?: (v: number) => string\n): LabelSet {\n valFmt = valFmt || Doc.formatFourSigFigs\n const n = screenW / spacingGuess\n const diff = max - min\n if (n < 1 || diff <= 0) return { lbls: [] }\n const tickGuess = diff / n\n // make the tick spacing a multiple of the step\n const tick = tickGuess + step - (tickGuess % step)\n let x = min + tick - (min % tick)\n const absMax = Math.max(Math.abs(max), Math.abs(min))\n // The Math.round part is the minimum precision required to see the change in the numbers.\n // The 2 accounts for the precision of the tick.\n const sigFigs = Math.round(Math.log10(absMax / tick)) + 2\n const pts: Label[] = []\n let widest = 0\n while (x < max) {\n x = Number(x.toPrecision(sigFigs))\n const lbl = valFmt(x)\n widest = Math.max(widest, ctx.measureText(lbl).width)\n pts.push({\n val: x,\n txt: lbl\n })\n x += tick\n }\n const unitW = ctx.measureText(unit).width\n if (unitW > widest) widest = unitW\n return {\n widest: widest,\n lbls: pts\n }\n}\n\nconst months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec']\n\n/* makeCandleTimeLabels prepares labels for candlestick data. */\nfunction makeCandleTimeLabels (candles: Candle[], dur: number, screenW: number, spacingGuess: number): LabelSet {\n const first = candles[0]\n const last = candles[candles.length - 1]\n const start = truncate(first.endStamp, dur)\n const end = truncate(last.endStamp, dur) + dur\n const diff = end - start\n const n = Math.min(candles.length, screenW / spacingGuess)\n const tick = truncate(diff / n, dur)\n if (tick === 0) {\n console.error('zero tick', dur, diff, n) // probably won't happen, but it'd suck if it did\n return { lbls: [] }\n }\n let x = start\n const zoneOffset = new Date().getTimezoneOffset()\n const dayStamp = (x: number) => {\n x = x - zoneOffset * 60000\n return x - (x % 86400000)\n }\n let lastDay = dayStamp(start)\n let lastYear = 0 // new Date(start).getFullYear()\n if (dayStamp(first.endStamp) === dayStamp(last.endStamp)) lastDay = 0 // Force at least one day stamp.\n const pts = []\n let label\n if (dur < 86400000) {\n label = (d: Date, x: number) => {\n const day = dayStamp(x)\n if (day !== lastDay) return `${months[d.getMonth()]}${d.getDate()} ${d.getHours()}:${String(d.getMinutes()).padStart(2, '0')}`\n else return `${d.getHours()}:${String(d.getMinutes()).padStart(2, '0')}`\n }\n } else {\n label = (d: Date) => {\n const year = d.getFullYear()\n if (year !== lastYear) return `${months[d.getMonth()]}${d.getDate()} '${String(year).slice(2, 4)}`\n else return `${months[d.getMonth()]}${d.getDate()}`\n }\n }\n while (x <= end) {\n const d = new Date(x)\n pts.push({\n val: x,\n txt: label(d, x)\n })\n lastDay = dayStamp(x)\n lastYear = d.getFullYear()\n x += tick\n }\n return { lbls: pts }\n}\n\n/* The last element of an array. */\nfunction last (arr: any[]): any {\n return arr[arr.length - 1]\n}\n\n/* line draws a line with the provided context. */\nfunction line (ctx: CanvasRenderingContext2D, x0: number, y0: number, x1: number, y1: number, skipStroke?: boolean) {\n ctx.beginPath()\n ctx.moveTo(x0, y0)\n ctx.lineTo(x1, y1)\n if (!skipStroke) ctx.stroke()\n}\n\n/* dot draws a circle with the provided context. */\nfunction dot (ctx: CanvasRenderingContext2D, x: number, y: number, color: string, radius: number) {\n ctx.fillStyle = color\n ctx.beginPath()\n ctx.arc(x, y, radius, 0, PIPI)\n ctx.fill()\n}\n\n/* floatCompare compares two floats to within a tolerance of 1e-8. */\nfunction floatCompare (a: number, b: number) {\n return withinTolerance(a, b, 1e-8)\n}\n\n/*\n * withinTolerance returns true if the difference between a and b are with\n * the specified tolerance.\n */\nfunction withinTolerance (a: number, b: number, tolerance: number) {\n return Math.abs(a - b) < Math.abs(tolerance)\n}\n\nfunction truncate (v: number, w: number): number {\n return v - (v % w)\n}\n","import Doc from './doc'\nimport {\n OrderTypeLimit,\n OrderTypeMarket,\n OrderTypeCancel,\n StatusEpoch,\n StatusBooked,\n RateEncodingFactor,\n MatchSideMaker,\n MakerRedeemed,\n TakerSwapCast,\n ImmediateTiF\n} from './orderutil'\nimport {\n app,\n PageElement,\n ExchangeAuth,\n Order,\n Market\n} from './registry'\n\nexport const bondReserveMultiplier = 2 // Reserves for next bond\nexport const perTierBaseParcelLimit = 2\nexport const parcelLimitScoreMultiplier = 3\n\nexport class ReputationMeter {\n page: Record<string, PageElement>\n host: string\n\n constructor (div: PageElement) {\n this.page = Doc.parseTemplate(div)\n Doc.cleanTemplates(this.page.penaltyMarkerTmpl)\n }\n\n setHost (host: string) {\n this.host = host\n }\n\n update () {\n const { page, host } = this\n const { auth, maxScore, penaltyThreshold } = app().exchanges[host]\n const { rep: { score } } = auth\n\n const displayTier = strongTier(auth)\n\n const minScore = displayTier ? displayTier * penaltyThreshold * -1 : penaltyThreshold * -1 // Just for looks\n const warnPct = 25\n const scorePct = 100 - warnPct\n page.scoreWarn.style.width = `${warnPct}%`\n const pos = score >= 0 ? warnPct + (score / maxScore) * scorePct : warnPct - (Math.min(warnPct, score / minScore * warnPct))\n\n page.scorePointer.style.left = `${pos}%`\n page.scoreMin.textContent = String(minScore)\n page.scoreMax.textContent = String(maxScore)\n const bonus = limitBonus(score, maxScore)\n page.limitBonus.textContent = bonus.toFixed(1)\n for (const m of Doc.applySelector(page.scoreTray, '.penalty-marker')) m.remove()\n if (displayTier > 1) {\n const markerPct = warnPct / displayTier\n for (let i = 1; i < displayTier; i++) {\n const div = page.penaltyMarkerTmpl.cloneNode(true) as PageElement\n page.scoreTray.appendChild(div)\n div.style.left = `${markerPct * i}%`\n }\n }\n page.score.textContent = String(score)\n page.scoreData.classList.remove('negative', 'positive')\n if (score > 0) page.scoreData.classList.add('positive')\n else page.scoreData.classList.add('negative')\n }\n}\n\n/*\n * strongTier is the effective tier, with some respect for bond overlap, such\n * that we don't count weak bonds that have already had their replacements\n * confirmed.\n */\nexport function strongTier (auth: ExchangeAuth): number {\n const { weakStrength, targetTier, effectiveTier } = auth\n if (effectiveTier > targetTier) {\n const diff = effectiveTier - targetTier\n if (weakStrength >= diff) return targetTier\n return targetTier + (diff - weakStrength)\n }\n return effectiveTier\n}\n\nexport function likelyTaker (ord: Order, rate: number): boolean {\n if (ord.type === OrderTypeMarket || ord.tif === ImmediateTiF) return true\n // Must cross the spread to be a taker (not so conservative).\n if (rate === 0) return false\n if (ord.sell) return ord.rate < rate\n return ord.rate > rate\n}\n\nconst preparcelQuantity = (ord: Order, mkt?: Market, midGap?: number) => {\n const qty = ord.qty - ord.filled\n if (ord.type === OrderTypeLimit) return qty\n if (ord.sell) return qty * ord.rate / RateEncodingFactor\n const rate = midGap || mkt?.spot?.rate || 0\n // Caller should not call this for market orders without a mkt arg.\n if (!mkt) return 0\n // This is tricky. The server will use the mid-gap rate to convert the\n // order qty. We don't have a mid-gap rate, only a spot rate.\n if (rate && (mkt?.spot?.bookVolume || 0) > 0) return qty * RateEncodingFactor / rate\n return mkt.lotsize // server uses same fallback if book is empty\n}\n\nexport function epochWeight (ord: Order, mkt: Market, midGap?: number) {\n if (ord.status !== StatusEpoch) return 0\n const qty = preparcelQuantity(ord, mkt, midGap)\n const rate = midGap || mkt.spot?.rate || 0\n if (likelyTaker(ord, rate)) return qty * 2\n return qty\n}\n\nfunction bookWeight (ord: Order) {\n if (ord.status !== StatusBooked) return 0\n return preparcelQuantity(ord)\n}\n\nfunction settlingWeight (ord: Order) {\n let sum = 0\n for (const m of (ord.matches || [])) {\n if (m.side === MatchSideMaker) {\n if (m.status > MakerRedeemed) continue\n } else if (m.status > TakerSwapCast) continue\n sum += m.qty\n }\n return sum\n}\n\nfunction parcelWeight (ord: Order, mkt: Market, midGap?: number) {\n if (ord.type === OrderTypeCancel) return 0\n return epochWeight(ord, mkt, midGap) + bookWeight(ord) + settlingWeight(ord)\n}\n\n// function roundParcels (p: number): number {\n// return Math.floor(Math.round((p * 1e8)) / 1e8)\n// }\n\nfunction limitBonus (score: number, maxScore: number): number {\n return score > 0 ? 1 + score / maxScore * (parcelLimitScoreMultiplier - 1) : 1\n}\n\nexport function tradingLimits (host: string): [number, number] { // [usedParcels, parcelLimit]\n const { auth, maxScore, markets } = app().exchanges[host]\n const { rep: { score } } = auth\n const tier = strongTier(auth)\n\n let usedParcels = 0\n for (const mkt of Object.values(markets)) {\n let mktWeight = 0\n for (const ord of (mkt.inflight || [])) mktWeight += parcelWeight(ord, mkt)\n for (const ord of (mkt.orders || [])) mktWeight += parcelWeight(ord, mkt)\n usedParcels += (mktWeight / (mkt.parcelsize * mkt.lotsize))\n }\n const parcelLimit = perTierBaseParcelLimit * limitBonus(score, maxScore) * tier\n return [usedParcels, parcelLimit]\n}\n","import {\n app,\n PageElement\n} from './registry'\nimport * as intl from './locales'\n\nexport const Mainnet = 0\nexport const Testnet = 1\nexport const Simnet = 2\n\nconst coinIDTakerFoundMakerRedemption = 'TakerFoundMakerRedemption:'\n\n/* ethBasedExplorerArg returns the explorer argument for ETH, ERC20 and EVM\nCompatible assets and whether the return value is an address. */\nfunction ethBasedExplorerArg (cid: string): [string, boolean] {\n if (cid.startsWith(coinIDTakerFoundMakerRedemption)) return [cid.substring(coinIDTakerFoundMakerRedemption.length), true]\n else if (cid.length === 42) return [cid, true]\n else return [cid, false]\n}\n\nconst ethExplorers: Record<number, (cid: string) => string> = {\n [Mainnet]: (cid: string) => {\n const [arg, isAddr] = ethBasedExplorerArg(cid)\n return isAddr ? `https://etherscan.io/address/${arg}` : `https://etherscan.io/tx/${arg}`\n },\n [Testnet]: (cid: string) => {\n const [arg, isAddr] = ethBasedExplorerArg(cid)\n return isAddr ? `https://sepolia.etherscan.io/address/${arg}` : `https://sepolia.etherscan.io/tx/${arg}`\n },\n [Simnet]: (cid: string) => {\n const [arg, isAddr] = ethBasedExplorerArg(cid)\n return isAddr ? `https://etherscan.io/address/${arg}` : `https://etherscan.io/tx/${arg}`\n }\n}\n\nconst polygonExplorers: Record<number, (cid: string) => string> = {\n [Mainnet]: (cid: string) => {\n const [arg, isAddr] = ethBasedExplorerArg(cid)\n return isAddr ? `https://polygonscan.com/address/${arg}` : `https://polygonscan.com/tx/${arg}`\n },\n [Testnet]: (cid: string) => {\n const [arg, isAddr] = ethBasedExplorerArg(cid)\n return isAddr ? `https://amoy.polygonscan.com/address/${arg}` : `https://amoy.polygonscan.com/tx/${arg}`\n },\n [Simnet]: (cid: string) => {\n const [arg, isAddr] = ethBasedExplorerArg(cid)\n return isAddr ? `https://polygonscan.com/address/${arg}` : `https://polygonscan.com/tx/${arg}`\n }\n}\n\nexport const CoinExplorers: Record<number, Record<number, (cid: string) => string>> = {\n 42: { // dcr\n [Mainnet]: (cid: string) => {\n const [txid, vout] = cid.split(':')\n if (vout !== undefined) return `https://explorer.dcrdata.org/tx/${txid}/out/${vout}`\n return `https://explorer.dcrdata.org/tx/${txid}`\n },\n [Testnet]: (cid: string) => {\n const [txid, vout] = cid.split(':')\n if (vout !== undefined) return `https://testnet.dcrdata.org/tx/${txid}/out/${vout}`\n return `https://testnet.dcrdata.org/tx/${txid}`\n },\n [Simnet]: (cid: string) => {\n const [txid, vout] = cid.split(':')\n if (vout !== undefined) return `http://127.0.0.1:17779/tx/${txid}/out/${vout}`\n return `https://127.0.0.1:17779/tx/${txid}`\n }\n },\n 0: { // btc\n [Mainnet]: (cid: string) => `https://mempool.space/tx/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://mempool.space/testnet/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://mempool.space/tx/${cid.split(':')[0]}`\n },\n 2: { // ltc\n [Mainnet]: (cid: string) => `https://ltc.bitaps.com/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://sochain.com/tx/LTCTEST/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://ltc.bitaps.com/${cid.split(':')[0]}`\n },\n 20: { // dgb\n [Mainnet]: (cid: string) => `https://digiexplorer.info/tx/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://testnetexplorer.digibyteservers.io/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://digiexplorer.info/tx/${cid.split(':')[0]}`\n },\n 60: ethExplorers,\n 60001: ethExplorers,\n 60002: ethExplorers,\n 3: { // doge\n [Mainnet]: (cid: string) => `https://dogeblocks.com/tx/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://blockexplorer.one/dogecoin/testnet/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://dogeblocks.com/tx/${cid.split(':')[0]}`\n },\n 5: { // dash\n [Mainnet]: (cid: string) => `https://blockexplorer.one/dash/mainnet/tx/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://blockexplorer.one/dash/testnet/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://blockexplorer.one/dash/mainnet/tx/${cid.split(':')[0]}`\n },\n 133: { // zec\n [Mainnet]: (cid: string) => `https://zcashblockexplorer.com/transactions/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://blockexplorer.one/zcash/testnet/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://zcashblockexplorer.com/transactions/${cid.split(':')[0]}`\n },\n 147: { // zcl\n [Mainnet]: (cid: string) => `https://explorer.zcl.zelcore.io/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://explorer.zcl.zelcore.io/tx/${cid.split(':')[0]}`\n },\n 136: { // firo\n [Mainnet]: (cid: string) => `https://explorer.firo.org/tx/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://testexplorer.firo.org/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://explorer.firo.org/tx/${cid.split(':')[0]}`\n },\n 145: { // bch\n [Mainnet]: (cid: string) => `https://bch.loping.net/tx/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://tbch4.loping.net/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://bch.loping.net/tx/${cid.split(':')[0]}`\n },\n 966: polygonExplorers,\n 966001: polygonExplorers,\n 966002: polygonExplorers,\n 966003: polygonExplorers,\n 966004: polygonExplorers\n}\n\nexport function formatCoinID (cid: string) {\n if (cid.startsWith(coinIDTakerFoundMakerRedemption)) {\n const makerAddr = cid.substring(coinIDTakerFoundMakerRedemption.length)\n return intl.prep(intl.ID_TAKER_FOUND_MAKER_REDEMPTION, { makerAddr: makerAddr })\n }\n return cid\n}\n\n/*\n * baseChainID returns the asset ID for the asset's parent if the asset is a\n * token, otherwise the ID for the asset itself.\n */\nfunction baseChainID (assetID: number) {\n const asset = app().user.assets[assetID]\n return asset.token ? asset.token.parentID : assetID\n}\n\n/*\n * setCoinHref sets the hyperlink element's href attribute based on provided\n * assetID and data-explorer-coin value present on supplied link element.\n */\nexport function setCoinHref (assetID: number, link: PageElement) {\n const net = app().user.net\n const assetExplorer = CoinExplorers[baseChainID(assetID)]\n if (!assetExplorer) return\n const formatter = assetExplorer[net]\n if (!formatter) return\n link.classList.remove('plainlink')\n link.classList.add('subtlelink')\n link.href = formatter(link.dataset.explorerCoin || '')\n}\n","import {\n app,\n PageElement,\n BotConfig,\n MMBotStatus,\n CEXConfig,\n MarketMakingStatus,\n ExchangeBalance,\n RunStats,\n StartConfig,\n MarketWithHost,\n RunningBotInventory,\n Spot,\n OrderPlacement,\n Token,\n UnitInfo,\n MarketReport,\n BotBalanceAllocation,\n ProjectedAlloc,\n BalanceNote,\n BotBalance,\n Order,\n LotFeeRange,\n BookingFees,\n BotProblems,\n EpochReportNote,\n OrderReport,\n EpochReport,\n TradePlacement,\n SupportedAsset,\n CEXProblemsNote,\n CEXProblems\n} from './registry'\nimport { getJSON, postJSON } from './http'\nimport Doc, { clamp } from './doc'\nimport * as OrderUtil from './orderutil'\nimport { Chart, Region, Extents, Translator } from './charts'\nimport * as intl from './locales'\nimport { Forms } from './forms'\n\nexport const GapStrategyMultiplier = 'multiplier'\nexport const GapStrategyAbsolute = 'absolute'\nexport const GapStrategyAbsolutePlus = 'absolute-plus'\nexport const GapStrategyPercent = 'percent'\nexport const GapStrategyPercentPlus = 'percent-plus'\n\nexport const botTypeBasicMM = 'basicMM'\nexport const botTypeArbMM = 'arbMM'\nexport const botTypeBasicArb = 'basicArb'\n\nexport interface CEXDisplayInfo {\n name: string\n logo: string\n}\n\nexport const CEXDisplayInfos: Record<string, CEXDisplayInfo> = {\n 'Binance': {\n name: 'Binance',\n logo: '/img/binance.com.png'\n },\n 'BinanceUS': {\n name: 'Binance U.S.',\n logo: '/img/binance.us.png'\n }\n}\n\n/*\n * MarketMakerBot is the front end representation of the server's\n * mm.MarketMaker. MarketMakerBot is a singleton assigned to MM below.\n */\nclass MarketMakerBot {\n cexBalanceCache: Record<string, Record<number, ExchangeBalance>> = {}\n\n /*\n * updateBotConfig appends or updates the specified BotConfig.\n */\n async updateBotConfig (cfg: BotConfig) {\n return postJSON('/api/updatebotconfig', cfg)\n }\n\n /*\n * updateCEXConfig appends or updates the specified CEXConfig.\n */\n async updateCEXConfig (cfg: CEXConfig) {\n return postJSON('/api/updatecexconfig', cfg)\n }\n\n async removeBotConfig (host: string, baseID: number, quoteID: number) {\n return postJSON('/api/removebotconfig', { host, baseID, quoteID })\n }\n\n async report (host: string, baseID: number, quoteID: number) {\n return postJSON('/api/marketreport', { host, baseID, quoteID })\n }\n\n async startBot (config: StartConfig) {\n return await postJSON('/api/startmarketmakingbot', { config })\n }\n\n async stopBot (market: MarketWithHost) : Promise<void> {\n await postJSON('/api/stopmarketmakingbot', { market })\n }\n\n async status () : Promise<MarketMakingStatus> {\n return (await getJSON('/api/marketmakingstatus')).status\n }\n\n // botStats returns the RunStats for a running bot with the specified parameters.\n botStats (baseID: number, quoteID: number, host: string, startTime: number): RunStats | undefined {\n for (const botStatus of Object.values(app().mmStatus.bots)) {\n if (!botStatus.runStats) continue\n const runStats = botStatus.runStats\n const cfg = botStatus.config\n if (cfg.baseID === baseID && cfg.quoteID === quoteID && cfg.host === host && runStats.startTime === startTime) {\n return runStats\n }\n }\n }\n\n cachedCexBalance (cexName: string, assetID: number): ExchangeBalance | undefined {\n return this.cexBalanceCache[cexName]?.[assetID]\n }\n\n async cexBalance (cexName: string, assetID: number): Promise<ExchangeBalance> {\n if (!this.cexBalanceCache[cexName]) this.cexBalanceCache[cexName] = {}\n const cexBalance = (await postJSON('/api/cexbalance', { cexName, assetID })).cexBalance\n this.cexBalanceCache[cexName][assetID] = cexBalance\n return cexBalance\n }\n}\n\n// MM is the front end representation of the server's mm.MarketMaker.\nexport const MM = new MarketMakerBot()\n\nexport function runningBotInventory (assetID: number): RunningBotInventory {\n return app().mmStatus.bots.reduce((v, { runStats, running }) => {\n if (!running || !runStats) return v\n const { dexBalances: d, cexBalances: c } = runStats\n v.cex.locked += c[assetID]?.locked ?? 0\n v.cex.locked += c[assetID]?.reserved ?? 0\n v.cex.avail += c[assetID]?.available ?? 0\n v.cex.total = v.cex.avail + v.cex.locked\n v.dex.locked += d[assetID]?.locked ?? 0\n v.dex.locked += d[assetID]?.reserved ?? 0\n v.dex.avail += d[assetID]?.available ?? 0\n v.dex.total = v.dex.avail + v.dex.locked\n v.avail += (d[assetID]?.available ?? 0) + (c[assetID]?.available ?? 0)\n v.locked += (d[assetID]?.locked ?? 0) + (c[assetID]?.locked ?? 0)\n return v\n }, { avail: 0, locked: 0, cex: { avail: 0, locked: 0, total: 0 }, dex: { avail: 0, locked: 0, total: 0 } })\n}\n\nexport function setMarketElements (ancestor: PageElement, baseID: number, quoteID: number, host: string) {\n Doc.setText(ancestor, '[data-host]', host)\n const { unitInfo: bui, name: baseName, symbol: baseSymbol, token: baseToken } = app().assets[baseID]\n Doc.setText(ancestor, '[data-base-name]', baseName)\n Doc.setSrc(ancestor, '[data-base-logo]', Doc.logoPath(baseSymbol))\n Doc.setText(ancestor, '[data-base-ticker]', bui.conventional.unit)\n const { unitInfo: baseFeeUI, name: baseFeeName, symbol: baseFeeSymbol } = app().assets[baseToken ? baseToken.parentID : baseID]\n Doc.setText(ancestor, '[data-base-fee-name]', baseFeeName)\n Doc.setSrc(ancestor, '[data-base-fee-logo]', Doc.logoPath(baseFeeSymbol))\n Doc.setText(ancestor, '[data-base-fee-ticker]', baseFeeUI.conventional.unit)\n const { unitInfo: qui, name: quoteName, symbol: quoteSymbol, token: quoteToken } = app().assets[quoteID]\n Doc.setText(ancestor, '[data-quote-name]', quoteName)\n Doc.setSrc(ancestor, '[data-quote-logo]', Doc.logoPath(quoteSymbol))\n Doc.setText(ancestor, '[data-quote-ticker]', qui.conventional.unit)\n const { unitInfo: quoteFeeUI, name: quoteFeeName, symbol: quoteFeeSymbol } = app().assets[quoteToken ? quoteToken.parentID : quoteID]\n Doc.setText(ancestor, '[data-quote-fee-name]', quoteFeeName)\n Doc.setSrc(ancestor, '[data-quote-fee-logo]', Doc.logoPath(quoteFeeSymbol))\n Doc.setText(ancestor, '[data-quote-fee-ticker]', quoteFeeUI.conventional.unit)\n}\n\nexport function setCexElements (ancestor: PageElement, cexName: string) {\n const dinfo = CEXDisplayInfos[cexName]\n Doc.setText(ancestor, '[data-cex-name]', dinfo.name)\n Doc.setSrc(ancestor, '[data-cex-logo]', dinfo.logo)\n for (const img of Doc.applySelector(ancestor, '[data-cex-logo]')) Doc.show(img)\n}\n\nexport function calculateQuoteLot (lotSize: number, baseID: number, quoteID: number, spot?: Spot) {\n const baseRate = app().fiatRatesMap[baseID]\n const quoteRate = app().fiatRatesMap[quoteID]\n const { unitInfo: { conventional: { conversionFactor: bFactor } } } = app().assets[baseID]\n const { unitInfo: { conventional: { conversionFactor: qFactor } } } = app().assets[quoteID]\n if (baseRate && quoteRate) {\n return lotSize * baseRate / quoteRate * qFactor / bFactor\n } else if (spot) {\n return lotSize * spot.rate / OrderUtil.RateEncodingFactor\n }\n return qFactor\n}\n\nexport interface PlacementChartConfig {\n cexName: string\n botType: string\n baseFiatRate: number\n dict: {\n profit: number\n buyPlacements: OrderPlacement[]\n sellPlacements: OrderPlacement[]\n }\n}\n\nexport class PlacementsChart extends Chart {\n cfg: PlacementChartConfig\n loadedCEX: string\n cexLogo: HTMLImageElement\n\n constructor (parent: PageElement) {\n super(parent, {\n resize: () => this.resized(),\n click: (/* e: MouseEvent */) => { /* pass */ },\n zoom: (/* bigger: boolean */) => { /* pass */ }\n })\n }\n\n resized () {\n this.render()\n }\n\n draw () { /* pass */ }\n\n setMarket (cfg: PlacementChartConfig) {\n this.cfg = cfg\n const { loadedCEX, cfg: { cexName } } = this\n if (cexName && cexName !== loadedCEX) {\n this.loadedCEX = cexName\n this.cexLogo = new Image()\n Doc.bind(this.cexLogo, 'load', () => { this.render() })\n this.cexLogo.src = CEXDisplayInfos[cexName || ''].logo\n }\n this.render()\n }\n\n render () {\n const { ctx, canvas, theme, cfg } = this\n if (canvas.width === 0 || !cfg) return\n const { dict: { buyPlacements, sellPlacements, profit }, baseFiatRate, botType } = cfg\n if (botType === botTypeBasicArb) return\n\n this.clear()\n\n const drawDashedLine = (x0: number, y0: number, x1: number, y1: number, color: string) => {\n ctx.save()\n ctx.setLineDash([3, 5])\n ctx.lineWidth = 1.5\n ctx.strokeStyle = color\n this.line(x0, y0, x1, y1)\n ctx.restore()\n }\n\n const isBasicMM = botType === botTypeBasicMM\n const cx = canvas.width / 2\n const [cexGapL, cexGapR] = isBasicMM ? [cx, cx] : [0.48 * canvas.width, 0.52 * canvas.width]\n\n const buyLots = buyPlacements.reduce((v: number, p: OrderPlacement) => v + p.lots, 0)\n const sellLots = sellPlacements.reduce((v: number, p: OrderPlacement) => v + p.lots, 0)\n const maxLots = Math.max(buyLots, sellLots)\n\n let widest = 0\n let fauxSpacer = 0\n if (isBasicMM) {\n const leftmost = buyPlacements.reduce((v: number, p: OrderPlacement) => Math.max(v, p.gapFactor), 0)\n const rightmost = sellPlacements.reduce((v: number, p: OrderPlacement) => Math.max(v, p.gapFactor), 0)\n widest = Math.max(leftmost, rightmost)\n } else {\n // For arb-mm, we don't know how the orders will be spaced because it\n // depends on the vwap. But we're just trying to capture the general sense\n // of how the parameters will affect order placement, so we'll fake it.\n // Higher match buffer values will lead to orders with less favorable\n // rates, e.g. the spacing will be larger.\n const ps = [...buyPlacements, ...sellPlacements]\n const matchBuffer = ps.reduce((sum: number, p: OrderPlacement) => sum + p.gapFactor, 0) / ps.length\n fauxSpacer = 0.01 * (1 + matchBuffer)\n widest = Math.min(10, Math.max(buyPlacements.length, sellPlacements.length)) * fauxSpacer // arb-mm\n }\n\n // Make the range 15% on each side, which will include profit + placements,\n // unless they have orders with larger gap factors.\n const minRange = profit + widest\n const defaultRange = 0.155\n const range = Math.max(minRange * 1.05, defaultRange)\n\n // Increase data height logarithmically up to 1,000,000 USD.\n const maxCommitUSD = maxLots * baseFiatRate\n const regionHeight = 0.2 + 0.7 * Math.log(clamp(maxCommitUSD, 0, 1e6)) / Math.log(1e6)\n\n // Draw a region in the middle representing the cex gap.\n const plotRegion = new Region(ctx, new Extents(0, canvas.width, 0, canvas.height))\n\n if (isBasicMM) {\n drawDashedLine(cx, 0, cx, canvas.height, theme.gapLine)\n } else { // arb-mm\n plotRegion.plot(new Extents(0, 1, 0, 1), (ctx: CanvasRenderingContext2D, tools: Translator) => {\n const [y0, y1] = [tools.y(0), tools.y(1)]\n drawDashedLine(cexGapL, y0, cexGapL, y1, theme.gapLine)\n drawDashedLine(cexGapR, y0, cexGapR, y1, theme.gapLine)\n const y = tools.y(0.95)\n ctx.drawImage(this.cexLogo, cx - 8, y, 16, 16)\n this.applyLabelStyle(18)\n ctx.fillText('δ', cx, y + 29)\n })\n }\n\n const plotSide = (isBuy: boolean, placements: OrderPlacement[]) => {\n if (!placements?.length) return\n const [xMin, xMax] = isBuy ? [0, cexGapL] : [cexGapR, canvas.width]\n const reg = new Region(ctx, new Extents(xMin, xMax, canvas.height * (1 - regionHeight), canvas.height))\n const [l, r] = isBuy ? [-range, 0] : [0, range]\n reg.plot(new Extents(l, r, 0, maxLots), (ctx: CanvasRenderingContext2D, tools: Translator) => {\n ctx.lineWidth = 2.5\n ctx.strokeStyle = isBuy ? theme.buyLine : theme.sellLine\n ctx.fillStyle = isBuy ? theme.buyFill : theme.sellFill\n ctx.beginPath()\n const sideFactor = isBuy ? -1 : 1\n const firstPt = placements[0]\n const y0 = tools.y(0)\n const firstX = tools.x((isBasicMM ? firstPt.gapFactor : profit + fauxSpacer) * sideFactor)\n ctx.moveTo(firstX, y0)\n let cumulativeLots = 0\n for (let i = 0; i < placements.length; i++) {\n const p = placements[i]\n // For arb-mm, we don't know exactly\n const rawX = isBasicMM ? p.gapFactor : profit + (i + 1) * fauxSpacer\n const x = tools.x(rawX * sideFactor)\n ctx.lineTo(x, tools.y(cumulativeLots))\n cumulativeLots += p.lots\n ctx.lineTo(x, tools.y(cumulativeLots))\n }\n const xInfinity = isBuy ? canvas.width * -0.1 : canvas.width * 1.1\n ctx.lineTo(xInfinity, tools.y(cumulativeLots))\n ctx.stroke()\n ctx.lineTo(xInfinity, y0)\n ctx.lineTo(firstX, y0)\n ctx.closePath()\n ctx.globalAlpha = 0.25\n ctx.fill()\n }, true)\n }\n\n plotSide(false, sellPlacements)\n plotSide(true, buyPlacements)\n }\n}\n\nexport function hostedMarketID (host: string, baseID: number, quoteID: number) {\n return `${host}-${baseID}-${quoteID}` // same as MarketWithHost.String()\n}\n\nexport function liveBotConfig (host: string, baseID: number, quoteID: number): BotConfig | undefined {\n const s = liveBotStatus(host, baseID, quoteID)\n if (s) return s.config\n}\n\nexport function liveBotStatus (host: string, baseID: number, quoteID: number): MMBotStatus | undefined {\n const statuses = (app().mmStatus.bots || []).filter((s: MMBotStatus) => {\n return s.config.baseID === baseID && s.config.quoteID === quoteID && s.config.host === host\n })\n if (statuses.length) return statuses[0]\n}\n\ninterface Lotter {\n lots: number\n}\n\nfunction sumLots (lots: number, p: Lotter) {\n return lots + p.lots\n}\n\ninterface AllocationProjection {\n bProj: ProjectedAlloc\n qProj: ProjectedAlloc\n alloc: Record<number, number>\n}\n\nfunction emptyProjection (): ProjectedAlloc {\n return { book: 0, bookingFees: 0, swapFeeReserves: 0, cex: 0, orderReserves: 0, slippageBuffer: 0 }\n}\n\nexport class BotMarket {\n cfg: BotConfig\n host: string\n baseID: number\n baseSymbol: string\n baseTicker: string\n baseFeeID: number\n baseIsAccountLocker: boolean\n baseFeeSymbol: string\n baseFeeTicker: string\n baseToken?: Token\n quoteID: number\n quoteSymbol: string\n quoteTicker: string\n quoteFeeID: number\n quoteIsAccountLocker: boolean\n quoteFeeSymbol: string\n quoteFeeTicker: string\n quoteToken?: Token\n botType: string\n cexName: string\n dinfo: CEXDisplayInfo\n alloc: BotBalanceAllocation\n proj: AllocationProjection\n bui: UnitInfo\n baseFactor: number\n baseFeeUI: UnitInfo\n baseFeeFactor: number\n qui: UnitInfo\n quoteFactor: number\n quoteFeeUI: UnitInfo\n quoteFeeFactor: number\n id: string // includes host\n mktID: string\n lotSize: number\n lotSizeConv: number\n lotSizeUSD: number\n quoteLot: number\n quoteLotConv: number\n quoteLotUSD: number\n rateStep: number\n baseFeeFiatRate: number\n quoteFeeFiatRate: number\n baseLots: number\n quoteLots: number\n marketReport: MarketReport\n nBuyPlacements: number\n nSellPlacements: number\n\n constructor (cfg: BotConfig) {\n const host = this.host = cfg.host\n const baseID = this.baseID = cfg.baseID\n const quoteID = this.quoteID = cfg.quoteID\n this.cexName = cfg.cexName\n const status = app().mmStatus.bots.find(({ config: c }: MMBotStatus) => c.baseID === baseID && c.quoteID === quoteID && c.host === host)\n if (!status) throw Error('where\\'s the bot status?')\n this.cfg = status.config\n\n const { token: baseToken, symbol: baseSymbol, unitInfo: bui } = app().assets[baseID]\n this.baseSymbol = baseSymbol\n this.baseTicker = bui.conventional.unit\n this.bui = bui\n this.baseFactor = bui.conventional.conversionFactor\n this.baseToken = baseToken\n const baseFeeID = this.baseFeeID = baseToken ? baseToken.parentID : baseID\n const { unitInfo: baseFeeUI, symbol: baseFeeSymbol, wallet: baseWallet } = app().assets[this.baseFeeID]\n const traitAccountLocker = 1 << 14\n this.baseIsAccountLocker = (baseWallet.traits & traitAccountLocker) > 0\n this.baseFeeUI = baseFeeUI\n this.baseFeeTicker = baseFeeUI.conventional.unit\n this.baseFeeSymbol = baseFeeSymbol\n this.baseFeeFactor = this.baseFeeUI.conventional.conversionFactor\n\n const { token: quoteToken, symbol: quoteSymbol, unitInfo: qui } = app().assets[quoteID]\n this.quoteSymbol = quoteSymbol\n this.quoteTicker = qui.conventional.unit\n this.qui = qui\n this.quoteFactor = qui.conventional.conversionFactor\n this.quoteToken = quoteToken\n const quoteFeeID = this.quoteFeeID = quoteToken ? quoteToken.parentID : quoteID\n const { unitInfo: quoteFeeUI, symbol: quoteFeeSymbol, wallet: quoteWallet } = app().assets[this.quoteFeeID]\n this.quoteIsAccountLocker = (quoteWallet.traits & traitAccountLocker) > 0\n this.quoteFeeUI = quoteFeeUI\n this.quoteFeeTicker = quoteFeeUI.conventional.unit\n this.quoteFeeSymbol = quoteFeeSymbol\n this.quoteFeeFactor = this.quoteFeeUI.conventional.conversionFactor\n\n this.id = hostedMarketID(host, baseID, quoteID)\n this.mktID = `${baseSymbol}_${quoteSymbol}`\n\n const { markets } = app().exchanges[host]\n const { lotsize: lotSize, ratestep: rateStep } = markets[this.mktID]\n this.lotSize = lotSize\n this.lotSizeConv = lotSize / bui.conventional.conversionFactor\n this.rateStep = rateStep\n this.quoteLot = calculateQuoteLot(lotSize, baseID, quoteID)\n this.quoteLotConv = this.quoteLot / qui.conventional.conversionFactor\n\n this.baseFeeFiatRate = app().fiatRatesMap[baseFeeID]\n this.quoteFeeFiatRate = app().fiatRatesMap[quoteFeeID]\n\n if (cfg.arbMarketMakingConfig) {\n this.botType = botTypeArbMM\n this.baseLots = cfg.arbMarketMakingConfig.sellPlacements.reduce(sumLots, 0)\n this.quoteLots = cfg.arbMarketMakingConfig.buyPlacements.reduce(sumLots, 0)\n this.nBuyPlacements = cfg.arbMarketMakingConfig.buyPlacements.length\n this.nSellPlacements = cfg.arbMarketMakingConfig.sellPlacements.length\n } else if (cfg.simpleArbConfig) {\n this.botType = botTypeBasicArb\n this.baseLots = cfg.uiConfig.simpleArbLots as number\n this.quoteLots = cfg.uiConfig.simpleArbLots as number\n } else if (cfg.basicMarketMakingConfig) { // basicmm\n this.botType = botTypeBasicMM\n this.baseLots = cfg.basicMarketMakingConfig.sellPlacements.reduce(sumLots, 0)\n this.quoteLots = cfg.basicMarketMakingConfig.buyPlacements.reduce(sumLots, 0)\n this.nBuyPlacements = cfg.basicMarketMakingConfig.buyPlacements.length\n this.nSellPlacements = cfg.basicMarketMakingConfig.sellPlacements.length\n }\n }\n\n async initialize () {\n const { host, baseID, quoteID, lotSizeConv, quoteLotConv } = this\n const res = await MM.report(host, baseID, quoteID)\n const r = this.marketReport = res.report as MarketReport\n this.lotSizeUSD = lotSizeConv * r.baseFiatRate\n this.quoteLotUSD = quoteLotConv * r.quoteFiatRate\n this.proj = this.projectedAllocations()\n }\n\n status () {\n const { baseID, quoteID } = this\n const botStatus = app().mmStatus.bots.find((s: MMBotStatus) => s.config.baseID === baseID && s.config.quoteID === quoteID)\n if (!botStatus) return { botCfg: {} as BotConfig, running: false, runStats: {} as RunStats }\n const { config: botCfg, running, runStats, latestEpoch, cexProblems } = botStatus\n return { botCfg, running, runStats, latestEpoch, cexProblems }\n }\n\n /*\n * adjustedBalances calculates the user's available balances and fee-asset\n * balances for a market, with consideration for currently running bots.\n */\n adjustedBalances () {\n const {\n baseID, quoteID, baseFeeID, quoteFeeID, cexName,\n baseFactor, quoteFactor, baseFeeFactor, quoteFeeFactor\n } = this\n const [baseWallet, quoteWallet] = [app().walletMap[baseID], app().walletMap[quoteID]]\n const [bInv, qInv] = [runningBotInventory(baseID), runningBotInventory(quoteID)]\n\n // In these available balance calcs, only subtract the available balance of\n // running bots, since the locked/reserved/immature is already subtracted\n // from the wallet's total available balance.\n let cexBaseAvail = 0\n let cexQuoteAvail = 0\n let cexBaseBalance: ExchangeBalance | undefined\n let cexQuoteBalance: ExchangeBalance | undefined\n if (cexName) {\n const cex = app().mmStatus.cexes[cexName]\n if (!cex) throw Error('where\\'s the cex status?')\n cexBaseBalance = cex.balances[baseID]\n cexQuoteBalance = cex.balances[quoteID]\n }\n if (cexBaseBalance) cexBaseAvail = (cexBaseBalance.available || 0) - bInv.cex.avail\n if (cexQuoteBalance) cexQuoteAvail = (cexQuoteBalance.available || 0) - qInv.cex.avail\n const [dexBaseAvail, dexQuoteAvail] = [baseWallet.balance.available - bInv.dex.avail, quoteWallet.balance.available - qInv.dex.avail]\n const baseAvail = dexBaseAvail + cexBaseAvail\n const quoteAvail = dexQuoteAvail + cexQuoteAvail\n const baseFeeWallet = baseFeeID === baseID ? baseWallet : app().walletMap[baseFeeID]\n const quoteFeeWallet = quoteFeeID === quoteID ? quoteWallet : app().walletMap[quoteFeeID]\n\n let [baseFeeAvail, dexBaseFeeAvail, cexBaseFeeAvail] = [baseAvail, dexBaseAvail, cexBaseAvail]\n if (baseFeeID !== baseID) {\n const bFeeInv = runningBotInventory(baseID)\n dexBaseFeeAvail = baseFeeWallet.balance.available - bFeeInv.dex.total\n if (cexBaseBalance) cexBaseFeeAvail = (cexBaseBalance.available || 0) - bFeeInv.cex.total\n baseFeeAvail = dexBaseFeeAvail + cexBaseFeeAvail\n }\n let [quoteFeeAvail, dexQuoteFeeAvail, cexQuoteFeeAvail] = [quoteAvail, dexQuoteAvail, cexQuoteAvail]\n if (quoteFeeID !== quoteID) {\n const qFeeInv = runningBotInventory(quoteID)\n dexQuoteFeeAvail = quoteFeeWallet.balance.available - qFeeInv.dex.total\n if (cexQuoteBalance) cexQuoteFeeAvail = (cexQuoteBalance.available || 0) - qFeeInv.cex.total\n quoteFeeAvail = dexQuoteFeeAvail + cexQuoteFeeAvail\n }\n return { // convert to conventioanl.\n baseAvail: baseAvail / baseFactor,\n quoteAvail: quoteAvail / quoteFactor,\n dexBaseAvail: dexBaseAvail / baseFactor,\n dexQuoteAvail: dexQuoteAvail / quoteFactor,\n cexBaseAvail: cexBaseAvail / baseFactor,\n cexQuoteAvail: cexQuoteAvail / quoteFactor,\n baseFeeAvail: baseFeeAvail / baseFeeFactor,\n quoteFeeAvail: quoteFeeAvail / quoteFeeFactor,\n dexBaseFeeAvail: dexBaseFeeAvail / baseFeeFactor,\n dexQuoteFeeAvail: dexQuoteFeeAvail / quoteFeeFactor,\n cexBaseFeeAvail: cexBaseFeeAvail / baseFeeFactor,\n cexQuoteFeeAvail: cexQuoteFeeAvail / quoteFeeFactor\n }\n }\n\n /*\n * feesAndCommit generates a snapshot of current market fees, as well as a\n * \"commit\", which is the funding dedicated to being on order. The commit\n * values do not include booking fees, order reserves, etc. just the order\n * quantity.\n */\n feesAndCommit () {\n const {\n baseID, quoteID, marketReport: { baseFees, quoteFees }, lotSize,\n baseLots, quoteLots, baseFeeID, quoteFeeID, baseIsAccountLocker, quoteIsAccountLocker,\n cfg: { uiConfig: { baseConfig, quoteConfig } }\n } = this\n\n return feesAndCommit(\n baseID, quoteID, baseFees, quoteFees, lotSize, baseLots, quoteLots,\n baseFeeID, quoteFeeID, baseIsAccountLocker, quoteIsAccountLocker,\n baseConfig.orderReservesFactor, quoteConfig.orderReservesFactor\n )\n }\n\n /*\n * projectedAllocations calculates the required asset allocations from the\n * user's configuration settings and the current market state.\n */\n projectedAllocations () {\n const {\n cfg: { uiConfig: { quoteConfig, baseConfig } },\n baseFactor, quoteFactor, baseID, quoteID, lotSizeConv, quoteLotConv,\n baseFeeFactor, quoteFeeFactor, baseFeeID, quoteFeeID, baseToken,\n quoteToken, cexName\n } = this\n const { commit, fees } = this.feesAndCommit()\n\n const bProj = emptyProjection()\n const qProj = emptyProjection()\n\n bProj.book = commit.dex.base.lots * lotSizeConv\n qProj.book = commit.cex.base.lots * quoteLotConv\n\n bProj.orderReserves = Math.max(commit.cex.base.val, commit.dex.base.val) * baseConfig.orderReservesFactor / baseFactor\n qProj.orderReserves = Math.max(commit.cex.quote.val, commit.dex.quote.val) * quoteConfig.orderReservesFactor / quoteFactor\n\n if (cexName) {\n bProj.cex = commit.cex.base.lots * lotSizeConv\n qProj.cex = commit.cex.quote.lots * quoteLotConv\n }\n\n bProj.bookingFees = fees.base.bookingFees / baseFeeFactor\n qProj.bookingFees = fees.quote.bookingFees / quoteFeeFactor\n\n if (baseToken) bProj.swapFeeReserves = fees.base.tokenFeesPerSwap * baseConfig.swapFeeN / baseFeeFactor\n if (quoteToken) qProj.swapFeeReserves = fees.quote.tokenFeesPerSwap * quoteConfig.swapFeeN / quoteFeeFactor\n qProj.slippageBuffer = (qProj.book + qProj.cex + qProj.orderReserves) * quoteConfig.slippageBufferFactor\n\n const alloc: Record<number, number> = {}\n const addAlloc = (assetID: number, amt: number) => { alloc[assetID] = (alloc[assetID] ?? 0) + amt }\n addAlloc(baseID, Math.round((bProj.book + bProj.cex + bProj.orderReserves) * baseFactor))\n addAlloc(baseFeeID, Math.round((bProj.bookingFees + bProj.swapFeeReserves) * baseFeeFactor))\n addAlloc(quoteID, Math.round((qProj.book + qProj.cex + qProj.orderReserves + qProj.slippageBuffer) * quoteFactor))\n addAlloc(quoteFeeID, Math.round((qProj.bookingFees + qProj.swapFeeReserves) * quoteFeeFactor))\n\n return { qProj, bProj, alloc }\n }\n\n /*\n * fundingState examines the projected allocations and the user's wallet\n * balances to determine whether the user can fund the bot fully, unbalanced,\n * or starved, and what funding source options might be available.\n */\n fundingState () {\n const {\n proj: { bProj, qProj }, baseID, quoteID, baseFeeID, quoteFeeID,\n cfg: { uiConfig: { cexRebalance } }, cexName\n } = this\n const {\n baseAvail, quoteAvail, dexBaseAvail, dexQuoteAvail, cexBaseAvail, cexQuoteAvail,\n dexBaseFeeAvail, dexQuoteFeeAvail\n } = this.adjustedBalances()\n\n const canRebalance = Boolean(cexName && cexRebalance)\n\n // Three possible states.\n // 1. We have the funding in the projection, and its in the right places.\n // Give them some options for which wallet to pull order reserves from,\n // but they can start immediately..\n // 2. We have the funding, but it's in the wrong place or the wrong asset,\n // but we have deposits and withdraws enabled. We can offer them the\n // option to start in an unbalanced state.\n // 3. We don't have the funds. We offer them an option to start in a\n // starved state.\n const cexMinBaseAlloc = bProj.cex\n let [dexMinBaseAlloc, transferableBaseAlloc, dexBaseFeeReq] = [bProj.book, 0, 0]\n // Only add booking fees if this is the fee asset.\n if (baseID === baseFeeID) dexMinBaseAlloc += bProj.bookingFees\n // Base asset is a token.\n else dexBaseFeeReq += bProj.bookingFees + bProj.swapFeeReserves\n // If we can rebalance, the order reserves could potentially be withdrawn.\n if (canRebalance) transferableBaseAlloc += bProj.orderReserves\n // If we can't rebalance, order reserves are required in dex balance.\n else dexMinBaseAlloc += bProj.orderReserves\n // Handle the special case where the base asset it the quote asset's fee\n // asset.\n if (baseID === quoteFeeID) {\n if (canRebalance) transferableBaseAlloc += qProj.bookingFees + qProj.swapFeeReserves\n else dexMinBaseAlloc += qProj.bookingFees + qProj.swapFeeReserves\n }\n\n let [dexMinQuoteAlloc, cexMinQuoteAlloc, transferableQuoteAlloc, dexQuoteFeeReq] = [qProj.book, qProj.cex, 0, 0]\n if (quoteID === quoteFeeID) dexMinQuoteAlloc += qProj.bookingFees\n else dexQuoteFeeReq += qProj.bookingFees + qProj.swapFeeReserves\n if (canRebalance) transferableQuoteAlloc += qProj.orderReserves + qProj.slippageBuffer\n else {\n // The slippage reserves reserves should be split between cex and dex.\n dexMinQuoteAlloc += qProj.orderReserves\n const basis = qProj.book + qProj.cex + qProj.orderReserves\n dexMinQuoteAlloc += (qProj.book + qProj.orderReserves) / basis * qProj.slippageBuffer\n cexMinQuoteAlloc += qProj.cex / basis * qProj.slippageBuffer\n }\n if (quoteID === baseFeeID) {\n if (canRebalance) transferableQuoteAlloc += bProj.bookingFees + bProj.swapFeeReserves\n else dexMinQuoteAlloc += bProj.bookingFees + bProj.swapFeeReserves\n }\n\n const dexBaseFunded = dexBaseAvail >= dexMinBaseAlloc\n const cexBaseFunded = cexBaseAvail >= cexMinBaseAlloc\n const dexQuoteFunded = dexQuoteAvail >= dexMinQuoteAlloc\n const cexQuoteFunded = cexQuoteAvail >= cexMinQuoteAlloc\n const totalBaseReq = dexMinBaseAlloc + cexMinBaseAlloc + transferableBaseAlloc\n const totalQuoteReq = dexMinQuoteAlloc + cexMinQuoteAlloc + transferableQuoteAlloc\n const baseFundedAndBalanced = dexBaseFunded && cexBaseFunded && baseAvail >= totalBaseReq\n const quoteFundedAndBalanced = dexQuoteFunded && cexQuoteFunded && quoteAvail >= totalQuoteReq\n const baseFeesFunded = dexBaseFeeAvail >= dexBaseFeeReq\n const quoteFeesFunded = dexQuoteFeeAvail >= dexQuoteFeeReq\n\n const fundedAndBalanced = baseFundedAndBalanced && quoteFundedAndBalanced && baseFeesFunded && quoteFeesFunded\n\n // Are we funded but not balanced, but able to rebalance with a cex?\n let fundedAndNotBalanced = !fundedAndBalanced\n if (!fundedAndBalanced) {\n const ordersFunded = baseAvail >= totalBaseReq && quoteAvail >= totalQuoteReq\n const feesFunded = baseFeesFunded && quoteFeesFunded\n fundedAndNotBalanced = ordersFunded && feesFunded && canRebalance\n }\n\n return {\n base: {\n dex: {\n avail: dexBaseAvail,\n req: dexMinBaseAlloc,\n funded: dexBaseFunded\n },\n cex: {\n avail: cexBaseAvail,\n req: cexMinBaseAlloc,\n funded: cexBaseFunded\n },\n transferable: transferableBaseAlloc,\n fees: {\n avail: dexBaseFeeAvail,\n req: dexBaseFeeReq,\n funded: baseFeesFunded\n },\n fundedAndBalanced: baseFundedAndBalanced,\n fundedAndNotBalanced: !baseFundedAndBalanced && baseAvail >= totalBaseReq && canRebalance\n },\n quote: {\n dex: {\n avail: dexQuoteAvail,\n req: dexMinQuoteAlloc,\n funded: dexQuoteFunded\n },\n cex: {\n avail: cexQuoteAvail,\n req: cexMinQuoteAlloc,\n funded: cexQuoteFunded\n },\n transferable: transferableQuoteAlloc,\n fees: {\n avail: dexQuoteFeeAvail,\n req: dexQuoteFeeReq,\n funded: quoteFeesFunded\n },\n fundedAndBalanced: quoteFundedAndBalanced,\n fundedAndNotBalanced: !quoteFundedAndBalanced && quoteAvail >= totalQuoteReq && canRebalance\n },\n fundedAndBalanced,\n fundedAndNotBalanced,\n starved: !fundedAndBalanced && !fundedAndNotBalanced\n }\n }\n}\n\nexport type RunningMMDisplayElements = {\n orderReportForm: PageElement\n dexBalancesRowTmpl: PageElement\n placementRowTmpl: PageElement\n placementAmtRowTmpl: PageElement\n}\n\nexport class RunningMarketMakerDisplay {\n div: PageElement\n page: Record<string, PageElement>\n mkt: BotMarket\n startTime: number\n ticker: any\n currentForm: PageElement\n forms: Forms\n latestEpoch?: EpochReport\n cexProblems?: CEXProblems\n orderReportFormEl: PageElement\n orderReportForm: Record<string, PageElement>\n displayedOrderReportFormSide: 'buys' | 'sells'\n dexBalancesRowTmpl: PageElement\n placementRowTmpl: PageElement\n placementAmtRowTmpl: PageElement\n\n constructor (div: PageElement, forms: Forms, elements: RunningMMDisplayElements, page: string) {\n this.div = div\n this.page = Doc.parseTemplate(div)\n this.orderReportFormEl = elements.orderReportForm\n this.orderReportForm = Doc.idDescendants(elements.orderReportForm)\n this.dexBalancesRowTmpl = elements.dexBalancesRowTmpl\n this.placementRowTmpl = elements.placementRowTmpl\n this.placementAmtRowTmpl = elements.placementAmtRowTmpl\n Doc.cleanTemplates(this.dexBalancesRowTmpl, this.placementRowTmpl, this.placementAmtRowTmpl)\n this.forms = forms\n Doc.bind(this.page.stopBttn, 'click', () => this.stop())\n Doc.bind(this.page.runLogsBttn, 'click', () => {\n const { mkt: { baseID, quoteID, host }, startTime } = this\n app().loadPage('mmlogs', { baseID, quoteID, host, startTime, returnPage: page })\n })\n Doc.bind(this.page.buyOrdersBttn, 'click', () => this.showOrderReport('buys'))\n Doc.bind(this.page.sellOrdersBttn, 'click', () => this.showOrderReport('sells'))\n }\n\n async stop () {\n const { page, mkt: { host, baseID, quoteID } } = this\n const loaded = app().loading(page.stopBttn)\n await MM.stopBot({ host, baseID: baseID, quoteID: quoteID })\n loaded()\n }\n\n async setMarket (host: string, baseID: number, quoteID: number) {\n const botStatus = app().mmStatus.bots.find(({ config: c }: MMBotStatus) => c.baseID === baseID && c.quoteID === quoteID && c.host === host)\n if (!botStatus) return\n const mkt = new BotMarket(botStatus.config)\n await mkt.initialize()\n this.setBotMarket(mkt)\n }\n\n async setBotMarket (mkt: BotMarket) {\n this.mkt = mkt\n const {\n page, div, mkt: {\n host, baseID, quoteID, baseFeeID, quoteFeeID, cexName, baseFeeSymbol,\n quoteFeeSymbol, baseFeeTicker, quoteFeeTicker, cfg, baseFactor, quoteFactor\n }\n } = this\n setMarketElements(div, baseID, quoteID, host)\n Doc.setVis(baseFeeID !== baseID, page.baseFeeReservesBox)\n Doc.setVis(quoteFeeID !== quoteID, page.quoteFeeReservesBox)\n Doc.setVis(Boolean(cexName), ...Doc.applySelector(div, '[data-cex-show]'))\n page.baseFeeLogo.src = Doc.logoPath(baseFeeSymbol)\n page.baseFeeTicker.textContent = baseFeeTicker\n page.quoteFeeLogo.src = Doc.logoPath(quoteFeeSymbol)\n page.quoteFeeTicker.textContent = quoteFeeTicker\n\n const basicCfg = cfg.basicMarketMakingConfig\n const gapStrategy = basicCfg?.gapStrategy ?? GapStrategyPercent\n let gapFactor = cfg.arbMarketMakingConfig?.profit ?? cfg.simpleArbConfig?.profitTrigger ?? 0\n if (basicCfg) {\n const buys = [...basicCfg.buyPlacements].sort((a: OrderPlacement, b: OrderPlacement) => a.gapFactor - b.gapFactor)\n const sells = [...basicCfg.sellPlacements].sort((a: OrderPlacement, b: OrderPlacement) => a.gapFactor - b.gapFactor)\n if (buys.length > 0) {\n if (sells.length > 0) {\n gapFactor = (buys[0].gapFactor + sells[0].gapFactor) / 2\n } else {\n gapFactor = buys[0].gapFactor\n }\n } else gapFactor = sells[0].gapFactor\n }\n Doc.hide(page.profitLabel, page.gapLabel, page.multiplierLabel, page.profitUnit, page.gapUnit, page.multiplierUnit)\n switch (gapStrategy) {\n case GapStrategyPercent:\n case GapStrategyPercentPlus:\n Doc.show(page.profitLabel, page.profitUnit)\n page.gapFactor.textContent = (gapFactor * 100).toFixed(2)\n break\n case GapStrategyMultiplier:\n Doc.show(page.multiplierLabel, page.multiplierUnit)\n page.gapFactor.textContent = (gapFactor * 100).toFixed(2)\n break\n default:\n page.gapFactor.textContent = Doc.formatFourSigFigs(gapFactor / OrderUtil.RateEncodingFactor * baseFactor / quoteFactor)\n }\n\n this.update()\n this.readBook()\n }\n\n handleBalanceNote (n: BalanceNote) {\n if (!this.mkt) return\n const { baseID, quoteID, baseFeeID, quoteFeeID } = this.mkt\n if (n.assetID !== baseID && n.assetID !== baseFeeID && n.assetID !== quoteID && n.assetID !== quoteFeeID) return\n this.update()\n }\n\n handleEpochReportNote (n: EpochReportNote) {\n if (!this.mkt) return\n const { baseID, quoteID, host } = this.mkt\n if (n.baseID !== baseID || n.quoteID !== quoteID || n.host !== host) return\n if (!n.report) return\n this.latestEpoch = n.report\n if (this.forms.currentForm === this.orderReportFormEl && this.forms.currentFormID === this.mkt.id) {\n const orderReport = this.displayedOrderReportFormSide === 'buys' ? n.report.buysReport : n.report.sellsReport\n if (orderReport) this.updateOrderReport(orderReport, this.displayedOrderReportFormSide, n.report.epochNum)\n else this.forms.close()\n }\n this.update()\n }\n\n handleCexProblemsNote (n: CEXProblemsNote) {\n if (!this.mkt) return\n const { baseID, quoteID, host } = this.mkt\n if (n.baseID !== baseID || n.quoteID !== quoteID || n.host !== host) return\n this.cexProblems = n.problems\n this.update()\n }\n\n setTicker () {\n this.page.runTime.textContent = Doc.hmsSince(this.startTime)\n }\n\n update () {\n const {\n div, page, mkt: {\n baseID, quoteID, baseFeeID, quoteFeeID, baseFactor, quoteFactor, baseFeeFactor,\n quoteFeeFactor, marketReport: { baseFiatRate, quoteFiatRate }\n }\n } = this\n // Get fresh stats\n const { botCfg: { cexName, basicMarketMakingConfig: bmmCfg }, runStats, latestEpoch, cexProblems } = this.mkt.status()\n this.latestEpoch = latestEpoch\n this.cexProblems = cexProblems\n\n Doc.hide(page.stats, page.cexRow, page.pendingDepositBox, page.pendingWithdrawalBox)\n\n if (!runStats) {\n if (this.ticker) {\n clearInterval(this.ticker)\n this.ticker = undefined\n }\n return\n } else if (!this.ticker) {\n this.startTime = runStats.startTime\n this.setTicker()\n this.ticker = setInterval(() => this.setTicker(), 1000)\n }\n\n Doc.show(page.stats)\n setSignedValue(runStats.profitLoss.profitRatio * 100, page.profit, page.profitSign, 2)\n setSignedValue(runStats.profitLoss.profit, page.profitLoss, page.plSign, 2)\n this.startTime = runStats.startTime\n\n const summedBalance = (b: BotBalance) => {\n if (!b) return 0\n return b.available + b.locked + b.pending + b.reserved\n }\n\n const dexBaseInv = summedBalance(runStats.dexBalances[baseID]) / baseFactor\n page.walletBaseInventory.textContent = Doc.formatFourSigFigs(dexBaseInv)\n page.walletBaseInvFiat.textContent = Doc.formatFourSigFigs(dexBaseInv * baseFiatRate, 2)\n const dexQuoteInv = summedBalance(runStats.dexBalances[quoteID]) / quoteFactor\n page.walletQuoteInventory.textContent = Doc.formatFourSigFigs(dexQuoteInv)\n page.walletQuoteInvFiat.textContent = Doc.formatFourSigFigs(dexQuoteInv * quoteFiatRate, 2)\n\n Doc.setVis(cexName, page.cexRow)\n if (cexName) {\n Doc.show(page.pendingDepositBox, page.pendingWithdrawalBox)\n setCexElements(div, cexName)\n const cexBaseInv = summedBalance(runStats.cexBalances[baseID]) / baseFactor\n page.cexBaseInventory.textContent = Doc.formatFourSigFigs(cexBaseInv)\n page.cexBaseInventoryFiat.textContent = Doc.formatFourSigFigs(cexBaseInv * baseFiatRate, 2)\n const cexQuoteInv = summedBalance(runStats.cexBalances[quoteID]) / quoteFactor\n page.cexQuoteInventory.textContent = Doc.formatFourSigFigs(cexQuoteInv)\n page.cexQuoteInventoryFiat.textContent = Doc.formatFourSigFigs(cexQuoteInv * quoteFiatRate, 2)\n }\n\n if (baseFeeID !== baseID) {\n const feeBalance = summedBalance(runStats.dexBalances[baseFeeID]) / baseFeeFactor\n page.baseFeeReserves.textContent = Doc.formatFourSigFigs(feeBalance)\n }\n if (quoteFeeID !== quoteID) {\n const feeBalance = summedBalance(runStats.dexBalances[quoteFeeID]) / quoteFeeFactor\n page.quoteFeeReserves.textContent = Doc.formatFourSigFigs(feeBalance)\n }\n\n page.pendingDeposits.textContent = String(Math.round(runStats.pendingDeposits))\n page.pendingWithdrawals.textContent = String(Math.round(runStats.pendingWithdrawals))\n page.completedMatches.textContent = String(Math.round(runStats.completedMatches))\n Doc.setVis(runStats.tradedUSD, page.tradedUSDBox)\n if (runStats.tradedUSD > 0) page.tradedUSD.textContent = Doc.formatFourSigFigs(runStats.tradedUSD)\n Doc.setVis(baseFiatRate, page.roundTripFeesBox)\n if (baseFiatRate) page.roundTripFeesUSD.textContent = Doc.formatFourSigFigs((runStats.feeGap?.roundTripFees / baseFactor * baseFiatRate) || 0)\n const basisPrice = app().conventionalRate(baseID, quoteID, runStats.feeGap?.basisPrice || 0)\n page.basisPrice.textContent = Doc.formatFourSigFigs(basisPrice)\n\n const displayFeeGap = !bmmCfg || bmmCfg.gapStrategy === GapStrategyAbsolutePlus || bmmCfg.gapStrategy === GapStrategyPercentPlus\n Doc.setVis(displayFeeGap, page.feeGapBox)\n if (displayFeeGap) {\n const feeGap = app().conventionalRate(baseID, quoteID, runStats.feeGap?.feeGap || 0)\n page.feeGap.textContent = Doc.formatFourSigFigs(feeGap)\n page.feeGapPct.textContent = (feeGap / basisPrice * 100 || 0).toFixed(2)\n }\n Doc.setVis(bmmCfg, page.gapStrategyBox)\n if (bmmCfg) page.gapStrategy.textContent = bmmCfg.gapStrategy\n\n const remoteGap = app().conventionalRate(baseID, quoteID, runStats.feeGap?.remoteGap || 0)\n Doc.setVis(remoteGap, page.remoteGapBox)\n if (remoteGap) {\n page.remoteGap.textContent = Doc.formatFourSigFigs(remoteGap)\n page.remoteGapPct.textContent = (remoteGap / basisPrice * 100 || 0).toFixed(2)\n }\n\n Doc.setVis(latestEpoch?.buysReport, page.buyOrdersReportBox)\n if (latestEpoch?.buysReport) {\n const allPlaced = allOrdersPlaced(latestEpoch.buysReport)\n Doc.setVis(allPlaced, page.buyOrdersSuccess)\n Doc.setVis(!allPlaced, page.buyOrdersFailed)\n }\n\n Doc.setVis(latestEpoch?.sellsReport, page.sellOrdersReportBox)\n if (latestEpoch?.sellsReport) {\n const allPlaced = allOrdersPlaced(latestEpoch.sellsReport)\n Doc.setVis(allPlaced, page.sellOrdersSuccess)\n Doc.setVis(!allPlaced, page.sellOrdersFailed)\n }\n\n const preOrderProblemMessages = botProblemMessages(latestEpoch?.preOrderProblems, this.mkt.cexName, this.mkt.host)\n const cexErrorMessages = cexProblemMessages(this.cexProblems)\n const allMessages = [...preOrderProblemMessages, ...cexErrorMessages]\n Doc.setVis(allMessages.length > 0, page.preOrderProblemsBox)\n Doc.empty(page.preOrderProblemsBox)\n for (const msg of allMessages) {\n const spanEl = document.createElement('span') as PageElement\n spanEl.textContent = `- ${msg}`\n page.preOrderProblemsBox.appendChild(spanEl)\n }\n }\n\n updateOrderReport (report: OrderReport, side: 'buys' | 'sells', epochNum: number) {\n const form = this.orderReportForm\n const sideTxt = side === 'buys' ? intl.prep(intl.ID_BUY) : intl.prep(intl.ID_SELL)\n form.orderReportTitle.textContent = intl.prep(intl.ID_ORDER_REPORT_TITLE, { side: sideTxt, epochNum: `${epochNum}` })\n\n Doc.setVis(report.error, form.orderReportError)\n Doc.setVis(!report.error, form.orderReportDetails)\n if (report.error) {\n const problemMessages = botProblemMessages(report.error, this.mkt.cexName, this.mkt.host)\n Doc.empty(form.orderReportError)\n for (const msg of problemMessages) {\n const spanEl = document.createElement('span') as PageElement\n spanEl.textContent = `- ${msg}`\n form.orderReportError.appendChild(spanEl)\n }\n return\n }\n\n Doc.empty(form.dexBalancesBody, form.placementsBody)\n const createRow = (assetID: number): [PageElement, number] => {\n const row = this.dexBalancesRowTmpl.cloneNode(true) as HTMLElement\n const rowTmpl = Doc.parseTemplate(row)\n const asset = app().assets[assetID]\n rowTmpl.asset.textContent = asset.symbol.toUpperCase()\n rowTmpl.assetLogo.src = Doc.logoPath(asset.symbol)\n const unitInfo = asset.unitInfo\n const available = report.availableDexBals[assetID] ? report.availableDexBals[assetID].available : 0\n const required = report.requiredDexBals[assetID] ? report.requiredDexBals[assetID] : 0\n const remaining = report.remainingDexBals[assetID] ? report.remainingDexBals[assetID] : 0\n const pending = report.availableDexBals[assetID] ? report.availableDexBals[assetID].pending : 0\n const locked = report.availableDexBals[assetID] ? report.availableDexBals[assetID].locked : 0\n const used = report.usedDexBals[assetID] ? report.usedDexBals[assetID] : 0\n rowTmpl.available.textContent = Doc.formatCoinValue(available, unitInfo)\n rowTmpl.locked.textContent = Doc.formatCoinValue(locked, unitInfo)\n rowTmpl.required.textContent = Doc.formatCoinValue(required, unitInfo)\n rowTmpl.remaining.textContent = Doc.formatCoinValue(remaining, unitInfo)\n rowTmpl.pending.textContent = Doc.formatCoinValue(pending, unitInfo)\n rowTmpl.used.textContent = Doc.formatCoinValue(used, unitInfo)\n const deficiency = safeSub(required, available)\n rowTmpl.deficiency.textContent = Doc.formatCoinValue(deficiency, unitInfo)\n if (deficiency > 0) rowTmpl.deficiency.classList.add('text-warning')\n const deficiencyWithPending = safeSub(deficiency, pending)\n rowTmpl.deficiencyWithPending.textContent = Doc.formatCoinValue(deficiencyWithPending, unitInfo)\n if (deficiencyWithPending > 0) rowTmpl.deficiencyWithPending.classList.add('text-warning')\n return [row, deficiency]\n }\n const setDeficiencyVisibility = (deficiency: boolean, rows: HTMLElement[]) => {\n Doc.setVis(deficiency, form.dexDeficiencyHeader, form.dexDeficiencyWithPendingHeader)\n for (const row of rows) {\n const rowTmpl = Doc.parseTemplate(row)\n Doc.setVis(deficiency, rowTmpl.deficiency, rowTmpl.deficiencyWithPending)\n }\n }\n const assetIDs = [this.mkt.baseID, this.mkt.quoteID]\n if (!assetIDs.includes(this.mkt.baseFeeID)) assetIDs.push(this.mkt.baseFeeID)\n if (!assetIDs.includes(this.mkt.quoteFeeID)) assetIDs.push(this.mkt.quoteFeeID)\n let totalDeficiency = 0\n const rows : PageElement[] = []\n for (const assetID of assetIDs) {\n const [row, deficiency] = createRow(assetID)\n totalDeficiency += deficiency\n form.dexBalancesBody.appendChild(row)\n rows.push(row)\n }\n setDeficiencyVisibility(totalDeficiency > 0, rows)\n\n Doc.setVis(this.mkt.cexName, form.cexSection, form.counterTradeRateHeader, form.requiredCEXHeader, form.usedCEXHeader)\n let cexAsset: SupportedAsset\n if (this.mkt.cexName) {\n const cexDisplayInfo = CEXDisplayInfos[this.mkt.cexName]\n if (cexDisplayInfo) {\n form.cexLogo.src = cexDisplayInfo.logo\n form.cexBalancesTitle.textContent = intl.prep(intl.ID_CEX_BALANCES, { cexName: cexDisplayInfo.name })\n } else {\n console.error(`CEXDisplayInfo not found for ${this.mkt.cexName}`)\n }\n const cexAssetID = side === 'buys' ? this.mkt.baseID : this.mkt.quoteID\n cexAsset = app().assets[cexAssetID]\n form.cexAsset.textContent = cexAsset.symbol.toUpperCase()\n form.cexAssetLogo.src = Doc.logoPath(cexAsset.symbol)\n const availableCexBal = report.availableCexBal ? report.availableCexBal.available : 0\n const requiredCexBal = report.requiredCexBal ? report.requiredCexBal : 0\n const remainingCexBal = report.remainingCexBal ? report.remainingCexBal : 0\n const pendingCexBal = report.availableCexBal ? report.availableCexBal.pending : 0\n const reservedCexBal = report.availableCexBal ? report.availableCexBal.reserved : 0\n const usedCexBal = report.usedCexBal ? report.usedCexBal : 0\n const deficiencyCexBal = safeSub(requiredCexBal, availableCexBal)\n const deficiencyWithPendingCexBal = safeSub(deficiencyCexBal, pendingCexBal)\n form.cexAvailable.textContent = Doc.formatCoinValue(availableCexBal, cexAsset.unitInfo)\n form.cexLocked.textContent = Doc.formatCoinValue(reservedCexBal, cexAsset.unitInfo)\n form.cexRequired.textContent = Doc.formatCoinValue(requiredCexBal, cexAsset.unitInfo)\n form.cexRemaining.textContent = Doc.formatCoinValue(remainingCexBal, cexAsset.unitInfo)\n form.cexPending.textContent = Doc.formatCoinValue(pendingCexBal, cexAsset.unitInfo)\n form.cexUsed.textContent = Doc.formatCoinValue(usedCexBal, cexAsset.unitInfo)\n const deficient = deficiencyCexBal > 0\n Doc.setVis(deficient, form.cexDeficiencyHeader, form.cexDeficiencyWithPendingHeader,\n form.cexDeficiency, form.cexDeficiencyWithPending)\n if (deficient) {\n form.cexDeficiency.textContent = Doc.formatCoinValue(deficiencyCexBal, cexAsset.unitInfo)\n form.cexDeficiencyWithPending.textContent = Doc.formatCoinValue(deficiencyWithPendingCexBal, cexAsset.unitInfo)\n if (deficiencyWithPendingCexBal > 0) form.cexDeficiencyWithPending.classList.add('text-warning')\n else form.cexDeficiencyWithPending.classList.remove('text-warning')\n }\n }\n\n let anyErrors = false\n for (const placement of report.placements) if (placement.error) { anyErrors = true; break }\n Doc.setVis(anyErrors, form.errorHeader)\n const createPlacementRow = (placement: TradePlacement, priority: number): PageElement => {\n const row = this.placementRowTmpl.cloneNode(true) as HTMLElement\n const rowTmpl = Doc.parseTemplate(row)\n const baseUI = app().assets[this.mkt.baseID].unitInfo\n const quoteUI = app().assets[this.mkt.quoteID].unitInfo\n rowTmpl.priority.textContent = String(priority)\n rowTmpl.rate.textContent = Doc.formatRateFullPrecision(placement.rate, baseUI, quoteUI, this.mkt.rateStep)\n rowTmpl.lots.textContent = String(placement.lots)\n rowTmpl.standingLots.textContent = String(placement.standingLots)\n rowTmpl.orderedLots.textContent = String(placement.orderedLots)\n if (placement.standingLots + placement.orderedLots < placement.lots) {\n rowTmpl.lots.classList.add('text-warning')\n rowTmpl.standingLots.classList.add('text-warning')\n rowTmpl.orderedLots.classList.add('text-warning')\n }\n Doc.setVis(placement.counterTradeRate > 0, rowTmpl.counterTradeRate)\n rowTmpl.counterTradeRate.textContent = Doc.formatRateFullPrecision(placement.counterTradeRate, baseUI, quoteUI, this.mkt.rateStep)\n for (const assetID of assetIDs) {\n const asset = app().assets[assetID]\n const unitInfo = asset.unitInfo\n const requiredAmt = placement.requiredDex[assetID] ? placement.requiredDex[assetID] : 0\n const usedAmt = placement.usedDex[assetID] ? placement.usedDex[assetID] : 0\n const requiredRow = this.placementAmtRowTmpl.cloneNode(true) as HTMLElement\n const requiredRowTmpl = Doc.parseTemplate(requiredRow)\n const usedRow = this.placementAmtRowTmpl.cloneNode(true) as HTMLElement\n const usedRowTmpl = Doc.parseTemplate(usedRow)\n requiredRowTmpl.amt.textContent = Doc.formatCoinValue(requiredAmt, unitInfo)\n requiredRowTmpl.assetLogo.src = Doc.logoPath(asset.symbol)\n requiredRowTmpl.assetSymbol.textContent = asset.symbol.toUpperCase()\n usedRowTmpl.amt.textContent = Doc.formatCoinValue(usedAmt, unitInfo)\n usedRowTmpl.assetLogo.src = Doc.logoPath(asset.symbol)\n usedRowTmpl.assetSymbol.textContent = asset.symbol.toUpperCase()\n rowTmpl.requiredDEX.appendChild(requiredRow)\n rowTmpl.usedDEX.appendChild(usedRow)\n }\n Doc.setVis(this.mkt.cexName, rowTmpl.requiredCEX, rowTmpl.usedCEX)\n if (this.mkt.cexName) {\n const requiredAmt = Doc.formatCoinValue(placement.requiredCex, cexAsset.unitInfo)\n rowTmpl.requiredCEX.textContent = `${requiredAmt} ${cexAsset.symbol.toUpperCase()}`\n const usedAmt = Doc.formatCoinValue(placement.usedCex, cexAsset.unitInfo)\n rowTmpl.usedCEX.textContent = `${usedAmt} ${cexAsset.symbol.toUpperCase()}`\n }\n Doc.setVis(anyErrors, rowTmpl.error)\n if (placement.error) {\n const errMessages = botProblemMessages(placement.error, this.mkt.cexName, this.mkt.host)\n rowTmpl.error.textContent = errMessages.join('\\n')\n }\n return row\n }\n for (let i = 0; i < report.placements.length; i++) {\n form.placementsBody.appendChild(createPlacementRow(report.placements[i], i + 1))\n }\n }\n\n showOrderReport (side: 'buys' | 'sells') {\n if (!this.latestEpoch) return\n const report = side === 'buys' ? this.latestEpoch.buysReport : this.latestEpoch.sellsReport\n if (!report) return\n this.updateOrderReport(report, side, this.latestEpoch.epochNum)\n this.displayedOrderReportFormSide = side\n this.forms.show(this.orderReportFormEl, this.mkt.id)\n }\n\n readBook () {\n if (!this.mkt) return\n const { page, mkt: { host, mktID } } = this\n const orders = app().exchanges[host].markets[mktID].orders || []\n page.nBookedOrders.textContent = String(orders.filter((ord: Order) => ord.status === OrderUtil.StatusBooked).length)\n }\n}\n\nfunction allOrdersPlaced (report: OrderReport) {\n if (report.error) return false\n for (let i = 0; i < report.placements.length; i++) {\n const placement = report.placements[i]\n if (placement.orderedLots + placement.standingLots < placement.lots) return false\n if (placement.error) return false\n }\n return true\n}\n\nfunction setSignedValue (v: number, vEl: PageElement, signEl: PageElement, maxDecimals?: number) {\n vEl.textContent = Doc.formatFourSigFigs(v, maxDecimals)\n signEl.classList.toggle('ico-plus', v > 0)\n signEl.classList.toggle('text-good', v > 0)\n // signEl.classList.toggle('ico-minus', v < 0)\n}\n\nexport function feesAndCommit (\n baseID: number, quoteID: number, baseFees: LotFeeRange, quoteFees: LotFeeRange,\n lotSize: number, baseLots: number, quoteLots: number, baseFeeID: number, quoteFeeID: number,\n baseIsAccountLocker: boolean, quoteIsAccountLocker: boolean, baseOrderReservesFactor: number,\n quoteOrderReservesFactor: number\n) {\n const quoteLot = calculateQuoteLot(lotSize, baseID, quoteID)\n const [cexBaseLots, cexQuoteLots] = [quoteLots, baseLots]\n const commit = {\n dex: {\n base: {\n lots: baseLots,\n val: baseLots * lotSize\n },\n quote: {\n lots: quoteLots,\n val: quoteLots * quoteLot\n }\n },\n cex: {\n base: {\n lots: cexBaseLots,\n val: cexBaseLots * lotSize\n },\n quote: {\n lots: cexQuoteLots,\n val: cexQuoteLots * quoteLot\n }\n }\n }\n\n let baseTokenFeesPerSwap = 0\n let baseRedeemReservesPerLot = 0\n if (baseID !== baseFeeID) { // token\n baseTokenFeesPerSwap += baseFees.estimated.swap\n if (baseFeeID === quoteFeeID) baseTokenFeesPerSwap += quoteFees.estimated.redeem\n }\n let baseBookingFeesPerLot = baseFees.max.swap\n if (baseID === quoteFeeID) baseBookingFeesPerLot += quoteFees.max.redeem\n if (baseIsAccountLocker) {\n baseBookingFeesPerLot += baseFees.max.refund\n if (!quoteIsAccountLocker && baseFeeID !== quoteFeeID) baseRedeemReservesPerLot = baseFees.max.redeem\n }\n\n let quoteTokenFeesPerSwap = 0\n let quoteRedeemReservesPerLot = 0\n if (quoteID !== quoteFeeID) {\n quoteTokenFeesPerSwap += quoteFees.estimated.swap\n if (quoteFeeID === baseFeeID) quoteTokenFeesPerSwap += baseFees.estimated.redeem\n }\n let quoteBookingFeesPerLot = quoteFees.max.swap\n if (quoteID === baseFeeID) quoteBookingFeesPerLot += baseFees.max.redeem\n if (quoteIsAccountLocker) {\n quoteBookingFeesPerLot += quoteFees.max.refund\n if (!baseIsAccountLocker && quoteFeeID !== baseFeeID) quoteRedeemReservesPerLot = quoteFees.max.redeem\n }\n\n const baseReservesFactor = 1 + baseOrderReservesFactor\n const quoteReservesFactor = 1 + quoteOrderReservesFactor\n\n const baseBookingFees = (baseBookingFeesPerLot * baseLots) * baseReservesFactor\n const baseRedeemFees = (baseRedeemReservesPerLot * quoteLots) * quoteReservesFactor\n const quoteBookingFees = (quoteBookingFeesPerLot * quoteLots) * quoteReservesFactor\n const quoteRedeemFees = (quoteRedeemReservesPerLot * baseLots) * baseReservesFactor\n\n const fees: BookingFees = {\n base: {\n ...baseFees,\n bookingFeesPerLot: baseBookingFeesPerLot,\n bookingFeesPerCounterLot: baseRedeemReservesPerLot,\n bookingFees: baseBookingFees + baseRedeemFees,\n swapReservesFactor: baseReservesFactor,\n redeemReservesFactor: quoteReservesFactor,\n tokenFeesPerSwap: baseTokenFeesPerSwap\n },\n quote: {\n ...quoteFees,\n bookingFeesPerLot: quoteBookingFeesPerLot,\n bookingFeesPerCounterLot: quoteRedeemReservesPerLot,\n bookingFees: quoteBookingFees + quoteRedeemFees,\n swapReservesFactor: quoteReservesFactor,\n redeemReservesFactor: baseReservesFactor,\n tokenFeesPerSwap: quoteTokenFeesPerSwap\n }\n }\n\n return { commit, fees }\n}\n\nfunction botProblemMessages (problems: BotProblems | undefined, cexName: string, dexHost: string): string[] {\n if (!problems) return []\n const msgs: string[] = []\n\n if (problems.walletNotSynced) {\n for (const [assetID, notSynced] of Object.entries(problems.walletNotSynced)) {\n if (notSynced) {\n msgs.push(intl.prep(intl.ID_WALLET_NOT_SYNCED, { assetSymbol: app().assets[Number(assetID)].symbol.toUpperCase() }))\n }\n }\n }\n\n if (problems.noWalletPeers) {\n for (const [assetID, noPeers] of Object.entries(problems.noWalletPeers)) {\n if (noPeers) {\n msgs.push(intl.prep(intl.ID_WALLET_NO_PEERS, { assetSymbol: app().assets[Number(assetID)].symbol.toUpperCase() }))\n }\n }\n }\n\n if (problems.accountSuspended) {\n msgs.push(intl.prep(intl.ID_ACCOUNT_SUSPENDED, { dexHost: dexHost }))\n }\n\n if (problems.userLimitTooLow) {\n msgs.push(intl.prep(intl.ID_USER_LIMIT_TOO_LOW, { dexHost: dexHost }))\n }\n\n if (problems.noPriceSource) {\n msgs.push(intl.prep(intl.ID_NO_PRICE_SOURCE))\n }\n\n if (problems.cexOrderbookUnsynced) {\n msgs.push(intl.prep(intl.ID_CEX_ORDERBOOK_UNSYNCED, { cexName: cexName }))\n }\n\n if (problems.causesSelfMatch) {\n msgs.push(intl.prep(intl.ID_CAUSES_SELF_MATCH))\n }\n\n if (problems.unknownError) {\n msgs.push(problems.unknownError)\n }\n\n return msgs\n}\n\nfunction cexProblemMessages (problems: CEXProblems | undefined): string[] {\n if (!problems) return []\n const msgs: string[] = []\n if (problems.depositErr) {\n for (const [assetID, depositErr] of Object.entries(problems.depositErr)) {\n msgs.push(intl.prep(intl.ID_DEPOSIT_ERROR,\n {\n assetSymbol: app().assets[Number(assetID)].symbol.toUpperCase(),\n time: new Date(depositErr.stamp * 1000).toLocaleString(),\n error: depositErr.error\n }))\n }\n }\n if (problems.withdrawErr) {\n for (const [assetID, withdrawErr] of Object.entries(problems.withdrawErr)) {\n msgs.push(intl.prep(intl.ID_WITHDRAW_ERROR,\n {\n assetSymbol: app().assets[Number(assetID)].symbol.toUpperCase(),\n time: new Date(withdrawErr.stamp * 1000).toLocaleString(),\n error: withdrawErr.error\n }))\n }\n }\n if (problems.tradeErr) {\n msgs.push(intl.prep(intl.ID_CEX_TRADE_ERROR,\n {\n time: new Date(problems.tradeErr.stamp * 1000).toLocaleString(),\n error: problems.tradeErr.error\n }))\n }\n return msgs\n}\n\nfunction safeSub (a: number, b: number) {\n return a - b > 0 ? a - b : 0\n}\n\nwindow.mmstatus = function () : Promise<MarketMakingStatus> {\n return MM.status()\n}\n","import Doc, { Animation } from './doc'\nimport { postJSON } from './http'\nimport State from './state'\nimport * as intl from './locales'\nimport { Wave } from './charts'\nimport {\n bondReserveMultiplier,\n perTierBaseParcelLimit,\n parcelLimitScoreMultiplier,\n strongTier\n} from './account'\nimport {\n app,\n SupportedAsset,\n PageElement,\n WalletDefinition,\n ConfigOption,\n Exchange,\n Market,\n BondAsset,\n WalletState,\n BalanceNote,\n Order,\n XYRange,\n WalletStateNote,\n WalletSyncNote,\n WalletInfo,\n Token,\n WalletCreationNote,\n CoreNote,\n PrepaidBondID\n} from './registry'\nimport { XYRangeHandler } from './opts'\nimport { CoinExplorers } from './coinexplorers'\nimport { MM, setCexElements } from './mmutil'\n\ninterface ConfigOptionInput extends HTMLInputElement {\n configOpt: ConfigOption\n}\n\ninterface ProgressPoint {\n stamp: number\n progress: number\n}\n\ninterface CurrentAsset {\n asset: SupportedAsset\n parentAsset?: SupportedAsset\n winfo: WalletInfo | Token\n // selectedDef is used in a strange way for tokens. If a token's parent wallet\n // already exists, then selectedDef is going to be the Token.definition.\n // BUT, if the token's parent wallet doesn't exist yet, the NewWalletForm\n // operates in a combined configuration mode, and the selectedDef will be the\n // currently selected parent asset definition. There is no loss of info\n // in such a case, because the token wallet only has one definition.\n selectedDef: WalletDefinition\n}\n\ninterface WalletConfig {\n assetID: number\n config: Record<string, string>\n walletType: string\n}\n\ninterface FormsConfig {\n closed?: (closedForm: PageElement | undefined) => void\n}\n\nexport class Forms {\n formsDiv: PageElement\n currentForm: PageElement | undefined\n currentFormID: string | undefined\n keyup: (e: KeyboardEvent) => void\n closed?: (closedForm: PageElement | undefined) => void\n\n constructor (formsDiv: PageElement, cfg?: FormsConfig) {\n this.formsDiv = formsDiv\n this.closed = cfg?.closed\n\n formsDiv.querySelectorAll('.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => { this.close() })\n })\n\n Doc.bind(formsDiv, 'mousedown', (e: MouseEvent) => {\n if (!this.currentForm) return\n if (!Doc.mouseInElement(e, this.currentForm)) { this.close() }\n })\n\n this.keyup = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.close()\n }\n }\n Doc.bind(document, 'keyup', this.keyup)\n }\n\n /* showForm shows a modal form with a little animation. */\n async show (form: HTMLElement, id?: string): Promise<void> {\n this.currentForm = form\n this.currentFormID = id\n Doc.hide(...Array.from(this.formsDiv.children))\n form.style.right = '10000px'\n Doc.show(this.formsDiv, form)\n const shift = (this.formsDiv.offsetWidth + form.offsetWidth) / 2\n await Doc.animate(animationLength, progress => {\n form.style.right = `${(1 - progress) * shift}px`\n }, 'easeOutHard')\n form.style.right = '0'\n }\n\n close (): void {\n Doc.hide(this.formsDiv)\n const closedForm = this.currentForm\n this.currentForm = undefined\n this.currentFormID = undefined\n if (this.closed) this.closed(closedForm)\n }\n\n exit () {\n Doc.unbind(document, 'keyup', this.keyup)\n }\n}\n\n/*\n * NewWalletForm should be used with the \"newWalletForm\" template. The enclosing\n * <form> element should be the first argument of the constructor.\n */\nexport class NewWalletForm {\n page: Record<string, PageElement>\n form: HTMLElement\n success: (assetID: number) => void\n current: CurrentAsset\n subform: WalletConfigForm\n walletCfgGuide: PageElement\n parentSyncer: null | ((w: WalletState) => void)\n createUpdater: null | ((note: WalletCreationNote) => void)\n\n constructor (form: HTMLElement, success: (assetID: number) => void, backFunc?: () => void) {\n this.form = form\n this.success = success\n const page = this.page = Doc.parseTemplate(form)\n\n if (backFunc) {\n Doc.show(page.goBack)\n Doc.bind(page.goBack, 'click', () => { backFunc() })\n }\n\n Doc.empty(page.walletTabTmpl)\n page.walletTabTmpl.removeAttribute('id')\n\n // WalletConfigForm will set the global app variable.\n this.subform = new WalletConfigForm(page.walletSettings, true)\n\n this.walletCfgGuide = Doc.tmplElement(form, 'walletCfgGuide')\n\n bind(form, page.submitAdd, () => this.submit())\n bind(form, page.oneBttn, () => this.submit())\n\n app().registerNoteFeeder({\n walletstate: (note: WalletStateNote) => { this.reportWalletState(note.wallet) },\n walletsync: (note: WalletSyncNote) => { if (this.parentSyncer) this.parentSyncer(app().walletMap[note.assetID]) },\n createwallet: (note: WalletCreationNote) => { this.reportCreationUpdate(note) }\n })\n }\n\n /*\n * reportWalletState should be called when a 'walletstate' notification is\n * received.\n * TODO: Let form classes register for notifications.\n */\n reportWalletState (w: WalletState): void {\n if (this.parentSyncer) this.parentSyncer(w)\n }\n\n /*\n * reportWalletState should be called when a 'createwallet' notification is\n * received.\n */\n reportCreationUpdate (note: WalletCreationNote) {\n if (this.createUpdater) this.createUpdater(note)\n }\n\n async createWallet (assetID: number, walletType: string, parentForm?: WalletConfig) {\n const createForm = {\n assetID: assetID,\n pass: this.page.newWalletPass.value || '',\n config: this.subform.map(assetID),\n walletType: walletType,\n parentForm: parentForm\n }\n\n const ani = new Wave(this.form, { backgroundColor: true })\n const res = await postJSON('/api/newwallet', createForm)\n ani.stop()\n return res\n }\n\n async submit () {\n const page = this.page\n const newWalletPass = page.newWalletPass as HTMLInputElement\n Doc.hide(page.newWalletErr)\n\n const { asset, parentAsset } = this.current\n const selectedDef = this.current.selectedDef\n let parentForm\n let walletType = selectedDef.type\n if (parentAsset) {\n walletType = (asset.token as Token).definition.type\n parentForm = {\n assetID: parentAsset.id,\n config: this.subform.map(parentAsset.id),\n walletType: selectedDef.type\n }\n }\n // Register the selected asset.\n const res = await this.createWallet(asset.id, walletType, parentForm)\n if (!app().checkResponse(res)) {\n this.setError(res.msg)\n return\n }\n newWalletPass.value = ''\n if (parentAsset) await this.runParentSync()\n else this.success(this.current.asset.id)\n }\n\n /*\n * runParentSync shows a syncing sub-dialog that tracks the parent asset's\n * syncProgress and informs the user that the token wallet will be created\n * after sync is complete.\n */\n async runParentSync () {\n const { page, current: { parentAsset, asset } } = this\n if (!parentAsset) return\n\n page.parentSyncPct.textContent = '0'\n page.parentName.textContent = parentAsset.name\n page.parentLogo.src = Doc.logoPath(parentAsset.symbol)\n page.childName.textContent = asset.name\n page.childLogo.src = Doc.logoPath(asset.symbol)\n Doc.hide(page.mainForm)\n Doc.show(page.parentSyncing)\n\n try {\n await this.syncParent(parentAsset)\n this.success(this.current.asset.id)\n } catch (error) {\n this.setError(error.message || error)\n }\n Doc.show(page.mainForm)\n Doc.hide(page.parentSyncing)\n }\n\n /*\n * syncParent monitors the sync progress of a token's parent asset, generating\n * an Error if the token wallet creation does not complete successfully.\n */\n syncParent (parentAsset: SupportedAsset): Promise<void> {\n const { page, current: { asset } } = this\n return new Promise((resolve, reject) => {\n // First, check if it's already synced.\n const w = app().assets[parentAsset.id].wallet\n if (w && w.synced) return resolve()\n // Not synced, so create a syncer to update the parent sync pane.\n this.parentSyncer = (w: WalletState) => {\n if (w.assetID !== parentAsset.id) return\n page.parentSyncPct.textContent = (w.syncProgress * 100).toFixed(1)\n }\n // Handle the async result.\n this.createUpdater = (note: WalletCreationNote) => {\n if (note.assetID !== asset.id) return\n switch (note.topic) {\n case 'QueuedCreationFailed':\n reject(new Error(`${note.subject}: ${note.details}`))\n break\n case 'QueuedCreationSuccess':\n resolve()\n break\n default:\n return\n }\n this.parentSyncer = null\n this.createUpdater = null\n }\n })\n }\n\n /* setAsset sets the current asset of the NewWalletForm */\n async setAsset (assetID: number) {\n if (!this.parseAsset(assetID)) return // nothing to change\n const page = this.page\n const tabs = page.walletTypeTabs\n const { winfo, asset, parentAsset } = this.current\n page.assetName.textContent = winfo.name\n page.newWalletPass.value = ''\n\n Doc.empty(tabs)\n Doc.hide(tabs, page.newWalletErr, page.tokenMsgBox)\n this.page.assetLogo.src = Doc.logoPath(asset.symbol)\n if (parentAsset) {\n page.tokenParentLogo.src = Doc.logoPath(parentAsset.symbol)\n page.tokenParentName.textContent = parentAsset.name\n Doc.show(page.tokenMsgBox)\n }\n\n const pinfo = parentAsset ? parentAsset.info : null\n const walletDefs = pinfo ? pinfo.availablewallets : (winfo as WalletInfo).availablewallets ? (winfo as WalletInfo).availablewallets : [(winfo as Token).definition]\n\n if (walletDefs.length > 1) {\n Doc.show(tabs)\n for (const wDef of walletDefs) {\n const tab = page.walletTabTmpl.cloneNode(true) as HTMLElement\n tab.dataset.tooltip = wDef.description\n tab.textContent = wDef.tab\n tabs.appendChild(tab)\n Doc.bind(tab, 'click', () => {\n for (const t of Doc.kids(tabs)) t.classList.remove('selected')\n tab.classList.add('selected')\n this.update(wDef)\n })\n }\n app().bindTooltips(tabs)\n const first = tabs.firstChild as HTMLElement\n first.classList.add('selected')\n }\n\n await this.update(this.current.selectedDef)\n if (asset.walletCreationPending) await this.runParentSync()\n }\n\n /*\n * parseAsset parses the current data for the asset ID.\n */\n parseAsset (assetID: number) {\n if (this.current && this.current.asset.id === assetID) return false\n const asset = app().assets[assetID]\n const token = asset.token\n if (!token) {\n if (!asset.info) throw Error('this non-token asset has no wallet info!')\n this.current = { asset, winfo: asset.info, selectedDef: asset.info.availablewallets[0] }\n return true\n }\n const parentAsset = app().user.assets[token.parentID]\n if (parentAsset.wallet) {\n // If the parent asset already has a wallet, there's no need to configure\n // the parent too. Just configure the token.\n this.current = { asset, winfo: token, selectedDef: token.definition }\n return true\n }\n if (!parentAsset.info) throw Error('this parent has no wallet info!')\n this.current = { asset, parentAsset, winfo: token, selectedDef: parentAsset.info.availablewallets[0] }\n return true\n }\n\n async update (walletDef: WalletDefinition) {\n const page = this.page\n this.current.selectedDef = walletDef\n Doc.hide(page.walletPassAndSubmitBttn, page.oneBttnBox, page.newWalletPassBox)\n const guideLink = walletDef.guidelink\n const configOpts = walletDef.configopts || []\n // If a config represents a wallet's birthday, we update the default\n // selection to the current date if this installation of the client\n // generated a seed.\n configOpts.map((opt) => {\n if (opt.isBirthdayConfig && app().seedGenTime > 0) {\n opt.default = toUnixDate(new Date())\n }\n return opt\n })\n // Either this is a walletDef for a token's uncreated parent asset, or this\n // is the definition for the token.\n let containsRequired = false\n for (const opt of configOpts) {\n if (opt.required) {\n containsRequired = true\n break\n }\n }\n const { asset, parentAsset, winfo } = this.current\n const displayCreateBtn = walletDef.seeded || Boolean(asset.token)\n if (displayCreateBtn && !containsRequired) {\n Doc.hide(page.walletSettingsHeader)\n Doc.show(page.oneBttnBox)\n } else if (displayCreateBtn) {\n Doc.show(page.walletPassAndSubmitBttn, page.walletSettingsHeader)\n page.newWalletPass.value = ''\n page.submitAdd.textContent = intl.prep(intl.ID_CREATE)\n } else {\n Doc.show(page.walletPassAndSubmitBttn, page.walletSettingsHeader)\n if (!walletDef.noauth) Doc.show(page.newWalletPassBox)\n page.submitAdd.textContent = intl.prep(intl.ID_ADD)\n }\n\n if (parentAsset) {\n const parentAndTokenOpts = JSON.parse(JSON.stringify(configOpts))\n // Add the regAsset field to the configurations so proper logos will be displayed\n // next to them, and map can filter them out. The opts are copied here so the originals\n // do not have the regAsset field added to them.\n for (const opt of parentAndTokenOpts) opt.regAsset = parentAsset.id\n const tokenOpts = (winfo as Token).definition.configopts || []\n if (tokenOpts.length > 0) {\n const tokenOptsCopy = JSON.parse(JSON.stringify(tokenOpts))\n for (const opt of tokenOptsCopy) opt.regAsset = asset.id\n parentAndTokenOpts.push(...tokenOptsCopy)\n }\n this.subform.update(asset.id, parentAndTokenOpts, false)\n } else this.subform.update(asset.id, configOpts, false)\n this.setGuideLink(guideLink)\n\n // A seeded or token wallet is internal to Bison Wallet and as such does\n // not have an external config file to select.\n if (walletDef.seeded || Boolean(this.current.asset.token)) Doc.hide(this.subform.fileSelector)\n else Doc.show(this.subform.fileSelector)\n\n await this.loadDefaults()\n }\n\n setGuideLink (guideLink: string) {\n Doc.hide(this.walletCfgGuide)\n if (guideLink !== '') {\n this.walletCfgGuide.href = guideLink\n Doc.show(this.walletCfgGuide)\n }\n }\n\n /* setError sets and shows the in-form error message. */\n async setError (errMsg: string) {\n this.page.newWalletErr.textContent = errMsg\n Doc.show(this.page.newWalletErr)\n }\n\n /*\n * loadDefaults attempts to load the ExchangeWallet configuration from the\n * default wallet config path on the server and will auto-fill the page on\n * the subform if settings are found.\n */\n async loadDefaults () {\n // No default config files for seeded assets right now.\n const { asset, parentAsset, selectedDef } = this.current\n if (!selectedDef.configpath) return\n let configID = asset.id\n if (parentAsset) {\n if (selectedDef.seeded) return\n configID = parentAsset.id\n }\n const loaded = app().loading(this.form)\n const res = await postJSON('/api/defaultwalletcfg', {\n assetID: configID,\n type: selectedDef.type\n })\n loaded()\n if (!app().checkResponse(res)) {\n this.setError(res.msg)\n return\n }\n this.subform.setLoadedConfig(res.config)\n }\n}\n\nlet dynamicInputCounter = 0\n\n/*\n * WalletConfigForm is a dynamically generated sub-form for setting\n * asset-specific wallet configuration options.\n*/\nexport class WalletConfigForm {\n page: Record<string, PageElement>\n form: HTMLElement\n configElements: [ConfigOption, HTMLElement][]\n configOpts: ConfigOption[]\n sectionize: boolean\n allSettings: PageElement\n dynamicOpts: PageElement\n textInputTmpl: PageElement\n dateInputTmpl: PageElement\n checkboxTmpl: PageElement\n repeatableTmpl: PageElement\n fileSelector: PageElement\n fileInput: PageElement\n errMsg: PageElement\n showOther: PageElement\n showIcon: PageElement\n hideIcon: PageElement\n showHideMsg: PageElement\n otherSettings: PageElement\n loadedSettingsMsg: PageElement\n loadedSettings: PageElement\n defaultSettingsMsg: PageElement\n defaultSettings: PageElement\n assetHasActiveOrders: boolean\n assetID: number\n\n constructor (form: HTMLElement, sectionize: boolean) {\n this.page = Doc.idDescendants(form)\n this.form = form\n // A configElement is a div containing an input and its label.\n this.configElements = []\n // configOpts is the wallet options provided by core.\n this.configOpts = []\n this.sectionize = sectionize\n\n // Get template elements\n this.allSettings = Doc.tmplElement(form, 'allSettings')\n this.dynamicOpts = Doc.tmplElement(form, 'dynamicOpts')\n this.textInputTmpl = Doc.tmplElement(form, 'textInput')\n this.textInputTmpl.remove()\n this.dateInputTmpl = Doc.tmplElement(form, 'dateInput')\n this.dateInputTmpl.remove()\n this.checkboxTmpl = Doc.tmplElement(form, 'checkbox')\n this.checkboxTmpl.remove()\n this.repeatableTmpl = Doc.tmplElement(form, 'repeatableInput')\n this.repeatableTmpl.remove()\n this.fileSelector = Doc.tmplElement(form, 'fileSelector')\n this.fileInput = Doc.tmplElement(form, 'fileInput')\n this.errMsg = Doc.tmplElement(form, 'errMsg')\n this.showOther = Doc.tmplElement(form, 'showOther')\n this.showIcon = Doc.tmplElement(form, 'showIcon')\n this.hideIcon = Doc.tmplElement(form, 'hideIcon')\n this.showHideMsg = Doc.tmplElement(form, 'showHideMsg')\n this.otherSettings = Doc.tmplElement(form, 'otherSettings')\n this.loadedSettingsMsg = Doc.tmplElement(form, 'loadedSettingsMsg')\n this.loadedSettings = Doc.tmplElement(form, 'loadedSettings')\n this.defaultSettingsMsg = Doc.tmplElement(form, 'defaultSettingsMsg')\n this.defaultSettings = Doc.tmplElement(form, 'defaultSettings')\n\n if (!sectionize) Doc.hide(this.showOther)\n\n Doc.bind(this.fileSelector, 'click', () => this.fileInput.click())\n\n // config file upload\n Doc.bind(this.fileInput, 'change', async () => this.fileInputChanged())\n\n Doc.bind(this.showOther, 'click', () => {\n this.setOtherSettingsViz(this.hideIcon.classList.contains('d-hide'))\n })\n }\n\n /*\n * fileInputChanged will read the selected file and attempt to load the\n * configuration settings. All loaded settings will be made visible for\n * inspection by the user.\n */\n async fileInputChanged () {\n Doc.hide(this.errMsg)\n if (!this.fileInput.value) return\n const files = this.fileInput.files\n if (!files || files.length === 0) return\n const loaded = app().loading(this.form)\n const config = await files[0].text()\n if (!config) return\n const res = await postJSON('/api/parseconfig', {\n configtext: config\n })\n loaded()\n if (!app().checkResponse(res)) {\n this.errMsg.textContent = res.msg\n Doc.show(this.errMsg)\n return\n }\n if (Object.keys(res.map).length === 0) return\n this.dynamicOpts.append(...this.setConfig(res.map))\n this.reorder(this.dynamicOpts)\n const [loadedOpts, defaultOpts] = [this.loadedSettings.children.length, this.defaultSettings.children.length]\n if (loadedOpts === 0) Doc.hide(this.loadedSettings, this.loadedSettingsMsg)\n if (defaultOpts === 0) Doc.hide(this.defaultSettings, this.defaultSettingsMsg)\n if (loadedOpts + defaultOpts === 0) Doc.hide(this.showOther, this.otherSettings)\n }\n\n addOpt (box: HTMLElement, opt: ConfigOption, insertAfter?: PageElement, skipRepeatN?: boolean): PageElement {\n let el: HTMLElement\n if (opt.isboolean) el = this.checkboxTmpl.cloneNode(true) as HTMLElement\n else if (opt.isdate) el = this.dateInputTmpl.cloneNode(true) as HTMLElement\n else if (opt.repeatable) {\n el = this.repeatableTmpl.cloneNode(true) as HTMLElement\n el.classList.add('repeatable')\n Doc.bind(Doc.tmplElement(el, 'add'), 'click', () => {\n this.addOpt(box, opt, el, true)\n })\n if (!skipRepeatN) for (let i = 0; i < (opt.repeatN ? opt.repeatN - 1 : 0); i++) this.addOpt(box, opt, insertAfter, true)\n } else el = this.textInputTmpl.cloneNode(true) as HTMLElement\n const hiddenFields = app().extensionWallet(this.assetID)?.hiddenFields || []\n if (hiddenFields.indexOf(opt.key) !== -1) Doc.hide(el)\n this.configElements.push([opt, el])\n const input = el.querySelector('input') as ConfigOptionInput\n input.dataset.configKey = opt.key\n // We need to generate a unique ID only for the <input id> => <label for>\n // matching.\n dynamicInputCounter++\n const elID = 'wcfg-' + String(dynamicInputCounter)\n input.id = elID\n const label = Doc.safeSelector(el, 'label')\n label.htmlFor = elID // 'for' attribute, but 'for' is a keyword\n label.prepend(opt.displayname)\n if (opt.regAsset !== undefined) {\n const logo = new window.Image(15, 15)\n logo.src = Doc.logoPathFromID(opt.regAsset || -1)\n label.prepend(logo)\n }\n if (insertAfter) insertAfter.after(el)\n else box.appendChild(el)\n if (opt.noecho) {\n input.type = 'password'\n input.autocomplete = 'off'\n }\n if (opt.description) label.dataset.tooltip = opt.description\n if (opt.isboolean) input.checked = opt.default\n else if (opt.isdate) {\n const getMinMaxVal = (minMax: string | number) => {\n if (!minMax) return ''\n if (minMax === 'now') return dateToString(new Date())\n return dateToString(new Date((minMax as number) * 1000))\n }\n input.max = getMinMaxVal(opt.max)\n input.min = getMinMaxVal(opt.min)\n const date = opt.default ? new Date(opt.default * 1000) : new Date()\n // UI shows Dates in valueAsDate as UTC, but user interprets local. Set a\n // local date string so the UI displays what the user expects. alt:\n // input.valueAsDate = dateApplyOffset(date)\n input.value = dateToString(date)\n } else input.value = opt.default !== null ? opt.default : ''\n input.disabled = Boolean(opt.disablewhenactive && this.assetHasActiveOrders)\n return el\n }\n\n /*\n * update creates the dynamic form.\n */\n update (assetID: number, configOpts: ConfigOption[] | null, activeOrders: boolean) {\n this.assetHasActiveOrders = activeOrders\n this.configElements = []\n this.configOpts = configOpts || []\n this.assetID = assetID\n Doc.empty(this.dynamicOpts, this.defaultSettings, this.loadedSettings)\n\n // If there are no options, just hide the entire form.\n if (this.configOpts.length === 0) return Doc.hide(this.form)\n Doc.show(this.form)\n\n this.setOtherSettingsViz(false)\n Doc.hide(\n this.loadedSettingsMsg, this.loadedSettings, this.defaultSettingsMsg,\n this.defaultSettings, this.errMsg\n )\n const defaultedOpts = []\n for (const opt of this.configOpts) {\n if (this.sectionize && opt.default !== null) defaultedOpts.push(opt)\n else this.addOpt(this.dynamicOpts, opt)\n }\n if (defaultedOpts.length) {\n for (const opt of defaultedOpts) this.addOpt(this.defaultSettings, opt)\n Doc.show(this.showOther, this.defaultSettingsMsg, this.defaultSettings)\n } else {\n Doc.hide(this.showOther)\n }\n app().bindTooltips(this.allSettings)\n if (this.dynamicOpts.children.length) Doc.show(this.dynamicOpts)\n else Doc.hide(this.dynamicOpts)\n }\n\n /*\n * setOtherSettingsViz sets the visibility of the additional settings section.\n */\n setOtherSettingsViz (visible: boolean) {\n if (visible) {\n Doc.hide(this.showIcon)\n Doc.show(this.hideIcon, this.otherSettings)\n this.showHideMsg.textContent = intl.prep(intl.ID_HIDE_ADDITIONAL_SETTINGS)\n return\n }\n Doc.hide(this.hideIcon, this.otherSettings)\n Doc.show(this.showIcon)\n this.showHideMsg.textContent = intl.prep(intl.ID_SHOW_ADDITIONAL_SETTINGS)\n }\n\n /*\n * setConfig looks for inputs with configOpt keys matching the cfg object, and\n * sets the inputs value to the corresponding cfg value. A list of matching\n * configElements is returned.\n */\n setConfig (cfg: Record<string, string>): HTMLElement[] {\n const finds: HTMLElement[] = []\n const handledRepeatables: Record<string, boolean> = {}\n const removes: [ConfigOption, PageElement][] = []\n for (const r of [...this.configElements]) {\n const [opt, el] = r\n const v = cfg[opt.key]\n if (v === undefined) continue\n if (opt.repeatable) {\n if (handledRepeatables[opt.key]) {\n el.remove()\n removes.push(r)\n continue\n }\n handledRepeatables[opt.key] = true\n const vals = v.split(opt.repeatable)\n const firstVal = vals[0]\n finds.push(el)\n Doc.safeSelector(el, 'input').value = firstVal\n // Add repeatN - 1 empty elements to the reconfig form. Add them before\n // the populated inputs just because of the way we're using the\n // insertAfter argument to addOpt.\n for (let i = 1; i < (opt.repeatN || 1); i++) finds.push(this.addOpt(el.parentElement as PageElement, opt, el, true))\n for (let i = 1; i < vals.length; i++) {\n const newEl = this.addOpt(el.parentElement as PageElement, opt, el, true)\n Doc.safeSelector(newEl, 'input').value = vals[i]\n finds.push(newEl)\n }\n continue\n }\n finds.push(el)\n const input = Doc.safeSelector(el, 'input') as HTMLInputElement\n if (opt.isboolean) input.checked = isTruthyString(v)\n else if (opt.isdate) {\n input.value = dateToString(new Date(parseInt(v) * 1000))\n // alt: input.valueAsDate = dateApplyOffset(...)\n } else input.value = v\n }\n for (const r of removes) {\n const i = this.configElements.indexOf(r)\n if (i >= 0) this.configElements.splice(i, 1)\n }\n\n return finds\n }\n\n /*\n * setLoadedConfig sets the input values for the entries in cfg, and moves\n * them to the loadedSettings box.\n */\n setLoadedConfig (cfg: Record<string, string>) {\n const finds = this.setConfig(cfg)\n if (!this.sectionize || finds.length === 0) return\n this.loadedSettings.append(...finds)\n this.reorder(this.loadedSettings)\n Doc.show(this.loadedSettings, this.loadedSettingsMsg)\n if (this.defaultSettings.children.length === 0) Doc.hide(this.defaultSettings, this.defaultSettingsMsg)\n }\n\n /*\n * map reads all inputs and constructs an object from the configOpt keys and\n * values.\n */\n map (assetID: number): Record<string, string> {\n const config: Record<string, string> = {}\n for (const [opt, el] of this.configElements) {\n const input = Doc.safeSelector(el, 'input') as HTMLInputElement\n if (opt.regAsset !== undefined && opt.regAsset !== assetID) continue\n if (opt.isboolean && opt.key) {\n config[opt.key] = input.checked ? '1' : '0'\n } else if (opt.isdate && opt.key) {\n // Force local time interpretation by appending a time to the date\n // string, otherwise the Date constructor considers it UTC.\n const minDate = input.min ? toUnixDate(new Date(input.min + 'T00:00')) : Number.MIN_SAFE_INTEGER\n const maxDate = input.max ? toUnixDate(new Date(input.max + 'T00:00')) : Number.MAX_SAFE_INTEGER\n let date = input.value ? toUnixDate(new Date(input.value + 'T00:00')) : 0\n if (date < minDate) date = minDate\n else if (date > maxDate) date = maxDate\n config[opt.key] = String(date)\n } else if (input.value) {\n if (opt.repeatable && config[opt.key]) config[opt.key] += opt.repeatable + input.value\n else config[opt.key] = input.value\n }\n }\n return config\n }\n\n /*\n * reorder sorts the configElements in the box by the order of the\n * server-provided configOpts array.\n */\n reorder (box: HTMLElement) {\n const inputs: Record<string, HTMLElement[]> = {}\n box.querySelectorAll('input').forEach((input: ConfigOptionInput) => {\n const k = input.dataset.configKey\n if (!k) return // TS2538\n const els = []\n for (const [opt, el] of this.configElements) if (opt.key === k) els.push(el)\n inputs[k] = els\n })\n for (const opt of this.configOpts) {\n const els = inputs[opt.key] || []\n for (const el of els) box.append(el)\n }\n }\n}\n\n/*\n * ConfirmRegistrationForm should be used with the \"confirmRegistrationForm\"\n * template.\n */\nexport class ConfirmRegistrationForm {\n form: HTMLElement\n success: () => void\n page: Record<string, PageElement>\n xc: Exchange\n certFile: string\n bondAssetID: number\n tier: number\n fees: number\n\n constructor (form: HTMLElement, success: () => void, goBack: () => void) {\n this.form = form\n this.success = success\n this.page = Doc.parseTemplate(form)\n this.certFile = ''\n\n Doc.bind(this.page.goBack, 'click', () => goBack())\n bind(form, this.page.submit, () => this.submitForm())\n }\n\n setExchange (xc: Exchange, certFile: string) {\n this.xc = xc\n this.certFile = certFile\n this.page.host.textContent = xc.host\n }\n\n setAsset (assetID: number, tier: number, fees: number) {\n const asset = app().assets[assetID]\n const { conversionFactor, unit } = asset.unitInfo.conventional\n this.bondAssetID = asset.id\n this.tier = tier\n this.fees = fees\n const page = this.page\n const bondAsset = this.xc.bondAssets[asset.symbol]\n const bondLock = bondAsset.amount * tier * bondReserveMultiplier\n const bondLockConventional = bondLock / conversionFactor\n page.tradingTier.textContent = String(tier)\n page.logo.src = Doc.logoPath(asset.symbol)\n page.bondLock.textContent = Doc.formatFourSigFigs(bondLockConventional)\n page.bondUnit.textContent = unit\n const r = app().fiatRatesMap[assetID]\n Doc.show(page.bondLockUSDBox)\n if (r) page.bondLockUSD.textContent = Doc.formatFourSigFigs(bondLockConventional * r)\n else Doc.hide(page.bondLockUSDBox)\n if (fees) page.feeReserves.textContent = Doc.formatFourSigFigs(fees / conversionFactor)\n page.reservesUnit.textContent = unit\n }\n\n setFees (assetID: number, fees: number) {\n this.fees = fees\n const conversionFactor = app().assets[assetID].unitInfo.conventional.conversionFactor\n this.page.feeReserves.textContent = Doc.formatFourSigFigs(fees / conversionFactor)\n }\n\n /* Form expands into its space quickly from the lower-right as it fades in. */\n async animate () {\n const form = this.form\n Doc.animate(400, prog => {\n form.style.transform = `scale(${prog})`\n form.style.opacity = String(Math.pow(prog, 4))\n const offset = `${(1 - prog) * 500}px`\n form.style.top = offset\n form.style.left = offset\n })\n }\n\n /*\n * submitForm is called when the form is submitted.\n */\n async submitForm () {\n const { page, bondAssetID, xc, certFile, tier } = this\n const asset = app().assets[bondAssetID]\n if (!asset) {\n page.regErr.innerText = intl.prep(intl.ID_SELECT_WALLET_FOR_FEE_PAYMENT)\n Doc.show(page.regErr)\n return\n }\n Doc.hide(page.regErr)\n const bondAsset = xc.bondAssets[asset.wallet.symbol]\n const dexAddr = xc.host\n let form: any\n let url: string\n if (!app().exchanges[xc.host] || app().exchanges[xc.host].viewOnly) {\n form = {\n addr: dexAddr,\n cert: certFile,\n bond: bondAsset.amount * tier,\n asset: bondAsset.id\n }\n url = '/api/postbond'\n } else {\n form = {\n host: dexAddr,\n targetTier: tier,\n bondAssetID: bondAssetID\n }\n url = '/api/updatebondoptions'\n }\n const loaded = app().loading(this.form)\n const res = await postJSON(url, form)\n loaded()\n if (!app().checkResponse(res)) {\n page.regErr.textContent = res.msg\n Doc.show(page.regErr)\n return\n }\n this.success()\n }\n}\n\ninterface RegAssetRow {\n ready: PageElement\n}\n\ninterface MarketLimitsRow {\n mkt: Market\n tmpl: Record<string, PageElement>\n setTier: ((tier: number) => void)\n}\n\n/*\n * FeeAssetSelectionForm should be used with the \"regAssetForm\" template.\n */\nexport class FeeAssetSelectionForm {\n form: HTMLElement\n success: (assetID: number, tier: number) => Promise<void>\n xc: Exchange\n selectedAssetID: number\n certFile: string\n page: Record<string, PageElement>\n assetRows: Record<string, RegAssetRow>\n marketRows: MarketLimitsRow[]\n\n constructor (form: HTMLElement, success: (assetID: number, tier: number) => Promise<void>) {\n this.form = form\n this.certFile = ''\n this.success = success\n const page = this.page = Doc.parseTemplate(form)\n Doc.cleanTemplates(page.currentBondTmpl, page.bondAssetTmpl, page.marketTmpl)\n\n Doc.bind(page.tradingTierInput, 'input', () => { this.setTier() })\n Doc.bind(page.tradingTierInput, 'keyup', (e: KeyboardEvent) => { if (e.key === 'Enter') this.acceptTier() })\n Doc.bind(page.submitTradingTier, 'click', () => { this.acceptTier() })\n\n Doc.bind(page.tierUp, 'click', () => { this.incrementTier(true) })\n Doc.bind(page.tierDown, 'click', () => { this.incrementTier(false) })\n\n Doc.bind(page.goBackToAssets, 'click', () => {\n Doc.hide(page.tradingTierForm)\n Doc.show(page.assetForm)\n })\n\n Doc.bind(page.whatsABond, 'click', () => {\n Doc.hide(page.assetForm)\n Doc.show(page.whatsABondPanel)\n })\n\n const hideWhatsABond = () => {\n Doc.show(page.assetForm)\n Doc.hide(page.whatsABondPanel)\n }\n\n Doc.bind(page.bondGotIt, 'click', () => { hideWhatsABond() })\n\n Doc.bind(page.whatsABondBack, 'click', () => { hideWhatsABond() })\n\n Doc.bind(page.usePrepaidBond, 'click', () => { this.showPrepaidBondForm() })\n Doc.bind(page.ppbGoBack, 'click', () => { this.hidePrepaidBondForm() })\n Doc.bind(page.submitPrepaidBond, 'click', () => { this.submitPrepaidBond() })\n\n app().registerNoteFeeder({\n createwallet: (note: WalletCreationNote) => {\n if (note.topic === 'QueuedCreationSuccess') this.walletCreated(note.assetID)\n }\n })\n }\n\n setTierError (errMsg: string) {\n this.page.tradingTierErr.textContent = errMsg\n Doc.show(this.page.tradingTierErr)\n }\n\n setAssetError (errMsg: string) {\n this.page.regAssetErr.textContent = errMsg\n Doc.show(this.page.regAssetErr)\n }\n\n clearErrors () {\n Doc.hide(this.page.regAssetErr, this.page.tradingTierErr)\n }\n\n setExchange (xc: Exchange, certFile: string) {\n this.xc = xc\n this.certFile = certFile\n this.assetRows = {}\n this.marketRows = []\n const page = this.page\n Doc.hide(page.assetForm, page.tradingTierForm, page.whatsABondPanel, page.prepaidBonds)\n Doc.empty(page.bondAssets, page.markets)\n this.clearErrors()\n\n const addBondRow = (assetID: number, bondAsset: BondAsset) => {\n const asset = app().assets[assetID]\n if (!asset) return\n const { unitInfo: { conventional: { unit, conversionFactor } }, name, symbol } = asset\n const tr = page.bondAssetTmpl.cloneNode(true) as HTMLElement\n page.bondAssets.appendChild(tr)\n const tmpl = Doc.parseTemplate(tr)\n\n tmpl.logo.src = Doc.logoPath(symbol)\n tmpl.name.textContent = name\n\n Doc.bind(tr, 'click', () => { this.assetSelected(assetID) })\n tmpl.feeSymbol.textContent = unit\n const bondSizeConventional = bondAsset.amount / conversionFactor\n tmpl.feeAmt.textContent = Doc.formatFourSigFigs(bondSizeConventional)\n const fiatRate = app().fiatRatesMap[assetID]\n Doc.setVis(fiatRate, tmpl.fiatBox)\n if (fiatRate) tmpl.fiatBondAmount.textContent = Doc.formatFourSigFigs(bondSizeConventional * fiatRate)\n this.assetRows[assetID] = { ready: tmpl.ready }\n }\n\n const addMarketRow = (mkt: Market) => {\n const { baseid: baseID, quoteid: quoteID } = mkt\n const [b, q] = [app().assets[baseID], app().assets[quoteID]]\n if (!b || !q) return\n const tr = page.marketTmpl.cloneNode(true) as HTMLElement\n page.markets.appendChild(tr)\n const { symbol: baseSymbol, unitInfo: bui } = xc.assets[baseID]\n const { symbol: quoteSymbol, unitInfo: qui } = xc.assets[quoteID]\n for (const el of Doc.applySelector(tr, '[data-base-ticker]')) el.textContent = bui.conventional.unit\n for (const el of Doc.applySelector(tr, '[data-quote-ticker]')) el.textContent = qui.conventional.unit\n\n const tmpl = Doc.parseTemplate(tr)\n tmpl.baseLogo.src = Doc.logoPath(baseSymbol)\n tmpl.quoteLogo.src = Doc.logoPath(quoteSymbol)\n\n const setTier = (tier: number) => {\n const { parcelsize: parcelSize, lotsize: lotSize } = mkt\n const conventionalLotSize = lotSize / bui.conventional.conversionFactor\n const startingLimit = conventionalLotSize * parcelSize * perTierBaseParcelLimit * tier\n const privilegedLimit = conventionalLotSize * parcelSize * perTierBaseParcelLimit * parcelLimitScoreMultiplier * tier\n tmpl.tradeLimitLow.textContent = Doc.formatFourSigFigs(startingLimit)\n tmpl.tradeLimitHigh.textContent = Doc.formatFourSigFigs(privilegedLimit)\n const baseFiatRate = app().fiatRatesMap[baseID]\n if (baseFiatRate) {\n tmpl.fiatTradeLimitLow.textContent = Doc.formatFourSigFigs(startingLimit * baseFiatRate)\n tmpl.fiatTradeLimitHigh.textContent = Doc.formatFourSigFigs(privilegedLimit * baseFiatRate)\n }\n Doc.setVis(baseFiatRate, page.fiatTradeLowBox, page.fiatTradeHighBox)\n }\n\n setTier(strongTier(xc.auth) || 1)\n this.marketRows.push({ mkt, tmpl, setTier })\n }\n\n for (const { symbol, id: assetID } of Object.values(xc.assets || {})) {\n if (!app().assets[assetID]) continue\n const bondAsset = xc.bondAssets[symbol]\n if (bondAsset) addBondRow(assetID, bondAsset)\n }\n\n for (const mkt of Object.values(xc.markets || {})) addMarketRow(mkt)\n\n // page.host.textContent = xc.host\n page.tradingTierInput.value = xc.auth.targetTier ? String(xc.auth.targetTier) : '1'\n\n if (this.validBondAssetSelected(xc)) this.assetSelected(xc.auth.bondAssetID)\n else Doc.show(page.assetForm)\n }\n\n validBondAssetSelected (xc: Exchange) {\n if (xc.viewOnly) return false\n const { targetTier, bondAssetID } = xc.auth\n if (targetTier < 1) return false\n const a = app().assets[bondAssetID]\n return a && Boolean(xc.bondAssets[a.symbol])\n }\n\n /*\n * walletCreated should be called when an asynchronous wallet creation\n * completes successfully.\n */\n walletCreated (assetID: number) {\n const a = this.assetRows[assetID]\n const asset = app().assets[assetID]\n setReadyMessage(a.ready, asset)\n }\n\n refresh () {\n this.setExchange(this.xc, this.certFile)\n }\n\n assetSelected (assetID: number) {\n this.selectedAssetID = assetID\n this.setTier()\n const { page: { assetForm, tradingTierForm, tradingTierInput } } = this\n Doc.hide(assetForm)\n Doc.show(tradingTierForm)\n tradingTierInput.focus()\n }\n\n setTier () {\n const { page, xc: { bondAssets }, selectedAssetID: assetID } = this\n const { symbol, unitInfo: ui } = app().assets[assetID]\n const { conventional: { conversionFactor, unit } } = ui\n\n const bondAsset = bondAssets[symbol]\n const raw = page.tradingTierInput.value ?? ''\n if (!raw) return\n const tier = parseInt(raw)\n if (isNaN(tier)) {\n this.setTierError(intl.prep(intl.ID_INVALID_TIER_VALUE))\n return\n }\n page.tradingTierInput.value = String(tier)\n page.bondSizeDisplay.textContent = Doc.formatCoinValue(bondAsset.amount, ui)\n for (const el of Doc.applySelector(page.tradingTierForm, '[data-tier]')) el.textContent = String(tier)\n for (const el of Doc.applySelector(page.tradingTierForm, '[data-bond-asset-ticker]')) el.textContent = unit\n const bondLock = bondAsset.amount * tier * bondReserveMultiplier\n page.bondLockDisplay.textContent = Doc.formatCoinValue(bondLock, ui)\n const fiatRate = app().fiatRatesMap[assetID]\n if (fiatRate) page.fiatLockDisplay.textContent = Doc.formatFourSigFigs(bondLock / conversionFactor * fiatRate)\n for (const m of Object.values(this.marketRows)) m.setTier(tier)\n const currentBondAmts: Record<number, number> = {}\n for (const [assetIDStr, { wallet }] of Object.entries(app().assets)) {\n if (!wallet) continue\n const { balance: { bondlocked, bondReserves } } = wallet\n const bonded = bondlocked + bondReserves\n if (bonded > 0) currentBondAmts[parseInt(assetIDStr)] = bonded\n }\n const haveLock = Object.keys(currentBondAmts).length > 0\n Doc.setVis(haveLock, page.currentBondBox)\n if (haveLock) {\n Doc.empty(page.currentBonds)\n for (const [assetIDStr, bondLocked] of Object.entries(currentBondAmts)) {\n const assetID = parseInt(assetIDStr)\n const { unitInfo: ui, symbol, name } = app().assets[assetID]\n const { conventional: { conversionFactor, unit } } = ui\n const tr = page.currentBondTmpl.cloneNode(true) as PageElement\n page.currentBonds.appendChild(tr)\n const tmpl = Doc.parseTemplate(tr)\n tmpl.icon.src = Doc.logoPath(symbol)\n tmpl.name.textContent = name\n tmpl.amt.textContent = Doc.formatCoinValue(bondLocked, ui)\n tmpl.ticker.textContent = unit\n tmpl.name.textContent = name\n const fiatRate = app().fiatRatesMap[assetID]\n Doc.setVis(tmpl.fiatBox)\n if (fiatRate) tmpl.fiatAmt.textContent = Doc.formatFourSigFigs(bondLocked / conversionFactor * fiatRate)\n }\n }\n Doc.setVis(fiatRate, page.fiatLockBox)\n }\n\n acceptTier () {\n const { page, selectedAssetID: assetID } = this\n this.clearErrors()\n const raw = page.tradingTierInput.value ?? ''\n if (!raw) return\n const tier = parseInt(raw)\n if (isNaN(tier)) {\n this.setTierError(intl.prep(intl.ID_INVALID_TIER_VALUE))\n return\n }\n this.success(assetID, tier)\n }\n\n incrementTier (up: boolean) {\n const { page: { tradingTierInput: input } } = this\n input.value = String(Math.max(1, (parseInt(input.value ?? '') || 1) + (up ? 1 : -1)))\n this.setTier()\n }\n\n /*\n * Animation to make the elements sort of expand into their space from the\n * bottom as they fade in.\n */\n async animate () {\n const { page, form } = this\n const extraMargin = 75\n const extraTop = 50\n const regAssetElements = Array.from(page.bondAssets.children) as PageElement[]\n form.style.opacity = '0'\n\n const aniLen = 350\n await Doc.animate(aniLen, prog => {\n for (const el of regAssetElements) {\n el.style.marginTop = `${(1 - prog) * extraMargin}px`\n el.style.transform = `scale(${prog})`\n }\n form.style.opacity = Math.pow(prog, 4).toFixed(1)\n form.style.top = `${(1 - prog) * extraTop}px`\n }, 'easeOut')\n }\n\n showPrepaidBondForm () {\n const { page } = this\n Doc.hide(page.assetForm, page.prepaidBondErr)\n page.prepaidBondCode.value = ''\n Doc.show(page.prepaidBonds)\n }\n\n hidePrepaidBondForm () {\n const { page } = this\n Doc.hide(page.prepaidBonds)\n Doc.show(page.assetForm)\n }\n\n async submitPrepaidBond () {\n const { page, xc: { host } } = this\n Doc.hide(page.prepaidBondErr)\n const code = page.prepaidBondCode.value\n if (!code) {\n page.prepaidBondErr.textContent = intl.prep(intl.ID_INVALID_VALUE)\n Doc.show(page.prepaidBondErr)\n return\n }\n const res = await postJSON('/api/redeemprepaidbond', { host, code, cert: this.certFile })\n if (!app().checkResponse(res)) {\n page.prepaidBondErr.textContent = res.msg\n Doc.show(page.prepaidBondErr)\n return\n }\n this.success(PrepaidBondID, res.tier)\n }\n}\n\n/*\n * setReadyMessage sets an asset's status message on the FeeAssetSelectionForm.\n */\nfunction setReadyMessage (el: PageElement, asset: SupportedAsset) {\n if (asset.wallet) el.textContent = intl.prep(intl.ID_WALLET_READY)\n else if (asset.walletCreationPending) el.textContent = intl.prep(intl.ID_WALLET_PENDING)\n else el.textContent = intl.prep(intl.ID_SETUP_NEEDED)\n el.classList.remove('readygreen', 'setuporange')\n el.classList.add(asset.wallet ? 'readygreen' : 'setuporange')\n}\n\n/*\n * WalletWaitForm is a form used to track the wallet sync status and balance\n * in preparation for posting a bond.\n */\nexport class WalletWaitForm {\n form: HTMLElement\n success: () => void\n goBack: () => void\n page: Record<string, PageElement>\n assetID: number\n parentID?: number\n xc: Exchange\n bondAsset: BondAsset\n progressCache: ProgressPoint[]\n progressed: boolean\n funded: boolean\n // if progressed && funded, stop reporting balance or state; call success()\n bondFeeBuffer: number // in parent asset\n parentAssetSynced: boolean\n\n constructor (form: HTMLElement, success: () => void, goBack: () => void) {\n this.form = form\n this.success = success\n this.page = Doc.parseTemplate(form)\n this.assetID = -1\n this.progressCache = []\n this.progressed = false\n this.funded = false\n\n Doc.bind(this.page.goBack, 'click', () => {\n this.assetID = -1\n goBack()\n })\n\n app().registerNoteFeeder({\n walletstate: (note: WalletStateNote) => this.reportWalletState(note.wallet),\n walletsync: (note: WalletSyncNote) => {\n if (note.assetID !== this.assetID) return\n const w = app().walletMap[note.assetID]\n this.reportProgress(w.synced, w.syncProgress)\n },\n balance: (note: BalanceNote) => this.reportBalance(note.assetID)\n })\n }\n\n /* setExchange sets the exchange for which the fee is being paid. */\n setExchange (xc: Exchange) {\n this.xc = xc\n }\n\n /* setWallet must be called before showing the WalletWaitForm. */\n setWallet (assetID: number, bondFeeBuffer: number, tier: number) {\n this.assetID = assetID\n this.progressCache = []\n this.progressed = false\n this.funded = false\n this.bondFeeBuffer = bondFeeBuffer // in case we're a token, parent's balance must cover\n this.parentAssetSynced = false\n const page = this.page\n const asset = app().assets[assetID]\n const { symbol, unitInfo: ui, wallet: { balance: bal, address, synced, syncProgress }, token } = asset\n this.parentID = token?.parentID\n const bondAsset = this.bondAsset = this.xc.bondAssets[symbol]\n\n const symbolize = (el: PageElement, asset: SupportedAsset) => {\n Doc.empty(el)\n el.appendChild(Doc.symbolize(asset))\n }\n\n for (const span of Doc.applySelector(this.form, '.unit')) symbolize(span, asset)\n page.logo.src = Doc.logoPath(symbol)\n page.depoAddr.textContent = address\n\n Doc.hide(page.syncUncheck, page.syncCheck, page.balUncheck, page.balCheck, page.syncRemainBox, page.bondCostBreakdown)\n Doc.show(page.balanceBox)\n\n let bondLock = 2 * bondAsset.amount * tier\n if (bondFeeBuffer > 0) {\n Doc.show(page.bondCostBreakdown)\n page.bondLockNoFees.textContent = Doc.formatCoinValue(bondLock, ui)\n page.bondLockFees.textContent = Doc.formatCoinValue(bondFeeBuffer, ui)\n bondLock += bondFeeBuffer\n const need = Math.max(bondLock - bal.available + bal.reservesDeficit, 0)\n page.totalForBond.textContent = Doc.formatCoinValue(need, ui)\n Doc.hide(page.sendEnough) // generic msg when no fee info available when\n Doc.hide(page.txFeeBox, page.sendEnoughForToken, page.txFeeBalanceBox) // for tokens\n Doc.hide(page.sendEnoughWithEst) // non-tokens\n\n if (token) {\n Doc.show(page.txFeeBox, page.sendEnoughForToken, page.txFeeBalanceBox)\n const parentAsset = app().assets[token.parentID]\n page.txFee.textContent = Doc.formatCoinValue(bondFeeBuffer, parentAsset.unitInfo)\n page.parentFees.textContent = Doc.formatCoinValue(bondFeeBuffer, parentAsset.unitInfo)\n page.tokenFees.textContent = Doc.formatCoinValue(need, ui)\n symbolize(page.txFeeUnit, parentAsset)\n symbolize(page.parentUnit, parentAsset)\n symbolize(page.parentBalUnit, parentAsset)\n page.parentBal.textContent = parentAsset.wallet ? Doc.formatCoinValue(parentAsset.wallet.balance.available, parentAsset.unitInfo) : '0'\n } else {\n Doc.show(page.sendEnoughWithEst)\n }\n page.fee.textContent = Doc.formatCoinValue(bondLock, ui)\n } else { // show some generic message with no amounts, this shouldn't happen... show wallet error?\n Doc.show(page.sendEnough)\n }\n\n Doc.show(synced ? page.syncCheck : syncProgress >= 1 ? page.syncSpinner : page.syncUncheck)\n Doc.show(bal.available >= 2 * bondAsset.amount + bondFeeBuffer ? page.balCheck : page.balUncheck)\n\n page.progress.textContent = (syncProgress * 100).toFixed(1)\n\n if (synced) {\n this.progressed = true\n }\n this.reportBalance(assetID)\n }\n\n /*\n * reportWalletState sets the progress and balance, ultimately calling the\n * success function if conditions are met.\n */\n reportWalletState (wallet: WalletState) {\n if (this.progressed && this.funded) return\n if (wallet.assetID === this.assetID) this.reportProgress(wallet.synced, wallet.syncProgress)\n this.reportBalance(wallet.assetID)\n }\n\n /*\n * reportBalance sets the balance display and calls success if we go over the\n * threshold.\n */\n reportBalance (assetID: number) {\n if (this.funded || this.assetID === -1) return\n if (assetID !== this.assetID && assetID !== this.parentID) return\n const page = this.page\n const asset = app().assets[this.assetID]\n\n const avail = asset.wallet.balance.available\n page.balance.textContent = Doc.formatCoinValue(avail, asset.unitInfo)\n\n if (asset.token) {\n const parentAsset = app().assets[asset.token.parentID]\n const parentAvail = parentAsset.wallet.balance.available\n page.parentBal.textContent = Doc.formatCoinValue(parentAvail, parentAsset.unitInfo)\n if (parentAvail < this.bondFeeBuffer) return\n }\n\n // NOTE: when/if we allow one-time bond post (no maintenance) from the UI we\n // may allow to proceed as long as they have enough for tx fees. For now,\n // the balance check box will remain unchecked and we will not proceed.\n if (avail < 2 * this.bondAsset.amount + this.bondFeeBuffer) return\n\n Doc.show(page.balCheck)\n Doc.hide(page.balUncheck, page.balanceBox, page.sendEnough)\n this.funded = true\n if (this.progressed) this.success()\n }\n\n /*\n * reportProgress sets the progress display and calls success if we are fully\n * synced.\n */\n reportProgress (synced: boolean, prog: number) {\n const page = this.page\n if (synced) {\n page.progress.textContent = '100'\n Doc.hide(page.syncUncheck, page.syncRemainBox, page.syncSpinner)\n Doc.show(page.syncCheck)\n this.progressed = true\n if (this.funded) this.success()\n return\n } else if (prog === 1) {\n Doc.hide(page.syncUncheck)\n Doc.show(page.syncSpinner)\n } else {\n Doc.hide(page.syncSpinner)\n Doc.show(page.syncUncheck)\n }\n page.progress.textContent = (prog * 100).toFixed(1)\n\n if (prog >= 0.999) {\n Doc.hide(page.syncRemaining)\n Doc.show(page.syncFinishingUp)\n Doc.show(page.syncRemainBox)\n // The final stage of wallet sync process can take a while (it might hang\n // at 99.9% for many minutes, indexing addresses for example), the simplest\n // way to handle it is to keep displaying \"finishing up\" message until the\n // sync is finished, since we can't reasonably show it progressing over time.\n page.syncFinishingUp.textContent = intl.prep(intl.ID_WALLET_SYNC_FINISHING_UP)\n return\n }\n // Before we get to 99.9% the remaining time estimate must be based on more\n // than one progress report. We'll cache up to the last 20 and look at the\n // difference between the first and last to make the estimate.\n const cacheSize = 20\n const cache = this.progressCache\n cache.push({\n stamp: new Date().getTime(),\n progress: prog\n })\n if (cache.length < 2) {\n // Can't meaningfully estimate remaining until we have at least 2 data points.\n return\n }\n while (cache.length > cacheSize) cache.shift()\n const [first, last] = [cache[0], cache[cache.length - 1]]\n const progDelta = last.progress - first.progress\n if (progDelta === 0) {\n // Having no progress for a while likely means we are experiencing network\n // issues, can't reasonably estimate time remaining in this case.\n return\n }\n Doc.hide(page.syncFinishingUp)\n Doc.show(page.syncRemaining)\n Doc.show(page.syncRemainBox)\n const timeDelta = last.stamp - first.stamp\n const progRate = progDelta / timeDelta\n const toGoProg = 1 - last.progress\n const toGoTime = toGoProg / progRate\n page.syncRemain.textContent = Doc.formatDuration(toGoTime)\n }\n}\n\ninterface EarlyAcceleration {\n timePast: number,\n wasAcceleration: boolean\n}\n\ninterface PreAccelerate {\n swapRate: number\n suggestedRate: number\n suggestedRange: XYRange\n earlyAcceleration?: EarlyAcceleration\n}\n\n/*\n * AccelerateOrderForm is used to submit an acceleration request for an order.\n */\nexport class AccelerateOrderForm {\n form: HTMLElement\n page: Record<string, PageElement>\n order: Order\n acceleratedRate: number\n earlyAcceleration?: EarlyAcceleration\n currencyUnit: string\n success: () => void\n\n constructor (form: HTMLElement, success: () => void) {\n this.form = form\n this.success = success\n const page = this.page = Doc.idDescendants(form)\n\n Doc.bind(page.accelerateSubmit, 'click', () => {\n this.submit()\n })\n Doc.bind(page.submitEarlyConfirm, 'click', () => {\n this.sendAccelerateRequest()\n })\n }\n\n /*\n * displayEarlyAccelerationMsg displays a message asking for confirmation\n * when the user tries to submit an acceleration transaction very soon after\n * the swap transaction was broadcast, or very soon after a previous\n * acceleration.\n */\n displayEarlyAccelerationMsg () {\n const page = this.page\n // this is checked in submit, but another check is needed for ts compiler\n if (!this.earlyAcceleration) return\n page.recentAccelerationTime.textContent = `${Math.floor(this.earlyAcceleration.timePast / 60)}`\n page.recentSwapTime.textContent = `${Math.floor(this.earlyAcceleration.timePast / 60)}`\n if (this.earlyAcceleration.wasAcceleration) {\n Doc.show(page.recentAccelerationMsg)\n Doc.hide(page.recentSwapMsg)\n page.recentAccelerationTime.textContent = `${Math.floor(this.earlyAcceleration.timePast / 60)}`\n } else {\n Doc.show(page.recentSwapMsg)\n Doc.hide(page.recentAccelerationMsg)\n page.recentSwapTime.textContent = `${Math.floor(this.earlyAcceleration.timePast / 60)}`\n }\n Doc.hide(page.configureAccelerationDiv, page.accelerateErr)\n Doc.show(page.earlyAccelerationDiv)\n }\n\n // sendAccelerateRequest makes an accelerate order request to the client\n // backend.\n async sendAccelerateRequest () {\n const order = this.order\n const page = this.page\n const req = {\n orderID: order.id,\n newRate: this.acceleratedRate\n }\n const loaded = app().loading(page.accelerateMainDiv)\n const res = await postJSON('/api/accelerateorder', req)\n loaded()\n if (app().checkResponse(res)) {\n page.accelerateTxID.textContent = res.txID\n Doc.hide(page.accelerateMainDiv, page.preAccelerateErr, page.accelerateErr)\n Doc.show(page.accelerateMsgDiv, page.accelerateSuccess)\n this.success()\n } else {\n page.accelerateErr.textContent = intl.prep(intl.ID_ORDER_ACCELERATION_ERR_MSG, { msg: res.msg })\n Doc.hide(page.earlyAccelerationDiv)\n Doc.show(page.accelerateErr, page.configureAccelerationDiv)\n }\n }\n\n // submit is called when the submit button is clicked.\n async submit () {\n if (this.earlyAcceleration) {\n this.displayEarlyAccelerationMsg()\n } else {\n this.sendAccelerateRequest()\n }\n }\n\n // refresh should be called before the form is displayed. It makes a\n // preaccelerate request to the client backend and sets up the form\n // based on the results.\n async refresh (order: Order) {\n const page = this.page\n this.order = order\n const res = await postJSON('/api/preaccelerate', order.id)\n if (!app().checkResponse(res)) {\n page.preAccelerateErr.textContent = intl.prep(intl.ID_ORDER_ACCELERATION_ERR_MSG, { msg: res.msg })\n Doc.hide(page.accelerateMainDiv, page.accelerateSuccess)\n Doc.show(page.accelerateMsgDiv, page.preAccelerateErr)\n return\n }\n Doc.hide(page.accelerateMsgDiv, page.preAccelerateErr, page.accelerateErr, page.feeEstimateDiv, page.earlyAccelerationDiv)\n Doc.show(page.accelerateMainDiv, page.accelerateSuccess, page.configureAccelerationDiv)\n const preAccelerate: PreAccelerate = res.preAccelerate\n this.earlyAcceleration = preAccelerate.earlyAcceleration\n this.currencyUnit = preAccelerate.suggestedRange.yUnit\n page.accelerateAvgFeeRate.textContent = `${preAccelerate.swapRate} ${preAccelerate.suggestedRange.yUnit}`\n page.accelerateCurrentFeeRate.textContent = `${preAccelerate.suggestedRate} ${preAccelerate.suggestedRange.yUnit}`\n this.acceleratedRate = preAccelerate.suggestedRange.start.y\n const selected = () => { /* do nothing */ }\n const roundY = true\n const updateRate = (_: number, newY: number) => { this.acceleratedRate = newY }\n const rangeHandler = new XYRangeHandler(preAccelerate.suggestedRange, preAccelerate.suggestedRange.start.x, {\n updated: updateRate, changed: () => this.updateAccelerationEstimate(), selected, roundY\n })\n Doc.empty(page.sliderContainer)\n page.sliderContainer.appendChild(rangeHandler.control)\n this.updateAccelerationEstimate()\n }\n\n // updateAccelerationEstimate makes an accelerate estimate request to the\n // client backend using the currently selected rate on the slider, and\n // displays the results.\n async updateAccelerationEstimate () {\n const page = this.page\n const order = this.order\n const req = {\n orderID: order.id,\n newRate: this.acceleratedRate\n }\n const loaded = app().loading(page.sliderContainer)\n const res = await postJSON('/api/accelerationestimate', req)\n loaded()\n if (!app().checkResponse(res)) {\n page.accelerateErr.textContent = intl.prep(intl.ID_ORDER_ACCELERATION_FEE_ERR_MSG, { msg: res.msg })\n Doc.show(page.accelerateErr)\n return\n }\n page.feeRateEstimate.textContent = `${this.acceleratedRate} ${this.currencyUnit}`\n let assetID\n let assetSymbol\n if (order.sell) {\n assetID = order.baseID\n assetSymbol = order.baseSymbol\n } else {\n assetID = order.quoteID\n assetSymbol = order.quoteSymbol\n }\n const unitInfo = app().unitInfo(assetID)\n page.feeEstimate.textContent = `${res.fee / unitInfo.conventional.conversionFactor} ${assetSymbol}`\n Doc.show(page.feeEstimateDiv)\n }\n}\n\n/* DEXAddressForm accepts a DEX address and performs account discovery. */\nexport class DEXAddressForm {\n form: HTMLElement\n success: (xc: Exchange, cert: string) => void\n page: Record<string, PageElement>\n knownExchanges: HTMLElement[]\n dexToUpdate?: string\n certPicker: CertificatePicker\n\n constructor (form: HTMLElement, success: (xc: Exchange, cert: string) => void, dexToUpdate?: string) {\n this.form = form\n this.success = success\n\n const page = this.page = Doc.parseTemplate(form)\n\n this.certPicker = new CertificatePicker(form)\n\n Doc.bind(page.skipRegistration, 'change', () => this.showOrHideSubmitBttn())\n Doc.bind(page.showCustom, 'click', () => {\n Doc.hide(page.showCustom)\n Doc.show(page.customBox, page.auth)\n })\n\n this.knownExchanges = Array.from(page.knownXCs.querySelectorAll('.known-exchange'))\n for (const div of this.knownExchanges) {\n Doc.bind(div, 'click', () => {\n const host = div.dataset.host\n for (const d of this.knownExchanges) d.classList.remove('selected')\n return this.checkDEX(host)\n })\n }\n\n bind(form, page.submit, () => this.checkDEX())\n\n if (dexToUpdate) {\n Doc.hide(page.addDexHdr, page.skipRegistrationBox)\n Doc.show(page.updateDexHdr)\n this.dexToUpdate = dexToUpdate\n }\n\n this.refresh()\n }\n\n refresh () {\n const page = this.page\n page.addr.value = ''\n this.certPicker.clearCertFile()\n Doc.hide(page.err)\n if (this.knownExchanges.length === 0 || this.dexToUpdate) {\n Doc.show(page.customBox, page.auth)\n Doc.hide(page.showCustom, page.knownXCs, page.pickServerMsg, page.addCustomMsg)\n } else {\n Doc.hide(page.customBox)\n Doc.show(page.showCustom)\n }\n for (const div of this.knownExchanges) div.classList.remove('selected')\n this.showOrHideSubmitBttn()\n }\n\n /**\n * Show or hide appPWBox depending on if password is required. Show the\n * submit button if connecting a custom server or password is required).\n */\n showOrHideSubmitBttn () {\n const page = this.page\n Doc.setVis(Doc.isDisplayed(page.customBox), page.auth)\n }\n\n skipRegistration () : boolean {\n return this.page.skipRegistration.checked ?? false\n }\n\n /* Just a small size tweak and fade-in. */\n async animate () {\n const form = this.form\n Doc.animate(550, prog => {\n form.style.transform = `scale(${0.9 + 0.1 * prog})`\n form.style.opacity = String(Math.pow(prog, 4))\n }, 'easeOut')\n }\n\n async checkDEX (addr?: string) {\n const page = this.page\n Doc.hide(page.err)\n addr = addr || page.addr.value\n if (addr === '') {\n page.err.textContent = intl.prep(intl.ID_EMPTY_DEX_ADDRESS_MSG)\n Doc.show(page.err)\n return\n }\n const cert = await this.certPicker.file()\n const skipRegistration = this.skipRegistration()\n let endpoint : string, req: any\n if (this.dexToUpdate) {\n endpoint = '/api/updatedexhost'\n req = {\n newHost: addr,\n cert: cert,\n oldHost: this.dexToUpdate\n }\n } else {\n endpoint = skipRegistration ? '/api/adddex' : '/api/discoveracct'\n req = {\n addr: addr,\n cert: cert\n }\n }\n\n const loaded = app().loading(this.form)\n const res = await postJSON(endpoint, req)\n loaded()\n if (!app().checkResponse(res)) {\n if (String(res.msg).includes('certificate required')) {\n Doc.show(page.needCert)\n } else {\n page.err.textContent = res.msg\n Doc.show(page.err)\n }\n return\n }\n await app().fetchUser()\n if (!this.dexToUpdate && (skipRegistration || res.paid || Object.keys(res.xc.auth.pendingBonds).length > 0)) {\n await app().loadPage('markets')\n return\n }\n this.success(res.xc, cert)\n }\n}\n\n/* DiscoverAccountForm performs account discovery for a pre-selected DEX. */\nexport class DiscoverAccountForm {\n form: HTMLElement\n addr: string\n success: (xc: Exchange) => void\n page: Record<string, PageElement>\n\n constructor (form: HTMLElement, addr: string, success: (xc: Exchange) => void) {\n this.form = form\n this.addr = addr\n this.success = success\n\n const page = this.page = Doc.parseTemplate(form)\n page.dexHost.textContent = addr\n bind(form, page.submit, () => this.checkDEX())\n }\n\n /* Just a small size tweak and fade-in. */\n async animate () {\n const form = this.form\n Doc.animate(550, prog => {\n form.style.transform = `scale(${0.9 + 0.1 * prog})`\n form.style.opacity = String(Math.pow(prog, 4))\n }, 'easeOut')\n }\n\n async checkDEX () {\n const page = this.page\n Doc.hide(page.err)\n const req = {\n addr: this.addr\n }\n const loaded = app().loading(this.form)\n const res = await postJSON('/api/discoveracct', req)\n loaded()\n if (!app().checkResponse(res)) {\n page.err.textContent = res.msg\n Doc.show(page.err)\n return\n }\n if (res.paid) {\n await app().fetchUser()\n await app().loadPage('markets')\n return\n }\n this.success(res.xc)\n }\n}\n\n/* LoginForm is used to sign into the app. */\nexport class LoginForm {\n form: HTMLElement\n success: () => void\n page: Record<string, PageElement>\n\n constructor (form: HTMLElement, success: () => void) {\n this.success = success\n this.form = form\n const page = this.page = Doc.parseTemplate(form)\n bind(form, page.submit, () => { this.submit() })\n app().registerNoteFeeder({\n login: (note: CoreNote) => { this.handleLoginNote(note) }\n })\n }\n\n handleLoginNote (n: CoreNote) {\n if (n.details === '') return\n const loginMsg = Doc.idel(this.form, 'loaderMsg')\n Doc.show(loginMsg)\n if (loginMsg) loginMsg.textContent = n.details\n }\n\n focus () {\n this.page.pw.focus()\n }\n\n refresh () {\n Doc.hide(this.page.errMsg)\n this.page.pw.value = ''\n }\n\n async submit () {\n const page = this.page\n Doc.hide(page.errMsg)\n const pw = page.pw.value || ''\n if (pw === '') {\n Doc.showFormError(page.errMsg, intl.prep(intl.ID_NO_PASS_ERROR_MSG))\n return\n }\n const loaded = app().loading(this.form)\n const res = await postJSON('/api/login', { pass: pw })\n loaded()\n page.pw.value = ''\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.errMsg, res.msg)\n return\n }\n await app().fetchUser()\n res.notes = res.notes || []\n res.notes.reverse()\n res.pokes = res.pokes || []\n app().loggedIn(res.notes, res.pokes)\n this.success()\n }\n\n /* Just a small size tweak and fade-in. */\n async animate () {\n const form = this.form\n Doc.animate(550, prog => {\n form.style.transform = `scale(${0.9 + 0.1 * prog})`\n form.style.opacity = String(Math.pow(prog, 4))\n }, 'easeOut')\n }\n}\n\nconst traitNewAddresser = 1 << 1\n\n/*\n * DepositAddress displays a deposit address, a QR code, and a button to\n * generate a new address (if supported).\n */\nexport class DepositAddress {\n form: PageElement\n page: Record<string, PageElement>\n assetID: number\n\n constructor (form: PageElement) {\n this.form = form\n const page = this.page = Doc.idDescendants(form)\n Doc.cleanTemplates(page.unifiedReceiverTmpl)\n Doc.bind(page.newDepAddrBttn, 'click', async () => { this.newDepositAddress() })\n Doc.bind(page.copyAddressBtn, 'click', () => { this.copyAddress() })\n }\n\n /* Display a deposit address. */\n async setAsset (assetID: number) {\n this.assetID = assetID\n const page = this.page\n Doc.hide(page.depositErr, page.depositTokenMsgBox)\n const asset = app().assets[assetID]\n page.depositLogo.src = Doc.logoPath(asset.symbol)\n const wallet = app().walletMap[assetID]\n page.depositName.textContent = asset.unitInfo.conventional.unit\n if (asset.token) {\n const parentAsset = app().assets[asset.token.parentID]\n page.depositTokenParentLogo.src = Doc.logoPath(parentAsset.symbol)\n page.depositTokenParentName.textContent = parentAsset.name\n Doc.show(page.depositTokenMsgBox)\n }\n Doc.setVis((wallet.traits & traitNewAddresser) !== 0, page.newDepAddrBttnBox)\n this.setAddress(wallet.address)\n }\n\n setAddress (addr: string) {\n const page = this.page\n Doc.hide(page.unifiedReceivers)\n if (addr.startsWith('unified:')) {\n const receivers = JSON.parse(addr.substring('unified:'.length)) as Record<string, string>\n Doc.empty(page.unifiedReceivers)\n Doc.show(page.unifiedReceivers)\n const defaultReceiverType = 'unified'\n for (const [recvType, recv] of Object.entries(receivers)) {\n const div = page.unifiedReceiverTmpl.cloneNode(true) as PageElement\n page.unifiedReceivers.appendChild(div)\n div.textContent = recvType\n div.dataset.type = recvType\n if (recvType === defaultReceiverType) div.classList.add('selected')\n // tmpl.addr.textContent = recv\n Doc.bind(div, 'click', () => {\n for (const bttn of (Array.from(page.unifiedReceivers.children) as PageElement[])) bttn.classList.toggle('selected', bttn.dataset.type === recvType)\n this.setCentralAddress(recv)\n })\n }\n addr = receivers.unified\n }\n\n this.setCentralAddress(addr)\n }\n\n setCentralAddress (addr: string) {\n const page = this.page\n page.depositAddress.textContent = addr\n page.qrcode.src = `/generateqrcode?address=${addr}`\n }\n\n /* Fetch a new address from the wallet. */\n async newDepositAddress () {\n const { page, assetID, form } = this\n Doc.hide(page.depositErr)\n const loaded = app().loading(form)\n const res = await postJSON('/api/depositaddress', {\n assetID: assetID\n })\n loaded()\n if (!app().checkResponse(res)) {\n page.depositErr.textContent = res.msg\n Doc.show(page.depositErr)\n return\n }\n app().walletMap[assetID].address = res.address\n this.setAddress(res.address)\n }\n\n async copyAddress () {\n const page = this.page\n navigator.clipboard.writeText(page.depositAddress.textContent || '')\n .then(() => {\n Doc.show(page.copyAlert)\n setTimeout(() => {\n Doc.hide(page.copyAlert)\n }, 800)\n })\n .catch((reason) => {\n console.error('Unable to copy: ', reason)\n })\n }\n}\n\n// AppPassResetForm is used to reset the app apssword using the app seed.\nexport class AppPassResetForm {\n form: PageElement\n page: Record<string, PageElement>\n success: () => void\n\n constructor (form: PageElement, success: () => void) {\n this.form = form\n this.success = success\n const page = this.page = Doc.idDescendants(form)\n bind(form, page.resetAppPWSubmitBtn, () => this.resetAppPW())\n }\n\n async resetAppPW () {\n const page = this.page\n const newAppPW = page.newAppPassword.value || ''\n const confirmNewAppPW = page.confirmNewAppPassword.value\n if (newAppPW === '') {\n Doc.showFormError(page.appPWResetErrMsg, intl.prep(intl.ID_NO_PASS_ERROR_MSG))\n return\n }\n if (newAppPW !== confirmNewAppPW) {\n Doc.showFormError(page.appPWResetErrMsg, intl.prep(intl.ID_PASSWORD_NOT_MATCH))\n return\n }\n\n const loaded = app().loading(this.form)\n const res = await postJSON('/api/resetapppassword', {\n newPass: newAppPW,\n seed: page.seedInput.value\n })\n loaded()\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.appPWResetErrMsg, res.msg)\n return\n }\n\n if (Doc.isDisplayed(page.appPWResetErrMsg)) Doc.hide(page.appPWResetErrMsg)\n page.appPWResetSuccessMsg.textContent = intl.prep(intl.ID_PASSWORD_RESET_SUCCESS_MSG)\n Doc.show(page.appPWResetSuccessMsg)\n setTimeout(() => this.success(), 3000) // allow time to view the message\n }\n\n focus () {\n this.page.newAppPassword.focus()\n }\n\n refresh () {\n const page = this.page\n page.newAppPassword.value = ''\n page.confirmNewAppPassword.value = ''\n page.seedInput.value = ''\n Doc.hide(page.appPWResetSuccessMsg, page.appPWResetErrMsg)\n }\n}\n\nexport class CertificatePicker {\n page: Record<string, PageElement>\n\n constructor (parent: PageElement) {\n const page = this.page = Doc.parseTemplate(parent)\n page.selectedCert.textContent = intl.prep(intl.ID_NONE_SELECTED)\n Doc.bind(page.certFile, 'change', () => this.onCertFileChange())\n Doc.bind(page.removeCert, 'click', () => this.clearCertFile())\n Doc.bind(page.addCert, 'click', () => page.certFile.click())\n }\n\n /**\n * onCertFileChange when the input certFile changed, read the file\n * and setting cert name into text of selectedCert to display on the view\n */\n async onCertFileChange () {\n const page = this.page\n const files = page.certFile.files\n if (!files || !files.length) return\n page.selectedCert.textContent = files[0].name\n Doc.show(page.removeCert)\n Doc.hide(page.addCert)\n }\n\n /* clearCertFile cleanup certFile value and selectedCert text */\n clearCertFile () {\n const page = this.page\n page.certFile.value = ''\n page.selectedCert.textContent = intl.prep(intl.ID_NONE_SELECTED)\n Doc.hide(page.removeCert)\n Doc.show(page.addCert)\n }\n\n async file (): Promise<string> {\n const page = this.page\n if (page.certFile.value) {\n const files = page.certFile.files\n if (files && files.length) {\n return await files[0].text()\n }\n }\n return ''\n }\n}\n\nexport class TokenApprovalForm {\n page: Record<string, PageElement>\n success?: () => void\n assetID: number\n parentID: number\n txFee: number\n host: string\n\n constructor (parent: PageElement, success?: () => void) {\n this.page = Doc.parseTemplate(parent)\n this.success = success\n Doc.bind(this.page.submit, 'click', () => { this.approve() })\n }\n\n async setAsset (assetID: number, host: string) {\n this.assetID = assetID\n this.host = host\n const tokenAsset = app().assets[assetID]\n const parentID = this.parentID = tokenAsset.token?.parentID as number\n const { page } = this\n\n Doc.show(page.submissionElements)\n Doc.hide(page.txMsg, page.errMsg, page.addressBox, page.balanceBox, page.addressBox)\n\n Doc.empty(page.tokenSymbol)\n page.tokenSymbol.appendChild(Doc.symbolize(tokenAsset, true))\n const protocolVersion = app().exchanges[host].assets[assetID].version\n const res = await postJSON('/api/approvetokenfee', {\n assetID: tokenAsset.id,\n version: protocolVersion,\n approving: true\n })\n if (!app().checkResponse(res)) {\n page.errMsg.textContent = res.msg\n Doc.show(page.errMsg)\n } else {\n const { unitInfo: ui, wallet: { address, balance: { available: avail } }, name: parentName } = app().assets[parentID]\n const txFee = this.txFee = res.txFee as number\n let feeText = `${Doc.formatCoinValue(txFee, ui)} ${ui.conventional.unit}`\n const rate = app().fiatRatesMap[parentID]\n if (rate) {\n feeText += ` (${Doc.formatFiatConversion(txFee, rate, ui)} USD)`\n }\n page.feeEstimate.textContent = feeText\n Doc.show(page.balanceBox)\n page.balance.textContent = Doc.formatCoinValue(avail, ui)\n page.parentTicker.textContent = ui.conventional.unit\n page.parentName.textContent = parentName\n if (avail < txFee) {\n Doc.show(page.addressBox)\n page.address.textContent = address\n }\n }\n }\n\n /*\n * approve calls the /api/approvetoken endpoint.\n */\n async approve () {\n const { page, assetID, host, success } = this\n const path = '/api/approvetoken'\n const tokenAsset = app().assets[assetID]\n const res = await postJSON(path, {\n assetID: tokenAsset.id,\n dexAddr: host\n })\n if (!app().checkResponse(res)) {\n page.errMsg.textContent = res.msg\n Doc.show(page.errMsg)\n return\n }\n page.txid.innerText = res.txID\n const assetExplorer = CoinExplorers[tokenAsset.id]\n if (assetExplorer && assetExplorer[app().user.net]) {\n page.txid.href = assetExplorer[app().user.net](res.txID)\n }\n Doc.hide(page.submissionElements, page.balanceBox, page.addressBox)\n Doc.show(page.txMsg)\n if (success) success()\n }\n\n handleBalanceNote (n: BalanceNote) {\n const { page, parentID, txFee } = this\n if (n.assetID !== parentID) return\n page.balance.textContent = Doc.formatCoinValue(n.balance.available, app().assets[parentID].unitInfo)\n if (n.balance.available >= txFee) {\n Doc.hide(page.addressBox)\n } else Doc.hide(page.errMsg)\n }\n}\n\nexport class CEXConfigurationForm {\n form: PageElement\n page: Record<string, PageElement>\n updated: (cexName: string, success: boolean) => void\n cexName: string\n\n constructor (form: PageElement, updated: (cexName: string, success: boolean) => void) {\n this.form = form\n this.updated = updated\n this.page = Doc.parseTemplate(form)\n Doc.bind(this.page.cexSubmit, 'click', () => this.submit())\n }\n\n setCEX (cexName: string) {\n this.cexName = cexName\n setCexElements(this.form, cexName)\n const page = this.page\n Doc.hide(page.cexConfigPrompt, page.cexConnectErrBox, page.cexFormErr)\n page.cexApiKeyInput.value = ''\n page.cexSecretInput.value = ''\n const cexStatus = app().mmStatus.cexes[cexName]\n const connectErr = cexStatus?.connectErr\n if (connectErr) {\n Doc.show(page.cexConnectErrBox)\n page.cexConnectErr.textContent = connectErr\n page.cexApiKeyInput.value = cexStatus.config.apiKey\n page.cexSecretInput.value = cexStatus.config.apiSecret\n } else {\n Doc.show(page.cexConfigPrompt)\n }\n }\n\n /*\n * handleCEXSubmit handles clicks on the CEX configuration submission button.\n */\n async submit () {\n const { page, cexName, form } = this\n Doc.hide(page.cexFormErr)\n const apiKey = page.cexApiKeyInput.value\n const apiSecret = page.cexSecretInput.value\n if (!apiKey || !apiSecret) {\n Doc.show(page.cexFormErr)\n page.cexFormErr.textContent = intl.prep(intl.ID_NO_PASS_ERROR_MSG)\n return\n }\n const loaded = app().loading(form)\n try {\n const res = await MM.updateCEXConfig({\n name: cexName,\n apiKey: apiKey,\n apiSecret: apiSecret\n })\n if (!app().checkResponse(res)) throw res\n this.updated(cexName, true)\n } catch (e) {\n Doc.show(page.cexFormErr)\n page.cexFormErr.textContent = intl.prep(intl.ID_API_ERROR, { msg: e.msg ?? String(e) })\n this.updated(cexName, false)\n } finally {\n loaded()\n }\n }\n}\n\nconst animationLength = 300\n\n/* Swap form1 for form2 with an animation. */\nexport async function slideSwap (form1: HTMLElement, form2: HTMLElement) {\n const shift = document.body.offsetWidth / 2\n await Doc.animate(animationLength, progress => {\n form1.style.right = `${progress * shift}px`\n }, 'easeInHard')\n Doc.hide(form1)\n form1.style.right = '0'\n form2.style.right = String(-shift)\n Doc.show(form2)\n if (form2.querySelector('input')) {\n Doc.safeSelector(form2, 'input').focus()\n }\n await Doc.animate(animationLength, progress => {\n form2.style.right = `${-shift + progress * shift}px`\n }, 'easeOutHard')\n form2.style.right = '0'\n}\n\nexport function showSuccess (page: Record<string, PageElement>, msg: string) {\n page.successMessage.textContent = msg\n Doc.show(page.forms, page.checkmarkForm)\n page.checkmarkForm.style.right = '0'\n page.checkmark.style.fontSize = '0px'\n\n const [startR, startG, startB] = State.isDark() ? [223, 226, 225] : [51, 51, 51]\n const [endR, endG, endB] = [16, 163, 16]\n const [diffR, diffG, diffB] = [endR - startR, endG - startG, endB - startB]\n\n return new Animation(1200, (prog: number) => {\n page.checkmark.style.fontSize = `${prog * 80}px`\n page.checkmark.style.color = `rgb(${startR + prog * diffR}, ${startG + prog * diffG}, ${startB + prog * diffB})`\n }, 'easeOutElastic')\n}\n\n/*\n * bind binds the click and submit events and prevents page reloading on\n * submission.\n */\nexport function bind (form: HTMLElement, submitBttn: HTMLElement, handler: (e: Event) => void) {\n const wrapper = (e: Event) => {\n if (e.preventDefault) e.preventDefault()\n handler(e)\n }\n Doc.bind(submitBttn, 'click', wrapper)\n Doc.bind(form, 'submit', wrapper)\n}\n\n// isTruthyString will be true if the provided string is recognized as a\n// value representing true.\nfunction isTruthyString (s: string) {\n return s === '1' || s.toLowerCase() === 'true'\n}\n\n// toUnixDate converts a javascript date object to a unix date, which is\n// the number of *seconds* since the start of the epoch.\nfunction toUnixDate (date: Date) {\n return Math.floor(date.getTime() / 1000)\n}\n\n// dateApplyOffset shifts a date by the timezone offset. This is used to make\n// UTC dates show the local date. This can be used to prepare a Date so\n// toISOString generates a local date string. This is also used to trick an html\n// input element to show the local date when setting the valueAsDate field. When\n// reading the date back to JS, the value field should be interpreted as local\n// using the \"T00:00\" suffix, or the Date in valueAsDate should be shifted in\n// the opposite direction.\nfunction dateApplyOffset (date: Date) {\n return new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000)\n}\n\n// dateToString converts a javascript date object to a YYYY-MM-DD format string,\n// in the local time zone.\nfunction dateToString (date: Date) {\n return dateApplyOffset(date).toISOString().split('T')[0]\n // Another common hack:\n // date.toLocaleString(\"sv-SE\", { year: \"numeric\", month: \"2-digit\", day: \"2-digit\" })\n}\n","import Doc from './doc'\nimport BasePage from './basepage'\nimport { postJSON } from './http'\nimport {\n NewWalletForm,\n DEXAddressForm,\n DiscoverAccountForm,\n ConfirmRegistrationForm,\n FeeAssetSelectionForm,\n WalletWaitForm,\n slideSwap\n} from './forms'\nimport {\n app,\n Exchange,\n PageElement,\n PrepaidBondID\n} from './registry'\n\ninterface RegistrationPageData {\n host: string\n backTo?: string\n}\n\nexport default class RegistrationPage extends BasePage {\n body: HTMLElement\n data: RegistrationPageData\n xc: Exchange\n page: Record<string, PageElement>\n dexAddrForm: DEXAddressForm\n discoverAcctForm: DiscoverAccountForm\n newWalletForm: NewWalletForm\n regAssetForm: FeeAssetSelectionForm\n walletWaitForm: WalletWaitForm\n confirmRegisterForm: ConfirmRegistrationForm\n\n constructor (body: HTMLElement, data: RegistrationPageData) {\n super()\n this.body = body\n this.data = data\n const page = this.page = Doc.idDescendants(body)\n\n if (data.host && page.dexAddrForm.classList.contains('selected')) {\n page.dexAddrForm.classList.remove('selected')\n page.discoverAcctForm.classList.add('selected')\n page.discoverAcctForm.dataset.host = data.host\n }\n\n // Hide the form closers for the registration process except for the\n // password reset form closer.\n for (const el of body.querySelectorAll('.form-closer')) if (el !== page.resetPassFormCloser) Doc.hide(el)\n\n this.newWalletForm = new NewWalletForm(\n page.newWalletForm,\n assetID => this.newWalletCreated(assetID, this.confirmRegisterForm.tier),\n () => this.animateRegAsset(page.newWalletForm)\n )\n\n // ADD DEX\n this.dexAddrForm = new DEXAddressForm(page.dexAddrForm, async (xc, certFile) => {\n this.requestFeepayment(page.dexAddrForm, xc, certFile)\n })\n\n const addr = page.discoverAcctForm.dataset.host\n if (addr) {\n this.discoverAcctForm = new DiscoverAccountForm(page.discoverAcctForm, addr, async (xc) => {\n this.requestFeepayment(page.discoverAcctForm, xc, '')\n })\n }\n\n // SELECT REG ASSET\n this.regAssetForm = new FeeAssetSelectionForm(page.regAssetForm, async (assetID: number, tier: number) => {\n if (assetID === PrepaidBondID) {\n this.registerDEXSuccess()\n return\n }\n const asset = app().assets[assetID]\n const wallet = asset.wallet\n if (wallet) {\n const bondAsset = this.xc.bondAssets[asset.symbol]\n const bondsFeeBuffer = await this.getBondsFeeBuffer(assetID, page.regAssetForm)\n this.confirmRegisterForm.setAsset(assetID, tier, bondsFeeBuffer)\n if (wallet.synced && wallet.balance.available >= 2 * bondAsset.amount + bondsFeeBuffer) {\n this.animateConfirmForm(page.regAssetForm)\n return\n }\n this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)\n slideSwap(page.regAssetForm, page.walletWait)\n return\n }\n this.confirmRegisterForm.tier = tier\n this.newWalletForm.setAsset(assetID)\n slideSwap(page.regAssetForm, page.newWalletForm)\n })\n\n this.walletWaitForm = new WalletWaitForm(page.walletWait, () => {\n this.animateConfirmForm(page.walletWait)\n }, () => { this.animateRegAsset(page.walletWait) })\n\n // SUBMIT DEX REGISTRATION\n this.confirmRegisterForm = new ConfirmRegistrationForm(page.confirmRegForm, () => {\n this.registerDEXSuccess()\n }, () => {\n this.animateRegAsset(page.confirmRegForm)\n })\n\n const currentForm = Doc.safeSelector(page.forms, ':scope > form.selected')\n currentForm.classList.remove('selected')\n switch (currentForm) {\n case page.dexAddrForm:\n this.dexAddrForm.animate()\n break\n case page.discoverAcctForm:\n this.discoverAcctForm.animate()\n }\n Doc.show(currentForm)\n\n // There's nothing on the page.discoverAcctForm except to receive user pass\n // before attempting to discover user account and there's no need to have\n // them click another button when we can carry on without user interaction.\n if (currentForm === page.discoverAcctForm) {\n this.discoverAcctForm.page.submit.click()\n }\n\n if (app().authed) this.auth()\n }\n\n // auth should be called once user is known to be authed with the server.\n async auth () {\n await app().fetchUser()\n }\n\n async requestFeepayment (oldForm: HTMLElement, xc: Exchange, certFile: string) {\n this.xc = xc\n this.confirmRegisterForm.setExchange(xc, certFile)\n this.walletWaitForm.setExchange(xc)\n this.regAssetForm.setExchange(xc, certFile)\n this.animateRegAsset(oldForm)\n }\n\n /* Swap in the asset selection form and run the animation. */\n async animateRegAsset (oldForm: HTMLElement) {\n Doc.hide(oldForm)\n this.regAssetForm.animate()\n Doc.show(this.page.regAssetForm)\n }\n\n /* Swap in the confirmation form and run the animation. */\n async animateConfirmForm (oldForm: HTMLElement) {\n this.confirmRegisterForm.animate()\n Doc.hide(oldForm)\n Doc.show(this.page.confirmRegForm)\n }\n\n // Retrieve an estimate for the tx fee needed to create new bond reserves.\n async getBondsFeeBuffer (assetID: number, form: HTMLElement) {\n const loaded = app().loading(form)\n const res = await postJSON('/api/bondsfeebuffer', { assetID })\n loaded()\n if (!app().checkResponse(res)) {\n return 0\n }\n return res.feeBuffer\n }\n\n /* gets the contents of the cert file */\n async getCertFile () {\n let cert = ''\n if (this.dexAddrForm.page.certFile.value) {\n const files = this.dexAddrForm.page.certFile.files\n if (files && files.length) cert = await files[0].text()\n }\n return cert\n }\n\n /* Called after successful registration to a DEX. */\n async registerDEXSuccess () {\n await app().fetchUser()\n app().updateMenuItemsDisplay()\n await app().loadPage(this.data.backTo || 'markets')\n }\n\n async newWalletCreated (assetID: number, tier: number) {\n this.regAssetForm.refresh()\n const user = await app().fetchUser()\n if (!user) return\n const page = this.page\n const asset = user.assets[assetID]\n const wallet = asset.wallet\n const bondAmt = this.xc.bondAssets[asset.symbol].amount\n\n const bondsFeeBuffer = await this.getBondsFeeBuffer(assetID, page.newWalletForm)\n this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)\n this.confirmRegisterForm.setAsset(assetID, tier, bondsFeeBuffer)\n if (wallet.synced && wallet.balance.available >= 2 * bondAmt + bondsFeeBuffer) {\n await this.animateConfirmForm(page.newWalletForm)\n return\n }\n\n await slideSwap(page.newWalletForm, page.walletWait)\n }\n}\n","import { PageElement, app } from './registry'\nimport Doc from './doc'\nimport BasePage from './basepage'\nimport { AppPassResetForm, LoginForm, slideSwap } from './forms'\n\n/*\n LoginPage holds the form for login and password reset.\n*/\nexport default class LoginPage extends BasePage {\n loginForm: LoginForm\n page: Record<string, PageElement>\n appPassResetForm: AppPassResetForm\n\n constructor (body: HTMLElement) {\n super()\n const page = this.page = Doc.idDescendants(body)\n this.loginForm = new LoginForm(page.loginForm, () => { this.loggedIn() })\n\n const prepAndDisplayLoginForm = () => {\n Doc.hide(page.resetAppPWForm)\n this.loginForm.refresh()\n Doc.show(page.loginForm)\n this.loginForm.focus()\n }\n prepAndDisplayLoginForm()\n\n this.appPassResetForm = new AppPassResetForm(page.resetAppPWForm, () => { prepAndDisplayLoginForm() })\n Doc.bind(page.forgotPassBtn, 'click', () => {\n this.appPassResetForm.refresh()\n slideSwap(page.loginForm, page.resetAppPWForm)\n })\n Doc.bind(page.resetPassFormCloser, 'click', () => { prepAndDisplayLoginForm() })\n Doc.bind(page.forms, 'mousedown', (e: MouseEvent) => {\n if (!Doc.mouseInElement(e, page.resetAppPWForm) && Doc.isDisplayed(page.resetAppPWForm)) { prepAndDisplayLoginForm() }\n })\n }\n\n /* login submits the sign-in form and parses the result. */\n async loggedIn () {\n await app().loadPage('wallets')\n }\n}\n","import Doc, { Animation, AniToggle, parseFloatDefault, setupCopyBtn } from './doc'\nimport BasePage from './basepage'\nimport { postJSON, Errors } from './http'\nimport {\n NewWalletForm,\n WalletConfigForm,\n DepositAddress,\n bind as bindForm,\n showSuccess\n} from './forms'\nimport State from './state'\nimport * as intl from './locales'\nimport * as OrderUtil from './orderutil'\nimport {\n app,\n PageElement,\n SupportedAsset,\n WalletDefinition,\n BalanceNote,\n WalletStateNote,\n WalletSyncNote,\n RateNote,\n Order,\n OrderFilter,\n WalletCreationNote,\n BaseWalletNote,\n WalletNote,\n CustomWalletNote,\n TipChangeNote,\n Exchange,\n Market,\n PeerSource,\n WalletPeer,\n ApprovalStatus,\n WalletState,\n UnitInfo,\n TicketStakingStatus,\n VotingServiceProvider,\n Ticket,\n TicketStats,\n TxHistoryResult,\n TransactionNote,\n WalletTransaction,\n FeeState\n} from './registry'\nimport { CoinExplorers } from './coinexplorers'\n\ninterface DecredTicketTipUpdate {\n ticketPrice: number\n votingSubsidy: number\n stats: TicketStats\n}\n\ninterface TicketPurchaseUpdate extends BaseWalletNote {\n err?: string\n remaining:number\n tickets?: Ticket[]\n stats?: TicketStats\n}\n\nconst animationLength = 300\nconst traitRescanner = 1\nconst traitLogFiler = 1 << 2\nconst traitRecoverer = 1 << 5\nconst traitWithdrawer = 1 << 6\nconst traitRestorer = 1 << 8\nconst traitTxFeeEstimator = 1 << 9\nconst traitPeerManager = 1 << 10\nconst traitTokenApprover = 1 << 13\nconst traitTicketBuyer = 1 << 15\nconst traitHistorian = 1 << 16\nconst traitFundsMixer = 1 << 17\n\nconst traitsExtraOpts = traitLogFiler | traitRecoverer | traitRestorer | traitRescanner | traitPeerManager | traitTokenApprover\n\nexport const ticketStatusUnknown = 0\nexport const ticketStatusUnmined = 1\nexport const ticketStatusImmature = 2\nexport const ticketStatusLive = 3\nexport const ticketStatusVoted = 4\nexport const ticketStatusMissed = 5\nexport const ticketStatusExpired = 6\nexport const ticketStatusUnspent = 7\nexport const ticketStatusRevoked = 8\n\nexport const ticketStatusTranslationKeys = [\n intl.ID_TICKET_STATUS_UNKNOWN,\n intl.ID_TICKET_STATUS_UNMINED,\n intl.ID_TICKET_STATUS_IMMATURE,\n intl.ID_TICKET_STATUS_LIVE,\n intl.ID_TICKET_STATUS_VOTED,\n intl.ID_TICKET_STATUS_MISSED,\n intl.ID_TICKET_STATUS_EXPIRED,\n intl.ID_TICKET_STATUS_UNSPENT,\n intl.ID_TICKET_STATUS_REVOKED\n]\n\nexport const txTypeUnknown = 0\nexport const txTypeSend = 1\nexport const txTypeReceive = 2\nexport const txTypeSwap = 3\nexport const txTypeRedeem = 4\nexport const txTypeRefund = 5\nexport const txTypeSplit = 6\nexport const txTypeCreateBond = 7\nexport const txTypeRedeemBond = 8\nexport const txTypeApproveToken = 9\nexport const txTypeAcceleration = 10\nexport const txTypeSelfSend = 11\nexport const txTypeRevokeTokenApproval = 12\nexport const txTypeTicketPurchase = 13\nexport const txTypeTicketVote = 14\nexport const txTypeTicketRevocation = 15\nexport const txTypeSwapOrSend = 16\nexport const txTypeMixing = 17\n\nconst positiveTxTypes : number[] = [\n txTypeReceive,\n txTypeRedeem,\n txTypeRefund,\n txTypeRedeemBond,\n txTypeTicketVote,\n txTypeTicketRevocation\n]\n\nconst negativeTxTypes : number[] = [\n txTypeSend,\n txTypeSwap,\n txTypeCreateBond,\n txTypeTicketPurchase,\n txTypeSwapOrSend\n]\n\nconst noAmtTxTypes : number[] = [\n txTypeSplit,\n txTypeApproveToken,\n txTypeAcceleration,\n txTypeRevokeTokenApproval\n]\n\nfunction txTypeSignAndClass (txType: number): [string, string] {\n if (positiveTxTypes.includes(txType)) return ['+', 'positive-tx']\n if (negativeTxTypes.includes(txType)) return ['-', 'negative-tx']\n return ['', '']\n}\n\nconst txTypeTranslationKeys = [\n intl.ID_TX_TYPE_UNKNOWN,\n intl.ID_TX_TYPE_SEND,\n intl.ID_TX_TYPE_RECEIVE,\n intl.ID_TX_TYPE_SWAP,\n intl.ID_TX_TYPE_REDEEM,\n intl.ID_TX_TYPE_REFUND,\n intl.ID_TX_TYPE_SPLIT,\n intl.ID_TX_TYPE_CREATE_BOND,\n intl.ID_TX_TYPE_REDEEM_BOND,\n intl.ID_TX_TYPE_APPROVE_TOKEN,\n intl.ID_TX_TYPE_ACCELERATION,\n intl.ID_TX_TYPE_SELF_TRANSFER,\n intl.ID_TX_TYPE_REVOKE_TOKEN_APPROVAL,\n intl.ID_TX_TYPE_TICKET_PURCHASE,\n intl.ID_TX_TYPE_TICKET_VOTE,\n intl.ID_TX_TYPE_TICKET_REVOCATION,\n intl.ID_TX_TYPE_SWAP_OR_SEND,\n intl.ID_TX_TYPE_MIX\n]\n\nexport function txTypeString (txType: number) : string {\n return intl.prep(txTypeTranslationKeys[txType])\n}\n\nconst ticketPageSize = 10\nconst scanStartMempool = -1\n\ninterface ReconfigRequest {\n assetID: number\n walletType: string\n config: Record<string, string>\n newWalletPW?: string\n}\n\ninterface RescanRecoveryRequest {\n assetID: number\n appPW?: string\n force?: boolean\n}\n\ninterface WalletRestoration {\n target: string\n seed: string\n seedName: string\n instructions: string\n}\n\ninterface AssetButton {\n tmpl: Record<string, PageElement>\n bttn: PageElement\n}\n\ninterface TicketPagination {\n number: number\n history: Ticket[]\n scanned: boolean // Reached the end of history. All tickets cached.\n}\n\ninterface WalletsPageData {\n goBack?: string\n}\n\ninterface reconfigSettings {\n skipAnimation?: boolean\n elevateProviders?: boolean\n}\n\nlet net = 0\n\nexport default class WalletsPage extends BasePage {\n body: HTMLElement\n data?: WalletsPageData\n page: Record<string, PageElement>\n assetButtons: Record<number, AssetButton>\n newWalletForm: NewWalletForm\n reconfigForm: WalletConfigForm\n walletCfgGuide: PageElement\n depositAddrForm: DepositAddress\n keyup: (e: KeyboardEvent) => void\n changeWalletPW: boolean\n displayed: HTMLElement\n animation: Animation\n forms: PageElement[]\n forceReq: RescanRecoveryRequest\n forceUrl: string\n currentForm: PageElement\n restoreInfoCard: HTMLElement\n selectedAssetID: number\n stakeStatus: TicketStakingStatus\n maxSend: number\n unapprovingTokenVersion: number\n ticketPage: TicketPagination\n oldestTx: WalletTransaction | undefined\n currTx: WalletTransaction | undefined\n mixing: boolean\n mixerToggle: AniToggle\n stampers: PageElement[]\n secondTicker: number\n\n constructor (body: HTMLElement, data?: WalletsPageData) {\n super()\n this.body = body\n this.data = data\n const page = this.page = Doc.idDescendants(body)\n this.stampers = []\n net = app().user.net\n\n const setStamp = () => {\n for (const span of this.stampers) {\n if (span.dataset.stamp) {\n span.textContent = Doc.timeSince(parseInt(span.dataset.stamp || '') * 1000)\n }\n }\n }\n this.secondTicker = window.setInterval(() => {\n setStamp()\n }, 10000) // update every 10 seconds\n\n Doc.cleanTemplates(page.restoreInfoCard, page.connectedIconTmpl, page.disconnectedIconTmpl, page.removeIconTmpl)\n this.restoreInfoCard = page.restoreInfoCard.cloneNode(true) as HTMLElement\n Doc.show(page.connectedIconTmpl, page.disconnectedIconTmpl, page.removeIconTmpl)\n\n this.forms = Doc.applySelector(page.forms, ':scope > form')\n page.forms.querySelectorAll('.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => { this.closePopups() })\n })\n Doc.bind(page.cancelForce, 'click', () => { this.closePopups() })\n\n this.selectedAssetID = -1\n Doc.cleanTemplates(\n page.iconSelectTmpl, page.balanceDetailRow, page.recentOrderTmpl, page.vspRowTmpl,\n page.ticketHistoryRowTmpl, page.votingChoiceTmpl, page.votingAgendaTmpl, page.tspendTmpl,\n page.tkeyTmpl, page.txHistoryRowTmpl, page.txHistoryDateRowTmpl\n )\n\n Doc.bind(page.createWallet, 'click', () => this.showNewWallet(this.selectedAssetID))\n Doc.bind(page.connectBttn, 'click', () => this.doConnect(this.selectedAssetID))\n Doc.bind(page.send, 'click', () => this.showSendForm(this.selectedAssetID))\n Doc.bind(page.receive, 'click', () => this.showDeposit(this.selectedAssetID))\n Doc.bind(page.unlockBttn, 'click', () => this.openWallet(this.selectedAssetID))\n Doc.bind(page.lockBttn, 'click', () => this.lock(this.selectedAssetID))\n Doc.bind(page.reconfigureBttn, 'click', () => this.showReconfig(this.selectedAssetID))\n Doc.bind(page.needsProviderBttn, 'click', () => this.showReconfig(this.selectedAssetID))\n Doc.bind(page.rescanWallet, 'click', () => this.rescanWallet(this.selectedAssetID))\n Doc.bind(page.earlierTxs, 'click', () => this.loadEarlierTxs())\n\n Doc.bind(page.copyTxIDBtn, 'click', () => { setupCopyBtn(this.currTx?.id || '', page.txDetailsID, page.copyTxIDBtn, '#1e7d11') })\n Doc.bind(page.copyRecipientBtn, 'click', () => { setupCopyBtn(this.currTx?.recipient || '', page.txDetailsRecipient, page.copyRecipientBtn, '#1e7d11') })\n Doc.bind(page.copyBondIDBtn, 'click', () => { setupCopyBtn(this.currTx?.bondInfo?.bondID || '', page.txDetailsBondID, page.copyBondIDBtn, '#1e7d11') })\n Doc.bind(page.copyBondAccountIDBtn, 'click', () => { setupCopyBtn(this.currTx?.bondInfo?.accountID || '', page.txDetailsBondAccountID, page.copyBondAccountIDBtn, '#1e7d11') })\n Doc.bind(page.hideMixTxsCheckbox, 'change', () => { this.showTxHistory(this.selectedAssetID) })\n\n // Bind the new wallet form.\n this.newWalletForm = new NewWalletForm(page.newWalletForm, (assetID: number) => {\n const fmtParams = { assetName: app().assets[assetID].name }\n this.assetUpdated(assetID, page.newWalletForm, intl.prep(intl.ID_NEW_WALLET_SUCCESS, fmtParams))\n this.sortAssetButtons()\n this.updateTicketBuyer(assetID)\n this.updatePrivacy(assetID)\n })\n\n // Bind the wallet reconfig form.\n this.reconfigForm = new WalletConfigForm(page.reconfigInputs, false)\n\n this.walletCfgGuide = Doc.tmplElement(page.reconfigForm, 'walletCfgGuide')\n\n // Bind the send form.\n bindForm(page.sendForm, page.submitSendForm, async () => { this.stepSend() })\n // Send confirmation form.\n bindForm(page.vSendForm, page.vSend, async () => { this.send() })\n // Bind the wallet reconfiguration submission.\n bindForm(page.reconfigForm, page.submitReconfig, () => this.reconfig())\n\n page.forms.querySelectorAll('.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => this.closePopups())\n })\n\n Doc.bind(page.forms, 'mousedown', (e: MouseEvent) => {\n if (!Doc.mouseInElement(e, this.currentForm)) { this.closePopups() }\n })\n\n this.mixerToggle = new AniToggle(page.toggleMixer, page.mixingErr, false, (newState: boolean) => { return this.updateMixerState(newState) })\n\n this.keyup = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n if (Doc.isDisplayed(this.page.forms)) this.closePopups()\n }\n }\n Doc.bind(document, 'keyup', this.keyup)\n\n Doc.bind(page.downloadLogs, 'click', async () => { this.downloadLogs() })\n Doc.bind(page.exportWallet, 'click', async () => { this.displayExportWalletAuth() })\n Doc.bind(page.recoverWallet, 'click', async () => { this.showRecoverWallet() })\n bindForm(page.exportWalletAuth, page.exportWalletAuthSubmit, async () => { this.exportWalletAuthSubmit() })\n bindForm(page.recoverWalletConfirm, page.recoverWalletSubmit, () => { this.recoverWallet() })\n bindForm(page.confirmForce, page.confirmForceSubmit, async () => { this.confirmForceSubmit() })\n Doc.bind(page.disableWallet, 'click', async () => { this.showToggleWalletStatus(true) })\n Doc.bind(page.enableWallet, 'click', async () => { this.showToggleWalletStatus(false) })\n bindForm(page.toggleWalletStatusConfirm, page.toggleWalletStatusSubmit, async () => { this.toggleWalletStatus() })\n Doc.bind(page.managePeers, 'click', async () => { this.showManagePeersForm() })\n Doc.bind(page.addPeerSubmit, 'click', async () => { this.submitAddPeer() })\n Doc.bind(page.unapproveTokenAllowance, 'click', async () => { this.showUnapproveTokenAllowanceTableForm() })\n Doc.bind(page.unapproveTokenSubmit, 'click', async () => { this.submitUnapproveTokenAllowance() })\n Doc.bind(page.showVSPs, 'click', () => { this.showVSPPicker() })\n Doc.bind(page.vspDisplay, 'click', () => { this.showVSPPicker() })\n bindForm(page.vspPicker, page.customVspSubmit, async () => { this.setCustomVSP() })\n Doc.bind(page.purchaseTicketsBttn, 'click', () => { this.showPurchaseTicketsDialog() })\n bindForm(page.purchaseTicketsForm, page.purchaserSubmit, () => { this.purchaseTickets() })\n Doc.bind(page.purchaserInput, 'change', () => { this.purchaserInputChanged() })\n Doc.bind(page.ticketHistory, 'click', () => { this.showTicketHistory() })\n Doc.bind(page.ticketHistoryNextPage, 'click', () => { this.nextTicketPage() })\n Doc.bind(page.ticketHistoryPrevPage, 'click', () => { this.prevTicketPage() })\n Doc.bind(page.setVotes, 'click', () => { this.showSetVotesDialog() })\n Doc.bind(page.purchaseTicketsErrCloser, 'click', () => { Doc.hide(page.purchaseTicketsErrBox) })\n Doc.bind(page.privacyInfoBttn, 'click', () => { this.showForm(page.mixingInfo) })\n\n // New deposit address button.\n this.depositAddrForm = new DepositAddress(page.deposit)\n\n // Clicking on the available amount on the Send form populates the\n // amount field.\n Doc.bind(page.walletBal, 'click', () => { this.populateMaxSend() })\n\n // Display fiat value for current send amount.\n Doc.bind(page.sendAmt, 'input', () => {\n const { unitInfo: ui } = app().assets[this.selectedAssetID]\n const amt = parseFloatDefault(page.sendAmt.value)\n const conversionFactor = ui.conventional.conversionFactor\n Doc.showFiatValue(page.sendValue, amt * conversionFactor, app().fiatRatesMap[this.selectedAssetID], ui)\n })\n\n // Clicking on maxSend on the send form should populate the amount field.\n Doc.bind(page.maxSend, 'click', () => { this.populateMaxSend() })\n\n // Validate send address on input.\n Doc.bind(page.sendAddr, 'input', async () => {\n const asset = app().assets[this.selectedAssetID]\n page.sendAddr.classList.remove('border-danger', 'border-success')\n const addr = page.sendAddr.value || ''\n if (!asset || addr === '') return\n const valid = await this.validateSendAddress(addr, asset.id)\n if (valid) page.sendAddr.classList.add('border-success')\n else page.sendAddr.classList.add('border-danger')\n })\n\n // A link on the wallet reconfiguration form to show/hide the password field.\n Doc.bind(page.showChangePW, 'click', () => {\n this.changeWalletPW = !this.changeWalletPW\n this.setPWSettingViz(this.changeWalletPW)\n })\n\n // Changing the type of wallet.\n Doc.bind(page.changeWalletTypeSelect, 'change', () => {\n this.changeWalletType()\n })\n Doc.bind(page.showChangeType, 'click', () => {\n if (Doc.isHidden(page.changeWalletType)) {\n Doc.show(page.changeWalletType, page.changeTypeHideIcon)\n Doc.hide(page.changeTypeShowIcon)\n page.changeTypeMsg.textContent = intl.prep(intl.ID_KEEP_WALLET_TYPE)\n } else this.showReconfig(this.selectedAssetID, { skipAnimation: true })\n })\n\n app().registerNoteFeeder({\n fiatrateupdate: (note: RateNote) => { this.handleRatesNote(note) },\n balance: (note: BalanceNote) => { this.handleBalanceNote(note) },\n walletstate: (note: WalletStateNote) => { this.handleWalletStateNote(note) },\n walletconfig: (note: WalletStateNote) => { this.handleWalletStateNote(note) },\n walletsync: (note: WalletSyncNote) => { this.updateSyncAndPeers(note.assetID) },\n createwallet: (note: WalletCreationNote) => { this.handleCreateWalletNote(note) },\n walletnote: (note: WalletNote) => { this.handleCustomWalletNote(note) }\n })\n\n const firstAsset = this.sortAssetButtons()\n let selectedAsset = firstAsset.id\n const assetIDStr = State.fetchLocal(State.selectedAssetLK)\n if (assetIDStr) selectedAsset = Number(assetIDStr)\n this.setSelectedAsset(selectedAsset)\n\n setInterval(() => {\n for (const row of this.page.txHistoryTableBody.children) {\n const age = Doc.tmplElement(row as PageElement, 'age')\n age.textContent = Doc.timeSince(parseInt(age.dataset.timestamp as string))\n }\n }, 5000)\n }\n\n closePopups () {\n Doc.hide(this.page.forms)\n this.currTx = undefined\n if (this.animation) this.animation.stop()\n }\n\n async safePost (path: string, args: any): Promise<any> {\n const assetID = this.selectedAssetID\n const res = await postJSON(path, args)\n if (assetID !== this.selectedAssetID) throw Error('asset changed during request. aborting')\n return res\n }\n\n // stepSend makes a request to get an estimated fee and displays the confirm\n // send form.\n async stepSend () {\n const page = this.page\n Doc.hide(page.vSendErr, page.sendErr, page.vSendEstimates, page.txFeeNotAvailable)\n const assetID = parseInt(page.sendForm.dataset.assetID || '')\n const token = app().assets[assetID].token\n const subtract = page.subtractCheckBox.checked || false\n const conversionFactor = app().unitInfo(assetID).conventional.conversionFactor\n const value = Math.round(parseFloatDefault(page.sendAmt.value, 0) * conversionFactor)\n const addr = page.sendAddr.value || ''\n if (addr === '') return Doc.showFormError(page.sendErr, intl.prep(intl.ID_INVALID_ADDRESS_MSG, { address: addr }))\n const { wallet, unitInfo: ui, symbol } = app().assets[assetID]\n\n // txfee will not be available if wallet is not a fee estimator or the\n // request failed.\n let txfee = 0\n if ((wallet.traits & traitTxFeeEstimator) !== 0) {\n const open = {\n addr: page.sendAddr.value,\n assetID: assetID,\n subtract: subtract,\n value: value\n }\n\n const loaded = app().loading(page.sendForm)\n const res = await postJSON('/api/txfee', open)\n loaded()\n if (!app().checkResponse(res)) {\n page.txFeeNotAvailable.dataset.tooltip = intl.prep(intl.ID_TXFEE_ERR_MSG, { err: res.msg })\n Doc.show(page.txFeeNotAvailable)\n // We still want to ensure user address is valid before proceeding to send\n // confirm form if there's an error while calculating the transaction fee.\n const valid = await this.validateSendAddress(addr, assetID)\n if (!valid) return Doc.showFormError(page.sendErr, intl.prep(intl.ID_INVALID_ADDRESS_MSG, { address: addr || '' }))\n } else if (res.ok) {\n if (!res.validaddress) return Doc.showFormError(page.sendErr, intl.prep(intl.ID_INVALID_ADDRESS_MSG, { address: page.sendAddr.value || '' }))\n txfee = res.txfee\n Doc.show(page.vSendEstimates)\n }\n } else {\n // Validate only the send address for assets that are not fee estimators.\n const valid = await this.validateSendAddress(addr, assetID)\n if (!valid) return Doc.showFormError(page.sendErr, intl.prep(intl.ID_INVALID_ADDRESS_MSG, { address: addr || '' }))\n }\n\n page.vSendSymbol.textContent = symbol.toUpperCase()\n page.vSendLogo.src = Doc.logoPath(symbol)\n\n if (token) {\n const { unitInfo: feeUI, symbol: feeSymbol } = app().assets[token.parentID]\n page.vSendFee.textContent = Doc.formatFullPrecision(txfee, feeUI) + ' ' + feeSymbol\n } else {\n page.vSendFee.textContent = Doc.formatFullPrecision(txfee, ui)\n }\n const xcRate = app().fiatRatesMap[assetID]\n Doc.showFiatValue(page.vSendFeeFiat, txfee, xcRate, ui)\n page.vSendDestinationAmt.textContent = Doc.formatFullPrecision(value - txfee, ui)\n page.vTotalSend.textContent = Doc.formatFullPrecision(value, ui)\n Doc.showFiatValue(page.vTotalSendFiat, value, xcRate, ui)\n page.vSendAddr.textContent = page.sendAddr.value || ''\n const bal = wallet.balance.available - value\n page.balanceAfterSend.textContent = Doc.formatFullPrecision(bal, ui)\n Doc.showFiatValue(page.balanceAfterSendFiat, bal, xcRate, ui)\n Doc.show(page.approxSign)\n // NOTE: All tokens take this route because they cannot pay the fee.\n if (!subtract) {\n Doc.hide(page.approxSign)\n page.vSendDestinationAmt.textContent = Doc.formatFullPrecision(value, ui)\n let totalSend = value\n if (!token) totalSend += txfee\n page.vTotalSend.textContent = Doc.formatFullPrecision(totalSend, ui)\n Doc.showFiatValue(page.vTotalSendFiat, totalSend, xcRate, ui)\n let bal = wallet.balance.available - value\n if (!token) bal -= txfee\n // handle edge cases where bal is not enough to cover totalSend.\n // we don't want a minus display of user bal.\n if (bal <= 0) {\n page.balanceAfterSend.textContent = Doc.formatFullPrecision(0, ui)\n Doc.showFiatValue(page.balanceAfterSendFiat, 0, xcRate, ui)\n } else {\n page.balanceAfterSend.textContent = Doc.formatFullPrecision(bal, ui)\n Doc.showFiatValue(page.balanceAfterSendFiat, bal, xcRate, ui)\n }\n }\n Doc.hide(page.sendForm)\n await this.showForm(page.vSendForm)\n }\n\n // cancelSend displays the send form if user wants to make modification.\n async cancelSend () {\n const page = this.page\n Doc.hide(page.vSendForm, page.sendErr)\n await this.showForm(page.sendForm)\n }\n\n /*\n * validateSendAddress validates the provided address for an asset.\n */\n async validateSendAddress (addr: string, assetID: number): Promise<boolean> {\n const resp = await postJSON('/api/validateaddress', { addr: addr, assetID: assetID })\n return app().checkResponse(resp)\n }\n\n /*\n * setPWSettingViz sets the visibility of the password field section.\n */\n setPWSettingViz (visible: boolean) {\n const page = this.page\n if (visible) {\n Doc.hide(page.showIcon)\n Doc.show(page.hideIcon, page.changePW)\n page.switchPWMsg.textContent = intl.prep(intl.ID_KEEP_WALLET_PASS)\n return\n }\n Doc.hide(page.hideIcon, page.changePW)\n Doc.show(page.showIcon)\n page.switchPWMsg.textContent = intl.prep(intl.ID_NEW_WALLET_PASS)\n }\n\n /*\n * assetVersionUsedByDEXes returns a map of the versions of the\n * currently selected asset to the DEXes that use that version.\n */\n assetVersionUsedByDEXes (): Record<number, string[]> {\n const assetID = this.selectedAssetID\n const versionToDEXes = {} as Record<number, string[]>\n const exchanges = app().exchanges\n\n for (const host in exchanges) {\n const exchange = exchanges[host]\n const exchangeAsset = exchange.assets[assetID]\n if (!exchangeAsset) continue\n if (!versionToDEXes[exchangeAsset.version]) {\n versionToDEXes[exchangeAsset.version] = []\n }\n versionToDEXes[exchangeAsset.version].push(exchange.host)\n }\n\n return versionToDEXes\n }\n\n /*\n * submitUnapproveTokenAllowance submits a request to the server to\n * unapprove a version of the currently selected token's swap contract.\n */\n async submitUnapproveTokenAllowance () {\n const page = this.page\n const path = '/api/unapprovetoken'\n const res = await postJSON(path, {\n assetID: this.selectedAssetID,\n version: this.unapprovingTokenVersion\n })\n if (!app().checkResponse(res)) {\n page.unapproveTokenErr.textContent = res.msg\n Doc.show(page.unapproveTokenErr)\n return\n }\n\n const assetExplorer = CoinExplorers[this.selectedAssetID]\n if (assetExplorer && assetExplorer[net]) {\n page.unapproveTokenTxID.href = assetExplorer[net](res.txID)\n }\n page.unapproveTokenTxID.textContent = res.txID\n Doc.hide(page.unapproveTokenSubmissionElements, page.unapproveTokenErr)\n Doc.show(page.unapproveTokenTxMsg)\n }\n\n /*\n * showUnapproveTokenAllowanceForm displays the form for unapproving\n * a specific version of the currently selected token's swap contract.\n */\n async showUnapproveTokenAllowanceForm (version: number) {\n const page = this.page\n this.unapprovingTokenVersion = version\n Doc.show(page.unapproveTokenSubmissionElements)\n Doc.hide(page.unapproveTokenTxMsg, page.unapproveTokenErr)\n const asset = app().assets[this.selectedAssetID]\n if (!asset || !asset.token) return\n const parentAsset = app().assets[asset.token.parentID]\n if (!parentAsset) return\n Doc.empty(page.tokenAllowanceRemoveSymbol)\n page.tokenAllowanceRemoveSymbol.appendChild(Doc.symbolize(asset, true))\n page.tokenAllowanceRemoveVersion.textContent = version.toString()\n\n const path = '/api/approvetokenfee'\n const res = await postJSON(path, {\n assetID: this.selectedAssetID,\n version: version,\n approving: false\n })\n if (!app().checkResponse(res)) {\n page.unapproveTokenErr.textContent = res.msg\n Doc.show(page.unapproveTokenErr)\n } else {\n let feeText = `${Doc.formatCoinValue(res.txFee, parentAsset.unitInfo)} ${parentAsset.unitInfo.conventional.unit}`\n const rate = app().fiatRatesMap[parentAsset.id]\n if (rate) {\n feeText += ` (${Doc.formatFiatConversion(res.txFee, rate, parentAsset.unitInfo)} USD)`\n }\n page.unapprovalFeeEstimate.textContent = feeText\n }\n this.showForm(page.unapproveTokenForm)\n }\n\n /*\n * showUnapproveTokenAllowanceTableForm displays a table showing each of the\n * versions of a token's swap contract that have been approved and allows the\n * user to unapprove any of them.\n */\n async showUnapproveTokenAllowanceTableForm () {\n const page = this.page\n const asset = app().assets[this.selectedAssetID]\n if (!asset || !asset.wallet || !asset.wallet.approved) return\n while (page.tokenVersionBody.firstChild) {\n page.tokenVersionBody.removeChild(page.tokenVersionBody.firstChild)\n }\n Doc.empty(page.tokenVersionTableAssetSymbol)\n page.tokenVersionTableAssetSymbol.appendChild(Doc.symbolize(asset, true))\n const versionToDEXes = this.assetVersionUsedByDEXes()\n\n let showTable = false\n for (let i = 0; i <= asset.wallet.version; i++) {\n const approvalStatus = asset.wallet.approved[i]\n if (approvalStatus === undefined || approvalStatus !== ApprovalStatus.Approved) {\n continue\n }\n showTable = true\n const row = page.tokenVersionRow.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(row)\n tmpl.version.textContent = i.toString()\n if (versionToDEXes[i]) {\n tmpl.usedBy.textContent = versionToDEXes[i].join(', ')\n }\n const removeIcon = this.page.removeIconTmpl.cloneNode(true)\n Doc.bind(removeIcon, 'click', () => {\n this.showUnapproveTokenAllowanceForm(i)\n })\n tmpl.remove.appendChild(removeIcon)\n page.tokenVersionBody.appendChild(row)\n }\n Doc.setVis(showTable, page.tokenVersionTable)\n Doc.setVis(!showTable, page.tokenVersionNone)\n this.showForm(page.unapproveTokenTableForm)\n }\n\n /*\n * updateWalletPeers retrieves the wallet peers and displays them in the\n * wallet peers table.\n */\n async updateWalletPeersTable () {\n const page = this.page\n\n Doc.hide(page.peerSpinner)\n\n const res = await postJSON('/api/getwalletpeers', {\n assetID: this.selectedAssetID\n })\n if (!app().checkResponse(res)) {\n page.managePeersErr.textContent = res.msg\n Doc.show(page.managePeersErr)\n return\n }\n\n while (page.peersTableBody.firstChild) {\n page.peersTableBody.removeChild(page.peersTableBody.firstChild)\n }\n\n const peers : WalletPeer[] = res.peers || []\n peers.sort((a: WalletPeer, b: WalletPeer) : number => {\n return a.source - b.source\n })\n\n const defaultText = intl.prep(intl.ID_DEFAULT)\n const addedText = intl.prep(intl.ID_ADDED)\n const discoveredText = intl.prep(intl.ID_DISCOVERED)\n\n peers.forEach((peer: WalletPeer) => {\n const row = page.peerTableRow.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(row)\n\n tmpl.addr.textContent = peer.addr\n\n switch (peer.source) {\n case PeerSource.WalletDefault:\n tmpl.source.textContent = defaultText\n break\n case PeerSource.UserAdded:\n tmpl.source.textContent = addedText\n break\n case PeerSource.Discovered:\n tmpl.source.textContent = discoveredText\n break\n }\n\n let connectionIcon\n if (peer.connected) {\n connectionIcon = this.page.connectedIconTmpl.cloneNode(true)\n } else {\n connectionIcon = this.page.disconnectedIconTmpl.cloneNode(true)\n }\n tmpl.connected.appendChild(connectionIcon)\n\n if (peer.source === PeerSource.UserAdded) {\n const removeIcon = this.page.removeIconTmpl.cloneNode(true)\n Doc.bind(removeIcon, 'click', async () => {\n Doc.hide(page.managePeersErr)\n const res = await postJSON('/api/removewalletpeer', {\n assetID: this.selectedAssetID,\n addr: peer.addr\n })\n if (!app().checkResponse(res)) {\n page.managePeersErr.textContent = res.msg\n Doc.show(page.managePeersErr)\n return\n }\n this.spinUntilPeersUpdate()\n })\n tmpl.remove.appendChild(removeIcon)\n }\n\n page.peersTableBody.appendChild(row)\n })\n }\n\n // showManagePeersForm displays the manage peers form.\n async showManagePeersForm () {\n const page = this.page\n await this.updateWalletPeersTable()\n Doc.hide(page.managePeersErr)\n this.showForm(page.managePeersForm)\n }\n\n // submitAddPeers sends a request for the the wallet to connect to a new\n // peer.\n async submitAddPeer () {\n const page = this.page\n Doc.hide(page.managePeersErr)\n const res = await postJSON('/api/addwalletpeer', {\n assetID: this.selectedAssetID,\n addr: page.addPeerInput.value\n })\n if (!app().checkResponse(res)) {\n page.managePeersErr.textContent = res.msg\n Doc.show(page.managePeersErr)\n return\n }\n this.spinUntilPeersUpdate()\n page.addPeerInput.value = ''\n }\n\n /*\n * spinUntilPeersUpdate will show the spinner on the manage peers fork.\n * If it is still showing after 10 seconds, the peers table will be updated\n * instead of waiting for a notification.\n */\n async spinUntilPeersUpdate () {\n const page = this.page\n Doc.show(page.peerSpinner)\n setTimeout(() => {\n if (Doc.isDisplayed(page.peerSpinner)) {\n this.updateWalletPeersTable()\n }\n }, 10000)\n }\n\n /*\n * showToggleWalletStatus displays the toggleWalletStatusConfirm form with\n * relevant help message.\n */\n showToggleWalletStatus (disable: boolean) {\n const page = this.page\n Doc.hide(page.toggleWalletStatusErr, page.walletStatusDisable, page.disableWalletMsg, page.walletStatusEnable, page.enableWalletMsg)\n if (disable) Doc.show(page.walletStatusDisable, page.disableWalletMsg)\n else Doc.show(page.walletStatusEnable, page.enableWalletMsg)\n this.showForm(page.toggleWalletStatusConfirm)\n }\n\n /*\n * toggleWalletStatus toggles a wallets status to either disabled or enabled.\n */\n async toggleWalletStatus () {\n const page = this.page\n Doc.hide(page.toggleWalletStatusErr)\n\n const asset = app().assets[this.selectedAssetID]\n const disable = !asset.wallet.disabled\n const url = '/api/togglewalletstatus'\n const req = {\n assetID: this.selectedAssetID,\n disable: disable\n }\n\n const fmtParams = { assetName: asset.name }\n const loaded = app().loading(page.toggleWalletStatusConfirm)\n const res = await postJSON(url, req)\n loaded()\n if (!app().checkResponse(res)) {\n if (res.code === Errors.activeOrdersErr) page.toggleWalletStatusErr.textContent = intl.prep(intl.ID_ACTIVE_ORDERS_ERR_MSG, fmtParams)\n else page.toggleWalletStatusErr.textContent = res.msg\n Doc.show(page.toggleWalletStatusErr)\n return\n }\n\n let successMsg = intl.prep(intl.ID_WALLET_DISABLED_MSG, fmtParams)\n if (!disable) successMsg = intl.prep(intl.ID_WALLET_ENABLED_MSG, fmtParams)\n this.assetUpdated(this.selectedAssetID, page.toggleWalletStatusConfirm, successMsg)\n }\n\n /*\n * showBox shows the box with a fade-in animation.\n */\n async showBox (box: HTMLElement, focuser?: PageElement) {\n box.style.opacity = '0'\n Doc.show(box)\n if (focuser) focuser.focus()\n await Doc.animate(animationLength, progress => {\n box.style.opacity = `${progress}`\n }, 'easeOut')\n box.style.opacity = '1'\n this.displayed = box\n }\n\n /* showForm shows a modal form with a little animation. */\n async showForm (form: PageElement) {\n const page = this.page\n this.currentForm = form\n this.forms.forEach(form => Doc.hide(form))\n form.style.right = '10000px'\n Doc.show(page.forms, form)\n const shift = (page.forms.offsetWidth + form.offsetWidth) / 2\n await Doc.animate(animationLength, progress => {\n form.style.right = `${(1 - progress) * shift}px`\n }, 'easeOutHard')\n form.style.right = '0'\n }\n\n async showSuccess (msg: string) {\n this.forms.forEach(form => Doc.hide(form))\n this.currentForm = this.page.checkmarkForm\n this.animation = showSuccess(this.page, msg)\n await this.animation.wait()\n this.animation = new Animation(1500, () => { /* pass */ }, '', () => {\n if (this.currentForm === this.page.checkmarkForm) this.closePopups()\n })\n }\n\n /* Show the new wallet form. */\n async showNewWallet (assetID: number) {\n const page = this.page\n const box = page.newWalletForm\n this.newWalletForm.setAsset(assetID)\n const defaultsLoaded = this.newWalletForm.loadDefaults()\n await this.showForm(box)\n await defaultsLoaded\n }\n\n // sortAssetButtons displays supported assets, sorted. Returns first asset in the\n // list.\n sortAssetButtons (): SupportedAsset {\n const page = this.page\n this.assetButtons = {}\n Doc.empty(page.assetSelect)\n const sortedAssets = [...Object.values(app().assets)]\n sortedAssets.sort((a: SupportedAsset, b: SupportedAsset) => {\n if (a.wallet && !b.wallet) return -1\n if (!a.wallet && b.wallet) return 1\n if (!a.wallet && !b.wallet) return a.symbol === 'dcr' ? -1 : 1\n const [aBal, bBal] = [a.wallet.balance, b.wallet.balance]\n const [aTotal, bTotal] = [aBal.available + aBal.immature + aBal.locked, bBal.available + bBal.immature + bBal.locked]\n if (aTotal === 0 && bTotal === 0) return a.symbol.localeCompare(b.symbol)\n else if (aTotal === 0) return 1\n else if (aTotal === 0) return -1\n const [aFiat, bFiat] = [app().fiatRatesMap[a.id], app().fiatRatesMap[b.id]]\n if (aFiat && !bFiat) return -1\n if (!aFiat && bFiat) return 1\n return bFiat * bTotal - aFiat * aTotal\n })\n for (const a of sortedAssets) {\n const bttn = page.iconSelectTmpl.cloneNode(true) as HTMLElement\n page.assetSelect.appendChild(bttn)\n const tmpl = Doc.parseTemplate(bttn)\n this.assetButtons[a.id] = { tmpl, bttn }\n this.updateAssetButton(a.id)\n Doc.bind(bttn, 'click', () => {\n this.setSelectedAsset(a.id)\n State.storeLocal(State.selectedAssetLK, String(a.id))\n })\n }\n page.assetSelect.classList.remove('invisible')\n return sortedAssets[0]\n }\n\n updateAssetButton (assetID: number) {\n const a = app().assets[assetID]\n const { bttn, tmpl } = this.assetButtons[assetID]\n Doc.hide(tmpl.fiatBox, tmpl.noWallet)\n bttn.classList.add('nowallet')\n tmpl.img.src ||= Doc.logoPath(a.symbol) // don't initiate GET if already set (e.g. update on some notification)\n const symbolParts = a.symbol.split('.')\n if (symbolParts.length === 2) {\n const parentSymbol = symbolParts[1]\n tmpl.parentImg.classList.remove('d-hide')\n tmpl.parentImg.src ||= Doc.logoPath(parentSymbol)\n }\n if (this.selectedAssetID === assetID) bttn.classList.add('selected')\n tmpl.name.textContent = a.name\n if (a.wallet) {\n bttn.classList.remove('nowallet')\n const { wallet: { balance: b }, unitInfo: ui } = a\n const totalBalance = b.available + b.locked + b.immature\n const [s, unit] = Doc.formatBestUnitsFourSigFigs(totalBalance, ui)\n tmpl.balance.textContent = s\n tmpl.unit.textContent = unit\n Doc.show(tmpl.balanceBox)\n const fiatRate = app().fiatRatesMap[a.id]\n if (fiatRate) {\n Doc.show(tmpl.fiatBox)\n tmpl.fiat.textContent = Doc.formatFourSigFigs(totalBalance / ui.conventional.conversionFactor * fiatRate)\n }\n } else Doc.show(tmpl.noWallet)\n }\n\n async setSelectedAsset (assetID: number) {\n const { assetSelect } = this.page\n for (const b of assetSelect.children) b.classList.remove('selected')\n this.assetButtons[assetID].bttn.classList.add('selected')\n this.selectedAssetID = assetID\n this.page.hideMixTxsCheckbox.checked = true\n this.updateDisplayedAsset(assetID)\n this.showAvailableMarkets(assetID)\n const a = this.showRecentActivity(assetID)\n const b = this.showTxHistory(assetID)\n const c = this.updateTicketBuyer(assetID)\n const d = this.updatePrivacy(assetID)\n for (const p of [a, b, c, d]) await p\n }\n\n updateDisplayedAsset (assetID: number) {\n if (assetID !== this.selectedAssetID) return\n const { symbol, wallet, name, token, unitInfo } = app().assets[assetID]\n const { page, body } = this\n Doc.setText(body, '[data-asset-name]', name)\n Doc.setText(body, '[data-ticker]', unitInfo.conventional.unit)\n page.assetLogo.src = Doc.logoPath(symbol)\n Doc.hide(\n page.balanceBox, page.fiatBalanceBox, page.createWallet, page.walletDetails,\n page.sendReceive, page.connectBttnBox, page.statusLocked, page.statusReady,\n page.statusOff, page.unlockBttnBox, page.lockBttnBox, page.connectBttnBox,\n page.peerCountBox, page.syncProgressBox, page.statusDisabled, page.tokenInfoBox,\n page.needsProviderBox, page.feeStateBox, page.txSyncBox, page.txProgress,\n page.txFindingAddrs\n )\n this.checkNeedsProvider(assetID)\n if (token) {\n const parentAsset = app().assets[token.parentID]\n page.tokenParentLogo.src = Doc.logoPath(parentAsset.symbol)\n page.tokenParentName.textContent = parentAsset.name\n page.contractAddress.textContent = token.contractAddress\n Doc.show(page.tokenInfoBox)\n }\n if (wallet) {\n this.updateDisplayedAssetBalance()\n const { feeState, running, disabled, type: walletType } = wallet\n\n const walletDef = app().walletDefinition(assetID, walletType)\n page.walletType.textContent = walletDef.tab\n if (feeState) this.updateFeeState(feeState)\n if (disabled) Doc.show(page.statusDisabled) // wallet is disabled\n else if (running) {\n this.updateSyncAndPeers(wallet.assetID)\n } else Doc.show(page.statusOff, page.connectBttnBox) // wallet not running\n } else Doc.show(page.createWallet) // no wallet\n\n page.walletDetailsBox.classList.remove('invisible')\n }\n\n updateSyncAndPeers (assetID: number) {\n const { page, selectedAssetID } = this\n if (assetID !== selectedAssetID) return\n const { peerCount, syncProgress, syncStatus, encrypted, open, running } = app().walletMap[assetID]\n if (!running) return\n Doc.show(page.sendReceive, page.peerCountBox, page.syncProgressBox)\n page.peerCount.textContent = String(peerCount)\n page.syncProgress.textContent = `${(syncProgress * 100).toFixed(1)}%`\n if (open) {\n Doc.show(page.statusReady)\n if (!app().haveActiveOrders(assetID) && encrypted) Doc.show(page.lockBttnBox)\n } else Doc.show(page.statusLocked, page.unlockBttnBox) // wallet not unlocked\n Doc.setVis(syncStatus.txs !== undefined, page.txSyncBox)\n if (syncStatus.txs !== undefined) {\n Doc.hide(page.txProgress, page.txFindingAddrs)\n if (syncStatus.txs === 0 && syncStatus.blocks >= syncStatus.targetHeight) Doc.show(page.txFindingAddrs)\n else {\n Doc.show(page.txProgress)\n const prog = syncStatus.txs / syncStatus.targetHeight\n page.txProgress.textContent = `${(prog * 100).toFixed(1)}%`\n }\n }\n }\n\n updateFeeState (feeState: FeeState) {\n const { page, selectedAssetID: assetID } = this\n Doc.hide(page.feeStateBox)\n const { unitInfo: ui, token } = app().assets[assetID]\n const fiatRate = app().fiatRatesMap[assetID]\n if (!fiatRate) return\n const feeAssetID = token ? token.parentID : assetID\n const feeFiatRate = app().fiatRatesMap[feeAssetID]\n if (token && !feeFiatRate) return\n Doc.show(page.feeStateBox)\n const feeUI = token ? app().assets[token.parentID].unitInfo : ui\n Doc.formatBestRateElement(page.feeStateNetRate, feeAssetID, feeState.rate, feeUI)\n Doc.formatBestValueElement(page.feeStateSendFees, feeAssetID, feeState.send, feeUI)\n Doc.formatBestValueElement(page.feeStateSwapFees, feeAssetID, feeState.swap, feeUI)\n Doc.formatBestValueElement(page.feeStateRedeemFees, feeAssetID, feeState.redeem, feeUI)\n page.feeStateXcRate.textContent = Doc.formatFourSigFigs(fiatRate)\n const sendFiat = feeState.send / feeUI.conventional.conversionFactor * feeFiatRate\n page.feeStateSendFiat.textContent = Doc.formatFourSigFigs(sendFiat)\n const swapFiat = feeState.swap / feeUI.conventional.conversionFactor * feeFiatRate\n page.feeStateSwapFiat.textContent = Doc.formatFourSigFigs(swapFiat)\n const redeemFiat = feeState.redeem / feeUI.conventional.conversionFactor * feeFiatRate\n page.feeStateRedeemFiat.textContent = Doc.formatFourSigFigs(redeemFiat)\n Doc.show(page.feeStateBox)\n }\n\n async checkNeedsProvider (assetID: number) {\n const needs = await app().needsCustomProvider(assetID)\n const { page: { needsProviderBox: box, needsProviderBttn: bttn } } = this\n Doc.setVis(needs, box)\n if (!needs) return\n Doc.blink(bttn)\n }\n\n async updateTicketBuyer (assetID: number) {\n this.ticketPage = {\n number: 0,\n history: [],\n scanned: false\n }\n const { wallet, unitInfo: ui } = app().assets[assetID]\n const page = this.page\n Doc.hide(\n page.stakingBox, page.pickVSP, page.stakingSummary, page.stakingErr,\n page.vspDisplayBox, page.ticketPriceBox, page.purchaseTicketsBox,\n page.stakingRpcSpvMsg, page.ticketsDisabled\n )\n if (!wallet?.running || (wallet.traits & traitTicketBuyer) === 0) return\n Doc.show(page.stakingBox)\n const loaded = app().loading(page.stakingBox)\n const res = await this.safePost('/api/stakestatus', assetID)\n loaded()\n if (!app().checkResponse(res)) {\n // Look for common error for RPC + SPV wallet.\n if (res.msg.includes('disconnected from consensus RPC')) {\n Doc.show(page.stakingRpcSpvMsg)\n return\n }\n Doc.show(page.stakingErr)\n page.stakingErr.textContent = res.msg\n return\n }\n Doc.show(page.stakingSummary, page.ticketPriceBox)\n const stakeStatus = res.status as TicketStakingStatus\n this.stakeStatus = stakeStatus\n page.stakingAgendaCount.textContent = String(stakeStatus.stances.agendas.length)\n page.stakingTspendCount.textContent = String(stakeStatus.stances.tspends.length)\n page.purchaserCurrentPrice.textContent = Doc.formatFourSigFigs(stakeStatus.ticketPrice / ui.conventional.conversionFactor)\n page.purchaserBal.textContent = Doc.formatCoinValue(wallet.balance.available, ui)\n this.updateTicketStats(stakeStatus.stats, ui, stakeStatus.ticketPrice, stakeStatus.votingSubsidy)\n // If this is an extension wallet, we'll might to disable all controls.\n const disableStaking = app().extensionWallet(this.selectedAssetID)?.disableStaking\n if (disableStaking) {\n Doc.hide(page.setVotes, page.showVSPs)\n Doc.show(page.ticketsDisabled)\n page.extensionModeAppName.textContent = app().user.extensionModeConfig.name\n return\n }\n\n this.setVSPViz(stakeStatus.vsp)\n }\n\n setVSPViz (vsp: string) {\n const { page, stakeStatus } = this\n Doc.hide(page.vspDisplayBox)\n if (vsp) {\n Doc.show(page.vspDisplayBox, page.purchaseTicketsBox)\n Doc.hide(page.pickVSP)\n page.vspURL.textContent = vsp\n return\n }\n Doc.setVis(!stakeStatus.isRPC, page.pickVSP)\n Doc.setVis(stakeStatus.isRPC, page.purchaseTicketsBox)\n }\n\n updateTicketStats (stats: TicketStats, ui: UnitInfo, ticketPrice?: number, votingSubsidy?: number) {\n const { page, stakeStatus } = this\n stakeStatus.stats = stats\n if (ticketPrice) stakeStatus.ticketPrice = ticketPrice\n if (votingSubsidy) stakeStatus.votingSubsidy = votingSubsidy\n const liveTicketCount = stakeStatus.tickets.filter((tkt: Ticket) => tkt.status <= ticketStatusLive && tkt.status >= ticketStatusUnmined).length\n page.stakingTicketCount.textContent = String(liveTicketCount)\n page.immatureTicketCount.textContent = String(stats.mempool)\n Doc.setVis(stats.mempool > 0, page.immatureTicketCountBox)\n page.queuedTicketCount.textContent = String(stats.queued)\n page.formQueuedTix.textContent = String(stats.queued)\n Doc.setVis(stats.queued > 0, page.formQueueTixBox, page.queuedTicketCountBox)\n page.totalTicketCount.textContent = String(stats.ticketCount)\n page.totalTicketRewards.textContent = Doc.formatFourSigFigs(stats.totalRewards / ui.conventional.conversionFactor)\n page.totalTicketVotes.textContent = String(stats.votes)\n if (ticketPrice) page.ticketPrice.textContent = Doc.formatFourSigFigs(ticketPrice / ui.conventional.conversionFactor)\n if (votingSubsidy) page.votingSubsidy.textContent = Doc.formatFourSigFigs(votingSubsidy / ui.conventional.conversionFactor)\n }\n\n async showVSPPicker () {\n const assetID = this.selectedAssetID\n const page = this.page\n this.showForm(page.vspPicker)\n Doc.empty(page.vspPickerList)\n Doc.hide(page.stakingErr)\n const loaded = app().loading(page.vspPicker)\n const res = await this.safePost('/api/listvsps', assetID)\n loaded()\n if (!app().checkResponse(res)) {\n Doc.show(page.stakingErr)\n page.stakingErr.textContent = res.msg\n return\n }\n const vsps = res.vsps as VotingServiceProvider[]\n for (const vsp of vsps) {\n const row = page.vspRowTmpl.cloneNode(true) as PageElement\n page.vspPickerList.appendChild(row)\n const tmpl = Doc.parseTemplate(row)\n tmpl.url.textContent = vsp.url\n tmpl.feeRate.textContent = vsp.feePercentage.toFixed(2)\n tmpl.voting.textContent = String(vsp.voting)\n Doc.bind(row, 'click', () => {\n Doc.hide(page.stakingErr)\n this.setVSP(assetID, vsp)\n })\n }\n }\n\n showPurchaseTicketsDialog () {\n const page = this.page\n page.purchaserInput.value = ''\n Doc.hide(page.purchaserErr)\n this.showForm(this.page.purchaseTicketsForm)\n page.purchaserInput.focus()\n }\n\n purchaserInputChanged () {\n const page = this.page\n const n = parseInt(page.purchaserInput.value || '0')\n if (n <= 1) {\n page.purchaserInput.value = '1'\n return\n }\n page.purchaserInput.value = String(n)\n }\n\n async purchaseTickets () {\n const { page, selectedAssetID: assetID } = this\n // DRAFT NOTE: The user will get an actual ticket count somewhere in the\n // range 1 <= tickets_purchased <= n. See notes in\n // (*spvWallet).PurchaseTickets.\n // How do we handle this at the UI. Or do we handle it all in the backend\n // somehow?\n const n = parseInt(page.purchaserInput.value || '0')\n if (n < 1) return\n // TODO: Add confirmation dialog.\n const loaded = app().loading(page.purchaseTicketsForm)\n const res = await this.safePost('/api/purchasetickets', { assetID, n })\n loaded()\n if (!app().checkResponse(res)) {\n page.purchaserErr.textContent = res.msg\n Doc.show(page.purchaserErr)\n return\n }\n this.showSuccess(intl.prep(intl.ID_TICKETS_PURCHASED, { n: n.toLocaleString(Doc.languages()) }))\n }\n\n processTicketPurchaseUpdate (walletNote: CustomWalletNote) {\n const { stakeStatus, selectedAssetID, page } = this\n const { assetID } = walletNote\n const { err, remaining, tickets, stats } = walletNote.payload as TicketPurchaseUpdate\n if (assetID !== selectedAssetID) return\n if (err) {\n Doc.show(page.purchaseTicketsErrBox)\n page.purchaseTicketsErr.textContent = err\n return\n }\n if (tickets) stakeStatus.tickets = tickets.concat(stakeStatus.tickets)\n if (stats) this.updateTicketStats(stats, app().assets[assetID].unitInfo)\n stakeStatus.stats.queued = remaining\n page.queuedTicketCount.textContent = String(remaining)\n page.formQueuedTix.textContent = String(remaining)\n Doc.setVis(remaining > 0, page.queuedTicketCountBox)\n }\n\n async setVSP (assetID: number, vsp: VotingServiceProvider) {\n this.closePopups()\n const page = this.page\n const loaded = app().loading(page.stakingBox)\n const res = await this.safePost('/api/setvsp', { assetID, url: vsp.url })\n loaded()\n if (!app().checkResponse(res)) {\n Doc.show(page.stakingErr)\n page.stakingErr.textContent = res.msg\n return\n }\n this.setVSPViz(vsp.url)\n }\n\n setCustomVSP () {\n const assetID = this.selectedAssetID\n const vsp = { url: this.page.customVspUrl.value } as VotingServiceProvider\n this.setVSP(assetID, vsp)\n }\n\n pageOfTickets (pgNum: number) {\n const { stakeStatus, ticketPage } = this\n let startOffset = pgNum * ticketPageSize\n const pageOfTickets: Ticket[] = []\n if (startOffset < stakeStatus.tickets.length) {\n pageOfTickets.push(...stakeStatus.tickets.slice(startOffset, startOffset + ticketPageSize))\n if (pageOfTickets.length < ticketPageSize) {\n const need = ticketPageSize - pageOfTickets.length\n pageOfTickets.push(...ticketPage.history.slice(0, need))\n }\n } else {\n startOffset -= stakeStatus.tickets.length\n pageOfTickets.push(...ticketPage.history.slice(startOffset, startOffset + ticketPageSize))\n }\n return pageOfTickets\n }\n\n displayTicketPage (pageNumber: number, pageOfTickets: Ticket[]) {\n const { page, selectedAssetID: assetID } = this\n const ui = app().unitInfo(assetID)\n const coinLink = CoinExplorers[assetID][app().user.net]\n Doc.empty(page.ticketHistoryRows)\n page.ticketHistoryPage.textContent = String(pageNumber)\n for (const { tx, status } of pageOfTickets) {\n const tr = page.ticketHistoryRowTmpl.cloneNode(true) as PageElement\n page.ticketHistoryRows.appendChild(tr)\n app().bindUrlHandlers(tr)\n const tmpl = Doc.parseTemplate(tr)\n tmpl.age.textContent = Doc.timeSince(tx.stamp * 1000)\n tmpl.price.textContent = Doc.formatFullPrecision(tx.ticketPrice, ui)\n tmpl.status.textContent = intl.prep(ticketStatusTranslationKeys[status])\n tmpl.hashStart.textContent = tx.hash.slice(0, 6)\n tmpl.hashEnd.textContent = tx.hash.slice(-6)\n tmpl.detailsLinkUrl.setAttribute('href', coinLink(tx.hash))\n }\n }\n\n async ticketPageN (pageNumber: number) {\n const { page, stakeStatus, ticketPage, selectedAssetID: assetID } = this\n const pageOfTickets = this.pageOfTickets(pageNumber)\n if (pageOfTickets.length < ticketPageSize && !ticketPage.scanned) {\n const n = ticketPageSize - pageOfTickets.length\n const lastList = ticketPage.history.length > 0 ? ticketPage.history : stakeStatus.tickets\n const scanStart = lastList.length > 0 ? lastList[lastList.length - 1].tx.blockHeight : scanStartMempool\n const skipN = lastList.filter((tkt: Ticket) => tkt.tx.blockHeight === scanStart).length\n const loaded = app().loading(page.ticketHistoryForm)\n const res = await this.safePost('/api/ticketpage', { assetID, scanStart, n, skipN })\n loaded()\n if (!app().checkResponse(res)) {\n console.error('error fetching ticket page', res.msg)\n return\n }\n this.ticketPage.history.push(...res.tickets)\n pageOfTickets.push(...res.tickets)\n if (res.tickets.length < n) this.ticketPage.scanned = true\n }\n\n const totalTix = stakeStatus.tickets.length + ticketPage.history.length\n Doc.setVis(totalTix >= ticketPageSize, page.ticketHistoryPagination)\n Doc.setVis(totalTix > 0, page.ticketHistoryTable)\n Doc.setVis(totalTix === 0, page.noTicketsMessage)\n if (pageOfTickets.length === 0) {\n // Probably ended with a page of size ticketPageSize, so didn't know we\n // had hit the end until the user clicked the arrow and we went looking\n // for the next. Would be good to figure out a way to hide the arrow in\n // that case.\n Doc.hide(page.ticketHistoryNextPage)\n return\n }\n this.displayTicketPage(pageNumber, pageOfTickets)\n ticketPage.number = pageNumber\n const atEnd = pageNumber * ticketPageSize + pageOfTickets.length === totalTix\n Doc.setVis(!atEnd || !ticketPage.scanned, page.ticketHistoryNextPage)\n Doc.setVis(pageNumber > 0, page.ticketHistoryPrevPage)\n }\n\n async showTicketHistory () {\n this.showForm(this.page.ticketHistoryForm)\n await this.ticketPageN(this.ticketPage.number)\n }\n\n async nextTicketPage () {\n await this.ticketPageN(this.ticketPage.number + 1)\n }\n\n async prevTicketPage () {\n await this.ticketPageN(this.ticketPage.number - 1)\n }\n\n showSetVotesDialog () {\n const { page, stakeStatus, selectedAssetID: assetID } = this\n const ui = app().unitInfo(assetID)\n Doc.hide(page.votingFormErr)\n const coinLink = CoinExplorers[assetID][app().user.net]\n const upperCase = (s: string) => s.charAt(0).toUpperCase() + s.slice(1)\n\n const setVotes = async (req: any) => {\n Doc.hide(page.votingFormErr)\n const loaded = app().loading(page.votingForm)\n const res = await this.safePost('/api/setvotes', req)\n loaded()\n if (!app().checkResponse(res)) {\n Doc.show(page.votingFormErr)\n page.votingFormErr.textContent = res.msg\n throw Error(res.msg)\n }\n }\n\n const setAgendaChoice = async (agendaID: string, choiceID: string) => {\n await setVotes({ assetID, choices: { [agendaID]: choiceID } })\n for (const agenda of stakeStatus.stances.agendas) if (agenda.id === agendaID) agenda.currentChoice = choiceID\n }\n\n Doc.empty(page.votingAgendas)\n for (const agenda of stakeStatus.stances.agendas) {\n const div = page.votingAgendaTmpl.cloneNode(true) as PageElement\n page.votingAgendas.appendChild(div)\n const tmpl = Doc.parseTemplate(div)\n tmpl.description.textContent = agenda.description\n for (const choice of agenda.choices) {\n const div = page.votingChoiceTmpl.cloneNode(true) as PageElement\n tmpl.choices.appendChild(div)\n const choiceTmpl = Doc.parseTemplate(div)\n choiceTmpl.id.textContent = upperCase(choice.id)\n choiceTmpl.id.dataset.tooltip = choice.description\n choiceTmpl.radio.value = choice.id\n choiceTmpl.radio.name = agenda.id\n Doc.bind(choiceTmpl.radio, 'change', () => {\n if (!choiceTmpl.radio.checked) return\n setAgendaChoice(agenda.id, choice.id)\n })\n if (choice.id === agenda.currentChoice) choiceTmpl.radio.checked = true\n }\n app().bindTooltips(tmpl.choices)\n }\n\n const setTspendVote = async (txHash: string, policyID: string) => {\n await setVotes({ assetID, tSpendPolicy: { [txHash]: policyID } })\n for (const tspend of stakeStatus.stances.tspends) if (tspend.hash === txHash) tspend.currentPolicy = policyID\n }\n\n Doc.empty(page.votingTspends)\n for (const tspend of stakeStatus.stances.tspends) {\n const div = page.tspendTmpl.cloneNode(true) as PageElement\n page.votingTspends.appendChild(div)\n app().bindUrlHandlers(div)\n const tmpl = Doc.parseTemplate(div)\n for (const opt of [tmpl.yes, tmpl.no]) {\n opt.name = tspend.hash\n if (tspend.currentPolicy === opt.value) opt.checked = true\n Doc.bind(opt, 'change', () => {\n if (!opt.checked) return\n setTspendVote(tspend.hash, opt.value ?? '')\n })\n }\n if (tspend.value > 0) tmpl.value.textContent = Doc.formatFourSigFigs(tspend.value / ui.conventional.conversionFactor)\n else Doc.hide(tmpl.value)\n tmpl.hash.textContent = tspend.hash\n tmpl.explorerLink.setAttribute('href', coinLink(tspend.hash))\n }\n\n const setTKeyPolicy = async (key: string, policy: string) => {\n await setVotes({ assetID, treasuryPolicy: { [key]: policy } })\n for (const tkey of stakeStatus.stances.treasuryKeys) if (tkey.key === key) tkey.policy = policy\n }\n\n Doc.empty(page.votingTKeys)\n for (const keyPolicy of (stakeStatus.stances.treasuryKeys ?? [])) {\n const div = page.tkeyTmpl.cloneNode(true) as PageElement\n page.votingTKeys.appendChild(div)\n const tmpl = Doc.parseTemplate(div)\n for (const opt of [tmpl.yes, tmpl.no]) {\n opt.name = keyPolicy.key\n if (keyPolicy.policy === opt.value) opt.checked = true\n Doc.bind(opt, 'change', () => {\n if (!opt.checked) return\n setTKeyPolicy(keyPolicy.key, opt.value ?? '')\n })\n }\n tmpl.key.textContent = keyPolicy.key\n }\n\n this.showForm(page.votingForm)\n }\n\n async updatePrivacy (assetID: number) {\n const disablePrivacy = app().extensionWallet(assetID)?.disablePrivacy\n this.mixing = false\n const { wallet } = app().assets[assetID]\n const page = this.page\n Doc.hide(page.mixingBox, page.mixerOff, page.mixerOn)\n // TODO: Show special messaging if the asset supports mixing but not this\n // wallet type.\n if (disablePrivacy || !wallet?.running || (wallet.traits & traitFundsMixer) === 0) return\n Doc.show(page.mixingBox, page.mixerLoading)\n const res = await this.safePost('/api/mixingstats', { assetID })\n Doc.hide(page.mixerLoading)\n if (!app().checkResponse(res)) {\n Doc.show(page.mixingErr)\n page.mixingErr.textContent = res.msg\n return\n }\n\n this.mixing = res.stats.enabled as boolean\n if (this.mixing) Doc.show(page.mixerOn)\n else Doc.show(page.mixerOff)\n this.mixerToggle.setState(this.mixing)\n }\n\n async updateMixerState (on: boolean) {\n const page = this.page\n Doc.hide(page.mixingErr)\n const loaded = app().loading(page.mixingBox)\n const res = await postJSON('/api/configuremixer', { assetID: this.selectedAssetID, enabled: on })\n loaded()\n if (!app().checkResponse(res)) {\n page.mixingErr.textContent = intl.prep(intl.ID_API_ERROR, { msg: res.msg })\n Doc.show(page.mixingErr)\n return\n }\n Doc.setVis(on, page.mixerOn)\n Doc.setVis(!on, page.mixerOff)\n this.mixerToggle.setState(on)\n }\n\n updateDisplayedAssetBalance (): void {\n const page = this.page\n const asset = app().assets[this.selectedAssetID]\n const { wallet, unitInfo: ui, id: assetID } = asset\n const bal = wallet.balance\n Doc.show(page.balanceBox, page.walletDetails)\n const totalLocked = bal.locked + bal.contractlocked + bal.bondlocked\n const totalBalance = bal.available + totalLocked + bal.immature\n page.balance.textContent = Doc.formatCoinValue(totalBalance, ui)\n page.balanceUnit.textContent = ui.conventional.unit\n const rate = app().fiatRatesMap[assetID]\n if (rate) {\n Doc.show(page.fiatBalanceBox)\n page.fiatBalance.textContent = Doc.formatFiatConversion(totalBalance, rate, ui)\n }\n Doc.empty(page.balanceDetailBox)\n\n const addBalanceRow = (cat: string, bal: number, tooltipMsg?: string) => {\n const row = page.balanceDetailRow.cloneNode(true) as PageElement\n page.balanceDetailBox.appendChild(row)\n const tmpl = Doc.parseTemplate(row)\n tmpl.name.textContent = cat\n if (tooltipMsg) {\n tmpl.tooltipMsg.dataset.tooltip = tooltipMsg\n Doc.show(tmpl.tooltipMsg)\n }\n tmpl.balance.textContent = Doc.formatCoinValue(bal, ui)\n return row\n }\n\n let lastSubLockedRow: PageElement | undefined\n let lastPrimaryRow: PageElement | undefined\n const addPrimaryBalance = (cat: string, bal: number, tooltipMsg?: string) => {\n lastSubLockedRow = undefined\n lastPrimaryRow = addBalanceRow(cat, bal, tooltipMsg)\n }\n const addSubBalance = (cat: string, bal: number, tooltipMsg?: string) => {\n lastSubLockedRow = addBalanceRow(cat, bal, tooltipMsg)\n lastSubLockedRow.classList.add('sub')\n }\n const setRowClasses = () => {\n if (!lastSubLockedRow) return\n (lastPrimaryRow as PageElement).classList.add('itemized')\n lastSubLockedRow.classList.add('last')\n }\n\n addPrimaryBalance(intl.prep(intl.ID_AVAILABLE_TITLE), bal.available, '')\n if (bal.other?.Shielded !== undefined) {\n const transparent = bal.available - bal.other.Shielded.amt\n addSubBalance(intl.prep(intl.ID_TRANSPARENT), transparent)\n addSubBalance(intl.prep(intl.ID_SHIELDED), bal.other.Shielded.amt)\n }\n setRowClasses()\n\n addPrimaryBalance(intl.prep(intl.ID_LOCKED_TITLE), totalLocked, intl.prep(intl.ID_LOCKED_BAL_MSG))\n if (bal.orderlocked > 0) addSubBalance(intl.prep(intl.ID_ORDER), bal.orderlocked, intl.prep(intl.ID_LOCKED_ORDER_BAL_MSG))\n if (bal.contractlocked > 0) addSubBalance(intl.prep(intl.ID_SWAPPING), bal.contractlocked, intl.prep(intl.ID_LOCKED_SWAPPING_BAL_MSG))\n if (bal.bondlocked > 0) addSubBalance(intl.prep(intl.ID_BONDED), bal.bondlocked, intl.prep(intl.ID_LOCKED_BOND_BAL_MSG))\n if (bal.bondReserves > 0) addSubBalance(intl.prep(intl.ID_BOND_RESERVES), bal.bondReserves, intl.prep(intl.ID_BOND_RESERVES_MSG))\n if (bal?.other?.Staked !== undefined) addSubBalance('Staked', bal.other.Staked.amt)\n setRowClasses()\n\n if (bal.immature) addPrimaryBalance(intl.prep(intl.ID_IMMATURE_TITLE), bal.immature, intl.prep(intl.ID_IMMATURE_BAL_MSG))\n if (bal?.other?.Unmixed !== undefined) addSubBalance('Unmixed', bal.other.Unmixed.amt)\n setRowClasses()\n\n // TODO: handle reserves deficit with a notification.\n // if (bal.reservesDeficit > 0) addPrimaryBalance(intl.prep(intl.ID_RESERVES_DEFICIT), bal.reservesDeficit, intl.prep(intl.ID_RESERVES_DEFICIT_MSG))\n\n page.purchaserBal.textContent = Doc.formatFourSigFigs(bal.available / ui.conventional.conversionFactor)\n app().bindTooltips(page.balanceDetailBox)\n }\n\n showAvailableMarkets (assetID: number) {\n const page = this.page\n const exchanges = app().user.exchanges\n const markets: [string, Exchange, Market][] = []\n for (const xc of Object.values(exchanges)) {\n if (!xc.markets) continue\n for (const mkt of Object.values(xc.markets)) {\n if (mkt.baseid === assetID || mkt.quoteid === assetID) markets.push([xc.host, xc, mkt])\n }\n }\n\n const spotVolume = (assetID: number, mkt: Market): number => {\n const spot = mkt.spot\n if (!spot) return 0\n const conversionFactor = app().unitInfo(assetID).conventional.conversionFactor\n const volume = assetID === mkt.baseid ? spot.vol24 : spot.vol24 * spot.rate / OrderUtil.RateEncodingFactor\n return volume / conversionFactor\n }\n\n markets.sort((a: [string, Exchange, Market], b: [string, Exchange, Market]): number => {\n const [hostA,, mktA] = a\n const [hostB,, mktB] = b\n if (!mktA.spot && !mktB.spot) return hostA.localeCompare(hostB)\n return spotVolume(assetID, mktB) - spotVolume(assetID, mktA)\n })\n Doc.empty(page.availableMarkets)\n\n for (const [host, xc, mkt] of markets) {\n const { spot, baseid, basesymbol, quoteid, quotesymbol } = mkt\n const row = page.marketRow.cloneNode(true) as PageElement\n page.availableMarkets.appendChild(row)\n const tmpl = Doc.parseTemplate(row)\n tmpl.host.textContent = host\n tmpl.baseLogo.src = Doc.logoPath(basesymbol)\n tmpl.quoteLogo.src = Doc.logoPath(quotesymbol)\n Doc.empty(tmpl.baseSymbol, tmpl.quoteSymbol)\n tmpl.baseSymbol.appendChild(Doc.symbolize(xc.assets[baseid], true))\n tmpl.quoteSymbol.appendChild(Doc.symbolize(xc.assets[quoteid], true))\n\n if (spot) {\n const convRate = app().conventionalRate(baseid, quoteid, spot.rate, exchanges[host])\n tmpl.price.textContent = Doc.formatFourSigFigs(convRate)\n const fmtSymbol = (s: string) => s.split('.')[0].toUpperCase()\n tmpl.priceQuoteUnit.textContent = fmtSymbol(quotesymbol)\n tmpl.priceBaseUnit.textContent = fmtSymbol(basesymbol)\n tmpl.volume.textContent = Doc.formatFourSigFigs(spotVolume(assetID, mkt))\n tmpl.volumeUnit.textContent = assetID === baseid ? fmtSymbol(basesymbol) : fmtSymbol(quotesymbol)\n } else Doc.hide(tmpl.priceBox, tmpl.volumeBox)\n Doc.bind(row, 'click', () => app().loadPage('markets', { host, baseID: baseid, quoteID: quoteid }))\n }\n page.marketsOverviewBox.classList.remove('invisible')\n }\n\n async showRecentActivity (assetID: number) {\n const page = this.page\n const loaded = app().loading(page.orderActivityBox)\n const filter: OrderFilter = {\n n: 20,\n assets: [assetID],\n hosts: [],\n statuses: []\n }\n const res = await postJSON('/api/orders', filter)\n loaded()\n Doc.hide(page.noActivity, page.orderActivity)\n if (!res.orders || res.orders.length === 0) {\n Doc.show(page.noActivity)\n page.orderActivityBox.classList.remove('invisible')\n return\n }\n Doc.show(page.orderActivity)\n Doc.empty(page.recentOrders)\n for (const ord of (res.orders as Order[])) {\n const row = page.recentOrderTmpl.cloneNode(true) as PageElement\n page.recentOrders.appendChild(row)\n const tmpl = Doc.parseTemplate(row)\n let from: SupportedAsset, to: SupportedAsset\n const [baseUnitInfo, quoteUnitInfo] = [app().unitInfo(ord.baseID), app().unitInfo(ord.quoteID)]\n if (ord.sell) {\n [from, to] = [app().assets[ord.baseID], app().assets[ord.quoteID]]\n tmpl.fromQty.textContent = Doc.formatCoinValue(ord.qty, baseUnitInfo)\n if (ord.type === OrderUtil.Limit) {\n tmpl.toQty.textContent = Doc.formatCoinValue(ord.qty / OrderUtil.RateEncodingFactor * ord.rate, quoteUnitInfo)\n }\n } else {\n [from, to] = [app().assets[ord.quoteID], app().assets[ord.baseID]]\n if (ord.type === OrderUtil.Market) {\n tmpl.fromQty.textContent = Doc.formatCoinValue(ord.qty, baseUnitInfo)\n } else {\n tmpl.fromQty.textContent = Doc.formatCoinValue(ord.qty / OrderUtil.RateEncodingFactor * ord.rate, quoteUnitInfo)\n tmpl.toQty.textContent = Doc.formatCoinValue(ord.qty, baseUnitInfo)\n }\n }\n\n tmpl.fromLogo.src = Doc.logoPath(from.symbol)\n Doc.empty(tmpl.fromSymbol, tmpl.toSymbol)\n tmpl.fromSymbol.appendChild(Doc.symbolize(from, true))\n tmpl.toLogo.src = Doc.logoPath(to.symbol)\n tmpl.toSymbol.appendChild(Doc.symbolize(to, true))\n tmpl.status.textContent = OrderUtil.statusString(ord)\n tmpl.filled.textContent = `${(OrderUtil.filled(ord) / ord.qty * 100).toFixed(1)}%`\n tmpl.age.textContent = Doc.timeSince(ord.submitTime)\n tmpl.link.href = `order/${ord.id}`\n app().bindInternalNavigation(row)\n }\n page.orderActivityBox.classList.remove('invisible')\n }\n\n updateTxHistoryRow (row: PageElement, tx: WalletTransaction, assetID: number) {\n const tmpl = Doc.parseTemplate(row)\n let amtAssetID = assetID\n let feesAssetID = assetID\n if (tx.tokenID) {\n amtAssetID = tx.tokenID\n if (assetID !== tx.tokenID) feesAssetID = assetID\n else {\n const asset = app().assets[assetID]\n if (asset.token) feesAssetID = asset.token.parentID\n else console.error(`unable to determine fee asset for tx ${tx.id}`)\n }\n }\n const amtAssetUI = app().unitInfo(amtAssetID)\n const feesAssetUI = app().unitInfo(feesAssetID)\n tmpl.age.textContent = Doc.timeSince(tx.timestamp * 1000)\n tmpl.age.dataset.timestamp = String(tx.timestamp * 1000)\n Doc.setVis(tx.timestamp === 0, tmpl.pending)\n Doc.setVis(tx.timestamp !== 0, tmpl.age)\n if (tx.timestamp > 0) tmpl.age.dataset.stamp = String(tx.timestamp)\n let txType = txTypeString(tx.type)\n if (tx.tokenID && tx.tokenID !== assetID) {\n const tokenAsset = app().assets[tx.tokenID]\n const tokenSymbol = tokenAsset.unitInfo.conventional.unit\n txType = `${tokenSymbol} ${txType}`\n }\n tmpl.type.textContent = txType\n tmpl.id.textContent = trimStringWithEllipsis(tx.id, 12)\n tmpl.id.setAttribute('title', tx.id)\n tmpl.fees.textContent = Doc.formatCoinValue(tx.fees, feesAssetUI)\n if (noAmtTxTypes.includes(tx.type)) {\n tmpl.amount.textContent = '-'\n } else {\n const [u, c] = txTypeSignAndClass(tx.type)\n const amt = Doc.formatCoinValue(tx.amount, amtAssetUI)\n tmpl.amount.textContent = `${u}${amt}`\n if (c !== '') tmpl.amount.classList.add(c)\n }\n }\n\n txHistoryRow (tx: WalletTransaction, assetID: number) : PageElement {\n const row = this.page.txHistoryRowTmpl.cloneNode(true) as PageElement\n row.dataset.txid = tx.id\n Doc.bind(row, 'click', () => this.showTxDetailsPopup(tx.id))\n this.updateTxHistoryRow(row, tx, assetID)\n const tmpl = Doc.parseTemplate(row)\n this.stampers.push(tmpl.age)\n return row\n }\n\n txHistoryDateRow (date: string) : PageElement {\n const row = this.page.txHistoryDateRowTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(row)\n tmpl.date.textContent = date\n return row\n }\n\n setTxDetailsPopupElements (tx: WalletTransaction) {\n const page = this.page\n\n // Block explorer\n const assetExplorer = CoinExplorers[this.selectedAssetID]\n if (assetExplorer && assetExplorer[net]) {\n page.txViewBlockExplorer.href = assetExplorer[net](tx.id)\n }\n\n // Tx type\n let txType = txTypeString(tx.type)\n if (tx.tokenID && tx.tokenID !== this.selectedAssetID) {\n const tokenSymbol = app().assets[tx.tokenID].symbol.split('.')[0].toUpperCase()\n txType = `${tokenSymbol} ${txType}`\n }\n page.txDetailsType.textContent = txType\n Doc.setVis(tx.type === txTypeSwapOrSend, page.txTypeTooltip)\n page.txTypeTooltip.dataset.tooltip = intl.prep(intl.ID_SWAP_OR_SEND_TOOLTIP)\n\n // Amount\n if (noAmtTxTypes.includes(tx.type)) {\n Doc.hide(page.txDetailsAmtSection)\n } else {\n let assetID = this.selectedAssetID\n if (tx.tokenID) assetID = tx.tokenID\n Doc.show(page.txDetailsAmtSection)\n const ui = app().unitInfo(assetID)\n const amt = Doc.formatCoinValue(tx.amount, ui)\n const [s, c] = txTypeSignAndClass(tx.type)\n page.txDetailsAmount.textContent = `${s}${amt} ${ui.conventional.unit}`\n if (c !== '') page.txDetailsAmount.classList.add(c)\n }\n\n // Fee\n let feeAsset = this.selectedAssetID\n if (tx.tokenID !== undefined) {\n const asset = app().assets[tx.tokenID]\n if (asset.token) {\n feeAsset = asset.token.parentID\n } else {\n console.error(`wallet transaction ${tx.id} is supposed to be a token tx, but asset ${tx.tokenID} is not a token`)\n }\n }\n const feeUI = app().unitInfo(feeAsset)\n const fee = Doc.formatCoinValue(tx.fees, feeUI)\n page.txDetailsFee.textContent = `${fee} ${feeUI.conventional.unit}`\n\n // Time / block number\n page.txDetailsBlockNumber.textContent = `${tx.blockNumber}`\n const date = new Date(tx.timestamp * 1000)\n const dateStr = date.toLocaleDateString()\n const timeStr = date.toLocaleTimeString()\n page.txDetailsTimestamp.textContent = `${dateStr} ${timeStr}`\n Doc.setVis(tx.blockNumber === 0, page.timestampPending, page.blockNumberPending)\n Doc.setVis(tx.blockNumber !== 0, page.txDetailsBlockNumber, page.txDetailsTimestamp)\n\n // Tx ID\n page.txDetailsID.textContent = trimStringWithEllipsis(tx.id, 20)\n page.txDetailsID.setAttribute('title', tx.id)\n\n // Recipient\n if (tx.recipient) {\n Doc.show(page.txDetailsRecipientSection)\n page.txDetailsRecipient.textContent = trimStringWithEllipsis(tx.recipient, 20)\n page.txDetailsRecipient.setAttribute('title', tx.recipient)\n } else {\n Doc.hide(page.txDetailsRecipientSection)\n }\n\n // Bond Info\n if (tx.bondInfo) {\n Doc.show(page.txDetailsBondIDSection, page.txDetailsBondLocktimeSection)\n Doc.setVis(tx.bondInfo.accountID !== '', page.txDetailsBondAccountIDSection)\n page.txDetailsBondID.textContent = trimStringWithEllipsis(tx.bondInfo.bondID, 20)\n page.txDetailsBondID.setAttribute('title', tx.bondInfo.bondID)\n const date = new Date(tx.bondInfo.lockTime * 1000)\n const dateStr = date.toLocaleDateString()\n const timeStr = date.toLocaleTimeString()\n page.txDetailsBondLocktime.textContent = `${dateStr} ${timeStr}`\n page.txDetailsBondAccountID.textContent = trimStringWithEllipsis(tx.bondInfo.accountID, 20)\n page.txDetailsBondAccountID.setAttribute('title', tx.bondInfo.accountID)\n } else {\n Doc.hide(page.txDetailsBondIDSection, page.txDetailsBondLocktimeSection, page.txDetailsBondAccountIDSection)\n }\n\n // Nonce\n if (tx.additionalData && tx.additionalData.Nonce) {\n Doc.show(page.txDetailsNonceSection)\n page.txDetailsNonce.textContent = `${tx.additionalData.Nonce}`\n } else {\n Doc.hide(page.txDetailsNonceSection)\n }\n }\n\n showTxDetailsPopup (id: string) {\n const tx = app().getWalletTx(this.selectedAssetID, id)\n if (!tx) {\n console.error(`wallet transaction ${id} not found`)\n return\n }\n this.currTx = tx\n this.setTxDetailsPopupElements(tx)\n this.showForm(this.page.txDetails)\n }\n\n txHistoryTableNewestDate () : string {\n if (this.page.txHistoryTableBody.children.length >= 1) {\n const tmpl = Doc.parseTemplate(this.page.txHistoryTableBody.children[0] as PageElement)\n return tmpl.date.textContent || ''\n }\n return ''\n }\n\n txDate (tx: WalletTransaction) : string {\n if (tx.timestamp === 0) {\n return (new Date()).toLocaleDateString()\n }\n return (new Date(tx.timestamp * 1000)).toLocaleDateString()\n }\n\n handleTxNote (tx: WalletTransaction, newTx: boolean) {\n const w = app().assets[this.selectedAssetID].wallet\n const hideMixing = (w.traits & traitFundsMixer) !== 0 && !!this.page.hideMixTxs.checked\n if (hideMixing && tx.type === txTypeMixing) return\n if (newTx) {\n if (!this.oldestTx) {\n Doc.show(this.page.txHistoryTable)\n Doc.hide(this.page.noTxHistory)\n this.page.txHistoryTableBody.appendChild(this.txHistoryDateRow(this.txDate(tx)))\n this.page.txHistoryTableBody.appendChild(this.txHistoryRow(tx, this.selectedAssetID))\n this.oldestTx = tx\n } else if (this.txDate(tx) !== this.txHistoryTableNewestDate()) {\n this.page.txHistoryTableBody.insertBefore(this.txHistoryRow(tx, this.selectedAssetID), this.page.txHistoryTableBody.children[0])\n this.page.txHistoryTableBody.insertBefore(this.txHistoryDateRow(this.txDate(tx)), this.page.txHistoryTableBody.children[0])\n } else {\n this.page.txHistoryTableBody.insertBefore(this.txHistoryRow(tx, this.selectedAssetID), this.page.txHistoryTableBody.children[1])\n }\n return\n }\n for (const row of this.page.txHistoryTableBody.children) {\n const peRow = row as PageElement\n if (peRow.dataset.txid === tx.id) {\n this.updateTxHistoryRow(peRow, tx, this.selectedAssetID)\n break\n }\n }\n if (tx.id === this.currTx?.id) {\n this.setTxDetailsPopupElements(tx)\n }\n }\n\n async getTxHistory (assetID: number, hideMixTxs: boolean, after?: string) : Promise<TxHistoryResult> {\n let numToFetch = 10\n if (hideMixTxs) numToFetch = 15\n\n const res : TxHistoryResult = { txs: [], lastTx: false }\n let ref = after\n\n for (let i = 0; i < 40; i++) {\n const currRes = await app().txHistory(assetID, numToFetch, ref)\n if (currRes.txs.length > 0) {\n ref = currRes.txs[currRes.txs.length - 1].id\n }\n let txs = currRes.txs\n if (hideMixTxs) {\n txs = txs.filter((tx) => tx.type !== txTypeMixing)\n }\n if (res.txs.length + txs.length > 10) {\n const numToPush = 10 - res.txs.length\n res.txs.push(...txs.slice(0, numToPush))\n } else {\n if (currRes.lastTx) res.lastTx = true\n res.txs.push(...txs)\n }\n if (res.txs.length >= 10 || currRes.lastTx) break\n }\n return res\n }\n\n async showTxHistory (assetID: number) {\n const page = this.page\n let txRes : TxHistoryResult\n Doc.hide(page.txHistoryTable, page.txHistoryBox, page.noTxHistory, page.earlierTxs, page.txHistoryNotAvailable, page.hideMixTxs)\n Doc.empty(page.txHistoryTableBody)\n const w = app().assets[assetID].wallet\n if (!w || w.disabled || (w.traits & traitHistorian) === 0) {\n Doc.show(page.txHistoryNotAvailable)\n return\n }\n\n this.oldestTx = undefined\n\n const isMixing = (w.traits & traitFundsMixer) !== 0\n Doc.setVis(isMixing, page.hideMixTxs)\n Doc.show(page.txHistoryBox)\n\n try {\n const hideMixing = isMixing && !!page.hideMixTxsCheckbox.checked\n txRes = await this.getTxHistory(assetID, hideMixing)\n } catch (err) {\n Doc.show(page.noTxHistory)\n return\n }\n if (txRes.txs.length === 0) {\n Doc.show(page.noTxHistory)\n return\n }\n\n let oldestDate = this.txDate(txRes.txs[0])\n page.txHistoryTableBody.appendChild(this.txHistoryDateRow(oldestDate))\n for (const tx of txRes.txs) {\n const date = this.txDate(tx)\n if (date !== oldestDate) {\n oldestDate = date\n page.txHistoryTableBody.appendChild(this.txHistoryDateRow(date))\n }\n const row = this.txHistoryRow(tx, assetID)\n page.txHistoryTableBody.appendChild(row)\n }\n this.oldestTx = txRes.txs[txRes.txs.length - 1]\n Doc.show(page.txHistoryTable)\n Doc.setVis(!txRes.lastTx, page.earlierTxs)\n }\n\n async loadEarlierTxs () {\n if (!this.oldestTx) return\n const page = this.page\n let txRes : TxHistoryResult\n const w = app().assets[this.selectedAssetID].wallet\n const hideMixing = (w.traits & traitFundsMixer) !== 0 && !!page.hideMixTxsCheckbox.checked\n try {\n txRes = await this.getTxHistory(this.selectedAssetID, hideMixing, this.oldestTx.id)\n } catch (err) {\n console.error(err)\n return\n }\n let oldestDate = this.txDate(this.oldestTx)\n for (const tx of txRes.txs) {\n const date = this.txDate(tx)\n if (date !== oldestDate) {\n oldestDate = date\n page.txHistoryTableBody.appendChild(this.txHistoryDateRow(date))\n }\n const row = this.txHistoryRow(tx, this.selectedAssetID)\n page.txHistoryTableBody.appendChild(row)\n }\n Doc.setVis(!txRes.lastTx, page.earlierTxs)\n if (txRes.txs.length > 0) {\n this.oldestTx = txRes.txs[txRes.txs.length - 1]\n }\n }\n\n async rescanWallet (assetID: number) {\n const page = this.page\n Doc.hide(page.reconfigErr)\n\n const url = '/api/rescanwallet'\n const req = { assetID: assetID }\n\n const loaded = app().loading(this.body)\n const res = await postJSON(url, req)\n loaded()\n if (res.code === Errors.activeOrdersErr) {\n this.forceUrl = url\n this.forceReq = req\n this.showConfirmForce()\n return\n }\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.reconfigErr, res.msg)\n return\n }\n this.assetUpdated(assetID, page.reconfigForm, intl.prep(intl.ID_RESCAN_STARTED))\n }\n\n showConfirmForce () {\n Doc.hide(this.page.confirmForceErr)\n this.showForm(this.page.confirmForce)\n }\n\n showRecoverWallet () {\n Doc.hide(this.page.recoverWalletErr)\n this.showForm(this.page.recoverWalletConfirm)\n }\n\n /* Show the open wallet form if the password is not cached, and otherwise\n * attempt to open the wallet.\n */\n async openWallet (assetID: number) {\n const open = {\n assetID: assetID\n }\n const res = await postJSON('/api/openwallet', open)\n if (!app().checkResponse(res)) {\n console.error('openwallet error', res)\n return\n }\n this.assetUpdated(assetID, undefined, intl.prep(intl.ID_WALLET_UNLOCKED))\n }\n\n /* Show the form used to change wallet configuration settings. */\n async showReconfig (assetID: number, cfg?: reconfigSettings) {\n const page = this.page\n Doc.hide(\n page.changeWalletType, page.changeTypeHideIcon, page.reconfigErr,\n page.showChangeType, page.changeTypeHideIcon, page.reconfigErr,\n page.enableWallet, page.disableWallet\n )\n // Hide update password section by default\n this.changeWalletPW = false\n this.setPWSettingViz(this.changeWalletPW)\n const asset = app().assets[assetID]\n\n const currentDef = app().currentWalletDefinition(assetID)\n const walletDefs = asset.token ? [asset.token.definition] : asset.info ? asset.info.availablewallets : []\n const disableWalletType = app().extensionWallet(assetID)?.disableWalletType\n if (walletDefs.length > 1 && !disableWalletType) {\n Doc.empty(page.changeWalletTypeSelect)\n Doc.show(page.showChangeType, page.changeTypeShowIcon)\n page.changeTypeMsg.textContent = intl.prep(intl.ID_CHANGE_WALLET_TYPE)\n for (const wDef of walletDefs) {\n const option = document.createElement('option') as HTMLOptionElement\n if (wDef.type === currentDef.type) option.selected = true\n option.value = option.textContent = wDef.type\n page.changeWalletTypeSelect.appendChild(option)\n }\n }\n\n if (cfg?.elevateProviders) {\n for (const opt of (currentDef.configopts)) if (opt.key === 'providers') opt.required = true\n }\n\n const wallet = app().walletMap[assetID]\n Doc.setVis(wallet.traits & traitLogFiler, page.downloadLogs)\n Doc.setVis(wallet.traits & traitRecoverer, page.recoverWallet)\n Doc.setVis(wallet.traits & traitRestorer, page.exportWallet)\n Doc.setVis(wallet.traits & traitRescanner, page.rescanWallet)\n Doc.setVis(wallet.traits & traitPeerManager && !wallet.disabled, page.managePeers)\n Doc.setVis(wallet.traits & traitTokenApprover && !wallet.disabled, page.unapproveTokenAllowance)\n\n Doc.setVis(wallet.traits & traitsExtraOpts, page.otherActionsLabel)\n\n if (wallet.disabled) Doc.show(page.enableWallet)\n else Doc.show(page.disableWallet)\n\n this.showOrHideRecoverySupportMsg(wallet, currentDef.seeded)\n\n page.recfgAssetLogo.src = Doc.logoPath(asset.symbol)\n page.recfgAssetName.textContent = asset.name\n if (!cfg?.skipAnimation) this.showForm(page.reconfigForm)\n const loaded = app().loading(page.reconfigForm)\n const res = await postJSON('/api/walletsettings', { assetID })\n loaded()\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.reconfigErr, res.msg)\n return\n }\n const assetHasActiveOrders = app().haveActiveOrders(assetID)\n this.reconfigForm.update(asset.id, currentDef.configopts || [], assetHasActiveOrders)\n this.setGuideLink(currentDef.guidelink)\n this.reconfigForm.setConfig(res.map)\n this.updateDisplayedReconfigFields(currentDef)\n }\n\n showOrHideRecoverySupportMsg (wallet: WalletState, seeded: boolean) {\n this.setRecoverySupportMsgViz(seeded && !wallet.running && !wallet.disabled && Boolean(wallet.traits & traitRecoverer), wallet.symbol)\n }\n\n setRecoverySupportMsgViz (viz: boolean, symbol: string) {\n const page = this.page\n if (viz) {\n page.reconfigSupportMsg.textContent = intl.prep(intl.ID_WALLET_RECOVERY_SUPPORT_MSG, { walletSymbol: symbol.toLocaleUpperCase() })\n Doc.show(page.reconfigSupportMsg)\n page.submitReconfig.setAttribute('disabled', '')\n page.submitReconfig.classList.add('grey')\n return\n }\n page.submitReconfig.removeAttribute('disabled')\n page.submitReconfig.classList.remove('grey')\n Doc.empty(page.reconfigSupportMsg)\n Doc.hide(page.reconfigSupportMsg)\n }\n\n changeWalletType () {\n const page = this.page\n const walletType = page.changeWalletTypeSelect.value || ''\n const walletDef = app().walletDefinition(this.selectedAssetID, walletType)\n this.reconfigForm.update(this.selectedAssetID, walletDef.configopts || [], false)\n const wallet = app().walletMap[this.selectedAssetID]\n const currentDef = app().currentWalletDefinition(this.selectedAssetID)\n if (walletDef.type !== currentDef.type) this.setRecoverySupportMsgViz(false, wallet.symbol)\n else this.showOrHideRecoverySupportMsg(wallet, walletDef.seeded)\n this.setGuideLink(walletDef.guidelink)\n this.updateDisplayedReconfigFields(walletDef)\n }\n\n setGuideLink (guideLink: string) {\n Doc.hide(this.walletCfgGuide)\n if (guideLink !== '') {\n this.walletCfgGuide.href = guideLink\n Doc.show(this.walletCfgGuide)\n }\n }\n\n updateDisplayedReconfigFields (walletDef: WalletDefinition) {\n const disablePassword = app().extensionWallet(this.selectedAssetID)?.disablePassword\n if (walletDef.seeded || walletDef.type === 'token' || disablePassword) {\n Doc.hide(this.page.showChangePW, this.reconfigForm.fileSelector)\n this.changeWalletPW = false\n this.setPWSettingViz(false)\n } else Doc.show(this.page.showChangePW, this.reconfigForm.fileSelector)\n }\n\n /* Display a deposit address. */\n async showDeposit (assetID: number) {\n this.depositAddrForm.setAsset(assetID)\n this.showForm(this.page.deposit)\n }\n\n /* Show the form to either send or withdraw funds. */\n async showSendForm (assetID: number) {\n const page = this.page\n const box = page.sendForm\n const { wallet, unitInfo: ui, symbol, token } = app().assets[assetID]\n Doc.hide(page.toggleSubtract)\n page.subtractCheckBox.checked = false\n\n const isWithdrawer = (wallet.traits & traitWithdrawer) !== 0\n if (isWithdrawer) {\n Doc.show(page.toggleSubtract)\n }\n\n Doc.hide(page.sendErr, page.maxSendDisplay, page.sendTokenMsgBox)\n page.sendAddr.classList.remove('border-danger', 'border-success')\n page.sendAddr.value = ''\n page.sendAmt.value = ''\n const xcRate = app().fiatRatesMap[assetID]\n Doc.showFiatValue(page.sendValue, 0, xcRate, ui)\n page.walletBal.textContent = Doc.formatFullPrecision(wallet.balance.available, ui)\n page.sendLogo.src = Doc.logoPath(symbol)\n page.sendName.textContent = ui.conventional.unit\n if (token) {\n const parentAsset = app().assets[token.parentID]\n page.sendTokenParentLogo.src = Doc.logoPath(parentAsset.symbol)\n page.sendTokenParentName.textContent = parentAsset.name\n Doc.show(page.sendTokenMsgBox)\n }\n // page.sendFee.textContent = wallet.feerate\n // page.sendUnit.textContent = wallet.units\n\n if (wallet.balance.available > 0 && (wallet.traits & traitTxFeeEstimator) !== 0) {\n const feeReq = {\n assetID: assetID,\n subtract: isWithdrawer,\n maxWithdraw: true,\n value: wallet.balance.available\n }\n\n const loaded = app().loading(this.body)\n const res = await postJSON('/api/txfee', feeReq)\n loaded()\n if (app().checkResponse(res)) {\n let canSend = wallet.balance.available\n if (!token) {\n canSend -= res.txfee\n if (canSend < 0) canSend = 0\n }\n\n this.maxSend = canSend\n page.maxSend.textContent = Doc.formatFullPrecision(canSend, ui)\n Doc.showFiatValue(page.maxSendFiat, canSend, xcRate, ui)\n if (token) {\n const feeUI = app().assets[token.parentID].unitInfo\n page.maxSendFee.textContent = Doc.formatFullPrecision(res.txfee, feeUI) + ' ' + feeUI.conventional.unit\n Doc.showFiatValue(page.maxSendFeeFiat, res.txfee, app().fiatRatesMap[token.parentID], feeUI)\n } else {\n page.maxSendFee.textContent = Doc.formatFullPrecision(res.txfee, ui)\n Doc.showFiatValue(page.maxSendFeeFiat, res.txfee, xcRate, ui)\n }\n Doc.show(page.maxSendDisplay)\n }\n }\n\n Doc.showFiatValue(page.sendValue, 0, xcRate, ui)\n page.walletBal.textContent = Doc.formatFullPrecision(wallet.balance.available, ui)\n box.dataset.assetID = String(assetID)\n this.showForm(box)\n }\n\n /* doConnect connects to a wallet via the connectwallet API route. */\n async doConnect (assetID: number) {\n const loaded = app().loading(this.body)\n const res = await postJSON('/api/connectwallet', { assetID })\n loaded()\n if (!app().checkResponse(res)) {\n const { symbol } = app().assets[assetID]\n const page = this.page\n page.errorModalMsg.textContent = intl.prep(intl.ID_CONNECT_WALLET_ERR_MSG, { assetName: symbol, errMsg: res.msg })\n this.showForm(page.errorModal)\n }\n this.updateDisplayedAsset(assetID)\n }\n\n assetUpdated (assetID: number, oldForm?: PageElement, successMsg?: string) {\n if (assetID !== this.selectedAssetID) return\n this.updateDisplayedAsset(assetID)\n if (oldForm && Object.is(this.currentForm, oldForm)) {\n if (successMsg) this.showSuccess(successMsg)\n else this.closePopups()\n }\n }\n\n /* populateMaxSend populates the amount field with the max amount the wallet\n can send. The max send amount can be the maximum amount based on our\n pre-estimation or the asset's wallet balance.\n */\n async populateMaxSend () {\n const page = this.page\n const { id: assetID, unitInfo: ui, wallet } = app().assets[this.selectedAssetID]\n // Populate send amount with max send value and ensure we don't check\n // subtract checkbox for assets that don't have a withdraw method.\n const xcRate = app().fiatRatesMap[assetID]\n if ((wallet.traits & traitWithdrawer) === 0) {\n page.sendAmt.value = String(this.maxSend / ui.conventional.conversionFactor)\n Doc.showFiatValue(page.sendValue, this.maxSend, xcRate, ui)\n page.subtractCheckBox.checked = false\n } else {\n const amt = wallet.balance.available\n page.sendAmt.value = String(amt / ui.conventional.conversionFactor)\n Doc.showFiatValue(page.sendValue, amt, xcRate, ui)\n page.subtractCheckBox.checked = true\n }\n }\n\n /* send submits the send form to the API. */\n async send (): Promise<void> {\n const page = this.page\n const assetID = parseInt(page.sendForm.dataset.assetID ?? '')\n const subtract = page.subtractCheckBox.checked ?? false\n const conversionFactor = app().unitInfo(assetID).conventional.conversionFactor\n const pw = page.vSendPw.value || ''\n page.vSendPw.value = ''\n if (pw === '') {\n Doc.showFormError(page.vSendErr, intl.prep(intl.ID_NO_PASS_ERROR_MSG))\n return\n }\n const open = {\n assetID: assetID,\n address: page.sendAddr.value,\n subtract: subtract,\n value: Math.round(parseFloatDefault(page.sendAmt.value) * conversionFactor),\n pw: pw\n }\n const loaded = app().loading(page.vSendForm)\n const res = await postJSON('/api/send', open)\n loaded()\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.vSendErr, res.msg)\n return\n }\n const name = app().assets[assetID].name\n this.assetUpdated(assetID, page.vSendForm, intl.prep(intl.ID_SEND_SUCCESS, { assetName: name }))\n }\n\n /* update wallet configuration */\n async reconfig (): Promise<void> {\n const page = this.page\n const assetID = this.selectedAssetID\n Doc.hide(page.reconfigErr)\n let walletType = app().currentWalletDefinition(assetID).type\n if (!Doc.isHidden(page.changeWalletType)) {\n walletType = page.changeWalletTypeSelect.value || ''\n }\n\n const loaded = app().loading(page.reconfigForm)\n const req: ReconfigRequest = {\n assetID: assetID,\n config: this.reconfigForm.map(assetID),\n walletType: walletType\n }\n if (this.changeWalletPW) req.newWalletPW = page.newPW.value\n const res = await this.safePost('/api/reconfigurewallet', req)\n page.newPW.value = ''\n loaded()\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.reconfigErr, res.msg)\n return\n }\n if (this.data?.goBack) {\n app().loadPage(this.data.goBack)\n return\n }\n this.assetUpdated(assetID, page.reconfigForm, intl.prep(intl.ID_RECONFIG_SUCCESS))\n this.updateTicketBuyer(assetID)\n app().clearTxHistory(assetID)\n this.showTxHistory(assetID)\n this.updatePrivacy(assetID)\n this.checkNeedsProvider(assetID)\n }\n\n /* lock instructs the API to lock the wallet. */\n async lock (assetID: number): Promise<void> {\n const page = this.page\n const loaded = app().loading(page.newWalletForm)\n const res = await postJSON('/api/closewallet', { assetID: assetID })\n loaded()\n if (!app().checkResponse(res)) return\n this.updateDisplayedAsset(assetID)\n this.updatePrivacy(assetID)\n }\n\n async downloadLogs (): Promise<void> {\n const search = new URLSearchParams('')\n search.append('assetid', `${this.selectedAssetID}`)\n const url = new URL(window.location.href)\n url.search = search.toString()\n url.pathname = '/wallets/logfile'\n window.open(url.toString())\n }\n\n // displayExportWalletAuth displays a form to warn the user about the\n // dangers of exporting a wallet, and asks them to enter their password.\n async displayExportWalletAuth (): Promise<void> {\n const page = this.page\n Doc.hide(page.exportWalletErr)\n page.exportWalletPW.value = ''\n this.showForm(page.exportWalletAuth)\n }\n\n // exportWalletAuthSubmit is called after the user enters their password to\n // authorize looking up the information to restore their wallet in an\n // external wallet.\n async exportWalletAuthSubmit (): Promise<void> {\n const page = this.page\n const req = {\n assetID: this.selectedAssetID,\n pass: page.exportWalletPW.value\n }\n const url = '/api/restorewalletinfo'\n const loaded = app().loading(page.forms)\n const res = await postJSON(url, req)\n loaded()\n if (app().checkResponse(res)) {\n page.exportWalletPW.value = ''\n this.displayRestoreWalletInfo(res.restorationinfo)\n } else {\n Doc.showFormError(page.exportWalletErr, res.msg)\n }\n }\n\n // displayRestoreWalletInfo displays the information needed to restore a\n // wallet in external wallets.\n async displayRestoreWalletInfo (info: WalletRestoration[]): Promise<void> {\n const page = this.page\n Doc.empty(page.restoreInfoCardsList)\n for (const wr of info) {\n const card = this.restoreInfoCard.cloneNode(true) as HTMLElement\n const tmpl = Doc.parseTemplate(card)\n tmpl.name.textContent = wr.target\n tmpl.seed.textContent = wr.seed\n tmpl.seedName.textContent = `${wr.seedName}:`\n tmpl.instructions.textContent = wr.instructions\n page.restoreInfoCardsList.appendChild(card)\n }\n this.showForm(page.restoreWalletInfo)\n }\n\n async recoverWallet (): Promise<void> {\n const page = this.page\n Doc.hide(page.recoverWalletErr)\n const req = {\n assetID: this.selectedAssetID\n }\n const url = '/api/recoverwallet'\n const loaded = app().loading(page.forms)\n const res = await postJSON(url, req)\n loaded()\n if (res.code === Errors.activeOrdersErr) {\n this.forceUrl = url\n this.forceReq = req\n this.showConfirmForce()\n } else if (app().checkResponse(res)) {\n this.closePopups()\n } else {\n Doc.showFormError(page.recoverWalletErr, res.msg)\n }\n }\n\n /*\n * confirmForceSubmit resubmits either the recover or rescan requests with\n * force set to true. These two requests require force to be set to true if\n * they are called while the wallet is managing active orders.\n */\n async confirmForceSubmit (): Promise<void> {\n const page = this.page\n this.forceReq.force = true\n const loaded = app().loading(page.forms)\n const res = await postJSON(this.forceUrl, this.forceReq)\n loaded()\n if (app().checkResponse(res)) this.closePopups()\n else {\n Doc.showFormError(page.confirmForceErr, res.msg)\n }\n }\n\n /* handleBalance handles notifications updating a wallet's balance and assets'\n value in default fiat rate.\n . */\n handleBalanceNote (note: BalanceNote): void {\n this.updateAssetButton(note.assetID)\n if (note.assetID === this.selectedAssetID) this.updateDisplayedAssetBalance()\n }\n\n /* handleRatesNote handles fiat rate notifications, updating the fiat value of\n * all supported assets.\n */\n handleRatesNote (note: RateNote): void {\n this.updateAssetButton(this.selectedAssetID)\n if (!note.fiatRates[this.selectedAssetID]) return\n this.updateDisplayedAssetBalance()\n const { feeState } = app().walletMap[this.selectedAssetID]\n if (feeState) this.updateFeeState(feeState)\n }\n\n /*\n * handleWalletStateNote is a handler for both the 'walletstate' and\n * 'walletconfig' notifications.\n */\n handleWalletStateNote (note: WalletStateNote): void {\n const { assetID, feeState } = note.wallet\n this.updateAssetButton(assetID)\n this.assetUpdated(assetID)\n if (note.topic === 'WalletPeersUpdate' &&\n assetID === this.selectedAssetID &&\n Doc.isDisplayed(this.page.managePeersForm)) {\n this.updateWalletPeersTable()\n }\n if (feeState && assetID === this.selectedAssetID) this.updateFeeState(feeState)\n }\n\n /*\n * handleCreateWalletNote is a handler for 'createwallet' notifications.\n */\n handleCreateWalletNote (note: WalletCreationNote) {\n this.updateAssetButton(note.assetID)\n this.assetUpdated(note.assetID)\n this.showTxHistory(note.assetID)\n }\n\n handleCustomWalletNote (note: WalletNote) {\n const walletNote = note.payload as BaseWalletNote\n switch (walletNote.route) {\n case 'tipChange': {\n const n = walletNote as TipChangeNote\n switch (n.assetID) {\n case 42: { // dcr\n if (!this.stakeStatus) return\n const data = n.data as DecredTicketTipUpdate\n const synced = app().walletMap[n.assetID].synced\n if (synced) {\n const ui = app().unitInfo(n.assetID)\n this.updateTicketStats(data.stats, ui, data.ticketPrice, data.votingSubsidy)\n }\n }\n }\n break\n }\n case 'ticketPurchaseUpdate': {\n this.processTicketPurchaseUpdate(walletNote as CustomWalletNote)\n break\n }\n case 'transaction': {\n const n = walletNote as TransactionNote\n if (n.assetID === this.selectedAssetID) this.handleTxNote(n.transaction, n.new)\n break\n }\n case 'transactionHistorySynced' : {\n const n = walletNote\n if (n.assetID === this.selectedAssetID) this.showTxHistory(n.assetID)\n break\n }\n }\n }\n\n /*\n * unload is called by the Application when the user navigates away from\n * the /wallets page.\n */\n unload (): void {\n clearInterval(this.secondTicker)\n Doc.unbind(document, 'keyup', this.keyup)\n }\n}\n\nfunction trimStringWithEllipsis (str: string, maxLen: number): string {\n if (str.length <= maxLen) return str\n return `${str.substring(0, maxLen / 2)}...${str.substring(str.length - maxLen / 2)}`\n}\n","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","import { CoreNote, PageElement } from './registry'\nimport * as intl from './locales'\nimport State from './state'\nimport { setCoinHref } from './coinexplorers'\nimport Doc from './doc'\n\nexport const IGNORE = 0\nexport const DATA = 1\nexport const POKE = 2\nexport const SUCCESS = 3\nexport const WARNING = 4\nexport const ERROR = 5\n\n/*\n * make constructs a new notification. The notification structure is a mirror of\n * the structure of notifications sent from the web server.\n * NOTE: I'm hoping to make this function obsolete, since errors generated in\n * javascript should usually be displayed/cached somewhere better. For example,\n * if the error is generated during submission of a form, the error should be\n * displayed on or near the form itself, not in the notifications.\n */\nexport function make (subject: string, details: string, severity: number): CoreNote {\n return {\n subject: subject,\n details: details,\n severity: severity,\n stamp: new Date().getTime(),\n acked: false,\n type: 'internal',\n topic: 'internal',\n id: ''\n }\n}\n\nconst NoteTypeOrder = 'order'\nconst NoteTypeMatch = 'match'\nconst NoteTypeBondPost = 'bondpost'\nconst NoteTypeConnEvent = 'conn'\n\ntype DesktopNtfnSettingLabel = {\n [x: string]: string\n}\n\nexport type DesktopNtfnSetting = {\n [x: string]: boolean\n}\n\nfunction desktopNtfnSettingsKey (): string {\n return `desktop_notifications-${window.location.host}`\n}\n\nexport const desktopNtfnLabels: DesktopNtfnSettingLabel = {\n [NoteTypeOrder]: intl.ID_BROWSER_NTFN_ORDERS,\n [NoteTypeMatch]: intl.ID_BROWSER_NTFN_MATCHES,\n [NoteTypeBondPost]: intl.ID_BROWSER_NTFN_BONDS,\n [NoteTypeConnEvent]: intl.ID_BROWSER_NTFN_CONNECTIONS\n}\n\nexport const defaultDesktopNtfnSettings: DesktopNtfnSetting = {\n [NoteTypeOrder]: true,\n [NoteTypeMatch]: true,\n [NoteTypeBondPost]: true,\n [NoteTypeConnEvent]: true\n}\n\nlet desktopNtfnSettings: DesktopNtfnSetting\n\n// BrowserNotifier is a wrapper around the browser's notification API.\nclass BrowserNotifier {\n static ntfnPermissionGranted (): boolean {\n return window.Notification.permission === 'granted'\n }\n\n static ntfnPermissionDenied (): boolean {\n return window.Notification.permission === 'denied'\n }\n\n static async requestNtfnPermission (): Promise<void> {\n if (!('Notification' in window)) {\n return\n }\n if (BrowserNotifier.ntfnPermissionGranted()) {\n BrowserNotifier.sendDesktopNotification(intl.prep(intl.ID_BROWSER_NTFN_ENABLED))\n } else if (!BrowserNotifier.ntfnPermissionDenied()) {\n await Notification.requestPermission()\n BrowserNotifier.sendDesktopNotification(intl.prep(intl.ID_BROWSER_NTFN_ENABLED))\n }\n }\n\n static async sendDesktopNotification (title: string, body?: string) {\n if (!BrowserNotifier.ntfnPermissionGranted()) return\n const ntfn = new window.Notification(title, {\n body: body,\n icon: '/img/softened-icon.png'\n })\n return ntfn\n }\n}\n\n// OSDesktopNotifier manages OS desktop notifications via the same interface\n// as BrowserNotifier, but sends notifications using an underlying Go\n// notification library exposed to the webview.\nclass OSDesktopNotifier {\n static ntfnPermissionGranted (): boolean {\n return true\n }\n\n static ntfnPermissionDenied (): boolean {\n return false\n }\n\n static async requestNtfnPermission (): Promise<void> {\n await OSDesktopNotifier.sendDesktopNotification(intl.prep(intl.ID_BROWSER_NTFN_ENABLED))\n return Promise.resolve()\n }\n\n static async sendDesktopNotification (title: string, body?: string): Promise<void> {\n // webview/linux or webview/windows\n if (isDesktopWebview()) await window.sendOSNotification(title, body)\n // webkit/darwin\n // See: client/cmd/bisonw-desktop/app_darwin.go#L673-#L697\n else if (isDesktopWebkit()) await window.webkit.messageHandlers.bwHandler.postMessage(['sendOSNotification', title, body])\n else console.error('sendDesktopNotification: unknown environment')\n }\n}\n\n// isDesktopWebview checks if we are running in webview\nfunction isDesktopWebview (): boolean {\n return window.isWebview !== undefined\n}\n\n// isDesktopDarwin returns true if we are running in a webview on darwin\n// It tests for the existence of the bwHandler webkit message handler.\nfunction isDesktopWebkit (): boolean {\n return window.webkit?.messageHandlers?.bwHandler !== undefined\n}\n\n// determine whether we're running in a webview or in browser, and export\n// the appropriate notifier accordingly.\nexport const Notifier = isDesktopWebview() || isDesktopWebkit() ? OSDesktopNotifier : BrowserNotifier\n\nexport async function desktopNotify (note: CoreNote) {\n if (!desktopNtfnSettings.browserNtfnEnabled || !desktopNtfnSettings[note.type]) return\n await Notifier.sendDesktopNotification(note.subject, plainNote(note.details))\n}\n\nexport function fetchDesktopNtfnSettings (): DesktopNtfnSetting {\n if (desktopNtfnSettings !== undefined) {\n return desktopNtfnSettings\n }\n const k = desktopNtfnSettingsKey()\n desktopNtfnSettings = (State.fetchLocal(k) ?? {}) as DesktopNtfnSetting\n return desktopNtfnSettings\n}\n\nexport function updateNtfnSetting (noteType: string, enabled: boolean) {\n fetchDesktopNtfnSettings()\n desktopNtfnSettings[noteType] = enabled\n State.storeLocal(desktopNtfnSettingsKey(), desktopNtfnSettings)\n}\n\nconst coinExplorerTokenRe = /\\{\\{\\{([^|]+)\\|([^}]+)\\}\\}\\}/g\nconst orderTokenRe = /\\{\\{\\{order\\|([^}]+)\\}\\}\\}/g\n\n/*\n * insertRichNote replaces tx and order hash tokens in the input string with\n * <a> elements that link to the asset's chain explorer and order details\n * view, and inserts the resulting HTML into the supplied parent element.\n */\nexport function insertRichNote (parent: PageElement, inputString: string) {\n const s = inputString.replace(orderTokenRe, (_match, orderToken) => {\n const link = document.createElement('a')\n link.setAttribute('href', '/order/' + orderToken)\n link.setAttribute('class', 'subtlelink')\n link.textContent = orderToken.slice(0, 8)\n return link.outerHTML\n }).replace(coinExplorerTokenRe, (_match, assetID, hash) => {\n const link = document.createElement('a')\n link.setAttribute('data-explorer-coin', hash)\n link.setAttribute('target', '_blank')\n link.textContent = hash.slice(0, 8)\n setCoinHref(assetID, link)\n return link.outerHTML\n })\n const els = Doc.noderize(s).body\n while (els.firstChild) parent.appendChild(els.firstChild)\n}\n\n/*\n * plainNote replaces tx and order hash tokens tokens in the input string with\n * shortened hashes, for rendering in browser notifications and popups.\n */\nexport function plainNote (inputString: string): string {\n const replacedString = inputString.replace(coinExplorerTokenRe, (_match, _assetID, hash) => {\n return hash.slice(0, 8)\n })\n return replacedString\n}\n","import Doc from './doc'\nimport BasePage from './basepage'\nimport State from './state'\nimport { postJSON } from './http'\nimport * as forms from './forms'\nimport * as intl from './locales'\nimport { setCoinHref } from './coinexplorers'\nimport {\n updateNtfnSetting,\n DesktopNtfnSetting,\n fetchDesktopNtfnSettings,\n desktopNtfnLabels,\n Notifier\n} from './notifications'\nimport {\n app,\n Exchange,\n PageElement,\n PrepaidBondID\n} from './registry'\n\nconst animationLength = 300\n\nexport default class SettingsPage extends BasePage {\n body: HTMLElement\n currentDEX: Exchange\n page: Record<string, PageElement>\n forms: PageElement[]\n fiatRateSources: PageElement[]\n regAssetForm: forms.FeeAssetSelectionForm\n confirmRegisterForm: forms.ConfirmRegistrationForm\n newWalletForm: forms.NewWalletForm\n walletWaitForm: forms.WalletWaitForm\n dexAddrForm: forms.DEXAddressForm\n appPassResetForm: forms.AppPassResetForm\n currentForm: PageElement\n keyup: (e: KeyboardEvent) => void\n\n constructor (body: HTMLElement) {\n super()\n this.body = body\n const page = this.page = Doc.idDescendants(body)\n\n this.forms = Doc.applySelector(page.forms, ':scope > form')\n this.fiatRateSources = Doc.applySelector(page.fiatRateSources, 'input[type=checkbox]')\n\n page.darkMode.checked = State.fetchLocal(State.darkModeLK) === '1'\n Doc.bind(page.darkMode, 'click', () => {\n State.storeLocal(State.darkModeLK, page.darkMode.checked || false ? '1' : '0')\n if (page.darkMode.checked) {\n document.body.classList.add('dark')\n } else {\n document.body.classList.remove('dark')\n }\n })\n\n page.showPokes.checked = State.fetchLocal(State.popupsLK) === '1'\n Doc.bind(page.showPokes, 'click', () => {\n const show = page.showPokes.checked || false\n State.storeLocal(State.popupsLK, show ? '1' : '0')\n app().showPopups = show\n })\n\n page.commitHash.textContent = app().commitHash.substring(0, 7)\n Doc.bind(page.addADex, 'click', () => {\n this.dexAddrForm.refresh()\n this.showForm(page.dexAddrForm)\n })\n\n this.fiatRateSources.forEach(src => {\n Doc.bind(src, 'change', async () => {\n const res = await postJSON('/api/toggleratesource', {\n disable: !src.checked,\n source: src.value\n })\n if (!app().checkResponse(res)) {\n src.checked = !src.checked\n }\n // Update asset rate values and disable conversion status.\n await app().fetchUser()\n })\n })\n\n // Asset selection\n this.regAssetForm = new forms.FeeAssetSelectionForm(page.regAssetForm, async (assetID: number, tier: number) => {\n if (assetID === PrepaidBondID) {\n await app().fetchUser()\n window.location.reload()\n return\n }\n const asset = app().assets[assetID]\n const wallet = asset.wallet\n if (wallet) {\n const bondAsset = this.currentDEX.bondAssets[asset.symbol]\n const bondsFeeBuffer = await this.getBondsFeeBuffer(assetID, page.regAssetForm)\n this.confirmRegisterForm.setAsset(assetID, tier, bondsFeeBuffer)\n if (wallet.synced && wallet.balance.available >= 2 * bondAsset.amount + bondsFeeBuffer) {\n this.animateConfirmForm(page.regAssetForm)\n return\n }\n this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)\n this.slideSwap(page.walletWait)\n return\n }\n\n this.confirmRegisterForm.setAsset(assetID, tier, 0)\n this.newWalletForm.setAsset(assetID)\n this.slideSwap(page.newWalletForm)\n })\n\n // Approve fee payment\n this.confirmRegisterForm = new forms.ConfirmRegistrationForm(page.confirmRegForm, () => {\n this.registerDEXSuccess()\n }, () => {\n this.animateRegAsset(page.confirmRegForm)\n })\n\n // Create a new wallet\n this.newWalletForm = new forms.NewWalletForm(\n page.newWalletForm,\n assetID => this.newWalletCreated(assetID, this.confirmRegisterForm.tier),\n () => this.animateRegAsset(page.newWalletForm)\n )\n\n this.walletWaitForm = new forms.WalletWaitForm(page.walletWait, () => {\n this.animateConfirmForm(page.walletWait)\n }, () => { this.animateRegAsset(page.walletWait) })\n\n // Enter an address for a new DEX\n this.dexAddrForm = new forms.DEXAddressForm(page.dexAddrForm, async (xc: Exchange, certFile: string) => {\n this.currentDEX = xc\n this.confirmRegisterForm.setExchange(xc, certFile)\n this.walletWaitForm.setExchange(xc)\n this.regAssetForm.setExchange(xc, certFile)\n this.animateRegAsset(page.dexAddrForm)\n })\n\n Doc.bind(page.importAccount, 'click', () => this.prepareAccountImport(page.authorizeAccountImportForm))\n forms.bind(page.authorizeAccountImportForm, page.authorizeImportAccountConfirm, () => this.importAccount())\n\n Doc.bind(page.changeAppPW, 'click', () => this.showForm(page.changeAppPWForm))\n forms.bind(page.changeAppPWForm, page.submitNewPW, () => this.changeAppPW())\n\n this.appPassResetForm = new forms.AppPassResetForm(page.resetAppPWForm, async () => {\n await app().loadPage('login')\n Doc.hide(page.forms)\n })\n Doc.bind(page.resetAppPW, 'click', () => {\n this.appPassResetForm.refresh()\n this.showForm(page.resetAppPWForm)\n this.appPassResetForm.focus()\n })\n\n Doc.bind(page.accountFile, 'change', () => this.onAccountFileChange())\n Doc.bind(page.removeAccount, 'click', () => this.clearAccountFile())\n Doc.bind(page.addAccount, 'click', () => page.accountFile.click())\n\n Doc.bind(page.exportSeed, 'click', () => {\n Doc.hide(page.exportSeedErr)\n this.showForm(page.exportSeedAuth)\n })\n forms.bind(page.exportSeedAuth, page.exportSeedSubmit, () => this.submitExportSeedReq())\n\n Doc.bind(page.gameCodeLink, 'click', () => this.showForm(page.gameCodeForm))\n Doc.bind(page.gameCodeSubmit, 'click', () => this.submitGameCode())\n\n const closePopups = () => {\n Doc.hide(page.forms)\n page.exportSeedPW.value = ''\n page.legacySeed.textContent = ''\n page.mnemonic.textContent = ''\n }\n\n Doc.bind(page.forms, 'mousedown', (e: MouseEvent) => {\n if (!Doc.mouseInElement(e, this.currentForm)) { closePopups() }\n })\n\n this.keyup = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closePopups()\n }\n }\n Doc.bind(document, 'keyup', this.keyup)\n\n page.forms.querySelectorAll('.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => { closePopups() })\n })\n\n this.renderDesktopNtfnSettings()\n }\n\n updateNtfnSetting (e: Event) {\n const checkbox = e.target as HTMLInputElement\n const noteType = checkbox.getAttribute('name')\n if (noteType === null) return\n const enabled = checkbox.checked\n updateNtfnSetting(noteType, enabled)\n }\n\n getBrowserNtfnSettings (): DesktopNtfnSetting {\n const permissions = fetchDesktopNtfnSettings()\n return permissions\n }\n\n async renderDesktopNtfnSettings () {\n const page = this.page\n const ntfnSettings = this.getBrowserNtfnSettings()\n const labels = desktopNtfnLabels\n const tmpl = page.browserNtfnCheckboxTemplate\n tmpl.removeAttribute('id')\n const container = page.browserNtfnCheckboxContainer\n Doc.empty(page.browserNtfnCheckboxContainer)\n\n Object.keys(labels).forEach((noteType) => {\n const html = tmpl.cloneNode(true) as PageElement\n const enabled = ntfnSettings[noteType]\n const checkbox = Doc.tmplElement(html, 'checkbox')\n Doc.tmplElement(html, 'label').textContent = intl.prep(labels[noteType])\n checkbox.setAttribute('name', noteType)\n if (enabled) checkbox.setAttribute('checked', 'checked')\n container.appendChild(html)\n Doc.bind(checkbox, 'click', this.updateNtfnSetting)\n })\n\n const enabledCheckbox = page.browserNtfnEnabled\n\n Doc.bind(enabledCheckbox, 'click', async (e: Event) => {\n if (Notifier.ntfnPermissionDenied()) return\n const checkbox = e.target as HTMLInputElement\n if (checkbox.checked) {\n await Notifier.requestNtfnPermission()\n checkbox.checked = !Notifier.ntfnPermissionDenied()\n }\n this.updateNtfnSetting(e)\n checkbox.dispatchEvent(new Event('change'))\n })\n\n Doc.bind(enabledCheckbox, 'change', (e: Event) => {\n const checkbox = e.target as HTMLInputElement\n const permDenied = Notifier.ntfnPermissionDenied()\n Doc.setVis(checkbox.checked, page.browserNtfnCheckboxContainer)\n Doc.setVis(permDenied, page.browserNtfnBlockedMsg)\n checkbox.disabled = permDenied\n })\n\n enabledCheckbox.checked = (Notifier.ntfnPermissionGranted() && ntfnSettings.browserNtfnEnabled)\n enabledCheckbox.dispatchEvent(new Event('change'))\n }\n\n /*\n * slideSwap animates the replacement of the currently shown form with the\n * newForm and sets this.currentForm.\n */\n slideSwap (newForm: PageElement) {\n forms.slideSwap(this.currentForm, newForm)\n this.currentForm = newForm\n }\n\n // Retrieve an estimate for the tx fee needed to create new bond reserves.\n async getBondsFeeBuffer (assetID: number, form: HTMLElement) {\n const loaded = app().loading(form)\n const res = await postJSON('/api/bondsfeebuffer', { assetID })\n loaded()\n if (!app().checkResponse(res)) {\n return 0\n }\n return res.feeBuffer\n }\n\n async newWalletCreated (assetID: number, tier: number) {\n const user = await app().fetchUser()\n if (!user) return\n const page = this.page\n const asset = user.assets[assetID]\n const wallet = asset.wallet\n const bondAmt = this.currentDEX.bondAssets[asset.symbol].amount\n\n const bondsFeeBuffer = await this.getBondsFeeBuffer(assetID, page.newWalletForm)\n this.confirmRegisterForm.setFees(assetID, bondsFeeBuffer)\n if (wallet.synced && wallet.balance.available >= 2 * bondAmt + bondsFeeBuffer) {\n await this.animateConfirmForm(page.newWalletForm)\n return\n }\n\n this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)\n this.slideSwap(page.walletWait)\n }\n\n async onAccountFileChange () {\n const page = this.page\n const files = page.accountFile.files\n if (!files || !files.length) return\n page.selectedAccount.textContent = files[0].name\n Doc.show(page.removeAccount)\n Doc.hide(page.addAccount)\n }\n\n /* clearAccountFile cleanup accountFile value and selectedAccount text */\n clearAccountFile () {\n const page = this.page\n page.accountFile.value = ''\n page.selectedAccount.textContent = intl.prep(intl.ID_NONE_SELECTED)\n Doc.hide(page.removeAccount)\n Doc.show(page.addAccount)\n }\n\n async prepareAccountImport (authorizeAccountImportForm: HTMLElement) {\n const page = this.page\n page.importAccountErr.textContent = ''\n this.showForm(authorizeAccountImportForm)\n }\n\n // importAccount imports the account\n async importAccount () {\n const page = this.page\n let accountString = ''\n if (page.accountFile.value) {\n const files = page.accountFile.files\n if (!files || !files.length) {\n console.error('importAccount: no file specified')\n return\n }\n accountString = await files[0].text()\n }\n let account\n try {\n account = JSON.parse(accountString)\n } catch (e) {\n page.importAccountErr.textContent = e.message\n Doc.show(page.importAccountErr)\n return\n }\n if (typeof account === 'undefined') {\n Doc.showFormError(page.importAccountErr, intl.prep(intl.ID_ACCT_UNDEFINED))\n return\n }\n const { bonds = [], ...acctInf } = account\n const req = {\n account: acctInf,\n bonds: bonds\n }\n const loaded = app().loading(this.body)\n const res = await postJSON('/api/importaccount', req)\n loaded()\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.importAccountErr, res.msg)\n return\n }\n await app().fetchUser()\n Doc.hide(page.forms)\n // Initial method of displaying imported account.\n window.location.reload()\n }\n\n async submitExportSeedReq () {\n const page = this.page\n const pw = page.exportSeedPW.value\n const loaded = app().loading(this.body)\n const res = await postJSON('/api/exportseed', { pass: pw })\n loaded()\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.exportSeedErr, res.msg)\n return\n }\n page.exportSeedPW.value = ''\n if (res.seed.length === 128 && res.seed.split(' ').length === 1) {\n page.legacySeed.textContent = res.seed.match(/.{1,32}/g).map((chunk: string) => chunk.match(/.{1,8}/g)?.join(' ')).join('\\n')\n } else page.mnemonic.textContent = res.seed\n this.showForm(page.authorizeSeedDisplay)\n }\n\n /* showForm shows a modal form with a little animation. */\n async showForm (form: HTMLElement) {\n const page = this.page\n this.currentForm = form\n this.forms.forEach(form => Doc.hide(form))\n form.style.right = '10000px'\n Doc.show(page.forms, form)\n const shift = (page.forms.offsetWidth + form.offsetWidth) / 2\n await Doc.animate(animationLength, progress => {\n form.style.right = `${(1 - progress) * shift}px`\n }, 'easeOutHard')\n form.style.right = '0'\n }\n\n /* gets the contents of the cert file */\n async getCertFile () {\n let cert = ''\n if (this.dexAddrForm.page.certFile.value) {\n const files = this.dexAddrForm.page.certFile.files\n if (files && files.length) cert = await files[0].text()\n }\n return cert\n }\n\n /* Called after successful registration to a DEX. */\n async registerDEXSuccess () {\n window.location.reload()\n }\n\n /* Change application password */\n async changeAppPW () {\n const page = this.page\n Doc.hide(page.changePWErrMsg)\n\n const clearValues = () => {\n page.appPW.value = ''\n page.newAppPW.value = ''\n page.confirmNewPW.value = ''\n }\n // Ensure password fields are nonempty.\n if (!page.appPW.value || !page.newAppPW.value || !page.confirmNewPW.value) {\n Doc.showFormError(page.changePWErrMsg, intl.prep(intl.ID_NO_APP_PASS_ERROR_MSG))\n clearValues()\n return\n }\n // Ensure password confirmation matches.\n if (page.newAppPW.value !== page.confirmNewPW.value) {\n Doc.showFormError(page.changePWErrMsg, intl.prep(intl.ID_PASSWORD_NOT_MATCH))\n clearValues()\n return\n }\n const loaded = app().loading(page.changeAppPW)\n const req = {\n appPW: page.appPW.value,\n newAppPW: page.newAppPW.value\n }\n clearValues()\n const res = await postJSON('/api/changeapppass', req)\n loaded()\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.changePWErrMsg, res.msg)\n return\n }\n Doc.hide(page.forms)\n }\n\n /*\n * unload is called by the Application when the user navigates away from\n * the /settings page.\n */\n unload () {\n Doc.unbind(document, 'keyup', this.keyup)\n }\n\n /* Swap in the asset selection form and run the animation. */\n async animateRegAsset (oldForm: HTMLElement) {\n Doc.hide(oldForm)\n const form = this.page.regAssetForm\n this.currentForm = form\n this.regAssetForm.animate()\n Doc.show(form)\n }\n\n /* Swap in the confirmation form and run the animation. */\n async animateConfirmForm (oldForm: HTMLElement) {\n this.confirmRegisterForm.animate()\n const form = this.page.confirmRegForm\n this.currentForm = form\n Doc.hide(oldForm)\n Doc.show(form)\n }\n\n async submitGameCode () {\n const page = this.page\n Doc.hide(page.gameCodeErr)\n const code = page.gameCodeInput.value\n if (!code) {\n page.gameCodeErr.textContent = intl.prep(intl.ID_NO_CODE_PROVIDED)\n Doc.show(page.gameCodeErr)\n return\n }\n const msg = page.gameCodeMsg.value || ''\n const loaded = app().loading(page.gameCodeForm)\n const resp = await postJSON('/api/redeemgamecode', { code, msg })\n loaded()\n if (!app().checkResponse(resp)) {\n page.gameCodeErr.textContent = intl.prep(intl.ID_API_ERROR, { msg: resp.msg })\n Doc.show(page.gameCodeErr)\n return\n }\n Doc.show(page.gameCodeSuccess)\n page.gameRedeemTx.dataset.explorerCoin = resp.coinString\n const dcrBipID = 42\n setCoinHref(dcrBipID, page.gameRedeemTx)\n page.gameRedeemTx.textContent = resp.coinString\n const ui = app().unitInfo(dcrBipID)\n page.gameRedeemValue.textContent = Doc.formatCoinValue(resp.win, ui)\n }\n}\n","import {\n MarketOrderBook,\n MiniOrder\n} from './registry'\n\nexport default class OrderBook {\n base: number\n baseSymbol: string\n quote: number\n quoteSymbol: string\n buys: MiniOrder[]\n sells: MiniOrder[]\n\n constructor (mktBook: MarketOrderBook, baseSymbol: string, quoteSymbol: string) {\n this.base = mktBook.base\n this.baseSymbol = baseSymbol\n this.quote = mktBook.quote\n this.quoteSymbol = quoteSymbol\n // Books are sorted mid-gap first.\n this.buys = mktBook.book.buys || []\n this.sells = mktBook.book.sells || []\n }\n\n /* add adds an order to the order book. */\n add (ord: MiniOrder) {\n if (ord.qtyAtomic === 0) {\n // TODO: Somebody, for the love of god, figure out why the hell this helps\n // with the ghost orders problem. As far as I know, this order is a booked\n // order that had more than one match in an epoch and completely filled.\n // Because the first match didn't exhaust the order, there would be a\n // 'update_remaining' notification scheduled for the order. But by the\n // time OrderRouter generates the notification long after matching, the\n // order has zero qty left to fill. It's all good though, kinda, because\n // the notification is quickly followed with an 'unbook_order'\n // notification. I have tried my damnedest to catch an update_remaining\n // note without an accompanying unbook_order note, and have thus failed.\n // Yet, this fix somehow seems to work. It's infuriating, tbh.\n window.log('zeroqty', 'zero quantity order encountered', ord)\n return\n }\n const side = ord.sell ? this.sells : this.buys\n side.splice(findIdx(side, ord.rate, !ord.sell), 0, ord)\n }\n\n /* remove removes an order from the order book. */\n remove (token: string) {\n if (this.removeFromSide(this.sells, token)) return\n this.removeFromSide(this.buys, token)\n }\n\n /* removeFromSide removes an order from the list of orders. */\n removeFromSide (side: MiniOrder[], token: string) {\n const [ord, i] = this.findOrder(side, token)\n if (ord) {\n side.splice(i, 1)\n return true\n }\n return false\n }\n\n /* findOrder finds an order in a specified side */\n findOrder (side: MiniOrder[], token: string): [MiniOrder | null, number] {\n for (let i = 0; i < side.length; i++) {\n if (side[i].token === token) {\n return [side[i], i]\n }\n }\n return [null, -1]\n }\n\n /* updates the remaining quantity of an order. */\n updateRemaining (token: string, qty: number, qtyAtomic: number) {\n if (this.updateRemainingSide(this.sells, token, qty, qtyAtomic)) return\n this.updateRemainingSide(this.buys, token, qty, qtyAtomic)\n }\n\n /*\n * updateRemainingSide looks for the order in the side and updates the\n * quantity, returning true on success, false if order not found.\n */\n updateRemainingSide (side: MiniOrder[], token: string, qty: number, qtyAtomic: number) {\n const ord = this.findOrder(side, token)[0]\n if (ord) {\n ord.qty = qty\n ord.qtyAtomic = qtyAtomic\n return true\n }\n return false\n }\n\n /*\n * setEpoch sets the current epoch and clear any orders from previous epochs.\n */\n setEpoch (epochIdx: number) {\n const approve = (ord: MiniOrder) => ord.epoch === undefined || ord.epoch === 0 || ord.epoch === epochIdx\n this.sells = this.sells.filter(approve)\n this.buys = this.buys.filter(approve)\n }\n\n /* empty will return true if both the buys and sells lists are empty. */\n empty () {\n return !this.sells.length && !this.buys.length\n }\n\n /* count is the total count of both buy and sell orders. */\n count () {\n return this.sells.length + this.buys.length\n }\n\n /* bestGapOrder will return the best non-epoch order if one exists, or the\n * best epoch order if there are only epoch orders, or null if there are no\n * orders.\n */\n bestGapOrder (side: MiniOrder[]) {\n let best = null\n for (const ord of side) {\n if (!ord.epoch) return ord\n if (!best) {\n best = ord\n }\n }\n return best\n }\n\n bestGapBuy () {\n return this.bestGapOrder(this.buys)\n }\n\n bestGapSell () {\n return this.bestGapOrder(this.sells)\n }\n}\n\n/*\n * findIdx find the index at which to insert the order into the list of orders.\n */\nfunction findIdx (side: MiniOrder[], rate: number, less: boolean): number {\n for (let i = 0; i < side.length; i++) {\n if ((side[i].rate < rate) === less) return i\n }\n return side.length\n}\n","// MessageSocket is a WebSocket manager that uses the Decred DEX Message format\n// for communications.\n//\n// Message request format:\n// {\n// route: 'name',\n// id: int,\n// payload: anything or nothing\n// }\n//\n// Message response payload will be a result object with either a valid 'result'\n// field or an 'error' field\n//\n// Functions for external use:\n// registerRoute (route, handler) -- register a function to handle events\n// of the given type\n// request (route, payload) -- create a JSON message in the above format and\n// send it\n//\n// Based on messagesocket_service.js by Jonathan Chappelow @ dcrdata, which is\n// based on ws_events_dispatcher.js by Ismael Celis\nconst typeRequest = 1\n\nfunction forward (route: string, payload: any, handlers: Record<string, ((payload: any) => void)[]>) {\n if (!route && payload.error) {\n const err = payload.error\n console.error(`websocket error (code ${err.code}): ${err.message}`)\n return\n }\n if (typeof handlers[route] === 'undefined') {\n // console.log(`unhandled message for ${route}: ${payload}`)\n return\n }\n // call each handler\n for (let i = 0; i < handlers[route].length; i++) {\n handlers[route][i](payload)\n }\n}\n\nlet id = 0\n\ntype NoteReceiver = (payload: any) => void\n\nclass MessageSocket {\n uri: string\n connection: WebSocket | null\n handlers: Record<string, NoteReceiver[]>\n queue: [string, any][]\n maxQlength: number\n reloader: () => void // appears unused\n\n constructor () {\n this.handlers = {}\n this.queue = []\n this.maxQlength = 5\n }\n\n registerRoute (route: string, handler: NoteReceiver) {\n this.handlers[route] = this.handlers[route] || []\n this.handlers[route].push(handler)\n }\n\n deregisterRoute (route: string) {\n this.handlers[route] = []\n }\n\n // request sends a request-type message to the server\n request (route: string, payload: any) {\n if (!this.connection || this.connection.readyState !== window.WebSocket.OPEN) {\n while (this.queue.length > this.maxQlength - 1) this.queue.shift()\n this.queue.push([route, payload])\n return\n }\n id++\n const message = JSON.stringify({\n route: route,\n type: typeRequest,\n id: id,\n payload: payload\n })\n\n window.log('ws', 'sending', message)\n this.connection.send(message)\n }\n\n close (reason: string) {\n window.log('ws', 'close, reason:', reason, this.handlers)\n this.handlers = {}\n if (this.connection) this.connection.close()\n }\n\n connect (uri: string, reloader: () => void) {\n this.uri = uri\n this.reloader = reloader\n let retrys = 0\n const go = () => {\n window.log('ws', `connecting to ${uri}`)\n let conn: WebSocket | null = this.connection = new window.WebSocket(uri)\n if (!conn) return\n const timeout = setTimeout(() => {\n // readyState is still WebSocket.CONNECTING. Cancel and trigger onclose.\n if (conn) conn.close()\n }, 500)\n\n // unmarshal message, and forward the message to registered handlers\n conn.onmessage = (evt: MessageEvent) => {\n const message = JSON.parse(evt.data)\n forward(message.route, message.payload, this.handlers)\n }\n\n // Stub out standard functions\n conn.onclose = (evt: CloseEvent) => {\n window.log('ws', 'onclose')\n clearTimeout(timeout)\n conn = this.connection = null\n forward('close', null, this.handlers)\n retrys++\n // 1.2, 1.6, 2.0, 2.4, 3.1, 3.8, 4.8, 6.0, 7.5, 9.3, ...\n const delay = Math.min(Math.pow(1.25, retrys), 10)\n console.error(`websocket disconnected (${evt.code}), trying again in ${delay.toFixed(1)} seconds`)\n setTimeout(() => {\n go()\n }, delay * 1000)\n }\n\n conn.onopen = () => {\n window.log('ws', 'onopen')\n clearTimeout(timeout)\n if (retrys > 0) {\n retrys = 0\n reloader()\n }\n forward('open', null, this.handlers)\n const queue = this.queue\n this.queue = []\n for (const [route, message] of queue) {\n this.request(route, message)\n }\n }\n\n conn.onerror = (evt: Event) => {\n window.log('ws', 'onerror:', evt)\n forward('error', evt, this.handlers)\n }\n }\n go()\n }\n}\n\nconst ws = new MessageSocket()\nexport default ws\n","import Doc, { WalletIcons, parseFloatDefault } from './doc'\nimport State from './state'\nimport BasePage from './basepage'\nimport OrderBook from './orderbook'\nimport { ReputationMeter, tradingLimits, strongTier } from './account'\nimport {\n CandleChart,\n DepthChart,\n DepthLine,\n CandleReporters,\n MouseReport,\n VolumeReport,\n DepthMarker,\n Wave\n} from './charts'\nimport { postJSON } from './http'\nimport {\n NewWalletForm,\n AccelerateOrderForm,\n DepositAddress,\n TokenApprovalForm,\n bind as bindForm,\n Forms\n} from './forms'\nimport * as OrderUtil from './orderutil'\nimport ws from './ws'\nimport * as intl from './locales'\nimport {\n app,\n SupportedAsset,\n PageElement,\n Order,\n Market,\n OrderEstimate,\n MaxOrderEstimate,\n Exchange,\n UnitInfo,\n Asset,\n Candle,\n CandlesPayload,\n TradeForm,\n BookUpdate,\n MaxSell,\n MaxBuy,\n SwapEstimate,\n MarketOrderBook,\n APIResponse,\n PreSwap,\n PreRedeem,\n WalletStateNote,\n WalletSyncNote,\n WalletCreationNote,\n SpotPriceNote,\n BondNote,\n OrderNote,\n EpochNote,\n BalanceNote,\n MiniOrder,\n RemainderUpdate,\n ConnEventNote,\n OrderOption,\n ConnectionStatus,\n RecentMatch,\n MatchNote,\n ApprovalStatus,\n OrderFilter,\n RunStatsNote,\n RunEventNote,\n EpochReportNote,\n CEXProblemsNote\n} from './registry'\nimport { setOptionTemplates } from './opts'\nimport { RunningMarketMakerDisplay, RunningMMDisplayElements } from './mmutil'\n\nconst bind = Doc.bind\n\nconst bookRoute = 'book'\nconst bookOrderRoute = 'book_order'\nconst unbookOrderRoute = 'unbook_order'\nconst updateRemainingRoute = 'update_remaining'\nconst epochOrderRoute = 'epoch_order'\nconst candlesRoute = 'candles'\nconst candleUpdateRoute = 'candle_update'\nconst unmarketRoute = 'unmarket'\nconst epochMatchSummaryRoute = 'epoch_match_summary'\n\nconst anHour = 60 * 60 * 1000 // milliseconds\nconst maxUserOrdersShown = 10\n\nconst buyBtnClass = 'buygreen-bg'\nconst sellBtnClass = 'sellred-bg'\n\nconst fiveMinBinKey = '5m'\nconst oneHrBinKey = '1h'\n\nconst percentFormatter = new Intl.NumberFormat(Doc.languages(), {\n minimumFractionDigits: 1,\n maximumFractionDigits: 2\n})\n\nconst parentIDNone = 0xFFFFFFFF\n\ninterface MetaOrder {\n div: HTMLElement\n header: Record<string, PageElement>\n details: Record<string, PageElement>\n ord: Order\n cancelling?: boolean\n}\n\ninterface CancelData {\n bttn: PageElement\n order: Order\n}\n\ninterface CurrentMarket {\n dex: Exchange\n sid: string // A string market identifier used by the DEX.\n cfg: Market\n base: SupportedAsset\n quote: SupportedAsset\n baseUnitInfo: UnitInfo\n quoteUnitInfo: UnitInfo\n maxSellRequested: boolean\n maxSell: MaxOrderEstimate | null\n sellBalance: number\n buyBalance: number\n maxBuys: Record<number, MaxOrderEstimate>\n candleCaches: Record<string, CandlesPayload>\n baseCfg: Asset\n quoteCfg: Asset\n rateConversionFactor: number\n bookLoaded: boolean\n}\n\ninterface LoadTracker {\n loaded: () => void\n timer: number\n}\n\ninterface OrderRow extends HTMLElement {\n manager: OrderTableRowManager\n}\n\ninterface StatsDisplay {\n row: PageElement\n tmpl: Record<string, PageElement>\n}\n\ninterface MarketsPageParams {\n host: string\n baseID: string\n quoteID: string\n}\n\nexport default class MarketsPage extends BasePage {\n page: Record<string, PageElement>\n main: HTMLElement\n maxLoaded: (() => void) | null\n maxOrderUpdateCounter: number\n market: CurrentMarket\n openAsset: SupportedAsset\n currentCreate: SupportedAsset\n maxEstimateTimer: number | null\n book: OrderBook\n cancelData: CancelData\n metaOrders: Record<string, MetaOrder>\n preorderCache: Record<string, OrderEstimate>\n currentOrder: TradeForm\n depthLines: Record<string, DepthLine[]>\n activeMarkerRate: number | null\n hovers: HTMLElement[]\n ogTitle: string\n depthChart: DepthChart\n candleChart: CandleChart\n candleDur: string\n balanceWgt: BalanceWidget\n mm: RunningMarketMakerDisplay\n marketList: MarketList\n newWalletForm: NewWalletForm\n depositAddrForm: DepositAddress\n approveTokenForm: TokenApprovalForm\n reputationMeter: ReputationMeter\n keyup: (e: KeyboardEvent) => void\n secondTicker: number\n candlesLoading: LoadTracker | null\n accelerateOrderForm: AccelerateOrderForm\n recentMatches: RecentMatch[]\n recentMatchesSortKey: string\n recentMatchesSortDirection: 1 | -1\n stats: [StatsDisplay, StatsDisplay]\n loadingAnimations: { candles?: Wave, depth?: Wave }\n mmRunning: boolean | undefined\n forms: Forms\n constructor (main: HTMLElement, pageParams: MarketsPageParams) {\n super()\n\n const page = this.page = Doc.idDescendants(main)\n this.main = main\n if (!this.main.parentElement) return // Not gonna happen, but TypeScript cares.\n // There may be multiple pending updates to the max order. This makes sure\n // that the screen is updated with the most recent one.\n this.maxOrderUpdateCounter = 0\n this.metaOrders = {}\n this.recentMatches = []\n this.preorderCache = {}\n this.depthLines = {\n hover: [],\n input: []\n }\n this.hovers = []\n // 'Recent Matches' list sort key and direction.\n this.recentMatchesSortKey = 'age'\n this.recentMatchesSortDirection = -1\n // store original title so we can re-append it when updating market value.\n this.ogTitle = document.title\n this.forms = new Forms(page.forms, {\n closed: (closedForm: PageElement | undefined) => {\n if (closedForm === page.vDetailPane) {\n this.showVerifyForm()\n }\n }\n })\n\n const depthReporters = {\n click: (x: number) => { this.reportDepthClick(x) },\n volume: (r: VolumeReport) => { this.reportDepthVolume(r) },\n mouse: (r: MouseReport) => { this.reportDepthMouse(r) },\n zoom: (z: number) => { this.reportDepthZoom(z) }\n }\n this.depthChart = new DepthChart(page.depthChart, depthReporters, State.fetchLocal(State.depthZoomLK))\n\n const candleReporters: CandleReporters = {\n mouse: c => { this.reportMouseCandle(c) }\n }\n this.candleChart = new CandleChart(page.candlesChart, candleReporters)\n\n const success = () => { /* do nothing */ }\n // Do not call cleanTemplates before creating the AccelerateOrderForm\n this.accelerateOrderForm = new AccelerateOrderForm(page.accelerateForm, success)\n\n this.approveTokenForm = new TokenApprovalForm(page.approveTokenForm)\n\n // Set user's last known candle duration.\n this.candleDur = State.fetchLocal(State.lastCandleDurationLK) || oneHrBinKey\n\n // Setup the register to trade button.\n // TODO: Use dexsettings page?\n const registerBttn = Doc.tmplElement(page.notRegistered, 'registerBttn')\n bind(registerBttn, 'click', () => {\n app().loadPage('register', { host: this.market.dex.host })\n })\n\n // Set up the BalanceWidget.\n {\n page.walletInfoTmpl.removeAttribute('id')\n const bWidget = page.walletInfoTmpl\n const qWidget = page.walletInfoTmpl.cloneNode(true) as PageElement\n bWidget.after(qWidget)\n const wgt = this.balanceWgt = new BalanceWidget(bWidget, qWidget)\n const baseIcons = wgt.base.stateIcons.icons\n const quoteIcons = wgt.quote.stateIcons.icons\n bind(wgt.base.tmpl.connect, 'click', () => { this.unlockWallet(this.market.base.id) })\n bind(wgt.quote.tmpl.connect, 'click', () => { this.unlockWallet(this.market.quote.id) })\n bind(wgt.base.tmpl.expired, 'click', () => { this.unlockWallet(this.market.base.id) })\n bind(wgt.quote.tmpl.expired, 'click', () => { this.unlockWallet(this.market.quote.id) })\n bind(baseIcons.sleeping, 'click', () => { this.unlockWallet(this.market.base.id) })\n bind(quoteIcons.sleeping, 'click', () => { this.unlockWallet(this.market.quote.id) })\n bind(baseIcons.locked, 'click', () => { this.unlockWallet(this.market.base.id) })\n bind(quoteIcons.locked, 'click', () => { this.unlockWallet(this.market.quote.id) })\n bind(baseIcons.disabled, 'click', () => { this.showToggleWalletStatus(this.market.base) })\n bind(quoteIcons.disabled, 'click', () => { this.showToggleWalletStatus(this.market.quote) })\n bind(wgt.base.tmpl.newWalletBttn, 'click', () => { this.showCreate(this.market.base) })\n bind(wgt.quote.tmpl.newWalletBttn, 'click', () => { this.showCreate(this.market.quote) })\n bind(wgt.base.tmpl.walletAddr, 'click', () => { this.showDeposit(this.market.base.id) })\n bind(wgt.quote.tmpl.walletAddr, 'click', () => { this.showDeposit(this.market.quote.id) })\n bind(wgt.base.tmpl.wantProviders, 'click', () => { this.showCustomProviderDialog(this.market.base.id) })\n bind(wgt.quote.tmpl.wantProviders, 'click', () => { this.showCustomProviderDialog(this.market.quote.id) })\n this.depositAddrForm = new DepositAddress(page.deposit)\n }\n\n const runningMMDisplayElements: RunningMMDisplayElements = {\n orderReportForm: page.orderReportForm,\n dexBalancesRowTmpl: page.dexBalancesRowTmpl,\n placementRowTmpl: page.placementRowTmpl,\n placementAmtRowTmpl: page.placementAmtRowTmpl\n }\n Doc.cleanTemplates(page.dexBalancesRowTmpl, page.placementRowTmpl, page.placementAmtRowTmpl)\n this.mm = new RunningMarketMakerDisplay(page.mmRunning, this.forms, runningMMDisplayElements, 'markets')\n\n this.reputationMeter = new ReputationMeter(page.reputationMeter)\n\n // Bind toggle wallet status form.\n bindForm(page.toggleWalletStatusConfirm, page.toggleWalletStatusSubmit, async () => { this.toggleWalletStatus() })\n\n // Prepare templates for the buy and sell tables and the user's order table.\n setOptionTemplates(page)\n\n Doc.cleanTemplates(\n page.orderRowTmpl, page.durBttnTemplate, page.booleanOptTmpl, page.rangeOptTmpl,\n page.orderOptTmpl, page.userOrderTmpl, page.recentMatchesTemplate\n )\n\n // Buttons to show token approval form\n bind(page.approveBaseBttn, 'click', () => { this.showTokenApprovalForm(true) })\n bind(page.approveQuoteBttn, 'click', () => { this.showTokenApprovalForm(false) })\n\n const toggleTradingTier = (show: boolean) => {\n Doc.setVis(!show, page.showTradingTier)\n Doc.setVis(show, page.tradingLimits, page.hideTradingTier)\n }\n bind(page.showTradingTier, 'click', () => { toggleTradingTier(true) })\n bind(page.hideTradingTier, 'click', () => { toggleTradingTier(false) })\n\n const toggleTradingReputation = (show: boolean) => {\n Doc.setVis(!show, page.showTradingReputation)\n Doc.setVis(show, page.reputationMeter, page.hideTradingReputation)\n }\n bind(page.showTradingReputation, 'click', () => { toggleTradingReputation(true) })\n bind(page.hideTradingReputation, 'click', () => { toggleTradingReputation(false) })\n\n // Buttons to set order type and side.\n bind(page.buyBttn, 'click', () => { this.setBuy() })\n bind(page.sellBttn, 'click', () => { this.setSell() })\n\n bind(page.limitBttn, 'click', () => {\n swapBttns(page.marketBttn, page.limitBttn)\n this.setOrderVisibility()\n if (!page.rateField.value) return\n this.depthLines.input = [{\n rate: parseFloatDefault(page.rateField.value, 0),\n color: this.isSell() ? this.depthChart.theme.sellLine : this.depthChart.theme.buyLine\n }]\n this.drawChartLines()\n })\n bind(page.marketBttn, 'click', () => {\n swapBttns(page.limitBttn, page.marketBttn)\n this.setOrderVisibility()\n this.setMarketBuyOrderEstimate()\n this.depthLines.input = []\n this.drawChartLines()\n })\n bind(page.maxOrd, 'click', () => {\n if (this.isSell()) {\n const maxSell = this.market.maxSell\n if (!maxSell) return\n page.lotField.value = String(maxSell.swap.lots)\n } else {\n const maxBuy = this.market.maxBuys[this.adjustedRate()]\n if (!maxBuy) return\n page.lotField.value = String(maxBuy.swap.lots)\n }\n this.lotChanged()\n })\n\n Doc.disableMouseWheel(page.rateField, page.lotField, page.qtyField, page.mktBuyField)\n\n // Handle the full orderbook sent on the 'book' route.\n ws.registerRoute(bookRoute, (data: BookUpdate) => { this.handleBookRoute(data) })\n // Handle the new order for the order book on the 'book_order' route.\n ws.registerRoute(bookOrderRoute, (data: BookUpdate) => { this.handleBookOrderRoute(data) })\n // Remove the order sent on the 'unbook_order' route from the orderbook.\n ws.registerRoute(unbookOrderRoute, (data: BookUpdate) => { this.handleUnbookOrderRoute(data) })\n // Update the remaining quantity on a booked order.\n ws.registerRoute(updateRemainingRoute, (data: BookUpdate) => { this.handleUpdateRemainingRoute(data) })\n // Handle the new order for the order book on the 'epoch_order' route.\n ws.registerRoute(epochOrderRoute, (data: BookUpdate) => { this.handleEpochOrderRoute(data) })\n // Handle the initial candlestick data on the 'candles' route.\n ws.registerRoute(candlesRoute, (data: BookUpdate) => { this.handleCandlesRoute(data) })\n // Handle the candles update on the 'candles' route.\n ws.registerRoute(candleUpdateRoute, (data: BookUpdate) => { this.handleCandleUpdateRoute(data) })\n\n // Handle the recent matches update on the 'epoch_report' route.\n ws.registerRoute(epochMatchSummaryRoute, (data: BookUpdate) => { this.handleEpochMatchSummary(data) })\n // Create a wallet\n this.newWalletForm = new NewWalletForm(page.newWalletForm, async () => { this.createWallet() })\n // Main order form.\n bindForm(page.orderForm, page.submitBttn, async () => { this.stepSubmit() })\n // Order verification form.\n bindForm(page.verifyForm, page.vSubmit, async () => { this.submitOrder() })\n // Cancel order form.\n bindForm(page.cancelForm, page.cancelSubmit, async () => { this.submitCancel() })\n // Order detail view.\n Doc.bind(page.vFeeDetails, 'click', () => this.forms.show(page.vDetailPane))\n Doc.bind(page.closeDetailPane, 'click', () => this.showVerifyForm())\n // // Bind active orders list's header sort events.\n page.recentMatchesTable.querySelectorAll('[data-ordercol]')\n .forEach((th: HTMLElement) => bind(\n th, 'click', () => setRecentMatchesSortCol(th.dataset.ordercol || '')\n ))\n\n const setRecentMatchesSortCol = (key: string) => {\n // First unset header's current sorted col classes.\n unsetRecentMatchesSortColClasses()\n if (this.recentMatchesSortKey === key) {\n this.recentMatchesSortDirection *= -1\n } else {\n this.recentMatchesSortKey = key\n this.recentMatchesSortDirection = 1\n }\n this.refreshRecentMatchesTable()\n setRecentMatchesSortColClasses()\n }\n\n // sortClassByDirection receives a sort direction and return a class based on it.\n const sortClassByDirection = (element: 1 | -1) => {\n if (element === 1) return 'sorted-asc'\n return 'sorted-dsc'\n }\n\n const unsetRecentMatchesSortColClasses = () => {\n page.recentMatchesTable.querySelectorAll('[data-ordercol]')\n .forEach(th => th.classList.remove('sorted-asc', 'sorted-dsc'))\n }\n\n const setRecentMatchesSortColClasses = () => {\n const key = this.recentMatchesSortKey\n const sortCls = sortClassByDirection(this.recentMatchesSortDirection)\n Doc.safeSelector(page.recentMatchesTable, `[data-ordercol=${key}]`).classList.add(sortCls)\n }\n\n // Set default's sorted col header classes.\n setRecentMatchesSortColClasses()\n\n const closePopups = () => {\n this.forms.close()\n }\n\n this.keyup = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closePopups()\n }\n }\n bind(document, 'keyup', this.keyup)\n\n page.forms.querySelectorAll('.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => { closePopups() })\n })\n\n // Event listeners for interactions with the various input fields.\n bind(page.lotField, ['change', 'keyup'], () => { this.lotChanged() })\n bind(page.qtyField, 'change', () => { this.quantityChanged(true) })\n bind(page.qtyField, 'keyup', () => { this.quantityChanged(false) })\n bind(page.mktBuyField, ['change', 'keyup'], () => { this.marketBuyChanged() })\n bind(page.rateField, 'change', () => { this.rateFieldChanged() })\n bind(page.rateField, 'keyup', () => { this.previewQuoteAmt(true) })\n\n // Market search input bindings.\n bind(page.marketSearchV1, ['change', 'keyup'], () => { this.filterMarkets() })\n\n // Acknowledge the order disclaimer.\n const setDisclaimerAckViz = (acked: boolean) => {\n Doc.setVis(!acked, page.disclaimer, page.disclaimerAck)\n Doc.setVis(acked, page.showDisclaimer)\n }\n bind(page.disclaimerAck, 'click', () => {\n State.storeLocal(State.orderDisclaimerAckedLK, true)\n setDisclaimerAckViz(true)\n })\n bind(page.showDisclaimer, 'click', () => {\n State.storeLocal(State.orderDisclaimerAckedLK, false)\n setDisclaimerAckViz(false)\n })\n setDisclaimerAckViz(State.fetchLocal(State.orderDisclaimerAckedLK))\n\n const clearChartLines = () => {\n this.depthLines.hover = []\n this.drawChartLines()\n }\n bind(page.buyRows, 'mouseleave', clearChartLines)\n bind(page.sellRows, 'mouseleave', clearChartLines)\n bind(page.userOrders, 'mouseleave', () => {\n this.activeMarkerRate = null\n this.setDepthMarkers()\n })\n\n const stats0 = page.marketStats\n const stats1 = stats0.cloneNode(true) as PageElement\n stats1.classList.add('listopen')\n Doc.hide(stats0, stats1)\n stats1.removeAttribute('id')\n app().headerSpace.appendChild(stats1)\n this.stats = [{ row: stats0, tmpl: Doc.parseTemplate(stats0) }, { row: stats1, tmpl: Doc.parseTemplate(stats1) }]\n\n const closeMarketsList = () => {\n State.storeLocal(State.leftMarketDockLK, '0')\n page.leftMarketDock.classList.remove('default')\n page.leftMarketDock.classList.add('stashed')\n for (const s of this.stats) s.row.classList.remove('listopen')\n }\n const openMarketsList = () => {\n State.storeLocal(State.leftMarketDockLK, '1')\n page.leftMarketDock.classList.remove('default', 'stashed')\n for (const s of this.stats) s.row.classList.add('listopen')\n }\n Doc.bind(page.leftHider, 'click', () => closeMarketsList())\n Doc.bind(page.marketReopener, 'click', () => openMarketsList())\n for (const s of this.stats) {\n Doc.bind(s.tmpl.marketSelect, 'click', () => {\n if (page.leftMarketDock.clientWidth === 0) openMarketsList()\n else closeMarketsList()\n })\n }\n this.marketList = new MarketList(page.marketListV1)\n // Prepare the list of markets.\n for (const row of this.marketList.markets) {\n bind(row.node, 'click', () => {\n // return early if the market is already set\n const { quoteid: quoteID, baseid: baseID, xc: { host } } = row.mkt\n if (this.market?.base?.id === baseID && this.market?.quote?.id === quoteID) return\n this.startLoadingAnimations()\n this.setMarket(host, baseID, quoteID)\n })\n }\n if (State.fetchLocal(State.leftMarketDockLK) !== '1') { // It is shown by default, hiding if necessary.\n closeMarketsList()\n }\n\n // Notification filters.\n app().registerNoteFeeder({\n order: (note: OrderNote) => { this.handleOrderNote(note) },\n match: (note: MatchNote) => { this.handleMatchNote(note) },\n epoch: (note: EpochNote) => { this.handleEpochNote(note) },\n conn: (note: ConnEventNote) => { this.handleConnNote(note) },\n balance: (note: BalanceNote) => { this.handleBalanceNote(note) },\n bondpost: (note: BondNote) => { this.handleBondUpdate(note) },\n spots: (note: SpotPriceNote) => { this.handlePriceUpdate(note) },\n walletstate: (note: WalletStateNote) => { this.handleWalletState(note) },\n reputation: () => { this.updateReputation() },\n feepayment: () => { this.updateReputation() },\n runstats: (note: RunStatsNote) => {\n if (note.baseID !== this.market.base.id || note.quoteID !== this.market.quote.id || note.host !== this.market.dex.host) return\n this.mm.update()\n if (Boolean(this.mmRunning) !== Boolean(note.stats)) {\n this.mmRunning = Boolean(note.stats)\n this.resolveOrderFormVisibility()\n }\n },\n epochreport: (note: EpochReportNote) => {\n if (note.baseID !== this.market.base.id || note.quoteID !== this.market.quote.id || note.host !== this.market.dex.host) return\n this.mm.handleEpochReportNote(note)\n },\n cexproblems: (note: CEXProblemsNote) => {\n if (note.baseID !== this.market.base.id || note.quoteID !== this.market.quote.id || note.host !== this.market.dex.host) return\n this.mm.handleCexProblemsNote(note)\n },\n runevent: (note: RunEventNote) => {\n if (note.baseID !== this.market.base.id || note.quoteID !== this.market.quote.id || note.host !== this.market.dex.host) return\n this.mm.update()\n }\n })\n\n this.loadingAnimations = {}\n this.startLoadingAnimations()\n\n // Start a ticker to update time-since values.\n this.secondTicker = window.setInterval(() => {\n for (const mord of Object.values(this.metaOrders)) {\n mord.details.age.textContent = Doc.timeSince(mord.ord.submitTime)\n }\n for (const td of Doc.applySelector(page.recentMatchesLiveList, '[data-tmpl=age]')) {\n td.textContent = Doc.timeSince(parseFloat(td.dataset.sinceStamp ?? '0'))\n }\n }, 1000)\n\n this.init(pageParams)\n }\n\n async init (pageParams?: MarketsPageParams) {\n // Fetch the first market in the list, or the users last selected market, if\n // it exists.\n let selected\n if (pageParams?.host) {\n selected = makeMarket(pageParams.host, parseInt(pageParams.baseID), parseInt(pageParams.quoteID))\n } else {\n selected = State.fetchLocal(State.lastMarketLK)\n }\n if (!selected || !this.marketList.exists(selected.host, selected.base, selected.quote)) {\n const first = this.marketList.first()\n if (first) selected = { host: first.mkt.xc.host, base: first.mkt.baseid, quote: first.mkt.quoteid }\n }\n if (selected) this.setMarket(selected.host, selected.base, selected.quote)\n else this.balanceWgt.setBalanceVisibility(false) // no market to display balance widget for.\n\n // set the initial state for the registration status\n this.setRegistrationStatusVisibility()\n }\n\n startLoadingAnimations () {\n const { page, loadingAnimations: anis, depthChart, candleChart } = this\n depthChart.canvas.classList.add('invisible')\n candleChart.canvas.classList.add('invisible')\n if (anis.candles) anis.candles.stop()\n anis.candles = new Wave(page.candlesChart, { message: intl.prep(intl.ID_CANDLES_LOADING) })\n if (anis.depth) anis.depth.stop()\n anis.depth = new Wave(page.depthChart, { message: intl.prep(intl.ID_DEPTH_LOADING) })\n }\n\n /* isSell is true if the user has selected sell in the order options. */\n isSell () {\n return this.page.sellBttn.classList.contains('selected')\n }\n\n /* isLimit is true if the user has selected the \"limit order\" tab. */\n isLimit () {\n return this.page.limitBttn.classList.contains('selected')\n }\n\n setBuy () {\n const { page } = this\n swapBttns(page.sellBttn, page.buyBttn)\n page.submitBttn.classList.remove(sellBtnClass)\n page.submitBttn.classList.add(buyBtnClass)\n page.maxLbl.textContent = intl.prep(intl.ID_BUY)\n this.setOrderBttnText()\n this.setOrderVisibility()\n this.drawChartLines()\n if (!this.isLimit()) {\n this.marketBuyChanged()\n } else {\n this.currentOrder = this.parseOrder()\n this.updateOrderBttnState()\n }\n }\n\n setSell () {\n const { page } = this\n swapBttns(page.buyBttn, page.sellBttn)\n page.submitBttn.classList.add(sellBtnClass)\n page.submitBttn.classList.remove(buyBtnClass)\n page.maxLbl.textContent = intl.prep(intl.ID_SELL)\n this.setOrderBttnText()\n this.setOrderVisibility()\n this.drawChartLines()\n this.currentOrder = this.parseOrder()\n this.updateOrderBttnState()\n }\n\n /* hasPendingBonds is true if there are pending bonds */\n hasPendingBonds (): boolean {\n return Object.keys(this.market.dex.auth.pendingBonds || []).length > 0\n }\n\n /* setCurrMarketPrice updates the current market price on the stats displays\n and the orderbook display. */\n setCurrMarketPrice (): void {\n const selected = this.market\n if (!selected) return\n // Get an up-to-date Market.\n const xc = app().exchanges[selected.dex.host]\n const mkt = xc.markets[selected.cfg.name]\n if (!mkt.spot) return\n\n for (const s of this.stats) {\n const { unitInfo: { conventional: { conversionFactor: cFactor, unit } } } = xc.assets[mkt.baseid]\n const fiatRate = app().fiatRatesMap[mkt.baseid]\n if (fiatRate) {\n s.tmpl.volume.textContent = Doc.formatFourSigFigs(mkt.spot.vol24 / cFactor * fiatRate)\n s.tmpl.volUnit.textContent = 'USD'\n } else {\n s.tmpl.volume.textContent = Doc.formatFourSigFigs(mkt.spot.vol24 / cFactor)\n s.tmpl.volUnit.textContent = unit\n }\n setPriceAndChange(s.tmpl, xc, mkt)\n }\n\n this.page.obPrice.textContent = Doc.formatFourSigFigs(mkt.spot.rate / this.market.rateConversionFactor)\n this.page.obPrice.classList.remove('sellcolor', 'buycolor')\n this.page.obPrice.classList.add(mkt.spot.change24 >= 0 ? 'buycolor' : 'sellcolor')\n Doc.setVis(mkt.spot.change24 >= 0, this.page.obUp)\n Doc.setVis(mkt.spot.change24 < 0, this.page.obDown)\n }\n\n /* setMarketDetails updates the currency names on the stats displays. */\n setMarketDetails () {\n if (!this.market) return\n for (const s of this.stats) {\n const { baseCfg: ba, quoteCfg: qa } = this.market\n s.tmpl.baseIcon.src = Doc.logoPath(ba.symbol)\n s.tmpl.quoteIcon.src = Doc.logoPath(qa.symbol)\n Doc.empty(s.tmpl.baseSymbol, s.tmpl.quoteSymbol)\n s.tmpl.baseSymbol.appendChild(Doc.symbolize(ba, true))\n s.tmpl.quoteSymbol.appendChild(Doc.symbolize(qa, true))\n }\n }\n\n /* setHighLow calculates the high and low rates over the last 24 hours. */\n setHighLow () {\n let [high, low] = [0, 0]\n const spot = this.market.cfg.spot\n // Use spot values for 24 hours high and low rates if it is available. We\n // will default to setting it from candles if it's not.\n if (spot && spot.low24 && spot.high24) {\n high = spot.high24\n low = spot.low24\n } else {\n const cache = this.market?.candleCaches[fiveMinBinKey]\n if (!cache) {\n if (this.candleDur !== fiveMinBinKey) {\n this.requestCandles(fiveMinBinKey)\n return\n }\n for (const s of this.stats) {\n s.tmpl.high.textContent = '-'\n s.tmpl.low.textContent = '-'\n }\n return\n }\n\n // Set high and low rates from candles.\n const aDayAgo = new Date().getTime() - 86400000\n for (let i = cache.candles.length - 1; i >= 0; i--) {\n const c = cache.candles[i]\n if (c.endStamp < aDayAgo) break\n if (low === 0 || (c.lowRate > 0 && c.lowRate < low)) low = c.lowRate\n if (c.highRate > high) high = c.highRate\n }\n }\n\n const baseID = this.market.base.id\n const quoteID = this.market.quote.id\n const dex = this.market.dex\n for (const s of this.stats) {\n s.tmpl.high.textContent = high > 0 ? Doc.formatFourSigFigs(app().conventionalRate(baseID, quoteID, high, dex)) : '-'\n s.tmpl.low.textContent = low > 0 ? Doc.formatFourSigFigs(app().conventionalRate(baseID, quoteID, low, dex)) : '-'\n }\n }\n\n /* assetsAreSupported is true if all the assets of the current market are\n * supported\n */\n assetsAreSupported (): {\n isSupported: boolean;\n text: string;\n } {\n const { market: { base, quote, baseCfg, quoteCfg } } = this\n if (!base || !quote) {\n const symbol = base ? quoteCfg.symbol : baseCfg.symbol\n return {\n isSupported: false,\n text: intl.prep(intl.ID_NOT_SUPPORTED, { asset: symbol.toUpperCase() })\n }\n }\n // check if versions are supported. If asset is a token, we check if its\n // parent supports the version.\n const bVers = (base.token ? app().assets[base.token.parentID].info?.versions : base.info?.versions) as number[]\n const qVers = (quote.token ? app().assets[quote.token.parentID].info?.versions : quote.info?.versions) as number[]\n // if none them are token, just check if own asset is supported.\n let text = ''\n if (!bVers.includes(baseCfg.version)) {\n text = intl.prep(intl.ID_VERSION_NOT_SUPPORTED, { asset: base.symbol.toUpperCase(), version: baseCfg.version + '' })\n } else if (!qVers.includes(quoteCfg.version)) {\n text = intl.prep(intl.ID_VERSION_NOT_SUPPORTED, { asset: quote.symbol.toUpperCase(), version: quoteCfg.version + '' })\n }\n return {\n isSupported: bVers.includes(baseCfg.version) && qVers.includes(quoteCfg.version),\n text\n }\n }\n\n /*\n * setOrderVisibility sets which form is visible based on the specified\n * options.\n */\n setOrderVisibility () {\n const page = this.page\n if (this.isLimit()) {\n Doc.show(page.priceBox, page.tifBox, page.qtyBox, page.maxBox)\n Doc.hide(page.mktBuyBox)\n this.previewQuoteAmt(true)\n } else {\n Doc.hide(page.tifBox, page.maxBox, page.priceBox)\n if (this.isSell()) {\n Doc.hide(page.mktBuyBox)\n Doc.show(page.qtyBox)\n this.previewQuoteAmt(true)\n } else {\n Doc.show(page.mktBuyBox)\n Doc.hide(page.qtyBox)\n this.previewQuoteAmt(false)\n }\n }\n this.updateOrderBttnState()\n }\n\n /* resolveOrderFormVisibility displays or hides the 'orderForm' based on\n * a set of conditions to be met.\n */\n async resolveOrderFormVisibility () {\n const page = this.page\n\n const showOrderForm = async () : Promise<boolean> => {\n if (!this.assetsAreSupported().isSupported) return false // assets not supported\n\n if (!this.market || this.market.dex.auth.effectiveTier < 1) return false// acct suspended or not registered\n\n const { baseAssetApprovalStatus, quoteAssetApprovalStatus } = this.tokenAssetApprovalStatuses()\n if (baseAssetApprovalStatus !== ApprovalStatus.Approved || quoteAssetApprovalStatus !== ApprovalStatus.Approved) return false\n\n const { base, quote } = this.market\n const hasWallets = base && app().assets[base.id].wallet && quote && app().assets[quote.id].wallet\n if (!hasWallets) return false\n if (this.mmRunning) return false\n return true\n }\n\n Doc.setVis(await showOrderForm(), page.orderForm, page.orderTypeBttns)\n\n if (this.market) {\n const { auth: { effectiveTier, pendingStrength } } = this.market.dex\n Doc.setVis(effectiveTier > 0 || pendingStrength > 0, page.reputationAndTradingTierBox)\n }\n\n const mmStatus = app().mmStatus\n if (mmStatus && this.mmRunning === undefined && this.market.base && this.market.quote) {\n const { base: { id: baseID }, quote: { id: quoteID }, dex: { host } } = this.market\n const botStatus = mmStatus.bots.find(({ config: cfg }) => cfg.baseID === baseID && cfg.quoteID === quoteID && cfg.host === host)\n this.mmRunning = Boolean(botStatus?.running)\n }\n\n Doc.setVis(this.mmRunning, page.mmRunning)\n if (this.mmRunning) Doc.hide(page.orderForm, page.orderTypeBttns)\n }\n\n /* setLoaderMsgVisibility displays a message in case a dex asset is not\n * supported\n */\n setLoaderMsgVisibility () {\n const { page } = this\n\n const { isSupported, text } = this.assetsAreSupported()\n if (isSupported) {\n // make sure to hide the loader msg\n Doc.hide(page.loaderMsg)\n return\n }\n page.loaderMsg.textContent = text\n Doc.show(page.loaderMsg)\n Doc.hide(page.notRegistered)\n Doc.hide(page.noWallet)\n }\n\n /*\n * showTokenApprovalForm displays the form used to give allowance to the\n * swap contract of a token.\n */\n async showTokenApprovalForm (isBase: boolean) {\n const assetID = isBase ? this.market.base.id : this.market.quote.id\n this.approveTokenForm.setAsset(assetID, this.market.dex.host)\n this.forms.show(this.page.approveTokenForm)\n }\n\n /*\n * tokenAssetApprovalStatuses returns the approval status of the base and\n * quote assets. If the asset is not a token, it is considered approved.\n */\n tokenAssetApprovalStatuses (): {\n baseAssetApprovalStatus: ApprovalStatus;\n quoteAssetApprovalStatus: ApprovalStatus;\n } {\n const { market: { base, quote } } = this\n let baseAssetApprovalStatus = ApprovalStatus.Approved\n let quoteAssetApprovalStatus = ApprovalStatus.Approved\n\n if (base?.token) {\n const baseAsset = app().assets[base.id]\n const baseVersion = this.market.dex.assets[base.id].version\n if (baseAsset?.wallet?.approved && baseAsset.wallet.approved[baseVersion] !== undefined) {\n baseAssetApprovalStatus = baseAsset.wallet.approved[baseVersion]\n }\n }\n if (quote?.token) {\n const quoteAsset = app().assets[quote.id]\n const quoteVersion = this.market.dex.assets[quote.id].version\n if (quoteAsset?.wallet?.approved && quoteAsset.wallet.approved[quoteVersion] !== undefined) {\n quoteAssetApprovalStatus = quoteAsset.wallet.approved[quoteVersion]\n }\n }\n\n return {\n baseAssetApprovalStatus,\n quoteAssetApprovalStatus\n }\n }\n\n /*\n * setTokenApprovalVisibility sets the visibility of the token approval\n * panel elements.\n */\n setTokenApprovalVisibility () {\n const { page } = this\n\n const { baseAssetApprovalStatus, quoteAssetApprovalStatus } = this.tokenAssetApprovalStatuses()\n\n if (baseAssetApprovalStatus === ApprovalStatus.Approved && quoteAssetApprovalStatus === ApprovalStatus.Approved) {\n Doc.hide(page.tokenApproval)\n page.sellBttn.removeAttribute('disabled')\n page.buyBttn.removeAttribute('disabled')\n return\n }\n\n if (baseAssetApprovalStatus !== ApprovalStatus.Approved && quoteAssetApprovalStatus === ApprovalStatus.Approved) {\n page.sellBttn.setAttribute('disabled', 'disabled')\n page.buyBttn.removeAttribute('disabled')\n this.setBuy()\n Doc.show(page.approvalRequiredSell)\n Doc.hide(page.approvalRequiredBuy, page.approvalRequiredBoth)\n }\n\n if (baseAssetApprovalStatus === ApprovalStatus.Approved && quoteAssetApprovalStatus !== ApprovalStatus.Approved) {\n page.buyBttn.setAttribute('disabled', 'disabled')\n page.sellBttn.removeAttribute('disabled')\n this.setSell()\n Doc.show(page.approvalRequiredBuy)\n Doc.hide(page.approvalRequiredSell, page.approvalRequiredBoth)\n }\n\n // If they are both unapproved tokens, the order form will not be shown.\n if (baseAssetApprovalStatus !== ApprovalStatus.Approved && quoteAssetApprovalStatus !== ApprovalStatus.Approved) {\n Doc.show(page.approvalRequiredBoth)\n Doc.hide(page.approvalRequiredSell, page.approvalRequiredBuy)\n }\n\n Doc.show(page.tokenApproval)\n page.approvalPendingBaseSymbol.textContent = page.baseTokenAsset.textContent = this.market.base.symbol.toUpperCase()\n page.approvalPendingQuoteSymbol.textContent = page.quoteTokenAsset.textContent = this.market.quote.symbol.toUpperCase()\n Doc.setVis(baseAssetApprovalStatus === ApprovalStatus.NotApproved, page.approveBaseBttn)\n Doc.setVis(quoteAssetApprovalStatus === ApprovalStatus.NotApproved, page.approveQuoteBttn)\n Doc.setVis(baseAssetApprovalStatus === ApprovalStatus.Pending, page.approvalPendingBase)\n Doc.setVis(quoteAssetApprovalStatus === ApprovalStatus.Pending, page.approvalPendingQuote)\n }\n\n /* setRegistrationStatusView sets the text content and class for the\n * registration status view\n */\n setRegistrationStatusView (titleContent: string, confStatusMsg: string, titleClass: string) {\n const page = this.page\n page.regStatusTitle.textContent = titleContent\n page.regStatusConfsDisplay.textContent = confStatusMsg\n page.registrationStatus.classList.remove('completed', 'error', 'waiting')\n page.registrationStatus.classList.add(titleClass)\n }\n\n /*\n * updateRegistrationStatusView updates the view based on the current\n * registration status\n */\n updateRegistrationStatusView () {\n const { page, market: { dex } } = this\n page.regStatusDex.textContent = dex.host\n page.postingBondsDex.textContent = dex.host\n\n if (dex.auth.effectiveTier >= 1) {\n this.setRegistrationStatusView(intl.prep(intl.ID_REGISTRATION_FEE_SUCCESS), '', 'completed')\n return\n }\n\n const confStatuses = (dex.auth.pendingBonds || []).map(pending => {\n const confirmationsRequired = dex.bondAssets[pending.symbol].confs\n return `${pending.confs} / ${confirmationsRequired}`\n })\n const confStatusMsg = confStatuses.join(', ')\n this.setRegistrationStatusView(intl.prep(intl.ID_WAITING_FOR_CONFS), confStatusMsg, 'waiting')\n }\n\n /*\n * setRegistrationStatusVisibility toggles the registration status view based\n * on the dex data.\n */\n setRegistrationStatusVisibility () {\n const { page, market } = this\n if (!market || !market.dex) return\n\n // If dex is not connected to server, is not possible to know the\n // registration status.\n if (market.dex.connectionStatus !== ConnectionStatus.Connected) return\n\n this.updateRegistrationStatusView()\n\n const showSection = (section: PageElement | undefined) => {\n const elements = [page.registrationStatus, page.bondRequired, page.bondCreationPending, page.notRegistered, page.penaltyCompsRequired]\n for (const el of elements) {\n Doc.setVis(el === section, el)\n }\n }\n\n if (market.dex.auth.effectiveTier >= 1) {\n const toggle = async () => {\n showSection(undefined)\n this.resolveOrderFormVisibility()\n }\n if (Doc.isHidden(page.orderForm)) {\n // wait a couple of seconds before showing the form so the success\n // message is shown to the user\n setTimeout(toggle, 5000)\n return\n }\n toggle()\n } else if (market.dex.viewOnly) {\n page.unregisteredDex.textContent = market.dex.host\n showSection(page.notRegistered)\n } else if (market.dex.auth.targetTier > 0 && market.dex.auth.rep.penalties > market.dex.auth.penaltyComps) {\n page.acctPenalties.textContent = `${market.dex.auth.rep.penalties}`\n page.acctPenaltyComps.textContent = `${market.dex.auth.penaltyComps}`\n page.compsDexSettingsLink.href = `/dexsettings/${market.dex.host}`\n showSection(page.penaltyCompsRequired)\n } else if (this.hasPendingBonds()) {\n showSection(page.registrationStatus)\n } else if (market.dex.auth.targetTier > 0) {\n showSection(page.bondCreationPending)\n } else {\n page.acctTier.textContent = `${market.dex.auth.effectiveTier}`\n page.dexSettingsLink.href = `/dexsettings/${market.dex.host}`\n showSection(page.bondRequired)\n }\n }\n\n setOrderBttnText () {\n if (this.isSell()) {\n this.page.submitBttn.textContent = intl.prep(intl.ID_SET_BUTTON_SELL, { asset: Doc.shortSymbol(this.market.baseCfg.unitInfo.conventional.unit) })\n } else this.page.submitBttn.textContent = intl.prep(intl.ID_SET_BUTTON_BUY, { asset: Doc.shortSymbol(this.market.baseCfg.unitInfo.conventional.unit) })\n }\n\n setOrderBttnEnabled (isEnabled: boolean, disabledTooltipMsg?: string) {\n const btn = this.page.submitBttn\n if (isEnabled) {\n btn.removeAttribute('disabled')\n btn.removeAttribute('title')\n } else {\n btn.setAttribute('disabled', 'true')\n if (disabledTooltipMsg) btn.setAttribute('title', disabledTooltipMsg)\n }\n }\n\n updateOrderBttnState () {\n const { market: mkt, currentOrder: { qty: orderQty, rate: orderRate, isLimit, sell } } = this\n const baseWallet = app().assets[this.market.base.id].wallet\n const quoteWallet = app().assets[mkt.quote.id].wallet\n if (!baseWallet || !quoteWallet) return\n\n if (orderQty <= 0 || orderQty < mkt.cfg.lotsize) {\n this.setOrderBttnEnabled(false, intl.prep(intl.ID_ORDER_BUTTON_QTY_ERROR))\n return\n }\n\n // Market orders\n if (!isLimit) {\n if (sell) {\n this.setOrderBttnEnabled(orderQty <= baseWallet.balance.available, intl.prep(intl.ID_ORDER_BUTTON_SELL_BALANCE_ERROR))\n } else {\n this.setOrderBttnEnabled(orderQty <= quoteWallet.balance.available, intl.prep(intl.ID_ORDER_BUTTON_BUY_BALANCE_ERROR))\n }\n return\n }\n\n if (!orderRate) {\n this.setOrderBttnEnabled(false, intl.prep(intl.ID_ORDER_BUTTON_QTY_RATE_ERROR))\n return\n }\n\n // Limit sell\n if (sell) {\n if (baseWallet.balance.available < mkt.cfg.lotsize) {\n this.setOrderBttnEnabled(false, intl.prep(intl.ID_ORDER_BUTTON_SELL_BALANCE_ERROR))\n return\n }\n if (mkt.maxSell) {\n this.setOrderBttnEnabled(orderQty <= mkt.maxSell.swap.value, intl.prep(intl.ID_ORDER_BUTTON_SELL_BALANCE_ERROR))\n }\n return\n }\n\n // Limit buy\n const rate = this.adjustedRate()\n const aLot = mkt.cfg.lotsize * (rate / OrderUtil.RateEncodingFactor)\n if (quoteWallet.balance.available < aLot) {\n this.setOrderBttnEnabled(false, intl.prep(intl.ID_ORDER_BUTTON_BUY_BALANCE_ERROR))\n return\n }\n if (mkt.maxBuys[rate]) {\n const enable = orderQty <= mkt.maxBuys[rate].swap.lots * mkt.cfg.lotsize\n this.setOrderBttnEnabled(enable, intl.prep(intl.ID_ORDER_BUTTON_BUY_BALANCE_ERROR))\n }\n }\n\n setCandleDurBttns () {\n const { page, market } = this\n Doc.empty(page.durBttnBox)\n for (const dur of market.dex.candleDurs) {\n const bttn = page.durBttnTemplate.cloneNode(true)\n bttn.textContent = dur\n Doc.bind(bttn, 'click', () => this.candleDurationSelected(dur))\n page.durBttnBox.appendChild(bttn)\n }\n\n // load candlesticks here since we are resetting page.durBttnBox above.\n this.loadCandles()\n }\n\n /* setMarket sets the currently displayed market. */\n async setMarket (host: string, baseID: number, quoteID: number) {\n const dex = app().user.exchanges[host]\n const page = this.page\n\n window.cexBook = async () => {\n const res = await postJSON('/api/cexbook', { host, baseID, quoteID })\n console.log(res.book)\n }\n\n // reset form inputs\n page.lotField.value = ''\n page.qtyField.value = ''\n page.rateField.value = ''\n\n // clear depth chart and orderbook.\n this.depthChart.clear()\n Doc.empty(this.page.buyRows)\n Doc.empty(this.page.sellRows)\n\n // Clear recent matches for the previous market. This will be set when we\n // receive the order book subscription response.\n this.recentMatches = []\n Doc.empty(page.recentMatchesLiveList)\n\n // Hide the balance widget\n this.balanceWgt.setBalanceVisibility(false)\n\n Doc.hide(page.notRegistered, page.bondRequired, page.noWallet, page.penaltyCompsRequired)\n\n // If we have not yet connected, there is no dex.assets or any other\n // exchange data, so just put up a message and wait for the connection to be\n // established, at which time handleConnNote will refresh and reload.\n if (!dex || !dex.markets || dex.connectionStatus !== ConnectionStatus.Connected) {\n let errMsg = intl.prep(intl.ID_CONNECTION_FAILED)\n if (dex.disabled) errMsg = intl.prep(intl.ID_DEX_DISABLED_MSG)\n page.chartErrMsg.textContent = errMsg\n Doc.show(page.chartErrMsg)\n return\n }\n\n for (const s of this.stats) Doc.show(s.row)\n\n const baseCfg = dex.assets[baseID]\n const quoteCfg = dex.assets[quoteID]\n\n const [bui, qui] = [app().unitInfo(baseID, dex), app().unitInfo(quoteID, dex)]\n\n const rateConversionFactor = OrderUtil.RateEncodingFactor / bui.conventional.conversionFactor * qui.conventional.conversionFactor\n Doc.hide(page.maxOrd, page.chartErrMsg)\n if (this.maxEstimateTimer) {\n window.clearTimeout(this.maxEstimateTimer)\n this.maxEstimateTimer = null\n }\n const mktId = marketID(baseCfg.symbol, quoteCfg.symbol)\n const baseAsset = app().assets[baseID]\n const quoteAsset = app().assets[quoteID]\n\n const mkt = {\n dex: dex,\n sid: mktId, // A string market identifier used by the DEX.\n cfg: dex.markets[mktId],\n // app().assets is a map of core.SupportedAsset type, which can be found at\n // client/core/types.go.\n base: baseAsset,\n quote: quoteAsset,\n baseUnitInfo: bui,\n quoteUnitInfo: qui,\n maxSell: null,\n maxBuys: {},\n maxSellRequested: false,\n candleCaches: {},\n baseCfg,\n quoteCfg,\n rateConversionFactor,\n sellBalance: 0,\n buyBalance: 0,\n bookLoaded: false\n }\n\n this.market = mkt\n this.mm.setMarket(host, baseID, quoteID)\n this.mmRunning = undefined\n page.lotSize.textContent = Doc.formatCoinValue(mkt.cfg.lotsize, mkt.baseUnitInfo)\n page.rateStep.textContent = Doc.formatCoinValue(mkt.cfg.ratestep / rateConversionFactor)\n\n this.displayMessageIfMissingWallet()\n this.balanceWgt.setWallets(host, baseID, quoteID)\n this.setMarketDetails()\n this.setCurrMarketPrice()\n\n // if (!dex.candleDurs || dex.candleDurs.length === 0) this.currentChart = depthChart\n\n // depth chart\n ws.request('loadmarket', makeMarket(host, baseID, quoteID))\n\n State.storeLocal(State.lastMarketLK, {\n host: host,\n base: baseID,\n quote: quoteID\n })\n app().updateMarketElements(this.main, baseID, quoteID, dex)\n this.marketList.select(host, baseID, quoteID)\n this.setLoaderMsgVisibility()\n this.setTokenApprovalVisibility()\n this.setRegistrationStatusVisibility()\n this.resolveOrderFormVisibility()\n this.setOrderBttnText()\n this.setOrderBttnEnabled(false, intl.prep(intl.ID_ORDER_BUTTON_QTY_RATE_ERROR))\n this.setCandleDurBttns()\n this.previewQuoteAmt(false)\n this.updateTitle()\n this.reputationMeter.setHost(dex.host)\n this.updateReputation()\n this.loadUserOrders()\n }\n\n /*\n displayMessageForMissingWallet displays a custom message on the market's\n view if one or more of the selected market's wallet is missing.\n */\n displayMessageIfMissingWallet () {\n const page = this.page\n const mkt = this.market\n const baseSym = mkt.baseCfg.symbol.toLocaleUpperCase()\n const quoteSym = mkt.quoteCfg.symbol.toLocaleUpperCase()\n let noWalletMsg = ''\n Doc.hide(page.noWallet)\n if (!mkt.base?.wallet && !mkt.quote?.wallet) noWalletMsg = intl.prep(intl.ID_NO_WALLET_MSG, { asset1: baseSym, asset2: quoteSym })\n else if (!mkt.base?.wallet) noWalletMsg = intl.prep(intl.ID_CREATE_ASSET_WALLET_MSG, { asset: baseSym })\n else if (!mkt.quote?.wallet) noWalletMsg = intl.prep(intl.ID_CREATE_ASSET_WALLET_MSG, { asset: quoteSym })\n else return\n\n page.noWallet.textContent = noWalletMsg\n Doc.show(page.noWallet)\n }\n\n /*\n * reportDepthClick is a callback used by the DepthChart when the user clicks\n * on the chart area. The rate field is set to the x-value of the click.\n */\n reportDepthClick (r: number) {\n this.page.rateField.value = String(r)\n this.rateFieldChanged()\n }\n\n /*\n * reportDepthVolume accepts a volume report from the DepthChart and sets the\n * values in the chart legend.\n */\n reportDepthVolume (r: VolumeReport) {\n const page = this.page\n const { baseUnitInfo: b, quoteUnitInfo: q } = this.market\n // DepthChart reports volumes in conventional units. We'll still use\n // formatCoinValue for formatting though.\n page.sellBookedBase.textContent = Doc.formatCoinValue(r.sellBase * b.conventional.conversionFactor, b)\n page.sellBookedQuote.textContent = Doc.formatCoinValue(r.sellQuote * q.conventional.conversionFactor, q)\n page.buyBookedBase.textContent = Doc.formatCoinValue(r.buyBase * b.conventional.conversionFactor, b)\n page.buyBookedQuote.textContent = Doc.formatCoinValue(r.buyQuote * q.conventional.conversionFactor, q)\n }\n\n /*\n * reportDepthMouse accepts information about the mouse position on the chart\n * area.\n */\n reportDepthMouse (r: MouseReport) {\n while (this.hovers.length) (this.hovers.shift() as HTMLElement).classList.remove('hover')\n const page = this.page\n if (!r) {\n Doc.hide(page.depthLegend)\n return\n }\n Doc.show(page.depthLegend)\n\n // If the user is hovered to within a small percent (based on chart width)\n // of a user order, highlight that order's row.\n for (const { div, ord } of Object.values(this.metaOrders)) {\n if (ord.status !== OrderUtil.StatusBooked) continue\n if (r.hoverMarkers.indexOf(ord.rate) > -1) {\n div.classList.add('hover')\n this.hovers.push(div)\n }\n }\n\n page.hoverPrice.textContent = Doc.formatCoinValue(r.rate)\n page.hoverVolume.textContent = Doc.formatCoinValue(r.depth)\n page.hoverVolume.style.color = r.dotColor\n }\n\n /*\n * reportDepthZoom accepts information about the current depth chart zoom\n * level. This information is saved to disk so that the zoom level can be\n * maintained across reloads.\n */\n reportDepthZoom (zoom: number) {\n State.storeLocal(State.depthZoomLK, zoom)\n }\n\n reportMouseCandle (candle: Candle | null) {\n const page = this.page\n if (!candle) {\n Doc.hide(page.candlesLegend)\n return\n }\n Doc.show(page.candlesLegend)\n page.candleStart.textContent = Doc.formatCoinValue(candle.startRate / this.market.rateConversionFactor)\n page.candleEnd.textContent = Doc.formatCoinValue(candle.endRate / this.market.rateConversionFactor)\n page.candleHigh.textContent = Doc.formatCoinValue(candle.highRate / this.market.rateConversionFactor)\n page.candleLow.textContent = Doc.formatCoinValue(candle.lowRate / this.market.rateConversionFactor)\n page.candleVol.textContent = Doc.formatCoinValue(candle.matchVolume, this.market.baseUnitInfo)\n }\n\n /*\n * parseOrder pulls the order information from the form fields. Data is not\n * validated in any way.\n */\n parseOrder (): TradeForm {\n const page = this.page\n let qtyField = page.qtyField\n const limit = this.isLimit()\n const sell = this.isSell()\n const market = this.market\n let qtyConv = market.baseUnitInfo.conventional.conversionFactor\n if (!limit && !sell) {\n qtyField = page.mktBuyField\n qtyConv = market.quoteUnitInfo.conventional.conversionFactor\n }\n return {\n host: market.dex.host,\n isLimit: limit,\n sell: sell,\n base: market.base.id,\n quote: market.quote.id,\n qty: convertToAtoms(qtyField.value || '', qtyConv),\n rate: convertToAtoms(page.rateField.value || '', market.rateConversionFactor), // message-rate\n tifnow: page.tifNow.checked || false,\n options: {}\n }\n }\n\n /**\n * previewQuoteAmt shows quote amount when rate or quantity input are changed\n */\n previewQuoteAmt (show: boolean) {\n const page = this.page\n if (!this.market.base || !this.market.quote) return // Not a supported asset\n const order = this.currentOrder = this.parseOrder()\n const adjusted = this.adjustedRate()\n page.orderErr.textContent = ''\n if (adjusted) {\n if (order.sell) this.preSell()\n else this.preBuy()\n }\n this.depthLines.input = []\n if (adjusted && this.isLimit()) {\n this.depthLines.input = [{\n rate: order.rate / this.market.rateConversionFactor,\n color: order.sell ? this.depthChart.theme.sellLine : this.depthChart.theme.buyLine\n }]\n }\n this.drawChartLines()\n if (!show || !adjusted || !order.qty) {\n page.orderPreview.textContent = ''\n this.drawChartLines()\n return\n }\n const { unitInfo: { conventional: { unit } } } = app().assets[order.quote]\n const quoteQty = order.qty * order.rate / OrderUtil.RateEncodingFactor\n const total = Doc.formatCoinValue(quoteQty, this.market.quoteUnitInfo)\n\n page.orderPreview.textContent = intl.prep(intl.ID_ORDER_PREVIEW, { total, asset: unit })\n if (this.isSell()) this.preSell()\n else this.preBuy()\n }\n\n /**\n * preSell populates the max order message for the largest available sell.\n */\n preSell () {\n const mkt = this.market\n const baseWallet = app().assets[mkt.base.id].wallet\n if (baseWallet.balance.available < mkt.cfg.lotsize) {\n this.setMaxOrder(null)\n this.updateOrderBttnState()\n return\n }\n if (mkt.maxSell) {\n this.setMaxOrder(mkt.maxSell.swap)\n this.updateOrderBttnState()\n return\n }\n\n if (mkt.maxSellRequested) return\n mkt.maxSellRequested = true\n // We only fetch pre-sell once per balance update, so don't delay.\n this.scheduleMaxEstimate('/api/maxsell', {}, 0, (res: MaxSell) => {\n mkt.maxSellRequested = false\n mkt.maxSell = res.maxSell\n mkt.sellBalance = baseWallet.balance.available\n this.setMaxOrder(res.maxSell.swap)\n this.updateOrderBttnState()\n })\n }\n\n /**\n * preBuy populates the max order message for the largest available buy.\n */\n preBuy () {\n const mkt = this.market\n const rate = this.adjustedRate()\n const quoteWallet = app().assets[mkt.quote.id].wallet\n if (!quoteWallet) return\n const aLot = mkt.cfg.lotsize * (rate / OrderUtil.RateEncodingFactor)\n if (quoteWallet.balance.available < aLot) {\n this.setMaxOrder(null)\n this.updateOrderBttnState()\n return\n }\n if (mkt.maxBuys[rate]) {\n this.setMaxOrder(mkt.maxBuys[rate].swap)\n this.updateOrderBttnState()\n return\n }\n // 0 delay for first fetch after balance update or market change, otherwise\n // meter these at 1 / sec.\n const delay = Object.keys(mkt.maxBuys).length ? 350 : 0\n this.scheduleMaxEstimate('/api/maxbuy', { rate }, delay, (res: MaxBuy) => {\n mkt.maxBuys[rate] = res.maxBuy\n mkt.buyBalance = app().assets[mkt.quote.id].wallet.balance.available\n this.setMaxOrder(res.maxBuy.swap)\n this.updateOrderBttnState()\n })\n }\n\n /**\n * scheduleMaxEstimate shows the loading icon and schedules a call to an order\n * estimate api endpoint. If another call to scheduleMaxEstimate is made before\n * this one is fired (after delay), this call will be canceled.\n */\n scheduleMaxEstimate (path: string, args: any, delay: number, success: (res: any) => void) {\n const page = this.page\n if (!this.maxLoaded) this.maxLoaded = app().loading(page.maxOrd)\n const [bid, qid] = [this.market.base.id, this.market.quote.id]\n const [bWallet, qWallet] = [app().assets[bid].wallet, app().assets[qid].wallet]\n if (!bWallet || !bWallet.running || !qWallet || !qWallet.running) return\n if (this.maxEstimateTimer) window.clearTimeout(this.maxEstimateTimer)\n\n Doc.show(page.maxOrd, page.maxLotBox)\n Doc.hide(page.maxAboveZero, page.maxZeroNoFees, page.maxZeroNoBal)\n page.maxFromLots.textContent = intl.prep(intl.ID_CALCULATING)\n page.maxFromLotsLbl.textContent = ''\n this.maxOrderUpdateCounter++\n const counter = this.maxOrderUpdateCounter\n this.maxEstimateTimer = window.setTimeout(async () => {\n this.maxEstimateTimer = null\n if (counter !== this.maxOrderUpdateCounter) return\n const res = await postJSON(path, {\n host: this.market.dex.host,\n base: bid,\n quote: qid,\n ...args\n })\n if (counter !== this.maxOrderUpdateCounter) return\n if (!app().checkResponse(res)) {\n console.warn('max order estimate not available:', res)\n page.maxFromLots.textContent = intl.prep(intl.ID_ESTIMATE_UNAVAILABLE)\n if (this.maxLoaded) {\n this.maxLoaded()\n this.maxLoaded = null\n }\n return\n }\n success(res)\n }, delay)\n }\n\n /* setMaxOrder sets the max order text. */\n setMaxOrder (maxOrder: SwapEstimate | null) {\n const page = this.page\n if (this.maxLoaded) {\n this.maxLoaded()\n this.maxLoaded = null\n }\n Doc.show(page.maxOrd, page.maxLotBox)\n const sell = this.isSell()\n\n let lots = 0\n if (maxOrder) lots = maxOrder.lots\n\n page.maxFromLots.textContent = lots.toString()\n // XXX add plural into format details, so we don't need this\n page.maxFromLotsLbl.textContent = intl.prep(lots === 1 ? intl.ID_LOT : intl.ID_LOTS)\n if (!maxOrder) return\n\n const fromAsset = sell ? this.market.base : this.market.quote\n\n if (lots === 0) {\n // If we have a maxOrder, see if we can guess why we have no lots.\n let lotSize = this.market.cfg.lotsize\n if (!sell) {\n const conversionRate = this.anyRate()[1]\n if (conversionRate === 0) return\n lotSize = lotSize * conversionRate\n }\n const haveQty = fromAsset.wallet.balance.available / lotSize > 0\n if (haveQty) {\n if (fromAsset.token) {\n const { wallet: { balance: { available: feeAvail } }, unitInfo } = app().assets[fromAsset.token.parentID]\n if (feeAvail < maxOrder.feeReservesPerLot) {\n Doc.show(page.maxZeroNoFees)\n page.maxZeroNoFeesTicker.textContent = unitInfo.conventional.unit\n page.maxZeroMinFees.textContent = Doc.formatCoinValue(maxOrder.feeReservesPerLot, unitInfo)\n }\n // It looks like we should be able to afford it, but maybe some fees we're not seeing.\n // Show nothing.\n return\n }\n // Not a token. Maybe we have enough for the swap but not for fees.\n const fundedLots = fromAsset.wallet.balance.available / (lotSize + maxOrder.feeReservesPerLot)\n if (fundedLots > 0) return // Not sure why. Could be split txs or utxos. Just show nothing.\n }\n Doc.show(page.maxZeroNoBal)\n page.maxZeroNoBalTicker.textContent = fromAsset.unitInfo.conventional.unit\n return\n }\n Doc.show(page.maxAboveZero)\n\n page.maxFromAmt.textContent = Doc.formatCoinValue(maxOrder.value || 0, fromAsset.unitInfo)\n page.maxFromTicker.textContent = fromAsset.unitInfo.conventional.unit\n // Could subtract the maxOrder.redemptionFees here.\n // The qty conversion doesn't fit well with the new design.\n // TODO: Make this work somehow?\n // const toConversion = sell ? this.adjustedRate() / OrderUtil.RateEncodingFactor : OrderUtil.RateEncodingFactor / this.adjustedRate()\n // page.maxToAmt.textContent = Doc.formatCoinValue((maxOrder.value || 0) * toConversion, toAsset.unitInfo)\n // page.maxToTicker.textContent = toAsset.symbol.toUpperCase()\n }\n\n /*\n * validateOrder performs some basic order sanity checks, returning boolean\n * true if the order appears valid.\n */\n validateOrder (order: TradeForm) {\n const { page, market: { cfg: { minimumRate }, rateConversionFactor } } = this\n if (order.isLimit) {\n if (!order.rate) {\n Doc.show(page.orderErr)\n page.orderErr.textContent = intl.prep(intl.ID_NO_ZERO_RATE)\n return false\n }\n if (order.rate < minimumRate) {\n Doc.show(page.orderErr)\n const [r, minRate] = [order.rate / rateConversionFactor, minimumRate / rateConversionFactor]\n page.orderErr.textContent = `rate is lower than the market's minimum rate. ${r} < ${minRate}`\n return false\n }\n }\n if (!order.qty) {\n Doc.show(page.orderErr)\n page.orderErr.textContent = intl.prep(intl.ID_NO_ZERO_QUANTITY)\n return false\n }\n return true\n }\n\n /* handleBook accepts the data sent in the 'book' notification. */\n handleBook (data: MarketOrderBook) {\n const { cfg, baseUnitInfo, quoteUnitInfo, baseCfg, quoteCfg } = this.market\n this.book = new OrderBook(data, baseCfg.symbol, quoteCfg.symbol)\n this.loadTable()\n for (const order of (data.book.epoch || [])) {\n if (order.rate > 0) this.book.add(order)\n this.addTableOrder(order)\n }\n if (!this.book) {\n this.depthChart.clear()\n Doc.empty(this.page.buyRows)\n Doc.empty(this.page.sellRows)\n return\n }\n Doc.show(this.page.epochLine)\n if (this.loadingAnimations.depth) this.loadingAnimations.depth.stop()\n this.depthChart.canvas.classList.remove('invisible')\n this.depthChart.set(this.book, cfg.lotsize, cfg.ratestep, baseUnitInfo, quoteUnitInfo)\n this.recentMatches = data.book.recentMatches ?? []\n this.refreshRecentMatchesTable()\n }\n\n /*\n * midGapConventional is the same as midGap, but returns the mid-gap rate as\n * the conventional ratio. This is used to convert from a conventional\n * quantity from base to quote or vice-versa, or for display purposes.\n */\n midGapConventional () {\n const gap = this.midGap()\n if (!gap) return gap\n const { baseUnitInfo: b, quoteUnitInfo: q } = this.market\n return gap * b.conventional.conversionFactor / q.conventional.conversionFactor\n }\n\n /*\n * midGap returns the value in the middle of the best buy and best sell. If\n * either one of the buy or sell sides are empty, midGap returns the best rate\n * from the other side. If both sides are empty, midGap returns the value\n * null. The rate returned is the atomic ratio, used for conversion. For a\n * conventional rate for display or to convert conventional units, use\n * midGapConventional\n */\n midGap () {\n const book = this.book\n if (!book) return\n if (book.buys && book.buys.length) {\n if (book.sells && book.sells.length) {\n return (book.buys[0].msgRate + book.sells[0].msgRate) / 2 / OrderUtil.RateEncodingFactor\n }\n return book.buys[0].msgRate / OrderUtil.RateEncodingFactor\n }\n if (book.sells && book.sells.length) {\n return book.sells[0].msgRate / OrderUtil.RateEncodingFactor\n }\n return null\n }\n\n /*\n * setMarketBuyOrderEstimate sets the \"min. buy\" display for the current\n * market.\n */\n setMarketBuyOrderEstimate () {\n const market = this.market\n const lotSize = market.cfg.lotsize\n const xc = app().user.exchanges[market.dex.host]\n const buffer = xc.markets[market.sid].buybuffer\n const gap = this.midGapConventional()\n if (gap) {\n this.page.minMktBuy.textContent = Doc.formatCoinValue(lotSize * buffer * gap, market.baseUnitInfo)\n }\n }\n\n maxUserOrderCount (): number {\n const { dex: { host }, cfg: { name: mktID } } = this.market\n return Math.max(maxUserOrdersShown, app().orders(host, mktID).length)\n }\n\n async loadUserOrders () {\n const { base: b, quote: q, dex: { host }, cfg: { name: mktID } } = this.market\n for (const oid in this.metaOrders) delete this.metaOrders[oid]\n if (!b || !q) return this.resolveUserOrders([]) // unsupported asset\n const activeOrders = app().orders(host, mktID)\n if (activeOrders.length >= maxUserOrdersShown) return this.resolveUserOrders(activeOrders)\n const filter: OrderFilter = {\n hosts: [host],\n market: { baseID: b.id, quoteID: q.id },\n n: this.maxUserOrderCount()\n }\n const res = await postJSON('/api/orders', filter)\n const orders = res.orders || []\n // Make sure all active orders are in there. The /orders API sorts by time,\n // so if there is are 10 cancelled/executed orders newer than an old active\n // order, the active order wouldn't be included in the result.\n for (const activeOrd of activeOrders) if (!orders.some((dbOrd: Order) => dbOrd.id === activeOrd.id)) orders.push(activeOrd)\n return this.resolveUserOrders(res.orders || [])\n }\n\n /* refreshActiveOrders refreshes the user's active order list. */\n refreshActiveOrders () {\n const orders = app().orders(this.market.dex.host, marketID(this.market.baseCfg.symbol, this.market.quoteCfg.symbol))\n return this.resolveUserOrders(orders)\n }\n\n resolveUserOrders (orders: Order[]) {\n const { page, metaOrders, market } = this\n const cfg = market.cfg\n\n const orderIsActive = (ord: Order) => ord.status < OrderUtil.StatusExecuted || OrderUtil.hasActiveMatches(ord)\n\n for (const ord of orders) metaOrders[ord.id] = { ord: ord } as MetaOrder\n let sortedOrders = Object.keys(metaOrders).map((oid: string) => metaOrders[oid])\n sortedOrders.sort((a: MetaOrder, b: MetaOrder) => {\n const [aActive, bActive] = [orderIsActive(a.ord), orderIsActive(b.ord)]\n if (aActive && !bActive) return -1\n else if (!aActive && bActive) return 1\n return b.ord.submitTime - a.ord.submitTime\n })\n const n = this.maxUserOrderCount()\n if (sortedOrders.length > n) { sortedOrders = sortedOrders.slice(0, n) }\n\n for (const oid in metaOrders) delete metaOrders[oid]\n\n Doc.empty(page.userOrders)\n Doc.setVis(sortedOrders?.length, page.userOrders)\n Doc.setVis(!sortedOrders?.length, page.userNoOrders)\n\n let unreadyOrders = false\n for (const mord of sortedOrders) {\n const div = page.userOrderTmpl.cloneNode(true) as HTMLElement\n page.userOrders.appendChild(div)\n const tmpl = Doc.parseTemplate(div)\n const header = Doc.parseTemplate(tmpl.header)\n const details = Doc.parseTemplate(tmpl.details)\n\n mord.div = div\n mord.header = header\n mord.details = details\n const ord = mord.ord\n\n const orderID = ord.id\n const isActive = orderIsActive(ord)\n\n // No need to track in-flight orders here. We've already added it to\n // display.\n if (orderID) metaOrders[orderID] = mord\n\n if (!ord.readyToTick && OrderUtil.hasActiveMatches(ord)) {\n tmpl.header.classList.add('unready-user-order')\n unreadyOrders = true\n }\n header.sideLight.classList.add(ord.sell ? 'sell' : 'buy')\n if (!isActive) header.sideLight.classList.add('inactive')\n details.side.textContent = mord.header.side.textContent = OrderUtil.sellString(ord)\n details.side.classList.add(ord.sell ? 'sellcolor' : 'buycolor')\n header.side.classList.add(ord.sell ? 'sellcolor' : 'buycolor')\n details.qty.textContent = mord.header.qty.textContent = Doc.formatCoinValue(ord.qty, market.baseUnitInfo)\n let rateStr: string\n if (ord.type === OrderUtil.Market) rateStr = this.marketOrderRateString(ord, market)\n else rateStr = Doc.formatRateFullPrecision(ord.rate, market.baseUnitInfo, market.quoteUnitInfo, cfg.ratestep)\n details.rate.textContent = mord.header.rate.textContent = rateStr\n header.baseSymbol.textContent = market.baseUnitInfo.conventional.unit\n details.type.textContent = OrderUtil.orderTypeText(ord.type)\n this.updateMetaOrder(mord)\n\n Doc.bind(div, 'mouseenter', () => {\n this.activeMarkerRate = ord.rate\n this.setDepthMarkers()\n })\n\n const showCancel = (e: Event) => {\n e.stopPropagation()\n this.showCancel(div, orderID)\n }\n\n const showAccelerate = (e: Event) => {\n e.stopPropagation()\n this.showAccelerate(ord)\n }\n\n if (!orderID) {\n Doc.hide(details.accelerateBttn)\n Doc.hide(details.cancelBttn)\n Doc.hide(details.link)\n } else {\n if (OrderUtil.isCancellable(ord)) {\n Doc.show(details.cancelBttn)\n bind(details.cancelBttn, 'click', (e: Event) => { showCancel(e) })\n }\n\n bind(details.accelerateBttn, 'click', (e: Event) => { showAccelerate(e) })\n if (app().canAccelerateOrder(ord)) {\n Doc.show(details.accelerateBttn)\n }\n\n details.link.href = `order/${orderID}`\n app().bindInternalNavigation(div)\n }\n let currentFloater: (PageElement | null)\n Doc.bind(tmpl.header, 'click', () => {\n if (Doc.isDisplayed(tmpl.details)) {\n Doc.hide(tmpl.details)\n header.expander.classList.add('ico-arrowdown')\n header.expander.classList.remove('ico-arrowup')\n return\n }\n Doc.show(tmpl.details)\n header.expander.classList.remove('ico-arrowdown')\n header.expander.classList.add('ico-arrowup')\n if (currentFloater) currentFloater.remove()\n })\n /**\n * We'll show the button menu when they hover over the header. To avoid\n * pushing the layout around, we'll show the buttons as an absolutely\n * positioned copy of the button menu.\n */\n Doc.bind(tmpl.header, 'mouseenter', () => {\n // Don't show the copy if the details are already displayed.\n if (Doc.isDisplayed(tmpl.details)) return\n if (currentFloater) currentFloater.remove()\n // Create and position the element based on the position of the header.\n const floater = document.createElement('div')\n currentFloater = floater\n document.body.appendChild(floater)\n floater.className = 'user-order-floaty-menu'\n const m = Doc.layoutMetrics(tmpl.header)\n const y = m.bodyTop + m.height\n floater.style.top = `${y - 1}px` // - 1 to hide border on header div\n floater.style.left = `${m.bodyLeft}px`\n // Get the updated version of the order\n const mord = this.metaOrders[orderID]\n const ord = mord.ord\n\n const addButton = (baseBttn: PageElement, cb: ((e: Event) => void)) => {\n const icon = baseBttn.cloneNode(true) as PageElement\n floater.appendChild(icon)\n Doc.show(icon)\n Doc.bind(icon, 'click', (e: Event) => { cb(e) })\n }\n\n if (OrderUtil.isCancellable(ord)) addButton(details.cancelBttn, (e: Event) => { showCancel(e) })\n if (app().canAccelerateOrder(ord)) addButton(details.accelerateBttn, (e: Event) => { showAccelerate(e) })\n floater.appendChild(details.link.cloneNode(true))\n\n const ogScrollY = page.orderScroller.scrollTop\n // Set up the hover interactions.\n const moved = (e: MouseEvent) => {\n // If the user scrolled, reposition the float menu. This keeps the\n // menu from following us around, which can prevent removal below.\n const yShift = page.orderScroller.scrollTop - ogScrollY\n floater.style.top = `${y + yShift}px`\n if (Doc.mouseInElement(e, floater) || Doc.mouseInElement(e, div)) return\n floater.remove()\n currentFloater = null\n document.removeEventListener('mousemove', moved)\n page.orderScroller.removeEventListener('scroll', moved)\n }\n document.addEventListener('mousemove', moved)\n page.orderScroller.addEventListener('scroll', moved)\n })\n app().bindTooltips(div)\n }\n Doc.setVis(unreadyOrders, page.unreadyOrdersMsg)\n this.setDepthMarkers()\n }\n\n /*\n marketOrderRateString uses the market config rate step to format the average\n market order rate.\n */\n marketOrderRateString (ord: Order, mkt: CurrentMarket) :string {\n if (!ord.matches?.length) return intl.prep(intl.ID_MARKET_ORDER)\n let rateStr = Doc.formatRateFullPrecision(OrderUtil.averageRate(ord), mkt.baseUnitInfo, mkt.quoteUnitInfo, mkt.cfg.ratestep)\n if (ord.matches.length > 1) rateStr = '~ ' + rateStr // ~ only makes sense if the order has more than one match\n return rateStr\n }\n\n /*\n * updateMetaOrder sets the td contents of the user's order table row.\n */\n updateMetaOrder (mord: MetaOrder) {\n const { header, details, ord } = mord\n if (ord.status <= OrderUtil.StatusBooked || OrderUtil.hasActiveMatches(ord)) header.activeLight.classList.add('active')\n else header.activeLight.classList.remove('active')\n details.status.textContent = header.status.textContent = OrderUtil.statusString(ord)\n details.age.textContent = Doc.timeSince(ord.submitTime)\n details.filled.textContent = `${(OrderUtil.filled(ord) / ord.qty * 100).toFixed(1)}%`\n details.settled.textContent = `${(OrderUtil.settled(ord) / ord.qty * 100).toFixed(1)}%`\n }\n\n /* setMarkers sets the depth chart markers for booked orders. */\n setDepthMarkers () {\n const markers: Record<string, DepthMarker[]> = {\n buys: [],\n sells: []\n }\n const rateFactor = this.market.rateConversionFactor\n for (const { ord } of Object.values(this.metaOrders)) {\n if (ord.rate && ord.status === OrderUtil.StatusBooked) {\n if (ord.sell) {\n markers.sells.push({\n rate: ord.rate / rateFactor,\n active: ord.rate === this.activeMarkerRate\n })\n } else {\n markers.buys.push({\n rate: ord.rate / rateFactor,\n active: ord.rate === this.activeMarkerRate\n })\n }\n }\n }\n this.depthChart.setMarkers(markers)\n if (this.book) this.depthChart.draw()\n }\n\n /* updateTitle update the browser title based on the midgap value and the\n * selected assets.\n */\n updateTitle () {\n // gets first price value from buy or from sell, so we can show it on\n // title.\n const midGapValue = this.midGapConventional()\n const { baseUnitInfo: { conventional: { unit: bUnit } }, quoteUnitInfo: { conventional: { unit: qUnit } } } = this.market\n if (!midGapValue) document.title = `${bUnit}${qUnit} | ${this.ogTitle}`\n else document.title = `${Doc.formatCoinValue(midGapValue)} | ${bUnit}${qUnit} | ${this.ogTitle}` // more than 6 numbers it gets too big for the title.\n }\n\n /* handleBookRoute is the handler for the 'book' notification, which is sent\n * in response to a new market subscription. The data received will contain\n * the entire order book.\n */\n handleBookRoute (note: BookUpdate) {\n app().log('book', 'handleBookRoute:', note)\n const mktBook = note.payload\n const { baseCfg: b, quoteCfg: q, dex: { host } } = this.market\n if (mktBook.base !== b.id || mktBook.quote !== q.id || note.host !== host) return // user already changed markets\n this.handleBook(mktBook)\n this.market.bookLoaded = true\n this.updateTitle()\n this.setMarketBuyOrderEstimate()\n }\n\n /* handleBookOrderRoute is the handler for 'book_order' notifications. */\n handleBookOrderRoute (data: BookUpdate) {\n app().log('book', 'handleBookOrderRoute:', data)\n if (data.host !== this.market.dex.host || data.marketID !== this.market.sid) return\n const order = data.payload as MiniOrder\n if (order.rate > 0) this.book.add(order)\n this.addTableOrder(order)\n this.updateTitle()\n this.depthChart.draw()\n }\n\n /* handleUnbookOrderRoute is the handler for 'unbook_order' notifications. */\n handleUnbookOrderRoute (data: BookUpdate) {\n app().log('book', 'handleUnbookOrderRoute:', data)\n if (data.host !== this.market.dex.host || data.marketID !== this.market.sid) return\n const order = data.payload\n this.book.remove(order.token)\n this.removeTableOrder(order)\n this.updateTitle()\n this.depthChart.draw()\n }\n\n /*\n * handleUpdateRemainingRoute is the handler for 'update_remaining'\n * notifications.\n */\n handleUpdateRemainingRoute (data: BookUpdate) {\n app().log('book', 'handleUpdateRemainingRoute:', data)\n if (data.host !== this.market.dex.host || data.marketID !== this.market.sid) return\n const update = data.payload\n this.book.updateRemaining(update.token, update.qty, update.qtyAtomic)\n this.updateTableOrder(update)\n this.depthChart.draw()\n }\n\n /* handleEpochOrderRoute is the handler for 'epoch_order' notifications. */\n handleEpochOrderRoute (data: BookUpdate) {\n app().log('book', 'handleEpochOrderRoute:', data)\n if (data.host !== this.market.dex.host || data.marketID !== this.market.sid) return\n const order = data.payload\n if (order.msgRate > 0) this.book.add(order) // No cancels or market orders\n if (order.qtyAtomic > 0) this.addTableOrder(order) // No cancel orders\n this.depthChart.draw()\n }\n\n /* handleCandlesRoute is the handler for 'candles' notifications. */\n handleCandlesRoute (data: BookUpdate) {\n if (this.candlesLoading) {\n clearTimeout(this.candlesLoading.timer)\n this.candlesLoading.loaded()\n this.candlesLoading = null\n }\n if (data.host !== this.market.dex.host || data.marketID !== this.market.cfg.name) return\n const dur = data.payload.dur\n this.market.candleCaches[dur] = data.payload\n this.setHighLow()\n if (this.candleDur !== dur) return\n if (this.loadingAnimations.candles) this.loadingAnimations.candles.stop()\n this.candleChart.canvas.classList.remove('invisible')\n this.candleChart.setCandles(data.payload, this.market.cfg, this.market.baseUnitInfo, this.market.quoteUnitInfo)\n }\n\n handleEpochMatchSummary (data: BookUpdate) {\n this.addRecentMatches(data.payload.matchSummaries)\n this.refreshRecentMatchesTable()\n }\n\n /* handleCandleUpdateRoute is the handler for 'candle_update' notifications. */\n handleCandleUpdateRoute (data: BookUpdate) {\n if (data.host !== this.market.dex.host) return\n const { dur, candle } = data.payload\n const cache = this.market.candleCaches[dur]\n if (!cache) return // must not have seen the 'candles' notification yet?\n const candles = cache.candles\n if (candles.length === 0) candles.push(candle)\n else {\n const last = candles[candles.length - 1]\n if (last.startStamp === candle.startStamp) candles[candles.length - 1] = candle\n else candles.push(candle)\n }\n if (this.candleDur !== dur) return\n this.candleChart.draw()\n }\n\n /*\n * showToggleWalletStatus displays the toggleWalletStatusConfirm form to\n * enable a wallet.\n */\n showToggleWalletStatus (asset: SupportedAsset) {\n const page = this.page\n this.openAsset = asset\n Doc.hide(page.toggleWalletStatusErr, page.walletStatusDisable, page.disableWalletMsg)\n Doc.show(page.walletStatusEnable, page.enableWalletMsg)\n this.forms.show(page.toggleWalletStatusConfirm)\n }\n\n /*\n * toggleWalletStatus toggle wallets status to enabled.\n */\n async toggleWalletStatus () {\n const page = this.page\n Doc.hide(page.toggleWalletStatusErr)\n\n const url = '/api/togglewalletstatus'\n const req = {\n assetID: this.openAsset.id,\n disable: false\n }\n\n const loaded = app().loading(page.toggleWalletStatusConfirm)\n const res = await postJSON(url, req)\n loaded()\n if (!app().checkResponse(res)) {\n page.toggleWalletStatusErr.textContent = res.msg\n Doc.show(page.toggleWalletStatusErr)\n return\n }\n\n Doc.hide(this.page.forms)\n this.balanceWgt.updateAsset(this.openAsset.id)\n }\n\n /* showVerify shows the form to accept the currently parsed order information\n * and confirm submission of the order to the dex.\n */\n showVerify () {\n this.preorderCache = {}\n const page = this.page\n const order = this.currentOrder = this.parseOrder()\n const isSell = order.sell\n const baseAsset = app().assets[order.base]\n const quoteAsset = app().assets[order.quote]\n const toAsset = isSell ? quoteAsset : baseAsset\n const fromAsset = isSell ? baseAsset : quoteAsset\n\n const setIcon = (icon: PageElement) => {\n switch (icon.dataset.icon) {\n case 'from':\n if (fromAsset.token) {\n const parentAsset = app().assets[fromAsset.token.parentID]\n icon.src = Doc.logoPath(parentAsset.symbol)\n } else {\n icon.src = Doc.logoPath(fromAsset.symbol)\n }\n break\n case 'to':\n if (toAsset.token) {\n const parentAsset = app().assets[toAsset.token.parentID]\n icon.src = Doc.logoPath(parentAsset.symbol)\n } else {\n icon.src = Doc.logoPath(toAsset.symbol)\n }\n }\n }\n\n // Set the to and from icons in the fee details pane.\n for (const icon of Doc.applySelector(page.vDetailPane, '[data-icon]')) {\n setIcon(icon)\n }\n\n // Set the to and from icons in the fee summary pane.\n for (const icon of Doc.applySelector(page.vFeeSummary, '[data-icon]')) {\n setIcon(icon)\n }\n\n Doc.hide(page.vPreorderErr)\n Doc.show(page.vPreorder)\n\n page.vBuySell.textContent = isSell ? intl.prep(intl.ID_SELLING) : intl.prep(intl.ID_BUYING)\n const buySellStr = isSell ? intl.prep(intl.ID_SELL) : intl.prep(intl.ID_BUY)\n page.vSideSubmit.textContent = buySellStr\n page.vOrderHost.textContent = order.host\n if (order.isLimit) {\n Doc.show(page.verifyLimit)\n Doc.hide(page.verifyMarket)\n const orderDesc = `Limit ${buySellStr} Order`\n page.vOrderType.textContent = order.tifnow ? orderDesc + ' (immediate)' : orderDesc\n page.vRate.textContent = Doc.formatCoinValue(order.rate / this.market.rateConversionFactor)\n page.vQty.textContent = Doc.formatCoinValue(order.qty, baseAsset.unitInfo)\n const total = order.rate / OrderUtil.RateEncodingFactor * order.qty\n page.vTotal.textContent = Doc.formatCoinValue(total, quoteAsset.unitInfo)\n // Format total fiat value.\n this.showFiatValue(quoteAsset.id, total, page.vFiatTotal)\n } else {\n Doc.hide(page.verifyLimit)\n Doc.show(page.verifyMarket)\n page.vOrderType.textContent = `Market ${buySellStr} Order`\n const ui = order.sell ? this.market.baseUnitInfo : this.market.quoteUnitInfo\n page.vmFromTotal.textContent = Doc.formatCoinValue(order.qty, ui)\n page.vmFromAsset.textContent = fromAsset.symbol.toUpperCase()\n // Format fromAsset fiat value.\n this.showFiatValue(fromAsset.id, order.qty, page.vmFromTotalFiat)\n const gap = this.midGap()\n if (gap) {\n Doc.show(page.vMarketEstimate)\n const received = order.sell ? order.qty * gap : order.qty / gap\n page.vmToTotal.textContent = Doc.formatCoinValue(received, toAsset.unitInfo)\n page.vmToAsset.textContent = toAsset.symbol.toUpperCase()\n // Format received value to fiat equivalent.\n this.showFiatValue(toAsset.id, received, page.vmTotalFiat)\n } else {\n Doc.hide(page.vMarketEstimate)\n }\n }\n // Visually differentiate between buy/sell orders.\n if (isSell) {\n page.vHeader.classList.add(sellBtnClass)\n page.vHeader.classList.remove(buyBtnClass)\n page.vSubmit.classList.add(sellBtnClass)\n page.vSubmit.classList.remove(buyBtnClass)\n } else {\n page.vHeader.classList.add(buyBtnClass)\n page.vHeader.classList.remove(sellBtnClass)\n page.vSubmit.classList.add(buyBtnClass)\n page.vSubmit.classList.remove(sellBtnClass)\n }\n this.showVerifyForm()\n\n if (baseAsset.wallet.open && quoteAsset.wallet.open) this.preOrder(order)\n else {\n Doc.hide(page.vPreorder)\n this.unlockWalletsForEstimates()\n }\n }\n\n // showFiatValue displays the fiat equivalent for an order quantity.\n showFiatValue (assetID: number, qty: number, display: PageElement) {\n if (display) {\n const rate = app().fiatRatesMap[assetID]\n display.textContent = Doc.formatFiatConversion(qty, rate, app().unitInfo(assetID))\n if (rate) Doc.show(display.parentElement as Element)\n else Doc.hide(display.parentElement as Element)\n }\n }\n\n /* showVerifyForm displays form to verify an order */\n async showVerifyForm () {\n const page = this.page\n Doc.hide(page.vErr)\n this.forms.show(page.verifyForm)\n }\n\n /*\n * unlockWalletsForEstimates unlocks any locked wallets with the provided\n * password.\n */\n async unlockWalletsForEstimates () {\n const page = this.page\n const loaded = app().loading(page.verifyForm)\n await this.unlockMarketWallets()\n loaded()\n Doc.show(page.vPreorder)\n this.preOrder(this.parseOrder())\n }\n\n async unlockWallet (assetID: number) {\n const res = await postJSON('/api/openwallet', { assetID })\n if (!app().checkResponse(res)) {\n throw Error('error unlocking wallet ' + res.msg)\n }\n this.balanceWgt.updateAsset(assetID)\n }\n\n /*\n * unlockMarketWallets unlocks both the base and quote wallets for the current\n * market, if locked.\n */\n async unlockMarketWallets () {\n const { base, quote } = this.market\n const assetIDs = []\n if (!base.wallet.open) assetIDs.push(base.id)\n if (!quote.wallet.open) assetIDs.push(quote.id)\n for (const assetID of assetIDs) {\n this.unlockWallet(assetID)\n }\n }\n\n /* fetchPreorder fetches the pre-order estimates and options. */\n async fetchPreorder (order: TradeForm) {\n const page = this.page\n const cacheKey = JSON.stringify(order.options)\n const cached = this.preorderCache[cacheKey]\n if (cached) return cached\n\n Doc.hide(page.vPreorderErr)\n const loaded = app().loading(page.verifyForm)\n const res = await postJSON('/api/preorder', wireOrder(order))\n loaded()\n if (!app().checkResponse(res)) return { err: res.msg }\n this.preorderCache[cacheKey] = res.estimate\n return res.estimate\n }\n\n /*\n * setPreorderErr sets and displays the pre-order error message and hides the\n * pre-order details box.\n */\n setPreorderErr (msg: string) {\n const page = this.page\n Doc.hide(page.vPreorder)\n Doc.show(page.vPreorderErr)\n page.vPreorderErrTip.dataset.tooltip = msg\n }\n\n showPreOrderAdvancedOptions () {\n const page = this.page\n Doc.hide(page.showAdvancedOptions)\n Doc.show(page.hideAdvancedOptions, page.vOtherOrderOpts)\n }\n\n hidePreOrderAdvancedOptions () {\n const page = this.page\n Doc.hide(page.hideAdvancedOptions, page.vOtherOrderOpts)\n Doc.show(page.showAdvancedOptions)\n }\n\n reloadOrderOpts (order: TradeForm, swap: PreSwap, redeem: PreRedeem, changed: ()=>void) {\n const page = this.page\n Doc.empty(page.vDefaultOrderOpts, page.vOtherOrderOpts)\n const addOption = (opt: OrderOption, isSwap: boolean) => {\n const el = OrderUtil.optionElement(opt, order, changed, isSwap)\n if (opt.showByDefault) page.vDefaultOrderOpts.appendChild(el)\n else page.vOtherOrderOpts.appendChild(el)\n }\n for (const opt of swap.options || []) addOption(opt, true)\n for (const opt of redeem.options || []) addOption(opt, false)\n app().bindTooltips(page.vDefaultOrderOpts)\n app().bindTooltips(page.vOtherOrderOpts)\n }\n\n /* preOrder loads the options and fetches pre-order estimates */\n async preOrder (order: TradeForm) {\n const page = this.page\n\n // Add swap options.\n const refreshPreorder = async () => {\n const res: APIResponse = await this.fetchPreorder(order)\n if (res.err) return this.setPreorderErr(res.err)\n const est = (res as any) as OrderEstimate\n Doc.hide(page.vPreorderErr)\n Doc.show(page.vPreorder)\n const { swap, redeem } = est\n swap.options = swap.options || []\n redeem.options = redeem.options || []\n this.setFeeEstimates(swap, redeem, order)\n\n const changed = async () => {\n await refreshPreorder()\n Doc.animate(400, progress => {\n page.vFeeSummary.style.backgroundColor = `rgba(128, 128, 128, ${0.5 - 0.5 * progress})`\n })\n }\n // bind show or hide advanced pre order options.\n Doc.bind(page.showAdvancedOptions, 'click', () => { this.showPreOrderAdvancedOptions() })\n Doc.bind(page.hideAdvancedOptions, 'click', () => { this.hidePreOrderAdvancedOptions() })\n this.reloadOrderOpts(order, swap, redeem, changed)\n }\n\n refreshPreorder()\n }\n\n /* setFeeEstimates sets all of the pre-order estimate fields */\n setFeeEstimates (swap: PreSwap, redeem: PreRedeem, order: TradeForm) {\n const { page, market } = this\n if (!swap.estimate || !redeem.estimate) {\n Doc.hide(page.vPreorderEstimates)\n return // preOrder may return just options, no fee estimates\n }\n Doc.show(page.vPreorderEstimates)\n const { baseUnitInfo, quoteUnitInfo, rateConversionFactor } = market\n const fmtPct = (value: number) => {\n if (value < 0.05) return '< 0.1'\n return percentFormatter.format(value)\n }\n\n // If the asset is a token, in order to calculate the fee as a percentage\n // of the total order, we try to use the fiat rates to find out the\n // exchange rate between the token and parent assets.\n // Initially these are set to 1, which we would use if the asset is not a\n // token and no conversion is needed.\n let baseExchangeRate = 1\n let quoteExchangeRate = 1\n let baseFeeAssetUI = baseUnitInfo\n let quoteFeeAssetUI = quoteUnitInfo\n\n if (market.base.token) {\n const parent = app().assets[market.base.token.parentID]\n baseFeeAssetUI = parent.unitInfo\n const tokenFiatRate = app().fiatRatesMap[market.base.id]\n const parentFiatRate = app().fiatRatesMap[parent.id]\n if (tokenFiatRate && parentFiatRate) {\n const conventionalRate = parentFiatRate / tokenFiatRate\n baseExchangeRate = conventionalRate * baseUnitInfo.conventional.conversionFactor / parent.unitInfo.conventional.conversionFactor\n } else {\n baseExchangeRate = 0\n }\n }\n\n if (market.quote.token) {\n const parent = app().assets[market.quote.token.parentID]\n quoteFeeAssetUI = parent.unitInfo\n const tokenFiatRate = app().fiatRatesMap[market.quote.id]\n const parentFiatRate = app().fiatRatesMap[parent.id]\n if (tokenFiatRate && parentFiatRate) {\n const conventionalRate = parentFiatRate / tokenFiatRate\n quoteExchangeRate = conventionalRate * quoteUnitInfo.conventional.conversionFactor / parent.unitInfo.conventional.conversionFactor\n } else {\n quoteExchangeRate = 0\n }\n }\n\n let [toFeeAssetUI, fromFeeAssetUI] = [baseFeeAssetUI, quoteFeeAssetUI]\n let [toExchangeRate, fromExchangeRate] = [baseExchangeRate, quoteExchangeRate]\n if (this.currentOrder.sell) {\n [fromFeeAssetUI, toFeeAssetUI] = [toFeeAssetUI, fromFeeAssetUI];\n [fromExchangeRate, toExchangeRate] = [toExchangeRate, fromExchangeRate]\n }\n\n const swapped = swap.estimate.value || 0\n const swappedInParentUnits = fromExchangeRate > 0 ? swapped / fromExchangeRate : swapped\n\n // Set swap fee estimates in the details pane.\n const bestSwapPct = swap.estimate.realisticBestCase / swappedInParentUnits * 100\n page.vSwapFeesLowPct.textContent = fromExchangeRate <= 0 ? '' : `(${fmtPct(bestSwapPct)}%)`\n page.vSwapFeesLow.textContent = Doc.formatCoinValue(swap.estimate.realisticBestCase, fromFeeAssetUI)\n\n const worstSwapPct = swap.estimate.realisticWorstCase / swappedInParentUnits * 100\n page.vSwapFeesHighPct.textContent = fromExchangeRate <= 0 ? '' : `(${fmtPct(worstSwapPct)}%)`\n page.vSwapFeesHigh.textContent = Doc.formatCoinValue(swap.estimate.realisticWorstCase, fromFeeAssetUI)\n\n const swapFeesMaxPct = swap.estimate.maxFees / swappedInParentUnits * 100\n page.vSwapFeesMaxPct.textContent = fromExchangeRate <= 0 ? '' : `(${fmtPct(swapFeesMaxPct)}%)`\n page.vSwapFeesMax.textContent = Doc.formatCoinValue(swap.estimate.maxFees, fromFeeAssetUI)\n\n // Set redemption fee estimates in the details pane.\n const midGap = this.midGap()\n const estRate = midGap || order.rate / rateConversionFactor\n const received = order.sell ? swapped * estRate : swapped / estRate\n const receivedInParentUnits = toExchangeRate > 0 ? received / toExchangeRate : received\n\n const bestRedeemPct = redeem.estimate.realisticBestCase / receivedInParentUnits * 100\n page.vRedeemFeesLowPct.textContent = toExchangeRate <= 0 ? '' : `(${fmtPct(bestRedeemPct)}%)`\n page.vRedeemFeesLow.textContent = Doc.formatCoinValue(redeem.estimate.realisticBestCase, toFeeAssetUI)\n\n const worstRedeemPct = redeem.estimate.realisticWorstCase / receivedInParentUnits * 100\n page.vRedeemFeesHighPct.textContent = toExchangeRate <= 0 ? '' : `(${fmtPct(worstRedeemPct)}%)`\n page.vRedeemFeesHigh.textContent = Doc.formatCoinValue(redeem.estimate.realisticWorstCase, toFeeAssetUI)\n\n if (baseExchangeRate && quoteExchangeRate) {\n Doc.show(page.vFeeSummaryPct)\n Doc.hide(page.vFeeSummary)\n page.vFeeSummaryLow.textContent = fmtPct(bestSwapPct + bestRedeemPct)\n page.vFeeSummaryHigh.textContent = fmtPct(worstSwapPct + worstRedeemPct)\n } else {\n Doc.hide(page.vFeeSummaryPct)\n Doc.show(page.vFeeSummary)\n page.summarySwapFeesLow.textContent = page.vSwapFeesLow.textContent\n page.summarySwapFeesHigh.textContent = page.vSwapFeesHigh.textContent\n page.summaryRedeemFeesLow.textContent = page.vRedeemFeesLow.textContent\n page.summaryRedeemFeesHigh.textContent = page.vRedeemFeesHigh.textContent\n }\n }\n\n async submitCancel () {\n // this will be the page.cancelSubmit button (evt.currentTarget)\n const page = this.page\n const cancelData = this.cancelData\n const order = cancelData.order\n const req = {\n orderID: order.id\n }\n // Toggle the loader and submit button.\n const loaded = app().loading(page.cancelSubmit)\n const res = await postJSON('/api/cancel', req)\n loaded()\n // Display error on confirmation modal.\n if (!app().checkResponse(res)) {\n page.cancelErr.textContent = res.msg\n Doc.show(page.cancelErr)\n return\n }\n // Hide confirmation modal only on success.\n Doc.hide(cancelData.bttn, page.forms)\n order.cancelling = true\n }\n\n /* showCancel shows a form to confirm submission of a cancel order. */\n showCancel (row: HTMLElement, orderID: string) {\n const ord = this.metaOrders[orderID].ord\n const page = this.page\n const remaining = ord.qty - ord.filled\n const asset = OrderUtil.isMarketBuy(ord) ? this.market.quote : this.market.base\n page.cancelRemain.textContent = Doc.formatCoinValue(remaining, asset.unitInfo)\n page.cancelUnit.textContent = asset.symbol.toUpperCase()\n Doc.hide(page.cancelErr)\n this.forms.show(page.cancelForm)\n this.cancelData = {\n bttn: Doc.tmplElement(row, 'cancelBttn'),\n order: ord\n }\n }\n\n /* showAccelerate shows the accelerate order form. */\n showAccelerate (order: Order) {\n const loaded = app().loading(this.main)\n this.accelerateOrderForm.refresh(order)\n loaded()\n this.forms.show(this.page.accelerateForm)\n }\n\n /* showCreate shows the new wallet creation form. */\n showCreate (asset: SupportedAsset) {\n const page = this.page\n this.currentCreate = asset\n this.newWalletForm.setAsset(asset.id)\n this.forms.show(page.newWalletForm)\n }\n\n /*\n * stepSubmit will examine the current state of wallets and step the user\n * through the process of order submission.\n * NOTE: I expect this process will be streamlined soon such that the wallets\n * will attempt to be unlocked in the order submission process, negating the\n * need to unlock ahead of time.\n */\n stepSubmit () {\n const page = this.page\n const market = this.market\n Doc.hide(page.orderErr)\n if (!this.validateOrder(this.parseOrder())) return\n const baseWallet = app().walletMap[market.base.id]\n const quoteWallet = app().walletMap[market.quote.id]\n if (!baseWallet) {\n page.orderErr.textContent = intl.prep(intl.ID_NO_ASSET_WALLET, { asset: market.base.symbol })\n Doc.show(page.orderErr)\n return\n }\n if (!quoteWallet) {\n page.orderErr.textContent = intl.prep(intl.ID_NO_ASSET_WALLET, { asset: market.quote.symbol })\n Doc.show(page.orderErr)\n return\n }\n this.showVerify()\n }\n\n /* Display a deposit address. */\n async showDeposit (assetID: number) {\n this.depositAddrForm.setAsset(assetID)\n this.forms.show(this.page.deposit)\n }\n\n showCustomProviderDialog (assetID: number) {\n app().loadPage('wallets', { promptProvider: assetID, goBack: 'markets' })\n }\n\n /*\n * handlePriceUpdate is the handler for the 'spots' notification.\n */\n handlePriceUpdate (note: SpotPriceNote) {\n if (!this.market) return // This note can arrive before the market is set.\n if (note.host === this.market.dex.host && note.spots[this.market.cfg.name]) {\n this.setCurrMarketPrice()\n }\n this.marketList.updateSpots(note)\n }\n\n async handleWalletState (note: WalletStateNote) {\n if (!this.market) return // This note can arrive before the market is set.\n // if (note.topic !== 'TokenApproval') return\n if (note.wallet.assetID !== this.market.base?.id && note.wallet.assetID !== this.market.quote?.id) return\n this.setTokenApprovalVisibility()\n this.resolveOrderFormVisibility()\n }\n\n /*\n * handleBondUpdate is the handler for the 'bondpost' notification type.\n * This is used to update the registration status of the current exchange.\n */\n async handleBondUpdate (note: BondNote) {\n const dexAddr = note.dex\n if (!this.market) return // This note can arrive before the market is set.\n if (dexAddr !== this.market.dex.host) return\n // If we just finished legacy registration, we need to update the Exchange.\n // TODO: Use tier change notification once available.\n if (note.topic === 'AccountRegistered') await app().fetchUser()\n // Update local copy of Exchange.\n this.market.dex = app().exchanges[dexAddr]\n this.setRegistrationStatusVisibility()\n this.updateReputation()\n }\n\n updateReputation () {\n const { page, market: { dex: { host }, cfg: mkt, baseCfg: { unitInfo: bui }, quoteCfg: { unitInfo: qui } } } = this\n const { auth } = app().exchanges[host]\n\n page.parcelSizeLots.textContent = String(mkt.parcelsize)\n page.marketLimitBase.textContent = Doc.formatFourSigFigs(mkt.parcelsize * mkt.lotsize / bui.conventional.conversionFactor)\n page.marketLimitBaseUnit.textContent = bui.conventional.unit\n page.marketLimitQuoteUnit.textContent = qui.conventional.unit\n const conversionRate = this.anyRate()[1]\n if (conversionRate) {\n const quoteLot = mkt.lotsize * conversionRate\n page.marketLimitQuote.textContent = Doc.formatFourSigFigs(mkt.parcelsize * quoteLot / qui.conventional.conversionFactor)\n } else page.marketLimitQuote.textContent = '-'\n\n const tier = strongTier(auth)\n page.tradingTier.textContent = String(tier)\n const [usedParcels, parcelLimit] = tradingLimits(host)\n page.tradingLimit.textContent = (parcelLimit * mkt.parcelsize).toFixed(2)\n page.limitUsage.textContent = parcelLimit > 0 ? (usedParcels / parcelLimit * 100).toFixed(1) : '0'\n\n page.orderLimitRemain.textContent = ((parcelLimit - usedParcels) * mkt.parcelsize).toFixed(1)\n page.orderTradingTier.textContent = String(tier)\n\n this.reputationMeter.update()\n }\n\n /*\n * anyRate finds the best rate from any of, in order of priority, the order\n * book, the server's reported spot rate, or the fiat exchange rates. A\n * 3-tuple of message-rate encoding, a conversion rate, and a conventional\n * rate is generated.\n */\n anyRate (): [number, number, number] {\n const { cfg: { spot }, baseCfg: { id: baseID }, quoteCfg: { id: quoteID }, rateConversionFactor, bookLoaded } = this.market\n if (bookLoaded) {\n const midGap = this.midGap()\n if (midGap) return [midGap * OrderUtil.RateEncodingFactor, midGap, this.midGapConventional() || 0]\n }\n if (spot && spot.rate) return [spot.rate, spot.rate / OrderUtil.RateEncodingFactor, spot.rate / rateConversionFactor]\n const [baseUSD, quoteUSD] = [app().fiatRatesMap[baseID], app().fiatRatesMap[quoteID]]\n if (baseUSD && quoteUSD) {\n const conventionalRate = baseUSD / quoteUSD\n const msgRate = conventionalRate * rateConversionFactor\n const conversionRate = msgRate / OrderUtil.RateEncodingFactor\n return [msgRate, conversionRate, conventionalRate]\n }\n return [0, 0, 0]\n }\n\n handleMatchNote (note: MatchNote) {\n const mord = this.metaOrders[note.orderID]\n const match = note.match\n if (!mord) return this.refreshActiveOrders()\n else if (mord.ord.type === OrderUtil.Market && match.status === OrderUtil.NewlyMatched) { // Update the average market rate display.\n // Fetch and use the updated order.\n const ord = app().order(note.orderID)\n if (ord) mord.details.rate.textContent = mord.header.rate.textContent = this.marketOrderRateString(ord, this.market)\n }\n if (\n (match.side === OrderUtil.MatchSideMaker && match.status === OrderUtil.MakerRedeemed) ||\n (match.side === OrderUtil.MatchSideTaker && match.status === OrderUtil.MatchComplete)\n ) this.updateReputation()\n if (app().canAccelerateOrder(mord.ord)) Doc.show(mord.details.accelerateBttn)\n else Doc.hide(mord.details.accelerateBttn)\n }\n\n /*\n * handleOrderNote is the handler for the 'order'-type notification, which are\n * used to update a user's order's status.\n */\n handleOrderNote (note: OrderNote) {\n const ord = note.order\n const mord = this.metaOrders[ord.id]\n // - If metaOrder doesn't exist for the given order it means it was created\n // via bwctl and the GUI isn't aware of it or it was an inflight order.\n // refreshActiveOrders must be called to grab this order.\n // - If an OrderLoaded notification is recieved, it means an order that was\n // previously not \"ready to tick\" (due to its wallets not being connected\n // and unlocked) has now become ready to tick. The active orders section\n // needs to be refreshed.\n const wasInflight = note.topic === 'AsyncOrderFailure' || note.topic === 'AsyncOrderSubmitted'\n if (!mord || wasInflight || (note.topic === 'OrderLoaded' && ord.readyToTick)) {\n return this.refreshActiveOrders()\n }\n const oldStatus = mord.ord.status\n mord.ord = ord\n if (note.topic === 'MissedCancel') Doc.show(mord.details.cancelBttn)\n if (ord.filled === ord.qty) Doc.hide(mord.details.cancelBttn)\n if (app().canAccelerateOrder(ord)) Doc.show(mord.details.accelerateBttn)\n else Doc.hide(mord.details.accelerateBttn)\n this.updateMetaOrder(mord)\n // Only reset markers if there is a change, since the chart is redrawn.\n if (\n (oldStatus === OrderUtil.StatusEpoch && ord.status === OrderUtil.StatusBooked) ||\n (oldStatus === OrderUtil.StatusBooked && ord.status > OrderUtil.StatusBooked)\n ) {\n this.setDepthMarkers()\n this.updateReputation()\n this.mm.readBook()\n }\n }\n\n /*\n * handleEpochNote handles notifications signalling the start of a new epoch.\n */\n handleEpochNote (note: EpochNote) {\n app().log('book', 'handleEpochNote:', note)\n if (!this.market) return // This note can arrive before the market is set.\n if (note.host !== this.market.dex.host || note.marketID !== this.market.sid) return\n if (this.book) {\n this.book.setEpoch(note.epoch)\n this.depthChart.draw()\n }\n\n this.clearOrderTableEpochs()\n for (const { ord, details, header } of Object.values(this.metaOrders)) {\n const alreadyMatched = note.epoch > ord.epoch\n switch (true) {\n case ord.type === OrderUtil.Limit && ord.status === OrderUtil.StatusEpoch && alreadyMatched: {\n const status = ord.tif === OrderUtil.ImmediateTiF ? intl.prep(intl.ID_EXECUTED) : intl.prep(intl.ID_BOOKED)\n details.status.textContent = header.status.textContent = status\n ord.status = ord.tif === OrderUtil.ImmediateTiF ? OrderUtil.StatusExecuted : OrderUtil.StatusBooked\n break\n }\n case ord.type === OrderUtil.Market && ord.status === OrderUtil.StatusEpoch:\n // Technically don't know if this should be 'executed' or 'settling'.\n details.status.textContent = header.status.textContent = intl.prep(intl.ID_EXECUTED)\n ord.status = OrderUtil.StatusExecuted\n break\n }\n }\n }\n\n /*\n * recentMatchesSortCompare returns sort compare function according to the active\n * sort key and direction.\n */\n recentMatchesSortCompare () {\n switch (this.recentMatchesSortKey) {\n case 'rate':\n return (a: RecentMatch, b: RecentMatch) => this.recentMatchesSortDirection * (a.rate - b.rate)\n case 'qty':\n return (a: RecentMatch, b: RecentMatch) => this.recentMatchesSortDirection * (a.qty - b.qty)\n case 'age':\n return (a: RecentMatch, b:RecentMatch) => this.recentMatchesSortDirection * (a.stamp - b.stamp)\n }\n }\n\n refreshRecentMatchesTable () {\n const page = this.page\n const recentMatches = this.recentMatches\n Doc.empty(page.recentMatchesLiveList)\n if (!recentMatches) return\n const compare = this.recentMatchesSortCompare()\n recentMatches.sort(compare)\n for (const match of recentMatches) {\n const row = page.recentMatchesTemplate.cloneNode(true) as HTMLElement\n const tmpl = Doc.parseTemplate(row)\n app().bindTooltips(row)\n tmpl.rate.textContent = Doc.formatCoinValue(match.rate / this.market.rateConversionFactor)\n tmpl.qty.textContent = Doc.formatCoinValue(match.qty, this.market.baseUnitInfo)\n tmpl.age.textContent = Doc.timeSince(match.stamp)\n tmpl.age.dataset.sinceStamp = String(match.stamp)\n row.classList.add(match.sell ? 'sellcolor' : 'buycolor')\n page.recentMatchesLiveList.append(row)\n }\n }\n\n addRecentMatches (matches: RecentMatch[]) {\n this.recentMatches = [...matches, ...this.recentMatches].slice(0, 100)\n }\n\n /* handleBalanceNote handles notifications updating a wallet's balance. */\n handleBalanceNote (note: BalanceNote) {\n this.approveTokenForm.handleBalanceNote(note)\n this.preorderCache = {} // invalidate previous preorder results\n // if connection to dex server fails, it is not possible to retrieve\n // markets.\n const mkt = this.market\n if (!mkt || !mkt.dex || mkt.dex.connectionStatus !== ConnectionStatus.Connected) return\n\n this.mm.handleBalanceNote(note)\n const wgt = this.balanceWgt\n // Display the widget if the balance note is for its base or quote wallet.\n if ((note.assetID === wgt.base.id || note.assetID === wgt.quote.id)) wgt.setBalanceVisibility(true)\n\n // If there's a balance update, refresh the max order section.\n const avail = note.balance.available\n switch (note.assetID) {\n case mkt.baseCfg.id:\n // If we're not showing the max order panel yet, don't do anything.\n if (!mkt.maxSell) break\n if (typeof mkt.sellBalance === 'number' && mkt.sellBalance !== avail) mkt.maxSell = null\n if (this.isSell()) this.preSell()\n break\n case mkt.quoteCfg.id:\n if (!Object.keys(mkt.maxBuys).length) break\n if (typeof mkt.buyBalance === 'number' && mkt.buyBalance !== avail) mkt.maxBuys = {}\n if (!this.isSell()) this.preBuy()\n }\n }\n\n /*\n * submitOrder is attached to the affirmative button on the order validation\n * form. Clicking the button is the last step in the order submission process.\n */\n async submitOrder () {\n const page = this.page\n Doc.hide(page.orderErr, page.vErr)\n const order = this.currentOrder\n const req = { order: wireOrder(order) }\n if (!this.validateOrder(order)) return\n // Show loader and hide submit button.\n page.vSubmit.classList.add('d-hide')\n page.vLoader.classList.remove('d-hide')\n const res = await postJSON('/api/tradeasync', req)\n // Hide loader and show submit button.\n page.vSubmit.classList.remove('d-hide')\n page.vLoader.classList.add('d-hide')\n // If error, display error on confirmation modal.\n if (!app().checkResponse(res)) {\n page.vErr.textContent = res.msg\n Doc.show(page.vErr)\n return\n }\n // Hide confirmation modal only on success.\n Doc.hide(page.forms)\n this.refreshActiveOrders()\n }\n\n /*\n * createWallet is attached to successful submission of the wallet creation\n * form. createWallet is only called once the form is submitted and a success\n * response is received from the client.\n */\n async createWallet () {\n const user = await app().fetchUser()\n if (!user) return\n const asset = user.assets[this.currentCreate.id]\n Doc.hide(this.page.forms)\n const mkt = this.market\n if (mkt.baseCfg.id === asset.id) mkt.base = asset\n else if (mkt.quoteCfg.id === asset.id) mkt.quote = asset\n this.balanceWgt.updateAsset(asset.id)\n this.displayMessageIfMissingWallet()\n this.resolveOrderFormVisibility()\n }\n\n /* lotChanged is attached to the keyup and change events of the lots input. */\n lotChanged () {\n const page = this.page\n const lots = parseInt(page.lotField.value || '0')\n if (lots <= 0) {\n page.lotField.value = page.lotField.value === '' ? '' : '0'\n page.qtyField.value = ''\n this.previewQuoteAmt(false)\n this.setOrderBttnEnabled(false, intl.prep(intl.ID_ORDER_BUTTON_QTY_ERROR))\n return\n }\n const lotSize = this.market.cfg.lotsize\n const orderQty = lots * lotSize\n page.lotField.value = String(lots)\n // Conversion factor must be a multiple of 10.\n page.qtyField.value = String(orderQty / this.market.baseUnitInfo.conventional.conversionFactor)\n\n if (!this.isLimit() && this.isSell()) {\n const baseWallet = app().assets[this.market.base.id].wallet\n this.setOrderBttnEnabled(orderQty <= baseWallet.balance.available, intl.prep(intl.ID_ORDER_BUTTON_SELL_BALANCE_ERROR))\n }\n this.previewQuoteAmt(true)\n }\n\n /*\n * quantityChanged is attached to the keyup and change events of the quantity\n * input.\n */\n quantityChanged (finalize: boolean) {\n const page = this.page\n const order = this.currentOrder = this.parseOrder()\n if (order.qty < 0) {\n page.lotField.value = '0'\n page.qtyField.value = ''\n this.previewQuoteAmt(false)\n return\n }\n const lotSize = this.market.cfg.lotsize\n const lots = Math.floor(order.qty / lotSize)\n const adjusted = order.qty = this.currentOrder.qty = lots * lotSize\n page.lotField.value = String(lots)\n\n if (!order.isLimit && !order.sell) return\n\n // Conversion factor must be a multiple of 10.\n if (finalize) page.qtyField.value = String(adjusted / this.market.baseUnitInfo.conventional.conversionFactor)\n this.previewQuoteAmt(true)\n }\n\n /*\n * marketBuyChanged is attached to the keyup and change events of the quantity\n * input for the market-buy form.\n */\n marketBuyChanged () {\n const page = this.page\n const qty = convertToAtoms(page.mktBuyField.value || '', this.market.quoteUnitInfo.conventional.conversionFactor)\n const gap = this.midGap()\n if (qty > 0) {\n const quoteWallet = app().assets[this.market.quote.id].wallet\n this.setOrderBttnEnabled(qty <= quoteWallet.balance.available, intl.prep(intl.ID_ORDER_BUTTON_BUY_BALANCE_ERROR))\n } else {\n this.setOrderBttnEnabled(false, intl.prep(intl.ID_ORDER_BUTTON_QTY_ERROR))\n }\n if (!gap || !qty) {\n page.mktBuyLots.textContent = '0'\n page.mktBuyScore.textContent = '0'\n return\n }\n const lotSize = this.market.cfg.lotsize\n const received = qty / gap\n const lots = (received / lotSize)\n page.mktBuyLots.textContent = lots.toFixed(1)\n page.mktBuyScore.textContent = Doc.formatCoinValue(received, this.market.baseUnitInfo)\n }\n\n /*\n * rateFieldChanged is attached to the keyup and change events of the rate\n * input.\n */\n rateFieldChanged () {\n // Truncate to rate step. If it is a market buy order, do not adjust.\n const adjusted = this.adjustedRate()\n if (adjusted <= 0) {\n this.depthLines.input = []\n this.drawChartLines()\n this.page.rateField.value = '0'\n this.previewQuoteAmt(true)\n this.updateOrderBttnState()\n return\n }\n const order = this.currentOrder = this.parseOrder()\n const r = adjusted / this.market.rateConversionFactor\n this.page.rateField.value = String(r)\n this.depthLines.input = [{\n rate: r,\n color: order.sell ? this.depthChart.theme.sellLine : this.depthChart.theme.buyLine\n }]\n this.drawChartLines()\n this.previewQuoteAmt(true)\n this.updateOrderBttnState()\n }\n\n /*\n * adjustedRate is the current rate field rate, rounded down to a\n * multiple of rateStep.\n */\n adjustedRate (): number {\n const v = this.page.rateField.value\n if (!v) return NaN\n const rate = convertToAtoms(v, this.market.rateConversionFactor)\n const rateStep = this.market.cfg.ratestep\n return rate - (rate % rateStep)\n }\n\n /* loadTable reloads the table from the current order book information. */\n loadTable () {\n this.loadTableSide(true)\n this.loadTableSide(false)\n }\n\n /* binOrdersByRateAndEpoch takes a list of sorted orders and returns the\n same orders grouped into arrays. The orders are grouped by their rate\n and whether or not they are epoch queue orders. Epoch queue orders\n will come after non epoch queue orders with the same rate. */\n binOrdersByRateAndEpoch (orders: MiniOrder[]) {\n if (!orders || !orders.length) return []\n const bins = []\n let currEpochBin = []\n let currNonEpochBin = []\n let currRate = orders[0].msgRate\n if (orders[0].epoch) currEpochBin.push(orders[0])\n else currNonEpochBin.push(orders[0])\n for (let i = 1; i < orders.length; i++) {\n if (orders[i].msgRate !== currRate) {\n bins.push(currNonEpochBin)\n bins.push(currEpochBin)\n currEpochBin = []\n currNonEpochBin = []\n currRate = orders[i].msgRate\n }\n if (orders[i].epoch) currEpochBin.push(orders[i])\n else currNonEpochBin.push(orders[i])\n }\n bins.push(currNonEpochBin)\n bins.push(currEpochBin)\n return bins.filter(bin => bin.length > 0)\n }\n\n /* loadTables loads the order book side into its table. */\n loadTableSide (sell: boolean) {\n const bookSide = sell ? this.book.sells : this.book.buys\n const tbody = sell ? this.page.sellRows : this.page.buyRows\n Doc.empty(tbody)\n if (!bookSide || !bookSide.length) return\n const orderBins = this.binOrdersByRateAndEpoch(bookSide)\n orderBins.forEach(bin => { tbody.appendChild(this.orderTableRow(bin)) })\n }\n\n /* addTableOrder adds a single order to the appropriate table. */\n addTableOrder (order: MiniOrder) {\n const tbody = order.sell ? this.page.sellRows : this.page.buyRows\n let row = tbody.firstChild as OrderRow\n // Handle market order differently.\n if (order.rate === 0) {\n if (order.qtyAtomic === 0) return // a cancel order. TODO: maybe make an indicator on the target order, maybe gray out\n // This is a market order.\n if (row && row.manager.getRate() === 0) {\n row.manager.insertOrder(order)\n } else {\n row = this.orderTableRow([order])\n tbody.insertBefore(row, tbody.firstChild)\n }\n return\n }\n // Must be a limit order. Sort by rate. Skip the market order row.\n if (row && row.manager.getRate() === 0) row = row.nextSibling as OrderRow\n while (row) {\n if (row.manager.compare(order) === 0) {\n row.manager.insertOrder(order)\n return\n } else if (row.manager.compare(order) > 0) {\n const tr = this.orderTableRow([order])\n tbody.insertBefore(tr, row)\n return\n }\n row = row.nextSibling as OrderRow\n }\n const tr = this.orderTableRow([order])\n tbody.appendChild(tr)\n }\n\n /* removeTableOrder removes a single order from its table. */\n removeTableOrder (order: MiniOrder) {\n const token = order.token\n for (const tbody of [this.page.sellRows, this.page.buyRows]) {\n for (const tr of (Array.from(tbody.children) as OrderRow[])) {\n if (tr.manager.removeOrder(token)) {\n return\n }\n }\n }\n }\n\n /* updateTableOrder looks for the order in the table and updates the qty */\n updateTableOrder (u: RemainderUpdate) {\n for (const tbody of [this.page.sellRows, this.page.buyRows]) {\n for (const tr of (Array.from(tbody.children) as OrderRow[])) {\n if (tr.manager.updateOrderQty(u)) {\n return\n }\n }\n }\n }\n\n /*\n * clearOrderTableEpochs removes immediate-tif orders whose epoch has expired.\n */\n clearOrderTableEpochs () {\n this.clearOrderTableEpochSide(this.page.sellRows)\n this.clearOrderTableEpochSide(this.page.buyRows)\n }\n\n /*\n * clearOrderTableEpochs removes immediate-tif orders whose epoch has expired\n * for a single side.\n */\n clearOrderTableEpochSide (tbody: HTMLElement) {\n for (const tr of (Array.from(tbody.children)) as OrderRow[]) {\n tr.manager.removeEpochOrders()\n }\n }\n\n /*\n * orderTableRow creates a new <tr> element to insert into an order table.\n Takes a bin of orders with the same rate, and displays the total quantity.\n */\n orderTableRow (orderBin: MiniOrder[]): OrderRow {\n const tr = this.page.orderRowTmpl.cloneNode(true) as OrderRow\n const { baseUnitInfo, quoteUnitInfo, rateConversionFactor, cfg: { ratestep: rateStep } } = this.market\n const manager = new OrderTableRowManager(tr, orderBin, baseUnitInfo, quoteUnitInfo, rateStep)\n tr.manager = manager\n bind(tr, 'click', () => {\n this.reportDepthClick(tr.manager.getRate() / rateConversionFactor)\n })\n if (tr.manager.getRate() !== 0) {\n Doc.bind(tr, 'mouseenter', () => {\n const chart = this.depthChart\n this.depthLines.hover = [{\n rate: tr.manager.getRate() / rateConversionFactor,\n color: tr.manager.isSell() ? chart.theme.sellLine : chart.theme.buyLine\n }]\n this.drawChartLines()\n })\n }\n return tr\n }\n\n /* handleConnNote handles the 'conn' notification.\n */\n async handleConnNote (note: ConnEventNote) {\n this.marketList.setConnectionStatus(note)\n if (note.connectionStatus === ConnectionStatus.Connected) {\n // Having been disconnected from a DEX server, anything may have changed,\n // or this may be the first opportunity to get the server's config, so\n // fetch it all before reloading the markets page.\n await app().fetchUser()\n await app().loadPage('markets')\n }\n }\n\n /*\n * filterMarkets sets the display of markets in the markets list based on the\n * value of the search input.\n */\n filterMarkets () {\n const filterTxt = this.page.marketSearchV1.value?.toLowerCase()\n const filter = filterTxt ? (mkt: MarketRow) => mkt.name.includes(filterTxt) : () => true\n this.marketList.setFilter(filter)\n }\n\n /* drawChartLines draws the hover and input lines on the chart. */\n drawChartLines () {\n this.depthChart.setLines([...this.depthLines.hover, ...this.depthLines.input])\n this.depthChart.draw()\n }\n\n /* candleDurationSelected sets the candleDur and loads the candles. It will\n default to the oneHrBinKey if dur is not valid. */\n candleDurationSelected (dur: string) {\n if (!this.market?.dex?.candleDurs.includes(dur)) dur = oneHrBinKey\n this.candleDur = dur\n this.loadCandles()\n State.storeLocal(State.lastCandleDurationLK, dur)\n }\n\n /*\n * loadCandles loads the candles for the current candleDur. If a cache is already\n * active, the cache will be used without a loadcandles request.\n */\n loadCandles () {\n for (const bttn of Doc.kids(this.page.durBttnBox)) {\n if (bttn.textContent === this.candleDur) bttn.classList.add('selected')\n else bttn.classList.remove('selected')\n }\n const { candleCaches, cfg, baseUnitInfo, quoteUnitInfo } = this.market\n const cache = candleCaches[this.candleDur]\n if (cache) {\n // this.depthChart.hide()\n // this.candleChart.show()\n this.candleChart.setCandles(cache, cfg, baseUnitInfo, quoteUnitInfo)\n return\n }\n this.requestCandles()\n }\n\n /* requestCandles sends the loadcandles request. It accepts an optional candle\n * duration which will be requested if it is provided.\n */\n requestCandles (candleDur?: string) {\n this.candlesLoading = {\n loaded: () => { /* pass */ },\n timer: window.setTimeout(() => {\n if (this.candlesLoading) {\n this.candlesLoading = null\n console.error('candles not received')\n }\n }, 10000)\n }\n const { dex, baseCfg, quoteCfg } = this.market\n ws.request('loadcandles', { host: dex.host, base: baseCfg.id, quote: quoteCfg.id, dur: candleDur || this.candleDur })\n }\n\n /*\n * unload is called by the Application when the user navigates away from\n * the /markets page.\n */\n unload () {\n ws.request(unmarketRoute, {})\n ws.deregisterRoute(bookRoute)\n ws.deregisterRoute(bookOrderRoute)\n ws.deregisterRoute(unbookOrderRoute)\n ws.deregisterRoute(updateRemainingRoute)\n ws.deregisterRoute(epochOrderRoute)\n ws.deregisterRoute(candlesRoute)\n ws.deregisterRoute(candleUpdateRoute)\n this.depthChart.unattach()\n this.candleChart.unattach()\n Doc.unbind(document, 'keyup', this.keyup)\n clearInterval(this.secondTicker)\n }\n}\n\n/*\n * MarketList represents the list of exchanges and markets on the left side of\n * markets view. The MarketList provides utilities for adjusting the visibility\n * and sort order of markets.\n */\nclass MarketList {\n // xcSections: ExchangeSection[]\n div: PageElement\n rowTmpl: PageElement\n markets: MarketRow[]\n selected: MarketRow\n\n constructor (div: HTMLElement) {\n this.div = div\n this.rowTmpl = Doc.idel(div, 'marketTmplV1')\n Doc.cleanTemplates(this.rowTmpl)\n this.reloadMarketsPane()\n }\n\n updateSpots (note: SpotPriceNote) {\n for (const row of this.markets) {\n if (row.mkt.xc.host !== note.host) continue\n const xc = app().exchanges[row.mkt.xc.host]\n const mkt = xc.markets[row.mkt.name]\n setPriceAndChange(row.tmpl, xc, mkt)\n }\n }\n\n reloadMarketsPane (): void {\n Doc.empty(this.div)\n this.markets = []\n\n const addMarket = (mkt: ExchangeMarket) => {\n const bui = app().unitInfo(mkt.baseid, mkt.xc)\n const qui = app().unitInfo(mkt.quoteid, mkt.xc)\n const rateConversionFactor = OrderUtil.RateEncodingFactor / bui.conventional.conversionFactor * qui.conventional.conversionFactor\n const row = new MarketRow(this.rowTmpl, mkt, rateConversionFactor)\n this.div.appendChild(row.node)\n return row\n }\n\n for (const mkt of sortedMarkets()) this.markets.push(addMarket(mkt))\n app().bindTooltips(this.div)\n }\n\n find (host: string, baseID: number, quoteID: number): MarketRow | null {\n for (const row of this.markets) {\n if (row.mkt.xc.host === host && row.mkt.baseid === baseID && row.mkt.quoteid === quoteID) return row\n }\n return null\n }\n\n /* exists will be true if the specified market exists. */\n exists (host: string, baseID: number, quoteID: number): boolean {\n return this.find(host, baseID, quoteID) !== null\n }\n\n /* first gets the first market from the first exchange, alphabetically. */\n first (): MarketRow {\n return this.markets[0]\n }\n\n /* select sets the specified market as selected. */\n select (host: string, baseID: number, quoteID: number) {\n const row = this.find(host, baseID, quoteID)\n if (!row) return console.error(`select: no market row for ${host}, ${baseID}-${quoteID}`)\n for (const mkt of this.markets) mkt.node.classList.remove('selected')\n this.selected = row\n this.selected.node.classList.add('selected')\n }\n\n /* setConnectionStatus sets the visibility of the disconnected icon based\n * on the core.ConnEventNote.\n */\n setConnectionStatus (note: ConnEventNote) {\n for (const row of this.markets) {\n if (row.mkt.xc.host !== note.host) continue\n if (note.connectionStatus === ConnectionStatus.Connected) Doc.hide(row.tmpl.disconnectedIco)\n else Doc.show(row.tmpl.disconnectedIco)\n }\n }\n\n /*\n * setFilter sets the visibility of market rows based on the provided filter.\n */\n setFilter (filter: (mkt: MarketRow) => boolean) {\n for (const row of this.markets) {\n if (filter(row)) Doc.show(row.node)\n else Doc.hide(row.node)\n }\n }\n}\n\n/*\n * MarketRow represents one row in the MarketList. A MarketRow is a subsection\n * of the ExchangeSection.\n */\nclass MarketRow {\n node: HTMLElement\n mkt: ExchangeMarket\n name: string\n baseID: number\n quoteID: number\n lotSize: number\n tmpl: Record<string, PageElement>\n rateConversionFactor: number\n\n constructor (template: HTMLElement, mkt: ExchangeMarket, rateConversionFactor: number) {\n this.mkt = mkt\n this.name = mkt.name\n this.baseID = mkt.baseid\n this.quoteID = mkt.quoteid\n this.lotSize = mkt.lotsize\n this.rateConversionFactor = rateConversionFactor\n this.node = template.cloneNode(true) as HTMLElement\n const tmpl = this.tmpl = Doc.parseTemplate(this.node)\n tmpl.baseIcon.src = Doc.logoPath(mkt.basesymbol)\n tmpl.quoteIcon.src = Doc.logoPath(mkt.quotesymbol)\n tmpl.baseSymbol.appendChild(Doc.symbolize(mkt.xc.assets[mkt.baseid], true))\n tmpl.quoteSymbol.appendChild(Doc.symbolize(mkt.xc.assets[mkt.quoteid], true))\n tmpl.baseName.textContent = mkt.baseName\n tmpl.host.textContent = mkt.xc.host\n tmpl.host.style.color = hostColor(mkt.xc.host)\n tmpl.host.dataset.tooltip = mkt.xc.host\n setPriceAndChange(tmpl, mkt.xc, mkt)\n if (this.mkt.xc.connectionStatus !== ConnectionStatus.Connected) Doc.show(tmpl.disconnectedIco)\n }\n}\n\ninterface BalanceWidgetElement {\n id: number\n parentID: number\n cfg: Asset | null\n node: PageElement\n tmpl: Record<string, PageElement>\n iconBox: PageElement\n stateIcons: WalletIcons\n parentBal?: PageElement\n}\n\n/*\n * BalanceWidget is a display of balance information. Because the wallet can be\n * in any number of states, and because every exchange has different funding\n * coin confirmation requirements, the BalanceWidget displays a number of state\n * indicators and buttons, as well as tabulated balance data with rows for\n * locked and immature balance.\n */\nclass BalanceWidget {\n base: BalanceWidgetElement\n quote: BalanceWidgetElement\n // parentRow: PageElement\n dex: Exchange\n\n constructor (base: HTMLElement, quote: HTMLElement) {\n Doc.hide(base, quote)\n const btmpl = Doc.parseTemplate(base)\n this.base = {\n id: 0,\n parentID: parentIDNone,\n cfg: null,\n node: base,\n tmpl: btmpl,\n iconBox: btmpl.walletState,\n stateIcons: new WalletIcons(btmpl.walletState)\n }\n btmpl.balanceRowTmpl.remove()\n\n const qtmpl = Doc.parseTemplate(quote)\n this.quote = {\n id: 0,\n parentID: parentIDNone,\n cfg: null,\n node: quote,\n tmpl: qtmpl,\n iconBox: qtmpl.walletState,\n stateIcons: new WalletIcons(qtmpl.walletState)\n }\n qtmpl.balanceRowTmpl.remove()\n\n app().registerNoteFeeder({\n balance: (note: BalanceNote) => { this.updateAsset(note.assetID) },\n walletstate: (note: WalletStateNote) => { this.updateAsset(note.wallet.assetID) },\n walletsync: (note: WalletSyncNote) => { this.updateAsset(note.assetID) },\n createwallet: (note: WalletCreationNote) => { this.updateAsset(note.assetID) }\n })\n }\n\n setBalanceVisibility (connected: boolean) {\n if (connected) Doc.show(this.base.node, this.quote.node)\n else Doc.hide(this.base.node, this.quote.node)\n }\n\n /*\n * setWallet sets the balance widget to display data for specified market and\n * will display the widget.\n */\n setWallets (host: string, baseID: number, quoteID: number) {\n const parentID = (assetID: number) => {\n const asset = app().assets[assetID]\n if (asset?.token) return asset.token.parentID\n return parentIDNone\n }\n this.dex = app().user.exchanges[host]\n this.base.id = baseID\n this.base.parentID = parentID(baseID)\n this.base.cfg = this.dex.assets[baseID]\n this.quote.id = quoteID\n this.quote.parentID = parentID(quoteID)\n this.quote.cfg = this.dex.assets[quoteID]\n this.updateWallet(this.base)\n this.updateWallet(this.quote)\n this.setBalanceVisibility(this.dex.connectionStatus === ConnectionStatus.Connected)\n }\n\n /*\n * updateWallet updates the displayed wallet information based on the\n * core.Wallet state.\n */\n updateWallet (side: BalanceWidgetElement) {\n const { cfg, tmpl, iconBox, stateIcons, id: assetID } = side\n if (!cfg) return // no wallet set yet\n const asset = app().assets[assetID]\n // Just hide everything to start.\n Doc.hide(\n tmpl.newWalletRow, tmpl.expired, tmpl.unsupported, tmpl.connect, tmpl.spinner,\n tmpl.walletState, tmpl.balanceRows, tmpl.walletAddr, tmpl.wantProvidersBox\n )\n this.checkNeedsProvider(assetID, tmpl.wantProvidersBox)\n tmpl.logo.src = Doc.logoPath(cfg.symbol)\n tmpl.addWalletSymbol.textContent = cfg.symbol.toUpperCase()\n Doc.empty(tmpl.symbol)\n\n // Handle an unsupported asset.\n if (!asset) {\n Doc.show(tmpl.unsupported)\n return\n }\n tmpl.symbol.appendChild(Doc.symbolize(asset, true))\n Doc.show(iconBox)\n const wallet = asset.wallet\n stateIcons.readWallet(wallet)\n // Handle no wallet configured.\n if (!wallet) {\n if (asset.walletCreationPending) {\n Doc.show(tmpl.spinner)\n return\n }\n Doc.show(tmpl.newWalletRow)\n return\n }\n Doc.show(tmpl.walletAddr)\n // Parent asset\n const bal = wallet.balance\n // Handle not connected and no balance known for the DEX.\n if (!bal && !wallet.running && !wallet.disabled) {\n Doc.show(tmpl.connect)\n return\n }\n // If there is no balance, but the wallet is connected, show the loading\n // icon while we fetch an update.\n if (!bal) {\n app().fetchBalance(assetID)\n Doc.show(tmpl.spinner)\n return\n }\n\n // We have a wallet and a DEX-specific balance. Set all of the fields.\n Doc.show(tmpl.balanceRows)\n Doc.empty(tmpl.balanceRows)\n const addRow = (title: string, bal: number, ui: UnitInfo, icon?: PageElement) => {\n const row = tmpl.balanceRowTmpl.cloneNode(true) as PageElement\n tmpl.balanceRows.appendChild(row)\n const balTmpl = Doc.parseTemplate(row)\n balTmpl.title.textContent = title\n balTmpl.bal.textContent = Doc.formatCoinValue(bal, ui)\n if (icon) {\n balTmpl.bal.append(icon)\n side.parentBal = balTmpl.bal\n }\n }\n addRow(intl.prep(intl.ID_AVAILABLE), bal.available, asset.unitInfo)\n addRow(intl.prep(intl.ID_LOCKED), bal.locked + bal.contractlocked + bal.bondlocked, asset.unitInfo)\n addRow(intl.prep(intl.ID_IMMATURE), bal.immature, asset.unitInfo)\n if (asset.token) {\n const { wallet: { balance }, unitInfo, symbol } = app().assets[asset.token.parentID]\n const icon = document.createElement('img')\n icon.src = Doc.logoPath(symbol)\n icon.classList.add('micro-icon', 'ms-1')\n addRow(intl.prep(intl.ID_FEE_BALANCE), balance.available, unitInfo, icon)\n }\n\n // If the current balance update time is older than an hour, show the\n // expiration icon. Request a balance update, if possible.\n const expired = new Date().getTime() - new Date(bal.stamp).getTime() > anHour\n if (expired && !wallet.disabled) {\n Doc.show(tmpl.expired)\n if (wallet.running) app().fetchBalance(assetID)\n } else Doc.hide(tmpl.expired)\n }\n\n async checkNeedsProvider (assetID: number, el: PageElement) {\n Doc.setVis(await app().needsCustomProvider(assetID), el)\n }\n\n /* updateParent updates the side's parent asset balance. */\n updateParent (side: BalanceWidgetElement) {\n const { wallet: { balance }, unitInfo } = app().assets[side.parentID]\n // firstChild is the text node set before the img child node in addRow.\n if (side.parentBal?.firstChild) side.parentBal.firstChild.textContent = Doc.formatCoinValue(balance.available, unitInfo)\n }\n\n /*\n * updateAsset updates the info for one side of the existing market. If the\n * specified asset ID is not one of the current market's base or quote assets,\n * it is silently ignored.\n */\n updateAsset (assetID: number) {\n if (assetID === this.base.id) this.updateWallet(this.base)\n else if (assetID === this.quote.id) this.updateWallet(this.quote)\n if (assetID === this.base.parentID) this.updateParent(this.base)\n if (assetID === this.quote.parentID) this.updateParent(this.quote)\n }\n}\n\n/* makeMarket creates a market object that specifies basic market details. */\nfunction makeMarket (host: string, base?: number, quote?: number) {\n return {\n host: host,\n base: base,\n quote: quote\n }\n}\n\n/* marketID creates a DEX-compatible market name from the ticker symbols. */\nexport function marketID (b: string, q: string) { return `${b}_${q}` }\n\n/* convertToAtoms converts the float string to the basic unit of a coin. */\nfunction convertToAtoms (s: string, conversionFactor: number) {\n if (!s) return 0\n return Math.round(parseFloat(s) * conversionFactor)\n}\n\n/* swapBttns changes the 'selected' class of the buttons. */\nfunction swapBttns (before: HTMLElement, now: HTMLElement) {\n before.classList.remove('selected')\n now.classList.add('selected')\n}\n\n/*\n * wireOrder prepares a copy of the order with the options field converted to a\n * string -> string map.\n */\nfunction wireOrder (order: TradeForm) {\n const stringyOptions: Record<string, string> = {}\n for (const [k, v] of Object.entries(order.options)) stringyOptions[k] = JSON.stringify(v)\n return Object.assign({}, order, { options: stringyOptions })\n}\n\n// OrderTableRowManager manages the data within a row in an order table. Each row\n// represents all the orders in the order book with the same rate, but orders that\n// are booked or still in the epoch queue are displayed in separate rows.\nclass OrderTableRowManager {\n tableRow: HTMLElement\n page: Record<string, PageElement>\n orderBin: MiniOrder[]\n sell: boolean\n msgRate: number\n epoch: boolean\n baseUnitInfo: UnitInfo\n\n constructor (tableRow: HTMLElement, orderBin: MiniOrder[], baseUnitInfo: UnitInfo, quoteUnitInfo: UnitInfo, rateStep: number) {\n this.tableRow = tableRow\n const page = this.page = Doc.parseTemplate(tableRow)\n this.orderBin = orderBin\n this.sell = orderBin[0].sell\n this.msgRate = orderBin[0].msgRate\n this.epoch = !!orderBin[0].epoch\n this.baseUnitInfo = baseUnitInfo\n const rateText = Doc.formatRateFullPrecision(this.msgRate, baseUnitInfo, quoteUnitInfo, rateStep)\n Doc.setVis(this.isEpoch(), this.page.epoch)\n if (this.msgRate === 0) {\n page.rate.innerText = 'market'\n } else {\n const cssClass = this.isSell() ? 'sellcolor' : 'buycolor'\n page.rate.innerText = rateText\n page.rate.classList.add(cssClass)\n }\n this.updateQtyNumOrdersEl()\n }\n\n // updateQtyNumOrdersEl populates the quantity element in the row, and also\n // displays the number of orders if there is more than one order in the order\n // bin.\n updateQtyNumOrdersEl () {\n const { page, orderBin } = this\n const qty = orderBin.reduce((total, curr) => total + curr.qtyAtomic, 0)\n const numOrders = orderBin.length\n page.qty.innerText = Doc.formatFullPrecision(qty, this.baseUnitInfo)\n if (numOrders > 1) {\n page.numOrders.removeAttribute('hidden')\n page.numOrders.innerText = String(numOrders)\n page.numOrders.title = `quantity is comprised of ${numOrders} orders`\n } else {\n page.numOrders.setAttribute('hidden', 'true')\n }\n }\n\n // insertOrder adds an order to the order bin and updates the row elements\n // accordingly.\n insertOrder (order: MiniOrder) {\n this.orderBin.push(order)\n this.updateQtyNumOrdersEl()\n }\n\n // updateOrderQuantity updates the quantity of the order identified by a token,\n // if it exists in the row, and updates the row elements accordingly. The function\n // returns true if the order is in the bin, and false otherwise.\n updateOrderQty (update: RemainderUpdate) {\n const { token, qty, qtyAtomic } = update\n for (let i = 0; i < this.orderBin.length; i++) {\n if (this.orderBin[i].token === token) {\n this.orderBin[i].qty = qty\n this.orderBin[i].qtyAtomic = qtyAtomic\n this.updateQtyNumOrdersEl()\n return true\n }\n }\n return false\n }\n\n // removeOrder removes the order identified by the token, if it exists in the row,\n // and updates the row elements accordingly. If the order bin is empty, the row is\n // removed from the screen. The function returns true if an order was removed, and\n // false otherwise.\n removeOrder (token: string) {\n const index = this.orderBin.findIndex(order => order.token === token)\n if (index < 0) return false\n this.orderBin.splice(index, 1)\n if (!this.orderBin.length) this.tableRow.remove()\n else this.updateQtyNumOrdersEl()\n return true\n }\n\n // removeEpochOrders removes all the orders from the row that are not in the\n // new epoch's epoch queue and updates the elements accordingly.\n removeEpochOrders (newEpoch?: number) {\n this.orderBin = this.orderBin.filter((order) => {\n return !(order.epoch && order.epoch !== newEpoch)\n })\n if (!this.orderBin.length) this.tableRow.remove()\n else this.updateQtyNumOrdersEl()\n }\n\n // getRate returns the rate of the orders in the row.\n getRate () {\n return this.msgRate\n }\n\n // isEpoch returns whether the orders in this row are in the epoch queue.\n isEpoch () {\n return this.epoch\n }\n\n // isSell returns whether the orders in this row are sell orders.\n isSell () {\n return this.sell\n }\n\n // compare takes an order and returns 0 if the order belongs in this row,\n // 1 if the order should go after this row in the table, and -1 if it should\n // be before this row in the table. Sell orders are displayed in ascending order,\n // buy orders are displayed in descending order, and epoch orders always come\n // after booked orders.\n compare (order: MiniOrder) {\n if (this.getRate() === order.msgRate && this.isEpoch() === !!order.epoch) {\n return 0\n } else if (this.getRate() !== order.msgRate) {\n return (this.getRate() > order.msgRate) === order.sell ? 1 : -1\n } else {\n return this.isEpoch() ? 1 : -1\n }\n }\n}\n\ninterface ExchangeMarket extends Market {\n xc: Exchange\n baseName: string\n bui: UnitInfo\n}\n\nfunction sortedMarkets (): ExchangeMarket[] {\n const mkts: ExchangeMarket[] = []\n const assets = app().assets\n const convertMarkets = (xc: Exchange, mkts: Market[]) => {\n return mkts.map((mkt: Market) => {\n const a = assets[mkt.baseid]\n const baseName = a ? a.name : mkt.basesymbol\n const bui = app().unitInfo(mkt.baseid, xc)\n return Object.assign({ xc, baseName, bui }, mkt)\n })\n }\n for (const xc of Object.values(app().exchanges)) mkts.push(...convertMarkets(xc, Object.values(xc.markets || {})))\n mkts.sort((a: ExchangeMarket, b: ExchangeMarket): number => {\n if (!a.spot) {\n if (b.spot) return 1 // put b first, since we have the spot\n // no spots. compare market name then host name\n if (a.name === b.name) return a.xc.host.localeCompare(b.xc.host)\n return a.name.localeCompare(b.name)\n } else if (!b.spot) return -1 // put a first, since we have the spot\n const [aLots, bLots] = [a.spot.vol24 / a.lotsize, b.spot.vol24 / b.lotsize]\n return bLots - aLots // whoever has more volume by lot count\n })\n return mkts\n}\n\nfunction setPriceAndChange (tmpl: Record<string, PageElement>, xc: Exchange, mkt: Market) {\n if (!mkt.spot) return\n tmpl.price.textContent = Doc.formatFourSigFigs(app().conventionalRate(mkt.baseid, mkt.quoteid, mkt.spot.rate, xc))\n const sign = mkt.spot.change24 > 0 ? '+' : ''\n tmpl.change.classList.remove('buycolor', 'sellcolor')\n tmpl.change.classList.add(mkt.spot.change24 >= 0 ? 'buycolor' : 'sellcolor')\n tmpl.change.textContent = `${sign}${(mkt.spot.change24 * 100).toFixed(1)}%`\n}\n\nconst hues = [1 / 2, 1 / 4, 3 / 4, 1 / 8, 5 / 8, 3 / 8, 7 / 8]\n\nfunction generateHue (idx: number): string {\n const h = hues[idx % hues.length]\n return `hsl(${h * 360}, 35%, 50%)`\n}\n\nfunction hostColor (host: string): string {\n const hosts = Object.keys(app().exchanges)\n hosts.sort()\n return generateHue(hosts.indexOf(host))\n}\n","import Doc from './doc'\nimport BasePage from './basepage'\nimport * as OrderUtil from './orderutil'\nimport * as intl from './locales'\nimport { postJSON } from './http'\nimport {\n app,\n PageElement,\n OrderFilter,\n Order\n} from './registry'\n\nconst orderBatchSize = 50\nconst animationLength = 500\n\nexport default class OrdersPage extends BasePage {\n main: HTMLElement\n offset: string\n loading: boolean\n currentForm: PageElement\n orderTmpl: PageElement\n filterState: OrderFilter\n page: Record<string, PageElement>\n\n constructor (main: HTMLElement) {\n super()\n this.main = main\n // if offset is '', there are no more orders available to auto-load for\n // never-ending scrolling.\n this.offset = ''\n this.loading = false\n const page = this.page = Doc.idDescendants(main)\n this.orderTmpl = page.rowTmpl\n this.orderTmpl.remove()\n\n // filterState will store arrays of strings. The assets and statuses\n // sub-filters will need to be converted to ints for JSON encoding.\n const filterState: OrderFilter = this.filterState = {\n hosts: [],\n assets: [],\n statuses: []\n }\n\n const search = new URLSearchParams(window.location.search)\n const readFilter = (form: HTMLElement, filterKey: string) => {\n const v = search.get(filterKey)\n if (!v || v.length === 0) return\n const subFilter = v.split(',')\n if (v) {\n (filterState as any)[filterKey] = subFilter // Kinda janky\n }\n form.querySelectorAll('input').forEach(bttn => {\n if (subFilter.indexOf(bttn.value) >= 0) bttn.checked = true\n })\n }\n readFilter(page.hostFilter, 'hosts')\n readFilter(page.assetFilter, 'assets')\n readFilter(page.statusFilter, 'statuses')\n\n const applyButtons: HTMLElement[] = []\n const monitorFilter = (form: HTMLElement, filterKey: string) => {\n const applyBttn = form.querySelector('.apply-bttn') as HTMLElement\n applyButtons.push(applyBttn)\n Doc.bind(applyBttn, 'click', () => {\n this.submitFilter()\n applyButtons.forEach(bttn => Doc.hide(bttn))\n })\n form.querySelectorAll('input').forEach(bttn => {\n Doc.bind(bttn, 'change', () => {\n const subFilter = parseSubFilter(form)\n if (compareSubFilter(subFilter, (filterState as any)[filterKey])) {\n // Same as currently loaded. Hide the apply button.\n Doc.hide(applyBttn)\n } else {\n Doc.show(applyBttn)\n }\n })\n })\n }\n\n monitorFilter(page.hostFilter, 'hosts')\n monitorFilter(page.assetFilter, 'assets')\n monitorFilter(page.statusFilter, 'statuses')\n\n Doc.bind(this.main, 'scroll', () => {\n if (this.loading) return\n const belowBottom = page.ordersTable.offsetHeight - this.main.offsetHeight - this.main.scrollTop\n if (belowBottom < 0) {\n this.nextPage()\n }\n })\n\n page.forms.querySelectorAll('.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => {\n Doc.hide(page.forms)\n })\n })\n\n // If the user clicks outside of a form, it should close the page overlay.\n Doc.bind(page.forms, 'mousedown', (e: MouseEvent) => {\n if (!Doc.mouseInElement(e, this.currentForm)) {\n Doc.hide(page.forms)\n }\n })\n\n Doc.bind(page.exportOrders, 'click', () => {\n this.exportOrders()\n })\n\n page.showArchivedDateField.addEventListener('change', () => {\n if (page.showArchivedDateField.checked) Doc.show(page.archivedDateField)\n else Doc.hide(page.archivedDateField, page.deleteArchivedRecordsErr)\n })\n\n Doc.bind(page.deleteArchivedRecords, 'click', () => {\n const page = this.page\n page.showArchivedDateField.checked = false\n page.saveMatchesToFile.checked = false\n page.saveOrdersToFile.checked = false\n page.deleteArchivedRecordsErr.textContent = ''\n page.archivedRecordsLocation.textContent = ''\n page.deleteArchivedRecordsMsg.textContent = ''\n Doc.hide(page.deleteArchivedResult, page.deleteArchivedRecordsErr,\n page.deleteArchivedRecordsMsg, page.archivedRecordsLocation, page.archivedDateField)\n this.showForm(page.deleteArchivedRecordsForm)\n })\n\n Doc.bind(page.deleteArchivedRecordsSubmit, 'click', () => {\n let date = 0\n if (page.showArchivedDateField.checked) {\n date = Date.parse(page.olderThan.value || '')\n if (isNaN(date) || date <= 0) {\n Doc.showFormError(page.deleteArchivedRecordsErr, intl.prep(intl.ID_INVALID_DATE_ERR_MSG))\n return\n }\n }\n this.deleteArchivedRecords(date)\n })\n\n this.submitFilter()\n }\n\n /* showForm shows a modal form with a little animation. */\n async showForm (form: HTMLElement) {\n this.currentForm = form\n const page = this.page\n Doc.hide(page.deleteArchivedRecordsForm)\n form.style.right = '10000px'\n Doc.show(page.forms, form)\n const shift = (page.forms.offsetWidth + form.offsetWidth) / 2\n await Doc.animate(animationLength, progress => {\n form.style.right = `${(1 - progress) * shift}px`\n }, 'easeOutHard')\n form.style.right = '0px'\n }\n\n /* setOrders empties the order table and appends the specified orders. */\n setOrders (orders: Order[]) {\n Doc.empty(this.page.tableBody)\n this.appendOrders(orders)\n }\n\n /* appendOrders appends orders to the orders table. */\n appendOrders (orders: Order[]) {\n const tbody = this.page.tableBody\n for (const ord of orders) {\n const tr = this.orderTmpl.cloneNode(true) as HTMLElement\n const tmpl = Doc.parseTemplate(tr)\n let fromSymbol, toSymbol, fromUnit, toUnit, fromQty\n let toQty = ''\n const xc = app().exchanges[ord.host] || undefined\n if ((!app().assets[ord.baseID] && !xc.assets[ord.baseID]) || (!app().assets[ord.quoteID] && !xc.assets[ord.quoteID])) continue\n const [baseUnitInfo, quoteUnitInfo] = [app().unitInfo(ord.baseID, xc), app().unitInfo(ord.quoteID, xc)]\n if (ord.sell) {\n [fromSymbol, toSymbol] = [ord.baseSymbol, ord.quoteSymbol];\n [fromUnit, toUnit] = [baseUnitInfo.conventional.unit, quoteUnitInfo.conventional.unit]\n fromQty = Doc.formatCoinValue(ord.qty, baseUnitInfo)\n if (ord.type === OrderUtil.Limit) {\n toQty = Doc.formatCoinValue(ord.qty / OrderUtil.RateEncodingFactor * ord.rate, quoteUnitInfo)\n }\n } else {\n [fromSymbol, toSymbol] = [ord.quoteSymbol, ord.baseSymbol];\n [fromUnit, toUnit] = [quoteUnitInfo.conventional.unit, baseUnitInfo.conventional.unit]\n if (ord.type === OrderUtil.Market) {\n fromQty = Doc.formatCoinValue(ord.qty, baseUnitInfo)\n } else {\n fromQty = Doc.formatCoinValue(ord.qty / OrderUtil.RateEncodingFactor * ord.rate, quoteUnitInfo)\n toQty = Doc.formatCoinValue(ord.qty, baseUnitInfo)\n }\n }\n\n const mktID = `${baseUnitInfo.conventional.unit}-${quoteUnitInfo.conventional.unit}`\n tmpl.host.textContent = `${mktID} @ ${ord.host}`\n\n tmpl.fromQty.textContent = fromQty\n tmpl.fromLogo.src = Doc.logoPath(fromSymbol)\n tmpl.fromSymbol.textContent = fromUnit\n tmpl.toQty.textContent = toQty\n tmpl.toLogo.src = Doc.logoPath(toSymbol)\n tmpl.toSymbol.textContent = toUnit\n tmpl.type.textContent = `${OrderUtil.typeString(ord)} ${OrderUtil.sellString(ord)}`\n let rate = Doc.formatCoinValue(app().conventionalRate(ord.baseID, ord.quoteID, ord.rate, xc))\n if (ord.type === OrderUtil.Market) rate = OrderUtil.averageMarketOrderRateString(ord)\n tmpl.rate.textContent = rate\n tmpl.status.textContent = OrderUtil.statusString(ord)\n tmpl.filled.textContent = `${(OrderUtil.filled(ord) / ord.qty * 100).toFixed(1)}%`\n tmpl.settled.textContent = `${(OrderUtil.settled(ord) / ord.qty * 100).toFixed(1)}%`\n const dateTime = new Date(ord.submitTime).toLocaleString()\n tmpl.timeAgo.textContent = `${Doc.timeSince(ord.submitTime)} ago`\n tmpl.time.textContent = dateTime\n const link = Doc.tmplElement(tr, 'link')\n link.href = `order/${ord.id}`\n app().bindInternalNavigation(tr)\n tbody.appendChild(tr)\n }\n if (orders.length === orderBatchSize) {\n this.offset = orders[orders.length - 1].id\n } else {\n this.offset = ''\n }\n }\n\n /* submitFilter submits the current filter and reloads the order table. */\n async submitFilter () {\n const page = this.page\n this.offset = ''\n const filterState = this.filterState\n filterState.hosts = parseSubFilter(page.hostFilter)\n filterState.assets = parseSubFilter(page.assetFilter).map((s: string) => parseInt(s))\n filterState.statuses = parseSubFilter(page.statusFilter).map((s: string) => parseInt(s))\n this.setOrders(await this.fetchOrders())\n }\n\n /* fetchOrders fetches orders using the current filter. */\n async fetchOrders () {\n const loaded = app().loading(this.main)\n const res = await postJSON('/api/orders', this.currentFilter())\n loaded()\n return res.orders\n }\n\n /* exportOrders downloads a csv of the user's orders based on the current filter. */\n exportOrders () {\n this.offset = ''\n const filterState = this.currentFilter()\n const url = new URL(window.location.href)\n const search = new URLSearchParams('')\n const setQuery = (k: string) => {\n const subFilter = (filterState as any)[k]\n subFilter.forEach((v: any) => {\n search.append(k, v)\n })\n }\n setQuery('hosts')\n setQuery('assets')\n setQuery('statuses')\n url.search = search.toString()\n url.pathname = '/orders/export'\n window.open(url.toString())\n }\n\n /* deleteArchivedRecords removes the user's archived orders and matches\n * created before user specified date time in millisecond. Deleted archived\n * records are saved to a CSV file if the user specify so.\n */\n async deleteArchivedRecords (olderThanMs?: number) {\n const page = this.page\n const saveMatchesToFIle = page.saveMatchesToFile.checked || false\n const saveOrdersToFile = page.saveOrdersToFile.checked || false\n const reqBody = {\n olderThanMs: olderThanMs,\n saveMatchesToFile: saveMatchesToFIle,\n saveOrdersToFile: saveOrdersToFile\n }\n const loaded = app().loading(this.main)\n const res = await postJSON('/api/deletearchivedrecords', reqBody)\n loaded()\n if (!app().checkResponse(res)) {\n return Doc.showFormError(page.deleteArchivedRecordsErr, res.msg)\n }\n\n if (res.archivedRecordsDeleted > 0) {\n page.deleteArchivedRecordsMsg.textContent = intl.prep(intl.ID_DELETE_ARCHIVED_RECORDS_RESULT, { nRecords: res.archivedRecordsDeleted })\n if (saveMatchesToFIle || saveOrdersToFile) {\n page.archivedRecordsLocation.textContent = intl.prep(intl.ID_ARCHIVED_RECORDS_PATH, { path: res.archivedRecordsPath })\n Doc.show(page.archivedRecordsLocation)\n }\n // Update the order page.\n this.submitFilter()\n } else {\n page.deleteArchivedRecordsMsg.textContent = intl.prep(intl.ID_NO_ARCHIVED_RECORDS)\n }\n Doc.show(page.deleteArchivedResult, page.deleteArchivedRecordsMsg)\n }\n\n /*\n * currentFilter converts the local filter type (which is all strings) to the\n * server's filter type.\n */\n currentFilter (): OrderFilter {\n const filterState = this.filterState as OrderFilter\n return {\n hosts: filterState.hosts,\n assets: filterState.assets?.map((s: any) => parseInt(s)),\n statuses: filterState.statuses?.map((s: any) => parseInt(s)),\n n: orderBatchSize,\n offset: this.offset\n }\n }\n\n /*\n * nextPage resubmits the filter with the offset set to the last loaded order.\n */\n async nextPage () {\n if (this.offset === '' || this.loading) return\n this.loading = true\n Doc.show(this.page.orderLoader)\n const orders = await this.fetchOrders()\n this.loading = false\n Doc.hide(this.page.orderLoader)\n this.appendOrders(orders)\n }\n}\n\n/*\n * parseSubFilter parses a bool-map from the checkbox inputs in the specified\n * ancestor element.\n */\nfunction parseSubFilter (form: HTMLElement): string[] {\n const entries: string[] = []\n form.querySelectorAll('input').forEach(box => {\n if (box.checked) entries.push(box.value)\n })\n return entries\n}\n\n/* compareSubFilter compares the two filter arrays for unordered equivalence. */\nfunction compareSubFilter (filter1: any[], filter2: any[]): boolean {\n if (filter1.length !== filter2.length) return false\n for (const entry of filter1) {\n if (filter2.indexOf(entry) === -1) return false\n }\n return true\n}\n","import Doc from './doc'\nimport BasePage from './basepage'\nimport * as OrderUtil from './orderutil'\nimport { bind as bindForm, AccelerateOrderForm } from './forms'\nimport { postJSON } from './http'\nimport * as intl from './locales'\nimport {\n app,\n Order,\n PageElement,\n OrderNote,\n MatchNote,\n Match,\n Coin\n} from './registry'\nimport { setOptionTemplates } from './opts'\nimport { formatCoinID, setCoinHref } from './coinexplorers'\n\n// lockTimeMakerMs must match the value returned from LockTimeMaker func in\n// bisonw.\nconst lockTimeMakerMs = 20 * 60 * 60 * 1000\n// lockTimeTakerMs must match the value returned from LockTimeTaker func in\n// bisonw.\nconst lockTimeTakerMs = 8 * 60 * 60 * 1000\n\nconst animationLength = 500\n\nexport default class OrderPage extends BasePage {\n orderID: string\n order: Order\n page: Record<string, PageElement>\n currentForm: HTMLElement\n secondTicker: number\n refreshOnPopupClose: boolean\n accelerateOrderForm: AccelerateOrderForm\n stampers: PageElement[]\n\n constructor (main: HTMLElement) {\n super()\n const page = this.page = Doc.idDescendants(main)\n this.stampers = Doc.applySelector(main, '[data-stamp]')\n // Find the order\n this.orderID = main.dataset.oid || ''\n\n Doc.cleanTemplates(page.matchCardTmpl)\n\n const setStamp = () => {\n for (const span of this.stampers) {\n span.textContent = Doc.timeSince(parseInt(span.dataset.stamp || ''))\n }\n }\n setStamp()\n\n page.forms.querySelectorAll('.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => {\n if (this.refreshOnPopupClose) {\n window.location.replace(window.location.href)\n return\n }\n Doc.hide(page.forms)\n })\n })\n\n // Some static elements on this page contain assets that can be linked\n // to blockchain explorers (such as Etherscan) so users can easily\n // examine funding/acceleration coins data there. We'd need to set up\n // such hyperlinks here.\n main.querySelectorAll('[data-explorer-id]').forEach((link: PageElement) => {\n const assetID = parseInt(link.dataset.explorerId || '')\n setCoinHref(assetID, link)\n })\n\n if (page.cancelBttn) {\n Doc.bind(page.cancelBttn, 'click', () => {\n this.showForm(page.cancelForm)\n })\n }\n\n Doc.bind(page.accelerateBttn, 'click', () => {\n this.showAccelerateForm()\n })\n\n const success = () => {\n this.refreshOnPopupClose = true\n }\n // Do not call cleanTemplates before creating the AccelerateOrderForm\n setOptionTemplates(page)\n this.accelerateOrderForm = new AccelerateOrderForm(page.accelerateForm, success)\n Doc.cleanTemplates(page.booleanOptTmpl, page.rangeOptTmpl, page.orderOptTmpl)\n\n // If the user clicks outside of a form, it should close the page overlay.\n Doc.bind(page.forms, 'mousedown', (e: MouseEvent) => {\n if (!Doc.mouseInElement(e, this.currentForm)) {\n if (this.refreshOnPopupClose) {\n window.location.reload()\n return\n }\n Doc.hide(page.forms)\n }\n })\n\n // Cancel order form\n bindForm(page.cancelForm, page.cancelSubmit, async () => { this.submitCancel() })\n\n this.secondTicker = window.setInterval(() => {\n setStamp()\n }, 10000) // update every 10 seconds\n\n app().registerNoteFeeder({\n order: (note: OrderNote) => { this.handleOrderNote(note) },\n match: (note: MatchNote) => { this.handleMatchNote(note) }\n })\n\n this.start()\n }\n\n async start () {\n let ord = app().order(this.orderID)\n // app().order can only access active orders. If the order is not active,\n // we'll need to get the data from the database.\n if (ord) this.order = ord\n else {\n ord = await this.fetchOrder()\n }\n // Swap out the dot-notation symbols with token-aware symbols.\n this.page.mktBaseSymbol.replaceWith(Doc.symbolize(app().assets[ord.baseID]))\n this.page.mktQuoteSymbol.replaceWith(Doc.symbolize(app().assets[ord.quoteID]))\n\n this.setAccelerationButtonVis()\n this.showMatchCards()\n }\n\n unload () {\n clearInterval(this.secondTicker)\n }\n\n /* fetchOrder fetches the order from the client. */\n async fetchOrder (): Promise<Order> {\n const res = await postJSON('/api/order', this.orderID)\n if (!app().checkResponse(res)) throw res.msg\n this.order = res.order\n return this.order\n }\n\n /*\n * setImmutableMatchCardElements sets the match card elements that are never\n * changed.\n */\n setImmutableMatchCardElements (matchCard: HTMLElement, match: Match) {\n const tmpl = Doc.parseTemplate(matchCard)\n\n tmpl.matchID.textContent = match.matchID\n\n const time = new Date(match.stamp)\n tmpl.matchTime.textContent = time.toLocaleTimeString(Doc.languages(), {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })\n\n tmpl.matchTimeAgo.dataset.stamp = match.stamp.toString()\n tmpl.matchTimeAgo.textContent = Doc.timeSince(match.stamp)\n this.stampers.push(tmpl.matchTimeAgo)\n\n const orderPortion = OrderUtil.orderPortion(this.order, match)\n const baseSymbol = Doc.bipSymbol(this.order.baseID)\n const quoteSymbol = Doc.bipSymbol(this.order.quoteID)\n const baseUnitInfo = app().unitInfo(this.order.baseID)\n const quoteUnitInfo = app().unitInfo(this.order.quoteID)\n const [bUnit, qUnit] = [baseUnitInfo.conventional.unit.toLowerCase(), quoteUnitInfo.conventional.unit.toLowerCase()]\n const quoteAmount = OrderUtil.baseToQuote(match.rate, match.qty)\n\n if (match.isCancel) {\n Doc.show(tmpl.cancelInfoDiv)\n Doc.hide(tmpl.infoDiv, tmpl.status, tmpl.statusHdr)\n\n if (this.order.sell) {\n tmpl.cancelAmount.textContent = Doc.formatCoinValue(match.qty, baseUnitInfo)\n tmpl.cancelIcon.src = Doc.logoPathFromID(this.order.baseID)\n } else {\n tmpl.cancelAmount.textContent = Doc.formatCoinValue(quoteAmount, quoteUnitInfo)\n tmpl.cancelIcon.src = Doc.logoPathFromID(this.order.quoteID)\n }\n\n tmpl.cancelOrderPortion.textContent = orderPortion\n\n return\n }\n\n Doc.show(tmpl.infoDiv)\n Doc.hide(tmpl.cancelInfoDiv)\n\n tmpl.orderPortion.textContent = orderPortion\n\n if (match.side === OrderUtil.Maker) {\n tmpl.side.textContent = intl.prep(intl.ID_MAKER)\n Doc.show(\n tmpl.makerSwapYou,\n tmpl.makerRedeemYou,\n tmpl.takerSwapThem,\n tmpl.takerRedeemThem\n )\n Doc.hide(\n tmpl.takerSwapYou,\n tmpl.takerRedeemYou,\n tmpl.makerSwapThem,\n tmpl.makerRedeemThem\n )\n } else {\n tmpl.side.textContent = intl.prep(intl.ID_TAKER)\n Doc.hide(\n tmpl.makerSwapYou,\n tmpl.makerRedeemYou,\n tmpl.takerSwapThem,\n tmpl.takerRedeemThem\n )\n Doc.show(\n tmpl.takerSwapYou,\n tmpl.takerRedeemYou,\n tmpl.makerSwapThem,\n tmpl.makerRedeemThem\n )\n }\n\n if ((match.side === OrderUtil.Maker && this.order.sell) ||\n (match.side === OrderUtil.Taker && !this.order.sell)) {\n tmpl.makerSwapAsset.textContent = bUnit\n tmpl.takerSwapAsset.textContent = qUnit\n tmpl.makerRedeemAsset.textContent = qUnit\n tmpl.takerRedeemAsset.textContent = bUnit\n } else {\n tmpl.makerSwapAsset.textContent = qUnit\n tmpl.takerSwapAsset.textContent = bUnit\n tmpl.makerRedeemAsset.textContent = bUnit\n tmpl.takerRedeemAsset.textContent = qUnit\n }\n\n const rate = app().conventionalRate(this.order.baseID, this.order.quoteID, match.rate)\n tmpl.rate.textContent = `${rate} ${bUnit}/${qUnit}`\n\n if (this.order.sell) {\n tmpl.refundAsset.textContent = baseSymbol\n tmpl.fromAmount.textContent = Doc.formatCoinValue(match.qty, baseUnitInfo)\n tmpl.toAmount.textContent = Doc.formatCoinValue(quoteAmount, quoteUnitInfo)\n tmpl.fromIcon.src = Doc.logoPathFromID(this.order.baseID)\n tmpl.toIcon.src = Doc.logoPathFromID(this.order.quoteID)\n } else {\n tmpl.refundAsset.textContent = quoteSymbol\n tmpl.fromAmount.textContent = Doc.formatCoinValue(quoteAmount, quoteUnitInfo)\n tmpl.toAmount.textContent = Doc.formatCoinValue(match.qty, baseUnitInfo)\n tmpl.fromIcon.src = Doc.logoPathFromID(this.order.quoteID)\n tmpl.toIcon.src = Doc.logoPathFromID(this.order.baseID)\n }\n }\n\n /*\n * setMutableMatchCardElements sets the match card elements which may get\n * updated on each update to the match.\n */\n setMutableMatchCardElements (matchCard: HTMLElement, m: Match) {\n if (m.isCancel) return\n\n const tmpl = Doc.parseTemplate(matchCard)\n tmpl.status.textContent = OrderUtil.matchStatusString(m)\n\n const tryShowCoin = (pendingEl: PageElement, coinLink: PageElement, coin: Coin) => {\n if (!coin) {\n Doc.hide(coinLink)\n Doc.show(pendingEl)\n return\n }\n coinLink.textContent = formatCoinID(coin.stringID)\n coinLink.dataset.explorerCoin = coin.stringID\n setCoinHref(coin.assetID, coinLink)\n Doc.show(coinLink)\n Doc.hide(pendingEl)\n }\n\n tryShowCoin(tmpl.makerSwapPending, tmpl.makerSwapCoin, makerSwapCoin(m))\n tryShowCoin(tmpl.takerSwapPending, tmpl.takerSwapCoin, takerSwapCoin(m))\n tryShowCoin(tmpl.makerRedeemPending, tmpl.makerRedeemCoin, makerRedeemCoin(m))\n tryShowCoin(tmpl.takerRedeemPending, tmpl.takerRedeemCoin, takerRedeemCoin(m))\n if (!m.refund) {\n // Special messaging for pending refunds.\n let lockTime = lockTimeMakerMs\n if (m.side === OrderUtil.Taker) lockTime = lockTimeTakerMs\n const refundAfter = new Date(m.stamp + lockTime)\n if (Date.now() > refundAfter.getTime()) tmpl.refundPending.textContent = intl.prep(intl.ID_REFUND_IMMINENT)\n else {\n const refundAfterStr = refundAfter.toLocaleTimeString(Doc.languages(), {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })\n tmpl.refundPending.textContent = intl.prep(intl.ID_REFUND_WILL_HAPPEN_AFTER, { refundAfterTime: refundAfterStr })\n }\n Doc.hide(tmpl.refundCoin)\n Doc.show(tmpl.refundPending)\n } else {\n tmpl.refundCoin.textContent = formatCoinID(m.refund.stringID)\n tmpl.refundCoin.dataset.explorerCoin = m.refund.stringID\n setCoinHref(m.refund.assetID, tmpl.refundCoin)\n Doc.show(tmpl.refundCoin)\n Doc.hide(tmpl.refundPending)\n }\n\n if (m.status === OrderUtil.MakerSwapCast && !m.revoked && !m.refund) {\n const c = makerSwapCoin(m)\n tmpl.makerSwapMsg.textContent = confirmationString(c)\n Doc.hide(tmpl.takerSwapMsg, tmpl.makerRedeemMsg, tmpl.takerRedeemMsg)\n Doc.show(tmpl.makerSwapMsg)\n } else if (m.status === OrderUtil.TakerSwapCast && !m.revoked && !m.refund) {\n const c = takerSwapCoin(m)\n tmpl.takerSwapMsg.textContent = confirmationString(c)\n Doc.hide(tmpl.makerSwapMsg, tmpl.makerRedeemMsg, tmpl.takerRedeemMsg)\n Doc.show(tmpl.takerSwapMsg)\n } else if (inConfirmingMakerRedeem(m) && !m.revoked && !m.refund) {\n tmpl.makerRedeemMsg.textContent = confirmationString(m.redeem)\n Doc.hide(tmpl.makerSwapMsg, tmpl.takerSwapMsg, tmpl.takerRedeemMsg)\n Doc.show(tmpl.makerRedeemMsg)\n } else if (inConfirmingTakerRedeem(m) && !m.revoked && !m.refund) {\n tmpl.takerRedeemMsg.textContent = confirmationString(m.redeem)\n Doc.hide(tmpl.makerSwapMsg, tmpl.takerSwapMsg, tmpl.makerRedeemMsg)\n Doc.show(tmpl.takerRedeemMsg)\n } else {\n Doc.hide(tmpl.makerSwapMsg, tmpl.takerSwapMsg, tmpl.makerRedeemMsg, tmpl.takerRedeemMsg)\n }\n\n if (!m.revoked) {\n // Match is still following the usual success-path, it is desirable for the\n // user to see it in full (even if to learn how atomic swap is supposed to\n // work).\n\n Doc.setVis(makerSwapCoin(m) || m.active, tmpl.makerSwap)\n Doc.setVis(takerSwapCoin(m) || m.active, tmpl.takerSwap)\n Doc.setVis(makerRedeemCoin(m) || m.active, tmpl.makerRedeem)\n // When maker isn't aware of taker redeem coin, once the match becomes inactive\n // (nothing else maker is expected to do in this match) just hide taker redeem.\n Doc.setVis(takerRedeemCoin(m) || m.active, tmpl.takerRedeem)\n // Refunding isn't a usual part of success-path, but don't rule it out.\n Doc.setVis(m.refund, tmpl.refund)\n } else {\n // Match diverged from the usual success-path, since this could have happened\n // at any step it is hard (maybe impossible) to predict the final state this\n // match will end up in, so show only steps that already happened plus all\n // the possibilities on the next step ahead.\n\n // If we don't have swap coins after revocation, we won't show the pending message.\n Doc.setVis(makerSwapCoin(m), tmpl.makerSwap)\n Doc.setVis(takerSwapCoin(m), tmpl.takerSwap)\n const takerRefundsAfter = new Date(m.stamp + lockTimeTakerMs)\n const takerLockTimeExpired = Date.now() > takerRefundsAfter.getTime()\n // When match is revoked and both swaps are present, maker redeem might still show up:\n // - as maker, we'll try to redeem until taker locktime expires (if taker refunds\n // we won't be able to redeem; even if taker hasn't refunded just yet - it\n // becomes too dangerous to redeem after taker locktime expired because maker\n // reveals his secret when redeeming, and taker might be able to submit both\n // redeem and refund transactions before maker's redeem gets mined), so we'll\n // have to show redeem pending element until maker redeem shows up, or until\n // we give up on redeeming due to taker locktime expiry.\n // - as taker, we should expect maker redeeming any time, so we'll have to show\n // redeem pending element until maker redeem shows up, or until we refund.\n Doc.setVis(makerRedeemCoin(m) || (takerSwapCoin(m) && m.active && !m.refund && !takerLockTimeExpired), tmpl.makerRedeem)\n // When maker isn't aware of taker redeem coin, once the match becomes inactive\n // (nothing else maker is expected to do in this match) just hide taker redeem.\n Doc.setVis(takerRedeemCoin(m) || (makerRedeemCoin(m) && m.active && !m.refund), tmpl.takerRedeem)\n // As taker, show refund placeholder only if we have outstanding swap to refund.\n // There is no need to wait for anything else, we can show refund placeholder\n // (to inform the user that it is likely to happen) right after match revocation.\n let expectingRefund = Boolean(takerSwapCoin(m)) // as taker\n if (m.side === OrderUtil.Maker) {\n // As maker, show refund placeholder only if we have outstanding swap to refund.\n // If we don't have taker swap there is no need to wait for anything else, we\n // can show refund placeholder (to inform the user that it is likely to happen)\n // right after match revocation.\n expectingRefund = Boolean(makerSwapCoin(m))\n // If we discover taker swap we'll be trying to redeem it (instead of trying\n // to refund our own swap) until taker refunds, so start showing refund\n // placeholder only after taker is expected to start his refund process in\n // this case.\n if (takerSwapCoin(m)) {\n expectingRefund = expectingRefund && takerLockTimeExpired\n }\n }\n Doc.setVis(m.refund || (m.active && !m.redeem && !m.counterRedeem && expectingRefund), tmpl.refund)\n }\n }\n\n /*\n * addNewMatchCard adds a new card to the list of match cards.\n */\n addNewMatchCard (match: Match) {\n const page = this.page\n const matchCard = page.matchCardTmpl.cloneNode(true) as HTMLElement\n app().bindUrlHandlers(matchCard)\n matchCard.dataset.matchID = match.matchID\n this.setImmutableMatchCardElements(matchCard, match)\n this.setMutableMatchCardElements(matchCard, match)\n page.matchBox.appendChild(matchCard)\n }\n\n /*\n * showMatchCards creates cards for each match in the order.\n */\n showMatchCards () {\n const order = this.order\n if (!order) return\n if (!order.matches) return\n order.matches.sort((a, b) => a.stamp - b.stamp)\n order.matches.forEach((match) => this.addNewMatchCard(match))\n }\n\n /* showCancel shows a form to confirm submission of a cancel order. */\n showCancel () {\n const order = this.order\n const page = this.page\n const remaining = order.qty - order.filled\n const asset = OrderUtil.isMarketBuy(order) ? app().assets[order.quoteID] : app().assets[order.baseID]\n page.cancelRemain.textContent = Doc.formatCoinValue(remaining, asset.unitInfo)\n page.cancelUnit.textContent = asset.unitInfo.conventional.unit.toUpperCase()\n this.showForm(page.cancelForm)\n }\n\n /* showForm shows a modal form with a little animation. */\n async showForm (form: HTMLElement) {\n this.currentForm = form\n const page = this.page\n Doc.hide(page.cancelForm, page.accelerateForm)\n form.style.right = '10000px'\n Doc.show(page.forms, form)\n const shift = (page.forms.offsetWidth + form.offsetWidth) / 2\n await Doc.animate(animationLength, progress => {\n form.style.right = `${(1 - progress) * shift}px`\n }, 'easeOutHard')\n form.style.right = '0px'\n }\n\n /* submitCancel submits a cancellation for the order. */\n async submitCancel () {\n // this will be the page.cancelSubmit button (evt.currentTarget)\n const page = this.page\n const order = this.order\n const req = {\n orderID: order.id\n }\n const loaded = app().loading(page.cancelForm)\n const res = await postJSON('/api/cancel', req)\n loaded()\n if (!app().checkResponse(res)) return\n page.status.textContent = intl.prep(intl.ID_CANCELING)\n Doc.hide(page.forms)\n order.cancelling = true\n }\n\n /*\n * setAccelerationButtonVis shows the acceleration button if the order can\n * be accelerated.\n */\n setAccelerationButtonVis () {\n const order = this.order\n if (!order) return\n const page = this.page\n Doc.setVis(app().canAccelerateOrder(order), page.accelerateBttn, page.actionsLabel)\n }\n\n /* showAccelerateForm shows a form to accelerate an order */\n async showAccelerateForm () {\n const loaded = app().loading(this.page.accelerateBttn)\n this.accelerateOrderForm.refresh(this.order)\n loaded()\n this.showForm(this.page.accelerateForm)\n }\n\n /*\n * handleOrderNote is the handler for the 'order'-type notification, which are\n * used to update an order's status.\n */\n handleOrderNote (note: OrderNote) {\n const page = this.page\n const order = note.order\n if (order.id !== this.orderID) return\n this.order = order\n const bttn = page.cancelBttn\n if (bttn && order.status > OrderUtil.StatusBooked) Doc.hide(bttn)\n page.status.textContent = OrderUtil.statusString(order)\n for (const m of order.matches || []) this.processMatch(m)\n this.setAccelerationButtonVis()\n }\n\n /* handleMatchNote handles a 'match' notification. */\n handleMatchNote (note: MatchNote) {\n if (note.orderID !== this.orderID) return\n this.processMatch(note.match)\n this.setAccelerationButtonVis()\n }\n\n /*\n * processMatch synchronizes a match's card with a match received in a\n * 'order' or 'match' notification.\n */\n processMatch (m: Match) {\n let card: HTMLElement | null = null\n for (const div of Doc.applySelector(this.page.matchBox, '.match-card')) {\n if (div.dataset.matchID === m.matchID) {\n card = div\n break\n }\n }\n if (card) {\n this.setMutableMatchCardElements(card, m)\n } else {\n this.addNewMatchCard(m)\n }\n }\n}\n\n/*\n * confirmationString is a string describing the state of confirmations for a\n * coin.\n * */\nfunction confirmationString (coin: Coin) {\n if (!coin.confs || coin.confs.required === 0) return ''\n return `${coin.confs.count} / ${coin.confs.required} ${intl.prep(intl.ID_CONFIRMATIONS)}`\n}\n\n// makerSwapCoin return's the maker's swap coin.\nfunction makerSwapCoin (m: Match) : Coin {\n return (m.side === OrderUtil.Maker) ? m.swap : m.counterSwap\n}\n\n// takerSwapCoin return's the taker's swap coin.\nfunction takerSwapCoin (m: Match) {\n return (m.side === OrderUtil.Maker) ? m.counterSwap : m.swap\n}\n\n// makerRedeemCoin return's the maker's redeem coin.\nfunction makerRedeemCoin (m: Match) {\n return (m.side === OrderUtil.Maker) ? m.redeem : m.counterRedeem\n}\n\n// takerRedeemCoin return's the taker's redeem coin.\nfunction takerRedeemCoin (m: Match) {\n return (m.side === OrderUtil.Maker) ? m.counterRedeem : m.redeem\n}\n\n/*\n* inConfirmingMakerRedeem will be true if we are the maker, and we are waiting\n* on confirmations for our own redeem.\n*/\nfunction inConfirmingMakerRedeem (m: Match) {\n return m.status < OrderUtil.MatchConfirmed && m.side === OrderUtil.Maker && m.status >= OrderUtil.MakerRedeemed\n}\n\n/*\n* inConfirmingTakerRedeem will be true if we are the taker, and we are waiting\n* on confirmations for our own redeem.\n*/\nfunction inConfirmingTakerRedeem (m: Match) {\n return m.status < OrderUtil.MatchConfirmed && m.side === OrderUtil.Taker && m.status >= OrderUtil.MatchComplete\n}\n","import superPropBase from \"./superPropBase.js\";\nexport default function _get() {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get.bind();\n } else {\n _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n if (desc.get) {\n return desc.get.call(arguments.length < 3 ? target : receiver);\n }\n return desc.value;\n };\n }\n return _get.apply(this, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nexport default function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n return object;\n}","import {\n app,\n PageElement,\n MMBotStatus,\n RunStatsNote,\n RunEventNote,\n StartConfig,\n OrderPlacement,\n AutoRebalanceConfig,\n CEXNotification,\n EpochReportNote,\n CEXProblemsNote,\n MarketWithHost\n} from './registry'\nimport {\n MM,\n CEXDisplayInfo,\n CEXDisplayInfos,\n botTypeBasicArb,\n botTypeArbMM,\n botTypeBasicMM,\n setMarketElements,\n setCexElements,\n PlacementsChart,\n BotMarket,\n hostedMarketID,\n RunningMarketMakerDisplay,\n RunningMMDisplayElements\n} from './mmutil'\nimport Doc, { MiniSlider } from './doc'\nimport BasePage from './basepage'\nimport * as OrderUtil from './orderutil'\nimport { Forms, CEXConfigurationForm } from './forms'\nimport * as intl from './locales'\nimport { StatusBooked } from './orderutil'\nconst mediumBreakpoint = 768\n\ninterface FundingSlider {\n left: {\n cex: number\n dex: number\n }\n right: {\n cex: number\n dex: number\n }\n cexRange: number\n dexRange: number\n}\n\nconst newSlider = () => {\n return {\n left: {\n cex: 0,\n dex: 0\n },\n right: {\n cex: 0,\n dex: 0\n },\n cexRange: 0,\n dexRange: 0\n }\n}\n\ninterface FundingSource {\n avail: number\n req: number\n funded: boolean\n}\n\ninterface FundingOutlook {\n dex: FundingSource\n cex: FundingSource\n transferable: number\n fees: {\n avail: number\n req: number\n funded: boolean\n },\n fundedAndBalanced: boolean\n fundedAndNotBalanced: boolean\n}\n\nfunction parseFundingOptions (f: FundingOutlook): [number, number, FundingSlider | undefined] {\n const { cex: { avail: cexAvail, req: cexReq }, dex: { avail: dexAvail, req: dexReq }, transferable } = f\n\n let proposedDex = Math.min(dexAvail, dexReq)\n let proposedCex = Math.min(cexAvail, cexReq)\n let slider: FundingSlider | undefined\n if (f.fundedAndNotBalanced) {\n // We have everything we need, but not where we need it, and we can\n // deposit and withdraw.\n if (dexAvail > dexReq) {\n // We have too much dex-side, so we'll have to draw on dex to balance\n // cex's shortcomings.\n const cexShort = cexReq - cexAvail\n const dexRemain = dexAvail - dexReq\n if (dexRemain < cexShort) {\n // We did something really bad with math to get here.\n throw Error('bad math has us with dex surplus + cex underfund invalid remains')\n }\n proposedDex += cexShort + transferable\n } else {\n // We don't have enough on dex, but we have enough on cex to cover the\n // short.\n const dexShort = dexReq - dexAvail\n const cexRemain = cexAvail - cexReq\n if (cexRemain < dexShort) {\n throw Error('bad math got us with cex surplus + dex underfund invalid remains')\n }\n proposedCex += dexShort + transferable\n }\n } else if (f.fundedAndBalanced) {\n // This asset is fully funded, but the user may choose to fund order\n // reserves either cex or dex.\n if (transferable > 0) {\n const dexRemain = dexAvail - dexReq\n const cexRemain = cexAvail - cexReq\n\n slider = newSlider()\n\n if (cexRemain > transferable && dexRemain > transferable) {\n // Either one could fully fund order reserves. Let the user choose.\n slider.left.cex = transferable + cexReq\n slider.left.dex = dexReq\n slider.right.cex = cexReq\n slider.right.dex = transferable + dexReq\n } else if (dexRemain < transferable && cexRemain < transferable) {\n // => implied that cexRemain + dexRemain > transferable.\n // CEX can contribute SOME and DEX can contribute SOME.\n slider.left.cex = transferable - dexRemain + cexReq\n slider.left.dex = dexRemain + dexReq\n slider.right.cex = cexRemain + cexReq\n slider.right.dex = transferable - cexRemain + dexReq\n } else if (dexRemain > transferable) {\n // So DEX has enough to cover reserves, but CEX could potentially\n // constribute SOME. NOT ALL.\n slider.left.cex = cexReq\n slider.left.dex = transferable + dexReq\n slider.right.cex = cexRemain + cexReq\n slider.right.dex = transferable - cexRemain + dexReq\n } else {\n // CEX has enough to cover reserves, but DEX could contribute SOME,\n // NOT ALL.\n slider.left.cex = transferable - dexRemain + cexReq\n slider.left.dex = dexRemain + dexReq\n slider.right.cex = transferable + cexReq\n slider.right.dex = dexReq\n }\n // We prefer the slider right in the center.\n slider.cexRange = slider.right.cex - slider.left.cex\n slider.dexRange = slider.right.dex - slider.left.dex\n proposedDex = slider.left.dex + (slider.dexRange / 2)\n proposedCex = slider.left.cex + (slider.cexRange / 2)\n }\n } else { // starved\n if (cexAvail < cexReq) {\n proposedDex = Math.min(dexAvail, dexReq + transferable + (cexReq - cexAvail))\n } else if (dexAvail < dexReq) {\n proposedCex = Math.min(cexAvail, cexReq + transferable + (dexReq - dexAvail))\n } else { // just transferable wasn't covered\n proposedDex = Math.min(dexAvail, dexReq + transferable)\n proposedCex = Math.min(cexAvail, dexReq + cexReq + transferable - proposedDex)\n }\n }\n return [proposedDex, proposedCex, slider]\n}\n\ninterface CEXRow {\n cexName: string\n tr: PageElement\n tmpl: Record<string, PageElement>\n dinfo: CEXDisplayInfo\n}\n\nexport default class MarketMakerPage extends BasePage {\n page: Record<string, PageElement>\n forms: Forms\n currentForm: HTMLElement\n keyup: (e: KeyboardEvent) => void\n cexConfigForm: CEXConfigurationForm\n bots: Record<string, Bot>\n sortedBots: Bot[]\n cexes: Record<string, CEXRow>\n twoColumn: boolean\n runningMMDisplayElements: RunningMMDisplayElements\n removingCfg: MarketWithHost | undefined\n\n constructor (main: HTMLElement) {\n super()\n\n this.bots = {}\n this.sortedBots = []\n this.cexes = {}\n\n const page = this.page = Doc.idDescendants(main)\n\n Doc.cleanTemplates(page.botTmpl, page.botRowTmpl, page.exchangeRowTmpl)\n\n this.forms = new Forms(page.forms)\n this.cexConfigForm = new CEXConfigurationForm(page.cexConfigForm, (cexName: string, success: boolean) => this.cexConfigured(cexName, success))\n this.runningMMDisplayElements = {\n orderReportForm: page.orderReportForm,\n dexBalancesRowTmpl: page.dexBalancesRowTmpl,\n placementRowTmpl: page.placementRowTmpl,\n placementAmtRowTmpl: page.placementAmtRowTmpl\n }\n Doc.cleanTemplates(page.dexBalancesRowTmpl, page.placementRowTmpl, page.placementAmtRowTmpl)\n\n Doc.bind(page.newBot, 'click', () => { this.newBot() })\n Doc.bind(page.archivedLogsBtn, 'click', () => { app().loadPage('mmarchives') })\n Doc.bind(page.confirmRemoveConfigBttn, 'click', () => { this.removeCfg() })\n\n this.twoColumn = window.innerWidth >= mediumBreakpoint\n const ro = new ResizeObserver(() => { this.resized() })\n ro.observe(main)\n\n for (const [cexName, dinfo] of Object.entries(CEXDisplayInfos)) {\n const tr = page.exchangeRowTmpl.cloneNode(true) as PageElement\n page.cexRows.appendChild(tr)\n const tmpl = Doc.parseTemplate(tr)\n const configure = () => {\n this.cexConfigForm.setCEX(cexName)\n this.forms.show(page.cexConfigForm)\n }\n Doc.bind(tmpl.configureBttn, 'click', configure)\n Doc.bind(tmpl.reconfigBttn, 'click', configure)\n Doc.bind(tmpl.errConfigureBttn, 'click', configure)\n const row = this.cexes[cexName] = { tr, tmpl, dinfo, cexName }\n this.updateCexRow(row)\n }\n\n this.setup()\n }\n\n resized () {\n const useTwoColumn = window.innerWidth >= 768\n if (useTwoColumn !== this.twoColumn) {\n this.twoColumn = useTwoColumn\n this.clearBotBoxes()\n for (const { div } of this.sortedBots) this.appendBotBox(div)\n }\n }\n\n async setup () {\n const page = this.page\n const mmStatus = app().mmStatus\n\n const botConfigs = mmStatus.bots.map((s: MMBotStatus) => s.config)\n app().registerNoteFeeder({\n runstats: (note: RunStatsNote) => { this.handleRunStatsNote(note) },\n runevent: (note: RunEventNote) => {\n const bot = this.bots[hostedMarketID(note.host, note.baseID, note.quoteID)]\n if (bot) return bot.handleRunStats()\n },\n epochreport: (note: EpochReportNote) => {\n const bot = this.bots[hostedMarketID(note.host, note.baseID, note.quoteID)]\n if (bot) bot.handleEpochReportNote(note)\n },\n cexproblems: (note: CEXProblemsNote) => {\n const bot = this.bots[hostedMarketID(note.host, note.baseID, note.quoteID)]\n if (bot) bot.handleCexProblemsNote(note)\n },\n cexnote: (note: CEXNotification) => { this.handleCEXNote(note) }\n // TODO bot start-stop notification\n })\n\n const noBots = !botConfigs || botConfigs.length === 0\n Doc.setVis(noBots, page.noBots)\n if (noBots) return\n page.noBots.remove()\n\n const sortedBots = [...mmStatus.bots].sort((a: MMBotStatus, b: MMBotStatus) => {\n if (a.running && !b.running) return -1\n if (b.running && !a.running) return 1\n // If none are running, just do something to get a resonably reproducible\n // sort.\n if (!a.running && !b.running) return (a.config.baseID + a.config.quoteID) - (b.config.baseID + b.config.quoteID)\n // Both are running. Sort by run time.\n return (b.runStats?.startTime ?? 0) - (a.runStats?.startTime ?? 0)\n })\n\n for (const botStatus of sortedBots) this.addBot(botStatus)\n }\n\n async handleCEXNote (n: CEXNotification) {\n switch (n.topic) {\n case 'BalanceUpdate':\n return this.handleCEXBalanceUpdate(n.cexName /* , n.note */)\n }\n }\n\n async handleCEXBalanceUpdate (cexName: string /* , note: CEXBalanceUpdate */) {\n const cexRow = this.cexes[cexName]\n if (cexRow) this.updateCexRow(cexRow)\n }\n\n async handleRunStatsNote (note: RunStatsNote) {\n const { baseID, quoteID, host } = note\n const bot = this.bots[hostedMarketID(host, baseID, quoteID)]\n if (bot) return bot.handleRunStats()\n this.addBot(app().botStatus(host, baseID, quoteID) as MMBotStatus)\n }\n\n unload (): void {\n Doc.unbind(document, 'keyup', this.keyup)\n }\n\n addBot (botStatus: MMBotStatus) {\n const { page, bots, sortedBots } = this\n // Make sure the market still exists.\n const { config: { baseID, quoteID, host } } = botStatus\n const [baseSymbol, quoteSymbol] = [app().assets[baseID].symbol, app().assets[quoteID].symbol]\n const mktID = `${baseSymbol}_${quoteSymbol}`\n if (!app().exchanges[host]?.markets[mktID]) return\n const bot = new Bot(this, this.runningMMDisplayElements, botStatus)\n page.botRows.appendChild(bot.row.tr)\n sortedBots.push(bot)\n bots[bot.id] = bot\n this.appendBotBox(bot.div)\n }\n\n confirmRemoveCfg (mwh: MarketWithHost) {\n const page = this.page\n this.removingCfg = mwh\n Doc.hide(page.removeCfgErr)\n const { unitInfo: { conventional: { unit: baseTicker } } } = app().assets[mwh.baseID]\n const { unitInfo: { conventional: { unit: quoteTicker } } } = app().assets[mwh.quoteID]\n page.confirmRemoveCfgMsg.textContent = intl.prep(intl.ID_DELETE_BOT, { host: mwh.host, baseTicker, quoteTicker })\n this.forms.show(this.page.confirmRemoveForm)\n }\n\n async removeCfg () {\n const page = this.page\n if (!this.removingCfg) { this.forms.close(); return }\n const resp = await MM.removeBotConfig(this.removingCfg.host, this.removingCfg.baseID, this.removingCfg.quoteID)\n if (!app().checkResponse(resp)) {\n page.removeCfgErr.textContent = intl.prep(intl.ID_API_ERROR, { msg: resp.msg })\n Doc.show(page.removeCfgErr)\n return\n }\n await app().fetchMMStatus()\n app().loadPage('mm')\n }\n\n appendBotBox (div: PageElement) {\n const { page: { boxZero, boxOne }, twoColumn } = this\n const useZeroth = !twoColumn || (boxZero.children.length + boxOne.children.length) % 2 === 0\n const box = useZeroth ? boxZero : boxOne\n box.append(div)\n }\n\n clearBotBoxes () {\n const { page: { boxOne, boxZero } } = this\n while (boxZero.children.length > 1) boxZero.removeChild(boxZero.lastChild as Element)\n while (boxOne.children.length > 0) boxOne.removeChild(boxOne.lastChild as Element)\n }\n\n showBot (botID: string) {\n const { sortedBots } = this\n const idx = sortedBots.findIndex((bot: Bot) => bot.id === botID)\n sortedBots.splice(idx, 1)\n sortedBots.unshift(this.bots[botID])\n this.clearBotBoxes()\n for (const { div } of sortedBots) this.appendBotBox(div)\n const div = this.bots[botID].div\n Doc.animate(250, (p: number) => {\n div.style.opacity = `${p}`\n div.style.transform = `scale(${0.8 + 0.2 * p})`\n })\n }\n\n newBot () {\n app().loadPage('mmsettings')\n }\n\n async cexConfigured (cexName: string, success: boolean) {\n await app().fetchMMStatus()\n this.updateCexRow(this.cexes[cexName])\n if (success) this.forms.close()\n }\n\n updateCexRow (row: CEXRow) {\n const { tmpl, dinfo, cexName } = row\n tmpl.logo.src = dinfo.logo\n tmpl.name.textContent = dinfo.name\n const status = app().mmStatus.cexes[cexName]\n Doc.setVis(!status, tmpl.unconfigured)\n Doc.setVis(status && !status.connectErr, tmpl.configured)\n Doc.setVis(status?.connectErr, tmpl.connectErrBox)\n if (status?.connectErr) {\n tmpl.connectErr.textContent = 'connection error'\n tmpl.connectErr.dataset.tooltip = status.connectErr\n }\n tmpl.logo.classList.toggle('greyscale', !status)\n if (!status) return\n let usdBal = 0\n const cexSymbolAdded : Record<string, boolean> = {} // avoid double counting tokens or counting both eth and weth\n for (const [assetIDStr, bal] of Object.entries(status.balances)) {\n const assetID = parseInt(assetIDStr)\n const cexSymbol = Doc.bipCEXSymbol(assetID)\n if (cexSymbolAdded[cexSymbol]) continue\n cexSymbolAdded[cexSymbol] = true\n const { unitInfo } = app().assets[assetID]\n const fiatRate = app().fiatRatesMap[assetID]\n if (fiatRate) usdBal += fiatRate * (bal.available + bal.locked) / unitInfo.conventional.conversionFactor\n }\n tmpl.usdBalance.textContent = Doc.formatFourSigFigs(usdBal)\n }\n\n percentageBalanceStr (assetID: number, balance: number, percentage: number): string {\n const asset = app().assets[assetID]\n const unitInfo = asset.unitInfo\n const assetValue = Doc.formatCoinValue((balance * percentage) / 100, unitInfo)\n return `${Doc.formatFourSigFigs(percentage)}% - ${assetValue} ${asset.symbol.toUpperCase()}`\n }\n\n /*\n * walletBalanceStr returns a string like \"50% - 0.0001 BTC\" representing\n * the percentage of a wallet's balance selected in the market maker setting,\n * and the amount of that asset in the wallet.\n */\n walletBalanceStr (assetID: number, percentage: number): string {\n const { wallet: { balance: { available } } } = app().assets[assetID]\n return this.percentageBalanceStr(assetID, available, percentage)\n }\n}\n\ninterface BotRow {\n tr: PageElement\n tmpl: Record<string, PageElement>\n}\n\nclass Bot extends BotMarket {\n pg: MarketMakerPage\n div: PageElement\n page: Record<string, PageElement>\n placementsChart: PlacementsChart\n baseAllocSlider: MiniSlider\n quoteAllocSlider: MiniSlider\n row: BotRow\n runDisplay: RunningMarketMakerDisplay\n\n constructor (pg: MarketMakerPage, runningMMElements: RunningMMDisplayElements, status: MMBotStatus) {\n super(status.config)\n this.pg = pg\n const { baseID, quoteID, host, botType, nBuyPlacements, nSellPlacements, cexName } = this\n this.id = hostedMarketID(host, baseID, quoteID)\n\n const div = this.div = pg.page.botTmpl.cloneNode(true) as PageElement\n const page = this.page = Doc.parseTemplate(div)\n\n this.runDisplay = new RunningMarketMakerDisplay(page.onBox, pg.forms, runningMMElements, 'mm')\n\n setMarketElements(div, baseID, quoteID, host)\n if (cexName) setCexElements(div, cexName)\n\n if (botType === botTypeArbMM) {\n page.botTypeDisplay.textContent = intl.prep(intl.ID_BOTTYPE_ARB_MM)\n } else if (botType === botTypeBasicArb) {\n page.botTypeDisplay.textContent = intl.prep(intl.ID_BOTTYPE_SIMPLE_ARB)\n } else if (botType === botTypeBasicMM) {\n page.botTypeDisplay.textContent = intl.prep(intl.ID_BOTTYPE_BASIC_MM)\n }\n\n Doc.setVis(botType !== botTypeBasicArb, page.placementsChartBox, page.baseTokenSwapFeesBox)\n if (botType !== botTypeBasicArb) {\n this.placementsChart = new PlacementsChart(page.placementsChart)\n page.buyPlacementCount.textContent = String(nBuyPlacements)\n page.sellPlacementCount.textContent = String(nSellPlacements)\n }\n\n Doc.bind(page.startBttn, 'click', () => this.start())\n Doc.bind(page.allocationBttn, 'click', () => this.allocate())\n Doc.bind(page.reconfigureBttn, 'click', () => this.reconfigure())\n Doc.bind(page.removeBttn, 'click', () => this.pg.confirmRemoveCfg(status.config))\n Doc.bind(page.goBackFromAllocation, 'click', () => this.hideAllocationDialog())\n Doc.bind(page.marketLink, 'click', () => app().loadPage('markets', { host, baseID, quoteID }))\n\n this.baseAllocSlider = new MiniSlider(page.baseAllocSlider, () => { /* callback set later */ })\n this.quoteAllocSlider = new MiniSlider(page.quoteAllocSlider, () => { /* callback set later */ })\n\n const tr = pg.page.botRowTmpl.cloneNode(true) as PageElement\n setMarketElements(tr, baseID, quoteID, host)\n const tmpl = Doc.parseTemplate(tr)\n this.row = { tr, tmpl }\n Doc.bind(tmpl.allocateBttn, 'click', (e: MouseEvent) => {\n e.stopPropagation()\n this.allocate()\n pg.showBot(this.id)\n })\n Doc.bind(tr, 'click', () => pg.showBot(this.id))\n\n this.initialize()\n }\n\n async initialize () {\n await super.initialize()\n this.runDisplay.setBotMarket(this)\n const {\n page, host, cexName, botType, div,\n cfg: { arbMarketMakingConfig, basicMarketMakingConfig }, mktID,\n baseFactor, quoteFactor, marketReport: { baseFiatRate }\n } = this\n\n if (botType !== botTypeBasicArb) {\n let buyPlacements: OrderPlacement[] = []\n let sellPlacements: OrderPlacement[] = []\n let profit = 0\n if (arbMarketMakingConfig) {\n buyPlacements = arbMarketMakingConfig.buyPlacements.map((p) => ({ lots: p.lots, gapFactor: p.multiplier }))\n sellPlacements = arbMarketMakingConfig.sellPlacements.map((p) => ({ lots: p.lots, gapFactor: p.multiplier }))\n profit = arbMarketMakingConfig.profit\n } else if (basicMarketMakingConfig) {\n buyPlacements = basicMarketMakingConfig.buyPlacements\n sellPlacements = basicMarketMakingConfig.sellPlacements\n let bestBuy: OrderPlacement | undefined\n let bestSell : OrderPlacement | undefined\n if (buyPlacements.length > 0) bestBuy = buyPlacements.reduce((prev: OrderPlacement, curr: OrderPlacement) => curr.gapFactor < prev.gapFactor ? curr : prev)\n if (sellPlacements.length > 0) bestSell = sellPlacements.reduce((prev: OrderPlacement, curr: OrderPlacement) => curr.gapFactor < prev.gapFactor ? curr : prev)\n if (bestBuy && bestSell) {\n profit = (bestBuy.gapFactor + bestSell.gapFactor) / 2\n } else if (bestBuy) {\n profit = bestBuy.gapFactor\n } else if (bestSell) {\n profit = bestSell.gapFactor\n }\n }\n const marketConfig = { cexName: cexName as string, botType, baseFiatRate: baseFiatRate, dict: { profit, buyPlacements, sellPlacements } }\n this.placementsChart.setMarket(marketConfig)\n }\n\n Doc.setVis(botType !== botTypeBasicMM, page.cexDataBox)\n if (botType !== botTypeBasicMM) {\n const cex = app().mmStatus.cexes[cexName]\n if (cex) {\n const mkt = cex.markets ? cex.markets[mktID] : undefined\n Doc.setVis(mkt?.day, page.cexDataBox)\n if (mkt?.day) {\n const day = mkt.day\n page.cexPrice.textContent = Doc.formatFourSigFigs(day.lastPrice)\n page.cexVol.textContent = Doc.formatFourSigFigs(baseFiatRate * day.vol)\n }\n }\n }\n Doc.setVis(Boolean(cexName), ...Doc.applySelector(div, '[data-cex-show]'))\n\n const { spot } = app().exchanges[host].markets[mktID]\n if (spot) {\n Doc.show(page.dexDataBox)\n const c = OrderUtil.RateEncodingFactor / baseFactor * quoteFactor\n page.dexPrice.textContent = Doc.formatFourSigFigs(spot.rate / c)\n page.dexVol.textContent = Doc.formatFourSigFigs(spot.vol24 / baseFactor * baseFiatRate)\n }\n\n this.updateDisplay()\n this.updateTableRow()\n Doc.hide(page.loadingBg)\n }\n\n updateTableRow () {\n const { row: { tmpl } } = this\n const { running, runStats } = this.status()\n Doc.setVis(running, tmpl.profitLossBox)\n Doc.setVis(!running, tmpl.allocateBttnBox)\n if (runStats) {\n tmpl.profitLoss.textContent = Doc.formatFourSigFigs(runStats.profitLoss.profit, 2)\n }\n }\n\n updateDisplay () {\n const { page, marketReport: { baseFiatRate, quoteFiatRate }, baseFeeFiatRate, quoteFeeFiatRate } = this\n if ([baseFiatRate, quoteFiatRate, baseFeeFiatRate, quoteFeeFiatRate].some((r: number) => !r)) {\n Doc.hide(page.onBox, page.offBox)\n Doc.show(page.noFiatDisplay)\n return\n }\n const { running } = this.status()\n Doc.setVis(running, page.onBox)\n Doc.setVis(!running, page.offBox)\n if (running) this.updateRunningDisplay()\n else this.updateIdleDisplay()\n }\n\n updateRunningDisplay () {\n this.runDisplay.update()\n }\n\n updateIdleDisplay () {\n const {\n page, proj: { alloc, qProj, bProj }, baseID, quoteID, cexName, bui, qui, baseFeeID,\n quoteFeeID, baseFactor, quoteFactor, baseFeeFactor, quoteFeeFactor,\n marketReport: { baseFiatRate, quoteFiatRate }, cfg: { uiConfig: { baseConfig, quoteConfig } },\n quoteFeeUI, baseFeeUI\n } = this\n page.baseAlloc.textContent = Doc.formatFullPrecision(alloc[baseID], bui)\n const baseUSD = alloc[baseID] / baseFactor * baseFiatRate\n let totalUSD = baseUSD\n page.baseAllocUSD.textContent = Doc.formatFourSigFigs(baseUSD)\n page.baseBookAlloc.textContent = Doc.formatFullPrecision(bProj.book * baseFactor, bui)\n page.baseOrderReservesAlloc.textContent = Doc.formatFullPrecision(bProj.orderReserves * baseFactor, bui)\n page.baseOrderReservesPct.textContent = String(Math.round(baseConfig.orderReservesFactor * 100))\n Doc.setVis(cexName, page.baseCexAllocBox)\n if (cexName) page.baseCexAlloc.textContent = Doc.formatFullPrecision(bProj.cex * baseFactor, bui)\n Doc.setVis(baseFeeID === baseID, page.baseBookingFeesAllocBox)\n Doc.setVis(baseFeeID !== baseID, page.baseTokenFeesAllocBox)\n if (baseFeeID === baseID) {\n const bookingFees = baseID === quoteFeeID ? bProj.bookingFees + qProj.bookingFees : bProj.bookingFees\n page.baseBookingFeesAlloc.textContent = Doc.formatFullPrecision(bookingFees * baseFeeFactor, baseFeeUI)\n } else {\n const feeAlloc = alloc[baseFeeID]\n page.baseTokenFeeAlloc.textContent = Doc.formatFullPrecision(feeAlloc, baseFeeUI)\n const baseFeeUSD = feeAlloc / baseFeeFactor * app().fiatRatesMap[baseFeeID]\n totalUSD += baseFeeUSD\n page.baseTokenAllocUSD.textContent = Doc.formatFourSigFigs(baseFeeUSD)\n const withQuote = baseFeeID === quoteFeeID\n const bookingFees = bProj.bookingFees + (withQuote ? qProj.bookingFees : 0)\n page.baseTokenBookingFees.textContent = Doc.formatFullPrecision(bookingFees * baseFeeFactor, baseFeeUI)\n page.baseTokenSwapFeeN.textContent = String(baseConfig.swapFeeN + (withQuote ? quoteConfig.swapFeeN : 0))\n const swapReserves = bProj.swapFeeReserves + (withQuote ? qProj.swapFeeReserves : 0)\n page.baseTokenSwapFees.textContent = Doc.formatFullPrecision(swapReserves * baseFeeFactor, baseFeeUI)\n }\n\n page.quoteAlloc.textContent = Doc.formatFullPrecision(alloc[quoteID], qui)\n const quoteUSD = alloc[quoteID] / quoteFactor * quoteFiatRate\n totalUSD += quoteUSD\n page.quoteAllocUSD.textContent = Doc.formatFourSigFigs(quoteUSD)\n page.quoteBookAlloc.textContent = Doc.formatFullPrecision(qProj.book * quoteFactor, qui)\n page.quoteOrderReservesAlloc.textContent = Doc.formatFullPrecision(qProj.orderReserves * quoteFactor, qui)\n page.quoteOrderReservesPct.textContent = String(Math.round(quoteConfig.orderReservesFactor * 100))\n page.quoteSlippageAlloc.textContent = Doc.formatFullPrecision(qProj.slippageBuffer * quoteFactor, qui)\n page.slippageBufferFactor.textContent = String(Math.round(quoteConfig.slippageBufferFactor * 100))\n Doc.setVis(cexName, page.quoteCexAllocBox)\n if (cexName) page.quoteCexAlloc.textContent = Doc.formatFullPrecision(qProj.cex * quoteFactor, qui)\n Doc.setVis(quoteID === quoteFeeID, page.quoteBookingFeesAllocBox)\n Doc.setVis(quoteFeeID !== quoteID && quoteFeeID !== baseFeeID, page.quoteTokenFeesAllocBox)\n if (quoteID === quoteFeeID) {\n const bookingFees = quoteID === baseFeeID ? bProj.bookingFees + qProj.bookingFees : qProj.bookingFees\n page.quoteBookingFeesAlloc.textContent = Doc.formatFullPrecision(bookingFees * quoteFeeFactor, quoteFeeUI)\n } else if (quoteFeeID !== baseFeeID) {\n page.quoteTokenFeeAlloc.textContent = Doc.formatFullPrecision(alloc[quoteFeeID], quoteFeeUI)\n const quoteFeeUSD = alloc[quoteFeeID] / quoteFeeFactor * app().fiatRatesMap[quoteFeeID]\n totalUSD += quoteFeeUSD\n page.quoteTokenAllocUSD.textContent = Doc.formatFourSigFigs(quoteFeeUSD)\n page.quoteTokenBookingFees.textContent = Doc.formatFullPrecision(qProj.bookingFees * quoteFeeFactor, quoteFeeUI)\n page.quoteTokenSwapFeeN.textContent = String(quoteConfig.swapFeeN)\n page.quoteTokenSwapFees.textContent = Doc.formatFullPrecision(qProj.swapFeeReserves * quoteFeeFactor, quoteFeeUI)\n }\n page.totalAllocUSD.textContent = Doc.formatFourSigFigs(totalUSD)\n }\n\n /*\n * allocate opens a dialog to choose funding sources (if applicable) and\n * confirm allocations and start the bot.\n */\n allocate () {\n const {\n page, marketReport: { baseFiatRate, quoteFiatRate }, baseID, quoteID,\n baseFeeID, quoteFeeID, baseFeeFiatRate, quoteFeeFiatRate, cexName,\n baseFactor, quoteFactor, baseFeeFactor, quoteFeeFactor, host, mktID\n } = this\n\n if (cexName) {\n const cex = app().mmStatus.cexes[cexName]\n if (!cex || !cex.connected) {\n page.offError.textContent = intl.prep(intl.ID_CEX_NOT_CONNECTED, { cexName })\n Doc.showTemporarily(3000, page.offError)\n return\n }\n }\n\n const f = this.fundingState()\n\n const [proposedDexBase, proposedCexBase, baseSlider] = parseFundingOptions(f.base)\n const [proposedDexQuote, proposedCexQuote, quoteSlider] = parseFundingOptions(f.quote)\n\n const alloc = this.alloc = {\n dex: {\n [baseID]: proposedDexBase * baseFactor,\n [quoteID]: proposedDexQuote * quoteFactor\n },\n cex: {\n [baseID]: proposedCexBase * baseFactor,\n [quoteID]: proposedCexQuote * quoteFactor\n }\n }\n\n alloc.dex[baseFeeID] = Math.min((alloc.dex[baseFeeID] ?? 0) + (f.base.fees.req * baseFeeFactor), f.base.fees.avail * baseFeeFactor)\n alloc.dex[quoteFeeID] = Math.min((alloc.dex[quoteFeeID] ?? 0) + (f.quote.fees.req * quoteFeeFactor), f.quote.fees.avail * quoteFeeFactor)\n\n let totalUSD = (alloc.dex[baseID] / baseFactor * baseFiatRate) + (alloc.dex[quoteID] / quoteFactor * quoteFiatRate)\n totalUSD += (alloc.cex[baseID] / baseFactor * baseFiatRate) + (alloc.cex[quoteID] / quoteFactor * quoteFiatRate)\n if (baseFeeID !== baseID) totalUSD += alloc.dex[baseFeeID] / baseFeeFactor * baseFeeFiatRate\n if (quoteFeeID !== quoteID && quoteFeeID !== baseFeeID) totalUSD += alloc.dex[quoteFeeID] / quoteFeeFactor * quoteFeeFiatRate\n page.allocUSD.textContent = Doc.formatFourSigFigs(totalUSD)\n\n Doc.setVis(cexName, ...Doc.applySelector(page.allocationDialog, '[data-cex-only]'))\n Doc.setVis(f.fundedAndBalanced, page.fundedAndBalancedBox)\n Doc.setVis(f.base.transferable + f.quote.transferable > 0, page.hasTransferable)\n Doc.setVis(f.fundedAndNotBalanced, page.fundedAndNotBalancedBox)\n Doc.setVis(f.starved, page.starvedBox)\n page.startBttn.classList.toggle('go', f.fundedAndBalanced)\n page.startBttn.classList.toggle('warning', !f.fundedAndBalanced)\n page.proposedDexBaseAlloc.classList.toggle('text-warning', !(f.base.fundedAndBalanced || f.base.fundedAndNotBalanced))\n page.proposedDexQuoteAlloc.classList.toggle('text-warning', !(f.quote.fundedAndBalanced || f.quote.fundedAndNotBalanced))\n\n const setBaseProposal = (dex: number, cex: number) => {\n page.proposedDexBaseAlloc.textContent = Doc.formatFourSigFigs(dex)\n page.proposedDexBaseAllocUSD.textContent = Doc.formatFourSigFigs(dex * baseFiatRate)\n page.proposedCexBaseAlloc.textContent = Doc.formatFourSigFigs(cex)\n page.proposedCexBaseAllocUSD.textContent = Doc.formatFourSigFigs(cex * baseFiatRate)\n }\n setBaseProposal(proposedDexBase, proposedCexBase)\n\n Doc.setVis(baseSlider, page.baseAllocSlider)\n if (baseSlider) {\n const dexRange = baseSlider.right.dex - baseSlider.left.dex\n const cexRange = baseSlider.right.cex - baseSlider.left.cex\n this.baseAllocSlider.setValue(0.5)\n this.baseAllocSlider.changed = (r: number) => {\n const dexAlloc = baseSlider.left.dex + r * dexRange\n const cexAlloc = baseSlider.left.cex + r * cexRange\n alloc.dex[baseID] = dexAlloc * baseFactor\n alloc.cex[baseID] = cexAlloc * baseFactor\n setBaseProposal(dexAlloc, cexAlloc)\n }\n }\n\n const setQuoteProposal = (dex: number, cex: number) => {\n page.proposedDexQuoteAlloc.textContent = Doc.formatFourSigFigs(dex)\n page.proposedDexQuoteAllocUSD.textContent = Doc.formatFourSigFigs(dex * quoteFiatRate)\n page.proposedCexQuoteAlloc.textContent = Doc.formatFourSigFigs(cex)\n page.proposedCexQuoteAllocUSD.textContent = Doc.formatFourSigFigs(cex * quoteFiatRate)\n }\n setQuoteProposal(proposedDexQuote, proposedCexQuote)\n\n Doc.setVis(quoteSlider, page.quoteAllocSlider)\n if (quoteSlider) {\n const dexRange = quoteSlider.right.dex - quoteSlider.left.dex\n const cexRange = quoteSlider.right.cex - quoteSlider.left.cex\n this.quoteAllocSlider.setValue(0.5)\n this.quoteAllocSlider.changed = (r: number) => {\n const dexAlloc = quoteSlider.left.dex + r * dexRange\n const cexAlloc = quoteSlider.left.cex + r * cexRange\n alloc.dex[quoteID] = dexAlloc * quoteFactor\n alloc.cex[quoteID] = cexAlloc * quoteFactor\n setQuoteProposal(dexAlloc, cexAlloc)\n }\n }\n\n Doc.setVis(baseFeeID !== baseID, ...Doc.applySelector(page.allocationDialog, '[data-base-token-fees]'))\n if (baseFeeID !== baseID) {\n const reqFees = f.base.fees.req + (baseFeeID === quoteFeeID ? f.quote.fees.req : 0)\n const proposedFees = Math.min(reqFees, f.base.fees.avail)\n page.proposedDexBaseFeeAlloc.textContent = Doc.formatFourSigFigs(proposedFees)\n page.proposedDexBaseFeeAllocUSD.textContent = Doc.formatFourSigFigs(proposedFees * baseFeeFiatRate)\n page.proposedDexBaseFeeAlloc.classList.toggle('text-warning', !f.base.fees.funded)\n }\n\n const needQuoteTokenFees = quoteFeeID !== quoteID && quoteFeeID !== baseFeeID\n Doc.setVis(needQuoteTokenFees, ...Doc.applySelector(page.allocationDialog, '[data-quote-token-fees]'))\n if (needQuoteTokenFees) {\n const proposedFees = Math.min(f.quote.fees.req, f.quote.fees.avail)\n page.proposedDexQuoteFeeAlloc.textContent = Doc.formatFourSigFigs(proposedFees)\n page.proposedDexQuoteFeeAllocUSD.textContent = Doc.formatFourSigFigs(proposedFees * quoteFeeFiatRate)\n page.proposedDexQuoteFeeAlloc.classList.toggle('text-warning', !f.quote.fees.funded)\n }\n\n const mkt = app().exchanges[host]?.markets[mktID]\n let existingOrders = false\n if (mkt && mkt.orders) {\n for (let i = 0; i < mkt.orders.length; i++) {\n if (mkt.orders[i].status <= StatusBooked) {\n existingOrders = true\n break\n }\n }\n }\n Doc.setVis(existingOrders, page.existingOrdersBox)\n\n Doc.show(page.allocationDialog)\n const closeDialog = (e: MouseEvent) => {\n if (Doc.mouseInElement(e, page.allocationDialog)) return\n this.hideAllocationDialog()\n Doc.unbind(document, 'click', closeDialog)\n }\n Doc.bind(document, 'click', closeDialog)\n }\n\n hideAllocationDialog () {\n Doc.hide(this.page.allocationDialog)\n }\n\n async start () {\n const { page, alloc, baseID, quoteID, host, cexName, cfg: { uiConfig: { cexRebalance } } } = this\n\n Doc.hide(page.errMsg)\n if (cexName && !app().mmStatus.cexes[cexName]?.connected) {\n page.errMsg.textContent = `${cexName} not connected`\n Doc.show(page.errMsg)\n return\n }\n\n // round allocations values.\n for (const m of [alloc.dex, alloc.cex]) {\n for (const [assetID, v] of Object.entries(m)) m[parseInt(assetID)] = Math.round(v)\n }\n\n const startConfig: StartConfig = {\n baseID: baseID,\n quoteID: quoteID,\n host: host,\n alloc: alloc\n }\n if (cexName && cexRebalance) startConfig.autoRebalance = this.autoRebalanceSettings()\n\n try {\n app().log('mm', 'starting mm bot', startConfig)\n const res = await MM.startBot(startConfig)\n if (!app().checkResponse(res)) throw res\n } catch (e) {\n page.errMsg.textContent = intl.prep(intl.ID_API_ERROR, e)\n Doc.show(page.errMsg)\n return\n }\n this.hideAllocationDialog()\n }\n\n autoRebalanceSettings (): AutoRebalanceConfig {\n const {\n proj: { bProj, qProj, alloc }, baseFeeID, quoteFeeID, cfg: { uiConfig: { baseConfig, quoteConfig } },\n baseID, quoteID, cexName, mktID\n } = this\n\n const totalBase = alloc[baseID]\n let dexMinBase = bProj.book\n if (baseID === baseFeeID) dexMinBase += bProj.bookingFees\n if (baseID === quoteFeeID) dexMinBase += qProj.bookingFees\n let dexMinQuote = qProj.book\n if (quoteID === quoteFeeID) dexMinQuote += qProj.bookingFees\n if (quoteID === baseFeeID) dexMinQuote += bProj.bookingFees\n const maxBase = Math.max(totalBase - dexMinBase, totalBase - bProj.cex)\n const totalQuote = alloc[quoteID]\n const maxQuote = Math.max(totalQuote - dexMinQuote, totalQuote - qProj.cex)\n if (maxBase < 0 || maxQuote < 0) {\n throw Error(`rebalance math doesn't work: ${JSON.stringify({ bProj, qProj, maxBase, maxQuote })}`)\n }\n const cex = app().mmStatus.cexes[cexName]\n const mkt = cex.markets[mktID]\n const [minB, maxB] = [mkt.baseMinWithdraw, Math.max(mkt.baseMinWithdraw * 2, maxBase)]\n const minBaseTransfer = Math.round(minB + baseConfig.transferFactor * (maxB - minB))\n const [minQ, maxQ] = [mkt.quoteMinWithdraw, Math.max(mkt.quoteMinWithdraw * 2, maxQuote)]\n const minQuoteTransfer = Math.round(minQ + quoteConfig.transferFactor * (maxQ - minQ))\n return { minBaseTransfer, minQuoteTransfer }\n }\n\n reconfigure () {\n const { host, baseID, quoteID, cexName, botType, page } = this\n if (cexName) {\n const cex = app().mmStatus.cexes[cexName]\n if (!cex || !cex.connected) {\n page.offError.textContent = intl.prep(intl.ID_CEX_NOT_CONNECTED, { cexName })\n Doc.showTemporarily(3000, page.offError)\n return\n }\n }\n app().loadPage('mmsettings', { host, baseID, quoteID, cexName, botType })\n }\n\n handleEpochReportNote (note: EpochReportNote) {\n this.runDisplay.handleEpochReportNote(note)\n }\n\n handleCexProblemsNote (note: CEXProblemsNote) {\n this.runDisplay.handleCexProblemsNote(note)\n }\n\n handleRunStats () {\n this.updateDisplay()\n this.updateTableRow()\n this.runDisplay.readBook()\n }\n}\n","import {\n PageElement,\n BotConfig,\n OrderPlacement,\n app,\n Spot,\n MarketReport,\n OrderOption,\n CEXConfig,\n BasicMarketMakingConfig,\n ArbMarketMakingConfig,\n SimpleArbConfig,\n ArbMarketMakingPlacement,\n ExchangeBalance,\n MarketMakingStatus,\n MMCEXStatus,\n BalanceNote,\n BotAssetConfig,\n ApprovalStatus,\n SupportedAsset,\n WalletState,\n UnitInfo,\n ProjectedAlloc,\n AssetBookingFees\n} from './registry'\nimport Doc, {\n NumberInput,\n MiniSlider,\n IncrementalInput,\n toFourSigFigs,\n toPrecision,\n parseFloatDefault\n} from './doc'\nimport State from './state'\nimport BasePage from './basepage'\nimport { setOptionTemplates } from './opts'\nimport {\n MM,\n CEXDisplayInfos,\n botTypeBasicArb,\n botTypeArbMM,\n botTypeBasicMM,\n runningBotInventory,\n setMarketElements,\n setCexElements,\n calculateQuoteLot,\n PlacementsChart,\n liveBotConfig,\n GapStrategyMultiplier,\n GapStrategyAbsolute,\n GapStrategyAbsolutePlus,\n GapStrategyPercent,\n GapStrategyPercentPlus,\n feesAndCommit\n} from './mmutil'\nimport { Forms, bind as bindForm, NewWalletForm, TokenApprovalForm, DepositAddress, CEXConfigurationForm } from './forms'\nimport * as intl from './locales'\nimport * as OrderUtil from './orderutil'\n\nconst specLK = 'lastMMSpecs'\nconst lastBotsLK = 'lastBots'\nconst lastArbExchangeLK = 'lastArbExchange'\nconst arbMMRowCacheKey = 'arbmm'\n\nconst defaultSwapReserves = {\n n: 50,\n prec: 0,\n inc: 10,\n minR: 0,\n maxR: 1000,\n range: 1000\n}\nconst defaultOrderReserves = {\n factor: 1.0,\n minR: 0,\n maxR: 3,\n range: 3,\n prec: 3\n}\nconst defaultTransfer = {\n factor: 0.1,\n minR: 0,\n maxR: 1,\n range: 1\n}\nconst defaultSlippage = {\n factor: 0.05,\n minR: 0,\n maxR: 0.3,\n range: 0.3,\n prec: 3\n}\nconst defaultDriftTolerance = {\n value: 0.002,\n minV: 0,\n maxV: 0.02,\n range: 0.02,\n prec: 5\n}\nconst defaultOrderPersistence = {\n value: 20,\n minV: 0,\n maxV: 40, // 10 minutes @ 15 second epochs\n range: 40,\n prec: 0\n}\nconst defaultProfit = {\n prec: 3,\n value: 0.01,\n minV: 0.001,\n maxV: 0.1,\n range: 0.1 - 0.001\n}\nconst defaultLevelSpacing = {\n prec: 3,\n value: 0.005,\n minV: 0.001,\n maxV: 0.02,\n range: 0.02 - 0.0001\n}\nconst defaultMatchBuffer = {\n value: 0,\n prec: 3,\n minV: 0,\n maxV: 1,\n range: 1\n}\nconst defaultLevelsPerSide = {\n prec: 0,\n inc: 1,\n value: 1,\n minV: 1\n}\nconst defaultLotsPerLevel = {\n prec: 0,\n value: 1,\n minV: 1,\n usdIncrement: 100\n}\nconst defaultUSDPerSide = {\n prec: 2\n}\n\nconst defaultMarketMakingConfig: ConfigState = {\n gapStrategy: GapStrategyPercentPlus,\n sellPlacements: [],\n buyPlacements: [],\n driftTolerance: defaultDriftTolerance.value,\n profit: 0.02,\n orderPersistence: defaultOrderPersistence.value,\n cexRebalance: true,\n simpleArbLots: 1\n} as any as ConfigState\n\nconst defaultBotAssetConfig: BotAssetConfig = {\n swapFeeN: defaultSwapReserves.n,\n orderReservesFactor: defaultOrderReserves.factor,\n slippageBufferFactor: defaultSlippage.factor,\n transferFactor: defaultTransfer.factor\n}\n\n// cexButton stores parts of a CEX selection button.\ninterface cexButton {\n name: string\n div: PageElement\n tmpl: Record<string, PageElement>\n}\n\n/*\n * ConfigState is an amalgamation of BotConfig, ArbMarketMakingCfg, and\n * BasicMarketMakingCfg. ConfigState tracks the global state of the options\n * presented on the page, with a single field for each option / control element.\n * ConfigState is necessary because there are duplicate fields in the various\n * config structs, and the placement types are not identical.\n */\ninterface ConfigState {\n gapStrategy: string\n profit: number\n driftTolerance: number\n orderPersistence: number // epochs\n cexRebalance: boolean\n disabled: boolean\n buyPlacements: OrderPlacement[]\n sellPlacements: OrderPlacement[]\n baseOptions: Record<string, string>\n quoteOptions: Record<string, string>\n baseConfig: BotAssetConfig\n quoteConfig: BotAssetConfig\n simpleArbLots: number\n}\n\ninterface BotSpecs {\n host: string\n baseID: number\n quoteID: number\n botType: string\n cexName?: string\n}\n\ninterface MarketRow {\n tr: PageElement\n tmpl: Record<string, PageElement>\n host: string\n name: string\n baseID: number\n quoteID: number\n arbs: string[]\n spot: Spot\n}\n\ninterface UIOpts {\n usingUSDPerSide?: boolean\n}\n\nexport default class MarketMakerSettingsPage extends BasePage {\n page: Record<string, PageElement>\n forms: Forms\n opts: UIOpts\n newWalletForm: NewWalletForm\n approveTokenForm: TokenApprovalForm\n walletAddrForm: DepositAddress\n cexConfigForm: CEXConfigurationForm\n currentMarket: string\n originalConfig: ConfigState\n updatedConfig: ConfigState\n creatingNewBot: boolean\n marketReport: MarketReport\n qcProfit: NumberInput\n qcProfitSlider: MiniSlider\n qcLevelSpacing: NumberInput\n qcLevelSpacingSlider: MiniSlider\n qcMatchBuffer: NumberInput\n qcMatchBufferSlider: MiniSlider\n qcLevelsPerSide: IncrementalInput\n qcLotsPerLevel: IncrementalInput\n qcUSDPerSide: IncrementalInput\n cexBaseBalance: ExchangeBalance\n cexQuoteBalance: ExchangeBalance\n specs: BotSpecs\n mktID: string\n formSpecs: BotSpecs\n formCexes: Record<string, cexButton>\n placementsCache: Record<string, [OrderPlacement[], OrderPlacement[]]>\n botTypeSelectors: PageElement[]\n marketRows: MarketRow[]\n lotsPerLevelIncrement: number\n placementsChart: PlacementsChart\n basePane: AssetPane\n quotePane: AssetPane\n driftTolerance: NumberInput\n driftToleranceSlider: MiniSlider\n orderPersistence: NumberInput\n orderPersistenceSlider: MiniSlider\n\n constructor (main: HTMLElement, specs: BotSpecs) {\n super()\n\n this.placementsCache = {}\n this.opts = {}\n\n const page = this.page = Doc.idDescendants(main)\n\n this.forms = new Forms(page.forms, {\n closed: () => {\n if (!this.specs?.host || !this.specs?.botType) app().loadPage('mm')\n }\n })\n\n this.placementsChart = new PlacementsChart(page.placementsChart)\n this.approveTokenForm = new TokenApprovalForm(page.approveTokenForm, () => { this.submitBotType() })\n this.walletAddrForm = new DepositAddress(page.walletAddrForm)\n this.cexConfigForm = new CEXConfigurationForm(page.cexConfigForm, (cexName: string) => this.cexConfigured(cexName))\n page.quotePane = page.basePane.cloneNode(true) as PageElement\n page.assetPaneBox.appendChild(page.quotePane)\n this.basePane = new AssetPane(this, page.basePane)\n this.quotePane = new AssetPane(this, page.quotePane)\n\n app().headerSpace.appendChild(page.mmTitle)\n\n setOptionTemplates(page)\n Doc.cleanTemplates(\n page.orderOptTmpl, page.booleanOptTmpl, page.rangeOptTmpl, page.placementRowTmpl,\n page.oracleTmpl, page.cexOptTmpl, page.arbBttnTmpl, page.marketRowTmpl, page.needRegTmpl\n )\n page.basePane.removeAttribute('id') // don't remove from layout\n\n Doc.bind(page.resetButton, 'click', () => { this.setOriginalValues() })\n Doc.bind(page.updateButton, 'click', () => { this.saveSettings() })\n Doc.bind(page.createButton, 'click', async () => { this.saveSettings() })\n Doc.bind(page.deleteBttn, 'click', () => { this.delete() })\n bindForm(page.botTypeForm, page.botTypeSubmit, () => { this.submitBotType() })\n Doc.bind(page.noMarketBttn, 'click', () => { this.showMarketSelectForm() })\n Doc.bind(page.botTypeHeader, 'click', () => { this.reshowBotTypeForm() })\n Doc.bind(page.botTypeChangeMarket, 'click', () => { this.showMarketSelectForm() })\n Doc.bind(page.marketHeader, 'click', () => { this.showMarketSelectForm() })\n Doc.bind(page.marketFilterInput, 'input', () => { this.sortMarketRows() })\n Doc.bind(page.cexRebalanceCheckbox, 'change', () => { this.autoRebalanceChanged() })\n Doc.bind(page.switchToAdvanced, 'click', () => { this.showAdvancedConfig() })\n Doc.bind(page.switchToQuickConfig, 'click', () => { this.switchToQuickConfig() })\n Doc.bind(page.qcMatchBuffer, 'change', () => { this.matchBufferChanged() })\n Doc.bind(page.switchToUSDPerSide, 'click', () => { this.changeSideCommitmentDialog() })\n Doc.bind(page.switchToLotsPerLevel, 'click', () => { this.changeSideCommitmentDialog() })\n // Gap Strategy\n Doc.bind(page.gapStrategySelect, 'change', () => {\n if (!page.gapStrategySelect.value) return\n const gapStrategy = page.gapStrategySelect.value\n this.clearPlacements(this.updatedConfig.gapStrategy)\n this.loadCachedPlacements(gapStrategy)\n this.updatedConfig.gapStrategy = gapStrategy\n this.setGapFactorLabels(gapStrategy)\n this.updateModifiedMarkers()\n })\n\n // Buy/Sell placements\n Doc.bind(page.addBuyPlacementBtn, 'click', () => {\n this.addPlacement(true, null)\n page.addBuyPlacementLots.value = ''\n page.addBuyPlacementGapFactor.value = ''\n this.updateModifiedMarkers()\n this.placementsChart.render()\n this.updateAllocations()\n })\n Doc.bind(page.addSellPlacementBtn, 'click', () => {\n this.addPlacement(false, null)\n page.addSellPlacementLots.value = ''\n page.addSellPlacementGapFactor.value = ''\n this.updateModifiedMarkers()\n this.placementsChart.render()\n this.updateAllocations()\n })\n\n this.driftTolerance = new NumberInput(page.driftToleranceInput, {\n prec: defaultDriftTolerance.prec - 2, // converting to percent for display\n sigFigs: true,\n min: 0,\n changed: (rawV: number) => {\n const { minV, range, prec } = defaultDriftTolerance\n const [v] = toFourSigFigs(rawV / 100, prec)\n this.driftToleranceSlider.setValue((v - minV) / range)\n this.updatedConfig.driftTolerance = v\n }\n })\n\n this.driftToleranceSlider = new MiniSlider(page.driftToleranceSlider, (r: number) => {\n const { minV, range, prec } = defaultDriftTolerance\n const [v] = toFourSigFigs(minV + r * range, prec)\n this.updatedConfig.driftTolerance = v\n this.driftTolerance.setValue(v * 100)\n })\n\n this.orderPersistence = new NumberInput(page.orderPersistence, {\n changed: (v: number) => {\n const { minV, range } = defaultOrderPersistence\n this.updatedConfig.orderPersistence = v\n this.orderPersistenceSlider.setValue((v - minV) / range)\n }\n })\n\n this.orderPersistenceSlider = new MiniSlider(page.orderPersistenceSlider, (r: number) => {\n const { minV, range, prec } = defaultOrderPersistence\n const rawV = minV + r * range\n const [v] = toPrecision(rawV, prec)\n this.updatedConfig.orderPersistence = v\n this.orderPersistence.setValue(v)\n })\n\n this.qcProfit = new NumberInput(page.qcProfit, {\n prec: defaultProfit.prec - 2, // converting to percent\n sigFigs: true,\n min: defaultProfit.minV * 100,\n changed: (vPct: number) => {\n const { minV, range } = defaultProfit\n const v = vPct / 100\n this.updatedConfig.profit = v\n page.profitInput.value = this.qcProfit.input.value\n this.qcProfitSlider.setValue((v - minV) / range)\n this.quickConfigUpdated()\n }\n })\n\n this.qcProfitSlider = new MiniSlider(page.qcProfitSlider, (r: number) => {\n const { minV, range, prec } = defaultProfit\n const [v] = toFourSigFigs((minV + r * range) * 100, prec)\n this.updatedConfig.profit = v / 100\n this.qcProfit.setValue(v)\n page.profitInput.value = this.qcProfit.input.value\n this.quickConfigUpdated()\n })\n\n this.qcLevelSpacing = new NumberInput(page.qcLevelSpacing, {\n prec: defaultLevelSpacing.prec - 2, // converting to percent\n sigFigs: true,\n min: defaultLevelSpacing.minV * 100,\n changed: (vPct: number) => {\n const { minV, range } = defaultLevelSpacing\n this.qcLevelSpacingSlider.setValue((vPct / 100 - minV) / range)\n this.quickConfigUpdated()\n }\n })\n\n this.qcLevelSpacingSlider = new MiniSlider(page.qcLevelSpacingSlider, (r: number) => {\n const { minV, range } = defaultLevelSpacing\n this.qcLevelSpacing.setValue(minV + r * range * 100)\n this.quickConfigUpdated()\n })\n\n this.qcMatchBuffer = new NumberInput(page.qcMatchBuffer, {\n prec: defaultMatchBuffer.prec - 2, // converting to percent\n sigFigs: true,\n min: defaultMatchBuffer.minV * 100,\n changed: (vPct: number) => {\n const { minV, range } = defaultMatchBuffer\n this.qcMatchBufferSlider.setValue((vPct / 100 - minV) / range)\n this.quickConfigUpdated()\n }\n })\n\n this.qcMatchBufferSlider = new MiniSlider(page.qcMatchBufferSlider, (r: number) => {\n const { minV, range } = defaultMatchBuffer\n this.qcMatchBuffer.setValue(minV + r * range * 100)\n this.quickConfigUpdated()\n })\n\n this.qcLevelsPerSide = new IncrementalInput(page.qcLevelsPerSide, {\n prec: defaultLevelsPerSide.prec,\n min: defaultLevelsPerSide.minV,\n inc: defaultLevelsPerSide.inc,\n changed: (v: number) => {\n this.qcUSDPerSide.setValue(this.lotSizeUSD() * v * this.qcLotsPerLevel.value())\n this.quickConfigUpdated()\n }\n })\n\n this.qcLotsPerLevel = new IncrementalInput(page.qcLotsPerLevel, {\n prec: defaultLotsPerLevel.prec,\n min: defaultLotsPerLevel.minV,\n inc: 1, // set showQuickConfig\n changed: (v: number) => {\n this.qcUSDPerSide.setValue(this.lotSizeUSD() * v * this.qcLevelsPerSide.value())\n page.qcUSDPerSideEcho.textContent = this.qcUSDPerSide.input.value as string\n this.quickConfigUpdated()\n },\n set: (v: number) => {\n const [, s] = toFourSigFigs(v * this.qcLevelsPerSide.value() * this.lotSizeUSD(), 2)\n page.qcUSDPerSideEcho.textContent = s\n page.qcLotsPerLevelEcho.textContent = s\n }\n })\n\n this.qcUSDPerSide = new IncrementalInput(page.qcUSDPerSide, {\n prec: defaultUSDPerSide.prec,\n min: 1, // changed by showQuickConfig\n inc: 1, // changed by showQuickConfig\n changed: (v: number) => {\n this.qcLotsPerLevel.setValue(v / this.qcLevelsPerSide.value() / this.lotSizeUSD())\n page.qcLotsPerLevelEcho.textContent = this.qcLotsPerLevel.input.value as string\n this.quickConfigUpdated()\n },\n set: (v: number, s: string) => {\n page.qcUSDPerSideEcho.textContent = s\n page.qcLotsPerLevelEcho.textContent = String(Math.round(v / this.lotSizeUSD()))\n }\n })\n\n const maybeSubmitBuyRow = (e: KeyboardEvent) => {\n if (e.key !== 'Enter') return\n if (\n !isNaN(parseFloat(page.addBuyPlacementGapFactor.value || '')) &&\n !isNaN(parseFloat(page.addBuyPlacementLots.value || ''))\n ) {\n page.addBuyPlacementBtn.click()\n }\n }\n Doc.bind(page.addBuyPlacementGapFactor, 'keyup', (e: KeyboardEvent) => { maybeSubmitBuyRow(e) })\n Doc.bind(page.addBuyPlacementLots, 'keyup', (e: KeyboardEvent) => { maybeSubmitBuyRow(e) })\n\n const maybeSubmitSellRow = (e: KeyboardEvent) => {\n if (e.key !== 'Enter') return\n if (\n !isNaN(parseFloat(page.addSellPlacementGapFactor.value || '')) &&\n !isNaN(parseFloat(page.addSellPlacementLots.value || ''))\n ) {\n page.addSellPlacementBtn.click()\n }\n }\n Doc.bind(page.addSellPlacementGapFactor, 'keyup', (e: KeyboardEvent) => { maybeSubmitSellRow(e) })\n Doc.bind(page.addSellPlacementLots, 'keyup', (e: KeyboardEvent) => { maybeSubmitSellRow(e) })\n\n Doc.bind(page.profitInput, 'change', () => {\n Doc.hide(page.profitInputErr)\n const showError = (errID: string) => {\n Doc.show(page.profitInputErr)\n page.profitInputErr.textContent = intl.prep(errID)\n }\n const profit = parseFloat(page.profitInput.value || '') / 100\n if (isNaN(profit)) return showError(intl.ID_INVALID_VALUE)\n if (profit === 0) return showError(intl.ID_NO_ZERO)\n this.updatedConfig.profit = profit\n this.updateModifiedMarkers()\n })\n\n this.botTypeSelectors = Doc.applySelector(page.botTypeForm, '[data-bot-type]')\n for (const div of this.botTypeSelectors) {\n Doc.bind(div, 'click', () => {\n if (div.classList.contains('disabled')) return\n Doc.hide(page.botTypeErr)\n page.cexSelection.classList.toggle('disabled', div.dataset.botType === botTypeBasicMM)\n this.setBotTypeSelected(div.dataset.botType as string)\n })\n }\n\n this.newWalletForm = new NewWalletForm(\n page.newWalletForm,\n async () => {\n await app().fetchUser()\n this.submitBotType()\n }\n )\n\n app().registerNoteFeeder({\n balance: (note: BalanceNote) => { this.handleBalanceNote(note) }\n })\n\n this.initialize(specs)\n }\n\n unload () {\n this.forms.exit()\n }\n\n async initialize (specs?: BotSpecs) {\n this.setupCEXes()\n this.initializeMarketRows()\n\n const isRefresh = specs && Object.keys(specs).length === 0\n if (isRefresh) specs = State.fetchLocal(specLK)\n if (!specs || !app().walletMap[specs.baseID] || !app().walletMap[specs.quoteID]) {\n this.showMarketSelectForm()\n return\n }\n\n // If we have specs specifying only a market, make sure the cex name and\n // bot type are set.\n if (specs && !specs.botType) {\n const botCfg = liveBotConfig(specs.host, specs.baseID, specs.quoteID)\n specs.cexName = botCfg?.cexName ?? ''\n specs.botType = botTypeBasicMM\n if (botCfg?.arbMarketMakingConfig) specs.botType = botTypeArbMM\n else if (botCfg?.simpleArbConfig) specs.botType = botTypeBasicArb\n }\n\n // Must be a reconfig.\n this.specs = specs\n await this.fetchCEXBalances(specs)\n this.configureUI()\n }\n\n async configureUI () {\n const { page, specs } = this\n const { host, baseID, quoteID, cexName, botType } = specs\n\n const [{ symbol: baseSymbol, token: baseToken }, { symbol: quoteSymbol, token: quoteToken }] = [app().assets[baseID], app().assets[quoteID]]\n this.mktID = `${baseSymbol}_${quoteSymbol}`\n Doc.hide(\n page.botSettingsContainer, page.marketBox, page.updateButton, page.resetButton,\n page.createButton, page.noMarket, page.missingFiatRates\n )\n\n if ([baseID, quoteID, baseToken?.parentID ?? baseID, quoteToken?.parentID ?? quoteID].some((assetID: number) => !app().fiatRatesMap[assetID])) {\n Doc.show(page.missingFiatRates)\n return\n }\n\n Doc.show(page.marketLoading)\n State.storeLocal(specLK, specs)\n\n const mmStatus = app().mmStatus\n const viewOnly = isViewOnly(specs, mmStatus)\n let botCfg = liveBotConfig(host, baseID, quoteID)\n if (botCfg) {\n const oldBotType = botCfg.arbMarketMakingConfig ? botTypeArbMM : botCfg.basicMarketMakingConfig ? botTypeBasicMM : botTypeBasicArb\n if (oldBotType !== botType) botCfg = undefined\n }\n Doc.setVis(botCfg, page.deleteBttnBox)\n\n const oldCfg = this.originalConfig = Object.assign({}, defaultMarketMakingConfig, {\n disabled: viewOnly,\n baseOptions: this.defaultWalletOptions(baseID),\n quoteOptions: this.defaultWalletOptions(quoteID),\n buyPlacements: [],\n sellPlacements: [],\n baseConfig: Object.assign({}, defaultBotAssetConfig),\n quoteConfig: Object.assign({}, defaultBotAssetConfig)\n }) as ConfigState\n\n if (botCfg) {\n const { basicMarketMakingConfig: mmCfg, arbMarketMakingConfig: arbMMCfg, simpleArbConfig: arbCfg, uiConfig: { cexRebalance } } = botCfg\n this.creatingNewBot = false\n // This is kinda sloppy, but we'll copy any relevant issues from the\n // old config into the originalConfig.\n const idx = oldCfg as { [k: string]: any } // typescript\n for (const [k, v] of Object.entries(botCfg)) if (idx[k] !== undefined) idx[k] = v\n\n oldCfg.baseConfig = Object.assign({}, defaultBotAssetConfig, botCfg.uiConfig.baseConfig)\n oldCfg.quoteConfig = Object.assign({}, defaultBotAssetConfig, botCfg.uiConfig.quoteConfig)\n oldCfg.baseOptions = botCfg.baseWalletOptions || {}\n oldCfg.quoteOptions = botCfg.quoteWalletOptions || {}\n oldCfg.cexRebalance = cexRebalance\n\n if (mmCfg) {\n oldCfg.buyPlacements = mmCfg.buyPlacements\n oldCfg.sellPlacements = mmCfg.sellPlacements\n oldCfg.driftTolerance = mmCfg.driftTolerance\n oldCfg.gapStrategy = mmCfg.gapStrategy\n } else if (arbMMCfg) {\n const { buyPlacements, sellPlacements } = arbMMCfg\n oldCfg.buyPlacements = Array.from(buyPlacements, (p: ArbMarketMakingPlacement) => { return { lots: p.lots, gapFactor: p.multiplier } })\n oldCfg.sellPlacements = Array.from(sellPlacements, (p: ArbMarketMakingPlacement) => { return { lots: p.lots, gapFactor: p.multiplier } })\n oldCfg.profit = arbMMCfg.profit\n oldCfg.driftTolerance = arbMMCfg.driftTolerance\n oldCfg.orderPersistence = arbMMCfg.orderPersistence\n } else if (arbCfg) {\n // TODO: expose maxActiveArbs\n oldCfg.profit = arbCfg.profitTrigger\n oldCfg.orderPersistence = arbCfg.numEpochsLeaveOpen\n oldCfg.simpleArbLots = botCfg.uiConfig.simpleArbLots ?? 1\n }\n Doc.setVis(!viewOnly, page.updateButton, page.resetButton)\n } else {\n this.creatingNewBot = true\n Doc.setVis(!viewOnly, page.createButton)\n }\n\n // Now that we've updated the originalConfig, we'll copy it.\n this.updatedConfig = JSON.parse(JSON.stringify(oldCfg))\n\n switch (botType) {\n case botTypeBasicMM:\n page.botTypeDisplay.textContent = intl.prep(intl.ID_BOTTYPE_BASIC_MM)\n break\n case botTypeArbMM:\n page.botTypeDisplay.textContent = intl.prep(intl.ID_BOTTYPE_ARB_MM)\n break\n case botTypeBasicArb:\n page.botTypeDisplay.textContent = intl.prep(intl.ID_BOTTYPE_SIMPLE_ARB)\n }\n\n setMarketElements(document.body, baseID, quoteID, host)\n Doc.setVis(botType !== botTypeBasicArb, page.driftToleranceBox, page.switchToAdvanced)\n Doc.setVis(Boolean(cexName), ...Doc.applySelector(document.body, '[data-cex-show]'))\n\n Doc.setVis(viewOnly, page.viewOnlyRunning)\n Doc.setVis(cexName, page.cexRebalanceSettings)\n if (cexName) setCexElements(document.body, cexName)\n\n await this.fetchMarketReport()\n\n const lotSizeUSD = this.lotSizeUSD()\n this.lotsPerLevelIncrement = Math.round(Math.max(1, defaultLotsPerLevel.usdIncrement / lotSizeUSD))\n this.qcLotsPerLevel.inc = this.lotsPerLevelIncrement\n this.qcUSDPerSide.inc = this.lotsPerLevelIncrement * lotSizeUSD\n this.qcUSDPerSide.min = lotSizeUSD\n\n this.basePane.setAsset(baseID, false)\n this.quotePane.setAsset(quoteID, true)\n const { marketReport: { baseFiatRate } } = this\n this.placementsChart.setMarket({ cexName: cexName as string, botType, baseFiatRate, dict: this.updatedConfig })\n\n // If this is a new bot, show the quick config form.\n const isQuickPlacements = !botCfg || this.isQuickPlacements(this.updatedConfig.buyPlacements, this.updatedConfig.sellPlacements)\n const gapStrategy = botCfg?.basicMarketMakingConfig?.gapStrategy ?? GapStrategyPercentPlus\n page.gapStrategySelect.value = gapStrategy\n if (botType === botTypeBasicArb || (isQuickPlacements && gapStrategy === GapStrategyPercentPlus)) this.showQuickConfig()\n else this.showAdvancedConfig()\n\n this.setOriginalValues()\n\n Doc.hide(page.marketLoading)\n Doc.show(page.botSettingsContainer, page.marketBox)\n }\n\n initializeMarketRows () {\n this.marketRows = []\n Doc.empty(this.page.marketSelect)\n for (const { host, markets, assets, auth: { effectiveTier, pendingStrength } } of Object.values(app().exchanges)) {\n if (effectiveTier + pendingStrength === 0) {\n const { needRegTmpl, needRegBox } = this.page\n const bttn = needRegTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(bttn)\n Doc.bind(bttn, 'click', () => { app().loadPage('register', { host, backTo: 'mmsettings' }) })\n tmpl.host.textContent = host\n needRegBox.appendChild(bttn)\n Doc.show(needRegBox)\n continue\n }\n for (const { name, baseid: baseID, quoteid: quoteID, spot, basesymbol: baseSymbol, quotesymbol: quoteSymbol } of Object.values(markets)) {\n if (!app().assets[baseID] || !app().assets[quoteID]) continue\n const tr = this.page.marketRowTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(tr)\n const mr = { tr, tmpl, host: host, name, baseID, quoteID, spot: spot, arbs: [] } as MarketRow\n this.marketRows.push(mr)\n this.page.marketSelect.appendChild(tr)\n tmpl.baseIcon.src = Doc.logoPath(baseSymbol)\n tmpl.quoteIcon.src = Doc.logoPath(quoteSymbol)\n tmpl.baseSymbol.appendChild(Doc.symbolize(assets[baseID], true))\n tmpl.quoteSymbol.appendChild(Doc.symbolize(assets[quoteID], true))\n tmpl.host.textContent = host\n const cexHasMarket = this.cexMarketSupportFilter(baseID, quoteID)\n for (const [cexName, dinfo] of Object.entries(CEXDisplayInfos)) {\n if (cexHasMarket(cexName)) {\n const img = this.page.arbBttnTmpl.cloneNode(true) as PageElement\n img.src = dinfo.logo\n tmpl.arbs.appendChild(img)\n mr.arbs.push(cexName)\n }\n }\n Doc.bind(tr, 'click', () => { this.showBotTypeForm(host, baseID, quoteID) })\n }\n }\n if (this.marketRows.length === 0) {\n const { marketSelectionTable, marketFilterBox, noMarkets } = this.page\n Doc.hide(marketSelectionTable, marketFilterBox)\n Doc.show(noMarkets)\n } else Doc.hide(this.page.noMarkets)\n const fiatRates = app().fiatRatesMap\n this.marketRows.sort((a: MarketRow, b: MarketRow) => {\n let [volA, volB] = [a.spot?.vol24 ?? 0, b.spot?.vol24 ?? 0]\n if (fiatRates[a.baseID] && fiatRates[b.baseID]) {\n volA *= fiatRates[a.baseID]\n volB *= fiatRates[b.baseID]\n }\n return volB - volA\n })\n }\n\n runningBotInventory (assetID: number) {\n return runningBotInventory(assetID)\n }\n\n adjustedBalances (baseWallet: WalletState, quoteWallet: WalletState) {\n const { cexBaseBalance, cexQuoteBalance } = this\n const [bInv, qInv] = [this.runningBotInventory(baseWallet.assetID), this.runningBotInventory(quoteWallet.assetID)]\n const [cexBaseAvail, cexQuoteAvail] = [(cexBaseBalance?.available || 0) - bInv.cex.total, (cexQuoteBalance?.available || 0) - qInv.cex.total]\n const [dexBaseAvail, dexQuoteAvail] = [baseWallet.balance.available - bInv.dex.total, quoteWallet.balance.available - qInv.dex.total]\n const baseAvail = dexBaseAvail + cexBaseAvail\n const quoteAvail = dexQuoteAvail + cexQuoteAvail\n return { baseAvail, quoteAvail, dexBaseAvail, dexQuoteAvail, cexBaseAvail, cexQuoteAvail }\n }\n\n lotSizeUSD () {\n const { specs: { host, baseID }, mktID, marketReport: { baseFiatRate } } = this\n const xc = app().exchanges[host]\n const market = xc.markets[mktID]\n const { lotsize: lotSize } = market\n const { unitInfo: ui } = app().assets[baseID]\n return lotSize / ui.conventional.conversionFactor * baseFiatRate\n }\n\n /*\n * marketStuff is just a bunch of useful properties for the current specs\n * gathered in one place and with preferable names.\n */\n marketStuff () {\n const {\n page, specs: { host, baseID, quoteID, cexName, botType }, basePane, quotePane,\n marketReport: { baseFiatRate, quoteFiatRate, baseFees, quoteFees },\n lotsPerLevelIncrement, updatedConfig: cfg, originalConfig: oldCfg, mktID\n } = this\n const { symbol: baseSymbol, unitInfo: bui } = app().assets[baseID]\n const { symbol: quoteSymbol, unitInfo: qui } = app().assets[quoteID]\n const xc = app().exchanges[host]\n const market = xc.markets[mktID]\n const { lotsize: lotSize, spot } = market\n const lotSizeUSD = lotSize / bui.conventional.conversionFactor * baseFiatRate\n const atomicRate = 1 / bui.conventional.conversionFactor * baseFiatRate / quoteFiatRate * qui.conventional.conversionFactor\n const xcRate = {\n conv: quoteFiatRate / baseFiatRate,\n atomic: atomicRate,\n msg: Math.round(atomicRate * OrderUtil.RateEncodingFactor), // unadjusted\n spot\n }\n\n let [dexBaseLots, dexQuoteLots] = [cfg.simpleArbLots, cfg.simpleArbLots]\n if (botType !== botTypeBasicArb) {\n dexBaseLots = this.updatedConfig.sellPlacements.reduce((lots: number, p: OrderPlacement) => lots + p.lots, 0)\n dexQuoteLots = this.updatedConfig.buyPlacements.reduce((lots: number, p: OrderPlacement) => lots + p.lots, 0)\n }\n const quoteLot = calculateQuoteLot(lotSize, baseID, quoteID, spot)\n const walletStuff = this.walletStuff()\n const { baseFeeAssetID, quoteFeeAssetID, baseIsAccountLocker, quoteIsAccountLocker } = walletStuff\n\n const { commit, fees } = feesAndCommit(\n baseID, quoteID, baseFees, quoteFees, lotSize, dexBaseLots, dexQuoteLots,\n baseFeeAssetID, quoteFeeAssetID, baseIsAccountLocker, quoteIsAccountLocker,\n cfg.baseConfig.orderReservesFactor, cfg.quoteConfig.orderReservesFactor\n )\n\n return {\n page, cfg, oldCfg, host, xc, baseID, quoteID, botType, cexName, baseFiatRate, quoteFiatRate,\n xcRate, baseSymbol, quoteSymbol, mktID, lotSize, lotSizeUSD, lotsPerLevelIncrement,\n quoteLot, commit, basePane, quotePane, fees, ...walletStuff\n }\n }\n\n walletStuff () {\n const { specs: { baseID, quoteID } } = this\n const [baseWallet, quoteWallet] = [app().walletMap[baseID], app().walletMap[quoteID]]\n const [{ token: baseToken, unitInfo: bui }, { token: quoteToken, unitInfo: qui }] = [app().assets[baseID], app().assets[quoteID]]\n const baseFeeAssetID = baseToken ? baseToken.parentID : baseID\n const quoteFeeAssetID = quoteToken ? quoteToken.parentID : quoteID\n const [baseFeeUI, quoteFeeUI] = [app().assets[baseFeeAssetID].unitInfo, app().assets[quoteFeeAssetID].unitInfo]\n const traitAccountLocker = 1 << 14\n const baseIsAccountLocker = (baseWallet.traits & traitAccountLocker) > 0\n const quoteIsAccountLocker = (quoteWallet.traits & traitAccountLocker) > 0\n return {\n baseWallet, quoteWallet, baseFeeUI, quoteFeeUI, baseToken, quoteToken,\n bui, qui, baseFeeAssetID, quoteFeeAssetID, baseIsAccountLocker, quoteIsAccountLocker,\n ...this.adjustedBalances(baseWallet, quoteWallet)\n }\n }\n\n showAdvancedConfig () {\n const { page } = this\n Doc.show(page.advancedConfig)\n Doc.hide(page.quickConfig)\n this.placementsChart.render()\n }\n\n isQuickPlacements (buyPlacements: OrderPlacement[], sellPlacements: OrderPlacement[]) {\n if (buyPlacements.length === 0 || buyPlacements.length !== sellPlacements.length) return false\n for (let i = 0; i < buyPlacements.length; i++) {\n if (buyPlacements[i].gapFactor !== sellPlacements[i].gapFactor) return false\n if (buyPlacements[i].lots !== sellPlacements[i].lots) return false\n }\n return true\n }\n\n switchToQuickConfig () {\n const { cfg, botType, lotSizeUSD } = this.marketStuff()\n const { buyPlacements: buys, sellPlacements: sells } = cfg\n // If we have both buys and sells, get the best approximation quick config\n // approximation.\n if (buys.length > 0 && sells.length > 0) {\n const bestBuy = buys.reduce((prev: OrderPlacement, curr: OrderPlacement) => curr.gapFactor < prev.gapFactor ? curr : prev)\n const bestSell = sells.reduce((prev: OrderPlacement, curr: OrderPlacement) => curr.gapFactor < prev.gapFactor ? curr : prev)\n const placementCount = buys.length + sells.length\n const levelsPerSide = Math.max(1, Math.floor((placementCount) / 2))\n if (botType === botTypeBasicMM) {\n cfg.profit = (bestBuy.gapFactor + bestSell.gapFactor) / 2\n const worstBuy = buys.reduce((prev: OrderPlacement, curr: OrderPlacement) => curr.gapFactor > prev.gapFactor ? curr : prev)\n const worstSell = sells.reduce((prev: OrderPlacement, curr: OrderPlacement) => curr.gapFactor > prev.gapFactor ? curr : prev)\n const range = ((worstBuy.gapFactor - bestBuy.gapFactor) + (worstSell.gapFactor - bestSell.gapFactor)) / 2\n const inc = range / (levelsPerSide - 1)\n this.qcProfit.setValue(cfg.profit * 100)\n this.qcProfitSlider.setValue((cfg.profit - defaultProfit.minV) / defaultProfit.range)\n this.qcLevelSpacing.setValue(inc * 100)\n this.qcLevelSpacingSlider.setValue((inc - defaultLevelSpacing.minV) / defaultLevelSpacing.range)\n } else if (botType === botTypeArbMM) {\n const multSum = buys.reduce((v: number, p: OrderPlacement) => v + p.gapFactor, 0) + sells.reduce((v: number, p: OrderPlacement) => v + p.gapFactor, 0)\n const buffer = ((multSum / placementCount) - 1) || defaultMatchBuffer.value\n this.qcMatchBuffer.setValue(buffer * 100)\n this.qcMatchBufferSlider.setValue((buffer - defaultMatchBuffer.minV) / defaultMatchBuffer.range)\n }\n const lots = buys.reduce((v: number, p: OrderPlacement) => v + p.lots, 0) + sells.reduce((v: number, p: OrderPlacement) => v + p.lots, 0)\n const lotsPerLevel = Math.max(1, Math.round(lots / 2 / levelsPerSide))\n this.qcLotsPerLevel.setValue(lotsPerLevel)\n this.qcUSDPerSide.setValue(lotsPerLevel * levelsPerSide * lotSizeUSD)\n this.qcLevelsPerSide.setValue(levelsPerSide)\n } else if (botType === botTypeBasicArb) {\n this.qcLotsPerLevel.setValue(cfg.simpleArbLots)\n }\n this.showQuickConfig()\n this.quickConfigUpdated()\n }\n\n showQuickConfig () {\n const { page, lotSizeUSD, botType, lotsPerLevelIncrement } = this.marketStuff()\n\n if (!this.qcLevelsPerSide.input.value) {\n this.qcLevelsPerSide.setValue(defaultLevelsPerSide.value)\n this.qcUSDPerSide.setValue(defaultLevelsPerSide.value * (this.qcLotsPerLevel.value() || lotsPerLevelIncrement) * lotSizeUSD)\n }\n if (!this.qcLotsPerLevel.input.value) {\n this.qcLotsPerLevel.setValue(lotsPerLevelIncrement)\n this.qcUSDPerSide.setValue(lotSizeUSD * lotsPerLevelIncrement * this.qcLevelsPerSide.value())\n }\n if (!page.qcLevelSpacing.value) {\n this.qcLevelSpacing.setValue(defaultLevelSpacing.value * 100)\n this.qcLevelSpacingSlider.setValue((defaultLevelSpacing.value - defaultLevelSpacing.minV) / defaultLevelSpacing.range)\n }\n if (!page.qcMatchBuffer.value) page.qcMatchBuffer.value = String(defaultMatchBuffer.value * 100)\n\n Doc.hide(page.advancedConfig)\n Doc.show(page.quickConfig)\n\n this.showInputsForBot(botType)\n }\n\n showInputsForBot (botType: string) {\n const { page, opts: { usingUSDPerSide } } = this\n Doc.hide(\n page.matchMultiplierBox, page.placementsChartBox, page.placementChartLegend,\n page.lotsPerLevelLabel, page.levelSpacingBox, page.arbLotsLabel, page.qcLevelPerSideBox\n )\n Doc.setVis(usingUSDPerSide, page.qcUSDPerSideBox)\n Doc.setVis(!usingUSDPerSide, page.qcLotsBox)\n switch (botType) {\n case botTypeArbMM:\n Doc.show(\n page.qcLevelPerSideBox, page.matchMultiplierBox, page.placementsChartBox,\n page.placementChartLegend, page.lotsPerLevelLabel\n )\n break\n case botTypeBasicMM:\n Doc.show(\n page.qcLevelPerSideBox, page.levelSpacingBox, page.placementsChartBox,\n page.lotsPerLevelLabel\n )\n break\n case botTypeBasicArb:\n Doc.show(page.arbLotsLabel)\n }\n }\n\n quickConfigUpdated () {\n const { page, cfg, botType, cexName } = this.marketStuff()\n\n Doc.hide(page.qcError)\n const setError = (msg: string) => {\n page.qcError.textContent = msg\n Doc.show(page.qcError)\n }\n\n const levelsPerSide = botType === botTypeBasicArb ? 1 : this.qcLevelsPerSide.value()\n if (isNaN(levelsPerSide)) {\n setError('invalid value for levels per side')\n }\n\n const lotsPerLevel = this.qcLotsPerLevel.value()\n if (isNaN(lotsPerLevel)) {\n setError('invalid value for lots per level')\n }\n\n const profit = parseFloat(page.qcProfit.value ?? '') / 100\n if (isNaN(profit)) {\n setError('invalid value for profit')\n }\n\n const levelSpacing = botType === botTypeBasicMM ? parseFloat(page.qcLevelSpacing.value ?? '') / 100 : 0\n if (isNaN(levelSpacing)) {\n setError('invalid value for level spacing')\n }\n\n const matchBuffer = botType === botTypeArbMM ? parseFloat(page.qcMatchBuffer.value ?? '') / 100 : 0\n if (isNaN(matchBuffer)) {\n setError('invalid value for match buffer')\n }\n const multiplier = matchBuffer + 1\n\n const levelSpacingDisabled = levelsPerSide === 1\n page.levelSpacingBox.classList.toggle('disabled', levelSpacingDisabled)\n page.qcLevelSpacing.disabled = levelSpacingDisabled\n cfg.simpleArbLots = lotsPerLevel\n\n if (botType !== botTypeBasicArb) {\n this.clearPlacements(cexName ? arbMMRowCacheKey : cfg.gapStrategy)\n for (let levelN = 0; levelN < levelsPerSide; levelN++) {\n const placement = { lots: lotsPerLevel } as OrderPlacement\n placement.gapFactor = botType === botTypeBasicMM ? profit + levelSpacing * levelN : multiplier\n cfg.buyPlacements.push(placement)\n cfg.sellPlacements.push(placement)\n // Add rows in the advanced config table.\n this.addPlacement(true, placement)\n this.addPlacement(false, placement)\n }\n\n this.placementsChart.render()\n }\n\n this.updateAllocations()\n }\n\n updateAllocations () {\n this.updateBaseAllocations()\n this.updateQuoteAllocations()\n }\n\n updateBaseAllocations () {\n const { commit, lotSize, basePane, fees } = this.marketStuff()\n\n basePane.updateInventory(commit.dex.base.lots, commit.dex.quote.lots, lotSize, commit.dex.base.val, commit.cex.base.val, fees.base)\n basePane.updateCommitTotal()\n }\n\n updateQuoteAllocations () {\n const { commit, quoteLot: lotSize, quotePane, fees } = this.marketStuff()\n\n quotePane.updateInventory(commit.dex.quote.lots, commit.dex.base.lots, lotSize, commit.dex.quote.val, commit.cex.quote.val, fees.quote)\n quotePane.updateCommitTotal()\n }\n\n matchBufferChanged () {\n const { page } = this\n page.qcMatchBuffer.value = Math.max(0, parseFloat(page.qcMatchBuffer.value ?? '') || defaultMatchBuffer.value * 100).toFixed(2)\n this.quickConfigUpdated()\n }\n\n showAddress (assetID: number) {\n this.walletAddrForm.setAsset(assetID)\n this.forms.show(this.page.walletAddrForm)\n }\n\n changeSideCommitmentDialog () {\n const { page, opts } = this\n opts.usingUSDPerSide = !opts.usingUSDPerSide\n Doc.setVis(opts.usingUSDPerSide, page.qcUSDPerSideBox)\n Doc.setVis(!opts.usingUSDPerSide, page.qcLotsBox)\n }\n\n async showBotTypeForm (host: string, baseID: number, quoteID: number, botType?: string, configuredCEX?: string) {\n const { page } = this\n this.formSpecs = { host, baseID, quoteID, botType: '' }\n const viewOnly = isViewOnly(this.formSpecs, app().mmStatus)\n if (viewOnly) {\n const botCfg = liveBotConfig(host, baseID, quoteID)\n const specs = this.specs = this.formSpecs\n switch (true) {\n case Boolean(botCfg?.simpleArbConfig):\n specs.botType = botTypeBasicArb\n break\n case Boolean(botCfg?.arbMarketMakingConfig):\n specs.botType = botTypeArbMM\n break\n default:\n specs.botType = botTypeBasicMM\n }\n specs.cexName = botCfg?.cexName\n await this.fetchCEXBalances(this.formSpecs)\n await this.configureUI()\n this.forms.close()\n return\n }\n setMarketElements(page.botTypeForm, baseID, quoteID, host)\n Doc.empty(page.botTypeBaseSymbol, page.botTypeQuoteSymbol)\n const [b, q] = [app().assets[baseID], app().assets[quoteID]]\n page.botTypeBaseSymbol.appendChild(Doc.symbolize(b, true))\n page.botTypeQuoteSymbol.appendChild(Doc.symbolize(q, true))\n for (const div of this.botTypeSelectors) div.classList.remove('selected')\n for (const { div } of Object.values(this.formCexes)) div.classList.remove('selected')\n this.setCEXAvailability(baseID, quoteID)\n Doc.hide(page.noCexesConfigured, page.noCexMarket, page.noCexMarketConfigureMore, page.botTypeErr)\n const cexHasMarket = this.cexMarketSupportFilter(baseID, quoteID)\n const supportingCexes: Record<string, CEXConfig> = {}\n for (const cex of Object.values(app().mmStatus.cexes)) {\n if (cexHasMarket(cex.config.name)) supportingCexes[cex.config.name] = cex.config\n }\n const nCexes = Object.keys(supportingCexes).length\n const arbEnabled = nCexes > 0\n for (const div of this.botTypeSelectors) div.classList.toggle('disabled', div.dataset.botType !== botTypeBasicMM && !arbEnabled)\n if (Object.keys(app().mmStatus.cexes).length === 0) {\n Doc.show(page.noCexesConfigured)\n this.setBotTypeSelected(botTypeBasicMM)\n } else {\n const lastBots = (State.fetchLocal(lastBotsLK) || {}) as Record<string, BotSpecs>\n const lastBot = lastBots[`${baseID}_${quoteID}_${host}`]\n let cex: CEXConfig | undefined\n botType = botType ?? (lastBot ? lastBot.botType : botTypeArbMM)\n if (botType !== botTypeBasicMM) {\n // Four ways to auto-select a cex.\n // 1. Coming back from the cex configuration form.\n if (configuredCEX) cex = supportingCexes[configuredCEX]\n // 2. We have a saved configuration.\n if (!cex && lastBot) cex = supportingCexes[lastBot.cexName ?? '']\n // 3. The last exchange that the user selected.\n if (!cex) {\n const lastCEX = State.fetchLocal(lastArbExchangeLK)\n if (lastCEX) cex = supportingCexes[lastCEX]\n }\n // 4. Any supporting cex.\n if (!cex && nCexes > 0) cex = Object.values(supportingCexes)[0]\n }\n if (cex) {\n page.cexSelection.classList.remove('disabled')\n this.setBotTypeSelected(botType ?? (lastBot ? lastBot.botType : botTypeArbMM))\n this.selectFormCEX(cex.name)\n } else {\n page.cexSelection.classList.add('disabled')\n Doc.show(page.noCexMarket)\n this.setBotTypeSelected(botTypeBasicMM)\n // If there are unconfigured cexes, show configureMore message.\n const unconfigured = Object.keys(CEXDisplayInfos).filter((cexName: string) => !app().mmStatus.cexes[cexName])\n const allConfigured = unconfigured.length === 0 || (unconfigured.length === 1 && (unconfigured[0] === 'Binance' || unconfigured[0] === 'BinanceUS'))\n if (!allConfigured) Doc.show(page.noCexMarketConfigureMore)\n }\n }\n\n Doc.show(page.cexSelection)\n // Check if we have any cexes configured.\n this.forms.show(page.botTypeForm)\n }\n\n reshowBotTypeForm () {\n if (isViewOnly(this.specs, app().mmStatus)) this.showMarketSelectForm()\n const { baseID, quoteID, host, cexName, botType } = this.specs\n this.showBotTypeForm(host, baseID, quoteID, botType, cexName)\n }\n\n setBotTypeSelected (selectedType: string) {\n const { formSpecs: { baseID, quoteID, host }, botTypeSelectors, formCexes } = this\n for (const { classList, dataset: { botType } } of botTypeSelectors) classList.toggle('selected', botType === selectedType)\n // If we don't have a cex selected, attempt to select one\n if (selectedType === botTypeBasicMM) return\n const mmStatus = app().mmStatus\n if (Object.keys(mmStatus.cexes).length === 0) return\n const cexHasMarket = this.cexMarketSupportFilter(baseID, quoteID)\n // If there is one currently selected and it supports this market, leave it.\n const selecteds = Object.values(formCexes).filter((cex: cexButton) => cex.div.classList.contains('selected'))\n if (selecteds.length && cexHasMarket(selecteds[0].name)) return\n // See if we have a saved configuration.\n const lastBots = (State.fetchLocal(lastBotsLK) || {}) as Record<string, BotSpecs>\n const lastBot = lastBots[`${baseID}_${quoteID}_${host}`]\n if (lastBot) {\n const cex = mmStatus.cexes[lastBot.cexName ?? '']\n if (cex && cexHasMarket(cex.config.name)) {\n this.selectFormCEX(cex.config.name)\n return\n }\n }\n // 2. The last exchange that the user selected.\n const lastCEX = State.fetchLocal(lastArbExchangeLK)\n if (lastCEX) {\n const cex = mmStatus.cexes[lastCEX]\n if (cex && cexHasMarket(cex.config.name)) {\n this.selectFormCEX(cex.config.name)\n return\n }\n }\n // 3. Any supporting cex.\n const cexes = Object.values(mmStatus.cexes).filter((cex: MMCEXStatus) => cexHasMarket(cex.config.name))\n if (cexes.length) this.selectFormCEX(cexes[0].config.name)\n }\n\n showMarketSelectForm () {\n this.page.marketFilterInput.value = ''\n this.sortMarketRows()\n this.forms.show(this.page.marketSelectForm)\n }\n\n sortMarketRows () {\n const page = this.page\n const filter = page.marketFilterInput.value?.toLowerCase()\n Doc.empty(page.marketSelect)\n for (const mr of this.marketRows) {\n mr.tr.classList.remove('selected')\n if (filter && !mr.name.includes(filter)) continue\n page.marketSelect.appendChild(mr.tr)\n }\n }\n\n handleBalanceNote (n: BalanceNote) {\n this.approveTokenForm.handleBalanceNote(n)\n if (!this.marketReport) return\n const { baseID, quoteID, quoteToken, baseToken } = this.marketStuff()\n if (n.assetID === baseID || n.assetID === baseToken?.parentID) {\n this.basePane.updateBalances()\n } else if (n.assetID === quoteID || n.assetID === quoteToken?.parentID) {\n this.quotePane.updateBalances()\n }\n }\n\n autoRebalanceChanged () {\n const { page, updatedConfig: cfg } = this\n cfg.cexRebalance = page.cexRebalanceCheckbox?.checked ?? false\n this.updateAllocations()\n }\n\n async submitBotType () {\n const loaded = app().loading(this.page.botTypeForm)\n try {\n await this.submitBotWithValidation()\n } finally {\n loaded()\n }\n }\n\n async submitBotWithValidation () {\n // check for wallets\n const { page, forms, formSpecs: { baseID, quoteID, host } } = this\n\n if (!app().walletMap[baseID]) {\n this.newWalletForm.setAsset(baseID)\n forms.show(this.page.newWalletForm)\n return\n }\n if (!app().walletMap[quoteID]) {\n this.newWalletForm.setAsset(quoteID)\n forms.show(this.page.newWalletForm)\n return\n }\n // Are tokens approved?\n const [bApproval, qApproval] = tokenAssetApprovalStatuses(host, app().assets[baseID], app().assets[quoteID])\n if (bApproval === ApprovalStatus.NotApproved) {\n this.approveTokenForm.setAsset(baseID, host)\n forms.show(page.approveTokenForm)\n return\n }\n if (qApproval === ApprovalStatus.NotApproved) {\n this.approveTokenForm.setAsset(quoteID, host)\n forms.show(page.approveTokenForm)\n return\n }\n\n const { botTypeSelectors } = this\n const selecteds = botTypeSelectors.filter((div: PageElement) => div.classList.contains('selected'))\n if (selecteds.length < 1) {\n page.botTypeErr.textContent = intl.prep(intl.ID_NO_BOTTYPE)\n Doc.show(page.botTypeErr)\n return\n }\n const botType = this.formSpecs.botType = selecteds[0].dataset.botType ?? ''\n if (botType !== botTypeBasicMM) {\n const selecteds = Object.values(this.formCexes).filter((cex: cexButton) => cex.div.classList.contains('selected'))\n if (selecteds.length < 1) {\n page.botTypeErr.textContent = intl.prep(intl.ID_NO_CEX)\n Doc.show(page.botTypeErr)\n return\n }\n const cexName = selecteds[0].name\n this.formSpecs.cexName = cexName\n await this.fetchCEXBalances(this.formSpecs)\n }\n\n this.specs = this.formSpecs\n\n this.configureUI()\n this.forms.close()\n }\n\n async fetchCEXBalances (specs: BotSpecs) {\n const { page } = this\n const { baseID, quoteID, cexName, botType } = specs\n if (botType === botTypeBasicMM || !cexName) return\n\n try {\n // This won't work if we implement live reconfiguration, because locked\n // funds would need to be considered.\n this.cexBaseBalance = await MM.cexBalance(cexName, baseID)\n } catch (e) {\n page.botTypeErr.textContent = intl.prep(intl.ID_CEXBALANCE_ERR, { cexName, assetID: String(baseID), err: String(e) })\n Doc.show(page.botTypeErr)\n throw e\n }\n\n try {\n this.cexQuoteBalance = await MM.cexBalance(cexName, quoteID)\n } catch (e) {\n page.botTypeErr.textContent = intl.prep(intl.ID_CEXBALANCE_ERR, { cexName, assetID: String(quoteID), err: String(e) })\n Doc.show(page.botTypeErr)\n throw e\n }\n }\n\n defaultWalletOptions (assetID: number): Record<string, string> {\n const walletDef = app().currentWalletDefinition(assetID)\n if (!walletDef.multifundingopts) {\n return {}\n }\n const options: Record<string, string> = {}\n for (const opt of walletDef.multifundingopts) {\n if (opt.quoteAssetOnly && assetID !== this.specs.quoteID) {\n continue\n }\n options[opt.key] = `${opt.default}`\n }\n return options\n }\n\n /*\n * updateModifiedMarkers checks each of the input elements on the page and\n * if the current value does not match the original value (since the last\n * save), then the input will have a colored border.\n */\n updateModifiedMarkers () {\n if (this.creatingNewBot) return\n const { page, originalConfig: oldCfg, updatedConfig: newCfg } = this\n\n // Gap strategy input\n const gapStrategyModified = oldCfg.gapStrategy !== newCfg.gapStrategy\n page.gapStrategySelect.classList.toggle('modified', gapStrategyModified)\n\n const profitModified = oldCfg.profit !== newCfg.profit\n page.profitInput.classList.toggle('modified', profitModified)\n\n // Buy placements Input\n let buyPlacementsModified = false\n if (oldCfg.buyPlacements.length !== newCfg.buyPlacements.length) {\n buyPlacementsModified = true\n } else {\n for (let i = 0; i < oldCfg.buyPlacements.length; i++) {\n if (oldCfg.buyPlacements[i].lots !== newCfg.buyPlacements[i].lots ||\n oldCfg.buyPlacements[i].gapFactor !== newCfg.buyPlacements[i].gapFactor) {\n buyPlacementsModified = true\n break\n }\n }\n }\n page.buyPlacementsTableWrapper.classList.toggle('modified', buyPlacementsModified)\n\n // Sell placements input\n let sellPlacementsModified = false\n if (oldCfg.sellPlacements.length !== newCfg.sellPlacements.length) {\n sellPlacementsModified = true\n } else {\n for (let i = 0; i < oldCfg.sellPlacements.length; i++) {\n if (oldCfg.sellPlacements[i].lots !== newCfg.sellPlacements[i].lots ||\n oldCfg.sellPlacements[i].gapFactor !== newCfg.sellPlacements[i].gapFactor) {\n sellPlacementsModified = true\n break\n }\n }\n }\n page.sellPlacementsTableWrapper.classList.toggle('modified', sellPlacementsModified)\n }\n\n /*\n * gapFactorHeaderUnit returns the header on the placements table and the\n * units in the gap factor rows needed for each gap strategy.\n */\n gapFactorHeaderUnit (gapStrategy: string): [string, string] {\n switch (gapStrategy) {\n case GapStrategyMultiplier:\n return ['Multiplier', 'x']\n case GapStrategyAbsolute:\n case GapStrategyAbsolutePlus: {\n const rateUnit = `${app().assets[this.specs.quoteID].symbol}/${app().assets[this.specs.baseID].symbol}`\n return ['Rate', rateUnit]\n }\n case GapStrategyPercent:\n case GapStrategyPercentPlus:\n return ['Percent', '%']\n default:\n throw new Error(`Unknown gap strategy ${gapStrategy}`)\n }\n }\n\n /*\n * checkGapFactorRange returns an error string if the value input for a\n * gap factor is valid for the currently selected gap strategy.\n */\n checkGapFactorRange (gapFactor: string, value: number): (string | null) {\n switch (gapFactor) {\n case GapStrategyMultiplier:\n if (value < 1 || value > 100) {\n return 'Multiplier must be between 1 and 100'\n }\n return null\n case GapStrategyAbsolute:\n case GapStrategyAbsolutePlus:\n if (value <= 0) {\n return 'Rate must be greater than 0'\n }\n return null\n case GapStrategyPercent:\n case GapStrategyPercentPlus:\n if (value <= 0 || value > 10) {\n return 'Percent must be between 0 and 10'\n }\n return null\n default: {\n throw new Error(`Unknown gap factor ${gapFactor}`)\n }\n }\n }\n\n /*\n * convertGapFactor converts between the displayed gap factor in the\n * placement tables and the number that is passed to the market maker.\n * For gap strategies that involve a percentage it converts between the\n * decimal value required by the backend and a percentage displayed to\n * the user.\n */\n convertGapFactor (gapFactor: number, gapStrategy: string, toDisplay: boolean): number {\n switch (gapStrategy) {\n case GapStrategyMultiplier:\n case GapStrategyAbsolute:\n case GapStrategyAbsolutePlus:\n return gapFactor\n case GapStrategyPercent:\n case GapStrategyPercentPlus:\n if (toDisplay) {\n return gapFactor * 100\n }\n return gapFactor / 100\n default:\n throw new Error(`Unknown gap factor ${gapStrategy}`)\n }\n }\n\n /*\n * addPlacement adds a row to a placement table. This is called both when\n * the page is initially loaded, and when the \"add\" button is pressed on\n * the placement table. initialLoadPlacement is non-nil if this is being\n * called on the initial load.\n */\n addPlacement (isBuy: boolean, initialLoadPlacement: OrderPlacement | null, gapStrategy?: string) {\n const { page, updatedConfig: cfg } = this\n\n let tableBody: PageElement = page.sellPlacementsTableBody\n let addPlacementRow: PageElement = page.addSellPlacementRow\n let lotsElement: PageElement = page.addSellPlacementLots\n let gapFactorElement: PageElement = page.addSellPlacementGapFactor\n let errElement: PageElement = page.sellPlacementsErr\n if (isBuy) {\n tableBody = page.buyPlacementsTableBody\n addPlacementRow = page.addBuyPlacementRow\n lotsElement = page.addBuyPlacementLots\n gapFactorElement = page.addBuyPlacementGapFactor\n errElement = page.buyPlacementsErr\n }\n\n Doc.hide(errElement)\n\n // updateArrowVis updates the visibility of the move up/down arrows in\n // each row of the placement table. The up arrow is not shown on the\n // top row, and the down arrow is not shown on the bottom row. They\n // are all hidden if market making is running.\n const updateArrowVis = () => {\n for (let i = 0; i < tableBody.children.length - 1; i++) {\n const row = Doc.parseTemplate(tableBody.children[i] as HTMLElement)\n Doc.setVis(i !== 0, row.upBtn)\n Doc.setVis(i !== tableBody.children.length - 2, row.downBtn)\n }\n }\n\n Doc.hide(errElement)\n const setErr = (err: string) => {\n errElement.textContent = err\n Doc.show(errElement)\n }\n\n let lots: number\n let actualGapFactor: number\n let displayedGapFactor: number\n if (!gapStrategy) gapStrategy = this.specs.cexName ? GapStrategyMultiplier : cfg.gapStrategy\n const placements = isBuy ? cfg.buyPlacements : cfg.sellPlacements\n const unit = this.gapFactorHeaderUnit(gapStrategy)[1]\n if (initialLoadPlacement) {\n lots = initialLoadPlacement.lots\n actualGapFactor = initialLoadPlacement.gapFactor\n displayedGapFactor = this.convertGapFactor(actualGapFactor, gapStrategy, true)\n } else {\n lots = parseInt(lotsElement.value || '0')\n displayedGapFactor = parseFloat(gapFactorElement.value || '0')\n actualGapFactor = this.convertGapFactor(displayedGapFactor, gapStrategy, false)\n if (lots === 0) {\n setErr('Lots must be greater than 0')\n return\n }\n\n const gapFactorErr = this.checkGapFactorRange(gapStrategy, displayedGapFactor)\n if (gapFactorErr) {\n setErr(gapFactorErr)\n return\n }\n\n if (placements.find((placement) => placement.gapFactor === actualGapFactor)\n ) {\n setErr('Duplicate placement')\n return\n }\n\n placements.push({ lots, gapFactor: actualGapFactor })\n }\n\n const newRow = page.placementRowTmpl.cloneNode(true) as PageElement\n const newRowTmpl = Doc.parseTemplate(newRow)\n newRowTmpl.priority.textContent = `${tableBody.children.length}`\n newRowTmpl.lots.textContent = `${lots}`\n newRowTmpl.gapFactor.textContent = `${displayedGapFactor} ${unit}`\n Doc.bind(newRowTmpl.removeBtn, 'click', () => {\n const index = placements.findIndex((placement) => {\n return placement.lots === lots && placement.gapFactor === actualGapFactor\n })\n if (index === -1) return\n placements.splice(index, 1)\n newRow.remove()\n updateArrowVis()\n this.updateModifiedMarkers()\n this.placementsChart.render()\n this.updateAllocations()\n })\n\n Doc.bind(newRowTmpl.upBtn, 'click', () => {\n const index = placements.findIndex((p: OrderPlacement) => p.lots === lots && p.gapFactor === actualGapFactor)\n if (index === 0) return\n const prevPlacement = placements[index - 1]\n placements[index - 1] = placements[index]\n placements[index] = prevPlacement\n newRowTmpl.priority.textContent = `${index}`\n newRow.remove()\n tableBody.insertBefore(newRow, tableBody.children[index - 1])\n const movedDownTmpl = Doc.parseTemplate(\n tableBody.children[index] as HTMLElement\n )\n movedDownTmpl.priority.textContent = `${index + 1}`\n updateArrowVis()\n this.updateModifiedMarkers()\n })\n\n Doc.bind(newRowTmpl.downBtn, 'click', () => {\n const index = placements.findIndex((p) => p.lots === lots && p.gapFactor === actualGapFactor)\n if (index === placements.length - 1) return\n const nextPlacement = placements[index + 1]\n placements[index + 1] = placements[index]\n placements[index] = nextPlacement\n newRowTmpl.priority.textContent = `${index + 2}`\n newRow.remove()\n tableBody.insertBefore(newRow, tableBody.children[index + 1])\n const movedUpTmpl = Doc.parseTemplate(\n tableBody.children[index] as HTMLElement\n )\n movedUpTmpl.priority.textContent = `${index + 1}`\n updateArrowVis()\n this.updateModifiedMarkers()\n })\n\n tableBody.insertBefore(newRow, addPlacementRow)\n updateArrowVis()\n }\n\n setArbMMLabels () {\n this.page.buyGapFactorHdr.textContent = intl.prep(intl.ID_MATCH_BUFFER)\n this.page.sellGapFactorHdr.textContent = intl.prep(intl.ID_MATCH_BUFFER)\n }\n\n /*\n * setGapFactorLabels sets the headers on the gap factor column of each\n * placement table.\n */\n setGapFactorLabels (gapStrategy: string) {\n const page = this.page\n const header = this.gapFactorHeaderUnit(gapStrategy)[0]\n page.buyGapFactorHdr.textContent = header\n page.sellGapFactorHdr.textContent = header\n Doc.hide(page.percentPlusInfo, page.percentInfo, page.absolutePlusInfo, page.absoluteInfo, page.multiplierInfo)\n switch (gapStrategy) {\n case 'percent-plus':\n return Doc.show(page.percentPlusInfo)\n case 'percent':\n return Doc.show(page.percentInfo)\n case 'absolute-plus':\n return Doc.show(page.absolutePlusInfo)\n case 'absolute':\n return Doc.show(page.absoluteInfo)\n case 'multiplier':\n return Doc.show(page.multiplierInfo)\n }\n }\n\n clearPlacements (cacheKey: string) {\n const { page, updatedConfig: cfg } = this\n while (page.buyPlacementsTableBody.children.length > 1) {\n page.buyPlacementsTableBody.children[0].remove()\n }\n while (page.sellPlacementsTableBody.children.length > 1) {\n page.sellPlacementsTableBody.children[0].remove()\n }\n this.placementsCache[cacheKey] = [cfg.buyPlacements, cfg.sellPlacements]\n cfg.buyPlacements.splice(0, cfg.buyPlacements.length)\n cfg.sellPlacements.splice(0, cfg.sellPlacements.length)\n }\n\n loadCachedPlacements (cacheKey: string) {\n const c = this.placementsCache[cacheKey]\n if (!c) return\n const { updatedConfig: cfg } = this\n cfg.buyPlacements.splice(0, cfg.buyPlacements.length)\n cfg.sellPlacements.splice(0, cfg.sellPlacements.length)\n cfg.buyPlacements.push(...c[0])\n cfg.sellPlacements.push(...c[1])\n const gapStrategy = cacheKey === arbMMRowCacheKey ? GapStrategyMultiplier : cacheKey\n for (const p of cfg.buyPlacements) this.addPlacement(true, p, gapStrategy)\n for (const p of cfg.sellPlacements) this.addPlacement(false, p, gapStrategy)\n }\n\n /*\n * setOriginalValues sets the updatedConfig field to be equal to the\n * and sets the values displayed buy each field input to be equal\n * to the values since the last save.\n */\n setOriginalValues () {\n const {\n page, originalConfig: oldCfg, updatedConfig: cfg, specs: { cexName, botType }\n } = this\n\n this.clearPlacements(cexName ? arbMMRowCacheKey : cfg.gapStrategy)\n\n const assign = (to: any, from: any) => { // not recursive\n for (const [k, v] of Object.entries(from)) {\n if (Array.isArray(v)) {\n to[k].splice(0, to[k].length)\n for (const i of v) to[k].push(i)\n } else if (typeof v === 'object') Object.assign(to[k], v)\n else to[k] = from[k]\n }\n }\n assign(cfg, JSON.parse(JSON.stringify(oldCfg)))\n\n const tol = cfg.driftTolerance ?? defaultDriftTolerance.value\n this.driftTolerance.setValue(tol * 100)\n this.driftToleranceSlider.setValue(tol / defaultDriftTolerance.maxV)\n\n const persist = cfg.orderPersistence ?? defaultOrderPersistence.value\n this.orderPersistence.setValue(persist)\n this.orderPersistenceSlider.setValue(persist / defaultOrderPersistence.maxV)\n\n const profit = cfg.profit ?? defaultProfit.value\n page.profitInput.value = String(profit * 100)\n this.qcProfit.setValue(profit * 100)\n this.qcProfitSlider.setValue((profit - defaultProfit.minV) / defaultProfit.range)\n\n if (cexName) {\n page.cexRebalanceCheckbox.checked = cfg.cexRebalance\n this.autoRebalanceChanged()\n }\n\n // Gap strategy\n if (!page.gapStrategySelect.options) return\n Array.from(page.gapStrategySelect.options).forEach((opt: HTMLOptionElement) => { opt.selected = opt.value === cfg.gapStrategy })\n this.setGapFactorLabels(cfg.gapStrategy)\n\n if (botType === botTypeBasicMM) {\n Doc.show(page.gapStrategyBox)\n Doc.hide(page.profitSelectorBox, page.orderPersistenceBox)\n this.setGapFactorLabels(page.gapStrategySelect.value || '')\n } else if (cexName && app().mmStatus.cexes[cexName]) {\n Doc.hide(page.gapStrategyBox)\n Doc.show(page.profitSelectorBox, page.orderPersistenceBox)\n this.setArbMMLabels()\n }\n\n // Buy/Sell placements\n oldCfg.buyPlacements.forEach((p) => { this.addPlacement(true, p) })\n oldCfg.sellPlacements.forEach((p) => { this.addPlacement(false, p) })\n\n this.basePane.setupWalletSettings()\n this.quotePane.setupWalletSettings()\n\n this.updateModifiedMarkers()\n if (Doc.isDisplayed(page.quickConfig)) this.switchToQuickConfig()\n }\n\n /*\n * validateFields validates configuration values and optionally shows error\n * messages.\n */\n validateFields (showErrors: boolean): boolean {\n let ok = true\n const {\n page, specs: { botType },\n updatedConfig: { sellPlacements, buyPlacements, profit }\n } = this\n const setError = (errEl: PageElement, errID: string) => {\n ok = false\n if (!showErrors) return\n errEl.textContent = intl.prep(errID)\n Doc.show(errEl)\n }\n if (showErrors) {\n Doc.hide(\n page.buyPlacementsErr, page.sellPlacementsErr, page.profitInputErr\n )\n }\n if (botType !== botTypeBasicArb && buyPlacements.length + sellPlacements.length === 0) {\n setError(page.buyPlacementsErr, intl.ID_NO_PLACEMENTS)\n setError(page.sellPlacementsErr, intl.ID_NO_PLACEMENTS)\n }\n if (botType !== botTypeBasicMM) {\n if (isNaN(profit)) setError(page.profitInputErr, intl.ID_INVALID_VALUE)\n else if (profit === 0) setError(page.profitInputErr, intl.ID_NO_ZERO)\n }\n return ok\n }\n\n /*\n * saveSettings updates the settings in the backend, and sets the originalConfig\n * to be equal to the updatedConfig.\n */\n async saveSettings () {\n // Make a copy and delete either the basic mm config or the arb-mm config,\n // depending on whether a cex is selected.\n if (!this.validateFields(true)) return\n const { cfg, baseID, quoteID, host, botType, cexName } = this.marketStuff()\n\n const botCfg: BotConfig = {\n host: host,\n baseID: baseID,\n quoteID: quoteID,\n cexName: cexName ?? '',\n uiConfig: {\n simpleArbLots: cfg.simpleArbLots,\n baseConfig: cfg.baseConfig,\n quoteConfig: cfg.quoteConfig,\n cexRebalance: cfg.cexRebalance\n },\n baseWalletOptions: cfg.baseOptions,\n quoteWalletOptions: cfg.quoteOptions\n }\n switch (botType) {\n case botTypeBasicMM:\n botCfg.basicMarketMakingConfig = this.basicMMConfig()\n break\n case botTypeArbMM:\n botCfg.arbMarketMakingConfig = this.arbMMConfig()\n break\n case botTypeBasicArb:\n botCfg.simpleArbConfig = this.basicArbConfig()\n }\n\n app().log('mm', 'saving bot config', botCfg)\n await MM.updateBotConfig(botCfg)\n await app().fetchMMStatus()\n this.originalConfig = JSON.parse(JSON.stringify(cfg))\n this.updateModifiedMarkers()\n const lastBots = State.fetchLocal(lastBotsLK) || {}\n lastBots[`${baseID}_${quoteID}_${host}`] = this.specs\n State.storeLocal(lastBotsLK, lastBots)\n if (cexName) State.storeLocal(lastArbExchangeLK, cexName)\n app().loadPage('mm')\n }\n\n async delete () {\n const { page, specs: { host, baseID, quoteID } } = this\n Doc.hide(page.deleteErr)\n const loaded = app().loading(page.botSettingsContainer)\n const resp = await MM.removeBotConfig(host, baseID, quoteID)\n loaded()\n if (!app().checkResponse(resp)) {\n page.deleteErr.textContent = intl.prep(intl.ID_API_ERROR, { msg: resp.msg })\n Doc.show(page.deleteErr)\n return\n }\n await app().fetchMMStatus()\n app().loadPage('mm')\n }\n\n /*\n * arbMMConfig parses the configuration for the arb-mm bot. Only one of\n * arbMMConfig or basicMMConfig should be used when updating the bot\n * configuration. Which is used depends on if the user has configured and\n * selected a CEX or not.\n */\n arbMMConfig (): ArbMarketMakingConfig {\n const { updatedConfig: cfg } = this\n const arbCfg: ArbMarketMakingConfig = {\n buyPlacements: [],\n sellPlacements: [],\n profit: cfg.profit,\n driftTolerance: cfg.driftTolerance,\n orderPersistence: cfg.orderPersistence\n }\n for (const p of cfg.buyPlacements) arbCfg.buyPlacements.push({ lots: p.lots, multiplier: p.gapFactor })\n for (const p of cfg.sellPlacements) arbCfg.sellPlacements.push({ lots: p.lots, multiplier: p.gapFactor })\n return arbCfg\n }\n\n basicArbConfig (): SimpleArbConfig {\n const { updatedConfig: cfg } = this\n const arbCfg: SimpleArbConfig = {\n profitTrigger: cfg.profit,\n maxActiveArbs: 100, // TODO\n numEpochsLeaveOpen: cfg.orderPersistence\n }\n return arbCfg\n }\n\n /*\n * basicMMConfig parses the configuration for the basic marketmaker. Only of\n * of basidMMConfig or arbMMConfig should be used when updating the bot\n * configuration.\n */\n basicMMConfig (): BasicMarketMakingConfig {\n const { updatedConfig: cfg } = this\n const mmCfg: BasicMarketMakingConfig = {\n gapStrategy: cfg.gapStrategy,\n sellPlacements: cfg.sellPlacements,\n buyPlacements: cfg.buyPlacements,\n driftTolerance: cfg.driftTolerance\n }\n return mmCfg\n }\n\n /*\n * fetchOracles fetches the current oracle rates and fiat rates, and displays\n * them on the screen.\n */\n async fetchMarketReport (): Promise<void> {\n const { page, specs: { host, baseID, quoteID } } = this\n\n const res = await MM.report(host, baseID, quoteID)\n Doc.hide(page.oraclesLoading, page.oraclesTable, page.noOracles)\n\n if (!app().checkResponse(res)) {\n page.oraclesErrMsg.textContent = res.msg\n Doc.show(page.oraclesErr)\n return\n }\n\n const r = this.marketReport = res.report as MarketReport\n if (!r.oracles || r.oracles.length === 0) {\n Doc.show(page.noOracles)\n } else {\n Doc.hide(page.noOracles)\n Doc.empty(page.oracles)\n for (const o of r.oracles ?? []) {\n const tr = page.oracleTmpl.cloneNode(true) as PageElement\n page.oracles.appendChild(tr)\n const tmpl = Doc.parseTemplate(tr)\n tmpl.logo.src = 'img/' + o.host + '.png'\n tmpl.host.textContent = ExchangeNames[o.host]\n tmpl.volume.textContent = Doc.formatFourSigFigs(o.usdVol)\n tmpl.price.textContent = Doc.formatFourSigFigs((o.bestBuy + o.bestSell) / 2)\n }\n page.avgPrice.textContent = r.price ? Doc.formatFourSigFigs(r.price) : '0'\n Doc.show(page.oraclesTable)\n }\n\n if (r.baseFiatRate > 0) {\n page.baseFiatRate.textContent = Doc.formatFourSigFigs(r.baseFiatRate)\n } else {\n page.baseFiatRate.textContent = 'N/A'\n }\n\n if (r.quoteFiatRate > 0) {\n page.quoteFiatRate.textContent = Doc.formatFourSigFigs(r.quoteFiatRate)\n } else {\n page.quoteFiatRate.textContent = 'N/A'\n }\n Doc.show(page.fiatRates)\n }\n\n /*\n * handleCEXSubmit handles clicks on the CEX configuration submission button.\n */\n async cexConfigured (cexName: string) {\n const { page, formSpecs: { host, baseID, quoteID } } = this\n const dinfo = CEXDisplayInfos[cexName]\n for (const { baseID, quoteID, tmpl, arbs } of this.marketRows) {\n if (arbs.indexOf(cexName) !== -1) continue\n const cexHasMarket = this.cexMarketSupportFilter(baseID, quoteID)\n if (cexHasMarket(cexName)) {\n const img = page.arbBttnTmpl.cloneNode(true) as PageElement\n img.src = dinfo.logo\n tmpl.arbs.appendChild(img)\n arbs.push(cexName)\n }\n }\n this.setCEXAvailability(baseID, quoteID, cexName)\n this.showBotTypeForm(host, baseID, quoteID, botTypeArbMM, cexName)\n }\n\n /*\n * setupCEXes should be called during initialization.\n */\n setupCEXes () {\n this.formCexes = {}\n for (const name of Object.keys(CEXDisplayInfos)) this.addCEX(name)\n }\n\n /*\n * setCEXAvailability sets the coloring and messaging of the CEX selection\n * buttons.\n */\n setCEXAvailability (baseID: number, quoteID: number, selectedCEX?: string) {\n const cexHasMarket = this.cexMarketSupportFilter(baseID, quoteID)\n for (const { name, div, tmpl } of Object.values(this.formCexes)) {\n const has = cexHasMarket(name)\n const cexStatus = app().mmStatus.cexes[name]\n Doc.hide(tmpl.unavailable, tmpl.needsconfig, tmpl.disconnected)\n Doc.setVis(Boolean(cexStatus), tmpl.reconfig)\n tmpl.logo.classList.remove('greyscal')\n div.classList.toggle('configured', Boolean(cexStatus) && !cexStatus.connectErr)\n if (!cexStatus) {\n Doc.show(tmpl.needsconfig)\n } else if (cexStatus.connectErr) {\n Doc.show(tmpl.disconnected)\n } else if (!has) {\n Doc.show(tmpl.unavailable)\n tmpl.logo.classList.add('greyscal')\n } else if (name === selectedCEX) this.selectFormCEX(name)\n }\n }\n\n selectFormCEX (cexName: string) {\n for (const { name, div } of Object.values(this.formCexes)) {\n div.classList.toggle('selected', name === cexName)\n }\n }\n\n addCEX (cexName: string) {\n const dinfo = CEXDisplayInfos[cexName]\n const div = this.page.cexOptTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(div)\n tmpl.name.textContent = dinfo.name\n tmpl.logo.src = dinfo.logo\n this.page.cexSelection.appendChild(div)\n this.formCexes[cexName] = { name: cexName, div, tmpl }\n Doc.bind(div, 'click', () => {\n const cexStatus = app().mmStatus.cexes[cexName]\n if (!cexStatus || cexStatus.connectErr) {\n this.showCEXConfigForm(cexName)\n return\n }\n const cex = this.formCexes[cexName]\n if (cex.div.classList.contains('selected')) { // unselect\n for (const cex of Object.values(this.formCexes)) cex.div.classList.remove('selected')\n const { baseID, quoteID } = this.formSpecs\n this.setCEXAvailability(baseID, quoteID)\n return\n }\n for (const cex of Object.values(this.formCexes)) cex.div.classList.toggle('selected', cex.name === cexName)\n })\n Doc.bind(tmpl.reconfig, 'click', (e: MouseEvent) => {\n e.stopPropagation()\n this.showCEXConfigForm(cexName)\n })\n }\n\n showCEXConfigForm (cexName: string) {\n const page = this.page\n this.cexConfigForm.setCEX(cexName)\n this.forms.show(page.cexConfigForm)\n }\n\n /*\n * cexMarketSupportFilter returns a lookup CEXes that have a matching market\n * for the currently selected base and quote assets.\n */\n cexMarketSupportFilter (baseID: number, quoteID: number) {\n const cexes: Record<string, boolean> = {}\n for (const [cexName, cexStatus] of Object.entries(app().mmStatus.cexes)) {\n for (const { baseID: b, quoteID: q } of Object.values(cexStatus.markets ?? [])) {\n if (b === baseID && q === quoteID) {\n cexes[cexName] = true\n break\n }\n }\n }\n return (cexName: string) => Boolean(cexes[cexName])\n }\n}\n\nfunction isViewOnly (specs: BotSpecs, mmStatus: MarketMakingStatus): boolean {\n const botStatus = mmStatus.bots.find(({ config: cfg }) => cfg.host === specs.host && cfg.baseID === specs.baseID && cfg.quoteID === specs.quoteID)\n return Boolean(botStatus?.running)\n}\n\nconst ExchangeNames: Record<string, string> = {\n 'binance.com': 'Binance',\n 'coinbase.com': 'Coinbase',\n 'bittrex.com': 'Bittrex',\n 'hitbtc.com': 'HitBTC',\n 'exmo.com': 'EXMO'\n}\n\nfunction tokenAssetApprovalStatuses (host: string, b: SupportedAsset, q: SupportedAsset) {\n let baseAssetApprovalStatus = ApprovalStatus.Approved\n let quoteAssetApprovalStatus = ApprovalStatus.Approved\n\n if (b?.token) {\n const baseAsset = app().assets[b.id]\n const baseVersion = app().exchanges[host].assets[b.id].version\n if (baseAsset?.wallet?.approved && baseAsset.wallet.approved[baseVersion] !== undefined) {\n baseAssetApprovalStatus = baseAsset.wallet.approved[baseVersion]\n }\n }\n if (q?.token) {\n const quoteAsset = app().assets[q.id]\n const quoteVersion = app().exchanges[host].assets[q.id].version\n if (quoteAsset?.wallet?.approved && quoteAsset.wallet.approved[quoteVersion] !== undefined) {\n quoteAssetApprovalStatus = quoteAsset.wallet.approved[quoteVersion]\n }\n }\n\n return [\n baseAssetApprovalStatus,\n quoteAssetApprovalStatus\n ]\n}\n\nclass AssetPane {\n pg: MarketMakerSettingsPage\n div: PageElement\n page: Record<string, PageElement>\n assetID: number\n ui: UnitInfo\n walletConfig: Record<string, string>\n feeAssetID: number\n feeUI: UnitInfo\n isQuote: boolean\n isToken: boolean\n lotSize: number // might be quote converted\n lotSizeConv: number\n cfg: BotAssetConfig\n inv: ProjectedAlloc\n nSwapFees: IncrementalInput\n nSwapFeesSlider: MiniSlider\n orderReserves: NumberInput\n orderReservesSlider: MiniSlider\n slippageBuffer: NumberInput\n slippageBufferSlider: MiniSlider\n minTransfer: NumberInput\n minTransferSlider: MiniSlider\n\n constructor (pg: MarketMakerSettingsPage, div: PageElement) {\n this.pg = pg\n this.div = div\n const page = this.page = Doc.parseTemplate(div)\n\n this.nSwapFees = new IncrementalInput(page.nSwapFees, {\n prec: defaultSwapReserves.prec,\n inc: defaultSwapReserves.inc,\n changed: (v: number) => {\n const { minR, range } = defaultSwapReserves\n this.cfg.swapFeeN = v\n this.nSwapFeesSlider.setValue((v - minR) / range)\n this.pg.updateAllocations()\n }\n })\n\n this.nSwapFeesSlider = new MiniSlider(page.nSwapFeesSlider, (r: number) => {\n const { minR, range, prec } = defaultSwapReserves\n const [v] = toPrecision(minR + r * range, prec)\n this.cfg.swapFeeN = v\n this.nSwapFees.setValue(v)\n this.pg.updateAllocations()\n })\n this.orderReserves = new NumberInput(page.orderReservesFactor, {\n prec: defaultOrderReserves.prec,\n min: 0,\n changed: (v: number) => {\n const { minR, range } = defaultOrderReserves\n this.cfg.orderReservesFactor = v\n this.orderReservesSlider.setValue((v - minR) / range)\n this.pg.updateAllocations()\n }\n })\n this.orderReservesSlider = new MiniSlider(page.orderReservesSlider, (r: number) => {\n const { minR, range, prec } = defaultOrderReserves\n const [v] = toPrecision(minR + r * range, prec)\n this.orderReserves.setValue(v)\n this.cfg.orderReservesFactor = v\n this.pg.updateAllocations()\n })\n this.slippageBuffer = new NumberInput(page.slippageBufferFactor, {\n prec: defaultSlippage.prec,\n min: 0,\n changed: (v: number) => {\n const { minR, range } = defaultSlippage\n this.cfg.slippageBufferFactor = v\n this.slippageBufferSlider.setValue((v - minR) / range)\n this.pg.updateAllocations()\n }\n })\n this.slippageBufferSlider = new MiniSlider(page.slippageBufferSlider, (r: number) => {\n const { minR, range, prec } = defaultSlippage\n const [v] = toPrecision(minR + r * range, prec)\n this.slippageBuffer.setValue(minR + r * range)\n this.cfg.slippageBufferFactor = v\n this.pg.updateAllocations()\n })\n this.minTransfer = new NumberInput(page.minTransfer, {\n sigFigs: true,\n min: 0,\n changed: (v: number) => {\n const { cfg } = this\n const totalInventory = this.commit()\n const [minV, maxV] = [this.minTransfer.min, Math.max(this.minTransfer.min * 2, totalInventory)]\n cfg.transferFactor = (v - minV) / (maxV - minV)\n this.minTransferSlider.setValue(cfg.transferFactor)\n }\n })\n this.minTransferSlider = new MiniSlider(page.minTransferSlider, (r: number) => {\n const { cfg } = this\n const totalInventory = this.commit()\n const [minV, maxV] = [this.minTransfer.min, Math.max(this.minTransfer.min, totalInventory)]\n cfg.transferFactor = r\n this.minTransfer.setValue(minV + r * (maxV - minV))\n })\n\n Doc.bind(page.showBalance, 'click', () => { pg.showAddress(this.assetID) })\n }\n\n // lot size can change if this is the quote asset, keep it updated.\n setLotSize (lotSize: number) {\n const { ui } = this\n this.lotSize = lotSize\n this.lotSizeConv = lotSize / ui.conventional.conversionFactor\n }\n\n setAsset (assetID: number, isQuote: boolean) {\n this.assetID = assetID\n this.isQuote = isQuote\n const cfg = this.cfg = isQuote ? this.pg.updatedConfig.quoteConfig : this.pg.updatedConfig.baseConfig\n const { page, div, pg: { specs: { botType, baseID, cexName }, mktID, updatedConfig: { baseOptions, quoteOptions } } } = this\n const { symbol, name, token, unitInfo: ui } = app().assets[assetID]\n this.ui = ui\n this.walletConfig = assetID === baseID ? baseOptions : quoteOptions\n const { conventional: { unit: ticker } } = ui\n this.feeAssetID = token ? token.parentID : assetID\n const { unitInfo: feeUI, name: feeName, symbol: feeSymbol } = app().assets[this.feeAssetID]\n this.feeUI = feeUI\n this.inv = { book: 0, bookingFees: 0, swapFeeReserves: 0, cex: 0, orderReserves: 0, slippageBuffer: 0 }\n this.isToken = Boolean(token)\n Doc.setVis(this.isToken, page.feeTotalBox, page.feeReservesBox, page.feeBalances)\n Doc.setVis(isQuote, page.slippageBufferBox)\n Doc.setSrc(div, '[data-logo]', Doc.logoPath(symbol))\n Doc.setText(div, '[data-name]', name)\n Doc.setText(div, '[data-ticker]', ticker)\n const { conventional: { unit: feeTicker } } = feeUI\n Doc.setText(div, '[data-fee-ticker]', feeTicker)\n Doc.setText(div, '[data-fee-name]', feeName)\n Doc.setSrc(div, '[data-fee-logo]', Doc.logoPath(feeSymbol))\n Doc.setVis(botType !== botTypeBasicMM, page.cexMinInvBox)\n Doc.setVis(botType !== botTypeBasicArb, page.orderReservesBox)\n this.nSwapFees.setValue(cfg.swapFeeN ?? defaultSwapReserves.n)\n this.nSwapFeesSlider.setValue(cfg.swapFeeN / defaultSwapReserves.maxR)\n if (botType !== botTypeBasicArb) {\n const [v] = toPrecision(cfg.orderReservesFactor ?? defaultOrderReserves.factor, defaultOrderReserves.prec)\n this.orderReserves.setValue(v)\n this.orderReservesSlider.setValue((v - defaultOrderReserves.minR) / defaultOrderReserves.range)\n }\n if (botType !== botTypeBasicMM) {\n this.minTransfer.prec = Math.log10(ui.conventional.conversionFactor)\n const mkt = app().mmStatus.cexes[cexName as string].markets[mktID]\n this.minTransfer.min = ((isQuote ? mkt.quoteMinWithdraw : mkt.baseMinWithdraw) / ui.conventional.conversionFactor)\n }\n this.slippageBuffer.setValue(cfg.slippageBufferFactor)\n const { minR, range } = defaultSlippage\n this.slippageBufferSlider.setValue((cfg.slippageBufferFactor - minR) / range)\n this.setupWalletSettings()\n this.updateBalances()\n }\n\n commit () {\n const { inv, isToken } = this\n let commit = inv.book + inv.cex + inv.orderReserves + inv.slippageBuffer\n if (!isToken) commit += inv.bookingFees + inv.swapFeeReserves\n return commit\n }\n\n updateInventory (lots: number, counterLots: number, lotSize: number, dexCommit: number, cexCommit: number, fees: AssetBookingFees) {\n this.setLotSize(lotSize)\n const { page, cfg, lotSizeConv, inv, ui, feeUI, isToken, isQuote, pg: { specs: { cexName, botType } } } = this\n page.bookLots.textContent = String(lots)\n page.bookLotSize.textContent = Doc.formatFourSigFigs(lotSizeConv)\n inv.book = lots * lotSizeConv\n page.bookCommitment.textContent = Doc.formatFourSigFigs(inv.book)\n const feesPerLotConv = fees.bookingFeesPerLot / feeUI.conventional.conversionFactor\n page.bookingFeesPerLot.textContent = Doc.formatFourSigFigs(feesPerLotConv)\n page.swapReservesFactor.textContent = fees.swapReservesFactor.toFixed(2)\n page.bookingFeesLots.textContent = String(lots)\n inv.bookingFees = fees.bookingFees / feeUI.conventional.conversionFactor\n page.bookingFees.textContent = Doc.formatFourSigFigs(inv.bookingFees)\n if (cexName) {\n inv.cex = cexCommit / ui.conventional.conversionFactor\n page.cexMinInv.textContent = Doc.formatFourSigFigs(inv.cex)\n }\n if (botType !== botTypeBasicArb) {\n const totalInventory = Math.max(cexCommit, dexCommit) / ui.conventional.conversionFactor\n page.orderReservesBasis.textContent = Doc.formatFourSigFigs(totalInventory)\n const orderReserves = totalInventory * cfg.orderReservesFactor\n inv.orderReserves = orderReserves\n page.orderReserves.textContent = Doc.formatFourSigFigs(orderReserves)\n }\n if (isToken) {\n const feesPerSwapConv = fees.tokenFeesPerSwap / feeUI.conventional.conversionFactor\n page.feeReservesPerSwap.textContent = Doc.formatFourSigFigs(feesPerSwapConv)\n inv.swapFeeReserves = feesPerSwapConv * cfg.swapFeeN\n page.feeReserves.textContent = Doc.formatFourSigFigs(inv.swapFeeReserves)\n }\n if (isQuote) {\n const basis = inv.book + inv.cex + inv.orderReserves\n page.slippageBufferBasis.textContent = Doc.formatCoinValue(basis * ui.conventional.conversionFactor, ui)\n inv.slippageBuffer = basis * cfg.slippageBufferFactor\n page.slippageBuffer.textContent = Doc.formatCoinValue(inv.slippageBuffer * ui.conventional.conversionFactor, ui)\n }\n Doc.setVis(fees.bookingFeesPerCounterLot > 0, page.redemptionFeesBox)\n if (fees.bookingFeesPerCounterLot > 0) {\n const feesPerLotConv = fees.bookingFeesPerCounterLot / feeUI.conventional.conversionFactor\n page.redemptionFeesPerLot.textContent = Doc.formatFourSigFigs(feesPerLotConv)\n page.redemptionFeesLots.textContent = String(counterLots)\n page.redeemReservesFactor.textContent = fees.redeemReservesFactor.toFixed(2)\n }\n this.updateCommitTotal()\n this.updateTokenFees()\n this.updateRebalance()\n }\n\n updateCommitTotal () {\n const { page, assetID, ui } = this\n const commit = this.commit()\n page.commitTotal.textContent = Doc.formatCoinValue(Math.round(commit * ui.conventional.conversionFactor), ui)\n page.commitTotalFiat.textContent = Doc.formatFourSigFigs(commit * app().fiatRatesMap[assetID])\n }\n\n updateTokenFees () {\n const { page, inv, feeAssetID, feeUI, isToken } = this\n if (!isToken) return\n const feeReserves = inv.bookingFees + inv.swapFeeReserves\n page.feeTotal.textContent = Doc.formatCoinValue(feeReserves * feeUI.conventional.conversionFactor, feeUI)\n page.feeTotalFiat.textContent = Doc.formatFourSigFigs(feeReserves * app().fiatRatesMap[feeAssetID])\n }\n\n updateRebalance () {\n const { page, cfg, pg: { updatedConfig: { cexRebalance }, specs: { cexName } } } = this\n const showRebalance = cexName && cexRebalance\n Doc.setVis(showRebalance, page.rebalanceOpts)\n if (!showRebalance) return\n const totalInventory = this.commit()\n const [minV, maxV] = [this.minTransfer.min, Math.max(this.minTransfer.min * 2, totalInventory)]\n const rangeV = maxV - minV\n this.minTransfer.setValue(minV + cfg.transferFactor * rangeV)\n this.minTransferSlider.setValue((cfg.transferFactor - defaultTransfer.minR) / defaultTransfer.range)\n }\n\n setupWalletSettings () {\n const { page, assetID, walletConfig } = this\n const walletSettings = app().currentWalletDefinition(assetID)\n Doc.empty(page.walletSettings)\n Doc.setVis(!walletSettings.multifundingopts, page.walletSettingsNone)\n if (!walletSettings.multifundingopts) return\n const optToDiv: Record<string, PageElement> = {}\n const dependentOpts: Record<string, string[]> = {}\n const addDependentOpt = (optKey: string, optSetting: PageElement, dependentOn: string) => {\n if (!dependentOpts[dependentOn]) dependentOpts[dependentOn] = []\n dependentOpts[dependentOn].push(optKey)\n optToDiv[optKey] = optSetting\n }\n const setDependentOptsVis = (parentOptKey: string, vis: boolean) => {\n const optKeys = dependentOpts[parentOptKey]\n if (!optKeys) return\n for (const optKey of optKeys) Doc.setVis(vis, optToDiv[optKey])\n }\n const addOpt = (opt: OrderOption) => {\n if (opt.quoteAssetOnly && !this.isQuote) return\n const currVal = walletConfig[opt.key]\n let div: PageElement | undefined\n if (opt.isboolean) {\n div = page.boolSettingTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(div)\n tmpl.name.textContent = opt.displayname\n tmpl.input.checked = currVal === 'true'\n Doc.bind(tmpl.input, 'change', () => {\n walletConfig[opt.key] = tmpl.input.checked ? 'true' : 'false'\n setDependentOptsVis(opt.key, Boolean(tmpl.input.checked))\n })\n if (opt.description) tmpl.tooltip.dataset.tooltip = opt.description\n } else if (opt.xyRange) {\n const { start, end, xUnit } = opt.xyRange\n const range = end.x - start.x\n div = page.rangeSettingTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(div)\n tmpl.name.textContent = opt.displayname\n if (opt.description) tmpl.tooltip.dataset.tooltip = opt.description\n if (xUnit) tmpl.unit.textContent = xUnit\n else Doc.hide(tmpl.unit)\n\n const input = new NumberInput(tmpl.value, {\n prec: 1,\n changed: (rawV: number) => {\n const [v, s] = toFourSigFigs(rawV, 1)\n walletConfig[opt.key] = s\n slider.setValue((v - start.x) / range)\n }\n })\n const slider = new MiniSlider(tmpl.slider, (r: number) => {\n const rawV = start.x + r * range\n const [v, s] = toFourSigFigs(rawV, 1)\n walletConfig[opt.key] = s\n input.setValue(v)\n })\n // TODO: default value should be smaller or none for base asset.\n const [v, s] = toFourSigFigs(parseFloatDefault(currVal, start.x), 3)\n walletConfig[opt.key] = s\n slider.setValue((v - start.x) / range)\n input.setValue(v)\n tmpl.value.textContent = s\n }\n if (!div) return console.error(\"don't know how to handle opt\", opt)\n page.walletSettings.appendChild(div)\n if (opt.dependsOn) {\n addDependentOpt(opt.key, div, opt.dependsOn)\n const parentOptVal = walletConfig[opt.dependsOn]\n Doc.setVis(parentOptVal === 'true', div)\n }\n }\n\n if (walletSettings.multifundingopts && walletSettings.multifundingopts.length > 0) {\n for (const opt of walletSettings.multifundingopts) addOpt(opt)\n }\n app().bindTooltips(page.walletSettings)\n }\n\n updateBalances () {\n const { page, assetID, ui, feeAssetID, feeUI, pg: { specs: { cexName, baseID }, cexBaseBalance, cexQuoteBalance } } = this\n const { balance: { available } } = app().walletMap[assetID]\n const botInv = this.pg.runningBotInventory(assetID)\n const dexAvail = available - botInv.dex.total\n let cexAvail = 0\n Doc.setVis(cexName, page.balanceBreakdown)\n if (cexName) {\n page.dexAvail.textContent = Doc.formatFourSigFigs(dexAvail / ui.conventional.conversionFactor)\n const { available: cexRawAvail } = assetID === baseID ? cexBaseBalance : cexQuoteBalance\n cexAvail = cexRawAvail - botInv.cex.total\n page.cexAvail.textContent = Doc.formatFourSigFigs(cexAvail / ui.conventional.conversionFactor)\n }\n page.avail.textContent = Doc.formatFourSigFigs((dexAvail + cexAvail) / ui.conventional.conversionFactor)\n if (assetID === feeAssetID) return\n const { balance: { available: feeAvail } } = app().walletMap[feeAssetID]\n page.feeAvail.textContent = Doc.formatFourSigFigs(feeAvail / feeUI.conventional.conversionFactor)\n }\n}\n","import Doc, { Animation, AniToggle } from './doc'\nimport BasePage from './basepage'\nimport { postJSON } from './http'\nimport * as forms from './forms'\nimport * as intl from './locales'\nimport { ReputationMeter, strongTier } from './account'\nimport {\n app,\n PageElement,\n ConnectionStatus,\n Exchange,\n WalletState,\n PrepaidBondID\n} from './registry'\n\ninterface Animator {\n animate: (() => Promise<void>)\n}\n\ninterface BondOptionsForm {\n host?: string // Required, but set by updateBondOptions\n bondAssetID?: number\n targetTier?: number\n penaltyComps?: number\n}\n\nconst animationLength = 300\n\nexport default class DexSettingsPage extends BasePage {\n body: HTMLElement\n forms: PageElement[]\n currentForm: PageElement\n page: Record<string, PageElement>\n host: string\n accountDisabled:boolean\n keyup: (e: KeyboardEvent) => void\n dexAddrForm: forms.DEXAddressForm\n bondFeeBufferCache: Record<string, number>\n newWalletForm: forms.NewWalletForm\n regAssetForm: forms.FeeAssetSelectionForm\n walletWaitForm: forms.WalletWaitForm\n confirmRegisterForm: forms.ConfirmRegistrationForm\n reputationMeter: ReputationMeter\n animation: Animation\n renewToggle: AniToggle\n\n constructor (body: HTMLElement) {\n super()\n this.body = body\n const host = this.host = body.dataset.host ? body.dataset.host : ''\n const xc = app().exchanges[host]\n const page = this.page = Doc.idDescendants(body)\n this.forms = Doc.applySelector(page.forms, ':scope > form')\n\n this.confirmRegisterForm = new forms.ConfirmRegistrationForm(page.confirmRegForm, async () => {\n this.showSuccess(intl.prep(intl.ID_TRADING_TIER_UPDATED))\n this.renewToggle.setState(this.confirmRegisterForm.tier > 0)\n await app().fetchUser()\n app().updateMenuItemsDisplay()\n }, () => {\n this.runAnimation(this.regAssetForm, page.regAssetForm)\n })\n this.confirmRegisterForm.setExchange(xc, '')\n\n this.walletWaitForm = new forms.WalletWaitForm(page.walletWait, () => {\n this.runAnimation(this.confirmRegisterForm, page.confirmRegForm)\n }, () => {\n this.runAnimation(this.regAssetForm, page.regAssetForm)\n })\n this.walletWaitForm.setExchange(xc)\n\n this.newWalletForm = new forms.NewWalletForm(\n page.newWalletForm,\n assetID => this.newWalletCreated(assetID, this.confirmRegisterForm.tier),\n () => this.runAnimation(this.regAssetForm, page.regAssetForm)\n )\n\n this.regAssetForm = new forms.FeeAssetSelectionForm(page.regAssetForm, async (assetID: number, tier: number) => {\n if (assetID === PrepaidBondID) {\n await app().fetchUser()\n this.updateReputation()\n this.showSuccess(intl.prep(intl.ID_TRADING_TIER_UPDATED))\n return\n }\n const asset = app().assets[assetID]\n const wallet = asset.wallet\n if (wallet) {\n const loaded = app().loading(page.regAssetForm)\n const bondsFeeBuffer = await this.getBondsFeeBuffer(assetID, page.regAssetForm)\n this.confirmRegisterForm.setAsset(assetID, tier, bondsFeeBuffer)\n loaded()\n this.progressTierFormsWithWallet(assetID, wallet)\n return\n }\n this.confirmRegisterForm.setAsset(assetID, tier, 0)\n this.newWalletForm.setAsset(assetID)\n this.showForm(page.newWalletForm)\n })\n this.regAssetForm.setExchange(xc, '')\n\n this.reputationMeter = new ReputationMeter(page.repMeter)\n this.reputationMeter.setHost(host)\n\n Doc.bind(page.exportDexBtn, 'click', () => this.exportAccount())\n\n this.accountDisabled = body.dataset.disabled === 'true'\n Doc.bind(page.toggleAccountStatusBtn, 'click', () => {\n if (!this.accountDisabled) this.prepareAccountDisable(page.disableAccountForm)\n else this.toggleAccountStatus(false)\n })\n Doc.bind(page.updateCertBtn, 'click', () => page.certFileInput.click())\n Doc.bind(page.updateHostBtn, 'click', () => this.prepareUpdateHost())\n Doc.bind(page.certFileInput, 'change', () => this.onCertFileChange())\n Doc.bind(page.goBackToSettings, 'click', () => app().loadPage('settings'))\n\n const showTierForm = () => {\n this.regAssetForm.setExchange(app().exchanges[host], '') // reset form\n this.showForm(page.regAssetForm)\n }\n Doc.bind(page.changeTier, 'click', () => { showTierForm() })\n const willAutoRenew = xc.auth.targetTier > 0\n this.renewToggle = new AniToggle(page.toggleAutoRenew, page.renewErr, willAutoRenew, async (newState: boolean) => {\n if (this.accountDisabled) return\n if (newState) showTierForm()\n else return this.disableAutoRenew()\n })\n Doc.bind(page.autoRenewBox, 'click', (e: MouseEvent) => {\n e.stopPropagation()\n if (!this.accountDisabled) page.toggleAutoRenew.click()\n })\n\n page.penaltyCompInput.value = String(xc.auth.penaltyComps)\n Doc.bind(page.penaltyCompBox, 'click', (e: MouseEvent) => {\n e.stopPropagation()\n const xc = app().exchanges[this.host]\n page.penaltyCompInput.value = String(xc.auth.penaltyComps)\n page.penaltyCompInput.focus()\n })\n\n Doc.bind(page.penaltyCompInput, 'keyup', async (e: KeyboardEvent) => {\n Doc.hide(page.penaltyCompsErr)\n if (e.key === 'Escape') {\n return\n }\n if (!(e.key === 'Enter')) return\n const penaltyComps = parseInt(page.penaltyCompInput.value || '')\n if (isNaN(penaltyComps)) {\n Doc.show(page.penaltyCompsErr)\n page.penaltyCompsErr.textContent = intl.prep(intl.ID_INVALID_COMPS_VALUE)\n return\n }\n const loaded = app().loading(page.otherBondSettings)\n try {\n await this.updateBondOptions({ penaltyComps })\n loaded()\n } catch (e) {\n loaded()\n Doc.show(page.penaltyCompsErr)\n page.penaltyCompsErr.textContent = intl.prep(intl.ID_API_ERROR, { msg: e.msg })\n }\n })\n\n this.dexAddrForm = new forms.DEXAddressForm(page.dexAddrForm, async (xc: Exchange) => {\n app().loadPage(`/dexsettings/${xc.host}`)\n }, this.host)\n\n // forms.bind(page.bondDetailsForm, page.updateBondOptionsConfirm, () => this.updateBondOptions())\n forms.bind(page.disableAccountForm, page.disableAccountConfirm, () => this.toggleAccountStatus(true))\n\n Doc.bind(page.forms, 'mousedown', (e: MouseEvent) => {\n if (!Doc.mouseInElement(e, this.currentForm)) { this.closePopups() }\n })\n\n this.keyup = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.closePopups()\n }\n }\n Doc.bind(document, 'keyup', this.keyup)\n\n Doc.applySelector(page.forms, '.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => { this.closePopups() })\n })\n\n app().registerNoteFeeder({\n conn: () => { this.setConnectionStatus() },\n reputation: () => { this.updateReputation() },\n feepayment: () => { this.updateReputation() },\n bondpost: () => { this.updateReputation() }\n })\n\n this.setConnectionStatus()\n this.updateReputation()\n }\n\n unload () {\n Doc.unbind(document, 'keyup', this.keyup)\n }\n\n async progressTierFormsWithWallet (assetID: number, wallet: WalletState) {\n const { page, confirmRegisterForm: { fees } } = this\n const asset = app().assets[assetID]\n const { bondAssets } = this.regAssetForm.xc\n const bondAsset = bondAssets[asset.symbol]\n if (!wallet.open) {\n const loaded = app().loading(page.forms)\n const res = await postJSON('/api/openwallet', { assetID: assetID })\n loaded()\n if (!app().checkResponse(res)) {\n this.regAssetForm.setAssetError(`error unlocking wallet: ${res.msg}`)\n this.runAnimation(this.regAssetForm, page.regAssetForm)\n }\n return\n }\n if (wallet.synced && wallet.balance.available >= 2 * bondAsset.amount + fees) {\n // If we are raising our tier, we'll show a confirmation form\n this.progressTierFormWithSyncedFundedWallet(assetID)\n return\n }\n this.walletWaitForm.setWallet(assetID, fees, this.confirmRegisterForm.tier)\n this.showForm(page.walletWait)\n }\n\n async progressTierFormWithSyncedFundedWallet (bondAssetID: number) {\n const xc = app().exchanges[this.host]\n const targetTier = this.confirmRegisterForm.tier\n const page = this.page\n const strongTier = xc.auth.liveStrength + xc.auth.pendingStrength - xc.auth.weakStrength\n if (targetTier > xc.auth.targetTier && targetTier > strongTier) {\n this.runAnimation(this.confirmRegisterForm, page.confirmRegForm)\n return\n }\n // Lowering tier\n const loaded = app().loading(this.body)\n try {\n await this.updateBondOptions({ bondAssetID, targetTier })\n loaded()\n } catch (e) {\n loaded()\n this.regAssetForm.setTierError(e.msg)\n return\n }\n // this.animateConfirmForm(page.regAssetForm)\n this.showSuccess(intl.prep(intl.ID_TRADING_TIER_UPDATED))\n }\n\n updateReputation () {\n const page = this.page\n const auth = app().exchanges[this.host].auth\n const { rep: { penalties }, targetTier, expiredBonds } = auth\n const displayTier = strongTier(auth)\n page.targetTier.textContent = String(targetTier)\n page.effectiveTier.textContent = String(displayTier)\n page.penalties.textContent = String(penalties)\n page.bondsPendingRefund.textContent = `${expiredBonds?.length || 0}`\n this.reputationMeter.update()\n }\n\n /* showForm shows a modal form with a little animation. */\n async showForm (form: HTMLElement) {\n const page = this.page\n this.currentForm = form\n this.forms.forEach(form => Doc.hide(form))\n form.style.right = '10000px'\n Doc.show(page.forms, form)\n const shift = (page.forms.offsetWidth + form.offsetWidth) / 2\n await Doc.animate(animationLength, progress => {\n form.style.right = `${(1 - progress) * shift}px`\n }, 'easeOutHard')\n form.style.right = '0'\n }\n\n async runAnimation (ani: Animator, form: PageElement) {\n Doc.hide(this.currentForm)\n await ani.animate()\n this.currentForm = form\n Doc.show(form)\n }\n\n closePopups () {\n Doc.hide(this.page.forms)\n if (this.animation) this.animation.stop()\n }\n\n async showSuccess (msg: string) {\n this.forms.forEach(form => Doc.hide(form))\n this.currentForm = this.page.checkmarkForm\n this.animation = forms.showSuccess(this.page, msg)\n await this.animation.wait()\n this.animation = new Animation(1500, () => { /* pass */ }, '', () => {\n if (this.currentForm === this.page.checkmarkForm) this.closePopups()\n })\n }\n\n // exportAccount exports and downloads the account info.\n async exportAccount () {\n const { page, host } = this\n const req = { host }\n const loaded = app().loading(this.body)\n const res = await postJSON('/api/exportaccount', req)\n loaded()\n if (!app().checkResponse(res)) {\n page.exportAccountErr.textContent = res.msg\n Doc.show(page.exportAccountErr)\n return\n }\n res.account.bonds = res.bonds // maintain backward compat of JSON file\n const accountForExport = JSON.parse(JSON.stringify(res.account))\n const a = document.createElement('a')\n a.setAttribute('download', 'dcrAccount-' + host + '.json')\n a.setAttribute('href', 'data:text/json,' + JSON.stringify(accountForExport, null, 2))\n a.click()\n Doc.hide(page.forms)\n }\n\n // toggleAccountStatus enables or disables the account associated with the\n // provided host.\n async toggleAccountStatus (disable:boolean) {\n const page = this.page\n Doc.hide(page.errMsg)\n let host: string|null = this.host\n if (disable) host = page.disableAccountHost.textContent\n const req = { host, disable: disable }\n const loaded = app().loading(this.body)\n const res = await postJSON('/api/toggleaccountstatus', req)\n loaded()\n if (!app().checkResponse(res)) {\n if (disable) {\n page.disableAccountErr.textContent = res.msg\n Doc.show(page.disableAccountErr)\n } else {\n page.errMsg.textContent = res.msg\n Doc.show(page.errMsg)\n }\n return\n }\n if (disable) {\n this.page.toggleAccountStatusBtn.textContent = intl.prep(intl.ID_ENABLE_ACCOUNT)\n Doc.hide(page.forms)\n } else this.page.toggleAccountStatusBtn.textContent = intl.prep(intl.ID_DISABLE_ACCOUNT)\n\n this.accountDisabled = disable\n\n // Refresh exchange information since we've just enabled/disabled the\n // exchange.\n await app().fetchUser()\n app().loadPage(`dexsettings/${host}`)\n }\n\n async prepareAccountDisable (disableAccountForm: HTMLElement) {\n const page = this.page\n page.disableAccountHost.textContent = this.host\n page.disableAccountErr.textContent = ''\n this.showForm(disableAccountForm)\n }\n\n // Retrieve an estimate for the tx fee needed to create new bond reserves.\n async getBondsFeeBuffer (assetID: number, form: HTMLElement) {\n const loaded = app().loading(form)\n const res = await postJSON('/api/bondsfeebuffer', { assetID })\n loaded()\n if (!app().checkResponse(res)) {\n return 0\n }\n return res.feeBuffer\n }\n\n async prepareUpdateHost () {\n const page = this.page\n this.dexAddrForm.refresh()\n this.showForm(page.dexAddrForm)\n }\n\n async onCertFileChange () {\n const page = this.page\n Doc.hide(page.errMsg)\n const files = page.certFileInput.files\n let cert\n if (files && files.length) cert = await files[0].text()\n if (!cert) return\n const req = { host: this.host, cert: cert }\n const loaded = app().loading(this.body)\n const res = await postJSON('/api/updatecert', req)\n loaded()\n if (!app().checkResponse(res)) {\n page.errMsg.textContent = res.msg\n Doc.show(page.errMsg)\n } else {\n Doc.show(page.updateCertMsg)\n setTimeout(() => { Doc.hide(page.updateCertMsg) }, 5000)\n }\n }\n\n setConnectionStatus () {\n const page = this.page\n const exchange = app().user.exchanges[this.host]\n const displayIcons = (connected: boolean) => {\n if (connected) {\n Doc.hide(page.disconnectedIcon)\n Doc.show(page.connectedIcon)\n } else {\n Doc.show(page.disconnectedIcon)\n Doc.hide(page.connectedIcon)\n }\n }\n if (exchange) {\n switch (exchange.connectionStatus) {\n case ConnectionStatus.Connected:\n displayIcons(true)\n page.connectionStatus.textContent = intl.prep(intl.ID_CONNECTED)\n break\n case ConnectionStatus.Disconnected:\n displayIcons(false)\n if (this.accountDisabled) page.connectionStatus.textContent = intl.prep(intl.ID_ACCOUNT_DISABLED_MSG)\n else page.connectionStatus.textContent = intl.prep(intl.ID_DISCONNECTED)\n break\n case ConnectionStatus.InvalidCert:\n displayIcons(false)\n page.connectionStatus.textContent = `${intl.prep(intl.ID_DISCONNECTED)} - ${intl.prep(intl.ID_INVALID_CERTIFICATE)}`\n }\n }\n }\n\n async disableAutoRenew () {\n const loaded = app().loading(this.page.otherBondSettings)\n try {\n this.updateBondOptions({ targetTier: 0 })\n loaded()\n } catch (e) {\n loaded()\n throw e\n }\n }\n\n /*\n * updateBondOptions is called when the form to update bond options is\n * submitted.\n */\n async updateBondOptions (conf: BondOptionsForm): Promise<any> {\n conf.host = this.host\n await postJSON('/api/updatebondoptions', conf)\n const targetTier = conf.targetTier ?? app().exchanges[this.host].auth.targetTier\n this.renewToggle.setState(targetTier > 0)\n }\n\n async newWalletCreated (assetID: number, tier: number) {\n this.regAssetForm.refresh()\n const user = await app().fetchUser()\n if (!user) return\n const page = this.page\n const asset = user.assets[assetID]\n const wallet = asset.wallet\n const xc = app().exchanges[this.host]\n const bondAmt = xc.bondAssets[asset.symbol].amount\n\n const bondsFeeBuffer = await this.getBondsFeeBuffer(assetID, page.newWalletForm)\n this.confirmRegisterForm.setFees(assetID, bondsFeeBuffer)\n\n if (wallet.synced && wallet.balance.available >= 2 * bondAmt + bondsFeeBuffer) {\n this.progressTierFormWithSyncedFundedWallet(assetID)\n return\n }\n\n this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)\n await this.showForm(page.walletWait)\n }\n}\n","import {\n app,\n PageElement,\n MarketWithHost\n} from './registry'\nimport { getJSON } from './http'\nimport Doc from './doc'\nimport BasePage from './basepage'\nimport { setMarketElements } from './mmutil'\n\ninterface MarketMakingRun {\n startTime: number\n market: MarketWithHost\n}\n\nexport default class MarketMakerArchivesPage extends BasePage {\n page: Record<string, PageElement>\n base: number\n quote: number\n host: string\n\n constructor (main: HTMLElement) {\n super()\n const page = this.page = Doc.idDescendants(main)\n Doc.cleanTemplates(page.runTableRowTmpl)\n Doc.bind(page.backButton, 'click', () => { app().loadPage('mm') })\n this.setup()\n }\n\n async setup () {\n const res = await getJSON('/api/archivedmmruns')\n if (!app().checkResponse(res)) {\n console.error('failed to get archived mm runs', res)\n // TODO: show error\n return\n }\n\n const runs : MarketMakingRun[] = res.runs\n\n for (let i = 0; i < runs.length; i++) {\n const { startTime, market: { baseID, quoteID, host } } = runs[i]\n const row = this.page.runTableRowTmpl.cloneNode(true) as HTMLElement\n const tmpl = Doc.parseTemplate(row)\n tmpl.startTime.textContent = new Date(startTime * 1000).toLocaleString()\n setMarketElements(row, baseID, quoteID, host)\n\n Doc.bind(tmpl.logs, 'click', () => {\n app().loadPage('mmlogs', { baseID, quoteID, host, startTime, returnPage: 'mmarchives' })\n })\n\n Doc.bind(tmpl.settings, 'click', () => {\n app().loadPage('mmsettings', { host, baseID, quoteID })\n })\n\n this.page.runTableBody.appendChild(row)\n }\n }\n}\n","import {\n app,\n PageElement,\n MarketMakingEvent,\n DEXOrderEvent,\n CEXOrderEvent,\n RunEventNote,\n RunStatsNote,\n DepositEvent,\n WithdrawalEvent,\n MarketMakingRunOverview,\n SupportedAsset,\n BalanceEffects,\n MarketWithHost,\n ProfitLoss\n} from './registry'\nimport { Forms } from './forms'\nimport { postJSON } from './http'\nimport Doc, { setupCopyBtn } from './doc'\nimport BasePage from './basepage'\nimport { setMarketElements, liveBotStatus } from './mmutil'\nimport * as intl from './locales'\nimport * as wallets from './wallets'\nimport { CoinExplorers } from './coinexplorers'\n\ninterface LogsPageParams {\n host: string\n quoteID: number\n baseID: number\n startTime: number\n returnPage: string\n}\n\nlet net = 0\n\nconst logsBatchSize = 50\n\ninterface logFilters {\n dexSells: boolean\n dexBuys: boolean\n cexSells: boolean\n cexBuys: boolean\n deposits: boolean\n withdrawals: boolean\n}\n\nfunction eventPassesFilter (e: MarketMakingEvent, filters: logFilters): boolean {\n if (e.dexOrderEvent) {\n if (e.dexOrderEvent.sell) return filters.dexSells\n return filters.dexBuys\n }\n if (e.cexOrderEvent) {\n if (e.cexOrderEvent.sell) return filters.cexSells\n return filters.cexBuys\n }\n if (e.depositEvent) return filters.deposits\n if (e.withdrawalEvent) return filters.withdrawals\n return false\n}\n\nexport default class MarketMakerLogsPage extends BasePage {\n page: Record<string, PageElement>\n mkt: MarketWithHost\n startTime: number\n fiatRates: Record<number, number>\n liveBot: boolean\n overview: MarketMakingRunOverview\n events: Record<number, [MarketMakingEvent, HTMLElement]>\n forms: Forms\n dexOrderIDCopyListener: () => void | undefined\n cexOrderIDCopyListener: () => void | undefined\n depositIDCopyListener: () => void | undefined\n withdrawalIDCopyListener: () => void | undefined\n filters: logFilters\n loading: boolean\n refID: number | undefined\n doneScrolling: boolean\n statsRows: Record<number, HTMLElement>\n\n constructor (main: HTMLElement, params: LogsPageParams) {\n super()\n const page = this.page = Doc.idDescendants(main)\n net = app().user.net\n Doc.cleanTemplates(page.eventTableRowTmpl, page.dexOrderTxRowTmpl, page.performanceTableRowTmpl)\n Doc.bind(this.page.backButton, 'click', () => { app().loadPage(params.returnPage ?? 'mm') })\n Doc.bind(this.page.filterButton, 'click', () => { this.applyFilters() })\n if (params?.host) {\n const url = new URL(window.location.href)\n url.searchParams.set('host', params.host)\n url.searchParams.set('baseID', String(params.baseID))\n url.searchParams.set('quoteID', String(params.quoteID))\n url.searchParams.set('startTime', String(params.startTime))\n window.history.replaceState({ page: 'mmsettings', ...params }, '', url)\n } else {\n const urlParams = new URLSearchParams(window.location.search)\n if (!params) params = {} as LogsPageParams\n params.host = urlParams.get('host') || ''\n params.baseID = parseInt(urlParams.get('baseID') || '0')\n params.quoteID = parseInt(urlParams.get('quoteID') || '0')\n params.startTime = parseInt(urlParams.get('startTime') || '0')\n }\n const { baseID, quoteID, host, startTime } = params\n this.startTime = startTime\n this.forms = new Forms(page.forms)\n this.events = {}\n this.statsRows = {}\n this.mkt = { baseID: baseID, quoteID: quoteID, host }\n setMarketElements(main, baseID, quoteID, host)\n Doc.bind(main, 'scroll', () => {\n if (this.loading) return\n if (this.doneScrolling) return\n const belowBottom = page.eventsTable.offsetHeight - main.offsetHeight - main.scrollTop\n if (belowBottom < 0) {\n this.nextPage()\n }\n })\n this.setup(host, baseID, quoteID)\n }\n\n async nextPage () {\n this.loading = true\n const [events, updatedLogs, overview] = await this.getRunLogs()\n const assets = this.mktAssets()\n for (const event of events) {\n if (this.events[event.id]) continue\n const row = this.newEventRow(event, false, assets)\n this.events[event.id] = [event, row]\n }\n this.populateStats(overview.profitLoss, overview.endTime)\n this.updateExistingRows(updatedLogs)\n this.loading = false\n }\n\n async getRunLogs (): Promise<[MarketMakingEvent[], MarketMakingEvent[], MarketMakingRunOverview]> {\n const { mkt, startTime } = this\n const req: any = { market: mkt, startTime, n: logsBatchSize, filters: this.filters, refID: this.refID }\n const res = await postJSON('/api/mmrunlogs', req)\n if (!app().checkResponse(res)) {\n console.error('failed to get bot logs', res)\n }\n if (res.logs.length <= 1) {\n this.doneScrolling = true\n }\n if (res.logs.length > 0) {\n this.refID = res.logs[res.logs.length - 1].id\n }\n return [res.logs, res.updatedLogs || [], res.overview]\n }\n\n async applyFilters () {\n const page = this.page\n this.filters = {\n dexSells: !!page.dexSellsCheckbox.checked,\n dexBuys: !!page.dexBuysCheckbox.checked,\n cexSells: !!page.cexSellsCheckbox.checked,\n cexBuys: !!page.cexBuysCheckbox.checked,\n deposits: !!page.depositsCheckbox.checked,\n withdrawals: !!page.withdrawalsCheckbox.checked\n }\n this.refID = undefined\n const [events, , overview] = await this.getRunLogs()\n this.populateTable(events)\n this.populateStats(overview.profitLoss, overview.endTime)\n }\n\n setFilters () {\n const page = this.page\n page.dexSellsCheckbox.checked = true\n page.dexBuysCheckbox.checked = true\n page.cexSellsCheckbox.checked = true\n page.cexBuysCheckbox.checked = true\n page.depositsCheckbox.checked = true\n page.withdrawalsCheckbox.checked = true\n this.filters = {\n dexSells: true,\n dexBuys: true,\n cexSells: true,\n cexBuys: true,\n deposits: true,\n withdrawals: true\n }\n }\n\n async setup (host: string, baseID: number, quoteID: number) {\n const page = this.page\n this.setFilters()\n const { startTime } = this\n let profitLoss: ProfitLoss\n let endTime = 0\n const botStatus = liveBotStatus(host, baseID, quoteID)\n const [events, , overview] = await this.getRunLogs()\n if (botStatus?.runStats?.startTime === startTime) {\n this.liveBot = true\n this.fiatRates = app().fiatRatesMap\n profitLoss = botStatus.runStats.profitLoss\n } else {\n this.fiatRates = overview.finalState.fiatRates\n profitLoss = overview.profitLoss\n endTime = overview.endTime\n }\n this.populateStats(profitLoss, endTime)\n const assets = this.mktAssets()\n const parentHeader = page.sumUSDHeader.parentElement\n for (const asset of assets) {\n const th = document.createElement('th') as PageElement\n th.textContent = `${asset.symbol.toUpperCase()} Delta`\n if (parentHeader) {\n parentHeader.insertBefore(th, page.sumUSDHeader)\n }\n }\n this.populateTable(events)\n\n app().registerNoteFeeder({\n runevent: (note: RunEventNote) => { this.handleRunEventNote(note) },\n runstats: (note: RunStatsNote) => { this.handleRunStatsNote(note) }\n })\n }\n\n handleRunEventNote (note: RunEventNote) {\n const { baseID, quoteID, host } = this.mkt\n if (note.host !== host || note.baseID !== baseID || note.quoteID !== quoteID) return\n if (!eventPassesFilter(note.event, this.filters)) return\n const event = note.event\n const cachedEvent = this.events[event.id]\n if (cachedEvent) {\n this.setRowContents(cachedEvent[1], event, this.mktAssets())\n cachedEvent[0] = event\n return\n }\n const row = this.newEventRow(event, true, this.mktAssets())\n this.events[event.id] = [event, row]\n }\n\n handleRunStatsNote (note: RunStatsNote) {\n const { mkt: { baseID, quoteID, host }, startTime } = this\n if (note.host !== host ||\n note.baseID !== baseID ||\n note.quoteID !== quoteID) return\n if (!note.stats || note.stats.startTime !== startTime) return\n this.populateStats(note.stats.profitLoss, 0)\n }\n\n populateStats (pl: ProfitLoss, endTime: number) {\n const page = this.page\n page.startTime.textContent = new Date(this.startTime * 1000).toLocaleString()\n if (endTime === 0) {\n Doc.hide(page.endTimeRow)\n } else {\n page.endTime.textContent = new Date(endTime * 1000).toLocaleString()\n }\n for (const assetID in pl.diffs) {\n const asset = app().assets[parseInt(assetID)]\n let row = this.statsRows[assetID]\n if (!row) {\n row = page.performanceTableRowTmpl.cloneNode(true) as HTMLElement\n const tmpl = Doc.parseTemplate(row)\n tmpl.logo.src = Doc.logoPath(asset.symbol)\n tmpl.ticker.textContent = asset.symbol.toUpperCase()\n this.statsRows[assetID] = row\n page.performanceTableBody.appendChild(row)\n }\n const diff = pl.diffs[assetID]\n const tmpl = Doc.parseTemplate(row)\n tmpl.diff.textContent = diff.fmt\n tmpl.usdDiff.textContent = diff.fmtUSD\n tmpl.fiatRate.textContent = `${Doc.formatFiatValue(this.fiatRates[asset.id])} USD`\n }\n page.profitLoss.textContent = `${Doc.formatFiatValue(pl.profit)} USD`\n }\n\n mktAssets () : SupportedAsset[] {\n const baseAsset = app().assets[this.mkt.baseID]\n const quoteAsset = app().assets[this.mkt.quoteID]\n\n const assets = [baseAsset, quoteAsset]\n const assetIDs = { [baseAsset.id]: true, [quoteAsset.id]: true }\n\n if (baseAsset.token && !assetIDs[baseAsset.token.parentID]) {\n const baseTokenAsset = app().assets[baseAsset.token.parentID]\n assetIDs[baseTokenAsset.id] = true\n assets.push(baseTokenAsset)\n }\n\n if (quoteAsset.token && !assetIDs[quoteAsset.token.parentID]) {\n const quoteTokenAsset = app().assets[quoteAsset.token.parentID]\n assets.push(quoteTokenAsset)\n }\n\n return assets\n }\n\n updateExistingRows (updatedLogs: MarketMakingEvent[]) {\n for (const event of updatedLogs) {\n const cachedEvent = this.events[event.id]\n if (!cachedEvent) continue\n this.setRowContents(cachedEvent[1], event, this.mktAssets())\n cachedEvent[0] = event\n }\n }\n\n populateTable (events: MarketMakingEvent[]) {\n const page = this.page\n Doc.empty(page.eventsTableBody)\n this.events = {}\n this.doneScrolling = false\n const assets = this.mktAssets()\n for (const event of events) {\n const row = this.newEventRow(event, false, assets)\n this.events[event.id] = [event, row]\n }\n }\n\n setRowContents (row: HTMLElement, event: MarketMakingEvent, assets: SupportedAsset[]) {\n const tmpl = Doc.parseTemplate(row)\n tmpl.time.textContent = (new Date(event.timestamp * 1000)).toLocaleString()\n tmpl.eventType.textContent = this.eventType(event)\n let id\n if (event.depositEvent) {\n id = event.depositEvent.transaction.id\n } else if (event.withdrawalEvent) {\n id = event.withdrawalEvent.id\n } else if (event.dexOrderEvent) {\n id = event.dexOrderEvent.id\n } else if (event.cexOrderEvent) {\n id = event.cexOrderEvent.id\n }\n if (id) {\n tmpl.eventID.textContent = trimStringWithEllipsis(id, 30)\n tmpl.eventID.setAttribute('title', id)\n }\n let usd = 0\n for (const asset of assets) {\n const be = event.balanceEffects\n const sum = sumBalanceEffects(asset.id, be)\n const tmplID = `sum${asset.symbol.toUpperCase()}`\n let el : PageElement\n if (tmpl[tmplID]) {\n el = tmpl[tmplID]\n } else {\n el = document.createElement('td')\n el.dataset.tmpl = tmplID\n const parent = tmpl.sumUSD.parentElement\n if (parent) {\n parent.insertBefore(el, tmpl.sumUSD)\n }\n }\n el.textContent = Doc.formatCoinValue(sum, asset.unitInfo)\n const factor = asset.unitInfo.conventional.conversionFactor\n usd += sum / factor * this.fiatRates[asset.id] ?? 0\n }\n tmpl.sumUSD.textContent = Doc.formatFourSigFigs(usd)\n Doc.bind(tmpl.details, 'click', () => { this.showEventDetails(event.id) })\n }\n\n newEventRow (event: MarketMakingEvent, prepend: boolean, assets: SupportedAsset[]) : HTMLElement {\n const page = this.page\n const row = page.eventTableRowTmpl.cloneNode(true) as HTMLElement\n row.id = event.id.toString()\n this.setRowContents(row, event, assets)\n if (prepend) {\n page.eventsTableBody.insertBefore(row, page.eventsTableBody.firstChild)\n } else {\n page.eventsTableBody.appendChild(row)\n }\n return row\n }\n\n eventType (event: MarketMakingEvent) : string {\n if (event.depositEvent) {\n return 'Deposit'\n } else if (event.withdrawalEvent) {\n return 'Withdrawal'\n } else if (event.dexOrderEvent) {\n return event.dexOrderEvent.sell ? 'DEX Sell' : 'DEX Buy'\n } else if (event.cexOrderEvent) {\n return event.cexOrderEvent.sell ? 'CEX Sell' : 'CEX Buy'\n }\n\n return ''\n }\n\n showDexOrderEventDetails (event: DEXOrderEvent) {\n const { page, mkt: { baseID, quoteID } } = this\n const baseAsset = app().assets[baseID]\n const quoteAsset = app().assets[quoteID]\n const [bui, qui] = [baseAsset.unitInfo, quoteAsset.unitInfo]\n const [baseTicker, quoteTicker] = [bui.conventional.unit, qui.conventional.unit]\n if (this.dexOrderIDCopyListener !== undefined) {\n page.copyDexOrderID.removeEventListener('click', this.dexOrderIDCopyListener)\n }\n this.dexOrderIDCopyListener = () => { setupCopyBtn(event.id, page.dexOrderID, page.copyDexOrderID, '#1e7d11') }\n page.copyDexOrderID.addEventListener('click', this.dexOrderIDCopyListener)\n page.dexOrderID.textContent = trimStringWithEllipsis(event.id, 20)\n page.dexOrderID.setAttribute('title', event.id)\n const rate = app().conventionalRate(baseID, quoteID, event.rate)\n\n page.dexOrderRate.textContent = `${rate} ${baseTicker}/${quoteTicker}`\n page.dexOrderQty.textContent = `${event.qty / bui.conventional.conversionFactor} ${baseTicker}`\n if (event.sell) {\n page.dexOrderSide.textContent = intl.prep(intl.ID_SELL)\n } else {\n page.dexOrderSide.textContent = intl.prep(intl.ID_BUY)\n }\n Doc.empty(page.dexOrderTxsTableBody)\n Doc.setVis(event.transactions && event.transactions.length > 0, page.dexOrderTxsTable)\n const txAsset = (txType: number, sell: boolean) : SupportedAsset | undefined => {\n switch (txType) {\n case wallets.txTypeSwap:\n case wallets.txTypeRefund:\n case wallets.txTypeSplit:\n return sell ? baseAsset : quoteAsset\n case wallets.txTypeRedeem:\n return sell ? quoteAsset : baseAsset\n }\n }\n\n for (let i = 0; event.transactions && i < event.transactions.length; i++) {\n const tx = event.transactions[i]\n const row = page.dexOrderTxRowTmpl.cloneNode(true) as HTMLElement\n const tmpl = Doc.parseTemplate(row)\n tmpl.id.textContent = trimStringWithEllipsis(tx.id, 20)\n tmpl.id.setAttribute('title', tx.id)\n tmpl.type.textContent = wallets.txTypeString(tx.type)\n const asset = txAsset(tx.type, event.sell)\n if (!asset) {\n console.error('unexpected tx type in dex order event', tx.type)\n continue\n }\n const assetExplorer = CoinExplorers[asset.id]\n if (assetExplorer && assetExplorer[net]) {\n tmpl.explorerLink.href = assetExplorer[net](tx.id)\n }\n tmpl.amt.textContent = `${Doc.formatCoinValue(tx.amount, asset.unitInfo)} ${asset.unitInfo.conventional.unit.toLowerCase()}`\n tmpl.fees.textContent = `${Doc.formatCoinValue(tx.fees, asset.unitInfo)} ${asset.unitInfo.conventional.unit.toLowerCase()}`\n page.dexOrderTxsTableBody.appendChild(row)\n }\n this.forms.show(page.dexOrderDetailsForm)\n }\n\n showCexOrderEventDetails (event: CEXOrderEvent) {\n const { page, mkt: { baseID, quoteID } } = this\n const baseAsset = app().assets[baseID]\n const quoteAsset = app().assets[quoteID]\n const [bui, qui] = [baseAsset.unitInfo, quoteAsset.unitInfo]\n const [baseTicker, quoteTicker] = [bui.conventional.unit, qui.conventional.unit]\n\n page.cexOrderID.textContent = trimStringWithEllipsis(event.id, 20)\n if (this.cexOrderIDCopyListener !== undefined) {\n page.copyCexOrderID.removeEventListener('click', this.cexOrderIDCopyListener)\n }\n this.cexOrderIDCopyListener = () => { setupCopyBtn(event.id, page.cexOrderID, page.copyCexOrderID, '#1e7d11') }\n page.copyCexOrderID.addEventListener('click', this.cexOrderIDCopyListener)\n page.cexOrderID.setAttribute('title', event.id)\n const rate = app().conventionalRate(baseID, quoteID, event.rate)\n page.cexOrderRate.textContent = `${rate} ${baseTicker}/${quoteTicker}`\n page.cexOrderQty.textContent = `${event.qty / bui.conventional.conversionFactor} ${baseTicker}`\n if (event.sell) {\n page.cexOrderSide.textContent = intl.prep(intl.ID_SELL)\n } else {\n page.cexOrderSide.textContent = intl.prep(intl.ID_BUY)\n }\n page.cexOrderBaseFilled.textContent = `${event.baseFilled / bui.conventional.conversionFactor} ${baseTicker}`\n page.cexOrderQuoteFilled.textContent = `${event.quoteFilled / qui.conventional.conversionFactor} ${quoteTicker}`\n this.forms.show(page.cexOrderDetailsForm)\n }\n\n showDepositEventDetails (event: DepositEvent, pending: boolean) {\n const page = this.page\n page.depositID.textContent = trimStringWithEllipsis(event.transaction.id, 20)\n if (this.depositIDCopyListener !== undefined) {\n page.copyDepositID.removeEventListener('click', this.depositIDCopyListener)\n }\n this.depositIDCopyListener = () => { setupCopyBtn(event.transaction.id, page.depositID, page.copyDepositID, '#1e7d11') }\n page.copyDepositID.addEventListener('click', this.depositIDCopyListener)\n page.depositID.setAttribute('title', event.transaction.id)\n const unitInfo = app().assets[event.assetID].unitInfo\n const unit = unitInfo.conventional.unit\n page.depositAmt.textContent = `${Doc.formatCoinValue(event.transaction.amount, unitInfo)} ${unit}`\n page.depositFees.textContent = `${Doc.formatCoinValue(event.transaction.fees, unitInfo)} ${unit}`\n page.depositStatus.textContent = pending ? intl.prep(intl.ID_PENDING) : intl.prep(intl.ID_COMPLETE)\n Doc.setVis(!pending, page.depositCreditSection)\n if (!pending) {\n page.depositCredit.textContent = `${Doc.formatCoinValue(event.cexCredit, unitInfo)} ${unit}`\n }\n this.forms.show(page.depositDetailsForm)\n }\n\n showWithdrawalEventDetails (event: WithdrawalEvent, pending: boolean) {\n const page = this.page\n page.withdrawalID.textContent = trimStringWithEllipsis(event.id, 20)\n if (this.withdrawalIDCopyListener !== undefined) {\n page.copyWithdrawalID.removeEventListener('click', this.withdrawalIDCopyListener)\n }\n this.withdrawalIDCopyListener = () => { setupCopyBtn(event.id, page.withdrawalID, page.copyWithdrawalID, '#1e7d11') }\n page.copyWithdrawalID.addEventListener('click', this.withdrawalIDCopyListener)\n page.withdrawalID.setAttribute('title', event.id)\n const unitInfo = app().assets[event.assetID].unitInfo\n const unit = unitInfo.conventional.unit\n page.withdrawalAmt.textContent = `${Doc.formatCoinValue(event.cexDebit, unitInfo)} ${unit}`\n page.withdrawalStatus.textContent = pending ? intl.prep(intl.ID_PENDING) : intl.prep(intl.ID_COMPLETE)\n if (event.transaction) {\n page.withdrawalTxID.textContent = trimStringWithEllipsis(event.transaction.id, 20)\n page.withdrawalTxID.setAttribute('title', event.transaction.id)\n page.withdrawalReceived.textContent = `${Doc.formatCoinValue(event.transaction.amount, unitInfo)} ${unit}`\n }\n this.forms.show(page.withdrawalDetailsForm)\n }\n\n showEventDetails (eventID: number) {\n const [event] = this.events[eventID]\n if (event.dexOrderEvent) this.showDexOrderEventDetails(event.dexOrderEvent)\n if (event.cexOrderEvent) this.showCexOrderEventDetails(event.cexOrderEvent)\n if (event.depositEvent) this.showDepositEventDetails(event.depositEvent, event.pending)\n if (event.withdrawalEvent) this.showWithdrawalEventDetails(event.withdrawalEvent, event.pending)\n }\n}\n\nfunction trimStringWithEllipsis (str: string, maxLen: number): string {\n if (str.length <= maxLen) return str\n return `${str.substring(0, maxLen / 2)}...${str.substring(str.length - maxLen / 2)}`\n}\n\nfunction sumBalanceEffects (assetID: number, be: BalanceEffects): number {\n let sum = 0\n if (be.settled[assetID]) sum += be.settled[assetID]\n if (be.pending[assetID]) sum += be.pending[assetID]\n if (be.locked[assetID]) sum += be.locked[assetID]\n if (be.reserved[assetID]) sum += be.reserved[assetID]\n return sum\n}\n","import Doc from './doc'\nimport BasePage from './basepage'\nimport { postJSON } from './http'\nimport * as intl from './locales'\nimport {\n bind as bindForm,\n slideSwap\n} from './forms'\nimport { Wave } from './charts'\nimport {\n app,\n PageElement,\n SupportedAsset,\n User,\n WalletInfo,\n WalletDefinition,\n ConfigOption,\n APIResponse\n} from './registry'\n\ninterface InitResponse extends APIResponse {\n hosts: string[]\n mnemonic?: string\n}\n\n/*\n * InitPage is the page handler for the /init view. InitPage is essentially a\n * form handler. There are no non-form elements on /init. InitPage additionally\n * has a role caching the initialization password. A couple of notes about\n * InitPage.\n * 1) There is no going backwards. Once you set a password, you can't go back\n * to the password form. If you refresh, you won't end up on /init, so\n * won't have access to the QuickConfigForm or SeedBackupForm . Once you\n * submit your auto-config choices, you can't change them. This has\n * implications for coding and UI. There are no \"go back\" or \"close form\"\n * elements.\n * 2) The user can preclude auto-config and seed backup by clicking an\n * available header link after password init, e.g. Wallets, in the page\n * header. NOTE: Regardless of what the user does after setting the app\n * pass, they will receive a notification reminding them to back up their\n * seed. Perhaps it would be better to somehow delay that message until\n * they choose to ignore the seed backup dialog, but having more reminders\n * is also okay.\n */\nexport default class InitPage extends BasePage {\n body: HTMLElement\n page: Record<string, PageElement>\n initForm: AppInitForm\n quickConfigForm: QuickConfigForm\n seedBackupForm: SeedBackupForm\n mnemonic?: string\n\n constructor (body: HTMLElement) {\n super()\n this.body = body\n const page = this.page = Doc.idDescendants(body)\n this.initForm = new AppInitForm(page.appPWForm, (pw: string, hosts: string[], mnemonic?: string) => { this.appInited(pw, hosts, mnemonic) })\n this.quickConfigForm = new QuickConfigForm(page.quickConfigForm, () => this.quickConfigDone())\n this.seedBackupForm = new SeedBackupForm(page.seedBackupForm, () => this.seedBackedUp())\n }\n\n async appInited (pw: string, hosts: string[], mnemonic?: string) {\n this.mnemonic = mnemonic\n const page = this.page\n await this.quickConfigForm.update(pw, hosts)\n if (mnemonic) this.seedBackupForm.update(mnemonic)\n slideSwap(page.appPWForm, page.quickConfigForm)\n }\n\n quickConfigDone () {\n if (!this.mnemonic) app().loadPage('wallets')\n else slideSwap(this.page.quickConfigForm, this.page.seedBackupForm)\n }\n\n seedBackedUp () {\n app().loadPage('wallets')\n }\n}\n\n/*\n * The AppInitForm handles the form that sets the app password, accepts an\n * optional seed, and initializes the app.\n */\nclass AppInitForm {\n form: PageElement\n page: Record<string, PageElement>\n success: (pw: string, hosts: string[], mnemonic?: string) => void\n\n constructor (form: PageElement, success: (pw: string, hosts: string[], mnemonic?: string) => void) {\n this.form = form\n this.success = success\n const page = this.page = Doc.idDescendants(form)\n bindForm(form, page.appPWSubmit, () => this.setAppPass())\n bindForm(form, page.toggleSeedInput, () => {\n if (Doc.isHidden(page.seedInputBox)) {\n page.toggleSeedInputIcon.classList.remove('ico-plus')\n page.toggleSeedInputIcon.classList.add('ico-minus')\n Doc.show(page.seedInputBox)\n } else {\n page.toggleSeedInputIcon.classList.remove('ico-minus')\n page.toggleSeedInputIcon.classList.add('ico-plus')\n Doc.hide(page.seedInputBox)\n }\n })\n }\n\n /* Set the application password. Attached to form submission. */\n async setAppPass () {\n const page = this.page\n Doc.hide(page.appPWErrMsg)\n const pw = page.appPW.value || ''\n const pwAgain = page.appPWAgain.value\n if (pw === '') {\n page.appPWErrMsg.textContent = intl.prep(intl.ID_NO_PASS_ERROR_MSG)\n Doc.show(page.appPWErrMsg)\n return\n }\n if (pw !== pwAgain) {\n page.appPWErrMsg.textContent = intl.prep(intl.ID_PASSWORD_NOT_MATCH)\n Doc.show(page.appPWErrMsg)\n return\n }\n\n page.appPW.value = ''\n page.appPWAgain.value = ''\n const loaded = app().loading(this.form)\n // const seed = page.seedInput.value?.replace(/\\s+/g, '') // strip whitespace\n const seed = page.seedInput.value ?? ''\n const res: InitResponse = await postJSON('/api/init', {\n pass: pw,\n seed: seed\n })\n loaded()\n if (!app().checkResponse(res)) {\n page.appPWErrMsg.textContent = res.msg\n Doc.show(page.appPWErrMsg)\n return\n }\n this.success(pw, res.hosts, res.mnemonic)\n }\n}\n\n// HostConfigRow is used by the QuickConfigForm to track the user's choices.\ninterface HostConfigRow {\n host: string\n checkbox: HTMLInputElement\n}\n\n// WalletConfigRow is used by the QuickConfigForm to track the user's choices.\ninterface WalletConfigRow {\n asset: SupportedAsset\n type: string\n checkbox: HTMLInputElement\n}\n\nlet rowIDCounter = 0\n\n/*\n * QuickConfigForm handles the form that allows users to quickly configure\n * view-only servers and native wallets (that don't require any configuration).\n */\nclass QuickConfigForm {\n page: Record<string, PageElement>\n form: PageElement\n servers: HostConfigRow[]\n wallets: WalletConfigRow[]\n pw: string\n success: () => void\n\n constructor (form: PageElement, success: () => void) {\n this.form = form\n this.success = success\n const page = this.page = Doc.idDescendants(form)\n Doc.cleanTemplates(page.qcServerTmpl, page.qcWalletTmpl)\n bindForm(form, page.quickConfigSubmit, () => { this.submit() })\n bindForm(form, page.qcErrAck, () => { this.success() })\n }\n\n async update (pw: string, hosts: string[]) {\n this.pw = pw\n const page = this.page\n\n this.servers = []\n for (const host of hosts) {\n const row = page.qcServerTmpl.cloneNode(true) as PageElement\n page.qcServersBox.appendChild(row)\n const tmpl = Doc.parseTemplate(row)\n rowIDCounter++\n const rowID = `qcsrow${rowIDCounter}`\n row.htmlFor = rowID\n tmpl.checkbox.id = rowID\n tmpl.host.textContent = host\n this.servers.push({ host, checkbox: tmpl.checkbox as HTMLInputElement })\n }\n\n const u = await app().fetchUser() as User\n this.wallets = []\n for (const a of Object.values(u.assets)) {\n if (a.token) continue\n const winfo = a.info as WalletInfo\n let autoConfigurable: WalletDefinition | null = null\n for (const wDef of winfo.availablewallets) {\n if (!wDef.seeded) continue\n if (wDef.configopts && wDef.configopts.some((opt: ConfigOption) => opt.required)) continue\n autoConfigurable = wDef\n break\n }\n if (!autoConfigurable) continue\n const row = page.qcWalletTmpl.cloneNode(true) as PageElement\n page.qcWalletsBox.appendChild(row)\n const tmpl = Doc.parseTemplate(row)\n rowIDCounter++\n const rowID = `qcwrow${rowIDCounter}`\n row.htmlFor = rowID\n tmpl.checkbox.id = rowID\n tmpl.icon.src = Doc.logoPath(a.symbol)\n tmpl.name.textContent = a.name\n this.wallets.push({\n asset: a,\n type: autoConfigurable.type,\n checkbox: tmpl.checkbox as HTMLInputElement\n })\n }\n }\n\n async submit () {\n const [failedHosts, failedWallets]: [string[], string[]] = [[], []]\n const ani = new Wave(this.form, { backgroundColor: true, message: '...' })\n ani.opts.message = intl.prep(intl.ID_ADDING_SERVERS)\n const connectServer = async (srvRow: HostConfigRow) => {\n if (!srvRow.checkbox.checked) return\n const req = {\n addr: srvRow.host,\n appPW: this.pw\n }\n const res = await postJSON('/api/adddex', req) // DRAFT NOTE: ignore errors ok?\n if (!app().checkResponse(res)) failedHosts.push(srvRow.host)\n }\n await Promise.all(this.servers.map(connectServer))\n\n ani.opts.message = intl.prep(intl.ID_CREATING_WALLETS)\n const createWallet = async (walletRow: WalletConfigRow) => {\n const { asset: a, type, checkbox } = walletRow\n if (!checkbox.checked) return\n const config: Record<string, string> = {}\n const walletDef = app().walletDefinition(a.id, type)\n for (const opt of (walletDef.configopts ?? [])) {\n if (!opt.default) continue\n if (opt.isboolean) {\n config[opt.key] = opt.default ? '1' : '0'\n continue\n }\n if (opt.repeatable && config[opt.key]) config[opt.key] += opt.repeatable + opt.default\n else config[opt.key] = String(opt.default)\n }\n const createForm = {\n assetID: a.id,\n appPass: this.pw,\n config: config,\n walletType: type\n }\n const res = await postJSON('/api/newwallet', createForm)\n if (!app().checkResponse(res)) failedWallets.push(a.name)\n }\n await Promise.all(this.wallets.map(createWallet))\n\n ani.stop()\n await app().fetchUser() // Calls updateMenuItemsDisplay internally\n if (failedWallets.length + failedHosts.length === 0) return this.success()\n\n const page = this.page\n Doc.hide(page.qcChoices)\n Doc.show(page.qcErrors)\n\n if (failedHosts.length) {\n for (const host of failedHosts) {\n page.qcServerErrorList.appendChild(document.createTextNode(host))\n page.qcServerErrorList.appendChild(document.createElement('br'))\n }\n } else Doc.hide(page.qcServerErrors)\n\n if (failedWallets.length) {\n for (const name of failedWallets) {\n page.qcWalletErrorList.appendChild(document.createTextNode(name))\n page.qcWalletErrorList.appendChild(document.createElement('br'))\n }\n } else Doc.hide(page.qcWalletErrors)\n }\n}\n\n/*\n * SeedBackupForm handles the form that allows the user to back up their seed\n * during initialization.\n */\nclass SeedBackupForm {\n form: PageElement\n page: Record<string, PageElement>\n mnemonic: string\n\n constructor (form: PageElement, success: () => void) {\n this.form = form\n const page = this.page = Doc.idDescendants(form)\n bindForm(form, page.seedAck, () => success())\n bindForm(form, page.showSeed, () => this.showSeed())\n }\n\n update (mnemonic: string) {\n this.mnemonic = mnemonic\n }\n\n showSeed () {\n const page = this.page\n page.mnemonic.textContent = this.mnemonic // `${words.slice(0, 5).join(' ')}\\n${words.slice(5, 10).join(' ')}\\n${words.slice(10,15).join(' ')}`\n Doc.hide(page.sbWanna)\n Doc.show(page.sbSeed)\n }\n}\n","import Doc from './doc'\nimport State from './state'\nimport RegistrationPage from './register'\nimport LoginPage from './login'\nimport WalletsPage, { txTypeString } from './wallets'\nimport SettingsPage from './settings'\nimport MarketsPage from './markets'\nimport OrdersPage from './orders'\nimport OrderPage from './order'\nimport MarketMakerPage from './mm'\nimport MarketMakerSettingsPage from './mmsettings'\nimport DexSettingsPage from './dexsettings'\nimport MarketMakerArchivesPage from './mmarchives'\nimport MarketMakerLogsPage from './mmlogs'\nimport InitPage from './init'\nimport { MM } from './mmutil'\nimport { RateEncodingFactor, StatusExecuted, hasActiveMatches } from './orderutil'\nimport { getJSON, postJSON, Errors } from './http'\nimport * as ntfn from './notifications'\nimport ws from './ws'\nimport * as intl from './locales'\nimport {\n User,\n SupportedAsset,\n Exchange,\n WalletState,\n BondNote,\n ReputationNote,\n CoreNote,\n OrderNote,\n Market,\n Order,\n Match,\n BalanceNote,\n WalletConfigNote,\n WalletSyncNote,\n MatchNote,\n ConnEventNote,\n SpotPriceNote,\n UnitInfo,\n WalletDefinition,\n WalletBalance,\n LogMessage,\n NoteElement,\n BalanceResponse,\n APIResponse,\n RateNote,\n InFlightOrder,\n WalletTransaction,\n TxHistoryResult,\n WalletNote,\n TransactionNote,\n PageElement,\n ActionRequiredNote,\n ActionResolvedNote,\n TransactionActionNote,\n CoreActionRequiredNote,\n RejectedRedemptionData,\n MarketMakingStatus,\n RunStatsNote,\n MMBotStatus,\n CEXNotification,\n CEXBalanceUpdate,\n EpochReportNote,\n CEXProblemsNote\n} from './registry'\nimport { setCoinHref } from './coinexplorers'\n\nconst idel = Doc.idel // = element by id\nconst bind = Doc.bind\nconst unbind = Doc.unbind\n\nconst notificationRoute = 'notify'\nconst noteCacheSize = 100\n\ninterface Page {\n unload (): void\n}\n\ninterface PageClass {\n new (main: HTMLElement, data: any): Page;\n}\n\ninterface CoreNotePlus extends CoreNote {\n el: HTMLElement // Added in app\n}\n\ninterface UserResponse extends APIResponse {\n user?: User\n lang: string\n langs: string[]\n inited: boolean\n mmStatus: MarketMakingStatus\n}\n\n/* constructors is a map to page constructors. */\nconst constructors: Record<string, PageClass> = {\n login: LoginPage,\n register: RegistrationPage,\n markets: MarketsPage,\n wallets: WalletsPage,\n settings: SettingsPage,\n orders: OrdersPage,\n order: OrderPage,\n dexsettings: DexSettingsPage,\n init: InitPage,\n mm: MarketMakerPage,\n mmsettings: MarketMakerSettingsPage,\n mmarchives: MarketMakerArchivesPage,\n mmlogs: MarketMakerLogsPage\n}\n\ninterface LangData {\n name: string\n flag: string\n}\n\nconst languageData: Record<string, LangData> = {\n 'en-US': {\n name: 'English',\n flag: '🇺🇸' // Not 🇬🇧. MURICA!\n },\n 'pt-BR': {\n name: 'Portugese',\n flag: '🇧🇷'\n },\n 'zh-CN': {\n name: 'Chinese',\n flag: '🇨🇳'\n },\n 'pl-PL': {\n name: 'Polish',\n flag: '🇵🇱'\n },\n 'de-DE': {\n name: 'German',\n flag: '🇩🇪'\n },\n 'ar': {\n name: 'Arabic',\n flag: '🇪🇬' // Egypt I guess\n }\n}\n\ninterface requiredAction {\n div: PageElement\n stamp: number\n uniqueID: string\n actionID: string\n selected: boolean\n}\n\n// Application is the main javascript web application for Bison Wallet.\nexport default class Application {\n notes: CoreNotePlus[]\n pokes: CoreNotePlus[]\n langs: string[]\n lang: string\n mmStatus: MarketMakingStatus\n inited: boolean\n authed: boolean\n user: User\n seedGenTime: number\n commitHash: string\n showPopups: boolean\n loggers: Record<string, boolean>\n recorders: Record<string, LogMessage[]>\n main: HTMLElement\n header: HTMLElement\n headerSpace: HTMLElement\n assets: Record<number, SupportedAsset>\n exchanges: Record<string, Exchange>\n walletMap: Record<number, WalletState>\n fiatRatesMap: Record<number, number>\n tooltip: HTMLElement\n page: Record<string, HTMLElement>\n loadedPage: Page | null\n popupNotes: HTMLElement\n popupTmpl: HTMLElement\n noteReceivers: Record<string, (n: CoreNote) => void>[]\n txHistoryMap: Record<number, TxHistoryResult>\n requiredActions: Record<string, requiredAction>\n\n constructor () {\n this.notes = []\n this.pokes = []\n this.seedGenTime = 0\n this.commitHash = process.env.COMMITHASH || ''\n this.noteReceivers = []\n this.fiatRatesMap = {}\n this.showPopups = State.fetchLocal(State.popupsLK) === '1'\n this.txHistoryMap = {}\n this.requiredActions = {}\n\n console.log('Bison Wallet, Build', this.commitHash.substring(0, 7))\n\n // Set Bootstrap dark theme attribute if dark mode is enabled.\n if (State.isDark()) {\n document.body.classList.add('dark')\n }\n\n // Loggers can be enabled by setting a truthy value to the loggerID using\n // enableLogger. Settings are stored across sessions. See docstring for the\n // log method for more info.\n this.loggers = State.fetchLocal(State.loggersLK) || {}\n window.enableLogger = (loggerID, state) => {\n if (state) this.loggers[loggerID] = true\n else delete this.loggers[loggerID]\n State.storeLocal(State.loggersLK, this.loggers)\n return `${loggerID} logger ${state ? 'enabled' : 'disabled'}`\n }\n // Enable logging from anywhere.\n window.log = (loggerID, ...a) => { this.log(loggerID, ...a) }\n window.mmStatus = () => this.mmStatus\n\n // Recorders can record log messages, and then save them to file on request.\n const recorderKeys = State.fetchLocal(State.recordersLK) || []\n this.recorders = {}\n for (const loggerID of recorderKeys) {\n console.log('recording', loggerID)\n this.recorders[loggerID] = []\n }\n window.recordLogger = (loggerID, on) => {\n if (on) this.recorders[loggerID] = []\n else delete this.recorders[loggerID]\n State.storeLocal(State.recordersLK, Object.keys(this.recorders))\n return `${loggerID} recorder ${on ? 'enabled' : 'disabled'}`\n }\n window.dumpLogger = loggerID => {\n const record = this.recorders[loggerID]\n if (!record) return `no recorder for logger ${loggerID}`\n const a = document.createElement('a')\n a.href = `data:application/octet-stream;base64,${window.btoa(JSON.stringify(record, null, 4))}`\n a.download = `${loggerID}.json`\n document.body.appendChild(a)\n a.click()\n setTimeout(() => {\n document.body.removeChild(a)\n }, 0)\n }\n\n window.user = () => this.user\n }\n\n /**\n * Start the application. This is the only thing done from the index.js entry\n * point. Read the id = main element and attach handlers.\n */\n async start () {\n // Handle back navigation from the browser.\n bind(window, 'popstate', (e: PopStateEvent) => {\n const page = e.state?.page\n if (!page && page !== '') return\n this.loadPage(page, e.state.data, true)\n })\n // The main element is the interchangeable part of the page that doesn't\n // include the header. Main should define a data-handler attribute\n // associated with one of the available constructors.\n this.main = idel(document, 'main')\n const handler = this.main.dataset.handler\n // Don't fetch the user until we know what page we're on.\n await this.fetchUser()\n const ignoreCachedLocale = process.env.NODE_ENV === 'development'\n await intl.loadLocale(this.lang, this.commitHash, ignoreCachedLocale)\n // The application is free to respond with a page that differs from the\n // one requested in the omnibox, e.g. routing though a login page. Set the\n // current URL state based on the actual page.\n const url = new URL(window.location.href)\n if (handlerFromPath(url.pathname) !== handler) {\n url.pathname = `/${handler}`\n url.search = ''\n window.history.replaceState({ page: handler }, '', url)\n }\n // Attach stuff.\n this.attachHeader()\n this.attachActions()\n this.attachCommon(this.header)\n this.attach({})\n\n // If we are authed, populate notes, otherwise get we'll them from the login\n // response.\n if (this.authed) await this.fetchNotes()\n this.updateMenuItemsDisplay()\n // initialize desktop notifications\n ntfn.fetchDesktopNtfnSettings()\n // Connect the websocket and register the notification route.\n ws.connect(getSocketURI(), () => this.reconnected())\n ws.registerRoute(notificationRoute, (note: CoreNote) => {\n this.notify(note)\n })\n }\n\n /*\n * reconnected is called by the websocket client when a reconnection is made.\n */\n reconnected () {\n if (this.main?.dataset.handler === 'settings') window.location.assign('/')\n else window.location.reload() // This triggers another websocket disconnect/connect (!)\n // a fetchUser() and loadPage(window.history.state.page) might work\n }\n\n /*\n * Fetch and save the user, which is the primary core state that must be\n * maintained by the Application.\n */\n async fetchUser (): Promise<User | void> {\n const resp: UserResponse = await getJSON('/api/user')\n if (!this.checkResponse(resp)) return\n this.inited = resp.inited\n this.authed = Boolean(resp.user)\n this.lang = resp.lang\n this.langs = resp.langs\n this.mmStatus = resp.mmStatus\n if (!resp.user) return\n const user = resp.user\n this.seedGenTime = user.seedgentime\n this.user = user\n this.assets = user.assets\n this.exchanges = user.exchanges\n this.walletMap = {}\n this.fiatRatesMap = user.fiatRates\n for (const [assetID, asset] of (Object.entries(user.assets) as [any, SupportedAsset][])) {\n if (asset.wallet) {\n this.walletMap[assetID] = asset.wallet\n }\n }\n\n this.updateMenuItemsDisplay()\n return user\n }\n\n async fetchMMStatus () {\n this.mmStatus = await MM.status()\n }\n\n /* Load the page from the server. Insert and bind the DOM. */\n async loadPage (page: string, data?: any, skipPush?: boolean): Promise<boolean> {\n // Close some menus and tooltips.\n this.tooltip.style.left = '-10000px'\n Doc.hide(this.page.noteBox, this.page.profileBox)\n // Parse the request.\n const url = new URL(`/${page}`, window.location.origin)\n const requestedHandler = handlerFromPath(page)\n // Fetch and parse the page.\n const response = await window.fetch(url.toString())\n if (!response.ok) return false\n const html = await response.text()\n const doc = Doc.noderize(html)\n const main = idel(doc, 'main')\n const delivered = main.dataset.handler\n // Append the request to the page history.\n if (!skipPush) {\n const path = delivered === requestedHandler ? url.toString() : `/${delivered}`\n window.history.pushState({ page: page, data: data }, '', path)\n }\n // Insert page and attach handlers.\n document.title = doc.title\n this.main.replaceWith(main)\n this.main = main\n this.noteReceivers = []\n Doc.empty(this.headerSpace)\n this.attach(data)\n return true\n }\n\n /* attach binds the common handlers and calls the page constructor. */\n attach (data: any) {\n const handlerID = this.main.dataset.handler\n if (!handlerID) {\n console.error('cannot attach to content with no specified handler')\n return\n }\n this.attachCommon(this.main)\n if (this.loadedPage) this.loadedPage.unload()\n const constructor = constructors[handlerID]\n if (constructor) this.loadedPage = new constructor(this.main, data)\n else this.loadedPage = null\n\n // Bind the tooltips.\n this.bindTooltips(this.main)\n\n if (window.isWebview) {\n // Bind webview URL handlers\n this.bindUrlHandlers(this.main)\n }\n\n this.bindUnits(this.main)\n }\n\n bindTooltips (ancestor: HTMLElement) {\n ancestor.querySelectorAll('[data-tooltip]').forEach((el: HTMLElement) => {\n bind(el, 'mouseenter', () => {\n this.tooltip.textContent = el.dataset.tooltip || ''\n const lyt = Doc.layoutMetrics(el)\n let left = lyt.centerX - this.tooltip.offsetWidth / 2\n if (left < 0) left = 5\n if (left + this.tooltip.offsetWidth > document.body.offsetWidth) {\n left = document.body.offsetWidth - this.tooltip.offsetWidth - 5\n }\n this.tooltip.style.left = `${left}px`\n this.tooltip.style.top = `${lyt.bodyTop - this.tooltip.offsetHeight - 5}px`\n })\n bind(el, 'mouseleave', () => {\n this.tooltip.style.left = '-10000px'\n })\n })\n }\n\n /*\n * bindUnits binds a hovering unit selection menu to the value or rate\n * display elements. The menu gives users an option to convert the value\n * to their preferred units.\n */\n bindUnits (main: PageElement) {\n const div = document.createElement('div') as PageElement\n div.classList.add('position-absolute', 'p-3')\n // div.style.backgroundColor = 'yellow'\n const rows = document.createElement('div') as PageElement\n div.appendChild(rows)\n rows.classList.add('body-bg', 'border')\n const addRow = (el: PageElement, unit: string, cFactor: number) => {\n const box = Doc.safeSelector(el, '[data-unit-box]')\n const atoms = parseInt(box.dataset.atoms as string)\n const row = document.createElement('div')\n row.textContent = unit\n rows.appendChild(row)\n row.classList.add('p-2', 'hoverbg', 'pointer')\n Doc.bind(row, 'click', () => {\n Doc.setText(el, '[data-value]', Doc.formatFourSigFigs(atoms / cFactor, Math.round(Math.log10(cFactor))))\n Doc.setText(el, '[data-unit]', unit)\n })\n }\n for (const el of Doc.applySelector(main, '[data-conversion-value]')) {\n const box = Doc.safeSelector(el, '[data-unit-box]')\n Doc.bind(box, 'mouseenter', () => {\n Doc.empty(rows)\n box.appendChild(div)\n const lyt = Doc.layoutMetrics(box)\n const assetID = parseInt(box.dataset.assetID as string)\n const { unitInfo: ui } = this.assets[assetID]\n addRow(el, ui.conventional.unit, ui.conventional.conversionFactor)\n for (const { unit, conversionFactor } of ui.denominations) addRow(el, unit, conversionFactor)\n addRow(el, ui.atomicUnit, 1)\n if (lyt.bodyTop > (div.offsetHeight + this.header.offsetHeight)) {\n div.style.bottom = 'calc(100% - 1rem)'\n div.style.top = 'auto'\n } else {\n div.style.top = 'calc(100% - 1rem)'\n div.style.bottom = 'auto'\n }\n })\n Doc.bind(box, 'mouseleave', () => div.remove())\n }\n }\n\n bindUrlHandlers (ancestor: HTMLElement) {\n if (!window.openUrl) return\n for (const link of Doc.applySelector(ancestor, 'a[target=_blank]')) {\n Doc.bind(link, 'click', (e: MouseEvent) => {\n e.preventDefault()\n window.openUrl(link.href ?? '')\n })\n }\n }\n\n /* attachHeader attaches the header element, which unlike the main element,\n * isn't replaced during page navigation.\n */\n attachHeader () {\n this.header = idel(document.body, 'header')\n const page = this.page = Doc.idDescendants(this.header)\n this.headerSpace = page.headerSpace\n this.popupNotes = idel(document.body, 'popupNotes')\n this.popupTmpl = Doc.tmplElement(this.popupNotes, 'note')\n if (this.popupTmpl) this.popupTmpl.remove()\n else console.error('popupTmpl element not found')\n this.tooltip = idel(document.body, 'tooltip')\n page.noteTmpl.removeAttribute('id')\n page.noteTmpl.remove()\n page.pokeTmpl.removeAttribute('id')\n page.pokeTmpl.remove()\n page.loader.remove()\n Doc.show(page.loader)\n\n bind(page.noteBell, 'click', async () => {\n Doc.hide(page.pokeList)\n Doc.show(page.noteList)\n this.ackNotes()\n page.noteCat.classList.add('active')\n page.pokeCat.classList.remove('active')\n this.showDropdown(page.noteBell, page.noteBox)\n Doc.hide(page.noteIndicator)\n for (const note of this.notes) {\n if (note.acked) {\n note.el.classList.remove('firstview')\n }\n }\n this.setNoteTimes(page.noteList)\n this.setNoteTimes(page.pokeList)\n })\n\n bind(page.burgerIcon, 'click', () => {\n Doc.hide(page.logoutErr)\n this.showDropdown(page.burgerIcon, page.profileBox)\n })\n\n bind(page.innerNoteIcon, 'click', () => { Doc.hide(page.noteBox) })\n bind(page.innerBurgerIcon, 'click', () => { Doc.hide(page.profileBox) })\n\n bind(page.profileSignout, 'click', async () => await this.signOut())\n\n bind(page.pokeCat, 'click', () => {\n this.setNoteTimes(page.pokeList)\n page.pokeCat.classList.add('active')\n page.noteCat.classList.remove('active')\n Doc.hide(page.noteList)\n Doc.show(page.pokeList)\n this.ackNotes()\n })\n\n bind(page.noteCat, 'click', () => {\n this.setNoteTimes(page.noteList)\n page.noteCat.classList.add('active')\n page.pokeCat.classList.remove('active')\n Doc.hide(page.pokeList)\n Doc.show(page.noteList)\n this.ackNotes()\n })\n\n Doc.cleanTemplates(page.langBttnTmpl)\n const { name, flag } = languageData[this.lang]\n page.langFlag.textContent = flag\n page.langName.textContent = name\n\n for (const lang of this.langs) {\n if (lang === this.lang) continue\n const div = page.langBttnTmpl.cloneNode(true) as PageElement\n const { name, flag } = languageData[lang]\n div.textContent = flag\n div.title = name\n Doc.bind(div, 'click', () => this.setLanguage(lang))\n page.langBttns.appendChild(div)\n }\n }\n\n attachActions () {\n const { page } = this\n Object.assign(page, Doc.idDescendants(Doc.idel(document.body, 'requiredActions')))\n Doc.cleanTemplates(page.missingNoncesTmpl, page.actionTxTableTmpl, page.tooCheapTmpl, page.lostNonceTmpl)\n Doc.bind(page.actionsCollapse, 'click', () => {\n Doc.hide(page.actionDialog)\n Doc.show(page.actionDialogCollapsed)\n })\n Doc.bind(page.actionDialogCollapsed, 'click', () => {\n Doc.hide(page.actionDialogCollapsed)\n Doc.show(page.actionDialog)\n if (page.actionDialogContent.children.length === 0) this.showOldestAction()\n })\n const showAdjacentAction = (dir: number) => {\n const selected = Object.values(this.requiredActions).filter((r: requiredAction) => r.selected)[0]\n const actions = this.sortedActions()\n const idx = actions.indexOf(selected)\n this.showRequestedAction(actions[idx + dir].uniqueID)\n }\n Doc.bind(page.prevAction, 'click', () => showAdjacentAction(-1))\n Doc.bind(page.nextAction, 'click', () => showAdjacentAction(1))\n }\n\n setRequiredActions () {\n const { user: { actions }, requiredActions } = this\n if (!actions) return\n for (const a of actions) this.addAction(a)\n if (Object.keys(requiredActions).length) {\n this.showOldestAction()\n this.blinkAction()\n }\n }\n\n sortedActions () {\n const actions = Object.values(this.requiredActions)\n actions.sort((a: requiredAction, b: requiredAction) => a.stamp - b.stamp)\n return actions\n }\n\n showOldestAction () {\n this.showRequestedAction(this.sortedActions()[0].uniqueID)\n }\n\n addAction (req: ActionRequiredNote) {\n const { page, requiredActions } = this\n const existingAction = requiredActions[req.uniqueID]\n if (existingAction && existingAction.actionID === req.actionID) return\n const div = this.actionForm(req)\n if (existingAction) {\n if (existingAction.selected) existingAction.div.replaceWith(div)\n existingAction.div = div\n } else {\n requiredActions[req.uniqueID] = {\n div,\n stamp: (new Date()).getTime(),\n uniqueID: req.uniqueID,\n actionID: req.actionID,\n selected: false\n }\n const n = Object.keys(requiredActions).length\n page.actionDialogCount.textContent = String(n)\n page.actionCount.textContent = String(n)\n if (Doc.isHidden(page.actionDialog)) {\n this.showRequestedAction(req.uniqueID)\n }\n }\n }\n\n blinkAction () {\n Doc.blink(this.page.actionDialog)\n Doc.blink(this.page.actionDialogCollapsed)\n }\n\n resolveAction (req: ActionResolvedNote) {\n this.resolveActionWithID(req.uniqueID)\n }\n\n resolveActionWithID (uniqueID: string) {\n const { page, requiredActions } = this\n const existingAction = requiredActions[uniqueID]\n if (!existingAction) return\n delete requiredActions[uniqueID]\n const rem = Object.keys(requiredActions).length\n existingAction.div.remove()\n if (rem === 0) {\n Doc.hide(page.actionDialog, page.actionDialogCollapsed)\n return\n }\n page.actionDialogCount.textContent = String(rem)\n page.actionCount.textContent = String(rem)\n if (existingAction.selected) this.showOldestAction()\n }\n\n actionForm (req: ActionRequiredNote) {\n switch (req.actionID) {\n case 'tooCheap':\n return this.tooCheapAction(req)\n case 'missingNonces':\n return this.missingNoncesAction(req)\n case 'lostNonce':\n return this.lostNonceAction(req)\n case 'redeemRejected':\n return this.redeemRejectedAction(req)\n }\n throw Error('unknown required action ID ' + req.actionID)\n }\n\n actionTxTable (req: ActionRequiredNote) {\n const { assetID, payload } = req\n const n = payload as TransactionActionNote\n const { unitInfo: ui, token } = this.assets[assetID]\n const table = this.page.actionTxTableTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(table)\n tmpl.lostTxID.textContent = n.tx.id\n tmpl.lostTxID.dataset.explorerCoin = n.tx.id\n setCoinHref(token ? token.parentID : assetID, tmpl.lostTxID)\n tmpl.txAmt.textContent = Doc.formatCoinValue(n.tx.amount, ui)\n tmpl.amtUnit.textContent = ui.conventional.unit\n const parentUI = token ? this.unitInfo(token.parentID) : ui\n tmpl.type.textContent = txTypeString(n.tx.type)\n tmpl.feeAmount.textContent = Doc.formatCoinValue(n.tx.fees, parentUI)\n tmpl.feeUnit.textContent = parentUI.conventional.unit\n switch (req.actionID) {\n case 'tooCheap': {\n Doc.show(tmpl.newFeesRow)\n tmpl.newFees.textContent = Doc.formatCoinValue(n.tx.fees, parentUI)\n tmpl.newFeesUnit.textContent = parentUI.conventional.unit\n break\n }\n }\n return table\n }\n\n async submitAction (req: ActionRequiredNote, action: any, errMsg: PageElement) {\n Doc.hide(errMsg)\n const loading = this.loading(this.page.actionDialog)\n const res = await postJSON('/api/takeaction', {\n assetID: req.assetID,\n actionID: req.actionID,\n action\n })\n loading()\n if (!this.checkResponse(res)) {\n errMsg.textContent = res.msg\n Doc.show(errMsg)\n return\n }\n this.resolveActionWithID(req.uniqueID)\n }\n\n missingNoncesAction (req: ActionRequiredNote) {\n const { assetID } = req\n const div = this.page.missingNoncesTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(div)\n const { name } = this.assets[assetID]\n tmpl.assetName.textContent = name\n Doc.bind(tmpl.doNothingBttn, 'click', () => {\n this.submitAction(req, { recover: false }, tmpl.errMsg)\n })\n Doc.bind(tmpl.recoverBttn, 'click', () => {\n this.submitAction(req, { recover: true }, tmpl.errMsg)\n })\n return div\n }\n\n tooCheapAction (req: ActionRequiredNote) {\n const { assetID, payload } = req\n const n = payload as TransactionActionNote\n const div = this.page.tooCheapTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(div)\n const { name } = this.assets[assetID]\n tmpl.assetName.textContent = name\n tmpl.txTable.appendChild(this.actionTxTable(req))\n const act = (bump: boolean) => {\n this.submitAction(req, {\n txID: n.tx.id,\n bump\n }, tmpl.errMsg)\n }\n Doc.bind(tmpl.keepWaitingBttn, 'click', () => act(false))\n Doc.bind(tmpl.addFeesBttn, 'click', () => act(true))\n return div\n }\n\n lostNonceAction (req: ActionRequiredNote) {\n const { assetID, payload } = req\n const n = payload as TransactionActionNote\n const div = this.page.lostNonceTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(div)\n const { name } = this.assets[assetID]\n tmpl.assetName.textContent = name\n tmpl.nonce.textContent = String(n.nonce)\n tmpl.txTable.appendChild(this.actionTxTable(req))\n Doc.bind(tmpl.abandonBttn, 'click', () => {\n this.submitAction(req, { txID: n.tx.id, abandon: true }, tmpl.errMsg)\n })\n Doc.bind(tmpl.keepWaitingBttn, 'click', () => {\n this.submitAction(req, { txID: n.tx.id, abandon: false }, tmpl.errMsg)\n })\n Doc.bind(tmpl.replaceBttn, 'click', () => {\n const replacementID = tmpl.idInput.value\n if (!replacementID) {\n tmpl.idInput.focus()\n Doc.blink(tmpl.idInput)\n return\n }\n this.submitAction(req, { txID: n.tx.id, abandon: false, replacementID }, tmpl.errMsg)\n })\n return div\n }\n\n redeemRejectedAction (req: ActionRequiredNote) {\n const { orderID, coinID, coinFmt, assetID } = req.payload as RejectedRedemptionData\n const div = this.page.rejectedRedemptionTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(div)\n const { name, token } = this.assets[assetID]\n tmpl.assetName.textContent = name\n tmpl.txid.textContent = coinFmt\n tmpl.txid.dataset.explorerCoin = coinID\n setCoinHref(token ? token.parentID : assetID, tmpl.txid)\n Doc.bind(tmpl.doNothingBttn, 'click', () => {\n this.submitAction(req, { orderID, coinID, retry: false }, tmpl.errMsg)\n })\n Doc.bind(tmpl.tryAgainBttn, 'click', () => {\n this.submitAction(req, { orderID, coinID, retry: true }, tmpl.errMsg)\n })\n return div\n }\n\n showRequestedAction (uniqueID: string) {\n const { page, requiredActions } = this\n Doc.hide(page.actionDialogCollapsed)\n for (const r of Object.values(requiredActions)) r.selected = r.uniqueID === uniqueID\n Doc.empty(page.actionDialogContent)\n const action = requiredActions[uniqueID]\n page.actionDialogContent.appendChild(action.div)\n Doc.show(page.actionDialog)\n const actions = this.sortedActions()\n if (actions.length === 1) {\n Doc.hide(page.actionsNavigator)\n return\n }\n Doc.show(page.actionsNavigator)\n const idx = actions.indexOf(action)\n page.currentAction.textContent = String(idx + 1)\n page.prevAction.classList.toggle('invisible', idx === 0)\n page.nextAction.classList.toggle('invisible', idx === actions.length - 1)\n }\n\n /*\n * updateMarketElements sets the textContent for any ticker or asset name\n * elements or any asset logo src attributes for descendents of ancestor.\n */\n updateMarketElements (ancestor: PageElement, baseID: number, quoteID: number, xc?: Exchange) {\n const getAsset = (assetID: number) => {\n const a = this.assets[assetID]\n if (a) return a\n if (!xc) throw Error(`no asset found for asset ID ${assetID}`)\n const xcAsset = xc.assets[assetID]\n return { unitInfo: xcAsset.unitInfo, name: xcAsset.symbol, symbol: xcAsset.symbol }\n }\n const { unitInfo: bui, name: baseName, symbol: baseSymbol } = getAsset(baseID)\n for (const el of Doc.applySelector(ancestor, '[data-base-name')) el.textContent = baseName\n for (const img of Doc.applySelector(ancestor, '[data-base-logo]')) img.src = Doc.logoPath(baseSymbol)\n for (const el of Doc.applySelector(ancestor, '[data-base-ticker]')) el.textContent = bui.conventional.unit\n const { unitInfo: qui, name: quoteName, symbol: quoteSymbol } = getAsset(quoteID)\n for (const el of Doc.applySelector(ancestor, '[data-quote-name')) el.textContent = quoteName\n for (const img of Doc.applySelector(ancestor, '[data-quote-logo]')) img.src = Doc.logoPath(quoteSymbol)\n for (const el of Doc.applySelector(ancestor, '[data-quote-ticker]')) el.textContent = qui.conventional.unit\n }\n\n async setLanguage (lang: string) {\n await postJSON('/api/setlocale', lang)\n window.location.reload()\n }\n\n /*\n * showDropdown sets the position and visibility of the specified dropdown\n * dialog according to the position of its icon button.\n */\n showDropdown (icon: HTMLElement, dialog: HTMLElement) {\n Doc.hide(this.page.noteBox, this.page.profileBox)\n Doc.show(dialog)\n if (window.innerWidth < 500) Object.assign(dialog.style, { left: '0', right: '0', top: '0' })\n else {\n const ico = icon.getBoundingClientRect()\n const right = `${window.innerWidth - ico.left - ico.width + 5}px`\n Object.assign(dialog.style, { left: 'auto', right, top: `${ico.top - 4}px` })\n }\n\n const hide = (e: MouseEvent) => {\n if (!Doc.mouseInElement(e, dialog)) {\n Doc.hide(dialog)\n unbind(document, 'click', hide)\n if (dialog === this.page.noteBox && Doc.isDisplayed(this.page.noteList)) {\n this.ackNotes()\n }\n }\n }\n bind(document, 'click', hide)\n }\n\n ackNotes () {\n const acks = []\n for (const note of this.notes) {\n if (note.acked) {\n note.el.classList.remove('firstview')\n } else {\n note.acked = true\n if (note.id && note.severity > ntfn.POKE) acks.push(note.id)\n }\n }\n if (acks.length) ws.request('acknotes', acks)\n Doc.hide(this.page.noteIndicator)\n }\n\n setNoteTimes (noteList: HTMLElement) {\n for (const el of (Array.from(noteList.children) as NoteElement[])) {\n Doc.safeSelector(el, 'span.note-time').textContent = Doc.timeSince(el.note.stamp)\n }\n }\n\n /*\n * bindInternalNavigation hijacks navigation by click on any local links that\n * are descendants of ancestor.\n */\n bindInternalNavigation (ancestor: HTMLElement) {\n const pageURL = new URL(window.location.href)\n ancestor.querySelectorAll('a').forEach(a => {\n if (!a.href) return\n const url = new URL(a.href)\n if (url.origin === pageURL.origin) {\n const token = url.pathname.substring(1)\n const params: Record<string, string> = {}\n if (url.search) {\n url.searchParams.forEach((v, k) => {\n params[k] = v\n })\n }\n Doc.bind(a, 'click', (e: Event) => {\n e.preventDefault()\n this.loadPage(token, params)\n })\n }\n })\n }\n\n /*\n * updateMenuItemsDisplay should be called when the user has signed in or out,\n * and when the user registers a DEX.\n */\n updateMenuItemsDisplay () {\n const { page, authed, mmStatus } = this\n if (!page) {\n // initial page load, header elements not yet attached but menu items\n // would already be hidden/displayed as appropriate.\n return\n }\n if (!authed) {\n page.profileBox.classList.remove('authed')\n Doc.hide(page.noteBell, page.walletsMenuEntry, page.marketsMenuEntry)\n return\n }\n Doc.setVis(Object.keys(this.exchanges).length > 0, page.marketsMenuEntry, page.mmLink)\n\n page.profileBox.classList.add('authed')\n Doc.show(page.noteBell, page.walletsMenuEntry, page.marketsMenuEntry)\n Doc.setVis(mmStatus, page.mmLink)\n }\n\n async fetchNotes () {\n const res = await getJSON('/api/notes')\n if (!this.checkResponse(res)) return console.error('failed to fetch notes:', res?.msg || String(res))\n res.notes.reverse()\n this.setNotes(res.notes)\n this.setPokes(res.pokes)\n this.setRequiredActions()\n }\n\n /* attachCommon scans the provided node and handles some common bindings. */\n attachCommon (node: HTMLElement) {\n this.bindInternalNavigation(node)\n }\n\n /*\n * updateBondConfs updates the information for a pending bond.\n */\n updateBondConfs (dexAddr: string, coinID: string, confs: number) {\n const dex = this.exchanges[dexAddr]\n for (const bond of dex.auth.pendingBonds) if (bond.coinID === coinID) bond.confs = confs\n }\n\n updateTier (host: string, bondedTier: number) {\n this.exchanges[host].auth.rep.bondedTier = bondedTier\n }\n\n /*\n * handleBondNote is the handler for the 'bondpost'-type notification, which\n * is used to update the dex tier and registration status.\n */\n handleBondNote (note: BondNote) {\n if (note.auth) this.exchanges[note.dex].auth = note.auth\n switch (note.topic) {\n case 'RegUpdate':\n if (note.coinID !== null) { // should never be null for RegUpdate\n this.updateBondConfs(note.dex, note.coinID, note.confirmations)\n }\n break\n case 'BondConfirmed':\n if (note.tier !== null) { // should never be null for BondConfirmed\n this.updateTier(note.dex, note.tier)\n }\n break\n default:\n break\n }\n }\n\n /*\n * handleTransaction either adds a new transaction to the transaction history\n * or updates an existing transaction.\n */\n handleTransactionNote (assetID: number, note: TransactionNote) {\n const txHistory = this.txHistoryMap[assetID]\n if (!txHistory) return\n\n if (note.new) {\n txHistory.txs.unshift(note.transaction)\n return\n }\n\n for (let i = 0; i < txHistory.txs.length; i++) {\n if (txHistory.txs[i].id === note.transaction.id) {\n txHistory.txs[i] = note.transaction\n break\n }\n }\n }\n\n handleTxHistorySyncedNote (assetID: number) {\n delete this.txHistoryMap[assetID]\n }\n\n loggedIn (notes: CoreNote[], pokes: CoreNote[]) {\n this.setNotes(notes)\n this.setPokes(pokes)\n this.setRequiredActions()\n }\n\n /*\n * setNotes sets the current notification cache and populates the notification\n * display.\n */\n setNotes (notes: CoreNote[]) {\n this.log('notes', 'setNotes', notes)\n this.notes = []\n Doc.empty(this.page.noteList)\n for (let i = 0; i < notes.length; i++) {\n this.prependNoteElement(notes[i])\n }\n }\n\n /*\n * setPokes sets the current poke cache and populates the pokes display.\n */\n setPokes (pokes: CoreNote[]) {\n this.log('pokes', 'setPokes', pokes)\n this.pokes = []\n Doc.empty(this.page.pokeList)\n for (let i = 0; i < pokes.length; i++) {\n this.prependPokeElement(pokes[i])\n }\n }\n\n botStatus (host: string, baseID: number, quoteID: number): MMBotStatus | undefined {\n for (const bot of (this.mmStatus?.bots ?? [])) {\n const { config: c } = bot\n if (host === c.host && baseID === c.baseID && quoteID === c.quoteID) {\n return bot\n }\n }\n }\n\n updateUser (note: CoreNote) {\n const { user, assets, walletMap } = this\n if (note.type === 'fiatrateupdate') {\n this.fiatRatesMap = (note as RateNote).fiatRates\n return\n }\n // Some notes can be received before we get a User during login.\n if (!user) return\n switch (note.type) {\n case 'order': {\n const orderNote = note as OrderNote\n const order = orderNote.order\n const mkt = user.exchanges[order.host].markets[order.market]\n const tempID = orderNote.tempID\n\n // Ensure market's inflight orders list is updated.\n if (note.topic === 'AsyncOrderSubmitted') {\n const inFlight = order as InFlightOrder\n inFlight.tempID = tempID\n if (!mkt.inflight) mkt.inflight = [inFlight]\n else mkt.inflight.push(inFlight)\n break\n } else if (note.topic === 'AsyncOrderFailure') {\n mkt.inflight = mkt.inflight.filter(ord => ord.tempID !== tempID)\n break\n } else {\n for (const i in mkt.inflight || []) {\n if (!(mkt.inflight[i].tempID === tempID)) continue\n mkt.inflight = mkt.inflight.filter(ord => ord.tempID !== tempID)\n break\n }\n }\n\n // Updates given order in market's orders list if it finds it.\n // Returns a bool which indicates if order was found.\n mkt.orders = mkt.orders || []\n const updateOrder = (mkt: Market, ord: Order) => {\n const i = mkt.orders.findIndex((o: Order) => o.id === ord.id)\n if (i === -1) return false\n if (note.topic === 'OrderRetired') mkt.orders.splice(i, 1)\n else mkt.orders[i] = ord\n return true\n }\n // If the notification order already exists we update it.\n // In case market's orders list is empty or the notification order isn't\n // part of it we add it manually as this means the order was\n // just placed.\n if (!updateOrder(mkt, order)) mkt.orders.push(order)\n break\n }\n case 'balance': {\n const n: BalanceNote = note as BalanceNote\n const asset = user.assets[n.assetID]\n // Balance updates can come before the user is fetched after login.\n if (!asset) break\n const w = asset.wallet\n if (w) w.balance = n.balance\n break\n }\n case 'bondpost':\n this.handleBondNote(note as BondNote)\n break\n case 'reputation': {\n const n = note as ReputationNote\n this.exchanges[n.host].auth.rep = n.rep\n break\n }\n case 'walletstate':\n case 'walletconfig': {\n // assets can be null if failed to connect to dex server.\n if (!assets) return\n const wallet = (note as WalletConfigNote)?.wallet\n if (!wallet) return\n const asset = assets[wallet.assetID]\n asset.wallet = wallet\n walletMap[wallet.assetID] = wallet\n break\n }\n case 'walletsync': {\n const n = note as WalletSyncNote\n const w = this.walletMap[n.assetID]\n if (w) {\n w.syncStatus = n.syncStatus\n w.synced = w.syncStatus.synced\n w.syncProgress = n.syncProgress\n }\n break\n }\n case 'match': {\n const n = note as MatchNote\n const ord = this.order(n.orderID)\n if (ord) updateMatch(ord, n.match)\n break\n }\n case 'conn': {\n const n = note as ConnEventNote\n const xc = user.exchanges[n.host]\n if (xc) xc.connectionStatus = n.connectionStatus\n break\n }\n case 'spots': {\n const n = note as SpotPriceNote\n const xc = user.exchanges[n.host]\n // Spots can come before the user is fetched after login and before/while the\n // markets page reload when it receives a dex conn note.\n if (!xc || !xc.markets) break\n for (const [mktName, spot] of Object.entries(n.spots)) xc.markets[mktName].spot = spot\n break\n }\n case 'fiatrateupdate': {\n this.fiatRatesMap = (note as RateNote).fiatRates\n break\n }\n case 'actionrequired': {\n const n = note as CoreActionRequiredNote\n this.addAction(n.payload)\n break\n }\n case 'walletnote': {\n const n = note as WalletNote\n switch (n.payload.route) {\n case 'transaction': {\n const txNote = n.payload as TransactionNote\n this.handleTransactionNote(n.payload.assetID, txNote)\n break\n }\n case 'actionRequired': {\n const req = n.payload as ActionRequiredNote\n this.addAction(req)\n this.blinkAction()\n break\n }\n case 'actionResolved': {\n this.resolveAction(n.payload as ActionResolvedNote)\n }\n }\n if (n.payload.route === 'transactionHistorySynced') {\n this.handleTxHistorySyncedNote(n.payload.assetID)\n }\n break\n }\n case 'runstats': {\n this.log('mm', { runstats: note })\n const n = note as RunStatsNote\n const bot = this.botStatus(n.host, n.baseID, n.quoteID)\n if (bot) {\n bot.runStats = n.stats\n bot.running = Boolean(n.stats)\n if (!n.stats) {\n bot.latestEpoch = undefined\n bot.cexProblems = undefined\n }\n }\n break\n }\n case 'cexnote': {\n const n = note as CEXNotification\n switch (n.topic) {\n case 'BalanceUpdate': {\n const u = n.note as CEXBalanceUpdate\n this.mmStatus.cexes[n.cexName].balances[u.assetID] = u.balance\n }\n }\n break\n }\n case 'epochreport': {\n const n = note as EpochReportNote\n const bot = this.botStatus(n.host, n.baseID, n.quoteID)\n if (bot) bot.latestEpoch = n.report\n break\n }\n case 'cexproblems': {\n const n = note as CEXProblemsNote\n const bot = this.botStatus(n.host, n.baseID, n.quoteID)\n if (bot) bot.cexProblems = n.problems\n break\n }\n }\n }\n\n /*\n * notify is the top-level handler for notifications received from the client.\n * Notifications are propagated to the loadedPage.\n */\n notify (note: CoreNote) {\n // Handle type-specific updates.\n this.log('notes', 'notify', note)\n this.updateUser(note)\n // Inform the page.\n for (const feeder of this.noteReceivers) {\n const f = feeder[note.type]\n if (!f) continue\n try {\n f(note)\n } catch (error) {\n console.error('note feeder error:', error.message ? error.message : error)\n console.log(note)\n console.log(error.stack)\n }\n }\n // Discard data notifications.\n if (note.severity < ntfn.POKE) return\n // Poke notifications have their own display.\n const { popupTmpl, popupNotes, showPopups } = this\n if (showPopups) {\n const span = popupTmpl.cloneNode(true) as HTMLElement\n Doc.tmplElement(span, 'text').textContent = `${note.subject}: ${ntfn.plainNote(note.details)}`\n const indicator = Doc.tmplElement(span, 'indicator')\n if (note.severity === ntfn.POKE) {\n Doc.hide(indicator)\n } else setSeverityClass(indicator, note.severity)\n popupNotes.appendChild(span)\n Doc.show(popupNotes)\n // These take up screen space. Only show max 5 at a time.\n while (popupNotes.children.length > 5) popupNotes.removeChild(popupNotes.firstChild as Node)\n setTimeout(async () => {\n await Doc.animate(500, (progress: number) => {\n span.style.opacity = String(1 - progress)\n })\n span.remove()\n if (popupNotes.children.length === 0) Doc.hide(popupNotes)\n }, 6000)\n }\n // Success and higher severity go to the bell dropdown.\n if (note.severity === ntfn.POKE) this.prependPokeElement(note)\n else this.prependNoteElement(note)\n\n // show desktop notification\n ntfn.desktopNotify(note)\n }\n\n /*\n * registerNoteFeeder registers a feeder for core notifications. The feeder\n * will be de-registered when a new page is loaded.\n */\n registerNoteFeeder (receivers: Record<string, (n: CoreNote) => void>) {\n this.noteReceivers.push(receivers)\n }\n\n /*\n * log prints to the console if a logger has been enabled. Loggers are created\n * implicitly by passing a loggerID to log. i.e. you don't create a logger,\n * you just log to it. Loggers are enabled by invoking a global function,\n * enableLogger(loggerID, onOffBoolean), from the browser's js console. Your\n * choices are stored across sessions. Some common and useful loggers are\n * listed below, but this list is not meant to be comprehensive.\n *\n * LoggerID Description\n * -------- -----------\n * notes Notifications of all levels.\n * book Order book feed.\n * ws.........Websocket connection status changes.\n */\n log (loggerID: string, ...msg: any) {\n if (this.loggers[loggerID]) console.log(`${nowString()}[${loggerID}]:`, ...msg)\n if (this.recorders[loggerID]) {\n this.recorders[loggerID].push({\n time: nowString(),\n msg: msg\n })\n }\n }\n\n prependPokeElement (cn: CoreNote) {\n const [el, note] = this.makePoke(cn)\n this.pokes.push(note)\n while (this.pokes.length > noteCacheSize) this.pokes.shift()\n this.prependListElement(this.page.pokeList, note, el)\n }\n\n prependNoteElement (cn: CoreNote) {\n const [el, note] = this.makeNote(cn)\n this.notes.push(note)\n while (this.notes.length > noteCacheSize) this.notes.shift()\n const noteList = this.page.noteList\n this.prependListElement(noteList, note, el)\n this.bindUrlHandlers(el)\n // Set the indicator color.\n if (this.notes.length === 0 || (Doc.isDisplayed(this.page.noteBox) && Doc.isDisplayed(noteList))) return\n let unacked = 0\n const severity = this.notes.reduce((s, note) => {\n if (!note.acked) unacked++\n if (!note.acked && note.severity > s) return note.severity\n return s\n }, ntfn.IGNORE)\n const ni = this.page.noteIndicator\n setSeverityClass(ni, severity)\n if (unacked) {\n ni.textContent = String((unacked > noteCacheSize - 1) ? `${noteCacheSize - 1}+` : unacked)\n Doc.show(ni)\n } else Doc.hide(ni)\n }\n\n prependListElement (noteList: HTMLElement, note: CoreNotePlus, el: NoteElement) {\n el.note = note\n noteList.prepend(el)\n while (noteList.children.length > noteCacheSize) noteList.removeChild(noteList.lastChild as Node)\n this.setNoteTimes(noteList)\n }\n\n /*\n * makeNote constructs a single notification element for the drop-down\n * notification list.\n */\n makeNote (note: CoreNote): [NoteElement, CoreNotePlus] {\n const el = this.page.noteTmpl.cloneNode(true) as NoteElement\n if (note.severity > ntfn.POKE) {\n const cls = note.severity === ntfn.SUCCESS ? 'good' : note.severity === ntfn.WARNING ? 'warn' : 'bad'\n Doc.safeSelector(el, 'div.note-indicator').classList.add(cls)\n }\n\n Doc.safeSelector(el, 'div.note-subject').textContent = note.subject\n ntfn.insertRichNote(Doc.safeSelector(el, 'div.note-details'), note.details)\n const np: CoreNotePlus = { el, ...note }\n return [el, np]\n }\n\n makePoke (note: CoreNote): [NoteElement, CoreNotePlus] {\n const el = this.page.pokeTmpl.cloneNode(true) as NoteElement\n Doc.tmplElement(el, 'subject').textContent = `${note.subject}:`\n ntfn.insertRichNote(Doc.tmplElement(el, 'details'), note.details)\n const np: CoreNotePlus = { el, ...note }\n return [el, np]\n }\n\n /*\n * loading appends the loader to the specified element and displays the\n * loading icon. The loader will block all interaction with the specified\n * element until Application.loaded is called.\n */\n loading (el: HTMLElement): () => void {\n const loader = this.page.loader.cloneNode(true) as HTMLElement\n el.appendChild(loader)\n return () => { loader.remove() }\n }\n\n /* orders retrieves a list of orders for the specified dex and market\n * including inflight orders.\n */\n orders (host: string, mktID: string): Order[] {\n let orders: Order[] = []\n const mkt = this.user.exchanges[host].markets[mktID]\n if (mkt.orders) orders = orders.concat(mkt.orders)\n if (mkt.inflight) orders = orders.concat(mkt.inflight)\n return orders\n }\n\n /*\n * haveActiveOrders returns whether or not there are active orders involving a\n * certain asset.\n */\n haveActiveOrders (assetID: number): boolean {\n for (const xc of Object.values(this.user.exchanges)) {\n if (!xc.markets) continue\n for (const market of Object.values(xc.markets)) {\n if (!market.orders) continue\n for (const ord of market.orders) {\n if ((ord.baseID === assetID || ord.quoteID === assetID) &&\n (ord.status < StatusExecuted || hasActiveMatches(ord))) return true\n }\n }\n }\n return false\n }\n\n /* order attempts to locate an order by order ID. */\n order (oid: string): Order | null {\n for (const xc of Object.values(this.user.exchanges)) {\n if (!xc || !xc.markets) continue\n for (const market of Object.values(xc.markets)) {\n if (!market.orders) continue\n for (const ord of market.orders) {\n if (ord.id === oid) return ord\n }\n }\n }\n return null\n }\n\n /*\n * canAccelerateOrder returns true if the \"from\" wallet of the order\n * supports acceleration, and if the order has unconfirmed swap\n * transactions.\n */\n canAccelerateOrder (order: Order): boolean {\n const walletTraitAccelerator = 1 << 4\n let fromAssetID\n if (order.sell) fromAssetID = order.baseID\n else fromAssetID = order.quoteID\n const wallet = this.walletMap[fromAssetID]\n if (!wallet || !(wallet.traits & walletTraitAccelerator)) return false\n if (order.matches) {\n for (let i = 0; i < order.matches?.length; i++) {\n const match = order.matches[i]\n if (match.swap && match.swap.confs && match.swap.confs.count === 0 && !match.revoked) {\n return true\n }\n }\n }\n return false\n }\n\n /*\n * unitInfo fetches unit info [dex.UnitInfo] for the asset. If xc\n * [core.Exchange] is provided, and this is not a SupportedAsset, the UnitInfo\n * sent from the exchange's assets map [dex.Asset] will be used.\n */\n unitInfo (assetID: number, xc?: Exchange): UnitInfo {\n const supportedAsset = this.assets[assetID]\n if (supportedAsset) return supportedAsset.unitInfo\n if (!xc || !xc.assets) {\n throw Error(intl.prep(intl.ID_UNSUPPORTED_ASSET_INFO_ERR_MSG, { assetID: `${assetID}` }))\n }\n return xc.assets[assetID].unitInfo\n }\n\n parentAsset (assetID: number) : SupportedAsset {\n const asset = this.assets[assetID]\n if (!asset.token) return asset\n return this.assets[asset.token.parentID]\n }\n\n /*\n * baseChainSymbol returns the symbol for the asset's parent if the asset is a\n * token, otherwise the symbol for the asset itself.\n */\n baseChainSymbol (assetID: number) {\n const asset = this.user.assets[assetID]\n return asset.token ? this.user.assets[asset.token.parentID].symbol : asset.symbol\n }\n\n /*\n * extensionWallet returns the ExtensionConfiguredWallet for the asset, if\n * it exists.\n */\n extensionWallet (assetID: number) {\n return this.user.extensionModeConfig?.restrictedWallets[this.baseChainSymbol(assetID)]\n }\n\n /* conventionalRate converts the encoded atomic rate to a conventional rate */\n conventionalRate (baseID: number, quoteID: number, encRate: number, xc?: Exchange): number {\n const [b, q] = [this.unitInfo(baseID, xc), this.unitInfo(quoteID, xc)]\n\n const r = b.conventional.conversionFactor / q.conventional.conversionFactor\n return encRate * r / RateEncodingFactor\n }\n\n walletDefinition (assetID: number, walletType: string): WalletDefinition {\n const asset = this.assets[assetID]\n if (asset.token) return asset.token.definition\n if (!asset.info) throw Error('where\\'s the wallet info?')\n if (walletType === '') return asset.info.availablewallets[asset.info.emptyidx]\n return asset.info.availablewallets.filter(def => def.type === walletType)[0]\n }\n\n currentWalletDefinition (assetID: number): WalletDefinition {\n const asset = this.assets[assetID]\n if (asset.token) {\n return asset.token.definition\n }\n return this.walletDefinition(assetID, this.assets[assetID].wallet.type)\n }\n\n /*\n * fetchBalance requests a balance update from the API. The API response does\n * include the balance, but we're ignoring it, since a balance update\n * notification is received via the Application anyways.\n */\n async fetchBalance (assetID: number): Promise<WalletBalance> {\n const res: BalanceResponse = await postJSON('/api/balance', { assetID: assetID })\n if (!this.checkResponse(res)) {\n throw new Error(`failed to fetch balance for asset ID ${assetID}`)\n }\n return res.balance\n }\n\n /*\n * checkResponse checks the response object as returned from the functions in\n * the http module. If the response indicates that the request failed, it\n * returns false, otherwise, true.\n */\n checkResponse (resp: APIResponse): boolean {\n return (resp.requestSuccessful && resp.ok)\n }\n\n /**\n * signOut call to /api/logout, if response with no errors occurred remove auth\n * and other privacy-critical cookies/locals and reload the page, otherwise\n * show a notification.\n */\n async signOut () {\n const res = await postJSON('/api/logout')\n if (!this.checkResponse(res)) {\n if (res.code === Errors.activeOrdersErr) {\n this.page.logoutErr.textContent = intl.prep(intl.ID_ACTIVE_ORDERS_LOGOUT_ERR_MSG)\n } else {\n this.page.logoutErr.textContent = res.msg\n }\n Doc.show(this.page.logoutErr)\n return\n }\n State.removeCookie(State.authCK)\n State.removeCookie(State.pwKeyCK)\n State.removeLocal(State.notificationsLK) // Notification storage was DEPRECATED pre-v1.\n window.location.href = '/login'\n }\n\n /*\n * txHistory loads the tx history for an asset. If the results are not\n * already cached, they are cached. If we have reached the oldest tx,\n * this fact is also cached. If the exact amount of transactions as have been\n * made are requested, we will not know if we have reached the last tx until\n * a subsequent call.\n */\n async txHistory (assetID: number, n: number, after?: string): Promise<TxHistoryResult> {\n const url = '/api/txhistory'\n const cachedTxHistory = this.txHistoryMap[assetID]\n if (!cachedTxHistory) {\n const res = await postJSON(url, {\n n: n,\n assetID: assetID\n })\n if (!this.checkResponse(res)) {\n throw new Error(res.msg)\n }\n let txs : WalletTransaction[] | null | undefined = res.txs\n if (!txs) {\n txs = []\n }\n this.txHistoryMap[assetID] = {\n txs: txs,\n lastTx: txs.length < n\n }\n return this.txHistoryMap[assetID]\n }\n const txs : WalletTransaction[] = []\n let lastTx = false\n const startIndex = after ? cachedTxHistory.txs.findIndex(tx => tx.id === after) + 1 : 0\n if (after && startIndex === -1) {\n throw new Error('invalid after tx ' + after)\n }\n let lastIndex = startIndex\n for (let i = startIndex; i < cachedTxHistory.txs.length && txs.length < n; i++) {\n txs.push(cachedTxHistory.txs[i])\n lastIndex = i\n after = cachedTxHistory.txs[i].id\n }\n if (cachedTxHistory.lastTx && lastIndex === cachedTxHistory.txs.length - 1) {\n lastTx = true\n }\n if (txs.length < n && !cachedTxHistory.lastTx) {\n const res = await postJSON(url, {\n n: n - txs.length + 1, // + 1 because first result will be refID\n assetID: assetID,\n refID: after,\n past: true\n })\n if (!this.checkResponse(res)) {\n throw new Error(res.msg)\n }\n let resTxs : WalletTransaction[] | null | undefined = res.txs\n if (!resTxs) {\n resTxs = []\n }\n if (resTxs.length > 0 && after) {\n if (resTxs[0].id === after) {\n resTxs.shift()\n } else {\n // Implies a bug in the client\n console.error('First tx history element != refID')\n }\n }\n cachedTxHistory.lastTx = resTxs.length < n - txs.length\n lastTx = cachedTxHistory.lastTx\n txs.push(...resTxs)\n cachedTxHistory.txs.push(...resTxs)\n }\n return { txs, lastTx }\n }\n\n getWalletTx (assetID: number, txID: string): WalletTransaction | undefined {\n const cachedTxHistory = this.txHistoryMap[assetID]\n if (!cachedTxHistory) return undefined\n return cachedTxHistory.txs.find(tx => tx.id === txID)\n }\n\n clearTxHistory (assetID: number) {\n delete this.txHistoryMap[assetID]\n }\n\n async needsCustomProvider (assetID: number): Promise<boolean> {\n const baseChainID = this.assets[assetID]?.token?.parentID ?? assetID\n if (!baseChainID) return false\n const w = this.walletMap[baseChainID]\n if (!w) return false\n const traitAccountLocker = 1 << 14\n if ((w.traits & traitAccountLocker) === 0) return false\n const res = await postJSON('/api/walletsettings', { assetID: baseChainID })\n if (!this.checkResponse(res)) {\n console.error(res.msg)\n return false\n }\n const settings = res.map as Record<string, string>\n return !settings.providers\n }\n}\n\n/* getSocketURI returns the websocket URI for the client. */\nfunction getSocketURI (): string {\n const protocol = (window.location.protocol === 'https:') ? 'wss' : 'ws'\n return `${protocol}://${window.location.host}/ws`\n}\n\n/*\n * severityClassMap maps a notification severity level to a CSS class that\n * assigns a background color.\n */\nconst severityClassMap: Record<number, string> = {\n [ntfn.SUCCESS]: 'good',\n [ntfn.ERROR]: 'bad',\n [ntfn.WARNING]: 'warn'\n}\n\n/* handlerFromPath parses the handler name from the path. */\nfunction handlerFromPath (path: string): string {\n return path.replace(/^\\//, '').split('/')[0].split('?')[0].split('#')[0]\n}\n\n/* nowString creates a string formatted like HH:MM:SS.xxx */\nfunction nowString (): string {\n const stamp = new Date()\n const h = stamp.getHours().toString().padStart(2, '0')\n const m = stamp.getMinutes().toString().padStart(2, '0')\n const s = stamp.getSeconds().toString().padStart(2, '0')\n const ms = stamp.getMilliseconds().toString().padStart(3, '0')\n return `${h}:${m}:${s}.${ms}`\n}\n\nfunction setSeverityClass (el: HTMLElement, severity: number) {\n el.classList.remove('bad', 'warn', 'good')\n el.classList.add(severityClassMap[severity])\n}\n\n/* updateMatch updates the match in or adds the match to the order. */\nfunction updateMatch (order: Order, match: Match) {\n for (const i in order.matches) {\n const m = order.matches[i]\n if (m.matchID === match.matchID) {\n order.matches[i] = match\n return\n }\n }\n order.matches = order.matches || []\n order.matches.push(match)\n}\n","import Application from './js/app'\nimport { registerApplication } from './js/registry'\nimport './css/bootstrap.scss'\nimport './css/application.scss'\n\nconst app = new Application()\nregisterApplication(app)\napp.start()\n"],"names":["_typeof","_regeneratorRuntime","module","exports","__esModule","Op","Object","prototype","hasOwn","hasOwnProperty","defineProperty","obj","key","desc","value","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","enumerable","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","create","context","Context","makeInvokeMethod","tryCatch","fn","arg","type","call","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","this","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","method","_invoke","AsyncIterator","PromiseImpl","invoke","resolve","reject","record","result","__await","then","unwrapped","error","previousPromise","callInvokeWithMethodAndArg","state","Error","undefined","done","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","methodName","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","length","i","doneResult","displayName","isGeneratorFunction","genFun","ctor","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","iter","keys","val","object","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","runtime","regeneratorRuntime","accidentalStrictMode","globalThis","Function","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","d","a","definition","o","get","prop","_arrayLikeToArray","arr","len","arr2","Array","_unsupportedIterableToArray","minLen","toString","from","test","_toConsumableArray","isArray","_slicedToArray","_i","_s","_e","_x","_r","_arr","_n","_d","asyncGeneratorStep","gen","_next","_throw","_asyncToGenerator","args","arguments","apply","_classCallCheck","instance","Constructor","_toPropertyKey","input","prim","toPrimitive","res","hint","String","_defineProperties","target","props","descriptor","_createClass","protoProps","staticProps","_defineProperty","_assertThisInitialized","ReferenceError","_setPrototypeOf","p","bind","_inherits","subClass","superClass","_possibleConstructorReturn","_getPrototypeOf","State","cname","cvalue","Date","setTime","getTime","expires","toUTCString","document","cookie","_step","_iterator","_createForOfIteratorHelper","split","s","_cstr$split2","k","v","trim","e","f","cKey","concat","fetchLocal","darkModeLK","window","localStorage","setItem","JSON","stringify","getItem","parse","removeItem","requestJSON","_x2","_x3","_requestJSON","_callee","addr","reqBody","response","_context","fetch","headers","Headers","body","status","json","requestSuccessful","t0","text","msg","postJSON","_x4","_x5","_postJSON","_callee2","data","_context2","getJSON","_x6","_getJSON","_callee3","_context3","storeLocal","popupsLK","leftMarketDockLK","locale","Errors","ID_NO_PASS_ERROR_MSG","ID_BUY","ID_SELL","ID_VERSION_NOT_SUPPORTED","ID_NO_ASSET_WALLET","ID_EXECUTED","ID_BOOKED","ID_CANCELING","ID_PASSWORD_NOT_MATCH","ID_UNKNOWN","ID_SETTLING","ID_CANCELED","ID_REVOKED","ID_NONE_SELECTED","ID_API_ERROR","ID_LOCKED","ID_INVALID_ADDRESS_MSG","ID_LIMIT_ORDER","ID_MARKET_ORDER","ID_MATCH_STATUS_REDEMPTION_SENT","ID_MATCH_STATUS_REDEMPTION_CONFIRMED","ID_MATCH_STATUS_REFUND_PENDING","ID_ORDER_ACCELERATION_ERR_MSG","ID_DISCONNECTED","ID_BROWSER_NTFN_ENABLED","ID_ORDER_BUTTON_BUY_BALANCE_ERROR","ID_ORDER_BUTTON_SELL_BALANCE_ERROR","ID_ORDER_BUTTON_QTY_ERROR","ID_ORDER_BUTTON_QTY_RATE_ERROR","ID_CREATE_ASSET_WALLET_MSG","ID_TRADING_TIER_UPDATED","ID_INVALID_TIER_VALUE","ID_MATCH_BUFFER","ID_NO_PLACEMENTS","ID_INVALID_VALUE","ID_NO_ZERO","ID_BOTTYPE_BASIC_MM","ID_BOTTYPE_ARB_MM","ID_BOTTYPE_SIMPLE_ARB","ID_CEXBALANCE_ERR","ID_PENDING","ID_COMPLETE","ID_CEX_NOT_CONNECTED","loadLocale","_loadLocale","lang","commitHash","skipCache","specs","localeSpecsKey","localeKey","prep","expression","replace","_","stringTemplateParser","clearLocale","removeLocal","parser","DOMParser","BipIDs","BipSymbolIDs","_Object$keys","parseInt","BipSymbols","RateEncodingFactor","log10RateEncodingFactor","Math","round","log10","languages","navigator","filter","intFormatter","Intl","NumberFormat","maximumFractionDigits","fourSigFigs","minimumSignificantDigits","maximumSignificantDigits","decimalFormatters","fullPrecisionFormatters","fullPrecisionFormatter","prec","locales","formatter","formatters","min","max","fmt","minimumFractionDigits","convertToConventional","unitInfo","conventional","conversionFactor","Doc","_blink","_animate","el","id","querySelector","ev","opts","_step2","_iterator2","addEventListener","removeEventListener","html","parseFromString","contains","rect","getBoundingClientRect","pageX","left","right","pageY","top","bottom","box","docEl","documentElement","scrollTop","scrollLeft","w","offsetWidth","h","offsetHeight","bodyTop","bodyLeft","width","height","centerX","centerY","parent","kid","parentMetrics","layoutMetrics","kidMetrics","_len","els","_key","_i2","_els","firstChild","removeChild","ancestor","empty","_len2","kids","_key2","_i3","_kids","appendChild","_len3","_key3","_i4","_els2","classList","add","_len4","_key4","_i5","_els3","remove","timeout","_this","_len5","_key5","show","setTimeout","hide","vis","_len6","_key6","duration","easingAlgo","Animation","wait","_ref","_ref2","r","g","b","isDark","animate","style","outline","querySelectorAll","children","console","warn","createElement","_step3","_iterator3","applySelector","vAtomic","_convertToConventiona2","Number","isInteger","format","decimalFormatter","encRate","bui","qui","rateStepEnc","convRate","rateStepDigits","floor","maxDecimals","sigFigFormatter","_sigFigFormatter$form","_sigFigFormatter$form2","formatToParts","part","formatSigFigsWithFormatters","_convertToConventiona6","rate","intl","atoms","ui","prefs","unitFactors","_unitFactors","atomicUnit","unit","denominations","alt","resolveUnitConversions","logDiffs","entryDiff","abs","_i6","_Object$entries","entries","best","reduce","cFactor","_this$bestConversion2","bestConversion","_this$bestConversion4","formatFourSigFigs","assetID","formatBestValueElement","setText","feeRateDenom","_this$formatBestUnits2","formatBestUnitsFourSigFigs","span","safeSelector","dataset","baseUnitInfo","quoteUnitInfo","_ref3","symbol","indexOf","substring","bipSymbol","parts","logoPath","asset","useLogo","ticker","symbolSpan","textContent","toUpperCase","parentSymbol","parentLogo","src","parentSup","selector","_step4","_iterator4","_step5","_iterator5","_len7","tmpls","_key7","tmpl","removeAttribute","_step6","_iterator6","ms","formatDuration","secs","m","padStart","dur","y","mo","seconds","count","_timeMod2","timeMod","aYear","_timeMod4","aMonth","_timeMod6","aDay","_timeMod8","anHour","_timeMod10","aMinute","_timeMod12","_len8","inputFields","_key8","_i7","_inputFields","inputField","passive","display","amount","formatFiatConversion","parentElement","thread","run","_stopAndWait","_wait","_run","easer","start","end","range","frameDuration","now","Easing","linear","Forever","MAX_SAFE_INTEGER","endAnimation","runCompletionFunction","sleep","_x7","_callee4","_context4","_callee5","_context5","t","easeIn","easeOut","easeInHard","easeOutHard","easeOutElastic","c4","PI","pow","sin","WalletIcons","stateElement","icons","sleeping","locked","unlocked","nowallet","syncing","nopeers","disabled","tooltip","wallet","syncIcon","running","peerCount","synced","syncProgress","toFixed","setSyncing","open","AniToggle","toggle","errorEl","initialState","callback","_this2","_ref4","_callee6","newState","_context6","stopPropagation","toggling","_x8","setState","NumberInput","_opts$prec","_opts$changed","_opts$min","_this3","sigFigs","toFourSigFigs","toPrecision","changed","set","inputChanged","_fmt2","parseFloatDefault","IncrementalInput","_NumberInput","_super","_opts$inc","_this4","inc","up","down","increment","sign","MiniSlider","_this5","color","track","ball","button","preventDefault","startX","clientWidth","startLeft","trackMouse","ee","l","mouseUp","unbind","x","clamp","ord","endsWith","maxPrec","inputValue","defaultValue","parseFloat","setupCopyBtn","_x9","_x10","_x11","_x12","_setupCopyBtn","_callee7","txt","textEl","btnEl","textOriginalColor","btnOriginalColor","_context7","clipboard","writeText","application","orderOptTmpl","booleanOptTmpl","rangeOptTmpl","BasePage","ConnectionStatus","ApprovalStatus","PeerSource","PrepaidBondID","app","setOptionTemplates","page","threeSigFigs","Option","opt","report","node","cloneNode","parseTemplate","optName","displayname","description","chainIcon","on","enable","disable","BooleanOption","_Option","_createSuper","dict","cfg","control","controls","reason","store","XYRangeOption","_Option2","_super2","xyRange","setVal","handler","XYRangeHandler","selected","settingsDict","settingsKey","setValue","initVal","_opts$settingsKey","_opts$selected","_opts$updated","rangeLblStart","label","rangeLblEnd","xUnit","yUnit","roundX","Boolean","roundY","setDisabled","updated","convert","slider","rangeX","rangeY","normalizeX","scrollingX","accept","skipUpdate","clickOutX","xInput","xx","focus","clickOutY","yInput","yy","emit","skipChange","sliderBox","_cfg","rEffective","sellString","sell","toLowerCase","toLocaleLowerCase","typeString","tif","isMarketBuy","hasActiveMatches","order","matches","active","statusString","isLive","cancelling","filled","qty","match","isCancel","settled","side","averageMarketOrderRateString","_ord$matches","rateStr","formatCoinValue","conventionalRate","baseID","quoteID","averageRate","_ord$matches2","rateProduct","baseQty","baseToQuote","base","revokedMatchStatus","matchStatus","isCancellable","PIPI","plusChar","fromCharCode","minusChar","darkTheme","axisLabel","gridBorder","gridLines","gapLine","zoom","zoomHover","sellLine","buyLine","sellFill","buyFill","crosshairs","legendFill","legendText","lightTheme","Chart","reporters","theme","canvas","visible","ctx","getContext","textAlign","textBaseline","mousePos","clientX","clientY","draw","ResizeObserver","resize","observe","wheelLimiter","wheel","click","setVis","visibilityState","renderScheduled","unattachers","clearRect","render","deltaY","clientHeight","plotExtents","Extents","xLblExtents","yLblExtents","plotRegion","Region","xRegion","yRegion","requestAnimationFrame","bigger","u","fontSize","font","fillStyle","labels","minX","maxX","unitLines","extents","plot","tools","applyLabelStyle","lastX","unitCenter","leftEdge","rightEdge","lbls","lbl","measureText","fillText","lineWidth","strokeStyle","line","minY","maxY","_this6","fillRect","save","beginPath","roundRect","fill","restore","lastY","xPad","region","_this7","step","valFmt","yLabels","makeLabels","dataExtents","yAxisWidth","widest","x0","y0","x1","y1","skipStroke","radius","dot","DepthChart","_Chart","_this8","resized","clicked","zoomed","zoomLevel","lines","markers","buys","sells","setZoomBttns","zoomInBttn","zoomOutBttn","book","wheeled","translator","unx","lotSize","conventionalRateStep","baseUnit","quoteUnit","_this$gap2","gap","midGap","gapWidth","minZoom","_this9","clear","_this$gap4","halfWindow","high","low","buyMarkers","sellMarkers","sort","buyDepth","buyEpoch","sellDepth","sellEpoch","volumeReport","buyBase","buyQuote","sellBase","sellQuote","sum","epochSum","epoch","floatCompare","shift","buySum","last","epochBuySum","sellSum","epochSellSum","growthFactor","mouseData","xLabels","plotXGrid","makeYLabels","plotYGrid","topCenterX","midX","topCenterY","zoomPct","xRange","zoomText","bttnLeft","bttnTop","bttnSize","setExtents","hover","midY","tolerance","hoverMarkers","marker","hovered","withinTolerance","size","tip","sqrt","moveTo","lineTo","closePath","stroke","dataX","evalSide","trigger","ptX","dotColor","bestDepth","pt","setLineDash","depth","drawDepth","plotYLabels","plotXLabels","volume","mouse","firstPt","yZero","globalAlpha","bestGapBuy","bestGapSell","CandleChart","_Chart2","_this10","numToShow","_this11","ext","candleExtents","yRange","candleRegion","volumeExtents","volumeRegion","resizeTimer","clearTimeout","idx","zoomLevels","candles","_app$assets$this$mark","_this12","candleWidth","allCandles","c","truncate","endStamp","paddedStart","paddedWidth","first","highRate","lowRate","matchVolume","highVol","xStart","xEnd","rateStep","market","ratestep","mouseCandle","selectedStartStamp","rFactor","rateConversionFactor","assets","baseid","basesymbol","screenW","diff","tick","zoneOffset","getTimezoneOffset","dayStamp","lastDay","lastYear","pts","months","getMonth","getDate","getHours","getMinutes","year","getFullYear","makeCandleTimeLabels","volDataExtents","startRate","endRate","_ref5","cx","strokeRect","yExt","rangeTxt","toLocaleString","rangeWidth","xExt","rectArgs","rangeHeight","_ref6","qFactor","bFactor","maxCandles","Wave","_Chart3","_super3","_this13","zIndex","random","colorShift","amplitudes","ks","speeds","phases","single","angularX","angularTime","cos","ani","drawValues","_ref7","cw","ch","message","ypad","halfH","msgRegion","_this14","hsl","_this$canvas","_this$opts","bg","backgroundColor","lineCap","grad","createLinearGradient","addColorStop","prog","xMin","xMax","yMin","yMax","screenMinX","screenMaxY","screenH","xFactor","yFactor","_y2","uny","_w2","_h2","drawFunc","skipMask","clip","spacingGuess","tickGuess","absMax","unitW","arc","ReputationMeter","div","cleanTemplates","penaltyMarkerTmpl","host","_app$exchanges$host","exchanges","auth","maxScore","penaltyThreshold","score","rep","displayTier","strongTier","minScore","warnPct","scoreWarn","pos","scorePointer","scoreMin","scoreMax","bonus","limitBonus","scoreTray","markerPct","scoreData","weakStrength","targetTier","effectiveTier","preparcelQuantity","mkt","_mkt$spot","_mkt$spot2","spot","bookVolume","lotsize","parcelWeight","_mkt$spot3","likelyTaker","epochWeight","bookWeight","settlingWeight","coinIDTakerFoundMakerRedemption","ethBasedExplorerArg","cid","startsWith","ethExplorers","_ethExplorers","_ethBasedExplorerArg2","_ethBasedExplorerArg4","_ethBasedExplorerArg6","polygonExplorers","_polygonExplorers","_ethBasedExplorerArg8","_ethBasedExplorerArg10","_ethBasedExplorerArg12","CoinExplorers","_cid$split2","txid","vout","_cid$split4","_cid$split6","_2","_3","_4","_5","_6","_7","_8","_9","_10","formatCoinID","makerAddr","setCoinHref","link","net","user","assetExplorer","token","parentID","baseChainID","href","explorerCoin","GapStrategyMultiplier","GapStrategyAbsolute","GapStrategyAbsolutePlus","GapStrategyPercent","GapStrategyPercentPlus","botTypeBasicMM","botTypeArbMM","botTypeBasicArb","CEXDisplayInfos","logo","MM","MarketMakerBot","_cexBalance","_status","_stopBot","_startBot","_report","_removeBotConfig","_updateCEXConfig","_updateBotConfig","config","startTime","_Object$values","mmStatus","bots","botStatus","runStats","cexName","_this$cexBalanceCache","cexBalanceCache","_callee8","cexBalance","_context8","runningBotInventory","_c$assetID$locked","_c$assetID","_c$assetID$reserved","_c$assetID2","_c$assetID$available","_c$assetID3","_d$assetID$locked","_d$assetID","_d$assetID$reserved","_d$assetID2","_d$assetID$available","_d$assetID3","_d$assetID$available2","_d$assetID4","_c$assetID$available2","_c$assetID4","_d$assetID$locked2","_d$assetID5","_c$assetID$locked2","_c$assetID5","dexBalances","cexBalances","cex","reserved","avail","available","total","dex","setMarketElements","_app$assets$baseID","baseName","baseSymbol","baseToken","setSrc","_app$assets","baseFeeUI","baseFeeName","baseFeeSymbol","_app$assets$quoteID","quoteName","quoteSymbol","quoteToken","_app$assets2","quoteFeeUI","quoteFeeName","quoteFeeSymbol","setCexElements","dinfo","img","calculateQuoteLot","baseRate","fiatRatesMap","quoteRate","OrderUtil","PlacementsChart","loadedCEX","cexLogo","Image","_cfg$dict","buyPlacements","sellPlacements","profit","baseFiatRate","botType","drawDashedLine","isBasicMM","cexGapL","cexGapR","buyLots","lots","sellLots","maxLots","fauxSpacer","leftmost","gapFactor","rightmost","ps","matchBuffer","minRange","maxCommitUSD","regionHeight","log","drawImage","plotSide","isBuy","placements","reg","_ref8","sideFactor","firstX","cumulativeLots","rawX","xInfinity","hostedMarketID","liveBotConfig","liveBotStatus","statuses","sumLots","BotMarket","find","_ref9","_app$assets$baseID2","baseTicker","baseFactor","baseFeeID","_app$assets$this$base","baseWallet","baseIsAccountLocker","traits","baseFeeTicker","baseFeeFactor","_app$assets$quoteID2","quoteTicker","quoteFactor","quoteFeeID","_app$assets$this$quot","quoteWallet","quoteIsAccountLocker","quoteFeeTicker","quoteFeeFactor","mktID","_markets$this$mktID","markets","lotSizeConv","quoteLot","quoteLotConv","baseFeeFiatRate","quoteFeeFiatRate","arbMarketMakingConfig","baseLots","quoteLots","nBuyPlacements","nSellPlacements","simpleArbConfig","uiConfig","simpleArbLots","basicMarketMakingConfig","_initialize","_callee9","_context9","marketReport","lotSizeUSD","quoteLotUSD","quoteFiatRate","proj","projectedAllocations","botCfg","latestEpoch","cexProblems","cexBaseBalance","cexQuoteBalance","_ref10","walletMap","_ref11","bInv","qInv","cexBaseAvail","cexQuoteAvail","cexes","balances","dexBaseAvail","balance","dexQuoteAvail","baseAvail","quoteAvail","baseFeeWallet","quoteFeeWallet","baseFeeAvail","dexBaseFeeAvail","cexBaseFeeAvail","bFeeInv","quoteFeeAvail","dexQuoteFeeAvail","cexQuoteFeeAvail","qFeeInv","_this$marketReport","baseFees","quoteFees","_this$cfg$uiConfig","baseConfig","quoteConfig","feesAndCommit","orderReservesFactor","_this$cfg$uiConfig2","_this$feesAndCommit","commit","fees","bProj","bookingFees","swapFeeReserves","orderReserves","slippageBuffer","qProj","quote","tokenFeesPerSwap","swapFeeN","slippageBufferFactor","alloc","addAlloc","amt","_alloc$assetID","_this$proj","cexRebalance","_this$adjustedBalance","adjustedBalances","canRebalance","cexMinBaseAlloc","_ref12","dexMinBaseAlloc","transferableBaseAlloc","dexBaseFeeReq","_ref13","dexMinQuoteAlloc","cexMinQuoteAlloc","transferableQuoteAlloc","dexQuoteFeeReq","basis","dexBaseFunded","cexBaseFunded","dexQuoteFunded","cexQuoteFunded","totalBaseReq","totalQuoteReq","baseFundedAndBalanced","quoteFundedAndBalanced","baseFeesFunded","quoteFeesFunded","fundedAndBalanced","fundedAndNotBalanced","req","funded","transferable","starved","RunningMarketMakerDisplay","forms","elements","orderReportFormEl","orderReportForm","idDescendants","dexBalancesRowTmpl","placementRowTmpl","placementAmtRowTmpl","stopBttn","runLogsBttn","_this4$mkt","loadPage","returnPage","buyOrdersBttn","showOrderReport","sellOrdersBttn","_setBotMarket","_setMarket","_stop","_callee10","_this$mkt","loaded","_context10","loading","stopBot","_callee11","_context11","_ref14","initialize","setBotMarket","_x13","_x14","_x15","_callee12","_basicCfg$gapStrategy","_ref15","_cfg$arbMarketMakingC","_cfg$arbMarketMakingC2","_cfg$simpleArbConfig","_this$mkt2","basicCfg","gapStrategy","_context12","baseFeeReservesBox","quoteFeeReservesBox","baseFeeLogo","quoteFeeLogo","profitTrigger","profitLabel","gapLabel","multiplierLabel","profitUnit","gapUnit","multiplierUnit","update","readBook","_x16","_this$mkt3","_this$mkt4","currentForm","currentFormID","orderReport","displayedOrderReportFormSide","buysReport","sellsReport","updateOrderReport","epochNum","close","_this$mkt5","problems","runTime","hmsSince","_runStats$feeGap","_runStats$feeGap2","_runStats$feeGap4","_this$mkt6","_this$mkt6$marketRepo","_this$mkt$status","_this$mkt$status$botC","bmmCfg","stats","cexRow","pendingDepositBox","pendingWithdrawalBox","setTicker","setInterval","setSignedValue","profitLoss","profitRatio","profitSign","plSign","summedBalance","pending","dexBaseInv","walletBaseInventory","walletBaseInvFiat","dexQuoteInv","walletQuoteInventory","walletQuoteInvFiat","cexBaseInv","cexBaseInventory","cexBaseInventoryFiat","cexQuoteInv","cexQuoteInventory","cexQuoteInventoryFiat","feeBalance","baseFeeReserves","quoteFeeReserves","pendingDeposits","pendingWithdrawals","completedMatches","tradedUSD","tradedUSDBox","roundTripFeesBox","roundTripFeesUSD","feeGap","roundTripFees","basisPrice","displayFeeGap","feeGapBox","_runStats$feeGap3","feeGapPct","gapStrategyBox","remoteGap","remoteGapBox","remoteGapPct","buyOrdersReportBox","allPlaced","allOrdersPlaced","buyOrdersSuccess","buyOrdersFailed","sellOrdersReportBox","sellOrdersSuccess","sellOrdersFailed","preOrderProblemMessages","botProblemMessages","preOrderProblems","cexErrorMessages","msgs","depositErr","_Object$entries3","_Object$entries3$_i","assetSymbol","time","stamp","withdrawErr","_i8","_Object$entries4","_Object$entries4$_i","tradeErr","cexProblemMessages","allMessages","preOrderProblemsBox","spanEl","clearInterval","form","sideTxt","orderReportTitle","orderReportError","orderReportDetails","problemMessages","_problemMessages","dexBalancesBody","placementsBody","createRow","row","rowTmpl","assetLogo","availableDexBals","required","requiredDexBals","remaining","remainingDexBals","used","usedDexBals","deficiency","safeSub","deficiencyWithPending","assetIDs","includes","cexAsset","totalDeficiency","rows","_assetIDs","_createRow2","dexDeficiencyHeader","dexDeficiencyWithPendingHeader","setDeficiencyVisibility","cexSection","counterTradeRateHeader","requiredCEXHeader","usedCEXHeader","cexDisplayInfo","cexBalancesTitle","cexAssetID","cexAssetLogo","availableCexBal","requiredCexBal","remainingCexBal","pendingCexBal","reservedCexBal","usedCexBal","deficiencyCexBal","deficiencyWithPendingCexBal","cexAvailable","cexLocked","cexRequired","cexRemaining","cexPending","cexUsed","deficient","cexDeficiencyHeader","cexDeficiencyWithPendingHeader","cexDeficiency","cexDeficiencyWithPending","anyErrors","errorHeader","createPlacementRow","placement","priority","baseUI","quoteUI","formatRateFullPrecision","standingLots","orderedLots","counterTradeRate","_assetIDs2","requiredAmt","requiredDex","usedAmt","usedDex","requiredRow","requiredRowTmpl","usedRow","usedRowTmpl","requiredDEX","usedDEX","requiredCEX","usedCEX","requiredCex","usedCex","errMessages","join","_this$mkt7","orders","nBookedOrders","vEl","signEl","baseOrderReservesFactor","quoteOrderReservesFactor","baseTokenFeesPerSwap","baseRedeemReservesPerLot","estimated","swap","redeem","baseBookingFeesPerLot","refund","quoteTokenFeesPerSwap","quoteRedeemReservesPerLot","quoteBookingFeesPerLot","baseReservesFactor","quoteReservesFactor","baseBookingFees","baseRedeemFees","quoteBookingFees","quoteRedeemFees","_objectSpread","bookingFeesPerLot","bookingFeesPerCounterLot","swapReservesFactor","redeemReservesFactor","dexHost","walletNotSynced","_Object$entries$_i","noWalletPeers","_Object$entries2","_Object$entries2$_i","accountSuspended","userLimitTooLow","noPriceSource","cexOrderbookUnsynced","causesSelfMatch","unknownError","mmstatus","Forms","formsDiv","closed","mouseInElement","keyup","_show","animationLength","progress","closedForm","NewWalletForm","success","backFunc","goBack","walletTabTmpl","subform","WalletConfigForm","walletSettings","walletCfgGuide","tmplElement","submitAdd","submit","oneBttn","registerNoteFeeder","walletstate","note","reportWalletState","walletsync","parentSyncer","createwallet","reportCreationUpdate","_loadDefaults","_setError","_update","_setAsset","_runParentSync","_submit","_createWallet","createUpdater","walletType","parentForm","createForm","pass","newWalletPass","map","_this$current","parentAsset","selectedDef","newWalletErr","current","createWallet","checkResponse","setError","runParentSync","_this$current2","parentSyncPct","parentName","childName","childLogo","mainForm","parentSyncing","syncParent","topic","subject","details","tabs","_this$current3","winfo","pinfo","walletDefs","_loop","parseAsset","walletTypeTabs","assetName","tokenMsgBox","tokenParentLogo","tokenParentName","availablewallets","wDef","tab","t1","bindTooltips","walletCreationPending","walletDef","guideLink","configOpts","containsRequired","_this$current4","displayCreateBtn","parentAndTokenOpts","tokenOpts","tokenOptsCopy","walletPassAndSubmitBttn","oneBttnBox","newWalletPassBox","guidelink","configopts","isBirthdayConfig","seedGenTime","toUnixDate","seeded","walletSettingsHeader","noauth","regAsset","setGuideLink","fileSelector","loadDefaults","errMsg","_this$current5","configID","configpath","setLoadedConfig","dynamicInputCounter","sectionize","configElements","allSettings","dynamicOpts","textInputTmpl","dateInputTmpl","checkboxTmpl","repeatableTmpl","fileInput","showOther","showIcon","hideIcon","showHideMsg","otherSettings","loadedSettingsMsg","loadedSettings","defaultSettingsMsg","defaultSettings","fileInputChanged","setOtherSettingsViz","_fileInputChanged","_this$dynamicOpts","files","loadedOpts","defaultOpts","configtext","append","setConfig","reorder","insertAfter","skipRepeatN","_app$extensionWallet","isboolean","isdate","repeatable","addOpt","repeatN","extensionWallet","hiddenFields","configKey","elID","htmlFor","prepend","logoPathFromID","after","noecho","autocomplete","checked","getMinMaxVal","minMax","dateToString","date","disablewhenactive","assetHasActiveOrders","activeOrders","defaultedOpts","_step7","_iterator7","finds","handledRepeatables","removes","vals","firstVal","newEl","_removes","splice","_this$loadedSettings","_step8","_iterator8","_step8$value","minDate","MIN_SAFE_INTEGER","maxDate","inputs","_step9","_iterator9","_step9$value","_step10","_iterator10","_step11","_iterator11","ConfirmRegistrationForm","certFile","submitForm","_submitForm","xc","tier","_asset$unitInfo$conve","bondAssetID","bondLockConventional","bondAssets","tradingTier","bondLock","bondUnit","bondLockUSDBox","bondLockUSD","feeReserves","reservesUnit","transform","opacity","offset","bondAsset","dexAddr","url","_context13","regErr","innerText","viewOnly","cert","bond","FeeAssetSelectionForm","currentBondTmpl","bondAssetTmpl","marketTmpl","tradingTierInput","setTier","acceptTier","submitTradingTier","tierUp","incrementTier","tierDown","goBackToAssets","tradingTierForm","assetForm","whatsABond","whatsABondPanel","hideWhatsABond","bondGotIt","whatsABondBack","usePrepaidBond","showPrepaidBondForm","ppbGoBack","hidePrepaidBondForm","submitPrepaidBond","walletCreated","_submitPrepaidBond","_animate2","tradingTierErr","regAssetErr","assetRows","marketRows","prepaidBonds","clearErrors","addBondRow","_asset$unitInfo$conve2","tr","assetSelected","feeSymbol","bondSizeConventional","feeAmt","fiatRate","fiatBox","fiatBondAmount","ready","addMarketRow","quoteid","_step12","_xc$assets$baseID","_xc$assets$quoteID","_iterator12","_step13","_iterator13","baseLogo","quoteLogo","parcelSize","parcelsize","conventionalLotSize","startingLimit","privilegedLimit","tradeLimitLow","tradeLimitHigh","fiatTradeLimitLow","fiatTradeLimitHigh","fiatTradeLowBox","fiatTradeHighBox","_Object$values$_i","_Object$values2","validBondAssetSelected","_xc$auth","setReadyMessage","setExchange","selectedAssetID","_this$page","_page$tradingTierInpu","_app$assets$assetID","_ui$conventional","raw","setTierError","bondSizeDisplay","_step14","_iterator14","_step15","_iterator15","bondLockDisplay","fiatLockDisplay","_Object$values3","currentBondAmts","assetIDStr","_wallet$balance","bonded","bondlocked","bondReserves","haveLock","currentBondBox","currentBonds","_i9","bondLocked","_app$assets$_assetID","_ui$conventional2","icon","fiatAmt","fiatLockBox","_page$tradingTierInpu2","_input$value","_callee13","regAssetElements","_context14","_i10","_regAssetElements","marginTop","prepaidBondErr","prepaidBondCode","_callee14","code","_context15","WalletWaitForm","progressCache","progressed","reportProgress","reportBalance","bondFeeBuffer","parentAssetSynced","_asset$wallet","bal","address","_step16","symbolize","_iterator16","depoAddr","syncUncheck","syncCheck","balUncheck","balCheck","syncRemainBox","bondCostBreakdown","balanceBox","bondLockNoFees","bondLockFees","need","reservesDeficit","totalForBond","sendEnough","txFeeBox","sendEnoughForToken","txFeeBalanceBox","sendEnoughWithEst","txFee","parentFees","tokenFees","txFeeUnit","parentUnit","parentBalUnit","parentBal","fee","syncSpinner","parentAvail","syncRemaining","syncFinishingUp","cache","progDelta","progRate","toGoTime","syncRemain","AccelerateOrderForm","accelerateSubmit","submitEarlyConfirm","sendAccelerateRequest","_updateAccelerationEstimate","_refresh","_submit2","_sendAccelerateRequest","earlyAcceleration","recentAccelerationTime","timePast","recentSwapTime","wasAcceleration","recentAccelerationMsg","recentSwapMsg","configureAccelerationDiv","accelerateErr","earlyAccelerationDiv","_callee15","_context16","orderID","newRate","acceleratedRate","accelerateMainDiv","accelerateTxID","txID","preAccelerateErr","accelerateMsgDiv","accelerateSuccess","_callee16","_context17","displayEarlyAccelerationMsg","_callee17","preAccelerate","updateRate","rangeHandler","_context18","feeEstimateDiv","currencyUnit","suggestedRange","accelerateAvgFeeRate","swapRate","accelerateCurrentFeeRate","suggestedRate","newY","updateAccelerationEstimate","sliderContainer","_callee18","_context19","feeRateEstimate","feeEstimate","DEXAddressForm","dexToUpdate","certPicker","CertificatePicker","skipRegistration","showOrHideSubmitBttn","showCustom","customBox","knownExchanges","knownXCs","_step17","_iterator17","_loop2","_step18","_iterator18","checkDEX","addDexHdr","skipRegistrationBox","updateDexHdr","refresh","_checkDEX","_animate3","clearCertFile","pickServerMsg","addCustomMsg","_step19","_iterator19","isDisplayed","_this$page$skipRegist","_callee19","_context20","_callee20","endpoint","_context21","file","newHost","oldHost","needCert","fetchUser","paid","pendingBonds","DiscoverAccountForm","_this15","_checkDEX2","_animate4","_callee21","_context22","_callee22","_context23","LoginForm","_this16","login","handleLoginNote","_animate5","_submit3","loginMsg","idel","pw","_callee23","_context24","showFormError","notes","pokes","loggedIn","_callee24","_context25","DepositAddress","_this17","unifiedReceiverTmpl","newDepAddrBttn","_callee25","_context26","newDepositAddress","copyAddressBtn","copyAddress","_copyAddress","_newDepositAddress","_setAsset2","_callee26","_context27","depositTokenMsgBox","depositLogo","depositName","depositTokenParentLogo","depositTokenParentName","newDepAddrBttnBox","setAddress","_this18","unifiedReceivers","receivers","_loop3","_i11","recvType","recv","_i12","_arr2","bttn","setCentralAddress","unified","depositAddress","qrcode","_callee27","_context28","_callee28","_context29","copyAlert","AppPassResetForm","_this19","resetAppPWSubmitBtn","resetAppPW","_resetAppPW","_callee29","newAppPW","confirmNewAppPW","_this20","_context30","newAppPassword","confirmNewAppPassword","appPWResetErrMsg","newPass","seed","seedInput","appPWResetSuccessMsg","_this21","selectedCert","onCertFileChange","removeCert","addCert","_file","_onCertFileChange","_callee30","_context31","_callee31","_context32","TokenApprovalForm","_this22","approve","_approve","_setAsset3","_callee32","_tokenAsset$token","tokenAsset","protocolVersion","_app$assets$parentID","_app$assets$parentID$","feeText","_context33","submissionElements","txMsg","addressBox","tokenSymbol","version","approving","parentTicker","_callee33","_context34","CEXConfigurationForm","_this23","cexSubmit","_submit4","cexConfigPrompt","cexConnectErrBox","cexFormErr","cexApiKeyInput","cexSecretInput","cexStatus","connectErr","cexConnectErr","apiKey","apiSecret","_callee34","_e$msg","_context35","updateCEXConfig","slideSwap","_slideSwap","_callee35","form1","form2","_context36","showSuccess","successMessage","checkmarkForm","checkmark","startR","startG","startB","diffR","diffG","diffB","submitBttn","wrapper","dateApplyOffset","toISOString","RegistrationPage","_BasePage","_newWalletCreated","_registerDEXSuccess","_getCertFile","_getBondsFeeBuffer","_animateConfirmForm","_animateRegAsset","_requestFeepayment","_auth","dexAddrForm","discoverAcctForm","resetPassFormCloser","newWalletForm","newWalletCreated","confirmRegisterForm","animateRegAsset","requestFeepayment","regAssetForm","bondsFeeBuffer","registerDEXSuccess","getBondsFeeBuffer","setAsset","animateConfirmForm","walletWaitForm","setWallet","walletWait","confirmRegForm","authed","oldForm","feeBuffer","updateMenuItemsDisplay","backTo","bondAmt","LoginPage","_loggedIn","loginForm","prepAndDisplayLoginForm","resetAppPWForm","appPassResetForm","forgotPassBtn","traitFundsMixer","ticketStatusTranslationKeys","positiveTxTypes","negativeTxTypes","noAmtTxTypes","txTypeSignAndClass","txType","txTypeTranslationKeys","txTypeString","ticketPageSize","WalletsPage","_confirmForceSubmit","_recoverWallet","_displayRestoreWalletInfo","_exportWalletAuthSubmit","_displayExportWalletAuth","_downloadLogs","_lock","_reconfig","_send","_populateMaxSend","_doConnect","_showSendForm","_showDeposit","_showReconfig","_openWallet","_rescanWallet","_loadEarlierTxs","_showTxHistory","_getTxHistory","_showRecentActivity","_updateMixerState","_updatePrivacy","_prevTicketPage","_nextTicketPage","_showTicketHistory","_ticketPageN","_setVSP","_purchaseTickets","_showVSPPicker","_updateTicketBuyer","_checkNeedsProvider","_setSelectedAsset","_showNewWallet","_showSuccess2","_showForm","_showBox","_toggleWalletStatus","_spinUntilPeersUpdate","_submitAddPeer","_showManagePeersForm","_updateWalletPeersTable","_showUnapproveTokenAllowanceTableForm","_showUnapproveTokenAllowanceForm","_submitUnapproveTokenAllowance","_validateSendAddress","_cancelSend","_stepSend","_safePost","stampers","secondTicker","timeSince","setStamp","restoreInfoCard","connectedIconTmpl","disconnectedIconTmpl","removeIconTmpl","closePopups","cancelForce","iconSelectTmpl","balanceDetailRow","recentOrderTmpl","vspRowTmpl","ticketHistoryRowTmpl","votingChoiceTmpl","votingAgendaTmpl","tspendTmpl","tkeyTmpl","txHistoryRowTmpl","txHistoryDateRowTmpl","showNewWallet","connectBttn","doConnect","send","showSendForm","receive","showDeposit","unlockBttn","openWallet","lockBttn","lock","reconfigureBttn","showReconfig","needsProviderBttn","rescanWallet","earlierTxs","loadEarlierTxs","copyTxIDBtn","_this$currTx","currTx","txDetailsID","copyRecipientBtn","_this$currTx2","recipient","txDetailsRecipient","copyBondIDBtn","_this$currTx3","_this$currTx3$bondInf","bondInfo","bondID","txDetailsBondID","copyBondAccountIDBtn","_this$currTx4","_this$currTx4$bondInf","accountID","txDetailsBondAccountID","hideMixTxsCheckbox","showTxHistory","fmtParams","assetUpdated","sortAssetButtons","updateTicketBuyer","updatePrivacy","reconfigForm","reconfigInputs","bindForm","sendForm","submitSendForm","stepSend","vSendForm","vSend","submitReconfig","reconfig","mixerToggle","toggleMixer","mixingErr","updateMixerState","downloadLogs","exportWallet","displayExportWalletAuth","recoverWallet","showRecoverWallet","exportWalletAuth","exportWalletAuthSubmit","recoverWalletConfirm","recoverWalletSubmit","confirmForce","confirmForceSubmit","disableWallet","showToggleWalletStatus","enableWallet","toggleWalletStatusConfirm","toggleWalletStatusSubmit","toggleWalletStatus","managePeers","showManagePeersForm","addPeerSubmit","submitAddPeer","unapproveTokenAllowance","showUnapproveTokenAllowanceTableForm","unapproveTokenSubmit","submitUnapproveTokenAllowance","showVSPs","showVSPPicker","vspDisplay","vspPicker","customVspSubmit","setCustomVSP","purchaseTicketsBttn","showPurchaseTicketsDialog","purchaseTicketsForm","purchaserSubmit","purchaseTickets","purchaserInput","purchaserInputChanged","ticketHistory","showTicketHistory","ticketHistoryNextPage","nextTicketPage","ticketHistoryPrevPage","prevTicketPage","setVotes","showSetVotesDialog","purchaseTicketsErrCloser","purchaseTicketsErrBox","privacyInfoBttn","showForm","mixingInfo","depositAddrForm","deposit","walletBal","populateMaxSend","sendAmt","showFiatValue","sendValue","maxSend","sendAddr","validateSendAddress","showChangePW","changeWalletPW","setPWSettingViz","changeWalletTypeSelect","changeWalletType","showChangeType","isHidden","changeTypeHideIcon","changeTypeShowIcon","changeTypeMsg","skipAnimation","fiatrateupdate","handleRatesNote","handleBalanceNote","handleWalletStateNote","walletconfig","updateSyncAndPeers","handleCreateWalletNote","walletnote","handleCustomWalletNote","selectedAsset","selectedAssetLK","setSelectedAsset","txHistoryTableBody","age","timestamp","animation","path","subtract","txfee","_app$assets$token$par","feeUI","xcRate","totalSend","_bal","vSendErr","sendErr","vSendEstimates","txFeeNotAvailable","subtractCheckBox","ok","validaddress","vSendSymbol","vSendLogo","vSendFee","formatFullPrecision","vSendFeeFiat","vSendDestinationAmt","vTotalSend","vTotalSendFiat","vSendAddr","balanceAfterSend","balanceAfterSendFiat","approxSign","resp","changePW","switchPWMsg","versionToDEXes","exchange","exchangeAsset","unapprovingTokenVersion","unapproveTokenErr","unapproveTokenTxID","unapproveTokenSubmissionElements","unapproveTokenTxMsg","tokenAllowanceRemoveSymbol","tokenAllowanceRemoveVersion","unapprovalFeeEstimate","unapproveTokenForm","showTable","approved","tokenVersionBody","tokenVersionTableAssetSymbol","assetVersionUsedByDEXes","approvalStatus","removeIcon","Approved","tokenVersionRow","usedBy","showUnapproveTokenAllowanceForm","tokenVersionTable","tokenVersionNone","unapproveTokenTableForm","peers","defaultText","addedText","discoveredText","peerSpinner","managePeersErr","peersTableBody","source","peer","connectionIcon","peerTableRow","WalletDefault","UserAdded","Discovered","connected","spinUntilPeersUpdate","updateWalletPeersTable","managePeersForm","addPeerInput","toggleWalletStatusErr","walletStatusDisable","disableWalletMsg","walletStatusEnable","enableWalletMsg","successMsg","activeOrdersErr","focuser","displayed","defaultsLoaded","assetButtons","assetSelect","sortedAssets","_ref18","aBal","bBal","aTotal","immature","bTotal","localeCompare","_ref19","aFiat","bFiat","updateAssetButton","_tmpl$img","_this$assetButtons$as","noWallet","symbolParts","_tmpl$parentImg","parentImg","totalBalance","_Doc$formatBestUnitsF2","fiat","updateDisplayedAsset","showAvailableMarkets","showRecentActivity","_app$assets$assetID2","fiatBalanceBox","walletDetails","sendReceive","connectBttnBox","statusLocked","statusReady","statusOff","unlockBttnBox","lockBttnBox","peerCountBox","syncProgressBox","statusDisabled","tokenInfoBox","needsProviderBox","feeStateBox","txSyncBox","txProgress","txFindingAddrs","checkNeedsProvider","contractAddress","updateDisplayedAssetBalance","feeState","walletDefinition","updateFeeState","walletDetailsBox","_app$walletMap$assetI","syncStatus","encrypted","haveActiveOrders","txs","blocks","targetHeight","_app$assets$assetID3","feeAssetID","feeFiatRate","formatBestRateElement","feeStateNetRate","feeStateSendFees","feeStateSwapFees","feeStateRedeemFees","feeStateXcRate","sendFiat","feeStateSendFiat","swapFiat","feeStateSwapFiat","redeemFiat","feeStateRedeemFiat","needs","needsCustomProvider","blink","_callee36","_app$assets$assetID4","stakeStatus","_context37","ticketPage","number","history","scanned","stakingBox","pickVSP","stakingSummary","stakingErr","vspDisplayBox","ticketPriceBox","purchaseTicketsBox","stakingRpcSpvMsg","ticketsDisabled","safePost","stakingAgendaCount","stances","agendas","stakingTspendCount","tspends","purchaserCurrentPrice","ticketPrice","purchaserBal","updateTicketStats","votingSubsidy","disableStaking","extensionModeAppName","extensionModeConfig","setVSPViz","vsp","vspURL","isRPC","liveTicketCount","tickets","tkt","stakingTicketCount","immatureTicketCount","mempool","immatureTicketCountBox","queuedTicketCount","queued","formQueuedTix","formQueueTixBox","queuedTicketCountBox","totalTicketCount","ticketCount","totalTicketRewards","totalRewards","totalTicketVotes","votes","_callee37","vsps","_context39","vspPickerList","_context38","feeRate","feePercentage","voting","setVSP","purchaserErr","_callee38","_context40","walletNote","_ref20","payload","purchaseTicketsErr","_callee39","_context41","customVspUrl","pgNum","startOffset","pageOfTickets","pageNumber","coinLink","ticketHistoryRows","ticketHistoryPage","_step6$value","tx","bindUrlHandlers","price","hashStart","hash","hashEnd","detailsLinkUrl","setAttribute","_callee40","_this$ticketPage$hist","lastList","scanStart","skipN","totalTix","atEnd","_context42","blockHeight","ticketHistoryForm","ticketHistoryPagination","ticketHistoryTable","noTicketsMessage","displayTicketPage","_callee41","_context43","ticketPageN","_callee42","_context44","_callee43","_context45","_stakeStatus$stances$","votingFormErr","_ref21","_callee44","_context46","votingForm","_x17","setAgendaChoice","_ref22","_callee45","agendaID","choiceID","agenda","_context47","choices","currentChoice","_x18","_x19","votingAgendas","_loop4","_loop5","choice","choiceTmpl","radio","setTspendVote","_ref23","_callee46","txHash","policyID","tspend","_context48","tSpendPolicy","currentPolicy","_x20","_x21","votingTspends","_loop6","_loop7","_opt$value","yes","no","explorerLink","setTKeyPolicy","_ref24","_callee47","policy","tkey","_context49","treasuryPolicy","treasuryKeys","_x22","_x23","votingTKeys","_loop8","keyPolicy","_loop9","_arr3","_opt$value2","_callee48","_app$extensionWallet2","disablePrivacy","_context50","mixing","mixingBox","mixerOff","mixerOn","mixerLoading","enabled","_x24","_callee49","_context51","_x25","_bal$other","_bal$other2","_bal$other3","totalLocked","contractlocked","balanceUnit","fiatBalance","balanceDetailBox","lastSubLockedRow","lastPrimaryRow","addBalanceRow","cat","tooltipMsg","addPrimaryBalance","addSubBalance","setRowClasses","other","Shielded","transparent","orderlocked","Staked","Unmixed","spotVolume","vol24","_a","hostA","mktA","_b2","hostB","mktB","availableMarkets","_loop10","_markets$_i","_markets","quotesymbol","marketRow","fmtSymbol","priceQuoteUnit","priceBaseUnit","volumeUnit","priceBox","volumeBox","marketsOverviewBox","_callee50","_arr4","to","_ref25","_ref26","_ref27","_context52","orderActivityBox","hosts","noActivity","orderActivity","recentOrders","fromQty","toQty","fromLogo","fromSymbol","toSymbol","toLogo","submitTime","bindInternalNavigation","_x26","amtAssetID","feesAssetID","tokenID","amtAssetUI","feesAssetUI","trimStringWithEllipsis","_txTypeSignAndClass2","showTxDetailsPopup","updateTxHistoryRow","txViewBlockExplorer","txDetailsType","txTypeTooltip","txDetailsAmtSection","_txTypeSignAndClass4","txDetailsAmount","feeAsset","txDetailsFee","txDetailsBlockNumber","blockNumber","dateStr","toLocaleDateString","timeStr","toLocaleTimeString","txDetailsTimestamp","timestampPending","blockNumberPending","txDetailsRecipientSection","txDetailsBondIDSection","txDetailsBondLocktimeSection","txDetailsBondAccountIDSection","lockTime","txDetailsBondLocktime","additionalData","Nonce","txDetailsNonceSection","txDetailsNonce","getWalletTx","setTxDetailsPopupElements","txDetails","newTx","_this$currTx5","hideMixTxs","oldestTx","txDate","txHistoryTableNewestDate","insertBefore","txHistoryRow","txHistoryDateRow","txHistoryTable","noTxHistory","peRow","_callee51","numToFetch","ref","currRes","_res$txs","numToPush","_res$txs2","_context53","lastTx","txHistory","_x27","_x28","_x29","_callee52","txRes","isMixing","hideMixing","oldestDate","_context54","txHistoryBox","txHistoryNotAvailable","getTxHistory","_x30","_callee53","_context55","_callee54","_context56","reconfigErr","forceUrl","forceReq","showConfirmForce","_x31","confirmForceErr","recoverWalletErr","_callee55","_context57","_x32","_callee56","_app$extensionWallet3","currentDef","disableWalletType","option","_context58","currentWalletDefinition","elevateProviders","traitLogFiler","otherActionsLabel","showOrHideRecoverySupportMsg","recfgAssetLogo","recfgAssetName","updateDisplayedReconfigFields","_x33","_x34","setRecoverySupportMsgViz","viz","reconfigSupportMsg","walletSymbol","toLocaleUpperCase","_app$extensionWallet4","disablePassword","_callee57","_context59","_x35","_callee58","_app$assets$assetID5","isWithdrawer","feeReq","canSend","_context60","toggleSubtract","maxSendDisplay","sendTokenMsgBox","sendLogo","sendName","sendTokenParentLogo","sendTokenParentName","maxWithdraw","maxSendFiat","maxSendFee","maxSendFeeFiat","_x36","_callee59","_context61","errorModalMsg","errorModal","_x37","is","_callee60","_app$assets$this$sele","_context62","_callee61","_page$sendForm$datase","_page$subtractCheckBo","_context63","vSendPw","_callee62","_this$data","_context64","newWalletPW","newPW","clearTxHistory","_callee63","_context65","_x38","_callee64","search","_context66","URLSearchParams","URL","location","pathname","_callee65","_context67","exportWalletErr","exportWalletPW","_callee66","_context68","displayRestoreWalletInfo","restorationinfo","_callee67","wr","card","_context69","restoreInfoCardsList","seedName","instructions","restoreWalletInfo","_x39","_callee68","_context70","_callee69","_context71","force","fiatRates","_note$wallet","route","processTicketPurchaseUpdate","handleTxNote","transaction","str","maxLen","_objectWithoutProperties","excluded","sourceKeys","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","NoteTypeOrder","NoteTypeMatch","NoteTypeBondPost","NoteTypeConnEvent","desktopNtfnSettingsKey","desktopNtfnSettings","desktopNtfnLabels","_desktopNtfnLabels","BrowserNotifier","_defaultDesktopNtfnSe","_sendDesktopNotification","_requestNtfnPermission","Notification","permission","ntfnPermissionGranted","sendDesktopNotification","ntfnPermissionDenied","requestPermission","title","ntfn","OSDesktopNotifier","_sendDesktopNotification2","_requestNtfnPermission2","isDesktopWebview","sendOSNotification","isDesktopWebkit","webkit","messageHandlers","bwHandler","postMessage","isWebview","_window$webkit","_window$webkit$messag","Notifier","_desktopNotify","browserNtfnEnabled","plainNote","fetchDesktopNtfnSettings","_State$fetchLocal","coinExplorerTokenRe","orderTokenRe","insertRichNote","inputString","_match","orderToken","outerHTML","noderize","_assetID","SettingsPage","_submitGameCode","_changeAppPW","_submitExportSeedReq","_importAccount","_prepareAccountImport","_onAccountFileChange","_renderDesktopNtfnSettings","fiatRateSources","darkMode","showPokes","showPopups","addADex","reload","currentDEX","importAccount","prepareAccountImport","authorizeAccountImportForm","authorizeImportAccountConfirm","changeAppPW","changeAppPWForm","submitNewPW","accountFile","onAccountFileChange","removeAccount","clearAccountFile","addAccount","exportSeed","exportSeedErr","exportSeedAuth","exportSeedSubmit","submitExportSeedReq","gameCodeLink","gameCodeForm","gameCodeSubmit","submitGameCode","exportSeedPW","legacySeed","mnemonic","renderDesktopNtfnSettings","checkbox","noteType","getAttribute","updateNtfnSetting","ntfnSettings","container","enabledCheckbox","getBrowserNtfnSettings","browserNtfnCheckboxTemplate","browserNtfnCheckboxContainer","requestNtfnPermission","dispatchEvent","Event","permDenied","browserNtfnBlockedMsg","newForm","setFees","selectedAccount","importAccountErr","accountString","account","_account","_account$bonds","bonds","acctInf","_excluded","chunk","_chunk$match","authorizeSeedDisplay","clearValues","changePWErrMsg","appPW","confirmNewPW","gameCodeErr","gameCodeInput","gameCodeMsg","gameCodeSuccess","gameRedeemTx","coinString","gameRedeemValue","win","OrderBook","mktBook","qtyAtomic","less","findIdx","removeFromSide","_this$findOrder2","findOrder","updateRemainingSide","epochIdx","bestGapOrder","forward","handlers","MessageSocket","queue","maxQlength","connection","readyState","WebSocket","OPEN","uri","reloader","retrys","go","conn","onmessage","evt","onclose","delay","onopen","_step$value","request","onerror","bookRoute","bookOrderRoute","unbookOrderRoute","updateRemainingRoute","epochOrderRoute","candlesRoute","candleUpdateRoute","buyBtnClass","sellBtnClass","fiveMinBinKey","percentFormatter","parentIDNone","MarketsPage","_handleConnNote","_submitOrder","_handleBondUpdate","_handleWalletState","_submitCancel","_preOrder","_fetchPreorder","_unlockMarketWallets","_unlockWallet","_unlockWalletsForEstimates","_showVerifyForm","_loadUserOrders","_showTokenApprovalForm","_resolveOrderFormVisibility","_init","main","pageParams","maxOrderUpdateCounter","metaOrders","recentMatches","preorderCache","depthLines","hovers","recentMatchesSortKey","recentMatchesSortDirection","ogTitle","vDetailPane","showVerifyForm","depthReporters","reportDepthClick","reportDepthVolume","reportDepthMouse","z","reportDepthZoom","depthChart","depthZoomLK","candleReporters","reportMouseCandle","candleChart","candlesChart","accelerateOrderForm","accelerateForm","approveTokenForm","candleDur","lastCandleDurationLK","registerBttn","notRegistered","walletInfoTmpl","bWidget","qWidget","wgt","balanceWgt","BalanceWidget","baseIcons","stateIcons","quoteIcons","connect","unlockWallet","expired","newWalletBttn","showCreate","walletAddr","wantProviders","showCustomProviderDialog","runningMMDisplayElements","mm","mmRunning","reputationMeter","orderRowTmpl","durBttnTemplate","userOrderTmpl","recentMatchesTemplate","approveBaseBttn","showTokenApprovalForm","approveQuoteBttn","toggleTradingTier","showTradingTier","tradingLimits","hideTradingTier","toggleTradingReputation","showTradingReputation","hideTradingReputation","buyBttn","setBuy","sellBttn","setSell","limitBttn","swapBttns","marketBttn","setOrderVisibility","rateField","isSell","drawChartLines","setMarketBuyOrderEstimate","maxOrd","maxSell","lotField","maxBuy","maxBuys","adjustedRate","lotChanged","disableMouseWheel","qtyField","mktBuyField","ws","registerRoute","handleBookRoute","handleBookOrderRoute","handleUnbookOrderRoute","handleUpdateRemainingRoute","handleEpochOrderRoute","handleCandlesRoute","handleCandleUpdateRoute","handleEpochMatchSummary","orderForm","stepSubmit","verifyForm","vSubmit","submitOrder","cancelForm","cancelSubmit","submitCancel","vFeeDetails","closeDetailPane","recentMatchesTable","th","setRecentMatchesSortCol","ordercol","unsetRecentMatchesSortColClasses","refreshRecentMatchesTable","setRecentMatchesSortColClasses","sortCls","quantityChanged","marketBuyChanged","rateFieldChanged","previewQuoteAmt","marketSearchV1","filterMarkets","setDisclaimerAckViz","acked","disclaimer","disclaimerAck","showDisclaimer","orderDisclaimerAckedLK","clearChartLines","buyRows","sellRows","userOrders","activeMarkerRate","setDepthMarkers","stats0","marketStats","stats1","headerSpace","closeMarketsList","leftMarketDock","openMarketsList","leftHider","marketReopener","marketSelect","marketList","MarketList","marketListV1","_this$market","_this$market$base","_this$market2","_this$market2$quote","_row$mkt","startLoadingAnimations","setMarket","handleOrderNote","handleMatchNote","handleEpochNote","handleConnNote","bondpost","handleBondUpdate","spots","handlePriceUpdate","handleWalletState","reputation","updateReputation","feepayment","runstats","resolveOrderFormVisibility","epochreport","handleEpochReportNote","cexproblems","handleCexProblemsNote","runevent","loadingAnimations","mord","recentMatchesLiveList","_td$dataset$sinceStam","td","sinceStamp","init","makeMarket","lastMarketLK","exists","setBalanceVisibility","setRegistrationStatusVisibility","anis","maxLbl","setOrderBttnText","isLimit","currentOrder","parseOrder","updateOrderBttnState","_xc$assets$mkt$baseid","volUnit","setPriceAndChange","obPrice","change24","obUp","obDown","_this$market3","ba","baseCfg","qa","quoteCfg","baseIcon","quoteIcon","low24","high24","_this$market4","candleCaches","requestCandles","aDayAgo","_app$assets$base$toke","_base$info","_app$assets$quote$tok","_quote$info","_this$market5","isSupported","bVers","versions","qVers","tifBox","qtyBox","maxBox","mktBuyBox","showOrderForm","_this$market$dex$auth","pendingStrength","_this$market6","_this2$tokenAssetAppr","baseAssetApprovalStatus","quoteAssetApprovalStatus","_this2$market","assetsAreSupported","tokenAssetApprovalStatuses","t2","t3","orderTypeBttns","reputationAndTradingTierBox","_this$assetsAreSuppor","loaderMsg","isBase","_this$market7","_baseAsset$wallet","baseAsset","baseVersion","_quoteAsset$wallet","quoteAsset","quoteVersion","_this$tokenAssetAppro","tokenApproval","approvalRequiredSell","approvalRequiredBuy","approvalRequiredBoth","approvalPendingBaseSymbol","baseTokenAsset","approvalPendingQuoteSymbol","quoteTokenAsset","NotApproved","Pending","approvalPendingBase","approvalPendingQuote","titleContent","confStatusMsg","titleClass","regStatusTitle","regStatusConfsDisplay","registrationStatus","regStatusDex","postingBondsDex","setRegistrationStatusView","confirmationsRequired","confs","connectionStatus","Connected","updateRegistrationStatusView","showSection","section","_elements","bondRequired","bondCreationPending","penaltyCompsRequired","unregisteredDex","penalties","penaltyComps","acctPenalties","acctPenaltyComps","compsDexSettingsLink","hasPendingBonds","acctTier","dexSettingsLink","shortSymbol","isEnabled","disabledTooltipMsg","btn","_this$currentOrder","orderQty","orderRate","setOrderBttnEnabled","aLot","durBttnBox","candleDurs","candleDurationSelected","loadCandles","mktId","cexBook","chartErrMsg","maxEstimateTimer","marketID","sid","maxSellRequested","sellBalance","buyBalance","bookLoaded","displayMessageIfMissingWallet","setWallets","setMarketDetails","setCurrMarketPrice","updateMarketElements","select","setLoaderMsgVisibility","setTokenApprovalVisibility","setCandleDurBttns","updateTitle","setHost","loadUserOrders","_mkt$base","_mkt$quote","_mkt$base2","_mkt$quote2","baseSym","quoteSym","noWalletMsg","asset1","asset2","_this$market8","q","sellBookedBase","sellBookedQuote","buyBookedBase","buyBookedQuote","depthLegend","_Object$values2$_i","hoverPrice","hoverVolume","candle","candlesLegend","candleStart","candleEnd","candleHigh","candleLow","candleVol","limit","qtyConv","convertToAtoms","tifnow","tifNow","options","adjusted","orderErr","preSell","preBuy","orderPreview","quoteQty","setMaxOrder","scheduleMaxEstimate","maxLoaded","bid","qid","bWallet","qWallet","maxLotBox","maxAboveZero","maxZeroNoFees","maxZeroNoBal","maxFromLots","maxFromLotsLbl","counter","maxOrder","fromAsset","conversionRate","anyRate","_app$assets$fromAsset","feeAvail","feeReservesPerLot","maxZeroNoFeesTicker","maxZeroMinFees","maxZeroNoBalTicker","maxFromAmt","maxFromTicker","_this$market9","minimumRate","minRate","_data$book$recentMatc","_this$market10","loadTable","addTableOrder","epochLine","_this$market11","msgRate","buffer","buybuffer","midGapConventional","minMktBuy","_this$market12","_this$market13","oid","resolveUserOrders","maxUserOrderCount","activeOrd","some","dbOrd","_sortedOrders","_sortedOrders2","orderIsActive","sortedOrders","aActive","bActive","userNoOrders","unreadyOrders","header","isActive","readyToTick","sideLight","marketOrderRateString","ordType","updateMetaOrder","currentFloater","showCancel","showAccelerate","cancelBttn","accelerateBttn","canAccelerateOrder","expander","floater","className","addButton","baseBttn","cb","ogScrollY","orderScroller","moved","yShift","unreadyOrdersMsg","activeLight","rateFactor","setMarkers","midGapValue","_this$market14","bUnit","qUnit","_this$market15","handleBook","removeTableOrder","updateRemaining","updateTableOrder","candlesLoading","timer","setHighLow","setCandles","addRecentMatches","matchSummaries","_data$payload","startStamp","openAsset","updateAsset","toAsset","setIcon","vFeeSummary","vPreorderErr","vPreorder","vBuySell","buySellStr","vSideSubmit","vOrderHost","verifyLimit","verifyMarket","orderDesc","vOrderType","vRate","vQty","vTotal","vFiatTotal","vmFromTotal","vmFromAsset","vmFromTotalFiat","vMarketEstimate","received","vmToTotal","vmToAsset","vmTotalFiat","vHeader","preOrder","unlockWalletsForEstimates","vErr","unlockMarketWallets","_this$market16","cacheKey","cached","wireOrder","estimate","vPreorderErrTip","showAdvancedOptions","hideAdvancedOptions","vOtherOrderOpts","vDefaultOrderOpts","addOption","isSwap","change","isBaseChain","showByDefault","refreshPreorder","est","fetchPreorder","setPreorderErr","setFeeEstimates","_ref16","showPreOrderAdvancedOptions","hidePreOrderAdvancedOptions","reloadOrderOpts","vPreorderEstimates","fmtPct","baseExchangeRate","quoteExchangeRate","baseFeeAssetUI","quoteFeeAssetUI","tokenFiatRate","parentFiatRate","toFeeAssetUI","fromFeeAssetUI","toExchangeRate","fromExchangeRate","_ref17","swapped","swappedInParentUnits","bestSwapPct","realisticBestCase","vSwapFeesLowPct","vSwapFeesLow","worstSwapPct","realisticWorstCase","vSwapFeesHighPct","vSwapFeesHigh","swapFeesMaxPct","maxFees","vSwapFeesMaxPct","vSwapFeesMax","estRate","receivedInParentUnits","bestRedeemPct","vRedeemFeesLowPct","vRedeemFeesLow","worstRedeemPct","vRedeemFeesHighPct","vRedeemFeesHigh","vFeeSummaryPct","vFeeSummaryLow","vFeeSummaryHigh","summarySwapFeesLow","summarySwapFeesHigh","summaryRedeemFeesLow","summaryRedeemFeesHigh","cancelData","cancelErr","cancelRemain","cancelUnit","currentCreate","validateOrder","showVerify","promptProvider","updateSpots","_this$market$base2","_this$market$quote","_this$market17","parcelSizeLots","marketLimitBase","marketLimitBaseUnit","marketLimitQuoteUnit","marketLimitQuote","_tradingLimits","_app$exchanges$host2","usedParcels","mktWeight","inflight","_tradingLimits2","parcelLimit","tradingLimit","limitUsage","orderLimitRemain","orderTradingTier","_this$market18","baseUSD","quoteUSD","refreshActiveOrders","wasInflight","oldStatus","setEpoch","clearOrderTableEpochs","_Object$values4","_Object$values4$_i","alreadyMatched","compare","recentMatchesSortCompare","_step20","_iterator20","vLoader","finalize","mktBuyLots","mktBuyScore","NaN","loadTableSide","bins","currEpochBin","currNonEpochBin","currRate","bin","bookSide","tbody","binOrdersByRateAndEpoch","orderTableRow","manager","getRate","nextSibling","insertOrder","removeOrder","updateOrderQty","clearOrderTableEpochSide","_arr5","removeEpochOrders","orderBin","_this$market19","OrderTableRowManager","chart","setConnectionStatus","_this$page$marketSear","filterTxt","setFilter","setLines","_this$market20","_this$market20$dex","_step21","_iterator21","_this$market21","_this$market22","deregisterRoute","unattach","reloadMarketsPane","_step22","_iterator22","_sortedMarkets","mkts","convertMarkets","assign","_i14","_Object$values5","aLots","sortedMarkets","MarketRow","_step23","_iterator23","_step24","_iterator24","_step25","_iterator25","disconnectedIco","_step26","_iterator26","template","hues","btmpl","iconBox","walletState","balanceRowTmpl","qtmpl","updateWallet","newWalletRow","unsupported","spinner","balanceRows","wantProvidersBox","addWalletSymbol","readWallet","fetchBalance","addRow","balTmpl","_app$assets$asset$tok","_side$parentBal","_app$assets$side$pare","updateParent","before","stringyOptions","_i13","tableRow","rateText","isEpoch","cssClass","updateQtyNumOrdersEl","curr","numOrders","index","findIndex","newEpoch","OrdersPage","_nextPage","_deleteArchivedRecords","_fetchOrders","_submitFilter","orderTmpl","filterState","readFilter","filterKey","subFilter","hostFilter","assetFilter","statusFilter","applyButtons","monitorFilter","applyBttn","submitFilter","filter1","filter2","compareSubFilter","parseSubFilter","ordersTable","nextPage","exportOrders","showArchivedDateField","archivedDateField","deleteArchivedRecordsErr","deleteArchivedRecords","saveMatchesToFile","saveOrdersToFile","archivedRecordsLocation","deleteArchivedRecordsMsg","deleteArchivedResult","deleteArchivedRecordsForm","deleteArchivedRecordsSubmit","olderThan","tableBody","appendOrders","fromUnit","toUnit","dateTime","timeAgo","fetchOrders","setOrders","currentFilter","setQuery","olderThanMs","saveMatchesToFIle","archivedRecordsDeleted","nRecords","archivedRecordsPath","_filterState$assets","_filterState$statuses","orderLoader","lockTimeTakerMs","OrderPage","_showAccelerateForm","_fetchOrder","_start","matchCardTmpl","refreshOnPopupClose","explorerId","showAccelerateForm","fetchOrder","mktBaseSymbol","replaceWith","mktQuoteSymbol","setAccelerationButtonVis","showMatchCards","matchCard","matchID","matchTime","month","day","matchTimeAgo","orderPortion","matchQty","quoteAmount","cancelInfoDiv","infoDiv","statusHdr","cancelAmount","cancelIcon","cancelOrderPortion","makerSwapYou","makerRedeemYou","takerSwapThem","takerRedeemThem","takerSwapYou","takerRedeemYou","makerSwapThem","makerRedeemThem","makerSwapAsset","takerSwapAsset","makerRedeemAsset","takerRedeemAsset","refundAsset","fromAmount","toAmount","fromIcon","toIcon","revoked","counterRedeem","tryShowCoin","pendingEl","coin","stringID","makerSwapPending","makerSwapCoin","takerSwapPending","takerSwapCoin","makerRedeemPending","makerRedeemCoin","takerRedeemPending","takerRedeemCoin","refundCoin","refundPending","refundAfter","refundAfterStr","refundAfterTime","inConfirmingMakerRedeem","inConfirmingTakerRedeem","makerSwapMsg","takerSwapMsg","makerRedeemMsg","takerRedeemMsg","confirmationString","makerSwap","takerSwap","takerRefundsAfter","takerLockTimeExpired","makerRedeem","takerRedeem","expectingRefund","setImmutableMatchCardElements","setMutableMatchCardElements","matchBox","addNewMatchCard","actionsLabel","processMatch","counterSwap","_get","Reflect","property","receiver","getOwnPropertyDescriptor","parseFundingOptions","_f$cex","cexAvail","cexReq","_f$dex","dexAvail","dexReq","proposedDex","proposedCex","cexShort","dexShort","dexRemain","cexRemain","cexRange","dexRange","MarketMakerPage","_cexConfigured","_removeCfg","_handleRunStatsNote","_handleCEXBalanceUpdate","_handleCEXNote","_setup","sortedBots","botTmpl","botRowTmpl","exchangeRowTmpl","cexConfigForm","cexConfigured","newBot","archivedLogsBtn","confirmRemoveConfigBttn","removeCfg","twoColumn","innerWidth","cexRows","configure","setCEX","configureBttn","reconfigBttn","errConfigureBttn","updateCexRow","setup","useTwoColumn","clearBotBoxes","appendBotBox","botConfigs","noBots","handleRunStatsNote","bot","handleRunStats","cexnote","handleCEXNote","_b$runStats$startTime","_b$runStats","_a$runStats$startTime","_a$runStats","addBot","handleCEXBalanceUpdate","_botStatus$config","Bot","botRows","mwh","removingCfg","removeCfgErr","confirmRemoveCfgMsg","confirmRemoveForm","removeBotConfig","fetchMMStatus","boxZero","boxOne","_this$page2","lastChild","botID","unshift","unconfigured","configured","connectErrBox","usdBal","cexSymbolAdded","cexSymbol","bipCEXSymbol","usdBalance","percentage","assetValue","percentageBalanceStr","_BotMarket","pg","runningMMElements","_assertThisInitialize","runDisplay","onBox","botTypeDisplay","placementsChartBox","baseTokenSwapFeesBox","placementsChart","buyPlacementCount","sellPlacementCount","startBttn","allocationBttn","allocate","reconfigure","removeBttn","confirmRemoveCfg","goBackFromAllocation","hideAllocationDialog","marketLink","baseAllocSlider","quoteAllocSlider","allocateBttn","showBot","_this$cfg","bestBuy","bestSell","marketConfig","multiplier","cexDataBox","cexPrice","lastPrice","cexVol","vol","dexDataBox","dexPrice","dexVol","updateDisplay","updateTableRow","loadingBg","_this$status","profitLossBox","allocateBttnBox","offBox","noFiatDisplay","updateRunningDisplay","updateIdleDisplay","_this$marketReport2","baseAlloc","totalUSD","baseAllocUSD","baseBookAlloc","baseOrderReservesAlloc","baseOrderReservesPct","baseCexAllocBox","baseCexAlloc","baseBookingFeesAllocBox","baseTokenFeesAllocBox","baseBookingFeesAlloc","feeAlloc","baseTokenFeeAlloc","baseFeeUSD","baseTokenAllocUSD","withQuote","baseTokenBookingFees","baseTokenSwapFeeN","swapReserves","baseTokenSwapFees","quoteAlloc","quoteAllocUSD","quoteBookAlloc","quoteOrderReservesAlloc","quoteOrderReservesPct","quoteSlippageAlloc","quoteCexAllocBox","quoteCexAlloc","quoteBookingFeesAllocBox","quoteTokenFeesAllocBox","quoteBookingFeesAlloc","quoteTokenFeeAlloc","quoteFeeUSD","quoteTokenAllocUSD","quoteTokenBookingFees","quoteTokenSwapFeeN","quoteTokenSwapFees","totalAllocUSD","_dex","_cex","_alloc$dex$baseFeeID","_alloc$dex$quoteFeeID","_this$marketReport3","offError","showTemporarily","fundingState","_parseFundingOptions2","proposedDexBase","proposedCexBase","baseSlider","_parseFundingOptions4","proposedDexQuote","proposedCexQuote","quoteSlider","allocUSD","allocationDialog","fundedAndBalancedBox","hasTransferable","fundedAndNotBalancedBox","starvedBox","proposedDexBaseAlloc","proposedDexQuoteAlloc","setBaseProposal","proposedDexBaseAllocUSD","proposedCexBaseAlloc","proposedCexBaseAllocUSD","dexAlloc","cexAlloc","setQuoteProposal","proposedDexQuoteAllocUSD","proposedCexQuoteAlloc","proposedCexQuoteAllocUSD","reqFees","proposedFees","proposedDexBaseFeeAlloc","proposedDexBaseFeeAllocUSD","needQuoteTokenFees","proposedDexQuoteFeeAlloc","proposedDexQuoteFeeAllocUSD","existingOrders","existingOrdersBox","closeDialog","_app$mmStatus$cexes$c","startConfig","autoRebalance","autoRebalanceSettings","startBot","_this$proj2","totalBase","dexMinBase","dexMinQuote","maxBase","totalQuote","maxQuote","baseMinWithdraw","minB","maxB","minBaseTransfer","transferFactor","quoteMinWithdraw","minQ","maxQ","minQuoteTransfer","specLK","lastBotsLK","lastArbExchangeLK","arbMMRowCacheKey","defaultProfit","defaultLevelSpacing","defaultMarketMakingConfig","driftTolerance","orderPersistence","defaultBotAssetConfig","MarketMakerSettingsPage","_fetchMarketReport","_delete2","_saveSettings","_fetchCEXBalances","_submitBotWithValidation","_submitBotType","_showBotTypeForm","_configureUI","placementsCache","_this$specs","_this$specs2","submitBotType","walletAddrForm","quotePane","basePane","assetPaneBox","AssetPane","mmTitle","oracleTmpl","cexOptTmpl","arbBttnTmpl","marketRowTmpl","needRegTmpl","resetButton","setOriginalValues","updateButton","saveSettings","createButton","deleteBttn","botTypeForm","botTypeSubmit","noMarketBttn","showMarketSelectForm","botTypeHeader","reshowBotTypeForm","botTypeChangeMarket","marketHeader","marketFilterInput","sortMarketRows","cexRebalanceCheckbox","autoRebalanceChanged","switchToAdvanced","showAdvancedConfig","switchToQuickConfig","qcMatchBuffer","matchBufferChanged","switchToUSDPerSide","changeSideCommitmentDialog","switchToLotsPerLevel","gapStrategySelect","clearPlacements","updatedConfig","loadCachedPlacements","setGapFactorLabels","updateModifiedMarkers","addBuyPlacementBtn","addPlacement","addBuyPlacementLots","addBuyPlacementGapFactor","updateAllocations","addSellPlacementBtn","addSellPlacementLots","addSellPlacementGapFactor","driftToleranceInput","defaultDriftTolerance","rawV","driftToleranceSlider","orderPersistenceSlider","qcProfit","vPct","profitInput","qcProfitSlider","quickConfigUpdated","qcLevelSpacing","qcLevelSpacingSlider","defaultMatchBuffer","qcMatchBufferSlider","qcLevelsPerSide","qcUSDPerSide","qcLotsPerLevel","qcUSDPerSideEcho","qcLotsPerLevelEcho","maybeSubmitBuyRow","maybeSubmitSellRow","profitInputErr","showError","errID","botTypeSelectors","botTypeErr","cexSelection","setBotTypeSelected","exit","_botCfg$cexName","setupCEXes","initializeMarketRows","fetchCEXBalances","configureUI","_baseToken$parentID","_quoteToken$parentID","_botCfg$basicMarketMa","_botCfg2","_botCfg2$basicMarketM","_ref3$","_ref3$2","oldCfg","_botCfg","mmCfg","arbMMCfg","arbCfg","_k","_botCfg$uiConfig$simp","isQuickPlacements","botSettingsContainer","marketBox","noMarket","missingFiatRates","marketLoading","isViewOnly","deleteBttnBox","originalConfig","baseOptions","defaultWalletOptions","quoteOptions","creatingNewBot","baseWalletOptions","quoteWalletOptions","numEpochsLeaveOpen","driftToleranceBox","viewOnlyRunning","cexRebalanceSettings","fetchMarketReport","lotsPerLevelIncrement","showQuickConfig","_Object$values$_i$aut","_this2$page","needRegBox","mr","arbs","cexHasMarket","cexMarketSupportFilter","showBotTypeForm","marketSelectionTable","marketFilterBox","noMarkets","_a$spot$vol","_a$spot","_b$spot$vol","_b$spot","volA","volB","_this$specs3","_this$specs4","atomicRate","conv","atomic","dexBaseLots","dexQuoteLots","walletStuff","_feesAndCommit","baseFeeAssetID","quoteFeeAssetID","_this$specs5","_ref7$","_ref7$2","advancedConfig","quickConfig","_this$marketStuff","marketStuff","placementCount","levelsPerSide","worstBuy","worstSell","lotsPerLevel","_this$marketStuff2","showInputsForBot","usingUSDPerSide","matchMultiplierBox","placementChartLegend","lotsPerLevelLabel","levelSpacingBox","arbLotsLabel","qcLevelPerSideBox","qcUSDPerSideBox","qcLotsBox","_page$qcProfit$value","_page$qcLevelSpacing$","_page$qcMatchBuffer$v","_this$marketStuff3","qcError","levelSpacing","levelSpacingDisabled","levelN","updateBaseAllocations","updateQuoteAllocations","_this$marketStuff4","updateInventory","updateCommitTotal","_this$marketStuff5","_page$qcMatchBuffer$v2","configuredCEX","supportingCexes","nCexes","arbEnabled","_div2","_botType","lastBots","lastBot","_lastBot$cexName","lastCEX","_botType2","formSpecs","botTypeBaseSymbol","botTypeQuoteSymbol","formCexes","setCEXAvailability","noCexesConfigured","noCexMarket","noCexMarketConfigureMore","selectFormCEX","_this$specs6","selectedType","_this$formSpecs","_step4$value","selecteds","_lastBot$cexName2","marketSelectForm","_page$marketFilterInp","_this$marketStuff6","updateBalances","_page$cexRebalanceChe","_page$cexRebalanceChe2","submitBotWithValidation","_selecteds$0$dataset$","_this$formSpecs2","_tokenAssetApprovalSt","_tokenAssetApprovalSt2","bApproval","qApproval","_selecteds","multifundingopts","quoteAssetOnly","newCfg","gapStrategyModified","profitModified","buyPlacementsModified","buyPlacementsTableWrapper","sellPlacementsModified","sellPlacementsTableWrapper","toDisplay","initialLoadPlacement","sellPlacementsTableBody","addPlacementRow","addSellPlacementRow","lotsElement","gapFactorElement","errElement","sellPlacementsErr","buyPlacementsTableBody","addBuyPlacementRow","buyPlacementsErr","updateArrowVis","upBtn","downBtn","actualGapFactor","displayedGapFactor","setErr","gapFactorHeaderUnit","convertGapFactor","gapFactorErr","checkGapFactorRange","newRow","newRowTmpl","removeBtn","prevPlacement","nextPlacement","buyGapFactorHdr","sellGapFactorHdr","percentPlusInfo","percentInfo","absolutePlusInfo","absoluteInfo","multiplierInfo","_cfg$buyPlacements","_cfg$sellPlacements","_cfg$driftTolerance","_cfg$orderPersistence","_cfg$profit","_this$specs7","tol","persist","profitSelectorBox","orderPersistenceBox","setArbMMLabels","setupWalletSettings","showErrors","_this$updatedConfig","errEl","_this$marketStuff7","validateFields","basicMMConfig","arbMMConfig","basicArbConfig","updateBotConfig","_this$specs8","deleteErr","maxActiveArbs","_this$specs9","_r$oracles","oraclesLoading","oraclesTable","noOracles","oraclesErrMsg","oraclesErr","oracles","ExchangeNames","usdVol","avgPrice","_this$formSpecs3","_step13$value","_baseID","_quoteID","addCEX","selectedCEX","_Object$values5$_i","has","unavailable","needsconfig","disconnected","_Object$values6","_Object$values6$_i","_Object$values7","_this5$formSpecs","_Object$values8","showCEXConfigForm","_i15","_Object$values9","_cexStatus$markets","_Object$values9$_i","nSwapFees","nSwapFeesSlider","orderReservesSlider","slippageBufferSlider","minTransfer","totalInventory","minV","maxV","minTransferSlider","showBalance","showAddress","isQuote","_cfg$swapFeeN","_this$pg","_this$pg$specs","_this$pg$updatedConfi","walletConfig","_app$assets$this$feeA","feeName","inv","isToken","feeTotalBox","feeReservesBox","feeBalances","slippageBufferBox","feeTicker","cexMinInvBox","orderReservesBox","_cfg$orderReservesFac","counterLots","dexCommit","cexCommit","setLotSize","_this$pg$specs2","bookLots","bookLotSize","bookCommitment","feesPerLotConv","bookingFeesLots","cexMinInv","orderReservesBasis","feesPerSwapConv","feeReservesPerSwap","slippageBufferBasis","redemptionFeesBox","redemptionFeesPerLot","redemptionFeesLots","updateTokenFees","updateRebalance","commitTotal","commitTotalFiat","feeTotal","feeTotalFiat","_this$pg2","showRebalance","rebalanceOpts","rangeV","walletSettingsNone","optToDiv","dependentOpts","optKey","optSetting","dependentOn","currVal","boolSettingTmpl","parentOptKey","optKeys","setDependentOptsVis","_opt$xyRange","rangeSettingTmpl","_toFourSigFigs10","_toFourSigFigs12","_toFourSigFigs14","dependsOn","parentOptVal","_this$pg3","_this$pg3$specs","botInv","balanceBreakdown","DexSettingsPage","_updateBondOptions","_disableAutoRenew","_prepareUpdateHost","_prepareAccountDisable","_toggleAccountStatus","_exportAccount","_showSuccess","_runAnimation","_progressTierFormWithSyncedFundedWallet","_progressTierFormsWithWallet","renewToggle","runAnimation","progressTierFormsWithWallet","repMeter","exportDexBtn","exportAccount","accountDisabled","toggleAccountStatusBtn","toggleAccountStatus","prepareAccountDisable","disableAccountForm","updateCertBtn","certFileInput","updateHostBtn","prepareUpdateHost","goBackToSettings","showTierForm","changeTier","willAutoRenew","toggleAutoRenew","renewErr","disableAutoRenew","autoRenewBox","penaltyCompInput","penaltyCompBox","penaltyCompsErr","otherBondSettings","updateBondOptions","disableAccountConfirm","setAssetError","progressTierFormWithSyncedFundedWallet","liveStrength","expiredBonds","bondsPendingRefund","accountForExport","exportAccountErr","disableAccountHost","disableAccountErr","updateCertMsg","displayIcons","disconnectedIcon","connectedIcon","Disconnected","InvalidCert","conf","_conf$targetTier","MarketMakerArchivesPage","runTableRowTmpl","backButton","runs","_runs$i","_runs$i$market","logs","settings","runTableBody","MarketMakerLogsPage","_applyFilters","_getRunLogs","params","_params","eventTableRowTmpl","dexOrderTxRowTmpl","performanceTableRowTmpl","_params$returnPage","filterButton","applyFilters","searchParams","replaceState","urlParams","_params2","events","statsRows","doneScrolling","eventsTable","_yield$this$getRunLog","_yield$this$getRunLog2","updatedLogs","overview","event","getRunLogs","mktAssets","newEventRow","populateStats","endTime","updateExistingRows","filters","refID","_yield$this$getRunLog3","_yield$this$getRunLog4","dexSells","dexSellsCheckbox","dexBuys","dexBuysCheckbox","cexSells","cexSellsCheckbox","cexBuys","cexBuysCheckbox","deposits","depositsCheckbox","withdrawals","withdrawalsCheckbox","populateTable","_botStatus$runStats","_yield$this$getRunLog5","_yield$this$getRunLog6","parentHeader","setFilters","liveBot","finalState","sumUSDHeader","handleRunEventNote","dexOrderEvent","cexOrderEvent","depositEvent","withdrawalEvent","cachedEvent","setRowContents","pl","endTimeRow","diffs","performanceTableBody","usdDiff","fmtUSD","formatFiatValue","eventsTableBody","eventType","eventID","usd","be","balanceEffects","sumBalanceEffects","tmplID","sumUSD","showEventDetails","dexOrderIDCopyListener","copyDexOrderID","dexOrderID","dexOrderRate","dexOrderQty","dexOrderSide","dexOrderTxsTableBody","transactions","dexOrderTxsTable","txAsset","wallets","dexOrderDetailsForm","cexOrderID","cexOrderIDCopyListener","copyCexOrderID","cexOrderRate","cexOrderQty","cexOrderSide","cexOrderBaseFilled","baseFilled","cexOrderQuoteFilled","quoteFilled","cexOrderDetailsForm","depositID","depositIDCopyListener","copyDepositID","depositAmt","depositFees","depositStatus","depositCreditSection","depositCredit","cexCredit","depositDetailsForm","withdrawalID","withdrawalIDCopyListener","copyWithdrawalID","withdrawalAmt","cexDebit","withdrawalStatus","withdrawalTxID","withdrawalReceived","withdrawalDetailsForm","showDexOrderEventDetails","showCexOrderEventDetails","showDepositEventDetails","showWithdrawalEventDetails","InitPage","_appInited","initForm","AppInitForm","appPWForm","appInited","quickConfigForm","QuickConfigForm","quickConfigDone","seedBackupForm","SeedBackupForm","seedBackedUp","appPWSubmit","setAppPass","toggleSeedInput","seedInputBox","toggleSeedInputIcon","_setAppPass","_page$seedInput$value","pwAgain","appPWErrMsg","appPWAgain","rowIDCounter","qcServerTmpl","qcWalletTmpl","quickConfigSubmit","qcErrAck","_row","_tmpl","_rowID","autoConfigurable","rowID","servers","qcServersBox","qcWalletsBox","failedHosts","failedWallets","connectServer","srvRow","all","walletRow","_walletDef$configopts","appPass","qcChoices","qcErrors","qcServerErrorList","createTextNode","qcServerErrors","qcWalletErrorList","qcWalletErrors","seedAck","showSeed","sbWanna","sbSeed","constructors","register","dexsettings","mmsettings","mmarchives","mmlogs","languageData","flag","Application","process","noteReceivers","txHistoryMap","requiredActions","loggers","loggersLK","enableLogger","loggerID","recorderKeys","recordersLK","recorders","recordLogger","dumpLogger","btoa","download","_needsCustomProvider","_txHistory","_signOut","_fetchBalance","_fetchNotes","_setLanguage","_submitAction","_loadPage","_fetchMMStatus","_fetchUser","_e$state","handlerFromPath","attachHeader","attachActions","attachCommon","attach","fetchNotes","protocol","reconnected","notify","_this$main","_arr$_i","inited","langs","seedgentime","skipPush","requestedHandler","doc","delivered","noteBox","profileBox","origin","pushState","handlerID","loadedPage","unload","bindUnits","lyt","_step3$value","openUrl","_link$href","popupNotes","popupTmpl","noteTmpl","pokeTmpl","loader","noteBell","pokeList","noteList","ackNotes","noteCat","pokeCat","showDropdown","noteIndicator","setNoteTimes","burgerIcon","logoutErr","innerNoteIcon","innerBurgerIcon","profileSignout","signOut","langBttnTmpl","_languageData$this$la","langFlag","langName","_languageData$lang","setLanguage","langBttns","missingNoncesTmpl","actionTxTableTmpl","tooCheapTmpl","lostNonceTmpl","actionsCollapse","actionDialog","actionDialogCollapsed","actionDialogContent","showOldestAction","showAdjacentAction","dir","actions","sortedActions","showRequestedAction","uniqueID","prevAction","nextAction","addAction","blinkAction","existingAction","actionID","actionForm","actionDialogCount","actionCount","resolveActionWithID","rem","tooCheapAction","missingNoncesAction","lostNonceAction","redeemRejectedAction","_this$assets$assetID","table","lostTxID","txAmt","amtUnit","parentUI","feeAmount","feeUnit","newFeesRow","newFees","newFeesUnit","action","doNothingBttn","submitAction","recover","recoverBttn","txTable","actionTxTable","act","bump","keepWaitingBttn","addFeesBttn","nonce","abandonBttn","abandon","replaceBttn","replacementID","idInput","coinID","coinFmt","rejectedRedemptionTmpl","_this$assets$assetID2","retry","tryAgainBttn","actionsNavigator","currentAction","getAsset","xcAsset","_getAsset","_getAsset2","dialog","ico","acks","severity","pageURL","walletsMenuEntry","marketsMenuEntry","mmLink","setNotes","setPokes","setRequiredActions","bondedTier","updateBondConfs","confirmations","updateTier","prependNoteElement","prependPokeElement","_this$mmStatus$bots","_this$mmStatus","orderNote","tempID","inFlight","updateOrder","handleBondNote","updateMatch","mktName","txNote","handleTransactionNote","resolveAction","handleTxHistorySyncedNote","updateUser","stack","indicator","setSeverityClass","_console","nowString","cn","_this$makePoke2","makePoke","prependListElement","_this$makeNote2","makeNote","unacked","ni","noteCacheSize","cls","fromAssetID","_order$matches","supportedAsset","_this$user$extensionM","restrictedWallets","baseChainSymbol","emptyidx","def","removeCookie","authCK","pwKeyCK","notificationsLK","cachedTxHistory","_txs","startIndex","lastIndex","_cachedTxHistory$txs","_res","resTxs","past","_this$assets$assetID$","_this$assets$assetID3","_this$assets$assetID4","providers","severityClassMap","_severityClassMap","getSeconds","getMilliseconds"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"entry.js","mappings":"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","sources":["webpack://bisonw/./node_modules/@babel/runtime/helpers/OverloadYield.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/regenerator.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/regeneratorAsync.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/regeneratorAsyncGen.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/regeneratorAsyncIterator.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/regeneratorDefine.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/regeneratorKeys.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/regeneratorRuntime.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/regeneratorValues.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/typeof.js","webpack://bisonw/./node_modules/@babel/runtime/regenerator/index.js","webpack://bisonw/webpack/bootstrap","webpack://bisonw/webpack/runtime/compat get default export","webpack://bisonw/webpack/runtime/define property getters","webpack://bisonw/webpack/runtime/hasOwnProperty shorthand","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://bisonw/./src/js/state.ts","webpack://bisonw/./src/js/http.ts","webpack://bisonw/./src/js/locales.ts","webpack://bisonw/./src/js/doc.ts","webpack://bisonw/./src/js/registry.ts","webpack://bisonw/./src/js/opts.ts","webpack://bisonw/./src/js/basepage.ts","webpack://bisonw/./src/js/orderutil.ts","webpack://bisonw/./src/js/charts.ts","webpack://bisonw/./src/js/account.ts","webpack://bisonw/./src/js/coinexplorers.ts","webpack://bisonw/./src/js/mmutil.ts","webpack://bisonw/./src/js/forms.ts","webpack://bisonw/./src/js/register.ts","webpack://bisonw/./src/js/login.ts","webpack://bisonw/./src/js/wallets.ts","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://bisonw/./src/js/notifications.ts","webpack://bisonw/./src/js/settings.ts","webpack://bisonw/./src/js/orderbook.ts","webpack://bisonw/./src/js/ws.ts","webpack://bisonw/./src/js/markets.ts","webpack://bisonw/./src/js/orders.ts","webpack://bisonw/./src/js/order.ts","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/get.js","webpack://bisonw/./node_modules/@babel/runtime/helpers/esm/superPropBase.js","webpack://bisonw/./src/js/mm.ts","webpack://bisonw/./src/js/mmsettings.ts","webpack://bisonw/./src/js/dexsettings.ts","webpack://bisonw/./src/js/mmarchives.ts","webpack://bisonw/./src/js/mmlogs.ts","webpack://bisonw/./src/js/init.ts","webpack://bisonw/./src/js/app.ts","webpack://bisonw/./src/index.ts"],"sourcesContent":["function _OverloadYield(e, d) {\n this.v = e, this.k = d;\n}\nmodule.exports = _OverloadYield, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var regeneratorDefine = require(\"./regeneratorDefine.js\");\nfunction _regenerator() {\n /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */\n var e,\n t,\n r = \"function\" == typeof Symbol ? Symbol : {},\n n = r.iterator || \"@@iterator\",\n o = r.toStringTag || \"@@toStringTag\";\n function i(r, n, o, i) {\n var c = n && n.prototype instanceof Generator ? n : Generator,\n u = Object.create(c.prototype);\n return regeneratorDefine(u, \"_invoke\", function (r, n, o) {\n var i,\n c,\n u,\n f = 0,\n p = o || [],\n y = !1,\n G = {\n p: 0,\n n: 0,\n v: e,\n a: d,\n f: d.bind(e, 4),\n d: function d(t, r) {\n return i = t, c = 0, u = e, G.n = r, a;\n }\n };\n function d(r, n) {\n for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) {\n var o,\n i = p[t],\n d = G.p,\n l = i[2];\n r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0));\n }\n if (o || r > 1) return a;\n throw y = !0, n;\n }\n return function (o, p, l) {\n if (f > 1) throw TypeError(\"Generator is already running\");\n for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) {\n i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u);\n try {\n if (f = 2, i) {\n if (c || (o = \"next\"), t = i[o]) {\n if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\");\n if (!t.done) return t;\n u = t.value, c < 2 && (c = 0);\n } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1);\n i = e;\n } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break;\n } catch (t) {\n i = e, c = 1, u = t;\n } finally {\n f = 1;\n }\n }\n return {\n value: t,\n done: y\n };\n };\n }(r, o, i), !0), u;\n }\n var a = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n t = Object.getPrototypeOf;\n var c = [][n] ? t(t([][n]())) : (regeneratorDefine(t = {}, n, function () {\n return this;\n }), t),\n u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c);\n function f(e) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, regeneratorDefine(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e;\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, regeneratorDefine(u, \"constructor\", GeneratorFunctionPrototype), regeneratorDefine(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", regeneratorDefine(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), regeneratorDefine(u), regeneratorDefine(u, o, \"Generator\"), regeneratorDefine(u, n, function () {\n return this;\n }), regeneratorDefine(u, \"toString\", function () {\n return \"[object Generator]\";\n }), (module.exports = _regenerator = function _regenerator() {\n return {\n w: i,\n m: f\n };\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports)();\n}\nmodule.exports = _regenerator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var regeneratorAsyncGen = require(\"./regeneratorAsyncGen.js\");\nfunction _regeneratorAsync(n, e, r, t, o) {\n var a = regeneratorAsyncGen(n, e, r, t, o);\n return a.next().then(function (n) {\n return n.done ? n.value : a.next();\n });\n}\nmodule.exports = _regeneratorAsync, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var regenerator = require(\"./regenerator.js\");\nvar regeneratorAsyncIterator = require(\"./regeneratorAsyncIterator.js\");\nfunction _regeneratorAsyncGen(r, e, t, o, n) {\n return new regeneratorAsyncIterator(regenerator().w(r, e, t, o), n || Promise);\n}\nmodule.exports = _regeneratorAsyncGen, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var OverloadYield = require(\"./OverloadYield.js\");\nvar regeneratorDefine = require(\"./regeneratorDefine.js\");\nfunction AsyncIterator(t, e) {\n function n(r, o, i, f) {\n try {\n var c = t[r](o),\n u = c.value;\n return u instanceof OverloadYield ? e.resolve(u.v).then(function (t) {\n n(\"next\", t, i, f);\n }, function (t) {\n n(\"throw\", t, i, f);\n }) : e.resolve(u).then(function (t) {\n c.value = t, i(c);\n }, function (t) {\n return n(\"throw\", t, i, f);\n });\n } catch (t) {\n f(t);\n }\n }\n var r;\n this.next || (regeneratorDefine(AsyncIterator.prototype), regeneratorDefine(AsyncIterator.prototype, \"function\" == typeof Symbol && Symbol.asyncIterator || \"@asyncIterator\", function () {\n return this;\n })), regeneratorDefine(this, \"_invoke\", function (t, o, i) {\n function f() {\n return new e(function (e, r) {\n n(t, i, e, r);\n });\n }\n return r = r ? r.then(f, f) : f();\n }, !0);\n}\nmodule.exports = AsyncIterator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _regeneratorDefine(e, r, n, t) {\n var i = Object.defineProperty;\n try {\n i({}, \"\", {});\n } catch (e) {\n i = 0;\n }\n module.exports = _regeneratorDefine = function regeneratorDefine(e, r, n, t) {\n function o(r, n) {\n _regeneratorDefine(e, r, function (e) {\n return this._invoke(r, n, e);\n });\n }\n r ? i ? i(e, r, {\n value: n,\n enumerable: !t,\n configurable: !t,\n writable: !t\n }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2));\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _regeneratorDefine(e, r, n, t);\n}\nmodule.exports = _regeneratorDefine, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _regeneratorKeys(e) {\n var n = Object(e),\n r = [];\n for (var t in n) r.unshift(t);\n return function e() {\n for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e;\n return e.done = !0, e;\n };\n}\nmodule.exports = _regeneratorKeys, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var OverloadYield = require(\"./OverloadYield.js\");\nvar regenerator = require(\"./regenerator.js\");\nvar regeneratorAsync = require(\"./regeneratorAsync.js\");\nvar regeneratorAsyncGen = require(\"./regeneratorAsyncGen.js\");\nvar regeneratorAsyncIterator = require(\"./regeneratorAsyncIterator.js\");\nvar regeneratorKeys = require(\"./regeneratorKeys.js\");\nvar regeneratorValues = require(\"./regeneratorValues.js\");\nfunction _regeneratorRuntime() {\n \"use strict\";\n\n var r = regenerator(),\n e = r.m(_regeneratorRuntime),\n t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor;\n function n(r) {\n var e = \"function\" == typeof r && r.constructor;\n return !!e && (e === t || \"GeneratorFunction\" === (e.displayName || e.name));\n }\n var o = {\n \"throw\": 1,\n \"return\": 2,\n \"break\": 3,\n \"continue\": 3\n };\n function a(r) {\n var e, t;\n return function (n) {\n e || (e = {\n stop: function stop() {\n return t(n.a, 2);\n },\n \"catch\": function _catch() {\n return n.v;\n },\n abrupt: function abrupt(r, e) {\n return t(n.a, o[r], e);\n },\n delegateYield: function delegateYield(r, o, a) {\n return e.resultName = o, t(n.d, regeneratorValues(r), a);\n },\n finish: function finish(r) {\n return t(n.f, r);\n }\n }, t = function t(r, _t, o) {\n n.p = e.prev, n.n = e.next;\n try {\n return r(_t, o);\n } finally {\n e.next = n.n;\n }\n }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n;\n try {\n return r.call(this, e);\n } finally {\n n.p = e.prev, n.n = e.next;\n }\n };\n }\n return (module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n return {\n wrap: function wrap(e, t, n, o) {\n return r.w(a(e), t, n, o && o.reverse());\n },\n isGeneratorFunction: n,\n mark: r.m,\n awrap: function awrap(r, e) {\n return new OverloadYield(r, e);\n },\n AsyncIterator: regeneratorAsyncIterator,\n async: function async(r, e, t, o, u) {\n return (n(e) ? regeneratorAsyncGen : regeneratorAsync)(a(r), e, t, o, u);\n },\n keys: regeneratorKeys,\n values: regeneratorValues\n };\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports)();\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorValues(e) {\n if (null != e) {\n var t = e[\"function\" == typeof Symbol && Symbol.iterator || \"@@iterator\"],\n r = 0;\n if (t) return t.call(e);\n if (\"function\" == typeof e.next) return e;\n if (!isNaN(e.length)) return {\n next: function next() {\n return e && r >= e.length && (e = void 0), {\n value: e && e[r++],\n done: !e\n };\n }\n };\n }\n throw new TypeError(_typeof(e) + \" is not iterable\");\n}\nmodule.exports = _regeneratorValues, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// TODO(Babel 8): Remove this file.\n\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","function _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nexport { _arrayLikeToArray as default };","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0;\n }\n}\nexport { _unsupportedIterableToArray as default };","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nfunction _toConsumableArray(r) {\n return arrayWithoutHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableSpread();\n}\nexport { _toConsumableArray as default };","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return arrayLikeToArray(r);\n}\nexport { _arrayWithoutHoles as default };","function _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nexport { _iterableToArray as default };","function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableSpread as default };","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nfunction _slicedToArray(r, e) {\n return arrayWithHoles(r) || iterableToArrayLimit(r, e) || unsupportedIterableToArray(r, e) || nonIterableRest();\n}\nexport { _slicedToArray as default };","function _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nexport { _arrayWithHoles as default };","function _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nexport { _iterableToArrayLimit as default };","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableRest as default };","function asyncGeneratorStep(n, t, e, r, o, a, c) {\n try {\n var i = n[a](c),\n u = i.value;\n } catch (n) {\n return void e(n);\n }\n i.done ? t(u) : Promise.resolve(u).then(r, o);\n}\nfunction _asyncToGenerator(n) {\n return function () {\n var t = this,\n e = arguments;\n return new Promise(function (r, o) {\n var a = n.apply(t, e);\n function _next(n) {\n asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n);\n }\n function _throw(n) {\n asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n);\n }\n _next(void 0);\n });\n };\n}\nexport { _asyncToGenerator as default };","function _classCallCheck(a, n) {\n if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\nexport { _classCallCheck as default };","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(e, r) {\n for (var t = 0; t < r.length; t++) {\n var o = r[t];\n o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o);\n }\n}\nfunction _createClass(e, r, t) {\n return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", {\n writable: !1\n }), e;\n}\nexport { _createClass as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","function _assertThisInitialized(e) {\n if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n return e;\n}\nexport { _assertThisInitialized as default };","function _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\nexport { _setPrototypeOf as default };","import setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _inherits(t, e) {\n if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\");\n t.prototype = Object.create(e && e.prototype, {\n constructor: {\n value: t,\n writable: !0,\n configurable: !0\n }\n }), Object.defineProperty(t, \"prototype\", {\n writable: !1\n }), e && setPrototypeOf(t, e);\n}\nexport { _inherits as default };","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nfunction _possibleConstructorReturn(t, e) {\n if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e;\n if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\");\n return assertThisInitialized(t);\n}\nexport { _possibleConstructorReturn as default };","function _getPrototypeOf(t) {\n return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {\n return t.__proto__ || Object.getPrototypeOf(t);\n }, _getPrototypeOf(t);\n}\nexport { _getPrototypeOf as default };","// State is a set of static methods for working with the user state. It has\n// utilities for setting and retrieving cookies and storing user configuration\n// to localStorage.\nexport default class State {\n // Cookie keys.\n static darkModeLK = 'darkMode'\n static authCK = 'dexauth'\n static pwKeyCK = 'sessionkey'\n // Local storage keys (for data that we don't need at the server).\n static popupsLK = 'popups'\n static loggersLK = 'loggers'\n static recordersLK = 'recorders'\n static lastMarketLK = 'selectedMarket'\n static depthZoomLK = 'depthZoom'\n static lastMMMarketLK = 'mmMarket'\n static optionsExpansionLK = 'mmOptsExpand'\n static leftMarketDockLK = 'leftmarketdock'\n static selectedAssetLK = 'selectedasset'\n static notificationsLK = 'notifications' // DEPRECATED before v1\n static orderDisclaimerAckedLK = 'ordAck'\n static lastCandleDurationLK = 'lastCandleDuration'\n static localeSpecsKey = 'localeSpecsLK'\n static localeKey = 'localeLK'\n\n static setCookie (cname: string, cvalue: string) {\n const d = new Date()\n // Set cookie to expire in ten years.\n d.setTime(d.getTime() + (86400 * 365 * 10 * 1000))\n const expires = 'expires=' + d.toUTCString()\n document.cookie = cname + '=' + cvalue + ';' + expires + ';path=/'\n }\n\n /*\n * getCookie returns the value at the specified cookie name, otherwise null.\n */\n static getCookie (cname: string) {\n for (const cstr of document.cookie.split(';')) {\n const [k, v] = cstr.split('=')\n if (k.trim() === cname) return v\n }\n return null\n }\n\n /*\n * removeCookie tells the browser to stop using cookie. It's not enough to simply\n * erase cookie value because browser will still send it to the server (with empty\n * value), and that's not what server expects.\n */\n static removeCookie (cKey: string) {\n document.cookie = `${cKey}=;expires=Thu, 01 Jan 1970 00:00:01 GMT;`\n }\n\n /*\n * isDark returns true if the dark-mode cookie is currently set to '1' = true.\n */\n static isDark (): boolean {\n return State.fetchLocal(State.darkModeLK) === '1'\n }\n\n /* storeLocal puts the key-value pair into Window.localStorage. */\n static storeLocal (k: string, v: any) {\n window.localStorage.setItem(k, JSON.stringify(v))\n }\n\n /*\n * fetchLocal the value associated with the key in Window.localStorage, or\n * null if the no value exists for the key.\n */\n static fetchLocal (k: string) {\n const v = window.localStorage.getItem(k)\n if (v !== null) {\n return JSON.parse(v)\n }\n return null\n }\n\n /* removeLocal removes the key-value pair from Window.localStorage. */\n static removeLocal (k: string) {\n window.localStorage.removeItem(k)\n }\n}\n\n// Setting defaults here, unless specific cookie (or local storage) value was already chosen by the user.\nif (State.fetchLocal(State.darkModeLK) === null) State.storeLocal(State.darkModeLK, '1')\nif (State.fetchLocal(State.popupsLK) === null) State.storeLocal(State.popupsLK, '1')\nif (State.fetchLocal(State.leftMarketDockLK) === null) State.storeLocal(State.leftMarketDockLK, '1')\n","/*\n * requestJSON encodes the object and sends the JSON to the specified address.\n */\nexport async function requestJSON (method: string, addr: string, reqBody?: any): Promise<any> {\n try {\n const response = await window.fetch(addr, {\n method: method,\n headers: new window.Headers({ 'content-type': 'application/json' }),\n // credentials: \"same-origin\",\n body: reqBody\n })\n if (response.status !== 200) { throw response }\n const obj = await response.json()\n obj.requestSuccessful = true\n return obj\n } catch (response) {\n response.requestSuccessful = false\n response.msg = await response.text()\n return response\n }\n}\n\n/*\n * postJSON sends a POST request with JSON-formatted data and returns the\n * response.\n */\nexport async function postJSON (addr: string, data?: any) {\n return requestJSON('POST', addr, JSON.stringify(data))\n}\n\n/*\n * getJSON sends a GET request and returns the response.\n */\nexport async function getJSON (addr: string): Promise<any> {\n return requestJSON('GET', addr)\n}\n\nexport enum Errors {\n walletErr,\n walletAuthErr,\n noAuthErr,\n walletBalanceErr,\n dupeDEXErr,\n assetSupportErr,\n registerErr,\n signatureErr,\n zeroFeeErr,\n feeMismatchErr,\n feeSendErr,\n passwordErr,\n emptyHostErr,\n connectionErr,\n acctKeyErr,\n unknownOrderErr,\n orderParamsErr,\n dbErr,\n authErr,\n connectWalletErr,\n missingWalletErr,\n encryptionErr,\n decodeErr,\n accountVerificationErr,\n accountProofErr,\n parseKeyErr,\n marketErr,\n addressParseErr,\n addrErr,\n fileReadErr,\n unknownDEXErr,\n accountRetrieveErr,\n accountDisableErr,\n suspendedAcctErr,\n existenceCheckErr,\n createWalletErr,\n activeOrdersErr,\n newAddrErr,\n}\n","import State from './state'\nimport { postJSON } from './http'\n\ntype Locale = Record<string, string>\n\nexport const ID_NO_PASS_ERROR_MSG = 'NO_PASS_ERROR_MSG'\nexport const ID_NO_APP_PASS_ERROR_MSG = 'NO_APP_PASS_ERROR_MSG'\nexport const ID_SET_BUTTON_BUY = 'SET_BUTTON_BUY'\nexport const ID_SET_BUTTON_SELL = 'SET_BUTTON_SELL'\nexport const ID_OFF = 'OFF'\nexport const ID_MAX = 'MAX'\nexport const ID_READY = 'READY'\nexport const ID_NO_WALLET = 'NO_WALLET'\nexport const ID_DISABLED_MSG = 'DISABLED_MSG'\nexport const ID_WALLET_SYNC_PROGRESS = 'WALLET_SYNC_PROGRESS'\nexport const ID_HIDE_ADDITIONAL_SETTINGS = 'HIDE_ADDITIONAL_SETTINGS'\nexport const ID_SHOW_ADDITIONAL_SETTINGS = 'SHOW_ADDITIONAL_SETTINGS'\nexport const ID_BUY = 'BUY'\nexport const ID_SELL = 'SELL'\nexport const ID_NOT_SUPPORTED = 'NOT_SUPPORTED'\nexport const ID_VERSION_NOT_SUPPORTED = 'VERSION_NOT_SUPPORTED'\nexport const ID_CONNECTION_FAILED = 'CONNECTION_FAILED'\nexport const ID_ORDER_PREVIEW = 'ORDER_PREVIEW'\nexport const ID_CALCULATING = 'CALCULATING'\nexport const ID_ESTIMATE_UNAVAILABLE = 'ESTIMATE_UNAVAILABLE'\nexport const ID_NO_ZERO_RATE = 'NO_ZERO_RATE'\nexport const ID_NO_ZERO_QUANTITY = 'NO_ZERO_QUANTITY'\nexport const ID_TRADE = 'TRADE'\nexport const ID_NO_ASSET_WALLET = 'NO_ASSET_WALLET'\nexport const ID_EXECUTED = 'EXECUTED'\nexport const ID_BOOKED = 'BOOKED'\nexport const ID_CANCELING = 'CANCELING'\nexport const ID_PASSWORD_NOT_MATCH = 'PASSWORD_NOT_MATCH'\nexport const ID_ACCT_UNDEFINED = 'ACCT_UNDEFINED'\nexport const ID_KEEP_WALLET_PASS = 'KEEP_WALLET_PASS'\nexport const ID_NEW_WALLET_PASS = 'NEW_WALLET_PASS'\nexport const ID_LOT = 'LOT'\nexport const ID_LOTS = 'LOTS'\nexport const ID_UNKNOWN = 'UNKNOWN'\nexport const ID_EPOCH = 'EPOCH'\nexport const ID_ORDER_SUBMITTING = 'ORDER_SUBMITTING'\nexport const ID_SETTLING = 'SETTLING'\nexport const ID_NO_MATCH = 'NO_MATCH'\nexport const ID_CANCELED = 'CANCELED'\nexport const ID_REVOKED = 'REVOKED'\nexport const ID_WAITING_FOR_CONFS = 'WAITING_FOR_CONFS'\nexport const ID_NONE_SELECTED = 'NONE_SELECTED'\nexport const ID_REGISTRATION_FEE_SUCCESS = 'REGISTRATION_FEE_SUCCESS'\nexport const ID_API_ERROR = 'API_ERROR'\nexport const ID_ADD = 'ADD'\nexport const ID_CREATE = 'CREATE'\nexport const ID_SETUP_WALLET = 'SETUP_WALLET'\nexport const ID_WALLET_READY = 'WALLET_READY'\nexport const ID_CHANGE_WALLET_TYPE = 'CHANGE_WALLET_TYPE'\nexport const ID_KEEP_WALLET_TYPE = 'KEEP_WALLET_TYPE'\nexport const ID_WALLET_PENDING = 'WALLET_PENDING'\nexport const ID_SETUP_NEEDED = 'SETUP_NEEDED'\nexport const ID_SEND_SUCCESS = 'SEND_SUCCESS'\nexport const ID_RECONFIG_SUCCESS = 'RECONFIG_SUCCESS'\nexport const ID_RESCAN_STARTED = 'RESCAN_STARTED'\nexport const ID_NEW_WALLET_SUCCESS = 'NEW_WALLET_SUCCESS'\nexport const ID_WALLET_UNLOCKED = 'WALLET_UNLOCKED'\nexport const ID_SELLING = 'SELLING'\nexport const ID_BUYING = 'BUYING'\nexport const ID_WALLET_DISABLED_MSG = 'WALLET_DISABLED'\nexport const ID_WALLET_ENABLED_MSG = 'WALLET_ENABLED'\nexport const ID_ACTIVE_ORDERS_ERR_MSG = 'ACTIVE_ORDERS_ERR_MSG'\nexport const ID_AVAILABLE = 'AVAILABLE'\nexport const ID_LOCKED = 'LOCKED'\nexport const ID_IMMATURE = 'IMMATURE'\nexport const ID_FEE_BALANCE = 'FEE_BALANCE'\nexport const ID_CANDLES_LOADING = 'CANDLES_LOADING'\nexport const ID_DEPTH_LOADING = 'DEPTH_LOADING'\nexport const ID_INVALID_ADDRESS_MSG = 'INVALID_ADDRESS_MSG'\nexport const ID_TXFEE_UNSUPPORTED = 'TXFEE_UNSUPPORTED'\nexport const ID_TXFEE_ERR_MSG = 'TXFEE_ERR_MSG'\nexport const ID_ACTIVE_ORDERS_LOGOUT_ERR_MSG = 'ACTIVE_ORDERS_LOGOUT_ERR_MSG'\nexport const ID_INVALID_DATE_ERR_MSG = 'INVALID_DATE_ERR_MSG'\nexport const ID_NO_ARCHIVED_RECORDS = 'NO_ARCHIVED_RECORDS'\nexport const ID_DELETE_ARCHIVED_RECORDS_RESULT = 'DELETE_ARCHIVED_RECORDS_RESULT'\nexport const ID_ARCHIVED_RECORDS_PATH = 'ARCHIVED_RECORDS_PATH'\nexport const ID_DEFAULT = 'DEFAULT'\nexport const ID_ADDED = 'ADDED'\nexport const ID_DISCOVERED = 'DISCOVERED'\nexport const ID_UNSUPPORTED_ASSET_INFO_ERR_MSG = 'UNSUPPORTED_ASSET_INFO_ERR_MSG'\nexport const ID_LIMIT_ORDER = 'LIMIT_ORDER'\nexport const ID_LIMIT_ORDER_IMMEDIATE_TIF = 'LIMIT_ORDER_IMMEDIATE_TIF'\nexport const ID_MARKET_ORDER = 'MARKET_ORDER'\nexport const ID_CANCEL_ORDER = 'CANCEL_ORDER'\nexport const ID_MATCH_STATUS_NEWLY_MATCHED = 'MATCH_STATUS_NEWLY_MATCHED'\nexport const ID_MATCH_STATUS_MAKER_SWAP_CAST = 'MATCH_STATUS_MAKER_SWAP_CAST'\nexport const ID_MATCH_STATUS_TAKER_SWAP_CAST = 'MATCH_STATUS_TAKER_SWAP_CAST'\nexport const ID_MATCH_STATUS_MAKER_REDEEMED = 'MATCH_STATUS_MAKER_REDEEMED'\nexport const ID_MATCH_STATUS_REDEMPTION_SENT = 'MATCH_STATUS_REDEMPTION_SENT'\nexport const ID_MATCH_STATUS_REDEMPTION_CONFIRMED = 'MATCH_REDEMPTION_CONFIRMED'\nexport const ID_MATCH_STATUS_REVOKED = 'MATCH_STATUS_REVOKED'\nexport const ID_MATCH_STATUS_REFUNDED = 'MATCH_STATUS_REFUNDED'\nexport const ID_MATCH_STATUS_REFUND_PENDING = 'MATCH_STATUS_REFUND_PENDING'\nexport const ID_MATCH_STATUS_REDEEM_PENDING = 'MATCH_STATUS_REDEEM_PENDING'\nexport const ID_MATCH_STATUS_COMPLETE = 'MATCH_STATUS_COMPLETE'\nexport const ID_TAKER_FOUND_MAKER_REDEMPTION = 'TAKER_FOUND_MAKER_REDEMPTION'\nexport const ID_OPEN_WALLET_ERR_MSG = 'OPEN_WALLET_ERR_MSG'\nexport const ID_ORDER_ACCELERATION_FEE_ERR_MSG = 'ORDER_ACCELERATION_FEE_ERR_MSG'\nexport const ID_ORDER_ACCELERATION_ERR_MSG = 'ORDER_ACCELERATION_ERR_MSG'\nexport const ID_CONNECTED = 'CONNECTED'\nexport const ID_DISCONNECTED = 'DISCONNECTED'\nexport const ID_INVALID_CERTIFICATE = 'INVALID_CERTIFICATE'\nexport const ID_CONFIRMATIONS = 'CONFIRMATIONS'\nexport const ID_TAKER = 'TAKER'\nexport const ID_MAKER = 'MAKER'\nexport const ID_EMPTY_DEX_ADDRESS_MSG = 'EMPTY_DEX_ADDRESS_MSG'\nexport const ID_SELECT_WALLET_FOR_FEE_PAYMENT = 'SELECT_WALLET_FOR_FEE_PAYMENT'\nexport const ID_UNAVAILABLE = 'UNAVAILABLE'\nexport const ID_WALLET_SYNC_FINISHING_UP = 'WALLET_SYNC_FINISHING_UP'\nexport const ID_CONNECT_WALLET_ERR_MSG = 'CONNECTING_WALLET_ERR_MSG'\nexport const ID_REFUND_IMMINENT = 'REFUND_IMMINENT'\nexport const ID_REFUND_WILL_HAPPEN_AFTER = 'REFUND_WILL_HAPPEN_AFTER'\nexport const ID_AVAILABLE_TITLE = 'AVAILABLE_TITLE'\nexport const ID_LOCKED_TITLE = 'LOCKED_TITLE'\nexport const ID_IMMATURE_TITLE = 'IMMATURE_TITLE'\nexport const ID_SWAPPING = 'SWAPPING'\nexport const ID_BONDED = 'BONDED'\nexport const ID_LOCKED_BAL_MSG = 'LOCKED_BAL_MSG'\nexport const ID_IMMATURE_BAL_MSG = 'IMMATURE_BAL_MSG'\nexport const ID_LOCKED_SWAPPING_BAL_MSG = 'LOCKED_SWAPPING_BAL_MSG'\nexport const ID_LOCKED_BOND_BAL_MSG = 'LOCKED_BOND_BAL_MSG'\nexport const ID_RESERVES_DEFICIT = 'RESERVES_DEFICIT'\nexport const ID_RESERVES_DEFICIT_MSG = 'RESERVES_DEFICIT_MSG'\nexport const ID_BOND_RESERVES = 'BOND_RESERVES'\nexport const ID_BOND_RESERVES_MSG = 'BOND_RESERVES_MSG'\nexport const ID_SHIELDED = 'SHIELDED'\nexport const ID_TRANSPARENT = 'TRANSPARENT'\nexport const ID_SHIELDED_MSG = 'SHIELDED_MSG'\nexport const ID_ORDER = 'ORDER'\nexport const ID_LOCKED_ORDER_BAL_MSG = 'LOCKED_ORDER_BAL_MSG'\nexport const ID_CREATING_WALLETS = 'CREATING_WALLETS'\nexport const ID_ADDING_SERVERS = 'ADDING_SERVER'\nexport const ID_WALLET_RECOVERY_SUPPORT_MSG = 'WALLET_RECOVERY_SUPPORT_MSG'\nexport const ID_TICKETS_PURCHASED = 'TICKETS_PURCHASED'\nexport const ID_TICKET_STATUS_UNKNOWN = 'TICKET_STATUS_UNKNOWN'\nexport const ID_TICKET_STATUS_UNMINED = 'TICKET_STATUS_UNMINED'\nexport const ID_TICKET_STATUS_IMMATURE = 'TICKET_STATUS_IMMATURE'\nexport const ID_TICKET_STATUS_LIVE = 'TICKET_STATUS_LIVE'\nexport const ID_TICKET_STATUS_VOTED = 'TICKET_STATUS_VOTED'\nexport const ID_TICKET_STATUS_MISSED = 'TICKET_STATUS_MISSED'\nexport const ID_TICKET_STATUS_EXPIRED = 'TICKET_STATUS_EXPIRED'\nexport const ID_TICKET_STATUS_UNSPENT = 'TICKET_STATUS_UNSPENT'\nexport const ID_TICKET_STATUS_REVOKED = 'TICKET_STATUS_REVOKED'\nexport const ID_PASSWORD_RESET_SUCCESS_MSG = 'PASSWORD_RESET_SUCCESS_MSG'\nexport const ID_BROWSER_NTFN_ENABLED = 'BROWSER_NTFN_ENABLED'\nexport const ID_BROWSER_NTFN_ORDERS = 'BROWSER_NTFN_ORDERS'\nexport const ID_BROWSER_NTFN_MATCHES = 'BROWSER_NTFN_MATCHES'\nexport const ID_BROWSER_NTFN_BONDS = 'BROWSER_NTFN_BONDS'\nexport const ID_BROWSER_NTFN_CONNECTIONS = 'BROWSER_NTFN_CONNECTIONS'\nexport const ID_ORDER_BUTTON_BUY_BALANCE_ERROR = 'ORDER_BUTTON_BUY_BALANCE_ERROR'\nexport const ID_ORDER_BUTTON_SELL_BALANCE_ERROR = 'ORDER_BUTTON_SELL_BALANCE_ERROR'\nexport const ID_ORDER_BUTTON_QTY_ERROR = 'ORDER_BUTTON_QTY_ERROR'\nexport const ID_ORDER_BUTTON_QTY_RATE_ERROR = 'ORDER_BUTTON_QTY_RATE_ERROR'\nexport const ID_CREATE_ASSET_WALLET_MSG = 'CREATE_ASSET_WALLET_MSG'\nexport const ID_NO_WALLET_MSG = 'NO_WALLET_MSG'\nexport const ID_TRADING_TIER_UPDATED = 'TRADING_TIER_UPDATED'\nexport const ID_INVALID_TIER_VALUE = 'INVALID_TIER_VALUE'\nexport const ID_INVALID_COMPS_VALUE = 'INVALID_COMPS_VALUE'\nexport const ID_TX_TYPE_UNKNOWN = 'TX_TYPE_UNKNOWN'\nexport const ID_TX_TYPE_SEND = 'TX_TYPE_SEND'\nexport const ID_TX_TYPE_RECEIVE = 'TX_TYPE_RECEIVE'\nexport const ID_TX_TYPE_SWAP = 'TX_TYPE_SWAP'\nexport const ID_TX_TYPE_REDEEM = 'TX_TYPE_REDEEM'\nexport const ID_TX_TYPE_REFUND = 'TX_TYPE_REFUND'\nexport const ID_TX_TYPE_SPLIT = 'TX_TYPE_SPLIT'\nexport const ID_TX_TYPE_CREATE_BOND = 'TX_TYPE_CREATE_BOND'\nexport const ID_TX_TYPE_REDEEM_BOND = 'TX_TYPE_REDEEM_BOND'\nexport const ID_TX_TYPE_APPROVE_TOKEN = 'TX_TYPE_APPROVE_TOKEN'\nexport const ID_TX_TYPE_ACCELERATION = 'TX_TYPE_ACCELERATION'\nexport const ID_TX_TYPE_SELF_TRANSFER = 'TX_TYPE_SELF_TRANSFER'\nexport const ID_TX_TYPE_REVOKE_TOKEN_APPROVAL = 'TX_TYPE_REVOKE_TOKEN_APPROVAL'\nexport const ID_TX_TYPE_TICKET_PURCHASE = 'TX_TYPE_TICKET_PURCHASE'\nexport const ID_TX_TYPE_TICKET_VOTE = 'TX_TYPE_TICKET_VOTE'\nexport const ID_TX_TYPE_TICKET_REVOCATION = 'TX_TYPE_TICKET_REVOCATION'\nexport const ID_TX_TYPE_SWAP_OR_SEND = 'TX_TYPE_SWAP_OR_SEND'\nexport const ID_TX_TYPE_MIX = 'TX_TYPE_MIX'\nexport const ID_SWAP_OR_SEND_TOOLTIP = 'SWAP_OR_SEND_TOOLTIP'\nexport const ID_MISSING_CEX_CREDS = 'MISSING_CEX_CREDS'\nexport const ID_MATCH_BUFFER = 'MATCH_BUFFER'\nexport const ID_NO_PLACEMENTS = 'NO_PLACEMENTS'\nexport const ID_INVALID_VALUE = 'INVALID_VALUE'\nexport const ID_NO_ZERO = 'NO_ZERO'\nexport const ID_BOTTYPE_BASIC_MM = 'BOTTYPE_BASIC_MM'\nexport const ID_BOTTYPE_ARB_MM = 'BOTTYPE_ARB_MM'\nexport const ID_BOTTYPE_SIMPLE_ARB = 'BOTTYPE_SIMPLE_ARB'\nexport const ID_NO_BOTTYPE = 'NO_BOTTYPE'\nexport const ID_NO_CEX = 'NO_CEX'\nexport const ID_CEXBALANCE_ERR = 'CEXBALANCE_ERR'\nexport const ID_PENDING = 'PENDING'\nexport const ID_COMPLETE = 'COMPLETE'\nexport const ID_ARCHIVED_SETTINGS = 'ARCHIVED_SETTINGS'\nexport const ID_NO_CODE_PROVIDED = 'NO_CODE_PROVIDED'\nexport const ID_ENABLE_ACCOUNT = 'ENABLE_ACCOUNT'\nexport const ID_DISABLE_ACCOUNT = 'DISABLE_ACCOUNT'\nexport const ID_ACCOUNT_DISABLED_MSG = 'ACCOUNT_DISABLED_MSG'\nexport const ID_DEX_DISABLED_MSG = 'DEX_DISABLED_MSG'\nexport const ID_WALLET_NOT_SYNCED = 'WALLET_NOT_SYNCED'\nexport const ID_WALLET_NO_PEERS = 'WALLET_NO_PEERS'\nexport const ID_DEPOSIT_ERROR = 'DEPOSIT_ERROR'\nexport const ID_WITHDRAW_ERROR = 'WITHDRAW_ERROR'\nexport const ID_DEX_UNDERFUNDED = 'DEX_UNDERFUNDED'\nexport const ID_CEX_UNDERFUNDED = 'CEX_UNDERFUNDED'\nexport const ID_CEX_TOO_SHALLOW = 'CEX_TOO_SHALLOW'\nexport const ID_ACCOUNT_SUSPENDED = 'ACCOUNT_SUSPENDED'\nexport const ID_USER_LIMIT_TOO_LOW = 'USER_LIMIT_TOO_LOW'\nexport const ID_NO_PRICE_SOURCE = 'NO_PRICE_SOURCE'\nexport const ID_CEX_ORDERBOOK_UNSYNCED = 'CEX_ORDERBOOK_UNSYNCED'\nexport const ID_DETERMINE_PLACEMENTS_ERROR = 'DETERMINE_PLACEMENTS_ERROR'\nexport const ID_PLACE_BUY_ORDERS_ERROR = 'PLACE_BUY_ORDERS_ERROR'\nexport const ID_PLACE_SELL_ORDERS_ERROR = 'PLACE_SELL_ORDERS_ERROR'\nexport const ID_CEX_TRADE_ERROR = 'CEX_TRADE_ERROR'\nexport const ID_ORDER_REPORT_TITLE = 'ORDER_REPORT_TITLE'\nexport const ID_CEX_BALANCES = 'CEX_BALANCES'\nexport const ID_CAUSES_SELF_MATCH = 'CAUSES_SELF_MATCH'\nexport const ID_CEX_NOT_CONNECTED = 'CEX_NOT_CONNECTED'\nexport const ID_DELETE_BOT = 'DELETE_BOT'\n\nlet locale: Locale\n\nexport async function loadLocale (lang: string, commitHash: string, skipCache: boolean) {\n if (!skipCache) {\n const specs = State.fetchLocal(State.localeSpecsKey)\n if (specs && specs.lang === lang && specs.commitHash === commitHash) {\n locale = State.fetchLocal(State.localeKey)\n return\n }\n }\n locale = await postJSON('/api/locale', lang)\n State.storeLocal(State.localeSpecsKey, { lang, commitHash })\n State.storeLocal(State.localeKey, locale)\n}\n\n/* prep will format the message to the current locale. */\nexport function prep (k: string, args?: Record<string, string>) {\n return stringTemplateParser(locale[k], args || {})\n}\n\nwindow.clearLocale = () => {\n State.removeLocal(State.localeSpecsKey)\n State.removeLocal(State.localeKey)\n}\n\n/*\n * stringTemplateParser is a template string matcher, where expression is any\n * text. It switches what is inside double brackets (e.g. 'buy {{ asset }}')\n * for the value described into args. args is an object with keys\n * equal to the placeholder keys. (e.g. {\"asset\": \"dcr\"}).\n * So that will be switched for: 'asset dcr'.\n */\nfunction stringTemplateParser (expression: string, args: Record<string, string>) {\n // templateMatcher matches any text which:\n // is some {{ text }} between two brackets, and a space between them.\n // It is global, therefore it will change all occurrences found.\n // text can be anything, but brackets '{}' and space '\\s'\n const templateMatcher = /{{\\s?([^{}\\s]*)\\s?}}/g\n return expression.replace(templateMatcher, (_, value) => args[value])\n}\n","import * as intl from './locales'\nimport {\n UnitInfo,\n LayoutMetrics,\n WalletState,\n PageElement\n} from './registry'\nimport State from './state'\n\n// Symbolizer is satisfied by both dex.Asset and core.SupportedAsset. Used by\n// Doc.symbolize.\ninterface Symbolizer {\n symbol: string\n unitInfo: UnitInfo\n}\n\nconst parser = new window.DOMParser()\n\nconst FPS = 30\n\nconst BipIDs: Record<number, string> = {\n 0: 'btc',\n 42: 'dcr',\n 2: 'ltc',\n 5: 'dash',\n 20: 'dgb',\n 22: 'mona',\n 28: 'vtc',\n 3: 'doge',\n 145: 'bch',\n 60: 'eth',\n 60001: 'usdc.eth',\n 60002: 'usdt.eth',\n 60003: 'matic.eth',\n 136: 'firo',\n 133: 'zec',\n 966: 'polygon',\n 966001: 'usdc.polygon',\n 966002: 'weth.polygon',\n 966003: 'wbtc.polygon',\n 966004: 'usdt.polygon',\n 147: 'zcl'\n}\n\nconst BipSymbolIDs: Record<string, number> = {};\n(function () {\n for (const k of Object.keys(BipIDs)) {\n BipSymbolIDs[BipIDs[parseInt(k)]] = parseInt(k)\n }\n})()\n\nconst BipSymbols = Object.values(BipIDs)\n\nconst RateEncodingFactor = 1e8 // same as value defined in ./orderutil\n\nconst log10RateEncodingFactor = Math.round(Math.log10(RateEncodingFactor))\n\nconst languages = navigator.languages.filter((locale: string) => locale !== 'c')\n\nconst intFormatter = new Intl.NumberFormat(languages, { maximumFractionDigits: 0 })\n\nconst fourSigFigs = new Intl.NumberFormat(languages, {\n minimumSignificantDigits: 4,\n maximumSignificantDigits: 4\n})\n\n/* A cache for formatters used for Doc.formatCoinValue. */\nconst decimalFormatters: Record<number, Intl.NumberFormat> = {}\n\n/*\n * decimalFormatter gets the formatCoinValue formatter for the specified decimal\n * precision.\n */\nfunction decimalFormatter (prec: number) {\n return formatter(decimalFormatters, 2, prec)\n}\n\n/* A cache for formatters used for Doc.formatFullPrecision. */\nconst fullPrecisionFormatters: Record<number, Intl.NumberFormat> = {}\n\n/*\n * fullPrecisionFormatter gets the formatFullPrecision formatter for the\n * specified decimal precision.\n */\nfunction fullPrecisionFormatter (prec: number, locales?: string | string[]) {\n return formatter(fullPrecisionFormatters, prec, prec, locales)\n}\n\n/*\n * formatter gets the formatter from the supplied cache if it already exists,\n * else creates it.\n */\nfunction formatter (formatters: Record<string, Intl.NumberFormat>, min: number, max: number, locales?: string | string[]): Intl.NumberFormat {\n const k = `${min}-${max}`\n let fmt = formatters[k]\n if (!fmt) {\n fmt = new Intl.NumberFormat(locales ?? languages, {\n minimumFractionDigits: min,\n maximumFractionDigits: max\n })\n formatters[k] = fmt\n }\n return fmt\n}\n\n/*\n * convertToConventional converts the value in atomic units to conventional\n * units.\n */\nfunction convertToConventional (v: number, unitInfo?: UnitInfo) {\n let prec = 8\n if (unitInfo) {\n const f = unitInfo.conventional.conversionFactor\n v /= f\n prec = Math.round(Math.log10(f))\n }\n return [v, prec]\n}\n\n/*\n * bestDisplayOrder is used in bestConversion, and is the order of magnitude\n * that is considered the best for display. For example, if bestDisplayOrder is\n * 1, and the choices for display are 1,000 BTC or 0.00001 Sats, the algorithm\n * will look at the orders of the conversions, 1000 => 10^3 => order 3, and\n * 0.00001 => 10^-5 => order 5, and see which is closest to bestDisplayOrder and\n * choose that conversion. In the example, 3 - bestDisplayOrder = 2 and\n * 1 - (-5) = 6, so the conversion that has the order closest to\n * bestDisplayOrder is the first one, 1,000 BTC.\n */\nconst bestDisplayOrder = 1 // 10^1 => 1\n\n/*\n * resolveUnitConversions creates a lookup object mapping unit -> conversion\n * factor. By default, resolveUnitConversions only maps the atomic and\n * conventional units. If a prefs dict is provided, additional units can be\n * included.\n */\nfunction resolveUnitConversions (ui: UnitInfo, prefs?: Record<string, boolean>): Record<string, number> {\n const unitFactors: Record<string, number> = {\n [ui.atomicUnit]: 1,\n [ui.conventional.unit]: ui.conventional.conversionFactor\n }\n if (ui.denominations && prefs) {\n for (const alt of ui.denominations) if (prefs[alt.unit]) unitFactors[alt.unit] = alt.conversionFactor\n }\n return unitFactors\n}\n\n// Helpers for working with the DOM.\nexport default class Doc {\n /*\n * idel is the element with the specified id that is the descendent of the\n * specified node.\n */\n static idel (el: Document | Element, id: string): HTMLElement {\n return el.querySelector(`#${id}`) as HTMLElement\n }\n\n /* bind binds the function to the event for the element. */\n static bind (el: EventTarget, ev: string | string[], f: EventListenerOrEventListenerObject, opts?: any /* EventListenerOptions */): void {\n for (const e of (Array.isArray(ev) ? ev : [ev])) el.addEventListener(e, f, opts)\n }\n\n /* unbind removes the handler for the event from the element. */\n static unbind (el: EventTarget, ev: string, f: (e: Event) => void): void {\n el.removeEventListener(ev, f)\n }\n\n /* noderize creates a Document object from a string of HTML. */\n static noderize (html: string): Document {\n return parser.parseFromString(html, 'text/html')\n }\n\n /*\n * mouseInElement returns true if the position of mouse event, e, is within\n * the bounds of the specified element or any of its descendents.\n */\n static mouseInElement (e: MouseEvent, el: HTMLElement): boolean {\n if (el.contains(e.target as Node)) return true\n const rect = el.getBoundingClientRect()\n return e.pageX >= rect.left && e.pageX <= rect.right &&\n e.pageY >= rect.top && e.pageY <= rect.bottom\n }\n\n /*\n * layoutMetrics gets information about the elements position on the page.\n */\n static layoutMetrics (el: HTMLElement): LayoutMetrics {\n const box = el.getBoundingClientRect()\n const docEl = document.documentElement\n const top = box.top + docEl.scrollTop\n const left = box.left + docEl.scrollLeft\n const w = el.offsetWidth\n const h = el.offsetHeight\n return {\n bodyTop: top,\n bodyLeft: left,\n width: w,\n height: h,\n centerX: left + w / 2,\n centerY: top + h / 2\n }\n }\n\n static descendentMetrics (parent: PageElement, kid: PageElement): LayoutMetrics {\n const parentMetrics = Doc.layoutMetrics(parent)\n const kidMetrics = Doc.layoutMetrics(kid)\n return {\n bodyTop: kidMetrics.bodyTop - parentMetrics.bodyTop,\n bodyLeft: kidMetrics.bodyLeft - parentMetrics.bodyLeft,\n width: kidMetrics.width,\n height: kidMetrics.height,\n centerX: kidMetrics.centerX - parentMetrics.bodyLeft,\n centerY: kidMetrics.centerY - parentMetrics.bodyTop\n }\n }\n\n /* empty removes all child nodes from the specified element. */\n static empty (...els: Element[]) {\n for (const el of els) while (el.firstChild) el.removeChild(el.firstChild)\n }\n\n /*\n * setContent removes all child nodes from the specified element and appends\n * passed elements.\n */\n static setContent (ancestor: PageElement, ...kids: PageElement[]) {\n Doc.empty(ancestor)\n for (const k of kids) ancestor.appendChild(k)\n }\n\n /*\n * hide hides the specified elements. This is accomplished by adding the\n * bootstrap d-hide class to the element. Use Doc.show to undo.\n */\n static hide (...els: Element[]) {\n for (const el of els) el.classList.add('d-hide')\n }\n\n /*\n * show shows the specified elements. This is accomplished by removing the\n * bootstrap d-hide class as added with Doc.hide.\n */\n static show (...els: Element[]) {\n for (const el of els) el.classList.remove('d-hide')\n }\n\n /*\n * showTemporarily shows the specified elements for the specified time, then\n * hides it again.\n */\n static showTemporarily (timeout: number, ...els: Element[]) {\n this.show(...els)\n setTimeout(() => {\n this.hide(...els)\n }, timeout)\n }\n\n /*\n * show or hide the specified elements, based on value of the truthiness of\n * vis.\n */\n static setVis (vis: any, ...els: Element[]) {\n if (vis) Doc.show(...els)\n else Doc.hide(...els)\n }\n\n /* isHidden returns true if the specified element is hidden */\n static isHidden (el: Element): boolean {\n return el.classList.contains('d-hide')\n }\n\n /* isDisplayed returns true if the specified element is not hidden */\n static isDisplayed (el: Element): boolean {\n return !el.classList.contains('d-hide')\n }\n\n /*\n * animate runs the supplied function, which should be a \"progress\" function\n * accepting one argument. The progress function will be called repeatedly\n * with the argument varying from 0.0 to 1.0. The exact path that animate\n * takes from 0.0 to 1.0 will vary depending on the choice of easing\n * algorithm. See the Easing object for the available easing algo choices. The\n * default easing algorithm is linear.\n */\n static async animate (duration: number, f: (progress: number) => void, easingAlgo?: string) {\n await new Animation(duration, f, easingAlgo).wait()\n }\n\n static async blink (el: PageElement) {\n const [r, g, b] = State.isDark() ? [255, 255, 255] : [0, 0, 0]\n const cycles = 2\n Doc.animate(1000, (p: number) => {\n el.style.outline = `2px solid rgba(${r}, ${g}, ${b}, ${(cycles - p * cycles) % 1})`\n })\n }\n\n static applySelector (ancestor: HTMLElement, k: string): PageElement[] {\n return Array.from(ancestor.querySelectorAll(k)) as PageElement[]\n }\n\n static kids (ancestor: HTMLElement): PageElement[] {\n return Array.from(ancestor.children) as PageElement[]\n }\n\n static safeSelector (ancestor: HTMLElement, k: string): PageElement {\n const el = ancestor.querySelector(k)\n if (el) return el as PageElement\n console.warn(`no element found for selector '${k}' on element ->`, ancestor)\n return document.createElement('div')\n }\n\n /*\n * idDescendants creates an object mapping to elements which are descendants\n * of the ancestor and have id attributes. Elements are keyed by their id\n * value.\n */\n static idDescendants (ancestor: HTMLElement): Record<string, PageElement> {\n const d: Record<string, PageElement> = {}\n for (const el of Doc.applySelector(ancestor, '[id]')) d[el.id] = el\n return d\n }\n\n /*\n * formatCoinValue formats the value in atomic units into a string\n * representation in conventional units. If the value happens to be an\n * integer, no decimals are displayed. Trailing zeros may be truncated.\n */\n static formatCoinValue (vAtomic: number, unitInfo?: UnitInfo): string {\n const [v, prec] = convertToConventional(vAtomic, unitInfo)\n if (Number.isInteger(v)) return intFormatter.format(v)\n return decimalFormatter(prec).format(v)\n }\n\n static conventionalCoinValue (vAtomic: number, unitInfo?: UnitInfo): number {\n const [v] = convertToConventional(vAtomic, unitInfo)\n return v\n }\n\n /*\n * formatRateFullPrecision formats rate to represent it exactly at rate step\n * precision, trimming non-effectual zeros if there are any.\n */\n static formatRateFullPrecision (encRate: number, bui: UnitInfo, qui: UnitInfo, rateStepEnc: number) {\n const r = bui.conventional.conversionFactor / qui.conventional.conversionFactor\n const convRate = encRate * r / RateEncodingFactor\n const rateStepDigits = log10RateEncodingFactor - Math.floor(Math.log10(rateStepEnc)) -\n Math.floor(Math.log10(bui.conventional.conversionFactor) - Math.log10(qui.conventional.conversionFactor))\n if (rateStepDigits <= 0) return intFormatter.format(convRate)\n return fullPrecisionFormatter(rateStepDigits).format(convRate)\n }\n\n static formatFourSigFigs (n: number, maxDecimals?: number): string {\n return formatSigFigsWithFormatters(intFormatter, fourSigFigs, n, maxDecimals)\n }\n\n static formatInt (i: number): string {\n return intFormatter.format(i)\n }\n\n /*\n * formatFullPrecision formats the value in atomic units into a string\n * representation in conventional units using the full decimal precision\n * associated with the conventional unit's conversion factor.\n */\n static formatFullPrecision (vAtomic: number, unitInfo?: UnitInfo): string {\n const [v, prec] = convertToConventional(vAtomic, unitInfo)\n return fullPrecisionFormatter(prec).format(v)\n }\n\n /*\n * formatFiatConversion formats the value in atomic units to its representation in\n * conventional units and returns the fiat value as a string.\n */\n static formatFiatConversion (vAtomic: number, rate: number, unitInfo?: UnitInfo): string {\n if (!rate || rate === 0) return intl.prep(intl.ID_UNAVAILABLE)\n const prec = 2\n const [v] = convertToConventional(vAtomic, unitInfo)\n const value = v * rate\n return fullPrecisionFormatter(prec).format(value)\n }\n\n static languages (): string[] {\n return languages\n }\n\n static formatFiatValue (value: number): string {\n return fullPrecisionFormatter(2).format(value)\n }\n\n /*\n * bestConversion picks the best conversion factor for the atomic value. The\n * best is the one in which log10(converted_value) is closest to\n * bestDisplayOrder. Return: [converted_value, precision, unit].\n */\n static bestConversion (atoms: number, ui: UnitInfo, prefs?: Record<string, boolean>): [number, number, string] {\n const unitFactors = resolveUnitConversions(ui, prefs)\n const logDiffs: [string, number][] = []\n const entryDiff = (entry: [string, number]) => Math.abs(Math.log10(atoms / entry[1]) - bestDisplayOrder)\n for (const entry of Object.entries(unitFactors)) logDiffs.push([entry[0], entryDiff(entry)])\n const best = logDiffs.reduce((best: [string, number], entry: [string, number]) => entry[1] < best[1] ? entry : best)\n const unit = best[0]\n const cFactor = unitFactors[unit]\n const v = atoms / cFactor\n return [v, Math.round(Math.log10(cFactor)), unit]\n }\n\n /*\n * formatBestUnitsFullPrecision formats the value with the best choice of\n * units, at full precision.\n */\n static formatBestUnitsFullPrecision (atoms: number, ui: UnitInfo, prefs?: Record<string, boolean>): [string, string] {\n const [v, prec, unit] = this.bestConversion(atoms, ui, prefs)\n if (Number.isInteger(v)) return [intFormatter.format(v), unit]\n return [fullPrecisionFormatter(prec).format(v), unit]\n }\n\n /*\n * formatBestUnitsFourSigFigs formats the value with the best choice of\n * units and rounded to four significant figures.\n */\n static formatBestUnitsFourSigFigs (atoms: number, ui: UnitInfo, prefs?: Record<string, boolean>): [string, string] {\n const [v, prec, unit] = this.bestConversion(atoms, ui, prefs)\n return [Doc.formatFourSigFigs(v, prec), unit]\n }\n\n /*\n * formatBestRateElement formats a rate using the best available units and\n * updates the UI element. The ancestor should have descendents with data\n * attributes [best-value, data-unit, data-unit-box, data-denom].\n */\n static formatBestRateElement (ancestor: PageElement, assetID: number, atoms: number, ui: UnitInfo, prefs?: Record<string, boolean>) {\n Doc.formatBestValueElement(ancestor, assetID, atoms, ui, prefs)\n Doc.setText(ancestor, '[data-denom]', ui.feeRateDenom)\n }\n\n /*\n * formatBestRateElement formats a value using the best available units and\n * updates the UI element. The ancestor should have descendents with data\n * attributes [best-value, data-unit, data-unit-box].\n */\n static formatBestValueElement (ancestor: PageElement, assetID: number, atoms: number, ui: UnitInfo, prefs?: Record<string, boolean>) {\n const [v, unit] = this.formatBestUnitsFourSigFigs(atoms, ui, prefs)\n Doc.setText(ancestor, '[data-value]', v)\n Doc.setText(ancestor, '[data-unit]', unit)\n const span = Doc.safeSelector(ancestor, '[data-unit-box]')\n span.dataset.atoms = String(atoms)\n span.dataset.assetID = String(assetID)\n }\n\n static conventionalRateStep (rateStepEnc: number, baseUnitInfo: UnitInfo, quoteUnitInfo: UnitInfo) {\n const [qFactor, bFactor] = [quoteUnitInfo.conventional.conversionFactor, baseUnitInfo.conventional.conversionFactor]\n return rateStepEnc / RateEncodingFactor * (bFactor / qFactor)\n }\n\n /*\n * logoPath creates a path to a png logo for the specified ticker symbol. If\n * the symbol is not a supported asset, the generic letter logo will be\n * requested instead.\n */\n static logoPath (symbol: string): string {\n if (BipSymbols.indexOf(symbol) === -1) symbol = symbol.substring(0, 1)\n symbol = symbol.split('.')[0] // e.g. usdc.eth => usdc\n return `/img/coins/${symbol}.png`\n }\n\n static bipSymbol (assetID: number): string {\n return BipIDs[assetID]\n }\n\n static bipIDFromSymbol (symbol: string): number {\n return BipSymbolIDs[symbol]\n }\n\n static bipCEXSymbol (assetID: number): string {\n const bipSymbol = BipIDs[assetID]\n if (!bipSymbol || bipSymbol === '') return ''\n const parts = bipSymbol.split('.')\n if (parts[0] === 'weth') return 'eth'\n return parts[0]\n }\n\n static logoPathFromID (assetID: number): string {\n return Doc.logoPath(BipIDs[assetID])\n }\n\n /*\n * symbolize creates a token-aware symbol element for the asset's symbol. For\n * non-token assets, this is simply a <span>SYMBOL</span>. For tokens, it'll\n * be <span><span>SYMBOL</span><sup>PARENT</sup></span>.\n */\n static symbolize (asset: Symbolizer, useLogo?: boolean): PageElement {\n const ticker = asset.unitInfo.conventional.unit\n const symbolSpan = document.createElement('span')\n symbolSpan.textContent = ticker.toUpperCase()\n const parts = asset.symbol.split('.')\n const isToken = parts.length === 2\n if (!isToken) return symbolSpan\n const parentSymbol = parts[1]\n const span = document.createElement('span')\n span.appendChild(symbolSpan)\n if (useLogo) {\n const parentLogo = document.createElement('img')\n parentLogo.src = Doc.logoPath(parentSymbol)\n parentLogo.classList.add('token-parent')\n span.appendChild(parentLogo)\n return span\n }\n const parentSup = document.createElement('sup')\n parentSup.textContent = parentSymbol.toUpperCase()\n parentSup.classList.add('token-parent')\n span.appendChild(parentSup)\n return span\n }\n\n /*\n * shortSymbol removes the short format of a symbol, with any parent chain\n * identifier removed\n */\n static shortSymbol (symbol: string): string {\n return symbol.split('.')[0].toUpperCase()\n }\n\n /*\n * setText sets the textContent for all descendant elements that match the\n * specified CSS selector.\n */\n static setText (ancestor: PageElement, selector: string, textContent: string) {\n for (const el of Doc.applySelector(ancestor, selector)) el.textContent = textContent\n }\n\n static setSrc (ancestor: PageElement, selector: string, textContent: string) {\n for (const img of Doc.applySelector(ancestor, selector)) img.src = textContent\n }\n\n /*\n * cleanTemplates removes the elements from the DOM and deletes the id\n * attribute.\n */\n static cleanTemplates (...tmpls: HTMLElement[]) {\n tmpls.forEach(tmpl => {\n tmpl.remove()\n tmpl.removeAttribute('id')\n })\n }\n\n /*\n * tmplElement is a helper function for grabbing sub-elements of the market list\n * template.\n */\n static tmplElement (ancestor: Document | HTMLElement, s: string): PageElement {\n return ancestor.querySelector(`[data-tmpl=\"${s}\"]`) || document.createElement('div')\n }\n\n /*\n * parseTemplate returns an object of data-tmpl elements, keyed by their\n * data-tmpl values.\n */\n static parseTemplate (ancestor: HTMLElement): Record<string, PageElement> {\n const d: Record<string, PageElement> = {}\n for (const el of Doc.applySelector(ancestor, '[data-tmpl]')) d[el.dataset.tmpl || ''] = el\n return d\n }\n\n /*\n * timeSince returns a string representation of the duration since the\n * specified unix timestamp (milliseconds).\n */\n static timeSince (ms: number): string {\n return Doc.formatDuration((new Date().getTime()) - ms)\n }\n\n /*\n * hmsSince returns a time duration since the specified unix timestamp\n * formatted as HH:MM:SS\n */\n static hmsSince (secs: number) {\n let r = (new Date().getTime() / 1000) - secs\n const h = String(Math.floor(r / 3600))\n r = r % 3600\n const m = String(Math.floor(r / 60))\n const s = String(Math.floor(r % 60))\n return `${h.padStart(2, '0')}:${m.padStart(2, '0')}:${s.padStart(2, '0')}`\n }\n\n /* formatDuration returns a string representation of the duration */\n static formatDuration (dur: number): string {\n let seconds = Math.floor(dur)\n let result = ''\n let count = 0\n const add = (n: number, s: string) => {\n if (n > 0 || count > 0) count++\n if (n > 0) result += `${n} ${s} `\n return count >= 2\n }\n let y, mo, d, h, m, s\n [y, seconds] = timeMod(seconds, aYear)\n if (add(y, 'y')) { return result }\n [mo, seconds] = timeMod(seconds, aMonth)\n if (add(mo, 'mo')) { return result }\n [d, seconds] = timeMod(seconds, aDay)\n if (add(d, 'd')) { return result }\n [h, seconds] = timeMod(seconds, anHour)\n if (add(h, 'h')) { return result }\n [m, seconds] = timeMod(seconds, aMinute)\n if (add(m, 'm')) { return result }\n [s, seconds] = timeMod(seconds, 1000)\n add(s, 's')\n return result || '0 s'\n }\n\n /*\n * disableMouseWheel can be used to disable the mouse wheel for any\n * input. It is very easy to unknowingly scroll up on a number input\n * and then submit an unexpected value. This function prevents the\n * scroll increment/decrement behavior for a wheel action on a\n * number input.\n */\n static disableMouseWheel (...inputFields: Element[]) {\n for (const inputField of inputFields) {\n Doc.bind(inputField, 'wheel', () => { /* pass */ }, { passive: true })\n }\n }\n\n // showFormError can be used to set and display error message on forms.\n static showFormError (el: PageElement, msg: any) {\n el.textContent = msg\n Doc.show(el)\n }\n\n // showFiatValue displays the fiat equivalent for the provided amount.\n static showFiatValue (display: PageElement, amount: number, rate: number, ui: UnitInfo): void {\n if (rate) {\n display.textContent = Doc.formatFiatConversion(amount, rate, ui)\n Doc.show(display.parentElement as Element)\n } else Doc.hide(display.parentElement as Element)\n }\n}\n\n/*\n * Animation is a handler for starting and stopping animations.\n */\nexport class Animation {\n done: (() => void) | undefined\n endAnimation: boolean\n thread: Promise<void>\n static Forever: number\n\n constructor (duration: number, f: (progress: number) => void, easingAlgo?: string, done?: () => void) {\n this.done = done\n this.thread = this.run(duration, f, easingAlgo)\n }\n\n /*\n * run runs the animation function, increasing progress from 0 to 1 in a\n * manner dictated by easingAlgo.\n */\n async run (duration: number, f: (progress: number) => void, easingAlgo?: string) {\n duration = duration >= 0 ? duration : 1000 * 86400 * 365 * 10 // 10 years, in ms\n const easer = easingAlgo ? Easing[easingAlgo] : Easing.linear\n const start = new Date().getTime()\n const end = (duration === Animation.Forever) ? Number.MAX_SAFE_INTEGER : start + duration\n const range = end - start\n const frameDuration = 1000 / FPS\n let now = start\n this.endAnimation = false\n while (now < end) {\n if (this.endAnimation) return this.runCompletionFunction()\n f(easer((now - start) / range))\n await sleep(frameDuration)\n now = new Date().getTime()\n }\n f(1)\n this.runCompletionFunction()\n }\n\n /* wait returns a promise that will resolve when the animation completes. */\n async wait () {\n await this.thread\n }\n\n /* stop schedules the animation to exit at its next frame. */\n stop () {\n this.endAnimation = true\n }\n\n /*\n * stopAndWait stops the animations and returns a promise that will resolve\n * when the animation exits.\n */\n async stopAndWait () {\n this.stop()\n await this.wait()\n }\n\n /* runCompletionFunction runs any registered callback function */\n runCompletionFunction () {\n if (this.done) this.done()\n }\n}\nAnimation.Forever = -1\n\n/* Easing algorithms for animations. */\nexport const Easing: Record<string, (t: number) => number> = {\n linear: t => t,\n easeIn: t => t * t,\n easeOut: t => t * (2 - t),\n easeInHard: t => t * t * t,\n easeOutHard: t => (--t) * t * t + 1,\n easeOutElastic: t => {\n const c4 = (2 * Math.PI) / 3\n return t === 0\n ? 0\n : t === 1\n ? 1\n : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c4) + 1\n }\n}\n\n/* WalletIcons are used for controlling wallets in various places. */\nexport class WalletIcons {\n icons: Record<string, HTMLElement>\n status: Element\n\n constructor (box: HTMLElement) {\n const stateElement = (name: string) => box.querySelector(`[data-state=${name}]`) as HTMLElement\n this.icons = {}\n this.icons.sleeping = stateElement('sleeping')\n this.icons.locked = stateElement('locked')\n this.icons.unlocked = stateElement('unlocked')\n this.icons.nowallet = stateElement('nowallet')\n this.icons.syncing = stateElement('syncing')\n this.icons.nopeers = stateElement('nopeers')\n this.icons.disabled = stateElement('disabled')\n this.status = stateElement('status')\n }\n\n /* sleeping sets the icons to indicate that the wallet is not connected. */\n sleeping () {\n const i = this.icons\n Doc.hide(i.locked, i.unlocked, i.nowallet, i.syncing, i.disabled)\n Doc.show(i.sleeping)\n if (this.status) this.status.textContent = intl.prep(intl.ID_OFF)\n }\n\n /*\n * locked sets the icons to indicate that the wallet is connected, but locked.\n */\n locked () {\n const i = this.icons\n Doc.hide(i.unlocked, i.nowallet, i.sleeping, i.disabled)\n Doc.show(i.locked)\n if (this.status) this.status.textContent = intl.prep(intl.ID_LOCKED)\n }\n\n /*\n * unlocked sets the icons to indicate that the wallet is connected and\n * unlocked.\n */\n unlocked () {\n const i = this.icons\n Doc.hide(i.locked, i.nowallet, i.sleeping, i.disabled)\n Doc.show(i.unlocked)\n if (this.status) this.status.textContent = intl.prep(intl.ID_READY)\n }\n\n /* nowallet sets the icons to indicate that no wallet exists. */\n nowallet () {\n const i = this.icons\n Doc.hide(i.locked, i.unlocked, i.sleeping, i.syncing, i.disabled)\n Doc.show(i.nowallet)\n if (this.status) this.status.textContent = intl.prep(intl.ID_NO_WALLET)\n }\n\n /* set the icons to indicate that the wallet is disabled */\n disabled () {\n const i = this.icons\n Doc.hide(i.locked, i.unlocked, i.sleeping, i.syncing, i.nowallet, i.nopeers)\n Doc.show(i.disabled)\n i.disabled.dataset.tooltip = intl.prep(intl.ID_DISABLED_MSG)\n }\n\n setSyncing (wallet: WalletState | null) {\n const syncIcon = this.icons.syncing\n if (!wallet || !wallet.running || wallet.disabled) {\n Doc.hide(syncIcon)\n return\n }\n\n if (wallet.peerCount === 0) {\n Doc.show(this.icons.nopeers)\n Doc.hide(syncIcon) // potentially misleading with no peers\n return\n }\n Doc.hide(this.icons.nopeers)\n\n if (!wallet.synced) {\n Doc.show(syncIcon)\n syncIcon.dataset.tooltip = intl.prep(intl.ID_WALLET_SYNC_PROGRESS, { syncProgress: (wallet.syncProgress * 100).toFixed(1) })\n return\n }\n Doc.hide(syncIcon)\n }\n\n /* reads the core.Wallet state and sets the icon visibility. */\n readWallet (wallet: WalletState | null) {\n this.setSyncing(wallet)\n if (!wallet) return this.nowallet()\n switch (true) {\n case (wallet.disabled):\n this.disabled()\n break\n case (!wallet.running):\n this.sleeping()\n break\n case (!wallet.open):\n this.locked()\n break\n case (wallet.open):\n this.unlocked()\n break\n default:\n console.error('wallet in unknown state', wallet)\n }\n }\n}\n\n/*\n * AniToggle is a small toggle switch, defined in HTML with the element\n * <div class=\"anitoggle\"></div>. The animations are defined in the anitoggle\n * CSS class. AniToggle triggers the callback on click events, but does not\n * update toggle appearance, so the caller must call the setState method from\n * the callback or elsewhere if the newState\n * is accepted.\n */\nexport class AniToggle {\n toggle: PageElement\n toggling: boolean\n\n constructor (toggle: PageElement, errorEl: PageElement, initialState: boolean, callback: (newState: boolean) => Promise<any>) {\n this.toggle = toggle\n if (toggle.children.length === 0) toggle.appendChild(document.createElement('div'))\n\n Doc.bind(toggle, 'click', async (e: MouseEvent) => {\n e.stopPropagation()\n Doc.hide(errorEl)\n const newState = !toggle.classList.contains('on')\n this.toggling = true\n try {\n await callback(newState)\n } catch (e) {\n this.toggling = false\n Doc.show(errorEl)\n errorEl.textContent = intl.prep(intl.ID_API_ERROR, { msg: e.msg || String(e) })\n return\n }\n this.toggling = false\n })\n this.setState(initialState)\n }\n\n setState (state: boolean) {\n if (state) this.toggle.classList.add('on')\n else this.toggle.classList.remove('on')\n }\n}\n\n/* sleep can be used by async functions to pause for a specified period. */\nfunction sleep (ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nconst aYear = 31536000000\nconst aMonth = 2592000000\nconst aDay = 86400000\nconst anHour = 3600000\nconst aMinute = 60000\n\n/* timeMod returns the quotient and remainder of t / dur. */\nfunction timeMod (t: number, dur: number) {\n const n = Math.floor(t / dur)\n return [n, t - n * dur]\n}\n\nfunction formatSigFigsWithFormatters (intFormatter: Intl.NumberFormat, sigFigFormatter: Intl.NumberFormat, n: number, maxDecimals?: number, locales?: string | string[]): string {\n if (n >= 1000) return intFormatter.format(n)\n const s = sigFigFormatter.format(n)\n if (typeof maxDecimals !== 'number') return s\n const fractional = sigFigFormatter.formatToParts(n).filter((part: Intl.NumberFormatPart) => part.type === 'fraction')[0]?.value ?? ''\n if (fractional.length <= maxDecimals) return s\n return fullPrecisionFormatter(maxDecimals, locales).format(n)\n}\n\nif (process.env.NODE_ENV === 'development') {\n // Code will only appear in dev build.\n // https://webpack.js.org/guides/production/\n window.testFormatFourSigFigs = () => {\n const tests: [string, string, number | undefined, string][] = [\n ['en-US', '1.234567', undefined, '1.235'], // sigFigFormatter\n ['en-US', '1.234567', 2, '1.23'], // decimalFormatter\n ['en-US', '1234', undefined, '1,234.0'], // oneFractionalDigit\n ['en-US', '12', undefined, '12.00'], // sigFigFormatter\n ['fr-FR', '123.45678', undefined, '123,5'], // oneFractionalDigit\n ['fr-FR', '1234.5', undefined, '1 234,5'], // U+202F for thousands separator\n // For Arabic, https://www.saitak.com/number is useful, but seems to use\n // slightly different unicode points and no thousands separator. I think\n // the Arabic decimal separator is supposed to be more like a point, not\n // a comma, but Google Chrome uses U+066B (Arabic Decimal Separator),\n // which looks like a comma to me. ¯\\_(ツ)_/¯\n ['ar-EG', '123.45678', undefined, '١٢٣٫٥'],\n ['ar-EG', '1234', undefined, '١٬٢٣٤٫٠'],\n ['ar-EG', '0.12345', 3, '٠٫١٢٣']\n ]\n\n // Reproduce the NumberFormats with ONLY our desired language.\n for (const [code, unformatted, maxDecimals, expected] of tests) {\n const intFormatter = new Intl.NumberFormat(code, { // oneFractionalDigit\n minimumFractionDigits: 1,\n maximumFractionDigits: 1\n })\n const sigFigFormatter = new Intl.NumberFormat(code, {\n minimumSignificantDigits: 4,\n maximumSignificantDigits: 4\n })\n for (const k in decimalFormatters) delete decimalFormatters[k] // cleanup\n for (const k in fullPrecisionFormatters) delete fullPrecisionFormatters[k] // cleanup\n const s = formatSigFigsWithFormatters(intFormatter, sigFigFormatter, parseFloatDefault(unformatted), maxDecimals, code)\n if (s !== expected) console.log(`TEST FAILED: f('${code}', ${unformatted}, ${maxDecimals}) => '${s}' != '${expected}'}`)\n else console.log(`✔️ f('${code}', ${unformatted}, ${maxDecimals}) => ${s} ✔️`)\n }\n }\n\n window.testFormatRateFullPrecision = () => {\n const tests: [number, number, number, number, string][] = [\n // Two utxo assets with a conventional rate of 0.15. Conventional rate\n // step is 100 / 1e8 = 1e-6, so there should be 6 decimal digits.\n [1.5e7, 100, 1e8, 1e8, '0.150000'],\n // USDC quote -> utxo base with a rate of $10 / 1 XYZ. USDC has an\n // conversion factor of 1e6, so $10 encodes to 1e7, 1 XYZ encodes to 1e8,\n // encoded rate is 1e7 / 1e8 * 1e8 = 1e7, bFactor / qFactor is 1e2.\n // The conventional rate step is 200 / 1e8 * 1e2 = 2e-4, so using\n // rateStepDigits, we should get 4 decimal digits.\n [1e7, 200, 1e6, 1e8, '10.0000'],\n // Set a rate of 1 atom USDC for 0.01 BTC. That atomic rate will be 1 /\n // 1e6 = 1e-6. The encoded rate will be 1e-6 * 1e8 = 1e2. As long as our\n // rate step divides evenly into 100, this should work. The conventional\n // rate is 1e-6 / 1e-2 = 1e-4, so expect 4 decimal digits.\n [1e2, 100, 1e6, 1e8, '0.0001'],\n // DCR-ETH, expect 6 decimals.\n [1.5e7, 1000, 1e9, 1e8, '0.015000'],\n [1e6, 1000, 1e9, 1e8, '0.001000'],\n [1e3, 1000, 1e9, 1e8, '0.000001'],\n [100001000, 1000, 1e9, 1e8, '0.100001'],\n [1000001000, 1000, 1e9, 1e8, '1.000001'],\n // DCR-USDC, expect 3 decimals.\n [1.5e7, 1000, 1e6, 1e8, '15.000'],\n [1e6, 1000, 1e6, 1e8, '1.000'],\n [1e3, 1000, 1e6, 1e8, '0.001'],\n [101000, 1000, 1e6, 1e8, '0.101'],\n [1001000, 1000, 1e6, 1e8, '1.001'],\n // UTXO assets but with a rate step that's not a perfect power of 10.\n // For a rate step of 500, a min rate would be e.g. rate step = 500.\n // 5e2 / 1e8 = 5e-6 = 0.000005\n [5e2, 500, 1e8, 1e8, '0.000005']\n ]\n\n for (const [encRate, rateStep, qFactor, bFactor, expEncoding] of tests) {\n for (const k in fullPrecisionFormatters) delete fullPrecisionFormatters[k] // cleanup\n const bui = { conventional: { conversionFactor: bFactor } } as any as UnitInfo\n const qui = { conventional: { conversionFactor: qFactor } } as any as UnitInfo\n const enc = Doc.formatRateFullPrecision(encRate, bui, qui, rateStep)\n if (enc !== expEncoding) console.log(`TEST FAILED: f(${encRate}, ${bFactor}, ${qFactor}, ${rateStep}) => ${enc} != ${expEncoding}`)\n else console.log(`✔️ f(${encRate}, ${bFactor}, ${qFactor}, ${rateStep}) => ${enc} ✔️`)\n }\n }\n}\n\nexport interface NumberInputOpts {\n prec?: number\n sigFigs?: boolean\n changed?: (v: number) => void\n min?: number\n set?: (v: number, s: string) => void // called when setValue is called\n}\n\nexport class NumberInput {\n input: PageElement\n prec: number\n fmt: (v: number, prec: number) => [number, string]\n changed: (v: number) => void\n set?: (v: number, s: string) => void\n min: number\n\n constructor (input: PageElement, opts: NumberInputOpts) {\n this.input = input\n this.prec = opts.prec ?? 0\n this.fmt = opts.sigFigs ? toFourSigFigs : toPrecision\n this.changed = opts.changed ?? (() => { /* pass */ })\n this.set = opts.set\n this.min = opts.min ?? 0\n\n Doc.bind(input, 'change', () => { this.inputChanged() })\n }\n\n inputChanged () {\n const { changed } = this\n if (changed) changed(this.value())\n }\n\n setValue (v: number) {\n this.input.value = String(v)\n v = this.value()\n if (this.set) this.set(v, this.input.value)\n }\n\n value () {\n const { input, min, prec, fmt } = this\n const rawV = Math.max(parseFloatDefault(input.value, min ?? 0), min ?? 0)\n const [v, s] = fmt(rawV, prec ?? 0)\n input.value = s\n return v\n }\n}\n\nexport interface IncrementalInputOpts extends NumberInputOpts {\n inc?: number\n}\n\nexport class IncrementalInput extends NumberInput {\n inc: number\n opts: IncrementalInputOpts\n\n constructor (box: PageElement, opts: IncrementalInputOpts) {\n super(Doc.safeSelector(box, 'input'), opts)\n this.opts = opts\n this.inc = opts.inc ?? 1\n\n const up = Doc.safeSelector(box, '.ico-arrowup')\n const down = Doc.safeSelector(box, '.ico-arrowdown')\n\n Doc.bind(up, 'click', () => { this.increment(1) })\n Doc.bind(down, 'click', () => { this.increment(-1) })\n }\n\n setIncrementAndMinimum (inc: number, min: number) {\n this.inc = inc\n this.min = min\n }\n\n increment (sign: number) {\n const { inc, min, input } = this\n input.value = String(Math.max(this.value() + sign * inc, min))\n this.inputChanged()\n }\n}\n\nexport class MiniSlider {\n track: PageElement\n ball: PageElement\n r: number\n changed: (r: number) => void\n\n constructor (box: PageElement, changed: (r: number) => void) {\n this.changed = changed\n this.r = 0\n\n const color = document.createElement('div')\n color.dataset.tmpl = 'color'\n box.appendChild(color)\n const track = this.track = document.createElement('div')\n track.dataset.tmpl = 'track'\n color.appendChild(track)\n const ball = this.ball = document.createElement('div')\n ball.dataset.tmpl = 'ball'\n track.appendChild(ball)\n\n Doc.bind(box, 'mousedown', (e: MouseEvent) => {\n if (e.button !== 0) return\n e.preventDefault()\n e.stopPropagation()\n const startX = e.pageX\n const w = track.clientWidth\n const startLeft = this.r * w\n const left = (ee: MouseEvent) => Math.max(Math.min(startLeft + (ee.pageX - startX), w), 0)\n const trackMouse = (ee: MouseEvent) => {\n ee.preventDefault()\n const l = left(ee)\n this.r = l / w\n ball.style.left = `${this.r * 100}%`\n this.changed(this.r)\n }\n const mouseUp = (ee: MouseEvent) => {\n trackMouse(ee)\n Doc.unbind(document, 'mousemove', trackMouse)\n Doc.unbind(document, 'mouseup', mouseUp)\n }\n Doc.bind(document, 'mousemove', trackMouse)\n Doc.bind(document, 'mouseup', mouseUp)\n })\n\n Doc.bind(box, 'click', (e: MouseEvent) => {\n if (e.button !== 0) return\n const x = e.pageX\n const m = Doc.layoutMetrics(track)\n this.r = clamp((x - m.bodyLeft) / m.width, 0, 1)\n ball.style.left = `${this.r * m.width}px`\n this.changed(this.r)\n })\n }\n\n setValue (r: number) {\n this.r = clamp(r, 0, 1)\n this.ball.style.left = `${this.r * 100}%`\n }\n}\n\nexport function toPrecision (v: number, prec: number): [number, string] {\n const ord = Math.pow(10, prec ?? 0)\n v = Math.round(v * ord) / ord\n let s = v.toFixed(prec)\n if (prec > 0) {\n while (s.endsWith('0')) s = s.substring(0, s.length - 1)\n if (s.endsWith('.')) s = s.substring(0, s.length - 1)\n }\n return [v, s]\n}\n\nexport function toFourSigFigs (v: number, maxPrec: number): [number, string] {\n const ord = Math.floor(Math.log10(Math.abs(v)))\n if (ord >= 3) return [Math.round(v), v.toFixed(0)]\n const prec = Math.min(4 - ord, maxPrec)\n return toPrecision(v, prec)\n}\n\nexport function parseFloatDefault (inputValue: string | undefined, defaultValue?: number) {\n const v = parseFloat((inputValue ?? '').replace(/,/g, ''))\n if (!isNaN(v)) return v\n return defaultValue ?? 0\n}\n\n/* clamp returns v if min <= v <= max, else min or max. */\nexport function clamp (v: number, min: number, max: number): number {\n if (v < min) return min\n if (v > max) return max\n return v\n}\n\nexport async function setupCopyBtn (txt: string, textEl: PageElement, btnEl: PageElement, color: string) {\n try {\n await navigator.clipboard.writeText(txt)\n } catch (err) {\n console.error('Unable to copy: ', err)\n }\n const textOriginalColor = textEl.style.color\n const btnOriginalColor = btnEl.style.color\n textEl.style.color = color\n btnEl.style.color = color\n setTimeout(() => {\n textEl.style.color = textOriginalColor\n btnEl.style.color = btnOriginalColor\n }, 350)\n}\n","declare global {\n interface Window {\n log: (...args: any) => void\n enableLogger: (loggerID: string, enable: boolean) => void\n recordLogger: (loggerID: string, enable: boolean) => void\n dumpLogger: (loggerID: string) => void\n mmstatus: () => Promise<MarketMakingStatus>\n testFormatFourSigFigs: () => void\n testFormatRateFullPrecision: () => void\n user: () => User\n cexBook: () => Promise<void>\n mmStatus: () => MarketMakingStatus\n isWebview?: () => boolean\n webkit: any | undefined\n openUrl: (url: string) => void\n open: (url?: string | URL, target?: string, features?: string) => WindowProxy | null\n sendOSNotification (title: string, body?: string): void\n clearLocale (): void\n }\n}\n\nexport enum ConnectionStatus {\n Disconnected = 0,\n Connected = 1,\n InvalidCert = 2,\n}\n\nexport interface BondOptions {\n bondAssetID: number\n targetTier: number\n maxBondedAmt: number\n}\n\nexport interface Reputation {\n bondedTier: number\n penalties: number\n legacyTier: boolean\n score: number\n}\n\nexport interface ExchangeAuth {\n rep: Reputation\n bondAssetID: number\n pendingStrength: number\n weakStrength: number\n liveStrength: number\n targetTier: number\n effectiveTier: number\n maxBondedAmt: number\n penaltyComps: number\n pendingBonds: PendingBondState[]\n expiredBonds: any[]\n compensation: number\n}\n\nexport interface Exchange {\n host: string\n acctID: string\n auth: ExchangeAuth\n markets: Record<string, Market>\n assets: Record<number, Asset>\n connectionStatus: ConnectionStatus\n viewOnly: boolean\n bondAssets: Record<string, BondAsset>\n candleDurs: string[]\n maxScore: number\n penaltyThreshold: number\n disabled: boolean\n}\n\nexport interface Candle {\n startStamp: number\n endStamp: number\n matchVolume: number\n quoteVolume: number\n highRate: number\n lowRate: number\n startRate: number\n endRate: number\n}\n\nexport interface CandlesPayload {\n dur: string\n ms: number\n candles: Candle[]\n}\n\nexport interface Market {\n name: string\n baseid: number\n basesymbol: string\n quoteid: number\n quotesymbol: string\n lotsize: number\n parcelsize: number\n ratestep: number\n epochlen: number\n startepoch: number\n buybuffer: number\n orders: Order[]\n spot: Spot | undefined\n atomToConv: number\n inflight: InFlightOrder[]\n minimumRate: number\n}\n\nexport interface InFlightOrder extends Order {\n tempID: number\n}\n\nexport interface Order {\n host: string\n baseID: number\n baseSymbol: string\n quoteID: number\n quoteSymbol: string\n market: string\n type: number\n id: string\n stamp: number\n submitTime: number\n sig: string\n status: number\n epoch: number\n qty: number\n sell: boolean\n filled: number\n matches: Match[]\n cancelling: boolean\n canceled: boolean\n feesPaid: FeeBreakdown\n fundingCoins: Coin[]\n accelerationCoins: Coin[]\n lockedamt: number\n rate: number // limit only\n tif: number // limit only\n targetOrderID: string // cancel only\n readyToTick: boolean\n}\n\nexport interface Match {\n matchID: string\n status: number\n active: boolean\n revoked: boolean\n rate: number\n qty: number\n side: number\n feeRate: number\n swap: Coin\n counterSwap: Coin\n redeem: Coin\n counterRedeem: Coin\n refund: Coin\n stamp: number\n isCancel: boolean\n}\n\nexport interface Spot {\n stamp: number\n baseID: number\n quoteID: number\n rate: number\n bookVolume: number // Unused?\n change24: number\n vol24: number\n low24: number\n high24: number\n}\n\nexport interface Asset {\n id: number\n symbol: string\n version: number\n maxFeeRate: number\n swapSize: number\n swapSizeBase: number\n redeemSize: number\n swapConf: number\n unitInfo: UnitInfo\n}\n\nexport interface BondAsset {\n ver: number\n id: number\n confs: number\n amount: number\n}\n\nexport interface PendingBondState {\n symbol: string\n assetID: number\n coinID: string\n confs: number\n}\n\nexport interface FeeBreakdown {\n swap: number\n redemption: number\n}\n\nexport interface SupportedAsset {\n id: number\n symbol: string\n name: string\n wallet: WalletState\n info?: WalletInfo\n token?: Token\n unitInfo: UnitInfo\n walletCreationPending: boolean\n}\n\nexport interface Token {\n parentID: number\n name: string\n unitInfo: UnitInfo\n contractAddress: string\n definition: WalletDefinition\n}\n\nexport enum ApprovalStatus {\n Approved = 0,\n Pending = 1,\n NotApproved = 2\n}\n\nexport interface FeeState {\n rate: number\n send: number\n swap: number\n redeem: number\n refund: number\n stampMS: number\n}\n\nexport interface SyncStatus {\n synced: boolean\n targetHeight: number\n startingBlocks: number\n blocks: number\n txs: number | undefined\n}\n\nexport interface WalletState {\n symbol: string\n assetID: number\n version: number\n type: string\n traits: number\n open: boolean\n running: boolean\n disabled: boolean\n balance: WalletBalance\n address: string\n units: string\n encrypted: boolean\n peerCount: number\n synced: boolean\n syncProgress: number\n syncStatus: SyncStatus\n approved: Record<number, ApprovalStatus>\n feeState?: FeeState\n}\n\nexport interface WalletInfo {\n name: string\n version: number\n availablewallets: WalletDefinition[]\n versions: number[]\n emptyidx: number\n unitinfo: UnitInfo\n}\n\nexport interface WalletBalance {\n available: number\n immature: number\n locked: number\n stamp: string // time.Time\n orderlocked: number\n contractlocked: number\n bondlocked: number\n bondReserves: number\n reservesDeficit: number\n other: Record<string, CustomBalance>\n}\n\nexport interface CustomBalance {\n amt: number\n locked: boolean\n}\n\nexport interface WalletDefinition {\n seeded: boolean\n type: string\n tab: string\n description: string\n configpath: string\n configopts: ConfigOption[]\n multifundingopts: OrderOption[]\n noauth: boolean\n guidelink: string\n}\n\nexport interface ConfigOption {\n key: string\n displayname: string\n description: string\n default: any\n max: any\n min: any\n noecho: boolean\n isboolean: boolean\n isdate: boolean\n disablewhenactive: boolean\n isBirthdayConfig: boolean\n repeatable?: string\n repeatN?: number\n regAsset?: number\n required?: boolean\n dependsOn?: string\n}\n\nexport interface Coin {\n id: string\n stringID: string\n assetID: number\n symbol: string\n confs: Confirmations\n}\n\nexport interface Confirmations {\n required: number\n count: number\n}\n\nexport interface UnitInfo {\n atomicUnit: string\n conventional: Denomination\n denominations: Denomination[]\n feeRateDenom: string\n}\n\nexport interface Denomination {\n unit: string\n conversionFactor: number\n}\n\nexport interface ExtensionConfiguredWallet {\n hiddenFields: string[]\n disableWalletType: boolean\n disablePassword: boolean\n disableStaking: boolean\n disablePrivacy: boolean\n}\n\nexport interface ExtensionModeConfig {\n name: string\n restrictedWallets: Record<string, ExtensionConfiguredWallet>\n}\n\nexport interface User {\n exchanges: Record<string, Exchange>\n inited: boolean\n seedgentime: number\n assets: Record<number, SupportedAsset>\n fiatRates: Record<number, number>\n bots: BotReport[]\n net: number\n extensionModeConfig: ExtensionModeConfig\n actions: ActionRequiredNote[]\n}\n\nexport interface CoreNote {\n type: string\n topic: string\n subject: string\n details: string\n severity: number\n stamp: number\n acked: boolean\n id: string\n}\n\nexport interface BondNote extends CoreNote {\n asset: number\n confirmations: number\n dex: string\n coinID: string | null\n tier: number | null\n auth: ExchangeAuth | null\n}\n\nexport interface ReputationNote extends CoreNote {\n host: string\n rep: Reputation\n}\n\nexport interface BalanceNote extends CoreNote {\n assetID: number\n balance: WalletBalance\n}\n\nexport interface RateNote extends CoreNote {\n fiatRates: Record<number, number>\n}\n\nexport interface WalletConfigNote extends CoreNote {\n wallet: WalletState\n}\n\nexport interface WalletSyncNote extends CoreNote {\n assetID: number\n syncStatus: SyncStatus\n syncProgress: number\n}\n\nexport type WalletStateNote = WalletConfigNote\n\nexport interface WalletCreationNote extends CoreNote {\n assetID: number\n}\n\nexport interface BaseWalletNote {\n route: string\n assetID: number\n}\n\nexport interface TipChangeNote extends BaseWalletNote {\n tip: number\n data: any\n}\n\nexport interface CustomWalletNote extends BaseWalletNote {\n payload: any\n}\n\nexport interface TransactionNote extends BaseWalletNote {\n transaction: WalletTransaction\n new: boolean\n}\n\nexport interface ActionRequiredNote extends BaseWalletNote {\n uniqueID: string\n actionID: string\n payload: any\n}\n\nexport interface ActionResolvedNote extends BaseWalletNote {\n uniqueID: string\n}\n\nexport interface TransactionActionNote {\n tx: WalletTransaction\n nonce: number\n newFees: number\n}\n\nexport interface WalletNote extends CoreNote {\n payload: BaseWalletNote\n}\n\nexport interface CoreActionRequiredNote extends CoreNote {\n payload: ActionRequiredNote\n}\n\nexport interface RejectedRedemptionData {\n assetID: number\n orderID: string\n coinID: string\n coinFmt: string\n}\n\nexport interface SpotPriceNote extends CoreNote {\n host: string\n spots: Record<string, Spot>\n}\n\nexport interface RunStatsNote extends CoreNote {\n host: string\n baseID: number\n quoteID: number\n stats?: RunStats\n}\n\nexport interface RunEventNote extends CoreNote {\n host: string\n baseID: number\n quoteID: number\n startTime: number\n event: MarketMakingEvent\n}\n\nexport interface MakerProgram {\n host: string\n baseID: number\n quoteID: number\n lots: number\n oracleWeighting: number\n oracleBias: number\n driftTolerance: number\n gapFactor: number\n gapStrategy: string\n}\n\nexport interface BotOrder {\n host: string\n marketID: string\n orderID: string\n}\n\nexport interface BotReport {\n programID: number\n program: MakerProgram\n running: boolean\n orders: BotOrder\n}\n\nexport interface LotFees {\n swap: number\n redeem: number\n refund: number\n}\n\nexport interface LotFeeRange {\n max: LotFees\n estimated: LotFees\n}\n\nexport interface AssetBookingFees extends LotFeeRange {\n bookingFeesPerLot: number\n bookingFeesPerCounterLot: number\n bookingFees: number\n swapReservesFactor: number // (1 + orderReservesFactor)\n redeemReservesFactor: number\n tokenFeesPerSwap: number\n}\n\nexport interface BookingFees {\n base: AssetBookingFees\n quote: AssetBookingFees\n}\n\nexport interface MarketReport {\n price: number\n oracles: OracleReport[]\n baseFiatRate: number\n quoteFiatRate: number\n baseFees: LotFeeRange\n quoteFees: LotFeeRange\n}\n\nexport interface MatchNote extends CoreNote {\n orderID: string\n match: Match\n host: string\n marketID: string\n}\n\nexport interface ConnEventNote extends CoreNote {\n host: string\n connectionStatus: ConnectionStatus\n}\n\nexport interface OrderNote extends CoreNote {\n order: Order\n tempID: number\n}\n\nexport interface RecentMatch {\n rate: number\n qty: number\n stamp: number\n sell: boolean\n}\n\nexport interface EpochNote extends CoreNote {\n host: string\n marketID: string\n epoch: number\n}\n\nexport interface APIResponse {\n requestSuccessful: boolean\n ok: boolean\n msg: string\n err?: string\n}\n\nexport interface LogMessage {\n time: string\n msg: string\n}\n\nexport interface NoteElement extends HTMLElement {\n note: CoreNote\n}\n\nexport interface BalanceResponse extends APIResponse {\n balance: WalletBalance\n}\n\nexport interface LayoutMetrics {\n bodyTop: number\n bodyLeft: number\n width: number\n height: number\n centerX: number\n centerY: number\n}\n\nexport interface PageElement extends HTMLElement {\n value?: string\n src?: string\n files?: FileList\n checked?: boolean\n href?: string\n htmlFor?: string\n name?: string\n options?: HTMLOptionElement[]\n selectedIndex?: number\n disabled?: boolean\n}\n\nexport interface BooleanConfig {\n reason: string\n}\n\nexport interface XYRangePoint {\n label: string\n x: number\n y: number\n}\n\nexport interface XYRange {\n start: XYRangePoint\n end: XYRangePoint\n xUnit: string\n yUnit: string\n roundX?: boolean\n roundY?: boolean\n}\n\nexport interface OrderOption extends ConfigOption {\n boolean?: BooleanConfig\n xyRange?: XYRange\n showByDefault?: boolean\n quoteAssetOnly?: boolean\n}\n\nexport interface SwapEstimate {\n lots: number\n value: number\n maxFees: number\n realisticWorstCase: number\n realisticBestCase: number\n feeReservesPerLot: number\n}\n\nexport interface RedeemEstimate {\n realisticBestCase: number\n realisticWorstCase: number\n}\n\nexport interface PreSwap {\n estimate: SwapEstimate\n options: OrderOption[]\n}\n\nexport interface PreRedeem {\n estimate: RedeemEstimate\n options: OrderOption[]\n}\n\nexport interface OrderEstimate {\n swap: PreSwap\n redeem: PreRedeem\n}\n\nexport interface MaxOrderEstimate {\n swap: SwapEstimate\n redeem: RedeemEstimate\n}\n\nexport interface MaxSell {\n maxSell: MaxOrderEstimate\n}\n\nexport interface MaxBuy {\n maxBuy: MaxOrderEstimate\n}\n\nexport interface TradeForm {\n host: string\n isLimit: boolean\n sell: boolean\n base: number\n quote: number\n qty: number\n rate: number\n tifnow: boolean\n options: Record<string, any>\n}\n\nexport interface BookUpdate {\n action: string\n host: string\n marketID: string\n matchesSummary: RecentMatch[]\n payload: any\n}\n\nexport interface MiniOrder {\n qty: number\n qtyAtomic: number\n rate: number\n msgRate: number\n epoch: number\n sell: boolean\n token: string\n}\n\nexport interface CoreOrderBook {\n sells: MiniOrder[]\n buys: MiniOrder[]\n epoch: MiniOrder[]\n recentMatches: RecentMatch[]\n}\n\nexport interface MarketOrderBook {\n base: number\n quote: number\n book: CoreOrderBook\n}\n\nexport interface RemainderUpdate {\n token: string\n qty: number\n qtyAtomic: number\n}\n\nexport interface OrderFilterMarket {\n baseID: number\n quoteID: number\n}\n\nexport interface OrderFilter {\n n?: number\n offset?: string\n hosts?: string[]\n assets?: number[]\n market?: OrderFilterMarket\n statuses?: number[]\n}\n\nexport interface OrderPlacement {\n lots: number\n gapFactor: number\n}\n\nexport interface AutoRebalanceConfig {\n minBaseTransfer: number\n minQuoteTransfer: number\n}\n\nexport interface BasicMarketMakingConfig {\n gapStrategy: string\n sellPlacements: OrderPlacement[]\n buyPlacements: OrderPlacement[]\n driftTolerance: number\n}\n\nexport interface ArbMarketMakingPlacement {\n lots: number\n multiplier: number\n}\n\nexport interface ArbMarketMakingConfig {\n buyPlacements: ArbMarketMakingPlacement[]\n sellPlacements: ArbMarketMakingPlacement[]\n profit: number\n driftTolerance: number\n orderPersistence: number\n}\n\nexport interface SimpleArbConfig {\n profitTrigger: number\n maxActiveArbs: number\n numEpochsLeaveOpen: number\n}\n\nexport interface BotCEXCfg {\n name: string\n autoRebalance?: AutoRebalanceConfig\n}\n\nexport interface BotBalanceAllocation {\n dex: Record<number, number>\n cex: Record<number, number>\n}\n\nexport interface BotAssetConfig {\n swapFeeN: number\n orderReservesFactor: number\n slippageBufferFactor: number\n transferFactor: number\n}\n\nexport interface UIConfig {\n baseConfig: BotAssetConfig\n quoteConfig: BotAssetConfig\n simpleArbLots?: number\n cexRebalance: boolean\n}\n\nexport interface StartConfig extends MarketWithHost {\n autoRebalance?: AutoRebalanceConfig\n alloc: BotBalanceAllocation\n}\n\nexport interface BotConfig {\n host: string\n baseID: number\n quoteID: number\n baseWalletOptions?: Record<string, string>\n quoteWalletOptions?: Record<string, string>\n cexName: string\n uiConfig: UIConfig\n basicMarketMakingConfig?: BasicMarketMakingConfig\n arbMarketMakingConfig?: ArbMarketMakingConfig\n simpleArbConfig?: SimpleArbConfig\n}\n\nexport interface CEXConfig {\n name: string\n apiKey: string\n apiSecret: string\n}\n\nexport interface MarketWithHost {\n host: string\n baseID: number\n quoteID: number\n}\n\nexport interface MMCEXStatus {\n config: CEXConfig\n connected: boolean\n connectErr: string\n markets: Record<string, CEXMarket>\n balances: Record<number, ExchangeBalance>\n}\n\nexport interface BotBalance {\n available: number\n locked: number\n pending: number\n reserved: number\n}\n\nexport interface BotBalances {\n dex: BotBalance\n cex: BotBalance\n}\n\nexport interface BotInventory {\n avail: number\n locked: number // includes BotBalance.reserved\n total: number // avail + locked\n}\n\nexport interface RunningBotInventory {\n avail: number\n locked: number\n dex: BotInventory\n cex: BotInventory\n}\n\nexport interface CEXNotification extends CoreNote {\n cexName: string\n note: any\n}\n\nexport interface CEXBalanceUpdate {\n assetID: number\n balance: ExchangeBalance\n}\n\nexport interface EpochReportNote extends CoreNote {\n host: string\n baseID: number\n quoteID: number\n report?: EpochReport\n}\n\nexport interface CEXProblemsNote extends CoreNote {\n host: string\n baseID: number\n quoteID: number\n problems?: CEXProblems\n}\n\nexport interface FeeEstimates extends LotFeeRange {\n bookingFeesPerLot: number\n bookingFees: number\n tokenFeesPerSwap: number\n}\n\nexport interface ProjectedAlloc {\n // book is inventory dedicated either to active orders for basicmm and arbmm,\n // or on reserve for orders in the case of basicarb. book + bookingFees is the\n // starvation threshold for DEX, meaning it's impossible to start a bot\n // unstarved if there no way to get book + bookingFees to Bison Wallet. A user\n // could potentially adjust order reserves or swap fee reserves to free up\n // more funds, but with possible degradation of bot performance.\n book: number\n // booking fees is funding dedicated to covering the fees for funded orders.\n // bookingFees are in the units of the parent chain for token assets.\n bookingFees: number\n // swapFeeReserves is only required for token assets. These are fees\n // reserved for funding swaps. These fees are only debited, so will definitely\n // run out eventually, but we'll get a UI that enabled manual and/or auto\n // refill soon. swapFeeReserves are in the units of the parent chain.\n swapFeeReserves: number\n // cex is the inventory dedicated to funding counter-orders on cex for an\n // arbmm or simplearb bot. cex is the starvation threshold for CEX.\n cex: number\n // orderReserves is inventory reserved for facilitating withdraws and\n // deposits or for replacing matched orders. It's a good idea to have a\n // little extra around, otherwise a trade sequence gone wrong could put\n // the bot in a starved or unbalanced state.\n orderReserves: number\n // slippageBuffer is only required for the quote asset. This accounts for\n // variations in rate, because the quote asset's \"lot size\" varies with\n // rate. If the rate goes down, the quote-converted lot size goes up, so\n // we'll let the user choose to reserve a little extra for this case.\n slippageBuffer: number\n}\n\nexport interface FeeGapStats {\n basisPrice: number\n feeGap: number\n remoteGap: number\n roundTripFees: number\n}\n\nexport interface RunStats {\n initialBalances: Record<number, number>\n dexBalances: Record<number, BotBalance>\n cexBalances: Record<number, BotBalance>\n profitLoss: ProfitLoss\n startTime: number\n pendingDeposits: number\n pendingWithdrawals: number\n completedMatches: number\n tradedUSD: number\n feeGap: FeeGapStats\n}\n\nexport interface StampedError {\n stamp: number\n error: string\n}\n\nexport interface BotProblems {\n walletNotSynced: Record<number, boolean>\n noWalletPeers: Record<number, boolean>\n accountSuspended: boolean\n userLimitTooLow: boolean\n noPriceSource: boolean\n oracleFiatMismatch: boolean\n cexOrderbookUnsynced: boolean\n causesSelfMatch: boolean\n unknownError: string\n}\n\nexport interface TradePlacement {\n rate: number\n lots: number\n standingLots: number\n orderedLots: number\n counterTradeRate: number\n requiredDex: Record<number, number>\n requiredCex: number\n usedDex: Record<number, number>\n usedCex: number\n error?: BotProblems\n}\n\nexport interface OrderReport {\n placements: TradePlacement[]\n fees: LotFeeRange\n availableDexBals: Record<number, BotBalance>\n requiredDexBals: Record<number, number>\n remainingDexBals: Record<number, number>\n usedDexBals: Record<number, number>\n availableCexBal: BotBalance\n requiredCexBal: number\n remainingCexBal: number\n usedCexBal: number\n error?: BotProblems\n}\n\nexport interface EpochReport {\n epochNum: number\n preOrderProblems?: BotProblems\n buysReport?: OrderReport\n sellsReport?: OrderReport\n}\n\nexport interface CEXProblems {\n depositErr: Record<number, StampedError>\n withdrawErr: Record<number, StampedError>\n tradeErr: StampedError\n}\n\nexport interface MMBotStatus {\n config: BotConfig\n running: boolean\n runStats?: RunStats\n latestEpoch?: EpochReport\n cexProblems?: CEXProblems\n}\n\nexport interface MarketMakingStatus {\n cexes: Record<string, MMCEXStatus>\n bots: MMBotStatus[]\n}\n\nexport interface DEXOrderEvent {\n id: string\n rate: number\n qty: number\n sell: boolean\n transactions: WalletTransaction[]\n}\n\nexport interface CEXOrderEvent {\n id: string\n rate: number\n qty: number\n sell: boolean\n baseFilled: number\n quoteFilled: number\n}\n\nexport interface DepositEvent {\n assetID: number\n transaction: WalletTransaction\n cexCredit: number\n}\n\nexport interface WithdrawalEvent {\n id: string\n assetID: number\n transaction: WalletTransaction\n cexDebit: number\n}\n\nexport interface BalanceEffects {\n settled: Record<number, number>\n pending: Record<number, number>\n locked: Record<number, number>\n reserved: Record<number, number>\n}\n\nexport interface MarketMakingEvent {\n id: number\n timestamp: number\n balanceEffects: BalanceEffects\n pending: boolean\n dexOrderEvent?: DEXOrderEvent\n cexOrderEvent?: CEXOrderEvent\n depositEvent?: DepositEvent\n withdrawalEvent?: WithdrawalEvent\n}\n\ninterface MarketDay {\n vol: number\n quoteVol: number\n priceChange: number\n priceChangePct: number\n avgPrice: number\n lastPrice: number\n openPrice: number\n highPrice: number\n lowPrice: number\n}\n\nexport interface CEXMarket {\n baseID: number\n quoteID: number\n baseMinWithdraw: number\n quoteMinWithdraw: number\n day: MarketDay\n}\n\nexport interface OracleReport {\n host: string\n usdVol: number\n bestBuy: number\n bestSell: number\n}\n\nexport interface ExchangeBalance {\n available: number\n locked: number\n}\n\n// changing the order of the elements in this enum will affect\n// the sorting of the peers table in wallets.ts.\nexport enum PeerSource {\n WalletDefault,\n UserAdded,\n Discovered,\n}\n\nexport interface BalanceState {\n fiatRates: Record<number, number>\n balances: Record<number, BotBalance>\n invMods: Record<number, number>\n}\n\nexport interface Amount {\n atoms: number\n conventional: number\n fmt: string\n usd: number\n fmtUSD: string\n}\n\nexport interface ProfitLoss {\n initial: Record<number, Amount>\n initialUSD: number\n mods: Record<number, Amount>\n modsUSD: number\n final: Record<number, Amount>\n finalUSD: number\n diffs: Record<number, Amount>\n profit: number\n profitRatio: number\n}\n\nexport interface StampedBotConfig {\n timestamp: number\n cfg: BotConfig\n}\n\nexport interface MarketMakingRunOverview {\n endTime: number\n cfgs: StampedBotConfig[]\n initialBalances: Record<number, number>\n profitLoss: ProfitLoss\n finalState: BalanceState\n}\n\nexport interface WalletPeer {\n addr: string\n source: PeerSource\n connected: boolean\n}\n\nexport interface TicketTransaction {\n hash: string\n ticketPrice: number\n fees: number\n stamp: number\n blockHeight: number\n}\n\nexport interface Ticket {\n tx: TicketTransaction\n status: number\n spender: string\n}\n\nexport interface TBChoice {\n id: string\n description: string\n}\n\nexport interface TBAgenda {\n id: string\n description: string\n currentChoice: string\n choices: TBChoice[]\n}\n\nexport interface TKeyPolicyResult {\n key: string\n policy: string\n ticket?: string\n}\n\nexport interface TBTreasurySpend {\n hash: string\n value: number\n currentPolicy: string\n}\n\nexport interface Stances {\n agendas: TBAgenda[]\n tspends: TBTreasurySpend[]\n treasuryKeys: TKeyPolicyResult[]\n}\n\nexport interface TicketStats {\n totalRewards: number\n ticketCount: number\n votes: number\n revokes: number\n mempool: number\n queued: number\n}\n\nexport interface TicketStakingStatus {\n ticketPrice: number\n votingSubsidy: number\n vsp: string\n isRPC: boolean\n tickets: Ticket[]\n stances: Stances\n stats: TicketStats\n}\n\n// VotingServiceProvider is information about a voting service provider.\nexport interface VotingServiceProvider {\n url: string\n network: number\n launched: number\n lastUpdated: number\n apiVersions: number[]\n feePercentage: number\n closed: boolean\n voting: number\n voted: number\n revoked: number\n vspdVersion: string\n blockHeight: number\n netShare: number\n}\n\nexport interface BondTxInfo {\n bondID: string\n lockTime: number\n accountID: string\n}\n\nexport interface WalletTransaction {\n type: number\n id: string\n amount: number\n fees: number\n timestamp: number\n blockNumber: number\n tokenID?: number\n recipient?: string\n bondInfo?: BondTxInfo\n additionalData: Record<string, string>\n}\n\nexport interface TxHistoryResult {\n txs: WalletTransaction[]\n lastTx: boolean\n}\n\nexport const PrepaidBondID = 2147483647\n\nexport interface Application {\n assets: Record<number, SupportedAsset>\n seedGenTime: number\n user: User\n mmStatus: MarketMakingStatus\n header: HTMLElement\n headerSpace: HTMLElement\n walletMap: Record<number, WalletState>\n exchanges: Record<string, Exchange>\n fiatRatesMap: Record<number, number>\n showPopups: boolean\n commitHash: string\n authed: boolean\n start (): Promise<void>\n reconnected (): void\n fetchUser (): Promise<User | void>\n fetchMMStatus (): Promise<User | void>\n loadPage (page: string, data?: any, skipPush?: boolean): Promise<boolean>\n attach (data: any): void\n bindTooltips (ancestor: HTMLElement): void\n bindUrlHandlers (ancestor: HTMLElement): void\n attachHeader (): void\n updateMarketElements (ancestor: PageElement, baseID: number, quoteID: number, xc?: Exchange): void\n showDropdown (icon: HTMLElement, dialog: HTMLElement): void\n ackNotes (): void\n setNoteTimes (noteList: HTMLElement): void\n bindInternalNavigation (ancestor: HTMLElement): void\n updateMenuItemsDisplay (): void\n attachCommon (node: HTMLElement): void\n updateBondConfs (dexAddr: string, coinID: string, confs: number, assetID: number): void\n handleBondNote (note: BondNote): void\n loggedIn (notes: CoreNote[], pokes: CoreNote[]): void\n setPokes(pokes: CoreNote[]): void\n botStatus (host: string, baseID: number, quoteID: number): MMBotStatus | undefined\n notify (note: CoreNote): void\n log (loggerID: string, ...msg: any): void\n prependPokeElement (note: CoreNote): void\n prependNoteElement (note: CoreNote, skipSave?: boolean): void\n prependListElement (noteList: HTMLElement, note: CoreNote, el: NoteElement): void\n loading (el: HTMLElement): () => void\n orders (host: string, mktID: string): Order[]\n haveActiveOrders (assetID: number): boolean\n order (oid: string): Order | null\n canAccelerateOrder(order: Order): boolean\n unitInfo (assetID: number, xc?: Exchange): UnitInfo\n baseChainSymbol (assetID: number): string\n extensionWallet (assetID: number): ExtensionConfiguredWallet | undefined\n conventionalRate (baseID: number, quoteID: number, encRate: number, xc?: Exchange): number\n walletDefinition (assetID: number, walletType: string): WalletDefinition\n currentWalletDefinition (assetID: number): WalletDefinition\n fetchBalance (assetID: number): Promise<WalletBalance>\n checkResponse (resp: APIResponse): boolean\n signOut (): Promise<void>\n registerNoteFeeder (receivers: Record<string, (n: CoreNote) => void>): void\n txHistory(assetID: number, n: number, after?: string): Promise<TxHistoryResult>\n getWalletTx(assetID: number, txid: string): WalletTransaction | undefined\n clearTxHistory(assetID: number): void\n parentAsset(assetID: number): SupportedAsset\n needsCustomProvider (assetID: number): Promise<boolean>\n}\n\n// TODO: Define an interface for Application?\nlet application: Application\n\nexport function registerApplication (a: Application) {\n application = a\n}\n\nexport function app (): Application {\n return application\n}\n","import Doc from './doc'\nimport {\n PageElement,\n XYRange,\n OrderOption\n} from './registry'\n\ninterface OptionsReporters {\n enable: () => void\n disable: () => void\n}\n\n// Having the caller set these vars on load using an exported function makes\n// life easier.\nlet orderOptTmpl: HTMLElement, booleanOptTmpl: HTMLElement, rangeOptTmpl: HTMLElement\n\n// setOptionTemplates sets the package vars for the templates and application.\nexport function setOptionTemplates (page: Record<string, PageElement>): void {\n [booleanOptTmpl, rangeOptTmpl, orderOptTmpl] = [page.booleanOptTmpl, page.rangeOptTmpl, page.orderOptTmpl]\n}\n\nconst threeSigFigs = new Intl.NumberFormat(Doc.languages(), {\n minimumSignificantDigits: 3,\n maximumSignificantDigits: 3\n})\n\n/*\n * Option is a base class for option elements. Option stores some common\n * parameters and monitors the toggle switch, calling the child class's\n * enable/disable methods when the user manually turns the option on or off.\n */\nexport class Option {\n opt: OrderOption\n node: HTMLElement\n tmpl: Record<string, PageElement>\n on: boolean\n\n constructor (opt: OrderOption, symbol: string, report: OptionsReporters) {\n this.opt = opt\n const node = this.node = orderOptTmpl.cloneNode(true) as HTMLElement\n const tmpl = this.tmpl = Doc.parseTemplate(node)\n\n tmpl.optName.textContent = opt.displayname\n tmpl.tooltip.dataset.tooltip = opt.description\n\n // const isBaseChain = (isSwapOption && order.sell) || (!isSwapOption && !order.sell)\n // const symbol = isBaseChain ? this.baseSymbol() : this.quoteSymbol()\n if (symbol) tmpl.chainIcon.src = Doc.logoPath(symbol)\n else Doc.hide(tmpl.chainIcon)\n\n this.on = false\n Doc.bind(node, 'click', () => {\n if (this.on) return\n this.on = true\n node.classList.add('selected')\n report.enable()\n })\n Doc.bind(tmpl.toggle, 'click', e => {\n if (!this.on) return\n e.stopPropagation()\n this.on = false\n node.classList.remove('selected')\n report.disable()\n })\n }\n}\n\n/*\n * BooleanOption is a simple on/off option with a short summary of it's effects.\n * BooleanOrderOption is the handler for a *BooleanConfig from client/asset.\n */\nexport class BooleanOption extends Option {\n control: HTMLElement\n changed: () => void\n dict: Record<string, any>\n\n constructor (opt: OrderOption, symbol: string, dict: Record<string, any>, changed: () => void) {\n super(opt, symbol, {\n enable: () => this.enable(),\n disable: () => this.disable()\n })\n this.dict = dict\n this.changed = () => changed()\n if (opt.boolean === undefined) throw Error('not a boolean opt')\n const cfg = opt.boolean\n const control = this.control = booleanOptTmpl.cloneNode(true) as HTMLElement\n // Append to parent's options div.\n this.tmpl.controls.appendChild(control)\n const tmpl = Doc.parseTemplate(control)\n tmpl.reason.textContent = cfg.reason\n this.on = typeof dict[opt.key] !== 'undefined' ? dict[opt.key] : opt.default\n if (this.on) this.node.classList.add('selected')\n }\n\n store (): void {\n if (this.on === this.opt.default) delete this.dict[this.opt.key]\n else this.dict[this.opt.key] = this.on\n this.changed()\n }\n\n enable (): void {\n this.store()\n }\n\n disable (): void {\n this.store()\n }\n}\n\n/*\n * XYRangeOption is an order option that contains an XYRangeHandler. The logic\n * for handling the slider to is defined in XYRangeHandler so that the slider\n * can be used without being contained in an order option.\n */\nexport class XYRangeOption extends Option {\n handler: XYRangeHandler\n x: number\n changed: () => void\n dict: Record<string, any>\n\n constructor (opt: OrderOption, symbol: string, dict: Record<string, any>, changed: () => void) {\n super(opt, symbol, {\n enable: () => this.enable(),\n disable: () => this.disable()\n })\n this.dict = dict\n this.changed = changed\n if (opt.xyRange === undefined) throw Error('not an xy range opt')\n const cfg = opt.xyRange\n const setVal = dict[opt.key]\n this.on = typeof setVal !== 'undefined'\n if (this.on) {\n this.node.classList.add('selected')\n this.x = setVal\n } else {\n this.x = opt.default\n }\n const selected = () => { this.node.classList.add('selected') }\n this.handler = new XYRangeHandler(cfg, this.x, { changed, selected, settingsDict: dict, settingsKey: opt.key })\n this.tmpl.controls.appendChild(this.handler.control)\n }\n\n enable (): void {\n this.dict[this.opt.key] = this.x\n this.changed()\n }\n\n disable (): void {\n delete this.dict[this.opt.key]\n this.changed()\n }\n\n setValue (x: number): void {\n this.handler.setValue(x)\n this.on = true\n this.node.classList.add('selected')\n }\n}\n\ninterface AcceptOpts {\n skipChange?: boolean\n skipUpdate?: boolean // Implies skipChange\n}\n\ninterface RangeHandlerOpts {\n roundY?: boolean\n roundX?: boolean\n updated?: (x:number, y:number) => void, // fires while dragging.\n changed?: () => void, // does not fire while dragging but does when dragging ends.\n selected?: () => void,\n disabled?: boolean\n settingsDict?: {[key: string]: any}\n settingsKey?: string\n convert?: (x: number, y: number) => any\n}\n\n/*\n * XYRangeHandler is the handler for an *XYRange from client/asset. XYRange\n * has a slider which allows adjusting the x and y, linearly between two limits.\n * The user can also manually enter values for x or y.\n */\nexport class XYRangeHandler {\n control: HTMLElement\n range: XYRange\n tmpl: Record<string, PageElement>\n initVal: number\n settingsDict?: {[key: string]: any}\n settingsKey: string\n x: number\n scrollingX: number\n y: number\n r: number\n roundX: boolean\n roundY: boolean\n disabled: boolean\n updated: (x:number, y:number) => void // called while dragging\n changed: () => void // not called while dragging, but called when done dragging\n selected: () => void\n convert: (x: number, y: number) => any\n\n constructor (\n range: XYRange,\n initVal: number,\n opts: RangeHandlerOpts\n ) {\n const control = this.control = rangeOptTmpl.cloneNode(true) as HTMLElement\n const tmpl = this.tmpl = Doc.parseTemplate(control)\n tmpl.rangeLblStart.textContent = range.start.label\n tmpl.rangeLblEnd.textContent = range.end.label\n tmpl.xUnit.textContent = range.xUnit\n tmpl.yUnit.textContent = range.yUnit\n this.range = range\n this.initVal = initVal\n this.settingsDict = opts.settingsDict\n this.settingsKey = opts.settingsKey ?? ''\n this.roundX = Boolean(opts.roundX)\n this.roundY = Boolean(opts.roundY)\n\n this.setDisabled(Boolean(opts.disabled))\n this.changed = opts.changed ?? (() => { /* pass */ })\n this.selected = opts.selected ?? (() => { /* pass */ })\n this.updated = opts.updated ?? (() => { /* pass */ })\n this.convert = opts.convert || ((x: number) => x)\n\n const { slider, handle } = tmpl\n const rangeX = range.end.x - range.start.x\n const rangeY = range.end.y - range.start.y\n const normalizeX = (x: number) => (x - range.start.x) / rangeX\n\n // r, x, and y will be updated by the various input event handlers. r is\n // x (or y) normalized on its range, e.g. [x_min, x_max] -> [0, 1]\n this.r = normalizeX(initVal)\n this.scrollingX = this.x = initVal\n this.y = this.r * rangeY + range.start.y\n this.accept(this.scrollingX, { skipUpdate: true })\n\n // Set up the handlers for the x and y text input fields.\n const clickOutX = (e: MouseEvent) => {\n if (this.disabled) return\n if (e.type !== 'change' && e.target === tmpl.xInput) return\n const s = tmpl.xInput.value\n if (s) {\n const xx = parseFloat(s)\n if (!isNaN(xx)) {\n this.scrollingX = clamp(xx, range.start.x, range.end.x)\n this.r = normalizeX(this.scrollingX)\n this.y = this.r * rangeY + range.start.y\n this.accept(this.scrollingX)\n }\n }\n Doc.hide(tmpl.xInput)\n Doc.show(tmpl.x)\n Doc.unbind(document, 'click', clickOutX)\n this.changed()\n }\n\n Doc.bind(tmpl.x, 'click', e => {\n if (this.disabled) return\n Doc.hide(tmpl.x)\n Doc.show(tmpl.xInput)\n tmpl.xInput.focus()\n tmpl.xInput.value = threeSigFigs.format(this.scrollingX)\n Doc.bind(document, 'click', clickOutX)\n e.stopPropagation()\n })\n\n Doc.bind(tmpl.xInput, 'change', clickOutX)\n\n const clickOutY = (e: MouseEvent) => {\n if (this.disabled) return\n if (e.type !== 'change' && e.target === tmpl.yInput) return\n const s = tmpl.yInput.value\n if (s) {\n const yy = parseFloat(s)\n if (!isNaN(yy)) {\n this.y = clamp(yy, range.start.y, range.end.y)\n this.r = (this.y - range.start.y) / rangeY\n this.scrollingX = range.start.x + this.r * rangeX\n this.accept(this.scrollingX)\n }\n }\n Doc.hide(tmpl.yInput)\n Doc.show(tmpl.y)\n Doc.unbind(document, 'click', clickOutY)\n this.changed()\n }\n\n Doc.bind(tmpl.y, 'click', e => {\n if (this.disabled) return\n Doc.hide(tmpl.y)\n Doc.show(tmpl.yInput)\n tmpl.yInput.focus()\n tmpl.yInput.value = threeSigFigs.format(this.y)\n Doc.bind(document, 'click', clickOutY)\n e.stopPropagation()\n })\n\n Doc.bind(tmpl.yInput, 'change', clickOutY)\n\n // Read the slider.\n Doc.bind(handle, 'mousedown', (e: MouseEvent) => {\n if (this.disabled) return\n if (e.button !== 0) return\n e.preventDefault()\n e.stopPropagation()\n this.selected()\n const startX = e.pageX\n const w = slider.clientWidth - handle.offsetWidth\n const startLeft = normalizeX(this.scrollingX) * w\n const left = (ee: MouseEvent) => Math.max(Math.min(startLeft + (ee.pageX - startX), w), 0)\n const trackMouse = (ee: MouseEvent, emit?: boolean) => {\n ee.preventDefault()\n this.r = left(ee) / w\n this.scrollingX = this.r * rangeX + range.start.x\n this.y = this.r * rangeY + range.start.y\n this.accept(this.scrollingX, { skipChange: !emit })\n }\n const mouseUp = (ee: MouseEvent) => {\n trackMouse(ee, true)\n Doc.unbind(document, 'mousemove', trackMouse)\n Doc.unbind(document, 'mouseup', mouseUp)\n this.changed()\n }\n Doc.bind(document, 'mousemove', trackMouse)\n Doc.bind(document, 'mouseup', mouseUp)\n })\n\n Doc.bind(tmpl.sliderBox, 'click', (e: MouseEvent) => {\n if (this.disabled) return\n if (e.button !== 0) return\n const x = e.pageX\n const m = Doc.layoutMetrics(tmpl.slider)\n this.r = clamp((x - m.bodyLeft) / m.width, 0, 1)\n this.scrollingX = this.r * rangeX + range.start.x\n this.y = this.r * rangeY + range.start.y\n this.accept(this.scrollingX)\n })\n }\n\n setDisabled (disabled: boolean) {\n this.control.classList.toggle('disabled', disabled)\n this.disabled = disabled\n }\n\n setXLabel (s: string) {\n this.tmpl.x.textContent = s\n }\n\n setYLabel (s: string) {\n this.tmpl.y.textContent = s\n }\n\n accept (x: number, cfg?: AcceptOpts): void {\n const tmpl = this.tmpl\n if (this.roundX) x = Math.round(x)\n if (this.roundY) this.y = Math.round(this.y)\n tmpl.x.textContent = threeSigFigs.format(x)\n tmpl.y.textContent = threeSigFigs.format(this.y)\n if (this.roundY) tmpl.y.textContent = `${this.y}`\n const rEffective = clamp(this.r, 0, 1)\n tmpl.handle.style.left = `calc(${rEffective * 100}% - ${rEffective * 14}px)`\n this.x = x\n this.scrollingX = x\n cfg = cfg ?? {}\n if (this.settingsDict) this.settingsDict[this.settingsKey] = this.convert(this.x, this.y)\n if (!cfg.skipUpdate) {\n this.updated(x, this.y)\n if (!cfg.skipChange) this.changed()\n }\n }\n\n setValue (x: number, skipUpdate?: boolean) {\n const range = this.range\n this.r = (x - range.start.x) / (range.end.x - range.start.x)\n this.y = range.start.y + this.r * (range.end.y - range.start.y)\n this.accept(x, { skipUpdate })\n }\n\n modified (): boolean {\n return this.x !== this.initVal\n }\n\n reset () {\n this.setValue(this.initVal, true)\n }\n}\n\nconst clamp = (v: number, min: number, max: number): number => v < min ? min : v > max ? max : v\n","export default class BasePage {\n /* unload is called when the user navigates away from the page. */\n unload () {\n // should be implemented by inheriting class.\n }\n}\n","import * as intl from './locales'\nimport {\n app,\n Order,\n TradeForm,\n OrderOption,\n Match\n} from './registry'\nimport { BooleanOption, XYRangeOption } from './opts'\nimport Doc from './doc'\n\nexport const Limit = 1 // TODO: Delete for the versions below\nexport const Market = 2 // TODO: Delete for the versions below\nexport const Cancel = 3 // TODO: Delete for the versions below\n\nexport const OrderTypeLimit = 1\nexport const OrderTypeMarket = 2\nexport const OrderTypeCancel = 3\n\n/* The time-in-force specifiers are a mirror of dex/order.TimeInForce. */\nexport const ImmediateTiF = 0\nexport const StandingTiF = 1\n\n/* The order statuses are a mirror of dex/order.OrderStatus. */\nexport const StatusUnknown = 0\nexport const StatusEpoch = 1\nexport const StatusBooked = 2\nexport const StatusExecuted = 3\nexport const StatusCanceled = 4\nexport const StatusRevoked = 5\n\n/* The match statuses are a mirror of dex/order.MatchStatus. */\nexport const NewlyMatched = 0\nexport const MakerSwapCast = 1\nexport const TakerSwapCast = 2\nexport const MakerRedeemed = 3\nexport const MatchComplete = 4\nexport const MatchConfirmed = 5\n\n/* The match sides are a mirror of dex/order.MatchSide. */\nexport const Maker = 0 // TODO: Delete for the versions below\nexport const Taker = 1 // TODO: Delete for the versions below\n\nexport const MatchSideMaker = 0\nexport const MatchSideTaker = 1\n\n/*\n * RateEncodingFactor is used when encoding an atomic exchange rate as an\n * integer. See docs on message-rate encoding @\n * https://github.com/decred/dcrdex/blob/master/spec/comm.mediawiki#Rate_Encoding\n */\nexport const RateEncodingFactor = 1e8\n\nexport function sellString (ord: Order) {\n const key = ord.sell ? intl.ID_SELL : intl.ID_BUY\n const lang = document.documentElement.lang.toLowerCase()\n return intl.prep(key).toLocaleLowerCase(lang)\n}\n\nexport function typeString (ord: Order) {\n return ord.type === Limit ? (ord.tif === ImmediateTiF ? intl.prep(intl.ID_LIMIT_ORDER_IMMEDIATE_TIF) : intl.prep(intl.ID_LIMIT_ORDER)) : intl.prep(intl.ID_MARKET_ORDER)\n}\n\n/* isMarketBuy will return true if the order is a market buy order. */\nexport function isMarketBuy (ord: Order) {\n return ord.type === Market && !ord.sell\n}\n\n/*\n * hasActiveMatches returns true if the order has matches that have not completed\n * settlement yet.\n */\nexport function hasActiveMatches (order: Order) {\n if (!order.matches) return false\n for (const match of order.matches) {\n if (match.active) return true\n }\n return false\n}\n\n/**\n * statusString converts the order status to a string.\n *\n * IMPORTANT: we have similar function in Golang, it must match this one exactly,\n * when updating make sure to update both!\n */\nexport function statusString (order: Order): string {\n if (!order.id) return intl.prep(intl.ID_ORDER_SUBMITTING) // order ID is empty.\n const isLive = hasActiveMatches(order)\n switch (order.status) {\n case StatusUnknown: return intl.prep(intl.ID_UNKNOWN)\n case StatusEpoch: return intl.prep(intl.ID_EPOCH)\n case StatusBooked:\n if (order.cancelling) return intl.prep(intl.ID_CANCELING)\n return isLive ? `${intl.prep(intl.ID_BOOKED)}/${intl.prep(intl.ID_SETTLING)}` : intl.prep(intl.ID_BOOKED)\n case StatusExecuted:\n if (isLive) return intl.prep(intl.ID_SETTLING)\n if (order.filled === 0 && order.type !== Cancel) return intl.prep(intl.ID_NO_MATCH)\n return intl.prep(intl.ID_EXECUTED)\n case StatusCanceled:\n return isLive ? `${intl.prep(intl.ID_CANCELED)}/${intl.prep(intl.ID_SETTLING)}` : intl.prep(intl.ID_CANCELED)\n case StatusRevoked:\n return isLive ? `${intl.prep(intl.ID_REVOKED)}/${intl.prep(intl.ID_SETTLING)}` : intl.prep(intl.ID_REVOKED)\n }\n return intl.prep(intl.ID_UNKNOWN)\n}\n\n/* filled sums the quantities of non-cancel matches available. */\nexport function filled (order: Order) {\n if (!order.matches) return 0\n const qty = isMarketBuy(order) ? (m: Match) => m.qty * m.rate / RateEncodingFactor : (m: Match) => m.qty\n return order.matches.reduce((filled, match) => {\n if (match.isCancel) return filled\n return filled + qty(match)\n }, 0)\n}\n\n/* settled sums the quantities of the matches that have completed. */\nexport function settled (order: Order) {\n if (!order.matches) return 0\n const qty = isMarketBuy(order) ? (m: Match) => m.qty * m.rate / RateEncodingFactor : (m: Match) => m.qty\n return order.matches.reduce((settled, match) => {\n if (match.isCancel) return settled\n const redeemed = (match.side === Maker && match.status >= MakerRedeemed) ||\n (match.side === Taker && match.status >= MatchComplete)\n return redeemed ? settled + qty(match) : settled\n }, 0)\n}\n\n/* averageRateString returns a formatting string containing the average rate of\nthe matches that have been filled for a market order. */\nexport function averageMarketOrderRateString (ord: Order): string {\n if (!ord.matches?.length) return intl.prep(intl.ID_MARKET_ORDER)\n let rateStr = Doc.formatCoinValue(app().conventionalRate(ord.baseID, ord.quoteID, averageRate(ord)))\n if (ord.matches.length > 1) rateStr = '~ ' + rateStr // \"~\" only makes sense if the order has more than one match.\n return rateStr\n}\n\n/* averageRate returns a the average rate of the matches that have been filled\nin an order. */\nexport function averageRate (ord: Order): number {\n if (!ord.matches?.length) return 0\n let rateProduct = 0\n let baseQty = 0\n for (const m of ord.matches) {\n baseQty += m.qty\n rateProduct += (m.rate * m.qty) // order ~ 1e16\n }\n return rateProduct / baseQty\n}\n\n/* baseToQuote returns the quantity of the quote asset. */\nexport function baseToQuote (rate: number, base: number) : number {\n return rate * base / RateEncodingFactor\n}\n\n/* orderPortion returns a string stating the percentage of the order a match\n makes up. */\nexport function orderPortion (order: Order, match: Match) : string {\n let matchQty = match.qty\n if (isMarketBuy(order)) {\n matchQty = baseToQuote(match.rate, match.qty)\n }\n return ((matchQty / order.qty) * 100).toFixed(1) + ' %'\n}\n\n/*\n * matchStatusString is a string used to create a displayable string describing\n * describing the match status.\n */\nexport function matchStatusString (m: Match) {\n if (m.revoked) {\n // When revoked, match status is less important than pending action if still\n // active, or the outcome if inactive.\n if (m.active) {\n if (m.redeem) return revokedMatchStatus(intl.ID_MATCH_STATUS_REDEMPTION_SENT) // must require confirmation if active\n // If maker and we have not redeemed, waiting to refund, assuming it's not\n // revoked while waiting for confs on an unspent/unexpired taker swap.\n if (m.side === Maker) return revokedMatchStatus(intl.ID_MATCH_STATUS_REFUND_PENDING)\n // As taker, resolution depends on maker's actions while waiting to refund.\n if (m.counterRedeem) return revokedMatchStatus(intl.ID_MATCH_STATUS_REDEEM_PENDING) // this should be very brief if we see the maker's redeem\n return revokedMatchStatus(intl.ID_MATCH_STATUS_REFUND_PENDING) // may switch to redeem if maker redeems on the sly\n }\n if (m.refund) {\n return revokedMatchStatus(intl.ID_MATCH_STATUS_REFUNDED)\n }\n if (m.redeem) {\n return revokedMatchStatus(intl.ID_MATCH_STATUS_REDEMPTION_CONFIRMED)\n }\n return revokedMatchStatus(intl.ID_MATCH_STATUS_COMPLETE) // i.e. we sent no swap\n }\n\n switch (m.status) {\n case NewlyMatched:\n return intl.prep(intl.ID_MATCH_STATUS_NEWLY_MATCHED)\n case MakerSwapCast:\n return intl.prep(intl.ID_MATCH_STATUS_MAKER_SWAP_CAST)\n case TakerSwapCast:\n return intl.prep(intl.ID_MATCH_STATUS_TAKER_SWAP_CAST)\n case MakerRedeemed:\n if (m.side === Maker) {\n return intl.prep(intl.ID_MATCH_STATUS_REDEMPTION_SENT)\n }\n return intl.prep(intl.ID_MATCH_STATUS_MAKER_REDEEMED)\n case MatchComplete:\n return intl.prep(intl.ID_MATCH_STATUS_REDEMPTION_SENT)\n case MatchConfirmed:\n return intl.prep(intl.ID_MATCH_STATUS_REDEMPTION_CONFIRMED)\n }\n return intl.prep(intl.ID_UNKNOWN)\n}\n\n// revokedMatchStatus is a helper function that returns the revoked match status\n// string.\nfunction revokedMatchStatus (matchStatus: string): string {\n return intl.prep(intl.ID_MATCH_STATUS_REVOKED, { status: intl.prep(matchStatus) })\n}\n\n/*\n * optionElement is a getter for an element matching the *OrderOption from\n * client/asset. change is a function with no arguments that is called when the\n * returned option's value has changed.\n */\nexport function optionElement (opt: OrderOption, order: TradeForm, change: () => void, isSwap: boolean): HTMLElement {\n const isBaseChain = (isSwap && order.sell) || (!isSwap && !order.sell)\n const symbol = isBaseChain ? dexAssetSymbol(order.host, order.base) : dexAssetSymbol(order.host, order.quote)\n\n switch (true) {\n case !!opt.boolean:\n return new BooleanOption(opt, symbol, order.options, change).node\n case !!opt.xyRange:\n return new XYRangeOption(opt, symbol, order.options, change).node\n default:\n console.error('no option type specified', opt)\n }\n console.error('unknown option type', opt)\n return document.createElement('div')\n}\n\nfunction dexAssetSymbol (host: string, assetID: number): string {\n return app().exchanges[host].assets[assetID].symbol\n}\n\nexport function isCancellable (ord: Order): boolean {\n return ord.type === Limit && ord.tif === StandingTiF && ord.status < StatusExecuted\n}\n\nexport function orderTypeText (ordType: number): string {\n switch (ordType) {\n case OrderTypeLimit:\n return intl.prep(intl.ID_LIMIT_ORDER)\n case OrderTypeMarket:\n return intl.prep(intl.ID_MARKET_ORDER)\n default: // OrderTypeCancel\n return intl.prep(intl.ID_CANCEL_ORDER)\n }\n}\n","import Doc, { Animation, clamp } from './doc'\nimport { RateEncodingFactor } from './orderutil'\nimport OrderBook from './orderbook'\nimport State from './state'\nimport { UnitInfo, Market, Candle, CandlesPayload, app } from './registry'\n\nconst bind = Doc.bind\nconst PIPI = 2 * Math.PI\nconst plusChar = String.fromCharCode(59914)\nconst minusChar = String.fromCharCode(59915)\n\ninterface Point {\n x: number\n y: number\n}\n\ninterface MinMax {\n min: number\n max: number\n}\n\ninterface Label {\n val: number\n txt: string\n}\n\ninterface LabelSet {\n widest?: number\n lbls: Label[]\n}\n\nexport interface Translator {\n x: (x: number) => number\n y: (y: number) => number\n unx: (x: number) => number\n uny: (y: number) => number\n w: (w: number) => number\n h: (h: number) => number\n}\n\nexport interface MouseReport {\n rate: number\n depth: number\n dotColor: string\n hoverMarkers: number[]\n}\n\nexport interface VolumeReport {\n buyBase: number\n buyQuote: number\n sellBase: number\n sellQuote: number\n}\n\nexport interface DepthReporters {\n mouse: (r: MouseReport | null) => void\n click: (x: number) => void\n volume: (r: VolumeReport) => void\n zoom: (z: number) => void\n}\n\nexport interface CandleReporters {\n mouse: (r: Candle | null) => void\n}\n\nexport interface ChartReporters {\n resize: () => void,\n click: (e: MouseEvent) => void,\n zoom: (bigger: boolean) => void\n}\n\nexport interface DepthLine {\n rate: number\n color: string\n}\n\nexport interface DepthMarker {\n rate: number\n active: boolean\n}\n\ninterface DepthMark extends DepthMarker {\n qty: number\n sell: boolean\n}\n\ninterface Theme {\n body: string\n axisLabel: string\n gridBorder: string\n gridLines: string\n gapLine: string\n value: string\n zoom: string\n zoomHover: string\n sellLine: string\n buyLine: string\n sellFill: string\n buyFill: string\n crosshairs: string\n legendFill: string\n legendText: string\n}\n\nconst darkTheme: Theme = {\n body: '#0b2031',\n axisLabel: '#b1b1b1',\n gridBorder: '#383f4b',\n gridLines: '#383f4b',\n gapLine: '#6b6b6b',\n value: '#9a9a9a',\n zoom: '#5b5b5b',\n zoomHover: '#aaa',\n sellLine: '#ae3333',\n buyLine: '#05a35a',\n sellFill: '#591a1a',\n buyFill: '#02572f',\n crosshairs: '#888',\n legendFill: 'black',\n legendText: '#d5d5d5'\n}\n\nconst lightTheme: Theme = {\n body: '#f4f4f4',\n axisLabel: '#1b1b1b',\n gridBorder: '#ddd',\n gridLines: '#ddd',\n gapLine: '#595959',\n value: '#4d4d4d',\n zoom: '#777',\n zoomHover: '#333',\n sellLine: '#99302b',\n buyLine: '#207a46',\n sellFill: '#bd5959',\n buyFill: '#4cad75',\n crosshairs: '#595959',\n legendFill: '#e6e6e6',\n legendText: '#1b1b1b'\n}\n\n// Chart is the base class for charts.\nexport class Chart {\n parent: HTMLElement\n report: ChartReporters\n theme: Theme\n canvas: HTMLCanvasElement\n visible: boolean\n renderScheduled: boolean\n ctx: CanvasRenderingContext2D\n mousePos: Point | null\n rect: DOMRect\n wheelLimiter: number | null\n boundResizer: () => void\n plotRegion: Region\n xRegion: Region\n yRegion: Region\n dataExtents: Extents\n unattachers: (() => void)[]\n\n constructor (parent: HTMLElement, reporters: ChartReporters) {\n this.parent = parent\n this.report = reporters\n this.theme = State.isDark() ? darkTheme : lightTheme\n this.canvas = document.createElement('canvas')\n this.visible = true\n parent.appendChild(this.canvas)\n const ctx = this.canvas.getContext('2d')\n if (!ctx) {\n console.error('error getting canvas context')\n return\n }\n this.ctx = ctx\n this.ctx.textAlign = 'center'\n this.ctx.textBaseline = 'middle'\n // Mouse handling\n this.mousePos = null\n bind(this.canvas, 'mousemove', (e: MouseEvent) => {\n // this.rect will be set in resize().\n if (!this.rect) return\n this.mousePos = {\n x: e.clientX - this.rect.left,\n y: e.clientY - this.rect.y\n }\n this.draw()\n })\n bind(this.canvas, 'mouseleave', () => {\n this.mousePos = null\n this.draw()\n })\n\n // Bind resize.\n const resizeObserver = new ResizeObserver(() => this.resize())\n resizeObserver.observe(this.parent)\n\n // Scrolling by wheel is smoother when the rate is slightly limited.\n this.wheelLimiter = null\n bind(this.canvas, 'wheel', (e: WheelEvent) => { this.wheel(e) }, { passive: true })\n bind(this.canvas, 'click', (e: MouseEvent) => { this.click(e) })\n const setVis = () => {\n this.visible = document.visibilityState !== 'hidden'\n if (this.visible && this.renderScheduled) {\n this.renderScheduled = false\n this.draw()\n }\n }\n bind(document, 'visibilitychange', setVis)\n this.unattachers = [() => { Doc.unbind(document, 'visibilitychange', setVis) }]\n }\n\n wheeled () {\n this.wheelLimiter = window.setTimeout(() => { this.wheelLimiter = null }, 100)\n }\n\n /* clear the canvas. */\n clear () {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\n }\n\n /* draw calls the child class's render method. */\n draw () {\n this.render()\n }\n\n /* click is the handler for a click event on the canvas. */\n click (e: MouseEvent) {\n this.report.click(e)\n }\n\n /* wheel is a mousewheel event handler. */\n wheel (e: WheelEvent) {\n this.zoom(e.deltaY < 0)\n }\n\n /*\n * resize updates the chart size. The parentHeight is an argument to support\n * updating the height programmatically after the caller sets a style.height\n * but before the clientHeight has been updated.\n */\n resize () {\n this.canvas.width = this.parent.clientWidth\n this.canvas.height = this.parent.clientHeight\n const xLblHeight = 30\n const yGuess = 40 // y label width guess. Will be adjusted when drawn.\n const plotExtents = new Extents(0, this.canvas.width, 0, this.canvas.height - xLblHeight)\n const xLblExtents = new Extents(0, this.canvas.width, this.canvas.height - xLblHeight, this.canvas.height)\n const yLblExtents = new Extents(0, yGuess, 0, this.canvas.height - xLblHeight)\n this.plotRegion = new Region(this.ctx, plotExtents)\n this.xRegion = new Region(this.ctx, xLblExtents)\n this.yRegion = new Region(this.ctx, yLblExtents)\n // After changing the visibility, this.canvas.getBoundingClientRect will\n // return nonsense until a render.\n window.requestAnimationFrame(() => {\n this.rect = this.canvas.getBoundingClientRect()\n this.report.resize()\n })\n }\n\n /* zoom is called when the user scrolls the mouse wheel on the canvas. */\n zoom (bigger: boolean) {\n if (this.wheelLimiter) return\n this.report.zoom(bigger)\n }\n\n /* The market handler will call unattach when the markets page is unloaded. */\n unattach () {\n for (const u of this.unattachers) u()\n this.unattachers = []\n }\n\n /* render must be implemented by the child class. */\n render () {\n console.error('child class must override render method')\n }\n\n /* applyLabelStyle applies the style used for axis tick labels. */\n applyLabelStyle (fontSize?: number) {\n this.ctx.textAlign = 'center'\n this.ctx.textBaseline = 'middle'\n this.ctx.font = `${fontSize ?? '14'}px 'sans', sans-serif`\n this.ctx.fillStyle = this.theme.axisLabel\n }\n\n /* plotXLabels applies the provided labels to the x axis and draws the grid. */\n plotXLabels (labels: LabelSet, minX: number, maxX: number, unitLines: string[]) {\n const extents = new Extents(minX, maxX, 0, 1)\n this.xRegion.plot(extents, (ctx: CanvasRenderingContext2D, tools: Translator) => {\n this.applyLabelStyle()\n const centerX = (maxX + minX) / 2\n let lastX = minX\n let unitCenter = centerX\n const [leftEdge, rightEdge] = [tools.x(minX), tools.x(maxX)]\n const centerY = tools.y(0.5)\n labels.lbls.forEach(lbl => {\n const m = ctx.measureText(lbl.txt)\n const x = tools.x(lbl.val)\n if (x - m.width / 2 < leftEdge || x + m.width / 2 > rightEdge) return\n ctx.fillText(lbl.txt, x, centerY)\n if (centerX >= lastX && centerX < lbl.val) {\n unitCenter = (lastX + lbl.val) / 2\n }\n lastX = lbl.val\n })\n ctx.font = '11px \\'sans\\', sans-serif'\n if (unitLines.length === 2) {\n ctx.fillText(unitLines[0], tools.x(unitCenter), tools.y(0.63))\n ctx.fillText(unitLines[1], tools.x(unitCenter), tools.y(0.23))\n } else if (unitLines.length === 1) {\n ctx.fillText(unitLines[0], tools.x(unitCenter), centerY)\n }\n }, true)\n }\n\n plotXGrid (labels: LabelSet, minX: number, maxX: number) {\n const extents = new Extents(minX, maxX, 0, 1)\n this.plotRegion.plot(extents, (ctx: CanvasRenderingContext2D, tools: Translator) => {\n ctx.lineWidth = 1\n ctx.strokeStyle = this.theme.gridLines\n labels.lbls.forEach(lbl => {\n line(ctx, tools.x(lbl.val), tools.y(0), tools.x(lbl.val), tools.y(1))\n })\n }, true)\n }\n\n /*\n * plotYLabels applies the y labels based on the provided plot region, and\n * draws the grid.\n */\n plotYLabels (labels: LabelSet, minY: number, maxY: number, unit: string) {\n const extents = new Extents(0, 1, minY, maxY)\n\n const fillRect = (ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, r: number) => {\n ctx.save()\n ctx.fillStyle = this.theme.body\n ctx.beginPath()\n if (ctx.roundRect) ctx.roundRect(x, y, w, h, r) // Safari < 16 doesn't support\n else ctx.rect(x, y, w, h)\n ctx.fill()\n ctx.restore()\n }\n\n this.yRegion.plot(extents, (ctx: CanvasRenderingContext2D, tools: Translator) => {\n this.applyLabelStyle()\n this.ctx.textAlign = 'left'\n const centerY = maxY / 2\n let lastY = 0\n let unitCenter = centerY\n const x = tools.x(0)\n const [xPad, yPad] = [3, 3]\n labels.lbls.forEach(lbl => {\n const y = tools.y(lbl.val)\n if (y < tools.y(maxY) + yPad + 7 || y > tools.y(minY) - yPad - 7) return\n const m = ctx.measureText(lbl.txt)\n fillRect(ctx, x, y - 7 - yPad, m.width + xPad * 2, 14 + yPad * 3, 3)\n ctx.fillText(lbl.txt, x + xPad, y + 2)\n if (centerY >= lastY && centerY < lbl.val) {\n unitCenter = (lastY + lbl.val) / 2\n }\n lastY = lbl.val\n })\n const m = ctx.measureText(unit)\n const y = tools.y(unitCenter)\n fillRect(ctx, x, y - yPad - 7, m.width + xPad * 2, 14 + yPad * 2, 3)\n ctx.fillText(unit, x + xPad, tools.y(unitCenter))\n }, true)\n }\n\n plotYGrid (region: Region, labels: LabelSet, minY: number, maxY: number) {\n const extents = new Extents(0, 1, minY, maxY)\n region.plot(extents, (ctx: CanvasRenderingContext2D, tools: Translator) => {\n ctx.lineWidth = 1\n ctx.strokeStyle = this.theme.gridLines\n labels.lbls.forEach(lbl => {\n line(ctx, tools.x(0), tools.y(lbl.val), tools.x(1), tools.y(lbl.val))\n })\n }, true)\n }\n\n /*\n * doYLabels generates and applies the y-axis labels, based upon the\n * provided plot region.\n */\n makeYLabels (region: Region, step: number, unit: string, valFmt?: (v: number) => string): LabelSet {\n this.applyLabelStyle()\n const yLabels = makeLabels(this.ctx, region.height(), this.dataExtents.y.min,\n this.dataExtents.y.max, 50, step, unit, valFmt)\n\n // Reassign the width of the y-label column to accommodate the widest text.\n const yAxisWidth = (yLabels.widest || 0) + 20 /* x padding */\n this.yRegion.extents.x.max = yAxisWidth\n this.yRegion.extents.y.max = region.extents.y.max\n\n return yLabels\n }\n\n line (x0: number, y0: number, x1: number, y1: number, skipStroke?: boolean) {\n line(this.ctx, x0, y0, x1, y1, skipStroke)\n }\n\n /* dot draws a circle with the provided context. */\n dot (x: number, y: number, color: string, radius: number) {\n dot(this.ctx, x, y, color, radius)\n }\n}\n\n/* DepthChart is a javascript Canvas-based depth chart renderer. */\nexport class DepthChart extends Chart {\n reporters: DepthReporters\n book: OrderBook\n zoomLevel: number\n lotSize: number\n conventionalRateStep: number\n lines: DepthLine[]\n markers: Record<string, DepthMarker[]>\n zoomInBttn: Region\n zoomOutBttn: Region\n baseUnit: string\n quoteUnit: string\n\n constructor (parent: HTMLElement, reporters: DepthReporters, zoom: number) {\n super(parent, {\n resize: () => this.resized(),\n click: (e: MouseEvent) => this.clicked(e),\n zoom: (bigger: boolean) => this.zoomed(bigger)\n })\n this.reporters = reporters\n this.zoomLevel = zoom\n this.lines = []\n this.markers = {\n buys: [],\n sells: []\n }\n this.setZoomBttns() // can't wait for requestAnimationFrame -> resized\n this.resize()\n }\n\n // setZoomBttns creates new regions for zoom in and zoom out buttons. It is\n // used in initiation of the buttons and resizing.\n setZoomBttns () {\n this.zoomInBttn = new Region(this.ctx, new Extents(0, 0, 0, 0))\n this.zoomOutBttn = new Region(this.ctx, new Extents(0, 0, 0, 0))\n }\n\n /* resized is called when the window or parent element are resized. */\n resized () {\n // The button region extents are set during drawing.\n this.setZoomBttns()\n if (this.book) this.draw()\n }\n\n /* zoomed zooms the current view in or out. bigger=true is zoom in. */\n zoomed (bigger: boolean) {\n if (!this.zoomLevel) return\n if (!this.book.buys || !this.book.sells) return\n this.wheeled()\n // Zoom in to 66%, but out to 150% = 1 / (2/3) so that the same zoom levels\n // are hit when reversing direction.\n this.zoomLevel *= bigger ? 2 / 3 : 3 / 2\n this.zoomLevel = clamp(this.zoomLevel, 0.005, 2)\n this.draw()\n this.reporters.zoom(this.zoomLevel)\n }\n\n /* clicked is the canvas 'click' event handler. */\n clicked (e: MouseEvent) {\n if (!this.dataExtents) return\n const x = e.clientX - this.rect.left\n const y = e.clientY - this.rect.y\n if (this.zoomInBttn.contains(x, y)) { this.zoom(true); return }\n if (this.zoomOutBttn.contains(x, y)) { this.zoom(false); return }\n const translator = this.plotRegion.translator(this.dataExtents)\n this.reporters.click(translator.unx(x))\n }\n\n // set sets the current data set and draws.\n set (book: OrderBook, lotSize: number, rateStepEnc: number, baseUnitInfo: UnitInfo, quoteUnitInfo: UnitInfo) {\n this.book = book\n this.lotSize = lotSize / baseUnitInfo.conventional.conversionFactor\n this.conventionalRateStep = Doc.conventionalRateStep(rateStepEnc, baseUnitInfo, quoteUnitInfo)\n this.baseUnit = baseUnitInfo.conventional.unit\n this.quoteUnit = quoteUnitInfo.conventional.unit\n if (!this.zoomLevel) {\n const [midGap, gapWidth] = this.gap()\n // Default to 5% zoom, but with a minimum of 5 * midGap, but still observing\n // the hard cap of 200%.\n const minZoom = Math.max(gapWidth / midGap * 5, 0.05)\n this.zoomLevel = Math.min(minZoom, 2)\n }\n this.draw()\n }\n\n /*\n * render draws the chart.\n * 1. Calculate the data extents and translate the order book data to a\n * cumulative form.\n * 2. Draw axis ticks and grid, mid-gap line and value, zoom buttons, mouse\n * position indicator...\n * 4. Tick labels.\n * 5. Data.\n * 6. Epoch line legend.\n * 7. Hover legend.\n */\n render () {\n // if connection fails it is not possible to get book.\n if (!this.book || !this.visible || this.canvas.width === 0) {\n this.renderScheduled = true\n return\n }\n\n this.clear()\n // if (!this.book || this.book.empty()) return\n const ctx = this.ctx\n const mousePos = this.mousePos\n const buys = this.book.buys\n const sells = this.book.sells\n\n const [midGap, gapWidth] = this.gap()\n\n const halfWindow = this.zoomLevel * midGap / 2\n const high = midGap + halfWindow\n const low = midGap - halfWindow\n\n // Get a sorted copy of the markers list.\n const buyMarkers = [...this.markers.buys]\n const sellMarkers = [...this.markers.sells]\n buyMarkers.sort((a, b) => b.rate - a.rate)\n sellMarkers.sort((a, b) => a.rate - b.rate)\n const markers: DepthMark[] = []\n\n const buyDepth: [number, number][] = []\n const buyEpoch: [number, number][] = []\n const sellDepth: [number, number][] = []\n const sellEpoch: [number, number][] = []\n const volumeReport = {\n buyBase: 0,\n buyQuote: 0,\n sellBase: 0,\n sellQuote: 0\n }\n let sum = 0\n // The epoch line is above the non-epoch region, so the epochSum y value\n // must account for non-epoch orders too.\n let epochSum = 0\n\n for (let i = 0; i < buys.length; i++) {\n const ord = buys[i]\n epochSum += ord.qty\n if (ord.rate >= low) buyEpoch.push([ord.rate, epochSum])\n if (ord.epoch) continue\n sum += ord.qty\n buyDepth.push([ord.rate, sum])\n volumeReport.buyBase += ord.qty\n volumeReport.buyQuote += ord.qty * ord.rate\n while (buyMarkers.length && floatCompare(buyMarkers[0].rate, ord.rate)) {\n const mark = buyMarkers.shift()\n if (!mark) continue\n markers.push({\n rate: mark.rate,\n qty: ord.epoch ? epochSum : sum,\n sell: ord.sell,\n active: mark.active\n })\n }\n }\n const buySum = buyDepth.length ? last(buyDepth)[1] : 0\n buyDepth.push([low, buySum])\n const epochBuySum = buyEpoch.length ? last(buyEpoch)[1] : 0\n buyEpoch.push([low, epochBuySum])\n\n epochSum = sum = 0\n for (let i = 0; i < sells.length; i++) {\n const ord = sells[i]\n epochSum += ord.qty\n if (ord.rate <= high) sellEpoch.push([ord.rate, epochSum])\n if (ord.epoch) continue\n sum += ord.qty\n sellDepth.push([ord.rate, sum])\n volumeReport.sellBase += ord.qty\n volumeReport.sellQuote += ord.qty * ord.rate\n while (sellMarkers.length && floatCompare(sellMarkers[0].rate, ord.rate)) {\n const mark = sellMarkers.shift()\n if (!mark) continue\n markers.push({\n rate: mark.rate,\n qty: ord.epoch ? epochSum : sum,\n sell: ord.sell,\n active: mark.active\n })\n }\n }\n // Add a data point going to the left so that the data doesn't end with a\n // vertical line.\n const sellSum = sellDepth.length ? last(sellDepth)[1] : 0\n sellDepth.push([high, sellSum])\n const epochSellSum = sellEpoch.length ? last(sellEpoch)[1] : 0\n sellEpoch.push([high, epochSellSum])\n\n // Add ~30px padding to the top of the chart.\n const h = this.xRegion.extents.y.min\n const growthFactor = (h + 40) / h\n const maxY = (epochSellSum && epochBuySum ? Math.max(epochBuySum, epochSellSum) : epochSellSum || epochBuySum || 1) * growthFactor\n\n const dataExtents = new Extents(low, high, 0, maxY)\n this.dataExtents = dataExtents\n\n // A function to be run at the end if there is legend data to display.\n let mouseData: MouseReport | null = null\n\n // Draw the grid.\n const xLabels = makeLabels(ctx, this.plotRegion.width(), dataExtents.x.min, dataExtents.x.max, 100, this.conventionalRateStep, '')\n this.plotXGrid(xLabels, low, high)\n const yLabels = this.makeYLabels(this.plotRegion, this.lotSize, this.baseUnit)\n this.plotYGrid(this.plotRegion, yLabels, this.dataExtents.y.min, this.dataExtents.y.max)\n\n this.plotRegion.plot(dataExtents, (ctx, tools) => {\n ctx.lineWidth = 1\n // first, a square around the plot area.\n ctx.strokeStyle = this.theme.gridBorder\n // draw a line to indicate mid-gap\n ctx.lineWidth = 2.5\n ctx.strokeStyle = this.theme.gapLine\n line(ctx, tools.x(midGap), tools.y(0), tools.x(midGap), tools.y(0.3 * dataExtents.y.max))\n\n ctx.font = '30px \\'demi-sans\\', sans-serif'\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillStyle = this.theme.value\n const y = 0.5 * dataExtents.y.max\n ctx.fillText(Doc.formatFourSigFigs(midGap), tools.x(midGap), tools.y(y))\n ctx.font = '12px \\'sans\\', sans-serif'\n // ctx.fillText('mid-market price', tools.x(midGap), tools.y(y) + 24)\n ctx.fillText(`${(gapWidth / midGap * 100).toFixed(2)}% spread`,\n tools.x(midGap), tools.y(y) + 24)\n\n // Draw zoom buttons.\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n const topCenterX = this.plotRegion.extents.midX\n const topCenterY = tools.y(maxY * 0.9)\n const zoomPct = dataExtents.xRange / midGap * 100\n const zoomText = `${zoomPct.toFixed(1)}%`\n const w = ctx.measureText(zoomText).width\n ctx.font = '13px \\'sans\\', sans-serif'\n ctx.fillText(zoomText, topCenterX, topCenterY + 1)\n // define the region for the zoom button\n const bttnSize = 20\n const xPad = 10\n let bttnLeft = topCenterX - w / 2 - xPad - bttnSize\n const bttnTop = topCenterY - bttnSize / 2\n this.zoomOutBttn.setExtents(\n bttnLeft,\n bttnLeft + bttnSize,\n bttnTop,\n bttnTop + bttnSize\n )\n let hover = mousePos && this.zoomOutBttn.contains(mousePos.x, mousePos.y)\n this.zoomOutBttn.plot(new Extents(0, 1, 0, 1), ctx => {\n ctx.font = '12px \\'icomoon\\''\n ctx.fillStyle = this.theme.zoom\n if (hover) {\n ctx.fillStyle = this.theme.zoomHover\n ctx.font = '13px \\'icomoon\\''\n }\n ctx.fillText(minusChar, this.zoomOutBttn.extents.midX, this.zoomOutBttn.extents.midY)\n })\n bttnLeft = topCenterX + w / 2 + xPad\n this.zoomInBttn.setExtents(\n bttnLeft,\n bttnLeft + bttnSize,\n bttnTop,\n bttnTop + bttnSize\n )\n hover = mousePos && this.zoomInBttn.contains(mousePos.x, mousePos.y)\n this.zoomInBttn.plot(new Extents(0, 1, 0, 1), ctx => {\n ctx.font = '12px \\'icomoon\\''\n ctx.fillStyle = this.theme.zoom\n if (hover) {\n ctx.fillStyle = this.theme.zoomHover\n ctx.font = '14px \\'icomoon\\''\n }\n ctx.fillText(plusChar, this.zoomInBttn.extents.midX, this.zoomInBttn.extents.midY)\n })\n\n // Draw a dotted vertical line where the mouse is, and a dot at the level\n // of the depth line.\n const drawLine = (x: number, color: string) => {\n if (x > high || x < low) return\n ctx.save()\n ctx.setLineDash([3, 5])\n ctx.lineWidth = 1.5\n ctx.strokeStyle = color\n line(ctx, tools.x(x), tools.y(0), tools.x(x), tools.y(maxY))\n ctx.restore()\n }\n\n // for (const line of this.lines || []) {\n // drawLine(line.rate, line.color)\n // }\n\n const tolerance = (high - low) * 0.005\n const hoverMarkers = []\n for (const marker of markers || []) {\n const hovered = (mousePos && withinTolerance(marker.rate, tools.unx(mousePos.x), tolerance))\n if (hovered) hoverMarkers.push(marker.rate)\n ctx.save()\n ctx.lineWidth = (hovered || marker.active) ? 5 : 3\n ctx.strokeStyle = marker.sell ? this.theme.sellLine : this.theme.buyLine\n ctx.fillStyle = marker.sell ? this.theme.sellFill : this.theme.buyFill\n const size = (hovered || marker.active) ? 10 : 8\n ctx.beginPath()\n const tip = {\n x: tools.x(marker.rate),\n y: tools.y(marker.qty) - 8\n }\n const top = tip.y - (Math.sqrt(3) * size / 2) // cos(30)\n ctx.moveTo(tip.x, tip.y)\n ctx.lineTo(tip.x - size / 2, top)\n ctx.lineTo(tip.x + size / 2, top)\n ctx.closePath()\n ctx.stroke()\n ctx.fill()\n ctx.restore()\n }\n\n // If the mouse is in the chart area, draw the crosshairs.\n if (!mousePos) return\n if (!this.plotRegion.contains(mousePos.x, mousePos.y)) return\n // The mouse is in the plot region. Get the data coordinates and find the\n // side and depth for the x value.\n const dataX = tools.unx(mousePos.x)\n let evalSide = sellDepth\n let trigger = (ptX: number) => ptX >= dataX\n let dotColor = this.theme.sellLine\n if (dataX < midGap) {\n evalSide = buyDepth\n trigger = (ptX) => ptX <= dataX\n dotColor = this.theme.buyLine\n }\n let bestDepth = evalSide[0]\n for (let i = 0; i < evalSide.length; i++) {\n const pt = evalSide[i]\n if (trigger(pt[0])) break\n bestDepth = pt\n }\n drawLine(dataX, this.theme.crosshairs)\n mouseData = {\n rate: dataX,\n depth: bestDepth[1],\n dotColor: dotColor,\n hoverMarkers: hoverMarkers\n }\n })\n\n // Draw the epoch lines\n ctx.lineWidth = 1.5\n ctx.setLineDash([3, 3])\n // epoch sells\n ctx.fillStyle = this.theme.sellFill\n ctx.strokeStyle = this.theme.sellLine\n this.drawDepth(sellEpoch)\n // epoch buys\n ctx.fillStyle = this.theme.buyFill\n ctx.strokeStyle = this.theme.buyLine\n this.drawDepth(buyEpoch)\n\n // Draw the book depth.\n ctx.lineWidth = 2.5\n ctx.setLineDash([])\n // book sells\n ctx.fillStyle = this.theme.sellFill\n ctx.strokeStyle = this.theme.sellLine\n this.drawDepth(sellDepth)\n // book buys\n ctx.fillStyle = this.theme.buyFill\n ctx.strokeStyle = this.theme.buyLine\n this.drawDepth(buyDepth)\n\n this.plotYLabels(yLabels, this.dataExtents.y.min, this.dataExtents.y.max, this.baseUnit)\n this.plotXLabels(xLabels, low, high, [`${this.quoteUnit}/`, this.baseUnit])\n\n // Display the dot at the intersection of the mouse hover line and the depth\n // line. This should be drawn after the depths.\n if (mouseData) {\n this.plotRegion.plot(dataExtents, (ctx, tools) => {\n if (!mouseData) return // For TypeScript. Duh.\n dot(ctx, tools.x(mouseData.rate), tools.y(mouseData.depth), mouseData.dotColor, 5)\n })\n }\n\n // Report the book volumes.\n this.reporters.volume(volumeReport)\n this.reporters.mouse(mouseData)\n }\n\n /* drawDepth draws a single side's depth chart data. */\n drawDepth (depth: [number, number][]) {\n const firstPt = depth[0]\n let x: number\n this.plotRegion.plot(this.dataExtents, (ctx, tools) => {\n const yZero = tools.y(0)\n let y = tools.y(firstPt[1])\n ctx.beginPath()\n ctx.moveTo(tools.x(firstPt[0]), tools.y(firstPt[1]))\n for (let i = 0; i < depth.length; i++) {\n // Set x, but don't set y until we draw the horizontal line.\n x = tools.x(depth[i][0])\n ctx.lineTo(x, y)\n // If this is past the render edge, quit drawing.\n y = tools.y(depth[i][1])\n ctx.lineTo(x, y)\n }\n ctx.stroke()\n ctx.lineTo(x, yZero)\n ctx.lineTo(tools.x(firstPt[0]), yZero)\n ctx.closePath()\n ctx.globalAlpha = 0.25\n ctx.fill()\n })\n }\n\n /* returns the mid-gap rate and gap width as a tuple. */\n gap () {\n const [b, s] = [this.book.bestGapBuy(), this.book.bestGapSell()]\n if (!b) {\n if (!s) return [1, 0]\n return [s.rate, 0]\n } else if (!s) return [b.rate, 0]\n return [(s.rate + b.rate) / 2, s.rate - b.rate]\n }\n\n /* setLines stores the indicator lines to draw. */\n setLines (lines: DepthLine[]) {\n this.lines = lines\n }\n\n /* setMarkers sets the indicator markers to draw. */\n setMarkers (markers: Record<string, DepthMarker[]>) {\n this.markers = markers\n }\n}\n\n/* CandleChart is a candlestick data renderer. */\nexport class CandleChart extends Chart {\n reporters: CandleReporters\n data: CandlesPayload\n zoomLevel: number\n numToShow: number\n candleRegion: Region\n volumeRegion: Region\n resizeTimer: number\n zoomLevels: number[]\n market: Market\n rateConversionFactor: number\n\n constructor (parent: HTMLElement, reporters: CandleReporters) {\n super(parent, {\n resize: () => this.resized(),\n click: (/* e: MouseEvent */) => { this.clicked() },\n zoom: (bigger: boolean) => this.zoomed(bigger)\n })\n this.reporters = reporters\n this.zoomLevel = 1\n this.numToShow = 100\n this.resize()\n }\n\n /* resized is called when the window or parent element are resized. */\n resized () {\n const ext = this.plotRegion.extents\n const candleExtents = new Extents(ext.x.min, ext.x.max, ext.y.min, ext.y.min + ext.yRange * 0.85)\n this.candleRegion = new Region(this.ctx, candleExtents)\n const volumeExtents = new Extents(ext.x.min, ext.x.max, ext.y.min + 0.85 * ext.yRange, ext.y.max)\n this.volumeRegion = new Region(this.ctx, volumeExtents)\n // Set a delay on the render to prevent lag.\n if (this.resizeTimer) clearTimeout(this.resizeTimer)\n this.resizeTimer = window.setTimeout(() => this.draw(), 100)\n }\n\n clicked (/* e: MouseEvent */) {\n // handle clicks\n }\n\n /* zoomed zooms the current view in or out. bigger=true is zoom in. */\n zoomed (bigger: boolean) {\n // bigger actually means fewer candles -> reduce zoomLevels index.\n const idx = this.zoomLevels.indexOf(this.numToShow)\n if (bigger) {\n if (idx === 0) return\n this.numToShow = this.zoomLevels[idx - 1]\n } else {\n if (this.zoomLevels.length <= idx + 1 || this.numToShow > this.data.candles.length) return\n this.numToShow = this.zoomLevels[idx + 1]\n }\n this.draw()\n }\n\n /* render draws the chart */\n render () {\n const data = this.data\n if (!data || !this.visible || this.canvas.width === 0) {\n this.renderScheduled = true\n return\n }\n const candleWidth = data.ms\n const mousePos = this.mousePos\n const allCandles = data.candles || []\n\n const n = Math.min(this.numToShow, allCandles.length)\n const candles = allCandles.slice(allCandles.length - n)\n\n this.clear()\n\n // If there are no candles. just don't draw anything.\n if (n === 0) return\n\n // padding definition and some helper functions to parse candles.\n const candleWidthPadding = 0.2\n const start = (c: Candle) => truncate(c.endStamp, candleWidth)\n const end = (c: Candle) => start(c) + candleWidth\n const paddedStart = (c: Candle) => start(c) + candleWidthPadding * candleWidth\n const paddedWidth = (1 - 2 * candleWidthPadding) * candleWidth\n\n const first = candles[0]\n const last = candles[n - 1]\n\n let [high, low, highVol] = [first.highRate, first.lowRate, first.matchVolume]\n for (const c of candles) {\n if (c.highRate > high) high = c.highRate\n if (c.lowRate < low) low = c.lowRate\n if (c.matchVolume > highVol) highVol = c.matchVolume\n }\n\n high += (high - low) * 0.1 // a little padding\n const xStart = start(first)\n let xEnd = end(last)\n xEnd += (xEnd - xStart) * 0.05 // a little padding\n\n // Calculate data extents and store them. They are used to apply labels.\n const rateStep = this.market.ratestep\n const dataExtents = new Extents(xStart, xEnd, low, high)\n if (low === high) {\n // If there is no price movement at all in the window, show a little more\n // top and bottom so things render nicely.\n dataExtents.y.min -= rateStep\n dataExtents.y.max += rateStep\n }\n this.dataExtents = dataExtents\n\n let mouseCandle: Candle | null = null\n if (mousePos) {\n this.plotRegion.plot(new Extents(dataExtents.x.min, dataExtents.x.max, 0, 1), (ctx, tools) => {\n const selectedStartStamp = truncate(tools.unx(mousePos.x), candleWidth)\n for (const c of candles) {\n if (start(c) === selectedStartStamp) {\n mouseCandle = c\n ctx.fillStyle = this.theme.gridLines\n ctx.fillRect(tools.x(start(c)), tools.y(0), tools.w(candleWidth), tools.h(1))\n break\n }\n }\n })\n }\n\n // Draw the grid\n const rFactor = this.rateConversionFactor\n const baseUnit = app().assets[this.market.baseid]?.unitInfo.conventional.unit || this.market.basesymbol.toUpperCase()\n const xLabels = makeCandleTimeLabels(candles, candleWidth, this.plotRegion.width(), 100)\n this.plotXGrid(xLabels, xStart, xEnd)\n const yLabels = this.makeYLabels(this.candleRegion, rateStep, baseUnit, v => Doc.formatFourSigFigs(v / rFactor))\n this.plotYGrid(this.candleRegion, yLabels, this.dataExtents.y.min, this.dataExtents.y.max)\n\n // Draw the volume bars.\n const volDataExtents = new Extents(xStart, xEnd, 0, highVol)\n this.volumeRegion.plot(volDataExtents, (ctx, tools) => {\n ctx.fillStyle = this.theme.gridBorder\n for (const c of candles) {\n ctx.fillRect(tools.x(paddedStart(c)), tools.y(0), tools.w(paddedWidth), tools.h(c.matchVolume))\n }\n })\n\n // Draw the candles.\n this.candleRegion.plot(dataExtents, (ctx, tools) => {\n ctx.lineWidth = 1\n for (const c of candles) {\n const desc = c.startRate > c.endRate\n const [x, y, w, h] = [tools.x(paddedStart(c)), tools.y(c.startRate), tools.w(paddedWidth), tools.h(c.endRate - c.startRate)]\n const [high, low, cx] = [tools.y(c.highRate), tools.y(c.lowRate), w / 2 + x]\n ctx.strokeStyle = desc ? this.theme.sellLine : this.theme.buyLine\n ctx.fillStyle = desc ? this.theme.sellFill : this.theme.buyFill\n\n ctx.beginPath()\n ctx.moveTo(cx, high)\n ctx.lineTo(cx, low)\n ctx.stroke()\n\n ctx.fillRect(x, y, w, h)\n ctx.strokeRect(x, y, w, h)\n }\n })\n\n // Apply labels.\n this.plotXLabels(xLabels, xStart, xEnd, [])\n this.plotYLabels(yLabels, this.dataExtents.y.min, this.dataExtents.y.max, baseUnit)\n\n // Highlight the candle if the user mouse is over the canvas.\n if (mouseCandle) {\n const yExt = this.xRegion.extents.y\n this.xRegion.plot(new Extents(dataExtents.x.min, dataExtents.x.max, yExt.min, yExt.max), (ctx, tools) => {\n if (!mouseCandle) return // For TypeScript. Duh.\n this.applyLabelStyle()\n const rangeTxt = `${new Date(start(mouseCandle)).toLocaleString()} - ${new Date(end(mouseCandle)).toLocaleString()}`\n const [xPad, yPad] = [25, 2]\n const rangeWidth = ctx.measureText(rangeTxt).width + 2 * xPad\n const rangeHeight = 16\n let centerX = tools.x((start(mouseCandle) + end(mouseCandle)) / 2)\n let left = centerX - rangeWidth / 2\n const xExt = this.xRegion.extents.x\n if (left < xExt.min) left = xExt.min\n else if (left + rangeWidth > xExt.max) left = xExt.max - rangeWidth\n centerX = left + rangeWidth / 2\n const top = yExt.min + (this.xRegion.height() - rangeHeight) / 2\n ctx.fillStyle = this.theme.legendFill\n ctx.strokeStyle = this.theme.gridBorder\n const rectArgs: [number, number, number, number] = [left - xPad, top - yPad, rangeWidth + 2 * xPad, rangeHeight + 2 * yPad]\n ctx.fillRect(...rectArgs)\n ctx.strokeRect(...rectArgs)\n this.applyLabelStyle()\n ctx.fillText(rangeTxt, centerX, this.xRegion.extents.midY, rangeWidth)\n })\n }\n\n // Report the mouse candle.\n this.reporters.mouse(mouseCandle)\n }\n\n /* setCandles sets the candle data and redraws the chart. */\n setCandles (data: CandlesPayload, market: Market, baseUnitInfo: UnitInfo, quoteUnitInfo: UnitInfo) {\n this.data = data\n if (!data.candles) return\n this.market = market\n const [qFactor, bFactor] = [quoteUnitInfo.conventional.conversionFactor, baseUnitInfo.conventional.conversionFactor]\n this.rateConversionFactor = RateEncodingFactor * qFactor / bFactor\n let n = 25\n this.zoomLevels = []\n const maxCandles = Math.max(data.candles.length, 1000)\n while (n < maxCandles) {\n this.zoomLevels.push(n)\n n *= 2\n }\n this.numToShow = 100\n this.draw()\n }\n}\n\ninterface WaveOpts {\n message?: string\n backgroundColor?: string | boolean // true for <body> background color\n}\n\n/* Wave is a loading animation that displays a colorful line that oscillates */\nexport class Wave extends Chart {\n ani: Animation\n size: [number, number]\n region: Region\n colorShift: number\n opts: WaveOpts\n msgRegion: Region\n fontSize: number\n\n constructor (parent: HTMLElement, opts?: WaveOpts) {\n super(parent, {\n resize: () => this.resized(),\n click: (/* e: MouseEvent */) => { /* pass */ },\n zoom: (/* bigger: boolean */) => { /* pass */ }\n })\n this.canvas.classList.add('fill-abs')\n this.canvas.style.zIndex = '5'\n\n this.opts = opts ?? {}\n\n const period = 1500 // ms\n const start = Math.random() * period\n this.colorShift = Math.random() * 360\n\n // y = A*cos(k*x + theta*t + c)\n // combine three waves with different periods and speeds and phases.\n const amplitudes = [1, 0.65, 0.75]\n const ks = [3, 3, 2]\n const speeds = [Math.PI, Math.PI * 10 / 9, Math.PI / 2.5]\n const phases = [0, 0, Math.PI * 1.5]\n const n = 75\n const single = (n: number, angularX: number, angularTime: number): number => {\n return amplitudes[n] * Math.cos(ks[n] * angularX + speeds[n] * angularTime + phases[n])\n }\n const value = (x: number, angularTime: number): number => {\n const angularX = x * Math.PI * 2\n return (single(0, angularX, angularTime) + single(1, angularX, angularTime) + single(2, angularX, angularTime)) / 3\n }\n this.resize()\n this.ani = new Animation(Animation.Forever, () => {\n const angularTime = (new Date().getTime() - start) / period * Math.PI * 2\n const values = []\n for (let i = 0; i < n; i++) {\n values.push(value(i / (n - 1), angularTime))\n }\n this.drawValues(values)\n })\n }\n\n resized () {\n const opts = this.opts\n const [maxW, maxH] = [150, 100]\n const [cw, ch] = [this.canvas.width, this.canvas.height]\n let [w, h] = [cw * 0.8, ch * 0.8]\n if (w > maxW) w = maxW\n if (h > maxH) h = maxH\n let [l, t] = [(cw - w) / 2, (ch - h) / 2]\n if (opts.message) {\n this.fontSize = clamp(h * 0.15, 10, 14)\n this.applyLabelStyle(this.fontSize)\n const ypad = this.fontSize * 0.5\n const halfH = (this.fontSize / 2) + ypad\n t -= halfH\n this.msgRegion = new Region(this.ctx, new Extents(0, cw, t + h, t + h + 2 * halfH))\n }\n this.region = new Region(this.ctx, new Extents(l, l + w, t, t + h))\n }\n\n drawValues (values: number[]) {\n if (!this.region) return\n this.clear()\n const hsl = (h: number) => `hsl(${h}, 35%, 50%)`\n\n const { region, msgRegion, canvas: { width: w, height: h }, opts: { backgroundColor: bg, message: msg }, colorShift, ctx } = this\n\n if (bg) {\n if (bg === true) ctx.fillStyle = State.isDark() ? '#0a1e34' : '#f0f0f0'\n else ctx.fillStyle = bg\n ctx.fillRect(0, 0, w, h)\n }\n\n region.plot(new Extents(0, 1, -1, 1), (ctx: CanvasRenderingContext2D, t: Translator) => {\n ctx.lineWidth = 4\n ctx.lineCap = 'round'\n\n const shift = colorShift + (new Date().getTime() % 2000) / 2000 * 360 // colors move with frequency 1 / 2s\n const grad = ctx.createLinearGradient(t.x(0), 0, t.x(1), 0)\n grad.addColorStop(0, hsl(shift))\n ctx.strokeStyle = grad\n\n ctx.beginPath()\n ctx.moveTo(t.x(0), t.y(values[0]))\n for (let i = 1; i < values.length; i++) {\n const prog = i / (values.length - 1)\n grad.addColorStop(prog, hsl(prog * 300 + shift))\n ctx.lineTo(t.x(prog), t.y(values[i]))\n }\n ctx.stroke()\n })\n if (!msg) return\n msgRegion.plot(new Extents(0, 1, 0, 1), (ctx: CanvasRenderingContext2D, t: Translator) => {\n this.applyLabelStyle(this.fontSize)\n ctx.fillText(msg, t.x(0.5), t.y(0.5), this.msgRegion.width())\n })\n }\n\n render () { /* pass */ }\n\n stop () {\n this.ani.stop()\n this.canvas.remove()\n }\n}\n\n/*\n * Extents holds a min and max in both the x and y directions, and provides\n * getters for related data.\n */\nexport class Extents {\n x: MinMax\n y: MinMax\n\n constructor (xMin: number, xMax: number, yMin: number, yMax: number) {\n this.setExtents(xMin, xMax, yMin, yMax)\n }\n\n setExtents (xMin: number, xMax: number, yMin: number, yMax: number) {\n this.x = {\n min: xMin,\n max: xMax\n }\n this.y = {\n min: yMin,\n max: yMax\n }\n }\n\n get xRange (): number {\n return this.x.max - this.x.min\n }\n\n get midX (): number {\n return (this.x.max + this.x.min) / 2\n }\n\n get yRange (): number {\n return this.y.max - this.y.min\n }\n\n get midY (): number {\n return (this.y.max + this.y.min) / 2\n }\n}\n\n/*\n * Region applies an Extents to the canvas, providing utilities for coordinate\n * transformations and restricting drawing to a specified region of the canvas.\n */\nexport class Region {\n context: CanvasRenderingContext2D\n extents: Extents\n\n constructor (context: CanvasRenderingContext2D, extents: Extents) {\n this.context = context\n this.extents = extents\n }\n\n setExtents (xMin: number, xMax: number, yMin: number, yMax: number) {\n this.extents.setExtents(xMin, xMax, yMin, yMax)\n }\n\n width (): number {\n return this.extents.xRange\n }\n\n height (): number {\n return this.extents.yRange\n }\n\n contains (x: number, y: number): boolean {\n const ext = this.extents\n return (x < ext.x.max && x > ext.x.min &&\n y < ext.y.max && y > ext.y.min)\n }\n\n /*\n * A translator provides 4 function for coordinate transformations. x and y\n * translate data coordinates to canvas coordinates for the specified data\n * Extents. unx and uny translate canvas coordinates to data coordinates.\n */\n translator (dataExtents: Extents): Translator {\n const region = this.extents\n const xMin = dataExtents.x.min\n // const xMax = dataExtents.x.max\n const yMin = dataExtents.y.min\n // const yMax = dataExtents.y.max\n const yRange = dataExtents.yRange\n const xRange = dataExtents.xRange\n const screenMinX = region.x.min\n const screenW = region.x.max - screenMinX\n const screenMaxY = region.y.max\n const screenH = screenMaxY - region.y.min\n const xFactor = screenW / xRange\n const yFactor = screenH / yRange\n return {\n x: (x: number) => (x - xMin) * xFactor + screenMinX,\n y: (y: number) => screenMaxY - (y - yMin) * yFactor,\n unx: (x: number) => (x - screenMinX) / xFactor + xMin,\n uny: (y: number) => yMin - (y - screenMaxY) / yFactor,\n w: (w: number) => w / xRange * screenW,\n h: (h: number) => -h / yRange * screenH\n }\n }\n\n /* clear clears the region. */\n clear () {\n const ext = this.extents\n this.context.clearRect(ext.x.min, ext.y.min, ext.xRange, ext.yRange)\n }\n\n /* plot prepares tools for drawing using data coordinates. */\n plot (dataExtents: Extents, drawFunc: (ctx: CanvasRenderingContext2D, tools: Translator) => void, skipMask?: boolean) {\n const ctx = this.context\n const region = this.extents\n ctx.save() // Save the original state\n if (!skipMask) {\n ctx.beginPath()\n ctx.rect(region.x.min, region.y.min, region.xRange, region.yRange)\n ctx.clip()\n }\n\n // The drawFunc will be passed a set of tool that can be used to assist\n // drawing. The tools start with the transformation functions.\n const tools = this.translator(dataExtents)\n\n // Create a transformation that allows drawing in data coordinates. It's\n // not advisable to stroke or add text with this transform in place, as the\n // result will be distorted. You can however use ctx.moveTo and ctx.lineTo\n // with this transform in place using data coordinates, and remove the\n // transform before stroking. The dataCoords method of the supplied tool\n // provides this functionality.\n\n // TODO: Figure out why this doesn't work on WebView.\n // const yRange = dataExtents.yRange\n // const xFactor = region.xRange / dataExtents.xRange\n // const yFactor = region.yRange / yRange\n // const xMin = dataExtents.x.min\n // const yMin = dataExtents.y.min\n // // These translation factors are complicated because the (0, 0) of the\n // // region is not necessarily the (0, 0) of the canvas.\n // const tx = (region.x.min + xMin) - xMin * xFactor\n // const ty = -region.y.min - (yRange - yMin) * yFactor\n // const setTransform = () => {\n // // Data coordinates are flipped about y. Flip the coordinates and\n // // translate top left corner to canvas (0, 0).\n // ctx.transform(1, 0, 0, -1, -xMin, yMin)\n // // Scale to data coordinates and shift into place for the region's offset\n // // on the canvas.\n // ctx.transform(xFactor, 0, 0, yFactor, tx, ty)\n // }\n // // dataCoords allows some drawing to be performed directly in data\n // // coordinates. Most actual drawing functions like ctx.stroke and\n // // ctx.fillRect should not be called from inside dataCoords, but\n // // ctx.moveTo and ctx.LineTo are fine.\n // tools.dataCoords = f => {\n // ctx.save()\n // setTransform()\n // f()\n // ctx.restore()\n // }\n\n drawFunc(this.context, tools)\n ctx.restore()\n }\n}\n\n/*\n * makeLabels attempts to create the appropriate labels for the specified\n * screen size, context, and label spacing.\n */\nfunction makeLabels (\n ctx: CanvasRenderingContext2D,\n screenW: number,\n min: number,\n max: number,\n spacingGuess: number,\n step: number,\n unit: string,\n valFmt?: (v: number) => string\n): LabelSet {\n valFmt = valFmt || Doc.formatFourSigFigs\n const n = screenW / spacingGuess\n const diff = max - min\n if (n < 1 || diff <= 0) return { lbls: [] }\n const tickGuess = diff / n\n // make the tick spacing a multiple of the step\n const tick = tickGuess + step - (tickGuess % step)\n let x = min + tick - (min % tick)\n const absMax = Math.max(Math.abs(max), Math.abs(min))\n // The Math.round part is the minimum precision required to see the change in the numbers.\n // The 2 accounts for the precision of the tick.\n const sigFigs = Math.round(Math.log10(absMax / tick)) + 2\n const pts: Label[] = []\n let widest = 0\n while (x < max) {\n x = Number(x.toPrecision(sigFigs))\n const lbl = valFmt(x)\n widest = Math.max(widest, ctx.measureText(lbl).width)\n pts.push({\n val: x,\n txt: lbl\n })\n x += tick\n }\n const unitW = ctx.measureText(unit).width\n if (unitW > widest) widest = unitW\n return {\n widest: widest,\n lbls: pts\n }\n}\n\nconst months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec']\n\n/* makeCandleTimeLabels prepares labels for candlestick data. */\nfunction makeCandleTimeLabels (candles: Candle[], dur: number, screenW: number, spacingGuess: number): LabelSet {\n const first = candles[0]\n const last = candles[candles.length - 1]\n const start = truncate(first.endStamp, dur)\n const end = truncate(last.endStamp, dur) + dur\n const diff = end - start\n const n = Math.min(candles.length, screenW / spacingGuess)\n const tick = truncate(diff / n, dur)\n if (tick === 0) {\n console.error('zero tick', dur, diff, n) // probably won't happen, but it'd suck if it did\n return { lbls: [] }\n }\n let x = start\n const zoneOffset = new Date().getTimezoneOffset()\n const dayStamp = (x: number) => {\n x = x - zoneOffset * 60000\n return x - (x % 86400000)\n }\n let lastDay = dayStamp(start)\n let lastYear = 0 // new Date(start).getFullYear()\n if (dayStamp(first.endStamp) === dayStamp(last.endStamp)) lastDay = 0 // Force at least one day stamp.\n const pts = []\n let label\n if (dur < 86400000) {\n label = (d: Date, x: number) => {\n const day = dayStamp(x)\n if (day !== lastDay) return `${months[d.getMonth()]}${d.getDate()} ${d.getHours()}:${String(d.getMinutes()).padStart(2, '0')}`\n else return `${d.getHours()}:${String(d.getMinutes()).padStart(2, '0')}`\n }\n } else {\n label = (d: Date) => {\n const year = d.getFullYear()\n if (year !== lastYear) return `${months[d.getMonth()]}${d.getDate()} '${String(year).slice(2, 4)}`\n else return `${months[d.getMonth()]}${d.getDate()}`\n }\n }\n while (x <= end) {\n const d = new Date(x)\n pts.push({\n val: x,\n txt: label(d, x)\n })\n lastDay = dayStamp(x)\n lastYear = d.getFullYear()\n x += tick\n }\n return { lbls: pts }\n}\n\n/* The last element of an array. */\nfunction last (arr: any[]): any {\n return arr[arr.length - 1]\n}\n\n/* line draws a line with the provided context. */\nfunction line (ctx: CanvasRenderingContext2D, x0: number, y0: number, x1: number, y1: number, skipStroke?: boolean) {\n ctx.beginPath()\n ctx.moveTo(x0, y0)\n ctx.lineTo(x1, y1)\n if (!skipStroke) ctx.stroke()\n}\n\n/* dot draws a circle with the provided context. */\nfunction dot (ctx: CanvasRenderingContext2D, x: number, y: number, color: string, radius: number) {\n ctx.fillStyle = color\n ctx.beginPath()\n ctx.arc(x, y, radius, 0, PIPI)\n ctx.fill()\n}\n\n/* floatCompare compares two floats to within a tolerance of 1e-8. */\nfunction floatCompare (a: number, b: number) {\n return withinTolerance(a, b, 1e-8)\n}\n\n/*\n * withinTolerance returns true if the difference between a and b are with\n * the specified tolerance.\n */\nfunction withinTolerance (a: number, b: number, tolerance: number) {\n return Math.abs(a - b) < Math.abs(tolerance)\n}\n\nfunction truncate (v: number, w: number): number {\n return v - (v % w)\n}\n","import Doc from './doc'\nimport {\n OrderTypeLimit,\n OrderTypeMarket,\n OrderTypeCancel,\n StatusEpoch,\n StatusBooked,\n RateEncodingFactor,\n MatchSideMaker,\n MakerRedeemed,\n TakerSwapCast,\n ImmediateTiF\n} from './orderutil'\nimport {\n app,\n PageElement,\n ExchangeAuth,\n Order,\n Market\n} from './registry'\n\nexport const bondReserveMultiplier = 2 // Reserves for next bond\nexport const perTierBaseParcelLimit = 2\nexport const parcelLimitScoreMultiplier = 3\n\nexport class ReputationMeter {\n page: Record<string, PageElement>\n host: string\n\n constructor (div: PageElement) {\n this.page = Doc.parseTemplate(div)\n Doc.cleanTemplates(this.page.penaltyMarkerTmpl)\n }\n\n setHost (host: string) {\n this.host = host\n }\n\n update () {\n const { page, host } = this\n const { auth, maxScore, penaltyThreshold } = app().exchanges[host]\n const { rep: { score } } = auth\n\n const displayTier = strongTier(auth)\n\n const minScore = displayTier ? displayTier * penaltyThreshold * -1 : penaltyThreshold * -1 // Just for looks\n const warnPct = 25\n const scorePct = 100 - warnPct\n page.scoreWarn.style.width = `${warnPct}%`\n const pos = score >= 0 ? warnPct + (score / maxScore) * scorePct : warnPct - (Math.min(warnPct, score / minScore * warnPct))\n\n page.scorePointer.style.left = `${pos}%`\n page.scoreMin.textContent = String(minScore)\n page.scoreMax.textContent = String(maxScore)\n const bonus = limitBonus(score, maxScore)\n page.limitBonus.textContent = bonus.toFixed(1)\n for (const m of Doc.applySelector(page.scoreTray, '.penalty-marker')) m.remove()\n if (displayTier > 1) {\n const markerPct = warnPct / displayTier\n for (let i = 1; i < displayTier; i++) {\n const div = page.penaltyMarkerTmpl.cloneNode(true) as PageElement\n page.scoreTray.appendChild(div)\n div.style.left = `${markerPct * i}%`\n }\n }\n page.score.textContent = String(score)\n page.scoreData.classList.remove('negative', 'positive')\n if (score > 0) page.scoreData.classList.add('positive')\n else page.scoreData.classList.add('negative')\n }\n}\n\n/*\n * strongTier is the effective tier, with some respect for bond overlap, such\n * that we don't count weak bonds that have already had their replacements\n * confirmed.\n */\nexport function strongTier (auth: ExchangeAuth): number {\n const { weakStrength, targetTier, effectiveTier } = auth\n if (effectiveTier > targetTier) {\n const diff = effectiveTier - targetTier\n if (weakStrength >= diff) return targetTier\n return targetTier + (diff - weakStrength)\n }\n return effectiveTier\n}\n\nexport function likelyTaker (ord: Order, rate: number): boolean {\n if (ord.type === OrderTypeMarket || ord.tif === ImmediateTiF) return true\n // Must cross the spread to be a taker (not so conservative).\n if (rate === 0) return false\n if (ord.sell) return ord.rate < rate\n return ord.rate > rate\n}\n\nconst preparcelQuantity = (ord: Order, mkt?: Market, midGap?: number) => {\n const qty = ord.qty - ord.filled\n if (ord.type === OrderTypeLimit) return qty\n if (ord.sell) return qty * ord.rate / RateEncodingFactor\n const rate = midGap || mkt?.spot?.rate || 0\n // Caller should not call this for market orders without a mkt arg.\n if (!mkt) return 0\n // This is tricky. The server will use the mid-gap rate to convert the\n // order qty. We don't have a mid-gap rate, only a spot rate.\n if (rate && (mkt?.spot?.bookVolume || 0) > 0) return qty * RateEncodingFactor / rate\n return mkt.lotsize // server uses same fallback if book is empty\n}\n\nexport function epochWeight (ord: Order, mkt: Market, midGap?: number) {\n if (ord.status !== StatusEpoch) return 0\n const qty = preparcelQuantity(ord, mkt, midGap)\n const rate = midGap || mkt.spot?.rate || 0\n if (likelyTaker(ord, rate)) return qty * 2\n return qty\n}\n\nfunction bookWeight (ord: Order) {\n if (ord.status !== StatusBooked) return 0\n return preparcelQuantity(ord)\n}\n\nfunction settlingWeight (ord: Order) {\n let sum = 0\n for (const m of (ord.matches || [])) {\n if (m.side === MatchSideMaker) {\n if (m.status > MakerRedeemed) continue\n } else if (m.status > TakerSwapCast) continue\n sum += m.qty\n }\n return sum\n}\n\nfunction parcelWeight (ord: Order, mkt: Market, midGap?: number) {\n if (ord.type === OrderTypeCancel) return 0\n return epochWeight(ord, mkt, midGap) + bookWeight(ord) + settlingWeight(ord)\n}\n\n// function roundParcels (p: number): number {\n// return Math.floor(Math.round((p * 1e8)) / 1e8)\n// }\n\nfunction limitBonus (score: number, maxScore: number): number {\n return score > 0 ? 1 + score / maxScore * (parcelLimitScoreMultiplier - 1) : 1\n}\n\nexport function tradingLimits (host: string): [number, number] { // [usedParcels, parcelLimit]\n const { auth, maxScore, markets } = app().exchanges[host]\n const { rep: { score } } = auth\n const tier = strongTier(auth)\n\n let usedParcels = 0\n for (const mkt of Object.values(markets)) {\n let mktWeight = 0\n for (const ord of (mkt.inflight || [])) mktWeight += parcelWeight(ord, mkt)\n for (const ord of (mkt.orders || [])) mktWeight += parcelWeight(ord, mkt)\n usedParcels += (mktWeight / (mkt.parcelsize * mkt.lotsize))\n }\n const parcelLimit = perTierBaseParcelLimit * limitBonus(score, maxScore) * tier\n return [usedParcels, parcelLimit]\n}\n","import {\n app,\n PageElement\n} from './registry'\nimport * as intl from './locales'\n\nexport const Mainnet = 0\nexport const Testnet = 1\nexport const Simnet = 2\n\nconst coinIDTakerFoundMakerRedemption = 'TakerFoundMakerRedemption:'\n\n/* ethBasedExplorerArg returns the explorer argument for ETH, ERC20 and EVM\nCompatible assets and whether the return value is an address. */\nfunction ethBasedExplorerArg (cid: string): [string, boolean] {\n if (cid.startsWith(coinIDTakerFoundMakerRedemption)) return [cid.substring(coinIDTakerFoundMakerRedemption.length), true]\n else if (cid.length === 42) return [cid, true]\n else return [cid, false]\n}\n\nconst ethExplorers: Record<number, (cid: string) => string> = {\n [Mainnet]: (cid: string) => {\n const [arg, isAddr] = ethBasedExplorerArg(cid)\n return isAddr ? `https://etherscan.io/address/${arg}` : `https://etherscan.io/tx/${arg}`\n },\n [Testnet]: (cid: string) => {\n const [arg, isAddr] = ethBasedExplorerArg(cid)\n return isAddr ? `https://sepolia.etherscan.io/address/${arg}` : `https://sepolia.etherscan.io/tx/${arg}`\n },\n [Simnet]: (cid: string) => {\n const [arg, isAddr] = ethBasedExplorerArg(cid)\n return isAddr ? `https://etherscan.io/address/${arg}` : `https://etherscan.io/tx/${arg}`\n }\n}\n\nconst polygonExplorers: Record<number, (cid: string) => string> = {\n [Mainnet]: (cid: string) => {\n const [arg, isAddr] = ethBasedExplorerArg(cid)\n return isAddr ? `https://polygonscan.com/address/${arg}` : `https://polygonscan.com/tx/${arg}`\n },\n [Testnet]: (cid: string) => {\n const [arg, isAddr] = ethBasedExplorerArg(cid)\n return isAddr ? `https://amoy.polygonscan.com/address/${arg}` : `https://amoy.polygonscan.com/tx/${arg}`\n },\n [Simnet]: (cid: string) => {\n const [arg, isAddr] = ethBasedExplorerArg(cid)\n return isAddr ? `https://polygonscan.com/address/${arg}` : `https://polygonscan.com/tx/${arg}`\n }\n}\n\nexport const CoinExplorers: Record<number, Record<number, (cid: string) => string>> = {\n 42: { // dcr\n [Mainnet]: (cid: string) => {\n const [txid, vout] = cid.split(':')\n if (vout !== undefined) return `https://explorer.dcrdata.org/tx/${txid}/out/${vout}`\n return `https://explorer.dcrdata.org/tx/${txid}`\n },\n [Testnet]: (cid: string) => {\n const [txid, vout] = cid.split(':')\n if (vout !== undefined) return `https://testnet.dcrdata.org/tx/${txid}/out/${vout}`\n return `https://testnet.dcrdata.org/tx/${txid}`\n },\n [Simnet]: (cid: string) => {\n const [txid, vout] = cid.split(':')\n if (vout !== undefined) return `http://127.0.0.1:17779/tx/${txid}/out/${vout}`\n return `https://127.0.0.1:17779/tx/${txid}`\n }\n },\n 0: { // btc\n [Mainnet]: (cid: string) => `https://mempool.space/tx/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://mempool.space/testnet/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://mempool.space/tx/${cid.split(':')[0]}`\n },\n 2: { // ltc\n [Mainnet]: (cid: string) => `https://ltc.bitaps.com/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://sochain.com/tx/LTCTEST/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://ltc.bitaps.com/${cid.split(':')[0]}`\n },\n 20: { // dgb\n [Mainnet]: (cid: string) => `https://digiexplorer.info/tx/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://testnetexplorer.digibyteservers.io/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://digiexplorer.info/tx/${cid.split(':')[0]}`\n },\n 60: ethExplorers,\n 60001: ethExplorers,\n 60002: ethExplorers,\n 3: { // doge\n [Mainnet]: (cid: string) => `https://dogeblocks.com/tx/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://blockexplorer.one/dogecoin/testnet/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://dogeblocks.com/tx/${cid.split(':')[0]}`\n },\n 5: { // dash\n [Mainnet]: (cid: string) => `https://blockexplorer.one/dash/mainnet/tx/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://blockexplorer.one/dash/testnet/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://blockexplorer.one/dash/mainnet/tx/${cid.split(':')[0]}`\n },\n 133: { // zec\n [Mainnet]: (cid: string) => `https://zcashblockexplorer.com/transactions/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://blockexplorer.one/zcash/testnet/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://zcashblockexplorer.com/transactions/${cid.split(':')[0]}`\n },\n 147: { // zcl\n [Mainnet]: (cid: string) => `https://explorer.zcl.zelcore.io/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://explorer.zcl.zelcore.io/tx/${cid.split(':')[0]}`\n },\n 136: { // firo\n [Mainnet]: (cid: string) => `https://explorer.firo.org/tx/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://testexplorer.firo.org/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://explorer.firo.org/tx/${cid.split(':')[0]}`\n },\n 145: { // bch\n [Mainnet]: (cid: string) => `https://bch.loping.net/tx/${cid.split(':')[0]}`,\n [Testnet]: (cid: string) => `https://tbch4.loping.net/tx/${cid.split(':')[0]}`,\n [Simnet]: (cid: string) => `https://bch.loping.net/tx/${cid.split(':')[0]}`\n },\n 966: polygonExplorers,\n 966001: polygonExplorers,\n 966002: polygonExplorers,\n 966003: polygonExplorers,\n 966004: polygonExplorers\n}\n\nexport function formatCoinID (cid: string) {\n if (cid.startsWith(coinIDTakerFoundMakerRedemption)) {\n const makerAddr = cid.substring(coinIDTakerFoundMakerRedemption.length)\n return intl.prep(intl.ID_TAKER_FOUND_MAKER_REDEMPTION, { makerAddr: makerAddr })\n }\n return cid\n}\n\n/*\n * baseChainID returns the asset ID for the asset's parent if the asset is a\n * token, otherwise the ID for the asset itself.\n */\nfunction baseChainID (assetID: number) {\n const asset = app().user.assets[assetID]\n return asset.token ? asset.token.parentID : assetID\n}\n\n/*\n * setCoinHref sets the hyperlink element's href attribute based on provided\n * assetID and data-explorer-coin value present on supplied link element.\n */\nexport function setCoinHref (assetID: number, link: PageElement) {\n const net = app().user.net\n const assetExplorer = CoinExplorers[baseChainID(assetID)]\n if (!assetExplorer) return\n const formatter = assetExplorer[net]\n if (!formatter) return\n link.classList.remove('plainlink')\n link.classList.add('subtlelink')\n link.href = formatter(link.dataset.explorerCoin || '')\n}\n","import {\n app,\n PageElement,\n BotConfig,\n MMBotStatus,\n CEXConfig,\n MarketMakingStatus,\n ExchangeBalance,\n RunStats,\n StartConfig,\n MarketWithHost,\n RunningBotInventory,\n Spot,\n OrderPlacement,\n Token,\n UnitInfo,\n MarketReport,\n BotBalanceAllocation,\n ProjectedAlloc,\n BalanceNote,\n BotBalance,\n Order,\n LotFeeRange,\n BookingFees,\n BotProblems,\n EpochReportNote,\n OrderReport,\n EpochReport,\n TradePlacement,\n SupportedAsset,\n CEXProblemsNote,\n CEXProblems\n} from './registry'\nimport { getJSON, postJSON } from './http'\nimport Doc, { clamp } from './doc'\nimport * as OrderUtil from './orderutil'\nimport { Chart, Region, Extents, Translator } from './charts'\nimport * as intl from './locales'\nimport { Forms } from './forms'\n\nexport const GapStrategyMultiplier = 'multiplier'\nexport const GapStrategyAbsolute = 'absolute'\nexport const GapStrategyAbsolutePlus = 'absolute-plus'\nexport const GapStrategyPercent = 'percent'\nexport const GapStrategyPercentPlus = 'percent-plus'\n\nexport const botTypeBasicMM = 'basicMM'\nexport const botTypeArbMM = 'arbMM'\nexport const botTypeBasicArb = 'basicArb'\n\nexport interface CEXDisplayInfo {\n name: string\n logo: string\n}\n\nexport const CEXDisplayInfos: Record<string, CEXDisplayInfo> = {\n 'Binance': {\n name: 'Binance',\n logo: '/img/binance.com.png'\n },\n 'BinanceUS': {\n name: 'Binance U.S.',\n logo: '/img/binance.us.png'\n }\n}\n\n/*\n * MarketMakerBot is the front end representation of the server's\n * mm.MarketMaker. MarketMakerBot is a singleton assigned to MM below.\n */\nclass MarketMakerBot {\n cexBalanceCache: Record<string, Record<number, ExchangeBalance>> = {}\n\n /*\n * updateBotConfig appends or updates the specified BotConfig.\n */\n async updateBotConfig (cfg: BotConfig) {\n return postJSON('/api/updatebotconfig', cfg)\n }\n\n /*\n * updateCEXConfig appends or updates the specified CEXConfig.\n */\n async updateCEXConfig (cfg: CEXConfig) {\n return postJSON('/api/updatecexconfig', cfg)\n }\n\n async removeBotConfig (host: string, baseID: number, quoteID: number) {\n return postJSON('/api/removebotconfig', { host, baseID, quoteID })\n }\n\n async report (host: string, baseID: number, quoteID: number) {\n return postJSON('/api/marketreport', { host, baseID, quoteID })\n }\n\n async startBot (config: StartConfig) {\n return await postJSON('/api/startmarketmakingbot', { config })\n }\n\n async stopBot (market: MarketWithHost) : Promise<void> {\n await postJSON('/api/stopmarketmakingbot', { market })\n }\n\n async status () : Promise<MarketMakingStatus> {\n return (await getJSON('/api/marketmakingstatus')).status\n }\n\n // botStats returns the RunStats for a running bot with the specified parameters.\n botStats (baseID: number, quoteID: number, host: string, startTime: number): RunStats | undefined {\n for (const botStatus of Object.values(app().mmStatus.bots)) {\n if (!botStatus.runStats) continue\n const runStats = botStatus.runStats\n const cfg = botStatus.config\n if (cfg.baseID === baseID && cfg.quoteID === quoteID && cfg.host === host && runStats.startTime === startTime) {\n return runStats\n }\n }\n }\n\n cachedCexBalance (cexName: string, assetID: number): ExchangeBalance | undefined {\n return this.cexBalanceCache[cexName]?.[assetID]\n }\n\n async cexBalance (cexName: string, assetID: number): Promise<ExchangeBalance> {\n if (!this.cexBalanceCache[cexName]) this.cexBalanceCache[cexName] = {}\n const cexBalance = (await postJSON('/api/cexbalance', { cexName, assetID })).cexBalance\n this.cexBalanceCache[cexName][assetID] = cexBalance\n return cexBalance\n }\n}\n\n// MM is the front end representation of the server's mm.MarketMaker.\nexport const MM = new MarketMakerBot()\n\nexport function runningBotInventory (assetID: number): RunningBotInventory {\n return app().mmStatus.bots.reduce((v, { runStats, running }) => {\n if (!running || !runStats) return v\n const { dexBalances: d, cexBalances: c } = runStats\n v.cex.locked += c[assetID]?.locked ?? 0\n v.cex.locked += c[assetID]?.reserved ?? 0\n v.cex.avail += c[assetID]?.available ?? 0\n v.cex.total = v.cex.avail + v.cex.locked\n v.dex.locked += d[assetID]?.locked ?? 0\n v.dex.locked += d[assetID]?.reserved ?? 0\n v.dex.avail += d[assetID]?.available ?? 0\n v.dex.total = v.dex.avail + v.dex.locked\n v.avail += (d[assetID]?.available ?? 0) + (c[assetID]?.available ?? 0)\n v.locked += (d[assetID]?.locked ?? 0) + (c[assetID]?.locked ?? 0)\n return v\n }, { avail: 0, locked: 0, cex: { avail: 0, locked: 0, total: 0 }, dex: { avail: 0, locked: 0, total: 0 } })\n}\n\nexport function setMarketElements (ancestor: PageElement, baseID: number, quoteID: number, host: string) {\n Doc.setText(ancestor, '[data-host]', host)\n const { unitInfo: bui, name: baseName, symbol: baseSymbol, token: baseToken } = app().assets[baseID]\n Doc.setText(ancestor, '[data-base-name]', baseName)\n Doc.setSrc(ancestor, '[data-base-logo]', Doc.logoPath(baseSymbol))\n Doc.setText(ancestor, '[data-base-ticker]', bui.conventional.unit)\n const { unitInfo: baseFeeUI, name: baseFeeName, symbol: baseFeeSymbol } = app().assets[baseToken ? baseToken.parentID : baseID]\n Doc.setText(ancestor, '[data-base-fee-name]', baseFeeName)\n Doc.setSrc(ancestor, '[data-base-fee-logo]', Doc.logoPath(baseFeeSymbol))\n Doc.setText(ancestor, '[data-base-fee-ticker]', baseFeeUI.conventional.unit)\n const { unitInfo: qui, name: quoteName, symbol: quoteSymbol, token: quoteToken } = app().assets[quoteID]\n Doc.setText(ancestor, '[data-quote-name]', quoteName)\n Doc.setSrc(ancestor, '[data-quote-logo]', Doc.logoPath(quoteSymbol))\n Doc.setText(ancestor, '[data-quote-ticker]', qui.conventional.unit)\n const { unitInfo: quoteFeeUI, name: quoteFeeName, symbol: quoteFeeSymbol } = app().assets[quoteToken ? quoteToken.parentID : quoteID]\n Doc.setText(ancestor, '[data-quote-fee-name]', quoteFeeName)\n Doc.setSrc(ancestor, '[data-quote-fee-logo]', Doc.logoPath(quoteFeeSymbol))\n Doc.setText(ancestor, '[data-quote-fee-ticker]', quoteFeeUI.conventional.unit)\n}\n\nexport function setCexElements (ancestor: PageElement, cexName: string) {\n const dinfo = CEXDisplayInfos[cexName]\n Doc.setText(ancestor, '[data-cex-name]', dinfo.name)\n Doc.setSrc(ancestor, '[data-cex-logo]', dinfo.logo)\n for (const img of Doc.applySelector(ancestor, '[data-cex-logo]')) Doc.show(img)\n}\n\nexport function calculateQuoteLot (lotSize: number, baseID: number, quoteID: number, spot?: Spot) {\n const baseRate = app().fiatRatesMap[baseID]\n const quoteRate = app().fiatRatesMap[quoteID]\n const { unitInfo: { conventional: { conversionFactor: bFactor } } } = app().assets[baseID]\n const { unitInfo: { conventional: { conversionFactor: qFactor } } } = app().assets[quoteID]\n if (baseRate && quoteRate) {\n return lotSize * baseRate / quoteRate * qFactor / bFactor\n } else if (spot) {\n return lotSize * spot.rate / OrderUtil.RateEncodingFactor\n }\n return qFactor\n}\n\nexport interface PlacementChartConfig {\n cexName: string\n botType: string\n baseFiatRate: number\n dict: {\n profit: number\n buyPlacements: OrderPlacement[]\n sellPlacements: OrderPlacement[]\n }\n}\n\nexport class PlacementsChart extends Chart {\n cfg: PlacementChartConfig\n loadedCEX: string\n cexLogo: HTMLImageElement\n\n constructor (parent: PageElement) {\n super(parent, {\n resize: () => this.resized(),\n click: (/* e: MouseEvent */) => { /* pass */ },\n zoom: (/* bigger: boolean */) => { /* pass */ }\n })\n }\n\n resized () {\n this.render()\n }\n\n draw () { /* pass */ }\n\n setMarket (cfg: PlacementChartConfig) {\n this.cfg = cfg\n const { loadedCEX, cfg: { cexName } } = this\n if (cexName && cexName !== loadedCEX) {\n this.loadedCEX = cexName\n this.cexLogo = new Image()\n Doc.bind(this.cexLogo, 'load', () => { this.render() })\n this.cexLogo.src = CEXDisplayInfos[cexName || ''].logo\n }\n this.render()\n }\n\n render () {\n const { ctx, canvas, theme, cfg } = this\n if (canvas.width === 0 || !cfg) return\n const { dict: { buyPlacements, sellPlacements, profit }, baseFiatRate, botType } = cfg\n if (botType === botTypeBasicArb) return\n\n this.clear()\n\n const drawDashedLine = (x0: number, y0: number, x1: number, y1: number, color: string) => {\n ctx.save()\n ctx.setLineDash([3, 5])\n ctx.lineWidth = 1.5\n ctx.strokeStyle = color\n this.line(x0, y0, x1, y1)\n ctx.restore()\n }\n\n const isBasicMM = botType === botTypeBasicMM\n const cx = canvas.width / 2\n const [cexGapL, cexGapR] = isBasicMM ? [cx, cx] : [0.48 * canvas.width, 0.52 * canvas.width]\n\n const buyLots = buyPlacements.reduce((v: number, p: OrderPlacement) => v + p.lots, 0)\n const sellLots = sellPlacements.reduce((v: number, p: OrderPlacement) => v + p.lots, 0)\n const maxLots = Math.max(buyLots, sellLots)\n\n let widest = 0\n let fauxSpacer = 0\n if (isBasicMM) {\n const leftmost = buyPlacements.reduce((v: number, p: OrderPlacement) => Math.max(v, p.gapFactor), 0)\n const rightmost = sellPlacements.reduce((v: number, p: OrderPlacement) => Math.max(v, p.gapFactor), 0)\n widest = Math.max(leftmost, rightmost)\n } else {\n // For arb-mm, we don't know how the orders will be spaced because it\n // depends on the vwap. But we're just trying to capture the general sense\n // of how the parameters will affect order placement, so we'll fake it.\n // Higher match buffer values will lead to orders with less favorable\n // rates, e.g. the spacing will be larger.\n const ps = [...buyPlacements, ...sellPlacements]\n const matchBuffer = ps.reduce((sum: number, p: OrderPlacement) => sum + p.gapFactor, 0) / ps.length\n fauxSpacer = 0.01 * (1 + matchBuffer)\n widest = Math.min(10, Math.max(buyPlacements.length, sellPlacements.length)) * fauxSpacer // arb-mm\n }\n\n // Make the range 15% on each side, which will include profit + placements,\n // unless they have orders with larger gap factors.\n const minRange = profit + widest\n const defaultRange = 0.155\n const range = Math.max(minRange * 1.05, defaultRange)\n\n // Increase data height logarithmically up to 1,000,000 USD.\n const maxCommitUSD = maxLots * baseFiatRate\n const regionHeight = 0.2 + 0.7 * Math.log(clamp(maxCommitUSD, 0, 1e6)) / Math.log(1e6)\n\n // Draw a region in the middle representing the cex gap.\n const plotRegion = new Region(ctx, new Extents(0, canvas.width, 0, canvas.height))\n\n if (isBasicMM) {\n drawDashedLine(cx, 0, cx, canvas.height, theme.gapLine)\n } else { // arb-mm\n plotRegion.plot(new Extents(0, 1, 0, 1), (ctx: CanvasRenderingContext2D, tools: Translator) => {\n const [y0, y1] = [tools.y(0), tools.y(1)]\n drawDashedLine(cexGapL, y0, cexGapL, y1, theme.gapLine)\n drawDashedLine(cexGapR, y0, cexGapR, y1, theme.gapLine)\n const y = tools.y(0.95)\n ctx.drawImage(this.cexLogo, cx - 8, y, 16, 16)\n this.applyLabelStyle(18)\n ctx.fillText('δ', cx, y + 29)\n })\n }\n\n const plotSide = (isBuy: boolean, placements: OrderPlacement[]) => {\n if (!placements?.length) return\n const [xMin, xMax] = isBuy ? [0, cexGapL] : [cexGapR, canvas.width]\n const reg = new Region(ctx, new Extents(xMin, xMax, canvas.height * (1 - regionHeight), canvas.height))\n const [l, r] = isBuy ? [-range, 0] : [0, range]\n reg.plot(new Extents(l, r, 0, maxLots), (ctx: CanvasRenderingContext2D, tools: Translator) => {\n ctx.lineWidth = 2.5\n ctx.strokeStyle = isBuy ? theme.buyLine : theme.sellLine\n ctx.fillStyle = isBuy ? theme.buyFill : theme.sellFill\n ctx.beginPath()\n const sideFactor = isBuy ? -1 : 1\n const firstPt = placements[0]\n const y0 = tools.y(0)\n const firstX = tools.x((isBasicMM ? firstPt.gapFactor : profit + fauxSpacer) * sideFactor)\n ctx.moveTo(firstX, y0)\n let cumulativeLots = 0\n for (let i = 0; i < placements.length; i++) {\n const p = placements[i]\n // For arb-mm, we don't know exactly\n const rawX = isBasicMM ? p.gapFactor : profit + (i + 1) * fauxSpacer\n const x = tools.x(rawX * sideFactor)\n ctx.lineTo(x, tools.y(cumulativeLots))\n cumulativeLots += p.lots\n ctx.lineTo(x, tools.y(cumulativeLots))\n }\n const xInfinity = isBuy ? canvas.width * -0.1 : canvas.width * 1.1\n ctx.lineTo(xInfinity, tools.y(cumulativeLots))\n ctx.stroke()\n ctx.lineTo(xInfinity, y0)\n ctx.lineTo(firstX, y0)\n ctx.closePath()\n ctx.globalAlpha = 0.25\n ctx.fill()\n }, true)\n }\n\n plotSide(false, sellPlacements)\n plotSide(true, buyPlacements)\n }\n}\n\nexport function hostedMarketID (host: string, baseID: number, quoteID: number) {\n return `${host}-${baseID}-${quoteID}` // same as MarketWithHost.String()\n}\n\nexport function liveBotConfig (host: string, baseID: number, quoteID: number): BotConfig | undefined {\n const s = liveBotStatus(host, baseID, quoteID)\n if (s) return s.config\n}\n\nexport function liveBotStatus (host: string, baseID: number, quoteID: number): MMBotStatus | undefined {\n const statuses = (app().mmStatus.bots || []).filter((s: MMBotStatus) => {\n return s.config.baseID === baseID && s.config.quoteID === quoteID && s.config.host === host\n })\n if (statuses.length) return statuses[0]\n}\n\ninterface Lotter {\n lots: number\n}\n\nfunction sumLots (lots: number, p: Lotter) {\n return lots + p.lots\n}\n\ninterface AllocationProjection {\n bProj: ProjectedAlloc\n qProj: ProjectedAlloc\n alloc: Record<number, number>\n}\n\nfunction emptyProjection (): ProjectedAlloc {\n return { book: 0, bookingFees: 0, swapFeeReserves: 0, cex: 0, orderReserves: 0, slippageBuffer: 0 }\n}\n\nexport class BotMarket {\n cfg: BotConfig\n host: string\n baseID: number\n baseSymbol: string\n baseTicker: string\n baseFeeID: number\n baseIsAccountLocker: boolean\n baseFeeSymbol: string\n baseFeeTicker: string\n baseToken?: Token\n quoteID: number\n quoteSymbol: string\n quoteTicker: string\n quoteFeeID: number\n quoteIsAccountLocker: boolean\n quoteFeeSymbol: string\n quoteFeeTicker: string\n quoteToken?: Token\n botType: string\n cexName: string\n dinfo: CEXDisplayInfo\n alloc: BotBalanceAllocation\n proj: AllocationProjection\n bui: UnitInfo\n baseFactor: number\n baseFeeUI: UnitInfo\n baseFeeFactor: number\n qui: UnitInfo\n quoteFactor: number\n quoteFeeUI: UnitInfo\n quoteFeeFactor: number\n id: string // includes host\n mktID: string\n lotSize: number\n lotSizeConv: number\n lotSizeUSD: number\n quoteLot: number\n quoteLotConv: number\n quoteLotUSD: number\n rateStep: number\n baseFeeFiatRate: number\n quoteFeeFiatRate: number\n baseLots: number\n quoteLots: number\n marketReport: MarketReport\n nBuyPlacements: number\n nSellPlacements: number\n\n constructor (cfg: BotConfig) {\n const host = this.host = cfg.host\n const baseID = this.baseID = cfg.baseID\n const quoteID = this.quoteID = cfg.quoteID\n this.cexName = cfg.cexName\n const status = app().mmStatus.bots.find(({ config: c }: MMBotStatus) => c.baseID === baseID && c.quoteID === quoteID && c.host === host)\n if (!status) throw Error('where\\'s the bot status?')\n this.cfg = status.config\n\n const { token: baseToken, symbol: baseSymbol, unitInfo: bui } = app().assets[baseID]\n this.baseSymbol = baseSymbol\n this.baseTicker = bui.conventional.unit\n this.bui = bui\n this.baseFactor = bui.conventional.conversionFactor\n this.baseToken = baseToken\n const baseFeeID = this.baseFeeID = baseToken ? baseToken.parentID : baseID\n const { unitInfo: baseFeeUI, symbol: baseFeeSymbol, wallet: baseWallet } = app().assets[this.baseFeeID]\n const traitAccountLocker = 1 << 14\n this.baseIsAccountLocker = (baseWallet.traits & traitAccountLocker) > 0\n this.baseFeeUI = baseFeeUI\n this.baseFeeTicker = baseFeeUI.conventional.unit\n this.baseFeeSymbol = baseFeeSymbol\n this.baseFeeFactor = this.baseFeeUI.conventional.conversionFactor\n\n const { token: quoteToken, symbol: quoteSymbol, unitInfo: qui } = app().assets[quoteID]\n this.quoteSymbol = quoteSymbol\n this.quoteTicker = qui.conventional.unit\n this.qui = qui\n this.quoteFactor = qui.conventional.conversionFactor\n this.quoteToken = quoteToken\n const quoteFeeID = this.quoteFeeID = quoteToken ? quoteToken.parentID : quoteID\n const { unitInfo: quoteFeeUI, symbol: quoteFeeSymbol, wallet: quoteWallet } = app().assets[this.quoteFeeID]\n this.quoteIsAccountLocker = (quoteWallet.traits & traitAccountLocker) > 0\n this.quoteFeeUI = quoteFeeUI\n this.quoteFeeTicker = quoteFeeUI.conventional.unit\n this.quoteFeeSymbol = quoteFeeSymbol\n this.quoteFeeFactor = this.quoteFeeUI.conventional.conversionFactor\n\n this.id = hostedMarketID(host, baseID, quoteID)\n this.mktID = `${baseSymbol}_${quoteSymbol}`\n\n const { markets } = app().exchanges[host]\n const { lotsize: lotSize, ratestep: rateStep } = markets[this.mktID]\n this.lotSize = lotSize\n this.lotSizeConv = lotSize / bui.conventional.conversionFactor\n this.rateStep = rateStep\n this.quoteLot = calculateQuoteLot(lotSize, baseID, quoteID)\n this.quoteLotConv = this.quoteLot / qui.conventional.conversionFactor\n\n this.baseFeeFiatRate = app().fiatRatesMap[baseFeeID]\n this.quoteFeeFiatRate = app().fiatRatesMap[quoteFeeID]\n\n if (cfg.arbMarketMakingConfig) {\n this.botType = botTypeArbMM\n this.baseLots = cfg.arbMarketMakingConfig.sellPlacements.reduce(sumLots, 0)\n this.quoteLots = cfg.arbMarketMakingConfig.buyPlacements.reduce(sumLots, 0)\n this.nBuyPlacements = cfg.arbMarketMakingConfig.buyPlacements.length\n this.nSellPlacements = cfg.arbMarketMakingConfig.sellPlacements.length\n } else if (cfg.simpleArbConfig) {\n this.botType = botTypeBasicArb\n this.baseLots = cfg.uiConfig.simpleArbLots as number\n this.quoteLots = cfg.uiConfig.simpleArbLots as number\n } else if (cfg.basicMarketMakingConfig) { // basicmm\n this.botType = botTypeBasicMM\n this.baseLots = cfg.basicMarketMakingConfig.sellPlacements.reduce(sumLots, 0)\n this.quoteLots = cfg.basicMarketMakingConfig.buyPlacements.reduce(sumLots, 0)\n this.nBuyPlacements = cfg.basicMarketMakingConfig.buyPlacements.length\n this.nSellPlacements = cfg.basicMarketMakingConfig.sellPlacements.length\n }\n }\n\n async initialize () {\n const { host, baseID, quoteID, lotSizeConv, quoteLotConv } = this\n const res = await MM.report(host, baseID, quoteID)\n const r = this.marketReport = res.report as MarketReport\n this.lotSizeUSD = lotSizeConv * r.baseFiatRate\n this.quoteLotUSD = quoteLotConv * r.quoteFiatRate\n this.proj = this.projectedAllocations()\n }\n\n status () {\n const { baseID, quoteID } = this\n const botStatus = app().mmStatus.bots.find((s: MMBotStatus) => s.config.baseID === baseID && s.config.quoteID === quoteID)\n if (!botStatus) return { botCfg: {} as BotConfig, running: false, runStats: {} as RunStats }\n const { config: botCfg, running, runStats, latestEpoch, cexProblems } = botStatus\n return { botCfg, running, runStats, latestEpoch, cexProblems }\n }\n\n /*\n * adjustedBalances calculates the user's available balances and fee-asset\n * balances for a market, with consideration for currently running bots.\n */\n adjustedBalances () {\n const {\n baseID, quoteID, baseFeeID, quoteFeeID, cexName,\n baseFactor, quoteFactor, baseFeeFactor, quoteFeeFactor\n } = this\n const [baseWallet, quoteWallet] = [app().walletMap[baseID], app().walletMap[quoteID]]\n const [bInv, qInv] = [runningBotInventory(baseID), runningBotInventory(quoteID)]\n\n // In these available balance calcs, only subtract the available balance of\n // running bots, since the locked/reserved/immature is already subtracted\n // from the wallet's total available balance.\n let cexBaseAvail = 0\n let cexQuoteAvail = 0\n let cexBaseBalance: ExchangeBalance | undefined\n let cexQuoteBalance: ExchangeBalance | undefined\n if (cexName) {\n const cex = app().mmStatus.cexes[cexName]\n if (!cex) throw Error('where\\'s the cex status?')\n cexBaseBalance = cex.balances[baseID]\n cexQuoteBalance = cex.balances[quoteID]\n }\n if (cexBaseBalance) cexBaseAvail = (cexBaseBalance.available || 0) - bInv.cex.avail\n if (cexQuoteBalance) cexQuoteAvail = (cexQuoteBalance.available || 0) - qInv.cex.avail\n const [dexBaseAvail, dexQuoteAvail] = [baseWallet.balance.available - bInv.dex.avail, quoteWallet.balance.available - qInv.dex.avail]\n const baseAvail = dexBaseAvail + cexBaseAvail\n const quoteAvail = dexQuoteAvail + cexQuoteAvail\n const baseFeeWallet = baseFeeID === baseID ? baseWallet : app().walletMap[baseFeeID]\n const quoteFeeWallet = quoteFeeID === quoteID ? quoteWallet : app().walletMap[quoteFeeID]\n\n let [baseFeeAvail, dexBaseFeeAvail, cexBaseFeeAvail] = [baseAvail, dexBaseAvail, cexBaseAvail]\n if (baseFeeID !== baseID) {\n const bFeeInv = runningBotInventory(baseID)\n dexBaseFeeAvail = baseFeeWallet.balance.available - bFeeInv.dex.total\n if (cexBaseBalance) cexBaseFeeAvail = (cexBaseBalance.available || 0) - bFeeInv.cex.total\n baseFeeAvail = dexBaseFeeAvail + cexBaseFeeAvail\n }\n let [quoteFeeAvail, dexQuoteFeeAvail, cexQuoteFeeAvail] = [quoteAvail, dexQuoteAvail, cexQuoteAvail]\n if (quoteFeeID !== quoteID) {\n const qFeeInv = runningBotInventory(quoteID)\n dexQuoteFeeAvail = quoteFeeWallet.balance.available - qFeeInv.dex.total\n if (cexQuoteBalance) cexQuoteFeeAvail = (cexQuoteBalance.available || 0) - qFeeInv.cex.total\n quoteFeeAvail = dexQuoteFeeAvail + cexQuoteFeeAvail\n }\n return { // convert to conventioanl.\n baseAvail: baseAvail / baseFactor,\n quoteAvail: quoteAvail / quoteFactor,\n dexBaseAvail: dexBaseAvail / baseFactor,\n dexQuoteAvail: dexQuoteAvail / quoteFactor,\n cexBaseAvail: cexBaseAvail / baseFactor,\n cexQuoteAvail: cexQuoteAvail / quoteFactor,\n baseFeeAvail: baseFeeAvail / baseFeeFactor,\n quoteFeeAvail: quoteFeeAvail / quoteFeeFactor,\n dexBaseFeeAvail: dexBaseFeeAvail / baseFeeFactor,\n dexQuoteFeeAvail: dexQuoteFeeAvail / quoteFeeFactor,\n cexBaseFeeAvail: cexBaseFeeAvail / baseFeeFactor,\n cexQuoteFeeAvail: cexQuoteFeeAvail / quoteFeeFactor\n }\n }\n\n /*\n * feesAndCommit generates a snapshot of current market fees, as well as a\n * \"commit\", which is the funding dedicated to being on order. The commit\n * values do not include booking fees, order reserves, etc. just the order\n * quantity.\n */\n feesAndCommit () {\n const {\n baseID, quoteID, marketReport: { baseFees, quoteFees }, lotSize,\n baseLots, quoteLots, baseFeeID, quoteFeeID, baseIsAccountLocker, quoteIsAccountLocker,\n cfg: { uiConfig: { baseConfig, quoteConfig } }\n } = this\n\n return feesAndCommit(\n baseID, quoteID, baseFees, quoteFees, lotSize, baseLots, quoteLots,\n baseFeeID, quoteFeeID, baseIsAccountLocker, quoteIsAccountLocker,\n baseConfig.orderReservesFactor, quoteConfig.orderReservesFactor\n )\n }\n\n /*\n * projectedAllocations calculates the required asset allocations from the\n * user's configuration settings and the current market state.\n */\n projectedAllocations () {\n const {\n cfg: { uiConfig: { quoteConfig, baseConfig } },\n baseFactor, quoteFactor, baseID, quoteID, lotSizeConv, quoteLotConv,\n baseFeeFactor, quoteFeeFactor, baseFeeID, quoteFeeID, baseToken,\n quoteToken, cexName\n } = this\n const { commit, fees } = this.feesAndCommit()\n\n const bProj = emptyProjection()\n const qProj = emptyProjection()\n\n bProj.book = commit.dex.base.lots * lotSizeConv\n qProj.book = commit.cex.base.lots * quoteLotConv\n\n bProj.orderReserves = Math.max(commit.cex.base.val, commit.dex.base.val) * baseConfig.orderReservesFactor / baseFactor\n qProj.orderReserves = Math.max(commit.cex.quote.val, commit.dex.quote.val) * quoteConfig.orderReservesFactor / quoteFactor\n\n if (cexName) {\n bProj.cex = commit.cex.base.lots * lotSizeConv\n qProj.cex = commit.cex.quote.lots * quoteLotConv\n }\n\n bProj.bookingFees = fees.base.bookingFees / baseFeeFactor\n qProj.bookingFees = fees.quote.bookingFees / quoteFeeFactor\n\n if (baseToken) bProj.swapFeeReserves = fees.base.tokenFeesPerSwap * baseConfig.swapFeeN / baseFeeFactor\n if (quoteToken) qProj.swapFeeReserves = fees.quote.tokenFeesPerSwap * quoteConfig.swapFeeN / quoteFeeFactor\n qProj.slippageBuffer = (qProj.book + qProj.cex + qProj.orderReserves) * quoteConfig.slippageBufferFactor\n\n const alloc: Record<number, number> = {}\n const addAlloc = (assetID: number, amt: number) => { alloc[assetID] = (alloc[assetID] ?? 0) + amt }\n addAlloc(baseID, Math.round((bProj.book + bProj.cex + bProj.orderReserves) * baseFactor))\n addAlloc(baseFeeID, Math.round((bProj.bookingFees + bProj.swapFeeReserves) * baseFeeFactor))\n addAlloc(quoteID, Math.round((qProj.book + qProj.cex + qProj.orderReserves + qProj.slippageBuffer) * quoteFactor))\n addAlloc(quoteFeeID, Math.round((qProj.bookingFees + qProj.swapFeeReserves) * quoteFeeFactor))\n\n return { qProj, bProj, alloc }\n }\n\n /*\n * fundingState examines the projected allocations and the user's wallet\n * balances to determine whether the user can fund the bot fully, unbalanced,\n * or starved, and what funding source options might be available.\n */\n fundingState () {\n const {\n proj: { bProj, qProj }, baseID, quoteID, baseFeeID, quoteFeeID,\n cfg: { uiConfig: { cexRebalance } }, cexName\n } = this\n const {\n baseAvail, quoteAvail, dexBaseAvail, dexQuoteAvail, cexBaseAvail, cexQuoteAvail,\n dexBaseFeeAvail, dexQuoteFeeAvail\n } = this.adjustedBalances()\n\n const canRebalance = Boolean(cexName && cexRebalance)\n\n // Three possible states.\n // 1. We have the funding in the projection, and its in the right places.\n // Give them some options for which wallet to pull order reserves from,\n // but they can start immediately..\n // 2. We have the funding, but it's in the wrong place or the wrong asset,\n // but we have deposits and withdraws enabled. We can offer them the\n // option to start in an unbalanced state.\n // 3. We don't have the funds. We offer them an option to start in a\n // starved state.\n const cexMinBaseAlloc = bProj.cex\n let [dexMinBaseAlloc, transferableBaseAlloc, dexBaseFeeReq] = [bProj.book, 0, 0]\n // Only add booking fees if this is the fee asset.\n if (baseID === baseFeeID) dexMinBaseAlloc += bProj.bookingFees\n // Base asset is a token.\n else dexBaseFeeReq += bProj.bookingFees + bProj.swapFeeReserves\n // If we can rebalance, the order reserves could potentially be withdrawn.\n if (canRebalance) transferableBaseAlloc += bProj.orderReserves\n // If we can't rebalance, order reserves are required in dex balance.\n else dexMinBaseAlloc += bProj.orderReserves\n // Handle the special case where the base asset it the quote asset's fee\n // asset.\n if (baseID === quoteFeeID) {\n if (canRebalance) transferableBaseAlloc += qProj.bookingFees + qProj.swapFeeReserves\n else dexMinBaseAlloc += qProj.bookingFees + qProj.swapFeeReserves\n }\n\n let [dexMinQuoteAlloc, cexMinQuoteAlloc, transferableQuoteAlloc, dexQuoteFeeReq] = [qProj.book, qProj.cex, 0, 0]\n if (quoteID === quoteFeeID) dexMinQuoteAlloc += qProj.bookingFees\n else dexQuoteFeeReq += qProj.bookingFees + qProj.swapFeeReserves\n if (canRebalance) transferableQuoteAlloc += qProj.orderReserves + qProj.slippageBuffer\n else {\n // The slippage reserves reserves should be split between cex and dex.\n dexMinQuoteAlloc += qProj.orderReserves\n const basis = qProj.book + qProj.cex + qProj.orderReserves\n dexMinQuoteAlloc += (qProj.book + qProj.orderReserves) / basis * qProj.slippageBuffer\n cexMinQuoteAlloc += qProj.cex / basis * qProj.slippageBuffer\n }\n if (quoteID === baseFeeID) {\n if (canRebalance) transferableQuoteAlloc += bProj.bookingFees + bProj.swapFeeReserves\n else dexMinQuoteAlloc += bProj.bookingFees + bProj.swapFeeReserves\n }\n\n const dexBaseFunded = dexBaseAvail >= dexMinBaseAlloc\n const cexBaseFunded = cexBaseAvail >= cexMinBaseAlloc\n const dexQuoteFunded = dexQuoteAvail >= dexMinQuoteAlloc\n const cexQuoteFunded = cexQuoteAvail >= cexMinQuoteAlloc\n const totalBaseReq = dexMinBaseAlloc + cexMinBaseAlloc + transferableBaseAlloc\n const totalQuoteReq = dexMinQuoteAlloc + cexMinQuoteAlloc + transferableQuoteAlloc\n const baseFundedAndBalanced = dexBaseFunded && cexBaseFunded && baseAvail >= totalBaseReq\n const quoteFundedAndBalanced = dexQuoteFunded && cexQuoteFunded && quoteAvail >= totalQuoteReq\n const baseFeesFunded = dexBaseFeeAvail >= dexBaseFeeReq\n const quoteFeesFunded = dexQuoteFeeAvail >= dexQuoteFeeReq\n\n const fundedAndBalanced = baseFundedAndBalanced && quoteFundedAndBalanced && baseFeesFunded && quoteFeesFunded\n\n // Are we funded but not balanced, but able to rebalance with a cex?\n let fundedAndNotBalanced = !fundedAndBalanced\n if (!fundedAndBalanced) {\n const ordersFunded = baseAvail >= totalBaseReq && quoteAvail >= totalQuoteReq\n const feesFunded = baseFeesFunded && quoteFeesFunded\n fundedAndNotBalanced = ordersFunded && feesFunded && canRebalance\n }\n\n return {\n base: {\n dex: {\n avail: dexBaseAvail,\n req: dexMinBaseAlloc,\n funded: dexBaseFunded\n },\n cex: {\n avail: cexBaseAvail,\n req: cexMinBaseAlloc,\n funded: cexBaseFunded\n },\n transferable: transferableBaseAlloc,\n fees: {\n avail: dexBaseFeeAvail,\n req: dexBaseFeeReq,\n funded: baseFeesFunded\n },\n fundedAndBalanced: baseFundedAndBalanced,\n fundedAndNotBalanced: !baseFundedAndBalanced && baseAvail >= totalBaseReq && canRebalance\n },\n quote: {\n dex: {\n avail: dexQuoteAvail,\n req: dexMinQuoteAlloc,\n funded: dexQuoteFunded\n },\n cex: {\n avail: cexQuoteAvail,\n req: cexMinQuoteAlloc,\n funded: cexQuoteFunded\n },\n transferable: transferableQuoteAlloc,\n fees: {\n avail: dexQuoteFeeAvail,\n req: dexQuoteFeeReq,\n funded: quoteFeesFunded\n },\n fundedAndBalanced: quoteFundedAndBalanced,\n fundedAndNotBalanced: !quoteFundedAndBalanced && quoteAvail >= totalQuoteReq && canRebalance\n },\n fundedAndBalanced,\n fundedAndNotBalanced,\n starved: !fundedAndBalanced && !fundedAndNotBalanced\n }\n }\n}\n\nexport type RunningMMDisplayElements = {\n orderReportForm: PageElement\n dexBalancesRowTmpl: PageElement\n placementRowTmpl: PageElement\n placementAmtRowTmpl: PageElement\n}\n\nexport class RunningMarketMakerDisplay {\n div: PageElement\n page: Record<string, PageElement>\n mkt: BotMarket\n startTime: number\n ticker: any\n currentForm: PageElement\n forms: Forms\n latestEpoch?: EpochReport\n cexProblems?: CEXProblems\n orderReportFormEl: PageElement\n orderReportForm: Record<string, PageElement>\n displayedOrderReportFormSide: 'buys' | 'sells'\n dexBalancesRowTmpl: PageElement\n placementRowTmpl: PageElement\n placementAmtRowTmpl: PageElement\n\n constructor (div: PageElement, forms: Forms, elements: RunningMMDisplayElements, page: string) {\n this.div = div\n this.page = Doc.parseTemplate(div)\n this.orderReportFormEl = elements.orderReportForm\n this.orderReportForm = Doc.idDescendants(elements.orderReportForm)\n this.dexBalancesRowTmpl = elements.dexBalancesRowTmpl\n this.placementRowTmpl = elements.placementRowTmpl\n this.placementAmtRowTmpl = elements.placementAmtRowTmpl\n Doc.cleanTemplates(this.dexBalancesRowTmpl, this.placementRowTmpl, this.placementAmtRowTmpl)\n this.forms = forms\n Doc.bind(this.page.stopBttn, 'click', () => this.stop())\n Doc.bind(this.page.runLogsBttn, 'click', () => {\n const { mkt: { baseID, quoteID, host }, startTime } = this\n app().loadPage('mmlogs', { baseID, quoteID, host, startTime, returnPage: page })\n })\n Doc.bind(this.page.buyOrdersBttn, 'click', () => this.showOrderReport('buys'))\n Doc.bind(this.page.sellOrdersBttn, 'click', () => this.showOrderReport('sells'))\n }\n\n async stop () {\n const { page, mkt: { host, baseID, quoteID } } = this\n const loaded = app().loading(page.stopBttn)\n await MM.stopBot({ host, baseID: baseID, quoteID: quoteID })\n loaded()\n }\n\n async setMarket (host: string, baseID: number, quoteID: number) {\n const botStatus = app().mmStatus.bots.find(({ config: c }: MMBotStatus) => c.baseID === baseID && c.quoteID === quoteID && c.host === host)\n if (!botStatus) return\n const mkt = new BotMarket(botStatus.config)\n await mkt.initialize()\n this.setBotMarket(mkt)\n }\n\n async setBotMarket (mkt: BotMarket) {\n this.mkt = mkt\n const {\n page, div, mkt: {\n host, baseID, quoteID, baseFeeID, quoteFeeID, cexName, baseFeeSymbol,\n quoteFeeSymbol, baseFeeTicker, quoteFeeTicker, cfg, baseFactor, quoteFactor\n }\n } = this\n setMarketElements(div, baseID, quoteID, host)\n Doc.setVis(baseFeeID !== baseID, page.baseFeeReservesBox)\n Doc.setVis(quoteFeeID !== quoteID, page.quoteFeeReservesBox)\n Doc.setVis(Boolean(cexName), ...Doc.applySelector(div, '[data-cex-show]'))\n page.baseFeeLogo.src = Doc.logoPath(baseFeeSymbol)\n page.baseFeeTicker.textContent = baseFeeTicker\n page.quoteFeeLogo.src = Doc.logoPath(quoteFeeSymbol)\n page.quoteFeeTicker.textContent = quoteFeeTicker\n\n const basicCfg = cfg.basicMarketMakingConfig\n const gapStrategy = basicCfg?.gapStrategy ?? GapStrategyPercent\n let gapFactor = cfg.arbMarketMakingConfig?.profit ?? cfg.simpleArbConfig?.profitTrigger ?? 0\n if (basicCfg) {\n const buys = [...basicCfg.buyPlacements].sort((a: OrderPlacement, b: OrderPlacement) => a.gapFactor - b.gapFactor)\n const sells = [...basicCfg.sellPlacements].sort((a: OrderPlacement, b: OrderPlacement) => a.gapFactor - b.gapFactor)\n if (buys.length > 0) {\n if (sells.length > 0) {\n gapFactor = (buys[0].gapFactor + sells[0].gapFactor) / 2\n } else {\n gapFactor = buys[0].gapFactor\n }\n } else gapFactor = sells[0].gapFactor\n }\n Doc.hide(page.profitLabel, page.gapLabel, page.multiplierLabel, page.profitUnit, page.gapUnit, page.multiplierUnit)\n switch (gapStrategy) {\n case GapStrategyPercent:\n case GapStrategyPercentPlus:\n Doc.show(page.profitLabel, page.profitUnit)\n page.gapFactor.textContent = (gapFactor * 100).toFixed(2)\n break\n case GapStrategyMultiplier:\n Doc.show(page.multiplierLabel, page.multiplierUnit)\n page.gapFactor.textContent = (gapFactor * 100).toFixed(2)\n break\n default:\n page.gapFactor.textContent = Doc.formatFourSigFigs(gapFactor / OrderUtil.RateEncodingFactor * baseFactor / quoteFactor)\n }\n\n this.update()\n this.readBook()\n }\n\n handleBalanceNote (n: BalanceNote) {\n if (!this.mkt) return\n const { baseID, quoteID, baseFeeID, quoteFeeID } = this.mkt\n if (n.assetID !== baseID && n.assetID !== baseFeeID && n.assetID !== quoteID && n.assetID !== quoteFeeID) return\n this.update()\n }\n\n handleEpochReportNote (n: EpochReportNote) {\n if (!this.mkt) return\n const { baseID, quoteID, host } = this.mkt\n if (n.baseID !== baseID || n.quoteID !== quoteID || n.host !== host) return\n if (!n.report) return\n this.latestEpoch = n.report\n if (this.forms.currentForm === this.orderReportFormEl && this.forms.currentFormID === this.mkt.id) {\n const orderReport = this.displayedOrderReportFormSide === 'buys' ? n.report.buysReport : n.report.sellsReport\n if (orderReport) this.updateOrderReport(orderReport, this.displayedOrderReportFormSide, n.report.epochNum)\n else this.forms.close()\n }\n this.update()\n }\n\n handleCexProblemsNote (n: CEXProblemsNote) {\n if (!this.mkt) return\n const { baseID, quoteID, host } = this.mkt\n if (n.baseID !== baseID || n.quoteID !== quoteID || n.host !== host) return\n this.cexProblems = n.problems\n this.update()\n }\n\n setTicker () {\n this.page.runTime.textContent = Doc.hmsSince(this.startTime)\n }\n\n update () {\n const {\n div, page, mkt: {\n baseID, quoteID, baseFeeID, quoteFeeID, baseFactor, quoteFactor, baseFeeFactor,\n quoteFeeFactor, marketReport: { baseFiatRate, quoteFiatRate }\n }\n } = this\n // Get fresh stats\n const { botCfg: { cexName, basicMarketMakingConfig: bmmCfg }, runStats, latestEpoch, cexProblems } = this.mkt.status()\n this.latestEpoch = latestEpoch\n this.cexProblems = cexProblems\n\n Doc.hide(page.stats, page.cexRow, page.pendingDepositBox, page.pendingWithdrawalBox)\n\n if (!runStats) {\n if (this.ticker) {\n clearInterval(this.ticker)\n this.ticker = undefined\n }\n return\n } else if (!this.ticker) {\n this.startTime = runStats.startTime\n this.setTicker()\n this.ticker = setInterval(() => this.setTicker(), 1000)\n }\n\n Doc.show(page.stats)\n setSignedValue(runStats.profitLoss.profitRatio * 100, page.profit, page.profitSign, 2)\n setSignedValue(runStats.profitLoss.profit, page.profitLoss, page.plSign, 2)\n this.startTime = runStats.startTime\n\n const summedBalance = (b: BotBalance) => {\n if (!b) return 0\n return b.available + b.locked + b.pending + b.reserved\n }\n\n const dexBaseInv = summedBalance(runStats.dexBalances[baseID]) / baseFactor\n page.walletBaseInventory.textContent = Doc.formatFourSigFigs(dexBaseInv)\n page.walletBaseInvFiat.textContent = Doc.formatFourSigFigs(dexBaseInv * baseFiatRate, 2)\n const dexQuoteInv = summedBalance(runStats.dexBalances[quoteID]) / quoteFactor\n page.walletQuoteInventory.textContent = Doc.formatFourSigFigs(dexQuoteInv)\n page.walletQuoteInvFiat.textContent = Doc.formatFourSigFigs(dexQuoteInv * quoteFiatRate, 2)\n\n Doc.setVis(cexName, page.cexRow)\n if (cexName) {\n Doc.show(page.pendingDepositBox, page.pendingWithdrawalBox)\n setCexElements(div, cexName)\n const cexBaseInv = summedBalance(runStats.cexBalances[baseID]) / baseFactor\n page.cexBaseInventory.textContent = Doc.formatFourSigFigs(cexBaseInv)\n page.cexBaseInventoryFiat.textContent = Doc.formatFourSigFigs(cexBaseInv * baseFiatRate, 2)\n const cexQuoteInv = summedBalance(runStats.cexBalances[quoteID]) / quoteFactor\n page.cexQuoteInventory.textContent = Doc.formatFourSigFigs(cexQuoteInv)\n page.cexQuoteInventoryFiat.textContent = Doc.formatFourSigFigs(cexQuoteInv * quoteFiatRate, 2)\n }\n\n if (baseFeeID !== baseID) {\n const feeBalance = summedBalance(runStats.dexBalances[baseFeeID]) / baseFeeFactor\n page.baseFeeReserves.textContent = Doc.formatFourSigFigs(feeBalance)\n }\n if (quoteFeeID !== quoteID) {\n const feeBalance = summedBalance(runStats.dexBalances[quoteFeeID]) / quoteFeeFactor\n page.quoteFeeReserves.textContent = Doc.formatFourSigFigs(feeBalance)\n }\n\n page.pendingDeposits.textContent = String(Math.round(runStats.pendingDeposits))\n page.pendingWithdrawals.textContent = String(Math.round(runStats.pendingWithdrawals))\n page.completedMatches.textContent = String(Math.round(runStats.completedMatches))\n Doc.setVis(runStats.tradedUSD, page.tradedUSDBox)\n if (runStats.tradedUSD > 0) page.tradedUSD.textContent = Doc.formatFourSigFigs(runStats.tradedUSD)\n Doc.setVis(baseFiatRate, page.roundTripFeesBox)\n if (baseFiatRate) page.roundTripFeesUSD.textContent = Doc.formatFourSigFigs((runStats.feeGap?.roundTripFees / baseFactor * baseFiatRate) || 0)\n const basisPrice = app().conventionalRate(baseID, quoteID, runStats.feeGap?.basisPrice || 0)\n page.basisPrice.textContent = Doc.formatFourSigFigs(basisPrice)\n\n const displayFeeGap = !bmmCfg || bmmCfg.gapStrategy === GapStrategyAbsolutePlus || bmmCfg.gapStrategy === GapStrategyPercentPlus\n Doc.setVis(displayFeeGap, page.feeGapBox)\n if (displayFeeGap) {\n const feeGap = app().conventionalRate(baseID, quoteID, runStats.feeGap?.feeGap || 0)\n page.feeGap.textContent = Doc.formatFourSigFigs(feeGap)\n page.feeGapPct.textContent = (feeGap / basisPrice * 100 || 0).toFixed(2)\n }\n Doc.setVis(bmmCfg, page.gapStrategyBox)\n if (bmmCfg) page.gapStrategy.textContent = bmmCfg.gapStrategy\n\n const remoteGap = app().conventionalRate(baseID, quoteID, runStats.feeGap?.remoteGap || 0)\n Doc.setVis(remoteGap, page.remoteGapBox)\n if (remoteGap) {\n page.remoteGap.textContent = Doc.formatFourSigFigs(remoteGap)\n page.remoteGapPct.textContent = (remoteGap / basisPrice * 100 || 0).toFixed(2)\n }\n\n Doc.setVis(latestEpoch?.buysReport, page.buyOrdersReportBox)\n if (latestEpoch?.buysReport) {\n const allPlaced = allOrdersPlaced(latestEpoch.buysReport)\n Doc.setVis(allPlaced, page.buyOrdersSuccess)\n Doc.setVis(!allPlaced, page.buyOrdersFailed)\n }\n\n Doc.setVis(latestEpoch?.sellsReport, page.sellOrdersReportBox)\n if (latestEpoch?.sellsReport) {\n const allPlaced = allOrdersPlaced(latestEpoch.sellsReport)\n Doc.setVis(allPlaced, page.sellOrdersSuccess)\n Doc.setVis(!allPlaced, page.sellOrdersFailed)\n }\n\n const preOrderProblemMessages = botProblemMessages(latestEpoch?.preOrderProblems, this.mkt.cexName, this.mkt.host)\n const cexErrorMessages = cexProblemMessages(this.cexProblems)\n const allMessages = [...preOrderProblemMessages, ...cexErrorMessages]\n Doc.setVis(allMessages.length > 0, page.preOrderProblemsBox)\n Doc.empty(page.preOrderProblemsBox)\n for (const msg of allMessages) {\n const spanEl = document.createElement('span') as PageElement\n spanEl.textContent = `- ${msg}`\n page.preOrderProblemsBox.appendChild(spanEl)\n }\n }\n\n updateOrderReport (report: OrderReport, side: 'buys' | 'sells', epochNum: number) {\n const form = this.orderReportForm\n const sideTxt = side === 'buys' ? intl.prep(intl.ID_BUY) : intl.prep(intl.ID_SELL)\n form.orderReportTitle.textContent = intl.prep(intl.ID_ORDER_REPORT_TITLE, { side: sideTxt, epochNum: `${epochNum}` })\n\n Doc.setVis(report.error, form.orderReportError)\n Doc.setVis(!report.error, form.orderReportDetails)\n if (report.error) {\n const problemMessages = botProblemMessages(report.error, this.mkt.cexName, this.mkt.host)\n Doc.empty(form.orderReportError)\n for (const msg of problemMessages) {\n const spanEl = document.createElement('span') as PageElement\n spanEl.textContent = `- ${msg}`\n form.orderReportError.appendChild(spanEl)\n }\n return\n }\n\n Doc.empty(form.dexBalancesBody, form.placementsBody)\n const createRow = (assetID: number): [PageElement, number] => {\n const row = this.dexBalancesRowTmpl.cloneNode(true) as HTMLElement\n const rowTmpl = Doc.parseTemplate(row)\n const asset = app().assets[assetID]\n rowTmpl.asset.textContent = asset.symbol.toUpperCase()\n rowTmpl.assetLogo.src = Doc.logoPath(asset.symbol)\n const unitInfo = asset.unitInfo\n const available = report.availableDexBals[assetID] ? report.availableDexBals[assetID].available : 0\n const required = report.requiredDexBals[assetID] ? report.requiredDexBals[assetID] : 0\n const remaining = report.remainingDexBals[assetID] ? report.remainingDexBals[assetID] : 0\n const pending = report.availableDexBals[assetID] ? report.availableDexBals[assetID].pending : 0\n const locked = report.availableDexBals[assetID] ? report.availableDexBals[assetID].locked : 0\n const used = report.usedDexBals[assetID] ? report.usedDexBals[assetID] : 0\n rowTmpl.available.textContent = Doc.formatCoinValue(available, unitInfo)\n rowTmpl.locked.textContent = Doc.formatCoinValue(locked, unitInfo)\n rowTmpl.required.textContent = Doc.formatCoinValue(required, unitInfo)\n rowTmpl.remaining.textContent = Doc.formatCoinValue(remaining, unitInfo)\n rowTmpl.pending.textContent = Doc.formatCoinValue(pending, unitInfo)\n rowTmpl.used.textContent = Doc.formatCoinValue(used, unitInfo)\n const deficiency = safeSub(required, available)\n rowTmpl.deficiency.textContent = Doc.formatCoinValue(deficiency, unitInfo)\n if (deficiency > 0) rowTmpl.deficiency.classList.add('text-warning')\n const deficiencyWithPending = safeSub(deficiency, pending)\n rowTmpl.deficiencyWithPending.textContent = Doc.formatCoinValue(deficiencyWithPending, unitInfo)\n if (deficiencyWithPending > 0) rowTmpl.deficiencyWithPending.classList.add('text-warning')\n return [row, deficiency]\n }\n const setDeficiencyVisibility = (deficiency: boolean, rows: HTMLElement[]) => {\n Doc.setVis(deficiency, form.dexDeficiencyHeader, form.dexDeficiencyWithPendingHeader)\n for (const row of rows) {\n const rowTmpl = Doc.parseTemplate(row)\n Doc.setVis(deficiency, rowTmpl.deficiency, rowTmpl.deficiencyWithPending)\n }\n }\n const assetIDs = [this.mkt.baseID, this.mkt.quoteID]\n if (!assetIDs.includes(this.mkt.baseFeeID)) assetIDs.push(this.mkt.baseFeeID)\n if (!assetIDs.includes(this.mkt.quoteFeeID)) assetIDs.push(this.mkt.quoteFeeID)\n let totalDeficiency = 0\n const rows : PageElement[] = []\n for (const assetID of assetIDs) {\n const [row, deficiency] = createRow(assetID)\n totalDeficiency += deficiency\n form.dexBalancesBody.appendChild(row)\n rows.push(row)\n }\n setDeficiencyVisibility(totalDeficiency > 0, rows)\n\n Doc.setVis(this.mkt.cexName, form.cexSection, form.counterTradeRateHeader, form.requiredCEXHeader, form.usedCEXHeader)\n let cexAsset: SupportedAsset\n if (this.mkt.cexName) {\n const cexDisplayInfo = CEXDisplayInfos[this.mkt.cexName]\n if (cexDisplayInfo) {\n form.cexLogo.src = cexDisplayInfo.logo\n form.cexBalancesTitle.textContent = intl.prep(intl.ID_CEX_BALANCES, { cexName: cexDisplayInfo.name })\n } else {\n console.error(`CEXDisplayInfo not found for ${this.mkt.cexName}`)\n }\n const cexAssetID = side === 'buys' ? this.mkt.baseID : this.mkt.quoteID\n cexAsset = app().assets[cexAssetID]\n form.cexAsset.textContent = cexAsset.symbol.toUpperCase()\n form.cexAssetLogo.src = Doc.logoPath(cexAsset.symbol)\n const availableCexBal = report.availableCexBal ? report.availableCexBal.available : 0\n const requiredCexBal = report.requiredCexBal ? report.requiredCexBal : 0\n const remainingCexBal = report.remainingCexBal ? report.remainingCexBal : 0\n const pendingCexBal = report.availableCexBal ? report.availableCexBal.pending : 0\n const reservedCexBal = report.availableCexBal ? report.availableCexBal.reserved : 0\n const usedCexBal = report.usedCexBal ? report.usedCexBal : 0\n const deficiencyCexBal = safeSub(requiredCexBal, availableCexBal)\n const deficiencyWithPendingCexBal = safeSub(deficiencyCexBal, pendingCexBal)\n form.cexAvailable.textContent = Doc.formatCoinValue(availableCexBal, cexAsset.unitInfo)\n form.cexLocked.textContent = Doc.formatCoinValue(reservedCexBal, cexAsset.unitInfo)\n form.cexRequired.textContent = Doc.formatCoinValue(requiredCexBal, cexAsset.unitInfo)\n form.cexRemaining.textContent = Doc.formatCoinValue(remainingCexBal, cexAsset.unitInfo)\n form.cexPending.textContent = Doc.formatCoinValue(pendingCexBal, cexAsset.unitInfo)\n form.cexUsed.textContent = Doc.formatCoinValue(usedCexBal, cexAsset.unitInfo)\n const deficient = deficiencyCexBal > 0\n Doc.setVis(deficient, form.cexDeficiencyHeader, form.cexDeficiencyWithPendingHeader,\n form.cexDeficiency, form.cexDeficiencyWithPending)\n if (deficient) {\n form.cexDeficiency.textContent = Doc.formatCoinValue(deficiencyCexBal, cexAsset.unitInfo)\n form.cexDeficiencyWithPending.textContent = Doc.formatCoinValue(deficiencyWithPendingCexBal, cexAsset.unitInfo)\n if (deficiencyWithPendingCexBal > 0) form.cexDeficiencyWithPending.classList.add('text-warning')\n else form.cexDeficiencyWithPending.classList.remove('text-warning')\n }\n }\n\n let anyErrors = false\n for (const placement of report.placements) if (placement.error) { anyErrors = true; break }\n Doc.setVis(anyErrors, form.errorHeader)\n const createPlacementRow = (placement: TradePlacement, priority: number): PageElement => {\n const row = this.placementRowTmpl.cloneNode(true) as HTMLElement\n const rowTmpl = Doc.parseTemplate(row)\n const baseUI = app().assets[this.mkt.baseID].unitInfo\n const quoteUI = app().assets[this.mkt.quoteID].unitInfo\n rowTmpl.priority.textContent = String(priority)\n rowTmpl.rate.textContent = Doc.formatRateFullPrecision(placement.rate, baseUI, quoteUI, this.mkt.rateStep)\n rowTmpl.lots.textContent = String(placement.lots)\n rowTmpl.standingLots.textContent = String(placement.standingLots)\n rowTmpl.orderedLots.textContent = String(placement.orderedLots)\n if (placement.standingLots + placement.orderedLots < placement.lots) {\n rowTmpl.lots.classList.add('text-warning')\n rowTmpl.standingLots.classList.add('text-warning')\n rowTmpl.orderedLots.classList.add('text-warning')\n }\n Doc.setVis(placement.counterTradeRate > 0, rowTmpl.counterTradeRate)\n rowTmpl.counterTradeRate.textContent = Doc.formatRateFullPrecision(placement.counterTradeRate, baseUI, quoteUI, this.mkt.rateStep)\n for (const assetID of assetIDs) {\n const asset = app().assets[assetID]\n const unitInfo = asset.unitInfo\n const requiredAmt = placement.requiredDex[assetID] ? placement.requiredDex[assetID] : 0\n const usedAmt = placement.usedDex[assetID] ? placement.usedDex[assetID] : 0\n const requiredRow = this.placementAmtRowTmpl.cloneNode(true) as HTMLElement\n const requiredRowTmpl = Doc.parseTemplate(requiredRow)\n const usedRow = this.placementAmtRowTmpl.cloneNode(true) as HTMLElement\n const usedRowTmpl = Doc.parseTemplate(usedRow)\n requiredRowTmpl.amt.textContent = Doc.formatCoinValue(requiredAmt, unitInfo)\n requiredRowTmpl.assetLogo.src = Doc.logoPath(asset.symbol)\n requiredRowTmpl.assetSymbol.textContent = asset.symbol.toUpperCase()\n usedRowTmpl.amt.textContent = Doc.formatCoinValue(usedAmt, unitInfo)\n usedRowTmpl.assetLogo.src = Doc.logoPath(asset.symbol)\n usedRowTmpl.assetSymbol.textContent = asset.symbol.toUpperCase()\n rowTmpl.requiredDEX.appendChild(requiredRow)\n rowTmpl.usedDEX.appendChild(usedRow)\n }\n Doc.setVis(this.mkt.cexName, rowTmpl.requiredCEX, rowTmpl.usedCEX)\n if (this.mkt.cexName) {\n const requiredAmt = Doc.formatCoinValue(placement.requiredCex, cexAsset.unitInfo)\n rowTmpl.requiredCEX.textContent = `${requiredAmt} ${cexAsset.symbol.toUpperCase()}`\n const usedAmt = Doc.formatCoinValue(placement.usedCex, cexAsset.unitInfo)\n rowTmpl.usedCEX.textContent = `${usedAmt} ${cexAsset.symbol.toUpperCase()}`\n }\n Doc.setVis(anyErrors, rowTmpl.error)\n if (placement.error) {\n const errMessages = botProblemMessages(placement.error, this.mkt.cexName, this.mkt.host)\n rowTmpl.error.textContent = errMessages.join('\\n')\n }\n return row\n }\n for (let i = 0; i < report.placements.length; i++) {\n form.placementsBody.appendChild(createPlacementRow(report.placements[i], i + 1))\n }\n }\n\n showOrderReport (side: 'buys' | 'sells') {\n if (!this.latestEpoch) return\n const report = side === 'buys' ? this.latestEpoch.buysReport : this.latestEpoch.sellsReport\n if (!report) return\n this.updateOrderReport(report, side, this.latestEpoch.epochNum)\n this.displayedOrderReportFormSide = side\n this.forms.show(this.orderReportFormEl, this.mkt.id)\n }\n\n readBook () {\n if (!this.mkt) return\n const { page, mkt: { host, mktID } } = this\n const orders = app().exchanges[host].markets[mktID].orders || []\n page.nBookedOrders.textContent = String(orders.filter((ord: Order) => ord.status === OrderUtil.StatusBooked).length)\n }\n}\n\nfunction allOrdersPlaced (report: OrderReport) {\n if (report.error) return false\n for (let i = 0; i < report.placements.length; i++) {\n const placement = report.placements[i]\n if (placement.orderedLots + placement.standingLots < placement.lots) return false\n if (placement.error) return false\n }\n return true\n}\n\nfunction setSignedValue (v: number, vEl: PageElement, signEl: PageElement, maxDecimals?: number) {\n vEl.textContent = Doc.formatFourSigFigs(v, maxDecimals)\n signEl.classList.toggle('ico-plus', v > 0)\n signEl.classList.toggle('text-good', v > 0)\n // signEl.classList.toggle('ico-minus', v < 0)\n}\n\nexport function feesAndCommit (\n baseID: number, quoteID: number, baseFees: LotFeeRange, quoteFees: LotFeeRange,\n lotSize: number, baseLots: number, quoteLots: number, baseFeeID: number, quoteFeeID: number,\n baseIsAccountLocker: boolean, quoteIsAccountLocker: boolean, baseOrderReservesFactor: number,\n quoteOrderReservesFactor: number\n) {\n const quoteLot = calculateQuoteLot(lotSize, baseID, quoteID)\n const [cexBaseLots, cexQuoteLots] = [quoteLots, baseLots]\n const commit = {\n dex: {\n base: {\n lots: baseLots,\n val: baseLots * lotSize\n },\n quote: {\n lots: quoteLots,\n val: quoteLots * quoteLot\n }\n },\n cex: {\n base: {\n lots: cexBaseLots,\n val: cexBaseLots * lotSize\n },\n quote: {\n lots: cexQuoteLots,\n val: cexQuoteLots * quoteLot\n }\n }\n }\n\n let baseTokenFeesPerSwap = 0\n let baseRedeemReservesPerLot = 0\n if (baseID !== baseFeeID) { // token\n baseTokenFeesPerSwap += baseFees.estimated.swap\n if (baseFeeID === quoteFeeID) baseTokenFeesPerSwap += quoteFees.estimated.redeem\n }\n let baseBookingFeesPerLot = baseFees.max.swap\n if (baseID === quoteFeeID) baseBookingFeesPerLot += quoteFees.max.redeem\n if (baseIsAccountLocker) {\n baseBookingFeesPerLot += baseFees.max.refund\n if (!quoteIsAccountLocker && baseFeeID !== quoteFeeID) baseRedeemReservesPerLot = baseFees.max.redeem\n }\n\n let quoteTokenFeesPerSwap = 0\n let quoteRedeemReservesPerLot = 0\n if (quoteID !== quoteFeeID) {\n quoteTokenFeesPerSwap += quoteFees.estimated.swap\n if (quoteFeeID === baseFeeID) quoteTokenFeesPerSwap += baseFees.estimated.redeem\n }\n let quoteBookingFeesPerLot = quoteFees.max.swap\n if (quoteID === baseFeeID) quoteBookingFeesPerLot += baseFees.max.redeem\n if (quoteIsAccountLocker) {\n quoteBookingFeesPerLot += quoteFees.max.refund\n if (!baseIsAccountLocker && quoteFeeID !== baseFeeID) quoteRedeemReservesPerLot = quoteFees.max.redeem\n }\n\n const baseReservesFactor = 1 + baseOrderReservesFactor\n const quoteReservesFactor = 1 + quoteOrderReservesFactor\n\n const baseBookingFees = (baseBookingFeesPerLot * baseLots) * baseReservesFactor\n const baseRedeemFees = (baseRedeemReservesPerLot * quoteLots) * quoteReservesFactor\n const quoteBookingFees = (quoteBookingFeesPerLot * quoteLots) * quoteReservesFactor\n const quoteRedeemFees = (quoteRedeemReservesPerLot * baseLots) * baseReservesFactor\n\n const fees: BookingFees = {\n base: {\n ...baseFees,\n bookingFeesPerLot: baseBookingFeesPerLot,\n bookingFeesPerCounterLot: baseRedeemReservesPerLot,\n bookingFees: baseBookingFees + baseRedeemFees,\n swapReservesFactor: baseReservesFactor,\n redeemReservesFactor: quoteReservesFactor,\n tokenFeesPerSwap: baseTokenFeesPerSwap\n },\n quote: {\n ...quoteFees,\n bookingFeesPerLot: quoteBookingFeesPerLot,\n bookingFeesPerCounterLot: quoteRedeemReservesPerLot,\n bookingFees: quoteBookingFees + quoteRedeemFees,\n swapReservesFactor: quoteReservesFactor,\n redeemReservesFactor: baseReservesFactor,\n tokenFeesPerSwap: quoteTokenFeesPerSwap\n }\n }\n\n return { commit, fees }\n}\n\nfunction botProblemMessages (problems: BotProblems | undefined, cexName: string, dexHost: string): string[] {\n if (!problems) return []\n const msgs: string[] = []\n\n if (problems.walletNotSynced) {\n for (const [assetID, notSynced] of Object.entries(problems.walletNotSynced)) {\n if (notSynced) {\n msgs.push(intl.prep(intl.ID_WALLET_NOT_SYNCED, { assetSymbol: app().assets[Number(assetID)].symbol.toUpperCase() }))\n }\n }\n }\n\n if (problems.noWalletPeers) {\n for (const [assetID, noPeers] of Object.entries(problems.noWalletPeers)) {\n if (noPeers) {\n msgs.push(intl.prep(intl.ID_WALLET_NO_PEERS, { assetSymbol: app().assets[Number(assetID)].symbol.toUpperCase() }))\n }\n }\n }\n\n if (problems.accountSuspended) {\n msgs.push(intl.prep(intl.ID_ACCOUNT_SUSPENDED, { dexHost: dexHost }))\n }\n\n if (problems.userLimitTooLow) {\n msgs.push(intl.prep(intl.ID_USER_LIMIT_TOO_LOW, { dexHost: dexHost }))\n }\n\n if (problems.noPriceSource) {\n msgs.push(intl.prep(intl.ID_NO_PRICE_SOURCE))\n }\n\n if (problems.cexOrderbookUnsynced) {\n msgs.push(intl.prep(intl.ID_CEX_ORDERBOOK_UNSYNCED, { cexName: cexName }))\n }\n\n if (problems.causesSelfMatch) {\n msgs.push(intl.prep(intl.ID_CAUSES_SELF_MATCH))\n }\n\n if (problems.unknownError) {\n msgs.push(problems.unknownError)\n }\n\n return msgs\n}\n\nfunction cexProblemMessages (problems: CEXProblems | undefined): string[] {\n if (!problems) return []\n const msgs: string[] = []\n if (problems.depositErr) {\n for (const [assetID, depositErr] of Object.entries(problems.depositErr)) {\n msgs.push(intl.prep(intl.ID_DEPOSIT_ERROR,\n {\n assetSymbol: app().assets[Number(assetID)].symbol.toUpperCase(),\n time: new Date(depositErr.stamp * 1000).toLocaleString(),\n error: depositErr.error\n }))\n }\n }\n if (problems.withdrawErr) {\n for (const [assetID, withdrawErr] of Object.entries(problems.withdrawErr)) {\n msgs.push(intl.prep(intl.ID_WITHDRAW_ERROR,\n {\n assetSymbol: app().assets[Number(assetID)].symbol.toUpperCase(),\n time: new Date(withdrawErr.stamp * 1000).toLocaleString(),\n error: withdrawErr.error\n }))\n }\n }\n if (problems.tradeErr) {\n msgs.push(intl.prep(intl.ID_CEX_TRADE_ERROR,\n {\n time: new Date(problems.tradeErr.stamp * 1000).toLocaleString(),\n error: problems.tradeErr.error\n }))\n }\n return msgs\n}\n\nfunction safeSub (a: number, b: number) {\n return a - b > 0 ? a - b : 0\n}\n\nwindow.mmstatus = function () : Promise<MarketMakingStatus> {\n return MM.status()\n}\n","import Doc, { Animation } from './doc'\nimport { postJSON } from './http'\nimport State from './state'\nimport * as intl from './locales'\nimport { Wave } from './charts'\nimport {\n bondReserveMultiplier,\n perTierBaseParcelLimit,\n parcelLimitScoreMultiplier,\n strongTier\n} from './account'\nimport {\n app,\n SupportedAsset,\n PageElement,\n WalletDefinition,\n ConfigOption,\n Exchange,\n Market,\n BondAsset,\n WalletState,\n BalanceNote,\n Order,\n XYRange,\n WalletStateNote,\n WalletSyncNote,\n WalletInfo,\n Token,\n WalletCreationNote,\n CoreNote,\n PrepaidBondID,\n WalletTransaction\n} from './registry'\nimport { XYRangeHandler } from './opts'\nimport { CoinExplorers } from './coinexplorers'\nimport { MM, setCexElements } from './mmutil'\n\ninterface ConfigOptionInput extends HTMLInputElement {\n configOpt: ConfigOption\n}\n\ninterface ProgressPoint {\n stamp: number\n progress: number\n}\n\ninterface CurrentAsset {\n asset: SupportedAsset\n parentAsset?: SupportedAsset\n winfo: WalletInfo | Token\n // selectedDef is used in a strange way for tokens. If a token's parent wallet\n // already exists, then selectedDef is going to be the Token.definition.\n // BUT, if the token's parent wallet doesn't exist yet, the NewWalletForm\n // operates in a combined configuration mode, and the selectedDef will be the\n // currently selected parent asset definition. There is no loss of info\n // in such a case, because the token wallet only has one definition.\n selectedDef: WalletDefinition\n}\n\ninterface WalletConfig {\n assetID: number\n config: Record<string, string>\n walletType: string\n}\n\ninterface FormsConfig {\n closed?: (closedForm: PageElement | undefined) => void\n}\n\nexport class Forms {\n formsDiv: PageElement\n currentForm: PageElement | undefined\n currentFormID: string | undefined\n keyup: (e: KeyboardEvent) => void\n closed?: (closedForm: PageElement | undefined) => void\n\n constructor (formsDiv: PageElement, cfg?: FormsConfig) {\n this.formsDiv = formsDiv\n this.closed = cfg?.closed\n\n formsDiv.querySelectorAll('.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => { this.close() })\n })\n\n Doc.bind(formsDiv, 'mousedown', (e: MouseEvent) => {\n if (!this.currentForm) return\n if (!Doc.mouseInElement(e, this.currentForm)) { this.close() }\n })\n\n this.keyup = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.close()\n }\n }\n Doc.bind(document, 'keyup', this.keyup)\n }\n\n /* showForm shows a modal form with a little animation. */\n async show (form: HTMLElement, id?: string): Promise<void> {\n this.currentForm = form\n this.currentFormID = id\n Doc.hide(...Array.from(this.formsDiv.children))\n form.style.right = '10000px'\n Doc.show(this.formsDiv, form)\n const shift = (this.formsDiv.offsetWidth + form.offsetWidth) / 2\n await Doc.animate(animationLength, progress => {\n form.style.right = `${(1 - progress) * shift}px`\n }, 'easeOutHard')\n form.style.right = '0'\n }\n\n close (): void {\n Doc.hide(this.formsDiv)\n const closedForm = this.currentForm\n this.currentForm = undefined\n this.currentFormID = undefined\n if (this.closed) this.closed(closedForm)\n }\n\n exit () {\n Doc.unbind(document, 'keyup', this.keyup)\n }\n}\n\n/*\n * NewWalletForm should be used with the \"newWalletForm\" template. The enclosing\n * <form> element should be the first argument of the constructor.\n */\nexport class NewWalletForm {\n page: Record<string, PageElement>\n form: HTMLElement\n success: (assetID: number) => void\n current: CurrentAsset\n subform: WalletConfigForm\n walletCfgGuide: PageElement\n parentSyncer: null | ((w: WalletState) => void)\n createUpdater: null | ((note: WalletCreationNote) => void)\n\n constructor (form: HTMLElement, success: (assetID: number) => void, backFunc?: () => void) {\n this.form = form\n this.success = success\n const page = this.page = Doc.parseTemplate(form)\n\n if (backFunc) {\n Doc.show(page.goBack)\n Doc.bind(page.goBack, 'click', () => { backFunc() })\n }\n\n Doc.empty(page.walletTabTmpl)\n page.walletTabTmpl.removeAttribute('id')\n\n // WalletConfigForm will set the global app variable.\n this.subform = new WalletConfigForm(page.walletSettings, true)\n\n this.walletCfgGuide = Doc.tmplElement(form, 'walletCfgGuide')\n\n bind(form, page.submitAdd, () => this.submit())\n bind(form, page.oneBttn, () => this.submit())\n\n app().registerNoteFeeder({\n walletstate: (note: WalletStateNote) => { this.reportWalletState(note.wallet) },\n walletsync: (note: WalletSyncNote) => { if (this.parentSyncer) this.parentSyncer(app().walletMap[note.assetID]) },\n createwallet: (note: WalletCreationNote) => { this.reportCreationUpdate(note) }\n })\n }\n\n /*\n * reportWalletState should be called when a 'walletstate' notification is\n * received.\n * TODO: Let form classes register for notifications.\n */\n reportWalletState (w: WalletState): void {\n if (this.parentSyncer) this.parentSyncer(w)\n }\n\n /*\n * reportWalletState should be called when a 'createwallet' notification is\n * received.\n */\n reportCreationUpdate (note: WalletCreationNote) {\n if (this.createUpdater) this.createUpdater(note)\n }\n\n async createWallet (assetID: number, walletType: string, parentForm?: WalletConfig) {\n const createForm = {\n assetID: assetID,\n pass: this.page.newWalletPass.value || '',\n config: this.subform.map(assetID),\n walletType: walletType,\n parentForm: parentForm\n }\n\n const ani = new Wave(this.form, { backgroundColor: true })\n const res = await postJSON('/api/newwallet', createForm)\n ani.stop()\n return res\n }\n\n async submit () {\n const page = this.page\n const newWalletPass = page.newWalletPass as HTMLInputElement\n Doc.hide(page.newWalletErr)\n\n const { asset, parentAsset } = this.current\n const selectedDef = this.current.selectedDef\n let parentForm\n let walletType = selectedDef.type\n if (parentAsset) {\n walletType = (asset.token as Token).definition.type\n parentForm = {\n assetID: parentAsset.id,\n config: this.subform.map(parentAsset.id),\n walletType: selectedDef.type\n }\n }\n // Register the selected asset.\n const res = await this.createWallet(asset.id, walletType, parentForm)\n if (!app().checkResponse(res)) {\n this.setError(res.msg)\n return\n }\n newWalletPass.value = ''\n if (parentAsset) await this.runParentSync()\n else this.success(this.current.asset.id)\n }\n\n /*\n * runParentSync shows a syncing sub-dialog that tracks the parent asset's\n * syncProgress and informs the user that the token wallet will be created\n * after sync is complete.\n */\n async runParentSync () {\n const { page, current: { parentAsset, asset } } = this\n if (!parentAsset) return\n\n page.parentSyncPct.textContent = '0'\n page.parentName.textContent = parentAsset.name\n page.parentLogo.src = Doc.logoPath(parentAsset.symbol)\n page.childName.textContent = asset.name\n page.childLogo.src = Doc.logoPath(asset.symbol)\n Doc.hide(page.mainForm)\n Doc.show(page.parentSyncing)\n\n try {\n await this.syncParent(parentAsset)\n this.success(this.current.asset.id)\n } catch (error) {\n this.setError(error.message || error)\n }\n Doc.show(page.mainForm)\n Doc.hide(page.parentSyncing)\n }\n\n /*\n * syncParent monitors the sync progress of a token's parent asset, generating\n * an Error if the token wallet creation does not complete successfully.\n */\n syncParent (parentAsset: SupportedAsset): Promise<void> {\n const { page, current: { asset } } = this\n return new Promise((resolve, reject) => {\n // First, check if it's already synced.\n const w = app().assets[parentAsset.id].wallet\n if (w && w.synced) return resolve()\n // Not synced, so create a syncer to update the parent sync pane.\n this.parentSyncer = (w: WalletState) => {\n if (w.assetID !== parentAsset.id) return\n page.parentSyncPct.textContent = (w.syncProgress * 100).toFixed(1)\n }\n // Handle the async result.\n this.createUpdater = (note: WalletCreationNote) => {\n if (note.assetID !== asset.id) return\n switch (note.topic) {\n case 'QueuedCreationFailed':\n reject(new Error(`${note.subject}: ${note.details}`))\n break\n case 'QueuedCreationSuccess':\n resolve()\n break\n default:\n return\n }\n this.parentSyncer = null\n this.createUpdater = null\n }\n })\n }\n\n /* setAsset sets the current asset of the NewWalletForm */\n async setAsset (assetID: number) {\n if (!this.parseAsset(assetID)) return // nothing to change\n const page = this.page\n const tabs = page.walletTypeTabs\n const { winfo, asset, parentAsset } = this.current\n page.assetName.textContent = winfo.name\n page.newWalletPass.value = ''\n\n Doc.empty(tabs)\n Doc.hide(tabs, page.newWalletErr, page.tokenMsgBox)\n this.page.assetLogo.src = Doc.logoPath(asset.symbol)\n if (parentAsset) {\n page.tokenParentLogo.src = Doc.logoPath(parentAsset.symbol)\n page.tokenParentName.textContent = parentAsset.name\n Doc.show(page.tokenMsgBox)\n }\n\n const pinfo = parentAsset ? parentAsset.info : null\n const walletDefs = pinfo ? pinfo.availablewallets : (winfo as WalletInfo).availablewallets ? (winfo as WalletInfo).availablewallets : [(winfo as Token).definition]\n\n if (walletDefs.length > 1) {\n Doc.show(tabs)\n for (const wDef of walletDefs) {\n const tab = page.walletTabTmpl.cloneNode(true) as HTMLElement\n tab.dataset.tooltip = wDef.description\n tab.textContent = wDef.tab\n tabs.appendChild(tab)\n Doc.bind(tab, 'click', () => {\n for (const t of Doc.kids(tabs)) t.classList.remove('selected')\n tab.classList.add('selected')\n this.update(wDef)\n })\n }\n app().bindTooltips(tabs)\n const first = tabs.firstChild as HTMLElement\n first.classList.add('selected')\n }\n\n await this.update(this.current.selectedDef)\n if (asset.walletCreationPending) await this.runParentSync()\n }\n\n /*\n * parseAsset parses the current data for the asset ID.\n */\n parseAsset (assetID: number) {\n if (this.current && this.current.asset.id === assetID) return false\n const asset = app().assets[assetID]\n const token = asset.token\n if (!token) {\n if (!asset.info) throw Error('this non-token asset has no wallet info!')\n this.current = { asset, winfo: asset.info, selectedDef: asset.info.availablewallets[0] }\n return true\n }\n const parentAsset = app().user.assets[token.parentID]\n if (parentAsset.wallet) {\n // If the parent asset already has a wallet, there's no need to configure\n // the parent too. Just configure the token.\n this.current = { asset, winfo: token, selectedDef: token.definition }\n return true\n }\n if (!parentAsset.info) throw Error('this parent has no wallet info!')\n this.current = { asset, parentAsset, winfo: token, selectedDef: parentAsset.info.availablewallets[0] }\n return true\n }\n\n async update (walletDef: WalletDefinition) {\n const page = this.page\n this.current.selectedDef = walletDef\n Doc.hide(page.walletPassAndSubmitBttn, page.oneBttnBox, page.newWalletPassBox)\n const guideLink = walletDef.guidelink\n const configOpts = walletDef.configopts || []\n // If a config represents a wallet's birthday, we update the default\n // selection to the current date if this installation of the client\n // generated a seed.\n configOpts.map((opt) => {\n if (opt.isBirthdayConfig && app().seedGenTime > 0) {\n opt.default = toUnixDate(new Date())\n }\n return opt\n })\n // Either this is a walletDef for a token's uncreated parent asset, or this\n // is the definition for the token.\n let containsRequired = false\n for (const opt of configOpts) {\n if (opt.required) {\n containsRequired = true\n break\n }\n }\n const { asset, parentAsset, winfo } = this.current\n const displayCreateBtn = walletDef.seeded || Boolean(asset.token)\n if (displayCreateBtn && !containsRequired) {\n Doc.hide(page.walletSettingsHeader)\n Doc.show(page.oneBttnBox)\n } else if (displayCreateBtn) {\n Doc.show(page.walletPassAndSubmitBttn, page.walletSettingsHeader)\n page.newWalletPass.value = ''\n page.submitAdd.textContent = intl.prep(intl.ID_CREATE)\n } else {\n Doc.show(page.walletPassAndSubmitBttn, page.walletSettingsHeader)\n if (!walletDef.noauth) Doc.show(page.newWalletPassBox)\n page.submitAdd.textContent = intl.prep(intl.ID_ADD)\n }\n\n if (parentAsset) {\n const parentAndTokenOpts = JSON.parse(JSON.stringify(configOpts))\n // Add the regAsset field to the configurations so proper logos will be displayed\n // next to them, and map can filter them out. The opts are copied here so the originals\n // do not have the regAsset field added to them.\n for (const opt of parentAndTokenOpts) opt.regAsset = parentAsset.id\n const tokenOpts = (winfo as Token).definition.configopts || []\n if (tokenOpts.length > 0) {\n const tokenOptsCopy = JSON.parse(JSON.stringify(tokenOpts))\n for (const opt of tokenOptsCopy) opt.regAsset = asset.id\n parentAndTokenOpts.push(...tokenOptsCopy)\n }\n this.subform.update(asset.id, parentAndTokenOpts, false)\n } else this.subform.update(asset.id, configOpts, false)\n this.setGuideLink(guideLink)\n\n // A seeded or token wallet is internal to Bison Wallet and as such does\n // not have an external config file to select.\n if (walletDef.seeded || Boolean(this.current.asset.token)) Doc.hide(this.subform.fileSelector)\n else Doc.show(this.subform.fileSelector)\n\n await this.loadDefaults()\n }\n\n setGuideLink (guideLink: string) {\n Doc.hide(this.walletCfgGuide)\n if (guideLink !== '') {\n this.walletCfgGuide.href = guideLink\n Doc.show(this.walletCfgGuide)\n }\n }\n\n /* setError sets and shows the in-form error message. */\n async setError (errMsg: string) {\n this.page.newWalletErr.textContent = errMsg\n Doc.show(this.page.newWalletErr)\n }\n\n /*\n * loadDefaults attempts to load the ExchangeWallet configuration from the\n * default wallet config path on the server and will auto-fill the page on\n * the subform if settings are found.\n */\n async loadDefaults () {\n // No default config files for seeded assets right now.\n const { asset, parentAsset, selectedDef } = this.current\n if (!selectedDef.configpath) return\n let configID = asset.id\n if (parentAsset) {\n if (selectedDef.seeded) return\n configID = parentAsset.id\n }\n const loaded = app().loading(this.form)\n const res = await postJSON('/api/defaultwalletcfg', {\n assetID: configID,\n type: selectedDef.type\n })\n loaded()\n if (!app().checkResponse(res)) {\n this.setError(res.msg)\n return\n }\n this.subform.setLoadedConfig(res.config)\n }\n}\n\nlet dynamicInputCounter = 0\n\n/*\n * WalletConfigForm is a dynamically generated sub-form for setting\n * asset-specific wallet configuration options.\n*/\nexport class WalletConfigForm {\n page: Record<string, PageElement>\n form: HTMLElement\n configElements: [ConfigOption, HTMLElement][]\n configOpts: ConfigOption[]\n sectionize: boolean\n allSettings: PageElement\n dynamicOpts: PageElement\n textInputTmpl: PageElement\n dateInputTmpl: PageElement\n checkboxTmpl: PageElement\n repeatableTmpl: PageElement\n fileSelector: PageElement\n fileInput: PageElement\n errMsg: PageElement\n showOther: PageElement\n showIcon: PageElement\n hideIcon: PageElement\n showHideMsg: PageElement\n otherSettings: PageElement\n loadedSettingsMsg: PageElement\n loadedSettings: PageElement\n defaultSettingsMsg: PageElement\n defaultSettings: PageElement\n assetHasActiveOrders: boolean\n assetID: number\n\n constructor (form: HTMLElement, sectionize: boolean) {\n this.page = Doc.idDescendants(form)\n this.form = form\n // A configElement is a div containing an input and its label.\n this.configElements = []\n // configOpts is the wallet options provided by core.\n this.configOpts = []\n this.sectionize = sectionize\n\n // Get template elements\n this.allSettings = Doc.tmplElement(form, 'allSettings')\n this.dynamicOpts = Doc.tmplElement(form, 'dynamicOpts')\n this.textInputTmpl = Doc.tmplElement(form, 'textInput')\n this.textInputTmpl.remove()\n this.dateInputTmpl = Doc.tmplElement(form, 'dateInput')\n this.dateInputTmpl.remove()\n this.checkboxTmpl = Doc.tmplElement(form, 'checkbox')\n this.checkboxTmpl.remove()\n this.repeatableTmpl = Doc.tmplElement(form, 'repeatableInput')\n this.repeatableTmpl.remove()\n this.fileSelector = Doc.tmplElement(form, 'fileSelector')\n this.fileInput = Doc.tmplElement(form, 'fileInput')\n this.errMsg = Doc.tmplElement(form, 'errMsg')\n this.showOther = Doc.tmplElement(form, 'showOther')\n this.showIcon = Doc.tmplElement(form, 'showIcon')\n this.hideIcon = Doc.tmplElement(form, 'hideIcon')\n this.showHideMsg = Doc.tmplElement(form, 'showHideMsg')\n this.otherSettings = Doc.tmplElement(form, 'otherSettings')\n this.loadedSettingsMsg = Doc.tmplElement(form, 'loadedSettingsMsg')\n this.loadedSettings = Doc.tmplElement(form, 'loadedSettings')\n this.defaultSettingsMsg = Doc.tmplElement(form, 'defaultSettingsMsg')\n this.defaultSettings = Doc.tmplElement(form, 'defaultSettings')\n\n if (!sectionize) Doc.hide(this.showOther)\n\n Doc.bind(this.fileSelector, 'click', () => this.fileInput.click())\n\n // config file upload\n Doc.bind(this.fileInput, 'change', async () => this.fileInputChanged())\n\n Doc.bind(this.showOther, 'click', () => {\n this.setOtherSettingsViz(this.hideIcon.classList.contains('d-hide'))\n })\n }\n\n /*\n * fileInputChanged will read the selected file and attempt to load the\n * configuration settings. All loaded settings will be made visible for\n * inspection by the user.\n */\n async fileInputChanged () {\n Doc.hide(this.errMsg)\n if (!this.fileInput.value) return\n const files = this.fileInput.files\n if (!files || files.length === 0) return\n const loaded = app().loading(this.form)\n const config = await files[0].text()\n if (!config) return\n const res = await postJSON('/api/parseconfig', {\n configtext: config\n })\n loaded()\n if (!app().checkResponse(res)) {\n this.errMsg.textContent = res.msg\n Doc.show(this.errMsg)\n return\n }\n if (Object.keys(res.map).length === 0) return\n this.dynamicOpts.append(...this.setConfig(res.map))\n this.reorder(this.dynamicOpts)\n const [loadedOpts, defaultOpts] = [this.loadedSettings.children.length, this.defaultSettings.children.length]\n if (loadedOpts === 0) Doc.hide(this.loadedSettings, this.loadedSettingsMsg)\n if (defaultOpts === 0) Doc.hide(this.defaultSettings, this.defaultSettingsMsg)\n if (loadedOpts + defaultOpts === 0) Doc.hide(this.showOther, this.otherSettings)\n }\n\n addOpt (box: HTMLElement, opt: ConfigOption, insertAfter?: PageElement, skipRepeatN?: boolean): PageElement {\n let el: HTMLElement\n if (opt.isboolean) el = this.checkboxTmpl.cloneNode(true) as HTMLElement\n else if (opt.isdate) el = this.dateInputTmpl.cloneNode(true) as HTMLElement\n else if (opt.repeatable) {\n el = this.repeatableTmpl.cloneNode(true) as HTMLElement\n el.classList.add('repeatable')\n Doc.bind(Doc.tmplElement(el, 'add'), 'click', () => {\n this.addOpt(box, opt, el, true)\n })\n if (!skipRepeatN) for (let i = 0; i < (opt.repeatN ? opt.repeatN - 1 : 0); i++) this.addOpt(box, opt, insertAfter, true)\n } else el = this.textInputTmpl.cloneNode(true) as HTMLElement\n const hiddenFields = app().extensionWallet(this.assetID)?.hiddenFields || []\n if (hiddenFields.indexOf(opt.key) !== -1) Doc.hide(el)\n this.configElements.push([opt, el])\n const input = el.querySelector('input') as ConfigOptionInput\n input.dataset.configKey = opt.key\n // We need to generate a unique ID only for the <input id> => <label for>\n // matching.\n dynamicInputCounter++\n const elID = 'wcfg-' + String(dynamicInputCounter)\n input.id = elID\n const label = Doc.safeSelector(el, 'label')\n label.htmlFor = elID // 'for' attribute, but 'for' is a keyword\n label.prepend(opt.displayname)\n if (opt.regAsset !== undefined) {\n const logo = new window.Image(15, 15)\n logo.src = Doc.logoPathFromID(opt.regAsset || -1)\n label.prepend(logo)\n }\n if (insertAfter) insertAfter.after(el)\n else box.appendChild(el)\n if (opt.noecho) {\n input.type = 'password'\n input.autocomplete = 'off'\n }\n if (opt.description) label.dataset.tooltip = opt.description\n if (opt.isboolean) input.checked = opt.default\n else if (opt.isdate) {\n const getMinMaxVal = (minMax: string | number) => {\n if (!minMax) return ''\n if (minMax === 'now') return dateToString(new Date())\n return dateToString(new Date((minMax as number) * 1000))\n }\n input.max = getMinMaxVal(opt.max)\n input.min = getMinMaxVal(opt.min)\n const date = opt.default ? new Date(opt.default * 1000) : new Date()\n // UI shows Dates in valueAsDate as UTC, but user interprets local. Set a\n // local date string so the UI displays what the user expects. alt:\n // input.valueAsDate = dateApplyOffset(date)\n input.value = dateToString(date)\n } else input.value = opt.default !== null ? opt.default : ''\n input.disabled = Boolean(opt.disablewhenactive && this.assetHasActiveOrders)\n return el\n }\n\n /*\n * update creates the dynamic form.\n */\n update (assetID: number, configOpts: ConfigOption[] | null, activeOrders: boolean) {\n this.assetHasActiveOrders = activeOrders\n this.configElements = []\n this.configOpts = configOpts || []\n this.assetID = assetID\n Doc.empty(this.dynamicOpts, this.defaultSettings, this.loadedSettings)\n\n // If there are no options, just hide the entire form.\n if (this.configOpts.length === 0) return Doc.hide(this.form)\n Doc.show(this.form)\n\n this.setOtherSettingsViz(false)\n Doc.hide(\n this.loadedSettingsMsg, this.loadedSettings, this.defaultSettingsMsg,\n this.defaultSettings, this.errMsg\n )\n const defaultedOpts = []\n for (const opt of this.configOpts) {\n if (this.sectionize && opt.default !== null) defaultedOpts.push(opt)\n else this.addOpt(this.dynamicOpts, opt)\n }\n if (defaultedOpts.length) {\n for (const opt of defaultedOpts) this.addOpt(this.defaultSettings, opt)\n Doc.show(this.showOther, this.defaultSettingsMsg, this.defaultSettings)\n } else {\n Doc.hide(this.showOther)\n }\n app().bindTooltips(this.allSettings)\n if (this.dynamicOpts.children.length) Doc.show(this.dynamicOpts)\n else Doc.hide(this.dynamicOpts)\n }\n\n /*\n * setOtherSettingsViz sets the visibility of the additional settings section.\n */\n setOtherSettingsViz (visible: boolean) {\n if (visible) {\n Doc.hide(this.showIcon)\n Doc.show(this.hideIcon, this.otherSettings)\n this.showHideMsg.textContent = intl.prep(intl.ID_HIDE_ADDITIONAL_SETTINGS)\n return\n }\n Doc.hide(this.hideIcon, this.otherSettings)\n Doc.show(this.showIcon)\n this.showHideMsg.textContent = intl.prep(intl.ID_SHOW_ADDITIONAL_SETTINGS)\n }\n\n /*\n * setConfig looks for inputs with configOpt keys matching the cfg object, and\n * sets the inputs value to the corresponding cfg value. A list of matching\n * configElements is returned.\n */\n setConfig (cfg: Record<string, string>): HTMLElement[] {\n const finds: HTMLElement[] = []\n const handledRepeatables: Record<string, boolean> = {}\n const removes: [ConfigOption, PageElement][] = []\n for (const r of [...this.configElements]) {\n const [opt, el] = r\n const v = cfg[opt.key]\n if (v === undefined) continue\n if (opt.repeatable) {\n if (handledRepeatables[opt.key]) {\n el.remove()\n removes.push(r)\n continue\n }\n handledRepeatables[opt.key] = true\n const vals = v.split(opt.repeatable)\n const firstVal = vals[0]\n finds.push(el)\n Doc.safeSelector(el, 'input').value = firstVal\n // Add repeatN - 1 empty elements to the reconfig form. Add them before\n // the populated inputs just because of the way we're using the\n // insertAfter argument to addOpt.\n for (let i = 1; i < (opt.repeatN || 1); i++) finds.push(this.addOpt(el.parentElement as PageElement, opt, el, true))\n for (let i = 1; i < vals.length; i++) {\n const newEl = this.addOpt(el.parentElement as PageElement, opt, el, true)\n Doc.safeSelector(newEl, 'input').value = vals[i]\n finds.push(newEl)\n }\n continue\n }\n finds.push(el)\n const input = Doc.safeSelector(el, 'input') as HTMLInputElement\n if (opt.isboolean) input.checked = isTruthyString(v)\n else if (opt.isdate) {\n input.value = dateToString(new Date(parseInt(v) * 1000))\n // alt: input.valueAsDate = dateApplyOffset(...)\n } else input.value = v\n }\n for (const r of removes) {\n const i = this.configElements.indexOf(r)\n if (i >= 0) this.configElements.splice(i, 1)\n }\n\n return finds\n }\n\n /*\n * setLoadedConfig sets the input values for the entries in cfg, and moves\n * them to the loadedSettings box.\n */\n setLoadedConfig (cfg: Record<string, string>) {\n const finds = this.setConfig(cfg)\n if (!this.sectionize || finds.length === 0) return\n this.loadedSettings.append(...finds)\n this.reorder(this.loadedSettings)\n Doc.show(this.loadedSettings, this.loadedSettingsMsg)\n if (this.defaultSettings.children.length === 0) Doc.hide(this.defaultSettings, this.defaultSettingsMsg)\n }\n\n /*\n * map reads all inputs and constructs an object from the configOpt keys and\n * values.\n */\n map (assetID: number): Record<string, string> {\n const config: Record<string, string> = {}\n for (const [opt, el] of this.configElements) {\n const input = Doc.safeSelector(el, 'input') as HTMLInputElement\n if (opt.regAsset !== undefined && opt.regAsset !== assetID) continue\n if (opt.isboolean && opt.key) {\n config[opt.key] = input.checked ? '1' : '0'\n } else if (opt.isdate && opt.key) {\n // Force local time interpretation by appending a time to the date\n // string, otherwise the Date constructor considers it UTC.\n const minDate = input.min ? toUnixDate(new Date(input.min + 'T00:00')) : Number.MIN_SAFE_INTEGER\n const maxDate = input.max ? toUnixDate(new Date(input.max + 'T00:00')) : Number.MAX_SAFE_INTEGER\n let date = input.value ? toUnixDate(new Date(input.value + 'T00:00')) : 0\n if (date < minDate) date = minDate\n else if (date > maxDate) date = maxDate\n config[opt.key] = String(date)\n } else if (input.value) {\n if (opt.repeatable && config[opt.key]) config[opt.key] += opt.repeatable + input.value\n else config[opt.key] = input.value\n }\n }\n return config\n }\n\n /*\n * reorder sorts the configElements in the box by the order of the\n * server-provided configOpts array.\n */\n reorder (box: HTMLElement) {\n const inputs: Record<string, HTMLElement[]> = {}\n box.querySelectorAll('input').forEach((input: ConfigOptionInput) => {\n const k = input.dataset.configKey\n if (!k) return // TS2538\n const els = []\n for (const [opt, el] of this.configElements) if (opt.key === k) els.push(el)\n inputs[k] = els\n })\n for (const opt of this.configOpts) {\n const els = inputs[opt.key] || []\n for (const el of els) box.append(el)\n }\n }\n}\n\n/*\n * ConfirmRegistrationForm should be used with the \"confirmRegistrationForm\"\n * template.\n */\nexport class ConfirmRegistrationForm {\n form: HTMLElement\n success: () => void\n page: Record<string, PageElement>\n xc: Exchange\n certFile: string\n bondAssetID: number\n tier: number\n fees: number\n\n constructor (form: HTMLElement, success: () => void, goBack: () => void) {\n this.form = form\n this.success = success\n this.page = Doc.parseTemplate(form)\n this.certFile = ''\n\n Doc.bind(this.page.goBack, 'click', () => goBack())\n bind(form, this.page.submit, () => this.submitForm())\n }\n\n setExchange (xc: Exchange, certFile: string) {\n this.xc = xc\n this.certFile = certFile\n this.page.host.textContent = xc.host\n }\n\n setAsset (assetID: number, tier: number, fees: number) {\n const asset = app().assets[assetID]\n const { conversionFactor, unit } = asset.unitInfo.conventional\n this.bondAssetID = asset.id\n this.tier = tier\n this.fees = fees\n const page = this.page\n const bondAsset = this.xc.bondAssets[asset.symbol]\n const bondLock = bondAsset.amount * tier * bondReserveMultiplier\n const bondLockConventional = bondLock / conversionFactor\n page.tradingTier.textContent = String(tier)\n page.logo.src = Doc.logoPath(asset.symbol)\n page.bondLock.textContent = Doc.formatFourSigFigs(bondLockConventional)\n page.bondUnit.textContent = unit\n const r = app().fiatRatesMap[assetID]\n Doc.show(page.bondLockUSDBox)\n if (r) page.bondLockUSD.textContent = Doc.formatFourSigFigs(bondLockConventional * r)\n else Doc.hide(page.bondLockUSDBox)\n if (fees) page.feeReserves.textContent = Doc.formatFourSigFigs(fees / conversionFactor)\n page.reservesUnit.textContent = unit\n }\n\n setFees (assetID: number, fees: number) {\n this.fees = fees\n const conversionFactor = app().assets[assetID].unitInfo.conventional.conversionFactor\n this.page.feeReserves.textContent = Doc.formatFourSigFigs(fees / conversionFactor)\n }\n\n /* Form expands into its space quickly from the lower-right as it fades in. */\n async animate () {\n const form = this.form\n Doc.animate(400, prog => {\n form.style.transform = `scale(${prog})`\n form.style.opacity = String(Math.pow(prog, 4))\n const offset = `${(1 - prog) * 500}px`\n form.style.top = offset\n form.style.left = offset\n })\n }\n\n /*\n * submitForm is called when the form is submitted.\n */\n async submitForm () {\n const { page, bondAssetID, xc, certFile, tier } = this\n const asset = app().assets[bondAssetID]\n if (!asset) {\n page.regErr.innerText = intl.prep(intl.ID_SELECT_WALLET_FOR_FEE_PAYMENT)\n Doc.show(page.regErr)\n return\n }\n Doc.hide(page.regErr)\n const bondAsset = xc.bondAssets[asset.wallet.symbol]\n const dexAddr = xc.host\n let form: any\n let url: string\n if (!app().exchanges[xc.host] || app().exchanges[xc.host].viewOnly) {\n form = {\n addr: dexAddr,\n cert: certFile,\n bond: bondAsset.amount * tier,\n asset: bondAsset.id\n }\n url = '/api/postbond'\n } else {\n form = {\n host: dexAddr,\n targetTier: tier,\n bondAssetID: bondAssetID\n }\n url = '/api/updatebondoptions'\n }\n const loaded = app().loading(this.form)\n const res = await postJSON(url, form)\n loaded()\n if (!app().checkResponse(res)) {\n page.regErr.textContent = res.msg\n Doc.show(page.regErr)\n return\n }\n this.success()\n }\n}\n\ninterface RegAssetRow {\n ready: PageElement\n}\n\ninterface MarketLimitsRow {\n mkt: Market\n tmpl: Record<string, PageElement>\n setTier: ((tier: number) => void)\n}\n\n/*\n * FeeAssetSelectionForm should be used with the \"regAssetForm\" template.\n */\nexport class FeeAssetSelectionForm {\n form: HTMLElement\n success: (assetID: number, tier: number) => Promise<void>\n xc: Exchange\n selectedAssetID: number\n certFile: string\n page: Record<string, PageElement>\n assetRows: Record<string, RegAssetRow>\n marketRows: MarketLimitsRow[]\n\n constructor (form: HTMLElement, success: (assetID: number, tier: number) => Promise<void>) {\n this.form = form\n this.certFile = ''\n this.success = success\n const page = this.page = Doc.parseTemplate(form)\n Doc.cleanTemplates(page.currentBondTmpl, page.bondAssetTmpl, page.marketTmpl)\n\n Doc.bind(page.tradingTierInput, 'input', () => { this.setTier() })\n Doc.bind(page.tradingTierInput, 'keyup', (e: KeyboardEvent) => { if (e.key === 'Enter') this.acceptTier() })\n Doc.bind(page.submitTradingTier, 'click', () => { this.acceptTier() })\n\n Doc.bind(page.tierUp, 'click', () => { this.incrementTier(true) })\n Doc.bind(page.tierDown, 'click', () => { this.incrementTier(false) })\n\n Doc.bind(page.goBackToAssets, 'click', () => {\n Doc.hide(page.tradingTierForm)\n Doc.show(page.assetForm)\n })\n\n Doc.bind(page.whatsABond, 'click', () => {\n Doc.hide(page.assetForm)\n Doc.show(page.whatsABondPanel)\n })\n\n const hideWhatsABond = () => {\n Doc.show(page.assetForm)\n Doc.hide(page.whatsABondPanel)\n }\n\n Doc.bind(page.bondGotIt, 'click', () => { hideWhatsABond() })\n\n Doc.bind(page.whatsABondBack, 'click', () => { hideWhatsABond() })\n\n Doc.bind(page.usePrepaidBond, 'click', () => { this.showPrepaidBondForm() })\n Doc.bind(page.ppbGoBack, 'click', () => { this.hidePrepaidBondForm() })\n Doc.bind(page.submitPrepaidBond, 'click', () => { this.submitPrepaidBond() })\n\n app().registerNoteFeeder({\n createwallet: (note: WalletCreationNote) => {\n if (note.topic === 'QueuedCreationSuccess') this.walletCreated(note.assetID)\n }\n })\n }\n\n setTierError (errMsg: string) {\n this.page.tradingTierErr.textContent = errMsg\n Doc.show(this.page.tradingTierErr)\n }\n\n setAssetError (errMsg: string) {\n this.page.regAssetErr.textContent = errMsg\n Doc.show(this.page.regAssetErr)\n }\n\n clearErrors () {\n Doc.hide(this.page.regAssetErr, this.page.tradingTierErr)\n }\n\n setExchange (xc: Exchange, certFile: string) {\n this.xc = xc\n this.certFile = certFile\n this.assetRows = {}\n this.marketRows = []\n const page = this.page\n Doc.hide(page.assetForm, page.tradingTierForm, page.whatsABondPanel, page.prepaidBonds)\n Doc.empty(page.bondAssets, page.markets)\n this.clearErrors()\n\n const addBondRow = (assetID: number, bondAsset: BondAsset) => {\n const asset = app().assets[assetID]\n if (!asset) return\n const { unitInfo: { conventional: { unit, conversionFactor } }, name, symbol } = asset\n const tr = page.bondAssetTmpl.cloneNode(true) as HTMLElement\n page.bondAssets.appendChild(tr)\n const tmpl = Doc.parseTemplate(tr)\n\n tmpl.logo.src = Doc.logoPath(symbol)\n tmpl.name.textContent = name\n\n Doc.bind(tr, 'click', () => { this.assetSelected(assetID) })\n tmpl.feeSymbol.textContent = unit\n const bondSizeConventional = bondAsset.amount / conversionFactor\n tmpl.feeAmt.textContent = Doc.formatFourSigFigs(bondSizeConventional)\n const fiatRate = app().fiatRatesMap[assetID]\n Doc.setVis(fiatRate, tmpl.fiatBox)\n if (fiatRate) tmpl.fiatBondAmount.textContent = Doc.formatFourSigFigs(bondSizeConventional * fiatRate)\n this.assetRows[assetID] = { ready: tmpl.ready }\n }\n\n const addMarketRow = (mkt: Market) => {\n const { baseid: baseID, quoteid: quoteID } = mkt\n const [b, q] = [app().assets[baseID], app().assets[quoteID]]\n if (!b || !q) return\n const tr = page.marketTmpl.cloneNode(true) as HTMLElement\n page.markets.appendChild(tr)\n const { symbol: baseSymbol, unitInfo: bui } = xc.assets[baseID]\n const { symbol: quoteSymbol, unitInfo: qui } = xc.assets[quoteID]\n for (const el of Doc.applySelector(tr, '[data-base-ticker]')) el.textContent = bui.conventional.unit\n for (const el of Doc.applySelector(tr, '[data-quote-ticker]')) el.textContent = qui.conventional.unit\n\n const tmpl = Doc.parseTemplate(tr)\n tmpl.baseLogo.src = Doc.logoPath(baseSymbol)\n tmpl.quoteLogo.src = Doc.logoPath(quoteSymbol)\n\n const setTier = (tier: number) => {\n const { parcelsize: parcelSize, lotsize: lotSize } = mkt\n const conventionalLotSize = lotSize / bui.conventional.conversionFactor\n const startingLimit = conventionalLotSize * parcelSize * perTierBaseParcelLimit * tier\n const privilegedLimit = conventionalLotSize * parcelSize * perTierBaseParcelLimit * parcelLimitScoreMultiplier * tier\n tmpl.tradeLimitLow.textContent = Doc.formatFourSigFigs(startingLimit)\n tmpl.tradeLimitHigh.textContent = Doc.formatFourSigFigs(privilegedLimit)\n const baseFiatRate = app().fiatRatesMap[baseID]\n if (baseFiatRate) {\n tmpl.fiatTradeLimitLow.textContent = Doc.formatFourSigFigs(startingLimit * baseFiatRate)\n tmpl.fiatTradeLimitHigh.textContent = Doc.formatFourSigFigs(privilegedLimit * baseFiatRate)\n }\n Doc.setVis(baseFiatRate, page.fiatTradeLowBox, page.fiatTradeHighBox)\n }\n\n setTier(strongTier(xc.auth) || 1)\n this.marketRows.push({ mkt, tmpl, setTier })\n }\n\n for (const { symbol, id: assetID } of Object.values(xc.assets || {})) {\n if (!app().assets[assetID]) continue\n const bondAsset = xc.bondAssets[symbol]\n if (bondAsset) addBondRow(assetID, bondAsset)\n }\n\n for (const mkt of Object.values(xc.markets || {})) addMarketRow(mkt)\n\n // page.host.textContent = xc.host\n page.tradingTierInput.value = xc.auth.targetTier ? String(xc.auth.targetTier) : '1'\n\n if (this.validBondAssetSelected(xc)) this.assetSelected(xc.auth.bondAssetID)\n else Doc.show(page.assetForm)\n }\n\n validBondAssetSelected (xc: Exchange) {\n if (xc.viewOnly) return false\n const { targetTier, bondAssetID } = xc.auth\n if (targetTier < 1) return false\n const a = app().assets[bondAssetID]\n return a && Boolean(xc.bondAssets[a.symbol])\n }\n\n /*\n * walletCreated should be called when an asynchronous wallet creation\n * completes successfully.\n */\n walletCreated (assetID: number) {\n const a = this.assetRows[assetID]\n const asset = app().assets[assetID]\n setReadyMessage(a.ready, asset)\n }\n\n refresh () {\n this.setExchange(this.xc, this.certFile)\n }\n\n assetSelected (assetID: number) {\n this.selectedAssetID = assetID\n this.setTier()\n const { page: { assetForm, tradingTierForm, tradingTierInput } } = this\n Doc.hide(assetForm)\n Doc.show(tradingTierForm)\n tradingTierInput.focus()\n }\n\n setTier () {\n const { page, xc: { bondAssets }, selectedAssetID: assetID } = this\n const { symbol, unitInfo: ui } = app().assets[assetID]\n const { conventional: { conversionFactor, unit } } = ui\n\n const bondAsset = bondAssets[symbol]\n const raw = page.tradingTierInput.value ?? ''\n if (!raw) return\n const tier = parseInt(raw)\n if (isNaN(tier)) {\n this.setTierError(intl.prep(intl.ID_INVALID_TIER_VALUE))\n return\n }\n page.tradingTierInput.value = String(tier)\n page.bondSizeDisplay.textContent = Doc.formatCoinValue(bondAsset.amount, ui)\n for (const el of Doc.applySelector(page.tradingTierForm, '[data-tier]')) el.textContent = String(tier)\n for (const el of Doc.applySelector(page.tradingTierForm, '[data-bond-asset-ticker]')) el.textContent = unit\n const bondLock = bondAsset.amount * tier * bondReserveMultiplier\n page.bondLockDisplay.textContent = Doc.formatCoinValue(bondLock, ui)\n const fiatRate = app().fiatRatesMap[assetID]\n if (fiatRate) page.fiatLockDisplay.textContent = Doc.formatFourSigFigs(bondLock / conversionFactor * fiatRate)\n for (const m of Object.values(this.marketRows)) m.setTier(tier)\n const currentBondAmts: Record<number, number> = {}\n for (const [assetIDStr, { wallet }] of Object.entries(app().assets)) {\n if (!wallet) continue\n const { balance: { bondlocked, bondReserves } } = wallet\n const bonded = bondlocked + bondReserves\n if (bonded > 0) currentBondAmts[parseInt(assetIDStr)] = bonded\n }\n const haveLock = Object.keys(currentBondAmts).length > 0\n Doc.setVis(haveLock, page.currentBondBox)\n if (haveLock) {\n Doc.empty(page.currentBonds)\n for (const [assetIDStr, bondLocked] of Object.entries(currentBondAmts)) {\n const assetID = parseInt(assetIDStr)\n const { unitInfo: ui, symbol, name } = app().assets[assetID]\n const { conventional: { conversionFactor, unit } } = ui\n const tr = page.currentBondTmpl.cloneNode(true) as PageElement\n page.currentBonds.appendChild(tr)\n const tmpl = Doc.parseTemplate(tr)\n tmpl.icon.src = Doc.logoPath(symbol)\n tmpl.name.textContent = name\n tmpl.amt.textContent = Doc.formatCoinValue(bondLocked, ui)\n tmpl.ticker.textContent = unit\n tmpl.name.textContent = name\n const fiatRate = app().fiatRatesMap[assetID]\n Doc.setVis(tmpl.fiatBox)\n if (fiatRate) tmpl.fiatAmt.textContent = Doc.formatFourSigFigs(bondLocked / conversionFactor * fiatRate)\n }\n }\n Doc.setVis(fiatRate, page.fiatLockBox)\n }\n\n acceptTier () {\n const { page, selectedAssetID: assetID } = this\n this.clearErrors()\n const raw = page.tradingTierInput.value ?? ''\n if (!raw) return\n const tier = parseInt(raw)\n if (isNaN(tier)) {\n this.setTierError(intl.prep(intl.ID_INVALID_TIER_VALUE))\n return\n }\n this.success(assetID, tier)\n }\n\n incrementTier (up: boolean) {\n const { page: { tradingTierInput: input } } = this\n input.value = String(Math.max(1, (parseInt(input.value ?? '') || 1) + (up ? 1 : -1)))\n this.setTier()\n }\n\n /*\n * Animation to make the elements sort of expand into their space from the\n * bottom as they fade in.\n */\n async animate () {\n const { page, form } = this\n const extraMargin = 75\n const extraTop = 50\n const regAssetElements = Array.from(page.bondAssets.children) as PageElement[]\n form.style.opacity = '0'\n\n const aniLen = 350\n await Doc.animate(aniLen, prog => {\n for (const el of regAssetElements) {\n el.style.marginTop = `${(1 - prog) * extraMargin}px`\n el.style.transform = `scale(${prog})`\n }\n form.style.opacity = Math.pow(prog, 4).toFixed(1)\n form.style.top = `${(1 - prog) * extraTop}px`\n }, 'easeOut')\n }\n\n showPrepaidBondForm () {\n const { page } = this\n Doc.hide(page.assetForm, page.prepaidBondErr)\n page.prepaidBondCode.value = ''\n Doc.show(page.prepaidBonds)\n }\n\n hidePrepaidBondForm () {\n const { page } = this\n Doc.hide(page.prepaidBonds)\n Doc.show(page.assetForm)\n }\n\n async submitPrepaidBond () {\n const { page, xc: { host } } = this\n Doc.hide(page.prepaidBondErr)\n const code = page.prepaidBondCode.value\n if (!code) {\n page.prepaidBondErr.textContent = intl.prep(intl.ID_INVALID_VALUE)\n Doc.show(page.prepaidBondErr)\n return\n }\n const res = await postJSON('/api/redeemprepaidbond', { host, code, cert: this.certFile })\n if (!app().checkResponse(res)) {\n page.prepaidBondErr.textContent = res.msg\n Doc.show(page.prepaidBondErr)\n return\n }\n this.success(PrepaidBondID, res.tier)\n }\n}\n\n/*\n * setReadyMessage sets an asset's status message on the FeeAssetSelectionForm.\n */\nfunction setReadyMessage (el: PageElement, asset: SupportedAsset) {\n if (asset.wallet) el.textContent = intl.prep(intl.ID_WALLET_READY)\n else if (asset.walletCreationPending) el.textContent = intl.prep(intl.ID_WALLET_PENDING)\n else el.textContent = intl.prep(intl.ID_SETUP_NEEDED)\n el.classList.remove('readygreen', 'setuporange')\n el.classList.add(asset.wallet ? 'readygreen' : 'setuporange')\n}\n\n/*\n * WalletWaitForm is a form used to track the wallet sync status and balance\n * in preparation for posting a bond.\n */\nexport class WalletWaitForm {\n form: HTMLElement\n success: () => void\n goBack: () => void\n page: Record<string, PageElement>\n assetID: number\n parentID?: number\n xc: Exchange\n bondAsset: BondAsset\n progressCache: ProgressPoint[]\n progressed: boolean\n funded: boolean\n // if progressed && funded, stop reporting balance or state; call success()\n bondFeeBuffer: number // in parent asset\n parentAssetSynced: boolean\n\n constructor (form: HTMLElement, success: () => void, goBack: () => void) {\n this.form = form\n this.success = success\n this.page = Doc.parseTemplate(form)\n this.assetID = -1\n this.progressCache = []\n this.progressed = false\n this.funded = false\n\n Doc.bind(this.page.goBack, 'click', () => {\n this.assetID = -1\n goBack()\n })\n\n app().registerNoteFeeder({\n walletstate: (note: WalletStateNote) => this.reportWalletState(note.wallet),\n walletsync: (note: WalletSyncNote) => {\n if (note.assetID !== this.assetID) return\n const w = app().walletMap[note.assetID]\n this.reportProgress(w.synced, w.syncProgress)\n },\n balance: (note: BalanceNote) => this.reportBalance(note.assetID)\n })\n }\n\n /* setExchange sets the exchange for which the fee is being paid. */\n setExchange (xc: Exchange) {\n this.xc = xc\n }\n\n /* setWallet must be called before showing the WalletWaitForm. */\n setWallet (assetID: number, bondFeeBuffer: number, tier: number) {\n this.assetID = assetID\n this.progressCache = []\n this.progressed = false\n this.funded = false\n this.bondFeeBuffer = bondFeeBuffer // in case we're a token, parent's balance must cover\n this.parentAssetSynced = false\n const page = this.page\n const asset = app().assets[assetID]\n const { symbol, unitInfo: ui, wallet: { balance: bal, address, synced, syncProgress }, token } = asset\n this.parentID = token?.parentID\n const bondAsset = this.bondAsset = this.xc.bondAssets[symbol]\n\n const symbolize = (el: PageElement, asset: SupportedAsset) => {\n Doc.empty(el)\n el.appendChild(Doc.symbolize(asset))\n }\n\n for (const span of Doc.applySelector(this.form, '.unit')) symbolize(span, asset)\n page.logo.src = Doc.logoPath(symbol)\n page.depoAddr.textContent = address\n\n Doc.hide(page.syncUncheck, page.syncCheck, page.balUncheck, page.balCheck, page.syncRemainBox, page.bondCostBreakdown)\n Doc.show(page.balanceBox)\n\n let bondLock = 2 * bondAsset.amount * tier\n if (bondFeeBuffer > 0) {\n Doc.show(page.bondCostBreakdown)\n page.bondLockNoFees.textContent = Doc.formatCoinValue(bondLock, ui)\n page.bondLockFees.textContent = Doc.formatCoinValue(bondFeeBuffer, ui)\n bondLock += bondFeeBuffer\n const need = Math.max(bondLock - bal.available + bal.reservesDeficit, 0)\n page.totalForBond.textContent = Doc.formatCoinValue(need, ui)\n Doc.hide(page.sendEnough) // generic msg when no fee info available when\n Doc.hide(page.txFeeBox, page.sendEnoughForToken, page.txFeeBalanceBox) // for tokens\n Doc.hide(page.sendEnoughWithEst) // non-tokens\n\n if (token) {\n Doc.show(page.txFeeBox, page.sendEnoughForToken, page.txFeeBalanceBox)\n const parentAsset = app().assets[token.parentID]\n page.txFee.textContent = Doc.formatCoinValue(bondFeeBuffer, parentAsset.unitInfo)\n page.parentFees.textContent = Doc.formatCoinValue(bondFeeBuffer, parentAsset.unitInfo)\n page.tokenFees.textContent = Doc.formatCoinValue(need, ui)\n symbolize(page.txFeeUnit, parentAsset)\n symbolize(page.parentUnit, parentAsset)\n symbolize(page.parentBalUnit, parentAsset)\n page.parentBal.textContent = parentAsset.wallet ? Doc.formatCoinValue(parentAsset.wallet.balance.available, parentAsset.unitInfo) : '0'\n } else {\n Doc.show(page.sendEnoughWithEst)\n }\n page.fee.textContent = Doc.formatCoinValue(bondLock, ui)\n } else { // show some generic message with no amounts, this shouldn't happen... show wallet error?\n Doc.show(page.sendEnough)\n }\n\n Doc.show(synced ? page.syncCheck : syncProgress >= 1 ? page.syncSpinner : page.syncUncheck)\n Doc.show(bal.available >= 2 * bondAsset.amount + bondFeeBuffer ? page.balCheck : page.balUncheck)\n\n page.progress.textContent = (syncProgress * 100).toFixed(1)\n\n if (synced) {\n this.progressed = true\n }\n this.reportBalance(assetID)\n }\n\n /*\n * reportWalletState sets the progress and balance, ultimately calling the\n * success function if conditions are met.\n */\n reportWalletState (wallet: WalletState) {\n if (this.progressed && this.funded) return\n if (wallet.assetID === this.assetID) this.reportProgress(wallet.synced, wallet.syncProgress)\n this.reportBalance(wallet.assetID)\n }\n\n /*\n * reportBalance sets the balance display and calls success if we go over the\n * threshold.\n */\n reportBalance (assetID: number) {\n if (this.funded || this.assetID === -1) return\n if (assetID !== this.assetID && assetID !== this.parentID) return\n const page = this.page\n const asset = app().assets[this.assetID]\n\n const avail = asset.wallet.balance.available\n page.balance.textContent = Doc.formatCoinValue(avail, asset.unitInfo)\n\n if (asset.token) {\n const parentAsset = app().assets[asset.token.parentID]\n const parentAvail = parentAsset.wallet.balance.available\n page.parentBal.textContent = Doc.formatCoinValue(parentAvail, parentAsset.unitInfo)\n if (parentAvail < this.bondFeeBuffer) return\n }\n\n // NOTE: when/if we allow one-time bond post (no maintenance) from the UI we\n // may allow to proceed as long as they have enough for tx fees. For now,\n // the balance check box will remain unchecked and we will not proceed.\n if (avail < 2 * this.bondAsset.amount + this.bondFeeBuffer) return\n\n Doc.show(page.balCheck)\n Doc.hide(page.balUncheck, page.balanceBox, page.sendEnough)\n this.funded = true\n if (this.progressed) this.success()\n }\n\n /*\n * reportProgress sets the progress display and calls success if we are fully\n * synced.\n */\n reportProgress (synced: boolean, prog: number) {\n const page = this.page\n if (synced) {\n page.progress.textContent = '100'\n Doc.hide(page.syncUncheck, page.syncRemainBox, page.syncSpinner)\n Doc.show(page.syncCheck)\n this.progressed = true\n if (this.funded) this.success()\n return\n } else if (prog === 1) {\n Doc.hide(page.syncUncheck)\n Doc.show(page.syncSpinner)\n } else {\n Doc.hide(page.syncSpinner)\n Doc.show(page.syncUncheck)\n }\n page.progress.textContent = (prog * 100).toFixed(1)\n\n if (prog >= 0.999) {\n Doc.hide(page.syncRemaining)\n Doc.show(page.syncFinishingUp)\n Doc.show(page.syncRemainBox)\n // The final stage of wallet sync process can take a while (it might hang\n // at 99.9% for many minutes, indexing addresses for example), the simplest\n // way to handle it is to keep displaying \"finishing up\" message until the\n // sync is finished, since we can't reasonably show it progressing over time.\n page.syncFinishingUp.textContent = intl.prep(intl.ID_WALLET_SYNC_FINISHING_UP)\n return\n }\n // Before we get to 99.9% the remaining time estimate must be based on more\n // than one progress report. We'll cache up to the last 20 and look at the\n // difference between the first and last to make the estimate.\n const cacheSize = 20\n const cache = this.progressCache\n cache.push({\n stamp: new Date().getTime(),\n progress: prog\n })\n if (cache.length < 2) {\n // Can't meaningfully estimate remaining until we have at least 2 data points.\n return\n }\n while (cache.length > cacheSize) cache.shift()\n const [first, last] = [cache[0], cache[cache.length - 1]]\n const progDelta = last.progress - first.progress\n if (progDelta === 0) {\n // Having no progress for a while likely means we are experiencing network\n // issues, can't reasonably estimate time remaining in this case.\n return\n }\n Doc.hide(page.syncFinishingUp)\n Doc.show(page.syncRemaining)\n Doc.show(page.syncRemainBox)\n const timeDelta = last.stamp - first.stamp\n const progRate = progDelta / timeDelta\n const toGoProg = 1 - last.progress\n const toGoTime = toGoProg / progRate\n page.syncRemain.textContent = Doc.formatDuration(toGoTime)\n }\n}\n\ninterface EarlyAcceleration {\n timePast: number,\n wasAcceleration: boolean\n}\n\ninterface PreAccelerate {\n swapRate: number\n suggestedRate: number\n suggestedRange: XYRange\n earlyAcceleration?: EarlyAcceleration\n}\n\n/*\n * AccelerateOrderForm is used to submit an acceleration request for an order.\n */\nexport class AccelerateOrderForm {\n form: HTMLElement\n page: Record<string, PageElement>\n order: Order\n acceleratedRate: number\n earlyAcceleration?: EarlyAcceleration\n currencyUnit: string\n success: () => void\n\n constructor (form: HTMLElement, success: () => void) {\n this.form = form\n this.success = success\n const page = this.page = Doc.idDescendants(form)\n\n Doc.bind(page.accelerateSubmit, 'click', () => {\n this.submit()\n })\n Doc.bind(page.submitEarlyConfirm, 'click', () => {\n this.sendAccelerateRequest()\n })\n }\n\n /*\n * displayEarlyAccelerationMsg displays a message asking for confirmation\n * when the user tries to submit an acceleration transaction very soon after\n * the swap transaction was broadcast, or very soon after a previous\n * acceleration.\n */\n displayEarlyAccelerationMsg () {\n const page = this.page\n // this is checked in submit, but another check is needed for ts compiler\n if (!this.earlyAcceleration) return\n page.recentAccelerationTime.textContent = `${Math.floor(this.earlyAcceleration.timePast / 60)}`\n page.recentSwapTime.textContent = `${Math.floor(this.earlyAcceleration.timePast / 60)}`\n if (this.earlyAcceleration.wasAcceleration) {\n Doc.show(page.recentAccelerationMsg)\n Doc.hide(page.recentSwapMsg)\n page.recentAccelerationTime.textContent = `${Math.floor(this.earlyAcceleration.timePast / 60)}`\n } else {\n Doc.show(page.recentSwapMsg)\n Doc.hide(page.recentAccelerationMsg)\n page.recentSwapTime.textContent = `${Math.floor(this.earlyAcceleration.timePast / 60)}`\n }\n Doc.hide(page.configureAccelerationDiv, page.accelerateErr)\n Doc.show(page.earlyAccelerationDiv)\n }\n\n // sendAccelerateRequest makes an accelerate order request to the client\n // backend.\n async sendAccelerateRequest () {\n const order = this.order\n const page = this.page\n const req = {\n orderID: order.id,\n newRate: this.acceleratedRate\n }\n const loaded = app().loading(page.accelerateMainDiv)\n const res = await postJSON('/api/accelerateorder', req)\n loaded()\n if (app().checkResponse(res)) {\n page.accelerateTxID.textContent = res.txID\n Doc.hide(page.accelerateMainDiv, page.preAccelerateErr, page.accelerateErr)\n Doc.show(page.accelerateMsgDiv, page.accelerateSuccess)\n this.success()\n } else {\n page.accelerateErr.textContent = intl.prep(intl.ID_ORDER_ACCELERATION_ERR_MSG, { msg: res.msg })\n Doc.hide(page.earlyAccelerationDiv)\n Doc.show(page.accelerateErr, page.configureAccelerationDiv)\n }\n }\n\n // submit is called when the submit button is clicked.\n async submit () {\n if (this.earlyAcceleration) {\n this.displayEarlyAccelerationMsg()\n } else {\n this.sendAccelerateRequest()\n }\n }\n\n // refresh should be called before the form is displayed. It makes a\n // preaccelerate request to the client backend and sets up the form\n // based on the results.\n async refresh (order: Order) {\n const page = this.page\n this.order = order\n const res = await postJSON('/api/preaccelerate', order.id)\n if (!app().checkResponse(res)) {\n page.preAccelerateErr.textContent = intl.prep(intl.ID_ORDER_ACCELERATION_ERR_MSG, { msg: res.msg })\n Doc.hide(page.accelerateMainDiv, page.accelerateSuccess)\n Doc.show(page.accelerateMsgDiv, page.preAccelerateErr)\n return\n }\n Doc.hide(page.accelerateMsgDiv, page.preAccelerateErr, page.accelerateErr, page.feeEstimateDiv, page.earlyAccelerationDiv)\n Doc.show(page.accelerateMainDiv, page.accelerateSuccess, page.configureAccelerationDiv)\n const preAccelerate: PreAccelerate = res.preAccelerate\n this.earlyAcceleration = preAccelerate.earlyAcceleration\n this.currencyUnit = preAccelerate.suggestedRange.yUnit\n page.accelerateAvgFeeRate.textContent = `${preAccelerate.swapRate} ${preAccelerate.suggestedRange.yUnit}`\n page.accelerateCurrentFeeRate.textContent = `${preAccelerate.suggestedRate} ${preAccelerate.suggestedRange.yUnit}`\n this.acceleratedRate = preAccelerate.suggestedRange.start.y\n const selected = () => { /* do nothing */ }\n const roundY = true\n const updateRate = (_: number, newY: number) => { this.acceleratedRate = newY }\n const rangeHandler = new XYRangeHandler(preAccelerate.suggestedRange, preAccelerate.suggestedRange.start.x, {\n updated: updateRate, changed: () => this.updateAccelerationEstimate(), selected, roundY\n })\n Doc.empty(page.sliderContainer)\n page.sliderContainer.appendChild(rangeHandler.control)\n this.updateAccelerationEstimate()\n }\n\n // updateAccelerationEstimate makes an accelerate estimate request to the\n // client backend using the currently selected rate on the slider, and\n // displays the results.\n async updateAccelerationEstimate () {\n const page = this.page\n const order = this.order\n const req = {\n orderID: order.id,\n newRate: this.acceleratedRate\n }\n const loaded = app().loading(page.sliderContainer)\n const res = await postJSON('/api/accelerationestimate', req)\n loaded()\n if (!app().checkResponse(res)) {\n page.accelerateErr.textContent = intl.prep(intl.ID_ORDER_ACCELERATION_FEE_ERR_MSG, { msg: res.msg })\n Doc.show(page.accelerateErr)\n return\n }\n page.feeRateEstimate.textContent = `${this.acceleratedRate} ${this.currencyUnit}`\n let assetID\n let assetSymbol\n if (order.sell) {\n assetID = order.baseID\n assetSymbol = order.baseSymbol\n } else {\n assetID = order.quoteID\n assetSymbol = order.quoteSymbol\n }\n const unitInfo = app().unitInfo(assetID)\n page.feeEstimate.textContent = `${res.fee / unitInfo.conventional.conversionFactor} ${assetSymbol}`\n Doc.show(page.feeEstimateDiv)\n }\n}\n\n/* DEXAddressForm accepts a DEX address and performs account discovery. */\nexport class DEXAddressForm {\n form: HTMLElement\n success: (xc: Exchange, cert: string) => void\n page: Record<string, PageElement>\n knownExchanges: HTMLElement[]\n dexToUpdate?: string\n certPicker: CertificatePicker\n\n constructor (form: HTMLElement, success: (xc: Exchange, cert: string) => void, dexToUpdate?: string) {\n this.form = form\n this.success = success\n\n const page = this.page = Doc.parseTemplate(form)\n\n this.certPicker = new CertificatePicker(form)\n\n Doc.bind(page.skipRegistration, 'change', () => this.showOrHideSubmitBttn())\n Doc.bind(page.showCustom, 'click', () => {\n Doc.hide(page.showCustom)\n Doc.show(page.customBox, page.auth)\n })\n\n this.knownExchanges = Array.from(page.knownXCs.querySelectorAll('.known-exchange'))\n for (const div of this.knownExchanges) {\n Doc.bind(div, 'click', () => {\n const host = div.dataset.host\n for (const d of this.knownExchanges) d.classList.remove('selected')\n return this.checkDEX(host)\n })\n }\n\n bind(form, page.submit, () => this.checkDEX())\n\n if (dexToUpdate) {\n Doc.hide(page.addDexHdr, page.skipRegistrationBox)\n Doc.show(page.updateDexHdr)\n this.dexToUpdate = dexToUpdate\n }\n\n this.refresh()\n }\n\n refresh () {\n const page = this.page\n page.addr.value = ''\n this.certPicker.clearCertFile()\n Doc.hide(page.err)\n if (this.knownExchanges.length === 0 || this.dexToUpdate) {\n Doc.show(page.customBox, page.auth)\n Doc.hide(page.showCustom, page.knownXCs, page.pickServerMsg, page.addCustomMsg)\n } else {\n Doc.hide(page.customBox)\n Doc.show(page.showCustom)\n }\n for (const div of this.knownExchanges) div.classList.remove('selected')\n this.showOrHideSubmitBttn()\n }\n\n /**\n * Show or hide appPWBox depending on if password is required. Show the\n * submit button if connecting a custom server or password is required).\n */\n showOrHideSubmitBttn () {\n const page = this.page\n Doc.setVis(Doc.isDisplayed(page.customBox), page.auth)\n }\n\n skipRegistration () : boolean {\n return this.page.skipRegistration.checked ?? false\n }\n\n /* Just a small size tweak and fade-in. */\n async animate () {\n const form = this.form\n Doc.animate(550, prog => {\n form.style.transform = `scale(${0.9 + 0.1 * prog})`\n form.style.opacity = String(Math.pow(prog, 4))\n }, 'easeOut')\n }\n\n async checkDEX (addr?: string) {\n const page = this.page\n Doc.hide(page.err)\n addr = addr || page.addr.value\n if (addr === '') {\n page.err.textContent = intl.prep(intl.ID_EMPTY_DEX_ADDRESS_MSG)\n Doc.show(page.err)\n return\n }\n const cert = await this.certPicker.file()\n const skipRegistration = this.skipRegistration()\n let endpoint : string, req: any\n if (this.dexToUpdate) {\n endpoint = '/api/updatedexhost'\n req = {\n newHost: addr,\n cert: cert,\n oldHost: this.dexToUpdate\n }\n } else {\n endpoint = skipRegistration ? '/api/adddex' : '/api/discoveracct'\n req = {\n addr: addr,\n cert: cert\n }\n }\n\n const loaded = app().loading(this.form)\n const res = await postJSON(endpoint, req)\n loaded()\n if (!app().checkResponse(res)) {\n if (String(res.msg).includes('certificate required')) {\n Doc.show(page.needCert)\n } else {\n page.err.textContent = res.msg\n Doc.show(page.err)\n }\n return\n }\n await app().fetchUser()\n if (!this.dexToUpdate && (skipRegistration || res.paid || Object.keys(res.xc.auth.pendingBonds).length > 0)) {\n await app().loadPage('markets')\n return\n }\n this.success(res.xc, cert)\n }\n}\n\n/* DiscoverAccountForm performs account discovery for a pre-selected DEX. */\nexport class DiscoverAccountForm {\n form: HTMLElement\n addr: string\n success: (xc: Exchange) => void\n page: Record<string, PageElement>\n\n constructor (form: HTMLElement, addr: string, success: (xc: Exchange) => void) {\n this.form = form\n this.addr = addr\n this.success = success\n\n const page = this.page = Doc.parseTemplate(form)\n page.dexHost.textContent = addr\n bind(form, page.submit, () => this.checkDEX())\n }\n\n /* Just a small size tweak and fade-in. */\n async animate () {\n const form = this.form\n Doc.animate(550, prog => {\n form.style.transform = `scale(${0.9 + 0.1 * prog})`\n form.style.opacity = String(Math.pow(prog, 4))\n }, 'easeOut')\n }\n\n async checkDEX () {\n const page = this.page\n Doc.hide(page.err)\n const req = {\n addr: this.addr\n }\n const loaded = app().loading(this.form)\n const res = await postJSON('/api/discoveracct', req)\n loaded()\n if (!app().checkResponse(res)) {\n page.err.textContent = res.msg\n Doc.show(page.err)\n return\n }\n if (res.paid) {\n await app().fetchUser()\n await app().loadPage('markets')\n return\n }\n this.success(res.xc)\n }\n}\n\n/* LoginForm is used to sign into the app. */\nexport class LoginForm {\n form: HTMLElement\n success: () => void\n page: Record<string, PageElement>\n\n constructor (form: HTMLElement, success: () => void) {\n this.success = success\n this.form = form\n const page = this.page = Doc.parseTemplate(form)\n bind(form, page.submit, () => { this.submit() })\n app().registerNoteFeeder({\n login: (note: CoreNote) => { this.handleLoginNote(note) }\n })\n }\n\n handleLoginNote (n: CoreNote) {\n if (n.details === '') return\n const loginMsg = Doc.idel(this.form, 'loaderMsg')\n Doc.show(loginMsg)\n if (loginMsg) loginMsg.textContent = n.details\n }\n\n focus () {\n this.page.pw.focus()\n }\n\n refresh () {\n Doc.hide(this.page.errMsg)\n this.page.pw.value = ''\n }\n\n async submit () {\n const page = this.page\n Doc.hide(page.errMsg)\n const pw = page.pw.value || ''\n if (pw === '') {\n Doc.showFormError(page.errMsg, intl.prep(intl.ID_NO_PASS_ERROR_MSG))\n return\n }\n const loaded = app().loading(this.form)\n const res = await postJSON('/api/login', { pass: pw })\n loaded()\n page.pw.value = ''\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.errMsg, res.msg)\n return\n }\n await app().fetchUser()\n res.notes = res.notes || []\n res.notes.reverse()\n res.pokes = res.pokes || []\n app().loggedIn(res.notes, res.pokes)\n this.success()\n }\n\n /* Just a small size tweak and fade-in. */\n async animate () {\n const form = this.form\n Doc.animate(550, prog => {\n form.style.transform = `scale(${0.9 + 0.1 * prog})`\n form.style.opacity = String(Math.pow(prog, 4))\n }, 'easeOut')\n }\n}\n\nconst traitNewAddresser = 1 << 1\n\n/*\n * DepositAddress displays a deposit address, a QR code, and a button to\n * generate a new address (if supported).\n */\nexport class DepositAddress {\n form: PageElement\n page: Record<string, PageElement>\n assetID: number\n addr: string\n\n constructor (form: PageElement) {\n this.form = form\n const page = this.page = Doc.idDescendants(form)\n Doc.cleanTemplates(page.unifiedReceiverTmpl)\n Doc.bind(page.newDepAddrBttn, 'click', async () => { this.newDepositAddress() })\n // navigator.clipboard can only be accessed on localhost or over https.\n if (window.isSecureContext) {\n Doc.bind(page.copyAddressBtn, 'click', () => { this.copyAddress() })\n } else {\n Doc.hide(page.copyAddressBtn)\n }\n }\n\n /* Display a deposit address. */\n async setAsset (assetID: number) {\n this.assetID = assetID\n const page = this.page\n Doc.hide(page.depositErr, page.depositTokenMsgBox, page.addrUsed)\n const asset = app().assets[assetID]\n page.depositLogo.src = Doc.logoPath(asset.symbol)\n const wallet = app().walletMap[assetID]\n page.depositName.textContent = asset.unitInfo.conventional.unit\n const addr = this.addr = wallet.address\n if ((wallet.traits & traitNewAddresser) !== 0) {\n const res = await postJSON('/api/addressused', { assetID, addr })\n const used = app().checkResponse(res) && res.used\n Doc.setVis(used, page.addrUsed)\n }\n if (asset.token) {\n const parentAsset = app().assets[asset.token.parentID]\n page.depositTokenParentLogo.src = Doc.logoPath(parentAsset.symbol)\n page.depositTokenParentName.textContent = parentAsset.name\n Doc.show(page.depositTokenMsgBox)\n }\n Doc.setVis((wallet.traits & traitNewAddresser) !== 0, page.newDepAddrBttnBox)\n this.setAddress(addr)\n }\n\n setAddress (addr: string) {\n const page = this.page\n Doc.hide(page.unifiedReceivers)\n if (addr.startsWith('unified:')) {\n const receivers = JSON.parse(addr.substring('unified:'.length)) as Record<string, string>\n Doc.empty(page.unifiedReceivers)\n Doc.show(page.unifiedReceivers)\n const defaultReceiverType = 'unified'\n for (const [recvType, recv] of Object.entries(receivers)) {\n const div = page.unifiedReceiverTmpl.cloneNode(true) as PageElement\n page.unifiedReceivers.appendChild(div)\n div.textContent = recvType\n div.dataset.type = recvType\n if (recvType === defaultReceiverType) div.classList.add('selected')\n // tmpl.addr.textContent = recv\n Doc.bind(div, 'click', () => {\n for (const bttn of (Array.from(page.unifiedReceivers.children) as PageElement[])) bttn.classList.toggle('selected', bttn.dataset.type === recvType)\n this.setCentralAddress(recv)\n })\n }\n addr = receivers.unified\n }\n\n this.setCentralAddress(addr)\n }\n\n setCentralAddress (addr: string) {\n const page = this.page\n page.depositAddress.textContent = addr\n page.qrcode.src = `/generateqrcode?address=${addr}`\n }\n\n /* Fetch a new address from the wallet. */\n async newDepositAddress () {\n const { page, assetID, form } = this\n Doc.hide(page.depositErr)\n const loaded = app().loading(form)\n const res = await postJSON('/api/depositaddress', {\n assetID: assetID\n })\n loaded()\n if (!app().checkResponse(res)) {\n page.depositErr.textContent = res.msg\n Doc.show(page.depositErr)\n return\n }\n app().walletMap[assetID].address = res.address\n this.setAddress(res.address)\n Doc.hide(page.addrUsed)\n }\n\n handleTx (assetID: number, tx: WalletTransaction) {\n if (assetID !== this.assetID) return\n const wallet = app().walletMap[assetID]\n if ((wallet.traits & traitNewAddresser) === 0) return\n const { page, addr } = this\n if (tx.amount > 0 && tx.recipient === addr) Doc.show(page.addrUsed)\n }\n\n async copyAddress () {\n const { page, addr } = this\n navigator.clipboard.writeText(addr)\n .then(() => {\n Doc.show(page.copyAlert)\n setTimeout(() => {\n Doc.hide(page.copyAlert)\n }, 800)\n })\n .catch((reason) => {\n console.error('Unable to copy: ', reason)\n })\n }\n}\n\n// AppPassResetForm is used to reset the app apssword using the app seed.\nexport class AppPassResetForm {\n form: PageElement\n page: Record<string, PageElement>\n success: () => void\n\n constructor (form: PageElement, success: () => void) {\n this.form = form\n this.success = success\n const page = this.page = Doc.idDescendants(form)\n bind(form, page.resetAppPWSubmitBtn, () => this.resetAppPW())\n }\n\n async resetAppPW () {\n const page = this.page\n const newAppPW = page.newAppPassword.value || ''\n const confirmNewAppPW = page.confirmNewAppPassword.value\n if (newAppPW === '') {\n Doc.showFormError(page.appPWResetErrMsg, intl.prep(intl.ID_NO_PASS_ERROR_MSG))\n return\n }\n if (newAppPW !== confirmNewAppPW) {\n Doc.showFormError(page.appPWResetErrMsg, intl.prep(intl.ID_PASSWORD_NOT_MATCH))\n return\n }\n\n const loaded = app().loading(this.form)\n const res = await postJSON('/api/resetapppassword', {\n newPass: newAppPW,\n seed: page.seedInput.value\n })\n loaded()\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.appPWResetErrMsg, res.msg)\n return\n }\n\n if (Doc.isDisplayed(page.appPWResetErrMsg)) Doc.hide(page.appPWResetErrMsg)\n page.appPWResetSuccessMsg.textContent = intl.prep(intl.ID_PASSWORD_RESET_SUCCESS_MSG)\n Doc.show(page.appPWResetSuccessMsg)\n setTimeout(() => this.success(), 3000) // allow time to view the message\n }\n\n focus () {\n this.page.newAppPassword.focus()\n }\n\n refresh () {\n const page = this.page\n page.newAppPassword.value = ''\n page.confirmNewAppPassword.value = ''\n page.seedInput.value = ''\n Doc.hide(page.appPWResetSuccessMsg, page.appPWResetErrMsg)\n }\n}\n\nexport class CertificatePicker {\n page: Record<string, PageElement>\n\n constructor (parent: PageElement) {\n const page = this.page = Doc.parseTemplate(parent)\n page.selectedCert.textContent = intl.prep(intl.ID_NONE_SELECTED)\n Doc.bind(page.certFile, 'change', () => this.onCertFileChange())\n Doc.bind(page.removeCert, 'click', () => this.clearCertFile())\n Doc.bind(page.addCert, 'click', () => page.certFile.click())\n }\n\n /**\n * onCertFileChange when the input certFile changed, read the file\n * and setting cert name into text of selectedCert to display on the view\n */\n async onCertFileChange () {\n const page = this.page\n const files = page.certFile.files\n if (!files || !files.length) return\n page.selectedCert.textContent = files[0].name\n Doc.show(page.removeCert)\n Doc.hide(page.addCert)\n }\n\n /* clearCertFile cleanup certFile value and selectedCert text */\n clearCertFile () {\n const page = this.page\n page.certFile.value = ''\n page.selectedCert.textContent = intl.prep(intl.ID_NONE_SELECTED)\n Doc.hide(page.removeCert)\n Doc.show(page.addCert)\n }\n\n async file (): Promise<string> {\n const page = this.page\n if (page.certFile.value) {\n const files = page.certFile.files\n if (files && files.length) {\n return await files[0].text()\n }\n }\n return ''\n }\n}\n\nexport class TokenApprovalForm {\n page: Record<string, PageElement>\n success?: () => void\n assetID: number\n parentID: number\n txFee: number\n host: string\n\n constructor (parent: PageElement, success?: () => void) {\n this.page = Doc.parseTemplate(parent)\n this.success = success\n Doc.bind(this.page.submit, 'click', () => { this.approve() })\n }\n\n async setAsset (assetID: number, host: string) {\n this.assetID = assetID\n this.host = host\n const tokenAsset = app().assets[assetID]\n const parentID = this.parentID = tokenAsset.token?.parentID as number\n const { page } = this\n\n Doc.show(page.submissionElements)\n Doc.hide(page.txMsg, page.errMsg, page.addressBox, page.balanceBox, page.addressBox)\n\n Doc.empty(page.tokenSymbol)\n page.tokenSymbol.appendChild(Doc.symbolize(tokenAsset, true))\n const protocolVersion = app().exchanges[host].assets[assetID].version\n const res = await postJSON('/api/approvetokenfee', {\n assetID: tokenAsset.id,\n version: protocolVersion,\n approving: true\n })\n if (!app().checkResponse(res)) {\n page.errMsg.textContent = res.msg\n Doc.show(page.errMsg)\n } else {\n const { unitInfo: ui, wallet: { address, balance: { available: avail } }, name: parentName } = app().assets[parentID]\n const txFee = this.txFee = res.txFee as number\n let feeText = `${Doc.formatCoinValue(txFee, ui)} ${ui.conventional.unit}`\n const rate = app().fiatRatesMap[parentID]\n if (rate) {\n feeText += ` (${Doc.formatFiatConversion(txFee, rate, ui)} USD)`\n }\n page.feeEstimate.textContent = feeText\n Doc.show(page.balanceBox)\n page.balance.textContent = Doc.formatCoinValue(avail, ui)\n page.parentTicker.textContent = ui.conventional.unit\n page.parentName.textContent = parentName\n if (avail < txFee) {\n Doc.show(page.addressBox)\n page.address.textContent = address\n }\n }\n }\n\n /*\n * approve calls the /api/approvetoken endpoint.\n */\n async approve () {\n const { page, assetID, host, success } = this\n const path = '/api/approvetoken'\n const tokenAsset = app().assets[assetID]\n const res = await postJSON(path, {\n assetID: tokenAsset.id,\n dexAddr: host\n })\n if (!app().checkResponse(res)) {\n page.errMsg.textContent = res.msg\n Doc.show(page.errMsg)\n return\n }\n page.txid.innerText = res.txID\n const assetExplorer = CoinExplorers[tokenAsset.id]\n if (assetExplorer && assetExplorer[app().user.net]) {\n page.txid.href = assetExplorer[app().user.net](res.txID)\n }\n Doc.hide(page.submissionElements, page.balanceBox, page.addressBox)\n Doc.show(page.txMsg)\n if (success) success()\n }\n\n handleBalanceNote (n: BalanceNote) {\n const { page, parentID, txFee } = this\n if (n.assetID !== parentID) return\n page.balance.textContent = Doc.formatCoinValue(n.balance.available, app().assets[parentID].unitInfo)\n if (n.balance.available >= txFee) {\n Doc.hide(page.addressBox)\n } else Doc.hide(page.errMsg)\n }\n}\n\nexport class CEXConfigurationForm {\n form: PageElement\n page: Record<string, PageElement>\n updated: (cexName: string, success: boolean) => void\n cexName: string\n\n constructor (form: PageElement, updated: (cexName: string, success: boolean) => void) {\n this.form = form\n this.updated = updated\n this.page = Doc.parseTemplate(form)\n Doc.bind(this.page.cexSubmit, 'click', () => this.submit())\n }\n\n setCEX (cexName: string) {\n this.cexName = cexName\n setCexElements(this.form, cexName)\n const page = this.page\n Doc.hide(page.cexConfigPrompt, page.cexConnectErrBox, page.cexFormErr)\n page.cexApiKeyInput.value = ''\n page.cexSecretInput.value = ''\n const cexStatus = app().mmStatus.cexes[cexName]\n const connectErr = cexStatus?.connectErr\n if (connectErr) {\n Doc.show(page.cexConnectErrBox)\n page.cexConnectErr.textContent = connectErr\n page.cexApiKeyInput.value = cexStatus.config.apiKey\n page.cexSecretInput.value = cexStatus.config.apiSecret\n } else {\n Doc.show(page.cexConfigPrompt)\n }\n }\n\n /*\n * handleCEXSubmit handles clicks on the CEX configuration submission button.\n */\n async submit () {\n const { page, cexName, form } = this\n Doc.hide(page.cexFormErr)\n const apiKey = page.cexApiKeyInput.value\n const apiSecret = page.cexSecretInput.value\n if (!apiKey || !apiSecret) {\n Doc.show(page.cexFormErr)\n page.cexFormErr.textContent = intl.prep(intl.ID_NO_PASS_ERROR_MSG)\n return\n }\n const loaded = app().loading(form)\n try {\n const res = await MM.updateCEXConfig({\n name: cexName,\n apiKey: apiKey,\n apiSecret: apiSecret\n })\n if (!app().checkResponse(res)) throw res\n this.updated(cexName, true)\n } catch (e) {\n Doc.show(page.cexFormErr)\n page.cexFormErr.textContent = intl.prep(intl.ID_API_ERROR, { msg: e.msg ?? String(e) })\n this.updated(cexName, false)\n } finally {\n loaded()\n }\n }\n}\n\nconst animationLength = 300\n\n/* Swap form1 for form2 with an animation. */\nexport async function slideSwap (form1: HTMLElement, form2: HTMLElement) {\n const shift = document.body.offsetWidth / 2\n await Doc.animate(animationLength, progress => {\n form1.style.right = `${progress * shift}px`\n }, 'easeInHard')\n Doc.hide(form1)\n form1.style.right = '0'\n form2.style.right = String(-shift)\n Doc.show(form2)\n if (form2.querySelector('input')) {\n Doc.safeSelector(form2, 'input').focus()\n }\n await Doc.animate(animationLength, progress => {\n form2.style.right = `${-shift + progress * shift}px`\n }, 'easeOutHard')\n form2.style.right = '0'\n}\n\nexport function showSuccess (page: Record<string, PageElement>, msg: string) {\n page.successMessage.textContent = msg\n Doc.show(page.forms, page.checkmarkForm)\n page.checkmarkForm.style.right = '0'\n page.checkmark.style.fontSize = '0px'\n\n const [startR, startG, startB] = State.isDark() ? [223, 226, 225] : [51, 51, 51]\n const [endR, endG, endB] = [16, 163, 16]\n const [diffR, diffG, diffB] = [endR - startR, endG - startG, endB - startB]\n\n return new Animation(1200, (prog: number) => {\n page.checkmark.style.fontSize = `${prog * 80}px`\n page.checkmark.style.color = `rgb(${startR + prog * diffR}, ${startG + prog * diffG}, ${startB + prog * diffB})`\n }, 'easeOutElastic')\n}\n\n/*\n * bind binds the click and submit events and prevents page reloading on\n * submission.\n */\nexport function bind (form: HTMLElement, submitBttn: HTMLElement, handler: (e: Event) => void) {\n const wrapper = (e: Event) => {\n if (e.preventDefault) e.preventDefault()\n handler(e)\n }\n Doc.bind(submitBttn, 'click', wrapper)\n Doc.bind(form, 'submit', wrapper)\n}\n\n// isTruthyString will be true if the provided string is recognized as a\n// value representing true.\nfunction isTruthyString (s: string) {\n return s === '1' || s.toLowerCase() === 'true'\n}\n\n// toUnixDate converts a javascript date object to a unix date, which is\n// the number of *seconds* since the start of the epoch.\nfunction toUnixDate (date: Date) {\n return Math.floor(date.getTime() / 1000)\n}\n\n// dateApplyOffset shifts a date by the timezone offset. This is used to make\n// UTC dates show the local date. This can be used to prepare a Date so\n// toISOString generates a local date string. This is also used to trick an html\n// input element to show the local date when setting the valueAsDate field. When\n// reading the date back to JS, the value field should be interpreted as local\n// using the \"T00:00\" suffix, or the Date in valueAsDate should be shifted in\n// the opposite direction.\nfunction dateApplyOffset (date: Date) {\n return new Date(date.getTime() - date.getTimezoneOffset() * 60 * 1000)\n}\n\n// dateToString converts a javascript date object to a YYYY-MM-DD format string,\n// in the local time zone.\nfunction dateToString (date: Date) {\n return dateApplyOffset(date).toISOString().split('T')[0]\n // Another common hack:\n // date.toLocaleString(\"sv-SE\", { year: \"numeric\", month: \"2-digit\", day: \"2-digit\" })\n}\n","import Doc from './doc'\nimport BasePage from './basepage'\nimport { postJSON } from './http'\nimport {\n NewWalletForm,\n DEXAddressForm,\n DiscoverAccountForm,\n ConfirmRegistrationForm,\n FeeAssetSelectionForm,\n WalletWaitForm,\n slideSwap\n} from './forms'\nimport {\n app,\n Exchange,\n PageElement,\n PrepaidBondID\n} from './registry'\n\ninterface RegistrationPageData {\n host: string\n backTo?: string\n}\n\nexport default class RegistrationPage extends BasePage {\n body: HTMLElement\n data: RegistrationPageData\n xc: Exchange\n page: Record<string, PageElement>\n dexAddrForm: DEXAddressForm\n discoverAcctForm: DiscoverAccountForm\n newWalletForm: NewWalletForm\n regAssetForm: FeeAssetSelectionForm\n walletWaitForm: WalletWaitForm\n confirmRegisterForm: ConfirmRegistrationForm\n\n constructor (body: HTMLElement, data: RegistrationPageData) {\n super()\n this.body = body\n this.data = data\n const page = this.page = Doc.idDescendants(body)\n\n if (data.host && page.dexAddrForm.classList.contains('selected')) {\n page.dexAddrForm.classList.remove('selected')\n page.discoverAcctForm.classList.add('selected')\n page.discoverAcctForm.dataset.host = data.host\n }\n\n // Hide the form closers for the registration process except for the\n // password reset form closer.\n for (const el of body.querySelectorAll('.form-closer')) if (el !== page.resetPassFormCloser) Doc.hide(el)\n\n this.newWalletForm = new NewWalletForm(\n page.newWalletForm,\n assetID => this.newWalletCreated(assetID, this.confirmRegisterForm.tier),\n () => this.animateRegAsset(page.newWalletForm)\n )\n\n // ADD DEX\n this.dexAddrForm = new DEXAddressForm(page.dexAddrForm, async (xc, certFile) => {\n this.requestFeepayment(page.dexAddrForm, xc, certFile)\n })\n\n const addr = page.discoverAcctForm.dataset.host\n if (addr) {\n this.discoverAcctForm = new DiscoverAccountForm(page.discoverAcctForm, addr, async (xc) => {\n this.requestFeepayment(page.discoverAcctForm, xc, '')\n })\n }\n\n // SELECT REG ASSET\n this.regAssetForm = new FeeAssetSelectionForm(page.regAssetForm, async (assetID: number, tier: number) => {\n if (assetID === PrepaidBondID) {\n this.registerDEXSuccess()\n return\n }\n const asset = app().assets[assetID]\n const wallet = asset.wallet\n if (wallet) {\n const bondAsset = this.xc.bondAssets[asset.symbol]\n const bondsFeeBuffer = await this.getBondsFeeBuffer(assetID, page.regAssetForm)\n this.confirmRegisterForm.setAsset(assetID, tier, bondsFeeBuffer)\n if (wallet.synced && wallet.balance.available >= 2 * bondAsset.amount + bondsFeeBuffer) {\n this.animateConfirmForm(page.regAssetForm)\n return\n }\n this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)\n slideSwap(page.regAssetForm, page.walletWait)\n return\n }\n this.confirmRegisterForm.tier = tier\n this.newWalletForm.setAsset(assetID)\n slideSwap(page.regAssetForm, page.newWalletForm)\n })\n\n this.walletWaitForm = new WalletWaitForm(page.walletWait, () => {\n this.animateConfirmForm(page.walletWait)\n }, () => { this.animateRegAsset(page.walletWait) })\n\n // SUBMIT DEX REGISTRATION\n this.confirmRegisterForm = new ConfirmRegistrationForm(page.confirmRegForm, () => {\n this.registerDEXSuccess()\n }, () => {\n this.animateRegAsset(page.confirmRegForm)\n })\n\n const currentForm = Doc.safeSelector(page.forms, ':scope > form.selected')\n currentForm.classList.remove('selected')\n switch (currentForm) {\n case page.dexAddrForm:\n this.dexAddrForm.animate()\n break\n case page.discoverAcctForm:\n this.discoverAcctForm.animate()\n }\n Doc.show(currentForm)\n\n // There's nothing on the page.discoverAcctForm except to receive user pass\n // before attempting to discover user account and there's no need to have\n // them click another button when we can carry on without user interaction.\n if (currentForm === page.discoverAcctForm) {\n this.discoverAcctForm.page.submit.click()\n }\n\n if (app().authed) this.auth()\n }\n\n // auth should be called once user is known to be authed with the server.\n async auth () {\n await app().fetchUser()\n }\n\n async requestFeepayment (oldForm: HTMLElement, xc: Exchange, certFile: string) {\n this.xc = xc\n this.confirmRegisterForm.setExchange(xc, certFile)\n this.walletWaitForm.setExchange(xc)\n this.regAssetForm.setExchange(xc, certFile)\n this.animateRegAsset(oldForm)\n }\n\n /* Swap in the asset selection form and run the animation. */\n async animateRegAsset (oldForm: HTMLElement) {\n Doc.hide(oldForm)\n this.regAssetForm.animate()\n Doc.show(this.page.regAssetForm)\n }\n\n /* Swap in the confirmation form and run the animation. */\n async animateConfirmForm (oldForm: HTMLElement) {\n this.confirmRegisterForm.animate()\n Doc.hide(oldForm)\n Doc.show(this.page.confirmRegForm)\n }\n\n // Retrieve an estimate for the tx fee needed to create new bond reserves.\n async getBondsFeeBuffer (assetID: number, form: HTMLElement) {\n const loaded = app().loading(form)\n const res = await postJSON('/api/bondsfeebuffer', { assetID })\n loaded()\n if (!app().checkResponse(res)) {\n return 0\n }\n return res.feeBuffer\n }\n\n /* gets the contents of the cert file */\n async getCertFile () {\n let cert = ''\n if (this.dexAddrForm.page.certFile.value) {\n const files = this.dexAddrForm.page.certFile.files\n if (files && files.length) cert = await files[0].text()\n }\n return cert\n }\n\n /* Called after successful registration to a DEX. */\n async registerDEXSuccess () {\n await app().fetchUser()\n app().updateMenuItemsDisplay()\n await app().loadPage(this.data.backTo || 'markets')\n }\n\n async newWalletCreated (assetID: number, tier: number) {\n this.regAssetForm.refresh()\n const user = await app().fetchUser()\n if (!user) return\n const page = this.page\n const asset = user.assets[assetID]\n const wallet = asset.wallet\n const bondAmt = this.xc.bondAssets[asset.symbol].amount\n\n const bondsFeeBuffer = await this.getBondsFeeBuffer(assetID, page.newWalletForm)\n this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)\n this.confirmRegisterForm.setAsset(assetID, tier, bondsFeeBuffer)\n if (wallet.synced && wallet.balance.available >= 2 * bondAmt + bondsFeeBuffer) {\n await this.animateConfirmForm(page.newWalletForm)\n return\n }\n\n await slideSwap(page.newWalletForm, page.walletWait)\n }\n}\n","import { PageElement, app } from './registry'\nimport Doc from './doc'\nimport BasePage from './basepage'\nimport { AppPassResetForm, LoginForm, slideSwap } from './forms'\n\n/*\n LoginPage holds the form for login and password reset.\n*/\nexport default class LoginPage extends BasePage {\n loginForm: LoginForm\n page: Record<string, PageElement>\n appPassResetForm: AppPassResetForm\n\n constructor (body: HTMLElement) {\n super()\n const page = this.page = Doc.idDescendants(body)\n this.loginForm = new LoginForm(page.loginForm, () => { this.loggedIn() })\n\n const prepAndDisplayLoginForm = () => {\n Doc.hide(page.resetAppPWForm)\n this.loginForm.refresh()\n Doc.show(page.loginForm)\n this.loginForm.focus()\n }\n prepAndDisplayLoginForm()\n\n this.appPassResetForm = new AppPassResetForm(page.resetAppPWForm, () => { prepAndDisplayLoginForm() })\n Doc.bind(page.forgotPassBtn, 'click', () => {\n this.appPassResetForm.refresh()\n slideSwap(page.loginForm, page.resetAppPWForm)\n })\n Doc.bind(page.resetPassFormCloser, 'click', () => { prepAndDisplayLoginForm() })\n Doc.bind(page.forms, 'mousedown', (e: MouseEvent) => {\n if (!Doc.mouseInElement(e, page.resetAppPWForm) && Doc.isDisplayed(page.resetAppPWForm)) { prepAndDisplayLoginForm() }\n })\n }\n\n /* login submits the sign-in form and parses the result. */\n async loggedIn () {\n await app().loadPage('wallets')\n }\n}\n","import Doc, { Animation, AniToggle, parseFloatDefault, setupCopyBtn } from './doc'\nimport BasePage from './basepage'\nimport { postJSON, Errors } from './http'\nimport {\n NewWalletForm,\n WalletConfigForm,\n DepositAddress,\n bind as bindForm,\n showSuccess\n} from './forms'\nimport State from './state'\nimport * as intl from './locales'\nimport * as OrderUtil from './orderutil'\nimport {\n app,\n PageElement,\n SupportedAsset,\n WalletDefinition,\n BalanceNote,\n WalletStateNote,\n WalletSyncNote,\n RateNote,\n Order,\n OrderFilter,\n WalletCreationNote,\n BaseWalletNote,\n WalletNote,\n CustomWalletNote,\n TipChangeNote,\n Exchange,\n Market,\n PeerSource,\n WalletPeer,\n ApprovalStatus,\n WalletState,\n UnitInfo,\n TicketStakingStatus,\n VotingServiceProvider,\n Ticket,\n TicketStats,\n TxHistoryResult,\n TransactionNote,\n WalletTransaction,\n FeeState\n} from './registry'\nimport { CoinExplorers } from './coinexplorers'\n\ninterface DecredTicketTipUpdate {\n ticketPrice: number\n votingSubsidy: number\n stats: TicketStats\n}\n\ninterface TicketPurchaseUpdate extends BaseWalletNote {\n err?: string\n remaining:number\n tickets?: Ticket[]\n stats?: TicketStats\n}\n\nconst animationLength = 300\nconst traitRescanner = 1\nconst traitLogFiler = 1 << 2\nconst traitRecoverer = 1 << 5\nconst traitWithdrawer = 1 << 6\nconst traitRestorer = 1 << 8\nconst traitTxFeeEstimator = 1 << 9\nconst traitPeerManager = 1 << 10\nconst traitTokenApprover = 1 << 13\nconst traitTicketBuyer = 1 << 15\nconst traitHistorian = 1 << 16\nconst traitFundsMixer = 1 << 17\n\nconst traitsExtraOpts = traitLogFiler | traitRecoverer | traitRestorer | traitRescanner | traitPeerManager | traitTokenApprover\n\nexport const ticketStatusUnknown = 0\nexport const ticketStatusUnmined = 1\nexport const ticketStatusImmature = 2\nexport const ticketStatusLive = 3\nexport const ticketStatusVoted = 4\nexport const ticketStatusMissed = 5\nexport const ticketStatusExpired = 6\nexport const ticketStatusUnspent = 7\nexport const ticketStatusRevoked = 8\n\nexport const ticketStatusTranslationKeys = [\n intl.ID_TICKET_STATUS_UNKNOWN,\n intl.ID_TICKET_STATUS_UNMINED,\n intl.ID_TICKET_STATUS_IMMATURE,\n intl.ID_TICKET_STATUS_LIVE,\n intl.ID_TICKET_STATUS_VOTED,\n intl.ID_TICKET_STATUS_MISSED,\n intl.ID_TICKET_STATUS_EXPIRED,\n intl.ID_TICKET_STATUS_UNSPENT,\n intl.ID_TICKET_STATUS_REVOKED\n]\n\nexport const txTypeUnknown = 0\nexport const txTypeSend = 1\nexport const txTypeReceive = 2\nexport const txTypeSwap = 3\nexport const txTypeRedeem = 4\nexport const txTypeRefund = 5\nexport const txTypeSplit = 6\nexport const txTypeCreateBond = 7\nexport const txTypeRedeemBond = 8\nexport const txTypeApproveToken = 9\nexport const txTypeAcceleration = 10\nexport const txTypeSelfSend = 11\nexport const txTypeRevokeTokenApproval = 12\nexport const txTypeTicketPurchase = 13\nexport const txTypeTicketVote = 14\nexport const txTypeTicketRevocation = 15\nexport const txTypeSwapOrSend = 16\nexport const txTypeMixing = 17\n\nconst positiveTxTypes : number[] = [\n txTypeReceive,\n txTypeRedeem,\n txTypeRefund,\n txTypeRedeemBond,\n txTypeTicketVote,\n txTypeTicketRevocation\n]\n\nconst negativeTxTypes : number[] = [\n txTypeSend,\n txTypeSwap,\n txTypeCreateBond,\n txTypeTicketPurchase,\n txTypeSwapOrSend\n]\n\nconst noAmtTxTypes : number[] = [\n txTypeSplit,\n txTypeApproveToken,\n txTypeAcceleration,\n txTypeRevokeTokenApproval\n]\n\nfunction txTypeSignAndClass (txType: number): [string, string] {\n if (positiveTxTypes.includes(txType)) return ['+', 'positive-tx']\n if (negativeTxTypes.includes(txType)) return ['-', 'negative-tx']\n return ['', '']\n}\n\nconst txTypeTranslationKeys = [\n intl.ID_TX_TYPE_UNKNOWN,\n intl.ID_TX_TYPE_SEND,\n intl.ID_TX_TYPE_RECEIVE,\n intl.ID_TX_TYPE_SWAP,\n intl.ID_TX_TYPE_REDEEM,\n intl.ID_TX_TYPE_REFUND,\n intl.ID_TX_TYPE_SPLIT,\n intl.ID_TX_TYPE_CREATE_BOND,\n intl.ID_TX_TYPE_REDEEM_BOND,\n intl.ID_TX_TYPE_APPROVE_TOKEN,\n intl.ID_TX_TYPE_ACCELERATION,\n intl.ID_TX_TYPE_SELF_TRANSFER,\n intl.ID_TX_TYPE_REVOKE_TOKEN_APPROVAL,\n intl.ID_TX_TYPE_TICKET_PURCHASE,\n intl.ID_TX_TYPE_TICKET_VOTE,\n intl.ID_TX_TYPE_TICKET_REVOCATION,\n intl.ID_TX_TYPE_SWAP_OR_SEND,\n intl.ID_TX_TYPE_MIX\n]\n\nexport function txTypeString (txType: number) : string {\n return intl.prep(txTypeTranslationKeys[txType])\n}\n\nconst ticketPageSize = 10\nconst scanStartMempool = -1\n\ninterface ReconfigRequest {\n assetID: number\n walletType: string\n config: Record<string, string>\n newWalletPW?: string\n}\n\ninterface RescanRecoveryRequest {\n assetID: number\n appPW?: string\n force?: boolean\n}\n\ninterface WalletRestoration {\n target: string\n seed: string\n seedName: string\n instructions: string\n}\n\ninterface AssetButton {\n tmpl: Record<string, PageElement>\n bttn: PageElement\n}\n\ninterface TicketPagination {\n number: number\n history: Ticket[]\n scanned: boolean // Reached the end of history. All tickets cached.\n}\n\ninterface WalletsPageData {\n goBack?: string\n}\n\ninterface reconfigSettings {\n skipAnimation?: boolean\n elevateProviders?: boolean\n}\n\nlet net = 0\n\nexport default class WalletsPage extends BasePage {\n body: HTMLElement\n data?: WalletsPageData\n page: Record<string, PageElement>\n assetButtons: Record<number, AssetButton>\n newWalletForm: NewWalletForm\n reconfigForm: WalletConfigForm\n walletCfgGuide: PageElement\n depositAddrForm: DepositAddress\n keyup: (e: KeyboardEvent) => void\n changeWalletPW: boolean\n displayed: HTMLElement\n animation: Animation\n forms: PageElement[]\n forceReq: RescanRecoveryRequest\n forceUrl: string\n currentForm: PageElement\n restoreInfoCard: HTMLElement\n selectedAssetID: number\n stakeStatus: TicketStakingStatus\n maxSend: number\n unapprovingTokenVersion: number\n ticketPage: TicketPagination\n oldestTx: WalletTransaction | undefined\n currTx: WalletTransaction | undefined\n mixing: boolean\n mixerToggle: AniToggle\n stampers: PageElement[]\n secondTicker: number\n\n constructor (body: HTMLElement, data?: WalletsPageData) {\n super()\n this.body = body\n this.data = data\n const page = this.page = Doc.idDescendants(body)\n this.stampers = []\n net = app().user.net\n\n const setStamp = () => {\n for (const span of this.stampers) {\n if (span.dataset.stamp) {\n span.textContent = Doc.timeSince(parseInt(span.dataset.stamp || '') * 1000)\n }\n }\n }\n this.secondTicker = window.setInterval(() => {\n setStamp()\n }, 10000) // update every 10 seconds\n\n Doc.cleanTemplates(page.restoreInfoCard, page.connectedIconTmpl, page.disconnectedIconTmpl, page.removeIconTmpl)\n this.restoreInfoCard = page.restoreInfoCard.cloneNode(true) as HTMLElement\n Doc.show(page.connectedIconTmpl, page.disconnectedIconTmpl, page.removeIconTmpl)\n\n this.forms = Doc.applySelector(page.forms, ':scope > form')\n page.forms.querySelectorAll('.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => { this.closePopups() })\n })\n Doc.bind(page.cancelForce, 'click', () => { this.closePopups() })\n\n this.selectedAssetID = -1\n Doc.cleanTemplates(\n page.iconSelectTmpl, page.balanceDetailRow, page.recentOrderTmpl, page.vspRowTmpl,\n page.ticketHistoryRowTmpl, page.votingChoiceTmpl, page.votingAgendaTmpl, page.tspendTmpl,\n page.tkeyTmpl, page.txHistoryRowTmpl, page.txHistoryDateRowTmpl\n )\n\n Doc.bind(page.createWallet, 'click', () => this.showNewWallet(this.selectedAssetID))\n Doc.bind(page.connectBttn, 'click', () => this.doConnect(this.selectedAssetID))\n Doc.bind(page.send, 'click', () => this.showSendForm(this.selectedAssetID))\n Doc.bind(page.receive, 'click', () => this.showDeposit(this.selectedAssetID))\n Doc.bind(page.unlockBttn, 'click', () => this.openWallet(this.selectedAssetID))\n Doc.bind(page.lockBttn, 'click', () => this.lock(this.selectedAssetID))\n Doc.bind(page.reconfigureBttn, 'click', () => this.showReconfig(this.selectedAssetID))\n Doc.bind(page.needsProviderBttn, 'click', () => this.showReconfig(this.selectedAssetID))\n Doc.bind(page.rescanWallet, 'click', () => this.rescanWallet(this.selectedAssetID))\n Doc.bind(page.earlierTxs, 'click', () => this.loadEarlierTxs())\n\n Doc.bind(page.copyTxIDBtn, 'click', () => { setupCopyBtn(this.currTx?.id || '', page.txDetailsID, page.copyTxIDBtn, '#1e7d11') })\n Doc.bind(page.copyRecipientBtn, 'click', () => { setupCopyBtn(this.currTx?.recipient || '', page.txDetailsRecipient, page.copyRecipientBtn, '#1e7d11') })\n Doc.bind(page.copyBondIDBtn, 'click', () => { setupCopyBtn(this.currTx?.bondInfo?.bondID || '', page.txDetailsBondID, page.copyBondIDBtn, '#1e7d11') })\n Doc.bind(page.copyBondAccountIDBtn, 'click', () => { setupCopyBtn(this.currTx?.bondInfo?.accountID || '', page.txDetailsBondAccountID, page.copyBondAccountIDBtn, '#1e7d11') })\n Doc.bind(page.hideMixTxsCheckbox, 'change', () => { this.showTxHistory(this.selectedAssetID) })\n\n // Bind the new wallet form.\n this.newWalletForm = new NewWalletForm(page.newWalletForm, (assetID: number) => {\n const fmtParams = { assetName: app().assets[assetID].name }\n this.assetUpdated(assetID, page.newWalletForm, intl.prep(intl.ID_NEW_WALLET_SUCCESS, fmtParams))\n this.sortAssetButtons()\n this.updateTicketBuyer(assetID)\n this.updatePrivacy(assetID)\n })\n\n // Bind the wallet reconfig form.\n this.reconfigForm = new WalletConfigForm(page.reconfigInputs, false)\n\n this.walletCfgGuide = Doc.tmplElement(page.reconfigForm, 'walletCfgGuide')\n\n // Bind the send form.\n bindForm(page.sendForm, page.submitSendForm, async () => { this.stepSend() })\n // Send confirmation form.\n bindForm(page.vSendForm, page.vSend, async () => { this.send() })\n // Bind the wallet reconfiguration submission.\n bindForm(page.reconfigForm, page.submitReconfig, () => this.reconfig())\n\n page.forms.querySelectorAll('.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => this.closePopups())\n })\n\n Doc.bind(page.forms, 'mousedown', (e: MouseEvent) => {\n if (!Doc.mouseInElement(e, this.currentForm)) { this.closePopups() }\n })\n\n this.mixerToggle = new AniToggle(page.toggleMixer, page.mixingErr, false, (newState: boolean) => { return this.updateMixerState(newState) })\n\n this.keyup = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n if (Doc.isDisplayed(this.page.forms)) this.closePopups()\n }\n }\n Doc.bind(document, 'keyup', this.keyup)\n\n Doc.bind(page.downloadLogs, 'click', async () => { this.downloadLogs() })\n Doc.bind(page.exportWallet, 'click', async () => { this.displayExportWalletAuth() })\n Doc.bind(page.recoverWallet, 'click', async () => { this.showRecoverWallet() })\n bindForm(page.exportWalletAuth, page.exportWalletAuthSubmit, async () => { this.exportWalletAuthSubmit() })\n bindForm(page.recoverWalletConfirm, page.recoverWalletSubmit, () => { this.recoverWallet() })\n bindForm(page.confirmForce, page.confirmForceSubmit, async () => { this.confirmForceSubmit() })\n Doc.bind(page.disableWallet, 'click', async () => { this.showToggleWalletStatus(true) })\n Doc.bind(page.enableWallet, 'click', async () => { this.showToggleWalletStatus(false) })\n bindForm(page.toggleWalletStatusConfirm, page.toggleWalletStatusSubmit, async () => { this.toggleWalletStatus() })\n Doc.bind(page.managePeers, 'click', async () => { this.showManagePeersForm() })\n Doc.bind(page.addPeerSubmit, 'click', async () => { this.submitAddPeer() })\n Doc.bind(page.unapproveTokenAllowance, 'click', async () => { this.showUnapproveTokenAllowanceTableForm() })\n Doc.bind(page.unapproveTokenSubmit, 'click', async () => { this.submitUnapproveTokenAllowance() })\n Doc.bind(page.showVSPs, 'click', () => { this.showVSPPicker() })\n Doc.bind(page.vspDisplay, 'click', () => { this.showVSPPicker() })\n bindForm(page.vspPicker, page.customVspSubmit, async () => { this.setCustomVSP() })\n Doc.bind(page.purchaseTicketsBttn, 'click', () => { this.showPurchaseTicketsDialog() })\n bindForm(page.purchaseTicketsForm, page.purchaserSubmit, () => { this.purchaseTickets() })\n Doc.bind(page.purchaserInput, 'change', () => { this.purchaserInputChanged() })\n Doc.bind(page.ticketHistory, 'click', () => { this.showTicketHistory() })\n Doc.bind(page.ticketHistoryNextPage, 'click', () => { this.nextTicketPage() })\n Doc.bind(page.ticketHistoryPrevPage, 'click', () => { this.prevTicketPage() })\n Doc.bind(page.setVotes, 'click', () => { this.showSetVotesDialog() })\n Doc.bind(page.purchaseTicketsErrCloser, 'click', () => { Doc.hide(page.purchaseTicketsErrBox) })\n Doc.bind(page.privacyInfoBttn, 'click', () => { this.showForm(page.mixingInfo) })\n\n // New deposit address button.\n this.depositAddrForm = new DepositAddress(page.deposit)\n\n // Clicking on the available amount on the Send form populates the\n // amount field.\n Doc.bind(page.walletBal, 'click', () => { this.populateMaxSend() })\n\n // Display fiat value for current send amount.\n Doc.bind(page.sendAmt, 'input', () => {\n const { unitInfo: ui } = app().assets[this.selectedAssetID]\n const amt = parseFloatDefault(page.sendAmt.value)\n const conversionFactor = ui.conventional.conversionFactor\n Doc.showFiatValue(page.sendValue, amt * conversionFactor, app().fiatRatesMap[this.selectedAssetID], ui)\n })\n\n // Clicking on maxSend on the send form should populate the amount field.\n Doc.bind(page.maxSend, 'click', () => { this.populateMaxSend() })\n\n // Validate send address on input.\n Doc.bind(page.sendAddr, 'input', async () => {\n const asset = app().assets[this.selectedAssetID]\n page.sendAddr.classList.remove('border-danger', 'border-success')\n const addr = page.sendAddr.value || ''\n if (!asset || addr === '') return\n const valid = await this.validateSendAddress(addr, asset.id)\n if (valid) page.sendAddr.classList.add('border-success')\n else page.sendAddr.classList.add('border-danger')\n })\n\n // A link on the wallet reconfiguration form to show/hide the password field.\n Doc.bind(page.showChangePW, 'click', () => {\n this.changeWalletPW = !this.changeWalletPW\n this.setPWSettingViz(this.changeWalletPW)\n })\n\n // Changing the type of wallet.\n Doc.bind(page.changeWalletTypeSelect, 'change', () => {\n this.changeWalletType()\n })\n Doc.bind(page.showChangeType, 'click', () => {\n if (Doc.isHidden(page.changeWalletType)) {\n Doc.show(page.changeWalletType, page.changeTypeHideIcon)\n Doc.hide(page.changeTypeShowIcon)\n page.changeTypeMsg.textContent = intl.prep(intl.ID_KEEP_WALLET_TYPE)\n } else this.showReconfig(this.selectedAssetID, { skipAnimation: true })\n })\n\n app().registerNoteFeeder({\n fiatrateupdate: (note: RateNote) => { this.handleRatesNote(note) },\n balance: (note: BalanceNote) => { this.handleBalanceNote(note) },\n walletstate: (note: WalletStateNote) => { this.handleWalletStateNote(note) },\n walletconfig: (note: WalletStateNote) => { this.handleWalletStateNote(note) },\n walletsync: (note: WalletSyncNote) => { this.updateSyncAndPeers(note.assetID) },\n createwallet: (note: WalletCreationNote) => { this.handleCreateWalletNote(note) },\n walletnote: (note: WalletNote) => { this.handleCustomWalletNote(note) }\n })\n\n const firstAsset = this.sortAssetButtons()\n let selectedAsset = firstAsset.id\n const assetIDStr = State.fetchLocal(State.selectedAssetLK)\n if (assetIDStr) selectedAsset = Number(assetIDStr)\n this.setSelectedAsset(selectedAsset)\n\n setInterval(() => {\n for (const row of this.page.txHistoryTableBody.children) {\n const age = Doc.tmplElement(row as PageElement, 'age')\n age.textContent = Doc.timeSince(parseInt(age.dataset.timestamp as string))\n }\n }, 5000)\n }\n\n closePopups () {\n Doc.hide(this.page.forms)\n this.currTx = undefined\n if (this.animation) this.animation.stop()\n }\n\n async safePost (path: string, args: any): Promise<any> {\n const assetID = this.selectedAssetID\n const res = await postJSON(path, args)\n if (assetID !== this.selectedAssetID) throw Error('asset changed during request. aborting')\n return res\n }\n\n // stepSend makes a request to get an estimated fee and displays the confirm\n // send form.\n async stepSend () {\n const page = this.page\n Doc.hide(page.vSendErr, page.sendErr, page.vSendEstimates, page.txFeeNotAvailable)\n const assetID = parseInt(page.sendForm.dataset.assetID || '')\n const token = app().assets[assetID].token\n const subtract = page.subtractCheckBox.checked || false\n const conversionFactor = app().unitInfo(assetID).conventional.conversionFactor\n const value = Math.round(parseFloatDefault(page.sendAmt.value, 0) * conversionFactor)\n const addr = page.sendAddr.value || ''\n if (addr === '') return Doc.showFormError(page.sendErr, intl.prep(intl.ID_INVALID_ADDRESS_MSG, { address: addr }))\n const { wallet, unitInfo: ui, symbol } = app().assets[assetID]\n\n // txfee will not be available if wallet is not a fee estimator or the\n // request failed.\n let txfee = 0\n if ((wallet.traits & traitTxFeeEstimator) !== 0) {\n const open = {\n addr: page.sendAddr.value,\n assetID: assetID,\n subtract: subtract,\n value: value\n }\n\n const loaded = app().loading(page.sendForm)\n const res = await postJSON('/api/txfee', open)\n loaded()\n if (!app().checkResponse(res)) {\n page.txFeeNotAvailable.dataset.tooltip = intl.prep(intl.ID_TXFEE_ERR_MSG, { err: res.msg })\n Doc.show(page.txFeeNotAvailable)\n // We still want to ensure user address is valid before proceeding to send\n // confirm form if there's an error while calculating the transaction fee.\n const valid = await this.validateSendAddress(addr, assetID)\n if (!valid) return Doc.showFormError(page.sendErr, intl.prep(intl.ID_INVALID_ADDRESS_MSG, { address: addr || '' }))\n } else if (res.ok) {\n if (!res.validaddress) return Doc.showFormError(page.sendErr, intl.prep(intl.ID_INVALID_ADDRESS_MSG, { address: page.sendAddr.value || '' }))\n txfee = res.txfee\n Doc.show(page.vSendEstimates)\n }\n } else {\n // Validate only the send address for assets that are not fee estimators.\n const valid = await this.validateSendAddress(addr, assetID)\n if (!valid) return Doc.showFormError(page.sendErr, intl.prep(intl.ID_INVALID_ADDRESS_MSG, { address: addr || '' }))\n }\n\n page.vSendSymbol.textContent = symbol.toUpperCase()\n page.vSendLogo.src = Doc.logoPath(symbol)\n\n if (token) {\n const { unitInfo: feeUI, symbol: feeSymbol } = app().assets[token.parentID]\n page.vSendFee.textContent = Doc.formatFullPrecision(txfee, feeUI) + ' ' + feeSymbol\n } else {\n page.vSendFee.textContent = Doc.formatFullPrecision(txfee, ui)\n }\n const xcRate = app().fiatRatesMap[assetID]\n Doc.showFiatValue(page.vSendFeeFiat, txfee, xcRate, ui)\n page.vSendDestinationAmt.textContent = Doc.formatFullPrecision(value - txfee, ui)\n page.vTotalSend.textContent = Doc.formatFullPrecision(value, ui)\n Doc.showFiatValue(page.vTotalSendFiat, value, xcRate, ui)\n page.vSendAddr.textContent = page.sendAddr.value || ''\n const bal = wallet.balance.available - value\n page.balanceAfterSend.textContent = Doc.formatFullPrecision(bal, ui)\n Doc.showFiatValue(page.balanceAfterSendFiat, bal, xcRate, ui)\n Doc.show(page.approxSign)\n // NOTE: All tokens take this route because they cannot pay the fee.\n if (!subtract) {\n Doc.hide(page.approxSign)\n page.vSendDestinationAmt.textContent = Doc.formatFullPrecision(value, ui)\n let totalSend = value\n if (!token) totalSend += txfee\n page.vTotalSend.textContent = Doc.formatFullPrecision(totalSend, ui)\n Doc.showFiatValue(page.vTotalSendFiat, totalSend, xcRate, ui)\n let bal = wallet.balance.available - value\n if (!token) bal -= txfee\n // handle edge cases where bal is not enough to cover totalSend.\n // we don't want a minus display of user bal.\n if (bal <= 0) {\n page.balanceAfterSend.textContent = Doc.formatFullPrecision(0, ui)\n Doc.showFiatValue(page.balanceAfterSendFiat, 0, xcRate, ui)\n } else {\n page.balanceAfterSend.textContent = Doc.formatFullPrecision(bal, ui)\n Doc.showFiatValue(page.balanceAfterSendFiat, bal, xcRate, ui)\n }\n }\n Doc.hide(page.sendForm)\n await this.showForm(page.vSendForm)\n }\n\n // cancelSend displays the send form if user wants to make modification.\n async cancelSend () {\n const page = this.page\n Doc.hide(page.vSendForm, page.sendErr)\n await this.showForm(page.sendForm)\n }\n\n /*\n * validateSendAddress validates the provided address for an asset.\n */\n async validateSendAddress (addr: string, assetID: number): Promise<boolean> {\n const resp = await postJSON('/api/validateaddress', { addr: addr, assetID: assetID })\n return app().checkResponse(resp)\n }\n\n /*\n * setPWSettingViz sets the visibility of the password field section.\n */\n setPWSettingViz (visible: boolean) {\n const page = this.page\n if (visible) {\n Doc.hide(page.showIcon)\n Doc.show(page.hideIcon, page.changePW)\n page.switchPWMsg.textContent = intl.prep(intl.ID_KEEP_WALLET_PASS)\n return\n }\n Doc.hide(page.hideIcon, page.changePW)\n Doc.show(page.showIcon)\n page.switchPWMsg.textContent = intl.prep(intl.ID_NEW_WALLET_PASS)\n }\n\n /*\n * assetVersionUsedByDEXes returns a map of the versions of the\n * currently selected asset to the DEXes that use that version.\n */\n assetVersionUsedByDEXes (): Record<number, string[]> {\n const assetID = this.selectedAssetID\n const versionToDEXes = {} as Record<number, string[]>\n const exchanges = app().exchanges\n\n for (const host in exchanges) {\n const exchange = exchanges[host]\n const exchangeAsset = exchange.assets[assetID]\n if (!exchangeAsset) continue\n if (!versionToDEXes[exchangeAsset.version]) {\n versionToDEXes[exchangeAsset.version] = []\n }\n versionToDEXes[exchangeAsset.version].push(exchange.host)\n }\n\n return versionToDEXes\n }\n\n /*\n * submitUnapproveTokenAllowance submits a request to the server to\n * unapprove a version of the currently selected token's swap contract.\n */\n async submitUnapproveTokenAllowance () {\n const page = this.page\n const path = '/api/unapprovetoken'\n const res = await postJSON(path, {\n assetID: this.selectedAssetID,\n version: this.unapprovingTokenVersion\n })\n if (!app().checkResponse(res)) {\n page.unapproveTokenErr.textContent = res.msg\n Doc.show(page.unapproveTokenErr)\n return\n }\n\n const assetExplorer = CoinExplorers[this.selectedAssetID]\n if (assetExplorer && assetExplorer[net]) {\n page.unapproveTokenTxID.href = assetExplorer[net](res.txID)\n }\n page.unapproveTokenTxID.textContent = res.txID\n Doc.hide(page.unapproveTokenSubmissionElements, page.unapproveTokenErr)\n Doc.show(page.unapproveTokenTxMsg)\n }\n\n /*\n * showUnapproveTokenAllowanceForm displays the form for unapproving\n * a specific version of the currently selected token's swap contract.\n */\n async showUnapproveTokenAllowanceForm (version: number) {\n const page = this.page\n this.unapprovingTokenVersion = version\n Doc.show(page.unapproveTokenSubmissionElements)\n Doc.hide(page.unapproveTokenTxMsg, page.unapproveTokenErr)\n const asset = app().assets[this.selectedAssetID]\n if (!asset || !asset.token) return\n const parentAsset = app().assets[asset.token.parentID]\n if (!parentAsset) return\n Doc.empty(page.tokenAllowanceRemoveSymbol)\n page.tokenAllowanceRemoveSymbol.appendChild(Doc.symbolize(asset, true))\n page.tokenAllowanceRemoveVersion.textContent = version.toString()\n\n const path = '/api/approvetokenfee'\n const res = await postJSON(path, {\n assetID: this.selectedAssetID,\n version: version,\n approving: false\n })\n if (!app().checkResponse(res)) {\n page.unapproveTokenErr.textContent = res.msg\n Doc.show(page.unapproveTokenErr)\n } else {\n let feeText = `${Doc.formatCoinValue(res.txFee, parentAsset.unitInfo)} ${parentAsset.unitInfo.conventional.unit}`\n const rate = app().fiatRatesMap[parentAsset.id]\n if (rate) {\n feeText += ` (${Doc.formatFiatConversion(res.txFee, rate, parentAsset.unitInfo)} USD)`\n }\n page.unapprovalFeeEstimate.textContent = feeText\n }\n this.showForm(page.unapproveTokenForm)\n }\n\n /*\n * showUnapproveTokenAllowanceTableForm displays a table showing each of the\n * versions of a token's swap contract that have been approved and allows the\n * user to unapprove any of them.\n */\n async showUnapproveTokenAllowanceTableForm () {\n const page = this.page\n const asset = app().assets[this.selectedAssetID]\n if (!asset || !asset.wallet || !asset.wallet.approved) return\n while (page.tokenVersionBody.firstChild) {\n page.tokenVersionBody.removeChild(page.tokenVersionBody.firstChild)\n }\n Doc.empty(page.tokenVersionTableAssetSymbol)\n page.tokenVersionTableAssetSymbol.appendChild(Doc.symbolize(asset, true))\n const versionToDEXes = this.assetVersionUsedByDEXes()\n\n let showTable = false\n for (let i = 0; i <= asset.wallet.version; i++) {\n const approvalStatus = asset.wallet.approved[i]\n if (approvalStatus === undefined || approvalStatus !== ApprovalStatus.Approved) {\n continue\n }\n showTable = true\n const row = page.tokenVersionRow.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(row)\n tmpl.version.textContent = i.toString()\n if (versionToDEXes[i]) {\n tmpl.usedBy.textContent = versionToDEXes[i].join(', ')\n }\n const removeIcon = this.page.removeIconTmpl.cloneNode(true)\n Doc.bind(removeIcon, 'click', () => {\n this.showUnapproveTokenAllowanceForm(i)\n })\n tmpl.remove.appendChild(removeIcon)\n page.tokenVersionBody.appendChild(row)\n }\n Doc.setVis(showTable, page.tokenVersionTable)\n Doc.setVis(!showTable, page.tokenVersionNone)\n this.showForm(page.unapproveTokenTableForm)\n }\n\n /*\n * updateWalletPeers retrieves the wallet peers and displays them in the\n * wallet peers table.\n */\n async updateWalletPeersTable () {\n const page = this.page\n\n Doc.hide(page.peerSpinner)\n\n const res = await postJSON('/api/getwalletpeers', {\n assetID: this.selectedAssetID\n })\n if (!app().checkResponse(res)) {\n page.managePeersErr.textContent = res.msg\n Doc.show(page.managePeersErr)\n return\n }\n\n while (page.peersTableBody.firstChild) {\n page.peersTableBody.removeChild(page.peersTableBody.firstChild)\n }\n\n const peers : WalletPeer[] = res.peers || []\n peers.sort((a: WalletPeer, b: WalletPeer) : number => {\n return a.source - b.source\n })\n\n const defaultText = intl.prep(intl.ID_DEFAULT)\n const addedText = intl.prep(intl.ID_ADDED)\n const discoveredText = intl.prep(intl.ID_DISCOVERED)\n\n peers.forEach((peer: WalletPeer) => {\n const row = page.peerTableRow.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(row)\n\n tmpl.addr.textContent = peer.addr\n\n switch (peer.source) {\n case PeerSource.WalletDefault:\n tmpl.source.textContent = defaultText\n break\n case PeerSource.UserAdded:\n tmpl.source.textContent = addedText\n break\n case PeerSource.Discovered:\n tmpl.source.textContent = discoveredText\n break\n }\n\n let connectionIcon\n if (peer.connected) {\n connectionIcon = this.page.connectedIconTmpl.cloneNode(true)\n } else {\n connectionIcon = this.page.disconnectedIconTmpl.cloneNode(true)\n }\n tmpl.connected.appendChild(connectionIcon)\n\n if (peer.source === PeerSource.UserAdded) {\n const removeIcon = this.page.removeIconTmpl.cloneNode(true)\n Doc.bind(removeIcon, 'click', async () => {\n Doc.hide(page.managePeersErr)\n const res = await postJSON('/api/removewalletpeer', {\n assetID: this.selectedAssetID,\n addr: peer.addr\n })\n if (!app().checkResponse(res)) {\n page.managePeersErr.textContent = res.msg\n Doc.show(page.managePeersErr)\n return\n }\n this.spinUntilPeersUpdate()\n })\n tmpl.remove.appendChild(removeIcon)\n }\n\n page.peersTableBody.appendChild(row)\n })\n }\n\n // showManagePeersForm displays the manage peers form.\n async showManagePeersForm () {\n const page = this.page\n await this.updateWalletPeersTable()\n Doc.hide(page.managePeersErr)\n this.showForm(page.managePeersForm)\n }\n\n // submitAddPeers sends a request for the the wallet to connect to a new\n // peer.\n async submitAddPeer () {\n const page = this.page\n Doc.hide(page.managePeersErr)\n const res = await postJSON('/api/addwalletpeer', {\n assetID: this.selectedAssetID,\n addr: page.addPeerInput.value\n })\n if (!app().checkResponse(res)) {\n page.managePeersErr.textContent = res.msg\n Doc.show(page.managePeersErr)\n return\n }\n this.spinUntilPeersUpdate()\n page.addPeerInput.value = ''\n }\n\n /*\n * spinUntilPeersUpdate will show the spinner on the manage peers fork.\n * If it is still showing after 10 seconds, the peers table will be updated\n * instead of waiting for a notification.\n */\n async spinUntilPeersUpdate () {\n const page = this.page\n Doc.show(page.peerSpinner)\n setTimeout(() => {\n if (Doc.isDisplayed(page.peerSpinner)) {\n this.updateWalletPeersTable()\n }\n }, 10000)\n }\n\n /*\n * showToggleWalletStatus displays the toggleWalletStatusConfirm form with\n * relevant help message.\n */\n showToggleWalletStatus (disable: boolean) {\n const page = this.page\n Doc.hide(page.toggleWalletStatusErr, page.walletStatusDisable, page.disableWalletMsg, page.walletStatusEnable, page.enableWalletMsg)\n if (disable) Doc.show(page.walletStatusDisable, page.disableWalletMsg)\n else Doc.show(page.walletStatusEnable, page.enableWalletMsg)\n this.showForm(page.toggleWalletStatusConfirm)\n }\n\n /*\n * toggleWalletStatus toggles a wallets status to either disabled or enabled.\n */\n async toggleWalletStatus () {\n const page = this.page\n Doc.hide(page.toggleWalletStatusErr)\n\n const asset = app().assets[this.selectedAssetID]\n const disable = !asset.wallet.disabled\n const url = '/api/togglewalletstatus'\n const req = {\n assetID: this.selectedAssetID,\n disable: disable\n }\n\n const fmtParams = { assetName: asset.name }\n const loaded = app().loading(page.toggleWalletStatusConfirm)\n const res = await postJSON(url, req)\n loaded()\n if (!app().checkResponse(res)) {\n if (res.code === Errors.activeOrdersErr) page.toggleWalletStatusErr.textContent = intl.prep(intl.ID_ACTIVE_ORDERS_ERR_MSG, fmtParams)\n else page.toggleWalletStatusErr.textContent = res.msg\n Doc.show(page.toggleWalletStatusErr)\n return\n }\n\n let successMsg = intl.prep(intl.ID_WALLET_DISABLED_MSG, fmtParams)\n if (!disable) successMsg = intl.prep(intl.ID_WALLET_ENABLED_MSG, fmtParams)\n this.assetUpdated(this.selectedAssetID, page.toggleWalletStatusConfirm, successMsg)\n }\n\n /*\n * showBox shows the box with a fade-in animation.\n */\n async showBox (box: HTMLElement, focuser?: PageElement) {\n box.style.opacity = '0'\n Doc.show(box)\n if (focuser) focuser.focus()\n await Doc.animate(animationLength, progress => {\n box.style.opacity = `${progress}`\n }, 'easeOut')\n box.style.opacity = '1'\n this.displayed = box\n }\n\n /* showForm shows a modal form with a little animation. */\n async showForm (form: PageElement) {\n const page = this.page\n this.currentForm = form\n this.forms.forEach(form => Doc.hide(form))\n form.style.right = '10000px'\n Doc.show(page.forms, form)\n const shift = (page.forms.offsetWidth + form.offsetWidth) / 2\n await Doc.animate(animationLength, progress => {\n form.style.right = `${(1 - progress) * shift}px`\n }, 'easeOutHard')\n form.style.right = '0'\n }\n\n async showSuccess (msg: string) {\n this.forms.forEach(form => Doc.hide(form))\n this.currentForm = this.page.checkmarkForm\n this.animation = showSuccess(this.page, msg)\n await this.animation.wait()\n this.animation = new Animation(1500, () => { /* pass */ }, '', () => {\n if (this.currentForm === this.page.checkmarkForm) this.closePopups()\n })\n }\n\n /* Show the new wallet form. */\n async showNewWallet (assetID: number) {\n const page = this.page\n const box = page.newWalletForm\n this.newWalletForm.setAsset(assetID)\n const defaultsLoaded = this.newWalletForm.loadDefaults()\n await this.showForm(box)\n await defaultsLoaded\n }\n\n // sortAssetButtons displays supported assets, sorted. Returns first asset in the\n // list.\n sortAssetButtons (): SupportedAsset {\n const page = this.page\n this.assetButtons = {}\n Doc.empty(page.assetSelect)\n const sortedAssets = [...Object.values(app().assets)]\n sortedAssets.sort((a: SupportedAsset, b: SupportedAsset) => {\n if (a.wallet && !b.wallet) return -1\n if (!a.wallet && b.wallet) return 1\n if (!a.wallet && !b.wallet) return a.symbol === 'dcr' ? -1 : 1\n const [aBal, bBal] = [a.wallet.balance, b.wallet.balance]\n const [aTotal, bTotal] = [aBal.available + aBal.immature + aBal.locked, bBal.available + bBal.immature + bBal.locked]\n if (aTotal === 0 && bTotal === 0) return a.symbol.localeCompare(b.symbol)\n else if (aTotal === 0) return 1\n else if (aTotal === 0) return -1\n const [aFiat, bFiat] = [app().fiatRatesMap[a.id], app().fiatRatesMap[b.id]]\n if (aFiat && !bFiat) return -1\n if (!aFiat && bFiat) return 1\n return bFiat * bTotal - aFiat * aTotal\n })\n for (const a of sortedAssets) {\n const bttn = page.iconSelectTmpl.cloneNode(true) as HTMLElement\n page.assetSelect.appendChild(bttn)\n const tmpl = Doc.parseTemplate(bttn)\n this.assetButtons[a.id] = { tmpl, bttn }\n this.updateAssetButton(a.id)\n Doc.bind(bttn, 'click', () => {\n this.setSelectedAsset(a.id)\n State.storeLocal(State.selectedAssetLK, String(a.id))\n })\n }\n page.assetSelect.classList.remove('invisible')\n return sortedAssets[0]\n }\n\n updateAssetButton (assetID: number) {\n const a = app().assets[assetID]\n const { bttn, tmpl } = this.assetButtons[assetID]\n Doc.hide(tmpl.fiatBox, tmpl.noWallet)\n bttn.classList.add('nowallet')\n tmpl.img.src ||= Doc.logoPath(a.symbol) // don't initiate GET if already set (e.g. update on some notification)\n const symbolParts = a.symbol.split('.')\n if (symbolParts.length === 2) {\n const parentSymbol = symbolParts[1]\n tmpl.parentImg.classList.remove('d-hide')\n tmpl.parentImg.src ||= Doc.logoPath(parentSymbol)\n }\n if (this.selectedAssetID === assetID) bttn.classList.add('selected')\n tmpl.name.textContent = a.name\n if (a.wallet) {\n bttn.classList.remove('nowallet')\n const { wallet: { balance: b }, unitInfo: ui } = a\n const totalBalance = b.available + b.locked + b.immature\n const [s, unit] = Doc.formatBestUnitsFourSigFigs(totalBalance, ui)\n tmpl.balance.textContent = s\n tmpl.unit.textContent = unit\n Doc.show(tmpl.balanceBox)\n const fiatRate = app().fiatRatesMap[a.id]\n if (fiatRate) {\n Doc.show(tmpl.fiatBox)\n tmpl.fiat.textContent = Doc.formatFourSigFigs(totalBalance / ui.conventional.conversionFactor * fiatRate)\n }\n } else Doc.show(tmpl.noWallet)\n }\n\n async setSelectedAsset (assetID: number) {\n const { assetSelect } = this.page\n for (const b of assetSelect.children) b.classList.remove('selected')\n this.assetButtons[assetID].bttn.classList.add('selected')\n this.selectedAssetID = assetID\n this.page.hideMixTxsCheckbox.checked = true\n this.updateDisplayedAsset(assetID)\n this.showAvailableMarkets(assetID)\n const a = this.showRecentActivity(assetID)\n const b = this.showTxHistory(assetID)\n const c = this.updateTicketBuyer(assetID)\n const d = this.updatePrivacy(assetID)\n for (const p of [a, b, c, d]) await p\n }\n\n updateDisplayedAsset (assetID: number) {\n if (assetID !== this.selectedAssetID) return\n const { symbol, wallet, name, token, unitInfo } = app().assets[assetID]\n const { page, body } = this\n Doc.setText(body, '[data-asset-name]', name)\n Doc.setText(body, '[data-ticker]', unitInfo.conventional.unit)\n page.assetLogo.src = Doc.logoPath(symbol)\n Doc.hide(\n page.balanceBox, page.fiatBalanceBox, page.createWallet, page.walletDetails,\n page.sendReceive, page.connectBttnBox, page.statusLocked, page.statusReady,\n page.statusOff, page.unlockBttnBox, page.lockBttnBox, page.connectBttnBox,\n page.peerCountBox, page.syncProgressBox, page.statusDisabled, page.tokenInfoBox,\n page.needsProviderBox, page.feeStateBox, page.txSyncBox, page.txProgress,\n page.txFindingAddrs\n )\n this.checkNeedsProvider(assetID)\n if (token) {\n const parentAsset = app().assets[token.parentID]\n page.tokenParentLogo.src = Doc.logoPath(parentAsset.symbol)\n page.tokenParentName.textContent = parentAsset.name\n page.contractAddress.textContent = token.contractAddress\n Doc.show(page.tokenInfoBox)\n }\n if (wallet) {\n this.updateDisplayedAssetBalance()\n const { feeState, running, disabled, type: walletType } = wallet\n\n const walletDef = app().walletDefinition(assetID, walletType)\n page.walletType.textContent = walletDef.tab\n if (feeState) this.updateFeeState(feeState)\n if (disabled) Doc.show(page.statusDisabled) // wallet is disabled\n else if (running) {\n this.updateSyncAndPeers(wallet.assetID)\n } else Doc.show(page.statusOff, page.connectBttnBox) // wallet not running\n } else Doc.show(page.createWallet) // no wallet\n\n page.walletDetailsBox.classList.remove('invisible')\n }\n\n updateSyncAndPeers (assetID: number) {\n const { page, selectedAssetID } = this\n if (assetID !== selectedAssetID) return\n const { peerCount, syncProgress, syncStatus, encrypted, open, running } = app().walletMap[assetID]\n if (!running) return\n Doc.show(page.sendReceive, page.peerCountBox, page.syncProgressBox)\n page.peerCount.textContent = String(peerCount)\n page.syncProgress.textContent = `${(syncProgress * 100).toFixed(1)}%`\n if (open) {\n Doc.show(page.statusReady)\n if (!app().haveActiveOrders(assetID) && encrypted) Doc.show(page.lockBttnBox)\n } else Doc.show(page.statusLocked, page.unlockBttnBox) // wallet not unlocked\n Doc.setVis(syncStatus.txs !== undefined, page.txSyncBox)\n if (syncStatus.txs !== undefined) {\n Doc.hide(page.txProgress, page.txFindingAddrs)\n if (syncStatus.txs === 0 && syncStatus.blocks >= syncStatus.targetHeight) Doc.show(page.txFindingAddrs)\n else {\n Doc.show(page.txProgress)\n const prog = syncStatus.txs / syncStatus.targetHeight\n page.txProgress.textContent = `${(prog * 100).toFixed(1)}%`\n }\n }\n }\n\n updateFeeState (feeState: FeeState) {\n const { page, selectedAssetID: assetID } = this\n Doc.hide(page.feeStateBox)\n const { unitInfo: ui, token } = app().assets[assetID]\n const fiatRate = app().fiatRatesMap[assetID]\n if (!fiatRate) return\n const feeAssetID = token ? token.parentID : assetID\n const feeFiatRate = app().fiatRatesMap[feeAssetID]\n if (token && !feeFiatRate) return\n Doc.show(page.feeStateBox)\n const feeUI = token ? app().assets[token.parentID].unitInfo : ui\n Doc.formatBestRateElement(page.feeStateNetRate, feeAssetID, feeState.rate, feeUI)\n Doc.formatBestValueElement(page.feeStateSendFees, feeAssetID, feeState.send, feeUI)\n Doc.formatBestValueElement(page.feeStateSwapFees, feeAssetID, feeState.swap, feeUI)\n Doc.formatBestValueElement(page.feeStateRedeemFees, feeAssetID, feeState.redeem, feeUI)\n page.feeStateXcRate.textContent = Doc.formatFourSigFigs(fiatRate)\n const sendFiat = feeState.send / feeUI.conventional.conversionFactor * feeFiatRate\n page.feeStateSendFiat.textContent = Doc.formatFourSigFigs(sendFiat)\n const swapFiat = feeState.swap / feeUI.conventional.conversionFactor * feeFiatRate\n page.feeStateSwapFiat.textContent = Doc.formatFourSigFigs(swapFiat)\n const redeemFiat = feeState.redeem / feeUI.conventional.conversionFactor * feeFiatRate\n page.feeStateRedeemFiat.textContent = Doc.formatFourSigFigs(redeemFiat)\n Doc.show(page.feeStateBox)\n }\n\n async checkNeedsProvider (assetID: number) {\n const needs = await app().needsCustomProvider(assetID)\n const { page: { needsProviderBox: box, needsProviderBttn: bttn } } = this\n Doc.setVis(needs, box)\n if (!needs) return\n Doc.blink(bttn)\n }\n\n async updateTicketBuyer (assetID: number) {\n this.ticketPage = {\n number: 0,\n history: [],\n scanned: false\n }\n const { wallet, unitInfo: ui } = app().assets[assetID]\n const page = this.page\n Doc.hide(\n page.stakingBox, page.pickVSP, page.stakingSummary, page.stakingErr,\n page.vspDisplayBox, page.ticketPriceBox, page.purchaseTicketsBox,\n page.stakingRpcSpvMsg, page.ticketsDisabled\n )\n if (!wallet?.running || (wallet.traits & traitTicketBuyer) === 0) return\n Doc.show(page.stakingBox)\n const loaded = app().loading(page.stakingBox)\n const res = await this.safePost('/api/stakestatus', assetID)\n loaded()\n if (!app().checkResponse(res)) {\n // Look for common error for RPC + SPV wallet.\n if (res.msg.includes('disconnected from consensus RPC')) {\n Doc.show(page.stakingRpcSpvMsg)\n return\n }\n Doc.show(page.stakingErr)\n page.stakingErr.textContent = res.msg\n return\n }\n Doc.show(page.stakingSummary, page.ticketPriceBox)\n const stakeStatus = res.status as TicketStakingStatus\n this.stakeStatus = stakeStatus\n page.stakingAgendaCount.textContent = String(stakeStatus.stances.agendas.length)\n page.stakingTspendCount.textContent = String(stakeStatus.stances.tspends.length)\n page.purchaserCurrentPrice.textContent = Doc.formatFourSigFigs(stakeStatus.ticketPrice / ui.conventional.conversionFactor)\n page.purchaserBal.textContent = Doc.formatCoinValue(wallet.balance.available, ui)\n this.updateTicketStats(stakeStatus.stats, ui, stakeStatus.ticketPrice, stakeStatus.votingSubsidy)\n // If this is an extension wallet, we'll might to disable all controls.\n const disableStaking = app().extensionWallet(this.selectedAssetID)?.disableStaking\n if (disableStaking) {\n Doc.hide(page.setVotes, page.showVSPs)\n Doc.show(page.ticketsDisabled)\n page.extensionModeAppName.textContent = app().user.extensionModeConfig.name\n return\n }\n\n this.setVSPViz(stakeStatus.vsp)\n }\n\n setVSPViz (vsp: string) {\n const { page, stakeStatus } = this\n Doc.hide(page.vspDisplayBox)\n if (vsp) {\n Doc.show(page.vspDisplayBox, page.purchaseTicketsBox)\n Doc.hide(page.pickVSP)\n page.vspURL.textContent = vsp\n return\n }\n Doc.setVis(!stakeStatus.isRPC, page.pickVSP)\n Doc.setVis(stakeStatus.isRPC, page.purchaseTicketsBox)\n }\n\n updateTicketStats (stats: TicketStats, ui: UnitInfo, ticketPrice?: number, votingSubsidy?: number) {\n const { page, stakeStatus } = this\n stakeStatus.stats = stats\n if (ticketPrice) stakeStatus.ticketPrice = ticketPrice\n if (votingSubsidy) stakeStatus.votingSubsidy = votingSubsidy\n const liveTicketCount = stakeStatus.tickets.filter((tkt: Ticket) => tkt.status <= ticketStatusLive && tkt.status >= ticketStatusUnmined).length\n page.stakingTicketCount.textContent = String(liveTicketCount)\n page.immatureTicketCount.textContent = String(stats.mempool)\n Doc.setVis(stats.mempool > 0, page.immatureTicketCountBox)\n page.queuedTicketCount.textContent = String(stats.queued)\n page.formQueuedTix.textContent = String(stats.queued)\n Doc.setVis(stats.queued > 0, page.formQueueTixBox, page.queuedTicketCountBox)\n page.totalTicketCount.textContent = String(stats.ticketCount)\n page.totalTicketRewards.textContent = Doc.formatFourSigFigs(stats.totalRewards / ui.conventional.conversionFactor)\n page.totalTicketVotes.textContent = String(stats.votes)\n if (ticketPrice) page.ticketPrice.textContent = Doc.formatFourSigFigs(ticketPrice / ui.conventional.conversionFactor)\n if (votingSubsidy) page.votingSubsidy.textContent = Doc.formatFourSigFigs(votingSubsidy / ui.conventional.conversionFactor)\n }\n\n async showVSPPicker () {\n const assetID = this.selectedAssetID\n const page = this.page\n this.showForm(page.vspPicker)\n Doc.empty(page.vspPickerList)\n Doc.hide(page.stakingErr)\n const loaded = app().loading(page.vspPicker)\n const res = await this.safePost('/api/listvsps', assetID)\n loaded()\n if (!app().checkResponse(res)) {\n Doc.show(page.stakingErr)\n page.stakingErr.textContent = res.msg\n return\n }\n const vsps = res.vsps as VotingServiceProvider[]\n for (const vsp of vsps) {\n const row = page.vspRowTmpl.cloneNode(true) as PageElement\n page.vspPickerList.appendChild(row)\n const tmpl = Doc.parseTemplate(row)\n tmpl.url.textContent = vsp.url\n tmpl.feeRate.textContent = vsp.feePercentage.toFixed(2)\n tmpl.voting.textContent = String(vsp.voting)\n Doc.bind(row, 'click', () => {\n Doc.hide(page.stakingErr)\n this.setVSP(assetID, vsp)\n })\n }\n }\n\n showPurchaseTicketsDialog () {\n const page = this.page\n page.purchaserInput.value = ''\n Doc.hide(page.purchaserErr)\n this.showForm(this.page.purchaseTicketsForm)\n page.purchaserInput.focus()\n }\n\n purchaserInputChanged () {\n const page = this.page\n const n = parseInt(page.purchaserInput.value || '0')\n if (n <= 1) {\n page.purchaserInput.value = '1'\n return\n }\n page.purchaserInput.value = String(n)\n }\n\n async purchaseTickets () {\n const { page, selectedAssetID: assetID } = this\n // DRAFT NOTE: The user will get an actual ticket count somewhere in the\n // range 1 <= tickets_purchased <= n. See notes in\n // (*spvWallet).PurchaseTickets.\n // How do we handle this at the UI. Or do we handle it all in the backend\n // somehow?\n const n = parseInt(page.purchaserInput.value || '0')\n if (n < 1) return\n // TODO: Add confirmation dialog.\n const loaded = app().loading(page.purchaseTicketsForm)\n const res = await this.safePost('/api/purchasetickets', { assetID, n })\n loaded()\n if (!app().checkResponse(res)) {\n page.purchaserErr.textContent = res.msg\n Doc.show(page.purchaserErr)\n return\n }\n this.showSuccess(intl.prep(intl.ID_TICKETS_PURCHASED, { n: n.toLocaleString(Doc.languages()) }))\n }\n\n processTicketPurchaseUpdate (walletNote: CustomWalletNote) {\n const { stakeStatus, selectedAssetID, page } = this\n const { assetID } = walletNote\n const { err, remaining, tickets, stats } = walletNote.payload as TicketPurchaseUpdate\n if (assetID !== selectedAssetID) return\n if (err) {\n Doc.show(page.purchaseTicketsErrBox)\n page.purchaseTicketsErr.textContent = err\n return\n }\n if (tickets) stakeStatus.tickets = tickets.concat(stakeStatus.tickets)\n if (stats) this.updateTicketStats(stats, app().assets[assetID].unitInfo)\n stakeStatus.stats.queued = remaining\n page.queuedTicketCount.textContent = String(remaining)\n page.formQueuedTix.textContent = String(remaining)\n Doc.setVis(remaining > 0, page.queuedTicketCountBox)\n }\n\n async setVSP (assetID: number, vsp: VotingServiceProvider) {\n this.closePopups()\n const page = this.page\n const loaded = app().loading(page.stakingBox)\n const res = await this.safePost('/api/setvsp', { assetID, url: vsp.url })\n loaded()\n if (!app().checkResponse(res)) {\n Doc.show(page.stakingErr)\n page.stakingErr.textContent = res.msg\n return\n }\n this.setVSPViz(vsp.url)\n }\n\n setCustomVSP () {\n const assetID = this.selectedAssetID\n const vsp = { url: this.page.customVspUrl.value } as VotingServiceProvider\n this.setVSP(assetID, vsp)\n }\n\n pageOfTickets (pgNum: number) {\n const { stakeStatus, ticketPage } = this\n let startOffset = pgNum * ticketPageSize\n const pageOfTickets: Ticket[] = []\n if (startOffset < stakeStatus.tickets.length) {\n pageOfTickets.push(...stakeStatus.tickets.slice(startOffset, startOffset + ticketPageSize))\n if (pageOfTickets.length < ticketPageSize) {\n const need = ticketPageSize - pageOfTickets.length\n pageOfTickets.push(...ticketPage.history.slice(0, need))\n }\n } else {\n startOffset -= stakeStatus.tickets.length\n pageOfTickets.push(...ticketPage.history.slice(startOffset, startOffset + ticketPageSize))\n }\n return pageOfTickets\n }\n\n displayTicketPage (pageNumber: number, pageOfTickets: Ticket[]) {\n const { page, selectedAssetID: assetID } = this\n const ui = app().unitInfo(assetID)\n const coinLink = CoinExplorers[assetID][app().user.net]\n Doc.empty(page.ticketHistoryRows)\n page.ticketHistoryPage.textContent = String(pageNumber)\n for (const { tx, status } of pageOfTickets) {\n const tr = page.ticketHistoryRowTmpl.cloneNode(true) as PageElement\n page.ticketHistoryRows.appendChild(tr)\n app().bindUrlHandlers(tr)\n const tmpl = Doc.parseTemplate(tr)\n tmpl.age.textContent = Doc.timeSince(tx.stamp * 1000)\n tmpl.price.textContent = Doc.formatFullPrecision(tx.ticketPrice, ui)\n tmpl.status.textContent = intl.prep(ticketStatusTranslationKeys[status])\n tmpl.hashStart.textContent = tx.hash.slice(0, 6)\n tmpl.hashEnd.textContent = tx.hash.slice(-6)\n tmpl.detailsLinkUrl.setAttribute('href', coinLink(tx.hash))\n }\n }\n\n async ticketPageN (pageNumber: number) {\n const { page, stakeStatus, ticketPage, selectedAssetID: assetID } = this\n const pageOfTickets = this.pageOfTickets(pageNumber)\n if (pageOfTickets.length < ticketPageSize && !ticketPage.scanned) {\n const n = ticketPageSize - pageOfTickets.length\n const lastList = ticketPage.history.length > 0 ? ticketPage.history : stakeStatus.tickets\n const scanStart = lastList.length > 0 ? lastList[lastList.length - 1].tx.blockHeight : scanStartMempool\n const skipN = lastList.filter((tkt: Ticket) => tkt.tx.blockHeight === scanStart).length\n const loaded = app().loading(page.ticketHistoryForm)\n const res = await this.safePost('/api/ticketpage', { assetID, scanStart, n, skipN })\n loaded()\n if (!app().checkResponse(res)) {\n console.error('error fetching ticket page', res.msg)\n return\n }\n this.ticketPage.history.push(...res.tickets)\n pageOfTickets.push(...res.tickets)\n if (res.tickets.length < n) this.ticketPage.scanned = true\n }\n\n const totalTix = stakeStatus.tickets.length + ticketPage.history.length\n Doc.setVis(totalTix >= ticketPageSize, page.ticketHistoryPagination)\n Doc.setVis(totalTix > 0, page.ticketHistoryTable)\n Doc.setVis(totalTix === 0, page.noTicketsMessage)\n if (pageOfTickets.length === 0) {\n // Probably ended with a page of size ticketPageSize, so didn't know we\n // had hit the end until the user clicked the arrow and we went looking\n // for the next. Would be good to figure out a way to hide the arrow in\n // that case.\n Doc.hide(page.ticketHistoryNextPage)\n return\n }\n this.displayTicketPage(pageNumber, pageOfTickets)\n ticketPage.number = pageNumber\n const atEnd = pageNumber * ticketPageSize + pageOfTickets.length === totalTix\n Doc.setVis(!atEnd || !ticketPage.scanned, page.ticketHistoryNextPage)\n Doc.setVis(pageNumber > 0, page.ticketHistoryPrevPage)\n }\n\n async showTicketHistory () {\n this.showForm(this.page.ticketHistoryForm)\n await this.ticketPageN(this.ticketPage.number)\n }\n\n async nextTicketPage () {\n await this.ticketPageN(this.ticketPage.number + 1)\n }\n\n async prevTicketPage () {\n await this.ticketPageN(this.ticketPage.number - 1)\n }\n\n showSetVotesDialog () {\n const { page, stakeStatus, selectedAssetID: assetID } = this\n const ui = app().unitInfo(assetID)\n Doc.hide(page.votingFormErr)\n const coinLink = CoinExplorers[assetID][app().user.net]\n const upperCase = (s: string) => s.charAt(0).toUpperCase() + s.slice(1)\n\n const setVotes = async (req: any) => {\n Doc.hide(page.votingFormErr)\n const loaded = app().loading(page.votingForm)\n const res = await this.safePost('/api/setvotes', req)\n loaded()\n if (!app().checkResponse(res)) {\n Doc.show(page.votingFormErr)\n page.votingFormErr.textContent = res.msg\n throw Error(res.msg)\n }\n }\n\n const setAgendaChoice = async (agendaID: string, choiceID: string) => {\n await setVotes({ assetID, choices: { [agendaID]: choiceID } })\n for (const agenda of stakeStatus.stances.agendas) if (agenda.id === agendaID) agenda.currentChoice = choiceID\n }\n\n Doc.empty(page.votingAgendas)\n for (const agenda of stakeStatus.stances.agendas) {\n const div = page.votingAgendaTmpl.cloneNode(true) as PageElement\n page.votingAgendas.appendChild(div)\n const tmpl = Doc.parseTemplate(div)\n tmpl.description.textContent = agenda.description\n for (const choice of agenda.choices) {\n const div = page.votingChoiceTmpl.cloneNode(true) as PageElement\n tmpl.choices.appendChild(div)\n const choiceTmpl = Doc.parseTemplate(div)\n choiceTmpl.id.textContent = upperCase(choice.id)\n choiceTmpl.id.dataset.tooltip = choice.description\n choiceTmpl.radio.value = choice.id\n choiceTmpl.radio.name = agenda.id\n Doc.bind(choiceTmpl.radio, 'change', () => {\n if (!choiceTmpl.radio.checked) return\n setAgendaChoice(agenda.id, choice.id)\n })\n if (choice.id === agenda.currentChoice) choiceTmpl.radio.checked = true\n }\n app().bindTooltips(tmpl.choices)\n }\n\n const setTspendVote = async (txHash: string, policyID: string) => {\n await setVotes({ assetID, tSpendPolicy: { [txHash]: policyID } })\n for (const tspend of stakeStatus.stances.tspends) if (tspend.hash === txHash) tspend.currentPolicy = policyID\n }\n\n Doc.empty(page.votingTspends)\n for (const tspend of stakeStatus.stances.tspends) {\n const div = page.tspendTmpl.cloneNode(true) as PageElement\n page.votingTspends.appendChild(div)\n app().bindUrlHandlers(div)\n const tmpl = Doc.parseTemplate(div)\n for (const opt of [tmpl.yes, tmpl.no]) {\n opt.name = tspend.hash\n if (tspend.currentPolicy === opt.value) opt.checked = true\n Doc.bind(opt, 'change', () => {\n if (!opt.checked) return\n setTspendVote(tspend.hash, opt.value ?? '')\n })\n }\n if (tspend.value > 0) tmpl.value.textContent = Doc.formatFourSigFigs(tspend.value / ui.conventional.conversionFactor)\n else Doc.hide(tmpl.value)\n tmpl.hash.textContent = tspend.hash\n tmpl.explorerLink.setAttribute('href', coinLink(tspend.hash))\n }\n\n const setTKeyPolicy = async (key: string, policy: string) => {\n await setVotes({ assetID, treasuryPolicy: { [key]: policy } })\n for (const tkey of stakeStatus.stances.treasuryKeys) if (tkey.key === key) tkey.policy = policy\n }\n\n Doc.empty(page.votingTKeys)\n for (const keyPolicy of (stakeStatus.stances.treasuryKeys ?? [])) {\n const div = page.tkeyTmpl.cloneNode(true) as PageElement\n page.votingTKeys.appendChild(div)\n const tmpl = Doc.parseTemplate(div)\n for (const opt of [tmpl.yes, tmpl.no]) {\n opt.name = keyPolicy.key\n if (keyPolicy.policy === opt.value) opt.checked = true\n Doc.bind(opt, 'change', () => {\n if (!opt.checked) return\n setTKeyPolicy(keyPolicy.key, opt.value ?? '')\n })\n }\n tmpl.key.textContent = keyPolicy.key\n }\n\n this.showForm(page.votingForm)\n }\n\n async updatePrivacy (assetID: number) {\n const disablePrivacy = app().extensionWallet(assetID)?.disablePrivacy\n this.mixing = false\n const { wallet } = app().assets[assetID]\n const page = this.page\n Doc.hide(page.mixingBox, page.mixerOff, page.mixerOn)\n // TODO: Show special messaging if the asset supports mixing but not this\n // wallet type.\n if (disablePrivacy || !wallet?.running || (wallet.traits & traitFundsMixer) === 0) return\n Doc.show(page.mixingBox, page.mixerLoading)\n const res = await this.safePost('/api/mixingstats', { assetID })\n Doc.hide(page.mixerLoading)\n if (!app().checkResponse(res)) {\n Doc.show(page.mixingErr)\n page.mixingErr.textContent = res.msg\n return\n }\n\n this.mixing = res.stats.enabled as boolean\n if (this.mixing) Doc.show(page.mixerOn)\n else Doc.show(page.mixerOff)\n this.mixerToggle.setState(this.mixing)\n }\n\n async updateMixerState (on: boolean) {\n const page = this.page\n Doc.hide(page.mixingErr)\n const loaded = app().loading(page.mixingBox)\n const res = await postJSON('/api/configuremixer', { assetID: this.selectedAssetID, enabled: on })\n loaded()\n if (!app().checkResponse(res)) {\n page.mixingErr.textContent = intl.prep(intl.ID_API_ERROR, { msg: res.msg })\n Doc.show(page.mixingErr)\n return\n }\n Doc.setVis(on, page.mixerOn)\n Doc.setVis(!on, page.mixerOff)\n this.mixerToggle.setState(on)\n }\n\n updateDisplayedAssetBalance (): void {\n const page = this.page\n const asset = app().assets[this.selectedAssetID]\n const { wallet, unitInfo: ui, id: assetID } = asset\n const bal = wallet.balance\n Doc.show(page.balanceBox, page.walletDetails)\n const totalLocked = bal.locked + bal.contractlocked + bal.bondlocked\n const totalBalance = bal.available + totalLocked + bal.immature\n page.balance.textContent = Doc.formatCoinValue(totalBalance, ui)\n page.balanceUnit.textContent = ui.conventional.unit\n const rate = app().fiatRatesMap[assetID]\n if (rate) {\n Doc.show(page.fiatBalanceBox)\n page.fiatBalance.textContent = Doc.formatFiatConversion(totalBalance, rate, ui)\n }\n Doc.empty(page.balanceDetailBox)\n\n const addBalanceRow = (cat: string, bal: number, tooltipMsg?: string) => {\n const row = page.balanceDetailRow.cloneNode(true) as PageElement\n page.balanceDetailBox.appendChild(row)\n const tmpl = Doc.parseTemplate(row)\n tmpl.name.textContent = cat\n if (tooltipMsg) {\n tmpl.tooltipMsg.dataset.tooltip = tooltipMsg\n Doc.show(tmpl.tooltipMsg)\n }\n tmpl.balance.textContent = Doc.formatCoinValue(bal, ui)\n return row\n }\n\n let lastSubLockedRow: PageElement | undefined\n let lastPrimaryRow: PageElement | undefined\n const addPrimaryBalance = (cat: string, bal: number, tooltipMsg?: string) => {\n lastSubLockedRow = undefined\n lastPrimaryRow = addBalanceRow(cat, bal, tooltipMsg)\n }\n const addSubBalance = (cat: string, bal: number, tooltipMsg?: string) => {\n lastSubLockedRow = addBalanceRow(cat, bal, tooltipMsg)\n lastSubLockedRow.classList.add('sub')\n }\n const setRowClasses = () => {\n if (!lastSubLockedRow) return\n (lastPrimaryRow as PageElement).classList.add('itemized')\n lastSubLockedRow.classList.add('last')\n }\n\n addPrimaryBalance(intl.prep(intl.ID_AVAILABLE_TITLE), bal.available, '')\n if (bal.other?.Shielded !== undefined) {\n const transparent = bal.available - bal.other.Shielded.amt\n addSubBalance(intl.prep(intl.ID_TRANSPARENT), transparent)\n addSubBalance(intl.prep(intl.ID_SHIELDED), bal.other.Shielded.amt)\n }\n setRowClasses()\n\n addPrimaryBalance(intl.prep(intl.ID_LOCKED_TITLE), totalLocked, intl.prep(intl.ID_LOCKED_BAL_MSG))\n if (bal.orderlocked > 0) addSubBalance(intl.prep(intl.ID_ORDER), bal.orderlocked, intl.prep(intl.ID_LOCKED_ORDER_BAL_MSG))\n if (bal.contractlocked > 0) addSubBalance(intl.prep(intl.ID_SWAPPING), bal.contractlocked, intl.prep(intl.ID_LOCKED_SWAPPING_BAL_MSG))\n if (bal.bondlocked > 0) addSubBalance(intl.prep(intl.ID_BONDED), bal.bondlocked, intl.prep(intl.ID_LOCKED_BOND_BAL_MSG))\n if (bal.bondReserves > 0) addSubBalance(intl.prep(intl.ID_BOND_RESERVES), bal.bondReserves, intl.prep(intl.ID_BOND_RESERVES_MSG))\n if (bal?.other?.Staked !== undefined) addSubBalance('Staked', bal.other.Staked.amt)\n setRowClasses()\n\n if (bal.immature) addPrimaryBalance(intl.prep(intl.ID_IMMATURE_TITLE), bal.immature, intl.prep(intl.ID_IMMATURE_BAL_MSG))\n if (bal?.other?.Unmixed !== undefined) addSubBalance('Unmixed', bal.other.Unmixed.amt)\n setRowClasses()\n\n // TODO: handle reserves deficit with a notification.\n // if (bal.reservesDeficit > 0) addPrimaryBalance(intl.prep(intl.ID_RESERVES_DEFICIT), bal.reservesDeficit, intl.prep(intl.ID_RESERVES_DEFICIT_MSG))\n\n page.purchaserBal.textContent = Doc.formatFourSigFigs(bal.available / ui.conventional.conversionFactor)\n app().bindTooltips(page.balanceDetailBox)\n }\n\n showAvailableMarkets (assetID: number) {\n const page = this.page\n const exchanges = app().user.exchanges\n const markets: [string, Exchange, Market][] = []\n for (const xc of Object.values(exchanges)) {\n if (!xc.markets) continue\n for (const mkt of Object.values(xc.markets)) {\n if (mkt.baseid === assetID || mkt.quoteid === assetID) markets.push([xc.host, xc, mkt])\n }\n }\n\n const spotVolume = (assetID: number, mkt: Market): number => {\n const spot = mkt.spot\n if (!spot) return 0\n const conversionFactor = app().unitInfo(assetID).conventional.conversionFactor\n const volume = assetID === mkt.baseid ? spot.vol24 : spot.vol24 * spot.rate / OrderUtil.RateEncodingFactor\n return volume / conversionFactor\n }\n\n markets.sort((a: [string, Exchange, Market], b: [string, Exchange, Market]): number => {\n const [hostA,, mktA] = a\n const [hostB,, mktB] = b\n if (!mktA.spot && !mktB.spot) return hostA.localeCompare(hostB)\n return spotVolume(assetID, mktB) - spotVolume(assetID, mktA)\n })\n Doc.empty(page.availableMarkets)\n\n for (const [host, xc, mkt] of markets) {\n const { spot, baseid, basesymbol, quoteid, quotesymbol } = mkt\n const row = page.marketRow.cloneNode(true) as PageElement\n page.availableMarkets.appendChild(row)\n const tmpl = Doc.parseTemplate(row)\n tmpl.host.textContent = host\n tmpl.baseLogo.src = Doc.logoPath(basesymbol)\n tmpl.quoteLogo.src = Doc.logoPath(quotesymbol)\n Doc.empty(tmpl.baseSymbol, tmpl.quoteSymbol)\n tmpl.baseSymbol.appendChild(Doc.symbolize(xc.assets[baseid], true))\n tmpl.quoteSymbol.appendChild(Doc.symbolize(xc.assets[quoteid], true))\n\n if (spot) {\n const convRate = app().conventionalRate(baseid, quoteid, spot.rate, exchanges[host])\n tmpl.price.textContent = Doc.formatFourSigFigs(convRate)\n const fmtSymbol = (s: string) => s.split('.')[0].toUpperCase()\n tmpl.priceQuoteUnit.textContent = fmtSymbol(quotesymbol)\n tmpl.priceBaseUnit.textContent = fmtSymbol(basesymbol)\n tmpl.volume.textContent = Doc.formatFourSigFigs(spotVolume(assetID, mkt))\n tmpl.volumeUnit.textContent = assetID === baseid ? fmtSymbol(basesymbol) : fmtSymbol(quotesymbol)\n } else Doc.hide(tmpl.priceBox, tmpl.volumeBox)\n Doc.bind(row, 'click', () => app().loadPage('markets', { host, baseID: baseid, quoteID: quoteid }))\n }\n page.marketsOverviewBox.classList.remove('invisible')\n }\n\n async showRecentActivity (assetID: number) {\n const page = this.page\n const loaded = app().loading(page.orderActivityBox)\n const filter: OrderFilter = {\n n: 20,\n assets: [assetID],\n hosts: [],\n statuses: []\n }\n const res = await postJSON('/api/orders', filter)\n loaded()\n Doc.hide(page.noActivity, page.orderActivity)\n if (!res.orders || res.orders.length === 0) {\n Doc.show(page.noActivity)\n page.orderActivityBox.classList.remove('invisible')\n return\n }\n Doc.show(page.orderActivity)\n Doc.empty(page.recentOrders)\n for (const ord of (res.orders as Order[])) {\n const row = page.recentOrderTmpl.cloneNode(true) as PageElement\n page.recentOrders.appendChild(row)\n const tmpl = Doc.parseTemplate(row)\n let from: SupportedAsset, to: SupportedAsset\n const [baseUnitInfo, quoteUnitInfo] = [app().unitInfo(ord.baseID), app().unitInfo(ord.quoteID)]\n if (ord.sell) {\n [from, to] = [app().assets[ord.baseID], app().assets[ord.quoteID]]\n tmpl.fromQty.textContent = Doc.formatCoinValue(ord.qty, baseUnitInfo)\n if (ord.type === OrderUtil.Limit) {\n tmpl.toQty.textContent = Doc.formatCoinValue(ord.qty / OrderUtil.RateEncodingFactor * ord.rate, quoteUnitInfo)\n }\n } else {\n [from, to] = [app().assets[ord.quoteID], app().assets[ord.baseID]]\n if (ord.type === OrderUtil.Market) {\n tmpl.fromQty.textContent = Doc.formatCoinValue(ord.qty, baseUnitInfo)\n } else {\n tmpl.fromQty.textContent = Doc.formatCoinValue(ord.qty / OrderUtil.RateEncodingFactor * ord.rate, quoteUnitInfo)\n tmpl.toQty.textContent = Doc.formatCoinValue(ord.qty, baseUnitInfo)\n }\n }\n\n tmpl.fromLogo.src = Doc.logoPath(from.symbol)\n Doc.empty(tmpl.fromSymbol, tmpl.toSymbol)\n tmpl.fromSymbol.appendChild(Doc.symbolize(from, true))\n tmpl.toLogo.src = Doc.logoPath(to.symbol)\n tmpl.toSymbol.appendChild(Doc.symbolize(to, true))\n tmpl.status.textContent = OrderUtil.statusString(ord)\n tmpl.filled.textContent = `${(OrderUtil.filled(ord) / ord.qty * 100).toFixed(1)}%`\n tmpl.age.textContent = Doc.timeSince(ord.submitTime)\n tmpl.link.href = `order/${ord.id}`\n app().bindInternalNavigation(row)\n }\n page.orderActivityBox.classList.remove('invisible')\n }\n\n updateTxHistoryRow (row: PageElement, tx: WalletTransaction, assetID: number) {\n const tmpl = Doc.parseTemplate(row)\n let amtAssetID = assetID\n let feesAssetID = assetID\n if (tx.tokenID) {\n amtAssetID = tx.tokenID\n if (assetID !== tx.tokenID) feesAssetID = assetID\n else {\n const asset = app().assets[assetID]\n if (asset.token) feesAssetID = asset.token.parentID\n else console.error(`unable to determine fee asset for tx ${tx.id}`)\n }\n }\n const amtAssetUI = app().unitInfo(amtAssetID)\n const feesAssetUI = app().unitInfo(feesAssetID)\n tmpl.age.textContent = Doc.timeSince(tx.timestamp * 1000)\n tmpl.age.dataset.timestamp = String(tx.timestamp * 1000)\n Doc.setVis(tx.timestamp === 0, tmpl.pending)\n Doc.setVis(tx.timestamp !== 0, tmpl.age)\n if (tx.timestamp > 0) tmpl.age.dataset.stamp = String(tx.timestamp)\n let txType = txTypeString(tx.type)\n if (tx.tokenID && tx.tokenID !== assetID) {\n const tokenAsset = app().assets[tx.tokenID]\n const tokenSymbol = tokenAsset.unitInfo.conventional.unit\n txType = `${tokenSymbol} ${txType}`\n }\n tmpl.type.textContent = txType\n tmpl.id.textContent = trimStringWithEllipsis(tx.id, 12)\n tmpl.id.setAttribute('title', tx.id)\n tmpl.fees.textContent = Doc.formatCoinValue(tx.fees, feesAssetUI)\n if (noAmtTxTypes.includes(tx.type)) {\n tmpl.amount.textContent = '-'\n } else {\n const [u, c] = txTypeSignAndClass(tx.type)\n const amt = Doc.formatCoinValue(tx.amount, amtAssetUI)\n tmpl.amount.textContent = `${u}${amt}`\n if (c !== '') tmpl.amount.classList.add(c)\n }\n }\n\n txHistoryRow (tx: WalletTransaction, assetID: number) : PageElement {\n const row = this.page.txHistoryRowTmpl.cloneNode(true) as PageElement\n row.dataset.txid = tx.id\n Doc.bind(row, 'click', () => this.showTxDetailsPopup(tx.id))\n this.updateTxHistoryRow(row, tx, assetID)\n const tmpl = Doc.parseTemplate(row)\n this.stampers.push(tmpl.age)\n return row\n }\n\n txHistoryDateRow (date: string) : PageElement {\n const row = this.page.txHistoryDateRowTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(row)\n tmpl.date.textContent = date\n return row\n }\n\n setTxDetailsPopupElements (tx: WalletTransaction) {\n const page = this.page\n\n // Block explorer\n const assetExplorer = CoinExplorers[this.selectedAssetID]\n if (assetExplorer && assetExplorer[net]) {\n page.txViewBlockExplorer.href = assetExplorer[net](tx.id)\n }\n\n // Tx type\n let txType = txTypeString(tx.type)\n if (tx.tokenID && tx.tokenID !== this.selectedAssetID) {\n const tokenSymbol = app().assets[tx.tokenID].symbol.split('.')[0].toUpperCase()\n txType = `${tokenSymbol} ${txType}`\n }\n page.txDetailsType.textContent = txType\n Doc.setVis(tx.type === txTypeSwapOrSend, page.txTypeTooltip)\n page.txTypeTooltip.dataset.tooltip = intl.prep(intl.ID_SWAP_OR_SEND_TOOLTIP)\n\n // Amount\n if (noAmtTxTypes.includes(tx.type)) {\n Doc.hide(page.txDetailsAmtSection)\n } else {\n let assetID = this.selectedAssetID\n if (tx.tokenID) assetID = tx.tokenID\n Doc.show(page.txDetailsAmtSection)\n const ui = app().unitInfo(assetID)\n const amt = Doc.formatCoinValue(tx.amount, ui)\n const [s, c] = txTypeSignAndClass(tx.type)\n page.txDetailsAmount.textContent = `${s}${amt} ${ui.conventional.unit}`\n if (c !== '') page.txDetailsAmount.classList.add(c)\n }\n\n // Fee\n let feeAsset = this.selectedAssetID\n if (tx.tokenID !== undefined) {\n const asset = app().assets[tx.tokenID]\n if (asset.token) {\n feeAsset = asset.token.parentID\n } else {\n console.error(`wallet transaction ${tx.id} is supposed to be a token tx, but asset ${tx.tokenID} is not a token`)\n }\n }\n const feeUI = app().unitInfo(feeAsset)\n const fee = Doc.formatCoinValue(tx.fees, feeUI)\n page.txDetailsFee.textContent = `${fee} ${feeUI.conventional.unit}`\n\n // Time / block number\n page.txDetailsBlockNumber.textContent = `${tx.blockNumber}`\n const date = new Date(tx.timestamp * 1000)\n const dateStr = date.toLocaleDateString()\n const timeStr = date.toLocaleTimeString()\n page.txDetailsTimestamp.textContent = `${dateStr} ${timeStr}`\n Doc.setVis(tx.blockNumber === 0, page.timestampPending, page.blockNumberPending)\n Doc.setVis(tx.blockNumber !== 0, page.txDetailsBlockNumber, page.txDetailsTimestamp)\n\n // Tx ID\n page.txDetailsID.textContent = trimStringWithEllipsis(tx.id, 20)\n page.txDetailsID.setAttribute('title', tx.id)\n\n // Recipient\n if (tx.recipient) {\n Doc.show(page.txDetailsRecipientSection)\n page.txDetailsRecipient.textContent = trimStringWithEllipsis(tx.recipient, 20)\n page.txDetailsRecipient.setAttribute('title', tx.recipient)\n } else {\n Doc.hide(page.txDetailsRecipientSection)\n }\n\n // Bond Info\n if (tx.bondInfo) {\n Doc.show(page.txDetailsBondIDSection, page.txDetailsBondLocktimeSection)\n Doc.setVis(tx.bondInfo.accountID !== '', page.txDetailsBondAccountIDSection)\n page.txDetailsBondID.textContent = trimStringWithEllipsis(tx.bondInfo.bondID, 20)\n page.txDetailsBondID.setAttribute('title', tx.bondInfo.bondID)\n const date = new Date(tx.bondInfo.lockTime * 1000)\n const dateStr = date.toLocaleDateString()\n const timeStr = date.toLocaleTimeString()\n page.txDetailsBondLocktime.textContent = `${dateStr} ${timeStr}`\n page.txDetailsBondAccountID.textContent = trimStringWithEllipsis(tx.bondInfo.accountID, 20)\n page.txDetailsBondAccountID.setAttribute('title', tx.bondInfo.accountID)\n } else {\n Doc.hide(page.txDetailsBondIDSection, page.txDetailsBondLocktimeSection, page.txDetailsBondAccountIDSection)\n }\n\n // Nonce\n if (tx.additionalData && tx.additionalData.Nonce) {\n Doc.show(page.txDetailsNonceSection)\n page.txDetailsNonce.textContent = `${tx.additionalData.Nonce}`\n } else {\n Doc.hide(page.txDetailsNonceSection)\n }\n }\n\n showTxDetailsPopup (id: string) {\n const tx = app().getWalletTx(this.selectedAssetID, id)\n if (!tx) {\n console.error(`wallet transaction ${id} not found`)\n return\n }\n this.currTx = tx\n this.setTxDetailsPopupElements(tx)\n this.showForm(this.page.txDetails)\n }\n\n txHistoryTableNewestDate () : string {\n if (this.page.txHistoryTableBody.children.length >= 1) {\n const tmpl = Doc.parseTemplate(this.page.txHistoryTableBody.children[0] as PageElement)\n return tmpl.date.textContent || ''\n }\n return ''\n }\n\n txDate (tx: WalletTransaction) : string {\n if (tx.timestamp === 0) {\n return (new Date()).toLocaleDateString()\n }\n return (new Date(tx.timestamp * 1000)).toLocaleDateString()\n }\n\n handleTxNote (tx: WalletTransaction, newTx: boolean) {\n const { selectedAssetID: assetID } = this\n this.depositAddrForm.handleTx(assetID, tx)\n const w = app().assets[this.selectedAssetID].wallet\n const hideMixing = (w.traits & traitFundsMixer) !== 0 && !!this.page.hideMixTxs.checked\n if (hideMixing && tx.type === txTypeMixing) return\n if (newTx) {\n if (!this.oldestTx) {\n Doc.show(this.page.txHistoryTable)\n Doc.hide(this.page.noTxHistory)\n this.page.txHistoryTableBody.appendChild(this.txHistoryDateRow(this.txDate(tx)))\n this.page.txHistoryTableBody.appendChild(this.txHistoryRow(tx, assetID))\n this.oldestTx = tx\n } else if (this.txDate(tx) !== this.txHistoryTableNewestDate()) {\n this.page.txHistoryTableBody.insertBefore(this.txHistoryRow(tx, assetID), this.page.txHistoryTableBody.children[0])\n this.page.txHistoryTableBody.insertBefore(this.txHistoryDateRow(this.txDate(tx)), this.page.txHistoryTableBody.children[0])\n } else {\n this.page.txHistoryTableBody.insertBefore(this.txHistoryRow(tx, assetID), this.page.txHistoryTableBody.children[1])\n }\n return\n }\n for (const row of this.page.txHistoryTableBody.children) {\n const peRow = row as PageElement\n if (peRow.dataset.txid === tx.id) {\n this.updateTxHistoryRow(peRow, tx, assetID)\n break\n }\n }\n if (tx.id === this.currTx?.id) {\n this.setTxDetailsPopupElements(tx)\n }\n }\n\n async getTxHistory (assetID: number, hideMixTxs: boolean, after?: string) : Promise<TxHistoryResult> {\n let numToFetch = 10\n if (hideMixTxs) numToFetch = 15\n\n const res : TxHistoryResult = { txs: [], lastTx: false }\n let ref = after\n\n for (let i = 0; i < 40; i++) {\n const currRes = await app().txHistory(assetID, numToFetch, ref)\n if (currRes.txs.length > 0) {\n ref = currRes.txs[currRes.txs.length - 1].id\n }\n let txs = currRes.txs\n if (hideMixTxs) {\n txs = txs.filter((tx) => tx.type !== txTypeMixing)\n }\n if (res.txs.length + txs.length > 10) {\n const numToPush = 10 - res.txs.length\n res.txs.push(...txs.slice(0, numToPush))\n } else {\n if (currRes.lastTx) res.lastTx = true\n res.txs.push(...txs)\n }\n if (res.txs.length >= 10 || currRes.lastTx) break\n }\n return res\n }\n\n async showTxHistory (assetID: number) {\n const page = this.page\n let txRes : TxHistoryResult\n Doc.hide(page.txHistoryTable, page.txHistoryBox, page.noTxHistory, page.earlierTxs, page.txHistoryNotAvailable, page.hideMixTxs)\n Doc.empty(page.txHistoryTableBody)\n const w = app().assets[assetID].wallet\n if (!w || w.disabled || (w.traits & traitHistorian) === 0) {\n Doc.show(page.txHistoryNotAvailable)\n return\n }\n\n this.oldestTx = undefined\n\n const isMixing = (w.traits & traitFundsMixer) !== 0\n Doc.setVis(isMixing, page.hideMixTxs)\n Doc.show(page.txHistoryBox)\n\n try {\n const hideMixing = isMixing && !!page.hideMixTxsCheckbox.checked\n txRes = await this.getTxHistory(assetID, hideMixing)\n } catch (err) {\n Doc.show(page.noTxHistory)\n return\n }\n if (txRes.txs.length === 0) {\n Doc.show(page.noTxHistory)\n return\n }\n\n let oldestDate = this.txDate(txRes.txs[0])\n page.txHistoryTableBody.appendChild(this.txHistoryDateRow(oldestDate))\n for (const tx of txRes.txs) {\n const date = this.txDate(tx)\n if (date !== oldestDate) {\n oldestDate = date\n page.txHistoryTableBody.appendChild(this.txHistoryDateRow(date))\n }\n const row = this.txHistoryRow(tx, assetID)\n page.txHistoryTableBody.appendChild(row)\n }\n this.oldestTx = txRes.txs[txRes.txs.length - 1]\n Doc.show(page.txHistoryTable)\n Doc.setVis(!txRes.lastTx, page.earlierTxs)\n }\n\n async loadEarlierTxs () {\n if (!this.oldestTx) return\n const page = this.page\n let txRes : TxHistoryResult\n const w = app().assets[this.selectedAssetID].wallet\n const hideMixing = (w.traits & traitFundsMixer) !== 0 && !!page.hideMixTxsCheckbox.checked\n try {\n txRes = await this.getTxHistory(this.selectedAssetID, hideMixing, this.oldestTx.id)\n } catch (err) {\n console.error(err)\n return\n }\n let oldestDate = this.txDate(this.oldestTx)\n for (const tx of txRes.txs) {\n const date = this.txDate(tx)\n if (date !== oldestDate) {\n oldestDate = date\n page.txHistoryTableBody.appendChild(this.txHistoryDateRow(date))\n }\n const row = this.txHistoryRow(tx, this.selectedAssetID)\n page.txHistoryTableBody.appendChild(row)\n }\n Doc.setVis(!txRes.lastTx, page.earlierTxs)\n if (txRes.txs.length > 0) {\n this.oldestTx = txRes.txs[txRes.txs.length - 1]\n }\n }\n\n async rescanWallet (assetID: number) {\n const page = this.page\n Doc.hide(page.reconfigErr)\n\n const url = '/api/rescanwallet'\n const req = { assetID: assetID }\n\n const loaded = app().loading(this.body)\n const res = await postJSON(url, req)\n loaded()\n if (res.code === Errors.activeOrdersErr) {\n this.forceUrl = url\n this.forceReq = req\n this.showConfirmForce()\n return\n }\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.reconfigErr, res.msg)\n return\n }\n this.assetUpdated(assetID, page.reconfigForm, intl.prep(intl.ID_RESCAN_STARTED))\n }\n\n showConfirmForce () {\n Doc.hide(this.page.confirmForceErr)\n this.showForm(this.page.confirmForce)\n }\n\n showRecoverWallet () {\n Doc.hide(this.page.recoverWalletErr)\n this.showForm(this.page.recoverWalletConfirm)\n }\n\n /* Show the open wallet form if the password is not cached, and otherwise\n * attempt to open the wallet.\n */\n async openWallet (assetID: number) {\n const open = {\n assetID: assetID\n }\n const res = await postJSON('/api/openwallet', open)\n if (!app().checkResponse(res)) {\n console.error('openwallet error', res)\n return\n }\n this.assetUpdated(assetID, undefined, intl.prep(intl.ID_WALLET_UNLOCKED))\n }\n\n /* Show the form used to change wallet configuration settings. */\n async showReconfig (assetID: number, cfg?: reconfigSettings) {\n const page = this.page\n Doc.hide(\n page.changeWalletType, page.changeTypeHideIcon, page.reconfigErr,\n page.showChangeType, page.changeTypeHideIcon, page.reconfigErr,\n page.enableWallet, page.disableWallet\n )\n // Hide update password section by default\n this.changeWalletPW = false\n this.setPWSettingViz(this.changeWalletPW)\n const asset = app().assets[assetID]\n\n const currentDef = app().currentWalletDefinition(assetID)\n const walletDefs = asset.token ? [asset.token.definition] : asset.info ? asset.info.availablewallets : []\n const disableWalletType = app().extensionWallet(assetID)?.disableWalletType\n if (walletDefs.length > 1 && !disableWalletType) {\n Doc.empty(page.changeWalletTypeSelect)\n Doc.show(page.showChangeType, page.changeTypeShowIcon)\n page.changeTypeMsg.textContent = intl.prep(intl.ID_CHANGE_WALLET_TYPE)\n for (const wDef of walletDefs) {\n const option = document.createElement('option') as HTMLOptionElement\n if (wDef.type === currentDef.type) option.selected = true\n option.value = option.textContent = wDef.type\n page.changeWalletTypeSelect.appendChild(option)\n }\n }\n\n if (cfg?.elevateProviders) {\n for (const opt of (currentDef.configopts)) if (opt.key === 'providers') opt.required = true\n }\n\n const wallet = app().walletMap[assetID]\n Doc.setVis(wallet.traits & traitLogFiler, page.downloadLogs)\n Doc.setVis(wallet.traits & traitRecoverer, page.recoverWallet)\n Doc.setVis(wallet.traits & traitRestorer, page.exportWallet)\n Doc.setVis(wallet.traits & traitRescanner, page.rescanWallet)\n Doc.setVis(wallet.traits & traitPeerManager && !wallet.disabled, page.managePeers)\n Doc.setVis(wallet.traits & traitTokenApprover && !wallet.disabled, page.unapproveTokenAllowance)\n\n Doc.setVis(wallet.traits & traitsExtraOpts, page.otherActionsLabel)\n\n if (wallet.disabled) Doc.show(page.enableWallet)\n else Doc.show(page.disableWallet)\n\n this.showOrHideRecoverySupportMsg(wallet, currentDef.seeded)\n\n page.recfgAssetLogo.src = Doc.logoPath(asset.symbol)\n page.recfgAssetName.textContent = asset.name\n if (!cfg?.skipAnimation) this.showForm(page.reconfigForm)\n const loaded = app().loading(page.reconfigForm)\n const res = await postJSON('/api/walletsettings', { assetID })\n loaded()\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.reconfigErr, res.msg)\n return\n }\n const assetHasActiveOrders = app().haveActiveOrders(assetID)\n this.reconfigForm.update(asset.id, currentDef.configopts || [], assetHasActiveOrders)\n this.setGuideLink(currentDef.guidelink)\n this.reconfigForm.setConfig(res.map)\n this.updateDisplayedReconfigFields(currentDef)\n }\n\n showOrHideRecoverySupportMsg (wallet: WalletState, seeded: boolean) {\n this.setRecoverySupportMsgViz(seeded && !wallet.running && !wallet.disabled && Boolean(wallet.traits & traitRecoverer), wallet.symbol)\n }\n\n setRecoverySupportMsgViz (viz: boolean, symbol: string) {\n const page = this.page\n if (viz) {\n page.reconfigSupportMsg.textContent = intl.prep(intl.ID_WALLET_RECOVERY_SUPPORT_MSG, { walletSymbol: symbol.toLocaleUpperCase() })\n Doc.show(page.reconfigSupportMsg)\n page.submitReconfig.setAttribute('disabled', '')\n page.submitReconfig.classList.add('grey')\n return\n }\n page.submitReconfig.removeAttribute('disabled')\n page.submitReconfig.classList.remove('grey')\n Doc.empty(page.reconfigSupportMsg)\n Doc.hide(page.reconfigSupportMsg)\n }\n\n changeWalletType () {\n const page = this.page\n const walletType = page.changeWalletTypeSelect.value || ''\n const walletDef = app().walletDefinition(this.selectedAssetID, walletType)\n this.reconfigForm.update(this.selectedAssetID, walletDef.configopts || [], false)\n const wallet = app().walletMap[this.selectedAssetID]\n const currentDef = app().currentWalletDefinition(this.selectedAssetID)\n if (walletDef.type !== currentDef.type) this.setRecoverySupportMsgViz(false, wallet.symbol)\n else this.showOrHideRecoverySupportMsg(wallet, walletDef.seeded)\n this.setGuideLink(walletDef.guidelink)\n this.updateDisplayedReconfigFields(walletDef)\n }\n\n setGuideLink (guideLink: string) {\n Doc.hide(this.walletCfgGuide)\n if (guideLink !== '') {\n this.walletCfgGuide.href = guideLink\n Doc.show(this.walletCfgGuide)\n }\n }\n\n updateDisplayedReconfigFields (walletDef: WalletDefinition) {\n const disablePassword = app().extensionWallet(this.selectedAssetID)?.disablePassword\n if (walletDef.seeded || walletDef.type === 'token' || disablePassword) {\n Doc.hide(this.page.showChangePW, this.reconfigForm.fileSelector)\n this.changeWalletPW = false\n this.setPWSettingViz(false)\n } else Doc.show(this.page.showChangePW, this.reconfigForm.fileSelector)\n }\n\n /* Display a deposit address. */\n async showDeposit (assetID: number) {\n this.depositAddrForm.setAsset(assetID)\n this.showForm(this.page.deposit)\n }\n\n /* Show the form to either send or withdraw funds. */\n async showSendForm (assetID: number) {\n const page = this.page\n const box = page.sendForm\n const { wallet, unitInfo: ui, symbol, token } = app().assets[assetID]\n Doc.hide(page.toggleSubtract)\n page.subtractCheckBox.checked = false\n\n const isWithdrawer = (wallet.traits & traitWithdrawer) !== 0\n if (isWithdrawer) {\n Doc.show(page.toggleSubtract)\n }\n\n Doc.hide(page.sendErr, page.maxSendDisplay, page.sendTokenMsgBox)\n page.sendAddr.classList.remove('border-danger', 'border-success')\n page.sendAddr.value = ''\n page.sendAmt.value = ''\n const xcRate = app().fiatRatesMap[assetID]\n Doc.showFiatValue(page.sendValue, 0, xcRate, ui)\n page.walletBal.textContent = Doc.formatFullPrecision(wallet.balance.available, ui)\n page.sendLogo.src = Doc.logoPath(symbol)\n page.sendName.textContent = ui.conventional.unit\n if (token) {\n const parentAsset = app().assets[token.parentID]\n page.sendTokenParentLogo.src = Doc.logoPath(parentAsset.symbol)\n page.sendTokenParentName.textContent = parentAsset.name\n Doc.show(page.sendTokenMsgBox)\n }\n // page.sendFee.textContent = wallet.feerate\n // page.sendUnit.textContent = wallet.units\n\n if (wallet.balance.available > 0 && (wallet.traits & traitTxFeeEstimator) !== 0) {\n const feeReq = {\n assetID: assetID,\n subtract: isWithdrawer,\n maxWithdraw: true,\n value: wallet.balance.available\n }\n\n const loaded = app().loading(this.body)\n const res = await postJSON('/api/txfee', feeReq)\n loaded()\n if (app().checkResponse(res)) {\n let canSend = wallet.balance.available\n if (!token) {\n canSend -= res.txfee\n if (canSend < 0) canSend = 0\n }\n\n this.maxSend = canSend\n page.maxSend.textContent = Doc.formatFullPrecision(canSend, ui)\n Doc.showFiatValue(page.maxSendFiat, canSend, xcRate, ui)\n if (token) {\n const feeUI = app().assets[token.parentID].unitInfo\n page.maxSendFee.textContent = Doc.formatFullPrecision(res.txfee, feeUI) + ' ' + feeUI.conventional.unit\n Doc.showFiatValue(page.maxSendFeeFiat, res.txfee, app().fiatRatesMap[token.parentID], feeUI)\n } else {\n page.maxSendFee.textContent = Doc.formatFullPrecision(res.txfee, ui)\n Doc.showFiatValue(page.maxSendFeeFiat, res.txfee, xcRate, ui)\n }\n Doc.show(page.maxSendDisplay)\n }\n }\n\n Doc.showFiatValue(page.sendValue, 0, xcRate, ui)\n page.walletBal.textContent = Doc.formatFullPrecision(wallet.balance.available, ui)\n box.dataset.assetID = String(assetID)\n this.showForm(box)\n }\n\n /* doConnect connects to a wallet via the connectwallet API route. */\n async doConnect (assetID: number) {\n const loaded = app().loading(this.body)\n const res = await postJSON('/api/connectwallet', { assetID })\n loaded()\n if (!app().checkResponse(res)) {\n const { symbol } = app().assets[assetID]\n const page = this.page\n page.errorModalMsg.textContent = intl.prep(intl.ID_CONNECT_WALLET_ERR_MSG, { assetName: symbol, errMsg: res.msg })\n this.showForm(page.errorModal)\n }\n this.updateDisplayedAsset(assetID)\n }\n\n assetUpdated (assetID: number, oldForm?: PageElement, successMsg?: string) {\n if (assetID !== this.selectedAssetID) return\n this.updateDisplayedAsset(assetID)\n if (oldForm && Object.is(this.currentForm, oldForm)) {\n if (successMsg) this.showSuccess(successMsg)\n else this.closePopups()\n }\n }\n\n /* populateMaxSend populates the amount field with the max amount the wallet\n can send. The max send amount can be the maximum amount based on our\n pre-estimation or the asset's wallet balance.\n */\n async populateMaxSend () {\n const page = this.page\n const { id: assetID, unitInfo: ui, wallet } = app().assets[this.selectedAssetID]\n // Populate send amount with max send value and ensure we don't check\n // subtract checkbox for assets that don't have a withdraw method.\n const xcRate = app().fiatRatesMap[assetID]\n if ((wallet.traits & traitWithdrawer) === 0) {\n page.sendAmt.value = String(this.maxSend / ui.conventional.conversionFactor)\n Doc.showFiatValue(page.sendValue, this.maxSend, xcRate, ui)\n page.subtractCheckBox.checked = false\n } else {\n const amt = wallet.balance.available\n page.sendAmt.value = String(amt / ui.conventional.conversionFactor)\n Doc.showFiatValue(page.sendValue, amt, xcRate, ui)\n page.subtractCheckBox.checked = true\n }\n }\n\n /* send submits the send form to the API. */\n async send (): Promise<void> {\n const page = this.page\n const assetID = parseInt(page.sendForm.dataset.assetID ?? '')\n const subtract = page.subtractCheckBox.checked ?? false\n const conversionFactor = app().unitInfo(assetID).conventional.conversionFactor\n const pw = page.vSendPw.value || ''\n page.vSendPw.value = ''\n if (pw === '') {\n Doc.showFormError(page.vSendErr, intl.prep(intl.ID_NO_PASS_ERROR_MSG))\n return\n }\n const open = {\n assetID: assetID,\n address: page.sendAddr.value,\n subtract: subtract,\n value: Math.round(parseFloatDefault(page.sendAmt.value) * conversionFactor),\n pw: pw\n }\n const loaded = app().loading(page.vSendForm)\n const res = await postJSON('/api/send', open)\n loaded()\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.vSendErr, res.msg)\n return\n }\n const name = app().assets[assetID].name\n this.assetUpdated(assetID, page.vSendForm, intl.prep(intl.ID_SEND_SUCCESS, { assetName: name }))\n }\n\n /* update wallet configuration */\n async reconfig (): Promise<void> {\n const page = this.page\n const assetID = this.selectedAssetID\n Doc.hide(page.reconfigErr)\n let walletType = app().currentWalletDefinition(assetID).type\n if (!Doc.isHidden(page.changeWalletType)) {\n walletType = page.changeWalletTypeSelect.value || ''\n }\n\n const loaded = app().loading(page.reconfigForm)\n const req: ReconfigRequest = {\n assetID: assetID,\n config: this.reconfigForm.map(assetID),\n walletType: walletType\n }\n if (this.changeWalletPW) req.newWalletPW = page.newPW.value\n const res = await this.safePost('/api/reconfigurewallet', req)\n page.newPW.value = ''\n loaded()\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.reconfigErr, res.msg)\n return\n }\n if (this.data?.goBack) {\n app().loadPage(this.data.goBack)\n return\n }\n this.assetUpdated(assetID, page.reconfigForm, intl.prep(intl.ID_RECONFIG_SUCCESS))\n this.updateTicketBuyer(assetID)\n app().clearTxHistory(assetID)\n this.showTxHistory(assetID)\n this.updatePrivacy(assetID)\n this.checkNeedsProvider(assetID)\n }\n\n /* lock instructs the API to lock the wallet. */\n async lock (assetID: number): Promise<void> {\n const page = this.page\n const loaded = app().loading(page.newWalletForm)\n const res = await postJSON('/api/closewallet', { assetID: assetID })\n loaded()\n if (!app().checkResponse(res)) return\n this.updateDisplayedAsset(assetID)\n this.updatePrivacy(assetID)\n }\n\n async downloadLogs (): Promise<void> {\n const search = new URLSearchParams('')\n search.append('assetid', `${this.selectedAssetID}`)\n const url = new URL(window.location.href)\n url.search = search.toString()\n url.pathname = '/wallets/logfile'\n window.open(url.toString())\n }\n\n // displayExportWalletAuth displays a form to warn the user about the\n // dangers of exporting a wallet, and asks them to enter their password.\n async displayExportWalletAuth (): Promise<void> {\n const page = this.page\n Doc.hide(page.exportWalletErr)\n page.exportWalletPW.value = ''\n this.showForm(page.exportWalletAuth)\n }\n\n // exportWalletAuthSubmit is called after the user enters their password to\n // authorize looking up the information to restore their wallet in an\n // external wallet.\n async exportWalletAuthSubmit (): Promise<void> {\n const page = this.page\n const req = {\n assetID: this.selectedAssetID,\n pass: page.exportWalletPW.value\n }\n const url = '/api/restorewalletinfo'\n const loaded = app().loading(page.forms)\n const res = await postJSON(url, req)\n loaded()\n if (app().checkResponse(res)) {\n page.exportWalletPW.value = ''\n this.displayRestoreWalletInfo(res.restorationinfo)\n } else {\n Doc.showFormError(page.exportWalletErr, res.msg)\n }\n }\n\n // displayRestoreWalletInfo displays the information needed to restore a\n // wallet in external wallets.\n async displayRestoreWalletInfo (info: WalletRestoration[]): Promise<void> {\n const page = this.page\n Doc.empty(page.restoreInfoCardsList)\n for (const wr of info) {\n const card = this.restoreInfoCard.cloneNode(true) as HTMLElement\n const tmpl = Doc.parseTemplate(card)\n tmpl.name.textContent = wr.target\n tmpl.seed.textContent = wr.seed\n tmpl.seedName.textContent = `${wr.seedName}:`\n tmpl.instructions.textContent = wr.instructions\n page.restoreInfoCardsList.appendChild(card)\n }\n this.showForm(page.restoreWalletInfo)\n }\n\n async recoverWallet (): Promise<void> {\n const page = this.page\n Doc.hide(page.recoverWalletErr)\n const req = {\n assetID: this.selectedAssetID\n }\n const url = '/api/recoverwallet'\n const loaded = app().loading(page.forms)\n const res = await postJSON(url, req)\n loaded()\n if (res.code === Errors.activeOrdersErr) {\n this.forceUrl = url\n this.forceReq = req\n this.showConfirmForce()\n } else if (app().checkResponse(res)) {\n this.closePopups()\n } else {\n Doc.showFormError(page.recoverWalletErr, res.msg)\n }\n }\n\n /*\n * confirmForceSubmit resubmits either the recover or rescan requests with\n * force set to true. These two requests require force to be set to true if\n * they are called while the wallet is managing active orders.\n */\n async confirmForceSubmit (): Promise<void> {\n const page = this.page\n this.forceReq.force = true\n const loaded = app().loading(page.forms)\n const res = await postJSON(this.forceUrl, this.forceReq)\n loaded()\n if (app().checkResponse(res)) this.closePopups()\n else {\n Doc.showFormError(page.confirmForceErr, res.msg)\n }\n }\n\n /* handleBalance handles notifications updating a wallet's balance and assets'\n value in default fiat rate.\n . */\n handleBalanceNote (note: BalanceNote): void {\n this.updateAssetButton(note.assetID)\n if (note.assetID === this.selectedAssetID) this.updateDisplayedAssetBalance()\n }\n\n /* handleRatesNote handles fiat rate notifications, updating the fiat value of\n * all supported assets.\n */\n handleRatesNote (note: RateNote): void {\n this.updateAssetButton(this.selectedAssetID)\n if (!note.fiatRates[this.selectedAssetID]) return\n this.updateDisplayedAssetBalance()\n const { feeState } = app().walletMap[this.selectedAssetID]\n if (feeState) this.updateFeeState(feeState)\n }\n\n /*\n * handleWalletStateNote is a handler for both the 'walletstate' and\n * 'walletconfig' notifications.\n */\n handleWalletStateNote (note: WalletStateNote): void {\n const { assetID, feeState } = note.wallet\n this.updateAssetButton(assetID)\n this.assetUpdated(assetID)\n if (note.topic === 'WalletPeersUpdate' &&\n assetID === this.selectedAssetID &&\n Doc.isDisplayed(this.page.managePeersForm)) {\n this.updateWalletPeersTable()\n }\n if (feeState && assetID === this.selectedAssetID) this.updateFeeState(feeState)\n }\n\n /*\n * handleCreateWalletNote is a handler for 'createwallet' notifications.\n */\n handleCreateWalletNote (note: WalletCreationNote) {\n this.updateAssetButton(note.assetID)\n this.assetUpdated(note.assetID)\n this.showTxHistory(note.assetID)\n }\n\n handleCustomWalletNote (note: WalletNote) {\n const walletNote = note.payload as BaseWalletNote\n switch (walletNote.route) {\n case 'tipChange': {\n const n = walletNote as TipChangeNote\n switch (n.assetID) {\n case 42: { // dcr\n if (!this.stakeStatus) return\n const data = n.data as DecredTicketTipUpdate\n const synced = app().walletMap[n.assetID].synced\n if (synced) {\n const ui = app().unitInfo(n.assetID)\n this.updateTicketStats(data.stats, ui, data.ticketPrice, data.votingSubsidy)\n }\n }\n }\n break\n }\n case 'ticketPurchaseUpdate': {\n this.processTicketPurchaseUpdate(walletNote as CustomWalletNote)\n break\n }\n case 'transaction': {\n const n = walletNote as TransactionNote\n if (n.assetID === this.selectedAssetID) this.handleTxNote(n.transaction, n.new)\n break\n }\n case 'transactionHistorySynced' : {\n const n = walletNote\n if (n.assetID === this.selectedAssetID) this.showTxHistory(n.assetID)\n break\n }\n }\n }\n\n /*\n * unload is called by the Application when the user navigates away from\n * the /wallets page.\n */\n unload (): void {\n clearInterval(this.secondTicker)\n Doc.unbind(document, 'keyup', this.keyup)\n }\n}\n\nfunction trimStringWithEllipsis (str: string, maxLen: number): string {\n if (str.length <= maxLen) return str\n return `${str.substring(0, maxLen / 2)}...${str.substring(str.length - maxLen / 2)}`\n}\n","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nfunction _objectWithoutProperties(e, t) {\n if (null == e) return {};\n var o,\n r,\n i = objectWithoutPropertiesLoose(e, t);\n if (Object.getOwnPropertySymbols) {\n var n = Object.getOwnPropertySymbols(e);\n for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);\n }\n return i;\n}\nexport { _objectWithoutProperties as default };","function _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nexport { _objectWithoutPropertiesLoose as default };","import { setCoinHref } from './coinexplorers'\nimport Doc from './doc'\nimport * as intl from './locales'\nimport { CoreNote, PageElement } from './registry'\nimport State from './state'\n\nexport const IGNORE = 0\nexport const DATA = 1\nexport const POKE = 2\nexport const SUCCESS = 3\nexport const WARNING = 4\nexport const ERROR = 5\n\n/*\n * make constructs a new notification. The notification structure is a mirror of\n * the structure of notifications sent from the web server.\n * NOTE: I'm hoping to make this function obsolete, since errors generated in\n * javascript should usually be displayed/cached somewhere better. For example,\n * if the error is generated during submission of a form, the error should be\n * displayed on or near the form itself, not in the notifications.\n */\nexport function make (subject: string, details: string, severity: number): CoreNote {\n return {\n subject: subject,\n details: details,\n severity: severity,\n stamp: new Date().getTime(),\n acked: false,\n type: 'internal',\n topic: 'internal',\n id: ''\n }\n}\n\nconst NoteTypeOrder = 'order'\nconst NoteTypeMatch = 'match'\nconst NoteTypeBondPost = 'bondpost'\nconst NoteTypeConnEvent = 'conn'\n\ntype DesktopNtfnSettingLabel = {\n [x: string]: string\n}\n\nexport type DesktopNtfnSetting = {\n [x: string]: boolean\n}\n\nfunction desktopNtfnSettingsKey (): string {\n return `desktop_notifications-${window.location.host}`\n}\n\nexport const desktopNtfnLabels: DesktopNtfnSettingLabel = {\n [NoteTypeOrder]: intl.ID_BROWSER_NTFN_ORDERS,\n [NoteTypeMatch]: intl.ID_BROWSER_NTFN_MATCHES,\n [NoteTypeBondPost]: intl.ID_BROWSER_NTFN_BONDS,\n [NoteTypeConnEvent]: intl.ID_BROWSER_NTFN_CONNECTIONS\n}\n\nexport const defaultDesktopNtfnSettings: DesktopNtfnSetting = {\n [NoteTypeOrder]: true,\n [NoteTypeMatch]: true,\n [NoteTypeBondPost]: true,\n [NoteTypeConnEvent]: true\n}\n\nlet desktopNtfnSettings: DesktopNtfnSetting\n\n// BrowserNotifier is a wrapper around the browser's notification API.\nclass BrowserNotifier {\n static ntfnPermissionGranted (): boolean {\n return window.Notification.permission === 'granted'\n }\n\n static ntfnPermissionDenied (): boolean {\n return window.Notification.permission === 'denied'\n }\n\n static async requestNtfnPermission (): Promise<void> {\n if (!('Notification' in window)) {\n return\n }\n if (BrowserNotifier.ntfnPermissionGranted()) {\n BrowserNotifier.sendDesktopNotification(intl.prep(intl.ID_BROWSER_NTFN_ENABLED))\n } else if (!BrowserNotifier.ntfnPermissionDenied()) {\n await Notification.requestPermission()\n BrowserNotifier.sendDesktopNotification(intl.prep(intl.ID_BROWSER_NTFN_ENABLED))\n }\n }\n\n static async sendDesktopNotification (title: string, body?: string) {\n if (!BrowserNotifier.ntfnPermissionGranted()) return\n const ntfn = new window.Notification(title, {\n body: body,\n icon: '/img/softened-icon.png'\n })\n return ntfn\n }\n}\n\n// OSDesktopNotifier manages OS desktop notifications via the same interface\n// as BrowserNotifier, but sends notifications using an underlying Go\n// notification library exposed to the webview.\nclass OSDesktopNotifier {\n static ntfnPermissionGranted (): boolean {\n return true\n }\n\n static ntfnPermissionDenied (): boolean {\n return false\n }\n\n static async requestNtfnPermission (): Promise<void> {\n await OSDesktopNotifier.sendDesktopNotification(intl.prep(intl.ID_BROWSER_NTFN_ENABLED))\n return Promise.resolve()\n }\n\n static async sendDesktopNotification (title: string, body?: string): Promise<void> {\n // webview/linux or webview/windows\n if (isDesktopWebview()) await window.sendOSNotification(title, body)\n // webkit/darwin\n // See: client/cmd/bisonw-desktop/app_darwin.go#L673-#L697\n else if (isDesktopWebkit()) await window.webkit.messageHandlers.bwHandler.postMessage(['sendOSNotification', title, body])\n else console.error('sendDesktopNotification: unknown environment')\n }\n}\n\n// isDesktopWebview checks if we are running in webview\nfunction isDesktopWebview (): boolean {\n return window.isWebview !== undefined\n}\n\n// isDesktopDarwin returns true if we are running in a webview on darwin\n// It tests for the existence of the bwHandler webkit message handler.\nfunction isDesktopWebkit (): boolean {\n return window.webkit?.messageHandlers?.bwHandler !== undefined\n}\n\n// Bind the webview and webkit message handlers to the window object for darwin.\n// Linux and Windows handlers are binded in\n// client/cmd/bisonw-desktop/app.go#L399\nif (isDesktopWebkit()) {\n window.isWebview = () => { return true }\n window.sendOSNotification = async (title: string, body?: string) => {\n await window.webkit.messageHandlers.bwHandler.postMessage(['sendOSNotification', title, body])\n }\n window.openUrl = async (url: string) => {\n await window.webkit.messageHandlers.bwHandler.postMessage(['openURL', url.toString()])\n }\n window.open = (url?: string | URL, target?: string, feature?: string): Window | null => {\n if (url === undefined) return null\n if (target !== undefined || feature !== '') console.warn('open: target and feature are not supported in webview')\n window.webkit.messageHandlers.bwHandler.postMessage(['openURL', url.toString()])\n return null\n }\n}\n\n// determine whether we're running in a webview or in browser, and export\n// the appropriate notifier accordingly.\nexport const Notifier = isDesktopWebview() || isDesktopWebkit() ? OSDesktopNotifier : BrowserNotifier\n\nexport async function desktopNotify (note: CoreNote) {\n if (!desktopNtfnSettings.browserNtfnEnabled || !desktopNtfnSettings[note.type]) return\n await Notifier.sendDesktopNotification(note.subject, plainNote(note.details))\n}\n\nexport function fetchDesktopNtfnSettings (): DesktopNtfnSetting {\n if (desktopNtfnSettings !== undefined) {\n return desktopNtfnSettings\n }\n const k = desktopNtfnSettingsKey()\n desktopNtfnSettings = (State.fetchLocal(k) ?? {}) as DesktopNtfnSetting\n return desktopNtfnSettings\n}\n\nexport function updateNtfnSetting (noteType: string, enabled: boolean) {\n fetchDesktopNtfnSettings()\n desktopNtfnSettings[noteType] = enabled\n State.storeLocal(desktopNtfnSettingsKey(), desktopNtfnSettings)\n}\n\nconst coinExplorerTokenRe = /\\{\\{\\{([^|]+)\\|([^}]+)\\}\\}\\}/g\nconst orderTokenRe = /\\{\\{\\{order\\|([^}]+)\\}\\}\\}/g\n\n/*\n * insertRichNote replaces tx and order hash tokens in the input string with\n * <a> elements that link to the asset's chain explorer and order details\n * view, and inserts the resulting HTML into the supplied parent element.\n */\nexport function insertRichNote (parent: PageElement, inputString: string) {\n const s = inputString.replace(orderTokenRe, (_match, orderToken) => {\n const link = document.createElement('a')\n link.setAttribute('href', '/order/' + orderToken)\n link.setAttribute('class', 'subtlelink')\n link.textContent = orderToken.slice(0, 8)\n return link.outerHTML\n }).replace(coinExplorerTokenRe, (_match, assetID, hash) => {\n const link = document.createElement('a')\n link.setAttribute('data-explorer-coin', hash)\n link.setAttribute('target', '_blank')\n link.textContent = hash.slice(0, 8)\n setCoinHref(assetID, link)\n return link.outerHTML\n })\n const els = Doc.noderize(s).body\n while (els.firstChild) parent.appendChild(els.firstChild)\n}\n\n/*\n * plainNote replaces tx and order hash tokens tokens in the input string with\n * shortened hashes, for rendering in browser notifications and popups.\n */\nexport function plainNote (inputString: string): string {\n const replacedString = inputString.replace(coinExplorerTokenRe, (_match, _assetID, hash) => {\n return hash.slice(0, 8)\n })\n return replacedString\n}\n","import Doc from './doc'\nimport BasePage from './basepage'\nimport State from './state'\nimport { postJSON } from './http'\nimport * as forms from './forms'\nimport * as intl from './locales'\nimport { setCoinHref } from './coinexplorers'\nimport {\n updateNtfnSetting,\n DesktopNtfnSetting,\n fetchDesktopNtfnSettings,\n desktopNtfnLabels,\n Notifier\n} from './notifications'\nimport {\n app,\n Exchange,\n PageElement,\n PrepaidBondID\n} from './registry'\n\nconst animationLength = 300\n\nexport default class SettingsPage extends BasePage {\n body: HTMLElement\n currentDEX: Exchange\n page: Record<string, PageElement>\n forms: PageElement[]\n fiatRateSources: PageElement[]\n regAssetForm: forms.FeeAssetSelectionForm\n confirmRegisterForm: forms.ConfirmRegistrationForm\n newWalletForm: forms.NewWalletForm\n walletWaitForm: forms.WalletWaitForm\n dexAddrForm: forms.DEXAddressForm\n appPassResetForm: forms.AppPassResetForm\n currentForm: PageElement\n keyup: (e: KeyboardEvent) => void\n\n constructor (body: HTMLElement) {\n super()\n this.body = body\n const page = this.page = Doc.idDescendants(body)\n\n this.forms = Doc.applySelector(page.forms, ':scope > form')\n this.fiatRateSources = Doc.applySelector(page.fiatRateSources, 'input[type=checkbox]')\n\n page.darkMode.checked = State.fetchLocal(State.darkModeLK) === '1'\n Doc.bind(page.darkMode, 'click', () => {\n State.storeLocal(State.darkModeLK, page.darkMode.checked || false ? '1' : '0')\n if (page.darkMode.checked) {\n document.body.classList.add('dark')\n } else {\n document.body.classList.remove('dark')\n }\n })\n\n page.showPokes.checked = State.fetchLocal(State.popupsLK) === '1'\n Doc.bind(page.showPokes, 'click', () => {\n const show = page.showPokes.checked || false\n State.storeLocal(State.popupsLK, show ? '1' : '0')\n app().showPopups = show\n })\n\n Doc.bind(page.addADex, 'click', () => {\n this.dexAddrForm.refresh()\n this.showForm(page.dexAddrForm)\n })\n\n this.fiatRateSources.forEach(src => {\n Doc.bind(src, 'change', async () => {\n const res = await postJSON('/api/toggleratesource', {\n disable: !src.checked,\n source: src.value\n })\n if (!app().checkResponse(res)) {\n src.checked = !src.checked\n }\n // Update asset rate values and disable conversion status.\n await app().fetchUser()\n })\n })\n\n // Asset selection\n this.regAssetForm = new forms.FeeAssetSelectionForm(page.regAssetForm, async (assetID: number, tier: number) => {\n if (assetID === PrepaidBondID) {\n await app().fetchUser()\n window.location.reload()\n return\n }\n const asset = app().assets[assetID]\n const wallet = asset.wallet\n if (wallet) {\n const bondAsset = this.currentDEX.bondAssets[asset.symbol]\n const bondsFeeBuffer = await this.getBondsFeeBuffer(assetID, page.regAssetForm)\n this.confirmRegisterForm.setAsset(assetID, tier, bondsFeeBuffer)\n if (wallet.synced && wallet.balance.available >= 2 * bondAsset.amount + bondsFeeBuffer) {\n this.animateConfirmForm(page.regAssetForm)\n return\n }\n this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)\n this.slideSwap(page.walletWait)\n return\n }\n\n this.confirmRegisterForm.setAsset(assetID, tier, 0)\n this.newWalletForm.setAsset(assetID)\n this.slideSwap(page.newWalletForm)\n })\n\n // Approve fee payment\n this.confirmRegisterForm = new forms.ConfirmRegistrationForm(page.confirmRegForm, () => {\n this.registerDEXSuccess()\n }, () => {\n this.animateRegAsset(page.confirmRegForm)\n })\n\n // Create a new wallet\n this.newWalletForm = new forms.NewWalletForm(\n page.newWalletForm,\n assetID => this.newWalletCreated(assetID, this.confirmRegisterForm.tier),\n () => this.animateRegAsset(page.newWalletForm)\n )\n\n this.walletWaitForm = new forms.WalletWaitForm(page.walletWait, () => {\n this.animateConfirmForm(page.walletWait)\n }, () => { this.animateRegAsset(page.walletWait) })\n\n // Enter an address for a new DEX\n this.dexAddrForm = new forms.DEXAddressForm(page.dexAddrForm, async (xc: Exchange, certFile: string) => {\n this.currentDEX = xc\n this.confirmRegisterForm.setExchange(xc, certFile)\n this.walletWaitForm.setExchange(xc)\n this.regAssetForm.setExchange(xc, certFile)\n this.animateRegAsset(page.dexAddrForm)\n })\n\n Doc.bind(page.importAccount, 'click', () => this.prepareAccountImport(page.authorizeAccountImportForm))\n forms.bind(page.authorizeAccountImportForm, page.authorizeImportAccountConfirm, () => this.importAccount())\n\n Doc.bind(page.changeAppPW, 'click', () => this.showForm(page.changeAppPWForm))\n forms.bind(page.changeAppPWForm, page.submitNewPW, () => this.changeAppPW())\n\n this.appPassResetForm = new forms.AppPassResetForm(page.resetAppPWForm, async () => {\n await app().loadPage('login')\n Doc.hide(page.forms)\n })\n Doc.bind(page.resetAppPW, 'click', () => {\n this.appPassResetForm.refresh()\n this.showForm(page.resetAppPWForm)\n this.appPassResetForm.focus()\n })\n\n Doc.bind(page.accountFile, 'change', () => this.onAccountFileChange())\n Doc.bind(page.removeAccount, 'click', () => this.clearAccountFile())\n Doc.bind(page.addAccount, 'click', () => page.accountFile.click())\n\n Doc.bind(page.exportSeed, 'click', () => {\n Doc.hide(page.exportSeedErr)\n this.showForm(page.exportSeedAuth)\n })\n forms.bind(page.exportSeedAuth, page.exportSeedSubmit, () => this.submitExportSeedReq())\n\n Doc.bind(page.gameCodeLink, 'click', () => this.showForm(page.gameCodeForm))\n Doc.bind(page.gameCodeSubmit, 'click', () => this.submitGameCode())\n\n const closePopups = () => {\n Doc.hide(page.forms)\n page.exportSeedPW.value = ''\n page.legacySeed.textContent = ''\n page.mnemonic.textContent = ''\n }\n\n Doc.bind(page.forms, 'mousedown', (e: MouseEvent) => {\n if (!Doc.mouseInElement(e, this.currentForm)) { closePopups() }\n })\n\n this.keyup = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closePopups()\n }\n }\n Doc.bind(document, 'keyup', this.keyup)\n\n page.forms.querySelectorAll('.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => { closePopups() })\n })\n\n this.renderDesktopNtfnSettings()\n }\n\n updateNtfnSetting (e: Event) {\n const checkbox = e.target as HTMLInputElement\n const noteType = checkbox.getAttribute('name')\n if (noteType === null) return\n const enabled = checkbox.checked\n updateNtfnSetting(noteType, enabled)\n }\n\n getBrowserNtfnSettings (): DesktopNtfnSetting {\n const permissions = fetchDesktopNtfnSettings()\n return permissions\n }\n\n async renderDesktopNtfnSettings () {\n const page = this.page\n const ntfnSettings = this.getBrowserNtfnSettings()\n const labels = desktopNtfnLabels\n const tmpl = page.browserNtfnCheckboxTemplate\n tmpl.removeAttribute('id')\n const container = page.browserNtfnCheckboxContainer\n Doc.empty(page.browserNtfnCheckboxContainer)\n\n Object.keys(labels).forEach((noteType) => {\n const html = tmpl.cloneNode(true) as PageElement\n const enabled = ntfnSettings[noteType]\n const checkbox = Doc.tmplElement(html, 'checkbox')\n Doc.tmplElement(html, 'label').textContent = intl.prep(labels[noteType])\n checkbox.setAttribute('name', noteType)\n if (enabled) checkbox.setAttribute('checked', 'checked')\n container.appendChild(html)\n Doc.bind(checkbox, 'click', this.updateNtfnSetting)\n })\n\n const enabledCheckbox = page.browserNtfnEnabled\n\n Doc.bind(enabledCheckbox, 'click', async (e: Event) => {\n if (Notifier.ntfnPermissionDenied()) return\n const checkbox = e.target as HTMLInputElement\n if (checkbox.checked) {\n await Notifier.requestNtfnPermission()\n checkbox.checked = !Notifier.ntfnPermissionDenied()\n }\n this.updateNtfnSetting(e)\n checkbox.dispatchEvent(new Event('change'))\n })\n\n Doc.bind(enabledCheckbox, 'change', (e: Event) => {\n const checkbox = e.target as HTMLInputElement\n const permDenied = Notifier.ntfnPermissionDenied()\n Doc.setVis(checkbox.checked, page.browserNtfnCheckboxContainer)\n Doc.setVis(permDenied, page.browserNtfnBlockedMsg)\n checkbox.disabled = permDenied\n })\n\n enabledCheckbox.checked = (Notifier.ntfnPermissionGranted() && ntfnSettings.browserNtfnEnabled)\n enabledCheckbox.dispatchEvent(new Event('change'))\n }\n\n /*\n * slideSwap animates the replacement of the currently shown form with the\n * newForm and sets this.currentForm.\n */\n slideSwap (newForm: PageElement) {\n forms.slideSwap(this.currentForm, newForm)\n this.currentForm = newForm\n }\n\n // Retrieve an estimate for the tx fee needed to create new bond reserves.\n async getBondsFeeBuffer (assetID: number, form: HTMLElement) {\n const loaded = app().loading(form)\n const res = await postJSON('/api/bondsfeebuffer', { assetID })\n loaded()\n if (!app().checkResponse(res)) {\n return 0\n }\n return res.feeBuffer\n }\n\n async newWalletCreated (assetID: number, tier: number) {\n const user = await app().fetchUser()\n if (!user) return\n const page = this.page\n const asset = user.assets[assetID]\n const wallet = asset.wallet\n const bondAmt = this.currentDEX.bondAssets[asset.symbol].amount\n\n const bondsFeeBuffer = await this.getBondsFeeBuffer(assetID, page.newWalletForm)\n this.confirmRegisterForm.setFees(assetID, bondsFeeBuffer)\n if (wallet.synced && wallet.balance.available >= 2 * bondAmt + bondsFeeBuffer) {\n await this.animateConfirmForm(page.newWalletForm)\n return\n }\n\n this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)\n this.slideSwap(page.walletWait)\n }\n\n async onAccountFileChange () {\n const page = this.page\n const files = page.accountFile.files\n if (!files || !files.length) return\n page.selectedAccount.textContent = files[0].name\n Doc.show(page.removeAccount)\n Doc.hide(page.addAccount)\n }\n\n /* clearAccountFile cleanup accountFile value and selectedAccount text */\n clearAccountFile () {\n const page = this.page\n page.accountFile.value = ''\n page.selectedAccount.textContent = intl.prep(intl.ID_NONE_SELECTED)\n Doc.hide(page.removeAccount)\n Doc.show(page.addAccount)\n }\n\n async prepareAccountImport (authorizeAccountImportForm: HTMLElement) {\n const page = this.page\n page.importAccountErr.textContent = ''\n this.showForm(authorizeAccountImportForm)\n }\n\n // importAccount imports the account\n async importAccount () {\n const page = this.page\n let accountString = ''\n if (page.accountFile.value) {\n const files = page.accountFile.files\n if (!files || !files.length) {\n console.error('importAccount: no file specified')\n return\n }\n accountString = await files[0].text()\n }\n let account\n try {\n account = JSON.parse(accountString)\n } catch (e) {\n page.importAccountErr.textContent = e.message\n Doc.show(page.importAccountErr)\n return\n }\n if (typeof account === 'undefined') {\n Doc.showFormError(page.importAccountErr, intl.prep(intl.ID_ACCT_UNDEFINED))\n return\n }\n const { bonds = [], ...acctInf } = account\n const req = {\n account: acctInf,\n bonds: bonds\n }\n const loaded = app().loading(this.body)\n const res = await postJSON('/api/importaccount', req)\n loaded()\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.importAccountErr, res.msg)\n return\n }\n await app().fetchUser()\n Doc.hide(page.forms)\n // Initial method of displaying imported account.\n window.location.reload()\n }\n\n async submitExportSeedReq () {\n const page = this.page\n const pw = page.exportSeedPW.value\n const loaded = app().loading(this.body)\n const res = await postJSON('/api/exportseed', { pass: pw })\n loaded()\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.exportSeedErr, res.msg)\n return\n }\n page.exportSeedPW.value = ''\n if (res.seed.length === 128 && res.seed.split(' ').length === 1) {\n page.legacySeed.textContent = res.seed.match(/.{1,32}/g).map((chunk: string) => chunk.match(/.{1,8}/g)?.join(' ')).join('\\n')\n } else page.mnemonic.textContent = res.seed\n this.showForm(page.authorizeSeedDisplay)\n }\n\n /* showForm shows a modal form with a little animation. */\n async showForm (form: HTMLElement) {\n const page = this.page\n this.currentForm = form\n this.forms.forEach(form => Doc.hide(form))\n form.style.right = '10000px'\n Doc.show(page.forms, form)\n const shift = (page.forms.offsetWidth + form.offsetWidth) / 2\n await Doc.animate(animationLength, progress => {\n form.style.right = `${(1 - progress) * shift}px`\n }, 'easeOutHard')\n form.style.right = '0'\n }\n\n /* gets the contents of the cert file */\n async getCertFile () {\n let cert = ''\n if (this.dexAddrForm.page.certFile.value) {\n const files = this.dexAddrForm.page.certFile.files\n if (files && files.length) cert = await files[0].text()\n }\n return cert\n }\n\n /* Called after successful registration to a DEX. */\n async registerDEXSuccess () {\n window.location.reload()\n }\n\n /* Change application password */\n async changeAppPW () {\n const page = this.page\n Doc.hide(page.changePWErrMsg)\n\n const clearValues = () => {\n page.appPW.value = ''\n page.newAppPW.value = ''\n page.confirmNewPW.value = ''\n }\n // Ensure password fields are nonempty.\n if (!page.appPW.value || !page.newAppPW.value || !page.confirmNewPW.value) {\n Doc.showFormError(page.changePWErrMsg, intl.prep(intl.ID_NO_APP_PASS_ERROR_MSG))\n clearValues()\n return\n }\n // Ensure password confirmation matches.\n if (page.newAppPW.value !== page.confirmNewPW.value) {\n Doc.showFormError(page.changePWErrMsg, intl.prep(intl.ID_PASSWORD_NOT_MATCH))\n clearValues()\n return\n }\n const loaded = app().loading(page.changeAppPW)\n const req = {\n appPW: page.appPW.value,\n newAppPW: page.newAppPW.value\n }\n clearValues()\n const res = await postJSON('/api/changeapppass', req)\n loaded()\n if (!app().checkResponse(res)) {\n Doc.showFormError(page.changePWErrMsg, res.msg)\n return\n }\n Doc.hide(page.forms)\n }\n\n /*\n * unload is called by the Application when the user navigates away from\n * the /settings page.\n */\n unload () {\n Doc.unbind(document, 'keyup', this.keyup)\n }\n\n /* Swap in the asset selection form and run the animation. */\n async animateRegAsset (oldForm: HTMLElement) {\n Doc.hide(oldForm)\n const form = this.page.regAssetForm\n this.currentForm = form\n this.regAssetForm.animate()\n Doc.show(form)\n }\n\n /* Swap in the confirmation form and run the animation. */\n async animateConfirmForm (oldForm: HTMLElement) {\n this.confirmRegisterForm.animate()\n const form = this.page.confirmRegForm\n this.currentForm = form\n Doc.hide(oldForm)\n Doc.show(form)\n }\n\n async submitGameCode () {\n const page = this.page\n Doc.hide(page.gameCodeErr)\n const code = page.gameCodeInput.value\n if (!code) {\n page.gameCodeErr.textContent = intl.prep(intl.ID_NO_CODE_PROVIDED)\n Doc.show(page.gameCodeErr)\n return\n }\n const msg = page.gameCodeMsg.value || ''\n const loaded = app().loading(page.gameCodeForm)\n const resp = await postJSON('/api/redeemgamecode', { code, msg })\n loaded()\n if (!app().checkResponse(resp)) {\n page.gameCodeErr.textContent = intl.prep(intl.ID_API_ERROR, { msg: resp.msg })\n Doc.show(page.gameCodeErr)\n return\n }\n Doc.show(page.gameCodeSuccess)\n page.gameRedeemTx.dataset.explorerCoin = resp.coinString\n const dcrBipID = 42\n setCoinHref(dcrBipID, page.gameRedeemTx)\n page.gameRedeemTx.textContent = resp.coinString\n const ui = app().unitInfo(dcrBipID)\n page.gameRedeemValue.textContent = Doc.formatCoinValue(resp.win, ui)\n }\n}\n","import {\n MarketOrderBook,\n MiniOrder\n} from './registry'\n\nexport default class OrderBook {\n base: number\n baseSymbol: string\n quote: number\n quoteSymbol: string\n buys: MiniOrder[]\n sells: MiniOrder[]\n\n constructor (mktBook: MarketOrderBook, baseSymbol: string, quoteSymbol: string) {\n this.base = mktBook.base\n this.baseSymbol = baseSymbol\n this.quote = mktBook.quote\n this.quoteSymbol = quoteSymbol\n // Books are sorted mid-gap first.\n this.buys = mktBook.book.buys || []\n this.sells = mktBook.book.sells || []\n }\n\n /* add adds an order to the order book. */\n add (ord: MiniOrder) {\n if (ord.qtyAtomic === 0) {\n // TODO: Somebody, for the love of god, figure out why the hell this helps\n // with the ghost orders problem. As far as I know, this order is a booked\n // order that had more than one match in an epoch and completely filled.\n // Because the first match didn't exhaust the order, there would be a\n // 'update_remaining' notification scheduled for the order. But by the\n // time OrderRouter generates the notification long after matching, the\n // order has zero qty left to fill. It's all good though, kinda, because\n // the notification is quickly followed with an 'unbook_order'\n // notification. I have tried my damnedest to catch an update_remaining\n // note without an accompanying unbook_order note, and have thus failed.\n // Yet, this fix somehow seems to work. It's infuriating, tbh.\n window.log('zeroqty', 'zero quantity order encountered', ord)\n return\n }\n const side = ord.sell ? this.sells : this.buys\n side.splice(findIdx(side, ord.rate, !ord.sell), 0, ord)\n }\n\n /* remove removes an order from the order book. */\n remove (token: string) {\n if (this.removeFromSide(this.sells, token)) return\n this.removeFromSide(this.buys, token)\n }\n\n /* removeFromSide removes an order from the list of orders. */\n removeFromSide (side: MiniOrder[], token: string) {\n const [ord, i] = this.findOrder(side, token)\n if (ord) {\n side.splice(i, 1)\n return true\n }\n return false\n }\n\n /* findOrder finds an order in a specified side */\n findOrder (side: MiniOrder[], token: string): [MiniOrder | null, number] {\n for (let i = 0; i < side.length; i++) {\n if (side[i].token === token) {\n return [side[i], i]\n }\n }\n return [null, -1]\n }\n\n /* updates the remaining quantity of an order. */\n updateRemaining (token: string, qty: number, qtyAtomic: number) {\n if (this.updateRemainingSide(this.sells, token, qty, qtyAtomic)) return\n this.updateRemainingSide(this.buys, token, qty, qtyAtomic)\n }\n\n /*\n * updateRemainingSide looks for the order in the side and updates the\n * quantity, returning true on success, false if order not found.\n */\n updateRemainingSide (side: MiniOrder[], token: string, qty: number, qtyAtomic: number) {\n const ord = this.findOrder(side, token)[0]\n if (ord) {\n ord.qty = qty\n ord.qtyAtomic = qtyAtomic\n return true\n }\n return false\n }\n\n /*\n * setEpoch sets the current epoch and clear any orders from previous epochs.\n */\n setEpoch (epochIdx: number) {\n const approve = (ord: MiniOrder) => ord.epoch === undefined || ord.epoch === 0 || ord.epoch === epochIdx\n this.sells = this.sells.filter(approve)\n this.buys = this.buys.filter(approve)\n }\n\n /* empty will return true if both the buys and sells lists are empty. */\n empty () {\n return !this.sells.length && !this.buys.length\n }\n\n /* count is the total count of both buy and sell orders. */\n count () {\n return this.sells.length + this.buys.length\n }\n\n /* bestGapOrder will return the best non-epoch order if one exists, or the\n * best epoch order if there are only epoch orders, or null if there are no\n * orders.\n */\n bestGapOrder (side: MiniOrder[]) {\n let best = null\n for (const ord of side) {\n if (!ord.epoch) return ord\n if (!best) {\n best = ord\n }\n }\n return best\n }\n\n bestGapBuy () {\n return this.bestGapOrder(this.buys)\n }\n\n bestGapSell () {\n return this.bestGapOrder(this.sells)\n }\n}\n\n/*\n * findIdx find the index at which to insert the order into the list of orders.\n */\nfunction findIdx (side: MiniOrder[], rate: number, less: boolean): number {\n for (let i = 0; i < side.length; i++) {\n if ((side[i].rate < rate) === less) return i\n }\n return side.length\n}\n","// MessageSocket is a WebSocket manager that uses the Decred DEX Message format\n// for communications.\n//\n// Message request format:\n// {\n// route: 'name',\n// id: int,\n// payload: anything or nothing\n// }\n//\n// Message response payload will be a result object with either a valid 'result'\n// field or an 'error' field\n//\n// Functions for external use:\n// registerRoute (route, handler) -- register a function to handle events\n// of the given type\n// request (route, payload) -- create a JSON message in the above format and\n// send it\n//\n// Based on messagesocket_service.js by Jonathan Chappelow @ dcrdata, which is\n// based on ws_events_dispatcher.js by Ismael Celis\nconst typeRequest = 1\n\nfunction forward (route: string, payload: any, handlers: Record<string, ((payload: any) => void)[]>) {\n if (!route && payload.error) {\n const err = payload.error\n console.error(`websocket error (code ${err.code}): ${err.message}`)\n return\n }\n if (typeof handlers[route] === 'undefined') {\n // console.log(`unhandled message for ${route}: ${payload}`)\n return\n }\n // call each handler\n for (let i = 0; i < handlers[route].length; i++) {\n handlers[route][i](payload)\n }\n}\n\nlet id = 0\n\ntype NoteReceiver = (payload: any) => void\n\nclass MessageSocket {\n uri: string\n connection: WebSocket | null\n handlers: Record<string, NoteReceiver[]>\n queue: [string, any][]\n maxQlength: number\n reloader: () => void // appears unused\n\n constructor () {\n this.handlers = {}\n this.queue = []\n this.maxQlength = 5\n }\n\n registerRoute (route: string, handler: NoteReceiver) {\n this.handlers[route] = this.handlers[route] || []\n this.handlers[route].push(handler)\n }\n\n deregisterRoute (route: string) {\n this.handlers[route] = []\n }\n\n // request sends a request-type message to the server\n request (route: string, payload: any) {\n if (!this.connection || this.connection.readyState !== window.WebSocket.OPEN) {\n while (this.queue.length > this.maxQlength - 1) this.queue.shift()\n this.queue.push([route, payload])\n return\n }\n id++\n const message = JSON.stringify({\n route: route,\n type: typeRequest,\n id: id,\n payload: payload\n })\n\n window.log('ws', 'sending', message)\n this.connection.send(message)\n }\n\n close (reason: string) {\n window.log('ws', 'close, reason:', reason, this.handlers)\n this.handlers = {}\n if (this.connection) this.connection.close()\n }\n\n connect (uri: string, reloader: () => void) {\n this.uri = uri\n this.reloader = reloader\n let retrys = 0\n const go = () => {\n window.log('ws', `connecting to ${uri}`)\n let conn: WebSocket | null = this.connection = new window.WebSocket(uri)\n if (!conn) return\n const timeout = setTimeout(() => {\n // readyState is still WebSocket.CONNECTING. Cancel and trigger onclose.\n if (conn) conn.close()\n }, 500)\n\n // unmarshal message, and forward the message to registered handlers\n conn.onmessage = (evt: MessageEvent) => {\n const message = JSON.parse(evt.data)\n forward(message.route, message.payload, this.handlers)\n }\n\n // Stub out standard functions\n conn.onclose = (evt: CloseEvent) => {\n window.log('ws', 'onclose')\n clearTimeout(timeout)\n conn = this.connection = null\n forward('close', null, this.handlers)\n retrys++\n // 1.2, 1.6, 2.0, 2.4, 3.1, 3.8, 4.8, 6.0, 7.5, 9.3, ...\n const delay = Math.min(Math.pow(1.25, retrys), 10)\n console.error(`websocket disconnected (${evt.code}), trying again in ${delay.toFixed(1)} seconds`)\n setTimeout(() => {\n go()\n }, delay * 1000)\n }\n\n conn.onopen = () => {\n window.log('ws', 'onopen')\n clearTimeout(timeout)\n if (retrys > 0) {\n retrys = 0\n reloader()\n }\n forward('open', null, this.handlers)\n const queue = this.queue\n this.queue = []\n for (const [route, message] of queue) {\n this.request(route, message)\n }\n }\n\n conn.onerror = (evt: Event) => {\n window.log('ws', 'onerror:', evt)\n forward('error', evt, this.handlers)\n }\n }\n go()\n }\n}\n\nconst ws = new MessageSocket()\nexport default ws\n","import Doc, { WalletIcons, parseFloatDefault } from './doc'\nimport State from './state'\nimport BasePage from './basepage'\nimport OrderBook from './orderbook'\nimport { ReputationMeter, tradingLimits, strongTier } from './account'\nimport {\n CandleChart,\n DepthChart,\n DepthLine,\n CandleReporters,\n MouseReport,\n VolumeReport,\n DepthMarker,\n Wave\n} from './charts'\nimport { postJSON } from './http'\nimport {\n NewWalletForm,\n AccelerateOrderForm,\n DepositAddress,\n TokenApprovalForm,\n bind as bindForm,\n Forms\n} from './forms'\nimport * as OrderUtil from './orderutil'\nimport ws from './ws'\nimport * as intl from './locales'\nimport {\n app,\n SupportedAsset,\n PageElement,\n Order,\n Market,\n OrderEstimate,\n MaxOrderEstimate,\n Exchange,\n UnitInfo,\n Asset,\n Candle,\n CandlesPayload,\n TradeForm,\n BookUpdate,\n MaxSell,\n MaxBuy,\n SwapEstimate,\n MarketOrderBook,\n APIResponse,\n PreSwap,\n PreRedeem,\n WalletStateNote,\n WalletSyncNote,\n WalletCreationNote,\n SpotPriceNote,\n BondNote,\n OrderNote,\n EpochNote,\n BalanceNote,\n MiniOrder,\n RemainderUpdate,\n ConnEventNote,\n OrderOption,\n ConnectionStatus,\n RecentMatch,\n MatchNote,\n ApprovalStatus,\n OrderFilter,\n RunStatsNote,\n RunEventNote,\n EpochReportNote,\n CEXProblemsNote\n} from './registry'\nimport { setOptionTemplates } from './opts'\nimport { RunningMarketMakerDisplay, RunningMMDisplayElements } from './mmutil'\n\nconst bind = Doc.bind\n\nconst bookRoute = 'book'\nconst bookOrderRoute = 'book_order'\nconst unbookOrderRoute = 'unbook_order'\nconst updateRemainingRoute = 'update_remaining'\nconst epochOrderRoute = 'epoch_order'\nconst candlesRoute = 'candles'\nconst candleUpdateRoute = 'candle_update'\nconst unmarketRoute = 'unmarket'\nconst epochMatchSummaryRoute = 'epoch_match_summary'\n\nconst anHour = 60 * 60 * 1000 // milliseconds\nconst maxUserOrdersShown = 10\n\nconst buyBtnClass = 'buygreen-bg'\nconst sellBtnClass = 'sellred-bg'\n\nconst fiveMinBinKey = '5m'\nconst oneHrBinKey = '1h'\n\nconst percentFormatter = new Intl.NumberFormat(Doc.languages(), {\n minimumFractionDigits: 1,\n maximumFractionDigits: 2\n})\n\nconst parentIDNone = 0xFFFFFFFF\n\ninterface MetaOrder {\n div: HTMLElement\n header: Record<string, PageElement>\n details: Record<string, PageElement>\n ord: Order\n cancelling?: boolean\n}\n\ninterface CancelData {\n bttn: PageElement\n order: Order\n}\n\ninterface CurrentMarket {\n dex: Exchange\n sid: string // A string market identifier used by the DEX.\n cfg: Market\n base: SupportedAsset\n quote: SupportedAsset\n baseUnitInfo: UnitInfo\n quoteUnitInfo: UnitInfo\n maxSellRequested: boolean\n maxSell: MaxOrderEstimate | null\n sellBalance: number\n buyBalance: number\n maxBuys: Record<number, MaxOrderEstimate>\n candleCaches: Record<string, CandlesPayload>\n baseCfg: Asset\n quoteCfg: Asset\n rateConversionFactor: number\n bookLoaded: boolean\n}\n\ninterface LoadTracker {\n loaded: () => void\n timer: number\n}\n\ninterface OrderRow extends HTMLElement {\n manager: OrderTableRowManager\n}\n\ninterface StatsDisplay {\n row: PageElement\n tmpl: Record<string, PageElement>\n}\n\ninterface MarketsPageParams {\n host: string\n baseID: string\n quoteID: string\n}\n\nexport default class MarketsPage extends BasePage {\n page: Record<string, PageElement>\n main: HTMLElement\n maxLoaded: (() => void) | null\n maxOrderUpdateCounter: number\n market: CurrentMarket\n openAsset: SupportedAsset\n currentCreate: SupportedAsset\n maxEstimateTimer: number | null\n book: OrderBook\n cancelData: CancelData\n metaOrders: Record<string, MetaOrder>\n preorderCache: Record<string, OrderEstimate>\n currentOrder: TradeForm\n depthLines: Record<string, DepthLine[]>\n activeMarkerRate: number | null\n hovers: HTMLElement[]\n ogTitle: string\n depthChart: DepthChart\n candleChart: CandleChart\n candleDur: string\n balanceWgt: BalanceWidget\n mm: RunningMarketMakerDisplay\n marketList: MarketList\n newWalletForm: NewWalletForm\n depositAddrForm: DepositAddress\n approveTokenForm: TokenApprovalForm\n reputationMeter: ReputationMeter\n keyup: (e: KeyboardEvent) => void\n secondTicker: number\n candlesLoading: LoadTracker | null\n accelerateOrderForm: AccelerateOrderForm\n recentMatches: RecentMatch[]\n recentMatchesSortKey: string\n recentMatchesSortDirection: 1 | -1\n stats: [StatsDisplay, StatsDisplay]\n loadingAnimations: { candles?: Wave, depth?: Wave }\n mmRunning: boolean | undefined\n forms: Forms\n constructor (main: HTMLElement, pageParams: MarketsPageParams) {\n super()\n\n const page = this.page = Doc.idDescendants(main)\n this.main = main\n if (!this.main.parentElement) return // Not gonna happen, but TypeScript cares.\n // There may be multiple pending updates to the max order. This makes sure\n // that the screen is updated with the most recent one.\n this.maxOrderUpdateCounter = 0\n this.metaOrders = {}\n this.recentMatches = []\n this.preorderCache = {}\n this.depthLines = {\n hover: [],\n input: []\n }\n this.hovers = []\n // 'Recent Matches' list sort key and direction.\n this.recentMatchesSortKey = 'age'\n this.recentMatchesSortDirection = -1\n // store original title so we can re-append it when updating market value.\n this.ogTitle = document.title\n this.forms = new Forms(page.forms, {\n closed: (closedForm: PageElement | undefined) => {\n if (closedForm === page.vDetailPane) {\n this.showVerifyForm()\n }\n }\n })\n\n const depthReporters = {\n click: (x: number) => { this.reportDepthClick(x) },\n volume: (r: VolumeReport) => { this.reportDepthVolume(r) },\n mouse: (r: MouseReport) => { this.reportDepthMouse(r) },\n zoom: (z: number) => { this.reportDepthZoom(z) }\n }\n this.depthChart = new DepthChart(page.depthChart, depthReporters, State.fetchLocal(State.depthZoomLK))\n\n const candleReporters: CandleReporters = {\n mouse: c => { this.reportMouseCandle(c) }\n }\n this.candleChart = new CandleChart(page.candlesChart, candleReporters)\n\n const success = () => { /* do nothing */ }\n // Do not call cleanTemplates before creating the AccelerateOrderForm\n this.accelerateOrderForm = new AccelerateOrderForm(page.accelerateForm, success)\n\n this.approveTokenForm = new TokenApprovalForm(page.approveTokenForm)\n\n // Set user's last known candle duration.\n this.candleDur = State.fetchLocal(State.lastCandleDurationLK) || oneHrBinKey\n\n // Setup the register to trade button.\n // TODO: Use dexsettings page?\n const registerBttn = Doc.tmplElement(page.notRegistered, 'registerBttn')\n bind(registerBttn, 'click', () => {\n app().loadPage('register', { host: this.market.dex.host })\n })\n\n // Set up the BalanceWidget.\n {\n page.walletInfoTmpl.removeAttribute('id')\n const bWidget = page.walletInfoTmpl\n const qWidget = page.walletInfoTmpl.cloneNode(true) as PageElement\n bWidget.after(qWidget)\n const wgt = this.balanceWgt = new BalanceWidget(bWidget, qWidget)\n const baseIcons = wgt.base.stateIcons.icons\n const quoteIcons = wgt.quote.stateIcons.icons\n bind(wgt.base.tmpl.connect, 'click', () => { this.unlockWallet(this.market.base.id) })\n bind(wgt.quote.tmpl.connect, 'click', () => { this.unlockWallet(this.market.quote.id) })\n bind(wgt.base.tmpl.expired, 'click', () => { this.unlockWallet(this.market.base.id) })\n bind(wgt.quote.tmpl.expired, 'click', () => { this.unlockWallet(this.market.quote.id) })\n bind(baseIcons.sleeping, 'click', () => { this.unlockWallet(this.market.base.id) })\n bind(quoteIcons.sleeping, 'click', () => { this.unlockWallet(this.market.quote.id) })\n bind(baseIcons.locked, 'click', () => { this.unlockWallet(this.market.base.id) })\n bind(quoteIcons.locked, 'click', () => { this.unlockWallet(this.market.quote.id) })\n bind(baseIcons.disabled, 'click', () => { this.showToggleWalletStatus(this.market.base) })\n bind(quoteIcons.disabled, 'click', () => { this.showToggleWalletStatus(this.market.quote) })\n bind(wgt.base.tmpl.newWalletBttn, 'click', () => { this.showCreate(this.market.base) })\n bind(wgt.quote.tmpl.newWalletBttn, 'click', () => { this.showCreate(this.market.quote) })\n bind(wgt.base.tmpl.walletAddr, 'click', () => { this.showDeposit(this.market.base.id) })\n bind(wgt.quote.tmpl.walletAddr, 'click', () => { this.showDeposit(this.market.quote.id) })\n bind(wgt.base.tmpl.wantProviders, 'click', () => { this.showCustomProviderDialog(this.market.base.id) })\n bind(wgt.quote.tmpl.wantProviders, 'click', () => { this.showCustomProviderDialog(this.market.quote.id) })\n this.depositAddrForm = new DepositAddress(page.deposit)\n }\n\n const runningMMDisplayElements: RunningMMDisplayElements = {\n orderReportForm: page.orderReportForm,\n dexBalancesRowTmpl: page.dexBalancesRowTmpl,\n placementRowTmpl: page.placementRowTmpl,\n placementAmtRowTmpl: page.placementAmtRowTmpl\n }\n Doc.cleanTemplates(page.dexBalancesRowTmpl, page.placementRowTmpl, page.placementAmtRowTmpl)\n this.mm = new RunningMarketMakerDisplay(page.mmRunning, this.forms, runningMMDisplayElements, 'markets')\n\n this.reputationMeter = new ReputationMeter(page.reputationMeter)\n\n // Bind toggle wallet status form.\n bindForm(page.toggleWalletStatusConfirm, page.toggleWalletStatusSubmit, async () => { this.toggleWalletStatus() })\n\n // Prepare templates for the buy and sell tables and the user's order table.\n setOptionTemplates(page)\n\n Doc.cleanTemplates(\n page.orderRowTmpl, page.durBttnTemplate, page.booleanOptTmpl, page.rangeOptTmpl,\n page.orderOptTmpl, page.userOrderTmpl, page.recentMatchesTemplate\n )\n\n // Buttons to show token approval form\n bind(page.approveBaseBttn, 'click', () => { this.showTokenApprovalForm(true) })\n bind(page.approveQuoteBttn, 'click', () => { this.showTokenApprovalForm(false) })\n\n const toggleTradingTier = (show: boolean) => {\n Doc.setVis(!show, page.showTradingTier)\n Doc.setVis(show, page.tradingLimits, page.hideTradingTier)\n }\n bind(page.showTradingTier, 'click', () => { toggleTradingTier(true) })\n bind(page.hideTradingTier, 'click', () => { toggleTradingTier(false) })\n\n const toggleTradingReputation = (show: boolean) => {\n Doc.setVis(!show, page.showTradingReputation)\n Doc.setVis(show, page.reputationMeter, page.hideTradingReputation)\n }\n bind(page.showTradingReputation, 'click', () => { toggleTradingReputation(true) })\n bind(page.hideTradingReputation, 'click', () => { toggleTradingReputation(false) })\n\n // Buttons to set order type and side.\n bind(page.buyBttn, 'click', () => { this.setBuy() })\n bind(page.sellBttn, 'click', () => { this.setSell() })\n\n bind(page.limitBttn, 'click', () => {\n swapBttns(page.marketBttn, page.limitBttn)\n this.setOrderVisibility()\n if (!page.rateField.value) return\n this.depthLines.input = [{\n rate: parseFloatDefault(page.rateField.value, 0),\n color: this.isSell() ? this.depthChart.theme.sellLine : this.depthChart.theme.buyLine\n }]\n this.drawChartLines()\n })\n bind(page.marketBttn, 'click', () => {\n swapBttns(page.limitBttn, page.marketBttn)\n this.setOrderVisibility()\n this.setMarketBuyOrderEstimate()\n this.depthLines.input = []\n this.drawChartLines()\n })\n bind(page.maxOrd, 'click', () => {\n if (this.isSell()) {\n const maxSell = this.market.maxSell\n if (!maxSell) return\n page.lotField.value = String(maxSell.swap.lots)\n } else {\n const maxBuy = this.market.maxBuys[this.adjustedRate()]\n if (!maxBuy) return\n page.lotField.value = String(maxBuy.swap.lots)\n }\n this.lotChanged()\n })\n\n Doc.disableMouseWheel(page.rateField, page.lotField, page.qtyField, page.mktBuyField)\n\n // Handle the full orderbook sent on the 'book' route.\n ws.registerRoute(bookRoute, (data: BookUpdate) => { this.handleBookRoute(data) })\n // Handle the new order for the order book on the 'book_order' route.\n ws.registerRoute(bookOrderRoute, (data: BookUpdate) => { this.handleBookOrderRoute(data) })\n // Remove the order sent on the 'unbook_order' route from the orderbook.\n ws.registerRoute(unbookOrderRoute, (data: BookUpdate) => { this.handleUnbookOrderRoute(data) })\n // Update the remaining quantity on a booked order.\n ws.registerRoute(updateRemainingRoute, (data: BookUpdate) => { this.handleUpdateRemainingRoute(data) })\n // Handle the new order for the order book on the 'epoch_order' route.\n ws.registerRoute(epochOrderRoute, (data: BookUpdate) => { this.handleEpochOrderRoute(data) })\n // Handle the initial candlestick data on the 'candles' route.\n ws.registerRoute(candlesRoute, (data: BookUpdate) => { this.handleCandlesRoute(data) })\n // Handle the candles update on the 'candles' route.\n ws.registerRoute(candleUpdateRoute, (data: BookUpdate) => { this.handleCandleUpdateRoute(data) })\n\n // Handle the recent matches update on the 'epoch_report' route.\n ws.registerRoute(epochMatchSummaryRoute, (data: BookUpdate) => { this.handleEpochMatchSummary(data) })\n // Create a wallet\n this.newWalletForm = new NewWalletForm(page.newWalletForm, async () => { this.createWallet() })\n // Main order form.\n bindForm(page.orderForm, page.submitBttn, async () => { this.stepSubmit() })\n // Order verification form.\n bindForm(page.verifyForm, page.vSubmit, async () => { this.submitOrder() })\n // Cancel order form.\n bindForm(page.cancelForm, page.cancelSubmit, async () => { this.submitCancel() })\n // Order detail view.\n Doc.bind(page.vFeeDetails, 'click', () => this.forms.show(page.vDetailPane))\n Doc.bind(page.closeDetailPane, 'click', () => this.showVerifyForm())\n // // Bind active orders list's header sort events.\n page.recentMatchesTable.querySelectorAll('[data-ordercol]')\n .forEach((th: HTMLElement) => bind(\n th, 'click', () => setRecentMatchesSortCol(th.dataset.ordercol || '')\n ))\n\n const setRecentMatchesSortCol = (key: string) => {\n // First unset header's current sorted col classes.\n unsetRecentMatchesSortColClasses()\n if (this.recentMatchesSortKey === key) {\n this.recentMatchesSortDirection *= -1\n } else {\n this.recentMatchesSortKey = key\n this.recentMatchesSortDirection = 1\n }\n this.refreshRecentMatchesTable()\n setRecentMatchesSortColClasses()\n }\n\n // sortClassByDirection receives a sort direction and return a class based on it.\n const sortClassByDirection = (element: 1 | -1) => {\n if (element === 1) return 'sorted-asc'\n return 'sorted-dsc'\n }\n\n const unsetRecentMatchesSortColClasses = () => {\n page.recentMatchesTable.querySelectorAll('[data-ordercol]')\n .forEach(th => th.classList.remove('sorted-asc', 'sorted-dsc'))\n }\n\n const setRecentMatchesSortColClasses = () => {\n const key = this.recentMatchesSortKey\n const sortCls = sortClassByDirection(this.recentMatchesSortDirection)\n Doc.safeSelector(page.recentMatchesTable, `[data-ordercol=${key}]`).classList.add(sortCls)\n }\n\n // Set default's sorted col header classes.\n setRecentMatchesSortColClasses()\n\n const closePopups = () => {\n this.forms.close()\n }\n\n this.keyup = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closePopups()\n }\n }\n bind(document, 'keyup', this.keyup)\n\n page.forms.querySelectorAll('.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => { closePopups() })\n })\n\n // Event listeners for interactions with the various input fields.\n bind(page.lotField, ['change', 'keyup'], () => { this.lotChanged() })\n bind(page.qtyField, 'change', () => { this.quantityChanged(true) })\n bind(page.qtyField, 'keyup', () => { this.quantityChanged(false) })\n bind(page.mktBuyField, ['change', 'keyup'], () => { this.marketBuyChanged() })\n bind(page.rateField, 'change', () => { this.rateFieldChanged() })\n bind(page.rateField, 'keyup', () => { this.previewQuoteAmt(true) })\n\n // Market search input bindings.\n bind(page.marketSearchV1, ['change', 'keyup'], () => { this.filterMarkets() })\n\n // Acknowledge the order disclaimer.\n const setDisclaimerAckViz = (acked: boolean) => {\n Doc.setVis(!acked, page.disclaimer, page.disclaimerAck)\n Doc.setVis(acked, page.showDisclaimer)\n }\n bind(page.disclaimerAck, 'click', () => {\n State.storeLocal(State.orderDisclaimerAckedLK, true)\n setDisclaimerAckViz(true)\n })\n bind(page.showDisclaimer, 'click', () => {\n State.storeLocal(State.orderDisclaimerAckedLK, false)\n setDisclaimerAckViz(false)\n })\n setDisclaimerAckViz(State.fetchLocal(State.orderDisclaimerAckedLK))\n\n const clearChartLines = () => {\n this.depthLines.hover = []\n this.drawChartLines()\n }\n bind(page.buyRows, 'mouseleave', clearChartLines)\n bind(page.sellRows, 'mouseleave', clearChartLines)\n bind(page.userOrders, 'mouseleave', () => {\n this.activeMarkerRate = null\n this.setDepthMarkers()\n })\n\n const stats0 = page.marketStats\n const stats1 = stats0.cloneNode(true) as PageElement\n stats1.classList.add('listopen')\n Doc.hide(stats0, stats1)\n stats1.removeAttribute('id')\n app().headerSpace.appendChild(stats1)\n this.stats = [{ row: stats0, tmpl: Doc.parseTemplate(stats0) }, { row: stats1, tmpl: Doc.parseTemplate(stats1) }]\n\n const closeMarketsList = () => {\n State.storeLocal(State.leftMarketDockLK, '0')\n page.leftMarketDock.classList.remove('default')\n page.leftMarketDock.classList.add('stashed')\n for (const s of this.stats) s.row.classList.remove('listopen')\n }\n const openMarketsList = () => {\n State.storeLocal(State.leftMarketDockLK, '1')\n page.leftMarketDock.classList.remove('default', 'stashed')\n for (const s of this.stats) s.row.classList.add('listopen')\n }\n Doc.bind(page.leftHider, 'click', () => closeMarketsList())\n Doc.bind(page.marketReopener, 'click', () => openMarketsList())\n for (const s of this.stats) {\n Doc.bind(s.tmpl.marketSelect, 'click', () => {\n if (page.leftMarketDock.clientWidth === 0) openMarketsList()\n else closeMarketsList()\n })\n }\n this.marketList = new MarketList(page.marketListV1)\n // Prepare the list of markets.\n for (const row of this.marketList.markets) {\n bind(row.node, 'click', () => {\n // return early if the market is already set\n const { quoteid: quoteID, baseid: baseID, xc: { host } } = row.mkt\n if (this.market?.base?.id === baseID && this.market?.quote?.id === quoteID) return\n this.startLoadingAnimations()\n this.setMarket(host, baseID, quoteID)\n })\n }\n if (State.fetchLocal(State.leftMarketDockLK) !== '1') { // It is shown by default, hiding if necessary.\n closeMarketsList()\n }\n\n // Notification filters.\n app().registerNoteFeeder({\n order: (note: OrderNote) => { this.handleOrderNote(note) },\n match: (note: MatchNote) => { this.handleMatchNote(note) },\n epoch: (note: EpochNote) => { this.handleEpochNote(note) },\n conn: (note: ConnEventNote) => { this.handleConnNote(note) },\n balance: (note: BalanceNote) => { this.handleBalanceNote(note) },\n bondpost: (note: BondNote) => { this.handleBondUpdate(note) },\n spots: (note: SpotPriceNote) => { this.handlePriceUpdate(note) },\n walletstate: (note: WalletStateNote) => { this.handleWalletState(note) },\n reputation: () => { this.updateReputation() },\n feepayment: () => { this.updateReputation() },\n runstats: (note: RunStatsNote) => {\n if (note.baseID !== this.market.base.id || note.quoteID !== this.market.quote.id || note.host !== this.market.dex.host) return\n this.mm.update()\n if (Boolean(this.mmRunning) !== Boolean(note.stats)) {\n this.mmRunning = Boolean(note.stats)\n this.resolveOrderFormVisibility()\n }\n },\n epochreport: (note: EpochReportNote) => {\n if (note.baseID !== this.market.base.id || note.quoteID !== this.market.quote.id || note.host !== this.market.dex.host) return\n this.mm.handleEpochReportNote(note)\n },\n cexproblems: (note: CEXProblemsNote) => {\n if (note.baseID !== this.market.base.id || note.quoteID !== this.market.quote.id || note.host !== this.market.dex.host) return\n this.mm.handleCexProblemsNote(note)\n },\n runevent: (note: RunEventNote) => {\n if (note.baseID !== this.market.base.id || note.quoteID !== this.market.quote.id || note.host !== this.market.dex.host) return\n this.mm.update()\n }\n })\n\n this.loadingAnimations = {}\n this.startLoadingAnimations()\n\n // Start a ticker to update time-since values.\n this.secondTicker = window.setInterval(() => {\n for (const mord of Object.values(this.metaOrders)) {\n mord.details.age.textContent = Doc.timeSince(mord.ord.submitTime)\n }\n for (const td of Doc.applySelector(page.recentMatchesLiveList, '[data-tmpl=age]')) {\n td.textContent = Doc.timeSince(parseFloat(td.dataset.sinceStamp ?? '0'))\n }\n }, 1000)\n\n this.init(pageParams)\n }\n\n async init (pageParams?: MarketsPageParams) {\n // Fetch the first market in the list, or the users last selected market, if\n // it exists.\n let selected\n if (pageParams?.host) {\n selected = makeMarket(pageParams.host, parseInt(pageParams.baseID), parseInt(pageParams.quoteID))\n } else {\n selected = State.fetchLocal(State.lastMarketLK)\n }\n if (!selected || !this.marketList.exists(selected.host, selected.base, selected.quote)) {\n const first = this.marketList.first()\n if (first) selected = { host: first.mkt.xc.host, base: first.mkt.baseid, quote: first.mkt.quoteid }\n }\n if (selected) this.setMarket(selected.host, selected.base, selected.quote)\n else this.balanceWgt.setBalanceVisibility(false) // no market to display balance widget for.\n\n // set the initial state for the registration status\n this.setRegistrationStatusVisibility()\n }\n\n startLoadingAnimations () {\n const { page, loadingAnimations: anis, depthChart, candleChart } = this\n depthChart.canvas.classList.add('invisible')\n candleChart.canvas.classList.add('invisible')\n if (anis.candles) anis.candles.stop()\n anis.candles = new Wave(page.candlesChart, { message: intl.prep(intl.ID_CANDLES_LOADING) })\n if (anis.depth) anis.depth.stop()\n anis.depth = new Wave(page.depthChart, { message: intl.prep(intl.ID_DEPTH_LOADING) })\n }\n\n /* isSell is true if the user has selected sell in the order options. */\n isSell () {\n return this.page.sellBttn.classList.contains('selected')\n }\n\n /* isLimit is true if the user has selected the \"limit order\" tab. */\n isLimit () {\n return this.page.limitBttn.classList.contains('selected')\n }\n\n setBuy () {\n const { page } = this\n swapBttns(page.sellBttn, page.buyBttn)\n page.submitBttn.classList.remove(sellBtnClass)\n page.submitBttn.classList.add(buyBtnClass)\n page.maxLbl.textContent = intl.prep(intl.ID_BUY)\n this.setOrderBttnText()\n this.setOrderVisibility()\n this.drawChartLines()\n if (!this.isLimit()) {\n this.marketBuyChanged()\n } else {\n this.currentOrder = this.parseOrder()\n this.updateOrderBttnState()\n }\n }\n\n setSell () {\n const { page } = this\n swapBttns(page.buyBttn, page.sellBttn)\n page.submitBttn.classList.add(sellBtnClass)\n page.submitBttn.classList.remove(buyBtnClass)\n page.maxLbl.textContent = intl.prep(intl.ID_SELL)\n this.setOrderBttnText()\n this.setOrderVisibility()\n this.drawChartLines()\n this.currentOrder = this.parseOrder()\n this.updateOrderBttnState()\n }\n\n /* hasPendingBonds is true if there are pending bonds */\n hasPendingBonds (): boolean {\n return Object.keys(this.market.dex.auth.pendingBonds || []).length > 0\n }\n\n /* setCurrMarketPrice updates the current market price on the stats displays\n and the orderbook display. */\n setCurrMarketPrice (): void {\n const selected = this.market\n if (!selected) return\n // Get an up-to-date Market.\n const xc = app().exchanges[selected.dex.host]\n const mkt = xc.markets[selected.cfg.name]\n if (!mkt.spot) return\n\n for (const s of this.stats) {\n const { unitInfo: { conventional: { conversionFactor: cFactor, unit } } } = xc.assets[mkt.baseid]\n const fiatRate = app().fiatRatesMap[mkt.baseid]\n if (fiatRate) {\n s.tmpl.volume.textContent = Doc.formatFourSigFigs(mkt.spot.vol24 / cFactor * fiatRate)\n s.tmpl.volUnit.textContent = 'USD'\n } else {\n s.tmpl.volume.textContent = Doc.formatFourSigFigs(mkt.spot.vol24 / cFactor)\n s.tmpl.volUnit.textContent = unit\n }\n setPriceAndChange(s.tmpl, xc, mkt)\n }\n\n this.page.obPrice.textContent = Doc.formatFourSigFigs(mkt.spot.rate / this.market.rateConversionFactor)\n this.page.obPrice.classList.remove('sellcolor', 'buycolor')\n this.page.obPrice.classList.add(mkt.spot.change24 >= 0 ? 'buycolor' : 'sellcolor')\n Doc.setVis(mkt.spot.change24 >= 0, this.page.obUp)\n Doc.setVis(mkt.spot.change24 < 0, this.page.obDown)\n }\n\n /* setMarketDetails updates the currency names on the stats displays. */\n setMarketDetails () {\n if (!this.market) return\n for (const s of this.stats) {\n const { baseCfg: ba, quoteCfg: qa } = this.market\n s.tmpl.baseIcon.src = Doc.logoPath(ba.symbol)\n s.tmpl.quoteIcon.src = Doc.logoPath(qa.symbol)\n Doc.empty(s.tmpl.baseSymbol, s.tmpl.quoteSymbol)\n s.tmpl.baseSymbol.appendChild(Doc.symbolize(ba, true))\n s.tmpl.quoteSymbol.appendChild(Doc.symbolize(qa, true))\n }\n }\n\n /* setHighLow calculates the high and low rates over the last 24 hours. */\n setHighLow () {\n let [high, low] = [0, 0]\n const spot = this.market.cfg.spot\n // Use spot values for 24 hours high and low rates if it is available. We\n // will default to setting it from candles if it's not.\n if (spot && spot.low24 && spot.high24) {\n high = spot.high24\n low = spot.low24\n } else {\n const cache = this.market?.candleCaches[fiveMinBinKey]\n if (!cache) {\n if (this.candleDur !== fiveMinBinKey) {\n this.requestCandles(fiveMinBinKey)\n return\n }\n for (const s of this.stats) {\n s.tmpl.high.textContent = '-'\n s.tmpl.low.textContent = '-'\n }\n return\n }\n\n // Set high and low rates from candles.\n const aDayAgo = new Date().getTime() - 86400000\n for (let i = cache.candles.length - 1; i >= 0; i--) {\n const c = cache.candles[i]\n if (c.endStamp < aDayAgo) break\n if (low === 0 || (c.lowRate > 0 && c.lowRate < low)) low = c.lowRate\n if (c.highRate > high) high = c.highRate\n }\n }\n\n const baseID = this.market.base.id\n const quoteID = this.market.quote.id\n const dex = this.market.dex\n for (const s of this.stats) {\n s.tmpl.high.textContent = high > 0 ? Doc.formatFourSigFigs(app().conventionalRate(baseID, quoteID, high, dex)) : '-'\n s.tmpl.low.textContent = low > 0 ? Doc.formatFourSigFigs(app().conventionalRate(baseID, quoteID, low, dex)) : '-'\n }\n }\n\n /* assetsAreSupported is true if all the assets of the current market are\n * supported\n */\n assetsAreSupported (): {\n isSupported: boolean;\n text: string;\n } {\n const { market: { base, quote, baseCfg, quoteCfg } } = this\n if (!base || !quote) {\n const symbol = base ? quoteCfg.symbol : baseCfg.symbol\n return {\n isSupported: false,\n text: intl.prep(intl.ID_NOT_SUPPORTED, { asset: symbol.toUpperCase() })\n }\n }\n // check if versions are supported. If asset is a token, we check if its\n // parent supports the version.\n const bVers = (base.token ? app().assets[base.token.parentID].info?.versions : base.info?.versions) as number[]\n const qVers = (quote.token ? app().assets[quote.token.parentID].info?.versions : quote.info?.versions) as number[]\n // if none them are token, just check if own asset is supported.\n let text = ''\n if (!bVers.includes(baseCfg.version)) {\n text = intl.prep(intl.ID_VERSION_NOT_SUPPORTED, { asset: base.symbol.toUpperCase(), version: baseCfg.version + '' })\n } else if (!qVers.includes(quoteCfg.version)) {\n text = intl.prep(intl.ID_VERSION_NOT_SUPPORTED, { asset: quote.symbol.toUpperCase(), version: quoteCfg.version + '' })\n }\n return {\n isSupported: bVers.includes(baseCfg.version) && qVers.includes(quoteCfg.version),\n text\n }\n }\n\n /*\n * setOrderVisibility sets which form is visible based on the specified\n * options.\n */\n setOrderVisibility () {\n const page = this.page\n if (this.isLimit()) {\n Doc.show(page.priceBox, page.tifBox, page.qtyBox, page.maxBox)\n Doc.hide(page.mktBuyBox)\n this.previewQuoteAmt(true)\n } else {\n Doc.hide(page.tifBox, page.maxBox, page.priceBox)\n if (this.isSell()) {\n Doc.hide(page.mktBuyBox)\n Doc.show(page.qtyBox)\n this.previewQuoteAmt(true)\n } else {\n Doc.show(page.mktBuyBox)\n Doc.hide(page.qtyBox)\n this.previewQuoteAmt(false)\n }\n }\n this.updateOrderBttnState()\n }\n\n /* resolveOrderFormVisibility displays or hides the 'orderForm' based on\n * a set of conditions to be met.\n */\n async resolveOrderFormVisibility () {\n const page = this.page\n\n const showOrderForm = async () : Promise<boolean> => {\n if (!this.assetsAreSupported().isSupported) return false // assets not supported\n\n if (!this.market || this.market.dex.auth.effectiveTier < 1) return false// acct suspended or not registered\n\n const { baseAssetApprovalStatus, quoteAssetApprovalStatus } = this.tokenAssetApprovalStatuses()\n if (baseAssetApprovalStatus !== ApprovalStatus.Approved || quoteAssetApprovalStatus !== ApprovalStatus.Approved) return false\n\n const { base, quote } = this.market\n const hasWallets = base && app().assets[base.id].wallet && quote && app().assets[quote.id].wallet\n if (!hasWallets) return false\n if (this.mmRunning) return false\n return true\n }\n\n Doc.setVis(await showOrderForm(), page.orderForm, page.orderTypeBttns)\n\n if (this.market) {\n const { auth: { effectiveTier, pendingStrength } } = this.market.dex\n Doc.setVis(effectiveTier > 0 || pendingStrength > 0, page.reputationAndTradingTierBox)\n }\n\n const mmStatus = app().mmStatus\n if (mmStatus && this.mmRunning === undefined && this.market.base && this.market.quote) {\n const { base: { id: baseID }, quote: { id: quoteID }, dex: { host } } = this.market\n const botStatus = mmStatus.bots.find(({ config: cfg }) => cfg.baseID === baseID && cfg.quoteID === quoteID && cfg.host === host)\n this.mmRunning = Boolean(botStatus?.running)\n }\n\n Doc.setVis(this.mmRunning, page.mmRunning)\n if (this.mmRunning) Doc.hide(page.orderForm, page.orderTypeBttns)\n }\n\n /* setLoaderMsgVisibility displays a message in case a dex asset is not\n * supported\n */\n setLoaderMsgVisibility () {\n const { page } = this\n\n const { isSupported, text } = this.assetsAreSupported()\n if (isSupported) {\n // make sure to hide the loader msg\n Doc.hide(page.loaderMsg)\n return\n }\n page.loaderMsg.textContent = text\n Doc.show(page.loaderMsg)\n Doc.hide(page.notRegistered)\n Doc.hide(page.noWallet)\n }\n\n /*\n * showTokenApprovalForm displays the form used to give allowance to the\n * swap contract of a token.\n */\n async showTokenApprovalForm (isBase: boolean) {\n const assetID = isBase ? this.market.base.id : this.market.quote.id\n this.approveTokenForm.setAsset(assetID, this.market.dex.host)\n this.forms.show(this.page.approveTokenForm)\n }\n\n /*\n * tokenAssetApprovalStatuses returns the approval status of the base and\n * quote assets. If the asset is not a token, it is considered approved.\n */\n tokenAssetApprovalStatuses (): {\n baseAssetApprovalStatus: ApprovalStatus;\n quoteAssetApprovalStatus: ApprovalStatus;\n } {\n const { market: { base, quote } } = this\n let baseAssetApprovalStatus = ApprovalStatus.Approved\n let quoteAssetApprovalStatus = ApprovalStatus.Approved\n\n if (base?.token) {\n const baseAsset = app().assets[base.id]\n const baseVersion = this.market.dex.assets[base.id].version\n if (baseAsset?.wallet?.approved && baseAsset.wallet.approved[baseVersion] !== undefined) {\n baseAssetApprovalStatus = baseAsset.wallet.approved[baseVersion]\n }\n }\n if (quote?.token) {\n const quoteAsset = app().assets[quote.id]\n const quoteVersion = this.market.dex.assets[quote.id].version\n if (quoteAsset?.wallet?.approved && quoteAsset.wallet.approved[quoteVersion] !== undefined) {\n quoteAssetApprovalStatus = quoteAsset.wallet.approved[quoteVersion]\n }\n }\n\n return {\n baseAssetApprovalStatus,\n quoteAssetApprovalStatus\n }\n }\n\n /*\n * setTokenApprovalVisibility sets the visibility of the token approval\n * panel elements.\n */\n setTokenApprovalVisibility () {\n const { page } = this\n\n const { baseAssetApprovalStatus, quoteAssetApprovalStatus } = this.tokenAssetApprovalStatuses()\n\n if (baseAssetApprovalStatus === ApprovalStatus.Approved && quoteAssetApprovalStatus === ApprovalStatus.Approved) {\n Doc.hide(page.tokenApproval)\n page.sellBttn.removeAttribute('disabled')\n page.buyBttn.removeAttribute('disabled')\n return\n }\n\n if (baseAssetApprovalStatus !== ApprovalStatus.Approved && quoteAssetApprovalStatus === ApprovalStatus.Approved) {\n page.sellBttn.setAttribute('disabled', 'disabled')\n page.buyBttn.removeAttribute('disabled')\n this.setBuy()\n Doc.show(page.approvalRequiredSell)\n Doc.hide(page.approvalRequiredBuy, page.approvalRequiredBoth)\n }\n\n if (baseAssetApprovalStatus === ApprovalStatus.Approved && quoteAssetApprovalStatus !== ApprovalStatus.Approved) {\n page.buyBttn.setAttribute('disabled', 'disabled')\n page.sellBttn.removeAttribute('disabled')\n this.setSell()\n Doc.show(page.approvalRequiredBuy)\n Doc.hide(page.approvalRequiredSell, page.approvalRequiredBoth)\n }\n\n // If they are both unapproved tokens, the order form will not be shown.\n if (baseAssetApprovalStatus !== ApprovalStatus.Approved && quoteAssetApprovalStatus !== ApprovalStatus.Approved) {\n Doc.show(page.approvalRequiredBoth)\n Doc.hide(page.approvalRequiredSell, page.approvalRequiredBuy)\n }\n\n Doc.show(page.tokenApproval)\n page.approvalPendingBaseSymbol.textContent = page.baseTokenAsset.textContent = this.market.base.symbol.toUpperCase()\n page.approvalPendingQuoteSymbol.textContent = page.quoteTokenAsset.textContent = this.market.quote.symbol.toUpperCase()\n Doc.setVis(baseAssetApprovalStatus === ApprovalStatus.NotApproved, page.approveBaseBttn)\n Doc.setVis(quoteAssetApprovalStatus === ApprovalStatus.NotApproved, page.approveQuoteBttn)\n Doc.setVis(baseAssetApprovalStatus === ApprovalStatus.Pending, page.approvalPendingBase)\n Doc.setVis(quoteAssetApprovalStatus === ApprovalStatus.Pending, page.approvalPendingQuote)\n }\n\n /* setRegistrationStatusView sets the text content and class for the\n * registration status view\n */\n setRegistrationStatusView (titleContent: string, confStatusMsg: string, titleClass: string) {\n const page = this.page\n page.regStatusTitle.textContent = titleContent\n page.regStatusConfsDisplay.textContent = confStatusMsg\n page.registrationStatus.classList.remove('completed', 'error', 'waiting')\n page.registrationStatus.classList.add(titleClass)\n }\n\n /*\n * updateRegistrationStatusView updates the view based on the current\n * registration status\n */\n updateRegistrationStatusView () {\n const { page, market: { dex } } = this\n page.regStatusDex.textContent = dex.host\n page.postingBondsDex.textContent = dex.host\n\n if (dex.auth.effectiveTier >= 1) {\n this.setRegistrationStatusView(intl.prep(intl.ID_REGISTRATION_FEE_SUCCESS), '', 'completed')\n return\n }\n\n const confStatuses = (dex.auth.pendingBonds || []).map(pending => {\n const confirmationsRequired = dex.bondAssets[pending.symbol].confs\n return `${pending.confs} / ${confirmationsRequired}`\n })\n const confStatusMsg = confStatuses.join(', ')\n this.setRegistrationStatusView(intl.prep(intl.ID_WAITING_FOR_CONFS), confStatusMsg, 'waiting')\n }\n\n /*\n * setRegistrationStatusVisibility toggles the registration status view based\n * on the dex data.\n */\n setRegistrationStatusVisibility () {\n const { page, market } = this\n if (!market || !market.dex) return\n\n // If dex is not connected to server, is not possible to know the\n // registration status.\n if (market.dex.connectionStatus !== ConnectionStatus.Connected) return\n\n this.updateRegistrationStatusView()\n\n const showSection = (section: PageElement | undefined) => {\n const elements = [page.registrationStatus, page.bondRequired, page.bondCreationPending, page.notRegistered, page.penaltyCompsRequired]\n for (const el of elements) {\n Doc.setVis(el === section, el)\n }\n }\n\n if (market.dex.auth.effectiveTier >= 1) {\n const toggle = async () => {\n showSection(undefined)\n this.resolveOrderFormVisibility()\n }\n if (Doc.isHidden(page.orderForm)) {\n // wait a couple of seconds before showing the form so the success\n // message is shown to the user\n setTimeout(toggle, 5000)\n return\n }\n toggle()\n } else if (market.dex.viewOnly) {\n page.unregisteredDex.textContent = market.dex.host\n showSection(page.notRegistered)\n } else if (market.dex.auth.targetTier > 0 && market.dex.auth.rep.penalties > market.dex.auth.penaltyComps) {\n page.acctPenalties.textContent = `${market.dex.auth.rep.penalties}`\n page.acctPenaltyComps.textContent = `${market.dex.auth.penaltyComps}`\n page.compsDexSettingsLink.href = `/dexsettings/${market.dex.host}`\n showSection(page.penaltyCompsRequired)\n } else if (this.hasPendingBonds()) {\n showSection(page.registrationStatus)\n } else if (market.dex.auth.targetTier > 0) {\n showSection(page.bondCreationPending)\n } else {\n page.acctTier.textContent = `${market.dex.auth.effectiveTier}`\n page.dexSettingsLink.href = `/dexsettings/${market.dex.host}`\n showSection(page.bondRequired)\n }\n }\n\n setOrderBttnText () {\n if (this.isSell()) {\n this.page.submitBttn.textContent = intl.prep(intl.ID_SET_BUTTON_SELL, { asset: Doc.shortSymbol(this.market.baseCfg.unitInfo.conventional.unit) })\n } else this.page.submitBttn.textContent = intl.prep(intl.ID_SET_BUTTON_BUY, { asset: Doc.shortSymbol(this.market.baseCfg.unitInfo.conventional.unit) })\n }\n\n setOrderBttnEnabled (isEnabled: boolean, disabledTooltipMsg?: string) {\n const btn = this.page.submitBttn\n if (isEnabled) {\n btn.removeAttribute('disabled')\n btn.removeAttribute('title')\n } else {\n btn.setAttribute('disabled', 'true')\n if (disabledTooltipMsg) btn.setAttribute('title', disabledTooltipMsg)\n }\n }\n\n updateOrderBttnState () {\n const { market: mkt, currentOrder: { qty: orderQty, rate: orderRate, isLimit, sell } } = this\n const baseWallet = app().assets[this.market.base.id].wallet\n const quoteWallet = app().assets[mkt.quote.id].wallet\n if (!baseWallet || !quoteWallet) return\n\n if (orderQty <= 0 || orderQty < mkt.cfg.lotsize) {\n this.setOrderBttnEnabled(false, intl.prep(intl.ID_ORDER_BUTTON_QTY_ERROR))\n return\n }\n\n // Market orders\n if (!isLimit) {\n if (sell) {\n this.setOrderBttnEnabled(orderQty <= baseWallet.balance.available, intl.prep(intl.ID_ORDER_BUTTON_SELL_BALANCE_ERROR))\n } else {\n this.setOrderBttnEnabled(orderQty <= quoteWallet.balance.available, intl.prep(intl.ID_ORDER_BUTTON_BUY_BALANCE_ERROR))\n }\n return\n }\n\n if (!orderRate) {\n this.setOrderBttnEnabled(false, intl.prep(intl.ID_ORDER_BUTTON_QTY_RATE_ERROR))\n return\n }\n\n // Limit sell\n if (sell) {\n if (baseWallet.balance.available < mkt.cfg.lotsize) {\n this.setOrderBttnEnabled(false, intl.prep(intl.ID_ORDER_BUTTON_SELL_BALANCE_ERROR))\n return\n }\n if (mkt.maxSell) {\n this.setOrderBttnEnabled(orderQty <= mkt.maxSell.swap.value, intl.prep(intl.ID_ORDER_BUTTON_SELL_BALANCE_ERROR))\n }\n return\n }\n\n // Limit buy\n const rate = this.adjustedRate()\n const aLot = mkt.cfg.lotsize * (rate / OrderUtil.RateEncodingFactor)\n if (quoteWallet.balance.available < aLot) {\n this.setOrderBttnEnabled(false, intl.prep(intl.ID_ORDER_BUTTON_BUY_BALANCE_ERROR))\n return\n }\n if (mkt.maxBuys[rate]) {\n const enable = orderQty <= mkt.maxBuys[rate].swap.lots * mkt.cfg.lotsize\n this.setOrderBttnEnabled(enable, intl.prep(intl.ID_ORDER_BUTTON_BUY_BALANCE_ERROR))\n }\n }\n\n setCandleDurBttns () {\n const { page, market } = this\n Doc.empty(page.durBttnBox)\n for (const dur of market.dex.candleDurs) {\n const bttn = page.durBttnTemplate.cloneNode(true)\n bttn.textContent = dur\n Doc.bind(bttn, 'click', () => this.candleDurationSelected(dur))\n page.durBttnBox.appendChild(bttn)\n }\n\n // load candlesticks here since we are resetting page.durBttnBox above.\n this.loadCandles()\n }\n\n /* setMarket sets the currently displayed market. */\n async setMarket (host: string, baseID: number, quoteID: number) {\n const dex = app().user.exchanges[host]\n const page = this.page\n\n window.cexBook = async () => {\n const res = await postJSON('/api/cexbook', { host, baseID, quoteID })\n console.log(res.book)\n }\n\n // reset form inputs\n page.lotField.value = ''\n page.qtyField.value = ''\n page.rateField.value = ''\n\n // clear depth chart and orderbook.\n this.depthChart.clear()\n Doc.empty(this.page.buyRows)\n Doc.empty(this.page.sellRows)\n\n // Clear recent matches for the previous market. This will be set when we\n // receive the order book subscription response.\n this.recentMatches = []\n Doc.empty(page.recentMatchesLiveList)\n\n // Hide the balance widget\n this.balanceWgt.setBalanceVisibility(false)\n\n Doc.hide(page.notRegistered, page.bondRequired, page.noWallet, page.penaltyCompsRequired)\n\n // If we have not yet connected, there is no dex.assets or any other\n // exchange data, so just put up a message and wait for the connection to be\n // established, at which time handleConnNote will refresh and reload.\n if (!dex || !dex.markets || dex.connectionStatus !== ConnectionStatus.Connected) {\n let errMsg = intl.prep(intl.ID_CONNECTION_FAILED)\n if (dex.disabled) errMsg = intl.prep(intl.ID_DEX_DISABLED_MSG)\n page.chartErrMsg.textContent = errMsg\n Doc.show(page.chartErrMsg)\n return\n }\n\n for (const s of this.stats) Doc.show(s.row)\n\n const baseCfg = dex.assets[baseID]\n const quoteCfg = dex.assets[quoteID]\n\n const [bui, qui] = [app().unitInfo(baseID, dex), app().unitInfo(quoteID, dex)]\n\n const rateConversionFactor = OrderUtil.RateEncodingFactor / bui.conventional.conversionFactor * qui.conventional.conversionFactor\n Doc.hide(page.maxOrd, page.chartErrMsg)\n if (this.maxEstimateTimer) {\n window.clearTimeout(this.maxEstimateTimer)\n this.maxEstimateTimer = null\n }\n const mktId = marketID(baseCfg.symbol, quoteCfg.symbol)\n const baseAsset = app().assets[baseID]\n const quoteAsset = app().assets[quoteID]\n\n const mkt = {\n dex: dex,\n sid: mktId, // A string market identifier used by the DEX.\n cfg: dex.markets[mktId],\n // app().assets is a map of core.SupportedAsset type, which can be found at\n // client/core/types.go.\n base: baseAsset,\n quote: quoteAsset,\n baseUnitInfo: bui,\n quoteUnitInfo: qui,\n maxSell: null,\n maxBuys: {},\n maxSellRequested: false,\n candleCaches: {},\n baseCfg,\n quoteCfg,\n rateConversionFactor,\n sellBalance: 0,\n buyBalance: 0,\n bookLoaded: false\n }\n\n this.market = mkt\n this.mm.setMarket(host, baseID, quoteID)\n this.mmRunning = undefined\n page.lotSize.textContent = Doc.formatCoinValue(mkt.cfg.lotsize, mkt.baseUnitInfo)\n page.rateStep.textContent = Doc.formatCoinValue(mkt.cfg.ratestep / rateConversionFactor)\n\n this.displayMessageIfMissingWallet()\n this.balanceWgt.setWallets(host, baseID, quoteID)\n this.setMarketDetails()\n this.setCurrMarketPrice()\n\n // if (!dex.candleDurs || dex.candleDurs.length === 0) this.currentChart = depthChart\n\n // depth chart\n ws.request('loadmarket', makeMarket(host, baseID, quoteID))\n\n State.storeLocal(State.lastMarketLK, {\n host: host,\n base: baseID,\n quote: quoteID\n })\n app().updateMarketElements(this.main, baseID, quoteID, dex)\n this.marketList.select(host, baseID, quoteID)\n this.setLoaderMsgVisibility()\n this.setTokenApprovalVisibility()\n this.setRegistrationStatusVisibility()\n this.resolveOrderFormVisibility()\n this.setOrderBttnText()\n this.setOrderBttnEnabled(false, intl.prep(intl.ID_ORDER_BUTTON_QTY_RATE_ERROR))\n this.setCandleDurBttns()\n this.previewQuoteAmt(false)\n this.updateTitle()\n this.reputationMeter.setHost(dex.host)\n this.updateReputation()\n this.loadUserOrders()\n }\n\n /*\n displayMessageForMissingWallet displays a custom message on the market's\n view if one or more of the selected market's wallet is missing.\n */\n displayMessageIfMissingWallet () {\n const page = this.page\n const mkt = this.market\n const baseSym = mkt.baseCfg.symbol.toLocaleUpperCase()\n const quoteSym = mkt.quoteCfg.symbol.toLocaleUpperCase()\n let noWalletMsg = ''\n Doc.hide(page.noWallet)\n if (!mkt.base?.wallet && !mkt.quote?.wallet) noWalletMsg = intl.prep(intl.ID_NO_WALLET_MSG, { asset1: baseSym, asset2: quoteSym })\n else if (!mkt.base?.wallet) noWalletMsg = intl.prep(intl.ID_CREATE_ASSET_WALLET_MSG, { asset: baseSym })\n else if (!mkt.quote?.wallet) noWalletMsg = intl.prep(intl.ID_CREATE_ASSET_WALLET_MSG, { asset: quoteSym })\n else return\n\n page.noWallet.textContent = noWalletMsg\n Doc.show(page.noWallet)\n }\n\n /*\n * reportDepthClick is a callback used by the DepthChart when the user clicks\n * on the chart area. The rate field is set to the x-value of the click.\n */\n reportDepthClick (r: number) {\n this.page.rateField.value = String(r)\n this.rateFieldChanged()\n }\n\n /*\n * reportDepthVolume accepts a volume report from the DepthChart and sets the\n * values in the chart legend.\n */\n reportDepthVolume (r: VolumeReport) {\n const page = this.page\n const { baseUnitInfo: b, quoteUnitInfo: q } = this.market\n // DepthChart reports volumes in conventional units. We'll still use\n // formatCoinValue for formatting though.\n page.sellBookedBase.textContent = Doc.formatCoinValue(r.sellBase * b.conventional.conversionFactor, b)\n page.sellBookedQuote.textContent = Doc.formatCoinValue(r.sellQuote * q.conventional.conversionFactor, q)\n page.buyBookedBase.textContent = Doc.formatCoinValue(r.buyBase * b.conventional.conversionFactor, b)\n page.buyBookedQuote.textContent = Doc.formatCoinValue(r.buyQuote * q.conventional.conversionFactor, q)\n }\n\n /*\n * reportDepthMouse accepts information about the mouse position on the chart\n * area.\n */\n reportDepthMouse (r: MouseReport) {\n while (this.hovers.length) (this.hovers.shift() as HTMLElement).classList.remove('hover')\n const page = this.page\n if (!r) {\n Doc.hide(page.depthLegend)\n return\n }\n Doc.show(page.depthLegend)\n\n // If the user is hovered to within a small percent (based on chart width)\n // of a user order, highlight that order's row.\n for (const { div, ord } of Object.values(this.metaOrders)) {\n if (ord.status !== OrderUtil.StatusBooked) continue\n if (r.hoverMarkers.indexOf(ord.rate) > -1) {\n div.classList.add('hover')\n this.hovers.push(div)\n }\n }\n\n page.hoverPrice.textContent = Doc.formatCoinValue(r.rate)\n page.hoverVolume.textContent = Doc.formatCoinValue(r.depth)\n page.hoverVolume.style.color = r.dotColor\n }\n\n /*\n * reportDepthZoom accepts information about the current depth chart zoom\n * level. This information is saved to disk so that the zoom level can be\n * maintained across reloads.\n */\n reportDepthZoom (zoom: number) {\n State.storeLocal(State.depthZoomLK, zoom)\n }\n\n reportMouseCandle (candle: Candle | null) {\n const page = this.page\n if (!candle) {\n Doc.hide(page.candlesLegend)\n return\n }\n Doc.show(page.candlesLegend)\n page.candleStart.textContent = Doc.formatCoinValue(candle.startRate / this.market.rateConversionFactor)\n page.candleEnd.textContent = Doc.formatCoinValue(candle.endRate / this.market.rateConversionFactor)\n page.candleHigh.textContent = Doc.formatCoinValue(candle.highRate / this.market.rateConversionFactor)\n page.candleLow.textContent = Doc.formatCoinValue(candle.lowRate / this.market.rateConversionFactor)\n page.candleVol.textContent = Doc.formatCoinValue(candle.matchVolume, this.market.baseUnitInfo)\n }\n\n /*\n * parseOrder pulls the order information from the form fields. Data is not\n * validated in any way.\n */\n parseOrder (): TradeForm {\n const page = this.page\n let qtyField = page.qtyField\n const limit = this.isLimit()\n const sell = this.isSell()\n const market = this.market\n let qtyConv = market.baseUnitInfo.conventional.conversionFactor\n if (!limit && !sell) {\n qtyField = page.mktBuyField\n qtyConv = market.quoteUnitInfo.conventional.conversionFactor\n }\n return {\n host: market.dex.host,\n isLimit: limit,\n sell: sell,\n base: market.base.id,\n quote: market.quote.id,\n qty: convertToAtoms(qtyField.value || '', qtyConv),\n rate: convertToAtoms(page.rateField.value || '', market.rateConversionFactor), // message-rate\n tifnow: page.tifNow.checked || false,\n options: {}\n }\n }\n\n /**\n * previewQuoteAmt shows quote amount when rate or quantity input are changed\n */\n previewQuoteAmt (show: boolean) {\n const page = this.page\n if (!this.market.base || !this.market.quote) return // Not a supported asset\n const order = this.currentOrder = this.parseOrder()\n const adjusted = this.adjustedRate()\n page.orderErr.textContent = ''\n if (adjusted) {\n if (order.sell) this.preSell()\n else this.preBuy()\n }\n this.depthLines.input = []\n if (adjusted && this.isLimit()) {\n this.depthLines.input = [{\n rate: order.rate / this.market.rateConversionFactor,\n color: order.sell ? this.depthChart.theme.sellLine : this.depthChart.theme.buyLine\n }]\n }\n this.drawChartLines()\n if (!show || !adjusted || !order.qty) {\n page.orderPreview.textContent = ''\n this.drawChartLines()\n return\n }\n const { unitInfo: { conventional: { unit } } } = app().assets[order.quote]\n const quoteQty = order.qty * order.rate / OrderUtil.RateEncodingFactor\n const total = Doc.formatCoinValue(quoteQty, this.market.quoteUnitInfo)\n\n page.orderPreview.textContent = intl.prep(intl.ID_ORDER_PREVIEW, { total, asset: unit })\n if (this.isSell()) this.preSell()\n else this.preBuy()\n }\n\n /**\n * preSell populates the max order message for the largest available sell.\n */\n preSell () {\n const mkt = this.market\n const baseWallet = app().assets[mkt.base.id].wallet\n if (baseWallet.balance.available < mkt.cfg.lotsize) {\n this.setMaxOrder(null)\n this.updateOrderBttnState()\n return\n }\n if (mkt.maxSell) {\n this.setMaxOrder(mkt.maxSell.swap)\n this.updateOrderBttnState()\n return\n }\n\n if (mkt.maxSellRequested) return\n mkt.maxSellRequested = true\n // We only fetch pre-sell once per balance update, so don't delay.\n this.scheduleMaxEstimate('/api/maxsell', {}, 0, (res: MaxSell) => {\n mkt.maxSellRequested = false\n mkt.maxSell = res.maxSell\n mkt.sellBalance = baseWallet.balance.available\n this.setMaxOrder(res.maxSell.swap)\n this.updateOrderBttnState()\n })\n }\n\n /**\n * preBuy populates the max order message for the largest available buy.\n */\n preBuy () {\n const mkt = this.market\n const rate = this.adjustedRate()\n const quoteWallet = app().assets[mkt.quote.id].wallet\n if (!quoteWallet) return\n const aLot = mkt.cfg.lotsize * (rate / OrderUtil.RateEncodingFactor)\n if (quoteWallet.balance.available < aLot) {\n this.setMaxOrder(null)\n this.updateOrderBttnState()\n return\n }\n if (mkt.maxBuys[rate]) {\n this.setMaxOrder(mkt.maxBuys[rate].swap)\n this.updateOrderBttnState()\n return\n }\n // 0 delay for first fetch after balance update or market change, otherwise\n // meter these at 1 / sec.\n const delay = Object.keys(mkt.maxBuys).length ? 350 : 0\n this.scheduleMaxEstimate('/api/maxbuy', { rate }, delay, (res: MaxBuy) => {\n mkt.maxBuys[rate] = res.maxBuy\n mkt.buyBalance = app().assets[mkt.quote.id].wallet.balance.available\n this.setMaxOrder(res.maxBuy.swap)\n this.updateOrderBttnState()\n })\n }\n\n /**\n * scheduleMaxEstimate shows the loading icon and schedules a call to an order\n * estimate api endpoint. If another call to scheduleMaxEstimate is made before\n * this one is fired (after delay), this call will be canceled.\n */\n scheduleMaxEstimate (path: string, args: any, delay: number, success: (res: any) => void) {\n const page = this.page\n if (!this.maxLoaded) this.maxLoaded = app().loading(page.maxOrd)\n const [bid, qid] = [this.market.base.id, this.market.quote.id]\n const [bWallet, qWallet] = [app().assets[bid].wallet, app().assets[qid].wallet]\n if (!bWallet || !bWallet.running || !qWallet || !qWallet.running) return\n if (this.maxEstimateTimer) window.clearTimeout(this.maxEstimateTimer)\n\n Doc.show(page.maxOrd, page.maxLotBox)\n Doc.hide(page.maxAboveZero, page.maxZeroNoFees, page.maxZeroNoBal)\n page.maxFromLots.textContent = intl.prep(intl.ID_CALCULATING)\n page.maxFromLotsLbl.textContent = ''\n this.maxOrderUpdateCounter++\n const counter = this.maxOrderUpdateCounter\n this.maxEstimateTimer = window.setTimeout(async () => {\n this.maxEstimateTimer = null\n if (counter !== this.maxOrderUpdateCounter) return\n const res = await postJSON(path, {\n host: this.market.dex.host,\n base: bid,\n quote: qid,\n ...args\n })\n if (counter !== this.maxOrderUpdateCounter) return\n if (!app().checkResponse(res)) {\n console.warn('max order estimate not available:', res)\n page.maxFromLots.textContent = intl.prep(intl.ID_ESTIMATE_UNAVAILABLE)\n if (this.maxLoaded) {\n this.maxLoaded()\n this.maxLoaded = null\n }\n return\n }\n success(res)\n }, delay)\n }\n\n /* setMaxOrder sets the max order text. */\n setMaxOrder (maxOrder: SwapEstimate | null) {\n const page = this.page\n if (this.maxLoaded) {\n this.maxLoaded()\n this.maxLoaded = null\n }\n Doc.show(page.maxOrd, page.maxLotBox)\n const sell = this.isSell()\n\n let lots = 0\n if (maxOrder) lots = maxOrder.lots\n\n page.maxFromLots.textContent = lots.toString()\n // XXX add plural into format details, so we don't need this\n page.maxFromLotsLbl.textContent = intl.prep(lots === 1 ? intl.ID_LOT : intl.ID_LOTS)\n if (!maxOrder) return\n\n const fromAsset = sell ? this.market.base : this.market.quote\n\n if (lots === 0) {\n // If we have a maxOrder, see if we can guess why we have no lots.\n let lotSize = this.market.cfg.lotsize\n if (!sell) {\n const conversionRate = this.anyRate()[1]\n if (conversionRate === 0) return\n lotSize = lotSize * conversionRate\n }\n const haveQty = fromAsset.wallet.balance.available / lotSize > 0\n if (haveQty) {\n if (fromAsset.token) {\n const { wallet: { balance: { available: feeAvail } }, unitInfo } = app().assets[fromAsset.token.parentID]\n if (feeAvail < maxOrder.feeReservesPerLot) {\n Doc.show(page.maxZeroNoFees)\n page.maxZeroNoFeesTicker.textContent = unitInfo.conventional.unit\n page.maxZeroMinFees.textContent = Doc.formatCoinValue(maxOrder.feeReservesPerLot, unitInfo)\n }\n // It looks like we should be able to afford it, but maybe some fees we're not seeing.\n // Show nothing.\n return\n }\n // Not a token. Maybe we have enough for the swap but not for fees.\n const fundedLots = fromAsset.wallet.balance.available / (lotSize + maxOrder.feeReservesPerLot)\n if (fundedLots > 0) return // Not sure why. Could be split txs or utxos. Just show nothing.\n }\n Doc.show(page.maxZeroNoBal)\n page.maxZeroNoBalTicker.textContent = fromAsset.unitInfo.conventional.unit\n return\n }\n Doc.show(page.maxAboveZero)\n\n page.maxFromAmt.textContent = Doc.formatCoinValue(maxOrder.value || 0, fromAsset.unitInfo)\n page.maxFromTicker.textContent = fromAsset.unitInfo.conventional.unit\n // Could subtract the maxOrder.redemptionFees here.\n // The qty conversion doesn't fit well with the new design.\n // TODO: Make this work somehow?\n // const toConversion = sell ? this.adjustedRate() / OrderUtil.RateEncodingFactor : OrderUtil.RateEncodingFactor / this.adjustedRate()\n // page.maxToAmt.textContent = Doc.formatCoinValue((maxOrder.value || 0) * toConversion, toAsset.unitInfo)\n // page.maxToTicker.textContent = toAsset.symbol.toUpperCase()\n }\n\n /*\n * validateOrder performs some basic order sanity checks, returning boolean\n * true if the order appears valid.\n */\n validateOrder (order: TradeForm) {\n const { page, market: { cfg: { minimumRate }, rateConversionFactor } } = this\n if (order.isLimit) {\n if (!order.rate) {\n Doc.show(page.orderErr)\n page.orderErr.textContent = intl.prep(intl.ID_NO_ZERO_RATE)\n return false\n }\n if (order.rate < minimumRate) {\n Doc.show(page.orderErr)\n const [r, minRate] = [order.rate / rateConversionFactor, minimumRate / rateConversionFactor]\n page.orderErr.textContent = `rate is lower than the market's minimum rate. ${r} < ${minRate}`\n return false\n }\n }\n if (!order.qty) {\n Doc.show(page.orderErr)\n page.orderErr.textContent = intl.prep(intl.ID_NO_ZERO_QUANTITY)\n return false\n }\n return true\n }\n\n /* handleBook accepts the data sent in the 'book' notification. */\n handleBook (data: MarketOrderBook) {\n const { cfg, baseUnitInfo, quoteUnitInfo, baseCfg, quoteCfg } = this.market\n this.book = new OrderBook(data, baseCfg.symbol, quoteCfg.symbol)\n this.loadTable()\n for (const order of (data.book.epoch || [])) {\n if (order.rate > 0) this.book.add(order)\n this.addTableOrder(order)\n }\n if (!this.book) {\n this.depthChart.clear()\n Doc.empty(this.page.buyRows)\n Doc.empty(this.page.sellRows)\n return\n }\n Doc.show(this.page.epochLine)\n if (this.loadingAnimations.depth) this.loadingAnimations.depth.stop()\n this.depthChart.canvas.classList.remove('invisible')\n this.depthChart.set(this.book, cfg.lotsize, cfg.ratestep, baseUnitInfo, quoteUnitInfo)\n this.recentMatches = data.book.recentMatches ?? []\n this.refreshRecentMatchesTable()\n }\n\n /*\n * midGapConventional is the same as midGap, but returns the mid-gap rate as\n * the conventional ratio. This is used to convert from a conventional\n * quantity from base to quote or vice-versa, or for display purposes.\n */\n midGapConventional () {\n const gap = this.midGap()\n if (!gap) return gap\n const { baseUnitInfo: b, quoteUnitInfo: q } = this.market\n return gap * b.conventional.conversionFactor / q.conventional.conversionFactor\n }\n\n /*\n * midGap returns the value in the middle of the best buy and best sell. If\n * either one of the buy or sell sides are empty, midGap returns the best rate\n * from the other side. If both sides are empty, midGap returns the value\n * null. The rate returned is the atomic ratio, used for conversion. For a\n * conventional rate for display or to convert conventional units, use\n * midGapConventional\n */\n midGap () {\n const book = this.book\n if (!book) return\n if (book.buys && book.buys.length) {\n if (book.sells && book.sells.length) {\n return (book.buys[0].msgRate + book.sells[0].msgRate) / 2 / OrderUtil.RateEncodingFactor\n }\n return book.buys[0].msgRate / OrderUtil.RateEncodingFactor\n }\n if (book.sells && book.sells.length) {\n return book.sells[0].msgRate / OrderUtil.RateEncodingFactor\n }\n return null\n }\n\n /*\n * setMarketBuyOrderEstimate sets the \"min. buy\" display for the current\n * market.\n */\n setMarketBuyOrderEstimate () {\n const market = this.market\n const lotSize = market.cfg.lotsize\n const xc = app().user.exchanges[market.dex.host]\n const buffer = xc.markets[market.sid].buybuffer\n const gap = this.midGapConventional()\n if (gap) {\n this.page.minMktBuy.textContent = Doc.formatCoinValue(lotSize * buffer * gap, market.baseUnitInfo)\n }\n }\n\n maxUserOrderCount (): number {\n const { dex: { host }, cfg: { name: mktID } } = this.market\n return Math.max(maxUserOrdersShown, app().orders(host, mktID).length)\n }\n\n async loadUserOrders () {\n const { base: b, quote: q, dex: { host }, cfg: { name: mktID } } = this.market\n for (const oid in this.metaOrders) delete this.metaOrders[oid]\n if (!b || !q) return this.resolveUserOrders([]) // unsupported asset\n const activeOrders = app().orders(host, mktID)\n if (activeOrders.length >= maxUserOrdersShown) return this.resolveUserOrders(activeOrders)\n const filter: OrderFilter = {\n hosts: [host],\n market: { baseID: b.id, quoteID: q.id },\n n: this.maxUserOrderCount()\n }\n const res = await postJSON('/api/orders', filter)\n const orders = res.orders || []\n // Make sure all active orders are in there. The /orders API sorts by time,\n // so if there is are 10 cancelled/executed orders newer than an old active\n // order, the active order wouldn't be included in the result.\n for (const activeOrd of activeOrders) if (!orders.some((dbOrd: Order) => dbOrd.id === activeOrd.id)) orders.push(activeOrd)\n return this.resolveUserOrders(res.orders || [])\n }\n\n /* refreshActiveOrders refreshes the user's active order list. */\n refreshActiveOrders () {\n const orders = app().orders(this.market.dex.host, marketID(this.market.baseCfg.symbol, this.market.quoteCfg.symbol))\n return this.resolveUserOrders(orders)\n }\n\n resolveUserOrders (orders: Order[]) {\n const { page, metaOrders, market } = this\n const cfg = market.cfg\n\n const orderIsActive = (ord: Order) => ord.status < OrderUtil.StatusExecuted || OrderUtil.hasActiveMatches(ord)\n\n for (const ord of orders) metaOrders[ord.id] = { ord: ord } as MetaOrder\n let sortedOrders = Object.keys(metaOrders).map((oid: string) => metaOrders[oid])\n sortedOrders.sort((a: MetaOrder, b: MetaOrder) => {\n const [aActive, bActive] = [orderIsActive(a.ord), orderIsActive(b.ord)]\n if (aActive && !bActive) return -1\n else if (!aActive && bActive) return 1\n return b.ord.submitTime - a.ord.submitTime\n })\n const n = this.maxUserOrderCount()\n if (sortedOrders.length > n) { sortedOrders = sortedOrders.slice(0, n) }\n\n for (const oid in metaOrders) delete metaOrders[oid]\n\n Doc.empty(page.userOrders)\n Doc.setVis(sortedOrders?.length, page.userOrders)\n Doc.setVis(!sortedOrders?.length, page.userNoOrders)\n\n let unreadyOrders = false\n for (const mord of sortedOrders) {\n const div = page.userOrderTmpl.cloneNode(true) as HTMLElement\n page.userOrders.appendChild(div)\n const tmpl = Doc.parseTemplate(div)\n const header = Doc.parseTemplate(tmpl.header)\n const details = Doc.parseTemplate(tmpl.details)\n\n mord.div = div\n mord.header = header\n mord.details = details\n const ord = mord.ord\n\n const orderID = ord.id\n const isActive = orderIsActive(ord)\n\n // No need to track in-flight orders here. We've already added it to\n // display.\n if (orderID) metaOrders[orderID] = mord\n\n if (!ord.readyToTick && OrderUtil.hasActiveMatches(ord)) {\n tmpl.header.classList.add('unready-user-order')\n unreadyOrders = true\n }\n header.sideLight.classList.add(ord.sell ? 'sell' : 'buy')\n if (!isActive) header.sideLight.classList.add('inactive')\n details.side.textContent = mord.header.side.textContent = OrderUtil.sellString(ord)\n details.side.classList.add(ord.sell ? 'sellcolor' : 'buycolor')\n header.side.classList.add(ord.sell ? 'sellcolor' : 'buycolor')\n details.qty.textContent = mord.header.qty.textContent = Doc.formatCoinValue(ord.qty, market.baseUnitInfo)\n let rateStr: string\n if (ord.type === OrderUtil.Market) rateStr = this.marketOrderRateString(ord, market)\n else rateStr = Doc.formatRateFullPrecision(ord.rate, market.baseUnitInfo, market.quoteUnitInfo, cfg.ratestep)\n details.rate.textContent = mord.header.rate.textContent = rateStr\n header.baseSymbol.textContent = market.baseUnitInfo.conventional.unit\n details.type.textContent = OrderUtil.orderTypeText(ord.type)\n this.updateMetaOrder(mord)\n\n Doc.bind(div, 'mouseenter', () => {\n this.activeMarkerRate = ord.rate\n this.setDepthMarkers()\n })\n\n const showCancel = (e: Event) => {\n e.stopPropagation()\n this.showCancel(div, orderID)\n }\n\n const showAccelerate = (e: Event) => {\n e.stopPropagation()\n this.showAccelerate(ord)\n }\n\n if (!orderID) {\n Doc.hide(details.accelerateBttn)\n Doc.hide(details.cancelBttn)\n Doc.hide(details.link)\n } else {\n if (OrderUtil.isCancellable(ord)) {\n Doc.show(details.cancelBttn)\n bind(details.cancelBttn, 'click', (e: Event) => { showCancel(e) })\n }\n\n bind(details.accelerateBttn, 'click', (e: Event) => { showAccelerate(e) })\n if (app().canAccelerateOrder(ord)) {\n Doc.show(details.accelerateBttn)\n }\n\n details.link.href = `order/${orderID}`\n app().bindInternalNavigation(div)\n }\n let currentFloater: (PageElement | null)\n Doc.bind(tmpl.header, 'click', () => {\n if (Doc.isDisplayed(tmpl.details)) {\n Doc.hide(tmpl.details)\n header.expander.classList.add('ico-arrowdown')\n header.expander.classList.remove('ico-arrowup')\n return\n }\n Doc.show(tmpl.details)\n header.expander.classList.remove('ico-arrowdown')\n header.expander.classList.add('ico-arrowup')\n if (currentFloater) currentFloater.remove()\n })\n /**\n * We'll show the button menu when they hover over the header. To avoid\n * pushing the layout around, we'll show the buttons as an absolutely\n * positioned copy of the button menu.\n */\n Doc.bind(tmpl.header, 'mouseenter', () => {\n // Don't show the copy if the details are already displayed.\n if (Doc.isDisplayed(tmpl.details)) return\n if (currentFloater) currentFloater.remove()\n // Create and position the element based on the position of the header.\n const floater = document.createElement('div')\n currentFloater = floater\n document.body.appendChild(floater)\n floater.className = 'user-order-floaty-menu'\n const m = Doc.layoutMetrics(tmpl.header)\n const y = m.bodyTop + m.height\n floater.style.top = `${y - 1}px` // - 1 to hide border on header div\n floater.style.left = `${m.bodyLeft}px`\n // Get the updated version of the order\n const mord = this.metaOrders[orderID]\n const ord = mord.ord\n\n const addButton = (baseBttn: PageElement, cb: ((e: Event) => void)) => {\n const icon = baseBttn.cloneNode(true) as PageElement\n floater.appendChild(icon)\n Doc.show(icon)\n Doc.bind(icon, 'click', (e: Event) => { cb(e) })\n }\n\n if (OrderUtil.isCancellable(ord)) addButton(details.cancelBttn, (e: Event) => { showCancel(e) })\n if (app().canAccelerateOrder(ord)) addButton(details.accelerateBttn, (e: Event) => { showAccelerate(e) })\n floater.appendChild(details.link.cloneNode(true))\n\n const ogScrollY = page.orderScroller.scrollTop\n // Set up the hover interactions.\n const moved = (e: MouseEvent) => {\n // If the user scrolled, reposition the float menu. This keeps the\n // menu from following us around, which can prevent removal below.\n const yShift = page.orderScroller.scrollTop - ogScrollY\n floater.style.top = `${y + yShift}px`\n if (Doc.mouseInElement(e, floater) || Doc.mouseInElement(e, div)) return\n floater.remove()\n currentFloater = null\n document.removeEventListener('mousemove', moved)\n page.orderScroller.removeEventListener('scroll', moved)\n }\n document.addEventListener('mousemove', moved)\n page.orderScroller.addEventListener('scroll', moved)\n })\n app().bindTooltips(div)\n }\n Doc.setVis(unreadyOrders, page.unreadyOrdersMsg)\n this.setDepthMarkers()\n }\n\n /*\n marketOrderRateString uses the market config rate step to format the average\n market order rate.\n */\n marketOrderRateString (ord: Order, mkt: CurrentMarket) :string {\n if (!ord.matches?.length) return intl.prep(intl.ID_MARKET_ORDER)\n let rateStr = Doc.formatRateFullPrecision(OrderUtil.averageRate(ord), mkt.baseUnitInfo, mkt.quoteUnitInfo, mkt.cfg.ratestep)\n if (ord.matches.length > 1) rateStr = '~ ' + rateStr // ~ only makes sense if the order has more than one match\n return rateStr\n }\n\n /*\n * updateMetaOrder sets the td contents of the user's order table row.\n */\n updateMetaOrder (mord: MetaOrder) {\n const { header, details, ord } = mord\n if (ord.status <= OrderUtil.StatusBooked || OrderUtil.hasActiveMatches(ord)) header.activeLight.classList.add('active')\n else header.activeLight.classList.remove('active')\n details.status.textContent = header.status.textContent = OrderUtil.statusString(ord)\n details.age.textContent = Doc.timeSince(ord.submitTime)\n details.filled.textContent = `${(OrderUtil.filled(ord) / ord.qty * 100).toFixed(1)}%`\n details.settled.textContent = `${(OrderUtil.settled(ord) / ord.qty * 100).toFixed(1)}%`\n }\n\n /* setMarkers sets the depth chart markers for booked orders. */\n setDepthMarkers () {\n const markers: Record<string, DepthMarker[]> = {\n buys: [],\n sells: []\n }\n const rateFactor = this.market.rateConversionFactor\n for (const { ord } of Object.values(this.metaOrders)) {\n if (ord.rate && ord.status === OrderUtil.StatusBooked) {\n if (ord.sell) {\n markers.sells.push({\n rate: ord.rate / rateFactor,\n active: ord.rate === this.activeMarkerRate\n })\n } else {\n markers.buys.push({\n rate: ord.rate / rateFactor,\n active: ord.rate === this.activeMarkerRate\n })\n }\n }\n }\n this.depthChart.setMarkers(markers)\n if (this.book) this.depthChart.draw()\n }\n\n /* updateTitle update the browser title based on the midgap value and the\n * selected assets.\n */\n updateTitle () {\n // gets first price value from buy or from sell, so we can show it on\n // title.\n const midGapValue = this.midGapConventional()\n const { baseUnitInfo: { conventional: { unit: bUnit } }, quoteUnitInfo: { conventional: { unit: qUnit } } } = this.market\n if (!midGapValue) document.title = `${bUnit}${qUnit} | ${this.ogTitle}`\n else document.title = `${Doc.formatCoinValue(midGapValue)} | ${bUnit}${qUnit} | ${this.ogTitle}` // more than 6 numbers it gets too big for the title.\n }\n\n /* handleBookRoute is the handler for the 'book' notification, which is sent\n * in response to a new market subscription. The data received will contain\n * the entire order book.\n */\n handleBookRoute (note: BookUpdate) {\n app().log('book', 'handleBookRoute:', note)\n const mktBook = note.payload\n const { baseCfg: b, quoteCfg: q, dex: { host } } = this.market\n if (mktBook.base !== b.id || mktBook.quote !== q.id || note.host !== host) return // user already changed markets\n this.handleBook(mktBook)\n this.market.bookLoaded = true\n this.updateTitle()\n this.setMarketBuyOrderEstimate()\n }\n\n /* handleBookOrderRoute is the handler for 'book_order' notifications. */\n handleBookOrderRoute (data: BookUpdate) {\n app().log('book', 'handleBookOrderRoute:', data)\n if (data.host !== this.market.dex.host || data.marketID !== this.market.sid) return\n const order = data.payload as MiniOrder\n if (order.rate > 0) this.book.add(order)\n this.addTableOrder(order)\n this.updateTitle()\n this.depthChart.draw()\n }\n\n /* handleUnbookOrderRoute is the handler for 'unbook_order' notifications. */\n handleUnbookOrderRoute (data: BookUpdate) {\n app().log('book', 'handleUnbookOrderRoute:', data)\n if (data.host !== this.market.dex.host || data.marketID !== this.market.sid) return\n const order = data.payload\n this.book.remove(order.token)\n this.removeTableOrder(order)\n this.updateTitle()\n this.depthChart.draw()\n }\n\n /*\n * handleUpdateRemainingRoute is the handler for 'update_remaining'\n * notifications.\n */\n handleUpdateRemainingRoute (data: BookUpdate) {\n app().log('book', 'handleUpdateRemainingRoute:', data)\n if (data.host !== this.market.dex.host || data.marketID !== this.market.sid) return\n const update = data.payload\n this.book.updateRemaining(update.token, update.qty, update.qtyAtomic)\n this.updateTableOrder(update)\n this.depthChart.draw()\n }\n\n /* handleEpochOrderRoute is the handler for 'epoch_order' notifications. */\n handleEpochOrderRoute (data: BookUpdate) {\n app().log('book', 'handleEpochOrderRoute:', data)\n if (data.host !== this.market.dex.host || data.marketID !== this.market.sid) return\n const order = data.payload\n if (order.msgRate > 0) this.book.add(order) // No cancels or market orders\n if (order.qtyAtomic > 0) this.addTableOrder(order) // No cancel orders\n this.depthChart.draw()\n }\n\n /* handleCandlesRoute is the handler for 'candles' notifications. */\n handleCandlesRoute (data: BookUpdate) {\n if (this.candlesLoading) {\n clearTimeout(this.candlesLoading.timer)\n this.candlesLoading.loaded()\n this.candlesLoading = null\n }\n if (data.host !== this.market.dex.host || data.marketID !== this.market.cfg.name) return\n const dur = data.payload.dur\n this.market.candleCaches[dur] = data.payload\n this.setHighLow()\n if (this.candleDur !== dur) return\n if (this.loadingAnimations.candles) this.loadingAnimations.candles.stop()\n this.candleChart.canvas.classList.remove('invisible')\n this.candleChart.setCandles(data.payload, this.market.cfg, this.market.baseUnitInfo, this.market.quoteUnitInfo)\n }\n\n handleEpochMatchSummary (data: BookUpdate) {\n this.addRecentMatches(data.payload.matchSummaries)\n this.refreshRecentMatchesTable()\n }\n\n /* handleCandleUpdateRoute is the handler for 'candle_update' notifications. */\n handleCandleUpdateRoute (data: BookUpdate) {\n if (data.host !== this.market.dex.host) return\n const { dur, candle } = data.payload\n const cache = this.market.candleCaches[dur]\n if (!cache) return // must not have seen the 'candles' notification yet?\n const candles = cache.candles\n if (candles.length === 0) candles.push(candle)\n else {\n const last = candles[candles.length - 1]\n if (last.startStamp === candle.startStamp) candles[candles.length - 1] = candle\n else candles.push(candle)\n }\n if (this.candleDur !== dur) return\n this.candleChart.draw()\n }\n\n /*\n * showToggleWalletStatus displays the toggleWalletStatusConfirm form to\n * enable a wallet.\n */\n showToggleWalletStatus (asset: SupportedAsset) {\n const page = this.page\n this.openAsset = asset\n Doc.hide(page.toggleWalletStatusErr, page.walletStatusDisable, page.disableWalletMsg)\n Doc.show(page.walletStatusEnable, page.enableWalletMsg)\n this.forms.show(page.toggleWalletStatusConfirm)\n }\n\n /*\n * toggleWalletStatus toggle wallets status to enabled.\n */\n async toggleWalletStatus () {\n const page = this.page\n Doc.hide(page.toggleWalletStatusErr)\n\n const url = '/api/togglewalletstatus'\n const req = {\n assetID: this.openAsset.id,\n disable: false\n }\n\n const loaded = app().loading(page.toggleWalletStatusConfirm)\n const res = await postJSON(url, req)\n loaded()\n if (!app().checkResponse(res)) {\n page.toggleWalletStatusErr.textContent = res.msg\n Doc.show(page.toggleWalletStatusErr)\n return\n }\n\n Doc.hide(this.page.forms)\n this.balanceWgt.updateAsset(this.openAsset.id)\n }\n\n /* showVerify shows the form to accept the currently parsed order information\n * and confirm submission of the order to the dex.\n */\n showVerify () {\n this.preorderCache = {}\n const page = this.page\n const order = this.currentOrder = this.parseOrder()\n const isSell = order.sell\n const baseAsset = app().assets[order.base]\n const quoteAsset = app().assets[order.quote]\n const toAsset = isSell ? quoteAsset : baseAsset\n const fromAsset = isSell ? baseAsset : quoteAsset\n\n const setIcon = (icon: PageElement) => {\n switch (icon.dataset.icon) {\n case 'from':\n if (fromAsset.token) {\n const parentAsset = app().assets[fromAsset.token.parentID]\n icon.src = Doc.logoPath(parentAsset.symbol)\n } else {\n icon.src = Doc.logoPath(fromAsset.symbol)\n }\n break\n case 'to':\n if (toAsset.token) {\n const parentAsset = app().assets[toAsset.token.parentID]\n icon.src = Doc.logoPath(parentAsset.symbol)\n } else {\n icon.src = Doc.logoPath(toAsset.symbol)\n }\n }\n }\n\n // Set the to and from icons in the fee details pane.\n for (const icon of Doc.applySelector(page.vDetailPane, '[data-icon]')) {\n setIcon(icon)\n }\n\n // Set the to and from icons in the fee summary pane.\n for (const icon of Doc.applySelector(page.vFeeSummary, '[data-icon]')) {\n setIcon(icon)\n }\n\n Doc.hide(page.vPreorderErr)\n Doc.show(page.vPreorder)\n\n page.vBuySell.textContent = isSell ? intl.prep(intl.ID_SELLING) : intl.prep(intl.ID_BUYING)\n const buySellStr = isSell ? intl.prep(intl.ID_SELL) : intl.prep(intl.ID_BUY)\n page.vSideSubmit.textContent = buySellStr\n page.vOrderHost.textContent = order.host\n if (order.isLimit) {\n Doc.show(page.verifyLimit)\n Doc.hide(page.verifyMarket)\n const orderDesc = `Limit ${buySellStr} Order`\n page.vOrderType.textContent = order.tifnow ? orderDesc + ' (immediate)' : orderDesc\n page.vRate.textContent = Doc.formatCoinValue(order.rate / this.market.rateConversionFactor)\n page.vQty.textContent = Doc.formatCoinValue(order.qty, baseAsset.unitInfo)\n const total = order.rate / OrderUtil.RateEncodingFactor * order.qty\n page.vTotal.textContent = Doc.formatCoinValue(total, quoteAsset.unitInfo)\n // Format total fiat value.\n this.showFiatValue(quoteAsset.id, total, page.vFiatTotal)\n } else {\n Doc.hide(page.verifyLimit)\n Doc.show(page.verifyMarket)\n page.vOrderType.textContent = `Market ${buySellStr} Order`\n const ui = order.sell ? this.market.baseUnitInfo : this.market.quoteUnitInfo\n page.vmFromTotal.textContent = Doc.formatCoinValue(order.qty, ui)\n page.vmFromAsset.textContent = fromAsset.symbol.toUpperCase()\n // Format fromAsset fiat value.\n this.showFiatValue(fromAsset.id, order.qty, page.vmFromTotalFiat)\n const gap = this.midGap()\n if (gap) {\n Doc.show(page.vMarketEstimate)\n const received = order.sell ? order.qty * gap : order.qty / gap\n page.vmToTotal.textContent = Doc.formatCoinValue(received, toAsset.unitInfo)\n page.vmToAsset.textContent = toAsset.symbol.toUpperCase()\n // Format received value to fiat equivalent.\n this.showFiatValue(toAsset.id, received, page.vmTotalFiat)\n } else {\n Doc.hide(page.vMarketEstimate)\n }\n }\n // Visually differentiate between buy/sell orders.\n if (isSell) {\n page.vHeader.classList.add(sellBtnClass)\n page.vHeader.classList.remove(buyBtnClass)\n page.vSubmit.classList.add(sellBtnClass)\n page.vSubmit.classList.remove(buyBtnClass)\n } else {\n page.vHeader.classList.add(buyBtnClass)\n page.vHeader.classList.remove(sellBtnClass)\n page.vSubmit.classList.add(buyBtnClass)\n page.vSubmit.classList.remove(sellBtnClass)\n }\n this.showVerifyForm()\n\n if (baseAsset.wallet.open && quoteAsset.wallet.open) this.preOrder(order)\n else {\n Doc.hide(page.vPreorder)\n this.unlockWalletsForEstimates()\n }\n }\n\n // showFiatValue displays the fiat equivalent for an order quantity.\n showFiatValue (assetID: number, qty: number, display: PageElement) {\n if (display) {\n const rate = app().fiatRatesMap[assetID]\n display.textContent = Doc.formatFiatConversion(qty, rate, app().unitInfo(assetID))\n if (rate) Doc.show(display.parentElement as Element)\n else Doc.hide(display.parentElement as Element)\n }\n }\n\n /* showVerifyForm displays form to verify an order */\n async showVerifyForm () {\n const page = this.page\n Doc.hide(page.vErr)\n this.forms.show(page.verifyForm)\n }\n\n /*\n * unlockWalletsForEstimates unlocks any locked wallets with the provided\n * password.\n */\n async unlockWalletsForEstimates () {\n const page = this.page\n const loaded = app().loading(page.verifyForm)\n await this.unlockMarketWallets()\n loaded()\n Doc.show(page.vPreorder)\n this.preOrder(this.parseOrder())\n }\n\n async unlockWallet (assetID: number) {\n const res = await postJSON('/api/openwallet', { assetID })\n if (!app().checkResponse(res)) {\n throw Error('error unlocking wallet ' + res.msg)\n }\n this.balanceWgt.updateAsset(assetID)\n }\n\n /*\n * unlockMarketWallets unlocks both the base and quote wallets for the current\n * market, if locked.\n */\n async unlockMarketWallets () {\n const { base, quote } = this.market\n const assetIDs = []\n if (!base.wallet.open) assetIDs.push(base.id)\n if (!quote.wallet.open) assetIDs.push(quote.id)\n for (const assetID of assetIDs) {\n this.unlockWallet(assetID)\n }\n }\n\n /* fetchPreorder fetches the pre-order estimates and options. */\n async fetchPreorder (order: TradeForm) {\n const page = this.page\n const cacheKey = JSON.stringify(order.options)\n const cached = this.preorderCache[cacheKey]\n if (cached) return cached\n\n Doc.hide(page.vPreorderErr)\n const loaded = app().loading(page.verifyForm)\n const res = await postJSON('/api/preorder', wireOrder(order))\n loaded()\n if (!app().checkResponse(res)) return { err: res.msg }\n this.preorderCache[cacheKey] = res.estimate\n return res.estimate\n }\n\n /*\n * setPreorderErr sets and displays the pre-order error message and hides the\n * pre-order details box.\n */\n setPreorderErr (msg: string) {\n const page = this.page\n Doc.hide(page.vPreorder)\n Doc.show(page.vPreorderErr)\n page.vPreorderErrTip.dataset.tooltip = msg\n }\n\n showPreOrderAdvancedOptions () {\n const page = this.page\n Doc.hide(page.showAdvancedOptions)\n Doc.show(page.hideAdvancedOptions, page.vOtherOrderOpts)\n }\n\n hidePreOrderAdvancedOptions () {\n const page = this.page\n Doc.hide(page.hideAdvancedOptions, page.vOtherOrderOpts)\n Doc.show(page.showAdvancedOptions)\n }\n\n reloadOrderOpts (order: TradeForm, swap: PreSwap, redeem: PreRedeem, changed: ()=>void) {\n const page = this.page\n Doc.empty(page.vDefaultOrderOpts, page.vOtherOrderOpts)\n const addOption = (opt: OrderOption, isSwap: boolean) => {\n const el = OrderUtil.optionElement(opt, order, changed, isSwap)\n if (opt.showByDefault) page.vDefaultOrderOpts.appendChild(el)\n else page.vOtherOrderOpts.appendChild(el)\n }\n for (const opt of swap.options || []) addOption(opt, true)\n for (const opt of redeem.options || []) addOption(opt, false)\n app().bindTooltips(page.vDefaultOrderOpts)\n app().bindTooltips(page.vOtherOrderOpts)\n }\n\n /* preOrder loads the options and fetches pre-order estimates */\n async preOrder (order: TradeForm) {\n const page = this.page\n\n // Add swap options.\n const refreshPreorder = async () => {\n const res: APIResponse = await this.fetchPreorder(order)\n if (res.err) return this.setPreorderErr(res.err)\n const est = (res as any) as OrderEstimate\n Doc.hide(page.vPreorderErr)\n Doc.show(page.vPreorder)\n const { swap, redeem } = est\n swap.options = swap.options || []\n redeem.options = redeem.options || []\n this.setFeeEstimates(swap, redeem, order)\n\n const changed = async () => {\n await refreshPreorder()\n Doc.animate(400, progress => {\n page.vFeeSummary.style.backgroundColor = `rgba(128, 128, 128, ${0.5 - 0.5 * progress})`\n })\n }\n // bind show or hide advanced pre order options.\n Doc.bind(page.showAdvancedOptions, 'click', () => { this.showPreOrderAdvancedOptions() })\n Doc.bind(page.hideAdvancedOptions, 'click', () => { this.hidePreOrderAdvancedOptions() })\n this.reloadOrderOpts(order, swap, redeem, changed)\n }\n\n refreshPreorder()\n }\n\n /* setFeeEstimates sets all of the pre-order estimate fields */\n setFeeEstimates (swap: PreSwap, redeem: PreRedeem, order: TradeForm) {\n const { page, market } = this\n if (!swap.estimate || !redeem.estimate) {\n Doc.hide(page.vPreorderEstimates)\n return // preOrder may return just options, no fee estimates\n }\n Doc.show(page.vPreorderEstimates)\n const { baseUnitInfo, quoteUnitInfo, rateConversionFactor } = market\n const fmtPct = (value: number) => {\n if (value < 0.05) return '< 0.1'\n return percentFormatter.format(value)\n }\n\n // If the asset is a token, in order to calculate the fee as a percentage\n // of the total order, we try to use the fiat rates to find out the\n // exchange rate between the token and parent assets.\n // Initially these are set to 1, which we would use if the asset is not a\n // token and no conversion is needed.\n let baseExchangeRate = 1\n let quoteExchangeRate = 1\n let baseFeeAssetUI = baseUnitInfo\n let quoteFeeAssetUI = quoteUnitInfo\n\n if (market.base.token) {\n const parent = app().assets[market.base.token.parentID]\n baseFeeAssetUI = parent.unitInfo\n const tokenFiatRate = app().fiatRatesMap[market.base.id]\n const parentFiatRate = app().fiatRatesMap[parent.id]\n if (tokenFiatRate && parentFiatRate) {\n const conventionalRate = parentFiatRate / tokenFiatRate\n baseExchangeRate = conventionalRate * baseUnitInfo.conventional.conversionFactor / parent.unitInfo.conventional.conversionFactor\n } else {\n baseExchangeRate = 0\n }\n }\n\n if (market.quote.token) {\n const parent = app().assets[market.quote.token.parentID]\n quoteFeeAssetUI = parent.unitInfo\n const tokenFiatRate = app().fiatRatesMap[market.quote.id]\n const parentFiatRate = app().fiatRatesMap[parent.id]\n if (tokenFiatRate && parentFiatRate) {\n const conventionalRate = parentFiatRate / tokenFiatRate\n quoteExchangeRate = conventionalRate * quoteUnitInfo.conventional.conversionFactor / parent.unitInfo.conventional.conversionFactor\n } else {\n quoteExchangeRate = 0\n }\n }\n\n let [toFeeAssetUI, fromFeeAssetUI] = [baseFeeAssetUI, quoteFeeAssetUI]\n let [toExchangeRate, fromExchangeRate] = [baseExchangeRate, quoteExchangeRate]\n if (this.currentOrder.sell) {\n [fromFeeAssetUI, toFeeAssetUI] = [toFeeAssetUI, fromFeeAssetUI];\n [fromExchangeRate, toExchangeRate] = [toExchangeRate, fromExchangeRate]\n }\n\n const swapped = swap.estimate.value || 0\n const swappedInParentUnits = fromExchangeRate > 0 ? swapped / fromExchangeRate : swapped\n\n // Set swap fee estimates in the details pane.\n const bestSwapPct = swap.estimate.realisticBestCase / swappedInParentUnits * 100\n page.vSwapFeesLowPct.textContent = fromExchangeRate <= 0 ? '' : `(${fmtPct(bestSwapPct)}%)`\n page.vSwapFeesLow.textContent = Doc.formatCoinValue(swap.estimate.realisticBestCase, fromFeeAssetUI)\n\n const worstSwapPct = swap.estimate.realisticWorstCase / swappedInParentUnits * 100\n page.vSwapFeesHighPct.textContent = fromExchangeRate <= 0 ? '' : `(${fmtPct(worstSwapPct)}%)`\n page.vSwapFeesHigh.textContent = Doc.formatCoinValue(swap.estimate.realisticWorstCase, fromFeeAssetUI)\n\n const swapFeesMaxPct = swap.estimate.maxFees / swappedInParentUnits * 100\n page.vSwapFeesMaxPct.textContent = fromExchangeRate <= 0 ? '' : `(${fmtPct(swapFeesMaxPct)}%)`\n page.vSwapFeesMax.textContent = Doc.formatCoinValue(swap.estimate.maxFees, fromFeeAssetUI)\n\n // Set redemption fee estimates in the details pane.\n const midGap = this.midGap()\n const estRate = midGap || order.rate / rateConversionFactor\n const received = order.sell ? swapped * estRate : swapped / estRate\n const receivedInParentUnits = toExchangeRate > 0 ? received / toExchangeRate : received\n\n const bestRedeemPct = redeem.estimate.realisticBestCase / receivedInParentUnits * 100\n page.vRedeemFeesLowPct.textContent = toExchangeRate <= 0 ? '' : `(${fmtPct(bestRedeemPct)}%)`\n page.vRedeemFeesLow.textContent = Doc.formatCoinValue(redeem.estimate.realisticBestCase, toFeeAssetUI)\n\n const worstRedeemPct = redeem.estimate.realisticWorstCase / receivedInParentUnits * 100\n page.vRedeemFeesHighPct.textContent = toExchangeRate <= 0 ? '' : `(${fmtPct(worstRedeemPct)}%)`\n page.vRedeemFeesHigh.textContent = Doc.formatCoinValue(redeem.estimate.realisticWorstCase, toFeeAssetUI)\n\n if (baseExchangeRate && quoteExchangeRate) {\n Doc.show(page.vFeeSummaryPct)\n Doc.hide(page.vFeeSummary)\n page.vFeeSummaryLow.textContent = fmtPct(bestSwapPct + bestRedeemPct)\n page.vFeeSummaryHigh.textContent = fmtPct(worstSwapPct + worstRedeemPct)\n } else {\n Doc.hide(page.vFeeSummaryPct)\n Doc.show(page.vFeeSummary)\n page.summarySwapFeesLow.textContent = page.vSwapFeesLow.textContent\n page.summarySwapFeesHigh.textContent = page.vSwapFeesHigh.textContent\n page.summaryRedeemFeesLow.textContent = page.vRedeemFeesLow.textContent\n page.summaryRedeemFeesHigh.textContent = page.vRedeemFeesHigh.textContent\n }\n }\n\n async submitCancel () {\n // this will be the page.cancelSubmit button (evt.currentTarget)\n const page = this.page\n const cancelData = this.cancelData\n const order = cancelData.order\n const req = {\n orderID: order.id\n }\n // Toggle the loader and submit button.\n const loaded = app().loading(page.cancelSubmit)\n const res = await postJSON('/api/cancel', req)\n loaded()\n // Display error on confirmation modal.\n if (!app().checkResponse(res)) {\n page.cancelErr.textContent = res.msg\n Doc.show(page.cancelErr)\n return\n }\n // Hide confirmation modal only on success.\n Doc.hide(cancelData.bttn, page.forms)\n order.cancelling = true\n }\n\n /* showCancel shows a form to confirm submission of a cancel order. */\n showCancel (row: HTMLElement, orderID: string) {\n const ord = this.metaOrders[orderID].ord\n const page = this.page\n const remaining = ord.qty - ord.filled\n const asset = OrderUtil.isMarketBuy(ord) ? this.market.quote : this.market.base\n page.cancelRemain.textContent = Doc.formatCoinValue(remaining, asset.unitInfo)\n page.cancelUnit.textContent = asset.symbol.toUpperCase()\n Doc.hide(page.cancelErr)\n this.forms.show(page.cancelForm)\n this.cancelData = {\n bttn: Doc.tmplElement(row, 'cancelBttn'),\n order: ord\n }\n }\n\n /* showAccelerate shows the accelerate order form. */\n showAccelerate (order: Order) {\n const loaded = app().loading(this.main)\n this.accelerateOrderForm.refresh(order)\n loaded()\n this.forms.show(this.page.accelerateForm)\n }\n\n /* showCreate shows the new wallet creation form. */\n showCreate (asset: SupportedAsset) {\n const page = this.page\n this.currentCreate = asset\n this.newWalletForm.setAsset(asset.id)\n this.forms.show(page.newWalletForm)\n }\n\n /*\n * stepSubmit will examine the current state of wallets and step the user\n * through the process of order submission.\n * NOTE: I expect this process will be streamlined soon such that the wallets\n * will attempt to be unlocked in the order submission process, negating the\n * need to unlock ahead of time.\n */\n stepSubmit () {\n const page = this.page\n const market = this.market\n Doc.hide(page.orderErr)\n if (!this.validateOrder(this.parseOrder())) return\n const baseWallet = app().walletMap[market.base.id]\n const quoteWallet = app().walletMap[market.quote.id]\n if (!baseWallet) {\n page.orderErr.textContent = intl.prep(intl.ID_NO_ASSET_WALLET, { asset: market.base.symbol })\n Doc.show(page.orderErr)\n return\n }\n if (!quoteWallet) {\n page.orderErr.textContent = intl.prep(intl.ID_NO_ASSET_WALLET, { asset: market.quote.symbol })\n Doc.show(page.orderErr)\n return\n }\n this.showVerify()\n }\n\n /* Display a deposit address. */\n async showDeposit (assetID: number) {\n this.depositAddrForm.setAsset(assetID)\n this.forms.show(this.page.deposit)\n }\n\n showCustomProviderDialog (assetID: number) {\n app().loadPage('wallets', { promptProvider: assetID, goBack: 'markets' })\n }\n\n /*\n * handlePriceUpdate is the handler for the 'spots' notification.\n */\n handlePriceUpdate (note: SpotPriceNote) {\n if (!this.market) return // This note can arrive before the market is set.\n if (note.host === this.market.dex.host && note.spots[this.market.cfg.name]) {\n this.setCurrMarketPrice()\n }\n this.marketList.updateSpots(note)\n }\n\n async handleWalletState (note: WalletStateNote) {\n if (!this.market) return // This note can arrive before the market is set.\n // if (note.topic !== 'TokenApproval') return\n if (note.wallet.assetID !== this.market.base?.id && note.wallet.assetID !== this.market.quote?.id) return\n this.setTokenApprovalVisibility()\n this.resolveOrderFormVisibility()\n }\n\n /*\n * handleBondUpdate is the handler for the 'bondpost' notification type.\n * This is used to update the registration status of the current exchange.\n */\n async handleBondUpdate (note: BondNote) {\n const dexAddr = note.dex\n if (!this.market) return // This note can arrive before the market is set.\n if (dexAddr !== this.market.dex.host) return\n // If we just finished legacy registration, we need to update the Exchange.\n // TODO: Use tier change notification once available.\n if (note.topic === 'AccountRegistered') await app().fetchUser()\n // Update local copy of Exchange.\n this.market.dex = app().exchanges[dexAddr]\n this.setRegistrationStatusVisibility()\n this.updateReputation()\n }\n\n updateReputation () {\n const { page, market: { dex: { host }, cfg: mkt, baseCfg: { unitInfo: bui }, quoteCfg: { unitInfo: qui } } } = this\n const { auth } = app().exchanges[host]\n\n page.parcelSizeLots.textContent = String(mkt.parcelsize)\n page.marketLimitBase.textContent = Doc.formatFourSigFigs(mkt.parcelsize * mkt.lotsize / bui.conventional.conversionFactor)\n page.marketLimitBaseUnit.textContent = bui.conventional.unit\n page.marketLimitQuoteUnit.textContent = qui.conventional.unit\n const conversionRate = this.anyRate()[1]\n if (conversionRate) {\n const quoteLot = mkt.lotsize * conversionRate\n page.marketLimitQuote.textContent = Doc.formatFourSigFigs(mkt.parcelsize * quoteLot / qui.conventional.conversionFactor)\n } else page.marketLimitQuote.textContent = '-'\n\n const tier = strongTier(auth)\n page.tradingTier.textContent = String(tier)\n const [usedParcels, parcelLimit] = tradingLimits(host)\n page.tradingLimit.textContent = (parcelLimit * mkt.parcelsize).toFixed(2)\n page.limitUsage.textContent = parcelLimit > 0 ? (usedParcels / parcelLimit * 100).toFixed(1) : '0'\n\n page.orderLimitRemain.textContent = ((parcelLimit - usedParcels) * mkt.parcelsize).toFixed(1)\n page.orderTradingTier.textContent = String(tier)\n\n this.reputationMeter.update()\n }\n\n /*\n * anyRate finds the best rate from any of, in order of priority, the order\n * book, the server's reported spot rate, or the fiat exchange rates. A\n * 3-tuple of message-rate encoding, a conversion rate, and a conventional\n * rate is generated.\n */\n anyRate (): [number, number, number] {\n const { cfg: { spot }, baseCfg: { id: baseID }, quoteCfg: { id: quoteID }, rateConversionFactor, bookLoaded } = this.market\n if (bookLoaded) {\n const midGap = this.midGap()\n if (midGap) return [midGap * OrderUtil.RateEncodingFactor, midGap, this.midGapConventional() || 0]\n }\n if (spot && spot.rate) return [spot.rate, spot.rate / OrderUtil.RateEncodingFactor, spot.rate / rateConversionFactor]\n const [baseUSD, quoteUSD] = [app().fiatRatesMap[baseID], app().fiatRatesMap[quoteID]]\n if (baseUSD && quoteUSD) {\n const conventionalRate = baseUSD / quoteUSD\n const msgRate = conventionalRate * rateConversionFactor\n const conversionRate = msgRate / OrderUtil.RateEncodingFactor\n return [msgRate, conversionRate, conventionalRate]\n }\n return [0, 0, 0]\n }\n\n handleMatchNote (note: MatchNote) {\n const mord = this.metaOrders[note.orderID]\n const match = note.match\n if (!mord) return this.refreshActiveOrders()\n else if (mord.ord.type === OrderUtil.Market && match.status === OrderUtil.NewlyMatched) { // Update the average market rate display.\n // Fetch and use the updated order.\n const ord = app().order(note.orderID)\n if (ord) mord.details.rate.textContent = mord.header.rate.textContent = this.marketOrderRateString(ord, this.market)\n }\n if (\n (match.side === OrderUtil.MatchSideMaker && match.status === OrderUtil.MakerRedeemed) ||\n (match.side === OrderUtil.MatchSideTaker && match.status === OrderUtil.MatchComplete)\n ) this.updateReputation()\n if (app().canAccelerateOrder(mord.ord)) Doc.show(mord.details.accelerateBttn)\n else Doc.hide(mord.details.accelerateBttn)\n }\n\n /*\n * handleOrderNote is the handler for the 'order'-type notification, which are\n * used to update a user's order's status.\n */\n handleOrderNote (note: OrderNote) {\n const ord = note.order\n const mord = this.metaOrders[ord.id]\n // - If metaOrder doesn't exist for the given order it means it was created\n // via bwctl and the GUI isn't aware of it or it was an inflight order.\n // refreshActiveOrders must be called to grab this order.\n // - If an OrderLoaded notification is recieved, it means an order that was\n // previously not \"ready to tick\" (due to its wallets not being connected\n // and unlocked) has now become ready to tick. The active orders section\n // needs to be refreshed.\n const wasInflight = note.topic === 'AsyncOrderFailure' || note.topic === 'AsyncOrderSubmitted'\n if (!mord || wasInflight || (note.topic === 'OrderLoaded' && ord.readyToTick)) {\n return this.refreshActiveOrders()\n }\n const oldStatus = mord.ord.status\n mord.ord = ord\n if (note.topic === 'MissedCancel') Doc.show(mord.details.cancelBttn)\n if (ord.filled === ord.qty) Doc.hide(mord.details.cancelBttn)\n if (app().canAccelerateOrder(ord)) Doc.show(mord.details.accelerateBttn)\n else Doc.hide(mord.details.accelerateBttn)\n this.updateMetaOrder(mord)\n // Only reset markers if there is a change, since the chart is redrawn.\n if (\n (oldStatus === OrderUtil.StatusEpoch && ord.status === OrderUtil.StatusBooked) ||\n (oldStatus === OrderUtil.StatusBooked && ord.status > OrderUtil.StatusBooked)\n ) {\n this.setDepthMarkers()\n this.updateReputation()\n this.mm.readBook()\n }\n }\n\n /*\n * handleEpochNote handles notifications signalling the start of a new epoch.\n */\n handleEpochNote (note: EpochNote) {\n app().log('book', 'handleEpochNote:', note)\n if (!this.market) return // This note can arrive before the market is set.\n if (note.host !== this.market.dex.host || note.marketID !== this.market.sid) return\n if (this.book) {\n this.book.setEpoch(note.epoch)\n this.depthChart.draw()\n }\n\n this.clearOrderTableEpochs()\n for (const { ord, details, header } of Object.values(this.metaOrders)) {\n const alreadyMatched = note.epoch > ord.epoch\n switch (true) {\n case ord.type === OrderUtil.Limit && ord.status === OrderUtil.StatusEpoch && alreadyMatched: {\n const status = ord.tif === OrderUtil.ImmediateTiF ? intl.prep(intl.ID_EXECUTED) : intl.prep(intl.ID_BOOKED)\n details.status.textContent = header.status.textContent = status\n ord.status = ord.tif === OrderUtil.ImmediateTiF ? OrderUtil.StatusExecuted : OrderUtil.StatusBooked\n break\n }\n case ord.type === OrderUtil.Market && ord.status === OrderUtil.StatusEpoch:\n // Technically don't know if this should be 'executed' or 'settling'.\n details.status.textContent = header.status.textContent = intl.prep(intl.ID_EXECUTED)\n ord.status = OrderUtil.StatusExecuted\n break\n }\n }\n }\n\n /*\n * recentMatchesSortCompare returns sort compare function according to the active\n * sort key and direction.\n */\n recentMatchesSortCompare () {\n switch (this.recentMatchesSortKey) {\n case 'rate':\n return (a: RecentMatch, b: RecentMatch) => this.recentMatchesSortDirection * (a.rate - b.rate)\n case 'qty':\n return (a: RecentMatch, b: RecentMatch) => this.recentMatchesSortDirection * (a.qty - b.qty)\n case 'age':\n return (a: RecentMatch, b:RecentMatch) => this.recentMatchesSortDirection * (a.stamp - b.stamp)\n }\n }\n\n refreshRecentMatchesTable () {\n const page = this.page\n const recentMatches = this.recentMatches\n Doc.empty(page.recentMatchesLiveList)\n if (!recentMatches) return\n const compare = this.recentMatchesSortCompare()\n recentMatches.sort(compare)\n for (const match of recentMatches) {\n const row = page.recentMatchesTemplate.cloneNode(true) as HTMLElement\n const tmpl = Doc.parseTemplate(row)\n app().bindTooltips(row)\n tmpl.rate.textContent = Doc.formatCoinValue(match.rate / this.market.rateConversionFactor)\n tmpl.qty.textContent = Doc.formatCoinValue(match.qty, this.market.baseUnitInfo)\n tmpl.age.textContent = Doc.timeSince(match.stamp)\n tmpl.age.dataset.sinceStamp = String(match.stamp)\n row.classList.add(match.sell ? 'sellcolor' : 'buycolor')\n page.recentMatchesLiveList.append(row)\n }\n }\n\n addRecentMatches (matches: RecentMatch[]) {\n this.recentMatches = [...matches, ...this.recentMatches].slice(0, 100)\n }\n\n /* handleBalanceNote handles notifications updating a wallet's balance. */\n handleBalanceNote (note: BalanceNote) {\n this.approveTokenForm.handleBalanceNote(note)\n this.preorderCache = {} // invalidate previous preorder results\n // if connection to dex server fails, it is not possible to retrieve\n // markets.\n const mkt = this.market\n if (!mkt || !mkt.dex || mkt.dex.connectionStatus !== ConnectionStatus.Connected) return\n\n this.mm.handleBalanceNote(note)\n const wgt = this.balanceWgt\n // Display the widget if the balance note is for its base or quote wallet.\n if ((note.assetID === wgt.base.id || note.assetID === wgt.quote.id)) wgt.setBalanceVisibility(true)\n\n // If there's a balance update, refresh the max order section.\n const avail = note.balance.available\n switch (note.assetID) {\n case mkt.baseCfg.id:\n // If we're not showing the max order panel yet, don't do anything.\n if (!mkt.maxSell) break\n if (typeof mkt.sellBalance === 'number' && mkt.sellBalance !== avail) mkt.maxSell = null\n if (this.isSell()) this.preSell()\n break\n case mkt.quoteCfg.id:\n if (!Object.keys(mkt.maxBuys).length) break\n if (typeof mkt.buyBalance === 'number' && mkt.buyBalance !== avail) mkt.maxBuys = {}\n if (!this.isSell()) this.preBuy()\n }\n }\n\n /*\n * submitOrder is attached to the affirmative button on the order validation\n * form. Clicking the button is the last step in the order submission process.\n */\n async submitOrder () {\n const page = this.page\n Doc.hide(page.orderErr, page.vErr)\n const order = this.currentOrder\n const req = { order: wireOrder(order) }\n if (!this.validateOrder(order)) return\n // Show loader and hide submit button.\n page.vSubmit.classList.add('d-hide')\n page.vLoader.classList.remove('d-hide')\n const res = await postJSON('/api/tradeasync', req)\n // Hide loader and show submit button.\n page.vSubmit.classList.remove('d-hide')\n page.vLoader.classList.add('d-hide')\n // If error, display error on confirmation modal.\n if (!app().checkResponse(res)) {\n page.vErr.textContent = res.msg\n Doc.show(page.vErr)\n return\n }\n // Hide confirmation modal only on success.\n Doc.hide(page.forms)\n this.refreshActiveOrders()\n }\n\n /*\n * createWallet is attached to successful submission of the wallet creation\n * form. createWallet is only called once the form is submitted and a success\n * response is received from the client.\n */\n async createWallet () {\n const user = await app().fetchUser()\n if (!user) return\n const asset = user.assets[this.currentCreate.id]\n Doc.hide(this.page.forms)\n const mkt = this.market\n if (mkt.baseCfg.id === asset.id) mkt.base = asset\n else if (mkt.quoteCfg.id === asset.id) mkt.quote = asset\n this.balanceWgt.updateAsset(asset.id)\n this.displayMessageIfMissingWallet()\n this.resolveOrderFormVisibility()\n }\n\n /* lotChanged is attached to the keyup and change events of the lots input. */\n lotChanged () {\n const page = this.page\n const lots = parseInt(page.lotField.value || '0')\n if (lots <= 0) {\n page.lotField.value = page.lotField.value === '' ? '' : '0'\n page.qtyField.value = ''\n this.previewQuoteAmt(false)\n this.setOrderBttnEnabled(false, intl.prep(intl.ID_ORDER_BUTTON_QTY_ERROR))\n return\n }\n const lotSize = this.market.cfg.lotsize\n const orderQty = lots * lotSize\n page.lotField.value = String(lots)\n // Conversion factor must be a multiple of 10.\n page.qtyField.value = String(orderQty / this.market.baseUnitInfo.conventional.conversionFactor)\n\n if (!this.isLimit() && this.isSell()) {\n const baseWallet = app().assets[this.market.base.id].wallet\n this.setOrderBttnEnabled(orderQty <= baseWallet.balance.available, intl.prep(intl.ID_ORDER_BUTTON_SELL_BALANCE_ERROR))\n }\n this.previewQuoteAmt(true)\n }\n\n /*\n * quantityChanged is attached to the keyup and change events of the quantity\n * input.\n */\n quantityChanged (finalize: boolean) {\n const page = this.page\n const order = this.currentOrder = this.parseOrder()\n if (order.qty < 0) {\n page.lotField.value = '0'\n page.qtyField.value = ''\n this.previewQuoteAmt(false)\n return\n }\n const lotSize = this.market.cfg.lotsize\n const lots = Math.floor(order.qty / lotSize)\n const adjusted = order.qty = this.currentOrder.qty = lots * lotSize\n page.lotField.value = String(lots)\n\n if (!order.isLimit && !order.sell) return\n\n // Conversion factor must be a multiple of 10.\n if (finalize) page.qtyField.value = String(adjusted / this.market.baseUnitInfo.conventional.conversionFactor)\n this.previewQuoteAmt(true)\n }\n\n /*\n * marketBuyChanged is attached to the keyup and change events of the quantity\n * input for the market-buy form.\n */\n marketBuyChanged () {\n const page = this.page\n const qty = convertToAtoms(page.mktBuyField.value || '', this.market.quoteUnitInfo.conventional.conversionFactor)\n const gap = this.midGap()\n if (qty > 0) {\n const quoteWallet = app().assets[this.market.quote.id].wallet\n this.setOrderBttnEnabled(qty <= quoteWallet.balance.available, intl.prep(intl.ID_ORDER_BUTTON_BUY_BALANCE_ERROR))\n } else {\n this.setOrderBttnEnabled(false, intl.prep(intl.ID_ORDER_BUTTON_QTY_ERROR))\n }\n if (!gap || !qty) {\n page.mktBuyLots.textContent = '0'\n page.mktBuyScore.textContent = '0'\n return\n }\n const lotSize = this.market.cfg.lotsize\n const received = qty / gap\n const lots = (received / lotSize)\n page.mktBuyLots.textContent = lots.toFixed(1)\n page.mktBuyScore.textContent = Doc.formatCoinValue(received, this.market.baseUnitInfo)\n }\n\n /*\n * rateFieldChanged is attached to the keyup and change events of the rate\n * input.\n */\n rateFieldChanged () {\n // Truncate to rate step. If it is a market buy order, do not adjust.\n const adjusted = this.adjustedRate()\n if (adjusted <= 0) {\n this.depthLines.input = []\n this.drawChartLines()\n this.page.rateField.value = '0'\n this.previewQuoteAmt(true)\n this.updateOrderBttnState()\n return\n }\n const order = this.currentOrder = this.parseOrder()\n const r = adjusted / this.market.rateConversionFactor\n this.page.rateField.value = String(r)\n this.depthLines.input = [{\n rate: r,\n color: order.sell ? this.depthChart.theme.sellLine : this.depthChart.theme.buyLine\n }]\n this.drawChartLines()\n this.previewQuoteAmt(true)\n this.updateOrderBttnState()\n }\n\n /*\n * adjustedRate is the current rate field rate, rounded down to a\n * multiple of rateStep.\n */\n adjustedRate (): number {\n const v = this.page.rateField.value\n if (!v) return NaN\n const rate = convertToAtoms(v, this.market.rateConversionFactor)\n const rateStep = this.market.cfg.ratestep\n return rate - (rate % rateStep)\n }\n\n /* loadTable reloads the table from the current order book information. */\n loadTable () {\n this.loadTableSide(true)\n this.loadTableSide(false)\n }\n\n /* binOrdersByRateAndEpoch takes a list of sorted orders and returns the\n same orders grouped into arrays. The orders are grouped by their rate\n and whether or not they are epoch queue orders. Epoch queue orders\n will come after non epoch queue orders with the same rate. */\n binOrdersByRateAndEpoch (orders: MiniOrder[]) {\n if (!orders || !orders.length) return []\n const bins = []\n let currEpochBin = []\n let currNonEpochBin = []\n let currRate = orders[0].msgRate\n if (orders[0].epoch) currEpochBin.push(orders[0])\n else currNonEpochBin.push(orders[0])\n for (let i = 1; i < orders.length; i++) {\n if (orders[i].msgRate !== currRate) {\n bins.push(currNonEpochBin)\n bins.push(currEpochBin)\n currEpochBin = []\n currNonEpochBin = []\n currRate = orders[i].msgRate\n }\n if (orders[i].epoch) currEpochBin.push(orders[i])\n else currNonEpochBin.push(orders[i])\n }\n bins.push(currNonEpochBin)\n bins.push(currEpochBin)\n return bins.filter(bin => bin.length > 0)\n }\n\n /* loadTables loads the order book side into its table. */\n loadTableSide (sell: boolean) {\n const bookSide = sell ? this.book.sells : this.book.buys\n const tbody = sell ? this.page.sellRows : this.page.buyRows\n Doc.empty(tbody)\n if (!bookSide || !bookSide.length) return\n const orderBins = this.binOrdersByRateAndEpoch(bookSide)\n orderBins.forEach(bin => { tbody.appendChild(this.orderTableRow(bin)) })\n }\n\n /* addTableOrder adds a single order to the appropriate table. */\n addTableOrder (order: MiniOrder) {\n const tbody = order.sell ? this.page.sellRows : this.page.buyRows\n let row = tbody.firstChild as OrderRow\n // Handle market order differently.\n if (order.rate === 0) {\n if (order.qtyAtomic === 0) return // a cancel order. TODO: maybe make an indicator on the target order, maybe gray out\n // This is a market order.\n if (row && row.manager.getRate() === 0) {\n row.manager.insertOrder(order)\n } else {\n row = this.orderTableRow([order])\n tbody.insertBefore(row, tbody.firstChild)\n }\n return\n }\n // Must be a limit order. Sort by rate. Skip the market order row.\n if (row && row.manager.getRate() === 0) row = row.nextSibling as OrderRow\n while (row) {\n if (row.manager.compare(order) === 0) {\n row.manager.insertOrder(order)\n return\n } else if (row.manager.compare(order) > 0) {\n const tr = this.orderTableRow([order])\n tbody.insertBefore(tr, row)\n return\n }\n row = row.nextSibling as OrderRow\n }\n const tr = this.orderTableRow([order])\n tbody.appendChild(tr)\n }\n\n /* removeTableOrder removes a single order from its table. */\n removeTableOrder (order: MiniOrder) {\n const token = order.token\n for (const tbody of [this.page.sellRows, this.page.buyRows]) {\n for (const tr of (Array.from(tbody.children) as OrderRow[])) {\n if (tr.manager.removeOrder(token)) {\n return\n }\n }\n }\n }\n\n /* updateTableOrder looks for the order in the table and updates the qty */\n updateTableOrder (u: RemainderUpdate) {\n for (const tbody of [this.page.sellRows, this.page.buyRows]) {\n for (const tr of (Array.from(tbody.children) as OrderRow[])) {\n if (tr.manager.updateOrderQty(u)) {\n return\n }\n }\n }\n }\n\n /*\n * clearOrderTableEpochs removes immediate-tif orders whose epoch has expired.\n */\n clearOrderTableEpochs () {\n this.clearOrderTableEpochSide(this.page.sellRows)\n this.clearOrderTableEpochSide(this.page.buyRows)\n }\n\n /*\n * clearOrderTableEpochs removes immediate-tif orders whose epoch has expired\n * for a single side.\n */\n clearOrderTableEpochSide (tbody: HTMLElement) {\n for (const tr of (Array.from(tbody.children)) as OrderRow[]) {\n tr.manager.removeEpochOrders()\n }\n }\n\n /*\n * orderTableRow creates a new <tr> element to insert into an order table.\n Takes a bin of orders with the same rate, and displays the total quantity.\n */\n orderTableRow (orderBin: MiniOrder[]): OrderRow {\n const tr = this.page.orderRowTmpl.cloneNode(true) as OrderRow\n const { baseUnitInfo, quoteUnitInfo, rateConversionFactor, cfg: { ratestep: rateStep } } = this.market\n const manager = new OrderTableRowManager(tr, orderBin, baseUnitInfo, quoteUnitInfo, rateStep)\n tr.manager = manager\n bind(tr, 'click', () => {\n this.reportDepthClick(tr.manager.getRate() / rateConversionFactor)\n })\n if (tr.manager.getRate() !== 0) {\n Doc.bind(tr, 'mouseenter', () => {\n const chart = this.depthChart\n this.depthLines.hover = [{\n rate: tr.manager.getRate() / rateConversionFactor,\n color: tr.manager.isSell() ? chart.theme.sellLine : chart.theme.buyLine\n }]\n this.drawChartLines()\n })\n }\n return tr\n }\n\n /* handleConnNote handles the 'conn' notification.\n */\n async handleConnNote (note: ConnEventNote) {\n this.marketList.setConnectionStatus(note)\n if (note.topic === 'DEXDisabled' || note.topic === 'DEXEnabled' || note.connectionStatus === ConnectionStatus.Connected) {\n // Having been disconnected or connected from a DEX server, anything may\n // have changed, or this may be the first opportunity to get the server's\n // config, so fetch it all before reloading the markets page.\n await app().fetchUser()\n await app().loadPage('markets')\n }\n }\n\n /*\n * filterMarkets sets the display of markets in the markets list based on the\n * value of the search input.\n */\n filterMarkets () {\n const filterTxt = this.page.marketSearchV1.value?.toLowerCase()\n const filter = filterTxt ? (mkt: MarketRow) => mkt.name.includes(filterTxt) : () => true\n this.marketList.setFilter(filter)\n }\n\n /* drawChartLines draws the hover and input lines on the chart. */\n drawChartLines () {\n this.depthChart.setLines([...this.depthLines.hover, ...this.depthLines.input])\n this.depthChart.draw()\n }\n\n /* candleDurationSelected sets the candleDur and loads the candles. It will\n default to the oneHrBinKey if dur is not valid. */\n candleDurationSelected (dur: string) {\n if (!this.market?.dex?.candleDurs.includes(dur)) dur = oneHrBinKey\n this.candleDur = dur\n this.loadCandles()\n State.storeLocal(State.lastCandleDurationLK, dur)\n }\n\n /*\n * loadCandles loads the candles for the current candleDur. If a cache is already\n * active, the cache will be used without a loadcandles request.\n */\n loadCandles () {\n for (const bttn of Doc.kids(this.page.durBttnBox)) {\n if (bttn.textContent === this.candleDur) bttn.classList.add('selected')\n else bttn.classList.remove('selected')\n }\n const { candleCaches, cfg, baseUnitInfo, quoteUnitInfo } = this.market\n const cache = candleCaches[this.candleDur]\n if (cache) {\n // this.depthChart.hide()\n // this.candleChart.show()\n this.candleChart.setCandles(cache, cfg, baseUnitInfo, quoteUnitInfo)\n return\n }\n this.requestCandles()\n }\n\n /* requestCandles sends the loadcandles request. It accepts an optional candle\n * duration which will be requested if it is provided.\n */\n requestCandles (candleDur?: string) {\n this.candlesLoading = {\n loaded: () => { /* pass */ },\n timer: window.setTimeout(() => {\n if (this.candlesLoading) {\n this.candlesLoading = null\n console.error('candles not received')\n }\n }, 10000)\n }\n const { dex, baseCfg, quoteCfg } = this.market\n ws.request('loadcandles', { host: dex.host, base: baseCfg.id, quote: quoteCfg.id, dur: candleDur || this.candleDur })\n }\n\n /*\n * unload is called by the Application when the user navigates away from\n * the /markets page.\n */\n unload () {\n ws.request(unmarketRoute, {})\n ws.deregisterRoute(bookRoute)\n ws.deregisterRoute(bookOrderRoute)\n ws.deregisterRoute(unbookOrderRoute)\n ws.deregisterRoute(updateRemainingRoute)\n ws.deregisterRoute(epochOrderRoute)\n ws.deregisterRoute(candlesRoute)\n ws.deregisterRoute(candleUpdateRoute)\n this.depthChart.unattach()\n this.candleChart.unattach()\n Doc.unbind(document, 'keyup', this.keyup)\n clearInterval(this.secondTicker)\n }\n}\n\n/*\n * MarketList represents the list of exchanges and markets on the left side of\n * markets view. The MarketList provides utilities for adjusting the visibility\n * and sort order of markets.\n */\nclass MarketList {\n // xcSections: ExchangeSection[]\n div: PageElement\n rowTmpl: PageElement\n markets: MarketRow[]\n selected: MarketRow\n\n constructor (div: HTMLElement) {\n this.div = div\n this.rowTmpl = Doc.idel(div, 'marketTmplV1')\n Doc.cleanTemplates(this.rowTmpl)\n this.reloadMarketsPane()\n }\n\n updateSpots (note: SpotPriceNote) {\n for (const row of this.markets) {\n if (row.mkt.xc.host !== note.host) continue\n const xc = app().exchanges[row.mkt.xc.host]\n const mkt = xc.markets[row.mkt.name]\n setPriceAndChange(row.tmpl, xc, mkt)\n }\n }\n\n reloadMarketsPane (): void {\n Doc.empty(this.div)\n this.markets = []\n\n const addMarket = (mkt: ExchangeMarket) => {\n const bui = app().unitInfo(mkt.baseid, mkt.xc)\n const qui = app().unitInfo(mkt.quoteid, mkt.xc)\n const rateConversionFactor = OrderUtil.RateEncodingFactor / bui.conventional.conversionFactor * qui.conventional.conversionFactor\n const row = new MarketRow(this.rowTmpl, mkt, rateConversionFactor)\n this.div.appendChild(row.node)\n return row\n }\n\n for (const mkt of sortedMarkets()) this.markets.push(addMarket(mkt))\n app().bindTooltips(this.div)\n }\n\n find (host: string, baseID: number, quoteID: number): MarketRow | null {\n for (const row of this.markets) {\n if (row.mkt.xc.host === host && row.mkt.baseid === baseID && row.mkt.quoteid === quoteID) return row\n }\n return null\n }\n\n /* exists will be true if the specified market exists. */\n exists (host: string, baseID: number, quoteID: number): boolean {\n return this.find(host, baseID, quoteID) !== null\n }\n\n /* first gets the first market from the first exchange, alphabetically. */\n first (): MarketRow {\n return this.markets[0]\n }\n\n /* select sets the specified market as selected. */\n select (host: string, baseID: number, quoteID: number) {\n const row = this.find(host, baseID, quoteID)\n if (!row) return console.error(`select: no market row for ${host}, ${baseID}-${quoteID}`)\n for (const mkt of this.markets) mkt.node.classList.remove('selected')\n this.selected = row\n this.selected.node.classList.add('selected')\n }\n\n /* setConnectionStatus sets the visibility of the disconnected icon based\n * on the core.ConnEventNote.\n */\n setConnectionStatus (note: ConnEventNote) {\n for (const row of this.markets) {\n if (row.mkt.xc.host !== note.host) continue\n if (note.connectionStatus === ConnectionStatus.Connected) Doc.hide(row.tmpl.disconnectedIco)\n else Doc.show(row.tmpl.disconnectedIco)\n }\n }\n\n /*\n * setFilter sets the visibility of market rows based on the provided filter.\n */\n setFilter (filter: (mkt: MarketRow) => boolean) {\n for (const row of this.markets) {\n if (filter(row)) Doc.show(row.node)\n else Doc.hide(row.node)\n }\n }\n}\n\n/*\n * MarketRow represents one row in the MarketList. A MarketRow is a subsection\n * of the ExchangeSection.\n */\nclass MarketRow {\n node: HTMLElement\n mkt: ExchangeMarket\n name: string\n baseID: number\n quoteID: number\n lotSize: number\n tmpl: Record<string, PageElement>\n rateConversionFactor: number\n\n constructor (template: HTMLElement, mkt: ExchangeMarket, rateConversionFactor: number) {\n this.mkt = mkt\n this.name = mkt.name\n this.baseID = mkt.baseid\n this.quoteID = mkt.quoteid\n this.lotSize = mkt.lotsize\n this.rateConversionFactor = rateConversionFactor\n this.node = template.cloneNode(true) as HTMLElement\n const tmpl = this.tmpl = Doc.parseTemplate(this.node)\n tmpl.baseIcon.src = Doc.logoPath(mkt.basesymbol)\n tmpl.quoteIcon.src = Doc.logoPath(mkt.quotesymbol)\n tmpl.baseSymbol.appendChild(Doc.symbolize(mkt.xc.assets[mkt.baseid], true))\n tmpl.quoteSymbol.appendChild(Doc.symbolize(mkt.xc.assets[mkt.quoteid], true))\n tmpl.baseName.textContent = mkt.baseName\n tmpl.host.textContent = mkt.xc.host\n tmpl.host.style.color = hostColor(mkt.xc.host)\n tmpl.host.dataset.tooltip = mkt.xc.host\n setPriceAndChange(tmpl, mkt.xc, mkt)\n if (this.mkt.xc.connectionStatus !== ConnectionStatus.Connected) Doc.show(tmpl.disconnectedIco)\n }\n}\n\ninterface BalanceWidgetElement {\n id: number\n parentID: number\n cfg: Asset | null\n node: PageElement\n tmpl: Record<string, PageElement>\n iconBox: PageElement\n stateIcons: WalletIcons\n parentBal?: PageElement\n}\n\n/*\n * BalanceWidget is a display of balance information. Because the wallet can be\n * in any number of states, and because every exchange has different funding\n * coin confirmation requirements, the BalanceWidget displays a number of state\n * indicators and buttons, as well as tabulated balance data with rows for\n * locked and immature balance.\n */\nclass BalanceWidget {\n base: BalanceWidgetElement\n quote: BalanceWidgetElement\n // parentRow: PageElement\n dex: Exchange\n\n constructor (base: HTMLElement, quote: HTMLElement) {\n Doc.hide(base, quote)\n const btmpl = Doc.parseTemplate(base)\n this.base = {\n id: 0,\n parentID: parentIDNone,\n cfg: null,\n node: base,\n tmpl: btmpl,\n iconBox: btmpl.walletState,\n stateIcons: new WalletIcons(btmpl.walletState)\n }\n btmpl.balanceRowTmpl.remove()\n\n const qtmpl = Doc.parseTemplate(quote)\n this.quote = {\n id: 0,\n parentID: parentIDNone,\n cfg: null,\n node: quote,\n tmpl: qtmpl,\n iconBox: qtmpl.walletState,\n stateIcons: new WalletIcons(qtmpl.walletState)\n }\n qtmpl.balanceRowTmpl.remove()\n\n app().registerNoteFeeder({\n balance: (note: BalanceNote) => { this.updateAsset(note.assetID) },\n walletstate: (note: WalletStateNote) => { this.updateAsset(note.wallet.assetID) },\n walletsync: (note: WalletSyncNote) => { this.updateAsset(note.assetID) },\n createwallet: (note: WalletCreationNote) => { this.updateAsset(note.assetID) }\n })\n }\n\n setBalanceVisibility (connected: boolean) {\n if (connected) Doc.show(this.base.node, this.quote.node)\n else Doc.hide(this.base.node, this.quote.node)\n }\n\n /*\n * setWallet sets the balance widget to display data for specified market and\n * will display the widget.\n */\n setWallets (host: string, baseID: number, quoteID: number) {\n const parentID = (assetID: number) => {\n const asset = app().assets[assetID]\n if (asset?.token) return asset.token.parentID\n return parentIDNone\n }\n this.dex = app().user.exchanges[host]\n this.base.id = baseID\n this.base.parentID = parentID(baseID)\n this.base.cfg = this.dex.assets[baseID]\n this.quote.id = quoteID\n this.quote.parentID = parentID(quoteID)\n this.quote.cfg = this.dex.assets[quoteID]\n this.updateWallet(this.base)\n this.updateWallet(this.quote)\n this.setBalanceVisibility(this.dex.connectionStatus === ConnectionStatus.Connected)\n }\n\n /*\n * updateWallet updates the displayed wallet information based on the\n * core.Wallet state.\n */\n updateWallet (side: BalanceWidgetElement) {\n const { cfg, tmpl, iconBox, stateIcons, id: assetID } = side\n if (!cfg) return // no wallet set yet\n const asset = app().assets[assetID]\n // Just hide everything to start.\n Doc.hide(\n tmpl.newWalletRow, tmpl.expired, tmpl.unsupported, tmpl.connect, tmpl.spinner,\n tmpl.walletState, tmpl.balanceRows, tmpl.walletAddr, tmpl.wantProvidersBox\n )\n this.checkNeedsProvider(assetID, tmpl.wantProvidersBox)\n tmpl.logo.src = Doc.logoPath(cfg.symbol)\n tmpl.addWalletSymbol.textContent = cfg.symbol.toUpperCase()\n Doc.empty(tmpl.symbol)\n\n // Handle an unsupported asset.\n if (!asset) {\n Doc.show(tmpl.unsupported)\n return\n }\n tmpl.symbol.appendChild(Doc.symbolize(asset, true))\n Doc.show(iconBox)\n const wallet = asset.wallet\n stateIcons.readWallet(wallet)\n // Handle no wallet configured.\n if (!wallet) {\n if (asset.walletCreationPending) {\n Doc.show(tmpl.spinner)\n return\n }\n Doc.show(tmpl.newWalletRow)\n return\n }\n Doc.show(tmpl.walletAddr)\n // Parent asset\n const bal = wallet.balance\n // Handle not connected and no balance known for the DEX.\n if (!bal && !wallet.running && !wallet.disabled) {\n Doc.show(tmpl.connect)\n return\n }\n // If there is no balance, but the wallet is connected, show the loading\n // icon while we fetch an update.\n if (!bal) {\n app().fetchBalance(assetID)\n Doc.show(tmpl.spinner)\n return\n }\n\n // We have a wallet and a DEX-specific balance. Set all of the fields.\n Doc.show(tmpl.balanceRows)\n Doc.empty(tmpl.balanceRows)\n const addRow = (title: string, bal: number, ui: UnitInfo, icon?: PageElement) => {\n const row = tmpl.balanceRowTmpl.cloneNode(true) as PageElement\n tmpl.balanceRows.appendChild(row)\n const balTmpl = Doc.parseTemplate(row)\n balTmpl.title.textContent = title\n balTmpl.bal.textContent = Doc.formatCoinValue(bal, ui)\n if (icon) {\n balTmpl.bal.append(icon)\n side.parentBal = balTmpl.bal\n }\n }\n addRow(intl.prep(intl.ID_AVAILABLE), bal.available, asset.unitInfo)\n addRow(intl.prep(intl.ID_LOCKED), bal.locked + bal.contractlocked + bal.bondlocked, asset.unitInfo)\n addRow(intl.prep(intl.ID_IMMATURE), bal.immature, asset.unitInfo)\n if (asset.token) {\n const { wallet: { balance }, unitInfo, symbol } = app().assets[asset.token.parentID]\n const icon = document.createElement('img')\n icon.src = Doc.logoPath(symbol)\n icon.classList.add('micro-icon', 'ms-1')\n addRow(intl.prep(intl.ID_FEE_BALANCE), balance.available, unitInfo, icon)\n }\n\n // If the current balance update time is older than an hour, show the\n // expiration icon. Request a balance update, if possible.\n const expired = new Date().getTime() - new Date(bal.stamp).getTime() > anHour\n if (expired && !wallet.disabled) {\n Doc.show(tmpl.expired)\n if (wallet.running) app().fetchBalance(assetID)\n } else Doc.hide(tmpl.expired)\n }\n\n async checkNeedsProvider (assetID: number, el: PageElement) {\n Doc.setVis(await app().needsCustomProvider(assetID), el)\n }\n\n /* updateParent updates the side's parent asset balance. */\n updateParent (side: BalanceWidgetElement) {\n const { wallet: { balance }, unitInfo } = app().assets[side.parentID]\n // firstChild is the text node set before the img child node in addRow.\n if (side.parentBal?.firstChild) side.parentBal.firstChild.textContent = Doc.formatCoinValue(balance.available, unitInfo)\n }\n\n /*\n * updateAsset updates the info for one side of the existing market. If the\n * specified asset ID is not one of the current market's base or quote assets,\n * it is silently ignored.\n */\n updateAsset (assetID: number) {\n if (assetID === this.base.id) this.updateWallet(this.base)\n else if (assetID === this.quote.id) this.updateWallet(this.quote)\n if (assetID === this.base.parentID) this.updateParent(this.base)\n if (assetID === this.quote.parentID) this.updateParent(this.quote)\n }\n}\n\n/* makeMarket creates a market object that specifies basic market details. */\nfunction makeMarket (host: string, base?: number, quote?: number) {\n return {\n host: host,\n base: base,\n quote: quote\n }\n}\n\n/* marketID creates a DEX-compatible market name from the ticker symbols. */\nexport function marketID (b: string, q: string) { return `${b}_${q}` }\n\n/* convertToAtoms converts the float string to the basic unit of a coin. */\nfunction convertToAtoms (s: string, conversionFactor: number) {\n if (!s) return 0\n return Math.round(parseFloat(s) * conversionFactor)\n}\n\n/* swapBttns changes the 'selected' class of the buttons. */\nfunction swapBttns (before: HTMLElement, now: HTMLElement) {\n before.classList.remove('selected')\n now.classList.add('selected')\n}\n\n/*\n * wireOrder prepares a copy of the order with the options field converted to a\n * string -> string map.\n */\nfunction wireOrder (order: TradeForm) {\n const stringyOptions: Record<string, string> = {}\n for (const [k, v] of Object.entries(order.options)) stringyOptions[k] = JSON.stringify(v)\n return Object.assign({}, order, { options: stringyOptions })\n}\n\n// OrderTableRowManager manages the data within a row in an order table. Each row\n// represents all the orders in the order book with the same rate, but orders that\n// are booked or still in the epoch queue are displayed in separate rows.\nclass OrderTableRowManager {\n tableRow: HTMLElement\n page: Record<string, PageElement>\n orderBin: MiniOrder[]\n sell: boolean\n msgRate: number\n epoch: boolean\n baseUnitInfo: UnitInfo\n\n constructor (tableRow: HTMLElement, orderBin: MiniOrder[], baseUnitInfo: UnitInfo, quoteUnitInfo: UnitInfo, rateStep: number) {\n this.tableRow = tableRow\n const page = this.page = Doc.parseTemplate(tableRow)\n this.orderBin = orderBin\n this.sell = orderBin[0].sell\n this.msgRate = orderBin[0].msgRate\n this.epoch = !!orderBin[0].epoch\n this.baseUnitInfo = baseUnitInfo\n const rateText = Doc.formatRateFullPrecision(this.msgRate, baseUnitInfo, quoteUnitInfo, rateStep)\n Doc.setVis(this.isEpoch(), this.page.epoch)\n if (this.msgRate === 0) {\n page.rate.innerText = 'market'\n } else {\n const cssClass = this.isSell() ? 'sellcolor' : 'buycolor'\n page.rate.innerText = rateText\n page.rate.classList.add(cssClass)\n }\n this.updateQtyNumOrdersEl()\n }\n\n // updateQtyNumOrdersEl populates the quantity element in the row, and also\n // displays the number of orders if there is more than one order in the order\n // bin.\n updateQtyNumOrdersEl () {\n const { page, orderBin } = this\n const qty = orderBin.reduce((total, curr) => total + curr.qtyAtomic, 0)\n const numOrders = orderBin.length\n page.qty.innerText = Doc.formatFullPrecision(qty, this.baseUnitInfo)\n if (numOrders > 1) {\n page.numOrders.removeAttribute('hidden')\n page.numOrders.innerText = String(numOrders)\n page.numOrders.title = `quantity is comprised of ${numOrders} orders`\n } else {\n page.numOrders.setAttribute('hidden', 'true')\n }\n }\n\n // insertOrder adds an order to the order bin and updates the row elements\n // accordingly.\n insertOrder (order: MiniOrder) {\n this.orderBin.push(order)\n this.updateQtyNumOrdersEl()\n }\n\n // updateOrderQuantity updates the quantity of the order identified by a token,\n // if it exists in the row, and updates the row elements accordingly. The function\n // returns true if the order is in the bin, and false otherwise.\n updateOrderQty (update: RemainderUpdate) {\n const { token, qty, qtyAtomic } = update\n for (let i = 0; i < this.orderBin.length; i++) {\n if (this.orderBin[i].token === token) {\n this.orderBin[i].qty = qty\n this.orderBin[i].qtyAtomic = qtyAtomic\n this.updateQtyNumOrdersEl()\n return true\n }\n }\n return false\n }\n\n // removeOrder removes the order identified by the token, if it exists in the row,\n // and updates the row elements accordingly. If the order bin is empty, the row is\n // removed from the screen. The function returns true if an order was removed, and\n // false otherwise.\n removeOrder (token: string) {\n const index = this.orderBin.findIndex(order => order.token === token)\n if (index < 0) return false\n this.orderBin.splice(index, 1)\n if (!this.orderBin.length) this.tableRow.remove()\n else this.updateQtyNumOrdersEl()\n return true\n }\n\n // removeEpochOrders removes all the orders from the row that are not in the\n // new epoch's epoch queue and updates the elements accordingly.\n removeEpochOrders (newEpoch?: number) {\n this.orderBin = this.orderBin.filter((order) => {\n return !(order.epoch && order.epoch !== newEpoch)\n })\n if (!this.orderBin.length) this.tableRow.remove()\n else this.updateQtyNumOrdersEl()\n }\n\n // getRate returns the rate of the orders in the row.\n getRate () {\n return this.msgRate\n }\n\n // isEpoch returns whether the orders in this row are in the epoch queue.\n isEpoch () {\n return this.epoch\n }\n\n // isSell returns whether the orders in this row are sell orders.\n isSell () {\n return this.sell\n }\n\n // compare takes an order and returns 0 if the order belongs in this row,\n // 1 if the order should go after this row in the table, and -1 if it should\n // be before this row in the table. Sell orders are displayed in ascending order,\n // buy orders are displayed in descending order, and epoch orders always come\n // after booked orders.\n compare (order: MiniOrder) {\n if (this.getRate() === order.msgRate && this.isEpoch() === !!order.epoch) {\n return 0\n } else if (this.getRate() !== order.msgRate) {\n return (this.getRate() > order.msgRate) === order.sell ? 1 : -1\n } else {\n return this.isEpoch() ? 1 : -1\n }\n }\n}\n\ninterface ExchangeMarket extends Market {\n xc: Exchange\n baseName: string\n bui: UnitInfo\n}\n\nfunction sortedMarkets (): ExchangeMarket[] {\n const mkts: ExchangeMarket[] = []\n const assets = app().assets\n const convertMarkets = (xc: Exchange, mkts: Market[]) => {\n return mkts.map((mkt: Market) => {\n const a = assets[mkt.baseid]\n const baseName = a ? a.name : mkt.basesymbol\n const bui = app().unitInfo(mkt.baseid, xc)\n return Object.assign({ xc, baseName, bui }, mkt)\n })\n }\n for (const xc of Object.values(app().exchanges)) mkts.push(...convertMarkets(xc, Object.values(xc.markets || {})))\n mkts.sort((a: ExchangeMarket, b: ExchangeMarket): number => {\n if (!a.spot) {\n if (b.spot) return 1 // put b first, since we have the spot\n // no spots. compare market name then host name\n if (a.name === b.name) return a.xc.host.localeCompare(b.xc.host)\n return a.name.localeCompare(b.name)\n } else if (!b.spot) return -1 // put a first, since we have the spot\n const [aLots, bLots] = [a.spot.vol24 / a.lotsize, b.spot.vol24 / b.lotsize]\n return bLots - aLots // whoever has more volume by lot count\n })\n return mkts\n}\n\nfunction setPriceAndChange (tmpl: Record<string, PageElement>, xc: Exchange, mkt: Market) {\n if (!mkt.spot) return\n tmpl.price.textContent = Doc.formatFourSigFigs(app().conventionalRate(mkt.baseid, mkt.quoteid, mkt.spot.rate, xc))\n const sign = mkt.spot.change24 > 0 ? '+' : ''\n tmpl.change.classList.remove('buycolor', 'sellcolor')\n tmpl.change.classList.add(mkt.spot.change24 >= 0 ? 'buycolor' : 'sellcolor')\n tmpl.change.textContent = `${sign}${(mkt.spot.change24 * 100).toFixed(1)}%`\n}\n\nconst hues = [1 / 2, 1 / 4, 3 / 4, 1 / 8, 5 / 8, 3 / 8, 7 / 8]\n\nfunction generateHue (idx: number): string {\n const h = hues[idx % hues.length]\n return `hsl(${h * 360}, 35%, 50%)`\n}\n\nfunction hostColor (host: string): string {\n const hosts = Object.keys(app().exchanges)\n hosts.sort()\n return generateHue(hosts.indexOf(host))\n}\n","import Doc from './doc'\nimport BasePage from './basepage'\nimport * as OrderUtil from './orderutil'\nimport * as intl from './locales'\nimport { postJSON } from './http'\nimport {\n app,\n PageElement,\n OrderFilter,\n Order\n} from './registry'\n\nconst orderBatchSize = 50\nconst animationLength = 500\n\nexport default class OrdersPage extends BasePage {\n main: HTMLElement\n offset: string\n loading: boolean\n currentForm: PageElement\n orderTmpl: PageElement\n filterState: OrderFilter\n page: Record<string, PageElement>\n\n constructor (main: HTMLElement) {\n super()\n this.main = main\n // if offset is '', there are no more orders available to auto-load for\n // never-ending scrolling.\n this.offset = ''\n this.loading = false\n const page = this.page = Doc.idDescendants(main)\n this.orderTmpl = page.rowTmpl\n this.orderTmpl.remove()\n\n // filterState will store arrays of strings. The assets and statuses\n // sub-filters will need to be converted to ints for JSON encoding.\n const filterState: OrderFilter = this.filterState = {\n hosts: [],\n assets: [],\n statuses: []\n }\n\n const search = new URLSearchParams(window.location.search)\n const readFilter = (form: HTMLElement, filterKey: string) => {\n const v = search.get(filterKey)\n if (!v || v.length === 0) return\n const subFilter = v.split(',')\n if (v) {\n (filterState as any)[filterKey] = subFilter // Kinda janky\n }\n form.querySelectorAll('input').forEach(bttn => {\n if (subFilter.indexOf(bttn.value) >= 0) bttn.checked = true\n })\n }\n readFilter(page.hostFilter, 'hosts')\n readFilter(page.assetFilter, 'assets')\n readFilter(page.statusFilter, 'statuses')\n\n const applyButtons: HTMLElement[] = []\n const monitorFilter = (form: HTMLElement, filterKey: string) => {\n const applyBttn = form.querySelector('.apply-bttn') as HTMLElement\n applyButtons.push(applyBttn)\n Doc.bind(applyBttn, 'click', () => {\n this.submitFilter()\n applyButtons.forEach(bttn => Doc.hide(bttn))\n })\n form.querySelectorAll('input').forEach(bttn => {\n Doc.bind(bttn, 'change', () => {\n const subFilter = parseSubFilter(form)\n if (compareSubFilter(subFilter, (filterState as any)[filterKey])) {\n // Same as currently loaded. Hide the apply button.\n Doc.hide(applyBttn)\n } else {\n Doc.show(applyBttn)\n }\n })\n })\n }\n\n monitorFilter(page.hostFilter, 'hosts')\n monitorFilter(page.assetFilter, 'assets')\n monitorFilter(page.statusFilter, 'statuses')\n\n Doc.bind(this.main, 'scroll', () => {\n if (this.loading) return\n const belowBottom = page.ordersTable.offsetHeight - this.main.offsetHeight - this.main.scrollTop\n if (belowBottom < 0) {\n this.nextPage()\n }\n })\n\n page.forms.querySelectorAll('.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => {\n Doc.hide(page.forms)\n })\n })\n\n // If the user clicks outside of a form, it should close the page overlay.\n Doc.bind(page.forms, 'mousedown', (e: MouseEvent) => {\n if (!Doc.mouseInElement(e, this.currentForm)) {\n Doc.hide(page.forms)\n }\n })\n\n Doc.bind(page.exportOrders, 'click', () => {\n this.exportOrders()\n })\n\n page.showArchivedDateField.addEventListener('change', () => {\n if (page.showArchivedDateField.checked) Doc.show(page.archivedDateField)\n else Doc.hide(page.archivedDateField, page.deleteArchivedRecordsErr)\n })\n\n Doc.bind(page.deleteArchivedRecords, 'click', () => {\n const page = this.page\n page.showArchivedDateField.checked = false\n page.saveMatchesToFile.checked = false\n page.saveOrdersToFile.checked = false\n page.deleteArchivedRecordsErr.textContent = ''\n page.archivedRecordsLocation.textContent = ''\n page.deleteArchivedRecordsMsg.textContent = ''\n Doc.hide(page.deleteArchivedResult, page.deleteArchivedRecordsErr,\n page.deleteArchivedRecordsMsg, page.archivedRecordsLocation, page.archivedDateField)\n this.showForm(page.deleteArchivedRecordsForm)\n })\n\n Doc.bind(page.deleteArchivedRecordsSubmit, 'click', () => {\n let date = 0\n if (page.showArchivedDateField.checked) {\n date = Date.parse(page.olderThan.value || '')\n if (isNaN(date) || date <= 0) {\n Doc.showFormError(page.deleteArchivedRecordsErr, intl.prep(intl.ID_INVALID_DATE_ERR_MSG))\n return\n }\n }\n this.deleteArchivedRecords(date)\n })\n\n this.submitFilter()\n }\n\n /* showForm shows a modal form with a little animation. */\n async showForm (form: HTMLElement) {\n this.currentForm = form\n const page = this.page\n Doc.hide(page.deleteArchivedRecordsForm)\n form.style.right = '10000px'\n Doc.show(page.forms, form)\n const shift = (page.forms.offsetWidth + form.offsetWidth) / 2\n await Doc.animate(animationLength, progress => {\n form.style.right = `${(1 - progress) * shift}px`\n }, 'easeOutHard')\n form.style.right = '0px'\n }\n\n /* setOrders empties the order table and appends the specified orders. */\n setOrders (orders: Order[]) {\n Doc.empty(this.page.tableBody)\n this.appendOrders(orders)\n }\n\n /* appendOrders appends orders to the orders table. */\n appendOrders (orders: Order[]) {\n const tbody = this.page.tableBody\n for (const ord of orders) {\n const tr = this.orderTmpl.cloneNode(true) as HTMLElement\n const tmpl = Doc.parseTemplate(tr)\n let fromSymbol, toSymbol, fromUnit, toUnit, fromQty\n let toQty = ''\n const xc = app().exchanges[ord.host] || undefined\n if ((!app().assets[ord.baseID] && !xc.assets[ord.baseID]) || (!app().assets[ord.quoteID] && !xc.assets[ord.quoteID])) continue\n const [baseUnitInfo, quoteUnitInfo] = [app().unitInfo(ord.baseID, xc), app().unitInfo(ord.quoteID, xc)]\n if (ord.sell) {\n [fromSymbol, toSymbol] = [ord.baseSymbol, ord.quoteSymbol];\n [fromUnit, toUnit] = [baseUnitInfo.conventional.unit, quoteUnitInfo.conventional.unit]\n fromQty = Doc.formatCoinValue(ord.qty, baseUnitInfo)\n if (ord.type === OrderUtil.Limit) {\n toQty = Doc.formatCoinValue(ord.qty / OrderUtil.RateEncodingFactor * ord.rate, quoteUnitInfo)\n }\n } else {\n [fromSymbol, toSymbol] = [ord.quoteSymbol, ord.baseSymbol];\n [fromUnit, toUnit] = [quoteUnitInfo.conventional.unit, baseUnitInfo.conventional.unit]\n if (ord.type === OrderUtil.Market) {\n fromQty = Doc.formatCoinValue(ord.qty, baseUnitInfo)\n } else {\n fromQty = Doc.formatCoinValue(ord.qty / OrderUtil.RateEncodingFactor * ord.rate, quoteUnitInfo)\n toQty = Doc.formatCoinValue(ord.qty, baseUnitInfo)\n }\n }\n\n const mktID = `${baseUnitInfo.conventional.unit}-${quoteUnitInfo.conventional.unit}`\n tmpl.host.textContent = `${mktID} @ ${ord.host}`\n\n tmpl.fromQty.textContent = fromQty\n tmpl.fromLogo.src = Doc.logoPath(fromSymbol)\n tmpl.fromSymbol.textContent = fromUnit\n tmpl.toQty.textContent = toQty\n tmpl.toLogo.src = Doc.logoPath(toSymbol)\n tmpl.toSymbol.textContent = toUnit\n tmpl.type.textContent = `${OrderUtil.typeString(ord)} ${OrderUtil.sellString(ord)}`\n let rate = Doc.formatCoinValue(app().conventionalRate(ord.baseID, ord.quoteID, ord.rate, xc))\n if (ord.type === OrderUtil.Market) rate = OrderUtil.averageMarketOrderRateString(ord)\n tmpl.rate.textContent = rate\n tmpl.status.textContent = OrderUtil.statusString(ord)\n tmpl.filled.textContent = `${(OrderUtil.filled(ord) / ord.qty * 100).toFixed(1)}%`\n tmpl.settled.textContent = `${(OrderUtil.settled(ord) / ord.qty * 100).toFixed(1)}%`\n const dateTime = new Date(ord.submitTime).toLocaleString()\n tmpl.timeAgo.textContent = `${Doc.timeSince(ord.submitTime)} ago`\n tmpl.time.textContent = dateTime\n const link = Doc.tmplElement(tr, 'link')\n link.href = `order/${ord.id}`\n app().bindInternalNavigation(tr)\n tbody.appendChild(tr)\n }\n if (orders.length === orderBatchSize) {\n this.offset = orders[orders.length - 1].id\n } else {\n this.offset = ''\n }\n }\n\n /* submitFilter submits the current filter and reloads the order table. */\n async submitFilter () {\n const page = this.page\n this.offset = ''\n const filterState = this.filterState\n filterState.hosts = parseSubFilter(page.hostFilter)\n filterState.assets = parseSubFilter(page.assetFilter).map((s: string) => parseInt(s))\n filterState.statuses = parseSubFilter(page.statusFilter).map((s: string) => parseInt(s))\n this.setOrders(await this.fetchOrders())\n }\n\n /* fetchOrders fetches orders using the current filter. */\n async fetchOrders () {\n const loaded = app().loading(this.main)\n const res = await postJSON('/api/orders', this.currentFilter())\n loaded()\n return res.orders\n }\n\n /* exportOrders downloads a csv of the user's orders based on the current filter. */\n exportOrders () {\n this.offset = ''\n const filterState = this.currentFilter()\n const url = new URL(window.location.href)\n const search = new URLSearchParams('')\n const setQuery = (k: string) => {\n const subFilter = (filterState as any)[k]\n subFilter.forEach((v: any) => {\n search.append(k, v)\n })\n }\n setQuery('hosts')\n setQuery('assets')\n setQuery('statuses')\n url.search = search.toString()\n url.pathname = '/orders/export'\n window.open(url.toString())\n }\n\n /* deleteArchivedRecords removes the user's archived orders and matches\n * created before user specified date time in millisecond. Deleted archived\n * records are saved to a CSV file if the user specify so.\n */\n async deleteArchivedRecords (olderThanMs?: number) {\n const page = this.page\n const saveMatchesToFIle = page.saveMatchesToFile.checked || false\n const saveOrdersToFile = page.saveOrdersToFile.checked || false\n const reqBody = {\n olderThanMs: olderThanMs,\n saveMatchesToFile: saveMatchesToFIle,\n saveOrdersToFile: saveOrdersToFile\n }\n const loaded = app().loading(this.main)\n const res = await postJSON('/api/deletearchivedrecords', reqBody)\n loaded()\n if (!app().checkResponse(res)) {\n return Doc.showFormError(page.deleteArchivedRecordsErr, res.msg)\n }\n\n if (res.archivedRecordsDeleted > 0) {\n page.deleteArchivedRecordsMsg.textContent = intl.prep(intl.ID_DELETE_ARCHIVED_RECORDS_RESULT, { nRecords: res.archivedRecordsDeleted })\n if (saveMatchesToFIle || saveOrdersToFile) {\n page.archivedRecordsLocation.textContent = intl.prep(intl.ID_ARCHIVED_RECORDS_PATH, { path: res.archivedRecordsPath })\n Doc.show(page.archivedRecordsLocation)\n }\n // Update the order page.\n this.submitFilter()\n } else {\n page.deleteArchivedRecordsMsg.textContent = intl.prep(intl.ID_NO_ARCHIVED_RECORDS)\n }\n Doc.show(page.deleteArchivedResult, page.deleteArchivedRecordsMsg)\n }\n\n /*\n * currentFilter converts the local filter type (which is all strings) to the\n * server's filter type.\n */\n currentFilter (): OrderFilter {\n const filterState = this.filterState as OrderFilter\n return {\n hosts: filterState.hosts,\n assets: filterState.assets?.map((s: any) => parseInt(s)),\n statuses: filterState.statuses?.map((s: any) => parseInt(s)),\n n: orderBatchSize,\n offset: this.offset\n }\n }\n\n /*\n * nextPage resubmits the filter with the offset set to the last loaded order.\n */\n async nextPage () {\n if (this.offset === '' || this.loading) return\n this.loading = true\n Doc.show(this.page.orderLoader)\n const orders = await this.fetchOrders()\n this.loading = false\n Doc.hide(this.page.orderLoader)\n this.appendOrders(orders)\n }\n}\n\n/*\n * parseSubFilter parses a bool-map from the checkbox inputs in the specified\n * ancestor element.\n */\nfunction parseSubFilter (form: HTMLElement): string[] {\n const entries: string[] = []\n form.querySelectorAll('input').forEach(box => {\n if (box.checked) entries.push(box.value)\n })\n return entries\n}\n\n/* compareSubFilter compares the two filter arrays for unordered equivalence. */\nfunction compareSubFilter (filter1: any[], filter2: any[]): boolean {\n if (filter1.length !== filter2.length) return false\n for (const entry of filter1) {\n if (filter2.indexOf(entry) === -1) return false\n }\n return true\n}\n","import Doc from './doc'\nimport BasePage from './basepage'\nimport * as OrderUtil from './orderutil'\nimport { bind as bindForm, AccelerateOrderForm } from './forms'\nimport { postJSON } from './http'\nimport * as intl from './locales'\nimport {\n app,\n Order,\n PageElement,\n OrderNote,\n MatchNote,\n Match,\n Coin\n} from './registry'\nimport { setOptionTemplates } from './opts'\nimport { formatCoinID, setCoinHref } from './coinexplorers'\n\n// lockTimeMakerMs must match the value returned from LockTimeMaker func in\n// bisonw.\nconst lockTimeMakerMs = 20 * 60 * 60 * 1000\n// lockTimeTakerMs must match the value returned from LockTimeTaker func in\n// bisonw.\nconst lockTimeTakerMs = 8 * 60 * 60 * 1000\n\nconst animationLength = 500\n\nexport default class OrderPage extends BasePage {\n orderID: string\n order: Order\n page: Record<string, PageElement>\n currentForm: HTMLElement\n secondTicker: number\n refreshOnPopupClose: boolean\n accelerateOrderForm: AccelerateOrderForm\n stampers: PageElement[]\n\n constructor (main: HTMLElement) {\n super()\n const page = this.page = Doc.idDescendants(main)\n this.stampers = Doc.applySelector(main, '[data-stamp]')\n // Find the order\n this.orderID = main.dataset.oid || ''\n\n Doc.cleanTemplates(page.matchCardTmpl)\n\n const setStamp = () => {\n for (const span of this.stampers) {\n span.textContent = Doc.timeSince(parseInt(span.dataset.stamp || ''))\n }\n }\n setStamp()\n\n page.forms.querySelectorAll('.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => {\n if (this.refreshOnPopupClose) {\n window.location.replace(window.location.href)\n return\n }\n Doc.hide(page.forms)\n })\n })\n\n // Some static elements on this page contain assets that can be linked\n // to blockchain explorers (such as Etherscan) so users can easily\n // examine funding/acceleration coins data there. We'd need to set up\n // such hyperlinks here.\n main.querySelectorAll('[data-explorer-id]').forEach((link: PageElement) => {\n const assetID = parseInt(link.dataset.explorerId || '')\n setCoinHref(assetID, link)\n })\n\n if (page.cancelBttn) {\n Doc.bind(page.cancelBttn, 'click', () => {\n this.showForm(page.cancelForm)\n })\n }\n\n Doc.bind(page.accelerateBttn, 'click', () => {\n this.showAccelerateForm()\n })\n\n const success = () => {\n this.refreshOnPopupClose = true\n }\n // Do not call cleanTemplates before creating the AccelerateOrderForm\n setOptionTemplates(page)\n this.accelerateOrderForm = new AccelerateOrderForm(page.accelerateForm, success)\n Doc.cleanTemplates(page.booleanOptTmpl, page.rangeOptTmpl, page.orderOptTmpl)\n\n // If the user clicks outside of a form, it should close the page overlay.\n Doc.bind(page.forms, 'mousedown', (e: MouseEvent) => {\n if (!Doc.mouseInElement(e, this.currentForm)) {\n if (this.refreshOnPopupClose) {\n window.location.reload()\n return\n }\n Doc.hide(page.forms)\n }\n })\n\n // Cancel order form\n bindForm(page.cancelForm, page.cancelSubmit, async () => { this.submitCancel() })\n\n this.secondTicker = window.setInterval(() => {\n setStamp()\n }, 10000) // update every 10 seconds\n\n app().registerNoteFeeder({\n order: (note: OrderNote) => { this.handleOrderNote(note) },\n match: (note: MatchNote) => { this.handleMatchNote(note) }\n })\n\n this.start()\n }\n\n async start () {\n let ord = app().order(this.orderID)\n // app().order can only access active orders. If the order is not active,\n // we'll need to get the data from the database.\n if (ord) this.order = ord\n else {\n ord = await this.fetchOrder()\n }\n // Swap out the dot-notation symbols with token-aware symbols.\n this.page.mktBaseSymbol.replaceWith(Doc.symbolize(app().assets[ord.baseID]))\n this.page.mktQuoteSymbol.replaceWith(Doc.symbolize(app().assets[ord.quoteID]))\n\n this.setAccelerationButtonVis()\n this.showMatchCards()\n }\n\n unload () {\n clearInterval(this.secondTicker)\n }\n\n /* fetchOrder fetches the order from the client. */\n async fetchOrder (): Promise<Order> {\n const res = await postJSON('/api/order', this.orderID)\n if (!app().checkResponse(res)) throw res.msg\n this.order = res.order\n return this.order\n }\n\n /*\n * setImmutableMatchCardElements sets the match card elements that are never\n * changed.\n */\n setImmutableMatchCardElements (matchCard: HTMLElement, match: Match) {\n const tmpl = Doc.parseTemplate(matchCard)\n\n tmpl.matchID.textContent = match.matchID\n\n const time = new Date(match.stamp)\n tmpl.matchTime.textContent = time.toLocaleTimeString(Doc.languages(), {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })\n\n tmpl.matchTimeAgo.dataset.stamp = match.stamp.toString()\n tmpl.matchTimeAgo.textContent = Doc.timeSince(match.stamp)\n this.stampers.push(tmpl.matchTimeAgo)\n\n const orderPortion = OrderUtil.orderPortion(this.order, match)\n const baseSymbol = Doc.bipSymbol(this.order.baseID)\n const quoteSymbol = Doc.bipSymbol(this.order.quoteID)\n const baseUnitInfo = app().unitInfo(this.order.baseID)\n const quoteUnitInfo = app().unitInfo(this.order.quoteID)\n const [bUnit, qUnit] = [baseUnitInfo.conventional.unit.toLowerCase(), quoteUnitInfo.conventional.unit.toLowerCase()]\n const quoteAmount = OrderUtil.baseToQuote(match.rate, match.qty)\n\n if (match.isCancel) {\n Doc.show(tmpl.cancelInfoDiv)\n Doc.hide(tmpl.infoDiv, tmpl.status, tmpl.statusHdr)\n\n if (this.order.sell) {\n tmpl.cancelAmount.textContent = Doc.formatCoinValue(match.qty, baseUnitInfo)\n tmpl.cancelIcon.src = Doc.logoPathFromID(this.order.baseID)\n } else {\n tmpl.cancelAmount.textContent = Doc.formatCoinValue(quoteAmount, quoteUnitInfo)\n tmpl.cancelIcon.src = Doc.logoPathFromID(this.order.quoteID)\n }\n\n tmpl.cancelOrderPortion.textContent = orderPortion\n\n return\n }\n\n Doc.show(tmpl.infoDiv)\n Doc.hide(tmpl.cancelInfoDiv)\n\n tmpl.orderPortion.textContent = orderPortion\n\n if (match.side === OrderUtil.Maker) {\n tmpl.side.textContent = intl.prep(intl.ID_MAKER)\n Doc.show(\n tmpl.makerSwapYou,\n tmpl.makerRedeemYou,\n tmpl.takerSwapThem,\n tmpl.takerRedeemThem\n )\n Doc.hide(\n tmpl.takerSwapYou,\n tmpl.takerRedeemYou,\n tmpl.makerSwapThem,\n tmpl.makerRedeemThem\n )\n } else {\n tmpl.side.textContent = intl.prep(intl.ID_TAKER)\n Doc.hide(\n tmpl.makerSwapYou,\n tmpl.makerRedeemYou,\n tmpl.takerSwapThem,\n tmpl.takerRedeemThem\n )\n Doc.show(\n tmpl.takerSwapYou,\n tmpl.takerRedeemYou,\n tmpl.makerSwapThem,\n tmpl.makerRedeemThem\n )\n }\n\n if ((match.side === OrderUtil.Maker && this.order.sell) ||\n (match.side === OrderUtil.Taker && !this.order.sell)) {\n tmpl.makerSwapAsset.textContent = bUnit\n tmpl.takerSwapAsset.textContent = qUnit\n tmpl.makerRedeemAsset.textContent = qUnit\n tmpl.takerRedeemAsset.textContent = bUnit\n } else {\n tmpl.makerSwapAsset.textContent = qUnit\n tmpl.takerSwapAsset.textContent = bUnit\n tmpl.makerRedeemAsset.textContent = bUnit\n tmpl.takerRedeemAsset.textContent = qUnit\n }\n\n const rate = app().conventionalRate(this.order.baseID, this.order.quoteID, match.rate)\n tmpl.rate.textContent = `${rate} ${bUnit}/${qUnit}`\n\n if (this.order.sell) {\n tmpl.refundAsset.textContent = baseSymbol\n tmpl.fromAmount.textContent = Doc.formatCoinValue(match.qty, baseUnitInfo)\n tmpl.toAmount.textContent = Doc.formatCoinValue(quoteAmount, quoteUnitInfo)\n tmpl.fromIcon.src = Doc.logoPathFromID(this.order.baseID)\n tmpl.toIcon.src = Doc.logoPathFromID(this.order.quoteID)\n } else {\n tmpl.refundAsset.textContent = quoteSymbol\n tmpl.fromAmount.textContent = Doc.formatCoinValue(quoteAmount, quoteUnitInfo)\n tmpl.toAmount.textContent = Doc.formatCoinValue(match.qty, baseUnitInfo)\n tmpl.fromIcon.src = Doc.logoPathFromID(this.order.quoteID)\n tmpl.toIcon.src = Doc.logoPathFromID(this.order.baseID)\n }\n }\n\n /*\n * setMutableMatchCardElements sets the match card elements which may get\n * updated on each update to the match.\n */\n setMutableMatchCardElements (matchCard: HTMLElement, m: Match) {\n if (m.isCancel) return\n\n const tmpl = Doc.parseTemplate(matchCard)\n tmpl.status.textContent = OrderUtil.matchStatusString(m)\n\n const tryShowCoin = (pendingEl: PageElement, coinLink: PageElement, coin: Coin) => {\n if (!coin) {\n Doc.hide(coinLink)\n Doc.show(pendingEl)\n return\n }\n coinLink.textContent = formatCoinID(coin.stringID)\n coinLink.dataset.explorerCoin = coin.stringID\n setCoinHref(coin.assetID, coinLink)\n Doc.show(coinLink)\n Doc.hide(pendingEl)\n }\n\n tryShowCoin(tmpl.makerSwapPending, tmpl.makerSwapCoin, makerSwapCoin(m))\n tryShowCoin(tmpl.takerSwapPending, tmpl.takerSwapCoin, takerSwapCoin(m))\n tryShowCoin(tmpl.makerRedeemPending, tmpl.makerRedeemCoin, makerRedeemCoin(m))\n tryShowCoin(tmpl.takerRedeemPending, tmpl.takerRedeemCoin, takerRedeemCoin(m))\n if (!m.refund) {\n // Special messaging for pending refunds.\n let lockTime = lockTimeMakerMs\n if (m.side === OrderUtil.Taker) lockTime = lockTimeTakerMs\n const refundAfter = new Date(m.stamp + lockTime)\n if (Date.now() > refundAfter.getTime()) tmpl.refundPending.textContent = intl.prep(intl.ID_REFUND_IMMINENT)\n else {\n const refundAfterStr = refundAfter.toLocaleTimeString(Doc.languages(), {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })\n tmpl.refundPending.textContent = intl.prep(intl.ID_REFUND_WILL_HAPPEN_AFTER, { refundAfterTime: refundAfterStr })\n }\n Doc.hide(tmpl.refundCoin)\n Doc.show(tmpl.refundPending)\n } else {\n tmpl.refundCoin.textContent = formatCoinID(m.refund.stringID)\n tmpl.refundCoin.dataset.explorerCoin = m.refund.stringID\n setCoinHref(m.refund.assetID, tmpl.refundCoin)\n Doc.show(tmpl.refundCoin)\n Doc.hide(tmpl.refundPending)\n }\n\n if (m.status === OrderUtil.MakerSwapCast && !m.revoked && !m.refund) {\n const c = makerSwapCoin(m)\n tmpl.makerSwapMsg.textContent = confirmationString(c)\n Doc.hide(tmpl.takerSwapMsg, tmpl.makerRedeemMsg, tmpl.takerRedeemMsg)\n Doc.show(tmpl.makerSwapMsg)\n } else if (m.status === OrderUtil.TakerSwapCast && !m.revoked && !m.refund) {\n const c = takerSwapCoin(m)\n tmpl.takerSwapMsg.textContent = confirmationString(c)\n Doc.hide(tmpl.makerSwapMsg, tmpl.makerRedeemMsg, tmpl.takerRedeemMsg)\n Doc.show(tmpl.takerSwapMsg)\n } else if (inConfirmingMakerRedeem(m) && !m.revoked && !m.refund) {\n tmpl.makerRedeemMsg.textContent = confirmationString(m.redeem)\n Doc.hide(tmpl.makerSwapMsg, tmpl.takerSwapMsg, tmpl.takerRedeemMsg)\n Doc.show(tmpl.makerRedeemMsg)\n } else if (inConfirmingTakerRedeem(m) && !m.revoked && !m.refund) {\n tmpl.takerRedeemMsg.textContent = confirmationString(m.redeem)\n Doc.hide(tmpl.makerSwapMsg, tmpl.takerSwapMsg, tmpl.makerRedeemMsg)\n Doc.show(tmpl.takerRedeemMsg)\n } else {\n Doc.hide(tmpl.makerSwapMsg, tmpl.takerSwapMsg, tmpl.makerRedeemMsg, tmpl.takerRedeemMsg)\n }\n\n if (!m.revoked) {\n // Match is still following the usual success-path, it is desirable for the\n // user to see it in full (even if to learn how atomic swap is supposed to\n // work).\n\n Doc.setVis(makerSwapCoin(m) || m.active, tmpl.makerSwap)\n Doc.setVis(takerSwapCoin(m) || m.active, tmpl.takerSwap)\n Doc.setVis(makerRedeemCoin(m) || m.active, tmpl.makerRedeem)\n // When maker isn't aware of taker redeem coin, once the match becomes inactive\n // (nothing else maker is expected to do in this match) just hide taker redeem.\n Doc.setVis(takerRedeemCoin(m) || m.active, tmpl.takerRedeem)\n // Refunding isn't a usual part of success-path, but don't rule it out.\n Doc.setVis(m.refund, tmpl.refund)\n } else {\n // Match diverged from the usual success-path, since this could have happened\n // at any step it is hard (maybe impossible) to predict the final state this\n // match will end up in, so show only steps that already happened plus all\n // the possibilities on the next step ahead.\n\n // If we don't have swap coins after revocation, we won't show the pending message.\n Doc.setVis(makerSwapCoin(m), tmpl.makerSwap)\n Doc.setVis(takerSwapCoin(m), tmpl.takerSwap)\n const takerRefundsAfter = new Date(m.stamp + lockTimeTakerMs)\n const takerLockTimeExpired = Date.now() > takerRefundsAfter.getTime()\n // When match is revoked and both swaps are present, maker redeem might still show up:\n // - as maker, we'll try to redeem until taker locktime expires (if taker refunds\n // we won't be able to redeem; even if taker hasn't refunded just yet - it\n // becomes too dangerous to redeem after taker locktime expired because maker\n // reveals his secret when redeeming, and taker might be able to submit both\n // redeem and refund transactions before maker's redeem gets mined), so we'll\n // have to show redeem pending element until maker redeem shows up, or until\n // we give up on redeeming due to taker locktime expiry.\n // - as taker, we should expect maker redeeming any time, so we'll have to show\n // redeem pending element until maker redeem shows up, or until we refund.\n Doc.setVis(makerRedeemCoin(m) || (takerSwapCoin(m) && m.active && !m.refund && !takerLockTimeExpired), tmpl.makerRedeem)\n // When maker isn't aware of taker redeem coin, once the match becomes inactive\n // (nothing else maker is expected to do in this match) just hide taker redeem.\n Doc.setVis(takerRedeemCoin(m) || (makerRedeemCoin(m) && m.active && !m.refund), tmpl.takerRedeem)\n // As taker, show refund placeholder only if we have outstanding swap to refund.\n // There is no need to wait for anything else, we can show refund placeholder\n // (to inform the user that it is likely to happen) right after match revocation.\n let expectingRefund = Boolean(takerSwapCoin(m)) // as taker\n if (m.side === OrderUtil.Maker) {\n // As maker, show refund placeholder only if we have outstanding swap to refund.\n // If we don't have taker swap there is no need to wait for anything else, we\n // can show refund placeholder (to inform the user that it is likely to happen)\n // right after match revocation.\n expectingRefund = Boolean(makerSwapCoin(m))\n // If we discover taker swap we'll be trying to redeem it (instead of trying\n // to refund our own swap) until taker refunds, so start showing refund\n // placeholder only after taker is expected to start his refund process in\n // this case.\n if (takerSwapCoin(m)) {\n expectingRefund = expectingRefund && takerLockTimeExpired\n }\n }\n Doc.setVis(m.refund || (m.active && !m.redeem && !m.counterRedeem && expectingRefund), tmpl.refund)\n }\n }\n\n /*\n * addNewMatchCard adds a new card to the list of match cards.\n */\n addNewMatchCard (match: Match) {\n const page = this.page\n const matchCard = page.matchCardTmpl.cloneNode(true) as HTMLElement\n app().bindUrlHandlers(matchCard)\n matchCard.dataset.matchID = match.matchID\n this.setImmutableMatchCardElements(matchCard, match)\n this.setMutableMatchCardElements(matchCard, match)\n page.matchBox.appendChild(matchCard)\n }\n\n /*\n * showMatchCards creates cards for each match in the order.\n */\n showMatchCards () {\n const order = this.order\n if (!order) return\n if (!order.matches) return\n order.matches.sort((a, b) => a.stamp - b.stamp)\n order.matches.forEach((match) => this.addNewMatchCard(match))\n }\n\n /* showCancel shows a form to confirm submission of a cancel order. */\n showCancel () {\n const order = this.order\n const page = this.page\n const remaining = order.qty - order.filled\n const asset = OrderUtil.isMarketBuy(order) ? app().assets[order.quoteID] : app().assets[order.baseID]\n page.cancelRemain.textContent = Doc.formatCoinValue(remaining, asset.unitInfo)\n page.cancelUnit.textContent = asset.unitInfo.conventional.unit.toUpperCase()\n this.showForm(page.cancelForm)\n }\n\n /* showForm shows a modal form with a little animation. */\n async showForm (form: HTMLElement) {\n this.currentForm = form\n const page = this.page\n Doc.hide(page.cancelForm, page.accelerateForm)\n form.style.right = '10000px'\n Doc.show(page.forms, form)\n const shift = (page.forms.offsetWidth + form.offsetWidth) / 2\n await Doc.animate(animationLength, progress => {\n form.style.right = `${(1 - progress) * shift}px`\n }, 'easeOutHard')\n form.style.right = '0px'\n }\n\n /* submitCancel submits a cancellation for the order. */\n async submitCancel () {\n // this will be the page.cancelSubmit button (evt.currentTarget)\n const page = this.page\n const order = this.order\n const req = {\n orderID: order.id\n }\n const loaded = app().loading(page.cancelForm)\n const res = await postJSON('/api/cancel', req)\n loaded()\n if (!app().checkResponse(res)) return\n page.status.textContent = intl.prep(intl.ID_CANCELING)\n Doc.hide(page.forms)\n order.cancelling = true\n }\n\n /*\n * setAccelerationButtonVis shows the acceleration button if the order can\n * be accelerated.\n */\n setAccelerationButtonVis () {\n const order = this.order\n if (!order) return\n const page = this.page\n Doc.setVis(app().canAccelerateOrder(order), page.accelerateBttn, page.actionsLabel)\n }\n\n /* showAccelerateForm shows a form to accelerate an order */\n async showAccelerateForm () {\n const loaded = app().loading(this.page.accelerateBttn)\n this.accelerateOrderForm.refresh(this.order)\n loaded()\n this.showForm(this.page.accelerateForm)\n }\n\n /*\n * handleOrderNote is the handler for the 'order'-type notification, which are\n * used to update an order's status.\n */\n handleOrderNote (note: OrderNote) {\n const page = this.page\n const order = note.order\n if (order.id !== this.orderID) return\n this.order = order\n const bttn = page.cancelBttn\n if (bttn && order.status > OrderUtil.StatusBooked) Doc.hide(bttn)\n page.status.textContent = OrderUtil.statusString(order)\n for (const m of order.matches || []) this.processMatch(m)\n this.setAccelerationButtonVis()\n }\n\n /* handleMatchNote handles a 'match' notification. */\n handleMatchNote (note: MatchNote) {\n if (note.orderID !== this.orderID) return\n this.processMatch(note.match)\n this.setAccelerationButtonVis()\n }\n\n /*\n * processMatch synchronizes a match's card with a match received in a\n * 'order' or 'match' notification.\n */\n processMatch (m: Match) {\n let card: HTMLElement | null = null\n for (const div of Doc.applySelector(this.page.matchBox, '.match-card')) {\n if (div.dataset.matchID === m.matchID) {\n card = div\n break\n }\n }\n if (card) {\n this.setMutableMatchCardElements(card, m)\n } else {\n this.addNewMatchCard(m)\n }\n }\n}\n\n/*\n * confirmationString is a string describing the state of confirmations for a\n * coin.\n * */\nfunction confirmationString (coin: Coin) {\n if (!coin.confs || coin.confs.required === 0) return ''\n return `${coin.confs.count} / ${coin.confs.required} ${intl.prep(intl.ID_CONFIRMATIONS)}`\n}\n\n// makerSwapCoin return's the maker's swap coin.\nfunction makerSwapCoin (m: Match) : Coin {\n return (m.side === OrderUtil.Maker) ? m.swap : m.counterSwap\n}\n\n// takerSwapCoin return's the taker's swap coin.\nfunction takerSwapCoin (m: Match) {\n return (m.side === OrderUtil.Maker) ? m.counterSwap : m.swap\n}\n\n// makerRedeemCoin return's the maker's redeem coin.\nfunction makerRedeemCoin (m: Match) {\n return (m.side === OrderUtil.Maker) ? m.redeem : m.counterRedeem\n}\n\n// takerRedeemCoin return's the taker's redeem coin.\nfunction takerRedeemCoin (m: Match) {\n return (m.side === OrderUtil.Maker) ? m.counterRedeem : m.redeem\n}\n\n/*\n* inConfirmingMakerRedeem will be true if we are the maker, and we are waiting\n* on confirmations for our own redeem.\n*/\nfunction inConfirmingMakerRedeem (m: Match) {\n return m.status < OrderUtil.MatchConfirmed && m.side === OrderUtil.Maker && m.status >= OrderUtil.MakerRedeemed\n}\n\n/*\n* inConfirmingTakerRedeem will be true if we are the taker, and we are waiting\n* on confirmations for our own redeem.\n*/\nfunction inConfirmingTakerRedeem (m: Match) {\n return m.status < OrderUtil.MatchConfirmed && m.side === OrderUtil.Taker && m.status >= OrderUtil.MatchComplete\n}\n","import superPropBase from \"./superPropBase.js\";\nfunction _get() {\n return _get = \"undefined\" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) {\n var p = superPropBase(e, t);\n if (p) {\n var n = Object.getOwnPropertyDescriptor(p, t);\n return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value;\n }\n }, _get.apply(null, arguments);\n}\nexport { _get as default };","import getPrototypeOf from \"./getPrototypeOf.js\";\nfunction _superPropBase(t, o) {\n for (; !{}.hasOwnProperty.call(t, o) && null !== (t = getPrototypeOf(t)););\n return t;\n}\nexport { _superPropBase as default };","import {\n app,\n PageElement,\n MMBotStatus,\n RunStatsNote,\n RunEventNote,\n StartConfig,\n OrderPlacement,\n AutoRebalanceConfig,\n CEXNotification,\n EpochReportNote,\n CEXProblemsNote,\n MarketWithHost\n} from './registry'\nimport {\n MM,\n CEXDisplayInfo,\n CEXDisplayInfos,\n botTypeBasicArb,\n botTypeArbMM,\n botTypeBasicMM,\n setMarketElements,\n setCexElements,\n PlacementsChart,\n BotMarket,\n hostedMarketID,\n RunningMarketMakerDisplay,\n RunningMMDisplayElements\n} from './mmutil'\nimport Doc, { MiniSlider } from './doc'\nimport BasePage from './basepage'\nimport * as OrderUtil from './orderutil'\nimport { Forms, CEXConfigurationForm } from './forms'\nimport * as intl from './locales'\nimport { StatusBooked } from './orderutil'\nconst mediumBreakpoint = 768\n\ninterface FundingSlider {\n left: {\n cex: number\n dex: number\n }\n right: {\n cex: number\n dex: number\n }\n cexRange: number\n dexRange: number\n}\n\nconst newSlider = () => {\n return {\n left: {\n cex: 0,\n dex: 0\n },\n right: {\n cex: 0,\n dex: 0\n },\n cexRange: 0,\n dexRange: 0\n }\n}\n\ninterface FundingSource {\n avail: number\n req: number\n funded: boolean\n}\n\ninterface FundingOutlook {\n dex: FundingSource\n cex: FundingSource\n transferable: number\n fees: {\n avail: number\n req: number\n funded: boolean\n },\n fundedAndBalanced: boolean\n fundedAndNotBalanced: boolean\n}\n\nfunction parseFundingOptions (f: FundingOutlook): [number, number, FundingSlider | undefined] {\n const { cex: { avail: cexAvail, req: cexReq }, dex: { avail: dexAvail, req: dexReq }, transferable } = f\n\n let proposedDex = Math.min(dexAvail, dexReq)\n let proposedCex = Math.min(cexAvail, cexReq)\n let slider: FundingSlider | undefined\n if (f.fundedAndNotBalanced) {\n // We have everything we need, but not where we need it, and we can\n // deposit and withdraw.\n if (dexAvail > dexReq) {\n // We have too much dex-side, so we'll have to draw on dex to balance\n // cex's shortcomings.\n const cexShort = cexReq - cexAvail\n const dexRemain = dexAvail - dexReq\n if (dexRemain < cexShort) {\n // We did something really bad with math to get here.\n throw Error('bad math has us with dex surplus + cex underfund invalid remains')\n }\n proposedDex += cexShort + transferable\n } else {\n // We don't have enough on dex, but we have enough on cex to cover the\n // short.\n const dexShort = dexReq - dexAvail\n const cexRemain = cexAvail - cexReq\n if (cexRemain < dexShort) {\n throw Error('bad math got us with cex surplus + dex underfund invalid remains')\n }\n proposedCex += dexShort + transferable\n }\n } else if (f.fundedAndBalanced) {\n // This asset is fully funded, but the user may choose to fund order\n // reserves either cex or dex.\n if (transferable > 0) {\n const dexRemain = dexAvail - dexReq\n const cexRemain = cexAvail - cexReq\n\n slider = newSlider()\n\n if (cexRemain > transferable && dexRemain > transferable) {\n // Either one could fully fund order reserves. Let the user choose.\n slider.left.cex = transferable + cexReq\n slider.left.dex = dexReq\n slider.right.cex = cexReq\n slider.right.dex = transferable + dexReq\n } else if (dexRemain < transferable && cexRemain < transferable) {\n // => implied that cexRemain + dexRemain > transferable.\n // CEX can contribute SOME and DEX can contribute SOME.\n slider.left.cex = transferable - dexRemain + cexReq\n slider.left.dex = dexRemain + dexReq\n slider.right.cex = cexRemain + cexReq\n slider.right.dex = transferable - cexRemain + dexReq\n } else if (dexRemain > transferable) {\n // So DEX has enough to cover reserves, but CEX could potentially\n // constribute SOME. NOT ALL.\n slider.left.cex = cexReq\n slider.left.dex = transferable + dexReq\n slider.right.cex = cexRemain + cexReq\n slider.right.dex = transferable - cexRemain + dexReq\n } else {\n // CEX has enough to cover reserves, but DEX could contribute SOME,\n // NOT ALL.\n slider.left.cex = transferable - dexRemain + cexReq\n slider.left.dex = dexRemain + dexReq\n slider.right.cex = transferable + cexReq\n slider.right.dex = dexReq\n }\n // We prefer the slider right in the center.\n slider.cexRange = slider.right.cex - slider.left.cex\n slider.dexRange = slider.right.dex - slider.left.dex\n proposedDex = slider.left.dex + (slider.dexRange / 2)\n proposedCex = slider.left.cex + (slider.cexRange / 2)\n }\n } else { // starved\n if (cexAvail < cexReq) {\n proposedDex = Math.min(dexAvail, dexReq + transferable + (cexReq - cexAvail))\n } else if (dexAvail < dexReq) {\n proposedCex = Math.min(cexAvail, cexReq + transferable + (dexReq - dexAvail))\n } else { // just transferable wasn't covered\n proposedDex = Math.min(dexAvail, dexReq + transferable)\n proposedCex = Math.min(cexAvail, dexReq + cexReq + transferable - proposedDex)\n }\n }\n return [proposedDex, proposedCex, slider]\n}\n\ninterface CEXRow {\n cexName: string\n tr: PageElement\n tmpl: Record<string, PageElement>\n dinfo: CEXDisplayInfo\n}\n\nexport default class MarketMakerPage extends BasePage {\n page: Record<string, PageElement>\n forms: Forms\n currentForm: HTMLElement\n keyup: (e: KeyboardEvent) => void\n cexConfigForm: CEXConfigurationForm\n bots: Record<string, Bot>\n sortedBots: Bot[]\n cexes: Record<string, CEXRow>\n twoColumn: boolean\n runningMMDisplayElements: RunningMMDisplayElements\n removingCfg: MarketWithHost | undefined\n\n constructor (main: HTMLElement) {\n super()\n\n this.bots = {}\n this.sortedBots = []\n this.cexes = {}\n\n const page = this.page = Doc.idDescendants(main)\n\n Doc.cleanTemplates(page.botTmpl, page.botRowTmpl, page.exchangeRowTmpl)\n\n this.forms = new Forms(page.forms)\n this.cexConfigForm = new CEXConfigurationForm(page.cexConfigForm, (cexName: string, success: boolean) => this.cexConfigured(cexName, success))\n this.runningMMDisplayElements = {\n orderReportForm: page.orderReportForm,\n dexBalancesRowTmpl: page.dexBalancesRowTmpl,\n placementRowTmpl: page.placementRowTmpl,\n placementAmtRowTmpl: page.placementAmtRowTmpl\n }\n Doc.cleanTemplates(page.dexBalancesRowTmpl, page.placementRowTmpl, page.placementAmtRowTmpl)\n\n Doc.bind(page.newBot, 'click', () => { this.newBot() })\n Doc.bind(page.archivedLogsBtn, 'click', () => { app().loadPage('mmarchives') })\n Doc.bind(page.confirmRemoveConfigBttn, 'click', () => { this.removeCfg() })\n\n this.twoColumn = window.innerWidth >= mediumBreakpoint\n const ro = new ResizeObserver(() => { this.resized() })\n ro.observe(main)\n\n for (const [cexName, dinfo] of Object.entries(CEXDisplayInfos)) {\n const tr = page.exchangeRowTmpl.cloneNode(true) as PageElement\n page.cexRows.appendChild(tr)\n const tmpl = Doc.parseTemplate(tr)\n const configure = () => {\n this.cexConfigForm.setCEX(cexName)\n this.forms.show(page.cexConfigForm)\n }\n Doc.bind(tmpl.configureBttn, 'click', configure)\n Doc.bind(tmpl.reconfigBttn, 'click', configure)\n Doc.bind(tmpl.errConfigureBttn, 'click', configure)\n const row = this.cexes[cexName] = { tr, tmpl, dinfo, cexName }\n this.updateCexRow(row)\n }\n\n this.setup()\n }\n\n resized () {\n const useTwoColumn = window.innerWidth >= 768\n if (useTwoColumn !== this.twoColumn) {\n this.twoColumn = useTwoColumn\n this.clearBotBoxes()\n for (const { div } of this.sortedBots) this.appendBotBox(div)\n }\n }\n\n async setup () {\n const page = this.page\n const mmStatus = app().mmStatus\n\n const botConfigs = mmStatus.bots.map((s: MMBotStatus) => s.config)\n app().registerNoteFeeder({\n runstats: (note: RunStatsNote) => { this.handleRunStatsNote(note) },\n runevent: (note: RunEventNote) => {\n const bot = this.bots[hostedMarketID(note.host, note.baseID, note.quoteID)]\n if (bot) return bot.handleRunStats()\n },\n epochreport: (note: EpochReportNote) => {\n const bot = this.bots[hostedMarketID(note.host, note.baseID, note.quoteID)]\n if (bot) bot.handleEpochReportNote(note)\n },\n cexproblems: (note: CEXProblemsNote) => {\n const bot = this.bots[hostedMarketID(note.host, note.baseID, note.quoteID)]\n if (bot) bot.handleCexProblemsNote(note)\n },\n cexnote: (note: CEXNotification) => { this.handleCEXNote(note) }\n // TODO bot start-stop notification\n })\n\n const noBots = !botConfigs || botConfigs.length === 0\n Doc.setVis(noBots, page.noBots)\n if (noBots) return\n page.noBots.remove()\n\n const sortedBots = [...mmStatus.bots].sort((a: MMBotStatus, b: MMBotStatus) => {\n if (a.running && !b.running) return -1\n if (b.running && !a.running) return 1\n // If none are running, just do something to get a resonably reproducible\n // sort.\n if (!a.running && !b.running) return (a.config.baseID + a.config.quoteID) - (b.config.baseID + b.config.quoteID)\n // Both are running. Sort by run time.\n return (b.runStats?.startTime ?? 0) - (a.runStats?.startTime ?? 0)\n })\n\n for (const botStatus of sortedBots) this.addBot(botStatus)\n }\n\n async handleCEXNote (n: CEXNotification) {\n switch (n.topic) {\n case 'BalanceUpdate':\n return this.handleCEXBalanceUpdate(n.cexName /* , n.note */)\n }\n }\n\n async handleCEXBalanceUpdate (cexName: string /* , note: CEXBalanceUpdate */) {\n const cexRow = this.cexes[cexName]\n if (cexRow) this.updateCexRow(cexRow)\n }\n\n async handleRunStatsNote (note: RunStatsNote) {\n const { baseID, quoteID, host } = note\n const bot = this.bots[hostedMarketID(host, baseID, quoteID)]\n if (bot) return bot.handleRunStats()\n this.addBot(app().botStatus(host, baseID, quoteID) as MMBotStatus)\n }\n\n unload (): void {\n Doc.unbind(document, 'keyup', this.keyup)\n }\n\n addBot (botStatus: MMBotStatus) {\n const { page, bots, sortedBots } = this\n // Make sure the market still exists.\n const { config: { baseID, quoteID, host } } = botStatus\n const [baseSymbol, quoteSymbol] = [app().assets[baseID].symbol, app().assets[quoteID].symbol]\n const mktID = `${baseSymbol}_${quoteSymbol}`\n if (!app().exchanges[host]?.markets[mktID]) return\n const bot = new Bot(this, this.runningMMDisplayElements, botStatus)\n page.botRows.appendChild(bot.row.tr)\n sortedBots.push(bot)\n bots[bot.id] = bot\n this.appendBotBox(bot.div)\n }\n\n confirmRemoveCfg (mwh: MarketWithHost) {\n const page = this.page\n this.removingCfg = mwh\n Doc.hide(page.removeCfgErr)\n const { unitInfo: { conventional: { unit: baseTicker } } } = app().assets[mwh.baseID]\n const { unitInfo: { conventional: { unit: quoteTicker } } } = app().assets[mwh.quoteID]\n page.confirmRemoveCfgMsg.textContent = intl.prep(intl.ID_DELETE_BOT, { host: mwh.host, baseTicker, quoteTicker })\n this.forms.show(this.page.confirmRemoveForm)\n }\n\n async removeCfg () {\n const page = this.page\n if (!this.removingCfg) { this.forms.close(); return }\n const resp = await MM.removeBotConfig(this.removingCfg.host, this.removingCfg.baseID, this.removingCfg.quoteID)\n if (!app().checkResponse(resp)) {\n page.removeCfgErr.textContent = intl.prep(intl.ID_API_ERROR, { msg: resp.msg })\n Doc.show(page.removeCfgErr)\n return\n }\n await app().fetchMMStatus()\n app().loadPage('mm')\n }\n\n appendBotBox (div: PageElement) {\n const { page: { boxZero, boxOne }, twoColumn } = this\n const useZeroth = !twoColumn || (boxZero.children.length + boxOne.children.length) % 2 === 0\n const box = useZeroth ? boxZero : boxOne\n box.append(div)\n }\n\n clearBotBoxes () {\n const { page: { boxOne, boxZero } } = this\n while (boxZero.children.length > 1) boxZero.removeChild(boxZero.lastChild as Element)\n while (boxOne.children.length > 0) boxOne.removeChild(boxOne.lastChild as Element)\n }\n\n showBot (botID: string) {\n const { sortedBots } = this\n const idx = sortedBots.findIndex((bot: Bot) => bot.id === botID)\n sortedBots.splice(idx, 1)\n sortedBots.unshift(this.bots[botID])\n this.clearBotBoxes()\n for (const { div } of sortedBots) this.appendBotBox(div)\n const div = this.bots[botID].div\n Doc.animate(250, (p: number) => {\n div.style.opacity = `${p}`\n div.style.transform = `scale(${0.8 + 0.2 * p})`\n })\n }\n\n newBot () {\n app().loadPage('mmsettings')\n }\n\n async cexConfigured (cexName: string, success: boolean) {\n await app().fetchMMStatus()\n this.updateCexRow(this.cexes[cexName])\n if (success) this.forms.close()\n }\n\n updateCexRow (row: CEXRow) {\n const { tmpl, dinfo, cexName } = row\n tmpl.logo.src = dinfo.logo\n tmpl.name.textContent = dinfo.name\n const status = app().mmStatus.cexes[cexName]\n Doc.setVis(!status, tmpl.unconfigured)\n Doc.setVis(status && !status.connectErr, tmpl.configured)\n Doc.setVis(status?.connectErr, tmpl.connectErrBox)\n if (status?.connectErr) {\n tmpl.connectErr.textContent = 'connection error'\n tmpl.connectErr.dataset.tooltip = status.connectErr\n }\n tmpl.logo.classList.toggle('greyscale', !status)\n if (!status) return\n let usdBal = 0\n const cexSymbolAdded : Record<string, boolean> = {} // avoid double counting tokens or counting both eth and weth\n for (const [assetIDStr, bal] of Object.entries(status.balances)) {\n const assetID = parseInt(assetIDStr)\n const cexSymbol = Doc.bipCEXSymbol(assetID)\n if (cexSymbolAdded[cexSymbol]) continue\n cexSymbolAdded[cexSymbol] = true\n const { unitInfo } = app().assets[assetID]\n const fiatRate = app().fiatRatesMap[assetID]\n if (fiatRate) usdBal += fiatRate * (bal.available + bal.locked) / unitInfo.conventional.conversionFactor\n }\n tmpl.usdBalance.textContent = Doc.formatFourSigFigs(usdBal)\n }\n\n percentageBalanceStr (assetID: number, balance: number, percentage: number): string {\n const asset = app().assets[assetID]\n const unitInfo = asset.unitInfo\n const assetValue = Doc.formatCoinValue((balance * percentage) / 100, unitInfo)\n return `${Doc.formatFourSigFigs(percentage)}% - ${assetValue} ${asset.symbol.toUpperCase()}`\n }\n\n /*\n * walletBalanceStr returns a string like \"50% - 0.0001 BTC\" representing\n * the percentage of a wallet's balance selected in the market maker setting,\n * and the amount of that asset in the wallet.\n */\n walletBalanceStr (assetID: number, percentage: number): string {\n const { wallet: { balance: { available } } } = app().assets[assetID]\n return this.percentageBalanceStr(assetID, available, percentage)\n }\n}\n\ninterface BotRow {\n tr: PageElement\n tmpl: Record<string, PageElement>\n}\n\nclass Bot extends BotMarket {\n pg: MarketMakerPage\n div: PageElement\n page: Record<string, PageElement>\n placementsChart: PlacementsChart\n baseAllocSlider: MiniSlider\n quoteAllocSlider: MiniSlider\n row: BotRow\n runDisplay: RunningMarketMakerDisplay\n\n constructor (pg: MarketMakerPage, runningMMElements: RunningMMDisplayElements, status: MMBotStatus) {\n super(status.config)\n this.pg = pg\n const { baseID, quoteID, host, botType, nBuyPlacements, nSellPlacements, cexName } = this\n this.id = hostedMarketID(host, baseID, quoteID)\n\n const div = this.div = pg.page.botTmpl.cloneNode(true) as PageElement\n const page = this.page = Doc.parseTemplate(div)\n\n this.runDisplay = new RunningMarketMakerDisplay(page.onBox, pg.forms, runningMMElements, 'mm')\n\n setMarketElements(div, baseID, quoteID, host)\n if (cexName) setCexElements(div, cexName)\n\n if (botType === botTypeArbMM) {\n page.botTypeDisplay.textContent = intl.prep(intl.ID_BOTTYPE_ARB_MM)\n } else if (botType === botTypeBasicArb) {\n page.botTypeDisplay.textContent = intl.prep(intl.ID_BOTTYPE_SIMPLE_ARB)\n } else if (botType === botTypeBasicMM) {\n page.botTypeDisplay.textContent = intl.prep(intl.ID_BOTTYPE_BASIC_MM)\n }\n\n Doc.setVis(botType !== botTypeBasicArb, page.placementsChartBox, page.baseTokenSwapFeesBox)\n if (botType !== botTypeBasicArb) {\n this.placementsChart = new PlacementsChart(page.placementsChart)\n page.buyPlacementCount.textContent = String(nBuyPlacements)\n page.sellPlacementCount.textContent = String(nSellPlacements)\n }\n\n Doc.bind(page.startBttn, 'click', () => this.start())\n Doc.bind(page.allocationBttn, 'click', () => this.allocate())\n Doc.bind(page.reconfigureBttn, 'click', () => this.reconfigure())\n Doc.bind(page.removeBttn, 'click', () => this.pg.confirmRemoveCfg(status.config))\n Doc.bind(page.goBackFromAllocation, 'click', () => this.hideAllocationDialog())\n Doc.bind(page.marketLink, 'click', () => app().loadPage('markets', { host, baseID, quoteID }))\n\n this.baseAllocSlider = new MiniSlider(page.baseAllocSlider, () => { /* callback set later */ })\n this.quoteAllocSlider = new MiniSlider(page.quoteAllocSlider, () => { /* callback set later */ })\n\n const tr = pg.page.botRowTmpl.cloneNode(true) as PageElement\n setMarketElements(tr, baseID, quoteID, host)\n const tmpl = Doc.parseTemplate(tr)\n this.row = { tr, tmpl }\n Doc.bind(tmpl.allocateBttn, 'click', (e: MouseEvent) => {\n e.stopPropagation()\n this.allocate()\n pg.showBot(this.id)\n })\n Doc.bind(tr, 'click', () => pg.showBot(this.id))\n\n this.initialize()\n }\n\n async initialize () {\n await super.initialize()\n this.runDisplay.setBotMarket(this)\n const {\n page, host, cexName, botType, div,\n cfg: { arbMarketMakingConfig, basicMarketMakingConfig }, mktID,\n baseFactor, quoteFactor, marketReport: { baseFiatRate }\n } = this\n\n if (botType !== botTypeBasicArb) {\n let buyPlacements: OrderPlacement[] = []\n let sellPlacements: OrderPlacement[] = []\n let profit = 0\n if (arbMarketMakingConfig) {\n buyPlacements = arbMarketMakingConfig.buyPlacements.map((p) => ({ lots: p.lots, gapFactor: p.multiplier }))\n sellPlacements = arbMarketMakingConfig.sellPlacements.map((p) => ({ lots: p.lots, gapFactor: p.multiplier }))\n profit = arbMarketMakingConfig.profit\n } else if (basicMarketMakingConfig) {\n buyPlacements = basicMarketMakingConfig.buyPlacements\n sellPlacements = basicMarketMakingConfig.sellPlacements\n let bestBuy: OrderPlacement | undefined\n let bestSell : OrderPlacement | undefined\n if (buyPlacements.length > 0) bestBuy = buyPlacements.reduce((prev: OrderPlacement, curr: OrderPlacement) => curr.gapFactor < prev.gapFactor ? curr : prev)\n if (sellPlacements.length > 0) bestSell = sellPlacements.reduce((prev: OrderPlacement, curr: OrderPlacement) => curr.gapFactor < prev.gapFactor ? curr : prev)\n if (bestBuy && bestSell) {\n profit = (bestBuy.gapFactor + bestSell.gapFactor) / 2\n } else if (bestBuy) {\n profit = bestBuy.gapFactor\n } else if (bestSell) {\n profit = bestSell.gapFactor\n }\n }\n const marketConfig = { cexName: cexName as string, botType, baseFiatRate: baseFiatRate, dict: { profit, buyPlacements, sellPlacements } }\n this.placementsChart.setMarket(marketConfig)\n }\n\n Doc.setVis(botType !== botTypeBasicMM, page.cexDataBox)\n if (botType !== botTypeBasicMM) {\n const cex = app().mmStatus.cexes[cexName]\n if (cex) {\n const mkt = cex.markets ? cex.markets[mktID] : undefined\n Doc.setVis(mkt?.day, page.cexDataBox)\n if (mkt?.day) {\n const day = mkt.day\n page.cexPrice.textContent = Doc.formatFourSigFigs(day.lastPrice)\n page.cexVol.textContent = Doc.formatFourSigFigs(baseFiatRate * day.vol)\n }\n }\n }\n Doc.setVis(Boolean(cexName), ...Doc.applySelector(div, '[data-cex-show]'))\n\n const { spot } = app().exchanges[host].markets[mktID]\n if (spot) {\n Doc.show(page.dexDataBox)\n const c = OrderUtil.RateEncodingFactor / baseFactor * quoteFactor\n page.dexPrice.textContent = Doc.formatFourSigFigs(spot.rate / c)\n page.dexVol.textContent = Doc.formatFourSigFigs(spot.vol24 / baseFactor * baseFiatRate)\n }\n\n this.updateDisplay()\n this.updateTableRow()\n Doc.hide(page.loadingBg)\n }\n\n updateTableRow () {\n const { row: { tmpl } } = this\n const { running, runStats } = this.status()\n Doc.setVis(running, tmpl.profitLossBox)\n Doc.setVis(!running, tmpl.allocateBttnBox)\n if (runStats) {\n tmpl.profitLoss.textContent = Doc.formatFourSigFigs(runStats.profitLoss.profit, 2)\n }\n }\n\n updateDisplay () {\n const { page, marketReport: { baseFiatRate, quoteFiatRate }, baseFeeFiatRate, quoteFeeFiatRate } = this\n if ([baseFiatRate, quoteFiatRate, baseFeeFiatRate, quoteFeeFiatRate].some((r: number) => !r)) {\n Doc.hide(page.onBox, page.offBox)\n Doc.show(page.noFiatDisplay)\n return\n }\n const { running } = this.status()\n Doc.setVis(running, page.onBox)\n Doc.setVis(!running, page.offBox)\n if (running) this.updateRunningDisplay()\n else this.updateIdleDisplay()\n }\n\n updateRunningDisplay () {\n this.runDisplay.update()\n }\n\n updateIdleDisplay () {\n const {\n page, proj: { alloc, qProj, bProj }, baseID, quoteID, cexName, bui, qui, baseFeeID,\n quoteFeeID, baseFactor, quoteFactor, baseFeeFactor, quoteFeeFactor,\n marketReport: { baseFiatRate, quoteFiatRate }, cfg: { uiConfig: { baseConfig, quoteConfig } },\n quoteFeeUI, baseFeeUI\n } = this\n page.baseAlloc.textContent = Doc.formatFullPrecision(alloc[baseID], bui)\n const baseUSD = alloc[baseID] / baseFactor * baseFiatRate\n let totalUSD = baseUSD\n page.baseAllocUSD.textContent = Doc.formatFourSigFigs(baseUSD)\n page.baseBookAlloc.textContent = Doc.formatFullPrecision(bProj.book * baseFactor, bui)\n page.baseOrderReservesAlloc.textContent = Doc.formatFullPrecision(bProj.orderReserves * baseFactor, bui)\n page.baseOrderReservesPct.textContent = String(Math.round(baseConfig.orderReservesFactor * 100))\n Doc.setVis(cexName, page.baseCexAllocBox)\n if (cexName) page.baseCexAlloc.textContent = Doc.formatFullPrecision(bProj.cex * baseFactor, bui)\n Doc.setVis(baseFeeID === baseID, page.baseBookingFeesAllocBox)\n Doc.setVis(baseFeeID !== baseID, page.baseTokenFeesAllocBox)\n if (baseFeeID === baseID) {\n const bookingFees = baseID === quoteFeeID ? bProj.bookingFees + qProj.bookingFees : bProj.bookingFees\n page.baseBookingFeesAlloc.textContent = Doc.formatFullPrecision(bookingFees * baseFeeFactor, baseFeeUI)\n } else {\n const feeAlloc = alloc[baseFeeID]\n page.baseTokenFeeAlloc.textContent = Doc.formatFullPrecision(feeAlloc, baseFeeUI)\n const baseFeeUSD = feeAlloc / baseFeeFactor * app().fiatRatesMap[baseFeeID]\n totalUSD += baseFeeUSD\n page.baseTokenAllocUSD.textContent = Doc.formatFourSigFigs(baseFeeUSD)\n const withQuote = baseFeeID === quoteFeeID\n const bookingFees = bProj.bookingFees + (withQuote ? qProj.bookingFees : 0)\n page.baseTokenBookingFees.textContent = Doc.formatFullPrecision(bookingFees * baseFeeFactor, baseFeeUI)\n page.baseTokenSwapFeeN.textContent = String(baseConfig.swapFeeN + (withQuote ? quoteConfig.swapFeeN : 0))\n const swapReserves = bProj.swapFeeReserves + (withQuote ? qProj.swapFeeReserves : 0)\n page.baseTokenSwapFees.textContent = Doc.formatFullPrecision(swapReserves * baseFeeFactor, baseFeeUI)\n }\n\n page.quoteAlloc.textContent = Doc.formatFullPrecision(alloc[quoteID], qui)\n const quoteUSD = alloc[quoteID] / quoteFactor * quoteFiatRate\n totalUSD += quoteUSD\n page.quoteAllocUSD.textContent = Doc.formatFourSigFigs(quoteUSD)\n page.quoteBookAlloc.textContent = Doc.formatFullPrecision(qProj.book * quoteFactor, qui)\n page.quoteOrderReservesAlloc.textContent = Doc.formatFullPrecision(qProj.orderReserves * quoteFactor, qui)\n page.quoteOrderReservesPct.textContent = String(Math.round(quoteConfig.orderReservesFactor * 100))\n page.quoteSlippageAlloc.textContent = Doc.formatFullPrecision(qProj.slippageBuffer * quoteFactor, qui)\n page.slippageBufferFactor.textContent = String(Math.round(quoteConfig.slippageBufferFactor * 100))\n Doc.setVis(cexName, page.quoteCexAllocBox)\n if (cexName) page.quoteCexAlloc.textContent = Doc.formatFullPrecision(qProj.cex * quoteFactor, qui)\n Doc.setVis(quoteID === quoteFeeID, page.quoteBookingFeesAllocBox)\n Doc.setVis(quoteFeeID !== quoteID && quoteFeeID !== baseFeeID, page.quoteTokenFeesAllocBox)\n if (quoteID === quoteFeeID) {\n const bookingFees = quoteID === baseFeeID ? bProj.bookingFees + qProj.bookingFees : qProj.bookingFees\n page.quoteBookingFeesAlloc.textContent = Doc.formatFullPrecision(bookingFees * quoteFeeFactor, quoteFeeUI)\n } else if (quoteFeeID !== baseFeeID) {\n page.quoteTokenFeeAlloc.textContent = Doc.formatFullPrecision(alloc[quoteFeeID], quoteFeeUI)\n const quoteFeeUSD = alloc[quoteFeeID] / quoteFeeFactor * app().fiatRatesMap[quoteFeeID]\n totalUSD += quoteFeeUSD\n page.quoteTokenAllocUSD.textContent = Doc.formatFourSigFigs(quoteFeeUSD)\n page.quoteTokenBookingFees.textContent = Doc.formatFullPrecision(qProj.bookingFees * quoteFeeFactor, quoteFeeUI)\n page.quoteTokenSwapFeeN.textContent = String(quoteConfig.swapFeeN)\n page.quoteTokenSwapFees.textContent = Doc.formatFullPrecision(qProj.swapFeeReserves * quoteFeeFactor, quoteFeeUI)\n }\n page.totalAllocUSD.textContent = Doc.formatFourSigFigs(totalUSD)\n }\n\n /*\n * allocate opens a dialog to choose funding sources (if applicable) and\n * confirm allocations and start the bot.\n */\n allocate () {\n const {\n page, marketReport: { baseFiatRate, quoteFiatRate }, baseID, quoteID,\n baseFeeID, quoteFeeID, baseFeeFiatRate, quoteFeeFiatRate, cexName,\n baseFactor, quoteFactor, baseFeeFactor, quoteFeeFactor, host, mktID\n } = this\n\n if (cexName) {\n const cex = app().mmStatus.cexes[cexName]\n if (!cex || !cex.connected) {\n page.offError.textContent = intl.prep(intl.ID_CEX_NOT_CONNECTED, { cexName })\n Doc.showTemporarily(3000, page.offError)\n return\n }\n }\n\n const f = this.fundingState()\n\n const [proposedDexBase, proposedCexBase, baseSlider] = parseFundingOptions(f.base)\n const [proposedDexQuote, proposedCexQuote, quoteSlider] = parseFundingOptions(f.quote)\n\n const alloc = this.alloc = {\n dex: {\n [baseID]: proposedDexBase * baseFactor,\n [quoteID]: proposedDexQuote * quoteFactor\n },\n cex: {\n [baseID]: proposedCexBase * baseFactor,\n [quoteID]: proposedCexQuote * quoteFactor\n }\n }\n\n alloc.dex[baseFeeID] = Math.min((alloc.dex[baseFeeID] ?? 0) + (f.base.fees.req * baseFeeFactor), f.base.fees.avail * baseFeeFactor)\n alloc.dex[quoteFeeID] = Math.min((alloc.dex[quoteFeeID] ?? 0) + (f.quote.fees.req * quoteFeeFactor), f.quote.fees.avail * quoteFeeFactor)\n\n let totalUSD = (alloc.dex[baseID] / baseFactor * baseFiatRate) + (alloc.dex[quoteID] / quoteFactor * quoteFiatRate)\n totalUSD += (alloc.cex[baseID] / baseFactor * baseFiatRate) + (alloc.cex[quoteID] / quoteFactor * quoteFiatRate)\n if (baseFeeID !== baseID) totalUSD += alloc.dex[baseFeeID] / baseFeeFactor * baseFeeFiatRate\n if (quoteFeeID !== quoteID && quoteFeeID !== baseFeeID) totalUSD += alloc.dex[quoteFeeID] / quoteFeeFactor * quoteFeeFiatRate\n page.allocUSD.textContent = Doc.formatFourSigFigs(totalUSD)\n\n Doc.setVis(cexName, ...Doc.applySelector(page.allocationDialog, '[data-cex-only]'))\n Doc.setVis(f.fundedAndBalanced, page.fundedAndBalancedBox)\n Doc.setVis(f.base.transferable + f.quote.transferable > 0, page.hasTransferable)\n Doc.setVis(f.fundedAndNotBalanced, page.fundedAndNotBalancedBox)\n Doc.setVis(f.starved, page.starvedBox)\n page.startBttn.classList.toggle('go', f.fundedAndBalanced)\n page.startBttn.classList.toggle('warning', !f.fundedAndBalanced)\n page.proposedDexBaseAlloc.classList.toggle('text-warning', !(f.base.fundedAndBalanced || f.base.fundedAndNotBalanced))\n page.proposedDexQuoteAlloc.classList.toggle('text-warning', !(f.quote.fundedAndBalanced || f.quote.fundedAndNotBalanced))\n\n const setBaseProposal = (dex: number, cex: number) => {\n page.proposedDexBaseAlloc.textContent = Doc.formatFourSigFigs(dex)\n page.proposedDexBaseAllocUSD.textContent = Doc.formatFourSigFigs(dex * baseFiatRate)\n page.proposedCexBaseAlloc.textContent = Doc.formatFourSigFigs(cex)\n page.proposedCexBaseAllocUSD.textContent = Doc.formatFourSigFigs(cex * baseFiatRate)\n }\n setBaseProposal(proposedDexBase, proposedCexBase)\n\n Doc.setVis(baseSlider, page.baseAllocSlider)\n if (baseSlider) {\n const dexRange = baseSlider.right.dex - baseSlider.left.dex\n const cexRange = baseSlider.right.cex - baseSlider.left.cex\n this.baseAllocSlider.setValue(0.5)\n this.baseAllocSlider.changed = (r: number) => {\n const dexAlloc = baseSlider.left.dex + r * dexRange\n const cexAlloc = baseSlider.left.cex + r * cexRange\n alloc.dex[baseID] = dexAlloc * baseFactor\n alloc.cex[baseID] = cexAlloc * baseFactor\n setBaseProposal(dexAlloc, cexAlloc)\n }\n }\n\n const setQuoteProposal = (dex: number, cex: number) => {\n page.proposedDexQuoteAlloc.textContent = Doc.formatFourSigFigs(dex)\n page.proposedDexQuoteAllocUSD.textContent = Doc.formatFourSigFigs(dex * quoteFiatRate)\n page.proposedCexQuoteAlloc.textContent = Doc.formatFourSigFigs(cex)\n page.proposedCexQuoteAllocUSD.textContent = Doc.formatFourSigFigs(cex * quoteFiatRate)\n }\n setQuoteProposal(proposedDexQuote, proposedCexQuote)\n\n Doc.setVis(quoteSlider, page.quoteAllocSlider)\n if (quoteSlider) {\n const dexRange = quoteSlider.right.dex - quoteSlider.left.dex\n const cexRange = quoteSlider.right.cex - quoteSlider.left.cex\n this.quoteAllocSlider.setValue(0.5)\n this.quoteAllocSlider.changed = (r: number) => {\n const dexAlloc = quoteSlider.left.dex + r * dexRange\n const cexAlloc = quoteSlider.left.cex + r * cexRange\n alloc.dex[quoteID] = dexAlloc * quoteFactor\n alloc.cex[quoteID] = cexAlloc * quoteFactor\n setQuoteProposal(dexAlloc, cexAlloc)\n }\n }\n\n Doc.setVis(baseFeeID !== baseID, ...Doc.applySelector(page.allocationDialog, '[data-base-token-fees]'))\n if (baseFeeID !== baseID) {\n const reqFees = f.base.fees.req + (baseFeeID === quoteFeeID ? f.quote.fees.req : 0)\n const proposedFees = Math.min(reqFees, f.base.fees.avail)\n page.proposedDexBaseFeeAlloc.textContent = Doc.formatFourSigFigs(proposedFees)\n page.proposedDexBaseFeeAllocUSD.textContent = Doc.formatFourSigFigs(proposedFees * baseFeeFiatRate)\n page.proposedDexBaseFeeAlloc.classList.toggle('text-warning', !f.base.fees.funded)\n }\n\n const needQuoteTokenFees = quoteFeeID !== quoteID && quoteFeeID !== baseFeeID\n Doc.setVis(needQuoteTokenFees, ...Doc.applySelector(page.allocationDialog, '[data-quote-token-fees]'))\n if (needQuoteTokenFees) {\n const proposedFees = Math.min(f.quote.fees.req, f.quote.fees.avail)\n page.proposedDexQuoteFeeAlloc.textContent = Doc.formatFourSigFigs(proposedFees)\n page.proposedDexQuoteFeeAllocUSD.textContent = Doc.formatFourSigFigs(proposedFees * quoteFeeFiatRate)\n page.proposedDexQuoteFeeAlloc.classList.toggle('text-warning', !f.quote.fees.funded)\n }\n\n const mkt = app().exchanges[host]?.markets[mktID]\n let existingOrders = false\n if (mkt && mkt.orders) {\n for (let i = 0; i < mkt.orders.length; i++) {\n if (mkt.orders[i].status <= StatusBooked) {\n existingOrders = true\n break\n }\n }\n }\n Doc.setVis(existingOrders, page.existingOrdersBox)\n\n Doc.show(page.allocationDialog)\n const closeDialog = (e: MouseEvent) => {\n if (Doc.mouseInElement(e, page.allocationDialog)) return\n this.hideAllocationDialog()\n Doc.unbind(document, 'click', closeDialog)\n }\n Doc.bind(document, 'click', closeDialog)\n }\n\n hideAllocationDialog () {\n Doc.hide(this.page.allocationDialog)\n }\n\n async start () {\n const { page, alloc, baseID, quoteID, host, cexName, cfg: { uiConfig: { cexRebalance } } } = this\n\n Doc.hide(page.errMsg)\n if (cexName && !app().mmStatus.cexes[cexName]?.connected) {\n page.errMsg.textContent = `${cexName} not connected`\n Doc.show(page.errMsg)\n return\n }\n\n // round allocations values.\n for (const m of [alloc.dex, alloc.cex]) {\n for (const [assetID, v] of Object.entries(m)) m[parseInt(assetID)] = Math.round(v)\n }\n\n const startConfig: StartConfig = {\n baseID: baseID,\n quoteID: quoteID,\n host: host,\n alloc: alloc\n }\n if (cexName && cexRebalance) startConfig.autoRebalance = this.autoRebalanceSettings()\n\n try {\n app().log('mm', 'starting mm bot', startConfig)\n const res = await MM.startBot(startConfig)\n if (!app().checkResponse(res)) throw res\n } catch (e) {\n page.errMsg.textContent = intl.prep(intl.ID_API_ERROR, e)\n Doc.show(page.errMsg)\n return\n }\n this.hideAllocationDialog()\n }\n\n autoRebalanceSettings (): AutoRebalanceConfig {\n const {\n proj: { bProj, qProj, alloc }, baseFeeID, quoteFeeID, cfg: { uiConfig: { baseConfig, quoteConfig } },\n baseID, quoteID, cexName, mktID\n } = this\n\n const totalBase = alloc[baseID]\n let dexMinBase = bProj.book\n if (baseID === baseFeeID) dexMinBase += bProj.bookingFees\n if (baseID === quoteFeeID) dexMinBase += qProj.bookingFees\n let dexMinQuote = qProj.book\n if (quoteID === quoteFeeID) dexMinQuote += qProj.bookingFees\n if (quoteID === baseFeeID) dexMinQuote += bProj.bookingFees\n const maxBase = Math.max(totalBase - dexMinBase, totalBase - bProj.cex)\n const totalQuote = alloc[quoteID]\n const maxQuote = Math.max(totalQuote - dexMinQuote, totalQuote - qProj.cex)\n if (maxBase < 0 || maxQuote < 0) {\n throw Error(`rebalance math doesn't work: ${JSON.stringify({ bProj, qProj, maxBase, maxQuote })}`)\n }\n const cex = app().mmStatus.cexes[cexName]\n const mkt = cex.markets[mktID]\n const [minB, maxB] = [mkt.baseMinWithdraw, Math.max(mkt.baseMinWithdraw * 2, maxBase)]\n const minBaseTransfer = Math.round(minB + baseConfig.transferFactor * (maxB - minB))\n const [minQ, maxQ] = [mkt.quoteMinWithdraw, Math.max(mkt.quoteMinWithdraw * 2, maxQuote)]\n const minQuoteTransfer = Math.round(minQ + quoteConfig.transferFactor * (maxQ - minQ))\n return { minBaseTransfer, minQuoteTransfer }\n }\n\n reconfigure () {\n const { host, baseID, quoteID, cexName, botType, page } = this\n if (cexName) {\n const cex = app().mmStatus.cexes[cexName]\n if (!cex || !cex.connected) {\n page.offError.textContent = intl.prep(intl.ID_CEX_NOT_CONNECTED, { cexName })\n Doc.showTemporarily(3000, page.offError)\n return\n }\n }\n app().loadPage('mmsettings', { host, baseID, quoteID, cexName, botType })\n }\n\n handleEpochReportNote (note: EpochReportNote) {\n this.runDisplay.handleEpochReportNote(note)\n }\n\n handleCexProblemsNote (note: CEXProblemsNote) {\n this.runDisplay.handleCexProblemsNote(note)\n }\n\n handleRunStats () {\n this.updateDisplay()\n this.updateTableRow()\n this.runDisplay.readBook()\n }\n}\n","import {\n PageElement,\n BotConfig,\n OrderPlacement,\n app,\n Spot,\n MarketReport,\n OrderOption,\n CEXConfig,\n BasicMarketMakingConfig,\n ArbMarketMakingConfig,\n SimpleArbConfig,\n ArbMarketMakingPlacement,\n ExchangeBalance,\n MarketMakingStatus,\n MMCEXStatus,\n BalanceNote,\n BotAssetConfig,\n ApprovalStatus,\n SupportedAsset,\n WalletState,\n UnitInfo,\n ProjectedAlloc,\n AssetBookingFees\n} from './registry'\nimport Doc, {\n NumberInput,\n MiniSlider,\n IncrementalInput,\n toFourSigFigs,\n toPrecision,\n parseFloatDefault\n} from './doc'\nimport State from './state'\nimport BasePage from './basepage'\nimport { setOptionTemplates } from './opts'\nimport {\n MM,\n CEXDisplayInfos,\n botTypeBasicArb,\n botTypeArbMM,\n botTypeBasicMM,\n runningBotInventory,\n setMarketElements,\n setCexElements,\n calculateQuoteLot,\n PlacementsChart,\n liveBotConfig,\n GapStrategyMultiplier,\n GapStrategyAbsolute,\n GapStrategyAbsolutePlus,\n GapStrategyPercent,\n GapStrategyPercentPlus,\n feesAndCommit\n} from './mmutil'\nimport { Forms, bind as bindForm, NewWalletForm, TokenApprovalForm, DepositAddress, CEXConfigurationForm } from './forms'\nimport * as intl from './locales'\nimport * as OrderUtil from './orderutil'\n\nconst specLK = 'lastMMSpecs'\nconst lastBotsLK = 'lastBots'\nconst lastArbExchangeLK = 'lastArbExchange'\nconst arbMMRowCacheKey = 'arbmm'\n\nconst defaultSwapReserves = {\n n: 50,\n prec: 0,\n inc: 10,\n minR: 0,\n maxR: 1000,\n range: 1000\n}\nconst defaultOrderReserves = {\n factor: 1.0,\n minR: 0,\n maxR: 3,\n range: 3,\n prec: 3\n}\nconst defaultTransfer = {\n factor: 0.1,\n minR: 0,\n maxR: 1,\n range: 1\n}\nconst defaultSlippage = {\n factor: 0.05,\n minR: 0,\n maxR: 0.3,\n range: 0.3,\n prec: 3\n}\nconst defaultDriftTolerance = {\n value: 0.002,\n minV: 0,\n maxV: 0.02,\n range: 0.02,\n prec: 5\n}\nconst defaultOrderPersistence = {\n value: 20,\n minV: 0,\n maxV: 40, // 10 minutes @ 15 second epochs\n range: 40,\n prec: 0\n}\nconst defaultProfit = {\n prec: 3,\n value: 0.01,\n minV: 0.001,\n maxV: 0.1,\n range: 0.1 - 0.001\n}\nconst defaultLevelSpacing = {\n prec: 3,\n value: 0.005,\n minV: 0.001,\n maxV: 0.02,\n range: 0.02 - 0.0001\n}\nconst defaultMatchBuffer = {\n value: 0,\n prec: 3,\n minV: 0,\n maxV: 1,\n range: 1\n}\nconst defaultLevelsPerSide = {\n prec: 0,\n inc: 1,\n value: 1,\n minV: 1\n}\nconst defaultLotsPerLevel = {\n prec: 0,\n value: 1,\n minV: 1,\n usdIncrement: 100\n}\nconst defaultUSDPerSide = {\n prec: 2\n}\n\nconst defaultMarketMakingConfig: ConfigState = {\n gapStrategy: GapStrategyPercentPlus,\n sellPlacements: [],\n buyPlacements: [],\n driftTolerance: defaultDriftTolerance.value,\n profit: 0.02,\n orderPersistence: defaultOrderPersistence.value,\n cexRebalance: true,\n simpleArbLots: 1\n} as any as ConfigState\n\nconst defaultBotAssetConfig: BotAssetConfig = {\n swapFeeN: defaultSwapReserves.n,\n orderReservesFactor: defaultOrderReserves.factor,\n slippageBufferFactor: defaultSlippage.factor,\n transferFactor: defaultTransfer.factor\n}\n\n// cexButton stores parts of a CEX selection button.\ninterface cexButton {\n name: string\n div: PageElement\n tmpl: Record<string, PageElement>\n}\n\n/*\n * ConfigState is an amalgamation of BotConfig, ArbMarketMakingCfg, and\n * BasicMarketMakingCfg. ConfigState tracks the global state of the options\n * presented on the page, with a single field for each option / control element.\n * ConfigState is necessary because there are duplicate fields in the various\n * config structs, and the placement types are not identical.\n */\ninterface ConfigState {\n gapStrategy: string\n profit: number\n driftTolerance: number\n orderPersistence: number // epochs\n cexRebalance: boolean\n disabled: boolean\n buyPlacements: OrderPlacement[]\n sellPlacements: OrderPlacement[]\n baseOptions: Record<string, string>\n quoteOptions: Record<string, string>\n baseConfig: BotAssetConfig\n quoteConfig: BotAssetConfig\n simpleArbLots: number\n}\n\ninterface BotSpecs {\n host: string\n baseID: number\n quoteID: number\n botType: string\n cexName?: string\n}\n\ninterface MarketRow {\n tr: PageElement\n tmpl: Record<string, PageElement>\n host: string\n name: string\n baseID: number\n quoteID: number\n arbs: string[]\n spot: Spot\n}\n\ninterface UIOpts {\n usingUSDPerSide?: boolean\n}\n\nexport default class MarketMakerSettingsPage extends BasePage {\n page: Record<string, PageElement>\n forms: Forms\n opts: UIOpts\n newWalletForm: NewWalletForm\n approveTokenForm: TokenApprovalForm\n walletAddrForm: DepositAddress\n cexConfigForm: CEXConfigurationForm\n currentMarket: string\n originalConfig: ConfigState\n updatedConfig: ConfigState\n creatingNewBot: boolean\n marketReport: MarketReport\n qcProfit: NumberInput\n qcProfitSlider: MiniSlider\n qcLevelSpacing: NumberInput\n qcLevelSpacingSlider: MiniSlider\n qcMatchBuffer: NumberInput\n qcMatchBufferSlider: MiniSlider\n qcLevelsPerSide: IncrementalInput\n qcLotsPerLevel: IncrementalInput\n qcUSDPerSide: IncrementalInput\n cexBaseBalance: ExchangeBalance\n cexQuoteBalance: ExchangeBalance\n specs: BotSpecs\n mktID: string\n formSpecs: BotSpecs\n formCexes: Record<string, cexButton>\n placementsCache: Record<string, [OrderPlacement[], OrderPlacement[]]>\n botTypeSelectors: PageElement[]\n marketRows: MarketRow[]\n lotsPerLevelIncrement: number\n placementsChart: PlacementsChart\n basePane: AssetPane\n quotePane: AssetPane\n driftTolerance: NumberInput\n driftToleranceSlider: MiniSlider\n orderPersistence: NumberInput\n orderPersistenceSlider: MiniSlider\n\n constructor (main: HTMLElement, specs: BotSpecs) {\n super()\n\n this.placementsCache = {}\n this.opts = {}\n\n const page = this.page = Doc.idDescendants(main)\n\n this.forms = new Forms(page.forms, {\n closed: () => {\n if (!this.specs?.host || !this.specs?.botType) app().loadPage('mm')\n }\n })\n\n this.placementsChart = new PlacementsChart(page.placementsChart)\n this.approveTokenForm = new TokenApprovalForm(page.approveTokenForm, () => { this.submitBotType() })\n this.walletAddrForm = new DepositAddress(page.walletAddrForm)\n this.cexConfigForm = new CEXConfigurationForm(page.cexConfigForm, (cexName: string) => this.cexConfigured(cexName))\n page.quotePane = page.basePane.cloneNode(true) as PageElement\n page.assetPaneBox.appendChild(page.quotePane)\n this.basePane = new AssetPane(this, page.basePane)\n this.quotePane = new AssetPane(this, page.quotePane)\n\n app().headerSpace.appendChild(page.mmTitle)\n\n setOptionTemplates(page)\n Doc.cleanTemplates(\n page.orderOptTmpl, page.booleanOptTmpl, page.rangeOptTmpl, page.placementRowTmpl,\n page.oracleTmpl, page.cexOptTmpl, page.arbBttnTmpl, page.marketRowTmpl, page.needRegTmpl\n )\n page.basePane.removeAttribute('id') // don't remove from layout\n\n Doc.bind(page.resetButton, 'click', () => { this.setOriginalValues() })\n Doc.bind(page.updateButton, 'click', () => { this.saveSettings() })\n Doc.bind(page.createButton, 'click', async () => { this.saveSettings() })\n Doc.bind(page.deleteBttn, 'click', () => { this.delete() })\n bindForm(page.botTypeForm, page.botTypeSubmit, () => { this.submitBotType() })\n Doc.bind(page.noMarketBttn, 'click', () => { this.showMarketSelectForm() })\n Doc.bind(page.botTypeHeader, 'click', () => { this.reshowBotTypeForm() })\n Doc.bind(page.botTypeChangeMarket, 'click', () => { this.showMarketSelectForm() })\n Doc.bind(page.marketHeader, 'click', () => { this.showMarketSelectForm() })\n Doc.bind(page.marketFilterInput, 'input', () => { this.sortMarketRows() })\n Doc.bind(page.cexRebalanceCheckbox, 'change', () => { this.autoRebalanceChanged() })\n Doc.bind(page.switchToAdvanced, 'click', () => { this.showAdvancedConfig() })\n Doc.bind(page.switchToQuickConfig, 'click', () => { this.switchToQuickConfig() })\n Doc.bind(page.qcMatchBuffer, 'change', () => { this.matchBufferChanged() })\n Doc.bind(page.switchToUSDPerSide, 'click', () => { this.changeSideCommitmentDialog() })\n Doc.bind(page.switchToLotsPerLevel, 'click', () => { this.changeSideCommitmentDialog() })\n // Gap Strategy\n Doc.bind(page.gapStrategySelect, 'change', () => {\n if (!page.gapStrategySelect.value) return\n const gapStrategy = page.gapStrategySelect.value\n this.clearPlacements(this.updatedConfig.gapStrategy)\n this.loadCachedPlacements(gapStrategy)\n this.updatedConfig.gapStrategy = gapStrategy\n this.setGapFactorLabels(gapStrategy)\n this.updateModifiedMarkers()\n })\n\n // Buy/Sell placements\n Doc.bind(page.addBuyPlacementBtn, 'click', () => {\n this.addPlacement(true, null)\n page.addBuyPlacementLots.value = ''\n page.addBuyPlacementGapFactor.value = ''\n this.updateModifiedMarkers()\n this.placementsChart.render()\n this.updateAllocations()\n })\n Doc.bind(page.addSellPlacementBtn, 'click', () => {\n this.addPlacement(false, null)\n page.addSellPlacementLots.value = ''\n page.addSellPlacementGapFactor.value = ''\n this.updateModifiedMarkers()\n this.placementsChart.render()\n this.updateAllocations()\n })\n\n this.driftTolerance = new NumberInput(page.driftToleranceInput, {\n prec: defaultDriftTolerance.prec - 2, // converting to percent for display\n sigFigs: true,\n min: 0,\n changed: (rawV: number) => {\n const { minV, range, prec } = defaultDriftTolerance\n const [v] = toFourSigFigs(rawV / 100, prec)\n this.driftToleranceSlider.setValue((v - minV) / range)\n this.updatedConfig.driftTolerance = v\n }\n })\n\n this.driftToleranceSlider = new MiniSlider(page.driftToleranceSlider, (r: number) => {\n const { minV, range, prec } = defaultDriftTolerance\n const [v] = toFourSigFigs(minV + r * range, prec)\n this.updatedConfig.driftTolerance = v\n this.driftTolerance.setValue(v * 100)\n })\n\n this.orderPersistence = new NumberInput(page.orderPersistence, {\n changed: (v: number) => {\n const { minV, range } = defaultOrderPersistence\n this.updatedConfig.orderPersistence = v\n this.orderPersistenceSlider.setValue((v - minV) / range)\n }\n })\n\n this.orderPersistenceSlider = new MiniSlider(page.orderPersistenceSlider, (r: number) => {\n const { minV, range, prec } = defaultOrderPersistence\n const rawV = minV + r * range\n const [v] = toPrecision(rawV, prec)\n this.updatedConfig.orderPersistence = v\n this.orderPersistence.setValue(v)\n })\n\n this.qcProfit = new NumberInput(page.qcProfit, {\n prec: defaultProfit.prec - 2, // converting to percent\n sigFigs: true,\n min: defaultProfit.minV * 100,\n changed: (vPct: number) => {\n const { minV, range } = defaultProfit\n const v = vPct / 100\n this.updatedConfig.profit = v\n page.profitInput.value = this.qcProfit.input.value\n this.qcProfitSlider.setValue((v - minV) / range)\n this.quickConfigUpdated()\n }\n })\n\n this.qcProfitSlider = new MiniSlider(page.qcProfitSlider, (r: number) => {\n const { minV, range, prec } = defaultProfit\n const [v] = toFourSigFigs((minV + r * range) * 100, prec)\n this.updatedConfig.profit = v / 100\n this.qcProfit.setValue(v)\n page.profitInput.value = this.qcProfit.input.value\n this.quickConfigUpdated()\n })\n\n this.qcLevelSpacing = new NumberInput(page.qcLevelSpacing, {\n prec: defaultLevelSpacing.prec - 2, // converting to percent\n sigFigs: true,\n min: defaultLevelSpacing.minV * 100,\n changed: (vPct: number) => {\n const { minV, range } = defaultLevelSpacing\n this.qcLevelSpacingSlider.setValue((vPct / 100 - minV) / range)\n this.quickConfigUpdated()\n }\n })\n\n this.qcLevelSpacingSlider = new MiniSlider(page.qcLevelSpacingSlider, (r: number) => {\n const { minV, range } = defaultLevelSpacing\n this.qcLevelSpacing.setValue(minV + r * range * 100)\n this.quickConfigUpdated()\n })\n\n this.qcMatchBuffer = new NumberInput(page.qcMatchBuffer, {\n prec: defaultMatchBuffer.prec - 2, // converting to percent\n sigFigs: true,\n min: defaultMatchBuffer.minV * 100,\n changed: (vPct: number) => {\n const { minV, range } = defaultMatchBuffer\n this.qcMatchBufferSlider.setValue((vPct / 100 - minV) / range)\n this.quickConfigUpdated()\n }\n })\n\n this.qcMatchBufferSlider = new MiniSlider(page.qcMatchBufferSlider, (r: number) => {\n const { minV, range } = defaultMatchBuffer\n this.qcMatchBuffer.setValue(minV + r * range * 100)\n this.quickConfigUpdated()\n })\n\n this.qcLevelsPerSide = new IncrementalInput(page.qcLevelsPerSide, {\n prec: defaultLevelsPerSide.prec,\n min: defaultLevelsPerSide.minV,\n inc: defaultLevelsPerSide.inc,\n changed: (v: number) => {\n this.qcUSDPerSide.setValue(this.lotSizeUSD() * v * this.qcLotsPerLevel.value())\n this.quickConfigUpdated()\n }\n })\n\n this.qcLotsPerLevel = new IncrementalInput(page.qcLotsPerLevel, {\n prec: defaultLotsPerLevel.prec,\n min: defaultLotsPerLevel.minV,\n inc: 1, // set showQuickConfig\n changed: (v: number) => {\n this.qcUSDPerSide.setValue(this.lotSizeUSD() * v * this.qcLevelsPerSide.value())\n page.qcUSDPerSideEcho.textContent = this.qcUSDPerSide.input.value as string\n this.quickConfigUpdated()\n },\n set: (v: number) => {\n const [, s] = toFourSigFigs(v * this.qcLevelsPerSide.value() * this.lotSizeUSD(), 2)\n page.qcUSDPerSideEcho.textContent = s\n page.qcLotsPerLevelEcho.textContent = s\n }\n })\n\n this.qcUSDPerSide = new IncrementalInput(page.qcUSDPerSide, {\n prec: defaultUSDPerSide.prec,\n min: 1, // changed by showQuickConfig\n inc: 1, // changed by showQuickConfig\n changed: (v: number) => {\n this.qcLotsPerLevel.setValue(v / this.qcLevelsPerSide.value() / this.lotSizeUSD())\n page.qcLotsPerLevelEcho.textContent = this.qcLotsPerLevel.input.value as string\n this.quickConfigUpdated()\n },\n set: (v: number, s: string) => {\n page.qcUSDPerSideEcho.textContent = s\n page.qcLotsPerLevelEcho.textContent = String(Math.round(v / this.lotSizeUSD()))\n }\n })\n\n const maybeSubmitBuyRow = (e: KeyboardEvent) => {\n if (e.key !== 'Enter') return\n if (\n !isNaN(parseFloat(page.addBuyPlacementGapFactor.value || '')) &&\n !isNaN(parseFloat(page.addBuyPlacementLots.value || ''))\n ) {\n page.addBuyPlacementBtn.click()\n }\n }\n Doc.bind(page.addBuyPlacementGapFactor, 'keyup', (e: KeyboardEvent) => { maybeSubmitBuyRow(e) })\n Doc.bind(page.addBuyPlacementLots, 'keyup', (e: KeyboardEvent) => { maybeSubmitBuyRow(e) })\n\n const maybeSubmitSellRow = (e: KeyboardEvent) => {\n if (e.key !== 'Enter') return\n if (\n !isNaN(parseFloat(page.addSellPlacementGapFactor.value || '')) &&\n !isNaN(parseFloat(page.addSellPlacementLots.value || ''))\n ) {\n page.addSellPlacementBtn.click()\n }\n }\n Doc.bind(page.addSellPlacementGapFactor, 'keyup', (e: KeyboardEvent) => { maybeSubmitSellRow(e) })\n Doc.bind(page.addSellPlacementLots, 'keyup', (e: KeyboardEvent) => { maybeSubmitSellRow(e) })\n\n Doc.bind(page.profitInput, 'change', () => {\n Doc.hide(page.profitInputErr)\n const showError = (errID: string) => {\n Doc.show(page.profitInputErr)\n page.profitInputErr.textContent = intl.prep(errID)\n }\n const profit = parseFloat(page.profitInput.value || '') / 100\n if (isNaN(profit)) return showError(intl.ID_INVALID_VALUE)\n if (profit === 0) return showError(intl.ID_NO_ZERO)\n this.updatedConfig.profit = profit\n this.updateModifiedMarkers()\n })\n\n this.botTypeSelectors = Doc.applySelector(page.botTypeForm, '[data-bot-type]')\n for (const div of this.botTypeSelectors) {\n Doc.bind(div, 'click', () => {\n if (div.classList.contains('disabled')) return\n Doc.hide(page.botTypeErr)\n page.cexSelection.classList.toggle('disabled', div.dataset.botType === botTypeBasicMM)\n this.setBotTypeSelected(div.dataset.botType as string)\n })\n }\n\n this.newWalletForm = new NewWalletForm(\n page.newWalletForm,\n async () => {\n await app().fetchUser()\n this.submitBotType()\n }\n )\n\n app().registerNoteFeeder({\n balance: (note: BalanceNote) => { this.handleBalanceNote(note) }\n })\n\n this.initialize(specs)\n }\n\n unload () {\n this.forms.exit()\n }\n\n async initialize (specs?: BotSpecs) {\n this.setupCEXes()\n this.initializeMarketRows()\n\n const isRefresh = specs && Object.keys(specs).length === 0\n if (isRefresh) specs = State.fetchLocal(specLK)\n if (!specs || !app().walletMap[specs.baseID] || !app().walletMap[specs.quoteID]) {\n this.showMarketSelectForm()\n return\n }\n\n // If we have specs specifying only a market, make sure the cex name and\n // bot type are set.\n if (specs && !specs.botType) {\n const botCfg = liveBotConfig(specs.host, specs.baseID, specs.quoteID)\n specs.cexName = botCfg?.cexName ?? ''\n specs.botType = botTypeBasicMM\n if (botCfg?.arbMarketMakingConfig) specs.botType = botTypeArbMM\n else if (botCfg?.simpleArbConfig) specs.botType = botTypeBasicArb\n }\n\n // Must be a reconfig.\n this.specs = specs\n await this.fetchCEXBalances(specs)\n this.configureUI()\n }\n\n async configureUI () {\n const { page, specs } = this\n const { host, baseID, quoteID, cexName, botType } = specs\n\n const [{ symbol: baseSymbol, token: baseToken }, { symbol: quoteSymbol, token: quoteToken }] = [app().assets[baseID], app().assets[quoteID]]\n this.mktID = `${baseSymbol}_${quoteSymbol}`\n Doc.hide(\n page.botSettingsContainer, page.marketBox, page.updateButton, page.resetButton,\n page.createButton, page.noMarket, page.missingFiatRates\n )\n\n if ([baseID, quoteID, baseToken?.parentID ?? baseID, quoteToken?.parentID ?? quoteID].some((assetID: number) => !app().fiatRatesMap[assetID])) {\n Doc.show(page.missingFiatRates)\n return\n }\n\n Doc.show(page.marketLoading)\n State.storeLocal(specLK, specs)\n\n const mmStatus = app().mmStatus\n const viewOnly = isViewOnly(specs, mmStatus)\n let botCfg = liveBotConfig(host, baseID, quoteID)\n if (botCfg) {\n const oldBotType = botCfg.arbMarketMakingConfig ? botTypeArbMM : botCfg.basicMarketMakingConfig ? botTypeBasicMM : botTypeBasicArb\n if (oldBotType !== botType) botCfg = undefined\n }\n Doc.setVis(botCfg, page.deleteBttnBox)\n\n const oldCfg = this.originalConfig = Object.assign({}, defaultMarketMakingConfig, {\n disabled: viewOnly,\n baseOptions: this.defaultWalletOptions(baseID),\n quoteOptions: this.defaultWalletOptions(quoteID),\n buyPlacements: [],\n sellPlacements: [],\n baseConfig: Object.assign({}, defaultBotAssetConfig),\n quoteConfig: Object.assign({}, defaultBotAssetConfig)\n }) as ConfigState\n\n if (botCfg) {\n const { basicMarketMakingConfig: mmCfg, arbMarketMakingConfig: arbMMCfg, simpleArbConfig: arbCfg, uiConfig: { cexRebalance } } = botCfg\n this.creatingNewBot = false\n // This is kinda sloppy, but we'll copy any relevant issues from the\n // old config into the originalConfig.\n const idx = oldCfg as { [k: string]: any } // typescript\n for (const [k, v] of Object.entries(botCfg)) if (idx[k] !== undefined) idx[k] = v\n\n oldCfg.baseConfig = Object.assign({}, defaultBotAssetConfig, botCfg.uiConfig.baseConfig)\n oldCfg.quoteConfig = Object.assign({}, defaultBotAssetConfig, botCfg.uiConfig.quoteConfig)\n oldCfg.baseOptions = botCfg.baseWalletOptions || {}\n oldCfg.quoteOptions = botCfg.quoteWalletOptions || {}\n oldCfg.cexRebalance = cexRebalance\n\n if (mmCfg) {\n oldCfg.buyPlacements = mmCfg.buyPlacements\n oldCfg.sellPlacements = mmCfg.sellPlacements\n oldCfg.driftTolerance = mmCfg.driftTolerance\n oldCfg.gapStrategy = mmCfg.gapStrategy\n } else if (arbMMCfg) {\n const { buyPlacements, sellPlacements } = arbMMCfg\n oldCfg.buyPlacements = Array.from(buyPlacements, (p: ArbMarketMakingPlacement) => { return { lots: p.lots, gapFactor: p.multiplier } })\n oldCfg.sellPlacements = Array.from(sellPlacements, (p: ArbMarketMakingPlacement) => { return { lots: p.lots, gapFactor: p.multiplier } })\n oldCfg.profit = arbMMCfg.profit\n oldCfg.driftTolerance = arbMMCfg.driftTolerance\n oldCfg.orderPersistence = arbMMCfg.orderPersistence\n } else if (arbCfg) {\n // TODO: expose maxActiveArbs\n oldCfg.profit = arbCfg.profitTrigger\n oldCfg.orderPersistence = arbCfg.numEpochsLeaveOpen\n oldCfg.simpleArbLots = botCfg.uiConfig.simpleArbLots ?? 1\n }\n Doc.setVis(!viewOnly, page.updateButton, page.resetButton)\n } else {\n this.creatingNewBot = true\n Doc.setVis(!viewOnly, page.createButton)\n }\n\n // Now that we've updated the originalConfig, we'll copy it.\n this.updatedConfig = JSON.parse(JSON.stringify(oldCfg))\n\n switch (botType) {\n case botTypeBasicMM:\n page.botTypeDisplay.textContent = intl.prep(intl.ID_BOTTYPE_BASIC_MM)\n break\n case botTypeArbMM:\n page.botTypeDisplay.textContent = intl.prep(intl.ID_BOTTYPE_ARB_MM)\n break\n case botTypeBasicArb:\n page.botTypeDisplay.textContent = intl.prep(intl.ID_BOTTYPE_SIMPLE_ARB)\n }\n\n setMarketElements(document.body, baseID, quoteID, host)\n Doc.setVis(botType !== botTypeBasicArb, page.driftToleranceBox, page.switchToAdvanced)\n Doc.setVis(Boolean(cexName), ...Doc.applySelector(document.body, '[data-cex-show]'))\n\n Doc.setVis(viewOnly, page.viewOnlyRunning)\n Doc.setVis(cexName, page.cexRebalanceSettings)\n if (cexName) setCexElements(document.body, cexName)\n\n await this.fetchMarketReport()\n\n const lotSizeUSD = this.lotSizeUSD()\n this.lotsPerLevelIncrement = Math.round(Math.max(1, defaultLotsPerLevel.usdIncrement / lotSizeUSD))\n this.qcLotsPerLevel.inc = this.lotsPerLevelIncrement\n this.qcUSDPerSide.inc = this.lotsPerLevelIncrement * lotSizeUSD\n this.qcUSDPerSide.min = lotSizeUSD\n\n this.basePane.setAsset(baseID, false)\n this.quotePane.setAsset(quoteID, true)\n const { marketReport: { baseFiatRate } } = this\n this.placementsChart.setMarket({ cexName: cexName as string, botType, baseFiatRate, dict: this.updatedConfig })\n\n // If this is a new bot, show the quick config form.\n const isQuickPlacements = !botCfg || this.isQuickPlacements(this.updatedConfig.buyPlacements, this.updatedConfig.sellPlacements)\n const gapStrategy = botCfg?.basicMarketMakingConfig?.gapStrategy ?? GapStrategyPercentPlus\n page.gapStrategySelect.value = gapStrategy\n if (botType === botTypeBasicArb || (isQuickPlacements && gapStrategy === GapStrategyPercentPlus)) this.showQuickConfig()\n else this.showAdvancedConfig()\n\n this.setOriginalValues()\n\n Doc.hide(page.marketLoading)\n Doc.show(page.botSettingsContainer, page.marketBox)\n }\n\n initializeMarketRows () {\n this.marketRows = []\n Doc.empty(this.page.marketSelect)\n for (const { host, markets, assets, auth: { effectiveTier, pendingStrength } } of Object.values(app().exchanges)) {\n if (effectiveTier + pendingStrength === 0) {\n const { needRegTmpl, needRegBox } = this.page\n const bttn = needRegTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(bttn)\n Doc.bind(bttn, 'click', () => { app().loadPage('register', { host, backTo: 'mmsettings' }) })\n tmpl.host.textContent = host\n needRegBox.appendChild(bttn)\n Doc.show(needRegBox)\n continue\n }\n for (const { name, baseid: baseID, quoteid: quoteID, spot, basesymbol: baseSymbol, quotesymbol: quoteSymbol } of Object.values(markets)) {\n if (!app().assets[baseID] || !app().assets[quoteID]) continue\n const tr = this.page.marketRowTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(tr)\n const mr = { tr, tmpl, host: host, name, baseID, quoteID, spot: spot, arbs: [] } as MarketRow\n this.marketRows.push(mr)\n this.page.marketSelect.appendChild(tr)\n tmpl.baseIcon.src = Doc.logoPath(baseSymbol)\n tmpl.quoteIcon.src = Doc.logoPath(quoteSymbol)\n tmpl.baseSymbol.appendChild(Doc.symbolize(assets[baseID], true))\n tmpl.quoteSymbol.appendChild(Doc.symbolize(assets[quoteID], true))\n tmpl.host.textContent = host\n const cexHasMarket = this.cexMarketSupportFilter(baseID, quoteID)\n for (const [cexName, dinfo] of Object.entries(CEXDisplayInfos)) {\n if (cexHasMarket(cexName)) {\n const img = this.page.arbBttnTmpl.cloneNode(true) as PageElement\n img.src = dinfo.logo\n tmpl.arbs.appendChild(img)\n mr.arbs.push(cexName)\n }\n }\n Doc.bind(tr, 'click', () => { this.showBotTypeForm(host, baseID, quoteID) })\n }\n }\n if (this.marketRows.length === 0) {\n const { marketSelectionTable, marketFilterBox, noMarkets } = this.page\n Doc.hide(marketSelectionTable, marketFilterBox)\n Doc.show(noMarkets)\n } else Doc.hide(this.page.noMarkets)\n const fiatRates = app().fiatRatesMap\n this.marketRows.sort((a: MarketRow, b: MarketRow) => {\n let [volA, volB] = [a.spot?.vol24 ?? 0, b.spot?.vol24 ?? 0]\n if (fiatRates[a.baseID] && fiatRates[b.baseID]) {\n volA *= fiatRates[a.baseID]\n volB *= fiatRates[b.baseID]\n }\n return volB - volA\n })\n }\n\n runningBotInventory (assetID: number) {\n return runningBotInventory(assetID)\n }\n\n adjustedBalances (baseWallet: WalletState, quoteWallet: WalletState) {\n const { cexBaseBalance, cexQuoteBalance } = this\n const [bInv, qInv] = [this.runningBotInventory(baseWallet.assetID), this.runningBotInventory(quoteWallet.assetID)]\n const [cexBaseAvail, cexQuoteAvail] = [(cexBaseBalance?.available || 0) - bInv.cex.total, (cexQuoteBalance?.available || 0) - qInv.cex.total]\n const [dexBaseAvail, dexQuoteAvail] = [baseWallet.balance.available - bInv.dex.total, quoteWallet.balance.available - qInv.dex.total]\n const baseAvail = dexBaseAvail + cexBaseAvail\n const quoteAvail = dexQuoteAvail + cexQuoteAvail\n return { baseAvail, quoteAvail, dexBaseAvail, dexQuoteAvail, cexBaseAvail, cexQuoteAvail }\n }\n\n lotSizeUSD () {\n const { specs: { host, baseID }, mktID, marketReport: { baseFiatRate } } = this\n const xc = app().exchanges[host]\n const market = xc.markets[mktID]\n const { lotsize: lotSize } = market\n const { unitInfo: ui } = app().assets[baseID]\n return lotSize / ui.conventional.conversionFactor * baseFiatRate\n }\n\n /*\n * marketStuff is just a bunch of useful properties for the current specs\n * gathered in one place and with preferable names.\n */\n marketStuff () {\n const {\n page, specs: { host, baseID, quoteID, cexName, botType }, basePane, quotePane,\n marketReport: { baseFiatRate, quoteFiatRate, baseFees, quoteFees },\n lotsPerLevelIncrement, updatedConfig: cfg, originalConfig: oldCfg, mktID\n } = this\n const { symbol: baseSymbol, unitInfo: bui } = app().assets[baseID]\n const { symbol: quoteSymbol, unitInfo: qui } = app().assets[quoteID]\n const xc = app().exchanges[host]\n const market = xc.markets[mktID]\n const { lotsize: lotSize, spot } = market\n const lotSizeUSD = lotSize / bui.conventional.conversionFactor * baseFiatRate\n const atomicRate = 1 / bui.conventional.conversionFactor * baseFiatRate / quoteFiatRate * qui.conventional.conversionFactor\n const xcRate = {\n conv: quoteFiatRate / baseFiatRate,\n atomic: atomicRate,\n msg: Math.round(atomicRate * OrderUtil.RateEncodingFactor), // unadjusted\n spot\n }\n\n let [dexBaseLots, dexQuoteLots] = [cfg.simpleArbLots, cfg.simpleArbLots]\n if (botType !== botTypeBasicArb) {\n dexBaseLots = this.updatedConfig.sellPlacements.reduce((lots: number, p: OrderPlacement) => lots + p.lots, 0)\n dexQuoteLots = this.updatedConfig.buyPlacements.reduce((lots: number, p: OrderPlacement) => lots + p.lots, 0)\n }\n const quoteLot = calculateQuoteLot(lotSize, baseID, quoteID, spot)\n const walletStuff = this.walletStuff()\n const { baseFeeAssetID, quoteFeeAssetID, baseIsAccountLocker, quoteIsAccountLocker } = walletStuff\n\n const { commit, fees } = feesAndCommit(\n baseID, quoteID, baseFees, quoteFees, lotSize, dexBaseLots, dexQuoteLots,\n baseFeeAssetID, quoteFeeAssetID, baseIsAccountLocker, quoteIsAccountLocker,\n cfg.baseConfig.orderReservesFactor, cfg.quoteConfig.orderReservesFactor\n )\n\n return {\n page, cfg, oldCfg, host, xc, baseID, quoteID, botType, cexName, baseFiatRate, quoteFiatRate,\n xcRate, baseSymbol, quoteSymbol, mktID, lotSize, lotSizeUSD, lotsPerLevelIncrement,\n quoteLot, commit, basePane, quotePane, fees, ...walletStuff\n }\n }\n\n walletStuff () {\n const { specs: { baseID, quoteID } } = this\n const [baseWallet, quoteWallet] = [app().walletMap[baseID], app().walletMap[quoteID]]\n const [{ token: baseToken, unitInfo: bui }, { token: quoteToken, unitInfo: qui }] = [app().assets[baseID], app().assets[quoteID]]\n const baseFeeAssetID = baseToken ? baseToken.parentID : baseID\n const quoteFeeAssetID = quoteToken ? quoteToken.parentID : quoteID\n const [baseFeeUI, quoteFeeUI] = [app().assets[baseFeeAssetID].unitInfo, app().assets[quoteFeeAssetID].unitInfo]\n const traitAccountLocker = 1 << 14\n const baseIsAccountLocker = (baseWallet.traits & traitAccountLocker) > 0\n const quoteIsAccountLocker = (quoteWallet.traits & traitAccountLocker) > 0\n return {\n baseWallet, quoteWallet, baseFeeUI, quoteFeeUI, baseToken, quoteToken,\n bui, qui, baseFeeAssetID, quoteFeeAssetID, baseIsAccountLocker, quoteIsAccountLocker,\n ...this.adjustedBalances(baseWallet, quoteWallet)\n }\n }\n\n showAdvancedConfig () {\n const { page } = this\n Doc.show(page.advancedConfig)\n Doc.hide(page.quickConfig)\n this.placementsChart.render()\n }\n\n isQuickPlacements (buyPlacements: OrderPlacement[], sellPlacements: OrderPlacement[]) {\n if (buyPlacements.length === 0 || buyPlacements.length !== sellPlacements.length) return false\n for (let i = 0; i < buyPlacements.length; i++) {\n if (buyPlacements[i].gapFactor !== sellPlacements[i].gapFactor) return false\n if (buyPlacements[i].lots !== sellPlacements[i].lots) return false\n }\n return true\n }\n\n switchToQuickConfig () {\n const { cfg, botType, lotSizeUSD } = this.marketStuff()\n const { buyPlacements: buys, sellPlacements: sells } = cfg\n // If we have both buys and sells, get the best approximation quick config\n // approximation.\n if (buys.length > 0 && sells.length > 0) {\n const bestBuy = buys.reduce((prev: OrderPlacement, curr: OrderPlacement) => curr.gapFactor < prev.gapFactor ? curr : prev)\n const bestSell = sells.reduce((prev: OrderPlacement, curr: OrderPlacement) => curr.gapFactor < prev.gapFactor ? curr : prev)\n const placementCount = buys.length + sells.length\n const levelsPerSide = Math.max(1, Math.floor((placementCount) / 2))\n if (botType === botTypeBasicMM) {\n cfg.profit = (bestBuy.gapFactor + bestSell.gapFactor) / 2\n const worstBuy = buys.reduce((prev: OrderPlacement, curr: OrderPlacement) => curr.gapFactor > prev.gapFactor ? curr : prev)\n const worstSell = sells.reduce((prev: OrderPlacement, curr: OrderPlacement) => curr.gapFactor > prev.gapFactor ? curr : prev)\n const range = ((worstBuy.gapFactor - bestBuy.gapFactor) + (worstSell.gapFactor - bestSell.gapFactor)) / 2\n const inc = range / (levelsPerSide - 1)\n this.qcProfit.setValue(cfg.profit * 100)\n this.qcProfitSlider.setValue((cfg.profit - defaultProfit.minV) / defaultProfit.range)\n this.qcLevelSpacing.setValue(inc * 100)\n this.qcLevelSpacingSlider.setValue((inc - defaultLevelSpacing.minV) / defaultLevelSpacing.range)\n } else if (botType === botTypeArbMM) {\n const multSum = buys.reduce((v: number, p: OrderPlacement) => v + p.gapFactor, 0) + sells.reduce((v: number, p: OrderPlacement) => v + p.gapFactor, 0)\n const buffer = ((multSum / placementCount) - 1) || defaultMatchBuffer.value\n this.qcMatchBuffer.setValue(buffer * 100)\n this.qcMatchBufferSlider.setValue((buffer - defaultMatchBuffer.minV) / defaultMatchBuffer.range)\n }\n const lots = buys.reduce((v: number, p: OrderPlacement) => v + p.lots, 0) + sells.reduce((v: number, p: OrderPlacement) => v + p.lots, 0)\n const lotsPerLevel = Math.max(1, Math.round(lots / 2 / levelsPerSide))\n this.qcLotsPerLevel.setValue(lotsPerLevel)\n this.qcUSDPerSide.setValue(lotsPerLevel * levelsPerSide * lotSizeUSD)\n this.qcLevelsPerSide.setValue(levelsPerSide)\n } else if (botType === botTypeBasicArb) {\n this.qcLotsPerLevel.setValue(cfg.simpleArbLots)\n }\n this.showQuickConfig()\n this.quickConfigUpdated()\n }\n\n showQuickConfig () {\n const { page, lotSizeUSD, botType, lotsPerLevelIncrement } = this.marketStuff()\n\n if (!this.qcLevelsPerSide.input.value) {\n this.qcLevelsPerSide.setValue(defaultLevelsPerSide.value)\n this.qcUSDPerSide.setValue(defaultLevelsPerSide.value * (this.qcLotsPerLevel.value() || lotsPerLevelIncrement) * lotSizeUSD)\n }\n if (!this.qcLotsPerLevel.input.value) {\n this.qcLotsPerLevel.setValue(lotsPerLevelIncrement)\n this.qcUSDPerSide.setValue(lotSizeUSD * lotsPerLevelIncrement * this.qcLevelsPerSide.value())\n }\n if (!page.qcLevelSpacing.value) {\n this.qcLevelSpacing.setValue(defaultLevelSpacing.value * 100)\n this.qcLevelSpacingSlider.setValue((defaultLevelSpacing.value - defaultLevelSpacing.minV) / defaultLevelSpacing.range)\n }\n if (!page.qcMatchBuffer.value) page.qcMatchBuffer.value = String(defaultMatchBuffer.value * 100)\n\n Doc.hide(page.advancedConfig)\n Doc.show(page.quickConfig)\n\n this.showInputsForBot(botType)\n }\n\n showInputsForBot (botType: string) {\n const { page, opts: { usingUSDPerSide } } = this\n Doc.hide(\n page.matchMultiplierBox, page.placementsChartBox, page.placementChartLegend,\n page.lotsPerLevelLabel, page.levelSpacingBox, page.arbLotsLabel, page.qcLevelPerSideBox\n )\n Doc.setVis(usingUSDPerSide, page.qcUSDPerSideBox)\n Doc.setVis(!usingUSDPerSide, page.qcLotsBox)\n switch (botType) {\n case botTypeArbMM:\n Doc.show(\n page.qcLevelPerSideBox, page.matchMultiplierBox, page.placementsChartBox,\n page.placementChartLegend, page.lotsPerLevelLabel\n )\n break\n case botTypeBasicMM:\n Doc.show(\n page.qcLevelPerSideBox, page.levelSpacingBox, page.placementsChartBox,\n page.lotsPerLevelLabel\n )\n break\n case botTypeBasicArb:\n Doc.show(page.arbLotsLabel)\n }\n }\n\n quickConfigUpdated () {\n const { page, cfg, botType, cexName } = this.marketStuff()\n\n Doc.hide(page.qcError)\n const setError = (msg: string) => {\n page.qcError.textContent = msg\n Doc.show(page.qcError)\n }\n\n const levelsPerSide = botType === botTypeBasicArb ? 1 : this.qcLevelsPerSide.value()\n if (isNaN(levelsPerSide)) {\n setError('invalid value for levels per side')\n }\n\n const lotsPerLevel = this.qcLotsPerLevel.value()\n if (isNaN(lotsPerLevel)) {\n setError('invalid value for lots per level')\n }\n\n const profit = parseFloat(page.qcProfit.value ?? '') / 100\n if (isNaN(profit)) {\n setError('invalid value for profit')\n }\n\n const levelSpacing = botType === botTypeBasicMM ? parseFloat(page.qcLevelSpacing.value ?? '') / 100 : 0\n if (isNaN(levelSpacing)) {\n setError('invalid value for level spacing')\n }\n\n const matchBuffer = botType === botTypeArbMM ? parseFloat(page.qcMatchBuffer.value ?? '') / 100 : 0\n if (isNaN(matchBuffer)) {\n setError('invalid value for match buffer')\n }\n const multiplier = matchBuffer + 1\n\n const levelSpacingDisabled = levelsPerSide === 1\n page.levelSpacingBox.classList.toggle('disabled', levelSpacingDisabled)\n page.qcLevelSpacing.disabled = levelSpacingDisabled\n cfg.simpleArbLots = lotsPerLevel\n\n if (botType !== botTypeBasicArb) {\n this.clearPlacements(cexName ? arbMMRowCacheKey : cfg.gapStrategy)\n for (let levelN = 0; levelN < levelsPerSide; levelN++) {\n const placement = { lots: lotsPerLevel } as OrderPlacement\n placement.gapFactor = botType === botTypeBasicMM ? profit + levelSpacing * levelN : multiplier\n cfg.buyPlacements.push(placement)\n cfg.sellPlacements.push(placement)\n // Add rows in the advanced config table.\n this.addPlacement(true, placement)\n this.addPlacement(false, placement)\n }\n\n this.placementsChart.render()\n }\n\n this.updateAllocations()\n }\n\n updateAllocations () {\n this.updateBaseAllocations()\n this.updateQuoteAllocations()\n }\n\n updateBaseAllocations () {\n const { commit, lotSize, basePane, fees } = this.marketStuff()\n\n basePane.updateInventory(commit.dex.base.lots, commit.dex.quote.lots, lotSize, commit.dex.base.val, commit.cex.base.val, fees.base)\n basePane.updateCommitTotal()\n }\n\n updateQuoteAllocations () {\n const { commit, quoteLot: lotSize, quotePane, fees } = this.marketStuff()\n\n quotePane.updateInventory(commit.dex.quote.lots, commit.dex.base.lots, lotSize, commit.dex.quote.val, commit.cex.quote.val, fees.quote)\n quotePane.updateCommitTotal()\n }\n\n matchBufferChanged () {\n const { page } = this\n page.qcMatchBuffer.value = Math.max(0, parseFloat(page.qcMatchBuffer.value ?? '') || defaultMatchBuffer.value * 100).toFixed(2)\n this.quickConfigUpdated()\n }\n\n showAddress (assetID: number) {\n this.walletAddrForm.setAsset(assetID)\n this.forms.show(this.page.walletAddrForm)\n }\n\n changeSideCommitmentDialog () {\n const { page, opts } = this\n opts.usingUSDPerSide = !opts.usingUSDPerSide\n Doc.setVis(opts.usingUSDPerSide, page.qcUSDPerSideBox)\n Doc.setVis(!opts.usingUSDPerSide, page.qcLotsBox)\n }\n\n async showBotTypeForm (host: string, baseID: number, quoteID: number, botType?: string, configuredCEX?: string) {\n const { page } = this\n this.formSpecs = { host, baseID, quoteID, botType: '' }\n const viewOnly = isViewOnly(this.formSpecs, app().mmStatus)\n if (viewOnly) {\n const botCfg = liveBotConfig(host, baseID, quoteID)\n const specs = this.specs = this.formSpecs\n switch (true) {\n case Boolean(botCfg?.simpleArbConfig):\n specs.botType = botTypeBasicArb\n break\n case Boolean(botCfg?.arbMarketMakingConfig):\n specs.botType = botTypeArbMM\n break\n default:\n specs.botType = botTypeBasicMM\n }\n specs.cexName = botCfg?.cexName\n await this.fetchCEXBalances(this.formSpecs)\n await this.configureUI()\n this.forms.close()\n return\n }\n setMarketElements(page.botTypeForm, baseID, quoteID, host)\n Doc.empty(page.botTypeBaseSymbol, page.botTypeQuoteSymbol)\n const [b, q] = [app().assets[baseID], app().assets[quoteID]]\n page.botTypeBaseSymbol.appendChild(Doc.symbolize(b, true))\n page.botTypeQuoteSymbol.appendChild(Doc.symbolize(q, true))\n for (const div of this.botTypeSelectors) div.classList.remove('selected')\n for (const { div } of Object.values(this.formCexes)) div.classList.remove('selected')\n this.setCEXAvailability(baseID, quoteID)\n Doc.hide(page.noCexesConfigured, page.noCexMarket, page.noCexMarketConfigureMore, page.botTypeErr)\n const cexHasMarket = this.cexMarketSupportFilter(baseID, quoteID)\n const supportingCexes: Record<string, CEXConfig> = {}\n for (const cex of Object.values(app().mmStatus.cexes)) {\n if (cexHasMarket(cex.config.name)) supportingCexes[cex.config.name] = cex.config\n }\n const nCexes = Object.keys(supportingCexes).length\n const arbEnabled = nCexes > 0\n for (const div of this.botTypeSelectors) div.classList.toggle('disabled', div.dataset.botType !== botTypeBasicMM && !arbEnabled)\n if (Object.keys(app().mmStatus.cexes).length === 0) {\n Doc.show(page.noCexesConfigured)\n this.setBotTypeSelected(botTypeBasicMM)\n } else {\n const lastBots = (State.fetchLocal(lastBotsLK) || {}) as Record<string, BotSpecs>\n const lastBot = lastBots[`${baseID}_${quoteID}_${host}`]\n let cex: CEXConfig | undefined\n botType = botType ?? (lastBot ? lastBot.botType : botTypeArbMM)\n if (botType !== botTypeBasicMM) {\n // Four ways to auto-select a cex.\n // 1. Coming back from the cex configuration form.\n if (configuredCEX) cex = supportingCexes[configuredCEX]\n // 2. We have a saved configuration.\n if (!cex && lastBot) cex = supportingCexes[lastBot.cexName ?? '']\n // 3. The last exchange that the user selected.\n if (!cex) {\n const lastCEX = State.fetchLocal(lastArbExchangeLK)\n if (lastCEX) cex = supportingCexes[lastCEX]\n }\n // 4. Any supporting cex.\n if (!cex && nCexes > 0) cex = Object.values(supportingCexes)[0]\n }\n if (cex) {\n page.cexSelection.classList.remove('disabled')\n this.setBotTypeSelected(botType ?? (lastBot ? lastBot.botType : botTypeArbMM))\n this.selectFormCEX(cex.name)\n } else {\n page.cexSelection.classList.add('disabled')\n Doc.show(page.noCexMarket)\n this.setBotTypeSelected(botTypeBasicMM)\n // If there are unconfigured cexes, show configureMore message.\n const unconfigured = Object.keys(CEXDisplayInfos).filter((cexName: string) => !app().mmStatus.cexes[cexName])\n const allConfigured = unconfigured.length === 0 || (unconfigured.length === 1 && (unconfigured[0] === 'Binance' || unconfigured[0] === 'BinanceUS'))\n if (!allConfigured) Doc.show(page.noCexMarketConfigureMore)\n }\n }\n\n Doc.show(page.cexSelection)\n // Check if we have any cexes configured.\n this.forms.show(page.botTypeForm)\n }\n\n reshowBotTypeForm () {\n if (isViewOnly(this.specs, app().mmStatus)) this.showMarketSelectForm()\n const { baseID, quoteID, host, cexName, botType } = this.specs\n this.showBotTypeForm(host, baseID, quoteID, botType, cexName)\n }\n\n setBotTypeSelected (selectedType: string) {\n const { formSpecs: { baseID, quoteID, host }, botTypeSelectors, formCexes } = this\n for (const { classList, dataset: { botType } } of botTypeSelectors) classList.toggle('selected', botType === selectedType)\n // If we don't have a cex selected, attempt to select one\n if (selectedType === botTypeBasicMM) return\n const mmStatus = app().mmStatus\n if (Object.keys(mmStatus.cexes).length === 0) return\n const cexHasMarket = this.cexMarketSupportFilter(baseID, quoteID)\n // If there is one currently selected and it supports this market, leave it.\n const selecteds = Object.values(formCexes).filter((cex: cexButton) => cex.div.classList.contains('selected'))\n if (selecteds.length && cexHasMarket(selecteds[0].name)) return\n // See if we have a saved configuration.\n const lastBots = (State.fetchLocal(lastBotsLK) || {}) as Record<string, BotSpecs>\n const lastBot = lastBots[`${baseID}_${quoteID}_${host}`]\n if (lastBot) {\n const cex = mmStatus.cexes[lastBot.cexName ?? '']\n if (cex && cexHasMarket(cex.config.name)) {\n this.selectFormCEX(cex.config.name)\n return\n }\n }\n // 2. The last exchange that the user selected.\n const lastCEX = State.fetchLocal(lastArbExchangeLK)\n if (lastCEX) {\n const cex = mmStatus.cexes[lastCEX]\n if (cex && cexHasMarket(cex.config.name)) {\n this.selectFormCEX(cex.config.name)\n return\n }\n }\n // 3. Any supporting cex.\n const cexes = Object.values(mmStatus.cexes).filter((cex: MMCEXStatus) => cexHasMarket(cex.config.name))\n if (cexes.length) this.selectFormCEX(cexes[0].config.name)\n }\n\n showMarketSelectForm () {\n this.page.marketFilterInput.value = ''\n this.sortMarketRows()\n this.forms.show(this.page.marketSelectForm)\n }\n\n sortMarketRows () {\n const page = this.page\n const filter = page.marketFilterInput.value?.toLowerCase()\n Doc.empty(page.marketSelect)\n for (const mr of this.marketRows) {\n mr.tr.classList.remove('selected')\n if (filter && !mr.name.includes(filter)) continue\n page.marketSelect.appendChild(mr.tr)\n }\n }\n\n handleBalanceNote (n: BalanceNote) {\n this.approveTokenForm.handleBalanceNote(n)\n if (!this.marketReport) return\n const { baseID, quoteID, quoteToken, baseToken } = this.marketStuff()\n if (n.assetID === baseID || n.assetID === baseToken?.parentID) {\n this.basePane.updateBalances()\n } else if (n.assetID === quoteID || n.assetID === quoteToken?.parentID) {\n this.quotePane.updateBalances()\n }\n }\n\n autoRebalanceChanged () {\n const { page, updatedConfig: cfg } = this\n cfg.cexRebalance = page.cexRebalanceCheckbox?.checked ?? false\n this.updateAllocations()\n }\n\n async submitBotType () {\n const loaded = app().loading(this.page.botTypeForm)\n try {\n await this.submitBotWithValidation()\n } finally {\n loaded()\n }\n }\n\n async submitBotWithValidation () {\n // check for wallets\n const { page, forms, formSpecs: { baseID, quoteID, host } } = this\n\n if (!app().walletMap[baseID]) {\n this.newWalletForm.setAsset(baseID)\n forms.show(this.page.newWalletForm)\n return\n }\n if (!app().walletMap[quoteID]) {\n this.newWalletForm.setAsset(quoteID)\n forms.show(this.page.newWalletForm)\n return\n }\n // Are tokens approved?\n const [bApproval, qApproval] = tokenAssetApprovalStatuses(host, app().assets[baseID], app().assets[quoteID])\n if (bApproval === ApprovalStatus.NotApproved) {\n this.approveTokenForm.setAsset(baseID, host)\n forms.show(page.approveTokenForm)\n return\n }\n if (qApproval === ApprovalStatus.NotApproved) {\n this.approveTokenForm.setAsset(quoteID, host)\n forms.show(page.approveTokenForm)\n return\n }\n\n const { botTypeSelectors } = this\n const selecteds = botTypeSelectors.filter((div: PageElement) => div.classList.contains('selected'))\n if (selecteds.length < 1) {\n page.botTypeErr.textContent = intl.prep(intl.ID_NO_BOTTYPE)\n Doc.show(page.botTypeErr)\n return\n }\n const botType = this.formSpecs.botType = selecteds[0].dataset.botType ?? ''\n if (botType !== botTypeBasicMM) {\n const selecteds = Object.values(this.formCexes).filter((cex: cexButton) => cex.div.classList.contains('selected'))\n if (selecteds.length < 1) {\n page.botTypeErr.textContent = intl.prep(intl.ID_NO_CEX)\n Doc.show(page.botTypeErr)\n return\n }\n const cexName = selecteds[0].name\n this.formSpecs.cexName = cexName\n await this.fetchCEXBalances(this.formSpecs)\n }\n\n this.specs = this.formSpecs\n\n this.configureUI()\n this.forms.close()\n }\n\n async fetchCEXBalances (specs: BotSpecs) {\n const { page } = this\n const { baseID, quoteID, cexName, botType } = specs\n if (botType === botTypeBasicMM || !cexName) return\n\n try {\n // This won't work if we implement live reconfiguration, because locked\n // funds would need to be considered.\n this.cexBaseBalance = await MM.cexBalance(cexName, baseID)\n } catch (e) {\n page.botTypeErr.textContent = intl.prep(intl.ID_CEXBALANCE_ERR, { cexName, assetID: String(baseID), err: String(e) })\n Doc.show(page.botTypeErr)\n throw e\n }\n\n try {\n this.cexQuoteBalance = await MM.cexBalance(cexName, quoteID)\n } catch (e) {\n page.botTypeErr.textContent = intl.prep(intl.ID_CEXBALANCE_ERR, { cexName, assetID: String(quoteID), err: String(e) })\n Doc.show(page.botTypeErr)\n throw e\n }\n }\n\n defaultWalletOptions (assetID: number): Record<string, string> {\n const walletDef = app().currentWalletDefinition(assetID)\n if (!walletDef.multifundingopts) {\n return {}\n }\n const options: Record<string, string> = {}\n for (const opt of walletDef.multifundingopts) {\n if (opt.quoteAssetOnly && assetID !== this.specs.quoteID) {\n continue\n }\n options[opt.key] = `${opt.default}`\n }\n return options\n }\n\n /*\n * updateModifiedMarkers checks each of the input elements on the page and\n * if the current value does not match the original value (since the last\n * save), then the input will have a colored border.\n */\n updateModifiedMarkers () {\n if (this.creatingNewBot) return\n const { page, originalConfig: oldCfg, updatedConfig: newCfg } = this\n\n // Gap strategy input\n const gapStrategyModified = oldCfg.gapStrategy !== newCfg.gapStrategy\n page.gapStrategySelect.classList.toggle('modified', gapStrategyModified)\n\n const profitModified = oldCfg.profit !== newCfg.profit\n page.profitInput.classList.toggle('modified', profitModified)\n\n // Buy placements Input\n let buyPlacementsModified = false\n if (oldCfg.buyPlacements.length !== newCfg.buyPlacements.length) {\n buyPlacementsModified = true\n } else {\n for (let i = 0; i < oldCfg.buyPlacements.length; i++) {\n if (oldCfg.buyPlacements[i].lots !== newCfg.buyPlacements[i].lots ||\n oldCfg.buyPlacements[i].gapFactor !== newCfg.buyPlacements[i].gapFactor) {\n buyPlacementsModified = true\n break\n }\n }\n }\n page.buyPlacementsTableWrapper.classList.toggle('modified', buyPlacementsModified)\n\n // Sell placements input\n let sellPlacementsModified = false\n if (oldCfg.sellPlacements.length !== newCfg.sellPlacements.length) {\n sellPlacementsModified = true\n } else {\n for (let i = 0; i < oldCfg.sellPlacements.length; i++) {\n if (oldCfg.sellPlacements[i].lots !== newCfg.sellPlacements[i].lots ||\n oldCfg.sellPlacements[i].gapFactor !== newCfg.sellPlacements[i].gapFactor) {\n sellPlacementsModified = true\n break\n }\n }\n }\n page.sellPlacementsTableWrapper.classList.toggle('modified', sellPlacementsModified)\n }\n\n /*\n * gapFactorHeaderUnit returns the header on the placements table and the\n * units in the gap factor rows needed for each gap strategy.\n */\n gapFactorHeaderUnit (gapStrategy: string): [string, string] {\n switch (gapStrategy) {\n case GapStrategyMultiplier:\n return ['Multiplier', 'x']\n case GapStrategyAbsolute:\n case GapStrategyAbsolutePlus: {\n const rateUnit = `${app().assets[this.specs.quoteID].symbol}/${app().assets[this.specs.baseID].symbol}`\n return ['Rate', rateUnit]\n }\n case GapStrategyPercent:\n case GapStrategyPercentPlus:\n return ['Percent', '%']\n default:\n throw new Error(`Unknown gap strategy ${gapStrategy}`)\n }\n }\n\n /*\n * checkGapFactorRange returns an error string if the value input for a\n * gap factor is valid for the currently selected gap strategy.\n */\n checkGapFactorRange (gapFactor: string, value: number): (string | null) {\n switch (gapFactor) {\n case GapStrategyMultiplier:\n if (value < 1 || value > 100) {\n return 'Multiplier must be between 1 and 100'\n }\n return null\n case GapStrategyAbsolute:\n case GapStrategyAbsolutePlus:\n if (value <= 0) {\n return 'Rate must be greater than 0'\n }\n return null\n case GapStrategyPercent:\n case GapStrategyPercentPlus:\n if (value <= 0 || value > 10) {\n return 'Percent must be between 0 and 10'\n }\n return null\n default: {\n throw new Error(`Unknown gap factor ${gapFactor}`)\n }\n }\n }\n\n /*\n * convertGapFactor converts between the displayed gap factor in the\n * placement tables and the number that is passed to the market maker.\n * For gap strategies that involve a percentage it converts between the\n * decimal value required by the backend and a percentage displayed to\n * the user.\n */\n convertGapFactor (gapFactor: number, gapStrategy: string, toDisplay: boolean): number {\n switch (gapStrategy) {\n case GapStrategyMultiplier:\n case GapStrategyAbsolute:\n case GapStrategyAbsolutePlus:\n return gapFactor\n case GapStrategyPercent:\n case GapStrategyPercentPlus:\n if (toDisplay) {\n return gapFactor * 100\n }\n return gapFactor / 100\n default:\n throw new Error(`Unknown gap factor ${gapStrategy}`)\n }\n }\n\n /*\n * addPlacement adds a row to a placement table. This is called both when\n * the page is initially loaded, and when the \"add\" button is pressed on\n * the placement table. initialLoadPlacement is non-nil if this is being\n * called on the initial load.\n */\n addPlacement (isBuy: boolean, initialLoadPlacement: OrderPlacement | null, gapStrategy?: string) {\n const { page, updatedConfig: cfg } = this\n\n let tableBody: PageElement = page.sellPlacementsTableBody\n let addPlacementRow: PageElement = page.addSellPlacementRow\n let lotsElement: PageElement = page.addSellPlacementLots\n let gapFactorElement: PageElement = page.addSellPlacementGapFactor\n let errElement: PageElement = page.sellPlacementsErr\n if (isBuy) {\n tableBody = page.buyPlacementsTableBody\n addPlacementRow = page.addBuyPlacementRow\n lotsElement = page.addBuyPlacementLots\n gapFactorElement = page.addBuyPlacementGapFactor\n errElement = page.buyPlacementsErr\n }\n\n Doc.hide(errElement)\n\n // updateArrowVis updates the visibility of the move up/down arrows in\n // each row of the placement table. The up arrow is not shown on the\n // top row, and the down arrow is not shown on the bottom row. They\n // are all hidden if market making is running.\n const updateArrowVis = () => {\n for (let i = 0; i < tableBody.children.length - 1; i++) {\n const row = Doc.parseTemplate(tableBody.children[i] as HTMLElement)\n Doc.setVis(i !== 0, row.upBtn)\n Doc.setVis(i !== tableBody.children.length - 2, row.downBtn)\n }\n }\n\n Doc.hide(errElement)\n const setErr = (err: string) => {\n errElement.textContent = err\n Doc.show(errElement)\n }\n\n let lots: number\n let actualGapFactor: number\n let displayedGapFactor: number\n if (!gapStrategy) gapStrategy = this.specs.cexName ? GapStrategyMultiplier : cfg.gapStrategy\n const placements = isBuy ? cfg.buyPlacements : cfg.sellPlacements\n const unit = this.gapFactorHeaderUnit(gapStrategy)[1]\n if (initialLoadPlacement) {\n lots = initialLoadPlacement.lots\n actualGapFactor = initialLoadPlacement.gapFactor\n displayedGapFactor = this.convertGapFactor(actualGapFactor, gapStrategy, true)\n } else {\n lots = parseInt(lotsElement.value || '0')\n displayedGapFactor = parseFloat(gapFactorElement.value || '0')\n actualGapFactor = this.convertGapFactor(displayedGapFactor, gapStrategy, false)\n if (lots === 0) {\n setErr('Lots must be greater than 0')\n return\n }\n\n const gapFactorErr = this.checkGapFactorRange(gapStrategy, displayedGapFactor)\n if (gapFactorErr) {\n setErr(gapFactorErr)\n return\n }\n\n if (placements.find((placement) => placement.gapFactor === actualGapFactor)\n ) {\n setErr('Duplicate placement')\n return\n }\n\n placements.push({ lots, gapFactor: actualGapFactor })\n }\n\n const newRow = page.placementRowTmpl.cloneNode(true) as PageElement\n const newRowTmpl = Doc.parseTemplate(newRow)\n newRowTmpl.priority.textContent = `${tableBody.children.length}`\n newRowTmpl.lots.textContent = `${lots}`\n newRowTmpl.gapFactor.textContent = `${displayedGapFactor} ${unit}`\n Doc.bind(newRowTmpl.removeBtn, 'click', () => {\n const index = placements.findIndex((placement) => {\n return placement.lots === lots && placement.gapFactor === actualGapFactor\n })\n if (index === -1) return\n placements.splice(index, 1)\n newRow.remove()\n updateArrowVis()\n this.updateModifiedMarkers()\n this.placementsChart.render()\n this.updateAllocations()\n })\n\n Doc.bind(newRowTmpl.upBtn, 'click', () => {\n const index = placements.findIndex((p: OrderPlacement) => p.lots === lots && p.gapFactor === actualGapFactor)\n if (index === 0) return\n const prevPlacement = placements[index - 1]\n placements[index - 1] = placements[index]\n placements[index] = prevPlacement\n newRowTmpl.priority.textContent = `${index}`\n newRow.remove()\n tableBody.insertBefore(newRow, tableBody.children[index - 1])\n const movedDownTmpl = Doc.parseTemplate(\n tableBody.children[index] as HTMLElement\n )\n movedDownTmpl.priority.textContent = `${index + 1}`\n updateArrowVis()\n this.updateModifiedMarkers()\n })\n\n Doc.bind(newRowTmpl.downBtn, 'click', () => {\n const index = placements.findIndex((p) => p.lots === lots && p.gapFactor === actualGapFactor)\n if (index === placements.length - 1) return\n const nextPlacement = placements[index + 1]\n placements[index + 1] = placements[index]\n placements[index] = nextPlacement\n newRowTmpl.priority.textContent = `${index + 2}`\n newRow.remove()\n tableBody.insertBefore(newRow, tableBody.children[index + 1])\n const movedUpTmpl = Doc.parseTemplate(\n tableBody.children[index] as HTMLElement\n )\n movedUpTmpl.priority.textContent = `${index + 1}`\n updateArrowVis()\n this.updateModifiedMarkers()\n })\n\n tableBody.insertBefore(newRow, addPlacementRow)\n updateArrowVis()\n }\n\n setArbMMLabels () {\n this.page.buyGapFactorHdr.textContent = intl.prep(intl.ID_MATCH_BUFFER)\n this.page.sellGapFactorHdr.textContent = intl.prep(intl.ID_MATCH_BUFFER)\n }\n\n /*\n * setGapFactorLabels sets the headers on the gap factor column of each\n * placement table.\n */\n setGapFactorLabels (gapStrategy: string) {\n const page = this.page\n const header = this.gapFactorHeaderUnit(gapStrategy)[0]\n page.buyGapFactorHdr.textContent = header\n page.sellGapFactorHdr.textContent = header\n Doc.hide(page.percentPlusInfo, page.percentInfo, page.absolutePlusInfo, page.absoluteInfo, page.multiplierInfo)\n switch (gapStrategy) {\n case 'percent-plus':\n return Doc.show(page.percentPlusInfo)\n case 'percent':\n return Doc.show(page.percentInfo)\n case 'absolute-plus':\n return Doc.show(page.absolutePlusInfo)\n case 'absolute':\n return Doc.show(page.absoluteInfo)\n case 'multiplier':\n return Doc.show(page.multiplierInfo)\n }\n }\n\n clearPlacements (cacheKey: string) {\n const { page, updatedConfig: cfg } = this\n while (page.buyPlacementsTableBody.children.length > 1) {\n page.buyPlacementsTableBody.children[0].remove()\n }\n while (page.sellPlacementsTableBody.children.length > 1) {\n page.sellPlacementsTableBody.children[0].remove()\n }\n this.placementsCache[cacheKey] = [cfg.buyPlacements, cfg.sellPlacements]\n cfg.buyPlacements.splice(0, cfg.buyPlacements.length)\n cfg.sellPlacements.splice(0, cfg.sellPlacements.length)\n }\n\n loadCachedPlacements (cacheKey: string) {\n const c = this.placementsCache[cacheKey]\n if (!c) return\n const { updatedConfig: cfg } = this\n cfg.buyPlacements.splice(0, cfg.buyPlacements.length)\n cfg.sellPlacements.splice(0, cfg.sellPlacements.length)\n cfg.buyPlacements.push(...c[0])\n cfg.sellPlacements.push(...c[1])\n const gapStrategy = cacheKey === arbMMRowCacheKey ? GapStrategyMultiplier : cacheKey\n for (const p of cfg.buyPlacements) this.addPlacement(true, p, gapStrategy)\n for (const p of cfg.sellPlacements) this.addPlacement(false, p, gapStrategy)\n }\n\n /*\n * setOriginalValues sets the updatedConfig field to be equal to the\n * and sets the values displayed buy each field input to be equal\n * to the values since the last save.\n */\n setOriginalValues () {\n const {\n page, originalConfig: oldCfg, updatedConfig: cfg, specs: { cexName, botType }\n } = this\n\n this.clearPlacements(cexName ? arbMMRowCacheKey : cfg.gapStrategy)\n\n const assign = (to: any, from: any) => { // not recursive\n for (const [k, v] of Object.entries(from)) {\n if (Array.isArray(v)) {\n to[k].splice(0, to[k].length)\n for (const i of v) to[k].push(i)\n } else if (typeof v === 'object') Object.assign(to[k], v)\n else to[k] = from[k]\n }\n }\n assign(cfg, JSON.parse(JSON.stringify(oldCfg)))\n\n const tol = cfg.driftTolerance ?? defaultDriftTolerance.value\n this.driftTolerance.setValue(tol * 100)\n this.driftToleranceSlider.setValue(tol / defaultDriftTolerance.maxV)\n\n const persist = cfg.orderPersistence ?? defaultOrderPersistence.value\n this.orderPersistence.setValue(persist)\n this.orderPersistenceSlider.setValue(persist / defaultOrderPersistence.maxV)\n\n const profit = cfg.profit ?? defaultProfit.value\n page.profitInput.value = String(profit * 100)\n this.qcProfit.setValue(profit * 100)\n this.qcProfitSlider.setValue((profit - defaultProfit.minV) / defaultProfit.range)\n\n if (cexName) {\n page.cexRebalanceCheckbox.checked = cfg.cexRebalance\n this.autoRebalanceChanged()\n }\n\n // Gap strategy\n if (!page.gapStrategySelect.options) return\n Array.from(page.gapStrategySelect.options).forEach((opt: HTMLOptionElement) => { opt.selected = opt.value === cfg.gapStrategy })\n this.setGapFactorLabels(cfg.gapStrategy)\n\n if (botType === botTypeBasicMM) {\n Doc.show(page.gapStrategyBox)\n Doc.hide(page.profitSelectorBox, page.orderPersistenceBox)\n this.setGapFactorLabels(page.gapStrategySelect.value || '')\n } else if (cexName && app().mmStatus.cexes[cexName]) {\n Doc.hide(page.gapStrategyBox)\n Doc.show(page.profitSelectorBox, page.orderPersistenceBox)\n this.setArbMMLabels()\n }\n\n // Buy/Sell placements\n oldCfg.buyPlacements.forEach((p) => { this.addPlacement(true, p) })\n oldCfg.sellPlacements.forEach((p) => { this.addPlacement(false, p) })\n\n this.basePane.setupWalletSettings()\n this.quotePane.setupWalletSettings()\n\n this.updateModifiedMarkers()\n if (Doc.isDisplayed(page.quickConfig)) this.switchToQuickConfig()\n }\n\n /*\n * validateFields validates configuration values and optionally shows error\n * messages.\n */\n validateFields (showErrors: boolean): boolean {\n let ok = true\n const {\n page, specs: { botType },\n updatedConfig: { sellPlacements, buyPlacements, profit }\n } = this\n const setError = (errEl: PageElement, errID: string) => {\n ok = false\n if (!showErrors) return\n errEl.textContent = intl.prep(errID)\n Doc.show(errEl)\n }\n if (showErrors) {\n Doc.hide(\n page.buyPlacementsErr, page.sellPlacementsErr, page.profitInputErr\n )\n }\n if (botType !== botTypeBasicArb && buyPlacements.length + sellPlacements.length === 0) {\n setError(page.buyPlacementsErr, intl.ID_NO_PLACEMENTS)\n setError(page.sellPlacementsErr, intl.ID_NO_PLACEMENTS)\n }\n if (botType !== botTypeBasicMM) {\n if (isNaN(profit)) setError(page.profitInputErr, intl.ID_INVALID_VALUE)\n else if (profit === 0) setError(page.profitInputErr, intl.ID_NO_ZERO)\n }\n return ok\n }\n\n /*\n * saveSettings updates the settings in the backend, and sets the originalConfig\n * to be equal to the updatedConfig.\n */\n async saveSettings () {\n // Make a copy and delete either the basic mm config or the arb-mm config,\n // depending on whether a cex is selected.\n if (!this.validateFields(true)) return\n const { cfg, baseID, quoteID, host, botType, cexName } = this.marketStuff()\n\n const botCfg: BotConfig = {\n host: host,\n baseID: baseID,\n quoteID: quoteID,\n cexName: cexName ?? '',\n uiConfig: {\n simpleArbLots: cfg.simpleArbLots,\n baseConfig: cfg.baseConfig,\n quoteConfig: cfg.quoteConfig,\n cexRebalance: cfg.cexRebalance\n },\n baseWalletOptions: cfg.baseOptions,\n quoteWalletOptions: cfg.quoteOptions\n }\n switch (botType) {\n case botTypeBasicMM:\n botCfg.basicMarketMakingConfig = this.basicMMConfig()\n break\n case botTypeArbMM:\n botCfg.arbMarketMakingConfig = this.arbMMConfig()\n break\n case botTypeBasicArb:\n botCfg.simpleArbConfig = this.basicArbConfig()\n }\n\n app().log('mm', 'saving bot config', botCfg)\n await MM.updateBotConfig(botCfg)\n await app().fetchMMStatus()\n this.originalConfig = JSON.parse(JSON.stringify(cfg))\n this.updateModifiedMarkers()\n const lastBots = State.fetchLocal(lastBotsLK) || {}\n lastBots[`${baseID}_${quoteID}_${host}`] = this.specs\n State.storeLocal(lastBotsLK, lastBots)\n if (cexName) State.storeLocal(lastArbExchangeLK, cexName)\n app().loadPage('mm')\n }\n\n async delete () {\n const { page, specs: { host, baseID, quoteID } } = this\n Doc.hide(page.deleteErr)\n const loaded = app().loading(page.botSettingsContainer)\n const resp = await MM.removeBotConfig(host, baseID, quoteID)\n loaded()\n if (!app().checkResponse(resp)) {\n page.deleteErr.textContent = intl.prep(intl.ID_API_ERROR, { msg: resp.msg })\n Doc.show(page.deleteErr)\n return\n }\n await app().fetchMMStatus()\n app().loadPage('mm')\n }\n\n /*\n * arbMMConfig parses the configuration for the arb-mm bot. Only one of\n * arbMMConfig or basicMMConfig should be used when updating the bot\n * configuration. Which is used depends on if the user has configured and\n * selected a CEX or not.\n */\n arbMMConfig (): ArbMarketMakingConfig {\n const { updatedConfig: cfg } = this\n const arbCfg: ArbMarketMakingConfig = {\n buyPlacements: [],\n sellPlacements: [],\n profit: cfg.profit,\n driftTolerance: cfg.driftTolerance,\n orderPersistence: cfg.orderPersistence\n }\n for (const p of cfg.buyPlacements) arbCfg.buyPlacements.push({ lots: p.lots, multiplier: p.gapFactor })\n for (const p of cfg.sellPlacements) arbCfg.sellPlacements.push({ lots: p.lots, multiplier: p.gapFactor })\n return arbCfg\n }\n\n basicArbConfig (): SimpleArbConfig {\n const { updatedConfig: cfg } = this\n const arbCfg: SimpleArbConfig = {\n profitTrigger: cfg.profit,\n maxActiveArbs: 100, // TODO\n numEpochsLeaveOpen: cfg.orderPersistence\n }\n return arbCfg\n }\n\n /*\n * basicMMConfig parses the configuration for the basic marketmaker. Only of\n * of basidMMConfig or arbMMConfig should be used when updating the bot\n * configuration.\n */\n basicMMConfig (): BasicMarketMakingConfig {\n const { updatedConfig: cfg } = this\n const mmCfg: BasicMarketMakingConfig = {\n gapStrategy: cfg.gapStrategy,\n sellPlacements: cfg.sellPlacements,\n buyPlacements: cfg.buyPlacements,\n driftTolerance: cfg.driftTolerance\n }\n return mmCfg\n }\n\n /*\n * fetchOracles fetches the current oracle rates and fiat rates, and displays\n * them on the screen.\n */\n async fetchMarketReport (): Promise<void> {\n const { page, specs: { host, baseID, quoteID } } = this\n\n const res = await MM.report(host, baseID, quoteID)\n Doc.hide(page.oraclesLoading, page.oraclesTable, page.noOracles)\n\n if (!app().checkResponse(res)) {\n page.oraclesErrMsg.textContent = res.msg\n Doc.show(page.oraclesErr)\n return\n }\n\n const r = this.marketReport = res.report as MarketReport\n if (!r.oracles || r.oracles.length === 0) {\n Doc.show(page.noOracles)\n } else {\n Doc.hide(page.noOracles)\n Doc.empty(page.oracles)\n for (const o of r.oracles ?? []) {\n const tr = page.oracleTmpl.cloneNode(true) as PageElement\n page.oracles.appendChild(tr)\n const tmpl = Doc.parseTemplate(tr)\n tmpl.logo.src = 'img/' + o.host + '.png'\n tmpl.host.textContent = ExchangeNames[o.host]\n tmpl.volume.textContent = Doc.formatFourSigFigs(o.usdVol)\n tmpl.price.textContent = Doc.formatFourSigFigs((o.bestBuy + o.bestSell) / 2)\n }\n page.avgPrice.textContent = r.price ? Doc.formatFourSigFigs(r.price) : '0'\n Doc.show(page.oraclesTable)\n }\n\n if (r.baseFiatRate > 0) {\n page.baseFiatRate.textContent = Doc.formatFourSigFigs(r.baseFiatRate)\n } else {\n page.baseFiatRate.textContent = 'N/A'\n }\n\n if (r.quoteFiatRate > 0) {\n page.quoteFiatRate.textContent = Doc.formatFourSigFigs(r.quoteFiatRate)\n } else {\n page.quoteFiatRate.textContent = 'N/A'\n }\n Doc.show(page.fiatRates)\n }\n\n /*\n * handleCEXSubmit handles clicks on the CEX configuration submission button.\n */\n async cexConfigured (cexName: string) {\n const { page, formSpecs: { host, baseID, quoteID } } = this\n const dinfo = CEXDisplayInfos[cexName]\n for (const { baseID, quoteID, tmpl, arbs } of this.marketRows) {\n if (arbs.indexOf(cexName) !== -1) continue\n const cexHasMarket = this.cexMarketSupportFilter(baseID, quoteID)\n if (cexHasMarket(cexName)) {\n const img = page.arbBttnTmpl.cloneNode(true) as PageElement\n img.src = dinfo.logo\n tmpl.arbs.appendChild(img)\n arbs.push(cexName)\n }\n }\n this.setCEXAvailability(baseID, quoteID, cexName)\n this.showBotTypeForm(host, baseID, quoteID, botTypeArbMM, cexName)\n }\n\n /*\n * setupCEXes should be called during initialization.\n */\n setupCEXes () {\n this.formCexes = {}\n for (const name of Object.keys(CEXDisplayInfos)) this.addCEX(name)\n }\n\n /*\n * setCEXAvailability sets the coloring and messaging of the CEX selection\n * buttons.\n */\n setCEXAvailability (baseID: number, quoteID: number, selectedCEX?: string) {\n const cexHasMarket = this.cexMarketSupportFilter(baseID, quoteID)\n for (const { name, div, tmpl } of Object.values(this.formCexes)) {\n const has = cexHasMarket(name)\n const cexStatus = app().mmStatus.cexes[name]\n Doc.hide(tmpl.unavailable, tmpl.needsconfig, tmpl.disconnected)\n Doc.setVis(Boolean(cexStatus), tmpl.reconfig)\n tmpl.logo.classList.remove('greyscal')\n div.classList.toggle('configured', Boolean(cexStatus) && !cexStatus.connectErr)\n if (!cexStatus) {\n Doc.show(tmpl.needsconfig)\n } else if (cexStatus.connectErr) {\n Doc.show(tmpl.disconnected)\n } else if (!has) {\n Doc.show(tmpl.unavailable)\n tmpl.logo.classList.add('greyscal')\n } else if (name === selectedCEX) this.selectFormCEX(name)\n }\n }\n\n selectFormCEX (cexName: string) {\n for (const { name, div } of Object.values(this.formCexes)) {\n div.classList.toggle('selected', name === cexName)\n }\n }\n\n addCEX (cexName: string) {\n const dinfo = CEXDisplayInfos[cexName]\n const div = this.page.cexOptTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(div)\n tmpl.name.textContent = dinfo.name\n tmpl.logo.src = dinfo.logo\n this.page.cexSelection.appendChild(div)\n this.formCexes[cexName] = { name: cexName, div, tmpl }\n Doc.bind(div, 'click', () => {\n const cexStatus = app().mmStatus.cexes[cexName]\n if (!cexStatus || cexStatus.connectErr) {\n this.showCEXConfigForm(cexName)\n return\n }\n const cex = this.formCexes[cexName]\n if (cex.div.classList.contains('selected')) { // unselect\n for (const cex of Object.values(this.formCexes)) cex.div.classList.remove('selected')\n const { baseID, quoteID } = this.formSpecs\n this.setCEXAvailability(baseID, quoteID)\n return\n }\n for (const cex of Object.values(this.formCexes)) cex.div.classList.toggle('selected', cex.name === cexName)\n })\n Doc.bind(tmpl.reconfig, 'click', (e: MouseEvent) => {\n e.stopPropagation()\n this.showCEXConfigForm(cexName)\n })\n }\n\n showCEXConfigForm (cexName: string) {\n const page = this.page\n this.cexConfigForm.setCEX(cexName)\n this.forms.show(page.cexConfigForm)\n }\n\n /*\n * cexMarketSupportFilter returns a lookup CEXes that have a matching market\n * for the currently selected base and quote assets.\n */\n cexMarketSupportFilter (baseID: number, quoteID: number) {\n const cexes: Record<string, boolean> = {}\n for (const [cexName, cexStatus] of Object.entries(app().mmStatus.cexes)) {\n for (const { baseID: b, quoteID: q } of Object.values(cexStatus.markets ?? [])) {\n if (b === baseID && q === quoteID) {\n cexes[cexName] = true\n break\n }\n }\n }\n return (cexName: string) => Boolean(cexes[cexName])\n }\n}\n\nfunction isViewOnly (specs: BotSpecs, mmStatus: MarketMakingStatus): boolean {\n const botStatus = mmStatus.bots.find(({ config: cfg }) => cfg.host === specs.host && cfg.baseID === specs.baseID && cfg.quoteID === specs.quoteID)\n return Boolean(botStatus?.running)\n}\n\nconst ExchangeNames: Record<string, string> = {\n 'binance.com': 'Binance',\n 'coinbase.com': 'Coinbase',\n 'bittrex.com': 'Bittrex',\n 'hitbtc.com': 'HitBTC',\n 'exmo.com': 'EXMO'\n}\n\nfunction tokenAssetApprovalStatuses (host: string, b: SupportedAsset, q: SupportedAsset) {\n let baseAssetApprovalStatus = ApprovalStatus.Approved\n let quoteAssetApprovalStatus = ApprovalStatus.Approved\n\n if (b?.token) {\n const baseAsset = app().assets[b.id]\n const baseVersion = app().exchanges[host].assets[b.id].version\n if (baseAsset?.wallet?.approved && baseAsset.wallet.approved[baseVersion] !== undefined) {\n baseAssetApprovalStatus = baseAsset.wallet.approved[baseVersion]\n }\n }\n if (q?.token) {\n const quoteAsset = app().assets[q.id]\n const quoteVersion = app().exchanges[host].assets[q.id].version\n if (quoteAsset?.wallet?.approved && quoteAsset.wallet.approved[quoteVersion] !== undefined) {\n quoteAssetApprovalStatus = quoteAsset.wallet.approved[quoteVersion]\n }\n }\n\n return [\n baseAssetApprovalStatus,\n quoteAssetApprovalStatus\n ]\n}\n\nclass AssetPane {\n pg: MarketMakerSettingsPage\n div: PageElement\n page: Record<string, PageElement>\n assetID: number\n ui: UnitInfo\n walletConfig: Record<string, string>\n feeAssetID: number\n feeUI: UnitInfo\n isQuote: boolean\n isToken: boolean\n lotSize: number // might be quote converted\n lotSizeConv: number\n cfg: BotAssetConfig\n inv: ProjectedAlloc\n nSwapFees: IncrementalInput\n nSwapFeesSlider: MiniSlider\n orderReserves: NumberInput\n orderReservesSlider: MiniSlider\n slippageBuffer: NumberInput\n slippageBufferSlider: MiniSlider\n minTransfer: NumberInput\n minTransferSlider: MiniSlider\n\n constructor (pg: MarketMakerSettingsPage, div: PageElement) {\n this.pg = pg\n this.div = div\n const page = this.page = Doc.parseTemplate(div)\n\n this.nSwapFees = new IncrementalInput(page.nSwapFees, {\n prec: defaultSwapReserves.prec,\n inc: defaultSwapReserves.inc,\n changed: (v: number) => {\n const { minR, range } = defaultSwapReserves\n this.cfg.swapFeeN = v\n this.nSwapFeesSlider.setValue((v - minR) / range)\n this.pg.updateAllocations()\n }\n })\n\n this.nSwapFeesSlider = new MiniSlider(page.nSwapFeesSlider, (r: number) => {\n const { minR, range, prec } = defaultSwapReserves\n const [v] = toPrecision(minR + r * range, prec)\n this.cfg.swapFeeN = v\n this.nSwapFees.setValue(v)\n this.pg.updateAllocations()\n })\n this.orderReserves = new NumberInput(page.orderReservesFactor, {\n prec: defaultOrderReserves.prec,\n min: 0,\n changed: (v: number) => {\n const { minR, range } = defaultOrderReserves\n this.cfg.orderReservesFactor = v\n this.orderReservesSlider.setValue((v - minR) / range)\n this.pg.updateAllocations()\n }\n })\n this.orderReservesSlider = new MiniSlider(page.orderReservesSlider, (r: number) => {\n const { minR, range, prec } = defaultOrderReserves\n const [v] = toPrecision(minR + r * range, prec)\n this.orderReserves.setValue(v)\n this.cfg.orderReservesFactor = v\n this.pg.updateAllocations()\n })\n this.slippageBuffer = new NumberInput(page.slippageBufferFactor, {\n prec: defaultSlippage.prec,\n min: 0,\n changed: (v: number) => {\n const { minR, range } = defaultSlippage\n this.cfg.slippageBufferFactor = v\n this.slippageBufferSlider.setValue((v - minR) / range)\n this.pg.updateAllocations()\n }\n })\n this.slippageBufferSlider = new MiniSlider(page.slippageBufferSlider, (r: number) => {\n const { minR, range, prec } = defaultSlippage\n const [v] = toPrecision(minR + r * range, prec)\n this.slippageBuffer.setValue(minR + r * range)\n this.cfg.slippageBufferFactor = v\n this.pg.updateAllocations()\n })\n this.minTransfer = new NumberInput(page.minTransfer, {\n sigFigs: true,\n min: 0,\n changed: (v: number) => {\n const { cfg } = this\n const totalInventory = this.commit()\n const [minV, maxV] = [this.minTransfer.min, Math.max(this.minTransfer.min * 2, totalInventory)]\n cfg.transferFactor = (v - minV) / (maxV - minV)\n this.minTransferSlider.setValue(cfg.transferFactor)\n }\n })\n this.minTransferSlider = new MiniSlider(page.minTransferSlider, (r: number) => {\n const { cfg } = this\n const totalInventory = this.commit()\n const [minV, maxV] = [this.minTransfer.min, Math.max(this.minTransfer.min, totalInventory)]\n cfg.transferFactor = r\n this.minTransfer.setValue(minV + r * (maxV - minV))\n })\n\n Doc.bind(page.showBalance, 'click', () => { pg.showAddress(this.assetID) })\n }\n\n // lot size can change if this is the quote asset, keep it updated.\n setLotSize (lotSize: number) {\n const { ui } = this\n this.lotSize = lotSize\n this.lotSizeConv = lotSize / ui.conventional.conversionFactor\n }\n\n setAsset (assetID: number, isQuote: boolean) {\n this.assetID = assetID\n this.isQuote = isQuote\n const cfg = this.cfg = isQuote ? this.pg.updatedConfig.quoteConfig : this.pg.updatedConfig.baseConfig\n const { page, div, pg: { specs: { botType, baseID, cexName }, mktID, updatedConfig: { baseOptions, quoteOptions } } } = this\n const { symbol, name, token, unitInfo: ui } = app().assets[assetID]\n this.ui = ui\n this.walletConfig = assetID === baseID ? baseOptions : quoteOptions\n const { conventional: { unit: ticker } } = ui\n this.feeAssetID = token ? token.parentID : assetID\n const { unitInfo: feeUI, name: feeName, symbol: feeSymbol } = app().assets[this.feeAssetID]\n this.feeUI = feeUI\n this.inv = { book: 0, bookingFees: 0, swapFeeReserves: 0, cex: 0, orderReserves: 0, slippageBuffer: 0 }\n this.isToken = Boolean(token)\n Doc.setVis(this.isToken, page.feeTotalBox, page.feeReservesBox, page.feeBalances)\n Doc.setVis(isQuote, page.slippageBufferBox)\n Doc.setSrc(div, '[data-logo]', Doc.logoPath(symbol))\n Doc.setText(div, '[data-name]', name)\n Doc.setText(div, '[data-ticker]', ticker)\n const { conventional: { unit: feeTicker } } = feeUI\n Doc.setText(div, '[data-fee-ticker]', feeTicker)\n Doc.setText(div, '[data-fee-name]', feeName)\n Doc.setSrc(div, '[data-fee-logo]', Doc.logoPath(feeSymbol))\n Doc.setVis(botType !== botTypeBasicMM, page.cexMinInvBox)\n Doc.setVis(botType !== botTypeBasicArb, page.orderReservesBox)\n this.nSwapFees.setValue(cfg.swapFeeN ?? defaultSwapReserves.n)\n this.nSwapFeesSlider.setValue(cfg.swapFeeN / defaultSwapReserves.maxR)\n if (botType !== botTypeBasicArb) {\n const [v] = toPrecision(cfg.orderReservesFactor ?? defaultOrderReserves.factor, defaultOrderReserves.prec)\n this.orderReserves.setValue(v)\n this.orderReservesSlider.setValue((v - defaultOrderReserves.minR) / defaultOrderReserves.range)\n }\n if (botType !== botTypeBasicMM) {\n this.minTransfer.prec = Math.log10(ui.conventional.conversionFactor)\n const mkt = app().mmStatus.cexes[cexName as string].markets[mktID]\n this.minTransfer.min = ((isQuote ? mkt.quoteMinWithdraw : mkt.baseMinWithdraw) / ui.conventional.conversionFactor)\n }\n this.slippageBuffer.setValue(cfg.slippageBufferFactor)\n const { minR, range } = defaultSlippage\n this.slippageBufferSlider.setValue((cfg.slippageBufferFactor - minR) / range)\n this.setupWalletSettings()\n this.updateBalances()\n }\n\n commit () {\n const { inv, isToken } = this\n let commit = inv.book + inv.cex + inv.orderReserves + inv.slippageBuffer\n if (!isToken) commit += inv.bookingFees + inv.swapFeeReserves\n return commit\n }\n\n updateInventory (lots: number, counterLots: number, lotSize: number, dexCommit: number, cexCommit: number, fees: AssetBookingFees) {\n this.setLotSize(lotSize)\n const { page, cfg, lotSizeConv, inv, ui, feeUI, isToken, isQuote, pg: { specs: { cexName, botType } } } = this\n page.bookLots.textContent = String(lots)\n page.bookLotSize.textContent = Doc.formatFourSigFigs(lotSizeConv)\n inv.book = lots * lotSizeConv\n page.bookCommitment.textContent = Doc.formatFourSigFigs(inv.book)\n const feesPerLotConv = fees.bookingFeesPerLot / feeUI.conventional.conversionFactor\n page.bookingFeesPerLot.textContent = Doc.formatFourSigFigs(feesPerLotConv)\n page.swapReservesFactor.textContent = fees.swapReservesFactor.toFixed(2)\n page.bookingFeesLots.textContent = String(lots)\n inv.bookingFees = fees.bookingFees / feeUI.conventional.conversionFactor\n page.bookingFees.textContent = Doc.formatFourSigFigs(inv.bookingFees)\n if (cexName) {\n inv.cex = cexCommit / ui.conventional.conversionFactor\n page.cexMinInv.textContent = Doc.formatFourSigFigs(inv.cex)\n }\n if (botType !== botTypeBasicArb) {\n const totalInventory = Math.max(cexCommit, dexCommit) / ui.conventional.conversionFactor\n page.orderReservesBasis.textContent = Doc.formatFourSigFigs(totalInventory)\n const orderReserves = totalInventory * cfg.orderReservesFactor\n inv.orderReserves = orderReserves\n page.orderReserves.textContent = Doc.formatFourSigFigs(orderReserves)\n }\n if (isToken) {\n const feesPerSwapConv = fees.tokenFeesPerSwap / feeUI.conventional.conversionFactor\n page.feeReservesPerSwap.textContent = Doc.formatFourSigFigs(feesPerSwapConv)\n inv.swapFeeReserves = feesPerSwapConv * cfg.swapFeeN\n page.feeReserves.textContent = Doc.formatFourSigFigs(inv.swapFeeReserves)\n }\n if (isQuote) {\n const basis = inv.book + inv.cex + inv.orderReserves\n page.slippageBufferBasis.textContent = Doc.formatCoinValue(basis * ui.conventional.conversionFactor, ui)\n inv.slippageBuffer = basis * cfg.slippageBufferFactor\n page.slippageBuffer.textContent = Doc.formatCoinValue(inv.slippageBuffer * ui.conventional.conversionFactor, ui)\n }\n Doc.setVis(fees.bookingFeesPerCounterLot > 0, page.redemptionFeesBox)\n if (fees.bookingFeesPerCounterLot > 0) {\n const feesPerLotConv = fees.bookingFeesPerCounterLot / feeUI.conventional.conversionFactor\n page.redemptionFeesPerLot.textContent = Doc.formatFourSigFigs(feesPerLotConv)\n page.redemptionFeesLots.textContent = String(counterLots)\n page.redeemReservesFactor.textContent = fees.redeemReservesFactor.toFixed(2)\n }\n this.updateCommitTotal()\n this.updateTokenFees()\n this.updateRebalance()\n }\n\n updateCommitTotal () {\n const { page, assetID, ui } = this\n const commit = this.commit()\n page.commitTotal.textContent = Doc.formatCoinValue(Math.round(commit * ui.conventional.conversionFactor), ui)\n page.commitTotalFiat.textContent = Doc.formatFourSigFigs(commit * app().fiatRatesMap[assetID])\n }\n\n updateTokenFees () {\n const { page, inv, feeAssetID, feeUI, isToken } = this\n if (!isToken) return\n const feeReserves = inv.bookingFees + inv.swapFeeReserves\n page.feeTotal.textContent = Doc.formatCoinValue(feeReserves * feeUI.conventional.conversionFactor, feeUI)\n page.feeTotalFiat.textContent = Doc.formatFourSigFigs(feeReserves * app().fiatRatesMap[feeAssetID])\n }\n\n updateRebalance () {\n const { page, cfg, pg: { updatedConfig: { cexRebalance }, specs: { cexName } } } = this\n const showRebalance = cexName && cexRebalance\n Doc.setVis(showRebalance, page.rebalanceOpts)\n if (!showRebalance) return\n const totalInventory = this.commit()\n const [minV, maxV] = [this.minTransfer.min, Math.max(this.minTransfer.min * 2, totalInventory)]\n const rangeV = maxV - minV\n this.minTransfer.setValue(minV + cfg.transferFactor * rangeV)\n this.minTransferSlider.setValue((cfg.transferFactor - defaultTransfer.minR) / defaultTransfer.range)\n }\n\n setupWalletSettings () {\n const { page, assetID, walletConfig } = this\n const walletSettings = app().currentWalletDefinition(assetID)\n Doc.empty(page.walletSettings)\n Doc.setVis(!walletSettings.multifundingopts, page.walletSettingsNone)\n if (!walletSettings.multifundingopts) return\n const optToDiv: Record<string, PageElement> = {}\n const dependentOpts: Record<string, string[]> = {}\n const addDependentOpt = (optKey: string, optSetting: PageElement, dependentOn: string) => {\n if (!dependentOpts[dependentOn]) dependentOpts[dependentOn] = []\n dependentOpts[dependentOn].push(optKey)\n optToDiv[optKey] = optSetting\n }\n const setDependentOptsVis = (parentOptKey: string, vis: boolean) => {\n const optKeys = dependentOpts[parentOptKey]\n if (!optKeys) return\n for (const optKey of optKeys) Doc.setVis(vis, optToDiv[optKey])\n }\n const addOpt = (opt: OrderOption) => {\n if (opt.quoteAssetOnly && !this.isQuote) return\n const currVal = walletConfig[opt.key]\n let div: PageElement | undefined\n if (opt.isboolean) {\n div = page.boolSettingTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(div)\n tmpl.name.textContent = opt.displayname\n tmpl.input.checked = currVal === 'true'\n Doc.bind(tmpl.input, 'change', () => {\n walletConfig[opt.key] = tmpl.input.checked ? 'true' : 'false'\n setDependentOptsVis(opt.key, Boolean(tmpl.input.checked))\n })\n if (opt.description) tmpl.tooltip.dataset.tooltip = opt.description\n } else if (opt.xyRange) {\n const { start, end, xUnit } = opt.xyRange\n const range = end.x - start.x\n div = page.rangeSettingTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(div)\n tmpl.name.textContent = opt.displayname\n if (opt.description) tmpl.tooltip.dataset.tooltip = opt.description\n if (xUnit) tmpl.unit.textContent = xUnit\n else Doc.hide(tmpl.unit)\n\n const input = new NumberInput(tmpl.value, {\n prec: 1,\n changed: (rawV: number) => {\n const [v, s] = toFourSigFigs(rawV, 1)\n walletConfig[opt.key] = s\n slider.setValue((v - start.x) / range)\n }\n })\n const slider = new MiniSlider(tmpl.slider, (r: number) => {\n const rawV = start.x + r * range\n const [v, s] = toFourSigFigs(rawV, 1)\n walletConfig[opt.key] = s\n input.setValue(v)\n })\n // TODO: default value should be smaller or none for base asset.\n const [v, s] = toFourSigFigs(parseFloatDefault(currVal, start.x), 3)\n walletConfig[opt.key] = s\n slider.setValue((v - start.x) / range)\n input.setValue(v)\n tmpl.value.textContent = s\n }\n if (!div) return console.error(\"don't know how to handle opt\", opt)\n page.walletSettings.appendChild(div)\n if (opt.dependsOn) {\n addDependentOpt(opt.key, div, opt.dependsOn)\n const parentOptVal = walletConfig[opt.dependsOn]\n Doc.setVis(parentOptVal === 'true', div)\n }\n }\n\n if (walletSettings.multifundingopts && walletSettings.multifundingopts.length > 0) {\n for (const opt of walletSettings.multifundingopts) addOpt(opt)\n }\n app().bindTooltips(page.walletSettings)\n }\n\n updateBalances () {\n const { page, assetID, ui, feeAssetID, feeUI, pg: { specs: { cexName, baseID }, cexBaseBalance, cexQuoteBalance } } = this\n const { balance: { available } } = app().walletMap[assetID]\n const botInv = this.pg.runningBotInventory(assetID)\n const dexAvail = available - botInv.dex.total\n let cexAvail = 0\n Doc.setVis(cexName, page.balanceBreakdown)\n if (cexName) {\n page.dexAvail.textContent = Doc.formatFourSigFigs(dexAvail / ui.conventional.conversionFactor)\n const { available: cexRawAvail } = assetID === baseID ? cexBaseBalance : cexQuoteBalance\n cexAvail = cexRawAvail - botInv.cex.total\n page.cexAvail.textContent = Doc.formatFourSigFigs(cexAvail / ui.conventional.conversionFactor)\n }\n page.avail.textContent = Doc.formatFourSigFigs((dexAvail + cexAvail) / ui.conventional.conversionFactor)\n if (assetID === feeAssetID) return\n const { balance: { available: feeAvail } } = app().walletMap[feeAssetID]\n page.feeAvail.textContent = Doc.formatFourSigFigs(feeAvail / feeUI.conventional.conversionFactor)\n }\n}\n","import Doc, { Animation, AniToggle } from './doc'\nimport BasePage from './basepage'\nimport { postJSON } from './http'\nimport * as forms from './forms'\nimport * as intl from './locales'\nimport { ReputationMeter, strongTier } from './account'\nimport {\n app,\n PageElement,\n ConnectionStatus,\n Exchange,\n WalletState,\n PrepaidBondID\n} from './registry'\n\ninterface Animator {\n animate: (() => Promise<void>)\n}\n\ninterface BondOptionsForm {\n host?: string // Required, but set by updateBondOptions\n bondAssetID?: number\n targetTier?: number\n penaltyComps?: number\n}\n\nconst animationLength = 300\n\nexport default class DexSettingsPage extends BasePage {\n body: HTMLElement\n forms: PageElement[]\n currentForm: PageElement\n page: Record<string, PageElement>\n host: string\n accountDisabled:boolean\n keyup: (e: KeyboardEvent) => void\n dexAddrForm: forms.DEXAddressForm\n bondFeeBufferCache: Record<string, number>\n newWalletForm: forms.NewWalletForm\n regAssetForm: forms.FeeAssetSelectionForm\n walletWaitForm: forms.WalletWaitForm\n confirmRegisterForm: forms.ConfirmRegistrationForm\n reputationMeter: ReputationMeter\n animation: Animation\n renewToggle: AniToggle\n\n constructor (body: HTMLElement) {\n super()\n this.body = body\n const host = this.host = body.dataset.host ? body.dataset.host : ''\n const xc = app().exchanges[host]\n const page = this.page = Doc.idDescendants(body)\n this.forms = Doc.applySelector(page.forms, ':scope > form')\n\n this.confirmRegisterForm = new forms.ConfirmRegistrationForm(page.confirmRegForm, async () => {\n this.showSuccess(intl.prep(intl.ID_TRADING_TIER_UPDATED))\n this.renewToggle.setState(this.confirmRegisterForm.tier > 0)\n await app().fetchUser()\n app().updateMenuItemsDisplay()\n }, () => {\n this.runAnimation(this.regAssetForm, page.regAssetForm)\n })\n this.confirmRegisterForm.setExchange(xc, '')\n\n this.walletWaitForm = new forms.WalletWaitForm(page.walletWait, () => {\n this.runAnimation(this.confirmRegisterForm, page.confirmRegForm)\n }, () => {\n this.runAnimation(this.regAssetForm, page.regAssetForm)\n })\n this.walletWaitForm.setExchange(xc)\n\n this.newWalletForm = new forms.NewWalletForm(\n page.newWalletForm,\n assetID => this.newWalletCreated(assetID, this.confirmRegisterForm.tier),\n () => this.runAnimation(this.regAssetForm, page.regAssetForm)\n )\n\n this.regAssetForm = new forms.FeeAssetSelectionForm(page.regAssetForm, async (assetID: number, tier: number) => {\n if (assetID === PrepaidBondID) {\n await app().fetchUser()\n this.updateReputation()\n this.showSuccess(intl.prep(intl.ID_TRADING_TIER_UPDATED))\n return\n }\n const asset = app().assets[assetID]\n const wallet = asset.wallet\n if (wallet) {\n const loaded = app().loading(page.regAssetForm)\n const bondsFeeBuffer = await this.getBondsFeeBuffer(assetID, page.regAssetForm)\n this.confirmRegisterForm.setAsset(assetID, tier, bondsFeeBuffer)\n loaded()\n this.progressTierFormsWithWallet(assetID, wallet)\n return\n }\n this.confirmRegisterForm.setAsset(assetID, tier, 0)\n this.newWalletForm.setAsset(assetID)\n this.showForm(page.newWalletForm)\n })\n this.regAssetForm.setExchange(xc, '')\n\n this.reputationMeter = new ReputationMeter(page.repMeter)\n this.reputationMeter.setHost(host)\n\n Doc.bind(page.exportDexBtn, 'click', () => this.exportAccount())\n\n this.accountDisabled = body.dataset.disabled === 'true'\n Doc.bind(page.toggleAccountStatusBtn, 'click', () => {\n if (!this.accountDisabled) this.prepareAccountDisable(page.disableAccountForm)\n else this.toggleAccountStatus(false)\n })\n Doc.bind(page.updateCertBtn, 'click', () => page.certFileInput.click())\n Doc.bind(page.updateHostBtn, 'click', () => this.prepareUpdateHost())\n Doc.bind(page.certFileInput, 'change', () => this.onCertFileChange())\n Doc.bind(page.goBackToSettings, 'click', () => app().loadPage('settings'))\n\n const showTierForm = () => {\n this.regAssetForm.setExchange(app().exchanges[host], '') // reset form\n this.showForm(page.regAssetForm)\n }\n Doc.bind(page.changeTier, 'click', () => { showTierForm() })\n const willAutoRenew = xc.auth.targetTier > 0\n this.renewToggle = new AniToggle(page.toggleAutoRenew, page.renewErr, willAutoRenew, async (newState: boolean) => {\n if (this.accountDisabled) return\n if (newState) showTierForm()\n else return this.disableAutoRenew()\n })\n Doc.bind(page.autoRenewBox, 'click', (e: MouseEvent) => {\n e.stopPropagation()\n if (!this.accountDisabled) page.toggleAutoRenew.click()\n })\n\n page.penaltyCompInput.value = String(xc.auth.penaltyComps)\n Doc.bind(page.penaltyCompBox, 'click', (e: MouseEvent) => {\n e.stopPropagation()\n const xc = app().exchanges[this.host]\n page.penaltyCompInput.value = String(xc.auth.penaltyComps)\n page.penaltyCompInput.focus()\n })\n\n Doc.bind(page.penaltyCompInput, 'keyup', async (e: KeyboardEvent) => {\n Doc.hide(page.penaltyCompsErr)\n if (e.key === 'Escape') {\n return\n }\n if (!(e.key === 'Enter')) return\n const penaltyComps = parseInt(page.penaltyCompInput.value || '')\n if (isNaN(penaltyComps)) {\n Doc.show(page.penaltyCompsErr)\n page.penaltyCompsErr.textContent = intl.prep(intl.ID_INVALID_COMPS_VALUE)\n return\n }\n const loaded = app().loading(page.otherBondSettings)\n try {\n await this.updateBondOptions({ penaltyComps })\n loaded()\n } catch (e) {\n loaded()\n Doc.show(page.penaltyCompsErr)\n page.penaltyCompsErr.textContent = intl.prep(intl.ID_API_ERROR, { msg: e.msg })\n }\n })\n\n this.dexAddrForm = new forms.DEXAddressForm(page.dexAddrForm, async (xc: Exchange) => {\n app().loadPage(`/dexsettings/${xc.host}`)\n }, this.host)\n\n // forms.bind(page.bondDetailsForm, page.updateBondOptionsConfirm, () => this.updateBondOptions())\n forms.bind(page.disableAccountForm, page.disableAccountConfirm, () => this.toggleAccountStatus(true))\n\n Doc.bind(page.forms, 'mousedown', (e: MouseEvent) => {\n if (!Doc.mouseInElement(e, this.currentForm)) { this.closePopups() }\n })\n\n this.keyup = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.closePopups()\n }\n }\n Doc.bind(document, 'keyup', this.keyup)\n\n Doc.applySelector(page.forms, '.form-closer').forEach(el => {\n Doc.bind(el, 'click', () => { this.closePopups() })\n })\n\n app().registerNoteFeeder({\n conn: () => { this.setConnectionStatus() },\n reputation: () => { this.updateReputation() },\n feepayment: () => { this.updateReputation() },\n bondpost: () => { this.updateReputation() }\n })\n\n this.setConnectionStatus()\n this.updateReputation()\n }\n\n unload () {\n Doc.unbind(document, 'keyup', this.keyup)\n }\n\n async progressTierFormsWithWallet (assetID: number, wallet: WalletState) {\n const { page, confirmRegisterForm: { fees } } = this\n const asset = app().assets[assetID]\n const { bondAssets } = this.regAssetForm.xc\n const bondAsset = bondAssets[asset.symbol]\n if (!wallet.open) {\n const loaded = app().loading(page.forms)\n const res = await postJSON('/api/openwallet', { assetID: assetID })\n loaded()\n if (!app().checkResponse(res)) {\n this.regAssetForm.setAssetError(`error unlocking wallet: ${res.msg}`)\n this.runAnimation(this.regAssetForm, page.regAssetForm)\n }\n return\n }\n if (wallet.synced && wallet.balance.available >= 2 * bondAsset.amount + fees) {\n // If we are raising our tier, we'll show a confirmation form\n this.progressTierFormWithSyncedFundedWallet(assetID)\n return\n }\n this.walletWaitForm.setWallet(assetID, fees, this.confirmRegisterForm.tier)\n this.showForm(page.walletWait)\n }\n\n async progressTierFormWithSyncedFundedWallet (bondAssetID: number) {\n const xc = app().exchanges[this.host]\n const targetTier = this.confirmRegisterForm.tier\n const page = this.page\n const strongTier = xc.auth.liveStrength + xc.auth.pendingStrength - xc.auth.weakStrength\n if (targetTier > xc.auth.targetTier && targetTier > strongTier) {\n this.runAnimation(this.confirmRegisterForm, page.confirmRegForm)\n return\n }\n // Lowering tier\n const loaded = app().loading(this.body)\n try {\n await this.updateBondOptions({ bondAssetID, targetTier })\n loaded()\n } catch (e) {\n loaded()\n this.regAssetForm.setTierError(e.msg)\n return\n }\n // this.animateConfirmForm(page.regAssetForm)\n this.showSuccess(intl.prep(intl.ID_TRADING_TIER_UPDATED))\n }\n\n updateReputation () {\n const page = this.page\n const auth = app().exchanges[this.host].auth\n const { rep: { penalties }, targetTier, expiredBonds } = auth\n const displayTier = strongTier(auth)\n page.targetTier.textContent = String(targetTier)\n page.effectiveTier.textContent = String(displayTier)\n page.penalties.textContent = String(penalties)\n page.bondsPendingRefund.textContent = `${expiredBonds?.length || 0}`\n this.reputationMeter.update()\n }\n\n /* showForm shows a modal form with a little animation. */\n async showForm (form: HTMLElement) {\n const page = this.page\n this.currentForm = form\n this.forms.forEach(form => Doc.hide(form))\n form.style.right = '10000px'\n Doc.show(page.forms, form)\n const shift = (page.forms.offsetWidth + form.offsetWidth) / 2\n await Doc.animate(animationLength, progress => {\n form.style.right = `${(1 - progress) * shift}px`\n }, 'easeOutHard')\n form.style.right = '0'\n }\n\n async runAnimation (ani: Animator, form: PageElement) {\n Doc.hide(this.currentForm)\n await ani.animate()\n this.currentForm = form\n Doc.show(form)\n }\n\n closePopups () {\n Doc.hide(this.page.forms)\n if (this.animation) this.animation.stop()\n }\n\n async showSuccess (msg: string) {\n this.forms.forEach(form => Doc.hide(form))\n this.currentForm = this.page.checkmarkForm\n this.animation = forms.showSuccess(this.page, msg)\n await this.animation.wait()\n this.animation = new Animation(1500, () => { /* pass */ }, '', () => {\n if (this.currentForm === this.page.checkmarkForm) this.closePopups()\n })\n }\n\n // exportAccount exports and downloads the account info.\n async exportAccount () {\n const { page, host } = this\n const req = { host }\n const loaded = app().loading(this.body)\n const res = await postJSON('/api/exportaccount', req)\n loaded()\n if (!app().checkResponse(res)) {\n page.exportAccountErr.textContent = res.msg\n Doc.show(page.exportAccountErr)\n return\n }\n res.account.bonds = res.bonds // maintain backward compat of JSON file\n const accountForExport = JSON.parse(JSON.stringify(res.account))\n const a = document.createElement('a')\n a.setAttribute('download', 'dcrAccount-' + host + '.json')\n a.setAttribute('href', 'data:text/json,' + JSON.stringify(accountForExport, null, 2))\n a.click()\n Doc.hide(page.forms)\n }\n\n // toggleAccountStatus enables or disables the account associated with the\n // provided host.\n async toggleAccountStatus (disable:boolean) {\n const page = this.page\n Doc.hide(page.errMsg)\n let host: string|null = this.host\n if (disable) host = page.disableAccountHost.textContent\n const req = { host, disable: disable }\n const loaded = app().loading(this.body)\n const res = await postJSON('/api/toggleaccountstatus', req)\n loaded()\n if (!app().checkResponse(res)) {\n if (disable) {\n page.disableAccountErr.textContent = res.msg\n Doc.show(page.disableAccountErr)\n } else {\n page.errMsg.textContent = res.msg\n Doc.show(page.errMsg)\n }\n return\n }\n if (disable) {\n this.page.toggleAccountStatusBtn.textContent = intl.prep(intl.ID_ENABLE_ACCOUNT)\n Doc.hide(page.forms)\n } else this.page.toggleAccountStatusBtn.textContent = intl.prep(intl.ID_DISABLE_ACCOUNT)\n\n this.accountDisabled = disable\n\n // Refresh exchange information since we've just enabled/disabled the\n // exchange.\n await app().fetchUser()\n app().loadPage(`dexsettings/${host}`)\n }\n\n async prepareAccountDisable (disableAccountForm: HTMLElement) {\n const page = this.page\n page.disableAccountHost.textContent = this.host\n page.disableAccountErr.textContent = ''\n this.showForm(disableAccountForm)\n }\n\n // Retrieve an estimate for the tx fee needed to create new bond reserves.\n async getBondsFeeBuffer (assetID: number, form: HTMLElement) {\n const loaded = app().loading(form)\n const res = await postJSON('/api/bondsfeebuffer', { assetID })\n loaded()\n if (!app().checkResponse(res)) {\n return 0\n }\n return res.feeBuffer\n }\n\n async prepareUpdateHost () {\n const page = this.page\n this.dexAddrForm.refresh()\n this.showForm(page.dexAddrForm)\n }\n\n async onCertFileChange () {\n const page = this.page\n Doc.hide(page.errMsg)\n const files = page.certFileInput.files\n let cert\n if (files && files.length) cert = await files[0].text()\n if (!cert) return\n const req = { host: this.host, cert: cert }\n const loaded = app().loading(this.body)\n const res = await postJSON('/api/updatecert', req)\n loaded()\n if (!app().checkResponse(res)) {\n page.errMsg.textContent = res.msg\n Doc.show(page.errMsg)\n } else {\n Doc.show(page.updateCertMsg)\n setTimeout(() => { Doc.hide(page.updateCertMsg) }, 5000)\n }\n }\n\n setConnectionStatus () {\n const page = this.page\n const exchange = app().user.exchanges[this.host]\n const displayIcons = (connected: boolean) => {\n if (connected) {\n Doc.hide(page.disconnectedIcon)\n Doc.show(page.connectedIcon)\n } else {\n Doc.show(page.disconnectedIcon)\n Doc.hide(page.connectedIcon)\n }\n }\n if (exchange) {\n switch (exchange.connectionStatus) {\n case ConnectionStatus.Connected:\n displayIcons(true)\n page.connectionStatus.textContent = intl.prep(intl.ID_CONNECTED)\n break\n case ConnectionStatus.Disconnected:\n displayIcons(false)\n if (this.accountDisabled) page.connectionStatus.textContent = intl.prep(intl.ID_ACCOUNT_DISABLED_MSG)\n else page.connectionStatus.textContent = intl.prep(intl.ID_DISCONNECTED)\n break\n case ConnectionStatus.InvalidCert:\n displayIcons(false)\n page.connectionStatus.textContent = `${intl.prep(intl.ID_DISCONNECTED)} - ${intl.prep(intl.ID_INVALID_CERTIFICATE)}`\n }\n }\n }\n\n async disableAutoRenew () {\n const loaded = app().loading(this.page.otherBondSettings)\n try {\n this.updateBondOptions({ targetTier: 0 })\n loaded()\n } catch (e) {\n loaded()\n throw e\n }\n }\n\n /*\n * updateBondOptions is called when the form to update bond options is\n * submitted.\n */\n async updateBondOptions (conf: BondOptionsForm): Promise<any> {\n conf.host = this.host\n await postJSON('/api/updatebondoptions', conf)\n const targetTier = conf.targetTier ?? app().exchanges[this.host].auth.targetTier\n this.renewToggle.setState(targetTier > 0)\n }\n\n async newWalletCreated (assetID: number, tier: number) {\n this.regAssetForm.refresh()\n const user = await app().fetchUser()\n if (!user) return\n const page = this.page\n const asset = user.assets[assetID]\n const wallet = asset.wallet\n const xc = app().exchanges[this.host]\n const bondAmt = xc.bondAssets[asset.symbol].amount\n\n const bondsFeeBuffer = await this.getBondsFeeBuffer(assetID, page.newWalletForm)\n this.confirmRegisterForm.setFees(assetID, bondsFeeBuffer)\n\n if (wallet.synced && wallet.balance.available >= 2 * bondAmt + bondsFeeBuffer) {\n this.progressTierFormWithSyncedFundedWallet(assetID)\n return\n }\n\n this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)\n await this.showForm(page.walletWait)\n }\n}\n","import {\n app,\n PageElement,\n MarketWithHost\n} from './registry'\nimport { getJSON } from './http'\nimport Doc from './doc'\nimport BasePage from './basepage'\nimport { setMarketElements } from './mmutil'\n\ninterface MarketMakingRun {\n startTime: number\n market: MarketWithHost\n}\n\nexport default class MarketMakerArchivesPage extends BasePage {\n page: Record<string, PageElement>\n base: number\n quote: number\n host: string\n\n constructor (main: HTMLElement) {\n super()\n const page = this.page = Doc.idDescendants(main)\n Doc.cleanTemplates(page.runTableRowTmpl)\n Doc.bind(page.backButton, 'click', () => { app().loadPage('mm') })\n this.setup()\n }\n\n async setup () {\n const res = await getJSON('/api/archivedmmruns')\n if (!app().checkResponse(res)) {\n console.error('failed to get archived mm runs', res)\n // TODO: show error\n return\n }\n\n const runs : MarketMakingRun[] = res.runs\n\n for (let i = 0; i < runs.length; i++) {\n const { startTime, market: { baseID, quoteID, host } } = runs[i]\n const row = this.page.runTableRowTmpl.cloneNode(true) as HTMLElement\n const tmpl = Doc.parseTemplate(row)\n tmpl.startTime.textContent = new Date(startTime * 1000).toLocaleString()\n setMarketElements(row, baseID, quoteID, host)\n\n Doc.bind(tmpl.logs, 'click', () => {\n app().loadPage('mmlogs', { baseID, quoteID, host, startTime, returnPage: 'mmarchives' })\n })\n\n Doc.bind(tmpl.settings, 'click', () => {\n app().loadPage('mmsettings', { host, baseID, quoteID })\n })\n\n this.page.runTableBody.appendChild(row)\n }\n }\n}\n","import {\n app,\n PageElement,\n MarketMakingEvent,\n DEXOrderEvent,\n CEXOrderEvent,\n RunEventNote,\n RunStatsNote,\n DepositEvent,\n WithdrawalEvent,\n MarketMakingRunOverview,\n SupportedAsset,\n BalanceEffects,\n MarketWithHost,\n ProfitLoss\n} from './registry'\nimport { Forms } from './forms'\nimport { postJSON } from './http'\nimport Doc, { setupCopyBtn } from './doc'\nimport BasePage from './basepage'\nimport { setMarketElements, liveBotStatus } from './mmutil'\nimport * as intl from './locales'\nimport * as wallets from './wallets'\nimport { CoinExplorers } from './coinexplorers'\n\ninterface LogsPageParams {\n host: string\n quoteID: number\n baseID: number\n startTime: number\n returnPage: string\n}\n\nlet net = 0\n\nconst logsBatchSize = 50\n\ninterface logFilters {\n dexSells: boolean\n dexBuys: boolean\n cexSells: boolean\n cexBuys: boolean\n deposits: boolean\n withdrawals: boolean\n}\n\nfunction eventPassesFilter (e: MarketMakingEvent, filters: logFilters): boolean {\n if (e.dexOrderEvent) {\n if (e.dexOrderEvent.sell) return filters.dexSells\n return filters.dexBuys\n }\n if (e.cexOrderEvent) {\n if (e.cexOrderEvent.sell) return filters.cexSells\n return filters.cexBuys\n }\n if (e.depositEvent) return filters.deposits\n if (e.withdrawalEvent) return filters.withdrawals\n return false\n}\n\nexport default class MarketMakerLogsPage extends BasePage {\n page: Record<string, PageElement>\n mkt: MarketWithHost\n startTime: number\n fiatRates: Record<number, number>\n liveBot: boolean\n overview: MarketMakingRunOverview\n events: Record<number, [MarketMakingEvent, HTMLElement]>\n forms: Forms\n dexOrderIDCopyListener: () => void | undefined\n cexOrderIDCopyListener: () => void | undefined\n depositIDCopyListener: () => void | undefined\n withdrawalIDCopyListener: () => void | undefined\n filters: logFilters\n loading: boolean\n refID: number | undefined\n doneScrolling: boolean\n statsRows: Record<number, HTMLElement>\n\n constructor (main: HTMLElement, params: LogsPageParams) {\n super()\n const page = this.page = Doc.idDescendants(main)\n net = app().user.net\n Doc.cleanTemplates(page.eventTableRowTmpl, page.dexOrderTxRowTmpl, page.performanceTableRowTmpl)\n Doc.bind(this.page.backButton, 'click', () => { app().loadPage(params.returnPage ?? 'mm') })\n Doc.bind(this.page.filterButton, 'click', () => { this.applyFilters() })\n if (params?.host) {\n const url = new URL(window.location.href)\n url.searchParams.set('host', params.host)\n url.searchParams.set('baseID', String(params.baseID))\n url.searchParams.set('quoteID', String(params.quoteID))\n url.searchParams.set('startTime', String(params.startTime))\n window.history.replaceState({ page: 'mmsettings', ...params }, '', url)\n } else {\n const urlParams = new URLSearchParams(window.location.search)\n if (!params) params = {} as LogsPageParams\n params.host = urlParams.get('host') || ''\n params.baseID = parseInt(urlParams.get('baseID') || '0')\n params.quoteID = parseInt(urlParams.get('quoteID') || '0')\n params.startTime = parseInt(urlParams.get('startTime') || '0')\n }\n const { baseID, quoteID, host, startTime } = params\n this.startTime = startTime\n this.forms = new Forms(page.forms)\n this.events = {}\n this.statsRows = {}\n this.mkt = { baseID: baseID, quoteID: quoteID, host }\n setMarketElements(main, baseID, quoteID, host)\n Doc.bind(main, 'scroll', () => {\n if (this.loading) return\n if (this.doneScrolling) return\n const belowBottom = page.eventsTable.offsetHeight - main.offsetHeight - main.scrollTop\n if (belowBottom < 0) {\n this.nextPage()\n }\n })\n this.setup(host, baseID, quoteID)\n }\n\n async nextPage () {\n this.loading = true\n const [events, updatedLogs, overview] = await this.getRunLogs()\n const assets = this.mktAssets()\n for (const event of events) {\n if (this.events[event.id]) continue\n const row = this.newEventRow(event, false, assets)\n this.events[event.id] = [event, row]\n }\n this.populateStats(overview.profitLoss, overview.endTime)\n this.updateExistingRows(updatedLogs)\n this.loading = false\n }\n\n async getRunLogs (): Promise<[MarketMakingEvent[], MarketMakingEvent[], MarketMakingRunOverview]> {\n const { mkt, startTime } = this\n const req: any = { market: mkt, startTime, n: logsBatchSize, filters: this.filters, refID: this.refID }\n const res = await postJSON('/api/mmrunlogs', req)\n if (!app().checkResponse(res)) {\n console.error('failed to get bot logs', res)\n }\n if (res.logs.length <= 1) {\n this.doneScrolling = true\n }\n if (res.logs.length > 0) {\n this.refID = res.logs[res.logs.length - 1].id\n }\n return [res.logs, res.updatedLogs || [], res.overview]\n }\n\n async applyFilters () {\n const page = this.page\n this.filters = {\n dexSells: !!page.dexSellsCheckbox.checked,\n dexBuys: !!page.dexBuysCheckbox.checked,\n cexSells: !!page.cexSellsCheckbox.checked,\n cexBuys: !!page.cexBuysCheckbox.checked,\n deposits: !!page.depositsCheckbox.checked,\n withdrawals: !!page.withdrawalsCheckbox.checked\n }\n this.refID = undefined\n const [events, , overview] = await this.getRunLogs()\n this.populateTable(events)\n this.populateStats(overview.profitLoss, overview.endTime)\n }\n\n setFilters () {\n const page = this.page\n page.dexSellsCheckbox.checked = true\n page.dexBuysCheckbox.checked = true\n page.cexSellsCheckbox.checked = true\n page.cexBuysCheckbox.checked = true\n page.depositsCheckbox.checked = true\n page.withdrawalsCheckbox.checked = true\n this.filters = {\n dexSells: true,\n dexBuys: true,\n cexSells: true,\n cexBuys: true,\n deposits: true,\n withdrawals: true\n }\n }\n\n async setup (host: string, baseID: number, quoteID: number) {\n const page = this.page\n this.setFilters()\n const { startTime } = this\n let profitLoss: ProfitLoss\n let endTime = 0\n const botStatus = liveBotStatus(host, baseID, quoteID)\n const [events, , overview] = await this.getRunLogs()\n if (botStatus?.runStats?.startTime === startTime) {\n this.liveBot = true\n this.fiatRates = app().fiatRatesMap\n profitLoss = botStatus.runStats.profitLoss\n } else {\n this.fiatRates = overview.finalState.fiatRates\n profitLoss = overview.profitLoss\n endTime = overview.endTime\n }\n this.populateStats(profitLoss, endTime)\n const assets = this.mktAssets()\n const parentHeader = page.sumUSDHeader.parentElement\n for (const asset of assets) {\n const th = document.createElement('th') as PageElement\n th.textContent = `${asset.symbol.toUpperCase()} Delta`\n if (parentHeader) {\n parentHeader.insertBefore(th, page.sumUSDHeader)\n }\n }\n this.populateTable(events)\n\n app().registerNoteFeeder({\n runevent: (note: RunEventNote) => { this.handleRunEventNote(note) },\n runstats: (note: RunStatsNote) => { this.handleRunStatsNote(note) }\n })\n }\n\n handleRunEventNote (note: RunEventNote) {\n const { baseID, quoteID, host } = this.mkt\n if (note.host !== host || note.baseID !== baseID || note.quoteID !== quoteID) return\n if (!eventPassesFilter(note.event, this.filters)) return\n const event = note.event\n const cachedEvent = this.events[event.id]\n if (cachedEvent) {\n this.setRowContents(cachedEvent[1], event, this.mktAssets())\n cachedEvent[0] = event\n return\n }\n const row = this.newEventRow(event, true, this.mktAssets())\n this.events[event.id] = [event, row]\n }\n\n handleRunStatsNote (note: RunStatsNote) {\n const { mkt: { baseID, quoteID, host }, startTime } = this\n if (note.host !== host ||\n note.baseID !== baseID ||\n note.quoteID !== quoteID) return\n if (!note.stats || note.stats.startTime !== startTime) return\n this.populateStats(note.stats.profitLoss, 0)\n }\n\n populateStats (pl: ProfitLoss, endTime: number) {\n const page = this.page\n page.startTime.textContent = new Date(this.startTime * 1000).toLocaleString()\n if (endTime === 0) {\n Doc.hide(page.endTimeRow)\n } else {\n page.endTime.textContent = new Date(endTime * 1000).toLocaleString()\n }\n for (const assetID in pl.diffs) {\n const asset = app().assets[parseInt(assetID)]\n let row = this.statsRows[assetID]\n if (!row) {\n row = page.performanceTableRowTmpl.cloneNode(true) as HTMLElement\n const tmpl = Doc.parseTemplate(row)\n tmpl.logo.src = Doc.logoPath(asset.symbol)\n tmpl.ticker.textContent = asset.symbol.toUpperCase()\n this.statsRows[assetID] = row\n page.performanceTableBody.appendChild(row)\n }\n const diff = pl.diffs[assetID]\n const tmpl = Doc.parseTemplate(row)\n tmpl.diff.textContent = diff.fmt\n tmpl.usdDiff.textContent = diff.fmtUSD\n tmpl.fiatRate.textContent = `${Doc.formatFiatValue(this.fiatRates[asset.id])} USD`\n }\n page.profitLoss.textContent = `${Doc.formatFiatValue(pl.profit)} USD`\n }\n\n mktAssets () : SupportedAsset[] {\n const baseAsset = app().assets[this.mkt.baseID]\n const quoteAsset = app().assets[this.mkt.quoteID]\n\n const assets = [baseAsset, quoteAsset]\n const assetIDs = { [baseAsset.id]: true, [quoteAsset.id]: true }\n\n if (baseAsset.token && !assetIDs[baseAsset.token.parentID]) {\n const baseTokenAsset = app().assets[baseAsset.token.parentID]\n assetIDs[baseTokenAsset.id] = true\n assets.push(baseTokenAsset)\n }\n\n if (quoteAsset.token && !assetIDs[quoteAsset.token.parentID]) {\n const quoteTokenAsset = app().assets[quoteAsset.token.parentID]\n assets.push(quoteTokenAsset)\n }\n\n return assets\n }\n\n updateExistingRows (updatedLogs: MarketMakingEvent[]) {\n for (const event of updatedLogs) {\n const cachedEvent = this.events[event.id]\n if (!cachedEvent) continue\n this.setRowContents(cachedEvent[1], event, this.mktAssets())\n cachedEvent[0] = event\n }\n }\n\n populateTable (events: MarketMakingEvent[]) {\n const page = this.page\n Doc.empty(page.eventsTableBody)\n this.events = {}\n this.doneScrolling = false\n const assets = this.mktAssets()\n for (const event of events) {\n const row = this.newEventRow(event, false, assets)\n this.events[event.id] = [event, row]\n }\n }\n\n setRowContents (row: HTMLElement, event: MarketMakingEvent, assets: SupportedAsset[]) {\n const tmpl = Doc.parseTemplate(row)\n tmpl.time.textContent = (new Date(event.timestamp * 1000)).toLocaleString()\n tmpl.eventType.textContent = this.eventType(event)\n let id\n if (event.depositEvent) {\n id = event.depositEvent.transaction.id\n } else if (event.withdrawalEvent) {\n id = event.withdrawalEvent.id\n } else if (event.dexOrderEvent) {\n id = event.dexOrderEvent.id\n } else if (event.cexOrderEvent) {\n id = event.cexOrderEvent.id\n }\n if (id) {\n tmpl.eventID.textContent = trimStringWithEllipsis(id, 30)\n tmpl.eventID.setAttribute('title', id)\n }\n let usd = 0\n for (const asset of assets) {\n const be = event.balanceEffects\n const sum = sumBalanceEffects(asset.id, be)\n const tmplID = `sum${asset.symbol.toUpperCase()}`\n let el : PageElement\n if (tmpl[tmplID]) {\n el = tmpl[tmplID]\n } else {\n el = document.createElement('td')\n el.dataset.tmpl = tmplID\n const parent = tmpl.sumUSD.parentElement\n if (parent) {\n parent.insertBefore(el, tmpl.sumUSD)\n }\n }\n el.textContent = Doc.formatCoinValue(sum, asset.unitInfo)\n const factor = asset.unitInfo.conventional.conversionFactor\n usd += sum / factor * this.fiatRates[asset.id] ?? 0\n }\n tmpl.sumUSD.textContent = Doc.formatFourSigFigs(usd)\n Doc.bind(tmpl.details, 'click', () => { this.showEventDetails(event.id) })\n }\n\n newEventRow (event: MarketMakingEvent, prepend: boolean, assets: SupportedAsset[]) : HTMLElement {\n const page = this.page\n const row = page.eventTableRowTmpl.cloneNode(true) as HTMLElement\n row.id = event.id.toString()\n this.setRowContents(row, event, assets)\n if (prepend) {\n page.eventsTableBody.insertBefore(row, page.eventsTableBody.firstChild)\n } else {\n page.eventsTableBody.appendChild(row)\n }\n return row\n }\n\n eventType (event: MarketMakingEvent) : string {\n if (event.depositEvent) {\n return 'Deposit'\n } else if (event.withdrawalEvent) {\n return 'Withdrawal'\n } else if (event.dexOrderEvent) {\n return event.dexOrderEvent.sell ? 'DEX Sell' : 'DEX Buy'\n } else if (event.cexOrderEvent) {\n return event.cexOrderEvent.sell ? 'CEX Sell' : 'CEX Buy'\n }\n\n return ''\n }\n\n showDexOrderEventDetails (event: DEXOrderEvent) {\n const { page, mkt: { baseID, quoteID } } = this\n const baseAsset = app().assets[baseID]\n const quoteAsset = app().assets[quoteID]\n const [bui, qui] = [baseAsset.unitInfo, quoteAsset.unitInfo]\n const [baseTicker, quoteTicker] = [bui.conventional.unit, qui.conventional.unit]\n if (this.dexOrderIDCopyListener !== undefined) {\n page.copyDexOrderID.removeEventListener('click', this.dexOrderIDCopyListener)\n }\n this.dexOrderIDCopyListener = () => { setupCopyBtn(event.id, page.dexOrderID, page.copyDexOrderID, '#1e7d11') }\n page.copyDexOrderID.addEventListener('click', this.dexOrderIDCopyListener)\n page.dexOrderID.textContent = trimStringWithEllipsis(event.id, 20)\n page.dexOrderID.setAttribute('title', event.id)\n const rate = app().conventionalRate(baseID, quoteID, event.rate)\n\n page.dexOrderRate.textContent = `${rate} ${baseTicker}/${quoteTicker}`\n page.dexOrderQty.textContent = `${event.qty / bui.conventional.conversionFactor} ${baseTicker}`\n if (event.sell) {\n page.dexOrderSide.textContent = intl.prep(intl.ID_SELL)\n } else {\n page.dexOrderSide.textContent = intl.prep(intl.ID_BUY)\n }\n Doc.empty(page.dexOrderTxsTableBody)\n Doc.setVis(event.transactions && event.transactions.length > 0, page.dexOrderTxsTable)\n const txAsset = (txType: number, sell: boolean) : SupportedAsset | undefined => {\n switch (txType) {\n case wallets.txTypeSwap:\n case wallets.txTypeRefund:\n case wallets.txTypeSplit:\n return sell ? baseAsset : quoteAsset\n case wallets.txTypeRedeem:\n return sell ? quoteAsset : baseAsset\n }\n }\n\n for (let i = 0; event.transactions && i < event.transactions.length; i++) {\n const tx = event.transactions[i]\n const row = page.dexOrderTxRowTmpl.cloneNode(true) as HTMLElement\n const tmpl = Doc.parseTemplate(row)\n tmpl.id.textContent = trimStringWithEllipsis(tx.id, 20)\n tmpl.id.setAttribute('title', tx.id)\n tmpl.type.textContent = wallets.txTypeString(tx.type)\n const asset = txAsset(tx.type, event.sell)\n if (!asset) {\n console.error('unexpected tx type in dex order event', tx.type)\n continue\n }\n const assetExplorer = CoinExplorers[asset.id]\n if (assetExplorer && assetExplorer[net]) {\n tmpl.explorerLink.href = assetExplorer[net](tx.id)\n }\n tmpl.amt.textContent = `${Doc.formatCoinValue(tx.amount, asset.unitInfo)} ${asset.unitInfo.conventional.unit.toLowerCase()}`\n tmpl.fees.textContent = `${Doc.formatCoinValue(tx.fees, asset.unitInfo)} ${asset.unitInfo.conventional.unit.toLowerCase()}`\n page.dexOrderTxsTableBody.appendChild(row)\n }\n this.forms.show(page.dexOrderDetailsForm)\n }\n\n showCexOrderEventDetails (event: CEXOrderEvent) {\n const { page, mkt: { baseID, quoteID } } = this\n const baseAsset = app().assets[baseID]\n const quoteAsset = app().assets[quoteID]\n const [bui, qui] = [baseAsset.unitInfo, quoteAsset.unitInfo]\n const [baseTicker, quoteTicker] = [bui.conventional.unit, qui.conventional.unit]\n\n page.cexOrderID.textContent = trimStringWithEllipsis(event.id, 20)\n if (this.cexOrderIDCopyListener !== undefined) {\n page.copyCexOrderID.removeEventListener('click', this.cexOrderIDCopyListener)\n }\n this.cexOrderIDCopyListener = () => { setupCopyBtn(event.id, page.cexOrderID, page.copyCexOrderID, '#1e7d11') }\n page.copyCexOrderID.addEventListener('click', this.cexOrderIDCopyListener)\n page.cexOrderID.setAttribute('title', event.id)\n const rate = app().conventionalRate(baseID, quoteID, event.rate)\n page.cexOrderRate.textContent = `${rate} ${baseTicker}/${quoteTicker}`\n page.cexOrderQty.textContent = `${event.qty / bui.conventional.conversionFactor} ${baseTicker}`\n if (event.sell) {\n page.cexOrderSide.textContent = intl.prep(intl.ID_SELL)\n } else {\n page.cexOrderSide.textContent = intl.prep(intl.ID_BUY)\n }\n page.cexOrderBaseFilled.textContent = `${event.baseFilled / bui.conventional.conversionFactor} ${baseTicker}`\n page.cexOrderQuoteFilled.textContent = `${event.quoteFilled / qui.conventional.conversionFactor} ${quoteTicker}`\n this.forms.show(page.cexOrderDetailsForm)\n }\n\n showDepositEventDetails (event: DepositEvent, pending: boolean) {\n const page = this.page\n page.depositID.textContent = trimStringWithEllipsis(event.transaction.id, 20)\n if (this.depositIDCopyListener !== undefined) {\n page.copyDepositID.removeEventListener('click', this.depositIDCopyListener)\n }\n this.depositIDCopyListener = () => { setupCopyBtn(event.transaction.id, page.depositID, page.copyDepositID, '#1e7d11') }\n page.copyDepositID.addEventListener('click', this.depositIDCopyListener)\n page.depositID.setAttribute('title', event.transaction.id)\n const unitInfo = app().assets[event.assetID].unitInfo\n const unit = unitInfo.conventional.unit\n page.depositAmt.textContent = `${Doc.formatCoinValue(event.transaction.amount, unitInfo)} ${unit}`\n page.depositFees.textContent = `${Doc.formatCoinValue(event.transaction.fees, unitInfo)} ${unit}`\n page.depositStatus.textContent = pending ? intl.prep(intl.ID_PENDING) : intl.prep(intl.ID_COMPLETE)\n Doc.setVis(!pending, page.depositCreditSection)\n if (!pending) {\n page.depositCredit.textContent = `${Doc.formatCoinValue(event.cexCredit, unitInfo)} ${unit}`\n }\n this.forms.show(page.depositDetailsForm)\n }\n\n showWithdrawalEventDetails (event: WithdrawalEvent, pending: boolean) {\n const page = this.page\n page.withdrawalID.textContent = trimStringWithEllipsis(event.id, 20)\n if (this.withdrawalIDCopyListener !== undefined) {\n page.copyWithdrawalID.removeEventListener('click', this.withdrawalIDCopyListener)\n }\n this.withdrawalIDCopyListener = () => { setupCopyBtn(event.id, page.withdrawalID, page.copyWithdrawalID, '#1e7d11') }\n page.copyWithdrawalID.addEventListener('click', this.withdrawalIDCopyListener)\n page.withdrawalID.setAttribute('title', event.id)\n const unitInfo = app().assets[event.assetID].unitInfo\n const unit = unitInfo.conventional.unit\n page.withdrawalAmt.textContent = `${Doc.formatCoinValue(event.cexDebit, unitInfo)} ${unit}`\n page.withdrawalStatus.textContent = pending ? intl.prep(intl.ID_PENDING) : intl.prep(intl.ID_COMPLETE)\n if (event.transaction) {\n page.withdrawalTxID.textContent = trimStringWithEllipsis(event.transaction.id, 20)\n page.withdrawalTxID.setAttribute('title', event.transaction.id)\n page.withdrawalReceived.textContent = `${Doc.formatCoinValue(event.transaction.amount, unitInfo)} ${unit}`\n }\n this.forms.show(page.withdrawalDetailsForm)\n }\n\n showEventDetails (eventID: number) {\n const [event] = this.events[eventID]\n if (event.dexOrderEvent) this.showDexOrderEventDetails(event.dexOrderEvent)\n if (event.cexOrderEvent) this.showCexOrderEventDetails(event.cexOrderEvent)\n if (event.depositEvent) this.showDepositEventDetails(event.depositEvent, event.pending)\n if (event.withdrawalEvent) this.showWithdrawalEventDetails(event.withdrawalEvent, event.pending)\n }\n}\n\nfunction trimStringWithEllipsis (str: string, maxLen: number): string {\n if (str.length <= maxLen) return str\n return `${str.substring(0, maxLen / 2)}...${str.substring(str.length - maxLen / 2)}`\n}\n\nfunction sumBalanceEffects (assetID: number, be: BalanceEffects): number {\n let sum = 0\n if (be.settled[assetID]) sum += be.settled[assetID]\n if (be.pending[assetID]) sum += be.pending[assetID]\n if (be.locked[assetID]) sum += be.locked[assetID]\n if (be.reserved[assetID]) sum += be.reserved[assetID]\n return sum\n}\n","import Doc from './doc'\nimport BasePage from './basepage'\nimport { postJSON } from './http'\nimport * as intl from './locales'\nimport {\n bind as bindForm,\n slideSwap\n} from './forms'\nimport { Wave } from './charts'\nimport {\n app,\n PageElement,\n SupportedAsset,\n User,\n WalletInfo,\n WalletDefinition,\n ConfigOption,\n APIResponse\n} from './registry'\n\ninterface InitResponse extends APIResponse {\n hosts: string[]\n mnemonic?: string\n}\n\n/*\n * InitPage is the page handler for the /init view. InitPage is essentially a\n * form handler. There are no non-form elements on /init. InitPage additionally\n * has a role caching the initialization password. A couple of notes about\n * InitPage.\n * 1) There is no going backwards. Once you set a password, you can't go back\n * to the password form. If you refresh, you won't end up on /init, so\n * won't have access to the QuickConfigForm or SeedBackupForm . Once you\n * submit your auto-config choices, you can't change them. This has\n * implications for coding and UI. There are no \"go back\" or \"close form\"\n * elements.\n * 2) The user can preclude auto-config and seed backup by clicking an\n * available header link after password init, e.g. Wallets, in the page\n * header. NOTE: Regardless of what the user does after setting the app\n * pass, they will receive a notification reminding them to back up their\n * seed. Perhaps it would be better to somehow delay that message until\n * they choose to ignore the seed backup dialog, but having more reminders\n * is also okay.\n */\nexport default class InitPage extends BasePage {\n body: HTMLElement\n page: Record<string, PageElement>\n initForm: AppInitForm\n quickConfigForm: QuickConfigForm\n seedBackupForm: SeedBackupForm\n mnemonic?: string\n\n constructor (body: HTMLElement) {\n super()\n this.body = body\n const page = this.page = Doc.idDescendants(body)\n this.initForm = new AppInitForm(page.appPWForm, (pw: string, hosts: string[], mnemonic?: string) => { this.appInited(pw, hosts, mnemonic) })\n this.quickConfigForm = new QuickConfigForm(page.quickConfigForm, () => this.quickConfigDone())\n this.seedBackupForm = new SeedBackupForm(page.seedBackupForm, () => this.seedBackedUp())\n }\n\n async appInited (pw: string, hosts: string[], mnemonic?: string) {\n this.mnemonic = mnemonic\n const page = this.page\n await this.quickConfigForm.update(pw, hosts)\n if (mnemonic) this.seedBackupForm.update(mnemonic)\n slideSwap(page.appPWForm, page.quickConfigForm)\n }\n\n quickConfigDone () {\n if (!this.mnemonic) app().loadPage('wallets')\n else slideSwap(this.page.quickConfigForm, this.page.seedBackupForm)\n }\n\n seedBackedUp () {\n app().loadPage('wallets')\n }\n}\n\n/*\n * The AppInitForm handles the form that sets the app password, accepts an\n * optional seed, and initializes the app.\n */\nclass AppInitForm {\n form: PageElement\n page: Record<string, PageElement>\n success: (pw: string, hosts: string[], mnemonic?: string) => void\n\n constructor (form: PageElement, success: (pw: string, hosts: string[], mnemonic?: string) => void) {\n this.form = form\n this.success = success\n const page = this.page = Doc.idDescendants(form)\n bindForm(form, page.appPWSubmit, () => this.setAppPass())\n bindForm(form, page.toggleSeedInput, () => {\n if (Doc.isHidden(page.seedInputBox)) {\n page.toggleSeedInputIcon.classList.remove('ico-plus')\n page.toggleSeedInputIcon.classList.add('ico-minus')\n Doc.show(page.seedInputBox)\n } else {\n page.toggleSeedInputIcon.classList.remove('ico-minus')\n page.toggleSeedInputIcon.classList.add('ico-plus')\n Doc.hide(page.seedInputBox)\n }\n })\n }\n\n /* Set the application password. Attached to form submission. */\n async setAppPass () {\n const page = this.page\n Doc.hide(page.appPWErrMsg)\n const pw = page.appPW.value || ''\n const pwAgain = page.appPWAgain.value\n if (pw === '') {\n page.appPWErrMsg.textContent = intl.prep(intl.ID_NO_PASS_ERROR_MSG)\n Doc.show(page.appPWErrMsg)\n return\n }\n if (pw !== pwAgain) {\n page.appPWErrMsg.textContent = intl.prep(intl.ID_PASSWORD_NOT_MATCH)\n Doc.show(page.appPWErrMsg)\n return\n }\n\n page.appPW.value = ''\n page.appPWAgain.value = ''\n const loaded = app().loading(this.form)\n // const seed = page.seedInput.value?.replace(/\\s+/g, '') // strip whitespace\n const seed = page.seedInput.value ?? ''\n const res: InitResponse = await postJSON('/api/init', {\n pass: pw,\n seed: seed\n })\n loaded()\n if (!app().checkResponse(res)) {\n page.appPWErrMsg.textContent = res.msg\n Doc.show(page.appPWErrMsg)\n return\n }\n this.success(pw, res.hosts, res.mnemonic)\n }\n}\n\n// HostConfigRow is used by the QuickConfigForm to track the user's choices.\ninterface HostConfigRow {\n host: string\n checkbox: HTMLInputElement\n}\n\n// WalletConfigRow is used by the QuickConfigForm to track the user's choices.\ninterface WalletConfigRow {\n asset: SupportedAsset\n type: string\n checkbox: HTMLInputElement\n}\n\nlet rowIDCounter = 0\n\n/*\n * QuickConfigForm handles the form that allows users to quickly configure\n * view-only servers and native wallets (that don't require any configuration).\n */\nclass QuickConfigForm {\n page: Record<string, PageElement>\n form: PageElement\n servers: HostConfigRow[]\n wallets: WalletConfigRow[]\n pw: string\n success: () => void\n\n constructor (form: PageElement, success: () => void) {\n this.form = form\n this.success = success\n const page = this.page = Doc.idDescendants(form)\n Doc.cleanTemplates(page.qcServerTmpl, page.qcWalletTmpl)\n bindForm(form, page.quickConfigSubmit, () => { this.submit() })\n bindForm(form, page.qcErrAck, () => { this.success() })\n }\n\n async update (pw: string, hosts: string[]) {\n this.pw = pw\n const page = this.page\n\n this.servers = []\n for (const host of hosts) {\n const row = page.qcServerTmpl.cloneNode(true) as PageElement\n page.qcServersBox.appendChild(row)\n const tmpl = Doc.parseTemplate(row)\n rowIDCounter++\n const rowID = `qcsrow${rowIDCounter}`\n row.htmlFor = rowID\n tmpl.checkbox.id = rowID\n tmpl.host.textContent = host\n this.servers.push({ host, checkbox: tmpl.checkbox as HTMLInputElement })\n }\n\n const u = await app().fetchUser() as User\n this.wallets = []\n for (const a of Object.values(u.assets)) {\n if (a.token) continue\n const winfo = a.info as WalletInfo\n let autoConfigurable: WalletDefinition | null = null\n for (const wDef of winfo.availablewallets) {\n if (!wDef.seeded) continue\n if (wDef.configopts && wDef.configopts.some((opt: ConfigOption) => opt.required)) continue\n autoConfigurable = wDef\n break\n }\n if (!autoConfigurable) continue\n const row = page.qcWalletTmpl.cloneNode(true) as PageElement\n page.qcWalletsBox.appendChild(row)\n const tmpl = Doc.parseTemplate(row)\n rowIDCounter++\n const rowID = `qcwrow${rowIDCounter}`\n row.htmlFor = rowID\n tmpl.checkbox.id = rowID\n tmpl.icon.src = Doc.logoPath(a.symbol)\n tmpl.name.textContent = a.name\n this.wallets.push({\n asset: a,\n type: autoConfigurable.type,\n checkbox: tmpl.checkbox as HTMLInputElement\n })\n }\n }\n\n async submit () {\n const [failedHosts, failedWallets]: [string[], string[]] = [[], []]\n const ani = new Wave(this.form, { backgroundColor: true, message: '...' })\n ani.opts.message = intl.prep(intl.ID_ADDING_SERVERS)\n const connectServer = async (srvRow: HostConfigRow) => {\n if (!srvRow.checkbox.checked) return\n const req = {\n addr: srvRow.host,\n appPW: this.pw\n }\n const res = await postJSON('/api/adddex', req) // DRAFT NOTE: ignore errors ok?\n if (!app().checkResponse(res)) failedHosts.push(srvRow.host)\n }\n await Promise.all(this.servers.map(connectServer))\n\n ani.opts.message = intl.prep(intl.ID_CREATING_WALLETS)\n const createWallet = async (walletRow: WalletConfigRow) => {\n const { asset: a, type, checkbox } = walletRow\n if (!checkbox.checked) return\n const config: Record<string, string> = {}\n const walletDef = app().walletDefinition(a.id, type)\n for (const opt of (walletDef.configopts ?? [])) {\n if (!opt.default) continue\n if (opt.isboolean) {\n config[opt.key] = opt.default ? '1' : '0'\n continue\n }\n if (opt.repeatable && config[opt.key]) config[opt.key] += opt.repeatable + opt.default\n else config[opt.key] = String(opt.default)\n }\n const createForm = {\n assetID: a.id,\n appPass: this.pw,\n config: config,\n walletType: type\n }\n const res = await postJSON('/api/newwallet', createForm)\n if (!app().checkResponse(res)) failedWallets.push(a.name)\n }\n await Promise.all(this.wallets.map(createWallet))\n\n ani.stop()\n await app().fetchUser() // Calls updateMenuItemsDisplay internally\n if (failedWallets.length + failedHosts.length === 0) return this.success()\n\n const page = this.page\n Doc.hide(page.qcChoices)\n Doc.show(page.qcErrors)\n\n if (failedHosts.length) {\n for (const host of failedHosts) {\n page.qcServerErrorList.appendChild(document.createTextNode(host))\n page.qcServerErrorList.appendChild(document.createElement('br'))\n }\n } else Doc.hide(page.qcServerErrors)\n\n if (failedWallets.length) {\n for (const name of failedWallets) {\n page.qcWalletErrorList.appendChild(document.createTextNode(name))\n page.qcWalletErrorList.appendChild(document.createElement('br'))\n }\n } else Doc.hide(page.qcWalletErrors)\n }\n}\n\n/*\n * SeedBackupForm handles the form that allows the user to back up their seed\n * during initialization.\n */\nclass SeedBackupForm {\n form: PageElement\n page: Record<string, PageElement>\n mnemonic: string\n\n constructor (form: PageElement, success: () => void) {\n this.form = form\n const page = this.page = Doc.idDescendants(form)\n bindForm(form, page.seedAck, () => success())\n bindForm(form, page.showSeed, () => this.showSeed())\n }\n\n update (mnemonic: string) {\n this.mnemonic = mnemonic\n }\n\n showSeed () {\n const page = this.page\n page.mnemonic.textContent = this.mnemonic // `${words.slice(0, 5).join(' ')}\\n${words.slice(5, 10).join(' ')}\\n${words.slice(10,15).join(' ')}`\n Doc.hide(page.sbWanna)\n Doc.show(page.sbSeed)\n }\n}\n","import Doc from './doc'\nimport State from './state'\nimport RegistrationPage from './register'\nimport LoginPage from './login'\nimport WalletsPage, { txTypeString } from './wallets'\nimport SettingsPage from './settings'\nimport MarketsPage from './markets'\nimport OrdersPage from './orders'\nimport OrderPage from './order'\nimport MarketMakerPage from './mm'\nimport MarketMakerSettingsPage from './mmsettings'\nimport DexSettingsPage from './dexsettings'\nimport MarketMakerArchivesPage from './mmarchives'\nimport MarketMakerLogsPage from './mmlogs'\nimport InitPage from './init'\nimport { MM } from './mmutil'\nimport { RateEncodingFactor, StatusExecuted, hasActiveMatches } from './orderutil'\nimport { getJSON, postJSON, Errors } from './http'\nimport * as ntfn from './notifications'\nimport ws from './ws'\nimport * as intl from './locales'\nimport {\n User,\n SupportedAsset,\n Exchange,\n WalletState,\n BondNote,\n ReputationNote,\n CoreNote,\n OrderNote,\n Market,\n Order,\n Match,\n BalanceNote,\n WalletConfigNote,\n WalletSyncNote,\n MatchNote,\n ConnEventNote,\n SpotPriceNote,\n UnitInfo,\n WalletDefinition,\n WalletBalance,\n LogMessage,\n NoteElement,\n BalanceResponse,\n APIResponse,\n RateNote,\n InFlightOrder,\n WalletTransaction,\n TxHistoryResult,\n WalletNote,\n TransactionNote,\n PageElement,\n ActionRequiredNote,\n ActionResolvedNote,\n TransactionActionNote,\n CoreActionRequiredNote,\n RejectedRedemptionData,\n MarketMakingStatus,\n RunStatsNote,\n MMBotStatus,\n CEXNotification,\n CEXBalanceUpdate,\n EpochReportNote,\n CEXProblemsNote\n} from './registry'\nimport { setCoinHref } from './coinexplorers'\n\nconst idel = Doc.idel // = element by id\nconst bind = Doc.bind\nconst unbind = Doc.unbind\n\nconst notificationRoute = 'notify'\nconst noteCacheSize = 100\n\ninterface Page {\n unload (): void\n}\n\ninterface PageClass {\n new (main: HTMLElement, data: any): Page;\n}\n\ninterface CoreNotePlus extends CoreNote {\n el: HTMLElement // Added in app\n}\n\ninterface UserResponse extends APIResponse {\n user?: User\n lang: string\n langs: string[]\n inited: boolean\n mmStatus: MarketMakingStatus\n}\n\n/* constructors is a map to page constructors. */\nconst constructors: Record<string, PageClass> = {\n login: LoginPage,\n register: RegistrationPage,\n markets: MarketsPage,\n wallets: WalletsPage,\n settings: SettingsPage,\n orders: OrdersPage,\n order: OrderPage,\n dexsettings: DexSettingsPage,\n init: InitPage,\n mm: MarketMakerPage,\n mmsettings: MarketMakerSettingsPage,\n mmarchives: MarketMakerArchivesPage,\n mmlogs: MarketMakerLogsPage\n}\n\ninterface LangData {\n name: string\n flag: string\n}\n\nconst languageData: Record<string, LangData> = {\n 'en-US': {\n name: 'English',\n flag: '🇺🇸' // Not 🇬🇧. MURICA!\n },\n 'pt-BR': {\n name: 'Portugese',\n flag: '🇧🇷'\n },\n 'zh-CN': {\n name: 'Chinese',\n flag: '🇨🇳'\n },\n 'pl-PL': {\n name: 'Polish',\n flag: '🇵🇱'\n },\n 'de-DE': {\n name: 'German',\n flag: '🇩🇪'\n },\n 'ar': {\n name: 'Arabic',\n flag: '🇪🇬' // Egypt I guess\n }\n}\n\ninterface requiredAction {\n div: PageElement\n stamp: number\n uniqueID: string\n actionID: string\n selected: boolean\n}\n\n// Application is the main javascript web application for Bison Wallet.\nexport default class Application {\n notes: CoreNotePlus[]\n pokes: CoreNotePlus[]\n langs: string[]\n lang: string\n mmStatus: MarketMakingStatus\n inited: boolean\n authed: boolean\n user: User\n seedGenTime: number\n commitHash: string\n showPopups: boolean\n loggers: Record<string, boolean>\n recorders: Record<string, LogMessage[]>\n main: HTMLElement\n header: HTMLElement\n headerSpace: HTMLElement\n assets: Record<number, SupportedAsset>\n exchanges: Record<string, Exchange>\n walletMap: Record<number, WalletState>\n fiatRatesMap: Record<number, number>\n tooltip: HTMLElement\n page: Record<string, HTMLElement>\n loadedPage: Page | null\n popupNotes: HTMLElement\n popupTmpl: HTMLElement\n noteReceivers: Record<string, (n: CoreNote) => void>[]\n txHistoryMap: Record<number, TxHistoryResult>\n requiredActions: Record<string, requiredAction>\n\n constructor () {\n this.notes = []\n this.pokes = []\n this.seedGenTime = 0\n this.commitHash = ''\n this.noteReceivers = []\n this.fiatRatesMap = {}\n this.showPopups = State.fetchLocal(State.popupsLK) === '1'\n this.txHistoryMap = {}\n this.requiredActions = {}\n\n // Set dark theme.\n document.body.classList.toggle('dark', State.isDark())\n\n // Loggers can be enabled by setting a truthy value to the loggerID using\n // enableLogger. Settings are stored across sessions. See docstring for the\n // log method for more info.\n this.loggers = State.fetchLocal(State.loggersLK) || {}\n window.enableLogger = (loggerID, state) => {\n if (state) this.loggers[loggerID] = true\n else delete this.loggers[loggerID]\n State.storeLocal(State.loggersLK, this.loggers)\n return `${loggerID} logger ${state ? 'enabled' : 'disabled'}`\n }\n // Enable logging from anywhere.\n window.log = (loggerID, ...a) => { this.log(loggerID, ...a) }\n window.mmStatus = () => this.mmStatus\n\n // Recorders can record log messages, and then save them to file on request.\n const recorderKeys = State.fetchLocal(State.recordersLK) || []\n this.recorders = {}\n for (const loggerID of recorderKeys) {\n console.log('recording', loggerID)\n this.recorders[loggerID] = []\n }\n window.recordLogger = (loggerID, on) => {\n if (on) this.recorders[loggerID] = []\n else delete this.recorders[loggerID]\n State.storeLocal(State.recordersLK, Object.keys(this.recorders))\n return `${loggerID} recorder ${on ? 'enabled' : 'disabled'}`\n }\n window.dumpLogger = loggerID => {\n const record = this.recorders[loggerID]\n if (!record) return `no recorder for logger ${loggerID}`\n const a = document.createElement('a')\n a.href = `data:application/octet-stream;base64,${window.btoa(JSON.stringify(record, null, 4))}`\n a.download = `${loggerID}.json`\n document.body.appendChild(a)\n a.click()\n setTimeout(() => {\n document.body.removeChild(a)\n }, 0)\n }\n\n window.user = () => this.user\n }\n\n /**\n * Start the application. This is the only thing done from the index.js entry\n * point. Read the id = main element and attach handlers.\n */\n async start () {\n await this.fetchBuildInfo()\n console.log('Bison Wallet, Build', this.commitHash.substring(0, 8))\n\n // Handle back navigation from the browser.\n bind(window, 'popstate', (e: PopStateEvent) => {\n const page = e.state?.page\n if (!page && page !== '') return\n this.loadPage(page, e.state.data, true)\n })\n // The main element is the interchangeable part of the page that doesn't\n // include the header. Main should define a data-handler attribute\n // associated with one of the available constructors.\n this.main = idel(document, 'main')\n const handler = this.main.dataset.handler\n // Don't fetch the user until we know what page we're on.\n await this.fetchUser()\n const ignoreCachedLocale = process.env.NODE_ENV === 'development'\n await intl.loadLocale(this.lang, this.commitHash, ignoreCachedLocale)\n // The application is free to respond with a page that differs from the\n // one requested in the omnibox, e.g. routing though a login page. Set the\n // current URL state based on the actual page.\n const url = new URL(window.location.href)\n if (handlerFromPath(url.pathname) !== handler) {\n url.pathname = `/${handler}`\n url.search = ''\n window.history.replaceState({ page: handler }, '', url)\n }\n // Attach stuff.\n this.attachHeader()\n this.attachActions()\n this.attachCommon(this.header)\n this.attach({})\n\n // If we are authed, populate notes, otherwise get we'll them from the login\n // response.\n if (this.authed) await this.fetchNotes()\n this.updateMenuItemsDisplay()\n // initialize desktop notifications\n ntfn.fetchDesktopNtfnSettings()\n // Connect the websocket and register the notification route.\n ws.connect(getSocketURI(), () => this.reconnected())\n ws.registerRoute(notificationRoute, (note: CoreNote) => {\n this.notify(note)\n })\n }\n\n /*\n * reconnected is called by the websocket client when a reconnection is made.\n */\n reconnected () {\n if (this.main?.dataset.handler === 'settings') window.location.assign('/')\n else window.location.reload() // This triggers another websocket disconnect/connect (!)\n // a fetchUser() and loadPage(window.history.state.page) might work\n }\n\n /*\n * Fetch and save the user, which is the primary core state that must be\n * maintained by the Application.\n */\n async fetchUser (): Promise<User | void> {\n const resp: UserResponse = await getJSON('/api/user')\n if (!this.checkResponse(resp)) return\n this.inited = resp.inited\n this.authed = Boolean(resp.user)\n this.lang = resp.lang\n this.langs = resp.langs\n this.mmStatus = resp.mmStatus\n if (!resp.user) return\n const user = resp.user\n this.seedGenTime = user.seedgentime\n this.user = user\n this.assets = user.assets\n this.exchanges = user.exchanges\n this.walletMap = {}\n this.fiatRatesMap = user.fiatRates\n for (const [assetID, asset] of (Object.entries(user.assets) as [any, SupportedAsset][])) {\n if (asset.wallet) {\n this.walletMap[assetID] = asset.wallet\n }\n }\n\n this.updateMenuItemsDisplay()\n return user\n }\n\n async fetchBuildInfo () {\n const resp = await getJSON('/api/buildinfo')\n if (!this.checkResponse(resp)) return\n this.commitHash = resp.revision\n }\n\n async fetchMMStatus () {\n this.mmStatus = await MM.status()\n }\n\n /* Load the page from the server. Insert and bind the DOM. */\n async loadPage (page: string, data?: any, skipPush?: boolean): Promise<boolean> {\n // Close some menus and tooltips.\n this.tooltip.style.left = '-10000px'\n Doc.hide(this.page.noteBox, this.page.profileBox)\n // Parse the request.\n const url = new URL(`/${page}`, window.location.origin)\n const requestedHandler = handlerFromPath(page)\n // Fetch and parse the page.\n const response = await window.fetch(url.toString())\n if (!response.ok) return false\n const html = await response.text()\n const doc = Doc.noderize(html)\n const main = idel(doc, 'main')\n const delivered = main.dataset.handler\n // Append the request to the page history.\n if (!skipPush) {\n const path = delivered === requestedHandler ? url.toString() : `/${delivered}`\n window.history.pushState({ page: page, data: data }, '', path)\n }\n // Insert page and attach handlers.\n document.title = doc.title\n this.main.replaceWith(main)\n this.main = main\n this.noteReceivers = []\n Doc.empty(this.headerSpace)\n this.attach(data)\n return true\n }\n\n /* attach binds the common handlers and calls the page constructor. */\n attach (data: any) {\n const handlerID = this.main.dataset.handler\n if (!handlerID) {\n console.error('cannot attach to content with no specified handler')\n return\n }\n this.attachCommon(this.main)\n if (this.loadedPage) this.loadedPage.unload()\n const constructor = constructors[handlerID]\n if (constructor) this.loadedPage = new constructor(this.main, data)\n else this.loadedPage = null\n\n // Bind the tooltips.\n this.bindTooltips(this.main)\n\n if (window.isWebview) {\n // Bind webview URL handlers\n this.bindUrlHandlers(this.main)\n }\n\n this.bindUnits(this.main)\n }\n\n bindTooltips (ancestor: HTMLElement) {\n ancestor.querySelectorAll('[data-tooltip]').forEach((el: HTMLElement) => {\n bind(el, 'mouseenter', () => {\n this.tooltip.textContent = el.dataset.tooltip || ''\n const lyt = Doc.layoutMetrics(el)\n let left = lyt.centerX - this.tooltip.offsetWidth / 2\n if (left < 0) left = 5\n if (left + this.tooltip.offsetWidth > document.body.offsetWidth) {\n left = document.body.offsetWidth - this.tooltip.offsetWidth - 5\n }\n this.tooltip.style.left = `${left}px`\n this.tooltip.style.top = `${lyt.bodyTop - this.tooltip.offsetHeight - 5}px`\n })\n bind(el, 'mouseleave', () => {\n this.tooltip.style.left = '-10000px'\n })\n })\n }\n\n /*\n * bindUnits binds a hovering unit selection menu to the value or rate\n * display elements. The menu gives users an option to convert the value\n * to their preferred units.\n */\n bindUnits (main: PageElement) {\n const div = document.createElement('div') as PageElement\n div.classList.add('position-absolute', 'p-3')\n // div.style.backgroundColor = 'yellow'\n const rows = document.createElement('div') as PageElement\n div.appendChild(rows)\n rows.classList.add('body-bg', 'border')\n const addRow = (el: PageElement, unit: string, cFactor: number) => {\n const box = Doc.safeSelector(el, '[data-unit-box]')\n const atoms = parseInt(box.dataset.atoms as string)\n const row = document.createElement('div')\n row.textContent = unit\n rows.appendChild(row)\n row.classList.add('p-2', 'hoverbg', 'pointer')\n Doc.bind(row, 'click', () => {\n Doc.setText(el, '[data-value]', Doc.formatFourSigFigs(atoms / cFactor, Math.round(Math.log10(cFactor))))\n Doc.setText(el, '[data-unit]', unit)\n })\n }\n for (const el of Doc.applySelector(main, '[data-conversion-value]')) {\n const box = Doc.safeSelector(el, '[data-unit-box]')\n Doc.bind(box, 'mouseenter', () => {\n Doc.empty(rows)\n box.appendChild(div)\n const lyt = Doc.layoutMetrics(box)\n const assetID = parseInt(box.dataset.assetID as string)\n const { unitInfo: ui } = this.assets[assetID]\n addRow(el, ui.conventional.unit, ui.conventional.conversionFactor)\n for (const { unit, conversionFactor } of ui.denominations) addRow(el, unit, conversionFactor)\n addRow(el, ui.atomicUnit, 1)\n if (lyt.bodyTop > (div.offsetHeight + this.header.offsetHeight)) {\n div.style.bottom = 'calc(100% - 1rem)'\n div.style.top = 'auto'\n } else {\n div.style.top = 'calc(100% - 1rem)'\n div.style.bottom = 'auto'\n }\n })\n Doc.bind(box, 'mouseleave', () => div.remove())\n }\n }\n\n bindUrlHandlers (ancestor: HTMLElement) {\n if (!window.openUrl) return\n for (const link of Doc.applySelector(ancestor, 'a[target=_blank]')) {\n Doc.bind(link, 'click', (e: MouseEvent) => {\n e.preventDefault()\n window.openUrl(link.href ?? '')\n })\n }\n }\n\n /* attachHeader attaches the header element, which unlike the main element,\n * isn't replaced during page navigation.\n */\n attachHeader () {\n this.header = idel(document.body, 'header')\n const page = this.page = Doc.idDescendants(this.header)\n this.headerSpace = page.headerSpace\n this.popupNotes = idel(document.body, 'popupNotes')\n this.popupTmpl = Doc.tmplElement(this.popupNotes, 'note')\n if (this.popupTmpl) this.popupTmpl.remove()\n else console.error('popupTmpl element not found')\n this.tooltip = idel(document.body, 'tooltip')\n page.noteTmpl.removeAttribute('id')\n page.noteTmpl.remove()\n page.pokeTmpl.removeAttribute('id')\n page.pokeTmpl.remove()\n page.loader.remove()\n Doc.show(page.loader)\n\n bind(page.noteBell, 'click', async () => {\n Doc.hide(page.pokeList)\n Doc.show(page.noteList)\n this.ackNotes()\n page.noteCat.classList.add('active')\n page.pokeCat.classList.remove('active')\n this.showDropdown(page.noteBell, page.noteBox)\n Doc.hide(page.noteIndicator)\n for (const note of this.notes) {\n if (note.acked) {\n note.el.classList.remove('firstview')\n }\n }\n this.setNoteTimes(page.noteList)\n this.setNoteTimes(page.pokeList)\n })\n\n bind(page.burgerIcon, 'click', () => {\n Doc.hide(page.logoutErr)\n this.showDropdown(page.burgerIcon, page.profileBox)\n })\n\n bind(page.innerNoteIcon, 'click', () => { Doc.hide(page.noteBox) })\n bind(page.innerBurgerIcon, 'click', () => { Doc.hide(page.profileBox) })\n\n bind(page.profileSignout, 'click', async () => await this.signOut())\n\n bind(page.pokeCat, 'click', () => {\n this.setNoteTimes(page.pokeList)\n page.pokeCat.classList.add('active')\n page.noteCat.classList.remove('active')\n Doc.hide(page.noteList)\n Doc.show(page.pokeList)\n this.ackNotes()\n })\n\n bind(page.noteCat, 'click', () => {\n this.setNoteTimes(page.noteList)\n page.noteCat.classList.add('active')\n page.pokeCat.classList.remove('active')\n Doc.hide(page.pokeList)\n Doc.show(page.noteList)\n this.ackNotes()\n })\n\n Doc.cleanTemplates(page.langBttnTmpl)\n const { name, flag } = languageData[this.lang]\n page.langFlag.textContent = flag\n page.langName.textContent = name\n\n for (const lang of this.langs) {\n if (lang === this.lang) continue\n const div = page.langBttnTmpl.cloneNode(true) as PageElement\n const { name, flag } = languageData[lang]\n div.textContent = flag\n div.title = name\n Doc.bind(div, 'click', () => this.setLanguage(lang))\n page.langBttns.appendChild(div)\n }\n }\n\n attachActions () {\n const { page } = this\n Object.assign(page, Doc.idDescendants(Doc.idel(document.body, 'requiredActions')))\n Doc.cleanTemplates(page.missingNoncesTmpl, page.actionTxTableTmpl, page.tooCheapTmpl, page.lostNonceTmpl)\n Doc.bind(page.actionsCollapse, 'click', () => {\n Doc.hide(page.actionDialog)\n Doc.show(page.actionDialogCollapsed)\n })\n Doc.bind(page.actionDialogCollapsed, 'click', () => {\n Doc.hide(page.actionDialogCollapsed)\n Doc.show(page.actionDialog)\n if (page.actionDialogContent.children.length === 0) this.showOldestAction()\n })\n const showAdjacentAction = (dir: number) => {\n const selected = Object.values(this.requiredActions).filter((r: requiredAction) => r.selected)[0]\n const actions = this.sortedActions()\n const idx = actions.indexOf(selected)\n this.showRequestedAction(actions[idx + dir].uniqueID)\n }\n Doc.bind(page.prevAction, 'click', () => showAdjacentAction(-1))\n Doc.bind(page.nextAction, 'click', () => showAdjacentAction(1))\n }\n\n setRequiredActions () {\n const { user: { actions }, requiredActions } = this\n if (!actions) return\n for (const a of actions) this.addAction(a)\n if (Object.keys(requiredActions).length) {\n this.showOldestAction()\n this.blinkAction()\n }\n }\n\n sortedActions () {\n const actions = Object.values(this.requiredActions)\n actions.sort((a: requiredAction, b: requiredAction) => a.stamp - b.stamp)\n return actions\n }\n\n showOldestAction () {\n this.showRequestedAction(this.sortedActions()[0].uniqueID)\n }\n\n addAction (req: ActionRequiredNote) {\n const { page, requiredActions } = this\n const existingAction = requiredActions[req.uniqueID]\n if (existingAction && existingAction.actionID === req.actionID) return\n const div = this.actionForm(req)\n if (existingAction) {\n if (existingAction.selected) existingAction.div.replaceWith(div)\n existingAction.div = div\n } else {\n requiredActions[req.uniqueID] = {\n div,\n stamp: (new Date()).getTime(),\n uniqueID: req.uniqueID,\n actionID: req.actionID,\n selected: false\n }\n const n = Object.keys(requiredActions).length\n page.actionDialogCount.textContent = String(n)\n page.actionCount.textContent = String(n)\n if (Doc.isHidden(page.actionDialog)) {\n this.showRequestedAction(req.uniqueID)\n }\n }\n }\n\n blinkAction () {\n Doc.blink(this.page.actionDialog)\n Doc.blink(this.page.actionDialogCollapsed)\n }\n\n resolveAction (req: ActionResolvedNote) {\n this.resolveActionWithID(req.uniqueID)\n }\n\n resolveActionWithID (uniqueID: string) {\n const { page, requiredActions } = this\n const existingAction = requiredActions[uniqueID]\n if (!existingAction) return\n delete requiredActions[uniqueID]\n const rem = Object.keys(requiredActions).length\n existingAction.div.remove()\n if (rem === 0) {\n Doc.hide(page.actionDialog, page.actionDialogCollapsed)\n return\n }\n page.actionDialogCount.textContent = String(rem)\n page.actionCount.textContent = String(rem)\n if (existingAction.selected) this.showOldestAction()\n }\n\n actionForm (req: ActionRequiredNote) {\n switch (req.actionID) {\n case 'tooCheap':\n return this.tooCheapAction(req)\n case 'missingNonces':\n return this.missingNoncesAction(req)\n case 'lostNonce':\n return this.lostNonceAction(req)\n case 'redeemRejected':\n return this.redeemRejectedAction(req)\n }\n throw Error('unknown required action ID ' + req.actionID)\n }\n\n actionTxTable (req: ActionRequiredNote) {\n const { assetID, payload } = req\n const n = payload as TransactionActionNote\n const { unitInfo: ui, token } = this.assets[assetID]\n const table = this.page.actionTxTableTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(table)\n tmpl.lostTxID.textContent = n.tx.id\n tmpl.lostTxID.dataset.explorerCoin = n.tx.id\n setCoinHref(token ? token.parentID : assetID, tmpl.lostTxID)\n tmpl.txAmt.textContent = Doc.formatCoinValue(n.tx.amount, ui)\n tmpl.amtUnit.textContent = ui.conventional.unit\n const parentUI = token ? this.unitInfo(token.parentID) : ui\n tmpl.type.textContent = txTypeString(n.tx.type)\n tmpl.feeAmount.textContent = Doc.formatCoinValue(n.tx.fees, parentUI)\n tmpl.feeUnit.textContent = parentUI.conventional.unit\n switch (req.actionID) {\n case 'tooCheap': {\n Doc.show(tmpl.newFeesRow)\n tmpl.newFees.textContent = Doc.formatCoinValue(n.tx.fees, parentUI)\n tmpl.newFeesUnit.textContent = parentUI.conventional.unit\n break\n }\n }\n return table\n }\n\n async submitAction (req: ActionRequiredNote, action: any, errMsg: PageElement) {\n Doc.hide(errMsg)\n const loading = this.loading(this.page.actionDialog)\n const res = await postJSON('/api/takeaction', {\n assetID: req.assetID,\n actionID: req.actionID,\n action\n })\n loading()\n if (!this.checkResponse(res)) {\n errMsg.textContent = res.msg\n Doc.show(errMsg)\n return\n }\n this.resolveActionWithID(req.uniqueID)\n }\n\n missingNoncesAction (req: ActionRequiredNote) {\n const { assetID } = req\n const div = this.page.missingNoncesTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(div)\n const { name } = this.assets[assetID]\n tmpl.assetName.textContent = name\n Doc.bind(tmpl.doNothingBttn, 'click', () => {\n this.submitAction(req, { recover: false }, tmpl.errMsg)\n })\n Doc.bind(tmpl.recoverBttn, 'click', () => {\n this.submitAction(req, { recover: true }, tmpl.errMsg)\n })\n return div\n }\n\n tooCheapAction (req: ActionRequiredNote) {\n const { assetID, payload } = req\n const n = payload as TransactionActionNote\n const div = this.page.tooCheapTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(div)\n const { name } = this.assets[assetID]\n tmpl.assetName.textContent = name\n tmpl.txTable.appendChild(this.actionTxTable(req))\n const act = (bump: boolean) => {\n this.submitAction(req, {\n txID: n.tx.id,\n bump\n }, tmpl.errMsg)\n }\n Doc.bind(tmpl.keepWaitingBttn, 'click', () => act(false))\n Doc.bind(tmpl.addFeesBttn, 'click', () => act(true))\n return div\n }\n\n lostNonceAction (req: ActionRequiredNote) {\n const { assetID, payload } = req\n const n = payload as TransactionActionNote\n const div = this.page.lostNonceTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(div)\n const { name } = this.assets[assetID]\n tmpl.assetName.textContent = name\n tmpl.nonce.textContent = String(n.nonce)\n tmpl.txTable.appendChild(this.actionTxTable(req))\n Doc.bind(tmpl.abandonBttn, 'click', () => {\n this.submitAction(req, { txID: n.tx.id, abandon: true }, tmpl.errMsg)\n })\n Doc.bind(tmpl.keepWaitingBttn, 'click', () => {\n this.submitAction(req, { txID: n.tx.id, abandon: false }, tmpl.errMsg)\n })\n Doc.bind(tmpl.replaceBttn, 'click', () => {\n const replacementID = tmpl.idInput.value\n if (!replacementID) {\n tmpl.idInput.focus()\n Doc.blink(tmpl.idInput)\n return\n }\n this.submitAction(req, { txID: n.tx.id, abandon: false, replacementID }, tmpl.errMsg)\n })\n return div\n }\n\n redeemRejectedAction (req: ActionRequiredNote) {\n const { orderID, coinID, coinFmt, assetID } = req.payload as RejectedRedemptionData\n const div = this.page.rejectedRedemptionTmpl.cloneNode(true) as PageElement\n const tmpl = Doc.parseTemplate(div)\n const { name, token } = this.assets[assetID]\n tmpl.assetName.textContent = name\n tmpl.txid.textContent = coinFmt\n tmpl.txid.dataset.explorerCoin = coinID\n setCoinHref(token ? token.parentID : assetID, tmpl.txid)\n Doc.bind(tmpl.doNothingBttn, 'click', () => {\n this.submitAction(req, { orderID, coinID, retry: false }, tmpl.errMsg)\n })\n Doc.bind(tmpl.tryAgainBttn, 'click', () => {\n this.submitAction(req, { orderID, coinID, retry: true }, tmpl.errMsg)\n })\n return div\n }\n\n showRequestedAction (uniqueID: string) {\n const { page, requiredActions } = this\n Doc.hide(page.actionDialogCollapsed)\n for (const r of Object.values(requiredActions)) r.selected = r.uniqueID === uniqueID\n Doc.empty(page.actionDialogContent)\n const action = requiredActions[uniqueID]\n page.actionDialogContent.appendChild(action.div)\n Doc.show(page.actionDialog)\n const actions = this.sortedActions()\n if (actions.length === 1) {\n Doc.hide(page.actionsNavigator)\n return\n }\n Doc.show(page.actionsNavigator)\n const idx = actions.indexOf(action)\n page.currentAction.textContent = String(idx + 1)\n page.prevAction.classList.toggle('invisible', idx === 0)\n page.nextAction.classList.toggle('invisible', idx === actions.length - 1)\n }\n\n /*\n * updateMarketElements sets the textContent for any ticker or asset name\n * elements or any asset logo src attributes for descendents of ancestor.\n */\n updateMarketElements (ancestor: PageElement, baseID: number, quoteID: number, xc?: Exchange) {\n const getAsset = (assetID: number) => {\n const a = this.assets[assetID]\n if (a) return a\n if (!xc) throw Error(`no asset found for asset ID ${assetID}`)\n const xcAsset = xc.assets[assetID]\n return { unitInfo: xcAsset.unitInfo, name: xcAsset.symbol, symbol: xcAsset.symbol }\n }\n const { unitInfo: bui, name: baseName, symbol: baseSymbol } = getAsset(baseID)\n for (const el of Doc.applySelector(ancestor, '[data-base-name')) el.textContent = baseName\n for (const img of Doc.applySelector(ancestor, '[data-base-logo]')) img.src = Doc.logoPath(baseSymbol)\n for (const el of Doc.applySelector(ancestor, '[data-base-ticker]')) el.textContent = bui.conventional.unit\n const { unitInfo: qui, name: quoteName, symbol: quoteSymbol } = getAsset(quoteID)\n for (const el of Doc.applySelector(ancestor, '[data-quote-name')) el.textContent = quoteName\n for (const img of Doc.applySelector(ancestor, '[data-quote-logo]')) img.src = Doc.logoPath(quoteSymbol)\n for (const el of Doc.applySelector(ancestor, '[data-quote-ticker]')) el.textContent = qui.conventional.unit\n }\n\n async setLanguage (lang: string) {\n await postJSON('/api/setlocale', lang)\n window.location.reload()\n }\n\n /*\n * showDropdown sets the position and visibility of the specified dropdown\n * dialog according to the position of its icon button.\n */\n showDropdown (icon: HTMLElement, dialog: HTMLElement) {\n Doc.hide(this.page.noteBox, this.page.profileBox)\n Doc.show(dialog)\n if (window.innerWidth < 500) Object.assign(dialog.style, { left: '0', right: '0', top: '0' })\n else {\n const ico = icon.getBoundingClientRect()\n const right = `${window.innerWidth - ico.left - ico.width + 5}px`\n Object.assign(dialog.style, { left: 'auto', right, top: `${ico.top - 4}px` })\n }\n\n const hide = (e: MouseEvent) => {\n if (!Doc.mouseInElement(e, dialog)) {\n Doc.hide(dialog)\n unbind(document, 'click', hide)\n if (dialog === this.page.noteBox && Doc.isDisplayed(this.page.noteList)) {\n this.ackNotes()\n }\n }\n }\n bind(document, 'click', hide)\n }\n\n ackNotes () {\n const acks = []\n for (const note of this.notes) {\n if (note.acked) {\n note.el.classList.remove('firstview')\n } else {\n note.acked = true\n if (note.id && note.severity > ntfn.POKE) acks.push(note.id)\n }\n }\n if (acks.length) ws.request('acknotes', acks)\n Doc.hide(this.page.noteIndicator)\n }\n\n setNoteTimes (noteList: HTMLElement) {\n for (const el of (Array.from(noteList.children) as NoteElement[])) {\n Doc.safeSelector(el, 'span.note-time').textContent = Doc.timeSince(el.note.stamp)\n }\n }\n\n /*\n * bindInternalNavigation hijacks navigation by click on any local links that\n * are descendants of ancestor.\n */\n bindInternalNavigation (ancestor: HTMLElement) {\n const pageURL = new URL(window.location.href)\n ancestor.querySelectorAll('a').forEach(a => {\n if (!a.href) return\n const url = new URL(a.href)\n if (url.origin === pageURL.origin) {\n const token = url.pathname.substring(1)\n const params: Record<string, string> = {}\n if (url.search) {\n url.searchParams.forEach((v, k) => {\n params[k] = v\n })\n }\n Doc.bind(a, 'click', (e: Event) => {\n e.preventDefault()\n this.loadPage(token, params)\n })\n }\n })\n }\n\n /*\n * updateMenuItemsDisplay should be called when the user has signed in or out,\n * and when the user registers a DEX.\n */\n updateMenuItemsDisplay () {\n const { page, authed, mmStatus } = this\n if (!page) {\n // initial page load, header elements not yet attached but menu items\n // would already be hidden/displayed as appropriate.\n return\n }\n if (!authed) {\n page.profileBox.classList.remove('authed')\n Doc.hide(page.noteBell, page.walletsMenuEntry, page.marketsMenuEntry)\n return\n }\n Doc.setVis(Object.keys(this.exchanges).length > 0, page.marketsMenuEntry, page.mmLink)\n\n page.profileBox.classList.add('authed')\n Doc.show(page.noteBell, page.walletsMenuEntry, page.marketsMenuEntry)\n Doc.setVis(mmStatus, page.mmLink)\n }\n\n async fetchNotes () {\n const res = await getJSON('/api/notes')\n if (!this.checkResponse(res)) return console.error('failed to fetch notes:', res?.msg || String(res))\n res.notes.reverse()\n this.setNotes(res.notes)\n this.setPokes(res.pokes)\n this.setRequiredActions()\n }\n\n /* attachCommon scans the provided node and handles some common bindings. */\n attachCommon (node: HTMLElement) {\n this.bindInternalNavigation(node)\n }\n\n /*\n * updateBondConfs updates the information for a pending bond.\n */\n updateBondConfs (dexAddr: string, coinID: string, confs: number) {\n const dex = this.exchanges[dexAddr]\n for (const bond of dex.auth.pendingBonds) if (bond.coinID === coinID) bond.confs = confs\n }\n\n updateTier (host: string, bondedTier: number) {\n this.exchanges[host].auth.rep.bondedTier = bondedTier\n }\n\n /*\n * handleBondNote is the handler for the 'bondpost'-type notification, which\n * is used to update the dex tier and registration status.\n */\n handleBondNote (note: BondNote) {\n if (note.auth) this.exchanges[note.dex].auth = note.auth\n switch (note.topic) {\n case 'RegUpdate':\n if (note.coinID !== null) { // should never be null for RegUpdate\n this.updateBondConfs(note.dex, note.coinID, note.confirmations)\n }\n break\n case 'BondConfirmed':\n if (note.tier !== null) { // should never be null for BondConfirmed\n this.updateTier(note.dex, note.tier)\n }\n break\n default:\n break\n }\n }\n\n /*\n * handleTransaction either adds a new transaction to the transaction history\n * or updates an existing transaction.\n */\n handleTransactionNote (assetID: number, note: TransactionNote) {\n const txHistory = this.txHistoryMap[assetID]\n if (!txHistory) return\n\n if (note.new) {\n txHistory.txs.unshift(note.transaction)\n return\n }\n\n for (let i = 0; i < txHistory.txs.length; i++) {\n if (txHistory.txs[i].id === note.transaction.id) {\n txHistory.txs[i] = note.transaction\n break\n }\n }\n }\n\n handleTxHistorySyncedNote (assetID: number) {\n delete this.txHistoryMap[assetID]\n }\n\n loggedIn (notes: CoreNote[], pokes: CoreNote[]) {\n this.setNotes(notes)\n this.setPokes(pokes)\n this.setRequiredActions()\n }\n\n /*\n * setNotes sets the current notification cache and populates the notification\n * display.\n */\n setNotes (notes: CoreNote[]) {\n this.log('notes', 'setNotes', notes)\n this.notes = []\n Doc.empty(this.page.noteList)\n for (let i = 0; i < notes.length; i++) {\n this.prependNoteElement(notes[i])\n }\n }\n\n /*\n * setPokes sets the current poke cache and populates the pokes display.\n */\n setPokes (pokes: CoreNote[]) {\n this.log('pokes', 'setPokes', pokes)\n this.pokes = []\n Doc.empty(this.page.pokeList)\n for (let i = 0; i < pokes.length; i++) {\n this.prependPokeElement(pokes[i])\n }\n }\n\n botStatus (host: string, baseID: number, quoteID: number): MMBotStatus | undefined {\n for (const bot of (this.mmStatus?.bots ?? [])) {\n const { config: c } = bot\n if (host === c.host && baseID === c.baseID && quoteID === c.quoteID) {\n return bot\n }\n }\n }\n\n updateUser (note: CoreNote) {\n const { user, assets, walletMap } = this\n if (note.type === 'fiatrateupdate') {\n this.fiatRatesMap = (note as RateNote).fiatRates\n return\n }\n // Some notes can be received before we get a User during login.\n if (!user) return\n switch (note.type) {\n case 'order': {\n const orderNote = note as OrderNote\n const order = orderNote.order\n const mkt = user.exchanges[order.host].markets[order.market]\n const tempID = orderNote.tempID\n\n // Ensure market's inflight orders list is updated.\n if (note.topic === 'AsyncOrderSubmitted') {\n const inFlight = order as InFlightOrder\n inFlight.tempID = tempID\n if (!mkt.inflight) mkt.inflight = [inFlight]\n else mkt.inflight.push(inFlight)\n break\n } else if (note.topic === 'AsyncOrderFailure') {\n mkt.inflight = mkt.inflight.filter(ord => ord.tempID !== tempID)\n break\n } else {\n for (const i in mkt.inflight || []) {\n if (!(mkt.inflight[i].tempID === tempID)) continue\n mkt.inflight = mkt.inflight.filter(ord => ord.tempID !== tempID)\n break\n }\n }\n\n // Updates given order in market's orders list if it finds it.\n // Returns a bool which indicates if order was found.\n mkt.orders = mkt.orders || []\n const updateOrder = (mkt: Market, ord: Order) => {\n const i = mkt.orders.findIndex((o: Order) => o.id === ord.id)\n if (i === -1) return false\n if (note.topic === 'OrderRetired') mkt.orders.splice(i, 1)\n else mkt.orders[i] = ord\n return true\n }\n // If the notification order already exists we update it.\n // In case market's orders list is empty or the notification order isn't\n // part of it we add it manually as this means the order was\n // just placed.\n if (!updateOrder(mkt, order)) mkt.orders.push(order)\n break\n }\n case 'balance': {\n const n: BalanceNote = note as BalanceNote\n const asset = user.assets[n.assetID]\n // Balance updates can come before the user is fetched after login.\n if (!asset) break\n const w = asset.wallet\n if (w) w.balance = n.balance\n break\n }\n case 'bondpost':\n this.handleBondNote(note as BondNote)\n break\n case 'reputation': {\n const n = note as ReputationNote\n this.exchanges[n.host].auth.rep = n.rep\n break\n }\n case 'walletstate':\n case 'walletconfig': {\n // assets can be null if failed to connect to dex server.\n if (!assets) return\n const wallet = (note as WalletConfigNote)?.wallet\n if (!wallet) return\n const asset = assets[wallet.assetID]\n asset.wallet = wallet\n walletMap[wallet.assetID] = wallet\n break\n }\n case 'walletsync': {\n const n = note as WalletSyncNote\n const w = this.walletMap[n.assetID]\n if (w) {\n w.syncStatus = n.syncStatus\n w.synced = w.syncStatus.synced\n w.syncProgress = n.syncProgress\n }\n break\n }\n case 'match': {\n const n = note as MatchNote\n const ord = this.order(n.orderID)\n if (ord) updateMatch(ord, n.match)\n break\n }\n case 'conn': {\n const n = note as ConnEventNote\n const xc = user.exchanges[n.host]\n if (xc) xc.connectionStatus = n.connectionStatus\n break\n }\n case 'spots': {\n const n = note as SpotPriceNote\n const xc = user.exchanges[n.host]\n // Spots can come before the user is fetched after login and before/while the\n // markets page reload when it receives a dex conn note.\n if (!xc || !xc.markets) break\n for (const [mktName, spot] of Object.entries(n.spots)) xc.markets[mktName].spot = spot\n break\n }\n case 'fiatrateupdate': {\n this.fiatRatesMap = (note as RateNote).fiatRates\n break\n }\n case 'actionrequired': {\n const n = note as CoreActionRequiredNote\n this.addAction(n.payload)\n break\n }\n case 'walletnote': {\n const n = note as WalletNote\n switch (n.payload.route) {\n case 'transaction': {\n const txNote = n.payload as TransactionNote\n this.handleTransactionNote(n.payload.assetID, txNote)\n break\n }\n case 'actionRequired': {\n const req = n.payload as ActionRequiredNote\n this.addAction(req)\n this.blinkAction()\n break\n }\n case 'actionResolved': {\n this.resolveAction(n.payload as ActionResolvedNote)\n }\n }\n if (n.payload.route === 'transactionHistorySynced') {\n this.handleTxHistorySyncedNote(n.payload.assetID)\n }\n break\n }\n case 'runstats': {\n this.log('mm', { runstats: note })\n const n = note as RunStatsNote\n const bot = this.botStatus(n.host, n.baseID, n.quoteID)\n if (bot) {\n bot.runStats = n.stats\n bot.running = Boolean(n.stats)\n if (!n.stats) {\n bot.latestEpoch = undefined\n bot.cexProblems = undefined\n }\n }\n break\n }\n case 'cexnote': {\n const n = note as CEXNotification\n switch (n.topic) {\n case 'BalanceUpdate': {\n const u = n.note as CEXBalanceUpdate\n this.mmStatus.cexes[n.cexName].balances[u.assetID] = u.balance\n }\n }\n break\n }\n case 'epochreport': {\n const n = note as EpochReportNote\n const bot = this.botStatus(n.host, n.baseID, n.quoteID)\n if (bot) bot.latestEpoch = n.report\n break\n }\n case 'cexproblems': {\n const n = note as CEXProblemsNote\n const bot = this.botStatus(n.host, n.baseID, n.quoteID)\n if (bot) bot.cexProblems = n.problems\n break\n }\n }\n }\n\n /*\n * notify is the top-level handler for notifications received from the client.\n * Notifications are propagated to the loadedPage.\n */\n notify (note: CoreNote) {\n // Handle type-specific updates.\n this.log('notes', 'notify', note)\n this.updateUser(note)\n // Inform the page.\n for (const feeder of this.noteReceivers) {\n const f = feeder[note.type]\n if (!f) continue\n try {\n f(note)\n } catch (error) {\n console.error('note feeder error:', error.message ? error.message : error)\n console.log(note)\n console.log(error.stack)\n }\n }\n // Discard data notifications.\n if (note.severity < ntfn.POKE) return\n // Poke notifications have their own display.\n const { popupTmpl, popupNotes, showPopups } = this\n if (showPopups) {\n const span = popupTmpl.cloneNode(true) as HTMLElement\n Doc.tmplElement(span, 'text').textContent = `${note.subject}: ${ntfn.plainNote(note.details)}`\n const indicator = Doc.tmplElement(span, 'indicator')\n if (note.severity === ntfn.POKE) {\n Doc.hide(indicator)\n } else setSeverityClass(indicator, note.severity)\n popupNotes.appendChild(span)\n Doc.show(popupNotes)\n // These take up screen space. Only show max 5 at a time.\n while (popupNotes.children.length > 5) popupNotes.removeChild(popupNotes.firstChild as Node)\n setTimeout(async () => {\n await Doc.animate(500, (progress: number) => {\n span.style.opacity = String(1 - progress)\n })\n span.remove()\n if (popupNotes.children.length === 0) Doc.hide(popupNotes)\n }, 6000)\n }\n // Success and higher severity go to the bell dropdown.\n if (note.severity === ntfn.POKE) this.prependPokeElement(note)\n else this.prependNoteElement(note)\n\n // show desktop notification\n ntfn.desktopNotify(note)\n }\n\n /*\n * registerNoteFeeder registers a feeder for core notifications. The feeder\n * will be de-registered when a new page is loaded.\n */\n registerNoteFeeder (receivers: Record<string, (n: CoreNote) => void>) {\n this.noteReceivers.push(receivers)\n }\n\n /*\n * log prints to the console if a logger has been enabled. Loggers are created\n * implicitly by passing a loggerID to log. i.e. you don't create a logger,\n * you just log to it. Loggers are enabled by invoking a global function,\n * enableLogger(loggerID, onOffBoolean), from the browser's js console. Your\n * choices are stored across sessions. Some common and useful loggers are\n * listed below, but this list is not meant to be comprehensive.\n *\n * LoggerID Description\n * -------- -----------\n * notes Notifications of all levels.\n * book Order book feed.\n * ws.........Websocket connection status changes.\n */\n log (loggerID: string, ...msg: any) {\n if (this.loggers[loggerID]) console.log(`${nowString()}[${loggerID}]:`, ...msg)\n if (this.recorders[loggerID]) {\n this.recorders[loggerID].push({\n time: nowString(),\n msg: msg\n })\n }\n }\n\n prependPokeElement (cn: CoreNote) {\n const [el, note] = this.makePoke(cn)\n this.pokes.push(note)\n while (this.pokes.length > noteCacheSize) this.pokes.shift()\n this.prependListElement(this.page.pokeList, note, el)\n }\n\n prependNoteElement (cn: CoreNote) {\n const [el, note] = this.makeNote(cn)\n this.notes.push(note)\n while (this.notes.length > noteCacheSize) this.notes.shift()\n const noteList = this.page.noteList\n this.prependListElement(noteList, note, el)\n this.bindUrlHandlers(el)\n // Set the indicator color.\n if (this.notes.length === 0 || (Doc.isDisplayed(this.page.noteBox) && Doc.isDisplayed(noteList))) return\n let unacked = 0\n const severity = this.notes.reduce((s, note) => {\n if (!note.acked) unacked++\n if (!note.acked && note.severity > s) return note.severity\n return s\n }, ntfn.IGNORE)\n const ni = this.page.noteIndicator\n setSeverityClass(ni, severity)\n if (unacked) {\n ni.textContent = String((unacked > noteCacheSize - 1) ? `${noteCacheSize - 1}+` : unacked)\n Doc.show(ni)\n } else Doc.hide(ni)\n }\n\n prependListElement (noteList: HTMLElement, note: CoreNotePlus, el: NoteElement) {\n el.note = note\n noteList.prepend(el)\n while (noteList.children.length > noteCacheSize) noteList.removeChild(noteList.lastChild as Node)\n this.setNoteTimes(noteList)\n }\n\n /*\n * makeNote constructs a single notification element for the drop-down\n * notification list.\n */\n makeNote (note: CoreNote): [NoteElement, CoreNotePlus] {\n const el = this.page.noteTmpl.cloneNode(true) as NoteElement\n if (note.severity > ntfn.POKE) {\n const cls = note.severity === ntfn.SUCCESS ? 'good' : note.severity === ntfn.WARNING ? 'warn' : 'bad'\n Doc.safeSelector(el, 'div.note-indicator').classList.add(cls)\n }\n\n Doc.safeSelector(el, 'div.note-subject').textContent = note.subject\n ntfn.insertRichNote(Doc.safeSelector(el, 'div.note-details'), note.details)\n const np: CoreNotePlus = { el, ...note }\n return [el, np]\n }\n\n makePoke (note: CoreNote): [NoteElement, CoreNotePlus] {\n const el = this.page.pokeTmpl.cloneNode(true) as NoteElement\n Doc.tmplElement(el, 'subject').textContent = `${note.subject}:`\n ntfn.insertRichNote(Doc.tmplElement(el, 'details'), note.details)\n const np: CoreNotePlus = { el, ...note }\n return [el, np]\n }\n\n /*\n * loading appends the loader to the specified element and displays the\n * loading icon. The loader will block all interaction with the specified\n * element until Application.loaded is called.\n */\n loading (el: HTMLElement): () => void {\n const loader = this.page.loader.cloneNode(true) as HTMLElement\n el.appendChild(loader)\n return () => { loader.remove() }\n }\n\n /* orders retrieves a list of orders for the specified dex and market\n * including inflight orders.\n */\n orders (host: string, mktID: string): Order[] {\n let orders: Order[] = []\n const mkt = this.user.exchanges[host].markets[mktID]\n if (mkt.orders) orders = orders.concat(mkt.orders)\n if (mkt.inflight) orders = orders.concat(mkt.inflight)\n return orders\n }\n\n /*\n * haveActiveOrders returns whether or not there are active orders involving a\n * certain asset.\n */\n haveActiveOrders (assetID: number): boolean {\n for (const xc of Object.values(this.user.exchanges)) {\n if (!xc.markets) continue\n for (const market of Object.values(xc.markets)) {\n if (!market.orders) continue\n for (const ord of market.orders) {\n if ((ord.baseID === assetID || ord.quoteID === assetID) &&\n (ord.status < StatusExecuted || hasActiveMatches(ord))) return true\n }\n }\n }\n return false\n }\n\n /* order attempts to locate an order by order ID. */\n order (oid: string): Order | null {\n for (const xc of Object.values(this.user.exchanges)) {\n if (!xc || !xc.markets) continue\n for (const market of Object.values(xc.markets)) {\n if (!market.orders) continue\n for (const ord of market.orders) {\n if (ord.id === oid) return ord\n }\n }\n }\n return null\n }\n\n /*\n * canAccelerateOrder returns true if the \"from\" wallet of the order\n * supports acceleration, and if the order has unconfirmed swap\n * transactions.\n */\n canAccelerateOrder (order: Order): boolean {\n const walletTraitAccelerator = 1 << 4\n let fromAssetID\n if (order.sell) fromAssetID = order.baseID\n else fromAssetID = order.quoteID\n const wallet = this.walletMap[fromAssetID]\n if (!wallet || !(wallet.traits & walletTraitAccelerator)) return false\n if (order.matches) {\n for (let i = 0; i < order.matches?.length; i++) {\n const match = order.matches[i]\n if (match.swap && match.swap.confs && match.swap.confs.count === 0 && !match.revoked) {\n return true\n }\n }\n }\n return false\n }\n\n /*\n * unitInfo fetches unit info [dex.UnitInfo] for the asset. If xc\n * [core.Exchange] is provided, and this is not a SupportedAsset, the UnitInfo\n * sent from the exchange's assets map [dex.Asset] will be used.\n */\n unitInfo (assetID: number, xc?: Exchange): UnitInfo {\n const supportedAsset = this.assets[assetID]\n if (supportedAsset) return supportedAsset.unitInfo\n if (!xc || !xc.assets) {\n throw Error(intl.prep(intl.ID_UNSUPPORTED_ASSET_INFO_ERR_MSG, { assetID: `${assetID}` }))\n }\n return xc.assets[assetID].unitInfo\n }\n\n parentAsset (assetID: number) : SupportedAsset {\n const asset = this.assets[assetID]\n if (!asset.token) return asset\n return this.assets[asset.token.parentID]\n }\n\n /*\n * baseChainSymbol returns the symbol for the asset's parent if the asset is a\n * token, otherwise the symbol for the asset itself.\n */\n baseChainSymbol (assetID: number) {\n const asset = this.user.assets[assetID]\n return asset.token ? this.user.assets[asset.token.parentID].symbol : asset.symbol\n }\n\n /*\n * extensionWallet returns the ExtensionConfiguredWallet for the asset, if\n * it exists.\n */\n extensionWallet (assetID: number) {\n return this.user.extensionModeConfig?.restrictedWallets[this.baseChainSymbol(assetID)]\n }\n\n /* conventionalRate converts the encoded atomic rate to a conventional rate */\n conventionalRate (baseID: number, quoteID: number, encRate: number, xc?: Exchange): number {\n const [b, q] = [this.unitInfo(baseID, xc), this.unitInfo(quoteID, xc)]\n\n const r = b.conventional.conversionFactor / q.conventional.conversionFactor\n return encRate * r / RateEncodingFactor\n }\n\n walletDefinition (assetID: number, walletType: string): WalletDefinition {\n const asset = this.assets[assetID]\n if (asset.token) return asset.token.definition\n if (!asset.info) throw Error('where\\'s the wallet info?')\n if (walletType === '') return asset.info.availablewallets[asset.info.emptyidx]\n return asset.info.availablewallets.filter(def => def.type === walletType)[0]\n }\n\n currentWalletDefinition (assetID: number): WalletDefinition {\n const asset = this.assets[assetID]\n if (asset.token) {\n return asset.token.definition\n }\n return this.walletDefinition(assetID, this.assets[assetID].wallet.type)\n }\n\n /*\n * fetchBalance requests a balance update from the API. The API response does\n * include the balance, but we're ignoring it, since a balance update\n * notification is received via the Application anyways.\n */\n async fetchBalance (assetID: number): Promise<WalletBalance> {\n const res: BalanceResponse = await postJSON('/api/balance', { assetID: assetID })\n if (!this.checkResponse(res)) {\n throw new Error(`failed to fetch balance for asset ID ${assetID}`)\n }\n return res.balance\n }\n\n /*\n * checkResponse checks the response object as returned from the functions in\n * the http module. If the response indicates that the request failed, it\n * returns false, otherwise, true.\n */\n checkResponse (resp: APIResponse): boolean {\n return (resp.requestSuccessful && resp.ok)\n }\n\n /**\n * signOut call to /api/logout, if response with no errors occurred remove auth\n * and other privacy-critical cookies/locals and reload the page, otherwise\n * show a notification.\n */\n async signOut () {\n const res = await postJSON('/api/logout')\n if (!this.checkResponse(res)) {\n if (res.code === Errors.activeOrdersErr) {\n this.page.logoutErr.textContent = intl.prep(intl.ID_ACTIVE_ORDERS_LOGOUT_ERR_MSG)\n } else {\n this.page.logoutErr.textContent = res.msg\n }\n Doc.show(this.page.logoutErr)\n return\n }\n State.removeCookie(State.authCK)\n State.removeCookie(State.pwKeyCK)\n State.removeLocal(State.notificationsLK) // Notification storage was DEPRECATED pre-v1.\n window.location.href = '/login'\n }\n\n /*\n * txHistory loads the tx history for an asset. If the results are not\n * already cached, they are cached. If we have reached the oldest tx,\n * this fact is also cached. If the exact amount of transactions as have been\n * made are requested, we will not know if we have reached the last tx until\n * a subsequent call.\n */\n async txHistory (assetID: number, n: number, after?: string): Promise<TxHistoryResult> {\n const url = '/api/txhistory'\n const cachedTxHistory = this.txHistoryMap[assetID]\n if (!cachedTxHistory) {\n const res = await postJSON(url, {\n n: n,\n assetID: assetID\n })\n if (!this.checkResponse(res)) {\n throw new Error(res.msg)\n }\n let txs : WalletTransaction[] | null | undefined = res.txs\n if (!txs) {\n txs = []\n }\n this.txHistoryMap[assetID] = {\n txs: txs,\n lastTx: txs.length < n\n }\n return this.txHistoryMap[assetID]\n }\n const txs : WalletTransaction[] = []\n let lastTx = false\n const startIndex = after ? cachedTxHistory.txs.findIndex(tx => tx.id === after) + 1 : 0\n if (after && startIndex === -1) {\n throw new Error('invalid after tx ' + after)\n }\n let lastIndex = startIndex\n for (let i = startIndex; i < cachedTxHistory.txs.length && txs.length < n; i++) {\n txs.push(cachedTxHistory.txs[i])\n lastIndex = i\n after = cachedTxHistory.txs[i].id\n }\n if (cachedTxHistory.lastTx && lastIndex === cachedTxHistory.txs.length - 1) {\n lastTx = true\n }\n if (txs.length < n && !cachedTxHistory.lastTx) {\n const res = await postJSON(url, {\n n: n - txs.length + 1, // + 1 because first result will be refID\n assetID: assetID,\n refID: after,\n past: true\n })\n if (!this.checkResponse(res)) {\n throw new Error(res.msg)\n }\n let resTxs : WalletTransaction[] | null | undefined = res.txs\n if (!resTxs) {\n resTxs = []\n }\n if (resTxs.length > 0 && after) {\n if (resTxs[0].id === after) {\n resTxs.shift()\n } else {\n // Implies a bug in the client\n console.error('First tx history element != refID')\n }\n }\n cachedTxHistory.lastTx = resTxs.length < n - txs.length\n lastTx = cachedTxHistory.lastTx\n txs.push(...resTxs)\n cachedTxHistory.txs.push(...resTxs)\n }\n return { txs, lastTx }\n }\n\n getWalletTx (assetID: number, txID: string): WalletTransaction | undefined {\n const cachedTxHistory = this.txHistoryMap[assetID]\n if (!cachedTxHistory) return undefined\n return cachedTxHistory.txs.find(tx => tx.id === txID)\n }\n\n clearTxHistory (assetID: number) {\n delete this.txHistoryMap[assetID]\n }\n\n async needsCustomProvider (assetID: number): Promise<boolean> {\n const baseChainID = this.assets[assetID]?.token?.parentID ?? assetID\n if (!baseChainID) return false\n const w = this.walletMap[baseChainID]\n if (!w) return false\n const traitAccountLocker = 1 << 14\n if ((w.traits & traitAccountLocker) === 0) return false\n const res = await postJSON('/api/walletsettings', { assetID: baseChainID })\n if (!this.checkResponse(res)) {\n console.error(res.msg)\n return false\n }\n const settings = res.map as Record<string, string>\n return !settings.providers\n }\n}\n\n/* getSocketURI returns the websocket URI for the client. */\nfunction getSocketURI (): string {\n const protocol = (window.location.protocol === 'https:') ? 'wss' : 'ws'\n return `${protocol}://${window.location.host}/ws`\n}\n\n/*\n * severityClassMap maps a notification severity level to a CSS class that\n * assigns a background color.\n */\nconst severityClassMap: Record<number, string> = {\n [ntfn.SUCCESS]: 'good',\n [ntfn.ERROR]: 'bad',\n [ntfn.WARNING]: 'warn'\n}\n\n/* handlerFromPath parses the handler name from the path. */\nfunction handlerFromPath (path: string): string {\n return path.replace(/^\\//, '').split('/')[0].split('?')[0].split('#')[0]\n}\n\n/* nowString creates a string formatted like HH:MM:SS.xxx */\nfunction nowString (): string {\n const stamp = new Date()\n const h = stamp.getHours().toString().padStart(2, '0')\n const m = stamp.getMinutes().toString().padStart(2, '0')\n const s = stamp.getSeconds().toString().padStart(2, '0')\n const ms = stamp.getMilliseconds().toString().padStart(3, '0')\n return `${h}:${m}:${s}.${ms}`\n}\n\nfunction setSeverityClass (el: HTMLElement, severity: number) {\n el.classList.remove('bad', 'warn', 'good')\n el.classList.add(severityClassMap[severity])\n}\n\n/* updateMatch updates the match in or adds the match to the order. */\nfunction updateMatch (order: Order, match: Match) {\n for (const i in order.matches) {\n const m = order.matches[i]\n if (m.matchID === match.matchID) {\n order.matches[i] = match\n return\n }\n }\n order.matches = order.matches || []\n order.matches.push(match)\n}\n","import Application from './js/app'\nimport { registerApplication } from './js/registry'\nimport './css/bootstrap.scss'\nimport './css/application.scss'\n\nconst app = new Application()\nregisterApplication(app)\napp.start()\n"],"names":["module","exports","e","d","this","v","k","__esModule","regeneratorDefine","_regenerator","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","f","p","y","G","a","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","w","m","regeneratorAsyncGen","next","then","regenerator","regeneratorAsyncIterator","Promise","OverloadYield","AsyncIterator","resolve","asyncIterator","_regeneratorDefine","defineProperty","_invoke","enumerable","configurable","writable","unshift","pop","regeneratorAsync","regeneratorKeys","regeneratorValues","_regeneratorRuntime","constructor","name","stop","abrupt","delegateYield","resultName","finish","_t","prev","sent","wrap","reverse","isGeneratorFunction","mark","awrap","async","keys","values","_typeof","isNaN","runtime","regeneratorRuntime","accidentalStrictMode","globalThis","Function","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","getter","definition","key","get","obj","prop","hasOwnProperty","_arrayLikeToArray","Array","_unsupportedIterableToArray","toString","slice","from","test","_toConsumableArray","isArray","_slicedToArray","push","asyncGeneratorStep","_asyncToGenerator","arguments","apply","_next","_throw","_classCallCheck","toPropertyKey","toPrimitive","String","_defineProperties","_createClass","_defineProperty","_assertThisInitialized","ReferenceError","_setPrototypeOf","_inherits","_possibleConstructorReturn","_getPrototypeOf","State","cname","cvalue","Date","setTime","getTime","expires","toUTCString","document","cookie","_step","_iterator","_createForOfIteratorHelper","split","s","_cstr$split2","trim","err","cKey","concat","fetchLocal","darkModeLK","window","localStorage","setItem","JSON","stringify","getItem","parse","removeItem","requestJSON","_x","_x2","_x3","_requestJSON","_callee","method","addr","reqBody","response","_context","fetch","headers","Headers","body","status","json","requestSuccessful","t0","text","msg","postJSON","_x4","_x5","_postJSON","_callee2","data","_context2","getJSON","_x6","_getJSON","_callee3","_context3","storeLocal","popupsLK","leftMarketDockLK","locale","Errors","ID_NO_PASS_ERROR_MSG","ID_BUY","ID_SELL","ID_VERSION_NOT_SUPPORTED","ID_NO_ASSET_WALLET","ID_EXECUTED","ID_BOOKED","ID_CANCELING","ID_PASSWORD_NOT_MATCH","ID_UNKNOWN","ID_SETTLING","ID_CANCELED","ID_REVOKED","ID_NONE_SELECTED","ID_API_ERROR","ID_LOCKED","ID_INVALID_ADDRESS_MSG","ID_LIMIT_ORDER","ID_MARKET_ORDER","ID_MATCH_STATUS_REDEMPTION_SENT","ID_MATCH_STATUS_REDEMPTION_CONFIRMED","ID_MATCH_STATUS_REFUND_PENDING","ID_ORDER_ACCELERATION_ERR_MSG","ID_DISCONNECTED","ID_BROWSER_NTFN_ENABLED","ID_ORDER_BUTTON_BUY_BALANCE_ERROR","ID_ORDER_BUTTON_SELL_BALANCE_ERROR","ID_ORDER_BUTTON_QTY_ERROR","ID_ORDER_BUTTON_QTY_RATE_ERROR","ID_CREATE_ASSET_WALLET_MSG","ID_TRADING_TIER_UPDATED","ID_INVALID_TIER_VALUE","ID_MATCH_BUFFER","ID_NO_PLACEMENTS","ID_INVALID_VALUE","ID_NO_ZERO","ID_BOTTYPE_BASIC_MM","ID_BOTTYPE_ARB_MM","ID_BOTTYPE_SIMPLE_ARB","ID_CEXBALANCE_ERR","ID_PENDING","ID_COMPLETE","ID_CEX_NOT_CONNECTED","loadLocale","_loadLocale","lang","commitHash","skipCache","specs","localeSpecsKey","localeKey","prep","args","expression","replace","_","stringTemplateParser","clearLocale","removeLocal","parser","DOMParser","BipIDs","BipSymbolIDs","_i","_Object$keys","parseInt","BipSymbols","RateEncodingFactor","log10RateEncodingFactor","Math","round","log10","languages","navigator","filter","intFormatter","Intl","NumberFormat","maximumFractionDigits","fourSigFigs","minimumSignificantDigits","maximumSignificantDigits","decimalFormatters","fullPrecisionFormatters","fullPrecisionFormatter","prec","locales","formatter","formatters","min","max","fmt","minimumFractionDigits","convertToConventional","unitInfo","conventional","conversionFactor","Doc","_blink","_animate","el","id","querySelector","ev","opts","_step2","_iterator2","addEventListener","removeEventListener","html","parseFromString","contains","target","rect","getBoundingClientRect","pageX","left","right","pageY","top","bottom","box","docEl","documentElement","scrollTop","scrollLeft","offsetWidth","h","offsetHeight","bodyTop","bodyLeft","width","height","centerX","centerY","parent","kid","parentMetrics","layoutMetrics","kidMetrics","_len","els","_key","_i2","_els","firstChild","removeChild","ancestor","empty","_len2","kids","_key2","_i3","_kids","appendChild","_len3","_key3","_i4","_els2","classList","add","_len4","_key4","_i5","_els3","remove","timeout","_this","_len5","_key5","show","setTimeout","hide","vis","_len6","_key6","duration","easingAlgo","Animation","wait","_ref","_ref2","g","b","isDark","animate","style","outline","querySelectorAll","children","console","warn","createElement","_step3","_iterator3","applySelector","vAtomic","_convertToConventiona2","Number","isInteger","format","decimalFormatter","encRate","bui","qui","rateStepEnc","convRate","rateStepDigits","floor","maxDecimals","sigFigFormatter","_sigFigFormatter$form","_sigFigFormatter$form2","formatToParts","part","type","formatSigFigsWithFormatters","_convertToConventiona6","rate","intl","atoms","ui","prefs","unitFactors","_unitFactors","atomicUnit","unit","denominations","alt","resolveUnitConversions","logDiffs","entryDiff","entry","abs","_i6","_Object$entries","entries","best","reduce","cFactor","_this$bestConversion2","bestConversion","_this$bestConversion4","formatFourSigFigs","assetID","formatBestValueElement","setText","feeRateDenom","_this$formatBestUnits2","formatBestUnitsFourSigFigs","span","safeSelector","dataset","baseUnitInfo","quoteUnitInfo","_ref3","symbol","indexOf","substring","bipSymbol","parts","logoPath","asset","useLogo","ticker","symbolSpan","textContent","toUpperCase","parentSymbol","parentLogo","src","parentSup","selector","_step4","_iterator4","_step5","_iterator5","_len7","tmpls","_key7","forEach","tmpl","removeAttribute","_step6","_iterator6","ms","formatDuration","secs","padStart","dur","mo","seconds","result","count","_timeMod2","timeMod","aYear","_timeMod4","aMonth","_timeMod6","aDay","_timeMod8","anHour","_timeMod10","aMinute","_timeMod12","_len8","inputFields","_key8","_i7","_inputFields","inputField","passive","display","amount","formatFiatConversion","parentElement","thread","run","_stopAndWait","_wait","_run","easer","start","end","range","frameDuration","now","Easing","linear","Forever","MAX_SAFE_INTEGER","endAnimation","runCompletionFunction","sleep","_x7","_callee4","_context4","_callee5","_context5","easeIn","easeOut","easeInHard","easeOutHard","easeOutElastic","c4","PI","pow","sin","WalletIcons","stateElement","icons","sleeping","locked","unlocked","nowallet","syncing","nopeers","disabled","tooltip","wallet","syncIcon","running","peerCount","synced","syncProgress","toFixed","setSyncing","open","error","AniToggle","toggle","errorEl","initialState","callback","_this2","_ref4","_callee6","newState","_context6","stopPropagation","toggling","_x8","setState","state","NumberInput","input","_opts$prec","_opts$changed","_opts$min","_this3","sigFigs","toFourSigFigs","toPrecision","changed","set","inputChanged","_fmt2","parseFloatDefault","IncrementalInput","_NumberInput","_super","_opts$inc","_this4","inc","up","down","increment","sign","MiniSlider","_this5","color","track","ball","button","preventDefault","startX","clientWidth","startLeft","trackMouse","ee","mouseUp","unbind","x","clamp","ord","endsWith","maxPrec","inputValue","defaultValue","parseFloat","setupCopyBtn","_x9","_x10","_x11","_x12","_setupCopyBtn","_callee7","txt","textEl","btnEl","textOriginalColor","btnOriginalColor","_context7","clipboard","writeText","application","orderOptTmpl","booleanOptTmpl","rangeOptTmpl","BasePage","ConnectionStatus","ApprovalStatus","PeerSource","PrepaidBondID","app","setOptionTemplates","page","threeSigFigs","Option","opt","report","node","cloneNode","parseTemplate","optName","displayname","description","chainIcon","on","enable","disable","BooleanOption","_Option","_createSuper","dict","Error","cfg","control","controls","reason","store","XYRangeOption","_Option2","_super2","xyRange","setVal","handler","XYRangeHandler","selected","settingsDict","settingsKey","setValue","initVal","_opts$settingsKey","_opts$selected","_opts$updated","rangeLblStart","label","rangeLblEnd","xUnit","yUnit","roundX","Boolean","roundY","setDisabled","updated","convert","slider","handle","rangeX","rangeY","normalizeX","scrollingX","accept","skipUpdate","clickOutX","xInput","xx","focus","clickOutY","yInput","yy","emit","skipChange","sliderBox","_cfg","rEffective","sellString","sell","toLowerCase","toLocaleLowerCase","typeString","tif","isMarketBuy","hasActiveMatches","order","matches","active","statusString","isLive","cancelling","filled","qty","match","isCancel","settled","side","averageMarketOrderRateString","_ord$matches","rateStr","formatCoinValue","conventionalRate","baseID","quoteID","averageRate","_ord$matches2","rateProduct","baseQty","baseToQuote","base","revokedMatchStatus","matchStatus","isCancellable","PIPI","plusChar","fromCharCode","minusChar","darkTheme","axisLabel","gridBorder","gridLines","gapLine","zoom","zoomHover","sellLine","buyLine","sellFill","buyFill","crosshairs","legendFill","legendText","lightTheme","Chart","reporters","theme","canvas","visible","ctx","getContext","textAlign","textBaseline","mousePos","clientX","clientY","draw","ResizeObserver","resize","observe","wheelLimiter","wheel","click","setVis","visibilityState","renderScheduled","unattachers","clearRect","render","deltaY","clientHeight","plotExtents","Extents","xLblExtents","yLblExtents","plotRegion","Region","xRegion","yRegion","requestAnimationFrame","bigger","fontSize","font","fillStyle","labels","minX","maxX","unitLines","extents","plot","tools","applyLabelStyle","lastX","unitCenter","leftEdge","rightEdge","lbls","lbl","measureText","val","fillText","lineWidth","strokeStyle","line","minY","maxY","_this6","fillRect","save","beginPath","roundRect","fill","restore","lastY","xPad","region","_this7","step","valFmt","yLabels","makeLabels","dataExtents","yAxisWidth","widest","x0","y0","x1","y1","skipStroke","radius","dot","DepthChart","_Chart","_this8","resized","clicked","zoomed","zoomLevel","lines","markers","buys","sells","setZoomBttns","zoomInBttn","zoomOutBttn","book","wheeled","translator","unx","lotSize","conventionalRateStep","baseUnit","quoteUnit","_this$gap2","gap","midGap","gapWidth","minZoom","_this9","clear","_this$gap4","halfWindow","high","low","buyMarkers","sellMarkers","sort","buyDepth","buyEpoch","sellDepth","sellEpoch","volumeReport","buyBase","buyQuote","sellBase","sellQuote","sum","epochSum","epoch","floatCompare","shift","buySum","last","epochBuySum","sellSum","epochSellSum","growthFactor","mouseData","xLabels","plotXGrid","makeYLabels","plotYGrid","topCenterX","midX","topCenterY","zoomPct","xRange","zoomText","bttnLeft","bttnTop","bttnSize","setExtents","hover","midY","tolerance","hoverMarkers","_arr","marker","hovered","withinTolerance","size","tip","sqrt","moveTo","lineTo","closePath","stroke","dataX","evalSide","trigger","ptX","dotColor","bestDepth","pt","setLineDash","depth","drawDepth","plotYLabels","plotXLabels","volume","mouse","firstPt","yZero","globalAlpha","bestGapBuy","bestGapSell","CandleChart","_Chart2","_this10","numToShow","_this11","ext","candleExtents","yRange","candleRegion","volumeExtents","volumeRegion","resizeTimer","clearTimeout","idx","zoomLevels","candles","_app$assets$this$mark","_this12","candleWidth","allCandles","truncate","endStamp","paddedStart","paddedWidth","first","highRate","lowRate","matchVolume","highVol","xStart","xEnd","rateStep","market","ratestep","mouseCandle","selectedStartStamp","rFactor","rateConversionFactor","assets","baseid","basesymbol","screenW","diff","tick","zoneOffset","getTimezoneOffset","dayStamp","lastDay","lastYear","pts","months","getMonth","getDate","getHours","getMinutes","year","getFullYear","makeCandleTimeLabels","volDataExtents","desc","startRate","endRate","_ref5","cx","strokeRect","yExt","rangeTxt","toLocaleString","rangeWidth","xExt","rectArgs","rangeHeight","_ref6","qFactor","bFactor","maxCandles","Wave","_Chart3","_super3","_this13","zIndex","random","colorShift","amplitudes","ks","speeds","phases","single","angularX","angularTime","cos","ani","drawValues","_ref7","cw","ch","message","ypad","halfH","msgRegion","_this14","hsl","_this$canvas","_this$opts","bg","backgroundColor","lineCap","grad","createLinearGradient","addColorStop","prog","xMin","xMax","yMin","yMax","context","screenMinX","screenMaxY","screenH","xFactor","yFactor","_y2","uny","_w2","_h2","drawFunc","skipMask","clip","spacingGuess","tickGuess","absMax","unitW","arr","arc","ReputationMeter","div","cleanTemplates","penaltyMarkerTmpl","host","_app$exchanges$host","exchanges","auth","maxScore","penaltyThreshold","score","rep","displayTier","strongTier","minScore","warnPct","scoreWarn","pos","scorePointer","scoreMin","scoreMax","bonus","limitBonus","scoreTray","markerPct","scoreData","weakStrength","targetTier","effectiveTier","preparcelQuantity","mkt","_mkt$spot","_mkt$spot2","spot","bookVolume","lotsize","parcelWeight","_mkt$spot3","likelyTaker","epochWeight","bookWeight","settlingWeight","coinIDTakerFoundMakerRedemption","ethBasedExplorerArg","cid","startsWith","ethExplorers","_ethExplorers","_ethBasedExplorerArg2","arg","_ethBasedExplorerArg4","_ethBasedExplorerArg6","polygonExplorers","_polygonExplorers","_ethBasedExplorerArg8","_ethBasedExplorerArg10","_ethBasedExplorerArg12","CoinExplorers","_cid$split2","txid","vout","_cid$split4","_cid$split6","_2","_3","_4","_5","_6","_7","_8","_9","_10","formatCoinID","makerAddr","setCoinHref","link","net","user","assetExplorer","token","parentID","baseChainID","href","explorerCoin","GapStrategyMultiplier","GapStrategyAbsolute","GapStrategyAbsolutePlus","GapStrategyPercent","GapStrategyPercentPlus","botTypeBasicMM","botTypeArbMM","botTypeBasicArb","CEXDisplayInfos","logo","MM","MarketMakerBot","_cexBalance","_status","_stopBot","_startBot","_report","_removeBotConfig","_updateCEXConfig","_updateBotConfig","config","startTime","_Object$values","mmStatus","bots","botStatus","runStats","cexName","_this$cexBalanceCache","cexBalanceCache","_callee8","cexBalance","_context8","runningBotInventory","_c$assetID$locked","_c$assetID","_c$assetID$reserved","_c$assetID2","_c$assetID$available","_c$assetID3","_d$assetID$locked","_d$assetID","_d$assetID$reserved","_d$assetID2","_d$assetID$available","_d$assetID3","_d$assetID$available2","_d$assetID4","_c$assetID$available2","_c$assetID4","_d$assetID$locked2","_d$assetID5","_c$assetID$locked2","_c$assetID5","dexBalances","cexBalances","cex","reserved","avail","available","total","dex","setMarketElements","_app$assets$baseID","baseName","baseSymbol","baseToken","setSrc","_app$assets","baseFeeUI","baseFeeName","baseFeeSymbol","_app$assets$quoteID","quoteName","quoteSymbol","quoteToken","_app$assets2","quoteFeeUI","quoteFeeName","quoteFeeSymbol","setCexElements","dinfo","img","calculateQuoteLot","baseRate","fiatRatesMap","quoteRate","OrderUtil","PlacementsChart","loadedCEX","cexLogo","Image","_cfg$dict","buyPlacements","sellPlacements","profit","baseFiatRate","botType","drawDashedLine","isBasicMM","cexGapL","cexGapR","buyLots","lots","sellLots","maxLots","fauxSpacer","leftmost","gapFactor","rightmost","ps","matchBuffer","minRange","maxCommitUSD","regionHeight","log","drawImage","plotSide","isBuy","placements","reg","_ref8","sideFactor","firstX","cumulativeLots","rawX","xInfinity","hostedMarketID","liveBotConfig","liveBotStatus","statuses","sumLots","BotMarket","find","_ref9","_app$assets$baseID2","baseTicker","baseFactor","baseFeeID","_app$assets$this$base","baseWallet","baseIsAccountLocker","traits","baseFeeTicker","baseFeeFactor","_app$assets$quoteID2","quoteTicker","quoteFactor","quoteFeeID","_app$assets$this$quot","quoteWallet","quoteIsAccountLocker","quoteFeeTicker","quoteFeeFactor","mktID","_markets$this$mktID","markets","lotSizeConv","quoteLot","quoteLotConv","baseFeeFiatRate","quoteFeeFiatRate","arbMarketMakingConfig","baseLots","quoteLots","nBuyPlacements","nSellPlacements","simpleArbConfig","uiConfig","simpleArbLots","basicMarketMakingConfig","_initialize","_callee9","res","_context9","marketReport","lotSizeUSD","quoteLotUSD","quoteFiatRate","proj","projectedAllocations","botCfg","latestEpoch","cexProblems","cexBaseBalance","cexQuoteBalance","_ref10","walletMap","_ref11","bInv","qInv","cexBaseAvail","cexQuoteAvail","cexes","balances","dexBaseAvail","balance","dexQuoteAvail","baseAvail","quoteAvail","baseFeeWallet","quoteFeeWallet","baseFeeAvail","dexBaseFeeAvail","cexBaseFeeAvail","bFeeInv","quoteFeeAvail","dexQuoteFeeAvail","cexQuoteFeeAvail","qFeeInv","_this$marketReport","baseFees","quoteFees","_this$cfg$uiConfig","baseConfig","quoteConfig","feesAndCommit","orderReservesFactor","_this$cfg$uiConfig2","_this$feesAndCommit","commit","fees","bProj","bookingFees","swapFeeReserves","orderReserves","slippageBuffer","qProj","quote","tokenFeesPerSwap","swapFeeN","slippageBufferFactor","alloc","addAlloc","amt","_alloc$assetID","_this$proj","cexRebalance","_this$adjustedBalance","adjustedBalances","canRebalance","cexMinBaseAlloc","_ref12","dexMinBaseAlloc","transferableBaseAlloc","dexBaseFeeReq","_ref13","dexMinQuoteAlloc","cexMinQuoteAlloc","transferableQuoteAlloc","dexQuoteFeeReq","basis","dexBaseFunded","cexBaseFunded","dexQuoteFunded","cexQuoteFunded","totalBaseReq","totalQuoteReq","baseFundedAndBalanced","quoteFundedAndBalanced","baseFeesFunded","quoteFeesFunded","fundedAndBalanced","fundedAndNotBalanced","req","funded","transferable","starved","RunningMarketMakerDisplay","forms","elements","orderReportFormEl","orderReportForm","idDescendants","dexBalancesRowTmpl","placementRowTmpl","placementAmtRowTmpl","stopBttn","runLogsBttn","_this4$mkt","loadPage","returnPage","buyOrdersBttn","showOrderReport","sellOrdersBttn","_setBotMarket","_setMarket","_stop","_callee10","_this$mkt","loaded","_context10","loading","stopBot","_callee11","_context11","_ref14","initialize","setBotMarket","_x13","_x14","_x15","_callee12","_basicCfg$gapStrategy","_ref15","_cfg$arbMarketMakingC","_cfg$arbMarketMakingC2","_cfg$simpleArbConfig","_this$mkt2","basicCfg","gapStrategy","_context12","baseFeeReservesBox","quoteFeeReservesBox","baseFeeLogo","quoteFeeLogo","profitTrigger","profitLabel","gapLabel","multiplierLabel","profitUnit","gapUnit","multiplierUnit","update","readBook","_x16","_this$mkt3","_this$mkt4","currentForm","currentFormID","orderReport","displayedOrderReportFormSide","buysReport","sellsReport","updateOrderReport","epochNum","close","_this$mkt5","problems","runTime","hmsSince","_runStats$feeGap","_runStats$feeGap2","_runStats$feeGap4","_this$mkt6","_this$mkt6$marketRepo","_this$mkt$status","_this$mkt$status$botC","bmmCfg","stats","cexRow","pendingDepositBox","pendingWithdrawalBox","setTicker","setInterval","setSignedValue","profitLoss","profitRatio","profitSign","plSign","summedBalance","pending","dexBaseInv","walletBaseInventory","walletBaseInvFiat","dexQuoteInv","walletQuoteInventory","walletQuoteInvFiat","cexBaseInv","cexBaseInventory","cexBaseInventoryFiat","cexQuoteInv","cexQuoteInventory","cexQuoteInventoryFiat","feeBalance","baseFeeReserves","quoteFeeReserves","pendingDeposits","pendingWithdrawals","completedMatches","tradedUSD","tradedUSDBox","roundTripFeesBox","roundTripFeesUSD","feeGap","roundTripFees","basisPrice","displayFeeGap","feeGapBox","_runStats$feeGap3","feeGapPct","gapStrategyBox","remoteGap","remoteGapBox","remoteGapPct","buyOrdersReportBox","allPlaced","allOrdersPlaced","buyOrdersSuccess","buyOrdersFailed","sellOrdersReportBox","sellOrdersSuccess","sellOrdersFailed","preOrderProblemMessages","botProblemMessages","preOrderProblems","cexErrorMessages","msgs","depositErr","_Object$entries3","_Object$entries3$_i","assetSymbol","time","stamp","withdrawErr","_i8","_Object$entries4","_Object$entries4$_i","tradeErr","cexProblemMessages","allMessages","preOrderProblemsBox","spanEl","clearInterval","form","sideTxt","orderReportTitle","orderReportError","orderReportDetails","problemMessages","_problemMessages","dexBalancesBody","placementsBody","createRow","row","rowTmpl","assetLogo","availableDexBals","required","requiredDexBals","remaining","remainingDexBals","used","usedDexBals","deficiency","safeSub","deficiencyWithPending","assetIDs","includes","cexAsset","totalDeficiency","rows","_assetIDs","_createRow2","dexDeficiencyHeader","dexDeficiencyWithPendingHeader","setDeficiencyVisibility","cexSection","counterTradeRateHeader","requiredCEXHeader","usedCEXHeader","cexDisplayInfo","cexBalancesTitle","cexAssetID","cexAssetLogo","availableCexBal","requiredCexBal","remainingCexBal","pendingCexBal","reservedCexBal","usedCexBal","deficiencyCexBal","deficiencyWithPendingCexBal","cexAvailable","cexLocked","cexRequired","cexRemaining","cexPending","cexUsed","deficient","cexDeficiencyHeader","cexDeficiencyWithPendingHeader","cexDeficiency","cexDeficiencyWithPending","anyErrors","errorHeader","createPlacementRow","placement","priority","baseUI","quoteUI","formatRateFullPrecision","standingLots","orderedLots","counterTradeRate","_assetIDs2","requiredAmt","requiredDex","usedAmt","usedDex","requiredRow","requiredRowTmpl","usedRow","usedRowTmpl","requiredDEX","usedDEX","requiredCEX","usedCEX","requiredCex","usedCex","errMessages","join","_this$mkt7","orders","nBookedOrders","vEl","signEl","baseOrderReservesFactor","quoteOrderReservesFactor","baseTokenFeesPerSwap","baseRedeemReservesPerLot","estimated","swap","redeem","baseBookingFeesPerLot","refund","quoteTokenFeesPerSwap","quoteRedeemReservesPerLot","quoteBookingFeesPerLot","baseReservesFactor","quoteReservesFactor","baseBookingFees","baseRedeemFees","quoteBookingFees","quoteRedeemFees","_objectSpread","bookingFeesPerLot","bookingFeesPerCounterLot","swapReservesFactor","redeemReservesFactor","dexHost","walletNotSynced","_Object$entries$_i","noWalletPeers","_Object$entries2","_Object$entries2$_i","accountSuspended","userLimitTooLow","noPriceSource","cexOrderbookUnsynced","causesSelfMatch","unknownError","mmstatus","Forms","formsDiv","closed","mouseInElement","keyup","_show","animationLength","progress","closedForm","NewWalletForm","success","backFunc","goBack","walletTabTmpl","subform","WalletConfigForm","walletSettings","walletCfgGuide","tmplElement","submitAdd","submit","oneBttn","registerNoteFeeder","walletstate","note","reportWalletState","walletsync","parentSyncer","createwallet","reportCreationUpdate","_loadDefaults","_setError","_update","_setAsset","_runParentSync","_submit","_createWallet","createUpdater","walletType","parentForm","createForm","pass","newWalletPass","map","_this$current","parentAsset","selectedDef","newWalletErr","current","createWallet","checkResponse","setError","runParentSync","_this$current2","parentSyncPct","parentName","childName","childLogo","mainForm","parentSyncing","syncParent","reject","topic","subject","details","tabs","_this$current3","winfo","pinfo","walletDefs","_loop","parseAsset","walletTypeTabs","assetName","tokenMsgBox","tokenParentLogo","tokenParentName","info","availablewallets","wDef","tab","t1","bindTooltips","walletCreationPending","walletDef","guideLink","configOpts","containsRequired","_this$current4","displayCreateBtn","parentAndTokenOpts","tokenOpts","tokenOptsCopy","walletPassAndSubmitBttn","oneBttnBox","newWalletPassBox","guidelink","configopts","isBirthdayConfig","seedGenTime","toUnixDate","seeded","walletSettingsHeader","noauth","regAsset","setGuideLink","fileSelector","loadDefaults","errMsg","_this$current5","configID","configpath","setLoadedConfig","dynamicInputCounter","sectionize","configElements","allSettings","dynamicOpts","textInputTmpl","dateInputTmpl","checkboxTmpl","repeatableTmpl","fileInput","showOther","showIcon","hideIcon","showHideMsg","otherSettings","loadedSettingsMsg","loadedSettings","defaultSettingsMsg","defaultSettings","fileInputChanged","setOtherSettingsViz","_fileInputChanged","_this$dynamicOpts","files","loadedOpts","defaultOpts","configtext","append","setConfig","reorder","insertAfter","skipRepeatN","_app$extensionWallet","isboolean","isdate","repeatable","addOpt","repeatN","extensionWallet","hiddenFields","configKey","elID","htmlFor","prepend","logoPathFromID","after","noecho","autocomplete","checked","getMinMaxVal","minMax","dateToString","date","disablewhenactive","assetHasActiveOrders","activeOrders","defaultedOpts","_step7","_iterator7","finds","handledRepeatables","removes","_r","vals","firstVal","newEl","_removes","splice","_this$loadedSettings","_step8","_iterator8","_step8$value","minDate","MIN_SAFE_INTEGER","maxDate","inputs","_step9","_iterator9","_step9$value","_step10","_iterator10","_step11","_iterator11","ConfirmRegistrationForm","certFile","submitForm","_submitForm","xc","tier","_asset$unitInfo$conve","bondAssetID","bondLockConventional","bondAssets","tradingTier","bondLock","bondUnit","bondLockUSDBox","bondLockUSD","feeReserves","reservesUnit","transform","opacity","offset","bondAsset","dexAddr","url","_context13","regErr","innerText","viewOnly","cert","bond","FeeAssetSelectionForm","currentBondTmpl","bondAssetTmpl","marketTmpl","tradingTierInput","setTier","acceptTier","submitTradingTier","tierUp","incrementTier","tierDown","goBackToAssets","tradingTierForm","assetForm","whatsABond","whatsABondPanel","hideWhatsABond","bondGotIt","whatsABondBack","usePrepaidBond","showPrepaidBondForm","ppbGoBack","hidePrepaidBondForm","submitPrepaidBond","walletCreated","_submitPrepaidBond","_animate2","tradingTierErr","regAssetErr","assetRows","marketRows","prepaidBonds","clearErrors","addBondRow","_asset$unitInfo$conve2","tr","assetSelected","feeSymbol","bondSizeConventional","feeAmt","fiatRate","fiatBox","fiatBondAmount","ready","addMarketRow","quoteid","_step12","_xc$assets$baseID","_xc$assets$quoteID","_iterator12","_step13","_iterator13","baseLogo","quoteLogo","parcelSize","parcelsize","conventionalLotSize","startingLimit","privilegedLimit","tradeLimitLow","tradeLimitHigh","fiatTradeLimitLow","fiatTradeLimitHigh","fiatTradeLowBox","fiatTradeHighBox","_Object$values$_i","_Object$values2","validBondAssetSelected","_xc$auth","setReadyMessage","setExchange","selectedAssetID","_this$page","_page$tradingTierInpu","_app$assets$assetID","_ui$conventional","raw","setTierError","bondSizeDisplay","_step14","_iterator14","_step15","_iterator15","bondLockDisplay","fiatLockDisplay","_Object$values3","currentBondAmts","assetIDStr","_wallet$balance","bonded","bondlocked","bondReserves","haveLock","currentBondBox","currentBonds","_i9","bondLocked","_app$assets$_assetID","_ui$conventional2","icon","fiatAmt","fiatLockBox","_page$tradingTierInpu2","_input$value","_callee13","regAssetElements","_context14","_i10","_regAssetElements","marginTop","prepaidBondErr","prepaidBondCode","_callee14","code","_context15","WalletWaitForm","progressCache","progressed","reportProgress","reportBalance","bondFeeBuffer","parentAssetSynced","_asset$wallet","bal","address","_step16","symbolize","_iterator16","depoAddr","syncUncheck","syncCheck","balUncheck","balCheck","syncRemainBox","bondCostBreakdown","balanceBox","bondLockNoFees","bondLockFees","need","reservesDeficit","totalForBond","sendEnough","txFeeBox","sendEnoughForToken","txFeeBalanceBox","sendEnoughWithEst","txFee","parentFees","tokenFees","txFeeUnit","parentUnit","parentBalUnit","parentBal","fee","syncSpinner","parentAvail","syncRemaining","syncFinishingUp","cache","progDelta","progRate","toGoTime","syncRemain","AccelerateOrderForm","accelerateSubmit","submitEarlyConfirm","sendAccelerateRequest","_updateAccelerationEstimate","_refresh","_submit2","_sendAccelerateRequest","earlyAcceleration","recentAccelerationTime","timePast","recentSwapTime","wasAcceleration","recentAccelerationMsg","recentSwapMsg","configureAccelerationDiv","accelerateErr","earlyAccelerationDiv","_callee15","_context16","orderID","newRate","acceleratedRate","accelerateMainDiv","accelerateTxID","txID","preAccelerateErr","accelerateMsgDiv","accelerateSuccess","_callee16","_context17","displayEarlyAccelerationMsg","_callee17","preAccelerate","updateRate","rangeHandler","_context18","feeEstimateDiv","currencyUnit","suggestedRange","accelerateAvgFeeRate","swapRate","accelerateCurrentFeeRate","suggestedRate","newY","updateAccelerationEstimate","sliderContainer","_callee18","_context19","feeRateEstimate","feeEstimate","DEXAddressForm","dexToUpdate","certPicker","CertificatePicker","skipRegistration","showOrHideSubmitBttn","showCustom","customBox","knownExchanges","knownXCs","_step17","_iterator17","_loop2","_step18","_iterator18","checkDEX","addDexHdr","skipRegistrationBox","updateDexHdr","refresh","_checkDEX","_animate3","clearCertFile","pickServerMsg","addCustomMsg","_step19","_iterator19","isDisplayed","_this$page$skipRegist","_callee19","_context20","_callee20","endpoint","_context21","file","newHost","oldHost","needCert","fetchUser","paid","pendingBonds","DiscoverAccountForm","_this15","_checkDEX2","_animate4","_callee21","_context22","_callee22","_context23","LoginForm","_this16","login","handleLoginNote","_animate5","_submit3","loginMsg","idel","pw","_callee23","_context24","showFormError","notes","pokes","loggedIn","_callee24","_context25","DepositAddress","_this17","unifiedReceiverTmpl","newDepAddrBttn","_callee25","_context26","newDepositAddress","isSecureContext","copyAddressBtn","copyAddress","_copyAddress","_newDepositAddress","_setAsset2","_callee26","_context27","depositTokenMsgBox","addrUsed","depositLogo","depositName","depositTokenParentLogo","depositTokenParentName","newDepAddrBttnBox","setAddress","_this18","unifiedReceivers","receivers","_loop3","_i11","recvType","recv","_i12","_arr2","bttn","setCentralAddress","unified","depositAddress","qrcode","_callee27","_context28","tx","recipient","_callee28","_context29","copyAlert","AppPassResetForm","_this19","resetAppPWSubmitBtn","resetAppPW","_resetAppPW","_callee29","newAppPW","confirmNewAppPW","_this20","_context30","newAppPassword","confirmNewAppPassword","appPWResetErrMsg","newPass","seed","seedInput","appPWResetSuccessMsg","_this21","selectedCert","onCertFileChange","removeCert","addCert","_file","_onCertFileChange","_callee30","_context31","_callee31","_context32","TokenApprovalForm","_this22","approve","_approve","_setAsset3","_callee32","_tokenAsset$token","tokenAsset","protocolVersion","_app$assets$parentID","_app$assets$parentID$","feeText","_context33","submissionElements","txMsg","addressBox","tokenSymbol","version","approving","parentTicker","_callee33","_context34","CEXConfigurationForm","_this23","cexSubmit","_submit4","cexConfigPrompt","cexConnectErrBox","cexFormErr","cexApiKeyInput","cexSecretInput","cexStatus","connectErr","cexConnectErr","apiKey","apiSecret","_callee34","_e$msg","_context35","updateCEXConfig","slideSwap","_slideSwap","_callee35","form1","form2","_context36","showSuccess","successMessage","checkmarkForm","checkmark","startR","startG","startB","diffR","diffG","diffB","submitBttn","wrapper","dateApplyOffset","toISOString","RegistrationPage","_BasePage","_newWalletCreated","_registerDEXSuccess","_getCertFile","_getBondsFeeBuffer","_animateConfirmForm","_animateRegAsset","_requestFeepayment","_auth","dexAddrForm","discoverAcctForm","resetPassFormCloser","newWalletForm","newWalletCreated","confirmRegisterForm","animateRegAsset","requestFeepayment","regAssetForm","bondsFeeBuffer","registerDEXSuccess","getBondsFeeBuffer","setAsset","animateConfirmForm","walletWaitForm","setWallet","walletWait","confirmRegForm","authed","oldForm","feeBuffer","updateMenuItemsDisplay","backTo","bondAmt","LoginPage","_loggedIn","loginForm","prepAndDisplayLoginForm","resetAppPWForm","appPassResetForm","forgotPassBtn","traitFundsMixer","ticketStatusTranslationKeys","positiveTxTypes","negativeTxTypes","noAmtTxTypes","txTypeSignAndClass","txType","txTypeTranslationKeys","txTypeString","ticketPageSize","WalletsPage","_confirmForceSubmit","_recoverWallet","_displayRestoreWalletInfo","_exportWalletAuthSubmit","_displayExportWalletAuth","_downloadLogs","_lock","_reconfig","_send","_populateMaxSend","_doConnect","_showSendForm","_showDeposit","_showReconfig","_openWallet","_rescanWallet","_loadEarlierTxs","_showTxHistory","_getTxHistory","_showRecentActivity","_updateMixerState","_updatePrivacy","_prevTicketPage","_nextTicketPage","_showTicketHistory","_ticketPageN","_setVSP","_purchaseTickets","_showVSPPicker","_updateTicketBuyer","_checkNeedsProvider","_setSelectedAsset","_showNewWallet","_showSuccess2","_showForm","_showBox","_toggleWalletStatus","_spinUntilPeersUpdate","_submitAddPeer","_showManagePeersForm","_updateWalletPeersTable","_showUnapproveTokenAllowanceTableForm","_showUnapproveTokenAllowanceForm","_submitUnapproveTokenAllowance","_validateSendAddress","_cancelSend","_stepSend","_safePost","stampers","secondTicker","timeSince","setStamp","restoreInfoCard","connectedIconTmpl","disconnectedIconTmpl","removeIconTmpl","closePopups","cancelForce","iconSelectTmpl","balanceDetailRow","recentOrderTmpl","vspRowTmpl","ticketHistoryRowTmpl","votingChoiceTmpl","votingAgendaTmpl","tspendTmpl","tkeyTmpl","txHistoryRowTmpl","txHistoryDateRowTmpl","showNewWallet","connectBttn","doConnect","send","showSendForm","receive","showDeposit","unlockBttn","openWallet","lockBttn","lock","reconfigureBttn","showReconfig","needsProviderBttn","rescanWallet","earlierTxs","loadEarlierTxs","copyTxIDBtn","_this$currTx","currTx","txDetailsID","copyRecipientBtn","_this$currTx2","txDetailsRecipient","copyBondIDBtn","_this$currTx3","_this$currTx3$bondInf","bondInfo","bondID","txDetailsBondID","copyBondAccountIDBtn","_this$currTx4","_this$currTx4$bondInf","accountID","txDetailsBondAccountID","hideMixTxsCheckbox","showTxHistory","fmtParams","assetUpdated","sortAssetButtons","updateTicketBuyer","updatePrivacy","reconfigForm","reconfigInputs","bindForm","sendForm","submitSendForm","stepSend","vSendForm","vSend","submitReconfig","reconfig","mixerToggle","toggleMixer","mixingErr","updateMixerState","downloadLogs","exportWallet","displayExportWalletAuth","recoverWallet","showRecoverWallet","exportWalletAuth","exportWalletAuthSubmit","recoverWalletConfirm","recoverWalletSubmit","confirmForce","confirmForceSubmit","disableWallet","showToggleWalletStatus","enableWallet","toggleWalletStatusConfirm","toggleWalletStatusSubmit","toggleWalletStatus","managePeers","showManagePeersForm","addPeerSubmit","submitAddPeer","unapproveTokenAllowance","showUnapproveTokenAllowanceTableForm","unapproveTokenSubmit","submitUnapproveTokenAllowance","showVSPs","showVSPPicker","vspDisplay","vspPicker","customVspSubmit","setCustomVSP","purchaseTicketsBttn","showPurchaseTicketsDialog","purchaseTicketsForm","purchaserSubmit","purchaseTickets","purchaserInput","purchaserInputChanged","ticketHistory","showTicketHistory","ticketHistoryNextPage","nextTicketPage","ticketHistoryPrevPage","prevTicketPage","setVotes","showSetVotesDialog","purchaseTicketsErrCloser","purchaseTicketsErrBox","privacyInfoBttn","showForm","mixingInfo","depositAddrForm","deposit","walletBal","populateMaxSend","sendAmt","showFiatValue","sendValue","maxSend","sendAddr","validateSendAddress","showChangePW","changeWalletPW","setPWSettingViz","changeWalletTypeSelect","changeWalletType","showChangeType","isHidden","changeTypeHideIcon","changeTypeShowIcon","changeTypeMsg","skipAnimation","fiatrateupdate","handleRatesNote","handleBalanceNote","handleWalletStateNote","walletconfig","updateSyncAndPeers","handleCreateWalletNote","walletnote","handleCustomWalletNote","selectedAsset","selectedAssetLK","setSelectedAsset","txHistoryTableBody","age","timestamp","animation","path","subtract","txfee","_app$assets$token$par","feeUI","xcRate","totalSend","_bal","vSendErr","sendErr","vSendEstimates","txFeeNotAvailable","subtractCheckBox","ok","validaddress","vSendSymbol","vSendLogo","vSendFee","formatFullPrecision","vSendFeeFiat","vSendDestinationAmt","vTotalSend","vTotalSendFiat","vSendAddr","balanceAfterSend","balanceAfterSendFiat","approxSign","resp","changePW","switchPWMsg","versionToDEXes","exchange","exchangeAsset","unapprovingTokenVersion","unapproveTokenErr","unapproveTokenTxID","unapproveTokenSubmissionElements","unapproveTokenTxMsg","tokenAllowanceRemoveSymbol","tokenAllowanceRemoveVersion","unapprovalFeeEstimate","unapproveTokenForm","showTable","approved","tokenVersionBody","tokenVersionTableAssetSymbol","assetVersionUsedByDEXes","approvalStatus","removeIcon","Approved","tokenVersionRow","usedBy","showUnapproveTokenAllowanceForm","tokenVersionTable","tokenVersionNone","unapproveTokenTableForm","peers","defaultText","addedText","discoveredText","peerSpinner","managePeersErr","peersTableBody","source","peer","connectionIcon","peerTableRow","WalletDefault","UserAdded","Discovered","connected","spinUntilPeersUpdate","updateWalletPeersTable","managePeersForm","addPeerInput","toggleWalletStatusErr","walletStatusDisable","disableWalletMsg","walletStatusEnable","enableWalletMsg","successMsg","activeOrdersErr","focuser","displayed","defaultsLoaded","assetButtons","assetSelect","sortedAssets","_ref18","aBal","bBal","aTotal","immature","bTotal","localeCompare","_ref19","aFiat","bFiat","updateAssetButton","_tmpl$img","_this$assetButtons$as","noWallet","symbolParts","_tmpl$parentImg","parentImg","totalBalance","_Doc$formatBestUnitsF2","fiat","updateDisplayedAsset","showAvailableMarkets","showRecentActivity","_app$assets$assetID2","fiatBalanceBox","walletDetails","sendReceive","connectBttnBox","statusLocked","statusReady","statusOff","unlockBttnBox","lockBttnBox","peerCountBox","syncProgressBox","statusDisabled","tokenInfoBox","needsProviderBox","feeStateBox","txSyncBox","txProgress","txFindingAddrs","checkNeedsProvider","contractAddress","updateDisplayedAssetBalance","feeState","walletDefinition","updateFeeState","walletDetailsBox","_app$walletMap$assetI","syncStatus","encrypted","haveActiveOrders","txs","blocks","targetHeight","_app$assets$assetID3","feeAssetID","feeFiatRate","formatBestRateElement","feeStateNetRate","feeStateSendFees","feeStateSwapFees","feeStateRedeemFees","feeStateXcRate","sendFiat","feeStateSendFiat","swapFiat","feeStateSwapFiat","redeemFiat","feeStateRedeemFiat","needs","needsCustomProvider","blink","_callee36","_app$assets$assetID4","stakeStatus","_context37","ticketPage","number","history","scanned","stakingBox","pickVSP","stakingSummary","stakingErr","vspDisplayBox","ticketPriceBox","purchaseTicketsBox","stakingRpcSpvMsg","ticketsDisabled","safePost","stakingAgendaCount","stances","agendas","stakingTspendCount","tspends","purchaserCurrentPrice","ticketPrice","purchaserBal","updateTicketStats","votingSubsidy","disableStaking","extensionModeAppName","extensionModeConfig","setVSPViz","vsp","vspURL","isRPC","liveTicketCount","tickets","tkt","stakingTicketCount","immatureTicketCount","mempool","immatureTicketCountBox","queuedTicketCount","queued","formQueuedTix","formQueueTixBox","queuedTicketCountBox","totalTicketCount","ticketCount","totalTicketRewards","totalRewards","totalTicketVotes","votes","_callee37","vsps","_context39","vspPickerList","_context38","feeRate","feePercentage","voting","setVSP","purchaserErr","_callee38","_context40","walletNote","_ref20","payload","purchaseTicketsErr","_callee39","_context41","customVspUrl","pgNum","startOffset","pageOfTickets","pageNumber","coinLink","ticketHistoryRows","ticketHistoryPage","_step6$value","bindUrlHandlers","price","hashStart","hash","hashEnd","detailsLinkUrl","setAttribute","_callee40","_this$ticketPage$hist","lastList","scanStart","skipN","totalTix","atEnd","_context42","blockHeight","ticketHistoryForm","ticketHistoryPagination","ticketHistoryTable","noTicketsMessage","displayTicketPage","_callee41","_context43","ticketPageN","_callee42","_context44","_callee43","_context45","_stakeStatus$stances$","votingFormErr","_ref21","_callee44","_context46","votingForm","_x17","setAgendaChoice","_ref22","_callee45","agendaID","choiceID","agenda","_context47","choices","currentChoice","_x18","_x19","votingAgendas","_loop4","_loop5","choice","choiceTmpl","charAt","radio","setTspendVote","_ref23","_callee46","txHash","policyID","tspend","_context48","tSpendPolicy","currentPolicy","_x20","_x21","votingTspends","_loop6","_loop7","_opt$value","yes","no","explorerLink","setTKeyPolicy","_ref24","_callee47","policy","tkey","_context49","treasuryPolicy","treasuryKeys","_x22","_x23","votingTKeys","_loop8","keyPolicy","_loop9","_arr3","_opt$value2","_callee48","_app$extensionWallet2","disablePrivacy","_context50","mixing","mixingBox","mixerOff","mixerOn","mixerLoading","enabled","_x24","_callee49","_context51","_x25","_bal$other","_bal$other2","_bal$other3","totalLocked","contractlocked","balanceUnit","fiatBalance","balanceDetailBox","lastSubLockedRow","lastPrimaryRow","addBalanceRow","cat","tooltipMsg","addPrimaryBalance","addSubBalance","setRowClasses","other","Shielded","transparent","orderlocked","Staked","Unmixed","spotVolume","vol24","_a","hostA","mktA","_b2","hostB","mktB","availableMarkets","_loop10","_markets$_i","_markets","quotesymbol","marketRow","fmtSymbol","priceQuoteUnit","priceBaseUnit","volumeUnit","priceBox","volumeBox","marketsOverviewBox","_callee50","_arr4","to","_ref25","_ref26","_ref27","_context52","orderActivityBox","hosts","noActivity","orderActivity","recentOrders","fromQty","toQty","fromLogo","fromSymbol","toSymbol","toLogo","submitTime","bindInternalNavigation","_x26","amtAssetID","feesAssetID","tokenID","amtAssetUI","feesAssetUI","trimStringWithEllipsis","_txTypeSignAndClass2","showTxDetailsPopup","updateTxHistoryRow","txViewBlockExplorer","txDetailsType","txTypeTooltip","txDetailsAmtSection","_txTypeSignAndClass4","txDetailsAmount","feeAsset","txDetailsFee","txDetailsBlockNumber","blockNumber","dateStr","toLocaleDateString","timeStr","toLocaleTimeString","txDetailsTimestamp","timestampPending","blockNumberPending","txDetailsRecipientSection","txDetailsBondIDSection","txDetailsBondLocktimeSection","txDetailsBondAccountIDSection","lockTime","txDetailsBondLocktime","additionalData","Nonce","txDetailsNonceSection","txDetailsNonce","getWalletTx","setTxDetailsPopupElements","txDetails","newTx","_this$currTx5","handleTx","hideMixTxs","oldestTx","txDate","txHistoryTableNewestDate","insertBefore","txHistoryRow","txHistoryDateRow","txHistoryTable","noTxHistory","peRow","_callee51","numToFetch","ref","currRes","_res$txs","numToPush","_res$txs2","_context53","lastTx","txHistory","_x27","_x28","_x29","_callee52","txRes","isMixing","hideMixing","oldestDate","_context54","txHistoryBox","txHistoryNotAvailable","getTxHistory","_x30","_callee53","_context55","_callee54","_context56","reconfigErr","forceUrl","forceReq","showConfirmForce","_x31","confirmForceErr","recoverWalletErr","_callee55","_context57","_x32","_callee56","_app$extensionWallet3","currentDef","disableWalletType","option","_context58","currentWalletDefinition","elevateProviders","traitLogFiler","otherActionsLabel","showOrHideRecoverySupportMsg","recfgAssetLogo","recfgAssetName","updateDisplayedReconfigFields","_x33","_x34","setRecoverySupportMsgViz","viz","reconfigSupportMsg","walletSymbol","toLocaleUpperCase","_app$extensionWallet4","disablePassword","_callee57","_context59","_x35","_callee58","_app$assets$assetID5","isWithdrawer","feeReq","canSend","_context60","toggleSubtract","maxSendDisplay","sendTokenMsgBox","sendLogo","sendName","sendTokenParentLogo","sendTokenParentName","maxWithdraw","maxSendFiat","maxSendFee","maxSendFeeFiat","_x36","_callee59","_context61","errorModalMsg","errorModal","_x37","is","_callee60","_app$assets$this$sele","_context62","_callee61","_page$sendForm$datase","_page$subtractCheckBo","_context63","vSendPw","_callee62","_this$data","_context64","newWalletPW","newPW","clearTxHistory","_callee63","_context65","_x38","_callee64","search","_context66","URLSearchParams","URL","location","pathname","_callee65","_context67","exportWalletErr","exportWalletPW","_callee66","_context68","displayRestoreWalletInfo","restorationinfo","_callee67","wr","card","_context69","restoreInfoCardsList","seedName","instructions","restoreWalletInfo","_x39","_callee68","_context70","_callee69","_context71","force","fiatRates","_note$wallet","route","processTicketPurchaseUpdate","handleTxNote","transaction","str","maxLen","_objectWithoutProperties","getOwnPropertySymbols","propertyIsEnumerable","NoteTypeOrder","NoteTypeMatch","NoteTypeBondPost","NoteTypeConnEvent","desktopNtfnSettingsKey","desktopNtfnSettings","desktopNtfnLabels","_desktopNtfnLabels","BrowserNotifier","_defaultDesktopNtfnSe","_sendDesktopNotification","_requestNtfnPermission","Notification","permission","ntfnPermissionGranted","sendDesktopNotification","ntfnPermissionDenied","requestPermission","title","ntfn","OSDesktopNotifier","_sendDesktopNotification2","_requestNtfnPermission2","isDesktopWebview","sendOSNotification","isDesktopWebkit","webkit","messageHandlers","bwHandler","postMessage","isWebview","_window$webkit","_window$webkit$messag","openUrl","feature","Notifier","_desktopNotify","browserNtfnEnabled","plainNote","fetchDesktopNtfnSettings","_State$fetchLocal","coinExplorerTokenRe","orderTokenRe","insertRichNote","inputString","_match","orderToken","outerHTML","noderize","_assetID","SettingsPage","_submitGameCode","_changeAppPW","_submitExportSeedReq","_importAccount","_prepareAccountImport","_onAccountFileChange","_renderDesktopNtfnSettings","fiatRateSources","darkMode","showPokes","showPopups","addADex","reload","currentDEX","importAccount","prepareAccountImport","authorizeAccountImportForm","authorizeImportAccountConfirm","changeAppPW","changeAppPWForm","submitNewPW","accountFile","onAccountFileChange","removeAccount","clearAccountFile","addAccount","exportSeed","exportSeedErr","exportSeedAuth","exportSeedSubmit","submitExportSeedReq","gameCodeLink","gameCodeForm","gameCodeSubmit","submitGameCode","exportSeedPW","legacySeed","mnemonic","renderDesktopNtfnSettings","checkbox","noteType","getAttribute","updateNtfnSetting","ntfnSettings","container","enabledCheckbox","getBrowserNtfnSettings","browserNtfnCheckboxTemplate","browserNtfnCheckboxContainer","requestNtfnPermission","dispatchEvent","Event","permDenied","browserNtfnBlockedMsg","newForm","setFees","selectedAccount","importAccountErr","accountString","account","_account","_account$bonds","bonds","acctInf","_excluded","chunk","_chunk$match","authorizeSeedDisplay","clearValues","changePWErrMsg","appPW","confirmNewPW","gameCodeErr","gameCodeInput","gameCodeMsg","gameCodeSuccess","gameRedeemTx","coinString","gameRedeemValue","win","OrderBook","mktBook","qtyAtomic","less","findIdx","removeFromSide","_this$findOrder2","findOrder","updateRemainingSide","epochIdx","bestGapOrder","forward","handlers","MessageSocket","queue","maxQlength","connection","readyState","WebSocket","OPEN","uri","reloader","retrys","go","conn","onmessage","evt","onclose","delay","onopen","_step$value","request","onerror","bookRoute","bookOrderRoute","unbookOrderRoute","updateRemainingRoute","epochOrderRoute","candlesRoute","candleUpdateRoute","buyBtnClass","sellBtnClass","fiveMinBinKey","percentFormatter","parentIDNone","MarketsPage","_handleConnNote","_submitOrder","_handleBondUpdate","_handleWalletState","_submitCancel","_preOrder","_fetchPreorder","_unlockMarketWallets","_unlockWallet","_unlockWalletsForEstimates","_showVerifyForm","_loadUserOrders","_showTokenApprovalForm","_resolveOrderFormVisibility","_init","main","pageParams","maxOrderUpdateCounter","metaOrders","recentMatches","preorderCache","depthLines","hovers","recentMatchesSortKey","recentMatchesSortDirection","ogTitle","vDetailPane","showVerifyForm","depthReporters","reportDepthClick","reportDepthVolume","reportDepthMouse","z","reportDepthZoom","depthChart","depthZoomLK","candleReporters","reportMouseCandle","candleChart","candlesChart","accelerateOrderForm","accelerateForm","approveTokenForm","candleDur","lastCandleDurationLK","registerBttn","notRegistered","walletInfoTmpl","bWidget","qWidget","wgt","balanceWgt","BalanceWidget","baseIcons","stateIcons","quoteIcons","connect","unlockWallet","expired","newWalletBttn","showCreate","walletAddr","wantProviders","showCustomProviderDialog","runningMMDisplayElements","mm","mmRunning","reputationMeter","orderRowTmpl","durBttnTemplate","userOrderTmpl","recentMatchesTemplate","approveBaseBttn","showTokenApprovalForm","approveQuoteBttn","toggleTradingTier","showTradingTier","tradingLimits","hideTradingTier","toggleTradingReputation","showTradingReputation","hideTradingReputation","buyBttn","setBuy","sellBttn","setSell","limitBttn","swapBttns","marketBttn","setOrderVisibility","rateField","isSell","drawChartLines","setMarketBuyOrderEstimate","maxOrd","maxSell","lotField","maxBuy","maxBuys","adjustedRate","lotChanged","disableMouseWheel","qtyField","mktBuyField","ws","registerRoute","handleBookRoute","handleBookOrderRoute","handleUnbookOrderRoute","handleUpdateRemainingRoute","handleEpochOrderRoute","handleCandlesRoute","handleCandleUpdateRoute","handleEpochMatchSummary","orderForm","stepSubmit","verifyForm","vSubmit","submitOrder","cancelForm","cancelSubmit","submitCancel","vFeeDetails","closeDetailPane","recentMatchesTable","th","setRecentMatchesSortCol","ordercol","unsetRecentMatchesSortColClasses","refreshRecentMatchesTable","setRecentMatchesSortColClasses","sortCls","quantityChanged","marketBuyChanged","rateFieldChanged","previewQuoteAmt","marketSearchV1","filterMarkets","setDisclaimerAckViz","acked","disclaimer","disclaimerAck","showDisclaimer","orderDisclaimerAckedLK","clearChartLines","buyRows","sellRows","userOrders","activeMarkerRate","setDepthMarkers","stats0","marketStats","stats1","headerSpace","closeMarketsList","leftMarketDock","openMarketsList","leftHider","marketReopener","marketSelect","marketList","MarketList","marketListV1","_this$market","_this$market$base","_this$market2","_this$market2$quote","_row$mkt","startLoadingAnimations","setMarket","handleOrderNote","handleMatchNote","handleEpochNote","handleConnNote","bondpost","handleBondUpdate","spots","handlePriceUpdate","handleWalletState","reputation","updateReputation","feepayment","runstats","resolveOrderFormVisibility","epochreport","handleEpochReportNote","cexproblems","handleCexProblemsNote","runevent","loadingAnimations","mord","recentMatchesLiveList","_td$dataset$sinceStam","td","sinceStamp","init","makeMarket","lastMarketLK","exists","setBalanceVisibility","setRegistrationStatusVisibility","anis","maxLbl","setOrderBttnText","isLimit","currentOrder","parseOrder","updateOrderBttnState","_xc$assets$mkt$baseid","volUnit","setPriceAndChange","obPrice","change24","obUp","obDown","_this$market3","ba","baseCfg","qa","quoteCfg","baseIcon","quoteIcon","low24","high24","_this$market4","candleCaches","requestCandles","aDayAgo","_app$assets$base$toke","_base$info","_app$assets$quote$tok","_quote$info","_this$market5","isSupported","bVers","versions","qVers","tifBox","qtyBox","maxBox","mktBuyBox","showOrderForm","_this$market$dex$auth","pendingStrength","_this$market6","_this2$tokenAssetAppr","baseAssetApprovalStatus","quoteAssetApprovalStatus","_this2$market","assetsAreSupported","tokenAssetApprovalStatuses","t2","t3","orderTypeBttns","reputationAndTradingTierBox","_this$assetsAreSuppor","loaderMsg","isBase","_this$market7","_baseAsset$wallet","baseAsset","baseVersion","_quoteAsset$wallet","quoteAsset","quoteVersion","_this$tokenAssetAppro","tokenApproval","approvalRequiredSell","approvalRequiredBuy","approvalRequiredBoth","approvalPendingBaseSymbol","baseTokenAsset","approvalPendingQuoteSymbol","quoteTokenAsset","NotApproved","Pending","approvalPendingBase","approvalPendingQuote","titleContent","confStatusMsg","titleClass","regStatusTitle","regStatusConfsDisplay","registrationStatus","regStatusDex","postingBondsDex","setRegistrationStatusView","confirmationsRequired","confs","connectionStatus","Connected","updateRegistrationStatusView","showSection","section","_elements","bondRequired","bondCreationPending","penaltyCompsRequired","unregisteredDex","penalties","penaltyComps","acctPenalties","acctPenaltyComps","compsDexSettingsLink","hasPendingBonds","acctTier","dexSettingsLink","shortSymbol","isEnabled","disabledTooltipMsg","btn","_this$currentOrder","orderQty","orderRate","setOrderBttnEnabled","aLot","durBttnBox","candleDurs","candleDurationSelected","loadCandles","mktId","cexBook","chartErrMsg","maxEstimateTimer","marketID","sid","maxSellRequested","sellBalance","buyBalance","bookLoaded","displayMessageIfMissingWallet","setWallets","setMarketDetails","setCurrMarketPrice","updateMarketElements","select","setLoaderMsgVisibility","setTokenApprovalVisibility","setCandleDurBttns","updateTitle","setHost","loadUserOrders","_mkt$base","_mkt$quote","_mkt$base2","_mkt$quote2","baseSym","quoteSym","noWalletMsg","asset1","asset2","_this$market8","q","sellBookedBase","sellBookedQuote","buyBookedBase","buyBookedQuote","depthLegend","_Object$values2$_i","hoverPrice","hoverVolume","candle","candlesLegend","candleStart","candleEnd","candleHigh","candleLow","candleVol","limit","qtyConv","convertToAtoms","tifnow","tifNow","options","adjusted","orderErr","preSell","preBuy","orderPreview","quoteQty","setMaxOrder","scheduleMaxEstimate","maxLoaded","bid","qid","bWallet","qWallet","maxLotBox","maxAboveZero","maxZeroNoFees","maxZeroNoBal","maxFromLots","maxFromLotsLbl","counter","maxOrder","fromAsset","conversionRate","anyRate","_app$assets$fromAsset","feeAvail","feeReservesPerLot","maxZeroNoFeesTicker","maxZeroMinFees","maxZeroNoBalTicker","maxFromAmt","maxFromTicker","_this$market9","minimumRate","minRate","_data$book$recentMatc","_this$market10","loadTable","addTableOrder","epochLine","_this$market11","msgRate","buffer","buybuffer","midGapConventional","minMktBuy","_this$market12","_this$market13","oid","resolveUserOrders","maxUserOrderCount","activeOrd","some","dbOrd","_sortedOrders","_sortedOrders2","orderIsActive","sortedOrders","aActive","bActive","userNoOrders","unreadyOrders","header","isActive","readyToTick","sideLight","marketOrderRateString","ordType","updateMetaOrder","currentFloater","showCancel","showAccelerate","cancelBttn","accelerateBttn","canAccelerateOrder","expander","floater","className","addButton","baseBttn","cb","ogScrollY","orderScroller","moved","yShift","unreadyOrdersMsg","activeLight","rateFactor","setMarkers","midGapValue","_this$market14","bUnit","qUnit","_this$market15","handleBook","removeTableOrder","updateRemaining","updateTableOrder","candlesLoading","timer","setHighLow","setCandles","addRecentMatches","matchSummaries","_data$payload","startStamp","openAsset","updateAsset","toAsset","setIcon","vFeeSummary","vPreorderErr","vPreorder","vBuySell","buySellStr","vSideSubmit","vOrderHost","verifyLimit","verifyMarket","orderDesc","vOrderType","vRate","vQty","vTotal","vFiatTotal","vmFromTotal","vmFromAsset","vmFromTotalFiat","vMarketEstimate","received","vmToTotal","vmToAsset","vmTotalFiat","vHeader","preOrder","unlockWalletsForEstimates","vErr","unlockMarketWallets","_this$market16","cacheKey","cached","wireOrder","estimate","vPreorderErrTip","showAdvancedOptions","hideAdvancedOptions","vOtherOrderOpts","vDefaultOrderOpts","addOption","isSwap","change","isBaseChain","showByDefault","refreshPreorder","est","fetchPreorder","setPreorderErr","setFeeEstimates","_ref16","showPreOrderAdvancedOptions","hidePreOrderAdvancedOptions","reloadOrderOpts","vPreorderEstimates","fmtPct","baseExchangeRate","quoteExchangeRate","baseFeeAssetUI","quoteFeeAssetUI","tokenFiatRate","parentFiatRate","toFeeAssetUI","fromFeeAssetUI","toExchangeRate","fromExchangeRate","_ref17","swapped","swappedInParentUnits","bestSwapPct","realisticBestCase","vSwapFeesLowPct","vSwapFeesLow","worstSwapPct","realisticWorstCase","vSwapFeesHighPct","vSwapFeesHigh","swapFeesMaxPct","maxFees","vSwapFeesMaxPct","vSwapFeesMax","estRate","receivedInParentUnits","bestRedeemPct","vRedeemFeesLowPct","vRedeemFeesLow","worstRedeemPct","vRedeemFeesHighPct","vRedeemFeesHigh","vFeeSummaryPct","vFeeSummaryLow","vFeeSummaryHigh","summarySwapFeesLow","summarySwapFeesHigh","summaryRedeemFeesLow","summaryRedeemFeesHigh","cancelData","cancelErr","cancelRemain","cancelUnit","currentCreate","validateOrder","showVerify","promptProvider","updateSpots","_this$market$base2","_this$market$quote","_this$market17","parcelSizeLots","marketLimitBase","marketLimitBaseUnit","marketLimitQuoteUnit","marketLimitQuote","_tradingLimits","_app$exchanges$host2","usedParcels","mktWeight","inflight","_tradingLimits2","parcelLimit","tradingLimit","limitUsage","orderLimitRemain","orderTradingTier","_this$market18","baseUSD","quoteUSD","refreshActiveOrders","wasInflight","oldStatus","setEpoch","clearOrderTableEpochs","_Object$values4","_Object$values4$_i","alreadyMatched","compare","recentMatchesSortCompare","_step20","_iterator20","vLoader","finalize","mktBuyLots","mktBuyScore","NaN","loadTableSide","bins","currEpochBin","currNonEpochBin","currRate","bin","bookSide","tbody","binOrdersByRateAndEpoch","orderTableRow","manager","getRate","nextSibling","insertOrder","removeOrder","updateOrderQty","clearOrderTableEpochSide","_arr5","removeEpochOrders","orderBin","_this$market19","OrderTableRowManager","chart","setConnectionStatus","_this$page$marketSear","filterTxt","setFilter","setLines","_this$market20","_this$market20$dex","_step21","_iterator21","_this$market21","_this$market22","deregisterRoute","unattach","reloadMarketsPane","_step22","_iterator22","_sortedMarkets","mkts","convertMarkets","assign","_i14","_Object$values5","aLots","sortedMarkets","MarketRow","_step23","_iterator23","_step24","_iterator24","_step25","_iterator25","disconnectedIco","_step26","_iterator26","template","hues","btmpl","iconBox","walletState","balanceRowTmpl","qtmpl","updateWallet","newWalletRow","unsupported","spinner","balanceRows","wantProvidersBox","addWalletSymbol","readWallet","fetchBalance","addRow","balTmpl","_app$assets$asset$tok","_side$parentBal","_app$assets$side$pare","updateParent","before","stringyOptions","_i13","tableRow","rateText","isEpoch","cssClass","updateQtyNumOrdersEl","curr","numOrders","index","findIndex","newEpoch","OrdersPage","_nextPage","_deleteArchivedRecords","_fetchOrders","_submitFilter","orderTmpl","filterState","readFilter","filterKey","subFilter","hostFilter","assetFilter","statusFilter","applyButtons","monitorFilter","applyBttn","submitFilter","filter1","filter2","compareSubFilter","parseSubFilter","ordersTable","nextPage","exportOrders","showArchivedDateField","archivedDateField","deleteArchivedRecordsErr","deleteArchivedRecords","saveMatchesToFile","saveOrdersToFile","archivedRecordsLocation","deleteArchivedRecordsMsg","deleteArchivedResult","deleteArchivedRecordsForm","deleteArchivedRecordsSubmit","olderThan","tableBody","appendOrders","fromUnit","toUnit","dateTime","timeAgo","fetchOrders","setOrders","currentFilter","setQuery","olderThanMs","saveMatchesToFIle","archivedRecordsDeleted","nRecords","archivedRecordsPath","_filterState$assets","_filterState$statuses","orderLoader","lockTimeTakerMs","OrderPage","_showAccelerateForm","_fetchOrder","_start","matchCardTmpl","refreshOnPopupClose","explorerId","showAccelerateForm","fetchOrder","mktBaseSymbol","replaceWith","mktQuoteSymbol","setAccelerationButtonVis","showMatchCards","matchCard","matchID","matchTime","month","day","matchTimeAgo","orderPortion","matchQty","quoteAmount","cancelInfoDiv","infoDiv","statusHdr","cancelAmount","cancelIcon","cancelOrderPortion","makerSwapYou","makerRedeemYou","takerSwapThem","takerRedeemThem","takerSwapYou","takerRedeemYou","makerSwapThem","makerRedeemThem","makerSwapAsset","takerSwapAsset","makerRedeemAsset","takerRedeemAsset","refundAsset","fromAmount","toAmount","fromIcon","toIcon","revoked","counterRedeem","tryShowCoin","pendingEl","coin","stringID","makerSwapPending","makerSwapCoin","takerSwapPending","takerSwapCoin","makerRedeemPending","makerRedeemCoin","takerRedeemPending","takerRedeemCoin","refundCoin","refundPending","refundAfter","refundAfterStr","refundAfterTime","inConfirmingMakerRedeem","inConfirmingTakerRedeem","makerSwapMsg","takerSwapMsg","makerRedeemMsg","takerRedeemMsg","confirmationString","makerSwap","takerSwap","takerRefundsAfter","takerLockTimeExpired","makerRedeem","takerRedeem","expectingRefund","setImmutableMatchCardElements","setMutableMatchCardElements","matchBox","addNewMatchCard","actionsLabel","processMatch","counterSwap","_get","Reflect","getOwnPropertyDescriptor","parseFundingOptions","_f$cex","cexAvail","cexReq","_f$dex","dexAvail","dexReq","proposedDex","proposedCex","cexShort","dexShort","dexRemain","cexRemain","cexRange","dexRange","MarketMakerPage","_cexConfigured","_removeCfg","_handleRunStatsNote","_handleCEXBalanceUpdate","_handleCEXNote","_setup","sortedBots","botTmpl","botRowTmpl","exchangeRowTmpl","cexConfigForm","cexConfigured","newBot","archivedLogsBtn","confirmRemoveConfigBttn","removeCfg","twoColumn","innerWidth","cexRows","configure","setCEX","configureBttn","reconfigBttn","errConfigureBttn","updateCexRow","setup","useTwoColumn","clearBotBoxes","appendBotBox","botConfigs","noBots","handleRunStatsNote","bot","handleRunStats","cexnote","handleCEXNote","_b$runStats$startTime","_b$runStats","_a$runStats$startTime","_a$runStats","addBot","handleCEXBalanceUpdate","_botStatus$config","Bot","botRows","mwh","removingCfg","removeCfgErr","confirmRemoveCfgMsg","confirmRemoveForm","removeBotConfig","fetchMMStatus","boxZero","boxOne","_this$page2","lastChild","botID","unconfigured","configured","connectErrBox","usdBal","cexSymbolAdded","cexSymbol","bipCEXSymbol","usdBalance","percentage","assetValue","percentageBalanceStr","_BotMarket","pg","runningMMElements","_assertThisInitialize","runDisplay","onBox","botTypeDisplay","placementsChartBox","baseTokenSwapFeesBox","placementsChart","buyPlacementCount","sellPlacementCount","startBttn","allocationBttn","allocate","reconfigure","removeBttn","confirmRemoveCfg","goBackFromAllocation","hideAllocationDialog","marketLink","baseAllocSlider","quoteAllocSlider","allocateBttn","showBot","_this$cfg","bestBuy","bestSell","marketConfig","multiplier","cexDataBox","cexPrice","lastPrice","cexVol","vol","dexDataBox","dexPrice","dexVol","updateDisplay","updateTableRow","loadingBg","_this$status","profitLossBox","allocateBttnBox","offBox","noFiatDisplay","updateRunningDisplay","updateIdleDisplay","_this$marketReport2","baseAlloc","totalUSD","baseAllocUSD","baseBookAlloc","baseOrderReservesAlloc","baseOrderReservesPct","baseCexAllocBox","baseCexAlloc","baseBookingFeesAllocBox","baseTokenFeesAllocBox","baseBookingFeesAlloc","feeAlloc","baseTokenFeeAlloc","baseFeeUSD","baseTokenAllocUSD","withQuote","baseTokenBookingFees","baseTokenSwapFeeN","swapReserves","baseTokenSwapFees","quoteAlloc","quoteAllocUSD","quoteBookAlloc","quoteOrderReservesAlloc","quoteOrderReservesPct","quoteSlippageAlloc","quoteCexAllocBox","quoteCexAlloc","quoteBookingFeesAllocBox","quoteTokenFeesAllocBox","quoteBookingFeesAlloc","quoteTokenFeeAlloc","quoteFeeUSD","quoteTokenAllocUSD","quoteTokenBookingFees","quoteTokenSwapFeeN","quoteTokenSwapFees","totalAllocUSD","_dex","_cex","_alloc$dex$baseFeeID","_alloc$dex$quoteFeeID","_this$marketReport3","offError","showTemporarily","fundingState","_parseFundingOptions2","proposedDexBase","proposedCexBase","baseSlider","_parseFundingOptions4","proposedDexQuote","proposedCexQuote","quoteSlider","allocUSD","allocationDialog","fundedAndBalancedBox","hasTransferable","fundedAndNotBalancedBox","starvedBox","proposedDexBaseAlloc","proposedDexQuoteAlloc","setBaseProposal","proposedDexBaseAllocUSD","proposedCexBaseAlloc","proposedCexBaseAllocUSD","dexAlloc","cexAlloc","setQuoteProposal","proposedDexQuoteAllocUSD","proposedCexQuoteAlloc","proposedCexQuoteAllocUSD","reqFees","proposedFees","proposedDexBaseFeeAlloc","proposedDexBaseFeeAllocUSD","needQuoteTokenFees","proposedDexQuoteFeeAlloc","proposedDexQuoteFeeAllocUSD","existingOrders","existingOrdersBox","closeDialog","_app$mmStatus$cexes$c","startConfig","autoRebalance","autoRebalanceSettings","startBot","_this$proj2","totalBase","dexMinBase","dexMinQuote","maxBase","totalQuote","maxQuote","baseMinWithdraw","minB","maxB","minBaseTransfer","transferFactor","quoteMinWithdraw","minQ","maxQ","minQuoteTransfer","specLK","lastBotsLK","lastArbExchangeLK","arbMMRowCacheKey","defaultProfit","defaultLevelSpacing","defaultMarketMakingConfig","driftTolerance","orderPersistence","defaultBotAssetConfig","MarketMakerSettingsPage","_fetchMarketReport","_delete2","_saveSettings","_fetchCEXBalances","_submitBotWithValidation","_submitBotType","_showBotTypeForm","_configureUI","placementsCache","_this$specs","_this$specs2","submitBotType","walletAddrForm","quotePane","basePane","assetPaneBox","AssetPane","mmTitle","oracleTmpl","cexOptTmpl","arbBttnTmpl","marketRowTmpl","needRegTmpl","resetButton","setOriginalValues","updateButton","saveSettings","createButton","deleteBttn","botTypeForm","botTypeSubmit","noMarketBttn","showMarketSelectForm","botTypeHeader","reshowBotTypeForm","botTypeChangeMarket","marketHeader","marketFilterInput","sortMarketRows","cexRebalanceCheckbox","autoRebalanceChanged","switchToAdvanced","showAdvancedConfig","switchToQuickConfig","qcMatchBuffer","matchBufferChanged","switchToUSDPerSide","changeSideCommitmentDialog","switchToLotsPerLevel","gapStrategySelect","clearPlacements","updatedConfig","loadCachedPlacements","setGapFactorLabels","updateModifiedMarkers","addBuyPlacementBtn","addPlacement","addBuyPlacementLots","addBuyPlacementGapFactor","updateAllocations","addSellPlacementBtn","addSellPlacementLots","addSellPlacementGapFactor","driftToleranceInput","defaultDriftTolerance","rawV","driftToleranceSlider","orderPersistenceSlider","qcProfit","vPct","profitInput","qcProfitSlider","quickConfigUpdated","qcLevelSpacing","qcLevelSpacingSlider","defaultMatchBuffer","qcMatchBufferSlider","qcLevelsPerSide","qcUSDPerSide","qcLotsPerLevel","qcUSDPerSideEcho","qcLotsPerLevelEcho","maybeSubmitBuyRow","maybeSubmitSellRow","profitInputErr","showError","errID","botTypeSelectors","botTypeErr","cexSelection","setBotTypeSelected","exit","_botCfg$cexName","setupCEXes","initializeMarketRows","fetchCEXBalances","configureUI","_baseToken$parentID","_quoteToken$parentID","_botCfg$basicMarketMa","_botCfg2","_botCfg2$basicMarketM","_ref3$","_ref3$2","oldCfg","_botCfg","mmCfg","arbMMCfg","arbCfg","_k","_botCfg$uiConfig$simp","isQuickPlacements","botSettingsContainer","marketBox","noMarket","missingFiatRates","marketLoading","isViewOnly","deleteBttnBox","originalConfig","baseOptions","defaultWalletOptions","quoteOptions","creatingNewBot","baseWalletOptions","quoteWalletOptions","numEpochsLeaveOpen","driftToleranceBox","viewOnlyRunning","cexRebalanceSettings","fetchMarketReport","lotsPerLevelIncrement","showQuickConfig","_Object$values$_i$aut","_this2$page","needRegBox","mr","arbs","cexHasMarket","cexMarketSupportFilter","showBotTypeForm","marketSelectionTable","marketFilterBox","noMarkets","_a$spot$vol","_a$spot","_b$spot$vol","_b$spot","volA","volB","_this$specs3","_this$specs4","atomicRate","conv","atomic","dexBaseLots","dexQuoteLots","walletStuff","_feesAndCommit","baseFeeAssetID","quoteFeeAssetID","_this$specs5","_ref7$","_ref7$2","advancedConfig","quickConfig","_this$marketStuff","marketStuff","placementCount","levelsPerSide","worstBuy","worstSell","lotsPerLevel","_this$marketStuff2","showInputsForBot","usingUSDPerSide","matchMultiplierBox","placementChartLegend","lotsPerLevelLabel","levelSpacingBox","arbLotsLabel","qcLevelPerSideBox","qcUSDPerSideBox","qcLotsBox","_page$qcProfit$value","_page$qcLevelSpacing$","_page$qcMatchBuffer$v","_this$marketStuff3","qcError","levelSpacing","levelSpacingDisabled","levelN","updateBaseAllocations","updateQuoteAllocations","_this$marketStuff4","updateInventory","updateCommitTotal","_this$marketStuff5","_page$qcMatchBuffer$v2","configuredCEX","supportingCexes","nCexes","arbEnabled","_div2","_botType","lastBots","lastBot","_lastBot$cexName","lastCEX","_botType2","formSpecs","botTypeBaseSymbol","botTypeQuoteSymbol","formCexes","setCEXAvailability","noCexesConfigured","noCexMarket","noCexMarketConfigureMore","selectFormCEX","_this$specs6","selectedType","_this$formSpecs","_step4$value","selecteds","_lastBot$cexName2","marketSelectForm","_page$marketFilterInp","_this$marketStuff6","updateBalances","_page$cexRebalanceChe","_page$cexRebalanceChe2","submitBotWithValidation","_selecteds$0$dataset$","_this$formSpecs2","_tokenAssetApprovalSt","_tokenAssetApprovalSt2","bApproval","qApproval","_selecteds","multifundingopts","quoteAssetOnly","newCfg","gapStrategyModified","profitModified","buyPlacementsModified","buyPlacementsTableWrapper","sellPlacementsModified","sellPlacementsTableWrapper","toDisplay","initialLoadPlacement","sellPlacementsTableBody","addPlacementRow","addSellPlacementRow","lotsElement","gapFactorElement","errElement","sellPlacementsErr","buyPlacementsTableBody","addBuyPlacementRow","buyPlacementsErr","updateArrowVis","upBtn","downBtn","actualGapFactor","displayedGapFactor","setErr","gapFactorHeaderUnit","convertGapFactor","gapFactorErr","checkGapFactorRange","newRow","newRowTmpl","removeBtn","prevPlacement","nextPlacement","buyGapFactorHdr","sellGapFactorHdr","percentPlusInfo","percentInfo","absolutePlusInfo","absoluteInfo","multiplierInfo","_cfg$buyPlacements","_cfg$sellPlacements","_cfg$driftTolerance","_cfg$orderPersistence","_cfg$profit","_this$specs7","tol","persist","profitSelectorBox","orderPersistenceBox","setArbMMLabels","setupWalletSettings","showErrors","_this$updatedConfig","errEl","_this$marketStuff7","validateFields","basicMMConfig","arbMMConfig","basicArbConfig","updateBotConfig","_this$specs8","deleteErr","maxActiveArbs","_this$specs9","_r$oracles","oraclesLoading","oraclesTable","noOracles","oraclesErrMsg","oraclesErr","oracles","ExchangeNames","usdVol","avgPrice","_this$formSpecs3","_step13$value","_baseID","_quoteID","addCEX","selectedCEX","_Object$values5$_i","has","unavailable","needsconfig","disconnected","_Object$values6","_Object$values6$_i","_Object$values7","_this5$formSpecs","_Object$values8","showCEXConfigForm","_i15","_Object$values9","_cexStatus$markets","_Object$values9$_i","nSwapFees","nSwapFeesSlider","orderReservesSlider","slippageBufferSlider","minTransfer","totalInventory","minV","maxV","minTransferSlider","showBalance","showAddress","isQuote","_cfg$swapFeeN","_this$pg","_this$pg$specs","_this$pg$updatedConfi","walletConfig","_app$assets$this$feeA","feeName","inv","isToken","feeTotalBox","feeReservesBox","feeBalances","slippageBufferBox","feeTicker","cexMinInvBox","orderReservesBox","_cfg$orderReservesFac","counterLots","dexCommit","cexCommit","setLotSize","_this$pg$specs2","bookLots","bookLotSize","bookCommitment","feesPerLotConv","bookingFeesLots","cexMinInv","orderReservesBasis","feesPerSwapConv","feeReservesPerSwap","slippageBufferBasis","redemptionFeesBox","redemptionFeesPerLot","redemptionFeesLots","updateTokenFees","updateRebalance","commitTotal","commitTotalFiat","feeTotal","feeTotalFiat","_this$pg2","showRebalance","rebalanceOpts","rangeV","walletSettingsNone","optToDiv","dependentOpts","optKey","optSetting","dependentOn","currVal","boolSettingTmpl","parentOptKey","optKeys","setDependentOptsVis","_opt$xyRange","rangeSettingTmpl","_toFourSigFigs10","_toFourSigFigs12","_toFourSigFigs14","dependsOn","parentOptVal","_this$pg3","_this$pg3$specs","botInv","balanceBreakdown","DexSettingsPage","_updateBondOptions","_disableAutoRenew","_prepareUpdateHost","_prepareAccountDisable","_toggleAccountStatus","_exportAccount","_showSuccess","_runAnimation","_progressTierFormWithSyncedFundedWallet","_progressTierFormsWithWallet","renewToggle","runAnimation","progressTierFormsWithWallet","repMeter","exportDexBtn","exportAccount","accountDisabled","toggleAccountStatusBtn","toggleAccountStatus","prepareAccountDisable","disableAccountForm","updateCertBtn","certFileInput","updateHostBtn","prepareUpdateHost","goBackToSettings","showTierForm","changeTier","willAutoRenew","toggleAutoRenew","renewErr","disableAutoRenew","autoRenewBox","penaltyCompInput","penaltyCompBox","penaltyCompsErr","otherBondSettings","updateBondOptions","disableAccountConfirm","setAssetError","progressTierFormWithSyncedFundedWallet","liveStrength","expiredBonds","bondsPendingRefund","accountForExport","exportAccountErr","disableAccountHost","disableAccountErr","updateCertMsg","displayIcons","disconnectedIcon","connectedIcon","Disconnected","InvalidCert","conf","_conf$targetTier","MarketMakerArchivesPage","runTableRowTmpl","backButton","runs","_runs$i","_runs$i$market","logs","settings","runTableBody","MarketMakerLogsPage","_applyFilters","_getRunLogs","params","_params","eventTableRowTmpl","dexOrderTxRowTmpl","performanceTableRowTmpl","_params$returnPage","filterButton","applyFilters","searchParams","replaceState","urlParams","_params2","events","statsRows","doneScrolling","eventsTable","_yield$this$getRunLog","_yield$this$getRunLog2","updatedLogs","overview","event","getRunLogs","mktAssets","newEventRow","populateStats","endTime","updateExistingRows","filters","refID","_yield$this$getRunLog3","_yield$this$getRunLog4","dexSells","dexSellsCheckbox","dexBuys","dexBuysCheckbox","cexSells","cexSellsCheckbox","cexBuys","cexBuysCheckbox","deposits","depositsCheckbox","withdrawals","withdrawalsCheckbox","populateTable","_botStatus$runStats","_yield$this$getRunLog5","_yield$this$getRunLog6","parentHeader","setFilters","liveBot","finalState","sumUSDHeader","handleRunEventNote","dexOrderEvent","cexOrderEvent","depositEvent","withdrawalEvent","cachedEvent","setRowContents","pl","endTimeRow","diffs","performanceTableBody","usdDiff","fmtUSD","formatFiatValue","eventsTableBody","eventType","eventID","usd","be","balanceEffects","sumBalanceEffects","tmplID","sumUSD","showEventDetails","dexOrderIDCopyListener","copyDexOrderID","dexOrderID","dexOrderRate","dexOrderQty","dexOrderSide","dexOrderTxsTableBody","transactions","dexOrderTxsTable","txAsset","wallets","dexOrderDetailsForm","cexOrderID","cexOrderIDCopyListener","copyCexOrderID","cexOrderRate","cexOrderQty","cexOrderSide","cexOrderBaseFilled","baseFilled","cexOrderQuoteFilled","quoteFilled","cexOrderDetailsForm","depositID","depositIDCopyListener","copyDepositID","depositAmt","depositFees","depositStatus","depositCreditSection","depositCredit","cexCredit","depositDetailsForm","withdrawalID","withdrawalIDCopyListener","copyWithdrawalID","withdrawalAmt","cexDebit","withdrawalStatus","withdrawalTxID","withdrawalReceived","withdrawalDetailsForm","showDexOrderEventDetails","showCexOrderEventDetails","showDepositEventDetails","showWithdrawalEventDetails","InitPage","_appInited","initForm","AppInitForm","appPWForm","appInited","quickConfigForm","QuickConfigForm","quickConfigDone","seedBackupForm","SeedBackupForm","seedBackedUp","appPWSubmit","setAppPass","toggleSeedInput","seedInputBox","toggleSeedInputIcon","_setAppPass","_page$seedInput$value","pwAgain","appPWErrMsg","appPWAgain","rowIDCounter","qcServerTmpl","qcWalletTmpl","quickConfigSubmit","qcErrAck","_row","_tmpl","_rowID","autoConfigurable","rowID","servers","qcServersBox","qcWalletsBox","failedHosts","failedWallets","connectServer","srvRow","all","walletRow","_walletDef$configopts","appPass","qcChoices","qcErrors","qcServerErrorList","createTextNode","qcServerErrors","qcWalletErrorList","qcWalletErrors","seedAck","showSeed","sbWanna","sbSeed","constructors","register","dexsettings","mmsettings","mmarchives","mmlogs","languageData","flag","Application","noteReceivers","txHistoryMap","requiredActions","loggers","loggersLK","enableLogger","loggerID","recorderKeys","recordersLK","recorders","recordLogger","dumpLogger","record","btoa","download","_needsCustomProvider","_txHistory","_signOut","_fetchBalance","_fetchNotes","_setLanguage","_submitAction","_loadPage","_fetchMMStatus","_fetchBuildInfo","_fetchUser","fetchBuildInfo","_e$state","process","handlerFromPath","attachHeader","attachActions","attachCommon","attach","fetchNotes","protocol","reconnected","notify","_this$main","_arr$_i","inited","langs","seedgentime","revision","skipPush","requestedHandler","doc","delivered","noteBox","profileBox","origin","pushState","handlerID","loadedPage","unload","bindUnits","lyt","_step3$value","_link$href","popupNotes","popupTmpl","noteTmpl","pokeTmpl","loader","noteBell","pokeList","noteList","ackNotes","noteCat","pokeCat","showDropdown","noteIndicator","setNoteTimes","burgerIcon","logoutErr","innerNoteIcon","innerBurgerIcon","profileSignout","signOut","langBttnTmpl","_languageData$this$la","langFlag","langName","_languageData$lang","setLanguage","langBttns","missingNoncesTmpl","actionTxTableTmpl","tooCheapTmpl","lostNonceTmpl","actionsCollapse","actionDialog","actionDialogCollapsed","actionDialogContent","showOldestAction","showAdjacentAction","dir","actions","sortedActions","showRequestedAction","uniqueID","prevAction","nextAction","addAction","blinkAction","existingAction","actionID","actionForm","actionDialogCount","actionCount","resolveActionWithID","rem","tooCheapAction","missingNoncesAction","lostNonceAction","redeemRejectedAction","_this$assets$assetID","table","lostTxID","txAmt","amtUnit","parentUI","feeAmount","feeUnit","newFeesRow","newFees","newFeesUnit","action","doNothingBttn","submitAction","recover","recoverBttn","txTable","actionTxTable","act","bump","keepWaitingBttn","addFeesBttn","nonce","abandonBttn","abandon","replaceBttn","replacementID","idInput","coinID","coinFmt","rejectedRedemptionTmpl","_this$assets$assetID2","retry","tryAgainBttn","actionsNavigator","currentAction","getAsset","xcAsset","_getAsset","_getAsset2","dialog","ico","acks","severity","pageURL","walletsMenuEntry","marketsMenuEntry","mmLink","setNotes","setPokes","setRequiredActions","bondedTier","updateBondConfs","confirmations","updateTier","prependNoteElement","prependPokeElement","_this$mmStatus$bots","_this$mmStatus","orderNote","tempID","inFlight","updateOrder","handleBondNote","updateMatch","mktName","txNote","handleTransactionNote","resolveAction","handleTxHistorySyncedNote","updateUser","stack","indicator","setSeverityClass","_console","nowString","cn","_this$makePoke2","makePoke","prependListElement","_this$makeNote2","makeNote","unacked","ni","noteCacheSize","cls","fromAssetID","_order$matches","supportedAsset","_this$user$extensionM","restrictedWallets","baseChainSymbol","emptyidx","def","removeCookie","authCK","pwKeyCK","notificationsLK","cachedTxHistory","_txs","startIndex","lastIndex","_cachedTxHistory$txs","_res","resTxs","past","_this$assets$assetID$","_this$assets$assetID3","_this$assets$assetID4","providers","severityClassMap","_severityClassMap","getSeconds","getMilliseconds"],"sourceRoot":""} \ No newline at end of file diff --git a/client/webserver/site/dist/style.css b/client/webserver/site/dist/style.css index ff0eaaec74..534ccd7285 100644 --- a/client/webserver/site/dist/style.css +++ b/client/webserver/site/dist/style.css @@ -1,2 +1,2 @@ -:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#0b5831;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0a4972;--bs-secondary:#6c757d;--bs-success:#0b5831;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:rgba(221,34,34,.933);--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:10,73,114;--bs-secondary-rgb:108,117,125;--bs-success-rgb:11,88,49;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:221,34,34;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:"source-sans","sans-serif";--bs-font-monospace:"mono","monospace";--bs-gradient:linear-gradient(180deg,hsla(0,0%,100%,.15),hsla(0,0%,100%,0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0,0,0,.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0a4972;--bs-link-hover-color:#083a5b;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd}*,:after,:before{box-sizing:border-box}@media(prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);background-color:var(--bs-body-bg);color:var(--bs-body-color);font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);margin:0;text-align:var(--bs-body-text-align)}hr{border:0;border-top:1px solid;color:inherit;margin:1rem 0;opacity:.25}h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.2;margin-bottom:.5rem;margin-top:0}h1{font-size:calc(1.375rem + 1.5vw)}@media(min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media(min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media(min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media(min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-bottom:1rem;margin-top:0}abbr[title]{cursor:help;text-decoration:underline dotted;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit;margin-bottom:1rem}ol,ul{padding-left:2rem}dl,ol,ul{margin-bottom:1rem;margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{background-color:var(--bs-highlight-bg);padding:.1875em}sub,sup{font-size:.75em;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:none}a:hover{color:var(--bs-link-hover-color);text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;font-size:.875em;margin-bottom:1rem;margin-top:0;overflow:auto}pre code{color:inherit;font-size:inherit;word-break:normal}code{word-wrap:break-word;color:var(--bs-code-color);font-size:.875em}a>code{color:inherit}kbd{background-color:var(--bs-body-color);border-radius:.25rem;color:var(--bs-body-bg);font-size:.875em;padding:.1875rem .375rem}kbd kbd{font-size:1em;padding:0}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom}caption{color:#6c757d;padding-bottom:.5rem;padding-top:.5rem;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border:0 solid;border-color:inherit}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{border-style:none;padding:0}textarea{resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{float:left;font-size:calc(1.275rem + .3vw);line-height:inherit;margin-bottom:.5rem;padding:0;width:100%}@media(min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{-webkit-appearance:button;font:inherit}output{display:inline-block}iframe{border:0}summary{cursor:pointer;display:list-item}progress{vertical-align:baseline}[hidden]{display:none!important}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-left:calc(var(--bs-gutter-x)*-.5);margin-right:calc(var(--bs-gutter-x)*-.5);margin-top:calc(var(--bs-gutter-y)*-1)}.row>*{flex-shrink:0;margin-top:var(--bs-gutter-y);max-width:100%;padding-left:calc(var(--bs-gutter-x)*.5);padding-right:calc(var(--bs-gutter-x)*.5);width:100%}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:4.16666667%}.col-2{flex:0 0 auto;width:8.33333333%}.col-3{flex:0 0 auto;width:12.5%}.col-4{flex:0 0 auto;width:16.66666667%}.col-5{flex:0 0 auto;width:20.83333333%}.col-6{flex:0 0 auto;width:25%}.col-7{flex:0 0 auto;width:29.16666667%}.col-8{flex:0 0 auto;width:33.33333333%}.col-9{flex:0 0 auto;width:37.5%}.col-10{flex:0 0 auto;width:41.66666667%}.col-11{flex:0 0 auto;width:45.83333333%}.col-12{flex:0 0 auto;width:50%}.col-13{flex:0 0 auto;width:54.16666667%}.col-14{flex:0 0 auto;width:58.33333333%}.col-15{flex:0 0 auto;width:62.5%}.col-16{flex:0 0 auto;width:66.66666667%}.col-17{flex:0 0 auto;width:70.83333333%}.col-18{flex:0 0 auto;width:75%}.col-19{flex:0 0 auto;width:79.16666667%}.col-20{flex:0 0 auto;width:83.33333333%}.col-21{flex:0 0 auto;width:87.5%}.col-22{flex:0 0 auto;width:91.66666667%}.col-23{flex:0 0 auto;width:95.83333333%}.col-24{flex:0 0 auto;width:100%}.offset-1{margin-left:4.16666667%}.offset-2{margin-left:8.33333333%}.offset-3{margin-left:12.5%}.offset-4{margin-left:16.66666667%}.offset-5{margin-left:20.83333333%}.offset-6{margin-left:25%}.offset-7{margin-left:29.16666667%}.offset-8{margin-left:33.33333333%}.offset-9{margin-left:37.5%}.offset-10{margin-left:41.66666667%}.offset-11{margin-left:45.83333333%}.offset-12{margin-left:50%}.offset-13{margin-left:54.16666667%}.offset-14{margin-left:58.33333333%}.offset-15{margin-left:62.5%}.offset-16{margin-left:66.66666667%}.offset-17{margin-left:70.83333333%}.offset-18{margin-left:75%}.offset-19{margin-left:79.16666667%}.offset-20{margin-left:83.33333333%}.offset-21{margin-left:87.5%}.offset-22{margin-left:91.66666667%}.offset-23{margin-left:95.83333333%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media(min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:4.16666667%}.col-sm-2{flex:0 0 auto;width:8.33333333%}.col-sm-3{flex:0 0 auto;width:12.5%}.col-sm-4{flex:0 0 auto;width:16.66666667%}.col-sm-5{flex:0 0 auto;width:20.83333333%}.col-sm-6{flex:0 0 auto;width:25%}.col-sm-7{flex:0 0 auto;width:29.16666667%}.col-sm-8{flex:0 0 auto;width:33.33333333%}.col-sm-9{flex:0 0 auto;width:37.5%}.col-sm-10{flex:0 0 auto;width:41.66666667%}.col-sm-11{flex:0 0 auto;width:45.83333333%}.col-sm-12{flex:0 0 auto;width:50%}.col-sm-13{flex:0 0 auto;width:54.16666667%}.col-sm-14{flex:0 0 auto;width:58.33333333%}.col-sm-15{flex:0 0 auto;width:62.5%}.col-sm-16{flex:0 0 auto;width:66.66666667%}.col-sm-17{flex:0 0 auto;width:70.83333333%}.col-sm-18{flex:0 0 auto;width:75%}.col-sm-19{flex:0 0 auto;width:79.16666667%}.col-sm-20{flex:0 0 auto;width:83.33333333%}.col-sm-21{flex:0 0 auto;width:87.5%}.col-sm-22{flex:0 0 auto;width:91.66666667%}.col-sm-23{flex:0 0 auto;width:95.83333333%}.col-sm-24{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:4.16666667%}.offset-sm-2{margin-left:8.33333333%}.offset-sm-3{margin-left:12.5%}.offset-sm-4{margin-left:16.66666667%}.offset-sm-5{margin-left:20.83333333%}.offset-sm-6{margin-left:25%}.offset-sm-7{margin-left:29.16666667%}.offset-sm-8{margin-left:33.33333333%}.offset-sm-9{margin-left:37.5%}.offset-sm-10{margin-left:41.66666667%}.offset-sm-11{margin-left:45.83333333%}.offset-sm-12{margin-left:50%}.offset-sm-13{margin-left:54.16666667%}.offset-sm-14{margin-left:58.33333333%}.offset-sm-15{margin-left:62.5%}.offset-sm-16{margin-left:66.66666667%}.offset-sm-17{margin-left:70.83333333%}.offset-sm-18{margin-left:75%}.offset-sm-19{margin-left:79.16666667%}.offset-sm-20{margin-left:83.33333333%}.offset-sm-21{margin-left:87.5%}.offset-sm-22{margin-left:91.66666667%}.offset-sm-23{margin-left:95.83333333%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media(min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:4.16666667%}.col-md-2{flex:0 0 auto;width:8.33333333%}.col-md-3{flex:0 0 auto;width:12.5%}.col-md-4{flex:0 0 auto;width:16.66666667%}.col-md-5{flex:0 0 auto;width:20.83333333%}.col-md-6{flex:0 0 auto;width:25%}.col-md-7{flex:0 0 auto;width:29.16666667%}.col-md-8{flex:0 0 auto;width:33.33333333%}.col-md-9{flex:0 0 auto;width:37.5%}.col-md-10{flex:0 0 auto;width:41.66666667%}.col-md-11{flex:0 0 auto;width:45.83333333%}.col-md-12{flex:0 0 auto;width:50%}.col-md-13{flex:0 0 auto;width:54.16666667%}.col-md-14{flex:0 0 auto;width:58.33333333%}.col-md-15{flex:0 0 auto;width:62.5%}.col-md-16{flex:0 0 auto;width:66.66666667%}.col-md-17{flex:0 0 auto;width:70.83333333%}.col-md-18{flex:0 0 auto;width:75%}.col-md-19{flex:0 0 auto;width:79.16666667%}.col-md-20{flex:0 0 auto;width:83.33333333%}.col-md-21{flex:0 0 auto;width:87.5%}.col-md-22{flex:0 0 auto;width:91.66666667%}.col-md-23{flex:0 0 auto;width:95.83333333%}.col-md-24{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:4.16666667%}.offset-md-2{margin-left:8.33333333%}.offset-md-3{margin-left:12.5%}.offset-md-4{margin-left:16.66666667%}.offset-md-5{margin-left:20.83333333%}.offset-md-6{margin-left:25%}.offset-md-7{margin-left:29.16666667%}.offset-md-8{margin-left:33.33333333%}.offset-md-9{margin-left:37.5%}.offset-md-10{margin-left:41.66666667%}.offset-md-11{margin-left:45.83333333%}.offset-md-12{margin-left:50%}.offset-md-13{margin-left:54.16666667%}.offset-md-14{margin-left:58.33333333%}.offset-md-15{margin-left:62.5%}.offset-md-16{margin-left:66.66666667%}.offset-md-17{margin-left:70.83333333%}.offset-md-18{margin-left:75%}.offset-md-19{margin-left:79.16666667%}.offset-md-20{margin-left:83.33333333%}.offset-md-21{margin-left:87.5%}.offset-md-22{margin-left:91.66666667%}.offset-md-23{margin-left:95.83333333%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media(min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:4.16666667%}.col-lg-2{flex:0 0 auto;width:8.33333333%}.col-lg-3{flex:0 0 auto;width:12.5%}.col-lg-4{flex:0 0 auto;width:16.66666667%}.col-lg-5{flex:0 0 auto;width:20.83333333%}.col-lg-6{flex:0 0 auto;width:25%}.col-lg-7{flex:0 0 auto;width:29.16666667%}.col-lg-8{flex:0 0 auto;width:33.33333333%}.col-lg-9{flex:0 0 auto;width:37.5%}.col-lg-10{flex:0 0 auto;width:41.66666667%}.col-lg-11{flex:0 0 auto;width:45.83333333%}.col-lg-12{flex:0 0 auto;width:50%}.col-lg-13{flex:0 0 auto;width:54.16666667%}.col-lg-14{flex:0 0 auto;width:58.33333333%}.col-lg-15{flex:0 0 auto;width:62.5%}.col-lg-16{flex:0 0 auto;width:66.66666667%}.col-lg-17{flex:0 0 auto;width:70.83333333%}.col-lg-18{flex:0 0 auto;width:75%}.col-lg-19{flex:0 0 auto;width:79.16666667%}.col-lg-20{flex:0 0 auto;width:83.33333333%}.col-lg-21{flex:0 0 auto;width:87.5%}.col-lg-22{flex:0 0 auto;width:91.66666667%}.col-lg-23{flex:0 0 auto;width:95.83333333%}.col-lg-24{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:4.16666667%}.offset-lg-2{margin-left:8.33333333%}.offset-lg-3{margin-left:12.5%}.offset-lg-4{margin-left:16.66666667%}.offset-lg-5{margin-left:20.83333333%}.offset-lg-6{margin-left:25%}.offset-lg-7{margin-left:29.16666667%}.offset-lg-8{margin-left:33.33333333%}.offset-lg-9{margin-left:37.5%}.offset-lg-10{margin-left:41.66666667%}.offset-lg-11{margin-left:45.83333333%}.offset-lg-12{margin-left:50%}.offset-lg-13{margin-left:54.16666667%}.offset-lg-14{margin-left:58.33333333%}.offset-lg-15{margin-left:62.5%}.offset-lg-16{margin-left:66.66666667%}.offset-lg-17{margin-left:70.83333333%}.offset-lg-18{margin-left:75%}.offset-lg-19{margin-left:79.16666667%}.offset-lg-20{margin-left:83.33333333%}.offset-lg-21{margin-left:87.5%}.offset-lg-22{margin-left:91.66666667%}.offset-lg-23{margin-left:95.83333333%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media(min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:4.16666667%}.col-xl-2{flex:0 0 auto;width:8.33333333%}.col-xl-3{flex:0 0 auto;width:12.5%}.col-xl-4{flex:0 0 auto;width:16.66666667%}.col-xl-5{flex:0 0 auto;width:20.83333333%}.col-xl-6{flex:0 0 auto;width:25%}.col-xl-7{flex:0 0 auto;width:29.16666667%}.col-xl-8{flex:0 0 auto;width:33.33333333%}.col-xl-9{flex:0 0 auto;width:37.5%}.col-xl-10{flex:0 0 auto;width:41.66666667%}.col-xl-11{flex:0 0 auto;width:45.83333333%}.col-xl-12{flex:0 0 auto;width:50%}.col-xl-13{flex:0 0 auto;width:54.16666667%}.col-xl-14{flex:0 0 auto;width:58.33333333%}.col-xl-15{flex:0 0 auto;width:62.5%}.col-xl-16{flex:0 0 auto;width:66.66666667%}.col-xl-17{flex:0 0 auto;width:70.83333333%}.col-xl-18{flex:0 0 auto;width:75%}.col-xl-19{flex:0 0 auto;width:79.16666667%}.col-xl-20{flex:0 0 auto;width:83.33333333%}.col-xl-21{flex:0 0 auto;width:87.5%}.col-xl-22{flex:0 0 auto;width:91.66666667%}.col-xl-23{flex:0 0 auto;width:95.83333333%}.col-xl-24{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:4.16666667%}.offset-xl-2{margin-left:8.33333333%}.offset-xl-3{margin-left:12.5%}.offset-xl-4{margin-left:16.66666667%}.offset-xl-5{margin-left:20.83333333%}.offset-xl-6{margin-left:25%}.offset-xl-7{margin-left:29.16666667%}.offset-xl-8{margin-left:33.33333333%}.offset-xl-9{margin-left:37.5%}.offset-xl-10{margin-left:41.66666667%}.offset-xl-11{margin-left:45.83333333%}.offset-xl-12{margin-left:50%}.offset-xl-13{margin-left:54.16666667%}.offset-xl-14{margin-left:58.33333333%}.offset-xl-15{margin-left:62.5%}.offset-xl-16{margin-left:66.66666667%}.offset-xl-17{margin-left:70.83333333%}.offset-xl-18{margin-left:75%}.offset-xl-19{margin-left:79.16666667%}.offset-xl-20{margin-left:83.33333333%}.offset-xl-21{margin-left:87.5%}.offset-xl-22{margin-left:91.66666667%}.offset-xl-23{margin-left:95.83333333%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media(min-width:1750px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:4.16666667%}.col-xxl-2{flex:0 0 auto;width:8.33333333%}.col-xxl-3{flex:0 0 auto;width:12.5%}.col-xxl-4{flex:0 0 auto;width:16.66666667%}.col-xxl-5{flex:0 0 auto;width:20.83333333%}.col-xxl-6{flex:0 0 auto;width:25%}.col-xxl-7{flex:0 0 auto;width:29.16666667%}.col-xxl-8{flex:0 0 auto;width:33.33333333%}.col-xxl-9{flex:0 0 auto;width:37.5%}.col-xxl-10{flex:0 0 auto;width:41.66666667%}.col-xxl-11{flex:0 0 auto;width:45.83333333%}.col-xxl-12{flex:0 0 auto;width:50%}.col-xxl-13{flex:0 0 auto;width:54.16666667%}.col-xxl-14{flex:0 0 auto;width:58.33333333%}.col-xxl-15{flex:0 0 auto;width:62.5%}.col-xxl-16{flex:0 0 auto;width:66.66666667%}.col-xxl-17{flex:0 0 auto;width:70.83333333%}.col-xxl-18{flex:0 0 auto;width:75%}.col-xxl-19{flex:0 0 auto;width:79.16666667%}.col-xxl-20{flex:0 0 auto;width:83.33333333%}.col-xxl-21{flex:0 0 auto;width:87.5%}.col-xxl-22{flex:0 0 auto;width:91.66666667%}.col-xxl-23{flex:0 0 auto;width:95.83333333%}.col-xxl-24{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:4.16666667%}.offset-xxl-2{margin-left:8.33333333%}.offset-xxl-3{margin-left:12.5%}.offset-xxl-4{margin-left:16.66666667%}.offset-xxl-5{margin-left:20.83333333%}.offset-xxl-6{margin-left:25%}.offset-xxl-7{margin-left:29.16666667%}.offset-xxl-8{margin-left:33.33333333%}.offset-xxl-9{margin-left:37.5%}.offset-xxl-10{margin-left:41.66666667%}.offset-xxl-11{margin-left:45.83333333%}.offset-xxl-12{margin-left:50%}.offset-xxl-13{margin-left:54.16666667%}.offset-xxl-14{margin-left:58.33333333%}.offset-xxl-15{margin-left:62.5%}.offset-xxl-16{margin-left:66.66666667%}.offset-xxl-17{margin-left:70.83333333%}.offset-xxl-18{margin-left:75%}.offset-xxl-19{margin-left:79.16666667%}.offset-xxl-20{margin-left:83.33333333%}.offset-xxl-21{margin-left:87.5%}.offset-xxl-22{margin-left:91.66666667%}.offset-xxl-23{margin-left:95.83333333%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}@media(min-width:2150px){.col-xxxl{flex:1 0 0%}.row-cols-xxxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxxl-auto{flex:0 0 auto;width:auto}.col-xxxl-1{flex:0 0 auto;width:4.16666667%}.col-xxxl-2{flex:0 0 auto;width:8.33333333%}.col-xxxl-3{flex:0 0 auto;width:12.5%}.col-xxxl-4{flex:0 0 auto;width:16.66666667%}.col-xxxl-5{flex:0 0 auto;width:20.83333333%}.col-xxxl-6{flex:0 0 auto;width:25%}.col-xxxl-7{flex:0 0 auto;width:29.16666667%}.col-xxxl-8{flex:0 0 auto;width:33.33333333%}.col-xxxl-9{flex:0 0 auto;width:37.5%}.col-xxxl-10{flex:0 0 auto;width:41.66666667%}.col-xxxl-11{flex:0 0 auto;width:45.83333333%}.col-xxxl-12{flex:0 0 auto;width:50%}.col-xxxl-13{flex:0 0 auto;width:54.16666667%}.col-xxxl-14{flex:0 0 auto;width:58.33333333%}.col-xxxl-15{flex:0 0 auto;width:62.5%}.col-xxxl-16{flex:0 0 auto;width:66.66666667%}.col-xxxl-17{flex:0 0 auto;width:70.83333333%}.col-xxxl-18{flex:0 0 auto;width:75%}.col-xxxl-19{flex:0 0 auto;width:79.16666667%}.col-xxxl-20{flex:0 0 auto;width:83.33333333%}.col-xxxl-21{flex:0 0 auto;width:87.5%}.col-xxxl-22{flex:0 0 auto;width:91.66666667%}.col-xxxl-23{flex:0 0 auto;width:95.83333333%}.col-xxxl-24{flex:0 0 auto;width:100%}.offset-xxxl-0{margin-left:0}.offset-xxxl-1{margin-left:4.16666667%}.offset-xxxl-2{margin-left:8.33333333%}.offset-xxxl-3{margin-left:12.5%}.offset-xxxl-4{margin-left:16.66666667%}.offset-xxxl-5{margin-left:20.83333333%}.offset-xxxl-6{margin-left:25%}.offset-xxxl-7{margin-left:29.16666667%}.offset-xxxl-8{margin-left:33.33333333%}.offset-xxxl-9{margin-left:37.5%}.offset-xxxl-10{margin-left:41.66666667%}.offset-xxxl-11{margin-left:45.83333333%}.offset-xxxl-12{margin-left:50%}.offset-xxxl-13{margin-left:54.16666667%}.offset-xxxl-14{margin-left:58.33333333%}.offset-xxxl-15{margin-left:62.5%}.offset-xxxl-16{margin-left:66.66666667%}.offset-xxxl-17{margin-left:70.83333333%}.offset-xxxl-18{margin-left:75%}.offset-xxxl-19{margin-left:79.16666667%}.offset-xxxl-20{margin-left:83.33333333%}.offset-xxxl-21{margin-left:87.5%}.offset-xxxl-22{margin-left:91.66666667%}.offset-xxxl-23{margin-left:95.83333333%}.g-xxxl-0,.gx-xxxl-0{--bs-gutter-x:0}.g-xxxl-0,.gy-xxxl-0{--bs-gutter-y:0}.g-xxxl-1,.gx-xxxl-1{--bs-gutter-x:0.25rem}.g-xxxl-1,.gy-xxxl-1{--bs-gutter-y:0.25rem}.g-xxxl-2,.gx-xxxl-2{--bs-gutter-x:0.5rem}.g-xxxl-2,.gy-xxxl-2{--bs-gutter-y:0.5rem}.g-xxxl-3,.gx-xxxl-3{--bs-gutter-x:1rem}.g-xxxl-3,.gy-xxxl-3{--bs-gutter-y:1rem}.g-xxxl-4,.gx-xxxl-4{--bs-gutter-x:1.5rem}.g-xxxl-4,.gy-xxxl-4{--bs-gutter-y:1.5rem}.g-xxxl-5,.gx-xxxl-5{--bs-gutter-x:3rem}.g-xxxl-5,.gy-xxxl-5{--bs-gutter-y:3rem}}.form-select{-moz-padding-start:calc(.75rem - 3px);appearance:none;background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E");background-position:right .75rem center;background-repeat:no-repeat;background-size:16px 12px;border:1px solid #ced4da;border-radius:.375rem;color:#212529;display:block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem 2.25rem .375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media(prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#85a4b9;box-shadow:0 0 0 .25rem rgba(10,73,114,.25);outline:0}.form-select[multiple],.form-select[size]:not([size="1"]){background-image:none;padding-right:.75rem}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{border-radius:.25rem;font-size:.875rem;padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.form-select-lg{border-radius:.5rem;font-size:1.25rem;padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}.form-check{display:block;margin-bottom:.125rem;min-height:1.5rem;padding-left:1.5em}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-left:0;padding-right:1.5em;text-align:right}.form-check-reverse .form-check-input{float:right;margin-left:0;margin-right:-1.5em}.form-check-input{appearance:none;background-color:#fff;background-position:50%;background-repeat:no-repeat;background-size:contain;border:1px solid rgba(0,0,0,.25);height:1em;margin-top:.25em;print-color-adjust:exact;vertical-align:top;width:1em}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#85a4b9;box-shadow:0 0 0 .25rem rgba(10,73,114,.25);outline:0}.form-check-input:checked{background-color:#0a4972;border-color:#0a4972}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3E%3C/svg%3E")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='2' fill='%23fff'/%3E%3C/svg%3E")}.form-check-input[type=checkbox]:indeterminate{background-color:#0a4972;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3E%3C/svg%3E");border-color:#0a4972}.form-check-input:disabled{filter:none;opacity:.5;pointer-events:none}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='rgba(0, 0, 0, 0.25)'/%3E%3C/svg%3E");background-position:0;border-radius:2em;margin-left:-2.5em;transition:background-position .15s ease-in-out;width:2em}@media(prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%2385a4b9'/%3E%3C/svg%3E")}.form-switch .form-check-input:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E");background-position:100%}.form-switch.form-check-reverse{padding-left:0;padding-right:2.5em}.form-switch.form-check-reverse .form-check-input{margin-left:0;margin-right:-2.5em}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{filter:none;opacity:.65;pointer-events:none}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-bottom:0!important;padding-top:0!important}.py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-3{padding-bottom:1rem!important;padding-top:1rem!important}.py-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-5{padding-bottom:3rem!important;padding-top:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-bottom:0!important;margin-top:0!important}.my-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-3{margin-bottom:1rem!important;margin-top:1rem!important}.my-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-5{margin-bottom:3rem!important;margin-top:3rem!important}.my-auto{margin-bottom:auto!important;margin-top:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.border{border:1px solid var(--border-color)!important}.border-0{border:0!important}.border-top{border-top:1px solid var(--border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid var(--border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid var(--border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid var(--border-color)!important}.border-start-0{border-left:0!important}.border-style-dashed{border-style:dashed!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-100{height:100%!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-justify{text-align:justify!important}@media(min-width:576px){.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}}@media(min-width:768px){.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}}@media(min-width:992px){.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}}@media(min-width:1200px){.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}}@media(min-width:1750px){.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}}@media(min-width:2150px){.d-xxxl-inline{display:inline!important}.d-xxxl-inline-block{display:inline-block!important}.d-xxxl-block{display:block!important}.d-xxxl-grid{display:grid!important}.d-xxxl-inline-grid{display:inline-grid!important}.d-xxxl-table{display:table!important}.d-xxxl-table-row{display:table-row!important}.d-xxxl-table-cell{display:table-cell!important}.d-xxxl-flex{display:flex!important}.d-xxxl-inline-flex{display:inline-flex!important}.d-xxxl-none{display:none!important}.flex-xxxl-fill{flex:1 1 auto!important}.flex-xxxl-row{flex-direction:row!important}.flex-xxxl-column{flex-direction:column!important}.flex-xxxl-row-reverse{flex-direction:row-reverse!important}.flex-xxxl-column-reverse{flex-direction:column-reverse!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}body:not(.dark){--body-bg:#fafafa;--body-bg-lower-opacity:#fafafa88;--section-bg:#f6f6f6;--form-bg:#f0f0f0;--tertiary-bg:#7772;--text-color:#333;--text-color-secondary:#4a4949;--text-danger:#d22;--text-warning:#f82e;--text-grey:#777;--border-color:#ddd;--hint-color:#4397cd;--link-color:#2a71d5;--link-color-hover:#144487;--subtle-link-color:#05053b;--subtle-link-hover:#07075e;--popup-notes-bg:#000;--popup-notes-color:#dfe2e1;--btn-feature-bg:#6bc5ff;--btn-feature-hover-bg:#a3dbff;--btn-feature-border-color:#759cb5;--btn-featur-hover-border-color:#9bc3dd;--btn-danger-hover-color:#fff;--btn-border-color:#ddd;--btn-hover-border-color:#ddd;--btn-go-bg:#0b5831;--btn-go-hover-bg:#0b5831;--btn-go-color:#fff;--forms-bg:#fafafa99;--form-input-bg:#fff;--form-input-border:#999;--form-input-border-focus:#555;--form-input-bg-active:#3095db;--form-opt-selected-bg:#0001;--form-selected-tab-bg:#fff;--indicator-good:#179717;--buy-color:#207a46;--sell-color:#99302b;--market-buygreen-bg:#207a4699;--market-sellred-bg:#99302b99;--market-sell-color:#99302b;--market-btn-color:#555;--market-btn-selected-color:#000;--market-markettab-selected-bg:#7773;--market-orderopt-bg:#fff1;--market-numorders-bg:#c5c5e6;--loader-bg:#e0e0e077;--dex-url:url(/img/softened-icon.png)}body.dark{--body-bg:#040b14;--body-bg-lower-opacity:#040b1488;--section-bg:#071627;--form-bg:#0a1e34;--tertiary-bg:#78787822;--text-color:#dfe2e1;--text-color-secondary:#a1a1a1;--text-danger:#ec6a6a;--text-warning:#f82e;--text-grey:#999;--border-color:#383f4b;--hint-color:#64b2e5;--link-color:#388bff;--link-color-hover:#5e9ffa;--subtle-link-color:#e6e6ff;--subtle-link-hover:#d1d1ff;--popup-notes-bg:#fff;--popup-notes-color:#333;--btn-border-color:#7777;--btn-hover-border-color:#777;--btn-feature-bg:#0a4972;--btn-feature-hover-bg:#176699;--btn-feature-border-color:#1e618d;--btn-featur-hover-border-color:#85a5ba;--btn-danger-hover-color:#fff;--btn-go-bg:#0b5831;--btn-go-hover-bg:#0b5831;--btn-go-color:#fff;--forms-bg:#05141f99;--form-input-bg:#0009;--form-input-border:#555;--form-input-border-focus:#4271ce;--form-input-bg-active:#27278d;--form-opt-selected-bg:#fff1;--form-selected-tab-bg:#39447c;--indicator-good:#29bb77;--buy-color:#29bb77;--sell-color:#e95e5e;--market-buygreen-bg:#29bb7799;--market-sellred-bg:#e95e5e99;--market-sell-color:#e95e5e;--market-btn-color:#aaa;--market-btn-selected-color:#eee;--market-markettab-selected-bg:#fff1;--market-orderopt-bg:#0001;--market-numorders-bg:#141488;--loader-bg:#13202b77;--dex-url:url(/img/softened-icon-dark.png)}.greyscale{filter:grayscale(1)}.blurry-bg{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.body-bg{background-color:var(--body-bg)}.section-bg{background-color:var(--section-bg)}.text-good{color:var(--indicator-good)}@font-face{font-family:source-sans;font-style:normal;font-weight:400;src:url(/font/source-sans-pro-v9-latin-regular.woff) format("woff"),url(/font/source-sans-pro-v9-latin-regular.svg) format("svg")}@font-face{font-family:demi-sans;font-style:normal;font-weight:bolder;src:url(/font/source-sans-pro-semibold.woff) format("woff"),url(/font/source-sans-pro-semibold.svg) format("svg")}@font-face{font-family:mono;font-style:normal;font-weight:400;src:url(/font/inconsolata-v15-latin-regular.woff) format("woff"),url(/font/inconsolata-v15-latin-regular.svg) format("svg")}.fs8{font-size:8px}.fs10{font-size:10px}.fs11{font-size:11px}.fs12{font-size:12px}.fs13{font-size:13px}.fs14{font-size:14px}.fs15{font-size:15px}.fs16{font-size:16px}.fs17{font-size:17px}.fs18{font-size:18px}.fs20{font-size:20px}.fs22{font-size:22px}.fs24,.fs26{font-size:24px}.fs28{font-size:28px}.fs32{font-size:32px}.fs35{font-size:35px}.fs50{font-size:50px}.demi{font-family:demi-sans,sans-serif}.mono{font-family:mono,monospace}.sans{font-family:source-sans,sans-serif}.bold{font-weight:700}.flex-grow-1{flex-grow:1}#dexAddrForm .known-exchange,#forms,#forms>form header,#forms>form>div.form-closer,#forms>form>div.form-closer-unbound,.flex-center,div[data-handler=markets] #epochLine,div[data-handler=markets] .market-chart,div[data-handler=markets] .user-order .user-order-header{align-items:center;display:flex;justify-content:center}#forms>form,.flex-stretch-column{align-items:stretch;display:flex;flex-direction:column}.flex-wrap{flex-wrap:wrap}.text-nowrap{white-space:nowrap}.position-relative{position:relative}.position-absolute{position:absolute}#forms>form>div.form-closer-unbound:hover,#forms>form>div.form-closer:hover,.hoverbg:hover,div[data-handler=mm] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mm] .bot-type-selector:hover:not(.disabled),div[data-handler=mmarchives] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mmarchives] .bot-type-selector:hover:not(.disabled),div[data-handler=mmlogs] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mmlogs] .bot-type-selector:hover:not(.disabled),div[data-handler=mmsettings] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mmsettings] .bot-type-selector:hover:not(.disabled){background-color:var(--tertiary-bg)}.invisible{visibility:hidden}#forms,#recentMatchesBox,.stylish-overflow,.vscroll,table.reg-asset-markets{overflow:auto;scrollbar-color:hsla(0,0%,47%,.267) hsla(0,0%,47%,.067);scrollbar-width:thin}#forms::-webkit-scrollbar,#recentMatchesBox::-webkit-scrollbar,.stylish-overflow::-webkit-scrollbar,.vscroll::-webkit-scrollbar,table.reg-asset-markets::-webkit-scrollbar{height:8px;width:8px}#forms::-webkit-scrollbar-track,#recentMatchesBox::-webkit-scrollbar-track,.stylish-overflow::-webkit-scrollbar-track,.vscroll::-webkit-scrollbar-track,table.reg-asset-markets::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}#forms::-webkit-scrollbar-thumb,#recentMatchesBox::-webkit-scrollbar-thumb,.stylish-overflow::-webkit-scrollbar-thumb,.vscroll::-webkit-scrollbar-thumb,table.reg-asset-markets::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}.hoveronly#forms:not(:hover),.hoveronly#recentMatchesBox:not(:hover),.hoveronly.vscroll:not(:hover),.stylish-overflow.hoveronly:not(:hover),table.hoveronly.reg-asset-markets:not(:hover){scrollbar-color:transparent transparent}.hoveronly#forms:not(:hover)::-webkit-scrollbar-track,.hoveronly#recentMatchesBox:not(:hover)::-webkit-scrollbar-track,.hoveronly.vscroll:not(:hover)::-webkit-scrollbar-track,.stylish-overflow.hoveronly:not(:hover)::-webkit-scrollbar-track,table.hoveronly.reg-asset-markets:not(:hover)::-webkit-scrollbar-track{background-color:transparent}.hoveronly#forms:not(:hover)::-webkit-scrollbar-thumb,.hoveronly#recentMatchesBox:not(:hover)::-webkit-scrollbar-thumb,.hoveronly.vscroll:not(:hover)::-webkit-scrollbar-thumb,.stylish-overflow.hoveronly:not(:hover)::-webkit-scrollbar-thumb,table.hoveronly.reg-asset-markets:not(:hover)::-webkit-scrollbar-thumb{background-color:transparent;border-radius:4px}.overflow-x-hidden#forms,.overflow-x-hidden#recentMatchesBox,.overflow-x-hidden.vscroll,.stylish-overflow.overflow-x-hidden,table.overflow-x-hidden.reg-asset-markets{overflow-x:hidden}.hidden-overflow{overflow:auto;scrollbar-width:none}.hidden-overflow::-webkit-scrollbar{display:none}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.ease-color{transition:color 1s ease}.mw-375{max-width:375px}.mw-425{max-width:425px}.max-h-100{max-height:100%}.d-hide{display:none!important}.buycolor{color:var(--buy-color)}.sellcolor{color:var(--sell-color)}.grey{color:var(--text-grey)}.rounded3,div[data-handler=mm] .bot-type-selector,div[data-handler=mmarchives] .bot-type-selector,div[data-handler=mmlogs] .bot-type-selector,div[data-handler=mmsettings] .bot-type-selector{border-radius:3px}hr.dashed{border-top:2px dashed var(--border-color)}img.token-parent{height:.7em;position:relative;top:-.4em;width:.7em}sup.token-parent{font-size:.6em;position:relative;top:-.6em}.preline{white-space:pre-line}.vscroll{max-width:100%;overflow-x:hidden}.pointer{cursor:pointer!important}.underline{text-decoration:underline}.plainlink{color:inherit}.ico-info{margin-left:.25rem}.subtlelink,.subtlelink:visited{text-decoration:none}.subtlelink:hover,.subtlelink:visited:hover{cursor:pointer;text-decoration:underline!important}.word-break-all{user-select:all;word-break:break-all}.lh1{line-height:1}.fill-abs,div[data-handler=markets] #leftMarketDock #marketSearchV1,div[data-handler=mm] #placementsChart canvas,div[data-handler=mm] [data-tmpl=placementsChart] canvas,div[data-handler=mmarchives] #placementsChart canvas,div[data-handler=mmarchives] [data-tmpl=placementsChart] canvas,div[data-handler=mmlogs] #placementsChart canvas,div[data-handler=mmlogs] [data-tmpl=placementsChart] canvas,div[data-handler=mmsettings] #placementsChart canvas,div[data-handler=mmsettings] [data-tmpl=placementsChart] canvas{bottom:0;left:0;position:absolute;right:0;top:0}.min-fit{min-height:fit-content}div.clear{opacity:0}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.overflow-x-hidden,.overflow-x-hidden#forms,.overflow-x-hidden#recentMatchesBox,.stylish-overflow.overflow-x-hidden,table.overflow-x-hidden.reg-asset-markets{overflow-x:hidden}.user-select-all{user-select:all}.overflow-ellipsis{overflow:hidden;text-overflow:ellipsis}.user-select-none{user-select:none}.text-danger{color:var(--text-danger)}.text-warning{color:var(--text-warning)}.text-buycolor{color:var(--buy-color)}.text-sellcolor{color:var(--sell-color)}@font-face{font-family:icomoon;font-style:normal;font-weight:400;src:url(/font/icomoon.ttf?u8i98qq) format("truetype"),url(/font/icomoon.woff?u8i98qq) format("woff"),url(/font/icomoon.svg?u8i98qq#icomoon) format("svg")}[class*=" ico-"],[class^=ico-]{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:icomoon,monospace!important;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.micro-icon{height:15px;width:15px}.mini-icon{height:20px;width:20px}.small-icon{height:25px;width:25px}.medium-icon{height:30px;width:30px}.large-icon{height:40px;width:40px}.enourmous-icon{height:50px;width:50px}.ico-spinner:before{content:""}.ico-settings:before{content:""}.ico-plus:before{content:""}.ico-minus:before{content:""}.ico-check:before{color:var(--buy-color);content:"";display:inline-block}.ico-bell:before{content:""}.ico-locked:before{content:""}.ico-unlocked:before{content:""}.ico-sleeping:before{content:""}.ico-cross:before{content:""}.ico-profile:before{content:""}.ico-disconnected:before{content:""}.ico-search:before{content:""}.ico-expired:before{content:""}.ico-info:before{content:""}.ico-textfile:before{content:""}.ico-open:before{content:""}.ico-sync:before{content:""}.ico-target:before{content:""}.ico-arrowright:before{content:""}.ico-arrowdown:before{content:"";display:inline-block;transform:rotate(90deg)}.ico-arrowleft:before{content:"";display:inline-block;transform:rotate(180deg)}.ico-wide-headed-left-arrow:before{content:"";display:inline-block}.ico-arrowup:before{content:"";display:inline-block;transform:rotate(-90deg)}.ico-checkbox:before{content:""}.ico-connection:before{content:""}.ico-rocket:before{content:""}.ico-copy:before{content:""}.ico-qrcode:before{content:""}.ico-send:before{content:""}.ico-exchange:before{content:""}.ico-pause:before{content:""}.ico-hamburger:before{content:""}.ico-barchart:before{content:""}.ico-edit:before{content:""}.ico-ticket:before{content:""}.ico-robot:before{content:""}.ico-secretagent:before{content:""}.ico-lever:before{content:""}button{background-color:transparent;border:1px solid var(--btn-border-color);border-radius:5px;color:var(--text-color);font-size:1rem;padding:.375rem .75rem;user-select:none;white-space:nowrap}button,button:focus{outline:none}button:hover{background-color:hsla(0,0%,47%,.133);border-color:var(--btn-hover-border-color);text-decoration:none}button.small{font-size:.9rem;padding:.25rem .5rem}button.large{font-size:1.25rem;padding:.5rem 1rem}button.feature{background-color:var(--btn-feature-bg);border-color:var(--btn-feature-border-color)}button.feature:hover{background-color:var(--btn-feature-hover-bg);border-color:var(--btn-featur-hover-border-color)}button.danger{border-color:var(--text-danger);color:var(--text-danger)}button.danger:hover{background-color:var(--text-danger);color:var(--btn-danger-hover-color)}button.warning{border-color:var(--text-warning);color:var(--text-warning)}button.warning:hover{background-color:var(--text-warning);color:var(--btn-danger-hover-color)}button.go{background-color:var(--btn-go-bg);color:var(--btn-go-color)}button.go:hover{background-color:var(--btn-go-hover-bg)}table{border-collapse:collapse;color:var(--text-color);width:100%}table .table-group-divider{border-color:var(--border-color)}table.px-0 td:first-child,table.px-0 td:last-child,table.px-0 th:first-child,table.px-0 th:last-child{padding-left:0;padding-right:0}table td,table th{padding:.5rem}table td:last-child:not(:first-child),table th:last-child:not(:first-child){text-align:right}table td.no-stretch,table th.no-stretch{width:0}table.row-border tbody{border-bottom:1px solid var(--border-color)}table.row-border tbody tr{border-top:1px solid var(--border-color)}table.cell-border td,table.cell-border th{border:1px solid var(--border-color)}table.nopadding td{padding:0}table.compact td,table.compact th{padding:.25rem}table.row-hover tr:hover{background-color:var(--tertiary-bg)}table.striped tr:nth-of-type(2n){background-color:hsla(0,0%,47%,.133)}a{color:var(--link-color)}a:hover{color:var(--link-color-hover)}@media(min-width:768px){table#walletInfoTable{width:auto}}table.reg-asset-markets{display:block;line-height:1.15;margin-right:8px;max-height:120px;overflow-y:hidden}table.reg-asset-markets:hover{overflow-y:auto}table.reg-asset-markets tr{border:none}table.reg-asset-markets th{font-size:13px;font-weight:400}table.reg-asset-markets td{font-size:14px}table.reg-asset-markets td,table.reg-asset-markets th{padding:1px 5px}.form-check-label{cursor:pointer}.form-check-input[type=checkbox]{border:1px solid var(--form-input-border);cursor:pointer}.form-check-input[type=checkbox]:checked{background-color:var(--form-input-bg-active)}select{font-family:inherit;padding:.75rem 1rem}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}form.card button:hover{color:#000}input:invalid{box-shadow:none}.dashed{border-style:dashed}.micro-icon{position:relative}#tooltip{background-color:var(--section-bg);border:1px solid var(--border-color);border-radius:4px;font-size:15px;left:-10000px;max-width:300px;padding:3px 6px;position:absolute;z-index:1000}.on-indicator{border-radius:8px;height:15px;width:15px}.on-indicator.on{background-color:var(--indicator-good)}.on-indicator.off{background-color:#777}.border-left{border-left:1px solid var(--border-color)}.border-right{border-right:1px solid var(--border-color)}div[data-handler=dexsettings] #forms>form:not(.plain),div[data-handler=init] #forms>form:not(.plain),div[data-handler=login] #forms>form:not(.plain),div[data-handler=markets] #forms>form:not(.plain),div[data-handler=mm] #forms>form:not(.plain),div[data-handler=mmlogs] #forms>form:not(.plain),div[data-handler=mmsettings] #forms>form:not(.plain),div[data-handler=order] #forms>form:not(.plain),div[data-handler=orders] #forms>form:not(.plain),div[data-handler=register] #forms>form:not(.plain),div[data-handler=settings] #forms>form:not(.plain),div[data-handler=wallets] #forms>form:not(.plain){background-color:var(--form-bg);border:1px solid var(--border-color);border-radius:5px;box-shadow:0 3px 6px rgba(0,0,0,.129),0 2px 7px rgba(0,0,0,.255)}.corner-button{position:absolute;top:0}.corner-button.left{left:0}.corner-button.right{right:0}html{height:100%}body{background-color:var(--body-bg);bottom:0;color:var(--text-color);display:flex;flex-direction:column;justify-content:flex-start;left:0;position:fixed;right:0;top:0}header#header{align-items:center;background-color:var(--section-bg);display:flex;height:70px;justify-content:space-between;min-height:70px;width:100%;z-index:100}header#header .plainlink,header#header .plainlink:hover,header#header .plainlink:visited,header#header a,header#header a:hover,header#header a:visited{text-decoration:none}header#header .hoverbright:hover{color:var(--subtle-link-hover)}section{background-color:var(--section-bg);border:1px solid var(--border-color);border-radius:.25rem;margin:.5rem 0}div.main{display:flex;flex-grow:1;min-height:0;position:relative}div.mainlinks>a,div.mainlinks>div{color:var(--text-color-secondary);padding:.5rem .75rem}@media(min-width:768px){div.mainlinks>a,div.mainlinks>div{padding:.75rem 1rem}}.spinner{animation:spin 2s linear infinite}.spinner.fast{animation:spin 1s linear infinite}div.note-indicator{border-radius:3px;height:6px;width:6px}div.note-indicator.good{background-color:var(--indicator-good)}div.note-indicator.bad{background-color:rgba(221,34,34,.933)}div.note-indicator.warn{background-color:var(--text-warning)}.z10{z-index:10}span.brand:before{content:"Bison Wallet"}img.dex-logo{content:var(--dex-url)}img.logo-square{content:url(/img/bison-square_50.png)}img.logo-square.small{height:25px;width:25px}img.logo-full{content:url(/img/bison-full_97x50.png)}img.logo-full.small{height:25px;width:48.5px}body.dex-branding img.logo-full,body.dex-branding img.logo-square{content:url(/img/softened-icon.png);height:50px;width:50px}body.dex-branding img.logo-full.small,body.dex-branding img.logo-square.small{height:25px;width:25px}body.dex-branding img.logo-full.micro-icon,body.dex-branding img.logo-square.micro-icon{height:15px;width:15px}body.dex-branding.dark img.logo-full,body.dex-branding.dark img.logo-square{content:url(/img/softened-icon-dark.png)}body.dex-branding span.brand:before{content:"DCRDEX"}#noteIndicator{font-family:demi-sans,sans-serif;font-size:16px;font-weight:700;left:20px;line-height:1;position:absolute;top:0;z-index:2}#noteIndicator.good{color:var(--indicator-good)}#noteIndicator.bad{color:rgba(221,34,34,.933)}#noteIndicator.warn{color:var(--text-warning)}div.popup-notes{align-items:flex-end;border-radius:4px;bottom:0;display:flex;flex-direction:column;max-width:750px;position:fixed;right:5px;z-index:1000}div.popup-notes>span{background-color:var(--popup-notes-bg);color:var(--popup-notes-color);display:inline-block;line-height:1;margin:3px 0 0;max-width:100%;overflow:hidden;padding:4px 10px;text-overflow:ellipsis;white-space:nowrap}div.popup-notes .note-indicator{margin-bottom:2px}[data-unit]{color:var(--hint-color)}[data-unit-box]{cursor:default;overflow:visible;position:relative}[data-unit-box]>div{color:var(--text-color);left:-2rem;z-index:10}#noteBox,#profileBox{align-items:stretch;background-color:var(--section-bg);border:1px solid var(--border-color);display:flex;flex-direction:column;line-height:1.5;max-height:90%;min-width:150px;position:fixed;z-index:100}#noteBox .icon,#profileBox .icon{position:absolute;right:15px;top:8px}#noteBox .header,#profileBox .header{background-color:var(--section-bg);border-bottom:1px solid var(--border-color)}#noteBox .header>div,#profileBox .header>div{cursor:pointer;opacity:.5}#noteBox .header>div.active,#profileBox .header>div.active{opacity:1}#noteBox:not(.authed) .authed-only,#profileBox:not(.authed) .authed-only{display:none!important}#noteBox{width:425px}#noteBox div.note.firstview{background-color:var(--tertiary-bg)}#noteBox div.note:not(:last-child){border-bottom:1px solid var(--border-color)}#profileBox{min-width:250px}#loader{background-color:var(--body-bg-lower-opacity)}#requiredActions{bottom:0;left:0;position:absolute;z-index:98}#requiredActions>div{background-color:var(--body-bg);border:3px solid var(--border-color)}@media(min-width:576px){section{margin:.5rem}}@media(min-width:992px){.w-lg-auto,section{width:auto}}label{cursor:pointer;margin-bottom:.25rem}input[type=date],input[type=number],input[type=password],input[type=text],input[type=url],textarea{background-color:var(--form-input-bg);border:1px solid var(--form-input-border);border-radius:5px;color:var(--text-color);display:block;padding:.375rem .75rem;width:100%}input[type=date]:focus,input[type=number]:focus,input[type=password]:focus,input[type=text]:focus,input[type=url]:focus,textarea:focus{border-color:var(--form-input-border-focus);outline:none}input[type=date].border-danger,input[type=number].border-danger,input[type=password].border-danger,input[type=text].border-danger,input[type=url].border-danger,textarea.border-danger{border-color:var(--text-danger)}input[type=date].border-success,input[type=number].border-success,input[type=password].border-success,input[type=text].border-success,input[type=url].border-success,textarea.border-success{border-color:var(--indicator-good)}input[type=date].thin,input[type=number].thin,input[type=password].thin,input[type=text].thin,input[type=url].thin,textarea.thin{width:4rem}input[type=date].micro,input[type=number].micro,input[type=password].micro,input[type=text].micro,input[type=url].micro,textarea.micro{font-size:14px;padding:0 .25rem;width:3rem}input[type=date].micro.wide,input[type=number].micro.wide,input[type=password].micro.wide,input[type=text].micro.wide,input[type=url].micro.wide,textarea.micro.wide{width:5rem}input[type=date].micro.thin,input[type=number].micro.thin,input[type=password].micro.thin,input[type=text].micro.thin,input[type=url].micro.thin,textarea.micro.thin{width:2rem}select{background-color:var(--form-input-bg)!important}.form-select{background-color:var(--form-input-bg);border:1px solid var(--form-input-border);border-radius:3px;color:var(--text-color)}.form-select:focus{border-color:var(--form-input-border-focus)}#regAssetForm input[data-tmpl=tradingTierInput]{width:3em}#regAssetForm .readygreen{color:#009931}#regAssetForm .setuporange{color:#b89400}#confirmRegForm{width:425px}#confirmRegForm button.submit{border-radius:3px;opacity:.9;padding:12px 30px;width:auto}#confirmRegForm button.submit:hover{opacity:1}#confirmRegForm input.app-pass{display:inline-block;max-width:250px}#confirmRegForm div.reg-conf-msg{width:100%}#confirmRegForm div.borderright{border-right:1px solid #777}#confirmRegForm .mw50{max-width:50%}#newWalletForm{width:425px}#newWalletForm [data-tmpl=walletTypeTabs] .wtab.selected{background-color:var(--form-selected-tab-bg);cursor:default;opacity:1}#newWalletForm [data-tmpl=walletTypeTabs] .wtab:not(.selected){cursor:pointer;opacity:.8}#newWalletForm [data-tmpl=walletTypeTabs] .wtab:not(.selected):hover{opacity:1}#newWalletForm .one-bttn{animation:glow 1.5s infinite alternate;background-color:#0b5831;border-radius:5px;display:inline-block;font-size:22px;padding:10px 25px}#newWalletForm .one-bttn:hover{background-color:#0c5f36}@keyframes glow{0%{box-shadow:0 0 4px -3px hsla(0,0%,100%,.467);opacity:.95}to{box-shadow:0 0 4px 0 hsla(0,0%,100%,.467);opacity:1}}.form-check-label{user-select:none}#forms{backdrop-filter:blur(5px);background-color:var(--forms-bg);bottom:0;left:0;padding:25px 0;position:fixed;right:0;top:0;z-index:101}#forms>form{box-sizing:content-box;margin:auto;padding-bottom:1rem;position:relative}#forms>form>div{padding:1rem 1rem 0}#forms>form>div.form-closer,#forms>form>div.form-closer-unbound{cursor:pointer;font-size:.8rem;line-height:1;padding:.75rem;position:absolute;right:0;top:0;z-index:1}#forms>form>div.form-closer span,#forms>form>div.form-closer-unbound span{opacity:.6}#forms>form>div.form-closer span:hover,#forms>form>div.form-closer-unbound span:hover{opacity:1}#forms>form header{border-bottom:1px solid var(--border-color);font-size:1.6rem;line-height:1;padding:1rem}div[data-handler=init] #forms,div[data-handler=login] #forms,div[data-handler=register] #forms{margin-top:70px;z-index:99}#walletWait .icons{width:25px}#walletWait .ico-check{color:rgba(5,163,90,.6)}#dexAddrForm .known-exchange{border:1px solid #555;border-radius:3px;cursor:pointer;font-size:17px;margin-bottom:10px;padding:5px 0;width:100%}#dexAddrForm .known-exchange.selected,#dexAddrForm .known-exchange:hover{background-color:hsla(0,0%,47%,.133)}#authorizeAccountImportForm,#disableAccountForm,#discoverAcctForm,#loginForm{width:275px}#changeAppPWForm,#deleteArchivedRecordsForm,#dexAddrForm,#resetAppPWForm,#verifyForm{width:325px}#appPWForm{width:350px}#cancelForm,#exportSeedAuth,#quickConfigForm,#sendForm,#toggleWalletStatusConfirm,#vSendForm,#walletWait{width:375px}#authorizeSeedDisplay,#confirmRegistrationForm,#gameCodeForm,#reconfigForm,#regAssetForm,#seedBackupForm,#votingForm{width:425px}a[data-tmpl=walletCfgGuide]{color:inherit;text-decoration:none}#deposit #copyAlert{margin-left:12px;position:absolute}.mini-slider{cursor:pointer;padding:.5rem 0;user-select:none}.mini-slider div[data-tmpl=color]{background-color:hsla(0,0%,47%,.467);height:.2rem;overflow:visible;position:relative;width:100%}.mini-slider div[data-tmpl=color]>div[data-tmpl=track]{bottom:0;left:.375rem;overflow:visible;position:absolute;right:.375rem;top:0}.mini-slider div[data-tmpl=color]>div[data-tmpl=track]>div[data-tmpl=ball]{background-color:var(--text-grey);border-radius:1rem;cursor:pointer;height:.75rem;position:absolute;top:.1rem;transform:translate(-50%,-50%);width:.75rem}.mini-slider.small div[data-tmpl=color]{height:.125rem}.mini-slider.small div[data-tmpl=color]>div[data-tmpl=track]{left:.25rem;right:.25rem}.mini-slider.small div[data-tmpl=color]>div[data-tmpl=track]>div[data-tmpl=ball]{height:.5rem;width:.5rem}.order-opt,.slider-container{border:1px solid #424242;border-radius:3px;margin-top:8px;padding:4px}.order-opt>div.disabled,.slider-container>div.disabled{opacity:.8}.order-opt>div.disabled [data-tmpl=sliderBox],.slider-container>div.disabled [data-tmpl=sliderBox]{cursor:default}.order-opt>div.disabled [data-tmpl=sliderBox] .slider .slider-handle,.slider-container>div.disabled [data-tmpl=sliderBox] .slider .slider-handle{background-color:hsla(0,0%,47%,.733)}.order-opt div.opt-check,.slider-container div.opt-check{border:2px solid #424242;border-radius:7.5px;cursor:pointer;height:15px;margin-top:5px;width:15px}.order-opt .xy-range-input,.slider-container .xy-range-input{font-size:14px;height:16px;width:35px}.order-opt [data-tmpl=sliderBox],.slider-container [data-tmpl=sliderBox]{cursor:pointer}.order-opt [data-tmpl=sliderBox] .slider,.slider-container [data-tmpl=sliderBox] .slider{background-color:gray;height:2px;margin:10px 10px 5px;position:relative}.order-opt [data-tmpl=sliderBox] .slider .slider-handle,.slider-container [data-tmpl=sliderBox] .slider .slider-handle{background-color:#2cce9c;border:2px solid #424242;border-radius:7px;height:20px;position:absolute;top:-9px;width:14px}div[data-tmpl=scoreTray]{background-color:var(--buy-color);border-radius:100px;height:12px;overflow:hidden}div[data-tmpl=scoreTray] div[data-tmpl=scoreWarn]{background-color:var(--sell-color);bottom:0;left:0;position:absolute;top:0}span[data-tmpl=scorePointer]{transform:translateX(-50%)}span[data-tmpl=scorePointer] span[data-tmpl=scoreData]{bottom:0;top:0}span[data-tmpl=scorePointer] span[data-tmpl=scoreData].positive{right:calc(100% + .125rem)}span[data-tmpl=scorePointer] span[data-tmpl=scoreData].negative{left:calc(100% + .125rem)}.penalty-marker{background-color:#000;bottom:0;left:10%;position:absolute;top:0;width:2px;z-index:2}div[data-handler=init] .quickconfig-asset-logo{height:25px;width:25px}.anitoggle{background-color:hsla(0,0%,47%,.667);border-radius:.45rem;cursor:pointer;height:.9rem;width:1.5rem}.anitoggle.on{background-color:var(--indicator-good)}.anitoggle>div{background-color:var(--section-bg);border-radius:.35rem;height:.7rem;left:.1rem;position:relative;top:.1rem;transition:left .5s;width:.7rem}.anitoggle.on>div{left:.7rem}.anitoggle.big{border-radius:10px;height:20px;width:35px}.anitoggle.big>div{border-radius:12px;height:16px;left:2px;top:2px;width:16px}.anitoggle.big.on>div{left:17px}.selectable.selected{border:2px solid green}.dynamicopts{align-items:stretch;display:flex;flex-wrap:wrap;justify-content:space-between}.dynamicopts>div{min-height:55px}.dynamicopts>div:not(.repeatable,[data-tmpl=checkbox]){width:47%}.hoveropaque{opacity:.7}.hoveropaque:hover{opacity:1}#placementsBody td[data-tmpl=error]{max-width:200px}body.dark ::-webkit-calendar-picker-indicator{filter:invert(1)}body.dark #regAssetForm div.reg-asset .fader{background-image:linear-gradient(180deg,rgba(19,32,43,0),#122739 90%)}body.dark #regAssetForm div.reg-asset:not(.nohover):hover .fader{background-image:linear-gradient(180deg,rgba(32,44,53,0),#202c35 90%)}div[data-handler=markets] .ordertable-wrap{width:100%}div[data-handler=markets] .ordertable-wrap:first-child{border-bottom:1px solid var(--border-color)}div[data-handler=markets] .ordertable-wrap tbody#sellRows,div[data-handler=markets] .ordertable-wrap:last-child{border-top:1px solid var(--border-color)}div[data-handler=markets] .orderbook{min-width:225px}div[data-handler=markets] .orderbook>div:first-child{order:3}div[data-handler=markets] .orderbook>div:nth-child(2){order:1}div[data-handler=markets] .orderbook>div:last-child{order:2}div[data-handler=markets] .order-panel{min-width:375px}div[data-handler=markets] .order-panel #orderForm input[type=number]{border-radius:0;font-size:14px;height:30px}div[data-handler=markets] .order-panel #orderForm input:focus{outline:none}div[data-handler=markets] .order-panel #orderForm span.unitbox{font-size:14px;font-weight:700;position:absolute;right:5px;top:48%;transform:translateY(-50%);white-space:nowrap}div[data-handler=markets] .order-panel #orderForm button{background-color:var(--section-bg);border:1px solid hsla(0,0%,47%,.467);border-radius:3px;color:var(--market-btn-color);padding:5px 25px}div[data-handler=markets] .order-panel #orderForm button:disabled{opacity:.4}div[data-handler=markets] .order-panel #orderForm button.selected,div[data-handler=markets] .order-panel #orderForm button.submit,div[data-handler=markets] .order-panel #orderForm button:hover{color:var(--market-btn-selected-color)}div[data-handler=markets] .order-panel #orderForm button.selected.buygreen-bg,div[data-handler=markets] .order-panel #orderForm button.submit.buygreen-bg{background-color:var(--market-buygreen-bg)}div[data-handler=markets] .order-panel #orderForm button.selected.sellred-bg,div[data-handler=markets] .order-panel #orderForm button.submit.sellred-bg{background-color:var(--market-sellred-bg)}div[data-handler=markets] .order-panel #orderForm #orderPreview,div[data-handler=markets] .order-panel #orderForm .h21{height:21px}div[data-handler=markets] .order-panel .ico-unlocked{color:#0b5831}div[data-handler=markets] .order-panel .ico-disconnected{color:var(--text-warning)}div[data-handler=markets] .market-chart{flex-grow:1;min-height:250px;min-width:100px;position:relative}div[data-handler=markets] .market-chart canvas{left:0;position:absolute;top:0;user-select:none}div[data-handler=markets] #unreadyOrdersMsg{color:rgba(221,34,34,.933)}div[data-handler=markets] .unready-user-order{background-color:#6e0909}div[data-handler=markets] .user-order:not(:last-child){border-bottom-style:none!important}div[data-handler=markets] .user-order:last-child .order-details{border-bottom-style:none!important;padding-bottom:0}div[data-handler=markets] .user-order .user-order-header{font-size:14px;padding:5px 10px 5px 20px;position:relative}div[data-handler=markets] .user-order .user-order-header .side-indicator{bottom:0;left:0;position:absolute;top:0;width:8px}div[data-handler=markets] .user-order .user-order-header .side-indicator.buy{background-color:var(--buy-color)}div[data-handler=markets] .user-order .user-order-header .side-indicator.sell{background-color:var(--market-sell-color)}div[data-handler=markets] .user-order .user-order-header .side-indicator.inactive{opacity:.5}div[data-handler=markets] .user-order .user-order-header .active-indicator{border-radius:4px;height:8px}div[data-handler=markets] .user-order .user-order-header .active-indicator.active{background-color:var(--buy-color);margin:0 5px;width:8px}div[data-handler=markets] .user-order .order-details{column-gap:5px;display:grid;grid-template-columns:1fr 1fr 1fr 1fr;line-height:1;margin-bottom:25px;padding:0 10px 10px;row-gap:10px}div[data-handler=markets] .user-order .order-details .user-order-datum{align-items:flex-start;display:flex;flex-direction:column;flex-grow:1}div[data-handler=markets] .user-order .order-details .user-order-datum>span:first-child{color:gray;font-family:demi-sans,sans-serif;font-size:12px;margin-bottom:2px}div[data-handler=markets] .user-order .order-details .user-order-datum>span:nth-child(2){font-size:14px}div[data-handler=markets] .user-order .order-details .user-order-datum.full-span{grid-column:1/-1}div[data-handler=markets] .markettab{background-color:var(--section-bg);border-style:none;height:30px}div[data-handler=markets] .markettab.selected{background-color:var(--market-markettab-selected-bg)}div[data-handler=markets] .numorders{background-color:var(--market-numorders-bg);padding:1px 2px}div[data-handler=markets] #leftMarketDock{background-color:var(--section-bg);display:flex;left:0;min-height:-webkit-fill-available;position:absolute;top:0;z-index:2}div[data-handler=markets] #leftMarketDock.default,div[data-handler=markets] #leftMarketDock.stashed{display:none}div[data-handler=markets] #leftMarketDock #searchBoxV1{height:55px}div[data-handler=markets] #leftMarketDock.stashed{display:none}div[data-handler=markets] #leftMarketDock #marketSearchV1:focus{border:none;outline:none}div[data-handler=markets] #leftMarketDock #marketSearchV1{background-color:transparent;border:none;font-family:demi-sans,sans-serif;font-size:25px;font-variant:small-caps;text-align:center;width:100%;z-index:2}div[data-handler=markets] #leftMarketDock #marketSearchV1+.ico-search{left:50%;opacity:.25;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);z-index:1}div[data-handler=markets] #leftMarketDock #marketSearchV1:hover+.ico-search{opacity:.5}div[data-handler=markets] #leftMarketDock #marketSearchV1:focus+.ico-search,div[data-handler=markets] #leftMarketDock #marketSearchV1:not(:placeholder-shown)+.ico-search{display:none}div[data-handler=markets] #leftMarketDock #marketListV1{height:100%;min-width:275px}div[data-handler=markets] #leftMarketDock #marketListV1>div .dexname{max-width:60px;overflow:hidden;text-overflow:ellipsis}div[data-handler=markets] #leftMarketDock #marketListV1>div.selected{background-color:hsla(0,0%,47%,.2)}div[data-handler=markets] #mainContent{align-items:center;display:flex;flex-direction:column}div[data-handler=markets] #mainContent>div,div[data-handler=markets] #mainContent>section{display:flex;min-height:500px}div[data-handler=markets] #mainContent>div:first-child,div[data-handler=markets] #mainContent>section:first-child{max-height:1000px;order:3}div[data-handler=markets] #mainContent>div:nth-child(2),div[data-handler=markets] #mainContent>section:nth-child(2){order:1}div[data-handler=markets] #mainContent>div:last-child,div[data-handler=markets] #mainContent>section:last-child{order:2}div[data-handler=markets] #durBttnBox,div[data-handler=markets] #epochLine{background-color:var(--section-bg);left:65px;position:absolute;top:5px;z-index:1}div[data-handler=markets] #durBttnBox .candle-dur-bttn{background-color:var(--section-bg);font-size:14px;line-height:1;margin:0 2px;padding:2px 4px}div[data-handler=markets] #durBttnBox .candle-dur-bttn:hover{background-color:hsla(0,0%,47%,.467)}div[data-handler=markets] #durBttnBox .candle-dur-bttn.selected,div[data-handler=markets] #durBttnBox .candle-dur-bttn:hover{border-color:var(--text-warning);color:var(--text-warning)}div[data-handler=markets] #epochLine .epoch-line{border-top:3px dotted #626262;display:inline-block;height:0;margin-right:5px;position:relative;top:1px;width:25px}div[data-handler=markets] #loaderMsg{color:#777}div[data-handler=markets] #bondCreationPending .title{color:#9b8c09;font-weight:700;margin-bottom:5px}div[data-handler=markets] #registrationStatus .title{font-weight:700;margin-bottom:5px}div[data-handler=markets] #registrationStatus.waiting .title{color:#9b8c09}div[data-handler=markets] #registrationStatus.completed .title{color:#0b5831}div[data-handler=markets] #registrationStatus.completed #regStatusMessage{display:none}div[data-handler=markets] #registrationStatus.error .title{color:rgba(221,34,34,.933)}div[data-handler=markets] #approveTokenForm{width:450px}div[data-handler=markets] #verifyForm .echo-data span{margin:0 5px}div[data-handler=markets] #verifyForm .disclaimer{text-align:justify}div[data-handler=markets] #verifyForm header.buygreen-bg{background-color:var(--market-buygreen-bg)}div[data-handler=markets] #verifyForm header.sellred-bg{background-color:var(--market-sellred-bg)}div[data-handler=markets] #verifyForm button.buygreen-bg{background-color:var(--market-buygreen-bg)}div[data-handler=markets] #verifyForm button.sellred-bg{background-color:var(--market-sellred-bg)}div[data-handler=markets] #verifyForm .loader{height:40px}div[data-handler=markets] #verifyForm .order-opt{opacity:.7}div[data-handler=markets] #verifyForm .order-opt:not(.selected){cursor:pointer}div[data-handler=markets] #verifyForm .order-opt.selected{background-color:var(--form-opt-selected-bg);opacity:1}div[data-handler=markets] #verifyForm .order-opt.selected div.opt-check{background-color:#0b5831}div[data-handler=markets] #vDetailPane{max-width:425px}div[data-handler=markets] #vDetailPane .indent{border-left:2px solid var(--border-color)}div[data-handler=markets] #vDetailPane table.fee-breakout td{padding:2px 5px;text-align:center}div[data-handler=markets] #marketReopener{background-color:var(--section-bg);display:none;left:0;padding:10px 0;position:absolute;top:0;z-index:10}div[data-handler=markets] #leftHider .ico-arrowleft,div[data-handler=markets] #leftHider .ico-arrowright,div[data-handler=markets] #marketReopener .ico-arrowleft,div[data-handler=markets] #marketReopener .ico-arrowright{opacity:.5;transform:scaleX(.5)}div[data-handler=markets] #leftHider:hover .ico-arrowleft,div[data-handler=markets] #leftHider:hover .ico-arrowright,div[data-handler=markets] #marketReopener:hover .ico-arrowleft,div[data-handler=markets] #marketReopener:hover .ico-arrowright{opacity:1}.market-stats{display:flex;gap:15px;margin:0 5px}.market-stats .statgrid{display:grid;grid-template-columns:auto auto auto}#headerSpace .market-stats,.market-stats.listopen .ico-arrowdown,.market-stats:not(.listopen) .ico-arrowup{display:none}#recentMatchesBox{max-height:350px}#recentMatchesTable th{align-items:center}#recentMatchesTable th:hover{opacity:.7}#recentMatchesTable th .ico-arrowdown{display:inline-block;font-size:10px;margin-left:5px;vertical-align:middle;visibility:hidden}#recentMatchesTable th.sorted-dsc .ico-arrowdown{visibility:visible}#recentMatchesTable th.sorted-asc .ico-arrowdown{transform:rotate(180deg);visibility:visible}@media(min-width:1200px){#main .market-stats{border-top:none;display:none}#headerSpace .market-stats{border-bottom:none!important;display:flex}div[data-handler=markets] #leftMarketDock{position:relative}div[data-handler=markets] #leftMarketDock.default{display:flex}}@media(min-width:992px){div[data-handler=markets] #mainContent{align-items:stretch;bottom:0;flex-direction:row;left:0;overflow:hidden;position:absolute;right:0;top:0}div[data-handler=markets] #mainContent>div,div[data-handler=markets] #mainContent>section{display:flex;min-height:none}div[data-handler=markets] #mainContent>div:nth-child(n),div[data-handler=markets] #mainContent>section:nth-child(n){min-height:auto}div[data-handler=markets] #mainContent>div:first-child,div[data-handler=markets] #mainContent>section:first-child{order:1}div[data-handler=markets] #mainContent>div:nth-child(2),div[data-handler=markets] #mainContent>section:nth-child(2){order:2}div[data-handler=markets] #mainContent>div:last-child,div[data-handler=markets] #mainContent>section:last-child{order:3}div[data-handler=markets] .ordertable-wrap{display:flex;height:calc(50% - 15px)}div[data-handler=markets] .ordertable-wrap.reversible{flex-direction:column-reverse}div[data-handler=markets] .ordertable-wrap tbody{align-items:stretch;display:flex}div[data-handler=markets] .ordertable-wrap tbody#sellRows{border-top:none;flex-direction:column-reverse}div[data-handler=markets] .ordertable-wrap tbody#buyRows{flex-direction:column}div[data-handler=markets] .orderbook{width:auto}div[data-handler=markets] .orderbook>div:first-child{order:1}div[data-handler=markets] .orderbook>div:nth-child(2){order:2}div[data-handler=markets] .orderbook>div:last-child{order:3}div[data-handler=markets] .order-panel>div{bottom:0;height:100%;left:0;overflow:auto;overflow-x:hidden;position:absolute;right:0;scrollbar-color:hsla(0,0%,47%,.267) hsla(0,0%,47%,.067);scrollbar-width:thin;top:0}div[data-handler=markets] .order-panel>div::-webkit-scrollbar{height:8px;width:8px}div[data-handler=markets] .order-panel>div::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}div[data-handler=markets] .order-panel>div::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}div[data-handler=markets] #leftMarketDock.stashed+#marketReopener{display:block}#recentMatchesBox{border-bottom:none;max-height:none;overflow:visible}#candlesLegend,#depthLegend{background-color:var(--section-bg);position:absolute;right:0;top:0;z-index:10}}.user-order-floaty-menu{align-items:center;background-color:var(--section-bg);border-color:var(--border-color);border-style:none solid solid;border-width:0 2px 2px 1px;cursor:pointer;display:flex;overflow:hidden;position:absolute;z-index:5}.user-order-floaty-menu>a,.user-order-floaty-menu>span{margin:0 5px;padding-left:10px;padding-right:10px}.user-order-floaty-menu>a:hover,.user-order-floaty-menu>span:hover{background-color:hsla(0,0%,47%,.333)}.bot-problems-section{background-color:rgba(255,0,0,.667);border-radius:5px;margin-bottom:2px;margin-top:2px;padding-left:2px}.walletspage .ico-unlocked{color:var(--indicator-good)}.walletspage .market-select-logo{height:20px;width:20px}.walletspage .short-host{max-width:175px;text-overflow:ellipsis}.walletspage .mw-90p{min-width:90%}.walletspage #confirmForce,.walletspage #recoverWalletConfirm,.walletspage #toggleWalletStatusConfirm{width:400px}.walletspage #content{flex-direction:column}.walletspage #assetSelect{flex-direction:row}.walletspage #assetSelect .icon-select{cursor:pointer;min-height:fit-content}.walletspage #assetSelect .icon-select img[data-tmpl=img]{height:30px;width:30px}.walletspage #assetSelect .icon-select img[data-tmpl=parentImg]{background-color:var(--section-bg);border:3px solid var(--section-bg);border-radius:10px;bottom:15px;height:20px;left:15px;position:absolute;width:20px}.walletspage #assetSelect .icon-select.selected,.walletspage #assetSelect .icon-select:hover{background-color:var(--body-bg);opacity:1}.walletspage #assetSelect .icon-select.selected img[data-tmpl=parentImg],.walletspage #assetSelect .icon-select:hover img[data-tmpl=parentImg]{background-color:var(--section-bg);border:3px solid var(--body-bg)}.walletspage #assetSelect .icon-select.nowallet{opacity:.7}.walletspage #assetSelect .icon-select.nowallet [data-tmpl=balance]{display:none}.walletspage table#balanceTable td{line-height:1}.walletspage table#balanceTable tr.itemized>td{padding-bottom:.25rem}.walletspage table#balanceTable tr:not(.sub,:first-child) td{padding-top:.5rem}.walletspage table#balanceTable tr{font-size:1.1rem}.walletspage table#balanceTable tr.sub{font-size:.9rem}.walletspage table#balanceTable tr.sub.last>td:first-child:before{content:"└─ "}.walletspage table#balanceTable tr.sub>td:first-child:before{content:"├─ "}.walletspage table#balanceTable tr.sub>td:last-child{border-right:1px solid var(--border-color);padding-right:.5rem}.walletspage #walletInfo{border-left:none}.walletspage #walletInfo table#walletInfoTable td{line-height:1;padding:2px 5px 2px 0}.walletspage #walletInfo table#walletInfoTable td:last-child{padding-left:1rem;text-align:right}.walletspage #earlierTxs,.walletspage #txViewBlockExplorer{cursor:pointer;text-decoration:underline}.walletspage #checkmarkBox{height:100px}.walletspage #walletDetailsBox #assetLogo{height:30px;width:30px}.walletspage #walletDetailsBox #assetName{font-size:30px}.walletspage #walletDetailsBox #balance{font-size:20px}.walletspage #walletDetailsBox #balanceUnit{font-size:17px}.walletspage #walletDetailsBox #fiatBalanceBox{font-size:13px}.walletspage #walletDetailsBox #tokenParentLogo{height:18px;width:18px}.walletspage #walletDetailsBox #contractAddress{opacity:.4}.walletspage .peers-table-icon{padding-left:30%}.walletspage #vspDisplay #vspEditIcon{display:none}.walletspage #vspDisplay:hover #vspEditIcon{display:inline}.walletspage .scrollsmall{overflow:auto;scrollbar-color:hsla(0,0%,47%,.267) hsla(0,0%,47%,.067);scrollbar-width:thin}.walletspage .scrollsmall::-webkit-scrollbar{height:8px;width:8px}.walletspage .scrollsmall::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}.walletspage .scrollsmall::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}.walletspage .positive-tx{color:var(--indicator-good)}.walletspage .negative-tx{color:rgba(221,34,34,.933)}@media(min-width:1200px){.scrollsmall{overflow:hidden}.column{bottom:0;left:0;overflow:auto;position:absolute;right:0;scrollbar-width:none;top:0}.column::-webkit-scrollbar{display:none}}@media(min-width:992px){.fill-abs-lg{bottom:0;left:0;position:absolute;right:0;top:0}.stylish-overflow-lg{overflow:auto;scrollbar-color:hsla(0,0%,47%,.267) hsla(0,0%,47%,.067);scrollbar-width:thin}.stylish-overflow-lg::-webkit-scrollbar{height:8px;width:8px}.stylish-overflow-lg::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}.stylish-overflow-lg::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}.walletspage #walletDetailsBox{border-bottom:none!important}.flex-wrap-lg{flex-wrap:wrap}#purchaseTicketsErrBox{background-color:var(--section-bg)}}@media(min-width:576px){.walletspage #walletDetailsBox #assetLogo{height:40px;width:40px}.walletspage #walletDetailsBox #assetName{font-size:40px}.walletspage #walletDetailsBox #balance{font-size:28px}.walletspage #walletDetailsBox #balanceUnit{font-size:20px}.walletspage #walletDetailsBox #fiatBalanceBox{font-size:15px}.walletspage #content{flex-direction:row}.walletspage #assetSelect{flex-direction:column;overflow-y:auto}.walletspage #assetSelect .icon-select{padding:15px}.walletspage #assetSelect .icon-select img[data-tmpl=img]{height:40px;width:40px}.walletspage #assetSelect .icon-select img[data-tmpl=parentImg]{border-radius:15px;bottom:20px;height:28px;left:20px;width:28px}}@media(min-width:768px){.walletspage #sendReceive{border-bottom:none}}#exportWalletAuth,#restoreWalletInfo,#txDetails,#unapproveTokenForm{width:450px}#submitReconfig[disabled]{cursor:not-allowed}.filter-display{border-radius:3px;cursor:pointer;font-size:16px;font-weight:700}.filter-opts{max-width:250px;position:relative;text-overflow:ellipsis;white-space:nowrap}div.order-datum{align-items:stretch;display:flex;flex-direction:column;font-size:15px;justify-content:start;text-align:center}div.order-datum div:first-child{font-family:demi-sans,sans-serif}div.match-header,div.order-datum div:first-child{background-color:var(--tertiary-bg)}div.match-card{align-items:stretch;display:flex;flex-direction:column;font-size:14px}.match-data-label{font-family:demi-sans,sans-serif;opacity:.5}#accelerateForm{width:500px}div.settings{min-width:375px}div[data-handler=mm] #gapStrategySelect,div[data-handler=mmarchives] #gapStrategySelect,div[data-handler=mmlogs] #gapStrategySelect,div[data-handler=mmsettings] #gapStrategySelect{width:300px}div[data-handler=mm] .gap-factor-input,div[data-handler=mm] .lots-input,div[data-handler=mmarchives] .gap-factor-input,div[data-handler=mmarchives] .lots-input,div[data-handler=mmlogs] .gap-factor-input,div[data-handler=mmlogs] .lots-input,div[data-handler=mmsettings] .gap-factor-input,div[data-handler=mmsettings] .lots-input{max-width:75px}div[data-handler=mm] [data-tmpl=value].wide,div[data-handler=mmarchives] [data-tmpl=value].wide,div[data-handler=mmlogs] [data-tmpl=value].wide,div[data-handler=mmsettings] [data-tmpl=value].wide{width:3rem}div[data-handler=mm] .ico-arrowup.ml2px,div[data-handler=mmarchives] .ico-arrowup.ml2px,div[data-handler=mmlogs] .ico-arrowup.ml2px,div[data-handler=mmsettings] .ico-arrowup.ml2px{margin-left:2px}div[data-handler=mm] .pt-pt5,div[data-handler=mmarchives] .pt-pt5,div[data-handler=mmlogs] .pt-pt5,div[data-handler=mmsettings] .pt-pt5{padding-top:.125rem}div[data-handler=mm] #profitInput,div[data-handler=mmarchives] #profitInput,div[data-handler=mmlogs] #profitInput,div[data-handler=mmsettings] #profitInput{width:70px}div[data-handler=mm] .bot-type-selector,div[data-handler=mmarchives] .bot-type-selector,div[data-handler=mmlogs] .bot-type-selector,div[data-handler=mmsettings] .bot-type-selector{align-items:stretch;border:1px solid var(--border-color);display:flex;flex-direction:column;user-select:none}div[data-handler=mm] .bot-type-selector.disabled,div[data-handler=mmarchives] .bot-type-selector.disabled,div[data-handler=mmlogs] .bot-type-selector.disabled,div[data-handler=mmsettings] .bot-type-selector.disabled{opacity:.5}div[data-handler=mm] .bot-type-selector:not(.disabled),div[data-handler=mmarchives] .bot-type-selector:not(.disabled),div[data-handler=mmlogs] .bot-type-selector:not(.disabled),div[data-handler=mmsettings] .bot-type-selector:not(.disabled){cursor:pointer}div[data-handler=mm] .bot-type-selector:not(.disabled).selected,div[data-handler=mmarchives] .bot-type-selector:not(.disabled).selected,div[data-handler=mmlogs] .bot-type-selector:not(.disabled).selected,div[data-handler=mmsettings] .bot-type-selector:not(.disabled).selected{background-color:hsla(0,0%,47%,.133);outline:2px solid #0b5831}div[data-handler=mm] .bot-problems-section,div[data-handler=mmarchives] .bot-problems-section,div[data-handler=mmlogs] .bot-problems-section,div[data-handler=mmsettings] .bot-problems-section{background-color:rgba(255,0,0,.667);border-radius:5px;margin-bottom:2px;margin-top:2px;padding-left:2px}div[data-handler=mm] #marketFilterIcon,div[data-handler=mmarchives] #marketFilterIcon,div[data-handler=mmlogs] #marketFilterIcon,div[data-handler=mmsettings] #marketFilterIcon{left:10px;opacity:.5;position:absolute;top:50%;transform:translateY(-50%)}div[data-handler=mm] #botTypeForm,div[data-handler=mmarchives] #botTypeForm,div[data-handler=mmlogs] #botTypeForm,div[data-handler=mmsettings] #botTypeForm{min-width:375px}div[data-handler=mm] #cexSelection .cex-selector,div[data-handler=mmarchives] #cexSelection .cex-selector,div[data-handler=mmlogs] #cexSelection .cex-selector,div[data-handler=mmsettings] #cexSelection .cex-selector{user-select:none}div[data-handler=mm] #cexSelection .cex-selector.configured:not(.selected),div[data-handler=mmarchives] #cexSelection .cex-selector.configured:not(.selected),div[data-handler=mmlogs] #cexSelection .cex-selector.configured:not(.selected),div[data-handler=mmsettings] #cexSelection .cex-selector.configured:not(.selected){opacity:.8}div[data-handler=mm] #cexSelection.disabled .cex-selector.configured,div[data-handler=mmarchives] #cexSelection.disabled .cex-selector.configured,div[data-handler=mmlogs] #cexSelection.disabled .cex-selector.configured,div[data-handler=mmsettings] #cexSelection.disabled .cex-selector.configured{opacity:.5}div[data-handler=mm] #cexSelection.disabled .cex-selector:not(.configured),div[data-handler=mm] #cexSelection:not(.disabled) .cex-selector,div[data-handler=mmarchives] #cexSelection.disabled .cex-selector:not(.configured),div[data-handler=mmarchives] #cexSelection:not(.disabled) .cex-selector,div[data-handler=mmlogs] #cexSelection.disabled .cex-selector:not(.configured),div[data-handler=mmlogs] #cexSelection:not(.disabled) .cex-selector,div[data-handler=mmsettings] #cexSelection.disabled .cex-selector:not(.configured),div[data-handler=mmsettings] #cexSelection:not(.disabled) .cex-selector{cursor:pointer}div[data-handler=mm] #cexSelection:not(.disabled) .cex-selector.selected,div[data-handler=mmarchives] #cexSelection:not(.disabled) .cex-selector.selected,div[data-handler=mmlogs] #cexSelection:not(.disabled) .cex-selector.selected,div[data-handler=mmsettings] #cexSelection:not(.disabled) .cex-selector.selected{background-color:hsla(0,0%,47%,.133)!important;border-color:#0b5831!important;border-width:2px!important}div[data-handler=mm] #cexSelection .reconfig,div[data-handler=mmarchives] #cexSelection .reconfig,div[data-handler=mmlogs] #cexSelection .reconfig,div[data-handler=mmsettings] #cexSelection .reconfig{position:absolute;right:0;top:0}div[data-handler=mm] #quickConfig input[type=number],div[data-handler=mmarchives] #quickConfig input[type=number],div[data-handler=mmlogs] #quickConfig input[type=number],div[data-handler=mmsettings] #quickConfig input[type=number]{width:100px}div[data-handler=mm] #levelSpacingBox.disabled,div[data-handler=mmarchives] #levelSpacingBox.disabled,div[data-handler=mmlogs] #levelSpacingBox.disabled,div[data-handler=mmsettings] #levelSpacingBox.disabled{opacity:.5}div[data-handler=mm] #placementsChart,div[data-handler=mm] [data-tmpl=placementsChart],div[data-handler=mmarchives] #placementsChart,div[data-handler=mmarchives] [data-tmpl=placementsChart],div[data-handler=mmlogs] #placementsChart,div[data-handler=mmlogs] [data-tmpl=placementsChart],div[data-handler=mmsettings] #placementsChart,div[data-handler=mmsettings] [data-tmpl=placementsChart]{height:100px}div[data-handler=mm] #buyPlacementsBox .ico-cross,div[data-handler=mm] #sellPlacementsBox .ico-cross,div[data-handler=mmarchives] #buyPlacementsBox .ico-cross,div[data-handler=mmarchives] #sellPlacementsBox .ico-cross,div[data-handler=mmlogs] #buyPlacementsBox .ico-cross,div[data-handler=mmlogs] #sellPlacementsBox .ico-cross,div[data-handler=mmsettings] #buyPlacementsBox .ico-cross,div[data-handler=mmsettings] #sellPlacementsBox .ico-cross{color:var(--text-danger)}div[data-handler=mm] #buyPlacementsBox .ico-plus,div[data-handler=mm] #sellPlacementsBox .ico-plus,div[data-handler=mmarchives] #buyPlacementsBox .ico-plus,div[data-handler=mmarchives] #sellPlacementsBox .ico-plus,div[data-handler=mmlogs] #buyPlacementsBox .ico-plus,div[data-handler=mmlogs] #sellPlacementsBox .ico-plus,div[data-handler=mmsettings] #buyPlacementsBox .ico-plus,div[data-handler=mmsettings] #sellPlacementsBox .ico-plus{color:var(--btn-go-bg)}div[data-handler=mm] #noBots .ico-robot,div[data-handler=mmarchives] #noBots .ico-robot,div[data-handler=mmlogs] #noBots .ico-robot,div[data-handler=mmsettings] #noBots .ico-robot{font-size:80px;opacity:.7}div[data-handler=mm] #cexOrderDetailsForm,div[data-handler=mm] #depositDetailsForm,div[data-handler=mm] #dexOrderDetailsForm,div[data-handler=mm] #withdrawalDetailsForm,div[data-handler=mmarchives] #cexOrderDetailsForm,div[data-handler=mmarchives] #depositDetailsForm,div[data-handler=mmarchives] #dexOrderDetailsForm,div[data-handler=mmarchives] #withdrawalDetailsForm,div[data-handler=mmlogs] #cexOrderDetailsForm,div[data-handler=mmlogs] #depositDetailsForm,div[data-handler=mmlogs] #dexOrderDetailsForm,div[data-handler=mmlogs] #withdrawalDetailsForm,div[data-handler=mmsettings] #cexOrderDetailsForm,div[data-handler=mmsettings] #depositDetailsForm,div[data-handler=mmsettings] #dexOrderDetailsForm,div[data-handler=mmsettings] #withdrawalDetailsForm{min-width:400px}div[data-handler=mm] .allocation-grid,div[data-handler=mmarchives] .allocation-grid,div[data-handler=mmlogs] .allocation-grid,div[data-handler=mmsettings] .allocation-grid{display:grid;grid-template-columns:1fr auto auto}div[data-handler=mm] .allocation-grid .second,div[data-handler=mmarchives] .allocation-grid .second,div[data-handler=mmlogs] .allocation-grid .second,div[data-handler=mmsettings] .allocation-grid .second{grid-column:2}div[data-handler=mm] .allocation-grid .third,div[data-handler=mmarchives] .allocation-grid .third,div[data-handler=mmlogs] .allocation-grid .third,div[data-handler=mmsettings] .allocation-grid .third{grid-column:3} +:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#0b5831;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0a4972;--bs-secondary:#6c757d;--bs-success:#0b5831;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:rgba(221,34,34,.933);--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:10,73,114;--bs-secondary-rgb:108,117,125;--bs-success-rgb:11,88,49;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:221,34,34;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:"source-sans","sans-serif";--bs-font-monospace:"mono","monospace";--bs-gradient:linear-gradient(180deg,hsla(0,0%,100%,.15),hsla(0,0%,100%,0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0,0,0,.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0a4972;--bs-link-hover-color:#083a5b;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd}*,:after,:before{box-sizing:border-box}@media(prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);background-color:var(--bs-body-bg);color:var(--bs-body-color);font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);margin:0;text-align:var(--bs-body-text-align)}hr{border:0;border-top:1px solid;color:inherit;margin:1rem 0;opacity:.25}h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.2;margin-bottom:.5rem;margin-top:0}h1{font-size:calc(1.375rem + 1.5vw)}@media(min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media(min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media(min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media(min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-bottom:1rem;margin-top:0}abbr[title]{cursor:help;text-decoration:underline dotted;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit;margin-bottom:1rem}ol,ul{padding-left:2rem}dl,ol,ul{margin-bottom:1rem;margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{background-color:var(--bs-highlight-bg);padding:.1875em}sub,sup{font-size:.75em;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:none}a:hover{color:var(--bs-link-hover-color);text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;font-size:.875em;margin-bottom:1rem;margin-top:0;overflow:auto}pre code{color:inherit;font-size:inherit;word-break:normal}code{word-wrap:break-word;color:var(--bs-code-color);font-size:.875em}a>code{color:inherit}kbd{background-color:var(--bs-body-color);border-radius:.25rem;color:var(--bs-body-bg);font-size:.875em;padding:.1875rem .375rem}kbd kbd{font-size:1em;padding:0}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom}caption{color:#6c757d;padding-bottom:.5rem;padding-top:.5rem;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border:0 solid;border-color:inherit}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{border-style:none;padding:0}textarea{resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{float:left;font-size:calc(1.275rem + .3vw);line-height:inherit;margin-bottom:.5rem;padding:0;width:100%}@media(min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{-webkit-appearance:button;font:inherit}output{display:inline-block}iframe{border:0}summary{cursor:pointer;display:list-item}progress{vertical-align:baseline}[hidden]{display:none!important}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-left:calc(var(--bs-gutter-x)*-.5);margin-right:calc(var(--bs-gutter-x)*-.5);margin-top:calc(var(--bs-gutter-y)*-1)}.row>*{flex-shrink:0;margin-top:var(--bs-gutter-y);max-width:100%;padding-left:calc(var(--bs-gutter-x)*.5);padding-right:calc(var(--bs-gutter-x)*.5);width:100%}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:4.16666667%}.col-2{flex:0 0 auto;width:8.33333333%}.col-3{flex:0 0 auto;width:12.5%}.col-4{flex:0 0 auto;width:16.66666667%}.col-5{flex:0 0 auto;width:20.83333333%}.col-6{flex:0 0 auto;width:25%}.col-7{flex:0 0 auto;width:29.16666667%}.col-8{flex:0 0 auto;width:33.33333333%}.col-9{flex:0 0 auto;width:37.5%}.col-10{flex:0 0 auto;width:41.66666667%}.col-11{flex:0 0 auto;width:45.83333333%}.col-12{flex:0 0 auto;width:50%}.col-13{flex:0 0 auto;width:54.16666667%}.col-14{flex:0 0 auto;width:58.33333333%}.col-15{flex:0 0 auto;width:62.5%}.col-16{flex:0 0 auto;width:66.66666667%}.col-17{flex:0 0 auto;width:70.83333333%}.col-18{flex:0 0 auto;width:75%}.col-19{flex:0 0 auto;width:79.16666667%}.col-20{flex:0 0 auto;width:83.33333333%}.col-21{flex:0 0 auto;width:87.5%}.col-22{flex:0 0 auto;width:91.66666667%}.col-23{flex:0 0 auto;width:95.83333333%}.col-24{flex:0 0 auto;width:100%}.offset-1{margin-left:4.16666667%}.offset-2{margin-left:8.33333333%}.offset-3{margin-left:12.5%}.offset-4{margin-left:16.66666667%}.offset-5{margin-left:20.83333333%}.offset-6{margin-left:25%}.offset-7{margin-left:29.16666667%}.offset-8{margin-left:33.33333333%}.offset-9{margin-left:37.5%}.offset-10{margin-left:41.66666667%}.offset-11{margin-left:45.83333333%}.offset-12{margin-left:50%}.offset-13{margin-left:54.16666667%}.offset-14{margin-left:58.33333333%}.offset-15{margin-left:62.5%}.offset-16{margin-left:66.66666667%}.offset-17{margin-left:70.83333333%}.offset-18{margin-left:75%}.offset-19{margin-left:79.16666667%}.offset-20{margin-left:83.33333333%}.offset-21{margin-left:87.5%}.offset-22{margin-left:91.66666667%}.offset-23{margin-left:95.83333333%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media(min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:4.16666667%}.col-sm-2{flex:0 0 auto;width:8.33333333%}.col-sm-3{flex:0 0 auto;width:12.5%}.col-sm-4{flex:0 0 auto;width:16.66666667%}.col-sm-5{flex:0 0 auto;width:20.83333333%}.col-sm-6{flex:0 0 auto;width:25%}.col-sm-7{flex:0 0 auto;width:29.16666667%}.col-sm-8{flex:0 0 auto;width:33.33333333%}.col-sm-9{flex:0 0 auto;width:37.5%}.col-sm-10{flex:0 0 auto;width:41.66666667%}.col-sm-11{flex:0 0 auto;width:45.83333333%}.col-sm-12{flex:0 0 auto;width:50%}.col-sm-13{flex:0 0 auto;width:54.16666667%}.col-sm-14{flex:0 0 auto;width:58.33333333%}.col-sm-15{flex:0 0 auto;width:62.5%}.col-sm-16{flex:0 0 auto;width:66.66666667%}.col-sm-17{flex:0 0 auto;width:70.83333333%}.col-sm-18{flex:0 0 auto;width:75%}.col-sm-19{flex:0 0 auto;width:79.16666667%}.col-sm-20{flex:0 0 auto;width:83.33333333%}.col-sm-21{flex:0 0 auto;width:87.5%}.col-sm-22{flex:0 0 auto;width:91.66666667%}.col-sm-23{flex:0 0 auto;width:95.83333333%}.col-sm-24{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:4.16666667%}.offset-sm-2{margin-left:8.33333333%}.offset-sm-3{margin-left:12.5%}.offset-sm-4{margin-left:16.66666667%}.offset-sm-5{margin-left:20.83333333%}.offset-sm-6{margin-left:25%}.offset-sm-7{margin-left:29.16666667%}.offset-sm-8{margin-left:33.33333333%}.offset-sm-9{margin-left:37.5%}.offset-sm-10{margin-left:41.66666667%}.offset-sm-11{margin-left:45.83333333%}.offset-sm-12{margin-left:50%}.offset-sm-13{margin-left:54.16666667%}.offset-sm-14{margin-left:58.33333333%}.offset-sm-15{margin-left:62.5%}.offset-sm-16{margin-left:66.66666667%}.offset-sm-17{margin-left:70.83333333%}.offset-sm-18{margin-left:75%}.offset-sm-19{margin-left:79.16666667%}.offset-sm-20{margin-left:83.33333333%}.offset-sm-21{margin-left:87.5%}.offset-sm-22{margin-left:91.66666667%}.offset-sm-23{margin-left:95.83333333%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media(min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:4.16666667%}.col-md-2{flex:0 0 auto;width:8.33333333%}.col-md-3{flex:0 0 auto;width:12.5%}.col-md-4{flex:0 0 auto;width:16.66666667%}.col-md-5{flex:0 0 auto;width:20.83333333%}.col-md-6{flex:0 0 auto;width:25%}.col-md-7{flex:0 0 auto;width:29.16666667%}.col-md-8{flex:0 0 auto;width:33.33333333%}.col-md-9{flex:0 0 auto;width:37.5%}.col-md-10{flex:0 0 auto;width:41.66666667%}.col-md-11{flex:0 0 auto;width:45.83333333%}.col-md-12{flex:0 0 auto;width:50%}.col-md-13{flex:0 0 auto;width:54.16666667%}.col-md-14{flex:0 0 auto;width:58.33333333%}.col-md-15{flex:0 0 auto;width:62.5%}.col-md-16{flex:0 0 auto;width:66.66666667%}.col-md-17{flex:0 0 auto;width:70.83333333%}.col-md-18{flex:0 0 auto;width:75%}.col-md-19{flex:0 0 auto;width:79.16666667%}.col-md-20{flex:0 0 auto;width:83.33333333%}.col-md-21{flex:0 0 auto;width:87.5%}.col-md-22{flex:0 0 auto;width:91.66666667%}.col-md-23{flex:0 0 auto;width:95.83333333%}.col-md-24{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:4.16666667%}.offset-md-2{margin-left:8.33333333%}.offset-md-3{margin-left:12.5%}.offset-md-4{margin-left:16.66666667%}.offset-md-5{margin-left:20.83333333%}.offset-md-6{margin-left:25%}.offset-md-7{margin-left:29.16666667%}.offset-md-8{margin-left:33.33333333%}.offset-md-9{margin-left:37.5%}.offset-md-10{margin-left:41.66666667%}.offset-md-11{margin-left:45.83333333%}.offset-md-12{margin-left:50%}.offset-md-13{margin-left:54.16666667%}.offset-md-14{margin-left:58.33333333%}.offset-md-15{margin-left:62.5%}.offset-md-16{margin-left:66.66666667%}.offset-md-17{margin-left:70.83333333%}.offset-md-18{margin-left:75%}.offset-md-19{margin-left:79.16666667%}.offset-md-20{margin-left:83.33333333%}.offset-md-21{margin-left:87.5%}.offset-md-22{margin-left:91.66666667%}.offset-md-23{margin-left:95.83333333%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media(min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:4.16666667%}.col-lg-2{flex:0 0 auto;width:8.33333333%}.col-lg-3{flex:0 0 auto;width:12.5%}.col-lg-4{flex:0 0 auto;width:16.66666667%}.col-lg-5{flex:0 0 auto;width:20.83333333%}.col-lg-6{flex:0 0 auto;width:25%}.col-lg-7{flex:0 0 auto;width:29.16666667%}.col-lg-8{flex:0 0 auto;width:33.33333333%}.col-lg-9{flex:0 0 auto;width:37.5%}.col-lg-10{flex:0 0 auto;width:41.66666667%}.col-lg-11{flex:0 0 auto;width:45.83333333%}.col-lg-12{flex:0 0 auto;width:50%}.col-lg-13{flex:0 0 auto;width:54.16666667%}.col-lg-14{flex:0 0 auto;width:58.33333333%}.col-lg-15{flex:0 0 auto;width:62.5%}.col-lg-16{flex:0 0 auto;width:66.66666667%}.col-lg-17{flex:0 0 auto;width:70.83333333%}.col-lg-18{flex:0 0 auto;width:75%}.col-lg-19{flex:0 0 auto;width:79.16666667%}.col-lg-20{flex:0 0 auto;width:83.33333333%}.col-lg-21{flex:0 0 auto;width:87.5%}.col-lg-22{flex:0 0 auto;width:91.66666667%}.col-lg-23{flex:0 0 auto;width:95.83333333%}.col-lg-24{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:4.16666667%}.offset-lg-2{margin-left:8.33333333%}.offset-lg-3{margin-left:12.5%}.offset-lg-4{margin-left:16.66666667%}.offset-lg-5{margin-left:20.83333333%}.offset-lg-6{margin-left:25%}.offset-lg-7{margin-left:29.16666667%}.offset-lg-8{margin-left:33.33333333%}.offset-lg-9{margin-left:37.5%}.offset-lg-10{margin-left:41.66666667%}.offset-lg-11{margin-left:45.83333333%}.offset-lg-12{margin-left:50%}.offset-lg-13{margin-left:54.16666667%}.offset-lg-14{margin-left:58.33333333%}.offset-lg-15{margin-left:62.5%}.offset-lg-16{margin-left:66.66666667%}.offset-lg-17{margin-left:70.83333333%}.offset-lg-18{margin-left:75%}.offset-lg-19{margin-left:79.16666667%}.offset-lg-20{margin-left:83.33333333%}.offset-lg-21{margin-left:87.5%}.offset-lg-22{margin-left:91.66666667%}.offset-lg-23{margin-left:95.83333333%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media(min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:4.16666667%}.col-xl-2{flex:0 0 auto;width:8.33333333%}.col-xl-3{flex:0 0 auto;width:12.5%}.col-xl-4{flex:0 0 auto;width:16.66666667%}.col-xl-5{flex:0 0 auto;width:20.83333333%}.col-xl-6{flex:0 0 auto;width:25%}.col-xl-7{flex:0 0 auto;width:29.16666667%}.col-xl-8{flex:0 0 auto;width:33.33333333%}.col-xl-9{flex:0 0 auto;width:37.5%}.col-xl-10{flex:0 0 auto;width:41.66666667%}.col-xl-11{flex:0 0 auto;width:45.83333333%}.col-xl-12{flex:0 0 auto;width:50%}.col-xl-13{flex:0 0 auto;width:54.16666667%}.col-xl-14{flex:0 0 auto;width:58.33333333%}.col-xl-15{flex:0 0 auto;width:62.5%}.col-xl-16{flex:0 0 auto;width:66.66666667%}.col-xl-17{flex:0 0 auto;width:70.83333333%}.col-xl-18{flex:0 0 auto;width:75%}.col-xl-19{flex:0 0 auto;width:79.16666667%}.col-xl-20{flex:0 0 auto;width:83.33333333%}.col-xl-21{flex:0 0 auto;width:87.5%}.col-xl-22{flex:0 0 auto;width:91.66666667%}.col-xl-23{flex:0 0 auto;width:95.83333333%}.col-xl-24{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:4.16666667%}.offset-xl-2{margin-left:8.33333333%}.offset-xl-3{margin-left:12.5%}.offset-xl-4{margin-left:16.66666667%}.offset-xl-5{margin-left:20.83333333%}.offset-xl-6{margin-left:25%}.offset-xl-7{margin-left:29.16666667%}.offset-xl-8{margin-left:33.33333333%}.offset-xl-9{margin-left:37.5%}.offset-xl-10{margin-left:41.66666667%}.offset-xl-11{margin-left:45.83333333%}.offset-xl-12{margin-left:50%}.offset-xl-13{margin-left:54.16666667%}.offset-xl-14{margin-left:58.33333333%}.offset-xl-15{margin-left:62.5%}.offset-xl-16{margin-left:66.66666667%}.offset-xl-17{margin-left:70.83333333%}.offset-xl-18{margin-left:75%}.offset-xl-19{margin-left:79.16666667%}.offset-xl-20{margin-left:83.33333333%}.offset-xl-21{margin-left:87.5%}.offset-xl-22{margin-left:91.66666667%}.offset-xl-23{margin-left:95.83333333%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media(min-width:1750px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:4.16666667%}.col-xxl-2{flex:0 0 auto;width:8.33333333%}.col-xxl-3{flex:0 0 auto;width:12.5%}.col-xxl-4{flex:0 0 auto;width:16.66666667%}.col-xxl-5{flex:0 0 auto;width:20.83333333%}.col-xxl-6{flex:0 0 auto;width:25%}.col-xxl-7{flex:0 0 auto;width:29.16666667%}.col-xxl-8{flex:0 0 auto;width:33.33333333%}.col-xxl-9{flex:0 0 auto;width:37.5%}.col-xxl-10{flex:0 0 auto;width:41.66666667%}.col-xxl-11{flex:0 0 auto;width:45.83333333%}.col-xxl-12{flex:0 0 auto;width:50%}.col-xxl-13{flex:0 0 auto;width:54.16666667%}.col-xxl-14{flex:0 0 auto;width:58.33333333%}.col-xxl-15{flex:0 0 auto;width:62.5%}.col-xxl-16{flex:0 0 auto;width:66.66666667%}.col-xxl-17{flex:0 0 auto;width:70.83333333%}.col-xxl-18{flex:0 0 auto;width:75%}.col-xxl-19{flex:0 0 auto;width:79.16666667%}.col-xxl-20{flex:0 0 auto;width:83.33333333%}.col-xxl-21{flex:0 0 auto;width:87.5%}.col-xxl-22{flex:0 0 auto;width:91.66666667%}.col-xxl-23{flex:0 0 auto;width:95.83333333%}.col-xxl-24{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:4.16666667%}.offset-xxl-2{margin-left:8.33333333%}.offset-xxl-3{margin-left:12.5%}.offset-xxl-4{margin-left:16.66666667%}.offset-xxl-5{margin-left:20.83333333%}.offset-xxl-6{margin-left:25%}.offset-xxl-7{margin-left:29.16666667%}.offset-xxl-8{margin-left:33.33333333%}.offset-xxl-9{margin-left:37.5%}.offset-xxl-10{margin-left:41.66666667%}.offset-xxl-11{margin-left:45.83333333%}.offset-xxl-12{margin-left:50%}.offset-xxl-13{margin-left:54.16666667%}.offset-xxl-14{margin-left:58.33333333%}.offset-xxl-15{margin-left:62.5%}.offset-xxl-16{margin-left:66.66666667%}.offset-xxl-17{margin-left:70.83333333%}.offset-xxl-18{margin-left:75%}.offset-xxl-19{margin-left:79.16666667%}.offset-xxl-20{margin-left:83.33333333%}.offset-xxl-21{margin-left:87.5%}.offset-xxl-22{margin-left:91.66666667%}.offset-xxl-23{margin-left:95.83333333%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}@media(min-width:2150px){.col-xxxl{flex:1 0 0%}.row-cols-xxxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxxl-auto{flex:0 0 auto;width:auto}.col-xxxl-1{flex:0 0 auto;width:4.16666667%}.col-xxxl-2{flex:0 0 auto;width:8.33333333%}.col-xxxl-3{flex:0 0 auto;width:12.5%}.col-xxxl-4{flex:0 0 auto;width:16.66666667%}.col-xxxl-5{flex:0 0 auto;width:20.83333333%}.col-xxxl-6{flex:0 0 auto;width:25%}.col-xxxl-7{flex:0 0 auto;width:29.16666667%}.col-xxxl-8{flex:0 0 auto;width:33.33333333%}.col-xxxl-9{flex:0 0 auto;width:37.5%}.col-xxxl-10{flex:0 0 auto;width:41.66666667%}.col-xxxl-11{flex:0 0 auto;width:45.83333333%}.col-xxxl-12{flex:0 0 auto;width:50%}.col-xxxl-13{flex:0 0 auto;width:54.16666667%}.col-xxxl-14{flex:0 0 auto;width:58.33333333%}.col-xxxl-15{flex:0 0 auto;width:62.5%}.col-xxxl-16{flex:0 0 auto;width:66.66666667%}.col-xxxl-17{flex:0 0 auto;width:70.83333333%}.col-xxxl-18{flex:0 0 auto;width:75%}.col-xxxl-19{flex:0 0 auto;width:79.16666667%}.col-xxxl-20{flex:0 0 auto;width:83.33333333%}.col-xxxl-21{flex:0 0 auto;width:87.5%}.col-xxxl-22{flex:0 0 auto;width:91.66666667%}.col-xxxl-23{flex:0 0 auto;width:95.83333333%}.col-xxxl-24{flex:0 0 auto;width:100%}.offset-xxxl-0{margin-left:0}.offset-xxxl-1{margin-left:4.16666667%}.offset-xxxl-2{margin-left:8.33333333%}.offset-xxxl-3{margin-left:12.5%}.offset-xxxl-4{margin-left:16.66666667%}.offset-xxxl-5{margin-left:20.83333333%}.offset-xxxl-6{margin-left:25%}.offset-xxxl-7{margin-left:29.16666667%}.offset-xxxl-8{margin-left:33.33333333%}.offset-xxxl-9{margin-left:37.5%}.offset-xxxl-10{margin-left:41.66666667%}.offset-xxxl-11{margin-left:45.83333333%}.offset-xxxl-12{margin-left:50%}.offset-xxxl-13{margin-left:54.16666667%}.offset-xxxl-14{margin-left:58.33333333%}.offset-xxxl-15{margin-left:62.5%}.offset-xxxl-16{margin-left:66.66666667%}.offset-xxxl-17{margin-left:70.83333333%}.offset-xxxl-18{margin-left:75%}.offset-xxxl-19{margin-left:79.16666667%}.offset-xxxl-20{margin-left:83.33333333%}.offset-xxxl-21{margin-left:87.5%}.offset-xxxl-22{margin-left:91.66666667%}.offset-xxxl-23{margin-left:95.83333333%}.g-xxxl-0,.gx-xxxl-0{--bs-gutter-x:0}.g-xxxl-0,.gy-xxxl-0{--bs-gutter-y:0}.g-xxxl-1,.gx-xxxl-1{--bs-gutter-x:0.25rem}.g-xxxl-1,.gy-xxxl-1{--bs-gutter-y:0.25rem}.g-xxxl-2,.gx-xxxl-2{--bs-gutter-x:0.5rem}.g-xxxl-2,.gy-xxxl-2{--bs-gutter-y:0.5rem}.g-xxxl-3,.gx-xxxl-3{--bs-gutter-x:1rem}.g-xxxl-3,.gy-xxxl-3{--bs-gutter-y:1rem}.g-xxxl-4,.gx-xxxl-4{--bs-gutter-x:1.5rem}.g-xxxl-4,.gy-xxxl-4{--bs-gutter-y:1.5rem}.g-xxxl-5,.gx-xxxl-5{--bs-gutter-x:3rem}.g-xxxl-5,.gy-xxxl-5{--bs-gutter-y:3rem}}.form-select{-moz-padding-start:calc(.75rem - 3px);appearance:none;background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E");background-position:right .75rem center;background-repeat:no-repeat;background-size:16px 12px;border:1px solid #ced4da;border-radius:.375rem;color:#212529;display:block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem 2.25rem .375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media(prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#85a4b9;box-shadow:0 0 0 .25rem rgba(10,73,114,.25);outline:0}.form-select[multiple],.form-select[size]:not([size="1"]){background-image:none;padding-right:.75rem}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{border-radius:.25rem;font-size:.875rem;padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.form-select-lg{border-radius:.5rem;font-size:1.25rem;padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}.form-check{display:block;margin-bottom:.125rem;min-height:1.5rem;padding-left:1.5em}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-left:0;padding-right:1.5em;text-align:right}.form-check-reverse .form-check-input{float:right;margin-left:0;margin-right:-1.5em}.form-check-input{appearance:none;background-color:#fff;background-position:50%;background-repeat:no-repeat;background-size:contain;border:1px solid rgba(0,0,0,.25);height:1em;margin-top:.25em;print-color-adjust:exact;vertical-align:top;width:1em}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#85a4b9;box-shadow:0 0 0 .25rem rgba(10,73,114,.25);outline:0}.form-check-input:checked{background-color:#0a4972;border-color:#0a4972}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3E%3C/svg%3E")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='2' fill='%23fff'/%3E%3C/svg%3E")}.form-check-input[type=checkbox]:indeterminate{background-color:#0a4972;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3E%3C/svg%3E");border-color:#0a4972}.form-check-input:disabled{filter:none;opacity:.5;pointer-events:none}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='rgba(0, 0, 0, 0.25)'/%3E%3C/svg%3E");background-position:0;border-radius:2em;margin-left:-2.5em;transition:background-position .15s ease-in-out;width:2em}@media(prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%2385a4b9'/%3E%3C/svg%3E")}.form-switch .form-check-input:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E");background-position:100%}.form-switch.form-check-reverse{padding-left:0;padding-right:2.5em}.form-switch.form-check-reverse .form-check-input{margin-left:0;margin-right:-2.5em}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{filter:none;opacity:.65;pointer-events:none}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-bottom:0!important;padding-top:0!important}.py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-3{padding-bottom:1rem!important;padding-top:1rem!important}.py-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-5{padding-bottom:3rem!important;padding-top:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-bottom:0!important;margin-top:0!important}.my-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-3{margin-bottom:1rem!important;margin-top:1rem!important}.my-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-5{margin-bottom:3rem!important;margin-top:3rem!important}.my-auto{margin-bottom:auto!important;margin-top:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.border{border:1px solid var(--border-color)!important}.border-0{border:0!important}.border-top{border-top:1px solid var(--border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid var(--border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid var(--border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid var(--border-color)!important}.border-start-0{border-left:0!important}.border-style-dashed{border-style:dashed!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-100{height:100%!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-justify{text-align:justify!important}@media(min-width:576px){.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}}@media(min-width:768px){.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}}@media(min-width:992px){.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}}@media(min-width:1200px){.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}}@media(min-width:1750px){.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}}@media(min-width:2150px){.d-xxxl-inline{display:inline!important}.d-xxxl-inline-block{display:inline-block!important}.d-xxxl-block{display:block!important}.d-xxxl-grid{display:grid!important}.d-xxxl-inline-grid{display:inline-grid!important}.d-xxxl-table{display:table!important}.d-xxxl-table-row{display:table-row!important}.d-xxxl-table-cell{display:table-cell!important}.d-xxxl-flex{display:flex!important}.d-xxxl-inline-flex{display:inline-flex!important}.d-xxxl-none{display:none!important}.flex-xxxl-fill{flex:1 1 auto!important}.flex-xxxl-row{flex-direction:row!important}.flex-xxxl-column{flex-direction:column!important}.flex-xxxl-row-reverse{flex-direction:row-reverse!important}.flex-xxxl-column-reverse{flex-direction:column-reverse!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}body:not(.dark){--body-bg:#fafafa;--body-bg-lower-opacity:#fafafa88;--section-bg:#f6f6f6;--form-bg:#f0f0f0;--tertiary-bg:#7772;--text-color:#333;--text-color-secondary:#4a4949;--text-danger:#d22;--text-warning:#f82e;--text-grey:#777;--border-color:#ddd;--hint-color:#4397cd;--link-color:#2a71d5;--link-color-hover:#144487;--subtle-link-color:#05053b;--subtle-link-hover:#07075e;--popup-notes-bg:#000;--popup-notes-color:#dfe2e1;--btn-feature-bg:#6bc5ff;--btn-feature-hover-bg:#a3dbff;--btn-feature-border-color:#759cb5;--btn-featur-hover-border-color:#9bc3dd;--btn-danger-hover-color:#fff;--btn-border-color:#ddd;--btn-hover-border-color:#ddd;--btn-go-bg:#0b5831;--btn-go-hover-bg:#0b5831;--btn-go-color:#fff;--forms-bg:#fafafa99;--form-input-bg:#fff;--form-input-border:#999;--form-input-border-focus:#555;--form-input-bg-active:#3095db;--form-opt-selected-bg:#0001;--form-selected-tab-bg:#fff;--indicator-good:#179717;--buy-color:#207a46;--sell-color:#99302b;--market-buygreen-bg:#207a4699;--market-sellred-bg:#99302b99;--market-sell-color:#99302b;--market-btn-color:#555;--market-btn-selected-color:#000;--market-markettab-selected-bg:#7773;--market-orderopt-bg:#fff1;--market-numorders-bg:#c5c5e6;--loader-bg:#e0e0e077;--dex-url:url(/img/softened-icon.png)}body.dark{--body-bg:#040b14;--body-bg-lower-opacity:#040b1488;--section-bg:#071627;--form-bg:#0a1e34;--tertiary-bg:#78787822;--text-color:#dfe2e1;--text-color-secondary:#a1a1a1;--text-danger:#ec6a6a;--text-warning:#f82e;--text-grey:#999;--border-color:#383f4b;--hint-color:#64b2e5;--link-color:#388bff;--link-color-hover:#5e9ffa;--subtle-link-color:#e6e6ff;--subtle-link-hover:#d1d1ff;--popup-notes-bg:#fff;--popup-notes-color:#333;--btn-border-color:#7777;--btn-hover-border-color:#777;--btn-feature-bg:#0a4972;--btn-feature-hover-bg:#176699;--btn-feature-border-color:#1e618d;--btn-featur-hover-border-color:#85a5ba;--btn-danger-hover-color:#fff;--btn-go-bg:#0b5831;--btn-go-hover-bg:#0b5831;--btn-go-color:#fff;--forms-bg:#05141f99;--form-input-bg:#0009;--form-input-border:#555;--form-input-border-focus:#4271ce;--form-input-bg-active:#27278d;--form-opt-selected-bg:#fff1;--form-selected-tab-bg:#39447c;--indicator-good:#29bb77;--buy-color:#29bb77;--sell-color:#e95e5e;--market-buygreen-bg:#29bb7799;--market-sellred-bg:#e95e5e99;--market-sell-color:#e95e5e;--market-btn-color:#aaa;--market-btn-selected-color:#eee;--market-markettab-selected-bg:#fff1;--market-orderopt-bg:#0001;--market-numorders-bg:#141488;--loader-bg:#13202b77;--dex-url:url(/img/softened-icon-dark.png)}.greyscale{filter:grayscale(1)}.blurry-bg{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.body-bg{background-color:var(--body-bg)}.section-bg{background-color:var(--section-bg)}.text-good{color:var(--indicator-good)}@font-face{font-family:source-sans;font-style:normal;font-weight:400;src:url(/font/source-sans-pro-v9-latin-regular.woff) format("woff"),url(/font/source-sans-pro-v9-latin-regular.svg) format("svg")}@font-face{font-family:demi-sans;font-style:normal;font-weight:bolder;src:url(/font/source-sans-pro-semibold.woff) format("woff"),url(/font/source-sans-pro-semibold.svg) format("svg")}@font-face{font-family:mono;font-style:normal;font-weight:400;src:url(/font/inconsolata-v15-latin-regular.woff) format("woff"),url(/font/inconsolata-v15-latin-regular.svg) format("svg")}.fs8{font-size:8px}.fs10{font-size:10px}.fs11{font-size:11px}.fs12{font-size:12px}.fs13{font-size:13px}.fs14{font-size:14px}.fs15{font-size:15px}.fs16{font-size:16px}.fs17{font-size:17px}.fs18{font-size:18px}.fs20{font-size:20px}.fs22{font-size:22px}.fs24,.fs26{font-size:24px}.fs28{font-size:28px}.fs32{font-size:32px}.fs35{font-size:35px}.fs50{font-size:50px}.demi{font-family:demi-sans,sans-serif}.mono{font-family:mono,monospace}.sans{font-family:source-sans,sans-serif}.bold{font-weight:700}.flex-grow-1{flex-grow:1}#dexAddrForm .known-exchange,#forms,#forms>form header,#forms>form>div.form-closer,#forms>form>div.form-closer-unbound,.flex-center,div[data-handler=markets] #epochLine,div[data-handler=markets] .market-chart,div[data-handler=markets] .user-order .user-order-header{align-items:center;display:flex;justify-content:center}#forms>form,.flex-stretch-column{align-items:stretch;display:flex;flex-direction:column}.flex-wrap{flex-wrap:wrap}.text-nowrap{white-space:nowrap}.position-relative{position:relative}.position-absolute{position:absolute}#forms>form>div.form-closer-unbound:hover,#forms>form>div.form-closer:hover,.hoverbg:hover,div[data-handler=mm] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mm] .bot-type-selector:hover:not(.disabled),div[data-handler=mmarchives] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mmarchives] .bot-type-selector:hover:not(.disabled),div[data-handler=mmlogs] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mmlogs] .bot-type-selector:hover:not(.disabled),div[data-handler=mmsettings] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mmsettings] .bot-type-selector:hover:not(.disabled){background-color:var(--tertiary-bg)}.invisible{visibility:hidden}#forms,#recentMatchesBox,.stylish-overflow,.vscroll,table.reg-asset-markets{overflow:auto;scrollbar-color:hsla(0,0%,47%,.267) hsla(0,0%,47%,.067);scrollbar-width:thin}#forms::-webkit-scrollbar,#recentMatchesBox::-webkit-scrollbar,.stylish-overflow::-webkit-scrollbar,.vscroll::-webkit-scrollbar,table.reg-asset-markets::-webkit-scrollbar{height:8px;width:8px}#forms::-webkit-scrollbar-track,#recentMatchesBox::-webkit-scrollbar-track,.stylish-overflow::-webkit-scrollbar-track,.vscroll::-webkit-scrollbar-track,table.reg-asset-markets::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}#forms::-webkit-scrollbar-thumb,#recentMatchesBox::-webkit-scrollbar-thumb,.stylish-overflow::-webkit-scrollbar-thumb,.vscroll::-webkit-scrollbar-thumb,table.reg-asset-markets::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}.hoveronly#forms:not(:hover),.hoveronly#recentMatchesBox:not(:hover),.hoveronly.vscroll:not(:hover),.stylish-overflow.hoveronly:not(:hover),table.hoveronly.reg-asset-markets:not(:hover){scrollbar-color:transparent transparent}.hoveronly#forms:not(:hover)::-webkit-scrollbar-track,.hoveronly#recentMatchesBox:not(:hover)::-webkit-scrollbar-track,.hoveronly.vscroll:not(:hover)::-webkit-scrollbar-track,.stylish-overflow.hoveronly:not(:hover)::-webkit-scrollbar-track,table.hoveronly.reg-asset-markets:not(:hover)::-webkit-scrollbar-track{background-color:transparent}.hoveronly#forms:not(:hover)::-webkit-scrollbar-thumb,.hoveronly#recentMatchesBox:not(:hover)::-webkit-scrollbar-thumb,.hoveronly.vscroll:not(:hover)::-webkit-scrollbar-thumb,.stylish-overflow.hoveronly:not(:hover)::-webkit-scrollbar-thumb,table.hoveronly.reg-asset-markets:not(:hover)::-webkit-scrollbar-thumb{background-color:transparent;border-radius:4px}.overflow-x-hidden#forms,.overflow-x-hidden#recentMatchesBox,.overflow-x-hidden.vscroll,.stylish-overflow.overflow-x-hidden,table.overflow-x-hidden.reg-asset-markets{overflow-x:hidden}.hidden-overflow{overflow:auto;scrollbar-width:none}.hidden-overflow::-webkit-scrollbar{display:none}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.ease-color{transition:color 1s ease}.mw-375{max-width:375px}.mw-425{max-width:425px}.max-h-100{max-height:100%}.d-hide{display:none!important}.buycolor{color:var(--buy-color)}.sellcolor{color:var(--sell-color)}.grey{color:var(--text-grey)}.rounded3,div[data-handler=mm] .bot-type-selector,div[data-handler=mmarchives] .bot-type-selector,div[data-handler=mmlogs] .bot-type-selector,div[data-handler=mmsettings] .bot-type-selector{border-radius:3px}hr.dashed{border-top:2px dashed var(--border-color)}img.token-parent{height:.7em;position:relative;top:-.4em;width:.7em}sup.token-parent{font-size:.6em;position:relative;top:-.6em}.preline{white-space:pre-line}.vscroll{max-width:100%;overflow-x:hidden}.pointer{cursor:pointer!important}.underline{text-decoration:underline}.plainlink{color:inherit}.ico-info{margin-left:.25rem}.subtlelink,.subtlelink:visited{text-decoration:none}.subtlelink:hover,.subtlelink:visited:hover{cursor:pointer;text-decoration:underline!important}.word-break-all{user-select:all;word-break:break-all}.lh1{line-height:1}.fill-abs,div[data-handler=markets] #leftMarketDock #marketSearchV1,div[data-handler=mm] #placementsChart canvas,div[data-handler=mm] [data-tmpl=placementsChart] canvas,div[data-handler=mmarchives] #placementsChart canvas,div[data-handler=mmarchives] [data-tmpl=placementsChart] canvas,div[data-handler=mmlogs] #placementsChart canvas,div[data-handler=mmlogs] [data-tmpl=placementsChart] canvas,div[data-handler=mmsettings] #placementsChart canvas,div[data-handler=mmsettings] [data-tmpl=placementsChart] canvas{bottom:0;left:0;position:absolute;right:0;top:0}.min-fit{min-height:fit-content}div.clear{opacity:0}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.overflow-x-hidden,.overflow-x-hidden#forms,.overflow-x-hidden#recentMatchesBox,.stylish-overflow.overflow-x-hidden,table.overflow-x-hidden.reg-asset-markets{overflow-x:hidden}.user-select-all{user-select:all}.overflow-ellipsis{overflow:hidden;text-overflow:ellipsis}.user-select-none{user-select:none}.text-danger{color:var(--text-danger)}.text-warning{color:var(--text-warning)}.text-buycolor{color:var(--buy-color)}.text-sellcolor{color:var(--sell-color)}@font-face{font-family:icomoon;font-style:normal;font-weight:400;src:url(/font/icomoon.ttf?u8i98qq) format("truetype"),url(/font/icomoon.woff?u8i98qq) format("woff"),url(/font/icomoon.svg?u8i98qq#icomoon) format("svg")}[class*=" ico-"],[class^=ico-]{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:icomoon,monospace!important;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.micro-icon{height:15px;width:15px}.mini-icon{height:20px;width:20px}.small-icon{height:25px;width:25px}.medium-icon{height:30px;width:30px}.large-icon{height:40px;width:40px}.enourmous-icon{height:50px;width:50px}.ico-spinner:before{content:""}.ico-settings:before{content:""}.ico-plus:before{content:""}.ico-minus:before{content:""}.ico-check:before{color:var(--buy-color);content:"";display:inline-block}.ico-bell:before{content:""}.ico-locked:before{content:""}.ico-unlocked:before{content:""}.ico-sleeping:before{content:""}.ico-cross:before{content:""}.ico-profile:before{content:""}.ico-disconnected:before{content:""}.ico-search:before{content:""}.ico-expired:before{content:""}.ico-info:before{content:""}.ico-textfile:before{content:""}.ico-open:before{content:""}.ico-sync:before{content:""}.ico-target:before{content:""}.ico-arrowright:before{content:""}.ico-arrowdown:before{content:"";display:inline-block;transform:rotate(90deg)}.ico-arrowleft:before{content:"";display:inline-block;transform:rotate(180deg)}.ico-wide-headed-left-arrow:before{content:"";display:inline-block}.ico-arrowup:before{content:"";display:inline-block;transform:rotate(-90deg)}.ico-checkbox:before{content:""}.ico-connection:before{content:""}.ico-rocket:before{content:""}.ico-copy:before{content:""}.ico-qrcode:before{content:""}.ico-send:before{content:""}.ico-exchange:before{content:""}.ico-pause:before{content:""}.ico-hamburger:before{content:""}.ico-barchart:before{content:""}.ico-edit:before{content:""}.ico-ticket:before{content:""}.ico-robot:before{content:""}.ico-secretagent:before{content:""}.ico-lever:before{content:""}button{background-color:transparent;border:1px solid var(--btn-border-color);border-radius:5px;color:var(--text-color);font-size:1rem;padding:.375rem .75rem;user-select:none;white-space:nowrap}button,button:focus{outline:none}button:hover{background-color:hsla(0,0%,47%,.133);border-color:var(--btn-hover-border-color);text-decoration:none}button.small{font-size:.9rem;padding:.25rem .5rem}button.large{font-size:1.25rem;padding:.5rem 1rem}button.feature{background-color:var(--btn-feature-bg);border-color:var(--btn-feature-border-color)}button.feature:hover{background-color:var(--btn-feature-hover-bg);border-color:var(--btn-featur-hover-border-color)}button.danger{border-color:var(--text-danger);color:var(--text-danger)}button.danger:hover{background-color:var(--text-danger);color:var(--btn-danger-hover-color)}button.warning{border-color:var(--text-warning);color:var(--text-warning)}button.warning:hover{background-color:var(--text-warning);color:var(--btn-danger-hover-color)}button.go{background-color:var(--btn-go-bg);color:var(--btn-go-color)}button.go:hover{background-color:var(--btn-go-hover-bg)}table{border-collapse:collapse;color:var(--text-color);width:100%}table .table-group-divider{border-color:var(--border-color)}table.px-0 td:first-child,table.px-0 td:last-child,table.px-0 th:first-child,table.px-0 th:last-child{padding-left:0;padding-right:0}table td,table th{padding:.5rem}table td:last-child:not(:first-child),table th:last-child:not(:first-child){text-align:right}table td.no-stretch,table th.no-stretch{width:0}table.row-border tbody{border-bottom:1px solid var(--border-color)}table.row-border tbody tr{border-top:1px solid var(--border-color)}table.cell-border td,table.cell-border th{border:1px solid var(--border-color)}table.nopadding td{padding:0}table.compact td,table.compact th{padding:.25rem}table.row-hover tr:hover{background-color:var(--tertiary-bg)}table.striped tr:nth-of-type(2n){background-color:hsla(0,0%,47%,.133)}a{color:var(--link-color)}a:hover{color:var(--link-color-hover)}@media(min-width:768px){table#walletInfoTable{width:auto}}table.reg-asset-markets{display:block;line-height:1.15;margin-right:8px;max-height:120px;overflow-y:hidden}table.reg-asset-markets:hover{overflow-y:auto}table.reg-asset-markets tr{border:none}table.reg-asset-markets th{font-size:13px;font-weight:400}table.reg-asset-markets td{font-size:14px}table.reg-asset-markets td,table.reg-asset-markets th{padding:1px 5px}.form-check-label{cursor:pointer}.form-check-input[type=checkbox]{border:1px solid var(--form-input-border);cursor:pointer}.form-check-input[type=checkbox]:checked{background-color:var(--form-input-bg-active)}select{font-family:inherit;padding:.75rem 1rem}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}form.card button:hover{color:#000}input:invalid{box-shadow:none}.dashed{border-style:dashed}.micro-icon{position:relative}#tooltip{background-color:var(--section-bg);border:1px solid var(--border-color);border-radius:4px;font-size:15px;left:-10000px;max-width:300px;padding:3px 6px;position:absolute;z-index:1000}.on-indicator{border-radius:8px;height:15px;width:15px}.on-indicator.on{background-color:var(--indicator-good)}.on-indicator.off{background-color:#777}.border-left{border-left:1px solid var(--border-color)}.border-right{border-right:1px solid var(--border-color)}div[data-handler=dexsettings] #forms>form:not(.plain),div[data-handler=init] #forms>form:not(.plain),div[data-handler=login] #forms>form:not(.plain),div[data-handler=markets] #forms>form:not(.plain),div[data-handler=mm] #forms>form:not(.plain),div[data-handler=mmlogs] #forms>form:not(.plain),div[data-handler=mmsettings] #forms>form:not(.plain),div[data-handler=order] #forms>form:not(.plain),div[data-handler=orders] #forms>form:not(.plain),div[data-handler=register] #forms>form:not(.plain),div[data-handler=settings] #forms>form:not(.plain),div[data-handler=wallets] #forms>form:not(.plain){background-color:var(--form-bg);border:1px solid var(--border-color);border-radius:5px;box-shadow:0 3px 6px rgba(0,0,0,.129),0 2px 7px rgba(0,0,0,.255)}.corner-button{position:absolute;top:0}.corner-button.left{left:0}.corner-button.right{right:0}html{height:100%}body{background-color:var(--body-bg);bottom:0;color:var(--text-color);display:flex;flex-direction:column;justify-content:flex-start;left:0;position:fixed;right:0;top:0}header#header{align-items:center;background-color:var(--section-bg);display:flex;height:70px;justify-content:space-between;min-height:70px;width:100%;z-index:100}header#header .plainlink,header#header .plainlink:hover,header#header .plainlink:visited,header#header a,header#header a:hover,header#header a:visited{text-decoration:none}header#header .hoverbright:hover{color:var(--subtle-link-hover)}section{background-color:var(--section-bg);border:1px solid var(--border-color);border-radius:.25rem;margin:.5rem 0}div.main{display:flex;flex-grow:1;min-height:0;position:relative}div.mainlinks>a,div.mainlinks>div{color:var(--text-color-secondary);padding:.5rem .75rem}@media(min-width:768px){div.mainlinks>a,div.mainlinks>div{padding:.75rem 1rem}}.spinner{animation:spin 2s linear infinite}.spinner.fast{animation:spin 1s linear infinite}div.note-indicator{border-radius:3px;height:6px;width:6px}div.note-indicator.good{background-color:var(--indicator-good)}div.note-indicator.bad{background-color:rgba(221,34,34,.933)}div.note-indicator.warn{background-color:var(--text-warning)}.z10{z-index:10}span.brand:before{content:"Bison Wallet"}img.dex-logo{content:var(--dex-url)}img.logo-square{content:url(/img/bison-square_50.png)}img.logo-square.small{height:25px;width:25px}img.logo-full{content:url(/img/bison-full_97x50.png)}img.logo-full.small{height:25px;width:48.5px}body.dex-branding img.logo-full,body.dex-branding img.logo-square{content:url(/img/softened-icon.png);height:50px;width:50px}body.dex-branding img.logo-full.small,body.dex-branding img.logo-square.small{height:25px;width:25px}body.dex-branding img.logo-full.micro-icon,body.dex-branding img.logo-square.micro-icon{height:15px;width:15px}body.dex-branding.dark img.logo-full,body.dex-branding.dark img.logo-square{content:url(/img/softened-icon-dark.png)}body.dex-branding span.brand:before{content:"DCRDEX"}#noteIndicator{font-family:demi-sans,sans-serif;font-size:16px;font-weight:700;left:20px;line-height:1;position:absolute;top:0;z-index:2}#noteIndicator.good{color:var(--indicator-good)}#noteIndicator.bad{color:rgba(221,34,34,.933)}#noteIndicator.warn{color:var(--text-warning)}div.popup-notes{align-items:flex-end;border-radius:4px;bottom:0;display:flex;flex-direction:column;max-width:750px;position:fixed;right:5px;z-index:1000}div.popup-notes>span{background-color:var(--popup-notes-bg);color:var(--popup-notes-color);display:inline-block;line-height:1;margin:3px 0 0;max-width:100%;overflow:hidden;padding:4px 10px;text-overflow:ellipsis;white-space:nowrap}div.popup-notes .note-indicator{margin-bottom:2px}[data-unit]{color:var(--hint-color)}[data-unit-box]{cursor:default;overflow:visible;position:relative}[data-unit-box]>div{color:var(--text-color);left:-2rem;z-index:10}#noteBox,#profileBox{align-items:stretch;background-color:var(--section-bg);border:1px solid var(--border-color);display:flex;flex-direction:column;line-height:1.5;max-height:90%;min-width:150px;position:fixed;z-index:100}#noteBox .icon,#profileBox .icon{position:absolute;right:15px;top:8px}#noteBox .header,#profileBox .header{background-color:var(--section-bg);border-bottom:1px solid var(--border-color)}#noteBox .header>div,#profileBox .header>div{cursor:pointer;opacity:.5}#noteBox .header>div.active,#profileBox .header>div.active{opacity:1}#noteBox:not(.authed) .authed-only,#profileBox:not(.authed) .authed-only{display:none!important}#noteBox{width:425px}#noteBox div.note.firstview{background-color:var(--tertiary-bg)}#noteBox div.note:not(:last-child){border-bottom:1px solid var(--border-color)}#profileBox{min-width:250px}#loader{background-color:var(--body-bg-lower-opacity)}#requiredActions{bottom:0;left:0;position:absolute;z-index:98}#requiredActions>div{background-color:var(--body-bg);border:3px solid var(--border-color)}@media(min-width:576px){section{margin:.5rem}}@media(min-width:992px){.w-lg-auto,section{width:auto}}.green{color:var(--indicator-good)}label{cursor:pointer;margin-bottom:.25rem}input[type=date],input[type=number],input[type=password],input[type=text],input[type=url],textarea{background-color:var(--form-input-bg);border:1px solid var(--form-input-border);border-radius:5px;color:var(--text-color);display:block;padding:.375rem .75rem;width:100%}input[type=date]:focus,input[type=number]:focus,input[type=password]:focus,input[type=text]:focus,input[type=url]:focus,textarea:focus{border-color:var(--form-input-border-focus);outline:none}input[type=date].border-danger,input[type=number].border-danger,input[type=password].border-danger,input[type=text].border-danger,input[type=url].border-danger,textarea.border-danger{border-color:var(--text-danger)}input[type=date].border-success,input[type=number].border-success,input[type=password].border-success,input[type=text].border-success,input[type=url].border-success,textarea.border-success{border-color:var(--indicator-good)}input[type=date].thin,input[type=number].thin,input[type=password].thin,input[type=text].thin,input[type=url].thin,textarea.thin{width:4rem}input[type=date].micro,input[type=number].micro,input[type=password].micro,input[type=text].micro,input[type=url].micro,textarea.micro{font-size:14px;padding:0 .25rem;width:3rem}input[type=date].micro.wide,input[type=number].micro.wide,input[type=password].micro.wide,input[type=text].micro.wide,input[type=url].micro.wide,textarea.micro.wide{width:5rem}input[type=date].micro.thin,input[type=number].micro.thin,input[type=password].micro.thin,input[type=text].micro.thin,input[type=url].micro.thin,textarea.micro.thin{width:2rem}select{background-color:var(--form-input-bg)!important}.form-select{background-color:var(--form-input-bg);border:1px solid var(--form-input-border);border-radius:3px;color:var(--text-color)}.form-select:focus{border-color:var(--form-input-border-focus)}#regAssetForm input[data-tmpl=tradingTierInput]{width:3em}#regAssetForm .readygreen{color:#009931}#regAssetForm .setuporange{color:#b89400}#confirmRegForm{width:425px}#confirmRegForm button.submit{border-radius:3px;opacity:.9;padding:12px 30px;width:auto}#confirmRegForm button.submit:hover{opacity:1}#confirmRegForm input.app-pass{display:inline-block;max-width:250px}#confirmRegForm div.reg-conf-msg{width:100%}#confirmRegForm div.borderright{border-right:1px solid #777}#confirmRegForm .mw50{max-width:50%}#newWalletForm{width:425px}#newWalletForm [data-tmpl=walletTypeTabs] .wtab.selected{background-color:var(--form-selected-tab-bg);cursor:default;opacity:1}#newWalletForm [data-tmpl=walletTypeTabs] .wtab:not(.selected){cursor:pointer;opacity:.8}#newWalletForm [data-tmpl=walletTypeTabs] .wtab:not(.selected):hover{opacity:1}#newWalletForm .one-bttn{animation:glow 1.5s infinite alternate;background-color:#0b5831;border-radius:5px;display:inline-block;font-size:22px;padding:10px 25px}#newWalletForm .one-bttn:hover{background-color:#0c5f36}@keyframes glow{0%{box-shadow:0 0 4px -3px hsla(0,0%,100%,.467);opacity:.95}to{box-shadow:0 0 4px 0 hsla(0,0%,100%,.467);opacity:1}}.form-check-label{user-select:none}#forms{backdrop-filter:blur(5px);background-color:var(--forms-bg);bottom:0;left:0;padding:25px 0;position:fixed;right:0;top:0;z-index:101}#forms>form{box-sizing:content-box;margin:auto;padding-bottom:1rem;position:relative}#forms>form>div{padding:1rem 1rem 0}#forms>form>div.form-closer,#forms>form>div.form-closer-unbound{cursor:pointer;font-size:.8rem;line-height:1;padding:.75rem;position:absolute;right:0;top:0;z-index:1}#forms>form>div.form-closer span,#forms>form>div.form-closer-unbound span{opacity:.6}#forms>form>div.form-closer span:hover,#forms>form>div.form-closer-unbound span:hover{opacity:1}#forms>form header{border-bottom:1px solid var(--border-color);font-size:1.6rem;line-height:1;padding:1rem}div[data-handler=init] #forms,div[data-handler=login] #forms,div[data-handler=register] #forms{margin-top:70px;z-index:99}#walletWait .icons{width:25px}#walletWait .ico-check{color:rgba(5,163,90,.6)}#dexAddrForm .known-exchange{border:1px solid #555;border-radius:3px;cursor:pointer;font-size:17px;margin-bottom:10px;padding:5px 0;width:100%}#dexAddrForm .known-exchange.selected,#dexAddrForm .known-exchange:hover{background-color:hsla(0,0%,47%,.133)}#authorizeAccountImportForm,#disableAccountForm,#discoverAcctForm,#loginForm{width:275px}#changeAppPWForm,#deleteArchivedRecordsForm,#dexAddrForm,#resetAppPWForm,#verifyForm{width:325px}#appPWForm{width:350px}#cancelForm,#exportSeedAuth,#quickConfigForm,#sendForm,#toggleWalletStatusConfirm,#vSendForm,#walletWait{width:375px}#authorizeSeedDisplay,#confirmRegistrationForm,#gameCodeForm,#reconfigForm,#regAssetForm,#seedBackupForm,#votingForm{width:425px}a[data-tmpl=walletCfgGuide]{color:inherit;text-decoration:none}#deposit #copyAlert{margin-left:12px;position:absolute}.mini-slider{cursor:pointer;padding:.5rem 0;user-select:none}.mini-slider div[data-tmpl=color]{background-color:hsla(0,0%,47%,.467);height:.2rem;overflow:visible;position:relative;width:100%}.mini-slider div[data-tmpl=color]>div[data-tmpl=track]{bottom:0;left:.375rem;overflow:visible;position:absolute;right:.375rem;top:0}.mini-slider div[data-tmpl=color]>div[data-tmpl=track]>div[data-tmpl=ball]{background-color:var(--text-grey);border-radius:1rem;cursor:pointer;height:.75rem;position:absolute;top:.1rem;transform:translate(-50%,-50%);width:.75rem}.mini-slider.small div[data-tmpl=color]{height:.125rem}.mini-slider.small div[data-tmpl=color]>div[data-tmpl=track]{left:.25rem;right:.25rem}.mini-slider.small div[data-tmpl=color]>div[data-tmpl=track]>div[data-tmpl=ball]{height:.5rem;width:.5rem}.order-opt,.slider-container{border:1px solid #424242;border-radius:3px;margin-top:8px;padding:4px}.order-opt>div.disabled,.slider-container>div.disabled{opacity:.8}.order-opt>div.disabled [data-tmpl=sliderBox],.slider-container>div.disabled [data-tmpl=sliderBox]{cursor:default}.order-opt>div.disabled [data-tmpl=sliderBox] .slider .slider-handle,.slider-container>div.disabled [data-tmpl=sliderBox] .slider .slider-handle{background-color:hsla(0,0%,47%,.733)}.order-opt div.opt-check,.slider-container div.opt-check{border:2px solid #424242;border-radius:7.5px;cursor:pointer;height:15px;margin-top:5px;width:15px}.order-opt .xy-range-input,.slider-container .xy-range-input{font-size:14px;height:16px;width:35px}.order-opt [data-tmpl=sliderBox],.slider-container [data-tmpl=sliderBox]{cursor:pointer}.order-opt [data-tmpl=sliderBox] .slider,.slider-container [data-tmpl=sliderBox] .slider{background-color:gray;height:2px;margin:10px 10px 5px;position:relative}.order-opt [data-tmpl=sliderBox] .slider .slider-handle,.slider-container [data-tmpl=sliderBox] .slider .slider-handle{background-color:#2cce9c;border:2px solid #424242;border-radius:7px;height:20px;position:absolute;top:-9px;width:14px}div[data-tmpl=scoreTray]{background-color:var(--buy-color);border-radius:100px;height:12px;overflow:hidden}div[data-tmpl=scoreTray] div[data-tmpl=scoreWarn]{background-color:var(--sell-color);bottom:0;left:0;position:absolute;top:0}span[data-tmpl=scorePointer]{transform:translateX(-50%)}span[data-tmpl=scorePointer] span[data-tmpl=scoreData]{bottom:0;top:0}span[data-tmpl=scorePointer] span[data-tmpl=scoreData].positive{right:calc(100% + .125rem)}span[data-tmpl=scorePointer] span[data-tmpl=scoreData].negative{left:calc(100% + .125rem)}.penalty-marker{background-color:#000;bottom:0;left:10%;position:absolute;top:0;width:2px;z-index:2}div[data-handler=init] .quickconfig-asset-logo{height:25px;width:25px}.anitoggle{background-color:hsla(0,0%,47%,.667);border-radius:.45rem;cursor:pointer;height:.9rem;width:1.5rem}.anitoggle.on{background-color:var(--indicator-good)}.anitoggle>div{background-color:var(--section-bg);border-radius:.35rem;height:.7rem;left:.1rem;position:relative;top:.1rem;transition:left .5s;width:.7rem}.anitoggle.on>div{left:.7rem}.anitoggle.big{border-radius:10px;height:20px;width:35px}.anitoggle.big>div{border-radius:12px;height:16px;left:2px;top:2px;width:16px}.anitoggle.big.on>div{left:17px}.selectable.selected{border:2px solid green}.dynamicopts{align-items:stretch;display:flex;flex-wrap:wrap;justify-content:space-between}.dynamicopts>div{min-height:55px}.dynamicopts>div:not(.repeatable,[data-tmpl=checkbox]){width:47%}.hoveropaque{opacity:.7}.hoveropaque:hover{opacity:1}#placementsBody td[data-tmpl=error]{max-width:200px}body.dark ::-webkit-calendar-picker-indicator{filter:invert(1)}body.dark #regAssetForm div.reg-asset .fader{background-image:linear-gradient(180deg,rgba(19,32,43,0),#122739 90%)}body.dark #regAssetForm div.reg-asset:not(.nohover):hover .fader{background-image:linear-gradient(180deg,rgba(32,44,53,0),#202c35 90%)}div[data-handler=markets] .ordertable-wrap{width:100%}div[data-handler=markets] .ordertable-wrap:first-child{border-bottom:1px solid var(--border-color)}div[data-handler=markets] .ordertable-wrap tbody#sellRows,div[data-handler=markets] .ordertable-wrap:last-child{border-top:1px solid var(--border-color)}div[data-handler=markets] .orderbook{min-width:225px}div[data-handler=markets] .orderbook>div:first-child{order:3}div[data-handler=markets] .orderbook>div:nth-child(2){order:1}div[data-handler=markets] .orderbook>div:last-child{order:2}div[data-handler=markets] .order-panel{min-width:375px}div[data-handler=markets] .order-panel #orderForm input[type=number]{border-radius:0;font-size:14px;height:30px}div[data-handler=markets] .order-panel #orderForm input:focus{outline:none}div[data-handler=markets] .order-panel #orderForm span.unitbox{font-size:14px;font-weight:700;position:absolute;right:5px;top:48%;transform:translateY(-50%);white-space:nowrap}div[data-handler=markets] .order-panel #orderForm button{background-color:var(--section-bg);border:1px solid hsla(0,0%,47%,.467);border-radius:3px;color:var(--market-btn-color);padding:5px 25px}div[data-handler=markets] .order-panel #orderForm button:disabled{opacity:.4}div[data-handler=markets] .order-panel #orderForm button.selected,div[data-handler=markets] .order-panel #orderForm button.submit,div[data-handler=markets] .order-panel #orderForm button:hover{color:var(--market-btn-selected-color)}div[data-handler=markets] .order-panel #orderForm button.selected.buygreen-bg,div[data-handler=markets] .order-panel #orderForm button.submit.buygreen-bg{background-color:var(--market-buygreen-bg)}div[data-handler=markets] .order-panel #orderForm button.selected.sellred-bg,div[data-handler=markets] .order-panel #orderForm button.submit.sellred-bg{background-color:var(--market-sellred-bg)}div[data-handler=markets] .order-panel #orderForm #orderPreview,div[data-handler=markets] .order-panel #orderForm .h21{height:21px}div[data-handler=markets] .order-panel .ico-unlocked{color:#0b5831}div[data-handler=markets] .order-panel .ico-disconnected{color:var(--text-warning)}div[data-handler=markets] .market-chart{flex-grow:1;min-height:250px;min-width:100px;position:relative}div[data-handler=markets] .market-chart canvas{left:0;position:absolute;top:0;user-select:none}div[data-handler=markets] #unreadyOrdersMsg{color:rgba(221,34,34,.933)}div[data-handler=markets] .unready-user-order{background-color:#6e0909}div[data-handler=markets] .user-order:not(:last-child){border-bottom-style:none!important}div[data-handler=markets] .user-order:last-child .order-details{border-bottom-style:none!important;padding-bottom:0}div[data-handler=markets] .user-order .user-order-header{font-size:14px;padding:5px 10px 5px 20px;position:relative}div[data-handler=markets] .user-order .user-order-header .side-indicator{bottom:0;left:0;position:absolute;top:0;width:8px}div[data-handler=markets] .user-order .user-order-header .side-indicator.buy{background-color:var(--buy-color)}div[data-handler=markets] .user-order .user-order-header .side-indicator.sell{background-color:var(--market-sell-color)}div[data-handler=markets] .user-order .user-order-header .side-indicator.inactive{opacity:.5}div[data-handler=markets] .user-order .user-order-header .active-indicator{border-radius:4px;height:8px}div[data-handler=markets] .user-order .user-order-header .active-indicator.active{background-color:var(--buy-color);margin:0 5px;width:8px}div[data-handler=markets] .user-order .order-details{column-gap:5px;display:grid;grid-template-columns:1fr 1fr 1fr 1fr;line-height:1;margin-bottom:25px;padding:0 10px 10px;row-gap:10px}div[data-handler=markets] .user-order .order-details .user-order-datum{align-items:flex-start;display:flex;flex-direction:column;flex-grow:1}div[data-handler=markets] .user-order .order-details .user-order-datum>span:first-child{color:gray;font-family:demi-sans,sans-serif;font-size:12px;margin-bottom:2px}div[data-handler=markets] .user-order .order-details .user-order-datum>span:nth-child(2){font-size:14px}div[data-handler=markets] .user-order .order-details .user-order-datum.full-span{grid-column:1/-1}div[data-handler=markets] .markettab{background-color:var(--section-bg);border-style:none;height:30px}div[data-handler=markets] .markettab.selected{background-color:var(--market-markettab-selected-bg)}div[data-handler=markets] .numorders{background-color:var(--market-numorders-bg);padding:1px 2px}div[data-handler=markets] #leftMarketDock{background-color:var(--section-bg);display:flex;left:0;min-height:-webkit-fill-available;position:absolute;top:0;z-index:2}div[data-handler=markets] #leftMarketDock.default,div[data-handler=markets] #leftMarketDock.stashed{display:none}div[data-handler=markets] #leftMarketDock #searchBoxV1{height:55px}div[data-handler=markets] #leftMarketDock.stashed{display:none}div[data-handler=markets] #leftMarketDock #marketSearchV1:focus{border:none;outline:none}div[data-handler=markets] #leftMarketDock #marketSearchV1{background-color:transparent;border:none;font-family:demi-sans,sans-serif;font-size:25px;font-variant:small-caps;text-align:center;width:100%;z-index:2}div[data-handler=markets] #leftMarketDock #marketSearchV1+.ico-search{left:50%;opacity:.25;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);z-index:1}div[data-handler=markets] #leftMarketDock #marketSearchV1:hover+.ico-search{opacity:.5}div[data-handler=markets] #leftMarketDock #marketSearchV1:focus+.ico-search,div[data-handler=markets] #leftMarketDock #marketSearchV1:not(:placeholder-shown)+.ico-search{display:none}div[data-handler=markets] #leftMarketDock #marketListV1{height:100%;min-width:275px}div[data-handler=markets] #leftMarketDock #marketListV1>div .dexname{max-width:60px;overflow:hidden;text-overflow:ellipsis}div[data-handler=markets] #leftMarketDock #marketListV1>div.selected{background-color:hsla(0,0%,47%,.2)}div[data-handler=markets] #mainContent{align-items:center;display:flex;flex-direction:column}div[data-handler=markets] #mainContent>div,div[data-handler=markets] #mainContent>section{display:flex;min-height:500px}div[data-handler=markets] #mainContent>div:first-child,div[data-handler=markets] #mainContent>section:first-child{max-height:1000px;order:3}div[data-handler=markets] #mainContent>div:nth-child(2),div[data-handler=markets] #mainContent>section:nth-child(2){order:1}div[data-handler=markets] #mainContent>div:last-child,div[data-handler=markets] #mainContent>section:last-child{order:2}div[data-handler=markets] #durBttnBox,div[data-handler=markets] #epochLine{background-color:var(--section-bg);left:65px;position:absolute;top:5px;z-index:1}div[data-handler=markets] #durBttnBox .candle-dur-bttn{background-color:var(--section-bg);font-size:14px;line-height:1;margin:0 2px;padding:2px 4px}div[data-handler=markets] #durBttnBox .candle-dur-bttn:hover{background-color:hsla(0,0%,47%,.467)}div[data-handler=markets] #durBttnBox .candle-dur-bttn.selected,div[data-handler=markets] #durBttnBox .candle-dur-bttn:hover{border-color:var(--text-warning);color:var(--text-warning)}div[data-handler=markets] #epochLine .epoch-line{border-top:3px dotted #626262;display:inline-block;height:0;margin-right:5px;position:relative;top:1px;width:25px}div[data-handler=markets] #loaderMsg{color:#777}div[data-handler=markets] #bondCreationPending .title{color:#9b8c09;font-weight:700;margin-bottom:5px}div[data-handler=markets] #registrationStatus .title{font-weight:700;margin-bottom:5px}div[data-handler=markets] #registrationStatus.waiting .title{color:#9b8c09}div[data-handler=markets] #registrationStatus.completed .title{color:#0b5831}div[data-handler=markets] #registrationStatus.completed #regStatusMessage{display:none}div[data-handler=markets] #registrationStatus.error .title{color:rgba(221,34,34,.933)}div[data-handler=markets] #approveTokenForm{width:450px}div[data-handler=markets] #verifyForm .echo-data span{margin:0 5px}div[data-handler=markets] #verifyForm .disclaimer{text-align:justify}div[data-handler=markets] #verifyForm header.buygreen-bg{background-color:var(--market-buygreen-bg)}div[data-handler=markets] #verifyForm header.sellred-bg{background-color:var(--market-sellred-bg)}div[data-handler=markets] #verifyForm button.buygreen-bg{background-color:var(--market-buygreen-bg)}div[data-handler=markets] #verifyForm button.sellred-bg{background-color:var(--market-sellred-bg)}div[data-handler=markets] #verifyForm .loader{height:40px}div[data-handler=markets] #verifyForm .order-opt{opacity:.7}div[data-handler=markets] #verifyForm .order-opt:not(.selected){cursor:pointer}div[data-handler=markets] #verifyForm .order-opt.selected{background-color:var(--form-opt-selected-bg);opacity:1}div[data-handler=markets] #verifyForm .order-opt.selected div.opt-check{background-color:#0b5831}div[data-handler=markets] #vDetailPane{max-width:425px}div[data-handler=markets] #vDetailPane .indent{border-left:2px solid var(--border-color)}div[data-handler=markets] #vDetailPane table.fee-breakout td{padding:2px 5px;text-align:center}div[data-handler=markets] #marketReopener{background-color:var(--section-bg);display:none;left:0;padding:10px 0;position:absolute;top:0;z-index:10}div[data-handler=markets] #leftHider .ico-arrowleft,div[data-handler=markets] #leftHider .ico-arrowright,div[data-handler=markets] #marketReopener .ico-arrowleft,div[data-handler=markets] #marketReopener .ico-arrowright{opacity:.5;transform:scaleX(.5)}div[data-handler=markets] #leftHider:hover .ico-arrowleft,div[data-handler=markets] #leftHider:hover .ico-arrowright,div[data-handler=markets] #marketReopener:hover .ico-arrowleft,div[data-handler=markets] #marketReopener:hover .ico-arrowright{opacity:1}.market-stats{display:flex;gap:15px;margin:0 5px}.market-stats .statgrid{display:grid;grid-template-columns:auto auto auto}#headerSpace .market-stats,.market-stats.listopen .ico-arrowdown,.market-stats:not(.listopen) .ico-arrowup{display:none}#recentMatchesBox{max-height:350px}#recentMatchesTable th{align-items:center}#recentMatchesTable th:hover{opacity:.7}#recentMatchesTable th .ico-arrowdown{display:inline-block;font-size:10px;margin-left:5px;vertical-align:middle;visibility:hidden}#recentMatchesTable th.sorted-dsc .ico-arrowdown{visibility:visible}#recentMatchesTable th.sorted-asc .ico-arrowdown{transform:rotate(180deg);visibility:visible}@media(min-width:1200px){#main .market-stats{border-top:none;display:none}#headerSpace .market-stats{border-bottom:none!important;display:flex}div[data-handler=markets] #leftMarketDock{position:relative}div[data-handler=markets] #leftMarketDock.default{display:flex}}@media(min-width:992px){div[data-handler=markets] #mainContent{align-items:stretch;bottom:0;flex-direction:row;left:0;overflow:hidden;position:absolute;right:0;top:0}div[data-handler=markets] #mainContent>div,div[data-handler=markets] #mainContent>section{display:flex;min-height:none}div[data-handler=markets] #mainContent>div:nth-child(n),div[data-handler=markets] #mainContent>section:nth-child(n){min-height:auto}div[data-handler=markets] #mainContent>div:first-child,div[data-handler=markets] #mainContent>section:first-child{order:1}div[data-handler=markets] #mainContent>div:nth-child(2),div[data-handler=markets] #mainContent>section:nth-child(2){order:2}div[data-handler=markets] #mainContent>div:last-child,div[data-handler=markets] #mainContent>section:last-child{order:3}div[data-handler=markets] .ordertable-wrap{display:flex;height:calc(50% - 15px)}div[data-handler=markets] .ordertable-wrap.reversible{flex-direction:column-reverse}div[data-handler=markets] .ordertable-wrap tbody{align-items:stretch;display:flex}div[data-handler=markets] .ordertable-wrap tbody#sellRows{border-top:none;flex-direction:column-reverse}div[data-handler=markets] .ordertable-wrap tbody#buyRows{flex-direction:column}div[data-handler=markets] .orderbook{width:auto}div[data-handler=markets] .orderbook>div:first-child{order:1}div[data-handler=markets] .orderbook>div:nth-child(2){order:2}div[data-handler=markets] .orderbook>div:last-child{order:3}div[data-handler=markets] .order-panel>div{bottom:0;height:100%;left:0;overflow:auto;overflow-x:hidden;position:absolute;right:0;scrollbar-color:hsla(0,0%,47%,.267) hsla(0,0%,47%,.067);scrollbar-width:thin;top:0}div[data-handler=markets] .order-panel>div::-webkit-scrollbar{height:8px;width:8px}div[data-handler=markets] .order-panel>div::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}div[data-handler=markets] .order-panel>div::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}div[data-handler=markets] #leftMarketDock.stashed+#marketReopener{display:block}#recentMatchesBox{border-bottom:none;max-height:none;overflow:visible}#candlesLegend,#depthLegend{background-color:var(--section-bg);position:absolute;right:0;top:0;z-index:10}}.user-order-floaty-menu{align-items:center;background-color:var(--section-bg);border-color:var(--border-color);border-style:none solid solid;border-width:0 2px 2px 1px;cursor:pointer;display:flex;overflow:hidden;position:absolute;z-index:5}.user-order-floaty-menu>a,.user-order-floaty-menu>span{margin:0 5px;padding-left:10px;padding-right:10px}.user-order-floaty-menu>a:hover,.user-order-floaty-menu>span:hover{background-color:hsla(0,0%,47%,.333)}.bot-problems-section{background-color:rgba(255,0,0,.667);border-radius:5px;margin-bottom:2px;margin-top:2px;padding-left:2px}.walletspage .ico-unlocked{color:var(--indicator-good)}.walletspage .market-select-logo{height:20px;width:20px}.walletspage .short-host{max-width:175px;text-overflow:ellipsis}.walletspage .mw-90p{min-width:90%}.walletspage #confirmForce,.walletspage #recoverWalletConfirm,.walletspage #toggleWalletStatusConfirm{width:400px}.walletspage #content{flex-direction:column}.walletspage #assetSelect{flex-direction:row}.walletspage #assetSelect .icon-select{cursor:pointer;min-height:fit-content}.walletspage #assetSelect .icon-select img[data-tmpl=img]{height:30px;width:30px}.walletspage #assetSelect .icon-select img[data-tmpl=parentImg]{background-color:var(--section-bg);border:3px solid var(--section-bg);border-radius:10px;bottom:15px;height:20px;left:15px;position:absolute;width:20px}.walletspage #assetSelect .icon-select.selected,.walletspage #assetSelect .icon-select:hover{background-color:var(--body-bg);opacity:1}.walletspage #assetSelect .icon-select.selected img[data-tmpl=parentImg],.walletspage #assetSelect .icon-select:hover img[data-tmpl=parentImg]{background-color:var(--section-bg);border:3px solid var(--body-bg)}.walletspage #assetSelect .icon-select.nowallet{opacity:.7}.walletspage #assetSelect .icon-select.nowallet [data-tmpl=balance]{display:none}.walletspage table#balanceTable td{line-height:1}.walletspage table#balanceTable tr.itemized>td{padding-bottom:.25rem}.walletspage table#balanceTable tr:not(.sub,:first-child) td{padding-top:.5rem}.walletspage table#balanceTable tr{font-size:1.1rem}.walletspage table#balanceTable tr.sub{font-size:.9rem}.walletspage table#balanceTable tr.sub.last>td:first-child:before{content:"└─ "}.walletspage table#balanceTable tr.sub>td:first-child:before{content:"├─ "}.walletspage table#balanceTable tr.sub>td:last-child{border-right:1px solid var(--border-color);padding-right:.5rem}.walletspage #walletInfo{border-left:none}.walletspage #walletInfo table#walletInfoTable td{line-height:1;padding:2px 5px 2px 0}.walletspage #walletInfo table#walletInfoTable td:last-child{padding-left:1rem;text-align:right}.walletspage #earlierTxs,.walletspage #txViewBlockExplorer{cursor:pointer;text-decoration:underline}.walletspage #checkmarkBox{height:100px}.walletspage #walletDetailsBox #assetLogo{height:30px;width:30px}.walletspage #walletDetailsBox #assetName{font-size:30px}.walletspage #walletDetailsBox #balance{font-size:20px}.walletspage #walletDetailsBox #balanceUnit{font-size:17px}.walletspage #walletDetailsBox #fiatBalanceBox{font-size:13px}.walletspage #walletDetailsBox #tokenParentLogo{height:18px;width:18px}.walletspage #walletDetailsBox #contractAddress{opacity:.4}.walletspage .peers-table-icon{padding-left:30%}.walletspage #vspDisplay #vspEditIcon{display:none}.walletspage #vspDisplay:hover #vspEditIcon{display:inline}.walletspage .scrollsmall{overflow:auto;scrollbar-color:hsla(0,0%,47%,.267) hsla(0,0%,47%,.067);scrollbar-width:thin}.walletspage .scrollsmall::-webkit-scrollbar{height:8px;width:8px}.walletspage .scrollsmall::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}.walletspage .scrollsmall::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}.walletspage .positive-tx{color:var(--indicator-good)}.walletspage .negative-tx{color:rgba(221,34,34,.933)}@media(min-width:1200px){.scrollsmall{overflow:hidden}.column{bottom:0;left:0;overflow:auto;position:absolute;right:0;scrollbar-width:none;top:0}.column::-webkit-scrollbar{display:none}}@media(min-width:992px){.fill-abs-lg{bottom:0;left:0;position:absolute;right:0;top:0}.stylish-overflow-lg{overflow:auto;scrollbar-color:hsla(0,0%,47%,.267) hsla(0,0%,47%,.067);scrollbar-width:thin}.stylish-overflow-lg::-webkit-scrollbar{height:8px;width:8px}.stylish-overflow-lg::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}.stylish-overflow-lg::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}.walletspage #walletDetailsBox{border-bottom:none!important}.flex-wrap-lg{flex-wrap:wrap}#purchaseTicketsErrBox{background-color:var(--section-bg)}}@media(min-width:576px){.walletspage #walletDetailsBox #assetLogo{height:40px;width:40px}.walletspage #walletDetailsBox #assetName{font-size:40px}.walletspage #walletDetailsBox #balance{font-size:28px}.walletspage #walletDetailsBox #balanceUnit{font-size:20px}.walletspage #walletDetailsBox #fiatBalanceBox{font-size:15px}.walletspage #content{flex-direction:row}.walletspage #assetSelect{flex-direction:column;overflow-y:auto}.walletspage #assetSelect .icon-select{padding:15px}.walletspage #assetSelect .icon-select img[data-tmpl=img]{height:40px;width:40px}.walletspage #assetSelect .icon-select img[data-tmpl=parentImg]{border-radius:15px;bottom:20px;height:28px;left:20px;width:28px}}@media(min-width:768px){.walletspage #sendReceive{border-bottom:none}}#exportWalletAuth,#restoreWalletInfo,#txDetails,#unapproveTokenForm{width:450px}#submitReconfig[disabled]{cursor:not-allowed}.filter-display{border-radius:3px;cursor:pointer;font-size:16px;font-weight:700}.filter-opts{max-width:250px;position:relative;text-overflow:ellipsis;white-space:nowrap}div.order-datum{align-items:stretch;display:flex;flex-direction:column;font-size:15px;justify-content:start;text-align:center}div.order-datum div:first-child{font-family:demi-sans,sans-serif}div.match-header,div.order-datum div:first-child{background-color:var(--tertiary-bg)}div.match-card{align-items:stretch;display:flex;flex-direction:column;font-size:14px}.match-data-label{font-family:demi-sans,sans-serif;opacity:.5}#accelerateForm{width:500px}div.settings{min-width:375px}div[data-handler=mm] #gapStrategySelect,div[data-handler=mmarchives] #gapStrategySelect,div[data-handler=mmlogs] #gapStrategySelect,div[data-handler=mmsettings] #gapStrategySelect{width:300px}div[data-handler=mm] .gap-factor-input,div[data-handler=mm] .lots-input,div[data-handler=mmarchives] .gap-factor-input,div[data-handler=mmarchives] .lots-input,div[data-handler=mmlogs] .gap-factor-input,div[data-handler=mmlogs] .lots-input,div[data-handler=mmsettings] .gap-factor-input,div[data-handler=mmsettings] .lots-input{max-width:75px}div[data-handler=mm] [data-tmpl=value].wide,div[data-handler=mmarchives] [data-tmpl=value].wide,div[data-handler=mmlogs] [data-tmpl=value].wide,div[data-handler=mmsettings] [data-tmpl=value].wide{width:3rem}div[data-handler=mm] .ico-arrowup.ml2px,div[data-handler=mmarchives] .ico-arrowup.ml2px,div[data-handler=mmlogs] .ico-arrowup.ml2px,div[data-handler=mmsettings] .ico-arrowup.ml2px{margin-left:2px}div[data-handler=mm] .pt-pt5,div[data-handler=mmarchives] .pt-pt5,div[data-handler=mmlogs] .pt-pt5,div[data-handler=mmsettings] .pt-pt5{padding-top:.125rem}div[data-handler=mm] #profitInput,div[data-handler=mmarchives] #profitInput,div[data-handler=mmlogs] #profitInput,div[data-handler=mmsettings] #profitInput{width:70px}div[data-handler=mm] .bot-type-selector,div[data-handler=mmarchives] .bot-type-selector,div[data-handler=mmlogs] .bot-type-selector,div[data-handler=mmsettings] .bot-type-selector{align-items:stretch;border:1px solid var(--border-color);display:flex;flex-direction:column;user-select:none}div[data-handler=mm] .bot-type-selector.disabled,div[data-handler=mmarchives] .bot-type-selector.disabled,div[data-handler=mmlogs] .bot-type-selector.disabled,div[data-handler=mmsettings] .bot-type-selector.disabled{opacity:.5}div[data-handler=mm] .bot-type-selector:not(.disabled),div[data-handler=mmarchives] .bot-type-selector:not(.disabled),div[data-handler=mmlogs] .bot-type-selector:not(.disabled),div[data-handler=mmsettings] .bot-type-selector:not(.disabled){cursor:pointer}div[data-handler=mm] .bot-type-selector:not(.disabled).selected,div[data-handler=mmarchives] .bot-type-selector:not(.disabled).selected,div[data-handler=mmlogs] .bot-type-selector:not(.disabled).selected,div[data-handler=mmsettings] .bot-type-selector:not(.disabled).selected{background-color:hsla(0,0%,47%,.133);outline:2px solid #0b5831}div[data-handler=mm] .bot-problems-section,div[data-handler=mmarchives] .bot-problems-section,div[data-handler=mmlogs] .bot-problems-section,div[data-handler=mmsettings] .bot-problems-section{background-color:rgba(255,0,0,.667);border-radius:5px;margin-bottom:2px;margin-top:2px;padding-left:2px}div[data-handler=mm] #marketFilterIcon,div[data-handler=mmarchives] #marketFilterIcon,div[data-handler=mmlogs] #marketFilterIcon,div[data-handler=mmsettings] #marketFilterIcon{left:10px;opacity:.5;position:absolute;top:50%;transform:translateY(-50%)}div[data-handler=mm] #botTypeForm,div[data-handler=mmarchives] #botTypeForm,div[data-handler=mmlogs] #botTypeForm,div[data-handler=mmsettings] #botTypeForm{min-width:375px}div[data-handler=mm] #cexSelection .cex-selector,div[data-handler=mmarchives] #cexSelection .cex-selector,div[data-handler=mmlogs] #cexSelection .cex-selector,div[data-handler=mmsettings] #cexSelection .cex-selector{user-select:none}div[data-handler=mm] #cexSelection .cex-selector.configured:not(.selected),div[data-handler=mmarchives] #cexSelection .cex-selector.configured:not(.selected),div[data-handler=mmlogs] #cexSelection .cex-selector.configured:not(.selected),div[data-handler=mmsettings] #cexSelection .cex-selector.configured:not(.selected){opacity:.8}div[data-handler=mm] #cexSelection.disabled .cex-selector.configured,div[data-handler=mmarchives] #cexSelection.disabled .cex-selector.configured,div[data-handler=mmlogs] #cexSelection.disabled .cex-selector.configured,div[data-handler=mmsettings] #cexSelection.disabled .cex-selector.configured{opacity:.5}div[data-handler=mm] #cexSelection.disabled .cex-selector:not(.configured),div[data-handler=mm] #cexSelection:not(.disabled) .cex-selector,div[data-handler=mmarchives] #cexSelection.disabled .cex-selector:not(.configured),div[data-handler=mmarchives] #cexSelection:not(.disabled) .cex-selector,div[data-handler=mmlogs] #cexSelection.disabled .cex-selector:not(.configured),div[data-handler=mmlogs] #cexSelection:not(.disabled) .cex-selector,div[data-handler=mmsettings] #cexSelection.disabled .cex-selector:not(.configured),div[data-handler=mmsettings] #cexSelection:not(.disabled) .cex-selector{cursor:pointer}div[data-handler=mm] #cexSelection:not(.disabled) .cex-selector.selected,div[data-handler=mmarchives] #cexSelection:not(.disabled) .cex-selector.selected,div[data-handler=mmlogs] #cexSelection:not(.disabled) .cex-selector.selected,div[data-handler=mmsettings] #cexSelection:not(.disabled) .cex-selector.selected{background-color:hsla(0,0%,47%,.133)!important;border-color:#0b5831!important;border-width:2px!important}div[data-handler=mm] #cexSelection .reconfig,div[data-handler=mmarchives] #cexSelection .reconfig,div[data-handler=mmlogs] #cexSelection .reconfig,div[data-handler=mmsettings] #cexSelection .reconfig{position:absolute;right:0;top:0}div[data-handler=mm] #quickConfig input[type=number],div[data-handler=mmarchives] #quickConfig input[type=number],div[data-handler=mmlogs] #quickConfig input[type=number],div[data-handler=mmsettings] #quickConfig input[type=number]{width:100px}div[data-handler=mm] #levelSpacingBox.disabled,div[data-handler=mmarchives] #levelSpacingBox.disabled,div[data-handler=mmlogs] #levelSpacingBox.disabled,div[data-handler=mmsettings] #levelSpacingBox.disabled{opacity:.5}div[data-handler=mm] #placementsChart,div[data-handler=mm] [data-tmpl=placementsChart],div[data-handler=mmarchives] #placementsChart,div[data-handler=mmarchives] [data-tmpl=placementsChart],div[data-handler=mmlogs] #placementsChart,div[data-handler=mmlogs] [data-tmpl=placementsChart],div[data-handler=mmsettings] #placementsChart,div[data-handler=mmsettings] [data-tmpl=placementsChart]{height:100px}div[data-handler=mm] #buyPlacementsBox .ico-cross,div[data-handler=mm] #sellPlacementsBox .ico-cross,div[data-handler=mmarchives] #buyPlacementsBox .ico-cross,div[data-handler=mmarchives] #sellPlacementsBox .ico-cross,div[data-handler=mmlogs] #buyPlacementsBox .ico-cross,div[data-handler=mmlogs] #sellPlacementsBox .ico-cross,div[data-handler=mmsettings] #buyPlacementsBox .ico-cross,div[data-handler=mmsettings] #sellPlacementsBox .ico-cross{color:var(--text-danger)}div[data-handler=mm] #buyPlacementsBox .ico-plus,div[data-handler=mm] #sellPlacementsBox .ico-plus,div[data-handler=mmarchives] #buyPlacementsBox .ico-plus,div[data-handler=mmarchives] #sellPlacementsBox .ico-plus,div[data-handler=mmlogs] #buyPlacementsBox .ico-plus,div[data-handler=mmlogs] #sellPlacementsBox .ico-plus,div[data-handler=mmsettings] #buyPlacementsBox .ico-plus,div[data-handler=mmsettings] #sellPlacementsBox .ico-plus{color:var(--btn-go-bg)}div[data-handler=mm] #noBots .ico-robot,div[data-handler=mmarchives] #noBots .ico-robot,div[data-handler=mmlogs] #noBots .ico-robot,div[data-handler=mmsettings] #noBots .ico-robot{font-size:80px;opacity:.7}div[data-handler=mm] #cexOrderDetailsForm,div[data-handler=mm] #depositDetailsForm,div[data-handler=mm] #dexOrderDetailsForm,div[data-handler=mm] #withdrawalDetailsForm,div[data-handler=mmarchives] #cexOrderDetailsForm,div[data-handler=mmarchives] #depositDetailsForm,div[data-handler=mmarchives] #dexOrderDetailsForm,div[data-handler=mmarchives] #withdrawalDetailsForm,div[data-handler=mmlogs] #cexOrderDetailsForm,div[data-handler=mmlogs] #depositDetailsForm,div[data-handler=mmlogs] #dexOrderDetailsForm,div[data-handler=mmlogs] #withdrawalDetailsForm,div[data-handler=mmsettings] #cexOrderDetailsForm,div[data-handler=mmsettings] #depositDetailsForm,div[data-handler=mmsettings] #dexOrderDetailsForm,div[data-handler=mmsettings] #withdrawalDetailsForm{min-width:400px}div[data-handler=mm] .allocation-grid,div[data-handler=mmarchives] .allocation-grid,div[data-handler=mmlogs] .allocation-grid,div[data-handler=mmsettings] .allocation-grid{display:grid;grid-template-columns:1fr auto auto}div[data-handler=mm] .allocation-grid .second,div[data-handler=mmarchives] .allocation-grid .second,div[data-handler=mmlogs] .allocation-grid .second,div[data-handler=mmsettings] .allocation-grid .second{grid-column:2}div[data-handler=mm] .allocation-grid .third,div[data-handler=mmarchives] .allocation-grid .third,div[data-handler=mmlogs] .allocation-grid .third,div[data-handler=mmsettings] .allocation-grid .third{grid-column:3} /*# sourceMappingURL=style.css.map*/ \ No newline at end of file diff --git a/client/webserver/site/dist/style.css.map b/client/webserver/site/dist/style.css.map index 74069d1801..de19c7fef8 100644 --- a/client/webserver/site/dist/style.css.map +++ b/client/webserver/site/dist/style.css.map @@ -1 +1 @@ -{"version":3,"file":"../dist/style.css","mappings":"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CA,oBACA,0BACA,oBACA,qBAGA,qBACA,yBACA,+BACA,+BACA,6BACA,4BACA,yBAGA,oBACA,qBACA,+BACA,8BACA,4BACA,wBACA,iCACA,qCACA,2BACA,8BACA,sBAGA,sCAGA,WAIF,iBAEE,kCACA,qBACA,kBACA,wBACA,qBACA,+BACA,sBACA,qBACA,iBACA,uBACA,qBACA,qBAGA,2BACA,4BACA,4BACA,sBAGA,yBACA,yBAGA,8BACA,yBACA,+BACA,mCACA,wCACA,8BACA,oBACA,0BACA,oBACA,qBAGA,sBACA,yBACA,kCACA,+BACA,6BACA,+BACA,yBAGA,oBACA,qBACA,+BACA,8BACA,4BACA,wBACA,iCACA,qCACA,2BACA,8BACA,sBAGA,2CAGA,YAGF,mBACE,YAGF,iCACE,0BACA,UAGF,+BACE,aAGF,kCACE,YAGF,2BACE,YCpJF,uBACE,CAIA,kBAFE,eAEF,CAJA,iIAKA,YAIF,qBACE,CAIA,kBAFE,kBAEF,CAJA,iHAKA,YAGF,gBACE,CAIA,kBAFE,eAEF,CAJA,2HAKA,MAGF,aACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,CAIA,YAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,gCAxGY,OA4GZ,0BA3GO,OA+GP,kCAjHO,OAqHP,eACE,cCtHF,WACE,2QAKA,mBAFF,YACE,uBAEA,kCAKA,oBAFF,YACE,sBAEA,YAGF,cACE,cAGF,kBACE,oBAGF,iBACE,oBAGF,iBACE,gpBAGF,mCACE,YAGF,iBACE,6EAGF,aCrCE,CACA,wDADA,oBAEA,4KAIE,WADF,SAEE,0MAGF,mCACE,0MAGF,mCACE,kBACA,2LDwBF,uCACE,wTAEA,4BACE,wTAGF,4BACE,kBACA,uKAIJ,iBACE,kBAIJ,aCrCE,qBACA,qCAEA,YACE,iBDqCJ,GACE,sBACE,IAGF,uBACE,cAIJ,wBACE,SAGF,eACE,SAGF,eACE,YAGF,eACE,SAGF,sBACE,WAGF,sBACE,YAGF,uBACE,OAGF,sBACE,+LAGF,iBACE,WAGF,yCClEE,kBDwEA,WACA,kBACA,WAHF,UAIE,kBAGF,cACE,kBACA,UACA,UAGF,oBACE,UAGF,cAGE,kBACA,UAGF,wBACE,YAGF,yBACE,YAGF,aACE,WAGF,kBACE,iCAGF,oBAEE,6CAME,eADF,mCAGE,iBAKF,gBADF,oBAEE,MAGF,aACE,igBC9IA,QACA,OACA,CD+IF,iBClJE,CAGA,QAHA,KAIA,UDkJF,sBACE,WAGF,SACE,kBAIF,eACE,oBAGF,iBACE,+JAGF,iBAEE,kBAGF,eACE,oBAGF,eACE,uBACA,mBAGF,gBACE,cAGF,wBACE,eAGF,yBACE,gBAGF,sBACE,iBAGF,uBACE,YErOF,mBACE,CAKA,kBAHE,eAGF,CALA,yJAMA,gCAMA,UACA,CAKA,kCAGA,mCAZF,uCAGE,CACA,iBACA,CACA,mBACA,CAFA,eACA,CAEA,aACA,CAFA,mBAMA,aAGF,WACE,WACA,YAGF,WACE,WACA,aAGF,WACE,WACA,cAGF,WACE,WACA,aAGF,WACE,WACA,iBAGF,WACE,WACA,qBAGF,WACE,sBAGF,WACE,kBAGF,WACE,mBAGF,WACE,mBAKA,uBAFF,WACE,qBAEA,kBAGF,WACE,oBAGF,WACE,sBAGF,WACE,sBAGF,WACE,mBAGF,WACE,qBAGF,WACE,0BAGF,WACE,oBAGF,WACE,qBAGF,WACE,kBAGF,WACE,sBAGF,WACE,kBAGF,WACE,kBAGF,WACE,oBAGF,WACE,wBAGF,WACE,uBAGF,WACE,qBACA,wBACA,uBAGF,WACE,qBACA,yBACA,oCAGF,WACE,qBACA,qBAGF,WACE,qBACA,yBACA,sBAGF,WACE,wBAGF,WACE,oBAGF,WACE,kBAGF,WACE,oBAGF,WACE,kBAGF,WACE,sBAGF,WACE,mBAGF,WACE,uBAGF,WACE,sBAGF,WACE,kBAGF,WACE,oBAGF,WACE,mBAGF,WACE,yBAGF,WACE,mBAGF,WACE,QCvNF,4BACE,yCACA,kBACA,CAIA,uBACA,CAFA,cACA,CAHA,sBACA,iBACA,CAEA,kBACA,qBANA,YASE,cAKA,qCADA,0CACA,CAFF,oBAGE,cAIA,gBADF,oBAEE,cAIA,kBADF,kBAEE,gBAGF,sCACE,6CACA,sBAEA,4CACE,kDACA,eAIJ,+BACE,yBACA,qBAEA,mCACE,oCACA,gBAIJ,gCACE,0BACA,sBAEA,oCACE,oCACA,WAIJ,iCACE,0BACA,iBAEA,uCACE,OAOJ,wBACA,CAFF,uBACE,CACA,UACA,4BAEA,gCACE,uGAME,cAEE,gBACA,mBAMN,aAEE,6EAEA,gBACE,yCAGF,OACE,wBAKF,2CACE,2BAEA,wCACE,2CAMJ,oCAEE,oBAKF,SACE,mCAKF,cAEE,0BAKF,mCACE,kCAKF,oCACE,GAKN,uBACE,SAEA,6BACE,yBZ/FA,sBYoGF,UACE,0BAIJ,aAGE,CACA,gBACA,CACA,iBAHA,gBACA,CACA,iBAEA,+BAEA,eACE,4BAGF,WACE,4BAIA,eADF,eAEE,4BAGF,cACE,uDAGF,eAEE,mBAIJ,cACE,kCAGF,yCACE,eACA,0CAEA,4CACE,QAIJ,mBACE,oBACA,mEAKF,uBAEE,SACA,oBAIF,yBACE,wBAGF,UACE,eAIF,eACE,SAGF,mBACE,aAGF,iBACE,UAUA,kCACA,sCAFA,iBACA,CAFA,cACA,CALA,aACA,CAEA,eACA,CAFA,eACA,CAJF,iBACE,CACA,YFjNA,eE8NA,kBADA,WACA,CAFF,UAGE,kBAEA,sCACE,mBAGF,qBACE,cAIJ,yCACE,eAGF,0CACE,olBF/OA,+BEmQE,CAJA,oCF/PF,CE8PA,iBACE,CAIA,gEACA,gBAIJ,iBACE,MACA,qBAEA,MACE,sBAGF,OACE,MCtTJ,WACE,MAWA,+BACA,CAPA,QACA,CAMA,wBAJA,YACA,sBACA,2BACA,CALA,MACA,CAJF,cACE,CAGA,OACA,CAJA,KASA,eAQA,kBACA,CACA,mCAJA,YACA,CAHA,WACA,CAEA,6BACA,CAHA,eACA,CAHF,UACE,CAKA,WAEA,wJAEA,oBAME,kCAGF,8BACE,SAIJ,kCACE,CACA,oCACA,sBAFA,cAGA,UAGF,YACE,YACA,aACA,kBACA,mCAIA,iCAEE,qBACA,2DAKF,mBAEE,WAIJ,iCACE,eAEA,iCACE,oBAMF,kBADA,UACA,CAFF,SAGE,yBAEA,sCACE,wBAGF,qCjBtFO,yBiB0FP,oCACE,MAIJ,UACE,mBAGF,sBACE,cAGF,sBACE,iBAGF,qCACE,uBAEA,WACE,WACA,eAIJ,sCACE,qBAEA,WACE,aACA,mEAQA,oCADA,WACA,CAHF,UAIE,+EAEA,WACE,WACA,yFAGF,WACE,WACA,6EAIJ,wCAEE,qCAGF,gBACE,gBASF,gCLlKU,CKgKV,cACA,CLjKU,eKoKV,CALA,SACA,CACA,aACA,CALF,iBACE,MACA,CAKA,SACA,qBAEA,2BACE,oBAGF,0BjBvKO,qBiB2KP,yBACE,iBAIJ,oBACA,kBACA,SACA,aACA,sBACA,gBACA,eACA,UACA,aACA,sBAQI,sCACA,+BACA,CANA,oBACA,CAHF,aACE,CAQA,eARA,cACA,CACA,eACA,CAIA,gBACA,CALA,sBACA,mBAKA,iCAGF,iBACE,aAIJ,uBACE,iBAGF,cACE,CACA,iBADA,iBAEA,qBAIE,wBAFF,UACE,WAEA,sBAQF,mBACA,mCACA,qCH/LA,CG2LA,YACA,sBACA,CAOA,eACA,gBAFA,eACA,CAXF,cAEE,CH3LA,WGsMA,kCAEA,iBACE,WACA,QACA,sCHnMF,mCGsMA,2CAGE,8CAGE,eADF,UAEE,4DAEA,SACE,0EAKN,sBACE,UAIJ,WACE,6BAEA,mCACE,oCAGF,2CHjOA,aGsOF,eACE,SAGF,6CACE,kBAIA,QACA,OACA,CAHF,iBACE,CAEA,UACA,sBAEA,+BACE,qCACA,yBbxOA,Qa6OF,YACE,0Bb9OA,mBamPF,UAEE,QCnTF,eADF,oBAEE,oGAaA,qCACA,CAHA,yCACA,kBACA,CACA,wBAXF,aAME,CACA,sBACA,CAFA,UAMA,wIAEA,2CACE,aACA,wLAGF,+BACE,8LAGF,kCACE,kIAGF,UACE,wIAGF,cACE,iBACA,WACA,sKAEA,UACE,sKAGF,UACE,QAKN,+CACE,cAIA,qCACA,0CACA,mBAHF,uBAIE,oBAEA,2CACE,iDAKF,SACE,2BAGF,aACE,4BAGF,aACE,iBAIJ,WACE,+BAIE,iBACA,YAFA,iBACA,CAFF,UAIE,qCAEA,SACE,gCAIJ,oBACE,gBACA,kCAGF,UACE,iCAGF,2BACE,uBAGF,aACE,gBAIJ,WACE,0DAKI,6CADA,cACA,CAFF,SAGE,gEAIA,eADF,UAEE,sEAEA,SACE,0BAUJ,uCAFA,wBACA,kBACA,CALF,oBACE,eACA,kBAIA,gCAGF,wBACE,iBAGF,GACE,4CACE,YACA,IAGF,yCACE,UACA,oBAKN,gBACE,QAaA,yBACA,CAFA,gCACA,CALA,QACA,OACA,CACA,cACA,CATF,cAIE,CAGA,OACA,CAJA,KACA,CAMA,WACA,aAEA,sBAGE,YACA,CACA,oBADA,iBAEA,iBAEA,mBACE,iEAEA,cAKE,CACA,eACA,CAFA,aACA,CACA,cACA,kBACA,CACA,OACA,CAFA,KACA,CACA,SACA,2EAEA,UACE,uFAEA,SACE,oBAUN,2CACA,kBAFA,aACA,CAJF,YAME,gGAQL,eACC,WACA,oBAKA,UACE,wBAGF,uBACE,8BAUA,qBACA,CACA,iBACA,gBARF,cAGE,CAGA,kBACA,CAJA,aACA,WAKA,0EAEA,oCAEE,8EAKN,WAIE,sFAGF,WAKE,YAGF,WACE,0GAGF,WAOE,sHAGF,WAOE,6BAGF,aACE,qBACA,qBAIA,gBACE,kBACA,cAKF,cACA,CAFF,eACE,CACA,gBACA,mCAIE,oCACA,CAFA,YACA,CAEA,iBADA,iBACA,CAJF,UAKE,wDAOE,QACA,CAHA,YACA,CAGA,iBALF,iBACE,CACA,aACA,CACA,KAEA,4EAME,iCACA,CAFA,kBACA,CAGA,eANA,aACA,CAGA,iBACA,CAJA,SACA,CAGA,8BACA,CAPF,YAQE,yCAMJ,cACE,8DAEA,WACE,aACA,kFAGE,aADF,WAEE,8BAOV,wBAEE,kBACA,CACA,eADA,WAEA,wDAEA,UACE,oGAEA,cACE,kJAEA,oCACE,0DAQJ,wBACA,CAFA,mBACA,CAEA,eAJA,WACA,CAEA,cACA,CALF,UAME,8DAIA,cACA,aAFF,UAGE,0EAGF,cACE,0FAIE,qBACA,CAFA,UACA,CAFF,oBACE,CAEA,iBACA,wHAOE,wBACA,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","sources":["webpack://bisonw/./node_modules/bootstrap/scss/_root.scss","webpack://bisonw/./node_modules/bootstrap/scss/vendor/_rfs.scss","webpack://bisonw/./node_modules/bootstrap/scss/_reboot.scss","webpack://bisonw/./node_modules/bootstrap/scss/_variables.scss","webpack://bisonw/./src/css/variables.scss","webpack://bisonw/./node_modules/bootstrap/scss/mixins/_border-radius.scss","webpack://bisonw/./node_modules/bootstrap/scss/_grid.scss","webpack://bisonw/./node_modules/bootstrap/scss/mixins/_grid.scss","webpack://bisonw/./node_modules/bootstrap/scss/mixins/_breakpoints.scss","webpack://bisonw/./node_modules/bootstrap/scss/forms/_form-select.scss","webpack://bisonw/./node_modules/bootstrap/scss/mixins/_transition.scss","webpack://bisonw/./node_modules/bootstrap/scss/forms/_form-check.scss","webpack://bisonw/./node_modules/bootstrap/scss/mixins/_utilities.scss","webpack://bisonw/./node_modules/bootstrap/scss/utilities/_api.scss","webpack://bisonw/./src/css/application.scss","webpack://bisonw/./src/css/colors.scss","webpack://bisonw/./src/css/typography.scss","webpack://bisonw/./src/css/utilities.scss","webpack://bisonw/./src/css/mixins.scss","webpack://bisonw/./src/css/icons.scss","webpack://bisonw/./src/css/components.scss","webpack://bisonw/./src/css/main.scss","webpack://bisonw/./src/css/forms.scss","webpack://bisonw/./src/css/market.scss","webpack://bisonw/./src/css/wallets.scss","webpack://bisonw/./src/css/orders.scss","webpack://bisonw/./src/css/order.scss","webpack://bisonw/./src/css/settings.scss","webpack://bisonw/./src/css/mm.scss"],"sourcesContent":[":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{$font-family-base};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n --#{$prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n --#{$prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-2xl: #{$border-radius-2xl};\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-hover-color: #{$link-hover-color};\n\n --#{$prefix}code-color: #{$code-color};\n\n --#{$prefix}highlight-bg: #{$mark-bg};\n}\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + ' ' + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n }\n @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + ' ' + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + ' ' + $value;\n }\n\n @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluidVal: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluidVal {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule {\n #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: var(--#{$prefix}link-color);\n text-decoration: $link-decoration;\n\n &:hover {\n color: var(--#{$prefix}link-hover-color);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `<td>` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`<button>` buttons\n//\n// Details at https://github.com/twbs/bootstrap/pull/30562\n[role=\"button\"] {\n cursor: pointer;\n}\n\nselect {\n // Remove the inheritance of word-wrap in Safari.\n // See https://github.com/twbs/bootstrap/issues/24990\n word-wrap: normal;\n\n // Undo the opacity change from Chrome\n &:disabled {\n opacity: 1;\n }\n}\n\n// Remove the dropdown arrow only from text type inputs built with datalists in Chrome.\n// See https://stackoverflow.com/a/54997118\n\n[list]:not([type=\"date\"]):not([type=\"datetime-local\"]):not([type=\"month\"]):not([type=\"week\"]):not([type=\"time\"])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\n// 3. Opinionated: add \"hand\" cursor to non-disabled button elements.\n\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n\n @if $enable-button-pointers {\n &:not(:disabled) {\n cursor: pointer; // 3\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\n// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.\n\ntextarea {\n resize: vertical; // 1\n}\n\n// 1. Browsers set a default `min-width: min-content;` on fieldsets,\n// unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n// So we reset that to ensure fieldsets behave more like a standard block element.\n// See https://github.com/twbs/bootstrap/issues/12359\n// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n// 2. Reset the default outline behavior of fieldsets so they don't affect page layout.\n\nfieldset {\n min-width: 0; // 1\n padding: 0; // 2\n margin: 0; // 2\n border: 0; // 2\n}\n\n// 1. By using `float: left`, the legend will behave like a block element.\n// This way the border of a fieldset wraps around the legend if present.\n// 2. Fix wrapping bug.\n// See https://github.com/twbs/bootstrap/issues/29712\n\nlegend {\n float: left; // 1\n width: 100%;\n padding: 0;\n margin-bottom: $legend-margin-bottom;\n @include font-size($legend-font-size);\n font-weight: $legend-font-weight;\n line-height: inherit;\n\n + * {\n clear: left; // 2\n }\n}\n\n// Fix height of inputs with a type of datetime-local, date, month, week, or time\n// See https://github.com/twbs/bootstrap/issues/18842\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n// 1. Correct the outline style in Safari.\n// 2. This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\n[type=\"search\"] {\n outline-offset: -2px; // 1\n -webkit-appearance: textfield; // 2\n}\n\n// 1. A few input types should stay LTR\n// See https://rtlstyling.com/posts/rtl-styling#form-inputs\n// 2. RTL only output\n// See https://rtlcss.com/learn/usage-guide/control-directives/#raw\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n\n// Remove the inner padding in Chrome and Safari on macOS.\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n// Remove padding around color pickers in webkit browsers\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n\n// 1. Inherit font family and line height for file input buttons\n// 2. Correct the inability to style clickable types in iOS and Safari.\n\n::file-selector-button {\n font: inherit; // 1\n -webkit-appearance: button; // 2\n}\n\n// Correct element displays\n\noutput {\n display: inline-block;\n}\n\n// Remove border from iframe\n\niframe {\n border: 0;\n}\n\n// Summary\n//\n// 1. Add the correct display in all browsers\n\nsummary {\n display: list-item; // 1\n cursor: pointer;\n}\n\n\n// Progress\n//\n// Add the correct vertical alignment in Chrome, Firefox, and Opera.\n\nprogress {\n vertical-align: baseline;\n}\n\n\n// Hidden attribute\n//\n// Always hide an element with the `hidden` HTML attribute.\n\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n$body-text-align: null !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-2xl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n$text-muted: $gray-600 !default;\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: $border-width !default;\n$hr-opacity: .25 !default;\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}body-color) !default;\n$table-bg: transparent !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba($black, $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba($black, $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba($black, $table-hover-bg-factor) !default;\n\n$table-border-factor: .1 !default;\n$table-border-width: $border-width !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .25rem !default;\n$input-btn-focus-color-opacity: .25 !default;\n$input-btn-focus-color: rgba($component-active-bg, $input-btn-focus-color-opacity) !default;\n$input-btn-focus-blur: 0 !default;\n$input-btn-focus-box-shadow: 0 0 $input-btn-focus-blur $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: $border-width !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: $text-muted !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: $body-bg !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: $gray-200 !default;\n$input-disabled-border-color: null !default;\n\n$input-color: $body-color !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: $box-shadow-inset !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-sm: $border-radius-sm !default;\n$input-border-radius-lg: $border-radius-lg !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: 1px solid rgba($black, .25) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$form-check-input-checked-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/></svg>\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='2' fill='#{$form-check-input-checked-color}'/></svg>\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$form-check-input-indeterminate-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/></svg>\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-color}'/></svg>\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-focus-color}'/></svg>\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-checked-color}'/></svg>\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $gray-200 !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='#{$form-select-indicator-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/></svg>\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: $box-shadow-inset !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: $gray-300 !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: $box-shadow-inset !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: $gray-500 !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: $input-group-addon-bg !default;\n$form-file-button-hover-bg: shade-color($form-file-button-bg, 5%) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/></svg>\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='#{$form-feedback-icon-invalid-color}'><circle cx='6' cy='6' r='4.5'/><path stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/><circle cx='6' cy='8.2' r='.6' fill='#{$form-feedback-icon-invalid-color}' stroke='none'/></svg>\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba($black, .55) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke='#{$navbar-light-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke='#{$navbar-dark-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default;\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: $box-shadow !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: shade-color($dropdown-link-color, 10%) !default;\n$dropdown-link-hover-bg: $gray-200 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-500 !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: $white !default;\n$pagination-border-radius: $border-radius !default;\n$pagination-border-width: $border-width !default;\n$pagination-margin-start: ($pagination-border-width * -1) !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: $gray-200 !default;\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: $border-radius-sm !default;\n$pagination-border-radius-lg: $border-radius-lg !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-border-width: $border-width !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: $border-radius !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: $body-color !default; // Sass variable because of $accordion-button-icon\n$accordion-bg: $body-bg !default;\n$accordion-border-width: $border-width !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: $border-radius !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: $accordion-color !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: tint-color($component-active-bg, 90%) !default;\n$accordion-button-active-color: shade-color($primary, 10%) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $accordion-button-color !default;\n$accordion-icon-active-color: $accordion-button-active-color !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$accordion-icon-color}'><path fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/></svg>\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$accordion-icon-active-color}'><path fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/></svg>\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default;\n$popover-box-shadow: $box-shadow !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: shade-color($popover-bg, 6%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: $border-width !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: $border-radius !default;\n$toast-box-shadow: $box-shadow !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba($black, .05) !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: $border-radius !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: $box-shadow-sm !default;\n$modal-content-box-shadow-sm-up: $box-shadow !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n$alert-bg-scale: -80% !default;\n$alert-border-scale: -70% !default;\n$alert-color-scale: 40% !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: $box-shadow-inset !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: $gray-900 !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n$list-group-item-bg-scale: -80% !default;\n$list-group-item-color-scale: 40% !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: $box-shadow-sm !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: $gray-600 !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$carousel-control-color}'><path d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/></svg>\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$carousel-control-color}'><path d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/></svg>\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$btn-close-color}'><path d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/></svg>\") !default;\n$btn-close-focus-shadow: $input-btn-focus-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: $modal-content-bg !default;\n$offcanvas-color: $modal-content-color !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n","\n// Main colors\n$primary: #0a4972;\n$secondary: #6c757d;\n$success: #0b5831;\n$danger: #d22e;\n$green: #0b5831;\n\n// Link colors\n$link-decoration: none;\n$link-hover-decoration: underline;\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1750px,\n xxxl: 2150px\n);\n\n// Grid columns\n// Set the number of columns and specify the width of the gutters.\n$grid-columns: 24;\n\n// Typography\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: \"source-sans\", \"sans-serif\";\n$font-family-monospace: \"mono\", \"monospace\";\n// stylelint-enable value-keyword-case\n\n@import \"~bootstrap/scss/variables\";\n\n$enable-dark-mode: false;\n// $enable-important-utilities: false;\n","// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n// scss-docs-end border-radius-mixins\n","// Row\n//\n// Rows contain your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: divide(100%, $count);\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// https://primer.github.io/.\n\n.form-select {\n display: block;\n width: 100%;\n padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;\n -moz-padding-start: subtract($form-select-padding-x, 3px); // See https://github.com/twbs/bootstrap/issues/32636\n font-family: $form-select-font-family;\n @include font-size($form-select-font-size);\n font-weight: $form-select-font-weight;\n line-height: $form-select-line-height;\n color: $form-select-color;\n background-color: $form-select-bg;\n background-image: escape-svg($form-select-indicator);\n background-repeat: no-repeat;\n background-position: $form-select-bg-position;\n background-size: $form-select-bg-size;\n border: $form-select-border-width solid $form-select-border-color;\n @include border-radius($form-select-border-radius, 0);\n @include box-shadow($form-select-box-shadow);\n @include transition($form-select-transition);\n appearance: none;\n\n &:focus {\n border-color: $form-select-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n @include box-shadow($form-select-box-shadow, $form-select-focus-box-shadow);\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: $form-select-focus-box-shadow;\n }\n }\n\n &[multiple],\n &[size]:not([size=\"1\"]) {\n padding-right: $form-select-padding-x;\n background-image: none;\n }\n\n &:disabled {\n color: $form-select-disabled-color;\n background-color: $form-select-disabled-bg;\n border-color: $form-select-disabled-border-color;\n }\n\n // Remove outline from select box in FF\n &:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 $form-select-color;\n }\n}\n\n.form-select-sm {\n padding-top: $form-select-padding-y-sm;\n padding-bottom: $form-select-padding-y-sm;\n padding-left: $form-select-padding-x-sm;\n @include font-size($form-select-font-size-sm);\n @include border-radius($form-select-border-radius-sm);\n}\n\n.form-select-lg {\n padding-top: $form-select-padding-y-lg;\n padding-bottom: $form-select-padding-y-lg;\n padding-left: $form-select-padding-x-lg;\n @include font-size($form-select-font-size-lg);\n @include border-radius($form-select-border-radius-lg);\n}\n","// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $transition: $transition-base;\n }\n\n @if length($transition) > 1 {\n @each $value in $transition {\n @if $value == null or $value == none {\n @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n }\n }\n }\n\n @if $enable-transitions {\n @if nth($transition, 1) != null {\n transition: $transition;\n }\n\n @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n }\n}\n","//\n// Check/radio\n//\n\n.form-check {\n display: block;\n min-height: $form-check-min-height;\n padding-left: $form-check-padding-start;\n margin-bottom: $form-check-margin-bottom;\n\n .form-check-input {\n float: left;\n margin-left: $form-check-padding-start * -1;\n }\n}\n\n.form-check-reverse {\n padding-right: $form-check-padding-start;\n padding-left: 0;\n text-align: right;\n\n .form-check-input {\n float: right;\n margin-right: $form-check-padding-start * -1;\n margin-left: 0;\n }\n}\n\n.form-check-input {\n width: $form-check-input-width;\n height: $form-check-input-width;\n margin-top: ($line-height-base - $form-check-input-width) * .5; // line-height minus check height\n vertical-align: top;\n background-color: $form-check-input-bg;\n background-repeat: no-repeat;\n background-position: center;\n background-size: contain;\n border: $form-check-input-border;\n appearance: none;\n print-color-adjust: exact; // Keep themed appearance for print\n @include transition($form-check-transition);\n\n &[type=\"checkbox\"] {\n @include border-radius($form-check-input-border-radius);\n }\n\n &[type=\"radio\"] {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: $form-check-radio-border-radius;\n }\n\n &:active {\n filter: $form-check-input-active-filter;\n }\n\n &:focus {\n border-color: $form-check-input-focus-border;\n outline: 0;\n box-shadow: $form-check-input-focus-box-shadow;\n }\n\n &:checked {\n background-color: $form-check-input-checked-bg-color;\n border-color: $form-check-input-checked-border-color;\n\n &[type=\"checkbox\"] {\n @if $enable-gradients {\n background-image: escape-svg($form-check-input-checked-bg-image), var(--#{$prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-input-checked-bg-image);\n }\n }\n\n &[type=\"radio\"] {\n @if $enable-gradients {\n background-image: escape-svg($form-check-radio-checked-bg-image), var(--#{$prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-radio-checked-bg-image);\n }\n }\n }\n\n &[type=\"checkbox\"]:indeterminate {\n background-color: $form-check-input-indeterminate-bg-color;\n border-color: $form-check-input-indeterminate-border-color;\n\n @if $enable-gradients {\n background-image: escape-svg($form-check-input-indeterminate-bg-image), var(--#{$prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-input-indeterminate-bg-image);\n }\n }\n\n &:disabled {\n pointer-events: none;\n filter: none;\n opacity: $form-check-input-disabled-opacity;\n }\n\n // Use disabled attribute in addition of :disabled pseudo-class\n // See: https://github.com/twbs/bootstrap/issues/28247\n &[disabled],\n &:disabled {\n ~ .form-check-label {\n cursor: default;\n opacity: $form-check-label-disabled-opacity;\n }\n }\n}\n\n.form-check-label {\n color: $form-check-label-color;\n cursor: $form-check-label-cursor;\n}\n\n//\n// Switch\n//\n\n.form-switch {\n padding-left: $form-switch-padding-start;\n\n .form-check-input {\n width: $form-switch-width;\n margin-left: $form-switch-padding-start * -1;\n background-image: escape-svg($form-switch-bg-image);\n background-position: left center;\n @include border-radius($form-switch-border-radius);\n @include transition($form-switch-transition);\n\n &:focus {\n background-image: escape-svg($form-switch-focus-bg-image);\n }\n\n &:checked {\n background-position: $form-switch-checked-bg-position;\n\n @if $enable-gradients {\n background-image: escape-svg($form-switch-checked-bg-image), var(--#{$prefix}gradient);\n } @else {\n background-image: escape-svg($form-switch-checked-bg-image);\n }\n }\n }\n\n &.form-check-reverse {\n padding-right: $form-switch-padding-start;\n padding-left: 0;\n\n .form-check-input {\n margin-right: $form-switch-padding-start * -1;\n margin-left: 0;\n }\n }\n}\n\n.form-check-inline {\n display: inline-block;\n margin-right: $form-check-inline-margin-end;\n}\n\n.btn-check {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n\n &[disabled],\n &:disabled {\n + .btn {\n pointer-events: none;\n filter: none;\n opacity: $form-check-btn-check-disabled-opacity;\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix, $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n","body:not(.dark){--body-bg: #fafafa;--body-bg-lower-opacity: #fafafa88;--section-bg: #f6f6f6;--form-bg: #f0f0f0;--tertiary-bg: #7772;--text-color: #333;--text-color-secondary: #4a4949;--text-danger: #d22;--text-warning: #f82e;--text-grey: #777;--border-color: #ddd;--hint-color: #4397cd;--link-color: #2a71d5;--link-color-hover: #144487;--subtle-link-color: #05053b;--subtle-link-hover: #07075e;--popup-notes-bg: black;--popup-notes-color: #dfe2e1;--btn-feature-bg: #6bc5ff;--btn-feature-hover-bg: #a3dbff;--btn-feature-border-color: #759cb5;--btn-featur-hover-border-color: #9bc3dd;--btn-danger-hover-color: white;--btn-border-color: #ddd;--btn-hover-border-color: #ddd;--btn-go-bg: #0b5831;--btn-go-hover-bg: #0b5831;--btn-go-color: #fff;--forms-bg: #fafafa99;--form-input-bg: #fff;--form-input-border: #999;--form-input-border-focus: #555;--form-input-bg-active: #3095db;--form-opt-selected-bg: #0001;--form-selected-tab-bg: white;--indicator-good: #179717;--buy-color: #207a46;--sell-color: #99302b;--market-buygreen-bg: #207a4699;--market-sellred-bg: #99302b99;--market-sell-color: #99302b;--market-btn-color: #555;--market-btn-selected-color: black;--market-markettab-selected-bg: #7773;--market-orderopt-bg: #fff1;--market-numorders-bg: #c5c5e6;--loader-bg: #e0e0e077;--dex-url: url(\"/img/softened-icon.png\")}body.dark{--body-bg: #040b14;--body-bg-lower-opacity: #040b1488;--section-bg: #071627;--form-bg: #0a1e34;--tertiary-bg: #78787822;--text-color: #dfe2e1;--text-color-secondary: #a1a1a1;--text-danger: #ec6a6a;--text-warning: #f82e;--text-grey: #999;--border-color: #383f4b;--hint-color: #64b2e5;--link-color: #388bff;--link-color-hover: #5e9ffa;--subtle-link-color: #e6e6ff;--subtle-link-hover: #d1d1ff;--popup-notes-bg: white;--popup-notes-color: #333;--btn-border-color: #7777;--btn-hover-border-color: #777;--btn-feature-bg: #0a4972;--btn-feature-hover-bg: #176699;--btn-feature-border-color: #1e618d;--btn-featur-hover-border-color: #85a5ba;--btn-danger-hover-color: white;--btn-go-bg: #0b5831;--btn-go-hover-bg: #0b5831;--btn-go-color: #fff;--forms-bg: #05141f99;--form-input-bg: #0009;--form-input-border: #555;--form-input-border-focus: #4271ce;--form-input-bg-active: #27278d;--form-opt-selected-bg: #fff1;--form-selected-tab-bg: #39447c;--indicator-good: #29bb77;--buy-color: #29bb77;--sell-color: #e95e5e;--market-buygreen-bg: #29bb7799;--market-sellred-bg: #e95e5e99;--market-sell-color: #e95e5e;--market-btn-color: #aaa;--market-btn-selected-color: #eee;--market-markettab-selected-bg: #fff1;--market-orderopt-bg: #0001;--market-numorders-bg: #141488;--loader-bg: #13202b77;--dex-url: url(\"/img/softened-icon-dark.png\")}.greyscale{filter:grayscale(1)}.blurry-bg{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.body-bg{background-color:var(--body-bg)}.section-bg{background-color:var(--section-bg)}.text-good{color:var(--indicator-good)}@font-face{font-family:\"source-sans\";src:url(\"/font/source-sans-pro-v9-latin-regular.woff\") format(\"woff\"),url(\"/font/source-sans-pro-v9-latin-regular.svg\") format(\"svg\");font-weight:normal;font-style:normal}@font-face{font-family:\"demi-sans\";src:url(\"/font/source-sans-pro-semibold.woff\") format(\"woff\"),url(\"/font/source-sans-pro-semibold.svg\") format(\"svg\");font-weight:bolder;font-style:normal}@font-face{font-family:\"mono\";src:url(\"/font/inconsolata-v15-latin-regular.woff\") format(\"woff\"),url(\"/font/inconsolata-v15-latin-regular.svg\") format(\"svg\");font-weight:normal;font-style:normal}.fs8{font-size:8px}.fs10{font-size:10px}.fs11{font-size:11px}.fs12{font-size:12px}.fs13{font-size:13px}.fs14{font-size:14px}.fs15{font-size:15px}.fs16{font-size:16px}.fs17{font-size:17px}.fs18{font-size:18px}.fs20{font-size:20px}.fs22{font-size:22px}.fs24{font-size:24px}.fs26{font-size:24px}.fs28{font-size:28px}.fs32{font-size:32px}.fs35{font-size:35px}.fs50{font-size:50px}.demi{font-family:\"demi-sans\",sans-serif}.mono{font-family:\"mono\",monospace}.sans{font-family:\"source-sans\",sans-serif}.bold{font-weight:bold}.flex-grow-1{flex-grow:1}.flex-center,div[data-handler=markets] #epochLine,div[data-handler=markets] .user-order .user-order-header,div[data-handler=markets] .market-chart,#dexAddrForm .known-exchange,#forms>form header,#forms>form>div.form-closer-unbound,#forms>form>div.form-closer,#forms{display:flex;justify-content:center;align-items:center}.flex-stretch-column,#forms>form{display:flex;flex-direction:column;align-items:stretch}.flex-wrap{flex-wrap:wrap}.text-nowrap{white-space:nowrap}.position-relative{position:relative}.position-absolute{position:absolute}.hoverbg:hover,div[data-handler=mmsettings] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mmarchives] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mmlogs] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mm] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mmsettings] .bot-type-selector:hover:not(.disabled),div[data-handler=mmarchives] .bot-type-selector:hover:not(.disabled),div[data-handler=mmlogs] .bot-type-selector:hover:not(.disabled),div[data-handler=mm] .bot-type-selector:hover:not(.disabled),#forms>form>div.form-closer-unbound:hover,#forms>form>div.form-closer:hover{background-color:var(--tertiary-bg)}.invisible{visibility:hidden}.stylish-overflow,#recentMatchesBox,#forms,table.reg-asset-markets,.vscroll{overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(119,119,119,.2666666667) rgba(119,119,119,.0666666667)}.stylish-overflow::-webkit-scrollbar,#recentMatchesBox::-webkit-scrollbar,#forms::-webkit-scrollbar,table.reg-asset-markets::-webkit-scrollbar,.vscroll::-webkit-scrollbar{width:8px;height:8px}.stylish-overflow::-webkit-scrollbar-track,#recentMatchesBox::-webkit-scrollbar-track,#forms::-webkit-scrollbar-track,table.reg-asset-markets::-webkit-scrollbar-track,.vscroll::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}.stylish-overflow::-webkit-scrollbar-thumb,#recentMatchesBox::-webkit-scrollbar-thumb,#forms::-webkit-scrollbar-thumb,table.reg-asset-markets::-webkit-scrollbar-thumb,.vscroll::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}.stylish-overflow.hoveronly:not(:hover),.hoveronly#recentMatchesBox:not(:hover),.hoveronly#forms:not(:hover),table.hoveronly.reg-asset-markets:not(:hover),.hoveronly.vscroll:not(:hover){scrollbar-color:rgba(0,0,0,0) rgba(0,0,0,0)}.stylish-overflow.hoveronly:not(:hover)::-webkit-scrollbar-track,.hoveronly#recentMatchesBox:not(:hover)::-webkit-scrollbar-track,.hoveronly#forms:not(:hover)::-webkit-scrollbar-track,table.hoveronly.reg-asset-markets:not(:hover)::-webkit-scrollbar-track,.hoveronly.vscroll:not(:hover)::-webkit-scrollbar-track{background-color:rgba(0,0,0,0)}.stylish-overflow.hoveronly:not(:hover)::-webkit-scrollbar-thumb,.hoveronly#recentMatchesBox:not(:hover)::-webkit-scrollbar-thumb,.hoveronly#forms:not(:hover)::-webkit-scrollbar-thumb,table.hoveronly.reg-asset-markets:not(:hover)::-webkit-scrollbar-thumb,.hoveronly.vscroll:not(:hover)::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0);border-radius:4px}.stylish-overflow.overflow-x-hidden,.overflow-x-hidden#recentMatchesBox,.overflow-x-hidden#forms,table.overflow-x-hidden.reg-asset-markets,.overflow-x-hidden.vscroll{overflow-x:hidden}.hidden-overflow{overflow:auto;scrollbar-width:none}.hidden-overflow::-webkit-scrollbar{display:none}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.ease-color{transition:color 1s ease}.mw-375{max-width:375px}.mw-425{max-width:425px}.max-h-100{max-height:100%}.d-hide{display:none !important}.buycolor{color:var(--buy-color)}.sellcolor{color:var(--sell-color)}.grey{color:var(--text-grey)}.rounded3,div[data-handler=mmsettings] .bot-type-selector,div[data-handler=mmarchives] .bot-type-selector,div[data-handler=mmlogs] .bot-type-selector,div[data-handler=mm] .bot-type-selector{border-radius:3px}hr.dashed{border-top:2px dashed var(--border-color)}img.token-parent{width:.7em;height:.7em;position:relative;top:-0.4em}sup.token-parent{font-size:.6em;position:relative;top:-0.6em}.preline{white-space:pre-line}.vscroll{max-width:100%;overflow-x:hidden}.pointer{cursor:pointer !important}.underline{text-decoration:underline}.plainlink{color:inherit}.ico-info{margin-left:.25rem}.subtlelink,.subtlelink:visited{text-decoration:none}.subtlelink:hover,.subtlelink:visited:hover{text-decoration:underline !important;cursor:pointer}.word-break-all{word-break:break-all;user-select:all}.lh1{line-height:1}.fill-abs,div[data-handler=mmsettings] #placementsChart canvas,div[data-handler=mmsettings] [data-tmpl=placementsChart] canvas,div[data-handler=mmarchives] #placementsChart canvas,div[data-handler=mmarchives] [data-tmpl=placementsChart] canvas,div[data-handler=mmlogs] #placementsChart canvas,div[data-handler=mmlogs] [data-tmpl=placementsChart] canvas,div[data-handler=mm] #placementsChart canvas,div[data-handler=mm] [data-tmpl=placementsChart] canvas,div[data-handler=markets] #leftMarketDock #marketSearchV1{position:absolute;top:0;bottom:0;left:0;right:0}.min-fit{min-height:fit-content}div.clear{opacity:0}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.overflow-x-hidden,.stylish-overflow.overflow-x-hidden,.overflow-x-hidden#recentMatchesBox,.overflow-x-hidden#forms,table.overflow-x-hidden.reg-asset-markets{overflow-x:hidden}.user-select-all{user-select:all}.overflow-ellipsis{overflow:hidden;text-overflow:ellipsis}.user-select-none{user-select:none}.text-danger{color:var(--text-danger)}.text-warning{color:var(--text-warning)}.text-buycolor{color:var(--buy-color)}.text-sellcolor{color:var(--sell-color)}@font-face{font-family:\"icomoon\";src:url(\"/font/icomoon.ttf?u8i98qq\") format(\"truetype\"),url(\"/font/icomoon.woff?u8i98qq\") format(\"woff\"),url(\"/font/icomoon.svg?u8i98qq#icomoon\") format(\"svg\");font-weight:normal;font-style:normal}[class^=ico-],[class*=\" ico-\"]{font-family:\"icomoon\",monospace !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.micro-icon{height:15px;width:15px}.mini-icon{height:20px;width:20px}.small-icon{height:25px;width:25px}.medium-icon{height:30px;width:30px}.large-icon{height:40px;width:40px}.enourmous-icon{height:50px;width:50px}.ico-spinner::before{content:\"\"}.ico-settings::before{content:\"\"}.ico-plus::before{content:\"\"}.ico-minus::before{content:\"\"}.ico-check::before{content:\"\";display:inline-block;color:var(--buy-color)}.ico-bell::before{content:\"\"}.ico-locked::before{content:\"\"}.ico-unlocked::before{content:\"\"}.ico-sleeping::before{content:\"\"}.ico-cross::before{content:\"\"}.ico-profile::before{content:\"\"}.ico-disconnected::before{content:\"\"}.ico-search::before{content:\"\"}.ico-expired::before{content:\"\"}.ico-info::before{content:\"\"}.ico-textfile::before{content:\"\"}.ico-open::before{content:\"\"}.ico-sync::before{content:\"\"}.ico-target::before{content:\"\"}.ico-arrowright::before{content:\"\"}.ico-arrowdown::before{content:\"\";display:inline-block;transform:rotate(90deg)}.ico-arrowleft::before{content:\"\";display:inline-block;transform:rotate(180deg)}.ico-wide-headed-left-arrow::before{content:\"\";display:inline-block}.ico-arrowup::before{content:\"\";display:inline-block;transform:rotate(-90deg)}.ico-checkbox::before{content:\"\"}.ico-connection::before{content:\"\"}.ico-rocket::before{content:\"\"}.ico-copy::before{content:\"\"}.ico-qrcode::before{content:\"\"}.ico-send::before{content:\"\"}.ico-exchange::before{content:\"\"}.ico-pause::before{content:\"\"}.ico-hamburger::before{content:\"\"}.ico-barchart::before{content:\"\"}.ico-edit::before{content:\"\"}.ico-ticket::before{content:\"\"}.ico-robot::before{content:\"\"}.ico-secretagent::before{content:\"\"}.ico-lever::before{content:\"\"}button{background-color:rgba(0,0,0,0);border:1px solid var(--btn-border-color);border-radius:5px;outline:none;padding:.375rem .75rem;user-select:none;font-size:1rem;color:var(--text-color);white-space:nowrap}button:focus{outline:none}button:hover{text-decoration:none;border-color:var(--btn-hover-border-color);background-color:rgba(119,119,119,.1333333333)}button.small{padding:.25rem .5rem;font-size:.9rem}button.large{padding:.5rem 1rem;font-size:1.25rem}button.feature{background-color:var(--btn-feature-bg);border-color:var(--btn-feature-border-color)}button.feature:hover{background-color:var(--btn-feature-hover-bg);border-color:var(--btn-featur-hover-border-color)}button.danger{border-color:var(--text-danger);color:var(--text-danger)}button.danger:hover{background-color:var(--text-danger);color:var(--btn-danger-hover-color)}button.warning{border-color:var(--text-warning);color:var(--text-warning)}button.warning:hover{background-color:var(--text-warning);color:var(--btn-danger-hover-color)}button.go{background-color:var(--btn-go-bg);color:var(--btn-go-color)}button.go:hover{background-color:var(--btn-go-hover-bg)}table{color:var(--text-color);border-collapse:collapse;width:100%}table .table-group-divider{border-color:var(--border-color)}table.px-0 th:last-child,table.px-0 th:first-child,table.px-0 td:last-child,table.px-0 td:first-child{padding-left:0;padding-right:0}table th,table td{padding:.5rem}table th:last-child:not(:first-child),table td:last-child:not(:first-child){text-align:right}table th.no-stretch,table td.no-stretch{width:0}table.row-border tbody{border-bottom:1px solid var(--border-color)}table.row-border tbody tr{border-top:1px solid var(--border-color)}table.cell-border th,table.cell-border td{border:1px solid var(--border-color)}table.nopadding td{padding:0}table.compact th,table.compact td{padding:.25rem}table.row-hover tr:hover{background-color:var(--tertiary-bg)}table.striped tr:nth-of-type(even){background-color:rgba(119,119,119,.1333333333)}a{color:var(--link-color)}a:hover{color:var(--link-color-hover)}@media(min-width: 768px){table#walletInfoTable{width:auto}}table.reg-asset-markets{display:block;max-height:120px;line-height:1.15;overflow-y:hidden;margin-right:8px}table.reg-asset-markets:hover{overflow-y:auto}table.reg-asset-markets tr{border:none}table.reg-asset-markets th{font-weight:normal;font-size:13px}table.reg-asset-markets td{font-size:14px}table.reg-asset-markets th,table.reg-asset-markets td{padding:1px 5px}.form-check-label{cursor:pointer}.form-check-input[type=checkbox]{border:1px solid var(--form-input-border);cursor:pointer}.form-check-input[type=checkbox]:checked{background-color:var(--form-input-bg-active)}select{font-family:inherit;padding:.75rem 1rem}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}form.card button:hover{color:#000}input:invalid{box-shadow:none}.dashed{border-style:dashed}.micro-icon{position:relative}#tooltip{position:absolute;left:-10000px;z-index:1000;padding:3px 6px;max-width:300px;font-size:15px;border-radius:4px;background-color:var(--section-bg);border:1px solid var(--border-color)}.on-indicator{width:15px;height:15px;border-radius:8px}.on-indicator.on{background-color:var(--indicator-good)}.on-indicator.off{background-color:#777}.border-left{border-left:1px solid var(--border-color)}.border-right{border-right:1px solid var(--border-color)}div[data-handler=dexsettings] #forms>form:not(.plain),div[data-handler=init] #forms>form:not(.plain),div[data-handler=login] #forms>form:not(.plain),div[data-handler=markets] #forms>form:not(.plain),div[data-handler=mm] #forms>form:not(.plain),div[data-handler=mmsettings] #forms>form:not(.plain),div[data-handler=order] #forms>form:not(.plain),div[data-handler=orders] #forms>form:not(.plain),div[data-handler=register] #forms>form:not(.plain),div[data-handler=settings] #forms>form:not(.plain),div[data-handler=mmlogs] #forms>form:not(.plain),div[data-handler=wallets] #forms>form:not(.plain){border-radius:5px;border:1px solid var(--border-color);background-color:var(--form-bg);box-shadow:0 3px 6px rgba(0,0,0,.1294117647),0 2px 7px rgba(0,0,0,.2549019608)}.corner-button{position:absolute;top:0}.corner-button.left{left:0}.corner-button.right{right:0}html{height:100%}body{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;flex-direction:column;justify-content:flex-start;background-color:var(--body-bg);color:var(--text-color)}header#header{width:100%;height:70px;min-height:70px;display:flex;justify-content:space-between;align-items:center;z-index:100;background-color:var(--section-bg)}header#header a,header#header a:visited,header#header a:hover,header#header .plainlink,header#header .plainlink:visited,header#header .plainlink:hover{text-decoration:none}header#header .hoverbright:hover{color:var(--subtle-link-hover)}section{background-color:var(--section-bg);margin:.5rem 0;border:1px solid var(--border-color);border-radius:.25rem}div.main{display:flex;flex-grow:1;min-height:0;position:relative}div.mainlinks>div,div.mainlinks>a{color:var(--text-color-secondary);padding:.5rem .75rem}@media(min-width: 768px){div.mainlinks>div,div.mainlinks>a{padding:.75rem 1rem}}.spinner{animation:spin 2s infinite linear}.spinner.fast{animation:spin 1s infinite linear}div.note-indicator{width:6px;height:6px;border-radius:3px}div.note-indicator.good{background-color:var(--indicator-good)}div.note-indicator.bad{background-color:rgba(221,34,34,.9333333333)}div.note-indicator.warn{background-color:var(--text-warning)}.z10{z-index:10}span.brand::before{content:\"Bison Wallet\"}img.dex-logo{content:var(--dex-url)}img.logo-square{content:url(\"/img/bison-square_50.png\")}img.logo-square.small{height:25px;width:25px}img.logo-full{content:url(\"/img/bison-full_97x50.png\")}img.logo-full.small{height:25px;width:48.5px}body.dex-branding img.logo-square,body.dex-branding img.logo-full{width:50px;height:50px;content:url(\"/img/softened-icon.png\")}body.dex-branding img.logo-square.small,body.dex-branding img.logo-full.small{height:25px;width:25px}body.dex-branding img.logo-square.micro-icon,body.dex-branding img.logo-full.micro-icon{height:15px;width:15px}body.dex-branding.dark img.logo-square,body.dex-branding.dark img.logo-full{content:url(\"/img/softened-icon-dark.png\")}body.dex-branding span.brand::before{content:\"DCRDEX\"}#noteIndicator{position:absolute;top:0;left:20px;font-size:16px;line-height:1;font-family:\"demi-sans\",sans-serif;font-weight:bold;z-index:2}#noteIndicator.good{color:var(--indicator-good)}#noteIndicator.bad{color:rgba(221,34,34,.9333333333)}#noteIndicator.warn{color:var(--text-warning)}div.popup-notes{align-items:flex-end;border-radius:4px;bottom:0;display:flex;flex-direction:column;max-width:750px;position:fixed;right:5px;z-index:1000}div.popup-notes>span{line-height:1;max-width:100%;display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:var(--popup-notes-bg);color:var(--popup-notes-color);padding:4px 10px;margin:3px 0 0}div.popup-notes .note-indicator{margin-bottom:2px}[data-unit]{color:var(--hint-color)}[data-unit-box]{cursor:default;position:relative;overflow:visible}[data-unit-box]>div{left:-2rem;z-index:10;color:var(--text-color)}#profileBox,#noteBox{position:fixed;display:flex;flex-direction:column;align-items:stretch;background-color:var(--section-bg);border:1px solid var(--border-color);z-index:100;min-width:150px;line-height:1.5;max-height:90%}#profileBox .icon,#noteBox .icon{position:absolute;right:15px;top:8px}#profileBox .header,#noteBox .header{border-bottom:1px solid var(--border-color);background-color:var(--section-bg)}#profileBox .header>div,#noteBox .header>div{opacity:.5;cursor:pointer}#profileBox .header>div.active,#noteBox .header>div.active{opacity:1}#profileBox:not(.authed) .authed-only,#noteBox:not(.authed) .authed-only{display:none !important}#noteBox{width:425px}#noteBox div.note.firstview{background-color:var(--tertiary-bg)}#noteBox div.note:not(:last-child){border-bottom:1px solid var(--border-color)}#profileBox{min-width:250px}#loader{background-color:var(--body-bg-lower-opacity)}#requiredActions{position:absolute;bottom:0;left:0;z-index:98}#requiredActions>div{background-color:var(--body-bg);border:3px solid var(--border-color)}@media(min-width: 576px){section{margin:.5rem}}@media(min-width: 992px){section,.w-lg-auto{width:auto}}label{margin-bottom:.25rem;cursor:pointer}input[type=text],input[type=date],input[type=password],input[type=number],input[type=url],textarea{display:block;width:100%;padding:.375rem .75rem;border:1px solid var(--form-input-border);border-radius:5px;background-color:var(--form-input-bg);color:var(--text-color)}input[type=text]:focus,input[type=date]:focus,input[type=password]:focus,input[type=number]:focus,input[type=url]:focus,textarea:focus{border-color:var(--form-input-border-focus);outline:none}input[type=text].border-danger,input[type=date].border-danger,input[type=password].border-danger,input[type=number].border-danger,input[type=url].border-danger,textarea.border-danger{border-color:var(--text-danger)}input[type=text].border-success,input[type=date].border-success,input[type=password].border-success,input[type=number].border-success,input[type=url].border-success,textarea.border-success{border-color:var(--indicator-good)}input[type=text].thin,input[type=date].thin,input[type=password].thin,input[type=number].thin,input[type=url].thin,textarea.thin{width:4rem}input[type=text].micro,input[type=date].micro,input[type=password].micro,input[type=number].micro,input[type=url].micro,textarea.micro{font-size:14px;padding:0 .25rem;width:3rem}input[type=text].micro.wide,input[type=date].micro.wide,input[type=password].micro.wide,input[type=number].micro.wide,input[type=url].micro.wide,textarea.micro.wide{width:5rem}input[type=text].micro.thin,input[type=date].micro.thin,input[type=password].micro.thin,input[type=number].micro.thin,input[type=url].micro.thin,textarea.micro.thin{width:2rem}select{background-color:var(--form-input-bg) !important}.form-select{color:var(--text-color);background-color:var(--form-input-bg);border:1px solid var(--form-input-border);border-radius:3px}.form-select:focus{border-color:var(--form-input-border-focus)}#regAssetForm input[data-tmpl=tradingTierInput]{width:3em}#regAssetForm .readygreen{color:#009931}#regAssetForm .setuporange{color:#b89400}#confirmRegForm{width:425px}#confirmRegForm button.submit{width:auto;padding:12px 30px;border-radius:3px;opacity:.9}#confirmRegForm button.submit:hover{opacity:1}#confirmRegForm input.app-pass{display:inline-block;max-width:250px}#confirmRegForm div.reg-conf-msg{width:100%}#confirmRegForm div.borderright{border-right:1px solid #777}#confirmRegForm .mw50{max-width:50%}#newWalletForm{width:425px}#newWalletForm [data-tmpl=walletTypeTabs] .wtab.selected{opacity:1;cursor:default;background-color:var(--form-selected-tab-bg)}#newWalletForm [data-tmpl=walletTypeTabs] .wtab:not(.selected){opacity:.8;cursor:pointer}#newWalletForm [data-tmpl=walletTypeTabs] .wtab:not(.selected):hover{opacity:1}#newWalletForm .one-bttn{display:inline-block;font-size:22px;padding:10px 25px;background-color:#0b5831;border-radius:5px;animation:glow 1.5s infinite alternate}#newWalletForm .one-bttn:hover{background-color:#0c5f36}@keyframes glow{from{box-shadow:0 0 4px -3px rgba(255,255,255,.4666666667);opacity:.95}to{box-shadow:0 0 4px 0 rgba(255,255,255,.4666666667);opacity:1}}.form-check-label{user-select:none}#forms{position:fixed;top:0;bottom:0;left:0;right:0;padding:25px 0;background-color:var(--forms-bg);backdrop-filter:blur(5px);z-index:101}#forms>form{box-sizing:content-box;margin:auto;position:relative;padding-bottom:1rem}#forms>form>div{padding:1rem 1rem 0}#forms>form>div.form-closer-unbound,#forms>form>div.form-closer{cursor:pointer;line-height:1;font-size:.8rem;padding:.75rem;position:absolute;top:0;right:0;z-index:1}#forms>form>div.form-closer-unbound span,#forms>form>div.form-closer span{opacity:.6}#forms>form>div.form-closer-unbound span:hover,#forms>form>div.form-closer span:hover{opacity:1}#forms>form header{padding:1rem;line-height:1;border-bottom:1px solid var(--border-color);font-size:1.6rem}div[data-handler=init] #forms,div[data-handler=login] #forms,div[data-handler=register] #forms{margin-top:70px;z-index:99}#walletWait .icons{width:25px}#walletWait .ico-check{color:rgba(5,163,90,.6)}#dexAddrForm .known-exchange{font-size:17px;padding:5px 0;width:100%;border:1px solid #555;margin-bottom:10px;border-radius:3px;cursor:pointer}#dexAddrForm .known-exchange:hover,#dexAddrForm .known-exchange.selected{background-color:rgba(119,119,119,.1333333333)}#loginForm,#authorizeAccountImportForm,#disableAccountForm,#discoverAcctForm{width:275px}#changeAppPWForm,#resetAppPWForm,#dexAddrForm,#verifyForm,#deleteArchivedRecordsForm{width:325px}#appPWForm{width:350px}#sendForm,#vSendForm,#exportSeedAuth,#cancelForm,#quickConfigForm,#toggleWalletStatusConfirm,#walletWait{width:375px}#confirmRegistrationForm,#regAssetForm,#reconfigForm,#authorizeSeedDisplay,#seedBackupForm,#votingForm,#gameCodeForm{width:425px}a[data-tmpl=walletCfgGuide]{color:inherit;text-decoration:none}#deposit #copyAlert{margin-left:12px;position:absolute}.mini-slider{padding:.5rem 0;cursor:pointer;user-select:none}.mini-slider div[data-tmpl=color]{width:100%;height:.2rem;background-color:rgba(119,119,119,.4666666667);position:relative;overflow:visible}.mini-slider div[data-tmpl=color]>div[data-tmpl=track]{position:absolute;left:.375rem;right:.375rem;bottom:0;top:0;overflow:visible}.mini-slider div[data-tmpl=color]>div[data-tmpl=track]>div[data-tmpl=ball]{width:.75rem;height:.75rem;top:.1rem;border-radius:1rem;background-color:var(--text-grey);position:absolute;transform:translate(-50%, -50%);cursor:pointer}.mini-slider.small div[data-tmpl=color]{height:.125rem}.mini-slider.small div[data-tmpl=color]>div[data-tmpl=track]{left:.25rem;right:.25rem}.mini-slider.small div[data-tmpl=color]>div[data-tmpl=track]>div[data-tmpl=ball]{width:.5rem;height:.5rem}.slider-container,.order-opt{border:1px solid #424242;border-radius:3px;padding:4px;margin-top:8px}.slider-container>div.disabled,.order-opt>div.disabled{opacity:.8}.slider-container>div.disabled [data-tmpl=sliderBox],.order-opt>div.disabled [data-tmpl=sliderBox]{cursor:default}.slider-container>div.disabled [data-tmpl=sliderBox] .slider .slider-handle,.order-opt>div.disabled [data-tmpl=sliderBox] .slider .slider-handle{background-color:rgba(119,119,119,.7333333333)}.slider-container div.opt-check,.order-opt div.opt-check{width:15px;height:15px;border-radius:7.5px;border:2px solid #424242;margin-top:5px;cursor:pointer}.slider-container .xy-range-input,.order-opt .xy-range-input{width:35px;font-size:14px;height:16px}.slider-container [data-tmpl=sliderBox],.order-opt [data-tmpl=sliderBox]{cursor:pointer}.slider-container [data-tmpl=sliderBox] .slider,.order-opt [data-tmpl=sliderBox] .slider{margin:10px 10px 5px;height:2px;background-color:gray;position:relative}.slider-container [data-tmpl=sliderBox] .slider .slider-handle,.order-opt [data-tmpl=sliderBox] .slider .slider-handle{position:absolute;height:20px;width:14px;top:-9px;border-radius:7px;background-color:#2cce9c;border:2px solid #424242}div[data-tmpl=scoreTray]{background-color:var(--buy-color);height:12px;border-radius:100px;overflow:hidden}div[data-tmpl=scoreTray] div[data-tmpl=scoreWarn]{background-color:var(--sell-color);position:absolute;top:0;bottom:0;left:0}span[data-tmpl=scorePointer]{transform:translateX(-50%)}span[data-tmpl=scorePointer] span[data-tmpl=scoreData]{top:0;bottom:0}span[data-tmpl=scorePointer] span[data-tmpl=scoreData].positive{right:calc(100% + .125rem)}span[data-tmpl=scorePointer] span[data-tmpl=scoreData].negative{left:calc(100% + .125rem)}.penalty-marker{position:absolute;top:0;bottom:0;left:10%;width:2px;z-index:2;background-color:#000}div[data-handler=init] .quickconfig-asset-logo{width:25px;height:25px}.anitoggle{width:1.5rem;height:.9rem;border-radius:.45rem;background-color:rgba(119,119,119,.6666666667);cursor:pointer}.anitoggle.on{background-color:var(--indicator-good)}.anitoggle>div{position:relative;top:.1rem;left:.1rem;width:.7rem;height:.7rem;border-radius:.35rem;transition:left .5s;background-color:var(--section-bg)}.anitoggle.on>div{left:.7rem}.anitoggle.big{width:35px;height:20px;border-radius:10px}.anitoggle.big>div{top:2px;left:2px;width:16px;height:16px;border-radius:12px}.anitoggle.big.on>div{left:17px}.selectable.selected{border:2px solid green}.dynamicopts{display:flex;align-items:stretch;justify-content:space-between;flex-wrap:wrap}.dynamicopts>div{min-height:55px}.dynamicopts>div:not(.repeatable,[data-tmpl=checkbox]){width:47%}.hoveropaque{opacity:.7}.hoveropaque:hover{opacity:1}#placementsBody td[data-tmpl=error]{max-width:200px}body.dark ::-webkit-calendar-picker-indicator{filter:invert(1)}body.dark #regAssetForm div.reg-asset .fader{background-image:linear-gradient(to bottom, rgba(19, 32, 43, 0), #122739 90%)}body.dark #regAssetForm div.reg-asset:not(.nohover):hover .fader{background-image:linear-gradient(to bottom, rgba(32, 44, 53, 0), #202c35 90%)}div[data-handler=markets] .ordertable-wrap{width:100%}div[data-handler=markets] .ordertable-wrap:first-child{border-bottom:1px solid var(--border-color)}div[data-handler=markets] .ordertable-wrap:last-child{border-top:1px solid var(--border-color)}div[data-handler=markets] .ordertable-wrap tbody#sellRows{border-top:1px solid var(--border-color)}div[data-handler=markets] .orderbook{min-width:225px}div[data-handler=markets] .orderbook>div:first-child{order:3}div[data-handler=markets] .orderbook>div:nth-child(2){order:1}div[data-handler=markets] .orderbook>div:last-child{order:2}div[data-handler=markets] .order-panel{min-width:375px}div[data-handler=markets] .order-panel #orderForm input[type=number]{height:30px;border-radius:0;font-size:14px}div[data-handler=markets] .order-panel #orderForm input:focus{outline:none}div[data-handler=markets] .order-panel #orderForm span.unitbox{position:absolute;font-size:14px;font-weight:bold;right:5px;top:48%;transform:translateY(-50%);white-space:nowrap}div[data-handler=markets] .order-panel #orderForm button{padding:5px 25px;border:1px solid rgba(120,120,120,.4666666667);border-radius:3px;background-color:var(--section-bg);color:var(--market-btn-color)}div[data-handler=markets] .order-panel #orderForm button:disabled{opacity:.4}div[data-handler=markets] .order-panel #orderForm button:hover,div[data-handler=markets] .order-panel #orderForm button.selected{color:var(--market-btn-selected-color)}div[data-handler=markets] .order-panel #orderForm button.submit{color:var(--market-btn-selected-color)}div[data-handler=markets] .order-panel #orderForm button.selected.buygreen-bg,div[data-handler=markets] .order-panel #orderForm button.submit.buygreen-bg{background-color:var(--market-buygreen-bg)}div[data-handler=markets] .order-panel #orderForm button.selected.sellred-bg,div[data-handler=markets] .order-panel #orderForm button.submit.sellred-bg{background-color:var(--market-sellred-bg)}div[data-handler=markets] .order-panel #orderForm #orderPreview,div[data-handler=markets] .order-panel #orderForm .h21{height:21px}div[data-handler=markets] .order-panel .ico-unlocked{color:#0b5831}div[data-handler=markets] .order-panel .ico-disconnected{color:var(--text-warning)}div[data-handler=markets] .market-chart{flex-grow:1;position:relative;min-width:100px;min-height:250px}div[data-handler=markets] .market-chart canvas{position:absolute;left:0;top:0;user-select:none}div[data-handler=markets] #unreadyOrdersMsg{color:rgba(221,34,34,.9333333333)}div[data-handler=markets] .unready-user-order{background-color:#6e0909}div[data-handler=markets] .user-order:not(:last-child){border-bottom-style:none !important}div[data-handler=markets] .user-order:last-child .order-details{border-bottom-style:none !important;padding-bottom:0}div[data-handler=markets] .user-order .user-order-header{padding:5px 10px 5px 20px;font-size:14px;position:relative}div[data-handler=markets] .user-order .user-order-header .side-indicator{position:absolute;left:0;top:0;bottom:0;width:8px}div[data-handler=markets] .user-order .user-order-header .side-indicator.buy{background-color:var(--buy-color)}div[data-handler=markets] .user-order .user-order-header .side-indicator.sell{background-color:var(--market-sell-color)}div[data-handler=markets] .user-order .user-order-header .side-indicator.inactive{opacity:.5}div[data-handler=markets] .user-order .user-order-header .active-indicator{height:8px;border-radius:4px}div[data-handler=markets] .user-order .user-order-header .active-indicator.active{margin:0 5px;width:8px;background-color:var(--buy-color)}div[data-handler=markets] .user-order .order-details{margin-bottom:25px;padding:0 10px 10px;display:grid;grid-template-columns:1fr 1fr 1fr 1fr;row-gap:10px;column-gap:5px;line-height:1}div[data-handler=markets] .user-order .order-details .user-order-datum{flex-grow:1;display:flex;flex-direction:column;align-items:flex-start}div[data-handler=markets] .user-order .order-details .user-order-datum>span:first-child{font-size:12px;font-family:\"demi-sans\",sans-serif;color:gray;margin-bottom:2px}div[data-handler=markets] .user-order .order-details .user-order-datum>span:nth-child(2){font-size:14px}div[data-handler=markets] .user-order .order-details .user-order-datum.full-span{grid-column:1/-1}div[data-handler=markets] .markettab{height:30px;border-style:none;background-color:var(--section-bg)}div[data-handler=markets] .markettab.selected{background-color:var(--market-markettab-selected-bg)}div[data-handler=markets] .numorders{background-color:var(--market-numorders-bg);padding:1px 2px}div[data-handler=markets] #leftMarketDock{position:absolute;display:flex;top:0;left:0;z-index:2;min-height:-webkit-fill-available;background-color:var(--section-bg)}div[data-handler=markets] #leftMarketDock.default,div[data-handler=markets] #leftMarketDock.stashed{display:none}div[data-handler=markets] #leftMarketDock #searchBoxV1{height:55px}div[data-handler=markets] #leftMarketDock.stashed{display:none}div[data-handler=markets] #leftMarketDock #marketSearchV1:focus{border:none;outline:none}div[data-handler=markets] #leftMarketDock #marketSearchV1{width:100%;z-index:2;background-color:rgba(0,0,0,0);font-size:25px;text-align:center;font-family:\"demi-sans\",sans-serif;font-variant:small-caps;border:none}div[data-handler=markets] #leftMarketDock #marketSearchV1+.ico-search{z-index:1;position:absolute;left:50%;top:50%;transform:translateX(-50%) translateY(-50%);opacity:.25}div[data-handler=markets] #leftMarketDock #marketSearchV1:hover+.ico-search{opacity:.5}div[data-handler=markets] #leftMarketDock #marketSearchV1:not(:placeholder-shown)+.ico-search,div[data-handler=markets] #leftMarketDock #marketSearchV1:focus+.ico-search{display:none}div[data-handler=markets] #leftMarketDock #marketListV1{height:100%;min-width:275px}div[data-handler=markets] #leftMarketDock #marketListV1>div .dexname{max-width:60px;overflow:hidden;text-overflow:ellipsis}div[data-handler=markets] #leftMarketDock #marketListV1>div.selected{background-color:rgba(119,119,119,.2)}div[data-handler=markets] #mainContent{display:flex;flex-direction:column;align-items:center}div[data-handler=markets] #mainContent>div,div[data-handler=markets] #mainContent>section{min-height:500px;display:flex}div[data-handler=markets] #mainContent>div:first-child,div[data-handler=markets] #mainContent>section:first-child{max-height:1000px;order:3}div[data-handler=markets] #mainContent>div:nth-child(2),div[data-handler=markets] #mainContent>section:nth-child(2){order:1}div[data-handler=markets] #mainContent>div:last-child,div[data-handler=markets] #mainContent>section:last-child{order:2}div[data-handler=markets] #epochLine,div[data-handler=markets] #durBttnBox{position:absolute;left:65px;top:5px;background-color:var(--section-bg);z-index:1}div[data-handler=markets] #durBttnBox .candle-dur-bttn{background-color:var(--section-bg);padding:2px 4px;font-size:14px;line-height:1;margin:0 2px}div[data-handler=markets] #durBttnBox .candle-dur-bttn:hover{background-color:rgba(119,119,119,.4666666667)}div[data-handler=markets] #durBttnBox .candle-dur-bttn:hover,div[data-handler=markets] #durBttnBox .candle-dur-bttn.selected{border-color:var(--text-warning);color:var(--text-warning)}div[data-handler=markets] #epochLine .epoch-line{display:inline-block;border-top:3px dotted #626262;width:25px;height:0;margin-right:5px;position:relative;top:1px}div[data-handler=markets] #loaderMsg{color:#777}div[data-handler=markets] #bondCreationPending .title{font-weight:bold;margin-bottom:5px;color:#9b8c09}div[data-handler=markets] #registrationStatus .title{font-weight:bold;margin-bottom:5px}div[data-handler=markets] #registrationStatus.waiting .title{color:#9b8c09}div[data-handler=markets] #registrationStatus.completed .title{color:#0b5831}div[data-handler=markets] #registrationStatus.completed #regStatusMessage{display:none}div[data-handler=markets] #registrationStatus.error .title{color:rgba(221,34,34,.9333333333)}div[data-handler=markets] #approveTokenForm{width:450px}div[data-handler=markets] #verifyForm .echo-data span{margin:0 5px}div[data-handler=markets] #verifyForm .disclaimer{text-align:justify}div[data-handler=markets] #verifyForm header.buygreen-bg{background-color:var(--market-buygreen-bg)}div[data-handler=markets] #verifyForm header.sellred-bg{background-color:var(--market-sellred-bg)}div[data-handler=markets] #verifyForm button.buygreen-bg{background-color:var(--market-buygreen-bg)}div[data-handler=markets] #verifyForm button.sellred-bg{background-color:var(--market-sellred-bg)}div[data-handler=markets] #verifyForm .loader{height:40px}div[data-handler=markets] #verifyForm .order-opt{opacity:.7}div[data-handler=markets] #verifyForm .order-opt:not(.selected){cursor:pointer}div[data-handler=markets] #verifyForm .order-opt.selected{opacity:1;background-color:var(--form-opt-selected-bg)}div[data-handler=markets] #verifyForm .order-opt.selected div.opt-check{background-color:#0b5831}div[data-handler=markets] #vDetailPane{max-width:425px}div[data-handler=markets] #vDetailPane .indent{border-left:2px solid var(--border-color)}div[data-handler=markets] #vDetailPane table.fee-breakout td{text-align:center;padding:2px 5px}div[data-handler=markets] #marketReopener{display:none;padding:10px 0;position:absolute;top:0;left:0;background-color:var(--section-bg);z-index:10}div[data-handler=markets] #leftHider .ico-arrowleft,div[data-handler=markets] #leftHider .ico-arrowright,div[data-handler=markets] #marketReopener .ico-arrowleft,div[data-handler=markets] #marketReopener .ico-arrowright{transform:scaleX(0.5);opacity:.5}div[data-handler=markets] #leftHider:hover .ico-arrowleft,div[data-handler=markets] #leftHider:hover .ico-arrowright,div[data-handler=markets] #marketReopener:hover .ico-arrowleft,div[data-handler=markets] #marketReopener:hover .ico-arrowright{opacity:1}.market-stats{display:flex;margin:0 5px;gap:15px}.market-stats .statgrid{display:grid;grid-template-columns:auto auto auto}.market-stats.listopen .ico-arrowdown{display:none}.market-stats:not(.listopen) .ico-arrowup{display:none}#headerSpace .market-stats{display:none}#recentMatchesBox{max-height:350px}#recentMatchesTable th{align-items:center}#recentMatchesTable th:hover{opacity:.7}#recentMatchesTable th .ico-arrowdown{display:inline-block;visibility:hidden;vertical-align:middle;font-size:10px;margin-left:5px}#recentMatchesTable th.sorted-dsc .ico-arrowdown{visibility:visible}#recentMatchesTable th.sorted-asc .ico-arrowdown{visibility:visible;transform:rotate(180deg)}@media(min-width: 1200px){#main .market-stats{display:none;border-top:none}#headerSpace .market-stats{display:flex;border-bottom:none !important}div[data-handler=markets] #leftMarketDock{position:relative}div[data-handler=markets] #leftMarketDock.default{display:flex}}@media(min-width: 992px){div[data-handler=markets] #mainContent{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden;flex-direction:row;align-items:stretch}div[data-handler=markets] #mainContent>section,div[data-handler=markets] #mainContent>div{min-height:none;display:flex}div[data-handler=markets] #mainContent>section:nth-child(n),div[data-handler=markets] #mainContent>div:nth-child(n){min-height:auto}div[data-handler=markets] #mainContent>section:first-child,div[data-handler=markets] #mainContent>div:first-child{order:1}div[data-handler=markets] #mainContent>section:nth-child(2),div[data-handler=markets] #mainContent>div:nth-child(2){order:2}div[data-handler=markets] #mainContent>section:last-child,div[data-handler=markets] #mainContent>div:last-child{order:3}div[data-handler=markets] .ordertable-wrap{height:calc(50% - 15px);display:flex}div[data-handler=markets] .ordertable-wrap.reversible{flex-direction:column-reverse}div[data-handler=markets] .ordertable-wrap tbody{display:flex;align-items:stretch}div[data-handler=markets] .ordertable-wrap tbody#sellRows{flex-direction:column-reverse;border-top:none}div[data-handler=markets] .ordertable-wrap tbody#buyRows{flex-direction:column}div[data-handler=markets] .orderbook{width:auto}div[data-handler=markets] .orderbook>div:first-child{order:1}div[data-handler=markets] .orderbook>div:nth-child(2){order:2}div[data-handler=markets] .orderbook>div:last-child{order:3}div[data-handler=markets] .order-panel>div{position:absolute;top:0;bottom:0;left:0;right:0;overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(119,119,119,.2666666667) rgba(119,119,119,.0666666667);height:100%;overflow-x:hidden}div[data-handler=markets] .order-panel>div::-webkit-scrollbar{width:8px;height:8px}div[data-handler=markets] .order-panel>div::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}div[data-handler=markets] .order-panel>div::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}div[data-handler=markets] #leftMarketDock.stashed+#marketReopener{display:block}#recentMatchesBox{overflow:visible;max-height:none;border-bottom:none}#candlesLegend,#depthLegend{z-index:10;position:absolute;top:0;right:0;background-color:var(--section-bg)}}.user-order-floaty-menu{position:absolute;display:flex;align-items:center;z-index:5;border-style:none solid solid;border-width:0 2px 2px 1px;border-color:var(--border-color);background-color:var(--section-bg);cursor:pointer;overflow:hidden}.user-order-floaty-menu>span,.user-order-floaty-menu>a{margin:0 5px;padding-right:10px;padding-left:10px}.user-order-floaty-menu>span:hover,.user-order-floaty-menu>a:hover{background-color:rgba(119,119,119,.3333333333)}.bot-problems-section{background-color:rgba(255,0,0,.6666666667);margin-top:2px;margin-bottom:2px;padding-left:2px;border-radius:5px}.walletspage .ico-unlocked{color:var(--indicator-good)}.walletspage .market-select-logo{width:20px;height:20px}.walletspage .short-host{text-overflow:ellipsis;max-width:175px}.walletspage .mw-90p{min-width:90%}.walletspage #recoverWalletConfirm,.walletspage #confirmForce,.walletspage #toggleWalletStatusConfirm{width:400px}.walletspage #content{flex-direction:column}.walletspage #assetSelect{flex-direction:row}.walletspage #assetSelect .icon-select{cursor:pointer;min-height:fit-content}.walletspage #assetSelect .icon-select img[data-tmpl=img]{width:30px;height:30px}.walletspage #assetSelect .icon-select img[data-tmpl=parentImg]{position:absolute;left:15px;bottom:15px;width:20px;height:20px;border-radius:10px;border:3px solid var(--section-bg);background-color:var(--section-bg)}.walletspage #assetSelect .icon-select.selected,.walletspage #assetSelect .icon-select:hover{background-color:var(--body-bg);opacity:1}.walletspage #assetSelect .icon-select.selected img[data-tmpl=parentImg],.walletspage #assetSelect .icon-select:hover img[data-tmpl=parentImg]{border:3px solid var(--body-bg);background-color:var(--section-bg)}.walletspage #assetSelect .icon-select.nowallet{opacity:.7}.walletspage #assetSelect .icon-select.nowallet [data-tmpl=balance]{display:none}.walletspage table#balanceTable td{line-height:1}.walletspage table#balanceTable tr.itemized>td{padding-bottom:.25rem}.walletspage table#balanceTable tr:not(.sub,:first-child) td{padding-top:.5rem}.walletspage table#balanceTable tr{font-size:1.1rem}.walletspage table#balanceTable tr.sub{font-size:.9rem}.walletspage table#balanceTable tr.sub.last>td:first-child::before{content:\"└─ \"}.walletspage table#balanceTable tr.sub>td:first-child::before{content:\"├─ \"}.walletspage table#balanceTable tr.sub>td:last-child{border-right:1px solid var(--border-color);padding-right:.5rem}.walletspage #walletInfo{border-left:none}.walletspage #walletInfo table#walletInfoTable td{padding:2px 5px 2px 0;line-height:1}.walletspage #walletInfo table#walletInfoTable td:last-child{text-align:right;padding-left:1rem}.walletspage #earlierTxs,.walletspage #txViewBlockExplorer{text-decoration:underline;cursor:pointer}.walletspage #checkmarkBox{height:100px}.walletspage #walletDetailsBox #assetLogo{width:30px;height:30px}.walletspage #walletDetailsBox #assetName{font-size:30px}.walletspage #walletDetailsBox #balance{font-size:20px}.walletspage #walletDetailsBox #balanceUnit{font-size:17px}.walletspage #walletDetailsBox #fiatBalanceBox{font-size:13px}.walletspage #walletDetailsBox #tokenParentLogo{width:18px;height:18px}.walletspage #walletDetailsBox #contractAddress{opacity:.4}.walletspage .peers-table-icon{padding-left:30%}.walletspage #vspDisplay #vspEditIcon{display:none}.walletspage #vspDisplay:hover #vspEditIcon{display:inline}.walletspage .scrollsmall{overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(119,119,119,.2666666667) rgba(119,119,119,.0666666667)}.walletspage .scrollsmall::-webkit-scrollbar{width:8px;height:8px}.walletspage .scrollsmall::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}.walletspage .scrollsmall::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}.walletspage .positive-tx{color:var(--indicator-good)}.walletspage .negative-tx{color:rgba(221,34,34,.9333333333)}@media(min-width: 1200px){.scrollsmall{overflow:hidden}.column{overflow:auto;scrollbar-width:none;position:absolute;top:0;bottom:0;left:0;right:0}.column::-webkit-scrollbar{display:none}}@media(min-width: 992px){.fill-abs-lg{position:absolute;top:0;bottom:0;left:0;right:0}.stylish-overflow-lg{overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(119,119,119,.2666666667) rgba(119,119,119,.0666666667)}.stylish-overflow-lg::-webkit-scrollbar{width:8px;height:8px}.stylish-overflow-lg::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}.stylish-overflow-lg::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}.walletspage #walletDetailsBox{border-bottom:none !important}.flex-wrap-lg{flex-wrap:wrap}#purchaseTicketsErrBox{background-color:var(--section-bg)}}@media(min-width: 576px){.walletspage #walletDetailsBox #assetLogo{width:40px;height:40px}.walletspage #walletDetailsBox #assetName{font-size:40px}.walletspage #walletDetailsBox #balance{font-size:28px}.walletspage #walletDetailsBox #balanceUnit{font-size:20px}.walletspage #walletDetailsBox #fiatBalanceBox{font-size:15px}.walletspage #content{flex-direction:row}.walletspage #assetSelect{flex-direction:column;overflow-y:auto}.walletspage #assetSelect .icon-select{padding:15px}.walletspage #assetSelect .icon-select img[data-tmpl=img]{width:40px;height:40px}.walletspage #assetSelect .icon-select img[data-tmpl=parentImg]{left:20px;bottom:20px;width:28px;height:28px;border-radius:15px}}@media(min-width: 768px){.walletspage #sendReceive{border-bottom:none}}#restoreWalletInfo,#exportWalletAuth,#unapproveTokenForm{width:450px}#txDetails{width:450px}#submitReconfig[disabled]{cursor:not-allowed}.filter-display{border-radius:3px;font-size:16px;font-weight:bold;cursor:pointer}.filter-opts{position:relative;max-width:250px;white-space:nowrap;text-overflow:ellipsis}div.order-datum{display:flex;flex-direction:column;align-items:stretch;justify-content:start;text-align:center;font-size:15px}div.order-datum div:first-child{font-family:\"demi-sans\",sans-serif;background-color:var(--tertiary-bg)}div.match-header{background-color:var(--tertiary-bg)}div.match-card{display:flex;flex-direction:column;align-items:stretch;font-size:14px}.match-data-label{opacity:.5;font-family:\"demi-sans\",sans-serif}#accelerateForm{width:500px}div.settings{min-width:375px}div[data-handler=mmsettings] #gapStrategySelect,div[data-handler=mmarchives] #gapStrategySelect,div[data-handler=mmlogs] #gapStrategySelect,div[data-handler=mm] #gapStrategySelect{width:300px}div[data-handler=mmsettings] .gap-factor-input,div[data-handler=mmsettings] .lots-input,div[data-handler=mmarchives] .gap-factor-input,div[data-handler=mmarchives] .lots-input,div[data-handler=mmlogs] .gap-factor-input,div[data-handler=mmlogs] .lots-input,div[data-handler=mm] .gap-factor-input,div[data-handler=mm] .lots-input{max-width:75px}div[data-handler=mmsettings] [data-tmpl=value].wide,div[data-handler=mmarchives] [data-tmpl=value].wide,div[data-handler=mmlogs] [data-tmpl=value].wide,div[data-handler=mm] [data-tmpl=value].wide{width:3rem}div[data-handler=mmsettings] .ico-arrowup.ml2px,div[data-handler=mmarchives] .ico-arrowup.ml2px,div[data-handler=mmlogs] .ico-arrowup.ml2px,div[data-handler=mm] .ico-arrowup.ml2px{margin-left:2px}div[data-handler=mmsettings] .pt-pt5,div[data-handler=mmarchives] .pt-pt5,div[data-handler=mmlogs] .pt-pt5,div[data-handler=mm] .pt-pt5{padding-top:.125rem}div[data-handler=mmsettings] #profitInput,div[data-handler=mmarchives] #profitInput,div[data-handler=mmlogs] #profitInput,div[data-handler=mm] #profitInput{width:70px}div[data-handler=mmsettings] .bot-type-selector,div[data-handler=mmarchives] .bot-type-selector,div[data-handler=mmlogs] .bot-type-selector,div[data-handler=mm] .bot-type-selector{border:1px solid var(--border-color);display:flex;flex-direction:column;align-items:stretch;user-select:none}div[data-handler=mmsettings] .bot-type-selector.disabled,div[data-handler=mmarchives] .bot-type-selector.disabled,div[data-handler=mmlogs] .bot-type-selector.disabled,div[data-handler=mm] .bot-type-selector.disabled{opacity:.5}div[data-handler=mmsettings] .bot-type-selector:not(.disabled),div[data-handler=mmarchives] .bot-type-selector:not(.disabled),div[data-handler=mmlogs] .bot-type-selector:not(.disabled),div[data-handler=mm] .bot-type-selector:not(.disabled){cursor:pointer}div[data-handler=mmsettings] .bot-type-selector:not(.disabled).selected,div[data-handler=mmarchives] .bot-type-selector:not(.disabled).selected,div[data-handler=mmlogs] .bot-type-selector:not(.disabled).selected,div[data-handler=mm] .bot-type-selector:not(.disabled).selected{outline:2px solid #0b5831;background-color:rgba(119,119,119,.1333333333)}div[data-handler=mmsettings] .bot-problems-section,div[data-handler=mmarchives] .bot-problems-section,div[data-handler=mmlogs] .bot-problems-section,div[data-handler=mm] .bot-problems-section{background-color:rgba(255,0,0,.6666666667);margin-top:2px;margin-bottom:2px;padding-left:2px;border-radius:5px}div[data-handler=mmsettings] #marketFilterIcon,div[data-handler=mmarchives] #marketFilterIcon,div[data-handler=mmlogs] #marketFilterIcon,div[data-handler=mm] #marketFilterIcon{position:absolute;left:10px;top:50%;transform:translateY(-50%);opacity:.5}div[data-handler=mmsettings] #botTypeForm,div[data-handler=mmarchives] #botTypeForm,div[data-handler=mmlogs] #botTypeForm,div[data-handler=mm] #botTypeForm{min-width:375px}div[data-handler=mmsettings] #cexSelection .cex-selector,div[data-handler=mmarchives] #cexSelection .cex-selector,div[data-handler=mmlogs] #cexSelection .cex-selector,div[data-handler=mm] #cexSelection .cex-selector{user-select:none}div[data-handler=mmsettings] #cexSelection .cex-selector.configured:not(.selected),div[data-handler=mmarchives] #cexSelection .cex-selector.configured:not(.selected),div[data-handler=mmlogs] #cexSelection .cex-selector.configured:not(.selected),div[data-handler=mm] #cexSelection .cex-selector.configured:not(.selected){opacity:.8}div[data-handler=mmsettings] #cexSelection.disabled .cex-selector.configured,div[data-handler=mmarchives] #cexSelection.disabled .cex-selector.configured,div[data-handler=mmlogs] #cexSelection.disabled .cex-selector.configured,div[data-handler=mm] #cexSelection.disabled .cex-selector.configured{opacity:.5}div[data-handler=mmsettings] #cexSelection.disabled .cex-selector:not(.configured),div[data-handler=mmarchives] #cexSelection.disabled .cex-selector:not(.configured),div[data-handler=mmlogs] #cexSelection.disabled .cex-selector:not(.configured),div[data-handler=mm] #cexSelection.disabled .cex-selector:not(.configured){cursor:pointer}div[data-handler=mmsettings] #cexSelection:not(.disabled) .cex-selector,div[data-handler=mmarchives] #cexSelection:not(.disabled) .cex-selector,div[data-handler=mmlogs] #cexSelection:not(.disabled) .cex-selector,div[data-handler=mm] #cexSelection:not(.disabled) .cex-selector{cursor:pointer}div[data-handler=mmsettings] #cexSelection:not(.disabled) .cex-selector.selected,div[data-handler=mmarchives] #cexSelection:not(.disabled) .cex-selector.selected,div[data-handler=mmlogs] #cexSelection:not(.disabled) .cex-selector.selected,div[data-handler=mm] #cexSelection:not(.disabled) .cex-selector.selected{border-color:#0b5831 !important;border-width:2px !important;background-color:rgba(119,119,119,.1333333333) !important}div[data-handler=mmsettings] #cexSelection .reconfig,div[data-handler=mmarchives] #cexSelection .reconfig,div[data-handler=mmlogs] #cexSelection .reconfig,div[data-handler=mm] #cexSelection .reconfig{position:absolute;top:0;right:0}div[data-handler=mmsettings] #quickConfig input[type=number],div[data-handler=mmarchives] #quickConfig input[type=number],div[data-handler=mmlogs] #quickConfig input[type=number],div[data-handler=mm] #quickConfig input[type=number]{width:100px}div[data-handler=mmsettings] #levelSpacingBox.disabled,div[data-handler=mmarchives] #levelSpacingBox.disabled,div[data-handler=mmlogs] #levelSpacingBox.disabled,div[data-handler=mm] #levelSpacingBox.disabled{opacity:.5}div[data-handler=mmsettings] #placementsChart,div[data-handler=mmsettings] [data-tmpl=placementsChart],div[data-handler=mmarchives] #placementsChart,div[data-handler=mmarchives] [data-tmpl=placementsChart],div[data-handler=mmlogs] #placementsChart,div[data-handler=mmlogs] [data-tmpl=placementsChart],div[data-handler=mm] #placementsChart,div[data-handler=mm] [data-tmpl=placementsChart]{height:100px}div[data-handler=mmsettings] #buyPlacementsBox .ico-cross,div[data-handler=mmsettings] #sellPlacementsBox .ico-cross,div[data-handler=mmarchives] #buyPlacementsBox .ico-cross,div[data-handler=mmarchives] #sellPlacementsBox .ico-cross,div[data-handler=mmlogs] #buyPlacementsBox .ico-cross,div[data-handler=mmlogs] #sellPlacementsBox .ico-cross,div[data-handler=mm] #buyPlacementsBox .ico-cross,div[data-handler=mm] #sellPlacementsBox .ico-cross{color:var(--text-danger)}div[data-handler=mmsettings] #buyPlacementsBox .ico-plus,div[data-handler=mmsettings] #sellPlacementsBox .ico-plus,div[data-handler=mmarchives] #buyPlacementsBox .ico-plus,div[data-handler=mmarchives] #sellPlacementsBox .ico-plus,div[data-handler=mmlogs] #buyPlacementsBox .ico-plus,div[data-handler=mmlogs] #sellPlacementsBox .ico-plus,div[data-handler=mm] #buyPlacementsBox .ico-plus,div[data-handler=mm] #sellPlacementsBox .ico-plus{color:var(--btn-go-bg)}div[data-handler=mmsettings] #noBots .ico-robot,div[data-handler=mmarchives] #noBots .ico-robot,div[data-handler=mmlogs] #noBots .ico-robot,div[data-handler=mm] #noBots .ico-robot{font-size:80px;opacity:.7}div[data-handler=mmsettings] #dexOrderDetailsForm,div[data-handler=mmsettings] #cexOrderDetailsForm,div[data-handler=mmsettings] #depositDetailsForm,div[data-handler=mmsettings] #withdrawalDetailsForm,div[data-handler=mmarchives] #dexOrderDetailsForm,div[data-handler=mmarchives] #cexOrderDetailsForm,div[data-handler=mmarchives] #depositDetailsForm,div[data-handler=mmarchives] #withdrawalDetailsForm,div[data-handler=mmlogs] #dexOrderDetailsForm,div[data-handler=mmlogs] #cexOrderDetailsForm,div[data-handler=mmlogs] #depositDetailsForm,div[data-handler=mmlogs] #withdrawalDetailsForm,div[data-handler=mm] #dexOrderDetailsForm,div[data-handler=mm] #cexOrderDetailsForm,div[data-handler=mm] #depositDetailsForm,div[data-handler=mm] #withdrawalDetailsForm{min-width:400px}div[data-handler=mmsettings] .allocation-grid,div[data-handler=mmarchives] .allocation-grid,div[data-handler=mmlogs] .allocation-grid,div[data-handler=mm] .allocation-grid{display:grid;grid-template-columns:1fr auto auto}div[data-handler=mmsettings] .allocation-grid .second,div[data-handler=mmarchives] .allocation-grid .second,div[data-handler=mmlogs] .allocation-grid .second,div[data-handler=mm] .allocation-grid .second{grid-column:2}div[data-handler=mmsettings] .allocation-grid .third,div[data-handler=mmarchives] .allocation-grid .third,div[data-handler=mmlogs] .allocation-grid .third,div[data-handler=mm] .allocation-grid .third{grid-column:3}","// This file defines the color scheme used in the light and dark themes.\n\nbody:not(.dark) {\n // body & text\n --body-bg: #fafafa;\n --body-bg-lower-opacity: #fafafa88;\n --section-bg: #f6f6f6;\n --form-bg: #f0f0f0;\n --tertiary-bg: #7772;\n --text-color: #333;\n --text-color-secondary: #4a4949;\n --text-danger: #d22;\n --text-warning: #f82e;\n --text-grey: #777;\n --border-color: #ddd;\n --hint-color: #4397cd;\n\n // links\n --link-color: #2a71d5;\n --link-color-hover: #144487;\n --subtle-link-color: #05053b;\n --subtle-link-hover: #07075e;\n\n // popup notes\n --popup-notes-bg: black;\n --popup-notes-color: #dfe2e1;\n\n // buttons\n --btn-feature-bg: #6bc5ff;\n --btn-feature-hover-bg: #a3dbff;\n --btn-feature-border-color: #759cb5;\n --btn-featur-hover-border-color: #9bc3dd;\n --btn-danger-hover-color: white;\n --btn-border-color: #ddd;\n --btn-hover-border-color: #ddd;\n --btn-go-bg: #0b5831;\n --btn-go-hover-bg: #0b5831;\n --btn-go-color: #fff;\n\n // forms\n --forms-bg: #fafafa99;\n --form-input-bg: #fff;\n --form-input-border: #999;\n --form-input-border-focus: #555;\n --form-input-bg-active: #3095db;\n --form-opt-selected-bg: #0001;\n --form-selected-tab-bg: white;\n\n // market view\n --indicator-good: #179717;\n --buy-color: #207a46;\n --sell-color: #99302b;\n --market-buygreen-bg: #207a4699;\n --market-sellred-bg: #99302b99;\n --market-sell-color: #99302b;\n --market-btn-color: #555;\n --market-btn-selected-color: black;\n --market-markettab-selected-bg: #7773;\n --market-orderopt-bg: #fff1;\n --market-numorders-bg: #c5c5e6;\n\n // loader\n --loader-bg: #e0e0e077;\n\n // logo\n --dex-url: url(\"/img/softened-icon.png\");\n}\n\n\nbody.dark {\n // body & text\n --body-bg: #040b14;\n --body-bg-lower-opacity: #040b1488;\n --section-bg: #071627;\n --form-bg: #0a1e34;\n --tertiary-bg: #78787822;\n --text-color: #dfe2e1;\n --text-color-secondary: #a1a1a1;\n --text-danger: #ec6a6a;\n --text-warning: #f82e;\n --text-grey: #999;\n --border-color: #383f4b;\n --hint-color: #64b2e5;\n\n // links\n --link-color: #388bff;\n --link-color-hover: #5e9ffa;\n --subtle-link-color: #e6e6ff;\n --subtle-link-hover: #d1d1ff;\n\n // popup notes\n --popup-notes-bg: white;\n --popup-notes-color: #333;\n\n // buttons\n --btn-border-color: #7777;\n --btn-hover-border-color: #777;\n --btn-feature-bg: #0a4972;\n --btn-feature-hover-bg: #176699;\n --btn-feature-border-color: #1e618d;\n --btn-featur-hover-border-color: #85a5ba;\n --btn-danger-hover-color: white;\n --btn-go-bg: #0b5831;\n --btn-go-hover-bg: #0b5831;\n --btn-go-color: #fff;\n\n // forms\n --forms-bg: #05141f99;\n --form-input-bg: #0009;\n --form-input-border: #555;\n --form-input-border-focus: #4271ce;\n --form-input-bg-active: #27278d;\n --form-opt-selected-bg: #fff1;\n --form-selected-tab-bg: #39447c;\n\n // market view\n --indicator-good: #29bb77;\n --buy-color: #29bb77;\n --sell-color: #e95e5e;\n --market-buygreen-bg: #29bb7799;\n --market-sellred-bg: #e95e5e99;\n --market-sell-color: #e95e5e;\n --market-btn-color: #aaa;\n --market-btn-selected-color: #eee;\n --market-markettab-selected-bg: #fff1;\n --market-orderopt-bg: #0001;\n --market-numorders-bg: #141488;\n\n // loader\n --loader-bg: #13202b77;\n\n // logo\n --dex-url: url(\"/img/softened-icon-dark.png\");\n}\n\n.greyscale {\n filter: grayscale(1);\n}\n\n.blurry-bg {\n -webkit-backdrop-filter: blur(4px);\n backdrop-filter: blur(4px);\n}\n\n.body-bg {\n background-color: var(--body-bg);\n}\n\n.section-bg {\n background-color: var(--section-bg);\n}\n\n.text-good {\n color: var(--indicator-good);\n}\n","$sans: \"source-sans\", sans-serif;\n$demi-sans: \"demi-sans\", sans-serif;\n$mono: \"mono\", monospace;\n\n/* fonts */\n@font-face {\n font-family: \"source-sans\";\n src:\n url(\"/font/source-sans-pro-v9-latin-regular.woff\") format(\"woff\"),\n url(\"/font/source-sans-pro-v9-latin-regular.svg\") format(\"svg\");\n font-weight: normal;\n font-style: normal;\n}\n\n/* fonts */\n@font-face {\n font-family: \"demi-sans\";\n src:\n url(\"/font/source-sans-pro-semibold.woff\") format(\"woff\"),\n url(\"/font/source-sans-pro-semibold.svg\") format(\"svg\");\n font-weight: bolder;\n font-style: normal;\n}\n\n@font-face {\n font-family: \"mono\";\n src:\n url(\"/font/inconsolata-v15-latin-regular.woff\") format(\"woff\"),\n url(\"/font/inconsolata-v15-latin-regular.svg\") format(\"svg\");\n font-weight: normal;\n font-style: normal;\n}\n\n.fs8 {\n font-size: 8px;\n}\n\n.fs10 {\n font-size: 10px;\n}\n\n.fs11 {\n font-size: 11px;\n}\n\n.fs12 {\n font-size: 12px;\n}\n\n.fs13 {\n font-size: 13px;\n}\n\n.fs14 {\n font-size: 14px;\n}\n\n.fs15 {\n font-size: 15px;\n}\n\n.fs16 {\n font-size: 16px;\n}\n\n.fs17 {\n font-size: 17px;\n}\n\n.fs18 {\n font-size: 18px;\n}\n\n.fs20 {\n font-size: 20px;\n}\n\n.fs22 {\n font-size: 22px;\n}\n\n.fs24 {\n font-size: 24px;\n}\n\n.fs26 {\n font-size: 24px;\n}\n\n.fs28 {\n font-size: 28px;\n}\n\n.fs32 {\n font-size: 32px;\n}\n\n.fs35 {\n font-size: 35px;\n}\n\n.fs50 {\n font-size: 50px;\n}\n\n.demi {\n font-family: $demi-sans;\n}\n\n.mono {\n font-family: $mono;\n}\n\n.sans {\n font-family: $sans;\n}\n\n.bold {\n font-weight: bold;\n}\n",".flex-grow-1 {\n flex-grow: 1;\n}\n\n.flex-center {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.flex-stretch-column {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n}\n\n.flex-wrap {\n flex-wrap: wrap;\n}\n\n.text-nowrap {\n white-space: nowrap;\n}\n\n.position-relative {\n position: relative;\n}\n\n.position-absolute {\n position: absolute;\n}\n\n.hoverbg:hover {\n background-color: var(--tertiary-bg);\n}\n\n.invisible {\n visibility: hidden;\n}\n\n.stylish-overflow {\n @include stylish-overflow;\n\n &.hoveronly:not(:hover) {\n scrollbar-color: transparent transparent;\n\n &::-webkit-scrollbar-track {\n background-color: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: transparent;\n border-radius: 4px;\n }\n }\n\n &.overflow-x-hidden {\n overflow-x: hidden;\n }\n}\n\n.hidden-overflow {\n @include hidden-overflow;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n\n.ease-color {\n transition: color 1s ease;\n}\n\n.mw-375 {\n max-width: 375px;\n}\n\n.mw-425 {\n max-width: 425px;\n}\n\n.max-h-100 {\n max-height: 100%;\n}\n\n.d-hide {\n display: none !important;\n}\n\n.buycolor {\n color: var(--buy-color);\n}\n\n.sellcolor {\n color: var(--sell-color);\n}\n\n.grey {\n color: var(--text-grey);\n}\n\n.rounded3 {\n border-radius: 3px;\n}\n\nhr.dashed {\n @include border-top(2px, dashed);\n}\n\n\nimg.token-parent {\n width: 0.7em;\n height: 0.7em;\n position: relative;\n top: -0.4em;\n}\n\nsup.token-parent {\n font-size: 0.6em;\n position: relative;\n top: -0.6em;\n}\n\n.preline {\n white-space: pre-line;\n}\n\n.vscroll {\n @extend .stylish-overflow;\n\n max-width: 100%;\n overflow-x: hidden;\n}\n\n.pointer {\n cursor: pointer !important;\n}\n\n.underline {\n text-decoration: underline;\n}\n\n.plainlink {\n color: inherit;\n}\n\n.ico-info {\n margin-left: 0.25rem;\n}\n\n.subtlelink,\n.subtlelink:visited {\n text-decoration: none;\n\n // TODO this color is almost identical to the default body color, with text-decoration: none\n // the link isn't visible. Consider using a different shade.\n // color: var(--subtle-link-color);\n &:hover {\n text-decoration: underline !important;\n // color: var(--subtle-link-hover-color);\n cursor: pointer;\n }\n}\n\n.word-break-all {\n word-break: break-all;\n user-select: all;\n}\n\n.lh1 {\n line-height: 1;\n}\n\n.fill-abs {\n @include fill-abs;\n}\n\n.min-fit {\n min-height: fit-content;\n}\n\ndiv.clear {\n opacity: 0; // Set by animation upon initial loading.\n}\n\n\n.overflow-y-auto {\n overflow-y: auto;\n}\n\n.overflow-y-hidden {\n overflow-y: hidden;\n}\n\n.overflow-x-hidden,\n.stylish-overflow.overflow-x-hidden {\n overflow-x: hidden;\n}\n\n.user-select-all {\n user-select: all;\n}\n\n.overflow-ellipsis {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.user-select-none {\n user-select: none;\n}\n\n.text-danger {\n color: var(--text-danger);\n}\n\n.text-warning {\n color: var(--text-warning);\n}\n\n.text-buycolor {\n color: var(--buy-color);\n}\n\n.text-sellcolor {\n color: var(--sell-color);\n}\n","@use 'sass:map';\n\n@mixin stylish-overflow {\n overflow: auto;\n scrollbar-width: thin;\n scrollbar-color: #7774 #7771;\n\n /* Works on Chrome/Edge/Safari */\n &::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n\n &::-webkit-scrollbar-track {\n background-color: var(--tertiary-bg);\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: var(--tertiary-bg);\n border-radius: 4px;\n }\n}\n\n@mixin hidden-overflow {\n overflow: auto;\n scrollbar-width: none; /* Firefox */\n\n &::-webkit-scrollbar {\n display: none; /* Safari and Chrome */\n }\n}\n\n@mixin fill-abs {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n}\n\n@mixin border($width: 1px, $style: solid, $color: var(--border-color)) {\n border: $width $style $color;\n}\n\n@mixin border-top($width: 1px, $style: solid, $color: var(--border-color)) {\n border-top: $width $style $color;\n}\n\n@mixin border-bottom($width: 1px, $style: solid, $color: var(--border-color)) {\n border-bottom: $width $style $color;\n}\n\n@mixin border-left($width: 1px, $style: solid, $color: var(--border-color)) {\n border-left: $width $style $color;\n}\n\n@mixin border-right($width: 1px, $style: solid, $color: var(--border-color)) {\n border-right: $width $style $color;\n}\n\n","/* icons */\n\n@font-face {\n font-family: \"icomoon\";\n src:\n url(\"/font/icomoon.ttf?u8i98qq\") format(\"truetype\"),\n url(\"/font/icomoon.woff?u8i98qq\") format(\"woff\"),\n url(\"/font/icomoon.svg?u8i98qq#icomoon\") format(\"svg\");\n font-weight: normal;\n font-style: normal;\n}\n\n[class^=\"ico-\"],\n[class*=\" ico-\"] {\n /* use !important to prevent issues with browser extensions that change fonts */\n font-family: \"icomoon\", monospace !important;\n speak: none;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n\n /* Better Font Rendering =========== */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.micro-icon {\n height: 15px;\n width: 15px;\n}\n\n.mini-icon {\n height: 20px;\n width: 20px;\n}\n\n.small-icon {\n height: 25px;\n width: 25px;\n}\n\n.medium-icon {\n height: 30px;\n width: 30px;\n}\n\n.large-icon {\n height: 40px;\n width: 40px;\n}\n\n.enourmous-icon {\n height: 50px;\n width: 50px;\n}\n\n.ico-spinner::before {\n content: \"\\e97b\";\n}\n\n.ico-settings::before {\n content: \"\\e995\";\n}\n\n.ico-plus::before {\n content: \"\\ea0a\";\n}\n\n.ico-minus::before {\n content: \"\\ea0b\";\n}\n\n.ico-check::before {\n content: \"\\ea10\";\n display: inline-block;\n color: var(--buy-color);\n}\n\n.ico-bell::before {\n content: \"\\e900\";\n}\n\n.ico-locked::before {\n content: \"\\e98f\";\n}\n\n.ico-unlocked::before {\n content: \"\\e990\";\n}\n\n.ico-sleeping::before {\n content: \"\\e901\";\n}\n\n.ico-cross::before {\n content: \"\\e902\";\n}\n\n.ico-profile::before {\n content: \"\\e903\";\n}\n\n.ico-disconnected::before {\n content: \"\\e904\";\n}\n\n.ico-search::before {\n content: \"\\e905\";\n}\n\n.ico-expired::before {\n content: \"\\e906\";\n}\n\n.ico-info::before {\n content: \"\\e907\";\n}\n\n.ico-textfile::before {\n content: \"\\e908\";\n}\n\n.ico-open::before {\n content: \"\\e909\";\n}\n\n.ico-sync::before {\n content: \"\\e90a\";\n}\n\n.ico-target::before {\n content: \"\\e90b\";\n}\n\n.ico-arrowright::before {\n content: \"\\e90c\";\n}\n\n.ico-arrowdown::before {\n content: \"\\e90c\";\n display: inline-block;\n transform: rotate(90deg);\n}\n\n.ico-arrowleft::before {\n content: \"\\e90c\";\n display: inline-block;\n transform: rotate(180deg);\n}\n\n.ico-wide-headed-left-arrow::before {\n content: \"\\e919\";\n display: inline-block;\n}\n\n.ico-arrowup::before {\n content: \"\\e90c\";\n display: inline-block;\n transform: rotate(-90deg);\n}\n\n.ico-checkbox::before {\n content: \"\\e90d\";\n}\n\n.ico-connection::before {\n content: \"\\e90e\";\n}\n\n.ico-rocket::before {\n content: \"\\e90f\";\n}\n\n.ico-copy::before {\n content: \"\\e910\";\n}\n\n.ico-qrcode::before {\n content: \"\\e911\";\n}\n\n.ico-send::before {\n content: \"\\e912\";\n}\n\n.ico-exchange::before {\n content: \"\\e913\";\n}\n\n.ico-pause::before {\n content: \"\\e914\";\n}\n\n.ico-hamburger::before {\n content: \"\\e915\";\n}\n\n.ico-barchart::before {\n content: \"\\e916\";\n}\n\n.ico-edit::before {\n content: \"\\e917\";\n}\n\n.ico-ticket::before {\n content: \"\\e918\";\n}\n\n.ico-robot::before {\n content: \"\\e91a\";\n}\n\n.ico-secretagent::before {\n content: \"\\e91b\";\n}\n\n.ico-lever::before {\n content: \"\\e91c\";\n}\n","// Reusable components and styles \n@import \"~bootstrap/scss/mixins\";\n@import \"mixins\";\n\n\nbutton {\n background-color: transparent;\n border: 1px solid var(--btn-border-color);\n border-radius: 5px;\n outline: none;\n padding: 0.375rem 0.75rem;\n user-select: none;\n font-size: 1rem;\n color: var(--text-color);\n white-space: nowrap;\n\n &:focus {\n outline: none;\n }\n\n &:hover {\n text-decoration: none;\n border-color: var(--btn-hover-border-color);\n background-color: #7772;\n }\n\n &.small {\n padding: 0.25rem 0.5rem;\n font-size: .9rem;\n }\n\n &.large {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n }\n\n &.feature {\n background-color: var(--btn-feature-bg);\n border-color: var(--btn-feature-border-color);\n\n &:hover {\n background-color: var(--btn-feature-hover-bg);\n border-color: var(--btn-featur-hover-border-color);\n }\n }\n\n &.danger {\n border-color: var(--text-danger);\n color: var(--text-danger);\n\n &:hover {\n background-color: var(--text-danger);\n color: var(--btn-danger-hover-color);\n }\n }\n\n &.warning {\n border-color: var(--text-warning);\n color: var(--text-warning);\n\n &:hover {\n background-color: var(--text-warning);\n color: var(--btn-danger-hover-color);\n }\n }\n\n &.go {\n background-color: var(--btn-go-bg);\n color: var(--btn-go-color);\n\n &:hover {\n background-color: var(--btn-go-hover-bg);\n }\n }\n}\n\n// tables\ntable {\n color: var(--text-color);\n border-collapse: collapse;\n width: 100%;\n\n .table-group-divider {\n border-color: var(--border-color)\n }\n\n &.px-0 {\n th,\n td {\n &:last-child,\n &:first-child {\n padding-left: 0;\n padding-right: 0;\n }\n }\n\n }\n \n th,\n td {\n padding: 0.5rem;\n\n &:last-child:not(:first-child) {\n text-align: right;\n }\n\n &.no-stretch {\n width: 0;\n }\n }\n\n &.row-border {\n tbody {\n border-bottom: 1px solid var(--border-color);\n\n tr {\n border-top: 1px solid var(--border-color);\n }\n }\n }\n\n &.cell-border {\n th,\n td {\n border: 1px solid var(--border-color);\n }\n }\n\n &.nopadding {\n td {\n padding: 0;\n }\n }\n\n &.compact {\n th,\n td {\n padding: 0.25rem;\n }\n }\n\n &.row-hover {\n tr:hover {\n background-color: var(--tertiary-bg);\n }\n }\n\n &.striped {\n tr:nth-of-type(even) {\n background-color: #7772;\n }\n }\n}\n\na {\n color: var(--link-color);\n\n &:hover {\n color: var(--link-color-hover);\n }\n}\n\n@include media-breakpoint-up(md) {\n table#walletInfoTable {\n width: auto;\n }\n}\n\ntable.reg-asset-markets {\n @extend .stylish-overflow;\n\n display: block;\n max-height: 120px;\n line-height: 1.15;\n overflow-y: hidden;\n margin-right: 8px;\n\n &:hover {\n overflow-y: auto;\n }\n\n tr {\n border: none;\n }\n\n th {\n font-weight: normal;\n font-size: 13px;\n }\n\n td {\n font-size: 14px;\n }\n\n th,\n td {\n padding: 1px 5px;\n }\n}\n\n.form-check-label {\n cursor: pointer;\n}\n\n.form-check-input[type=checkbox] {\n border: 1px solid var(--form-input-border);\n cursor: pointer;\n\n &:checked {\n background-color: var(--form-input-bg-active);\n }\n}\n\nselect {\n font-family: inherit;\n padding: 0.75rem 1rem;\n}\n\n// Hide number arrows.\n// Chrome, Safari, Edge, Opera\ninput::-webkit-outer-spin-button,\ninput::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n// Firefox\ninput[type=number] {\n -moz-appearance: textfield;\n}\n\nform.card button:hover {\n color: black;\n}\n\n// Remove red background for firefox on empty number input fields.\ninput:invalid {\n box-shadow: none;\n}\n\n.dashed {\n border-style: dashed;\n}\n\n.micro-icon {\n position: relative;\n}\n\n#tooltip {\n position: absolute;\n left: -10000px;\n z-index: 1000;\n padding: 3px 6px;\n max-width: 300px;\n font-size: 15px;\n border-radius: 4px;\n background-color: var(--section-bg);\n\n @include border;\n}\n\n.on-indicator {\n width: 15px;\n height: 15px;\n border-radius: 8px;\n\n &.on {\n background-color: var(--indicator-good);\n }\n\n &.off {\n background-color: #777;\n }\n}\n\n.border-left { // alias of .border-start\n border-left: 1px solid var(--border-color);\n}\n\n.border-right { // alias of .border-end\n border-right: 1px solid var(--border-color);\n}\n\ndiv[data-handler=dexsettings],\ndiv[data-handler=init],\ndiv[data-handler=login],\ndiv[data-handler=markets],\ndiv[data-handler=mm],\ndiv[data-handler=mmsettings],\ndiv[data-handler=order],\ndiv[data-handler=orders],\ndiv[data-handler=register],\ndiv[data-handler=settings],\ndiv[data-handler=mmlogs],\ndiv[data-handler=wallets] {\n #forms>form:not(.plain) {\n border-radius: 5px;\n\n @include border;\n\n background-color: var(--form-bg);\n box-shadow: 0 3px 6px #00000021, 0 2px 7px #00000041;\n }\n}\n\n.corner-button {\n position: absolute;\n top: 0;\n\n &.left {\n left: 0;\n }\n\n &.right {\n right: 0;\n }\n}\n","@import \"~bootstrap/scss/mixins\";\n@import \"mixins\";\n\n/* elements */\nhtml {\n height: 100%;\n}\n\nbody {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n background-color: var(--body-bg);\n color: var(--text-color);\n}\n\nheader#header {\n width: 100%;\n height: 70px;\n min-height: 70px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n z-index: 100;\n background-color: var(--section-bg);\n\n a,\n a:visited,\n a:hover,\n .plainlink,\n .plainlink:visited,\n .plainlink:hover {\n text-decoration: none;\n }\n\n .hoverbright:hover {\n color: var(--subtle-link-hover);\n }\n}\n\nsection {\n background-color: var(--section-bg);\n margin: 0.5rem 0;\n border: 1px solid var(--border-color);\n border-radius: 0.25rem;\n}\n\ndiv.main {\n display: flex;\n flex-grow: 1;\n min-height: 0;\n position: relative;\n}\n\ndiv.mainlinks {\n &>div,\n &>a {\n color: var(--text-color-secondary);\n padding: 0.5rem 0.75rem;\n }\n}\n\n@include media-breakpoint-up(md) {\n div.mainlinks>div,\n div.mainlinks>a {\n padding: 0.75rem 1rem;\n }\n}\n\n.spinner {\n animation: spin 2s infinite linear;\n\n &.fast {\n animation: spin 1s infinite linear;\n }\n}\n\ndiv.note-indicator {\n width: 6px;\n height: 6px;\n border-radius: 3px;\n\n &.good {\n background-color: var(--indicator-good);\n }\n\n &.bad {\n background-color: $danger;\n }\n\n &.warn {\n background-color: var(--text-warning);\n }\n}\n\n.z10 {\n z-index: 10;\n}\n\nspan.brand::before {\n content: \"Bison Wallet\";\n}\n\nimg.dex-logo {\n content: var(--dex-url);\n}\n\nimg.logo-square {\n content: url(\"/img/bison-square_50.png\");\n\n &.small {\n height: 25px;\n width: 25px;\n }\n}\n\nimg.logo-full {\n content: url(\"/img/bison-full_97x50.png\");\n\n &.small {\n height: 25px;\n width: 48.5px;\n }\n}\n\nbody.dex-branding {\n img.logo-square,\n img.logo-full {\n width: 50px;\n height: 50px;\n content: url(\"/img/softened-icon.png\");\n\n &.small {\n height: 25px;\n width: 25px;\n }\n\n &.micro-icon {\n height: 15px;\n width: 15px;\n }\n }\n\n &.dark img.logo-square,\n &.dark img.logo-full {\n content: url(\"/img/softened-icon-dark.png\");\n }\n\n span.brand::before {\n content: \"DCRDEX\";\n }\n}\n\n#noteIndicator {\n position: absolute;\n top: 0;\n left: 20px;\n font-size: 16px;\n line-height: 1;\n font-family: $demi-sans;\n font-weight: bold;\n z-index: 2;\n\n &.good {\n color: var(--indicator-good);\n }\n\n &.bad {\n color: $danger;\n }\n\n &.warn {\n color: var(--text-warning);\n }\n}\n\ndiv.popup-notes {\nalign-items: flex-end;\nborder-radius: 4px;\nbottom: 0;\ndisplay: flex;\nflex-direction: column;\nmax-width: 750px;\nposition: fixed;\nright: 5px;\nz-index: 1000;\n\n & > span {\n line-height: 1;\n max-width: 100%;\n display: inline-block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n background-color:var(--popup-notes-bg);\n color: var(--popup-notes-color);\n padding: 4px 10px;\n margin: 3px 0 0;\n }\n\n .note-indicator {\n margin-bottom: 2px;\n }\n}\n\n[data-unit] {\n color: var(--hint-color);\n}\n\n[data-unit-box] {\n cursor: default;\n position: relative;\n overflow: visible;\n\n & > div { // unit choice menu\n left: -2rem;\n z-index: 10;\n color: var(--text-color);\n }\n}\n\n#profileBox,\n#noteBox {\n position: fixed;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n background-color: var(--section-bg);\n\n @include border;\n\n z-index: 100;\n min-width: 150px;\n line-height: 1.5;\n max-height: 90%;\n\n .icon {\n position: absolute;\n right: 15px;\n top: 8px;\n }\n\n .header {\n @include border-bottom;\n\n background-color: var(--section-bg);\n\n &>div {\n opacity: 0.5;\n cursor: pointer;\n\n &.active {\n opacity: 1;\n }\n }\n }\n\n &:not(.authed) .authed-only {\n display: none !important;\n }\n}\n\n#noteBox {\n width: 425px;\n\n div.note.firstview {\n background-color: var(--tertiary-bg);\n }\n\n div.note:not(:last-child) {\n @include border-bottom;\n }\n}\n\n#profileBox {\n min-width: 250px;\n}\n\n#loader {\n background-color: var(--body-bg-lower-opacity);\n}\n\n#requiredActions {\n position: absolute;\n bottom: 0;\n left: 0;\n z-index: 98;\n\n & > div {\n background-color: var(--body-bg);\n border: 3px solid var(--border-color);\n }\n}\n\n@include media-breakpoint-up(sm) {\n section {\n margin: 0.5rem;\n }\n}\n\n@include media-breakpoint-up(lg) {\n section,\n .w-lg-auto {\n width: auto;\n }\n}","label {\n margin-bottom: 0.25rem;\n cursor: pointer;\n}\n\ninput[type=text],\ninput[type=date],\ninput[type=password],\ninput[type=number],\ninput[type=url],\ntextarea {\n display: block;\n width: 100%;\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--form-input-border);\n border-radius: 5px;\n background-color: var(--form-input-bg);\n color: var(--text-color);\n\n &:focus {\n border-color: var(--form-input-border-focus);\n outline: none;\n }\n\n &.border-danger {\n border-color: var(--text-danger);\n }\n \n &.border-success {\n border-color: var(--indicator-good);\n }\n\n &.thin {\n width: 4rem;\n }\n\n &.micro {\n font-size: 14px;\n padding: 0 0.25rem;\n width: 3rem;\n\n &.wide {\n width: 5rem;\n }\n\n &.thin {\n width: 2rem;\n }\n }\n}\n\nselect {\n background-color: var(--form-input-bg) !important;\n}\n\n.form-select {\n color: var(--text-color);\n background-color: var(--form-input-bg);\n border: 1px solid var(--form-input-border);\n border-radius: 3px;\n\n &:focus {\n border-color: var(--form-input-border-focus);\n }\n}\n\n#regAssetForm {\n input[data-tmpl=tradingTierInput] {\n width: 3em;\n }\n\n .readygreen {\n color: #009931;\n }\n\n .setuporange {\n color: #b89400;\n }\n}\n\n#confirmRegForm {\n width: 425px;\n\n button.submit {\n width: auto;\n padding: 12px 30px;\n border-radius: 3px;\n opacity: 0.9;\n\n &:hover {\n opacity: 1;\n }\n }\n\n input.app-pass {\n display: inline-block;\n max-width: 250px;\n }\n\n div.reg-conf-msg {\n width: 100%;\n }\n\n div.borderright {\n border-right: 1px solid #777;\n }\n\n .mw50 {\n max-width: 50%;\n }\n}\n\n#newWalletForm {\n width: 425px;\n\n [data-tmpl=walletTypeTabs] {\n .wtab.selected {\n opacity: 1;\n cursor: default;\n background-color: var(--form-selected-tab-bg);\n }\n\n .wtab:not(.selected) {\n opacity: 0.8;\n cursor: pointer;\n\n &:hover {\n opacity: 1;\n }\n }\n }\n\n .one-bttn {\n display: inline-block;\n font-size: 22px;\n padding: 10px 25px;\n background-color: #0b5831;\n border-radius: 5px;\n animation: glow 1.5s infinite alternate;\n }\n\n .one-bttn:hover {\n background-color: #0c5f36;\n }\n\n @keyframes glow {\n from {\n box-shadow: 0 0 4px -3px #fff7;\n opacity: 0.95;\n }\n\n to {\n box-shadow: 0 0 4px 0 #fff7;\n opacity: 1;\n }\n }\n}\n\n.form-check-label {\n user-select: none;\n}\n\n#forms {\n @extend .stylish-overflow;\n @extend .flex-center;\n\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n padding: 25px 0;\n background-color: var(--forms-bg);\n backdrop-filter: blur(5px);\n z-index: 101;\n\n & > form {\n @extend .flex-stretch-column;\n\n box-sizing: content-box;\n margin: auto;\n position: relative;\n padding-bottom: 1rem;\n\n & > div {\n padding: 1rem 1rem 0;\n\n &.form-closer-unbound,\n &.form-closer {\n @extend .flex-center;\n @extend .hoverbg;\n\n cursor: pointer;\n line-height: 1;\n font-size: 0.8rem;\n padding: 0.75rem;\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1;\n\n span {\n opacity: 0.6;\n\n &:hover {\n opacity: 1;\n }\n }\n }\n }\n\n header {\n @extend .flex-center;\n\n padding: 1rem;\n line-height: 1;\n border-bottom: 1px solid var(--border-color);\n font-size: 1.6rem;\n }\n }\n}\n\ndiv[data-handler=init],\ndiv[data-handler=login],\ndiv[data-handler=register] {\n #forms {\n margin-top: 70px;\n z-index: 99;\n } \n}\n\n#walletWait {\n .icons {\n width: 25px;\n }\n\n .ico-check {\n color: #05a35a99;\n }\n}\n\n#dexAddrForm {\n .known-exchange {\n @extend .flex-center;\n\n font-size: 17px;\n padding: 5px 0;\n width: 100%;\n border: 1px solid #555;\n margin-bottom: 10px;\n border-radius: 3px;\n cursor: pointer;\n\n &:hover,\n &.selected {\n background-color: #7772;\n }\n }\n}\n\n#loginForm,\n#authorizeAccountImportForm,\n#disableAccountForm,\n#discoverAcctForm {\n width: 275px;\n}\n\n#changeAppPWForm,\n#resetAppPWForm,\n#dexAddrForm,\n#verifyForm,\n#deleteArchivedRecordsForm {\n width: 325px;\n}\n\n#appPWForm {\n width: 350px;\n}\n\n#sendForm,\n#vSendForm,\n#exportSeedAuth,\n#cancelForm,\n#quickConfigForm,\n#toggleWalletStatusConfirm,\n#walletWait {\n width: 375px;\n}\n\n#confirmRegistrationForm,\n#regAssetForm,\n#reconfigForm,\n#authorizeSeedDisplay,\n#seedBackupForm,\n#votingForm,\n#gameCodeForm {\n width: 425px;\n}\n\na[data-tmpl=walletCfgGuide] {\n color: inherit;\n text-decoration: none;\n}\n\n#deposit {\n #copyAlert {\n margin-left: 12px;\n position: absolute;\n }\n}\n\n.mini-slider {\n padding: 0.5rem 0;\n cursor: pointer;\n user-select: none;\n\n div[data-tmpl=color] {\n width: 100%;\n height: 0.2rem;\n background-color: #7777;\n position: relative;\n overflow: visible;\n\n \n\n & > div[data-tmpl=track] {\n position: absolute;\n left: 0.375rem; // keep the ball inside of the color\n right: 0.375rem;\n bottom: 0;\n top: 0;\n overflow: visible;\n\n & > div[data-tmpl=ball] {\n width: 0.75rem;\n height: 0.75rem;\n top: 0.1rem;\n border-radius: 1rem;\n background-color: var(--text-grey);\n position: absolute;\n transform: translate(-50%, -50%);\n cursor: pointer;\n }\n }\n }\n\n &.small {\n div[data-tmpl=color] {\n height: 0.125rem;\n\n & > div[data-tmpl=track] {\n left: 0.25rem;\n right: 0.25rem;\n \n & > div[data-tmpl=ball] {\n width: 0.5rem;\n height: 0.5rem;\n }\n }\n }\n }\n}\n\n.slider-container,\n.order-opt {\n border: 1px solid #424242;\n border-radius: 3px;\n padding: 4px;\n margin-top: 8px;\n\n & > div.disabled {\n opacity: 0.8;\n\n [data-tmpl=sliderBox] {\n cursor: default;\n\n .slider .slider-handle {\n background-color: #777b;\n }\n }\n }\n\n div.opt-check {\n width: 15px;\n height: 15px;\n border-radius: 7.5px;\n border: 2px solid #424242;\n margin-top: 5px;\n cursor: pointer;\n }\n\n .xy-range-input {\n width: 35px;\n font-size: 14px;\n height: 16px;\n }\n\n [data-tmpl=sliderBox] {\n cursor: pointer;\n\n .slider {\n margin: 10px 10px 5px;\n height: 2px;\n background-color: grey;\n position: relative;\n\n .slider-handle {\n position: absolute;\n height: 20px;\n width: 14px;\n top: -9px;\n border-radius: 7px;\n background-color: #2cce9c;\n border: 2px solid #424242;\n }\n }\n }\n}\n\ndiv[data-tmpl=scoreTray] {\n background-color: var(--buy-color);\n height: 12px;\n border-radius: 100px;\n overflow: hidden;\n\n div[data-tmpl=scoreWarn] {\n background-color: var(--sell-color);\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n }\n}\n\nspan[data-tmpl=scorePointer] {\n transform: translateX(-50%);\n\n span[data-tmpl=scoreData] {\n top: 0;\n bottom: 0;\n\n &.positive {\n right: calc(100% + 0.125rem);\n }\n\n &.negative {\n left: calc(100% + 0.125rem);\n }\n }\n}\n\n.penalty-marker {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 10%;\n width: 2px;\n z-index: 2;\n background-color: black;\n}\n\ndiv[data-handler=init] {\n .quickconfig-asset-logo {\n width: 25px;\n height: 25px;\n }\n}\n\n.anitoggle {\n width: 1.5rem;\n height: 0.9rem;\n border-radius: 0.45rem;\n background-color: #777a;\n cursor: pointer;\n\n &.on {\n background-color: var(--indicator-good);\n }\n\n & > div {\n position: relative;\n top: 0.1rem;\n left: 0.1rem;\n width: 0.7rem;\n height: 0.7rem;\n border-radius: 0.35rem;\n transition: left 0.5s;\n background-color: var(--section-bg);\n }\n\n &.on > div {\n left: 0.7rem;\n }\n\n &.big {\n width: 35px;\n height: 20px;\n border-radius: 10px;\n\n & > div {\n top: 2px;\n left: 2px;\n width: 16px;\n height: 16px;\n border-radius: 12px;\n }\n\n &.on > div {\n left: 17px;\n }\n }\n}\n\n.selectable.selected {\n border: 2px solid green;\n}\n\n.dynamicopts {\n display: flex;\n align-items: stretch;\n justify-content: space-between;\n flex-wrap: wrap;\n\n & > div {\n min-height: 55px;\n }\n\n & > div:not(.repeatable, [data-tmpl=checkbox]) {\n width: 47%;\n }\n}\n\n.hoveropaque {\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n#placementsBody td[data-tmpl=error] {\n max-width: 200px;\n}\n\nbody.dark {\n ::-webkit-calendar-picker-indicator {\n filter: invert(1);\n }\n\n #regAssetForm {\n div.reg-asset {\n .fader {\n background-image:\n linear-gradient(\n to bottom,\n #13202b00,\n #122739\n 90%\n );\n }\n\n &:not(.nohover):hover {\n .fader {\n background-image:\n linear-gradient(\n to bottom,\n #202c3500,\n #202c35\n 90%\n );\n }\n }\n }\n }\n}\n","@import \"mixins\";\n\ndiv[data-handler=markets] {\n .ordertable-wrap {\n width: 100%;\n\n &:first-child {\n @include border-bottom;\n }\n\n &:last-child {\n @include border-top;\n }\n\n tbody#sellRows {\n @include border-top;\n }\n }\n\n .orderbook {\n min-width: 225px;\n\n & > div:first-child { // buy orders\n order: 3;\n }\n\n & > div:nth-child(2) { // header\n order: 1;\n }\n\n & > div:last-child { // sell orders\n order: 2;\n }\n }\n\n .order-panel {\n min-width: 375px;\n\n #orderForm {\n input[type=number] {\n height: 30px;\n border-radius: 0;\n font-size: 14px;\n }\n\n input:focus {\n outline: none;\n }\n\n span.unitbox {\n position: absolute;\n font-size: 14px;\n font-weight: bold;\n right: 5px;\n top: 48%; // Looks better than 50 for some reason.\n transform: translateY(-50%);\n white-space: nowrap;\n }\n\n button {\n padding: 5px 25px;\n border: 1px solid #78787877;\n border-radius: 3px;\n background-color: var(--section-bg);\n color: var(--market-btn-color);\n\n &:disabled {\n opacity: 0.4;\n }\n }\n\n button:hover,\n button.selected {\n color: var(--market-btn-selected-color);\n }\n\n button.submit {\n color: var(--market-btn-selected-color);\n }\n\n button.selected,\n button.submit {\n &.buygreen-bg {\n background-color: var(--market-buygreen-bg);\n }\n\n &.sellred-bg {\n background-color: var(--market-sellred-bg);\n }\n }\n\n #orderPreview,\n .h21 {\n height: 21px;\n }\n }\n\n .ico-unlocked {\n color: $success;\n }\n\n .ico-disconnected {\n color: var(--text-warning);\n }\n }\n\n .market-chart {\n @extend .flex-center;\n\n flex-grow: 1;\n position: relative;\n min-width: 100px; // Letting it go to zero can be problematic, causing some major cpu during chart calcs\n min-height: 250px;\n\n canvas {\n position: absolute;\n left: 0;\n top: 0;\n user-select: none;\n }\n }\n\n #unreadyOrdersMsg {\n color: $danger;\n }\n\n .unready-user-order {\n background-color: #6e0909;\n }\n\n .user-order {\n &:not(:last-child) {\n border-bottom-style: none !important;\n }\n\n &:last-child .order-details {\n border-bottom-style: none !important;\n padding-bottom: 0;\n }\n\n .user-order-header {\n @extend .flex-center;\n\n padding: 5px 10px 5px 20px;\n font-size: 14px;\n position: relative;\n // border: 1px solid grey;\n\n .side-indicator {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 8px;\n\n &.buy {\n background-color: var(--buy-color);\n }\n\n &.sell {\n background-color: var(--market-sell-color);\n }\n\n &.inactive {\n opacity: 0.5;\n }\n }\n\n .active-indicator {\n height: 8px;\n border-radius: 4px;\n\n &.active {\n margin: 0 5px;\n width: 8px;\n background-color: var(--buy-color);\n }\n }\n }\n\n .order-details {\n margin-bottom: 25px;\n padding: 0 10px 10px;\n display: grid;\n grid-template-columns: 1fr 1fr 1fr 1fr;\n row-gap: 10px;\n column-gap: 5px;\n line-height: 1;\n\n .user-order-datum {\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n\n & > span:first-child {\n font-size: 12px;\n font-family: $demi-sans;\n color: grey;\n margin-bottom: 2px;\n }\n\n & > span:nth-child(2) {\n font-size: 14px;\n }\n\n &.full-span {\n grid-column: 1 / -1;\n }\n }\n }\n }\n\n .markettab {\n height: 30px;\n border-style: none;\n background-color: var(--section-bg);\n\n &.selected {\n background-color: var(--market-markettab-selected-bg);\n }\n }\n\n .numorders {\n background-color: var(--market-numorders-bg);\n padding: 1px 2px;\n }\n\n #leftMarketDock {\n position: absolute;\n display: flex;\n top: 0;\n left: 0;\n z-index: 2;\n min-height: -webkit-fill-available; // for webkit browsers\n background-color: var(--section-bg);\n\n &.default,\n &.stashed {\n display: none;\n }\n\n #searchBoxV1 {\n height: 55px;\n }\n\n &.stashed {\n display: none;\n }\n\n #marketSearchV1:focus {\n border: none;\n outline: none;\n }\n\n #marketSearchV1 {\n @extend .fill-abs;\n\n width: 100%; // firefox needs, for some reason\n z-index: 2;\n background-color: transparent;\n font-size: 25px;\n text-align: center;\n font-family: $demi-sans;\n font-variant: small-caps;\n border: none;\n\n & + .ico-search {\n z-index: 1;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translateX(-50%) translateY(-50%);\n opacity: 0.25;\n }\n\n &:hover + .ico-search {\n opacity: 0.5;\n }\n\n &:not(:placeholder-shown) + .ico-search,\n &:focus + .ico-search {\n display: none;\n }\n }\n\n #marketListV1 {\n height: 100%;\n min-width: 275px;\n\n & > div {\n .dexname {\n max-width: 60px;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n &.selected {\n background-color: #7773;\n }\n }\n }\n }\n\n #mainContent {\n display: flex;\n flex-direction: column;\n align-items: center;\n\n & > div,\n & > section {\n min-height: 500px;\n display: flex;\n\n &:first-child { // order book\n max-height: 1000px;\n order: 3;\n }\n\n &:nth-child(2) { // charts\n order: 1;\n }\n\n &:last-child { // order form, wallets, user orders\n order: 2;\n }\n }\n }\n\n #epochLine,\n #durBttnBox {\n position: absolute;\n left: 65px;\n top: 5px;\n background-color: var(--section-bg);\n z-index: 1;\n }\n\n #durBttnBox {\n .candle-dur-bttn {\n background-color: var(--section-bg);\n padding: 2px 4px;\n font-size: 14px;\n line-height: 1;\n margin: 0 2px;\n\n &:hover {\n background-color: #7777;\n }\n\n &:hover,\n &.selected {\n border-color: var(--text-warning);\n color: var(--text-warning);\n }\n }\n }\n\n #epochLine {\n @extend .flex-center;\n\n .epoch-line {\n display: inline-block;\n border-top: 3px dotted #626262;\n width: 25px;\n height: 0;\n margin-right: 5px;\n position: relative;\n top: 1px;\n }\n }\n\n #loaderMsg {\n color: #777;\n }\n\n #bondCreationPending {\n .title {\n font-weight: bold;\n margin-bottom: 5px;\n color: #9b8c09;\n }\n }\n\n #registrationStatus {\n .title {\n font-weight: bold;\n margin-bottom: 5px;\n }\n\n &.waiting {\n .title {\n color: #9b8c09;\n }\n }\n\n &.completed {\n .title {\n color: $success;\n }\n\n #regStatusMessage {\n display: none;\n }\n }\n\n &.error {\n .title {\n color: $danger;\n }\n }\n }\n\n #approveTokenForm {\n width: 450px;\n }\n\n #verifyForm {\n .echo-data span {\n margin: 0 5px;\n }\n\n .disclaimer {\n text-align: justify;\n }\n\n header {\n &.buygreen-bg {\n background-color: var(--market-buygreen-bg);\n }\n\n &.sellred-bg {\n background-color: var(--market-sellred-bg);\n }\n }\n\n button {\n &.buygreen-bg {\n background-color: var(--market-buygreen-bg);\n }\n\n &.sellred-bg {\n background-color: var(--market-sellred-bg);\n }\n }\n\n .loader {\n height: 40px;\n }\n\n .order-opt {\n opacity: 0.7;\n\n &:not(.selected) {\n cursor: pointer;\n }\n\n &.selected {\n opacity: 1;\n background-color: var(--form-opt-selected-bg);\n\n div.opt-check {\n background-color: $success;\n }\n }\n }\n }\n\n #vDetailPane {\n max-width: 425px;\n\n .indent {\n border-left: 2px solid var(--border-color);\n }\n\n table.fee-breakout {\n td {\n text-align: center;\n padding: 2px 5px;\n }\n }\n }\n\n\n #marketReopener {\n display: none;\n padding: 10px 0;\n position: absolute;\n top: 0;\n left: 0;\n background-color: var(--section-bg);\n z-index: 10;\n }\n\n #leftHider,\n #marketReopener {\n .ico-arrowleft,\n .ico-arrowright {\n transform: scaleX(0.5);\n opacity: 0.5;\n }\n\n &:hover .ico-arrowleft,\n &:hover .ico-arrowright {\n opacity: 1;\n }\n }\n}\n\n.market-stats {\n display: flex;\n margin: 0 5px;\n gap: 15px;\n\n .statgrid {\n display: grid;\n grid-template-columns: auto auto auto;\n }\n\n &.listopen .ico-arrowdown {\n display: none;\n }\n\n &:not(.listopen) .ico-arrowup {\n display: none;\n }\n}\n\n#headerSpace .market-stats {\n display: none;\n}\n\n\n#recentMatchesBox {\n @extend .stylish-overflow;\n\n max-height: 350px;\n}\n\n#recentMatchesTable {\n th {\n align-items: center;\n\n &:hover {\n opacity: 0.7;\n }\n\n .ico-arrowdown {\n display: inline-block;\n visibility: hidden;\n vertical-align: middle;\n font-size: 10px;\n margin-left: 5px;\n }\n\n &.sorted-dsc {\n .ico-arrowdown {\n visibility: visible;\n }\n }\n\n &.sorted-asc {\n .ico-arrowdown {\n visibility: visible;\n transform: rotate(180deg);\n }\n }\n }\n}\n\n@include media-breakpoint-up(xl) {\n #main .market-stats {\n display: none;\n border-top: none;\n }\n\n #headerSpace .market-stats {\n display: flex;\n border-bottom: none !important;\n }\n\n div[data-handler=markets] #leftMarketDock {\n position: relative;\n\n &.default {\n display: flex;\n }\n }\n}\n\n@include media-breakpoint-up(lg) {\n div[data-handler=markets] {\n #mainContent {\n @include fill-abs;\n\n overflow: hidden;\n flex-direction: row;\n align-items: stretch;\n\n & > section,\n & > div {\n min-height: none;\n display: flex;\n\n &:nth-child(n) { // need nth-child for specificity\n min-height: auto;\n }\n\n &:first-child { // order book\n order: 1;\n }\n\n &:nth-child(2) { // charts\n order: 2;\n }\n\n &:last-child { // order form, wallets, user orders\n order: 3;\n }\n }\n }\n\n .ordertable-wrap {\n height: calc(50% - 15px);\n display: flex;\n\n &.reversible {\n flex-direction: column-reverse;\n }\n\n tbody {\n display: flex;\n align-items: stretch;\n }\n\n tbody#sellRows {\n flex-direction: column-reverse;\n border-top: none;\n }\n\n tbody#buyRows {\n flex-direction: column;\n }\n }\n\n .orderbook {\n width: auto;\n\n & > div:first-child { // sell orders\n order: 1;\n }\n\n & > div:nth-child(2) { // header\n order: 2;\n }\n\n & > div:last-child { // buy orders\n order: 3;\n }\n }\n\n .order-panel {\n & > div {\n @include fill-abs;\n @include stylish-overflow;\n\n height: 100%;\n overflow-x: hidden;\n }\n }\n\n #leftMarketDock.stashed + #marketReopener {\n display: block;\n }\n }\n\n #recentMatchesBox {\n overflow: visible;\n max-height: none;\n border-bottom: none;\n }\n\n #candlesLegend,\n #depthLegend {\n z-index: 10;\n position: absolute;\n top: 0;\n right: 0;\n background-color: var(--section-bg);\n }\n}\n\n.user-order-floaty-menu {\n position: absolute;\n display: flex;\n align-items: center;\n z-index: 5;\n border-style: none solid solid;\n border-width: 0 2px 2px 1px;\n border-color: var(--border-color);\n background-color: var(--section-bg);\n cursor: pointer;\n overflow: hidden;\n\n & > span,\n & > a {\n margin: 0 5px;\n padding-right: 10px;\n padding-left: 10px;\n\n &:hover {\n background-color: #7775;\n }\n }\n}\n\n.bot-problems-section {\n background-color: #f00a;\n margin-top: 2px;\n margin-bottom: 2px;\n padding-left: 2px;\n border-radius: 5px;\n}\n",".walletspage {\n .ico-unlocked {\n color: var(--indicator-good);\n }\n\n .market-select-logo {\n width: 20px;\n height: 20px;\n }\n\n .short-host {\n text-overflow: ellipsis;\n max-width: 175px;\n }\n\n .mw-90p {\n min-width: 90%;\n }\n\n #recoverWalletConfirm,\n #confirmForce,\n #toggleWalletStatusConfirm {\n width: 400px;\n }\n\n #content {\n flex-direction: column;\n }\n\n #assetSelect {\n flex-direction: row;\n\n .icon-select {\n cursor: pointer;\n min-height: fit-content;\n\n img[data-tmpl=img] {\n width: 30px;\n height: 30px;\n }\n\n img[data-tmpl=parentImg] {\n position: absolute;\n left: 15px;\n bottom: 15px;\n width: 20px;\n height: 20px;\n border-radius: 10px;\n border: 3px solid var(--section-bg);\n background-color: var(--section-bg);\n }\n\n &.selected,\n &:hover {\n background-color: var(--body-bg);\n // border: 1px solid var(--border-color);\n opacity: 1;\n\n img[data-tmpl=parentImg] {\n border: 3px solid var(--body-bg);\n background-color: var(--section-bg);\n }\n }\n }\n\n .icon-select.nowallet {\n opacity: 0.7;\n\n [data-tmpl=balance] {\n display: none;\n }\n }\n }\n\n table#balanceTable {\n td {\n line-height: 1;\n }\n\n tr.itemized > td {\n padding-bottom: 0.25rem;\n }\n\n tr:not(.sub, :first-child) td {\n padding-top: 0.5rem;\n }\n\n tr {\n font-size: 1.1rem;\n }\n\n tr.sub {\n font-size: 0.9rem;\n\n &.last > td:first-child::before {\n content: '└─ ',\n }\n\n & > td:first-child::before {\n content: '├─ ',\n }\n\n & > td:last-child {\n @include border-right;\n\n padding-right: 0.5rem;\n }\n }\n }\n\n #walletInfo {\n border-left: none;\n\n table#walletInfoTable {\n td {\n padding: 2px 5px 2px 0;\n line-height: 1;\n\n &:last-child {\n text-align: right;\n padding-left: 1rem;\n }\n }\n }\n }\n\n #earlierTxs, #txViewBlockExplorer {\n text-decoration: underline;\n cursor: pointer;\n }\n\n #checkmarkBox {\n height: 100px;\n }\n\n #walletDetailsBox {\n // Asset name and balance sizes for mobile. Redefined for > sm below.\n #assetLogo {\n width: 30px;\n height: 30px;\n }\n\n #assetName {\n font-size: 30px;\n }\n\n #balance {\n font-size: 20px;\n }\n\n #balanceUnit {\n font-size: 17px;\n }\n\n #fiatBalanceBox {\n font-size: 13px;\n }\n\n #tokenParentLogo {\n width: 18px;\n height: 18px;\n }\n\n #contractAddress {\n opacity: 0.4;\n }\n }\n\n .peers-table-icon {\n padding-left: 30%;\n }\n\n #vspDisplay {\n #vspEditIcon {\n display: none;\n }\n\n &:hover #vspEditIcon {\n display: inline;\n }\n }\n\n .scrollsmall {\n @include stylish-overflow;\n }\n\n .positive-tx {\n color: var(--indicator-good);\n }\n\n .negative-tx {\n color: $danger;\n }\n}\n\n@include media-breakpoint-up(xl) {\n .scrollsmall {\n overflow: hidden;\n }\n\n .column {\n @include hidden-overflow;\n @include fill-abs;\n }\n}\n\n@include media-breakpoint-up(lg) {\n .fill-abs-lg {\n @include fill-abs;\n }\n\n .stylish-overflow-lg {\n @include stylish-overflow;\n }\n\n .walletspage {\n #walletDetailsBox {\n border-bottom: none !important;\n }\n }\n\n .flex-wrap-lg {\n flex-wrap: wrap;\n }\n\n #purchaseTicketsErrBox {\n background-color: var(--section-bg);\n }\n}\n\n@include media-breakpoint-up(sm) {\n .walletspage {\n #walletDetailsBox {\n #assetLogo {\n width: 40px;\n height: 40px;\n }\n\n #assetName {\n font-size: 40px;\n }\n\n #balance {\n font-size: 28px;\n }\n\n #balanceUnit {\n font-size: 20px;\n }\n\n #fiatBalanceBox {\n font-size: 15px;\n }\n }\n\n #content {\n flex-direction: row;\n }\n\n #assetSelect {\n flex-direction: column;\n overflow-y: auto;\n\n .icon-select {\n padding: 15px;\n\n img[data-tmpl=img] {\n width: 40px;\n height: 40px;\n }\n\n img[data-tmpl=parentImg] {\n left: 20px;\n bottom: 20px;\n width: 28px;\n height: 28px;\n border-radius: 15px;\n }\n }\n }\n }\n}\n\n@include media-breakpoint-up(md) {\n .walletspage {\n #sendReceive {\n border-bottom: none;\n }\n }\n}\n\n#restoreWalletInfo,\n#exportWalletAuth,\n#unapproveTokenForm {\n width: 450px;\n}\n\n#txDetails {\n width: 450px;\n}\n\n#submitReconfig[disabled] {\n cursor: not-allowed;\n}\n\n\n",".filter-display {\n border-radius: 3px;\n font-size: 16px;\n font-weight: bold;\n cursor: pointer;\n}\n\n.filter-opts {\n position: relative;\n max-width: 250px;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n","div.order-datum {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n justify-content: start;\n text-align: center;\n font-size: 15px;\n\n div:first-child {\n font-family: $demi-sans;\n background-color: var(--tertiary-bg);\n }\n}\n\ndiv.match-header {\n background-color: var(--tertiary-bg);\n}\n\ndiv.match-card {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n font-size: 14px;\n}\n\n.match-data-label {\n opacity: 0.5;\n font-family: $demi-sans;\n}\n\n#accelerateForm {\n width: 500px;\n}\n","div.settings {\n min-width: 375px;\n}\n","div[data-handler=mmsettings],\ndiv[data-handler=mmarchives],\ndiv[data-handler=mmlogs],\ndiv[data-handler=mm] {\n #gapStrategySelect {\n width: 300px;\n }\n\n .gap-factor-input,\n .lots-input {\n max-width: 75px;\n }\n\n [data-tmpl=value].wide {\n width: 3rem;\n }\n\n .ico-arrowup.ml2px {\n margin-left: 2px;\n }\n\n .pt-pt5 {\n padding-top: 0.125rem;\n }\n\n #profitInput {\n width: 70px;\n }\n\n .bot-type-selector {\n @include border;\n @extend .rounded3;\n\n display: flex;\n flex-direction: column;\n align-items: stretch;\n user-select: none;\n\n &.disabled {\n opacity: 0.5;\n }\n\n &:not(.disabled) {\n @extend .hoverbg;\n\n cursor: pointer;\n\n &.selected {\n outline: 2px solid $success;\n background-color: #7772;\n }\n }\n }\n\n .bot-problems-section {\n background-color: #f00a;\n margin-top: 2px;\n margin-bottom: 2px;\n padding-left: 2px;\n border-radius: 5px;\n }\n\n #marketFilterIcon {\n position: absolute;\n left: 10px;\n top: 50%;\n transform: translateY(-50%);\n opacity: 0.5;\n }\n\n #botTypeForm {\n min-width: 375px;\n }\n\n #cexSelection {\n .cex-selector {\n user-select: none;\n\n &.configured:not(.selected) {\n opacity: 0.8;\n }\n }\n\n &.disabled {\n .cex-selector.configured {\n opacity: 0.5;\n }\n\n .cex-selector:not(.configured) {\n cursor: pointer;\n }\n }\n\n &:not(.disabled) {\n .cex-selector {\n @extend .hoverbg;\n\n cursor: pointer;\n\n &.selected {\n border-color: $success !important;\n border-width: 2px !important;\n background-color: #7772 !important;\n }\n }\n }\n\n .reconfig {\n position: absolute;\n top: 0;\n right: 0;\n }\n }\n\n #quickConfig input[type=number] {\n width: 100px;\n }\n\n #levelSpacingBox.disabled {\n opacity: 0.5;\n }\n\n #placementsChart,\n [data-tmpl=placementsChart] {\n height: 100px;\n\n canvas {\n @extend .fill-abs;\n }\n }\n\n #buyPlacementsBox,\n #sellPlacementsBox {\n .ico-cross {\n color: var(--text-danger);\n }\n\n .ico-plus {\n color: var(--btn-go-bg);\n }\n }\n\n #noBots {\n .ico-robot {\n font-size: 80px;\n opacity: 0.7;\n }\n }\n\n #dexOrderDetailsForm,\n #cexOrderDetailsForm,\n #depositDetailsForm,\n #withdrawalDetailsForm {\n min-width: 400px;\n }\n\n .allocation-grid {\n display: grid;\n grid-template-columns: 1fr auto auto;\n\n .second {\n grid-column: 2;\n }\n\n .third {\n grid-column: 3;\n }\n }\n}"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"../dist/style.css","mappings":"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CA,oBACA,0BACA,oBACA,qBAGA,qBACA,yBACA,+BACA,+BACA,6BACA,4BACA,yBAGA,oBACA,qBACA,+BACA,8BACA,4BACA,wBACA,iCACA,qCACA,2BACA,8BACA,sBAGA,sCAGA,WAIF,iBAEE,kCACA,qBACA,kBACA,wBACA,qBACA,+BACA,sBACA,qBACA,iBACA,uBACA,qBACA,qBAGA,2BACA,4BACA,4BACA,sBAGA,yBACA,yBAGA,8BACA,yBACA,+BACA,mCACA,wCACA,8BACA,oBACA,0BACA,oBACA,qBAGA,sBACA,yBACA,kCACA,+BACA,6BACA,+BACA,yBAGA,oBACA,qBACA,+BACA,8BACA,4BACA,wBACA,iCACA,qCACA,2BACA,8BACA,sBAGA,2CAGA,YAGF,mBACE,YAGF,iCACE,0BACA,UAGF,+BACE,aAGF,kCACE,YAGF,2BACE,YCpJF,uBACE,CAIA,kBAFE,eAEF,CAJA,iIAKA,YAIF,qBACE,CAIA,kBAFE,kBAEF,CAJA,iHAKA,YAGF,gBACE,CAIA,kBAFE,eAEF,CAJA,2HAKA,MAGF,aACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,CAIA,YAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,cACE,OAGF,gCAxGY,OA4GZ,0BA3GO,OA+GP,kCAjHO,OAqHP,eACE,cCtHF,WACE,2QAKA,mBAFF,YACE,uBAEA,kCAKA,oBAFF,YACE,sBAEA,YAGF,cACE,cAGF,kBACE,oBAGF,iBACE,oBAGF,iBACE,gpBAGF,mCACE,YAGF,iBACE,6EAGF,aCrCE,CACA,wDADA,oBAEA,4KAIE,WADF,SAEE,0MAGF,mCACE,0MAGF,mCACE,kBACA,2LDwBF,uCACE,wTAEA,4BACE,wTAGF,4BACE,kBACA,uKAIJ,iBACE,kBAIJ,aCrCE,qBACA,qCAEA,YACE,iBDqCJ,GACE,sBACE,IAGF,uBACE,cAIJ,wBACE,SAGF,eACE,SAGF,eACE,YAGF,eACE,SAGF,sBACE,WAGF,sBACE,YAGF,uBACE,OAGF,sBACE,+LAGF,iBACE,WAGF,yCClEE,kBDwEA,WACA,kBACA,WAHF,UAIE,kBAGF,cACE,kBACA,UACA,UAGF,oBACE,UAGF,cAGE,kBACA,UAGF,wBACE,YAGF,yBACE,YAGF,aACE,WAGF,kBACE,iCAGF,oBAEE,6CAME,eADF,mCAGE,iBAKF,gBADF,oBAEE,MAGF,aACE,igBC9IA,QACA,OACA,CD+IF,iBClJE,CAGA,QAHA,KAIA,UDkJF,sBACE,WAGF,SACE,kBAIF,eACE,oBAGF,iBACE,+JAGF,iBAEE,kBAGF,eACE,oBAGF,eACE,uBACA,mBAGF,gBACE,cAGF,wBACE,eAGF,yBACE,gBAGF,sBACE,iBAGF,uBACE,YErOF,mBACE,CAKA,kBAHE,eAGF,CALA,yJAMA,gCAMA,UACA,CAKA,kCAGA,mCAZF,uCAGE,CACA,iBACA,CACA,mBACA,CAFA,eACA,CAEA,aACA,CAFA,mBAMA,aAGF,WACE,WACA,YAGF,WACE,WACA,aAGF,WACE,WACA,cAGF,WACE,WACA,aAGF,WACE,WACA,iBAGF,WACE,WACA,qBAGF,WACE,sBAGF,WACE,kBAGF,WACE,mBAGF,WACE,mBAKA,uBAFF,WACE,qBAEA,kBAGF,WACE,oBAGF,WACE,sBAGF,WACE,sBAGF,WACE,mBAGF,WACE,qBAGF,WACE,0BAGF,WACE,oBAGF,WACE,qBAGF,WACE,kBAGF,WACE,sBAGF,WACE,kBAGF,WACE,kBAGF,WACE,oBAGF,WACE,wBAGF,WACE,uBAGF,WACE,qBACA,wBACA,uBAGF,WACE,qBACA,yBACA,oCAGF,WACE,qBACA,qBAGF,WACE,qBACA,yBACA,sBAGF,WACE,wBAGF,WACE,oBAGF,WACE,kBAGF,WACE,oBAGF,WACE,kBAGF,WACE,sBAGF,WACE,mBAGF,WACE,uBAGF,WACE,sBAGF,WACE,kBAGF,WACE,oBAGF,WACE,mBAGF,WACE,yBAGF,WACE,mBAGF,WACE,QCvNF,4BACE,yCACA,kBACA,CAIA,uBACA,CAFA,cACA,CAHA,sBACA,iBACA,CAEA,kBACA,qBA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ACE,+BAIE,iBACA,YAFA,iBACA,CAFF,UAIE,qCAEA,SACE,gCAIJ,oBACE,gBACA,kCAGF,UACE,iCAGF,2BACE,uBAGF,aACE,gBAIJ,WACE,0DAKI,6CADA,cACA,CAFF,SAGE,gEAIA,eADF,UAEE,sEAEA,SACE,0BAUJ,uCAFA,wBACA,kBACA,CALF,oBACE,eACA,kBAIA,gCAGF,wBACE,iBAGF,GACE,4CACE,YACA,IAGF,yCACE,UACA,oBAKN,gBACE,QAaA,yBACA,CAFA,gCACA,CALA,QACA,OACA,CACA,cACA,CATF,cAIE,CAGA,OACA,CAJA,KACA,CAMA,WACA,aAEA,sBAGE,YACA,CACA,oBADA,iBAEA,iBAEA,mBACE,iEAEA,cAKE,CACA,eACA,CAFA,aACA,CACA,cACA,kBACA,CACA,OACA,CAFA,KACA,CACA,SACA,2EAEA,UACE,uFAEA,SACE,oBAUN,2CACA,kBAFA,aACA,CAJF,YAME,gGAQL,eACC,WACA,oBAKA,UACE,wBAGF,uBACE,8BAUA,qBACA,CACA,iBACA,gBARF,cAGE,CAGA,kBACA,CAJA,aACA,WAKA,0EAEA,oCAEE,8EAKN,WAIE,sFAGF,WAKE,YAGF,WACE,0GAGF,WAOE,sHAGF,WAOE,6BAGF,aACE,qBACA,qBAIA,gBACE,kBACA,cAKF,cACA,CAFF,eACE,CACA,gBACA,mCAIE,oCACA,CAFA,YACA,CAEA,iBADA,iBACA,CAJF,UAKE,wDAOE,QACA,CAHA,YACA,CAGA,iBALF,iBACE,CACA,aACA,CACA,KAEA,4EAME,iCACA,CAFA,kBACA,CAGA,eANA,aACA,CAGA,iBACA,CAJA,SACA,CAGA,8BACA,CAPF,YAQE,yCAMJ,cACE,8DAEA,WACE,aACA,kFAGE,aADF,WAEE,8BAOV,wBAEE,kBACA,CACA,eADA,WAEA,wDAEA,UACE,oGAEA,cACE,kJAEA,oCACE,0DAQJ,wBACA,CAFA,mBACA,CAEA,eAJA,WACA,CAEA,cACA,CALF,UAME,8DAIA,cACA,aAFF,UAGE,0EAGF,cACE,0FAIE,qBACA,CAFA,UACA,CAFF,oBACE,CAEA,iBACA,w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","sources":["webpack://bisonw/./node_modules/bootstrap/scss/_root.scss","webpack://bisonw/./node_modules/bootstrap/scss/vendor/_rfs.scss","webpack://bisonw/./node_modules/bootstrap/scss/_reboot.scss","webpack://bisonw/./node_modules/bootstrap/scss/_variables.scss","webpack://bisonw/./src/css/variables.scss","webpack://bisonw/./node_modules/bootstrap/scss/mixins/_border-radius.scss","webpack://bisonw/./node_modules/bootstrap/scss/_grid.scss","webpack://bisonw/./node_modules/bootstrap/scss/mixins/_grid.scss","webpack://bisonw/./node_modules/bootstrap/scss/mixins/_breakpoints.scss","webpack://bisonw/./node_modules/bootstrap/scss/forms/_form-select.scss","webpack://bisonw/./node_modules/bootstrap/scss/mixins/_transition.scss","webpack://bisonw/./node_modules/bootstrap/scss/forms/_form-check.scss","webpack://bisonw/./node_modules/bootstrap/scss/mixins/_utilities.scss","webpack://bisonw/./node_modules/bootstrap/scss/utilities/_api.scss","webpack://bisonw/./src/css/application.scss","webpack://bisonw/./src/css/colors.scss","webpack://bisonw/./src/css/typography.scss","webpack://bisonw/./src/css/utilities.scss","webpack://bisonw/./src/css/mixins.scss","webpack://bisonw/./src/css/icons.scss","webpack://bisonw/./src/css/components.scss","webpack://bisonw/./src/css/main.scss","webpack://bisonw/./src/css/forms.scss","webpack://bisonw/./src/css/market.scss","webpack://bisonw/./src/css/wallets.scss","webpack://bisonw/./src/css/orders.scss","webpack://bisonw/./src/css/order.scss","webpack://bisonw/./src/css/settings.scss","webpack://bisonw/./src/css/mm.scss"],"sourcesContent":[":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{$font-family-base};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n --#{$prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n --#{$prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-2xl: #{$border-radius-2xl};\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-hover-color: #{$link-hover-color};\n\n --#{$prefix}code-color: #{$code-color};\n\n --#{$prefix}highlight-bg: #{$mark-bg};\n}\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + ' ' + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n }\n @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + ' ' + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + ' ' + $value;\n }\n\n @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluidVal: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluidVal {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule {\n #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: var(--#{$prefix}link-color);\n text-decoration: $link-decoration;\n\n &:hover {\n color: var(--#{$prefix}link-hover-color);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `<td>` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`<button>` buttons\n//\n// Details at https://github.com/twbs/bootstrap/pull/30562\n[role=\"button\"] {\n cursor: pointer;\n}\n\nselect {\n // Remove the inheritance of word-wrap in Safari.\n // See https://github.com/twbs/bootstrap/issues/24990\n word-wrap: normal;\n\n // Undo the opacity change from Chrome\n &:disabled {\n opacity: 1;\n }\n}\n\n// Remove the dropdown arrow only from text type inputs built with datalists in Chrome.\n// See https://stackoverflow.com/a/54997118\n\n[list]:not([type=\"date\"]):not([type=\"datetime-local\"]):not([type=\"month\"]):not([type=\"week\"]):not([type=\"time\"])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\n// 3. Opinionated: add \"hand\" cursor to non-disabled button elements.\n\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n\n @if $enable-button-pointers {\n &:not(:disabled) {\n cursor: pointer; // 3\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\n// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.\n\ntextarea {\n resize: vertical; // 1\n}\n\n// 1. Browsers set a default `min-width: min-content;` on fieldsets,\n// unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n// So we reset that to ensure fieldsets behave more like a standard block element.\n// See https://github.com/twbs/bootstrap/issues/12359\n// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n// 2. Reset the default outline behavior of fieldsets so they don't affect page layout.\n\nfieldset {\n min-width: 0; // 1\n padding: 0; // 2\n margin: 0; // 2\n border: 0; // 2\n}\n\n// 1. By using `float: left`, the legend will behave like a block element.\n// This way the border of a fieldset wraps around the legend if present.\n// 2. Fix wrapping bug.\n// See https://github.com/twbs/bootstrap/issues/29712\n\nlegend {\n float: left; // 1\n width: 100%;\n padding: 0;\n margin-bottom: $legend-margin-bottom;\n @include font-size($legend-font-size);\n font-weight: $legend-font-weight;\n line-height: inherit;\n\n + * {\n clear: left; // 2\n }\n}\n\n// Fix height of inputs with a type of datetime-local, date, month, week, or time\n// See https://github.com/twbs/bootstrap/issues/18842\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n// 1. Correct the outline style in Safari.\n// 2. This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\n[type=\"search\"] {\n outline-offset: -2px; // 1\n -webkit-appearance: textfield; // 2\n}\n\n// 1. A few input types should stay LTR\n// See https://rtlstyling.com/posts/rtl-styling#form-inputs\n// 2. RTL only output\n// See https://rtlcss.com/learn/usage-guide/control-directives/#raw\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n\n// Remove the inner padding in Chrome and Safari on macOS.\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n// Remove padding around color pickers in webkit browsers\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n\n// 1. Inherit font family and line height for file input buttons\n// 2. Correct the inability to style clickable types in iOS and Safari.\n\n::file-selector-button {\n font: inherit; // 1\n -webkit-appearance: button; // 2\n}\n\n// Correct element displays\n\noutput {\n display: inline-block;\n}\n\n// Remove border from iframe\n\niframe {\n border: 0;\n}\n\n// Summary\n//\n// 1. Add the correct display in all browsers\n\nsummary {\n display: list-item; // 1\n cursor: pointer;\n}\n\n\n// Progress\n//\n// Add the correct vertical alignment in Chrome, Firefox, and Opera.\n\nprogress {\n vertical-align: baseline;\n}\n\n\n// Hidden attribute\n//\n// Always hide an element with the `hidden` HTML attribute.\n\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n$body-text-align: null !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-2xl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n$text-muted: $gray-600 !default;\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: $border-width !default;\n$hr-opacity: .25 !default;\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}body-color) !default;\n$table-bg: transparent !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba($black, $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba($black, $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba($black, $table-hover-bg-factor) !default;\n\n$table-border-factor: .1 !default;\n$table-border-width: $border-width !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .25rem !default;\n$input-btn-focus-color-opacity: .25 !default;\n$input-btn-focus-color: rgba($component-active-bg, $input-btn-focus-color-opacity) !default;\n$input-btn-focus-blur: 0 !default;\n$input-btn-focus-box-shadow: 0 0 $input-btn-focus-blur $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: $border-width !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: $text-muted !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: $body-bg !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: $gray-200 !default;\n$input-disabled-border-color: null !default;\n\n$input-color: $body-color !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: $box-shadow-inset !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-sm: $border-radius-sm !default;\n$input-border-radius-lg: $border-radius-lg !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: 1px solid rgba($black, .25) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$form-check-input-checked-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/></svg>\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='2' fill='#{$form-check-input-checked-color}'/></svg>\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$form-check-input-indeterminate-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/></svg>\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-color}'/></svg>\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-focus-color}'/></svg>\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-checked-color}'/></svg>\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $gray-200 !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='#{$form-select-indicator-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/></svg>\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: $box-shadow-inset !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: $gray-300 !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: $box-shadow-inset !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: $gray-500 !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: $input-group-addon-bg !default;\n$form-file-button-hover-bg: shade-color($form-file-button-bg, 5%) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/></svg>\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='#{$form-feedback-icon-invalid-color}'><circle cx='6' cy='6' r='4.5'/><path stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/><circle cx='6' cy='8.2' r='.6' fill='#{$form-feedback-icon-invalid-color}' stroke='none'/></svg>\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba($black, .55) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke='#{$navbar-light-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke='#{$navbar-dark-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default;\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: $box-shadow !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: shade-color($dropdown-link-color, 10%) !default;\n$dropdown-link-hover-bg: $gray-200 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-500 !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: $white !default;\n$pagination-border-radius: $border-radius !default;\n$pagination-border-width: $border-width !default;\n$pagination-margin-start: ($pagination-border-width * -1) !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: $gray-200 !default;\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: $border-radius-sm !default;\n$pagination-border-radius-lg: $border-radius-lg !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-border-width: $border-width !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: $border-radius !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: $body-color !default; // Sass variable because of $accordion-button-icon\n$accordion-bg: $body-bg !default;\n$accordion-border-width: $border-width !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: $border-radius !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: $accordion-color !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: tint-color($component-active-bg, 90%) !default;\n$accordion-button-active-color: shade-color($primary, 10%) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $accordion-button-color !default;\n$accordion-icon-active-color: $accordion-button-active-color !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$accordion-icon-color}'><path fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/></svg>\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$accordion-icon-active-color}'><path fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/></svg>\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default;\n$popover-box-shadow: $box-shadow !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: shade-color($popover-bg, 6%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: $border-width !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: $border-radius !default;\n$toast-box-shadow: $box-shadow !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba($black, .05) !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: $border-radius !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: $box-shadow-sm !default;\n$modal-content-box-shadow-sm-up: $box-shadow !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n$alert-bg-scale: -80% !default;\n$alert-border-scale: -70% !default;\n$alert-color-scale: 40% !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: $box-shadow-inset !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: $gray-900 !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n$list-group-item-bg-scale: -80% !default;\n$list-group-item-color-scale: 40% !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: $box-shadow-sm !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: $gray-600 !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$carousel-control-color}'><path d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/></svg>\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$carousel-control-color}'><path d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/></svg>\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$btn-close-color}'><path d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/></svg>\") !default;\n$btn-close-focus-shadow: $input-btn-focus-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: $modal-content-bg !default;\n$offcanvas-color: $modal-content-color !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n","\n// Main colors\n$primary: #0a4972;\n$secondary: #6c757d;\n$success: #0b5831;\n$danger: #d22e;\n$green: #0b5831;\n\n// Link colors\n$link-decoration: none;\n$link-hover-decoration: underline;\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1750px,\n xxxl: 2150px\n);\n\n// Grid columns\n// Set the number of columns and specify the width of the gutters.\n$grid-columns: 24;\n\n// Typography\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: \"source-sans\", \"sans-serif\";\n$font-family-monospace: \"mono\", \"monospace\";\n// stylelint-enable value-keyword-case\n\n@import \"~bootstrap/scss/variables\";\n\n$enable-dark-mode: false;\n// $enable-important-utilities: false;\n","// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n// scss-docs-end border-radius-mixins\n","// Row\n//\n// Rows contain your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: divide(100%, $count);\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// https://primer.github.io/.\n\n.form-select {\n display: block;\n width: 100%;\n padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;\n -moz-padding-start: subtract($form-select-padding-x, 3px); // See https://github.com/twbs/bootstrap/issues/32636\n font-family: $form-select-font-family;\n @include font-size($form-select-font-size);\n font-weight: $form-select-font-weight;\n line-height: $form-select-line-height;\n color: $form-select-color;\n background-color: $form-select-bg;\n background-image: escape-svg($form-select-indicator);\n background-repeat: no-repeat;\n background-position: $form-select-bg-position;\n background-size: $form-select-bg-size;\n border: $form-select-border-width solid $form-select-border-color;\n @include border-radius($form-select-border-radius, 0);\n @include box-shadow($form-select-box-shadow);\n @include transition($form-select-transition);\n appearance: none;\n\n &:focus {\n border-color: $form-select-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n @include box-shadow($form-select-box-shadow, $form-select-focus-box-shadow);\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: $form-select-focus-box-shadow;\n }\n }\n\n &[multiple],\n &[size]:not([size=\"1\"]) {\n padding-right: $form-select-padding-x;\n background-image: none;\n }\n\n &:disabled {\n color: $form-select-disabled-color;\n background-color: $form-select-disabled-bg;\n border-color: $form-select-disabled-border-color;\n }\n\n // Remove outline from select box in FF\n &:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 $form-select-color;\n }\n}\n\n.form-select-sm {\n padding-top: $form-select-padding-y-sm;\n padding-bottom: $form-select-padding-y-sm;\n padding-left: $form-select-padding-x-sm;\n @include font-size($form-select-font-size-sm);\n @include border-radius($form-select-border-radius-sm);\n}\n\n.form-select-lg {\n padding-top: $form-select-padding-y-lg;\n padding-bottom: $form-select-padding-y-lg;\n padding-left: $form-select-padding-x-lg;\n @include font-size($form-select-font-size-lg);\n @include border-radius($form-select-border-radius-lg);\n}\n","// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $transition: $transition-base;\n }\n\n @if length($transition) > 1 {\n @each $value in $transition {\n @if $value == null or $value == none {\n @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n }\n }\n }\n\n @if $enable-transitions {\n @if nth($transition, 1) != null {\n transition: $transition;\n }\n\n @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n }\n}\n","//\n// Check/radio\n//\n\n.form-check {\n display: block;\n min-height: $form-check-min-height;\n padding-left: $form-check-padding-start;\n margin-bottom: $form-check-margin-bottom;\n\n .form-check-input {\n float: left;\n margin-left: $form-check-padding-start * -1;\n }\n}\n\n.form-check-reverse {\n padding-right: $form-check-padding-start;\n padding-left: 0;\n text-align: right;\n\n .form-check-input {\n float: right;\n margin-right: $form-check-padding-start * -1;\n margin-left: 0;\n }\n}\n\n.form-check-input {\n width: $form-check-input-width;\n height: $form-check-input-width;\n margin-top: ($line-height-base - $form-check-input-width) * .5; // line-height minus check height\n vertical-align: top;\n background-color: $form-check-input-bg;\n background-repeat: no-repeat;\n background-position: center;\n background-size: contain;\n border: $form-check-input-border;\n appearance: none;\n print-color-adjust: exact; // Keep themed appearance for print\n @include transition($form-check-transition);\n\n &[type=\"checkbox\"] {\n @include border-radius($form-check-input-border-radius);\n }\n\n &[type=\"radio\"] {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: $form-check-radio-border-radius;\n }\n\n &:active {\n filter: $form-check-input-active-filter;\n }\n\n &:focus {\n border-color: $form-check-input-focus-border;\n outline: 0;\n box-shadow: $form-check-input-focus-box-shadow;\n }\n\n &:checked {\n background-color: $form-check-input-checked-bg-color;\n border-color: $form-check-input-checked-border-color;\n\n &[type=\"checkbox\"] {\n @if $enable-gradients {\n background-image: escape-svg($form-check-input-checked-bg-image), var(--#{$prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-input-checked-bg-image);\n }\n }\n\n &[type=\"radio\"] {\n @if $enable-gradients {\n background-image: escape-svg($form-check-radio-checked-bg-image), var(--#{$prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-radio-checked-bg-image);\n }\n }\n }\n\n &[type=\"checkbox\"]:indeterminate {\n background-color: $form-check-input-indeterminate-bg-color;\n border-color: $form-check-input-indeterminate-border-color;\n\n @if $enable-gradients {\n background-image: escape-svg($form-check-input-indeterminate-bg-image), var(--#{$prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-input-indeterminate-bg-image);\n }\n }\n\n &:disabled {\n pointer-events: none;\n filter: none;\n opacity: $form-check-input-disabled-opacity;\n }\n\n // Use disabled attribute in addition of :disabled pseudo-class\n // See: https://github.com/twbs/bootstrap/issues/28247\n &[disabled],\n &:disabled {\n ~ .form-check-label {\n cursor: default;\n opacity: $form-check-label-disabled-opacity;\n }\n }\n}\n\n.form-check-label {\n color: $form-check-label-color;\n cursor: $form-check-label-cursor;\n}\n\n//\n// Switch\n//\n\n.form-switch {\n padding-left: $form-switch-padding-start;\n\n .form-check-input {\n width: $form-switch-width;\n margin-left: $form-switch-padding-start * -1;\n background-image: escape-svg($form-switch-bg-image);\n background-position: left center;\n @include border-radius($form-switch-border-radius);\n @include transition($form-switch-transition);\n\n &:focus {\n background-image: escape-svg($form-switch-focus-bg-image);\n }\n\n &:checked {\n background-position: $form-switch-checked-bg-position;\n\n @if $enable-gradients {\n background-image: escape-svg($form-switch-checked-bg-image), var(--#{$prefix}gradient);\n } @else {\n background-image: escape-svg($form-switch-checked-bg-image);\n }\n }\n }\n\n &.form-check-reverse {\n padding-right: $form-switch-padding-start;\n padding-left: 0;\n\n .form-check-input {\n margin-right: $form-switch-padding-start * -1;\n margin-left: 0;\n }\n }\n}\n\n.form-check-inline {\n display: inline-block;\n margin-right: $form-check-inline-margin-end;\n}\n\n.btn-check {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n\n &[disabled],\n &:disabled {\n + .btn {\n pointer-events: none;\n filter: none;\n opacity: $form-check-btn-check-disabled-opacity;\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix, $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n","body:not(.dark){--body-bg: #fafafa;--body-bg-lower-opacity: #fafafa88;--section-bg: #f6f6f6;--form-bg: #f0f0f0;--tertiary-bg: #7772;--text-color: #333;--text-color-secondary: #4a4949;--text-danger: #d22;--text-warning: #f82e;--text-grey: #777;--border-color: #ddd;--hint-color: #4397cd;--link-color: #2a71d5;--link-color-hover: #144487;--subtle-link-color: #05053b;--subtle-link-hover: #07075e;--popup-notes-bg: black;--popup-notes-color: #dfe2e1;--btn-feature-bg: #6bc5ff;--btn-feature-hover-bg: #a3dbff;--btn-feature-border-color: #759cb5;--btn-featur-hover-border-color: #9bc3dd;--btn-danger-hover-color: white;--btn-border-color: #ddd;--btn-hover-border-color: #ddd;--btn-go-bg: #0b5831;--btn-go-hover-bg: #0b5831;--btn-go-color: #fff;--forms-bg: #fafafa99;--form-input-bg: #fff;--form-input-border: #999;--form-input-border-focus: #555;--form-input-bg-active: #3095db;--form-opt-selected-bg: #0001;--form-selected-tab-bg: white;--indicator-good: #179717;--buy-color: #207a46;--sell-color: #99302b;--market-buygreen-bg: #207a4699;--market-sellred-bg: #99302b99;--market-sell-color: #99302b;--market-btn-color: #555;--market-btn-selected-color: black;--market-markettab-selected-bg: #7773;--market-orderopt-bg: #fff1;--market-numorders-bg: #c5c5e6;--loader-bg: #e0e0e077;--dex-url: url(\"/img/softened-icon.png\")}body.dark{--body-bg: #040b14;--body-bg-lower-opacity: #040b1488;--section-bg: #071627;--form-bg: #0a1e34;--tertiary-bg: #78787822;--text-color: #dfe2e1;--text-color-secondary: #a1a1a1;--text-danger: #ec6a6a;--text-warning: #f82e;--text-grey: #999;--border-color: #383f4b;--hint-color: #64b2e5;--link-color: #388bff;--link-color-hover: #5e9ffa;--subtle-link-color: #e6e6ff;--subtle-link-hover: #d1d1ff;--popup-notes-bg: white;--popup-notes-color: #333;--btn-border-color: #7777;--btn-hover-border-color: #777;--btn-feature-bg: #0a4972;--btn-feature-hover-bg: #176699;--btn-feature-border-color: #1e618d;--btn-featur-hover-border-color: #85a5ba;--btn-danger-hover-color: white;--btn-go-bg: #0b5831;--btn-go-hover-bg: #0b5831;--btn-go-color: #fff;--forms-bg: #05141f99;--form-input-bg: #0009;--form-input-border: #555;--form-input-border-focus: #4271ce;--form-input-bg-active: #27278d;--form-opt-selected-bg: #fff1;--form-selected-tab-bg: #39447c;--indicator-good: #29bb77;--buy-color: #29bb77;--sell-color: #e95e5e;--market-buygreen-bg: #29bb7799;--market-sellred-bg: #e95e5e99;--market-sell-color: #e95e5e;--market-btn-color: #aaa;--market-btn-selected-color: #eee;--market-markettab-selected-bg: #fff1;--market-orderopt-bg: #0001;--market-numorders-bg: #141488;--loader-bg: #13202b77;--dex-url: url(\"/img/softened-icon-dark.png\")}.greyscale{filter:grayscale(1)}.blurry-bg{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.body-bg{background-color:var(--body-bg)}.section-bg{background-color:var(--section-bg)}.text-good{color:var(--indicator-good)}@font-face{font-family:\"source-sans\";src:url(\"/font/source-sans-pro-v9-latin-regular.woff\") format(\"woff\"),url(\"/font/source-sans-pro-v9-latin-regular.svg\") format(\"svg\");font-weight:normal;font-style:normal}@font-face{font-family:\"demi-sans\";src:url(\"/font/source-sans-pro-semibold.woff\") format(\"woff\"),url(\"/font/source-sans-pro-semibold.svg\") format(\"svg\");font-weight:bolder;font-style:normal}@font-face{font-family:\"mono\";src:url(\"/font/inconsolata-v15-latin-regular.woff\") format(\"woff\"),url(\"/font/inconsolata-v15-latin-regular.svg\") format(\"svg\");font-weight:normal;font-style:normal}.fs8{font-size:8px}.fs10{font-size:10px}.fs11{font-size:11px}.fs12{font-size:12px}.fs13{font-size:13px}.fs14{font-size:14px}.fs15{font-size:15px}.fs16{font-size:16px}.fs17{font-size:17px}.fs18{font-size:18px}.fs20{font-size:20px}.fs22{font-size:22px}.fs24{font-size:24px}.fs26{font-size:24px}.fs28{font-size:28px}.fs32{font-size:32px}.fs35{font-size:35px}.fs50{font-size:50px}.demi{font-family:\"demi-sans\",sans-serif}.mono{font-family:\"mono\",monospace}.sans{font-family:\"source-sans\",sans-serif}.bold{font-weight:bold}.flex-grow-1{flex-grow:1}.flex-center,div[data-handler=markets] #epochLine,div[data-handler=markets] .user-order .user-order-header,div[data-handler=markets] .market-chart,#dexAddrForm .known-exchange,#forms>form header,#forms>form>div.form-closer-unbound,#forms>form>div.form-closer,#forms{display:flex;justify-content:center;align-items:center}.flex-stretch-column,#forms>form{display:flex;flex-direction:column;align-items:stretch}.flex-wrap{flex-wrap:wrap}.text-nowrap{white-space:nowrap}.position-relative{position:relative}.position-absolute{position:absolute}.hoverbg:hover,div[data-handler=mmsettings] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mmarchives] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mmlogs] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mm] #cexSelection:not(.disabled) .cex-selector:hover,div[data-handler=mmsettings] .bot-type-selector:hover:not(.disabled),div[data-handler=mmarchives] .bot-type-selector:hover:not(.disabled),div[data-handler=mmlogs] .bot-type-selector:hover:not(.disabled),div[data-handler=mm] .bot-type-selector:hover:not(.disabled),#forms>form>div.form-closer-unbound:hover,#forms>form>div.form-closer:hover{background-color:var(--tertiary-bg)}.invisible{visibility:hidden}.stylish-overflow,#recentMatchesBox,#forms,table.reg-asset-markets,.vscroll{overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(119,119,119,.2666666667) rgba(119,119,119,.0666666667)}.stylish-overflow::-webkit-scrollbar,#recentMatchesBox::-webkit-scrollbar,#forms::-webkit-scrollbar,table.reg-asset-markets::-webkit-scrollbar,.vscroll::-webkit-scrollbar{width:8px;height:8px}.stylish-overflow::-webkit-scrollbar-track,#recentMatchesBox::-webkit-scrollbar-track,#forms::-webkit-scrollbar-track,table.reg-asset-markets::-webkit-scrollbar-track,.vscroll::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}.stylish-overflow::-webkit-scrollbar-thumb,#recentMatchesBox::-webkit-scrollbar-thumb,#forms::-webkit-scrollbar-thumb,table.reg-asset-markets::-webkit-scrollbar-thumb,.vscroll::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}.stylish-overflow.hoveronly:not(:hover),.hoveronly#recentMatchesBox:not(:hover),.hoveronly#forms:not(:hover),table.hoveronly.reg-asset-markets:not(:hover),.hoveronly.vscroll:not(:hover){scrollbar-color:rgba(0,0,0,0) rgba(0,0,0,0)}.stylish-overflow.hoveronly:not(:hover)::-webkit-scrollbar-track,.hoveronly#recentMatchesBox:not(:hover)::-webkit-scrollbar-track,.hoveronly#forms:not(:hover)::-webkit-scrollbar-track,table.hoveronly.reg-asset-markets:not(:hover)::-webkit-scrollbar-track,.hoveronly.vscroll:not(:hover)::-webkit-scrollbar-track{background-color:rgba(0,0,0,0)}.stylish-overflow.hoveronly:not(:hover)::-webkit-scrollbar-thumb,.hoveronly#recentMatchesBox:not(:hover)::-webkit-scrollbar-thumb,.hoveronly#forms:not(:hover)::-webkit-scrollbar-thumb,table.hoveronly.reg-asset-markets:not(:hover)::-webkit-scrollbar-thumb,.hoveronly.vscroll:not(:hover)::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0);border-radius:4px}.stylish-overflow.overflow-x-hidden,.overflow-x-hidden#recentMatchesBox,.overflow-x-hidden#forms,table.overflow-x-hidden.reg-asset-markets,.overflow-x-hidden.vscroll{overflow-x:hidden}.hidden-overflow{overflow:auto;scrollbar-width:none}.hidden-overflow::-webkit-scrollbar{display:none}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.ease-color{transition:color 1s ease}.mw-375{max-width:375px}.mw-425{max-width:425px}.max-h-100{max-height:100%}.d-hide{display:none !important}.buycolor{color:var(--buy-color)}.sellcolor{color:var(--sell-color)}.grey{color:var(--text-grey)}.rounded3,div[data-handler=mmsettings] .bot-type-selector,div[data-handler=mmarchives] .bot-type-selector,div[data-handler=mmlogs] .bot-type-selector,div[data-handler=mm] .bot-type-selector{border-radius:3px}hr.dashed{border-top:2px dashed var(--border-color)}img.token-parent{width:.7em;height:.7em;position:relative;top:-0.4em}sup.token-parent{font-size:.6em;position:relative;top:-0.6em}.preline{white-space:pre-line}.vscroll{max-width:100%;overflow-x:hidden}.pointer{cursor:pointer !important}.underline{text-decoration:underline}.plainlink{color:inherit}.ico-info{margin-left:.25rem}.subtlelink,.subtlelink:visited{text-decoration:none}.subtlelink:hover,.subtlelink:visited:hover{text-decoration:underline !important;cursor:pointer}.word-break-all{word-break:break-all;user-select:all}.lh1{line-height:1}.fill-abs,div[data-handler=mmsettings] #placementsChart canvas,div[data-handler=mmsettings] [data-tmpl=placementsChart] canvas,div[data-handler=mmarchives] #placementsChart canvas,div[data-handler=mmarchives] [data-tmpl=placementsChart] canvas,div[data-handler=mmlogs] #placementsChart canvas,div[data-handler=mmlogs] [data-tmpl=placementsChart] canvas,div[data-handler=mm] #placementsChart canvas,div[data-handler=mm] [data-tmpl=placementsChart] canvas,div[data-handler=markets] #leftMarketDock #marketSearchV1{position:absolute;top:0;bottom:0;left:0;right:0}.min-fit{min-height:fit-content}div.clear{opacity:0}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.overflow-x-hidden,.stylish-overflow.overflow-x-hidden,.overflow-x-hidden#recentMatchesBox,.overflow-x-hidden#forms,table.overflow-x-hidden.reg-asset-markets{overflow-x:hidden}.user-select-all{user-select:all}.overflow-ellipsis{overflow:hidden;text-overflow:ellipsis}.user-select-none{user-select:none}.text-danger{color:var(--text-danger)}.text-warning{color:var(--text-warning)}.text-buycolor{color:var(--buy-color)}.text-sellcolor{color:var(--sell-color)}@font-face{font-family:\"icomoon\";src:url(\"/font/icomoon.ttf?u8i98qq\") format(\"truetype\"),url(\"/font/icomoon.woff?u8i98qq\") format(\"woff\"),url(\"/font/icomoon.svg?u8i98qq#icomoon\") format(\"svg\");font-weight:normal;font-style:normal}[class^=ico-],[class*=\" ico-\"]{font-family:\"icomoon\",monospace !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.micro-icon{height:15px;width:15px}.mini-icon{height:20px;width:20px}.small-icon{height:25px;width:25px}.medium-icon{height:30px;width:30px}.large-icon{height:40px;width:40px}.enourmous-icon{height:50px;width:50px}.ico-spinner::before{content:\"\"}.ico-settings::before{content:\"\"}.ico-plus::before{content:\"\"}.ico-minus::before{content:\"\"}.ico-check::before{content:\"\";display:inline-block;color:var(--buy-color)}.ico-bell::before{content:\"\"}.ico-locked::before{content:\"\"}.ico-unlocked::before{content:\"\"}.ico-sleeping::before{content:\"\"}.ico-cross::before{content:\"\"}.ico-profile::before{content:\"\"}.ico-disconnected::before{content:\"\"}.ico-search::before{content:\"\"}.ico-expired::before{content:\"\"}.ico-info::before{content:\"\"}.ico-textfile::before{content:\"\"}.ico-open::before{content:\"\"}.ico-sync::before{content:\"\"}.ico-target::before{content:\"\"}.ico-arrowright::before{content:\"\"}.ico-arrowdown::before{content:\"\";display:inline-block;transform:rotate(90deg)}.ico-arrowleft::before{content:\"\";display:inline-block;transform:rotate(180deg)}.ico-wide-headed-left-arrow::before{content:\"\";display:inline-block}.ico-arrowup::before{content:\"\";display:inline-block;transform:rotate(-90deg)}.ico-checkbox::before{content:\"\"}.ico-connection::before{content:\"\"}.ico-rocket::before{content:\"\"}.ico-copy::before{content:\"\"}.ico-qrcode::before{content:\"\"}.ico-send::before{content:\"\"}.ico-exchange::before{content:\"\"}.ico-pause::before{content:\"\"}.ico-hamburger::before{content:\"\"}.ico-barchart::before{content:\"\"}.ico-edit::before{content:\"\"}.ico-ticket::before{content:\"\"}.ico-robot::before{content:\"\"}.ico-secretagent::before{content:\"\"}.ico-lever::before{content:\"\"}button{background-color:rgba(0,0,0,0);border:1px solid var(--btn-border-color);border-radius:5px;outline:none;padding:.375rem .75rem;user-select:none;font-size:1rem;color:var(--text-color);white-space:nowrap}button:focus{outline:none}button:hover{text-decoration:none;border-color:var(--btn-hover-border-color);background-color:rgba(119,119,119,.1333333333)}button.small{padding:.25rem .5rem;font-size:.9rem}button.large{padding:.5rem 1rem;font-size:1.25rem}button.feature{background-color:var(--btn-feature-bg);border-color:var(--btn-feature-border-color)}button.feature:hover{background-color:var(--btn-feature-hover-bg);border-color:var(--btn-featur-hover-border-color)}button.danger{border-color:var(--text-danger);color:var(--text-danger)}button.danger:hover{background-color:var(--text-danger);color:var(--btn-danger-hover-color)}button.warning{border-color:var(--text-warning);color:var(--text-warning)}button.warning:hover{background-color:var(--text-warning);color:var(--btn-danger-hover-color)}button.go{background-color:var(--btn-go-bg);color:var(--btn-go-color)}button.go:hover{background-color:var(--btn-go-hover-bg)}table{color:var(--text-color);border-collapse:collapse;width:100%}table .table-group-divider{border-color:var(--border-color)}table.px-0 th:last-child,table.px-0 th:first-child,table.px-0 td:last-child,table.px-0 td:first-child{padding-left:0;padding-right:0}table th,table td{padding:.5rem}table th:last-child:not(:first-child),table td:last-child:not(:first-child){text-align:right}table th.no-stretch,table td.no-stretch{width:0}table.row-border tbody{border-bottom:1px solid var(--border-color)}table.row-border tbody tr{border-top:1px solid var(--border-color)}table.cell-border th,table.cell-border td{border:1px solid var(--border-color)}table.nopadding td{padding:0}table.compact th,table.compact td{padding:.25rem}table.row-hover tr:hover{background-color:var(--tertiary-bg)}table.striped tr:nth-of-type(even){background-color:rgba(119,119,119,.1333333333)}a{color:var(--link-color)}a:hover{color:var(--link-color-hover)}@media(min-width: 768px){table#walletInfoTable{width:auto}}table.reg-asset-markets{display:block;max-height:120px;line-height:1.15;overflow-y:hidden;margin-right:8px}table.reg-asset-markets:hover{overflow-y:auto}table.reg-asset-markets tr{border:none}table.reg-asset-markets th{font-weight:normal;font-size:13px}table.reg-asset-markets td{font-size:14px}table.reg-asset-markets th,table.reg-asset-markets td{padding:1px 5px}.form-check-label{cursor:pointer}.form-check-input[type=checkbox]{border:1px solid var(--form-input-border);cursor:pointer}.form-check-input[type=checkbox]:checked{background-color:var(--form-input-bg-active)}select{font-family:inherit;padding:.75rem 1rem}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}form.card button:hover{color:#000}input:invalid{box-shadow:none}.dashed{border-style:dashed}.micro-icon{position:relative}#tooltip{position:absolute;left:-10000px;z-index:1000;padding:3px 6px;max-width:300px;font-size:15px;border-radius:4px;background-color:var(--section-bg);border:1px solid var(--border-color)}.on-indicator{width:15px;height:15px;border-radius:8px}.on-indicator.on{background-color:var(--indicator-good)}.on-indicator.off{background-color:#777}.border-left{border-left:1px solid var(--border-color)}.border-right{border-right:1px solid var(--border-color)}div[data-handler=dexsettings] #forms>form:not(.plain),div[data-handler=init] #forms>form:not(.plain),div[data-handler=login] #forms>form:not(.plain),div[data-handler=markets] #forms>form:not(.plain),div[data-handler=mm] #forms>form:not(.plain),div[data-handler=mmsettings] #forms>form:not(.plain),div[data-handler=order] #forms>form:not(.plain),div[data-handler=orders] #forms>form:not(.plain),div[data-handler=register] #forms>form:not(.plain),div[data-handler=settings] #forms>form:not(.plain),div[data-handler=mmlogs] #forms>form:not(.plain),div[data-handler=wallets] #forms>form:not(.plain){border-radius:5px;border:1px solid var(--border-color);background-color:var(--form-bg);box-shadow:0 3px 6px rgba(0,0,0,.1294117647),0 2px 7px rgba(0,0,0,.2549019608)}.corner-button{position:absolute;top:0}.corner-button.left{left:0}.corner-button.right{right:0}html{height:100%}body{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;flex-direction:column;justify-content:flex-start;background-color:var(--body-bg);color:var(--text-color)}header#header{width:100%;height:70px;min-height:70px;display:flex;justify-content:space-between;align-items:center;z-index:100;background-color:var(--section-bg)}header#header a,header#header a:visited,header#header a:hover,header#header .plainlink,header#header .plainlink:visited,header#header .plainlink:hover{text-decoration:none}header#header .hoverbright:hover{color:var(--subtle-link-hover)}section{background-color:var(--section-bg);margin:.5rem 0;border:1px solid var(--border-color);border-radius:.25rem}div.main{display:flex;flex-grow:1;min-height:0;position:relative}div.mainlinks>div,div.mainlinks>a{color:var(--text-color-secondary);padding:.5rem .75rem}@media(min-width: 768px){div.mainlinks>div,div.mainlinks>a{padding:.75rem 1rem}}.spinner{animation:spin 2s infinite linear}.spinner.fast{animation:spin 1s infinite linear}div.note-indicator{width:6px;height:6px;border-radius:3px}div.note-indicator.good{background-color:var(--indicator-good)}div.note-indicator.bad{background-color:rgba(221,34,34,.9333333333)}div.note-indicator.warn{background-color:var(--text-warning)}.z10{z-index:10}span.brand::before{content:\"Bison Wallet\"}img.dex-logo{content:var(--dex-url)}img.logo-square{content:url(\"/img/bison-square_50.png\")}img.logo-square.small{height:25px;width:25px}img.logo-full{content:url(\"/img/bison-full_97x50.png\")}img.logo-full.small{height:25px;width:48.5px}body.dex-branding img.logo-square,body.dex-branding img.logo-full{width:50px;height:50px;content:url(\"/img/softened-icon.png\")}body.dex-branding img.logo-square.small,body.dex-branding img.logo-full.small{height:25px;width:25px}body.dex-branding img.logo-square.micro-icon,body.dex-branding img.logo-full.micro-icon{height:15px;width:15px}body.dex-branding.dark img.logo-square,body.dex-branding.dark img.logo-full{content:url(\"/img/softened-icon-dark.png\")}body.dex-branding span.brand::before{content:\"DCRDEX\"}#noteIndicator{position:absolute;top:0;left:20px;font-size:16px;line-height:1;font-family:\"demi-sans\",sans-serif;font-weight:bold;z-index:2}#noteIndicator.good{color:var(--indicator-good)}#noteIndicator.bad{color:rgba(221,34,34,.9333333333)}#noteIndicator.warn{color:var(--text-warning)}div.popup-notes{align-items:flex-end;border-radius:4px;bottom:0;display:flex;flex-direction:column;max-width:750px;position:fixed;right:5px;z-index:1000}div.popup-notes>span{line-height:1;max-width:100%;display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:var(--popup-notes-bg);color:var(--popup-notes-color);padding:4px 10px;margin:3px 0 0}div.popup-notes .note-indicator{margin-bottom:2px}[data-unit]{color:var(--hint-color)}[data-unit-box]{cursor:default;position:relative;overflow:visible}[data-unit-box]>div{left:-2rem;z-index:10;color:var(--text-color)}#profileBox,#noteBox{position:fixed;display:flex;flex-direction:column;align-items:stretch;background-color:var(--section-bg);border:1px solid var(--border-color);z-index:100;min-width:150px;line-height:1.5;max-height:90%}#profileBox .icon,#noteBox .icon{position:absolute;right:15px;top:8px}#profileBox .header,#noteBox .header{border-bottom:1px solid var(--border-color);background-color:var(--section-bg)}#profileBox .header>div,#noteBox .header>div{opacity:.5;cursor:pointer}#profileBox .header>div.active,#noteBox .header>div.active{opacity:1}#profileBox:not(.authed) .authed-only,#noteBox:not(.authed) .authed-only{display:none !important}#noteBox{width:425px}#noteBox div.note.firstview{background-color:var(--tertiary-bg)}#noteBox div.note:not(:last-child){border-bottom:1px solid var(--border-color)}#profileBox{min-width:250px}#loader{background-color:var(--body-bg-lower-opacity)}#requiredActions{position:absolute;bottom:0;left:0;z-index:98}#requiredActions>div{background-color:var(--body-bg);border:3px solid var(--border-color)}@media(min-width: 576px){section{margin:.5rem}}@media(min-width: 992px){section,.w-lg-auto{width:auto}}.green{color:var(--indicator-good)}label{margin-bottom:.25rem;cursor:pointer}input[type=text],input[type=date],input[type=password],input[type=number],input[type=url],textarea{display:block;width:100%;padding:.375rem .75rem;border:1px solid var(--form-input-border);border-radius:5px;background-color:var(--form-input-bg);color:var(--text-color)}input[type=text]:focus,input[type=date]:focus,input[type=password]:focus,input[type=number]:focus,input[type=url]:focus,textarea:focus{border-color:var(--form-input-border-focus);outline:none}input[type=text].border-danger,input[type=date].border-danger,input[type=password].border-danger,input[type=number].border-danger,input[type=url].border-danger,textarea.border-danger{border-color:var(--text-danger)}input[type=text].border-success,input[type=date].border-success,input[type=password].border-success,input[type=number].border-success,input[type=url].border-success,textarea.border-success{border-color:var(--indicator-good)}input[type=text].thin,input[type=date].thin,input[type=password].thin,input[type=number].thin,input[type=url].thin,textarea.thin{width:4rem}input[type=text].micro,input[type=date].micro,input[type=password].micro,input[type=number].micro,input[type=url].micro,textarea.micro{font-size:14px;padding:0 .25rem;width:3rem}input[type=text].micro.wide,input[type=date].micro.wide,input[type=password].micro.wide,input[type=number].micro.wide,input[type=url].micro.wide,textarea.micro.wide{width:5rem}input[type=text].micro.thin,input[type=date].micro.thin,input[type=password].micro.thin,input[type=number].micro.thin,input[type=url].micro.thin,textarea.micro.thin{width:2rem}select{background-color:var(--form-input-bg) !important}.form-select{color:var(--text-color);background-color:var(--form-input-bg);border:1px solid var(--form-input-border);border-radius:3px}.form-select:focus{border-color:var(--form-input-border-focus)}#regAssetForm input[data-tmpl=tradingTierInput]{width:3em}#regAssetForm .readygreen{color:#009931}#regAssetForm .setuporange{color:#b89400}#confirmRegForm{width:425px}#confirmRegForm button.submit{width:auto;padding:12px 30px;border-radius:3px;opacity:.9}#confirmRegForm button.submit:hover{opacity:1}#confirmRegForm input.app-pass{display:inline-block;max-width:250px}#confirmRegForm div.reg-conf-msg{width:100%}#confirmRegForm div.borderright{border-right:1px solid #777}#confirmRegForm .mw50{max-width:50%}#newWalletForm{width:425px}#newWalletForm [data-tmpl=walletTypeTabs] .wtab.selected{opacity:1;cursor:default;background-color:var(--form-selected-tab-bg)}#newWalletForm [data-tmpl=walletTypeTabs] .wtab:not(.selected){opacity:.8;cursor:pointer}#newWalletForm [data-tmpl=walletTypeTabs] .wtab:not(.selected):hover{opacity:1}#newWalletForm .one-bttn{display:inline-block;font-size:22px;padding:10px 25px;background-color:#0b5831;border-radius:5px;animation:glow 1.5s infinite alternate}#newWalletForm .one-bttn:hover{background-color:#0c5f36}@keyframes glow{from{box-shadow:0 0 4px -3px rgba(255,255,255,.4666666667);opacity:.95}to{box-shadow:0 0 4px 0 rgba(255,255,255,.4666666667);opacity:1}}.form-check-label{user-select:none}#forms{position:fixed;top:0;bottom:0;left:0;right:0;padding:25px 0;background-color:var(--forms-bg);backdrop-filter:blur(5px);z-index:101}#forms>form{box-sizing:content-box;margin:auto;position:relative;padding-bottom:1rem}#forms>form>div{padding:1rem 1rem 0}#forms>form>div.form-closer-unbound,#forms>form>div.form-closer{cursor:pointer;line-height:1;font-size:.8rem;padding:.75rem;position:absolute;top:0;right:0;z-index:1}#forms>form>div.form-closer-unbound span,#forms>form>div.form-closer span{opacity:.6}#forms>form>div.form-closer-unbound span:hover,#forms>form>div.form-closer span:hover{opacity:1}#forms>form header{padding:1rem;line-height:1;border-bottom:1px solid var(--border-color);font-size:1.6rem}div[data-handler=init] #forms,div[data-handler=login] #forms,div[data-handler=register] #forms{margin-top:70px;z-index:99}#walletWait .icons{width:25px}#walletWait .ico-check{color:rgba(5,163,90,.6)}#dexAddrForm .known-exchange{font-size:17px;padding:5px 0;width:100%;border:1px solid #555;margin-bottom:10px;border-radius:3px;cursor:pointer}#dexAddrForm .known-exchange:hover,#dexAddrForm .known-exchange.selected{background-color:rgba(119,119,119,.1333333333)}#loginForm,#authorizeAccountImportForm,#disableAccountForm,#discoverAcctForm{width:275px}#changeAppPWForm,#resetAppPWForm,#dexAddrForm,#verifyForm,#deleteArchivedRecordsForm{width:325px}#appPWForm{width:350px}#sendForm,#vSendForm,#exportSeedAuth,#cancelForm,#quickConfigForm,#toggleWalletStatusConfirm,#walletWait{width:375px}#confirmRegistrationForm,#regAssetForm,#reconfigForm,#authorizeSeedDisplay,#seedBackupForm,#votingForm,#gameCodeForm{width:425px}a[data-tmpl=walletCfgGuide]{color:inherit;text-decoration:none}#deposit #copyAlert{margin-left:12px;position:absolute}.mini-slider{padding:.5rem 0;cursor:pointer;user-select:none}.mini-slider div[data-tmpl=color]{width:100%;height:.2rem;background-color:rgba(119,119,119,.4666666667);position:relative;overflow:visible}.mini-slider div[data-tmpl=color]>div[data-tmpl=track]{position:absolute;left:.375rem;right:.375rem;bottom:0;top:0;overflow:visible}.mini-slider div[data-tmpl=color]>div[data-tmpl=track]>div[data-tmpl=ball]{width:.75rem;height:.75rem;top:.1rem;border-radius:1rem;background-color:var(--text-grey);position:absolute;transform:translate(-50%, -50%);cursor:pointer}.mini-slider.small div[data-tmpl=color]{height:.125rem}.mini-slider.small div[data-tmpl=color]>div[data-tmpl=track]{left:.25rem;right:.25rem}.mini-slider.small div[data-tmpl=color]>div[data-tmpl=track]>div[data-tmpl=ball]{width:.5rem;height:.5rem}.slider-container,.order-opt{border:1px solid #424242;border-radius:3px;padding:4px;margin-top:8px}.slider-container>div.disabled,.order-opt>div.disabled{opacity:.8}.slider-container>div.disabled [data-tmpl=sliderBox],.order-opt>div.disabled [data-tmpl=sliderBox]{cursor:default}.slider-container>div.disabled [data-tmpl=sliderBox] .slider .slider-handle,.order-opt>div.disabled [data-tmpl=sliderBox] .slider .slider-handle{background-color:rgba(119,119,119,.7333333333)}.slider-container div.opt-check,.order-opt div.opt-check{width:15px;height:15px;border-radius:7.5px;border:2px solid #424242;margin-top:5px;cursor:pointer}.slider-container .xy-range-input,.order-opt .xy-range-input{width:35px;font-size:14px;height:16px}.slider-container [data-tmpl=sliderBox],.order-opt [data-tmpl=sliderBox]{cursor:pointer}.slider-container [data-tmpl=sliderBox] .slider,.order-opt [data-tmpl=sliderBox] .slider{margin:10px 10px 5px;height:2px;background-color:gray;position:relative}.slider-container [data-tmpl=sliderBox] .slider .slider-handle,.order-opt [data-tmpl=sliderBox] .slider .slider-handle{position:absolute;height:20px;width:14px;top:-9px;border-radius:7px;background-color:#2cce9c;border:2px solid #424242}div[data-tmpl=scoreTray]{background-color:var(--buy-color);height:12px;border-radius:100px;overflow:hidden}div[data-tmpl=scoreTray] div[data-tmpl=scoreWarn]{background-color:var(--sell-color);position:absolute;top:0;bottom:0;left:0}span[data-tmpl=scorePointer]{transform:translateX(-50%)}span[data-tmpl=scorePointer] span[data-tmpl=scoreData]{top:0;bottom:0}span[data-tmpl=scorePointer] span[data-tmpl=scoreData].positive{right:calc(100% + .125rem)}span[data-tmpl=scorePointer] span[data-tmpl=scoreData].negative{left:calc(100% + .125rem)}.penalty-marker{position:absolute;top:0;bottom:0;left:10%;width:2px;z-index:2;background-color:#000}div[data-handler=init] .quickconfig-asset-logo{width:25px;height:25px}.anitoggle{width:1.5rem;height:.9rem;border-radius:.45rem;background-color:rgba(119,119,119,.6666666667);cursor:pointer}.anitoggle.on{background-color:var(--indicator-good)}.anitoggle>div{position:relative;top:.1rem;left:.1rem;width:.7rem;height:.7rem;border-radius:.35rem;transition:left .5s;background-color:var(--section-bg)}.anitoggle.on>div{left:.7rem}.anitoggle.big{width:35px;height:20px;border-radius:10px}.anitoggle.big>div{top:2px;left:2px;width:16px;height:16px;border-radius:12px}.anitoggle.big.on>div{left:17px}.selectable.selected{border:2px solid green}.dynamicopts{display:flex;align-items:stretch;justify-content:space-between;flex-wrap:wrap}.dynamicopts>div{min-height:55px}.dynamicopts>div:not(.repeatable,[data-tmpl=checkbox]){width:47%}.hoveropaque{opacity:.7}.hoveropaque:hover{opacity:1}#placementsBody td[data-tmpl=error]{max-width:200px}body.dark ::-webkit-calendar-picker-indicator{filter:invert(1)}body.dark #regAssetForm div.reg-asset .fader{background-image:linear-gradient(to bottom, rgba(19, 32, 43, 0), #122739 90%)}body.dark #regAssetForm div.reg-asset:not(.nohover):hover .fader{background-image:linear-gradient(to bottom, rgba(32, 44, 53, 0), #202c35 90%)}div[data-handler=markets] .ordertable-wrap{width:100%}div[data-handler=markets] .ordertable-wrap:first-child{border-bottom:1px solid var(--border-color)}div[data-handler=markets] .ordertable-wrap:last-child{border-top:1px solid var(--border-color)}div[data-handler=markets] .ordertable-wrap tbody#sellRows{border-top:1px solid var(--border-color)}div[data-handler=markets] .orderbook{min-width:225px}div[data-handler=markets] .orderbook>div:first-child{order:3}div[data-handler=markets] .orderbook>div:nth-child(2){order:1}div[data-handler=markets] .orderbook>div:last-child{order:2}div[data-handler=markets] .order-panel{min-width:375px}div[data-handler=markets] .order-panel #orderForm input[type=number]{height:30px;border-radius:0;font-size:14px}div[data-handler=markets] .order-panel #orderForm input:focus{outline:none}div[data-handler=markets] .order-panel #orderForm span.unitbox{position:absolute;font-size:14px;font-weight:bold;right:5px;top:48%;transform:translateY(-50%);white-space:nowrap}div[data-handler=markets] .order-panel #orderForm button{padding:5px 25px;border:1px solid rgba(120,120,120,.4666666667);border-radius:3px;background-color:var(--section-bg);color:var(--market-btn-color)}div[data-handler=markets] .order-panel #orderForm button:disabled{opacity:.4}div[data-handler=markets] .order-panel #orderForm button:hover,div[data-handler=markets] .order-panel #orderForm button.selected{color:var(--market-btn-selected-color)}div[data-handler=markets] .order-panel #orderForm button.submit{color:var(--market-btn-selected-color)}div[data-handler=markets] .order-panel #orderForm button.selected.buygreen-bg,div[data-handler=markets] .order-panel #orderForm button.submit.buygreen-bg{background-color:var(--market-buygreen-bg)}div[data-handler=markets] .order-panel #orderForm button.selected.sellred-bg,div[data-handler=markets] .order-panel #orderForm button.submit.sellred-bg{background-color:var(--market-sellred-bg)}div[data-handler=markets] .order-panel #orderForm #orderPreview,div[data-handler=markets] .order-panel #orderForm .h21{height:21px}div[data-handler=markets] .order-panel .ico-unlocked{color:#0b5831}div[data-handler=markets] .order-panel .ico-disconnected{color:var(--text-warning)}div[data-handler=markets] .market-chart{flex-grow:1;position:relative;min-width:100px;min-height:250px}div[data-handler=markets] .market-chart canvas{position:absolute;left:0;top:0;user-select:none}div[data-handler=markets] #unreadyOrdersMsg{color:rgba(221,34,34,.9333333333)}div[data-handler=markets] .unready-user-order{background-color:#6e0909}div[data-handler=markets] .user-order:not(:last-child){border-bottom-style:none !important}div[data-handler=markets] .user-order:last-child .order-details{border-bottom-style:none !important;padding-bottom:0}div[data-handler=markets] .user-order .user-order-header{padding:5px 10px 5px 20px;font-size:14px;position:relative}div[data-handler=markets] .user-order .user-order-header .side-indicator{position:absolute;left:0;top:0;bottom:0;width:8px}div[data-handler=markets] .user-order .user-order-header .side-indicator.buy{background-color:var(--buy-color)}div[data-handler=markets] .user-order .user-order-header .side-indicator.sell{background-color:var(--market-sell-color)}div[data-handler=markets] .user-order .user-order-header .side-indicator.inactive{opacity:.5}div[data-handler=markets] .user-order .user-order-header .active-indicator{height:8px;border-radius:4px}div[data-handler=markets] .user-order .user-order-header .active-indicator.active{margin:0 5px;width:8px;background-color:var(--buy-color)}div[data-handler=markets] .user-order .order-details{margin-bottom:25px;padding:0 10px 10px;display:grid;grid-template-columns:1fr 1fr 1fr 1fr;row-gap:10px;column-gap:5px;line-height:1}div[data-handler=markets] .user-order .order-details .user-order-datum{flex-grow:1;display:flex;flex-direction:column;align-items:flex-start}div[data-handler=markets] .user-order .order-details .user-order-datum>span:first-child{font-size:12px;font-family:\"demi-sans\",sans-serif;color:gray;margin-bottom:2px}div[data-handler=markets] .user-order .order-details .user-order-datum>span:nth-child(2){font-size:14px}div[data-handler=markets] .user-order .order-details .user-order-datum.full-span{grid-column:1/-1}div[data-handler=markets] .markettab{height:30px;border-style:none;background-color:var(--section-bg)}div[data-handler=markets] .markettab.selected{background-color:var(--market-markettab-selected-bg)}div[data-handler=markets] .numorders{background-color:var(--market-numorders-bg);padding:1px 2px}div[data-handler=markets] #leftMarketDock{position:absolute;display:flex;top:0;left:0;z-index:2;min-height:-webkit-fill-available;background-color:var(--section-bg)}div[data-handler=markets] #leftMarketDock.default,div[data-handler=markets] #leftMarketDock.stashed{display:none}div[data-handler=markets] #leftMarketDock #searchBoxV1{height:55px}div[data-handler=markets] #leftMarketDock.stashed{display:none}div[data-handler=markets] #leftMarketDock #marketSearchV1:focus{border:none;outline:none}div[data-handler=markets] #leftMarketDock #marketSearchV1{width:100%;z-index:2;background-color:rgba(0,0,0,0);font-size:25px;text-align:center;font-family:\"demi-sans\",sans-serif;font-variant:small-caps;border:none}div[data-handler=markets] #leftMarketDock #marketSearchV1+.ico-search{z-index:1;position:absolute;left:50%;top:50%;transform:translateX(-50%) translateY(-50%);opacity:.25}div[data-handler=markets] #leftMarketDock #marketSearchV1:hover+.ico-search{opacity:.5}div[data-handler=markets] #leftMarketDock #marketSearchV1:not(:placeholder-shown)+.ico-search,div[data-handler=markets] #leftMarketDock #marketSearchV1:focus+.ico-search{display:none}div[data-handler=markets] #leftMarketDock #marketListV1{height:100%;min-width:275px}div[data-handler=markets] #leftMarketDock #marketListV1>div .dexname{max-width:60px;overflow:hidden;text-overflow:ellipsis}div[data-handler=markets] #leftMarketDock #marketListV1>div.selected{background-color:rgba(119,119,119,.2)}div[data-handler=markets] #mainContent{display:flex;flex-direction:column;align-items:center}div[data-handler=markets] #mainContent>div,div[data-handler=markets] #mainContent>section{min-height:500px;display:flex}div[data-handler=markets] #mainContent>div:first-child,div[data-handler=markets] #mainContent>section:first-child{max-height:1000px;order:3}div[data-handler=markets] #mainContent>div:nth-child(2),div[data-handler=markets] #mainContent>section:nth-child(2){order:1}div[data-handler=markets] #mainContent>div:last-child,div[data-handler=markets] #mainContent>section:last-child{order:2}div[data-handler=markets] #epochLine,div[data-handler=markets] #durBttnBox{position:absolute;left:65px;top:5px;background-color:var(--section-bg);z-index:1}div[data-handler=markets] #durBttnBox .candle-dur-bttn{background-color:var(--section-bg);padding:2px 4px;font-size:14px;line-height:1;margin:0 2px}div[data-handler=markets] #durBttnBox .candle-dur-bttn:hover{background-color:rgba(119,119,119,.4666666667)}div[data-handler=markets] #durBttnBox .candle-dur-bttn:hover,div[data-handler=markets] #durBttnBox .candle-dur-bttn.selected{border-color:var(--text-warning);color:var(--text-warning)}div[data-handler=markets] #epochLine .epoch-line{display:inline-block;border-top:3px dotted #626262;width:25px;height:0;margin-right:5px;position:relative;top:1px}div[data-handler=markets] #loaderMsg{color:#777}div[data-handler=markets] #bondCreationPending .title{font-weight:bold;margin-bottom:5px;color:#9b8c09}div[data-handler=markets] #registrationStatus .title{font-weight:bold;margin-bottom:5px}div[data-handler=markets] #registrationStatus.waiting .title{color:#9b8c09}div[data-handler=markets] #registrationStatus.completed .title{color:#0b5831}div[data-handler=markets] #registrationStatus.completed #regStatusMessage{display:none}div[data-handler=markets] #registrationStatus.error .title{color:rgba(221,34,34,.9333333333)}div[data-handler=markets] #approveTokenForm{width:450px}div[data-handler=markets] #verifyForm .echo-data span{margin:0 5px}div[data-handler=markets] #verifyForm .disclaimer{text-align:justify}div[data-handler=markets] #verifyForm header.buygreen-bg{background-color:var(--market-buygreen-bg)}div[data-handler=markets] #verifyForm header.sellred-bg{background-color:var(--market-sellred-bg)}div[data-handler=markets] #verifyForm button.buygreen-bg{background-color:var(--market-buygreen-bg)}div[data-handler=markets] #verifyForm button.sellred-bg{background-color:var(--market-sellred-bg)}div[data-handler=markets] #verifyForm .loader{height:40px}div[data-handler=markets] #verifyForm .order-opt{opacity:.7}div[data-handler=markets] #verifyForm .order-opt:not(.selected){cursor:pointer}div[data-handler=markets] #verifyForm .order-opt.selected{opacity:1;background-color:var(--form-opt-selected-bg)}div[data-handler=markets] #verifyForm .order-opt.selected div.opt-check{background-color:#0b5831}div[data-handler=markets] #vDetailPane{max-width:425px}div[data-handler=markets] #vDetailPane .indent{border-left:2px solid var(--border-color)}div[data-handler=markets] #vDetailPane table.fee-breakout td{text-align:center;padding:2px 5px}div[data-handler=markets] #marketReopener{display:none;padding:10px 0;position:absolute;top:0;left:0;background-color:var(--section-bg);z-index:10}div[data-handler=markets] #leftHider .ico-arrowleft,div[data-handler=markets] #leftHider .ico-arrowright,div[data-handler=markets] #marketReopener .ico-arrowleft,div[data-handler=markets] #marketReopener .ico-arrowright{transform:scaleX(0.5);opacity:.5}div[data-handler=markets] #leftHider:hover .ico-arrowleft,div[data-handler=markets] #leftHider:hover .ico-arrowright,div[data-handler=markets] #marketReopener:hover .ico-arrowleft,div[data-handler=markets] #marketReopener:hover .ico-arrowright{opacity:1}.market-stats{display:flex;margin:0 5px;gap:15px}.market-stats .statgrid{display:grid;grid-template-columns:auto auto auto}.market-stats.listopen .ico-arrowdown{display:none}.market-stats:not(.listopen) .ico-arrowup{display:none}#headerSpace .market-stats{display:none}#recentMatchesBox{max-height:350px}#recentMatchesTable th{align-items:center}#recentMatchesTable th:hover{opacity:.7}#recentMatchesTable th .ico-arrowdown{display:inline-block;visibility:hidden;vertical-align:middle;font-size:10px;margin-left:5px}#recentMatchesTable th.sorted-dsc .ico-arrowdown{visibility:visible}#recentMatchesTable th.sorted-asc .ico-arrowdown{visibility:visible;transform:rotate(180deg)}@media(min-width: 1200px){#main .market-stats{display:none;border-top:none}#headerSpace .market-stats{display:flex;border-bottom:none !important}div[data-handler=markets] #leftMarketDock{position:relative}div[data-handler=markets] #leftMarketDock.default{display:flex}}@media(min-width: 992px){div[data-handler=markets] #mainContent{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden;flex-direction:row;align-items:stretch}div[data-handler=markets] #mainContent>section,div[data-handler=markets] #mainContent>div{min-height:none;display:flex}div[data-handler=markets] #mainContent>section:nth-child(n),div[data-handler=markets] #mainContent>div:nth-child(n){min-height:auto}div[data-handler=markets] #mainContent>section:first-child,div[data-handler=markets] #mainContent>div:first-child{order:1}div[data-handler=markets] #mainContent>section:nth-child(2),div[data-handler=markets] #mainContent>div:nth-child(2){order:2}div[data-handler=markets] #mainContent>section:last-child,div[data-handler=markets] #mainContent>div:last-child{order:3}div[data-handler=markets] .ordertable-wrap{height:calc(50% - 15px);display:flex}div[data-handler=markets] .ordertable-wrap.reversible{flex-direction:column-reverse}div[data-handler=markets] .ordertable-wrap tbody{display:flex;align-items:stretch}div[data-handler=markets] .ordertable-wrap tbody#sellRows{flex-direction:column-reverse;border-top:none}div[data-handler=markets] .ordertable-wrap tbody#buyRows{flex-direction:column}div[data-handler=markets] .orderbook{width:auto}div[data-handler=markets] .orderbook>div:first-child{order:1}div[data-handler=markets] .orderbook>div:nth-child(2){order:2}div[data-handler=markets] .orderbook>div:last-child{order:3}div[data-handler=markets] .order-panel>div{position:absolute;top:0;bottom:0;left:0;right:0;overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(119,119,119,.2666666667) rgba(119,119,119,.0666666667);height:100%;overflow-x:hidden}div[data-handler=markets] .order-panel>div::-webkit-scrollbar{width:8px;height:8px}div[data-handler=markets] .order-panel>div::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}div[data-handler=markets] .order-panel>div::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}div[data-handler=markets] #leftMarketDock.stashed+#marketReopener{display:block}#recentMatchesBox{overflow:visible;max-height:none;border-bottom:none}#candlesLegend,#depthLegend{z-index:10;position:absolute;top:0;right:0;background-color:var(--section-bg)}}.user-order-floaty-menu{position:absolute;display:flex;align-items:center;z-index:5;border-style:none solid solid;border-width:0 2px 2px 1px;border-color:var(--border-color);background-color:var(--section-bg);cursor:pointer;overflow:hidden}.user-order-floaty-menu>span,.user-order-floaty-menu>a{margin:0 5px;padding-right:10px;padding-left:10px}.user-order-floaty-menu>span:hover,.user-order-floaty-menu>a:hover{background-color:rgba(119,119,119,.3333333333)}.bot-problems-section{background-color:rgba(255,0,0,.6666666667);margin-top:2px;margin-bottom:2px;padding-left:2px;border-radius:5px}.walletspage .ico-unlocked{color:var(--indicator-good)}.walletspage .market-select-logo{width:20px;height:20px}.walletspage .short-host{text-overflow:ellipsis;max-width:175px}.walletspage .mw-90p{min-width:90%}.walletspage #recoverWalletConfirm,.walletspage #confirmForce,.walletspage #toggleWalletStatusConfirm{width:400px}.walletspage #content{flex-direction:column}.walletspage #assetSelect{flex-direction:row}.walletspage #assetSelect .icon-select{cursor:pointer;min-height:fit-content}.walletspage #assetSelect .icon-select img[data-tmpl=img]{width:30px;height:30px}.walletspage #assetSelect .icon-select img[data-tmpl=parentImg]{position:absolute;left:15px;bottom:15px;width:20px;height:20px;border-radius:10px;border:3px solid var(--section-bg);background-color:var(--section-bg)}.walletspage #assetSelect .icon-select.selected,.walletspage #assetSelect .icon-select:hover{background-color:var(--body-bg);opacity:1}.walletspage #assetSelect .icon-select.selected img[data-tmpl=parentImg],.walletspage #assetSelect .icon-select:hover img[data-tmpl=parentImg]{border:3px solid var(--body-bg);background-color:var(--section-bg)}.walletspage #assetSelect .icon-select.nowallet{opacity:.7}.walletspage #assetSelect .icon-select.nowallet [data-tmpl=balance]{display:none}.walletspage table#balanceTable td{line-height:1}.walletspage table#balanceTable tr.itemized>td{padding-bottom:.25rem}.walletspage table#balanceTable tr:not(.sub,:first-child) td{padding-top:.5rem}.walletspage table#balanceTable tr{font-size:1.1rem}.walletspage table#balanceTable tr.sub{font-size:.9rem}.walletspage table#balanceTable tr.sub.last>td:first-child::before{content:\"└─ \"}.walletspage table#balanceTable tr.sub>td:first-child::before{content:\"├─ \"}.walletspage table#balanceTable tr.sub>td:last-child{border-right:1px solid var(--border-color);padding-right:.5rem}.walletspage #walletInfo{border-left:none}.walletspage #walletInfo table#walletInfoTable td{padding:2px 5px 2px 0;line-height:1}.walletspage #walletInfo table#walletInfoTable td:last-child{text-align:right;padding-left:1rem}.walletspage #earlierTxs,.walletspage #txViewBlockExplorer{text-decoration:underline;cursor:pointer}.walletspage #checkmarkBox{height:100px}.walletspage #walletDetailsBox #assetLogo{width:30px;height:30px}.walletspage #walletDetailsBox #assetName{font-size:30px}.walletspage #walletDetailsBox #balance{font-size:20px}.walletspage #walletDetailsBox #balanceUnit{font-size:17px}.walletspage #walletDetailsBox #fiatBalanceBox{font-size:13px}.walletspage #walletDetailsBox #tokenParentLogo{width:18px;height:18px}.walletspage #walletDetailsBox #contractAddress{opacity:.4}.walletspage .peers-table-icon{padding-left:30%}.walletspage #vspDisplay #vspEditIcon{display:none}.walletspage #vspDisplay:hover #vspEditIcon{display:inline}.walletspage .scrollsmall{overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(119,119,119,.2666666667) rgba(119,119,119,.0666666667)}.walletspage .scrollsmall::-webkit-scrollbar{width:8px;height:8px}.walletspage .scrollsmall::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}.walletspage .scrollsmall::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}.walletspage .positive-tx{color:var(--indicator-good)}.walletspage .negative-tx{color:rgba(221,34,34,.9333333333)}@media(min-width: 1200px){.scrollsmall{overflow:hidden}.column{overflow:auto;scrollbar-width:none;position:absolute;top:0;bottom:0;left:0;right:0}.column::-webkit-scrollbar{display:none}}@media(min-width: 992px){.fill-abs-lg{position:absolute;top:0;bottom:0;left:0;right:0}.stylish-overflow-lg{overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(119,119,119,.2666666667) rgba(119,119,119,.0666666667)}.stylish-overflow-lg::-webkit-scrollbar{width:8px;height:8px}.stylish-overflow-lg::-webkit-scrollbar-track{background-color:var(--tertiary-bg)}.stylish-overflow-lg::-webkit-scrollbar-thumb{background-color:var(--tertiary-bg);border-radius:4px}.walletspage #walletDetailsBox{border-bottom:none !important}.flex-wrap-lg{flex-wrap:wrap}#purchaseTicketsErrBox{background-color:var(--section-bg)}}@media(min-width: 576px){.walletspage #walletDetailsBox #assetLogo{width:40px;height:40px}.walletspage #walletDetailsBox #assetName{font-size:40px}.walletspage #walletDetailsBox #balance{font-size:28px}.walletspage #walletDetailsBox #balanceUnit{font-size:20px}.walletspage #walletDetailsBox #fiatBalanceBox{font-size:15px}.walletspage #content{flex-direction:row}.walletspage #assetSelect{flex-direction:column;overflow-y:auto}.walletspage #assetSelect .icon-select{padding:15px}.walletspage #assetSelect .icon-select img[data-tmpl=img]{width:40px;height:40px}.walletspage #assetSelect .icon-select img[data-tmpl=parentImg]{left:20px;bottom:20px;width:28px;height:28px;border-radius:15px}}@media(min-width: 768px){.walletspage #sendReceive{border-bottom:none}}#restoreWalletInfo,#exportWalletAuth,#unapproveTokenForm{width:450px}#txDetails{width:450px}#submitReconfig[disabled]{cursor:not-allowed}.filter-display{border-radius:3px;font-size:16px;font-weight:bold;cursor:pointer}.filter-opts{position:relative;max-width:250px;white-space:nowrap;text-overflow:ellipsis}div.order-datum{display:flex;flex-direction:column;align-items:stretch;justify-content:start;text-align:center;font-size:15px}div.order-datum div:first-child{font-family:\"demi-sans\",sans-serif;background-color:var(--tertiary-bg)}div.match-header{background-color:var(--tertiary-bg)}div.match-card{display:flex;flex-direction:column;align-items:stretch;font-size:14px}.match-data-label{opacity:.5;font-family:\"demi-sans\",sans-serif}#accelerateForm{width:500px}div.settings{min-width:375px}div[data-handler=mmsettings] #gapStrategySelect,div[data-handler=mmarchives] #gapStrategySelect,div[data-handler=mmlogs] #gapStrategySelect,div[data-handler=mm] #gapStrategySelect{width:300px}div[data-handler=mmsettings] .gap-factor-input,div[data-handler=mmsettings] .lots-input,div[data-handler=mmarchives] .gap-factor-input,div[data-handler=mmarchives] .lots-input,div[data-handler=mmlogs] .gap-factor-input,div[data-handler=mmlogs] .lots-input,div[data-handler=mm] .gap-factor-input,div[data-handler=mm] .lots-input{max-width:75px}div[data-handler=mmsettings] [data-tmpl=value].wide,div[data-handler=mmarchives] [data-tmpl=value].wide,div[data-handler=mmlogs] [data-tmpl=value].wide,div[data-handler=mm] [data-tmpl=value].wide{width:3rem}div[data-handler=mmsettings] .ico-arrowup.ml2px,div[data-handler=mmarchives] .ico-arrowup.ml2px,div[data-handler=mmlogs] .ico-arrowup.ml2px,div[data-handler=mm] .ico-arrowup.ml2px{margin-left:2px}div[data-handler=mmsettings] .pt-pt5,div[data-handler=mmarchives] .pt-pt5,div[data-handler=mmlogs] .pt-pt5,div[data-handler=mm] .pt-pt5{padding-top:.125rem}div[data-handler=mmsettings] #profitInput,div[data-handler=mmarchives] #profitInput,div[data-handler=mmlogs] #profitInput,div[data-handler=mm] #profitInput{width:70px}div[data-handler=mmsettings] .bot-type-selector,div[data-handler=mmarchives] .bot-type-selector,div[data-handler=mmlogs] .bot-type-selector,div[data-handler=mm] .bot-type-selector{border:1px solid var(--border-color);display:flex;flex-direction:column;align-items:stretch;user-select:none}div[data-handler=mmsettings] .bot-type-selector.disabled,div[data-handler=mmarchives] .bot-type-selector.disabled,div[data-handler=mmlogs] .bot-type-selector.disabled,div[data-handler=mm] .bot-type-selector.disabled{opacity:.5}div[data-handler=mmsettings] .bot-type-selector:not(.disabled),div[data-handler=mmarchives] .bot-type-selector:not(.disabled),div[data-handler=mmlogs] .bot-type-selector:not(.disabled),div[data-handler=mm] .bot-type-selector:not(.disabled){cursor:pointer}div[data-handler=mmsettings] .bot-type-selector:not(.disabled).selected,div[data-handler=mmarchives] .bot-type-selector:not(.disabled).selected,div[data-handler=mmlogs] .bot-type-selector:not(.disabled).selected,div[data-handler=mm] .bot-type-selector:not(.disabled).selected{outline:2px solid #0b5831;background-color:rgba(119,119,119,.1333333333)}div[data-handler=mmsettings] .bot-problems-section,div[data-handler=mmarchives] .bot-problems-section,div[data-handler=mmlogs] .bot-problems-section,div[data-handler=mm] .bot-problems-section{background-color:rgba(255,0,0,.6666666667);margin-top:2px;margin-bottom:2px;padding-left:2px;border-radius:5px}div[data-handler=mmsettings] #marketFilterIcon,div[data-handler=mmarchives] #marketFilterIcon,div[data-handler=mmlogs] #marketFilterIcon,div[data-handler=mm] #marketFilterIcon{position:absolute;left:10px;top:50%;transform:translateY(-50%);opacity:.5}div[data-handler=mmsettings] #botTypeForm,div[data-handler=mmarchives] #botTypeForm,div[data-handler=mmlogs] #botTypeForm,div[data-handler=mm] #botTypeForm{min-width:375px}div[data-handler=mmsettings] #cexSelection .cex-selector,div[data-handler=mmarchives] #cexSelection .cex-selector,div[data-handler=mmlogs] #cexSelection .cex-selector,div[data-handler=mm] #cexSelection .cex-selector{user-select:none}div[data-handler=mmsettings] #cexSelection .cex-selector.configured:not(.selected),div[data-handler=mmarchives] #cexSelection .cex-selector.configured:not(.selected),div[data-handler=mmlogs] #cexSelection .cex-selector.configured:not(.selected),div[data-handler=mm] #cexSelection .cex-selector.configured:not(.selected){opacity:.8}div[data-handler=mmsettings] #cexSelection.disabled .cex-selector.configured,div[data-handler=mmarchives] #cexSelection.disabled .cex-selector.configured,div[data-handler=mmlogs] #cexSelection.disabled .cex-selector.configured,div[data-handler=mm] #cexSelection.disabled .cex-selector.configured{opacity:.5}div[data-handler=mmsettings] #cexSelection.disabled .cex-selector:not(.configured),div[data-handler=mmarchives] #cexSelection.disabled .cex-selector:not(.configured),div[data-handler=mmlogs] #cexSelection.disabled .cex-selector:not(.configured),div[data-handler=mm] #cexSelection.disabled .cex-selector:not(.configured){cursor:pointer}div[data-handler=mmsettings] #cexSelection:not(.disabled) .cex-selector,div[data-handler=mmarchives] #cexSelection:not(.disabled) .cex-selector,div[data-handler=mmlogs] #cexSelection:not(.disabled) .cex-selector,div[data-handler=mm] #cexSelection:not(.disabled) .cex-selector{cursor:pointer}div[data-handler=mmsettings] #cexSelection:not(.disabled) .cex-selector.selected,div[data-handler=mmarchives] #cexSelection:not(.disabled) .cex-selector.selected,div[data-handler=mmlogs] #cexSelection:not(.disabled) .cex-selector.selected,div[data-handler=mm] #cexSelection:not(.disabled) .cex-selector.selected{border-color:#0b5831 !important;border-width:2px !important;background-color:rgba(119,119,119,.1333333333) !important}div[data-handler=mmsettings] #cexSelection .reconfig,div[data-handler=mmarchives] #cexSelection .reconfig,div[data-handler=mmlogs] #cexSelection .reconfig,div[data-handler=mm] #cexSelection .reconfig{position:absolute;top:0;right:0}div[data-handler=mmsettings] #quickConfig input[type=number],div[data-handler=mmarchives] #quickConfig input[type=number],div[data-handler=mmlogs] #quickConfig input[type=number],div[data-handler=mm] #quickConfig input[type=number]{width:100px}div[data-handler=mmsettings] #levelSpacingBox.disabled,div[data-handler=mmarchives] #levelSpacingBox.disabled,div[data-handler=mmlogs] #levelSpacingBox.disabled,div[data-handler=mm] #levelSpacingBox.disabled{opacity:.5}div[data-handler=mmsettings] #placementsChart,div[data-handler=mmsettings] [data-tmpl=placementsChart],div[data-handler=mmarchives] #placementsChart,div[data-handler=mmarchives] [data-tmpl=placementsChart],div[data-handler=mmlogs] #placementsChart,div[data-handler=mmlogs] [data-tmpl=placementsChart],div[data-handler=mm] #placementsChart,div[data-handler=mm] [data-tmpl=placementsChart]{height:100px}div[data-handler=mmsettings] #buyPlacementsBox .ico-cross,div[data-handler=mmsettings] #sellPlacementsBox .ico-cross,div[data-handler=mmarchives] #buyPlacementsBox .ico-cross,div[data-handler=mmarchives] #sellPlacementsBox .ico-cross,div[data-handler=mmlogs] #buyPlacementsBox .ico-cross,div[data-handler=mmlogs] #sellPlacementsBox .ico-cross,div[data-handler=mm] #buyPlacementsBox .ico-cross,div[data-handler=mm] #sellPlacementsBox .ico-cross{color:var(--text-danger)}div[data-handler=mmsettings] #buyPlacementsBox .ico-plus,div[data-handler=mmsettings] #sellPlacementsBox .ico-plus,div[data-handler=mmarchives] #buyPlacementsBox .ico-plus,div[data-handler=mmarchives] #sellPlacementsBox .ico-plus,div[data-handler=mmlogs] #buyPlacementsBox .ico-plus,div[data-handler=mmlogs] #sellPlacementsBox .ico-plus,div[data-handler=mm] #buyPlacementsBox .ico-plus,div[data-handler=mm] #sellPlacementsBox .ico-plus{color:var(--btn-go-bg)}div[data-handler=mmsettings] #noBots .ico-robot,div[data-handler=mmarchives] #noBots .ico-robot,div[data-handler=mmlogs] #noBots .ico-robot,div[data-handler=mm] #noBots .ico-robot{font-size:80px;opacity:.7}div[data-handler=mmsettings] #dexOrderDetailsForm,div[data-handler=mmsettings] #cexOrderDetailsForm,div[data-handler=mmsettings] #depositDetailsForm,div[data-handler=mmsettings] #withdrawalDetailsForm,div[data-handler=mmarchives] #dexOrderDetailsForm,div[data-handler=mmarchives] #cexOrderDetailsForm,div[data-handler=mmarchives] #depositDetailsForm,div[data-handler=mmarchives] #withdrawalDetailsForm,div[data-handler=mmlogs] #dexOrderDetailsForm,div[data-handler=mmlogs] #cexOrderDetailsForm,div[data-handler=mmlogs] #depositDetailsForm,div[data-handler=mmlogs] #withdrawalDetailsForm,div[data-handler=mm] #dexOrderDetailsForm,div[data-handler=mm] #cexOrderDetailsForm,div[data-handler=mm] #depositDetailsForm,div[data-handler=mm] #withdrawalDetailsForm{min-width:400px}div[data-handler=mmsettings] .allocation-grid,div[data-handler=mmarchives] .allocation-grid,div[data-handler=mmlogs] .allocation-grid,div[data-handler=mm] .allocation-grid{display:grid;grid-template-columns:1fr auto auto}div[data-handler=mmsettings] .allocation-grid .second,div[data-handler=mmarchives] .allocation-grid .second,div[data-handler=mmlogs] .allocation-grid .second,div[data-handler=mm] .allocation-grid .second{grid-column:2}div[data-handler=mmsettings] .allocation-grid .third,div[data-handler=mmarchives] .allocation-grid .third,div[data-handler=mmlogs] .allocation-grid .third,div[data-handler=mm] .allocation-grid .third{grid-column:3}","// This file defines the color scheme used in the light and dark themes.\n\nbody:not(.dark) {\n // body & text\n --body-bg: #fafafa;\n --body-bg-lower-opacity: #fafafa88;\n --section-bg: #f6f6f6;\n --form-bg: #f0f0f0;\n --tertiary-bg: #7772;\n --text-color: #333;\n --text-color-secondary: #4a4949;\n --text-danger: #d22;\n --text-warning: #f82e;\n --text-grey: #777;\n --border-color: #ddd;\n --hint-color: #4397cd;\n\n // links\n --link-color: #2a71d5;\n --link-color-hover: #144487;\n --subtle-link-color: #05053b;\n --subtle-link-hover: #07075e;\n\n // popup notes\n --popup-notes-bg: black;\n --popup-notes-color: #dfe2e1;\n\n // buttons\n --btn-feature-bg: #6bc5ff;\n --btn-feature-hover-bg: #a3dbff;\n --btn-feature-border-color: #759cb5;\n --btn-featur-hover-border-color: #9bc3dd;\n --btn-danger-hover-color: white;\n --btn-border-color: #ddd;\n --btn-hover-border-color: #ddd;\n --btn-go-bg: #0b5831;\n --btn-go-hover-bg: #0b5831;\n --btn-go-color: #fff;\n\n // forms\n --forms-bg: #fafafa99;\n --form-input-bg: #fff;\n --form-input-border: #999;\n --form-input-border-focus: #555;\n --form-input-bg-active: #3095db;\n --form-opt-selected-bg: #0001;\n --form-selected-tab-bg: white;\n\n // market view\n --indicator-good: #179717;\n --buy-color: #207a46;\n --sell-color: #99302b;\n --market-buygreen-bg: #207a4699;\n --market-sellred-bg: #99302b99;\n --market-sell-color: #99302b;\n --market-btn-color: #555;\n --market-btn-selected-color: black;\n --market-markettab-selected-bg: #7773;\n --market-orderopt-bg: #fff1;\n --market-numorders-bg: #c5c5e6;\n\n // loader\n --loader-bg: #e0e0e077;\n\n // logo\n --dex-url: url(\"/img/softened-icon.png\");\n}\n\n\nbody.dark {\n // body & text\n --body-bg: #040b14;\n --body-bg-lower-opacity: #040b1488;\n --section-bg: #071627;\n --form-bg: #0a1e34;\n --tertiary-bg: #78787822;\n --text-color: #dfe2e1;\n --text-color-secondary: #a1a1a1;\n --text-danger: #ec6a6a;\n --text-warning: #f82e;\n --text-grey: #999;\n --border-color: #383f4b;\n --hint-color: #64b2e5;\n\n // links\n --link-color: #388bff;\n --link-color-hover: #5e9ffa;\n --subtle-link-color: #e6e6ff;\n --subtle-link-hover: #d1d1ff;\n\n // popup notes\n --popup-notes-bg: white;\n --popup-notes-color: #333;\n\n // buttons\n --btn-border-color: #7777;\n --btn-hover-border-color: #777;\n --btn-feature-bg: #0a4972;\n --btn-feature-hover-bg: #176699;\n --btn-feature-border-color: #1e618d;\n --btn-featur-hover-border-color: #85a5ba;\n --btn-danger-hover-color: white;\n --btn-go-bg: #0b5831;\n --btn-go-hover-bg: #0b5831;\n --btn-go-color: #fff;\n\n // forms\n --forms-bg: #05141f99;\n --form-input-bg: #0009;\n --form-input-border: #555;\n --form-input-border-focus: #4271ce;\n --form-input-bg-active: #27278d;\n --form-opt-selected-bg: #fff1;\n --form-selected-tab-bg: #39447c;\n\n // market view\n --indicator-good: #29bb77;\n --buy-color: #29bb77;\n --sell-color: #e95e5e;\n --market-buygreen-bg: #29bb7799;\n --market-sellred-bg: #e95e5e99;\n --market-sell-color: #e95e5e;\n --market-btn-color: #aaa;\n --market-btn-selected-color: #eee;\n --market-markettab-selected-bg: #fff1;\n --market-orderopt-bg: #0001;\n --market-numorders-bg: #141488;\n\n // loader\n --loader-bg: #13202b77;\n\n // logo\n --dex-url: url(\"/img/softened-icon-dark.png\");\n}\n\n.greyscale {\n filter: grayscale(1);\n}\n\n.blurry-bg {\n -webkit-backdrop-filter: blur(4px);\n backdrop-filter: blur(4px);\n}\n\n.body-bg {\n background-color: var(--body-bg);\n}\n\n.section-bg {\n background-color: var(--section-bg);\n}\n\n.text-good {\n color: var(--indicator-good);\n}\n","$sans: \"source-sans\", sans-serif;\n$demi-sans: \"demi-sans\", sans-serif;\n$mono: \"mono\", monospace;\n\n/* fonts */\n@font-face {\n font-family: \"source-sans\";\n src:\n url(\"/font/source-sans-pro-v9-latin-regular.woff\") format(\"woff\"),\n url(\"/font/source-sans-pro-v9-latin-regular.svg\") format(\"svg\");\n font-weight: normal;\n font-style: normal;\n}\n\n/* fonts */\n@font-face {\n font-family: \"demi-sans\";\n src:\n url(\"/font/source-sans-pro-semibold.woff\") format(\"woff\"),\n url(\"/font/source-sans-pro-semibold.svg\") format(\"svg\");\n font-weight: bolder;\n font-style: normal;\n}\n\n@font-face {\n font-family: \"mono\";\n src:\n url(\"/font/inconsolata-v15-latin-regular.woff\") format(\"woff\"),\n url(\"/font/inconsolata-v15-latin-regular.svg\") format(\"svg\");\n font-weight: normal;\n font-style: normal;\n}\n\n.fs8 {\n font-size: 8px;\n}\n\n.fs10 {\n font-size: 10px;\n}\n\n.fs11 {\n font-size: 11px;\n}\n\n.fs12 {\n font-size: 12px;\n}\n\n.fs13 {\n font-size: 13px;\n}\n\n.fs14 {\n font-size: 14px;\n}\n\n.fs15 {\n font-size: 15px;\n}\n\n.fs16 {\n font-size: 16px;\n}\n\n.fs17 {\n font-size: 17px;\n}\n\n.fs18 {\n font-size: 18px;\n}\n\n.fs20 {\n font-size: 20px;\n}\n\n.fs22 {\n font-size: 22px;\n}\n\n.fs24 {\n font-size: 24px;\n}\n\n.fs26 {\n font-size: 24px;\n}\n\n.fs28 {\n font-size: 28px;\n}\n\n.fs32 {\n font-size: 32px;\n}\n\n.fs35 {\n font-size: 35px;\n}\n\n.fs50 {\n font-size: 50px;\n}\n\n.demi {\n font-family: $demi-sans;\n}\n\n.mono {\n font-family: $mono;\n}\n\n.sans {\n font-family: $sans;\n}\n\n.bold {\n font-weight: bold;\n}\n",".flex-grow-1 {\n flex-grow: 1;\n}\n\n.flex-center {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.flex-stretch-column {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n}\n\n.flex-wrap {\n flex-wrap: wrap;\n}\n\n.text-nowrap {\n white-space: nowrap;\n}\n\n.position-relative {\n position: relative;\n}\n\n.position-absolute {\n position: absolute;\n}\n\n.hoverbg:hover {\n background-color: var(--tertiary-bg);\n}\n\n.invisible {\n visibility: hidden;\n}\n\n.stylish-overflow {\n @include stylish-overflow;\n\n &.hoveronly:not(:hover) {\n scrollbar-color: transparent transparent;\n\n &::-webkit-scrollbar-track {\n background-color: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: transparent;\n border-radius: 4px;\n }\n }\n\n &.overflow-x-hidden {\n overflow-x: hidden;\n }\n}\n\n.hidden-overflow {\n @include hidden-overflow;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n\n.ease-color {\n transition: color 1s ease;\n}\n\n.mw-375 {\n max-width: 375px;\n}\n\n.mw-425 {\n max-width: 425px;\n}\n\n.max-h-100 {\n max-height: 100%;\n}\n\n.d-hide {\n display: none !important;\n}\n\n.buycolor {\n color: var(--buy-color);\n}\n\n.sellcolor {\n color: var(--sell-color);\n}\n\n.grey {\n color: var(--text-grey);\n}\n\n.rounded3 {\n border-radius: 3px;\n}\n\nhr.dashed {\n @include border-top(2px, dashed);\n}\n\n\nimg.token-parent {\n width: 0.7em;\n height: 0.7em;\n position: relative;\n top: -0.4em;\n}\n\nsup.token-parent {\n font-size: 0.6em;\n position: relative;\n top: -0.6em;\n}\n\n.preline {\n white-space: pre-line;\n}\n\n.vscroll {\n @extend .stylish-overflow;\n\n max-width: 100%;\n overflow-x: hidden;\n}\n\n.pointer {\n cursor: pointer !important;\n}\n\n.underline {\n text-decoration: underline;\n}\n\n.plainlink {\n color: inherit;\n}\n\n.ico-info {\n margin-left: 0.25rem;\n}\n\n.subtlelink,\n.subtlelink:visited {\n text-decoration: none;\n\n // TODO this color is almost identical to the default body color, with text-decoration: none\n // the link isn't visible. Consider using a different shade.\n // color: var(--subtle-link-color);\n &:hover {\n text-decoration: underline !important;\n // color: var(--subtle-link-hover-color);\n cursor: pointer;\n }\n}\n\n.word-break-all {\n word-break: break-all;\n user-select: all;\n}\n\n.lh1 {\n line-height: 1;\n}\n\n.fill-abs {\n @include fill-abs;\n}\n\n.min-fit {\n min-height: fit-content;\n}\n\ndiv.clear {\n opacity: 0; // Set by animation upon initial loading.\n}\n\n\n.overflow-y-auto {\n overflow-y: auto;\n}\n\n.overflow-y-hidden {\n overflow-y: hidden;\n}\n\n.overflow-x-hidden,\n.stylish-overflow.overflow-x-hidden {\n overflow-x: hidden;\n}\n\n.user-select-all {\n user-select: all;\n}\n\n.overflow-ellipsis {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.user-select-none {\n user-select: none;\n}\n\n.text-danger {\n color: var(--text-danger);\n}\n\n.text-warning {\n color: var(--text-warning);\n}\n\n.text-buycolor {\n color: var(--buy-color);\n}\n\n.text-sellcolor {\n color: var(--sell-color);\n}\n","@use 'sass:map';\n\n@mixin stylish-overflow {\n overflow: auto;\n scrollbar-width: thin;\n scrollbar-color: #7774 #7771;\n\n /* Works on Chrome/Edge/Safari */\n &::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n\n &::-webkit-scrollbar-track {\n background-color: var(--tertiary-bg);\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: var(--tertiary-bg);\n border-radius: 4px;\n }\n}\n\n@mixin hidden-overflow {\n overflow: auto;\n scrollbar-width: none; /* Firefox */\n\n &::-webkit-scrollbar {\n display: none; /* Safari and Chrome */\n }\n}\n\n@mixin fill-abs {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n}\n\n@mixin border($width: 1px, $style: solid, $color: var(--border-color)) {\n border: $width $style $color;\n}\n\n@mixin border-top($width: 1px, $style: solid, $color: var(--border-color)) {\n border-top: $width $style $color;\n}\n\n@mixin border-bottom($width: 1px, $style: solid, $color: var(--border-color)) {\n border-bottom: $width $style $color;\n}\n\n@mixin border-left($width: 1px, $style: solid, $color: var(--border-color)) {\n border-left: $width $style $color;\n}\n\n@mixin border-right($width: 1px, $style: solid, $color: var(--border-color)) {\n border-right: $width $style $color;\n}\n\n","/* icons */\n\n@font-face {\n font-family: \"icomoon\";\n src:\n url(\"/font/icomoon.ttf?u8i98qq\") format(\"truetype\"),\n url(\"/font/icomoon.woff?u8i98qq\") format(\"woff\"),\n url(\"/font/icomoon.svg?u8i98qq#icomoon\") format(\"svg\");\n font-weight: normal;\n font-style: normal;\n}\n\n[class^=\"ico-\"],\n[class*=\" ico-\"] {\n /* use !important to prevent issues with browser extensions that change fonts */\n font-family: \"icomoon\", monospace !important;\n speak: none;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n\n /* Better Font Rendering =========== */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.micro-icon {\n height: 15px;\n width: 15px;\n}\n\n.mini-icon {\n height: 20px;\n width: 20px;\n}\n\n.small-icon {\n height: 25px;\n width: 25px;\n}\n\n.medium-icon {\n height: 30px;\n width: 30px;\n}\n\n.large-icon {\n height: 40px;\n width: 40px;\n}\n\n.enourmous-icon {\n height: 50px;\n width: 50px;\n}\n\n.ico-spinner::before {\n content: \"\\e97b\";\n}\n\n.ico-settings::before {\n content: \"\\e995\";\n}\n\n.ico-plus::before {\n content: \"\\ea0a\";\n}\n\n.ico-minus::before {\n content: \"\\ea0b\";\n}\n\n.ico-check::before {\n content: \"\\ea10\";\n display: inline-block;\n color: var(--buy-color);\n}\n\n.ico-bell::before {\n content: \"\\e900\";\n}\n\n.ico-locked::before {\n content: \"\\e98f\";\n}\n\n.ico-unlocked::before {\n content: \"\\e990\";\n}\n\n.ico-sleeping::before {\n content: \"\\e901\";\n}\n\n.ico-cross::before {\n content: \"\\e902\";\n}\n\n.ico-profile::before {\n content: \"\\e903\";\n}\n\n.ico-disconnected::before {\n content: \"\\e904\";\n}\n\n.ico-search::before {\n content: \"\\e905\";\n}\n\n.ico-expired::before {\n content: \"\\e906\";\n}\n\n.ico-info::before {\n content: \"\\e907\";\n}\n\n.ico-textfile::before {\n content: \"\\e908\";\n}\n\n.ico-open::before {\n content: \"\\e909\";\n}\n\n.ico-sync::before {\n content: \"\\e90a\";\n}\n\n.ico-target::before {\n content: \"\\e90b\";\n}\n\n.ico-arrowright::before {\n content: \"\\e90c\";\n}\n\n.ico-arrowdown::before {\n content: \"\\e90c\";\n display: inline-block;\n transform: rotate(90deg);\n}\n\n.ico-arrowleft::before {\n content: \"\\e90c\";\n display: inline-block;\n transform: rotate(180deg);\n}\n\n.ico-wide-headed-left-arrow::before {\n content: \"\\e919\";\n display: inline-block;\n}\n\n.ico-arrowup::before {\n content: \"\\e90c\";\n display: inline-block;\n transform: rotate(-90deg);\n}\n\n.ico-checkbox::before {\n content: \"\\e90d\";\n}\n\n.ico-connection::before {\n content: \"\\e90e\";\n}\n\n.ico-rocket::before {\n content: \"\\e90f\";\n}\n\n.ico-copy::before {\n content: \"\\e910\";\n}\n\n.ico-qrcode::before {\n content: \"\\e911\";\n}\n\n.ico-send::before {\n content: \"\\e912\";\n}\n\n.ico-exchange::before {\n content: \"\\e913\";\n}\n\n.ico-pause::before {\n content: \"\\e914\";\n}\n\n.ico-hamburger::before {\n content: \"\\e915\";\n}\n\n.ico-barchart::before {\n content: \"\\e916\";\n}\n\n.ico-edit::before {\n content: \"\\e917\";\n}\n\n.ico-ticket::before {\n content: \"\\e918\";\n}\n\n.ico-robot::before {\n content: \"\\e91a\";\n}\n\n.ico-secretagent::before {\n content: \"\\e91b\";\n}\n\n.ico-lever::before {\n content: \"\\e91c\";\n}\n","// Reusable components and styles \n@import \"~bootstrap/scss/mixins\";\n@import \"mixins\";\n\n\nbutton {\n background-color: transparent;\n border: 1px solid var(--btn-border-color);\n border-radius: 5px;\n outline: none;\n padding: 0.375rem 0.75rem;\n user-select: none;\n font-size: 1rem;\n color: var(--text-color);\n white-space: nowrap;\n\n &:focus {\n outline: none;\n }\n\n &:hover {\n text-decoration: none;\n border-color: var(--btn-hover-border-color);\n background-color: #7772;\n }\n\n &.small {\n padding: 0.25rem 0.5rem;\n font-size: .9rem;\n }\n\n &.large {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n }\n\n &.feature {\n background-color: var(--btn-feature-bg);\n border-color: var(--btn-feature-border-color);\n\n &:hover {\n background-color: var(--btn-feature-hover-bg);\n border-color: var(--btn-featur-hover-border-color);\n }\n }\n\n &.danger {\n border-color: var(--text-danger);\n color: var(--text-danger);\n\n &:hover {\n background-color: var(--text-danger);\n color: var(--btn-danger-hover-color);\n }\n }\n\n &.warning {\n border-color: var(--text-warning);\n color: var(--text-warning);\n\n &:hover {\n background-color: var(--text-warning);\n color: var(--btn-danger-hover-color);\n }\n }\n\n &.go {\n background-color: var(--btn-go-bg);\n color: var(--btn-go-color);\n\n &:hover {\n background-color: var(--btn-go-hover-bg);\n }\n }\n}\n\n// tables\ntable {\n color: var(--text-color);\n border-collapse: collapse;\n width: 100%;\n\n .table-group-divider {\n border-color: var(--border-color)\n }\n\n &.px-0 {\n th,\n td {\n &:last-child,\n &:first-child {\n padding-left: 0;\n padding-right: 0;\n }\n }\n\n }\n \n th,\n td {\n padding: 0.5rem;\n\n &:last-child:not(:first-child) {\n text-align: right;\n }\n\n &.no-stretch {\n width: 0;\n }\n }\n\n &.row-border {\n tbody {\n border-bottom: 1px solid var(--border-color);\n\n tr {\n border-top: 1px solid var(--border-color);\n }\n }\n }\n\n &.cell-border {\n th,\n td {\n border: 1px solid var(--border-color);\n }\n }\n\n &.nopadding {\n td {\n padding: 0;\n }\n }\n\n &.compact {\n th,\n td {\n padding: 0.25rem;\n }\n }\n\n &.row-hover {\n tr:hover {\n background-color: var(--tertiary-bg);\n }\n }\n\n &.striped {\n tr:nth-of-type(even) {\n background-color: #7772;\n }\n }\n}\n\na {\n color: var(--link-color);\n\n &:hover {\n color: var(--link-color-hover);\n }\n}\n\n@include media-breakpoint-up(md) {\n table#walletInfoTable {\n width: auto;\n }\n}\n\ntable.reg-asset-markets {\n @extend .stylish-overflow;\n\n display: block;\n max-height: 120px;\n line-height: 1.15;\n overflow-y: hidden;\n margin-right: 8px;\n\n &:hover {\n overflow-y: auto;\n }\n\n tr {\n border: none;\n }\n\n th {\n font-weight: normal;\n font-size: 13px;\n }\n\n td {\n font-size: 14px;\n }\n\n th,\n td {\n padding: 1px 5px;\n }\n}\n\n.form-check-label {\n cursor: pointer;\n}\n\n.form-check-input[type=checkbox] {\n border: 1px solid var(--form-input-border);\n cursor: pointer;\n\n &:checked {\n background-color: var(--form-input-bg-active);\n }\n}\n\nselect {\n font-family: inherit;\n padding: 0.75rem 1rem;\n}\n\n// Hide number arrows.\n// Chrome, Safari, Edge, Opera\ninput::-webkit-outer-spin-button,\ninput::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n// Firefox\ninput[type=number] {\n -moz-appearance: textfield;\n}\n\nform.card button:hover {\n color: black;\n}\n\n// Remove red background for firefox on empty number input fields.\ninput:invalid {\n box-shadow: none;\n}\n\n.dashed {\n border-style: dashed;\n}\n\n.micro-icon {\n position: relative;\n}\n\n#tooltip {\n position: absolute;\n left: -10000px;\n z-index: 1000;\n padding: 3px 6px;\n max-width: 300px;\n font-size: 15px;\n border-radius: 4px;\n background-color: var(--section-bg);\n\n @include border;\n}\n\n.on-indicator {\n width: 15px;\n height: 15px;\n border-radius: 8px;\n\n &.on {\n background-color: var(--indicator-good);\n }\n\n &.off {\n background-color: #777;\n }\n}\n\n.border-left { // alias of .border-start\n border-left: 1px solid var(--border-color);\n}\n\n.border-right { // alias of .border-end\n border-right: 1px solid var(--border-color);\n}\n\ndiv[data-handler=dexsettings],\ndiv[data-handler=init],\ndiv[data-handler=login],\ndiv[data-handler=markets],\ndiv[data-handler=mm],\ndiv[data-handler=mmsettings],\ndiv[data-handler=order],\ndiv[data-handler=orders],\ndiv[data-handler=register],\ndiv[data-handler=settings],\ndiv[data-handler=mmlogs],\ndiv[data-handler=wallets] {\n #forms>form:not(.plain) {\n border-radius: 5px;\n\n @include border;\n\n background-color: var(--form-bg);\n box-shadow: 0 3px 6px #00000021, 0 2px 7px #00000041;\n }\n}\n\n.corner-button {\n position: absolute;\n top: 0;\n\n &.left {\n left: 0;\n }\n\n &.right {\n right: 0;\n }\n}\n","@import \"~bootstrap/scss/mixins\";\n@import \"mixins\";\n\n/* elements */\nhtml {\n height: 100%;\n}\n\nbody {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n background-color: var(--body-bg);\n color: var(--text-color);\n}\n\nheader#header {\n width: 100%;\n height: 70px;\n min-height: 70px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n z-index: 100;\n background-color: var(--section-bg);\n\n a,\n a:visited,\n a:hover,\n .plainlink,\n .plainlink:visited,\n .plainlink:hover {\n text-decoration: none;\n }\n\n .hoverbright:hover {\n color: var(--subtle-link-hover);\n }\n}\n\nsection {\n background-color: var(--section-bg);\n margin: 0.5rem 0;\n border: 1px solid var(--border-color);\n border-radius: 0.25rem;\n}\n\ndiv.main {\n display: flex;\n flex-grow: 1;\n min-height: 0;\n position: relative;\n}\n\ndiv.mainlinks {\n &>div,\n &>a {\n color: var(--text-color-secondary);\n padding: 0.5rem 0.75rem;\n }\n}\n\n@include media-breakpoint-up(md) {\n div.mainlinks>div,\n div.mainlinks>a {\n padding: 0.75rem 1rem;\n }\n}\n\n.spinner {\n animation: spin 2s infinite linear;\n\n &.fast {\n animation: spin 1s infinite linear;\n }\n}\n\ndiv.note-indicator {\n width: 6px;\n height: 6px;\n border-radius: 3px;\n\n &.good {\n background-color: var(--indicator-good);\n }\n\n &.bad {\n background-color: $danger;\n }\n\n &.warn {\n background-color: var(--text-warning);\n }\n}\n\n.z10 {\n z-index: 10;\n}\n\nspan.brand::before {\n content: \"Bison Wallet\";\n}\n\nimg.dex-logo {\n content: var(--dex-url);\n}\n\nimg.logo-square {\n content: url(\"/img/bison-square_50.png\");\n\n &.small {\n height: 25px;\n width: 25px;\n }\n}\n\nimg.logo-full {\n content: url(\"/img/bison-full_97x50.png\");\n\n &.small {\n height: 25px;\n width: 48.5px;\n }\n}\n\nbody.dex-branding {\n img.logo-square,\n img.logo-full {\n width: 50px;\n height: 50px;\n content: url(\"/img/softened-icon.png\");\n\n &.small {\n height: 25px;\n width: 25px;\n }\n\n &.micro-icon {\n height: 15px;\n width: 15px;\n }\n }\n\n &.dark img.logo-square,\n &.dark img.logo-full {\n content: url(\"/img/softened-icon-dark.png\");\n }\n\n span.brand::before {\n content: \"DCRDEX\";\n }\n}\n\n#noteIndicator {\n position: absolute;\n top: 0;\n left: 20px;\n font-size: 16px;\n line-height: 1;\n font-family: $demi-sans;\n font-weight: bold;\n z-index: 2;\n\n &.good {\n color: var(--indicator-good);\n }\n\n &.bad {\n color: $danger;\n }\n\n &.warn {\n color: var(--text-warning);\n }\n}\n\ndiv.popup-notes {\nalign-items: flex-end;\nborder-radius: 4px;\nbottom: 0;\ndisplay: flex;\nflex-direction: column;\nmax-width: 750px;\nposition: fixed;\nright: 5px;\nz-index: 1000;\n\n & > span {\n line-height: 1;\n max-width: 100%;\n display: inline-block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n background-color:var(--popup-notes-bg);\n color: var(--popup-notes-color);\n padding: 4px 10px;\n margin: 3px 0 0;\n }\n\n .note-indicator {\n margin-bottom: 2px;\n }\n}\n\n[data-unit] {\n color: var(--hint-color);\n}\n\n[data-unit-box] {\n cursor: default;\n position: relative;\n overflow: visible;\n\n & > div { // unit choice menu\n left: -2rem;\n z-index: 10;\n color: var(--text-color);\n }\n}\n\n#profileBox,\n#noteBox {\n position: fixed;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n background-color: var(--section-bg);\n\n @include border;\n\n z-index: 100;\n min-width: 150px;\n line-height: 1.5;\n max-height: 90%;\n\n .icon {\n position: absolute;\n right: 15px;\n top: 8px;\n }\n\n .header {\n @include border-bottom;\n\n background-color: var(--section-bg);\n\n &>div {\n opacity: 0.5;\n cursor: pointer;\n\n &.active {\n opacity: 1;\n }\n }\n }\n\n &:not(.authed) .authed-only {\n display: none !important;\n }\n}\n\n#noteBox {\n width: 425px;\n\n div.note.firstview {\n background-color: var(--tertiary-bg);\n }\n\n div.note:not(:last-child) {\n @include border-bottom;\n }\n}\n\n#profileBox {\n min-width: 250px;\n}\n\n#loader {\n background-color: var(--body-bg-lower-opacity);\n}\n\n#requiredActions {\n position: absolute;\n bottom: 0;\n left: 0;\n z-index: 98;\n\n & > div {\n background-color: var(--body-bg);\n border: 3px solid var(--border-color);\n }\n}\n\n@include media-breakpoint-up(sm) {\n section {\n margin: 0.5rem;\n }\n}\n\n@include media-breakpoint-up(lg) {\n section,\n .w-lg-auto {\n width: auto;\n }\n}\n\n.green {\n color: var(--indicator-good);\n}\n","label {\n margin-bottom: 0.25rem;\n cursor: pointer;\n}\n\ninput[type=text],\ninput[type=date],\ninput[type=password],\ninput[type=number],\ninput[type=url],\ntextarea {\n display: block;\n width: 100%;\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--form-input-border);\n border-radius: 5px;\n background-color: var(--form-input-bg);\n color: var(--text-color);\n\n &:focus {\n border-color: var(--form-input-border-focus);\n outline: none;\n }\n\n &.border-danger {\n border-color: var(--text-danger);\n }\n \n &.border-success {\n border-color: var(--indicator-good);\n }\n\n &.thin {\n width: 4rem;\n }\n\n &.micro {\n font-size: 14px;\n padding: 0 0.25rem;\n width: 3rem;\n\n &.wide {\n width: 5rem;\n }\n\n &.thin {\n width: 2rem;\n }\n }\n}\n\nselect {\n background-color: var(--form-input-bg) !important;\n}\n\n.form-select {\n color: var(--text-color);\n background-color: var(--form-input-bg);\n border: 1px solid var(--form-input-border);\n border-radius: 3px;\n\n &:focus {\n border-color: var(--form-input-border-focus);\n }\n}\n\n#regAssetForm {\n input[data-tmpl=tradingTierInput] {\n width: 3em;\n }\n\n .readygreen {\n color: #009931;\n }\n\n .setuporange {\n color: #b89400;\n }\n}\n\n#confirmRegForm {\n width: 425px;\n\n button.submit {\n width: auto;\n padding: 12px 30px;\n border-radius: 3px;\n opacity: 0.9;\n\n &:hover {\n opacity: 1;\n }\n }\n\n input.app-pass {\n display: inline-block;\n max-width: 250px;\n }\n\n div.reg-conf-msg {\n width: 100%;\n }\n\n div.borderright {\n border-right: 1px solid #777;\n }\n\n .mw50 {\n max-width: 50%;\n }\n}\n\n#newWalletForm {\n width: 425px;\n\n [data-tmpl=walletTypeTabs] {\n .wtab.selected {\n opacity: 1;\n cursor: default;\n background-color: var(--form-selected-tab-bg);\n }\n\n .wtab:not(.selected) {\n opacity: 0.8;\n cursor: pointer;\n\n &:hover {\n opacity: 1;\n }\n }\n }\n\n .one-bttn {\n display: inline-block;\n font-size: 22px;\n padding: 10px 25px;\n background-color: #0b5831;\n border-radius: 5px;\n animation: glow 1.5s infinite alternate;\n }\n\n .one-bttn:hover {\n background-color: #0c5f36;\n }\n\n @keyframes glow {\n from {\n box-shadow: 0 0 4px -3px #fff7;\n opacity: 0.95;\n }\n\n to {\n box-shadow: 0 0 4px 0 #fff7;\n opacity: 1;\n }\n }\n}\n\n.form-check-label {\n user-select: none;\n}\n\n#forms {\n @extend .stylish-overflow;\n @extend .flex-center;\n\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n padding: 25px 0;\n background-color: var(--forms-bg);\n backdrop-filter: blur(5px);\n z-index: 101;\n\n & > form {\n @extend .flex-stretch-column;\n\n box-sizing: content-box;\n margin: auto;\n position: relative;\n padding-bottom: 1rem;\n\n & > div {\n padding: 1rem 1rem 0;\n\n &.form-closer-unbound,\n &.form-closer {\n @extend .flex-center;\n @extend .hoverbg;\n\n cursor: pointer;\n line-height: 1;\n font-size: 0.8rem;\n padding: 0.75rem;\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1;\n\n span {\n opacity: 0.6;\n\n &:hover {\n opacity: 1;\n }\n }\n }\n }\n\n header {\n @extend .flex-center;\n\n padding: 1rem;\n line-height: 1;\n border-bottom: 1px solid var(--border-color);\n font-size: 1.6rem;\n }\n }\n}\n\ndiv[data-handler=init],\ndiv[data-handler=login],\ndiv[data-handler=register] {\n #forms {\n margin-top: 70px;\n z-index: 99;\n } \n}\n\n#walletWait {\n .icons {\n width: 25px;\n }\n\n .ico-check {\n color: #05a35a99;\n }\n}\n\n#dexAddrForm {\n .known-exchange {\n @extend .flex-center;\n\n font-size: 17px;\n padding: 5px 0;\n width: 100%;\n border: 1px solid #555;\n margin-bottom: 10px;\n border-radius: 3px;\n cursor: pointer;\n\n &:hover,\n &.selected {\n background-color: #7772;\n }\n }\n}\n\n#loginForm,\n#authorizeAccountImportForm,\n#disableAccountForm,\n#discoverAcctForm {\n width: 275px;\n}\n\n#changeAppPWForm,\n#resetAppPWForm,\n#dexAddrForm,\n#verifyForm,\n#deleteArchivedRecordsForm {\n width: 325px;\n}\n\n#appPWForm {\n width: 350px;\n}\n\n#sendForm,\n#vSendForm,\n#exportSeedAuth,\n#cancelForm,\n#quickConfigForm,\n#toggleWalletStatusConfirm,\n#walletWait {\n width: 375px;\n}\n\n#confirmRegistrationForm,\n#regAssetForm,\n#reconfigForm,\n#authorizeSeedDisplay,\n#seedBackupForm,\n#votingForm,\n#gameCodeForm {\n width: 425px;\n}\n\na[data-tmpl=walletCfgGuide] {\n color: inherit;\n text-decoration: none;\n}\n\n#deposit {\n #copyAlert {\n margin-left: 12px;\n position: absolute;\n }\n}\n\n.mini-slider {\n padding: 0.5rem 0;\n cursor: pointer;\n user-select: none;\n\n div[data-tmpl=color] {\n width: 100%;\n height: 0.2rem;\n background-color: #7777;\n position: relative;\n overflow: visible;\n\n \n\n & > div[data-tmpl=track] {\n position: absolute;\n left: 0.375rem; // keep the ball inside of the color\n right: 0.375rem;\n bottom: 0;\n top: 0;\n overflow: visible;\n\n & > div[data-tmpl=ball] {\n width: 0.75rem;\n height: 0.75rem;\n top: 0.1rem;\n border-radius: 1rem;\n background-color: var(--text-grey);\n position: absolute;\n transform: translate(-50%, -50%);\n cursor: pointer;\n }\n }\n }\n\n &.small {\n div[data-tmpl=color] {\n height: 0.125rem;\n\n & > div[data-tmpl=track] {\n left: 0.25rem;\n right: 0.25rem;\n \n & > div[data-tmpl=ball] {\n width: 0.5rem;\n height: 0.5rem;\n }\n }\n }\n }\n}\n\n.slider-container,\n.order-opt {\n border: 1px solid #424242;\n border-radius: 3px;\n padding: 4px;\n margin-top: 8px;\n\n & > div.disabled {\n opacity: 0.8;\n\n [data-tmpl=sliderBox] {\n cursor: default;\n\n .slider .slider-handle {\n background-color: #777b;\n }\n }\n }\n\n div.opt-check {\n width: 15px;\n height: 15px;\n border-radius: 7.5px;\n border: 2px solid #424242;\n margin-top: 5px;\n cursor: pointer;\n }\n\n .xy-range-input {\n width: 35px;\n font-size: 14px;\n height: 16px;\n }\n\n [data-tmpl=sliderBox] {\n cursor: pointer;\n\n .slider {\n margin: 10px 10px 5px;\n height: 2px;\n background-color: grey;\n position: relative;\n\n .slider-handle {\n position: absolute;\n height: 20px;\n width: 14px;\n top: -9px;\n border-radius: 7px;\n background-color: #2cce9c;\n border: 2px solid #424242;\n }\n }\n }\n}\n\ndiv[data-tmpl=scoreTray] {\n background-color: var(--buy-color);\n height: 12px;\n border-radius: 100px;\n overflow: hidden;\n\n div[data-tmpl=scoreWarn] {\n background-color: var(--sell-color);\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n }\n}\n\nspan[data-tmpl=scorePointer] {\n transform: translateX(-50%);\n\n span[data-tmpl=scoreData] {\n top: 0;\n bottom: 0;\n\n &.positive {\n right: calc(100% + 0.125rem);\n }\n\n &.negative {\n left: calc(100% + 0.125rem);\n }\n }\n}\n\n.penalty-marker {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 10%;\n width: 2px;\n z-index: 2;\n background-color: black;\n}\n\ndiv[data-handler=init] {\n .quickconfig-asset-logo {\n width: 25px;\n height: 25px;\n }\n}\n\n.anitoggle {\n width: 1.5rem;\n height: 0.9rem;\n border-radius: 0.45rem;\n background-color: #777a;\n cursor: pointer;\n\n &.on {\n background-color: var(--indicator-good);\n }\n\n & > div {\n position: relative;\n top: 0.1rem;\n left: 0.1rem;\n width: 0.7rem;\n height: 0.7rem;\n border-radius: 0.35rem;\n transition: left 0.5s;\n background-color: var(--section-bg);\n }\n\n &.on > div {\n left: 0.7rem;\n }\n\n &.big {\n width: 35px;\n height: 20px;\n border-radius: 10px;\n\n & > div {\n top: 2px;\n left: 2px;\n width: 16px;\n height: 16px;\n border-radius: 12px;\n }\n\n &.on > div {\n left: 17px;\n }\n }\n}\n\n.selectable.selected {\n border: 2px solid green;\n}\n\n.dynamicopts {\n display: flex;\n align-items: stretch;\n justify-content: space-between;\n flex-wrap: wrap;\n\n & > div {\n min-height: 55px;\n }\n\n & > div:not(.repeatable, [data-tmpl=checkbox]) {\n width: 47%;\n }\n}\n\n.hoveropaque {\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n}\n\n#placementsBody td[data-tmpl=error] {\n max-width: 200px;\n}\n\nbody.dark {\n ::-webkit-calendar-picker-indicator {\n filter: invert(1);\n }\n\n #regAssetForm {\n div.reg-asset {\n .fader {\n background-image:\n linear-gradient(\n to bottom,\n #13202b00,\n #122739\n 90%\n );\n }\n\n &:not(.nohover):hover {\n .fader {\n background-image:\n linear-gradient(\n to bottom,\n #202c3500,\n #202c35\n 90%\n );\n }\n }\n }\n }\n}\n","@import \"mixins\";\n\ndiv[data-handler=markets] {\n .ordertable-wrap {\n width: 100%;\n\n &:first-child {\n @include border-bottom;\n }\n\n &:last-child {\n @include border-top;\n }\n\n tbody#sellRows {\n @include border-top;\n }\n }\n\n .orderbook {\n min-width: 225px;\n\n & > div:first-child { // buy orders\n order: 3;\n }\n\n & > div:nth-child(2) { // header\n order: 1;\n }\n\n & > div:last-child { // sell orders\n order: 2;\n }\n }\n\n .order-panel {\n min-width: 375px;\n\n #orderForm {\n input[type=number] {\n height: 30px;\n border-radius: 0;\n font-size: 14px;\n }\n\n input:focus {\n outline: none;\n }\n\n span.unitbox {\n position: absolute;\n font-size: 14px;\n font-weight: bold;\n right: 5px;\n top: 48%; // Looks better than 50 for some reason.\n transform: translateY(-50%);\n white-space: nowrap;\n }\n\n button {\n padding: 5px 25px;\n border: 1px solid #78787877;\n border-radius: 3px;\n background-color: var(--section-bg);\n color: var(--market-btn-color);\n\n &:disabled {\n opacity: 0.4;\n }\n }\n\n button:hover,\n button.selected {\n color: var(--market-btn-selected-color);\n }\n\n button.submit {\n color: var(--market-btn-selected-color);\n }\n\n button.selected,\n button.submit {\n &.buygreen-bg {\n background-color: var(--market-buygreen-bg);\n }\n\n &.sellred-bg {\n background-color: var(--market-sellred-bg);\n }\n }\n\n #orderPreview,\n .h21 {\n height: 21px;\n }\n }\n\n .ico-unlocked {\n color: $success;\n }\n\n .ico-disconnected {\n color: var(--text-warning);\n }\n }\n\n .market-chart {\n @extend .flex-center;\n\n flex-grow: 1;\n position: relative;\n min-width: 100px; // Letting it go to zero can be problematic, causing some major cpu during chart calcs\n min-height: 250px;\n\n canvas {\n position: absolute;\n left: 0;\n top: 0;\n user-select: none;\n }\n }\n\n #unreadyOrdersMsg {\n color: $danger;\n }\n\n .unready-user-order {\n background-color: #6e0909;\n }\n\n .user-order {\n &:not(:last-child) {\n border-bottom-style: none !important;\n }\n\n &:last-child .order-details {\n border-bottom-style: none !important;\n padding-bottom: 0;\n }\n\n .user-order-header {\n @extend .flex-center;\n\n padding: 5px 10px 5px 20px;\n font-size: 14px;\n position: relative;\n // border: 1px solid grey;\n\n .side-indicator {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 8px;\n\n &.buy {\n background-color: var(--buy-color);\n }\n\n &.sell {\n background-color: var(--market-sell-color);\n }\n\n &.inactive {\n opacity: 0.5;\n }\n }\n\n .active-indicator {\n height: 8px;\n border-radius: 4px;\n\n &.active {\n margin: 0 5px;\n width: 8px;\n background-color: var(--buy-color);\n }\n }\n }\n\n .order-details {\n margin-bottom: 25px;\n padding: 0 10px 10px;\n display: grid;\n grid-template-columns: 1fr 1fr 1fr 1fr;\n row-gap: 10px;\n column-gap: 5px;\n line-height: 1;\n\n .user-order-datum {\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n\n & > span:first-child {\n font-size: 12px;\n font-family: $demi-sans;\n color: grey;\n margin-bottom: 2px;\n }\n\n & > span:nth-child(2) {\n font-size: 14px;\n }\n\n &.full-span {\n grid-column: 1 / -1;\n }\n }\n }\n }\n\n .markettab {\n height: 30px;\n border-style: none;\n background-color: var(--section-bg);\n\n &.selected {\n background-color: var(--market-markettab-selected-bg);\n }\n }\n\n .numorders {\n background-color: var(--market-numorders-bg);\n padding: 1px 2px;\n }\n\n #leftMarketDock {\n position: absolute;\n display: flex;\n top: 0;\n left: 0;\n z-index: 2;\n min-height: -webkit-fill-available; // for webkit browsers\n background-color: var(--section-bg);\n\n &.default,\n &.stashed {\n display: none;\n }\n\n #searchBoxV1 {\n height: 55px;\n }\n\n &.stashed {\n display: none;\n }\n\n #marketSearchV1:focus {\n border: none;\n outline: none;\n }\n\n #marketSearchV1 {\n @extend .fill-abs;\n\n width: 100%; // firefox needs, for some reason\n z-index: 2;\n background-color: transparent;\n font-size: 25px;\n text-align: center;\n font-family: $demi-sans;\n font-variant: small-caps;\n border: none;\n\n & + .ico-search {\n z-index: 1;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translateX(-50%) translateY(-50%);\n opacity: 0.25;\n }\n\n &:hover + .ico-search {\n opacity: 0.5;\n }\n\n &:not(:placeholder-shown) + .ico-search,\n &:focus + .ico-search {\n display: none;\n }\n }\n\n #marketListV1 {\n height: 100%;\n min-width: 275px;\n\n & > div {\n .dexname {\n max-width: 60px;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n &.selected {\n background-color: #7773;\n }\n }\n }\n }\n\n #mainContent {\n display: flex;\n flex-direction: column;\n align-items: center;\n\n & > div,\n & > section {\n min-height: 500px;\n display: flex;\n\n &:first-child { // order book\n max-height: 1000px;\n order: 3;\n }\n\n &:nth-child(2) { // charts\n order: 1;\n }\n\n &:last-child { // order form, wallets, user orders\n order: 2;\n }\n }\n }\n\n #epochLine,\n #durBttnBox {\n position: absolute;\n left: 65px;\n top: 5px;\n background-color: var(--section-bg);\n z-index: 1;\n }\n\n #durBttnBox {\n .candle-dur-bttn {\n background-color: var(--section-bg);\n padding: 2px 4px;\n font-size: 14px;\n line-height: 1;\n margin: 0 2px;\n\n &:hover {\n background-color: #7777;\n }\n\n &:hover,\n &.selected {\n border-color: var(--text-warning);\n color: var(--text-warning);\n }\n }\n }\n\n #epochLine {\n @extend .flex-center;\n\n .epoch-line {\n display: inline-block;\n border-top: 3px dotted #626262;\n width: 25px;\n height: 0;\n margin-right: 5px;\n position: relative;\n top: 1px;\n }\n }\n\n #loaderMsg {\n color: #777;\n }\n\n #bondCreationPending {\n .title {\n font-weight: bold;\n margin-bottom: 5px;\n color: #9b8c09;\n }\n }\n\n #registrationStatus {\n .title {\n font-weight: bold;\n margin-bottom: 5px;\n }\n\n &.waiting {\n .title {\n color: #9b8c09;\n }\n }\n\n &.completed {\n .title {\n color: $success;\n }\n\n #regStatusMessage {\n display: none;\n }\n }\n\n &.error {\n .title {\n color: $danger;\n }\n }\n }\n\n #approveTokenForm {\n width: 450px;\n }\n\n #verifyForm {\n .echo-data span {\n margin: 0 5px;\n }\n\n .disclaimer {\n text-align: justify;\n }\n\n header {\n &.buygreen-bg {\n background-color: var(--market-buygreen-bg);\n }\n\n &.sellred-bg {\n background-color: var(--market-sellred-bg);\n }\n }\n\n button {\n &.buygreen-bg {\n background-color: var(--market-buygreen-bg);\n }\n\n &.sellred-bg {\n background-color: var(--market-sellred-bg);\n }\n }\n\n .loader {\n height: 40px;\n }\n\n .order-opt {\n opacity: 0.7;\n\n &:not(.selected) {\n cursor: pointer;\n }\n\n &.selected {\n opacity: 1;\n background-color: var(--form-opt-selected-bg);\n\n div.opt-check {\n background-color: $success;\n }\n }\n }\n }\n\n #vDetailPane {\n max-width: 425px;\n\n .indent {\n border-left: 2px solid var(--border-color);\n }\n\n table.fee-breakout {\n td {\n text-align: center;\n padding: 2px 5px;\n }\n }\n }\n\n\n #marketReopener {\n display: none;\n padding: 10px 0;\n position: absolute;\n top: 0;\n left: 0;\n background-color: var(--section-bg);\n z-index: 10;\n }\n\n #leftHider,\n #marketReopener {\n .ico-arrowleft,\n .ico-arrowright {\n transform: scaleX(0.5);\n opacity: 0.5;\n }\n\n &:hover .ico-arrowleft,\n &:hover .ico-arrowright {\n opacity: 1;\n }\n }\n}\n\n.market-stats {\n display: flex;\n margin: 0 5px;\n gap: 15px;\n\n .statgrid {\n display: grid;\n grid-template-columns: auto auto auto;\n }\n\n &.listopen .ico-arrowdown {\n display: none;\n }\n\n &:not(.listopen) .ico-arrowup {\n display: none;\n }\n}\n\n#headerSpace .market-stats {\n display: none;\n}\n\n\n#recentMatchesBox {\n @extend .stylish-overflow;\n\n max-height: 350px;\n}\n\n#recentMatchesTable {\n th {\n align-items: center;\n\n &:hover {\n opacity: 0.7;\n }\n\n .ico-arrowdown {\n display: inline-block;\n visibility: hidden;\n vertical-align: middle;\n font-size: 10px;\n margin-left: 5px;\n }\n\n &.sorted-dsc {\n .ico-arrowdown {\n visibility: visible;\n }\n }\n\n &.sorted-asc {\n .ico-arrowdown {\n visibility: visible;\n transform: rotate(180deg);\n }\n }\n }\n}\n\n@include media-breakpoint-up(xl) {\n #main .market-stats {\n display: none;\n border-top: none;\n }\n\n #headerSpace .market-stats {\n display: flex;\n border-bottom: none !important;\n }\n\n div[data-handler=markets] #leftMarketDock {\n position: relative;\n\n &.default {\n display: flex;\n }\n }\n}\n\n@include media-breakpoint-up(lg) {\n div[data-handler=markets] {\n #mainContent {\n @include fill-abs;\n\n overflow: hidden;\n flex-direction: row;\n align-items: stretch;\n\n & > section,\n & > div {\n min-height: none;\n display: flex;\n\n &:nth-child(n) { // need nth-child for specificity\n min-height: auto;\n }\n\n &:first-child { // order book\n order: 1;\n }\n\n &:nth-child(2) { // charts\n order: 2;\n }\n\n &:last-child { // order form, wallets, user orders\n order: 3;\n }\n }\n }\n\n .ordertable-wrap {\n height: calc(50% - 15px);\n display: flex;\n\n &.reversible {\n flex-direction: column-reverse;\n }\n\n tbody {\n display: flex;\n align-items: stretch;\n }\n\n tbody#sellRows {\n flex-direction: column-reverse;\n border-top: none;\n }\n\n tbody#buyRows {\n flex-direction: column;\n }\n }\n\n .orderbook {\n width: auto;\n\n & > div:first-child { // sell orders\n order: 1;\n }\n\n & > div:nth-child(2) { // header\n order: 2;\n }\n\n & > div:last-child { // buy orders\n order: 3;\n }\n }\n\n .order-panel {\n & > div {\n @include fill-abs;\n @include stylish-overflow;\n\n height: 100%;\n overflow-x: hidden;\n }\n }\n\n #leftMarketDock.stashed + #marketReopener {\n display: block;\n }\n }\n\n #recentMatchesBox {\n overflow: visible;\n max-height: none;\n border-bottom: none;\n }\n\n #candlesLegend,\n #depthLegend {\n z-index: 10;\n position: absolute;\n top: 0;\n right: 0;\n background-color: var(--section-bg);\n }\n}\n\n.user-order-floaty-menu {\n position: absolute;\n display: flex;\n align-items: center;\n z-index: 5;\n border-style: none solid solid;\n border-width: 0 2px 2px 1px;\n border-color: var(--border-color);\n background-color: var(--section-bg);\n cursor: pointer;\n overflow: hidden;\n\n & > span,\n & > a {\n margin: 0 5px;\n padding-right: 10px;\n padding-left: 10px;\n\n &:hover {\n background-color: #7775;\n }\n }\n}\n\n.bot-problems-section {\n background-color: #f00a;\n margin-top: 2px;\n margin-bottom: 2px;\n padding-left: 2px;\n border-radius: 5px;\n}\n",".walletspage {\n .ico-unlocked {\n color: var(--indicator-good);\n }\n\n .market-select-logo {\n width: 20px;\n height: 20px;\n }\n\n .short-host {\n text-overflow: ellipsis;\n max-width: 175px;\n }\n\n .mw-90p {\n min-width: 90%;\n }\n\n #recoverWalletConfirm,\n #confirmForce,\n #toggleWalletStatusConfirm {\n width: 400px;\n }\n\n #content {\n flex-direction: column;\n }\n\n #assetSelect {\n flex-direction: row;\n\n .icon-select {\n cursor: pointer;\n min-height: fit-content;\n\n img[data-tmpl=img] {\n width: 30px;\n height: 30px;\n }\n\n img[data-tmpl=parentImg] {\n position: absolute;\n left: 15px;\n bottom: 15px;\n width: 20px;\n height: 20px;\n border-radius: 10px;\n border: 3px solid var(--section-bg);\n background-color: var(--section-bg);\n }\n\n &.selected,\n &:hover {\n background-color: var(--body-bg);\n // border: 1px solid var(--border-color);\n opacity: 1;\n\n img[data-tmpl=parentImg] {\n border: 3px solid var(--body-bg);\n background-color: var(--section-bg);\n }\n }\n }\n\n .icon-select.nowallet {\n opacity: 0.7;\n\n [data-tmpl=balance] {\n display: none;\n }\n }\n }\n\n table#balanceTable {\n td {\n line-height: 1;\n }\n\n tr.itemized > td {\n padding-bottom: 0.25rem;\n }\n\n tr:not(.sub, :first-child) td {\n padding-top: 0.5rem;\n }\n\n tr {\n font-size: 1.1rem;\n }\n\n tr.sub {\n font-size: 0.9rem;\n\n &.last > td:first-child::before {\n content: '└─ ',\n }\n\n & > td:first-child::before {\n content: '├─ ',\n }\n\n & > td:last-child {\n @include border-right;\n\n padding-right: 0.5rem;\n }\n }\n }\n\n #walletInfo {\n border-left: none;\n\n table#walletInfoTable {\n td {\n padding: 2px 5px 2px 0;\n line-height: 1;\n\n &:last-child {\n text-align: right;\n padding-left: 1rem;\n }\n }\n }\n }\n\n #earlierTxs, #txViewBlockExplorer {\n text-decoration: underline;\n cursor: pointer;\n }\n\n #checkmarkBox {\n height: 100px;\n }\n\n #walletDetailsBox {\n // Asset name and balance sizes for mobile. Redefined for > sm below.\n #assetLogo {\n width: 30px;\n height: 30px;\n }\n\n #assetName {\n font-size: 30px;\n }\n\n #balance {\n font-size: 20px;\n }\n\n #balanceUnit {\n font-size: 17px;\n }\n\n #fiatBalanceBox {\n font-size: 13px;\n }\n\n #tokenParentLogo {\n width: 18px;\n height: 18px;\n }\n\n #contractAddress {\n opacity: 0.4;\n }\n }\n\n .peers-table-icon {\n padding-left: 30%;\n }\n\n #vspDisplay {\n #vspEditIcon {\n display: none;\n }\n\n &:hover #vspEditIcon {\n display: inline;\n }\n }\n\n .scrollsmall {\n @include stylish-overflow;\n }\n\n .positive-tx {\n color: var(--indicator-good);\n }\n\n .negative-tx {\n color: $danger;\n }\n}\n\n@include media-breakpoint-up(xl) {\n .scrollsmall {\n overflow: hidden;\n }\n\n .column {\n @include hidden-overflow;\n @include fill-abs;\n }\n}\n\n@include media-breakpoint-up(lg) {\n .fill-abs-lg {\n @include fill-abs;\n }\n\n .stylish-overflow-lg {\n @include stylish-overflow;\n }\n\n .walletspage {\n #walletDetailsBox {\n border-bottom: none !important;\n }\n }\n\n .flex-wrap-lg {\n flex-wrap: wrap;\n }\n\n #purchaseTicketsErrBox {\n background-color: var(--section-bg);\n }\n}\n\n@include media-breakpoint-up(sm) {\n .walletspage {\n #walletDetailsBox {\n #assetLogo {\n width: 40px;\n height: 40px;\n }\n\n #assetName {\n font-size: 40px;\n }\n\n #balance {\n font-size: 28px;\n }\n\n #balanceUnit {\n font-size: 20px;\n }\n\n #fiatBalanceBox {\n font-size: 15px;\n }\n }\n\n #content {\n flex-direction: row;\n }\n\n #assetSelect {\n flex-direction: column;\n overflow-y: auto;\n\n .icon-select {\n padding: 15px;\n\n img[data-tmpl=img] {\n width: 40px;\n height: 40px;\n }\n\n img[data-tmpl=parentImg] {\n left: 20px;\n bottom: 20px;\n width: 28px;\n height: 28px;\n border-radius: 15px;\n }\n }\n }\n }\n}\n\n@include media-breakpoint-up(md) {\n .walletspage {\n #sendReceive {\n border-bottom: none;\n }\n }\n}\n\n#restoreWalletInfo,\n#exportWalletAuth,\n#unapproveTokenForm {\n width: 450px;\n}\n\n#txDetails {\n width: 450px;\n}\n\n#submitReconfig[disabled] {\n cursor: not-allowed;\n}\n\n\n",".filter-display {\n border-radius: 3px;\n font-size: 16px;\n font-weight: bold;\n cursor: pointer;\n}\n\n.filter-opts {\n position: relative;\n max-width: 250px;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n","div.order-datum {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n justify-content: start;\n text-align: center;\n font-size: 15px;\n\n div:first-child {\n font-family: $demi-sans;\n background-color: var(--tertiary-bg);\n }\n}\n\ndiv.match-header {\n background-color: var(--tertiary-bg);\n}\n\ndiv.match-card {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n font-size: 14px;\n}\n\n.match-data-label {\n opacity: 0.5;\n font-family: $demi-sans;\n}\n\n#accelerateForm {\n width: 500px;\n}\n","div.settings {\n min-width: 375px;\n}\n","div[data-handler=mmsettings],\ndiv[data-handler=mmarchives],\ndiv[data-handler=mmlogs],\ndiv[data-handler=mm] {\n #gapStrategySelect {\n width: 300px;\n }\n\n .gap-factor-input,\n .lots-input {\n max-width: 75px;\n }\n\n [data-tmpl=value].wide {\n width: 3rem;\n }\n\n .ico-arrowup.ml2px {\n margin-left: 2px;\n }\n\n .pt-pt5 {\n padding-top: 0.125rem;\n }\n\n #profitInput {\n width: 70px;\n }\n\n .bot-type-selector {\n @include border;\n @extend .rounded3;\n\n display: flex;\n flex-direction: column;\n align-items: stretch;\n user-select: none;\n\n &.disabled {\n opacity: 0.5;\n }\n\n &:not(.disabled) {\n @extend .hoverbg;\n\n cursor: pointer;\n\n &.selected {\n outline: 2px solid $success;\n background-color: #7772;\n }\n }\n }\n\n .bot-problems-section {\n background-color: #f00a;\n margin-top: 2px;\n margin-bottom: 2px;\n padding-left: 2px;\n border-radius: 5px;\n }\n\n #marketFilterIcon {\n position: absolute;\n left: 10px;\n top: 50%;\n transform: translateY(-50%);\n opacity: 0.5;\n }\n\n #botTypeForm {\n min-width: 375px;\n }\n\n #cexSelection {\n .cex-selector {\n user-select: none;\n\n &.configured:not(.selected) {\n opacity: 0.8;\n }\n }\n\n &.disabled {\n .cex-selector.configured {\n opacity: 0.5;\n }\n\n .cex-selector:not(.configured) {\n cursor: pointer;\n }\n }\n\n &:not(.disabled) {\n .cex-selector {\n @extend .hoverbg;\n\n cursor: pointer;\n\n &.selected {\n border-color: $success !important;\n border-width: 2px !important;\n background-color: #7772 !important;\n }\n }\n }\n\n .reconfig {\n position: absolute;\n top: 0;\n right: 0;\n }\n }\n\n #quickConfig input[type=number] {\n width: 100px;\n }\n\n #levelSpacingBox.disabled {\n opacity: 0.5;\n }\n\n #placementsChart,\n [data-tmpl=placementsChart] {\n height: 100px;\n\n canvas {\n @extend .fill-abs;\n }\n }\n\n #buyPlacementsBox,\n #sellPlacementsBox {\n .ico-cross {\n color: var(--text-danger);\n }\n\n .ico-plus {\n color: var(--btn-go-bg);\n }\n }\n\n #noBots {\n .ico-robot {\n font-size: 80px;\n opacity: 0.7;\n }\n }\n\n #dexOrderDetailsForm,\n #cexOrderDetailsForm,\n #depositDetailsForm,\n #withdrawalDetailsForm {\n min-width: 400px;\n }\n\n .allocation-grid {\n display: grid;\n grid-template-columns: 1fr auto auto;\n\n .second {\n grid-column: 2;\n }\n\n .third {\n grid-column: 3;\n }\n }\n}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/client/webserver/site/package-lock.json b/client/webserver/site/package-lock.json index 42b21321b1..c87d1639d9 100644 --- a/client/webserver/site/package-lock.json +++ b/client/webserver/site/package-lock.json @@ -65,13 +65,15 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -426,19 +428,21 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -468,38 +472,28 @@ } }, "node_modules/@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/types": "^7.28.4" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -1693,26 +1687,25 @@ } }, "node_modules/@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1740,14 +1733,14 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2886,18 +2879,6 @@ "node": ">=8" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -3105,10 +3086,11 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3290,20 +3272,6 @@ } ] }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -3408,21 +3376,6 @@ "node": ">=0.10.0" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -4143,15 +4096,6 @@ "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/eslint": { "version": "8.39.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", @@ -5239,15 +5183,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", @@ -5899,7 +5834,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -7518,12 +7454,6 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, "node_modules/regenerator-transform": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", @@ -8342,18 +8272,6 @@ "node": ">=8" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/supports-hyperlinks": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", @@ -8597,15 +8515,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -9327,13 +9236,14 @@ } }, "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" } }, "@babel/compat-data": { @@ -9599,15 +9509,15 @@ } }, "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true }, "@babel/helper-validator-option": { @@ -9629,33 +9539,24 @@ } }, "@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" } }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/types": "^7.28.4" } }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true - }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", @@ -10449,23 +10350,20 @@ } }, "@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.11" - } + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "dev": true }, "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" } }, "@babel/traverse": { @@ -10487,14 +10385,13 @@ } }, "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" } }, "@csstools/css-parser-algorithms": { @@ -11340,15 +11237,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -11492,9 +11380,9 @@ "requires": {} }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -11618,17 +11506,6 @@ "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -11699,21 +11576,6 @@ } } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -12232,12 +12094,6 @@ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, "eslint": { "version": "8.39.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", @@ -13025,12 +12881,6 @@ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, "has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", @@ -14603,12 +14453,6 @@ "regenerate": "^1.4.2" } }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, "regenerator-transform": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", @@ -15184,15 +15028,6 @@ "schema-utils": "^4.0.0" } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, "supports-hyperlinks": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", @@ -15363,12 +15198,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/client/webserver/site/src/css/main.scss b/client/webserver/site/src/css/main.scss index 224193a193..2c5911268a 100644 --- a/client/webserver/site/src/css/main.scss +++ b/client/webserver/site/src/css/main.scss @@ -308,4 +308,8 @@ z-index: 1000; .w-lg-auto { width: auto; } -} \ No newline at end of file +} + +.green { + color: var(--indicator-good); +} diff --git a/client/webserver/site/src/html/bodybuilder.tmpl b/client/webserver/site/src/html/bodybuilder.tmpl index fb0fca5e3d..2ae9842c0f 100644 --- a/client/webserver/site/src/html/bodybuilder.tmpl +++ b/client/webserver/site/src/html/bodybuilder.tmpl @@ -9,9 +9,18 @@ <link rel="icon" href="/img/favicon.png?v=AZ4AZX"> <meta name="description" content="Bison Wallet"> <title>{{.Title}} - + - + + {{if .NewAppVersionAvailable}} +
+ [[[New Release Message]]] + + [[[View Website]]] + +
+ {{end}} +
+
+
+ [[[Version]]] {{.Version}} +
+
+ {{end}} @@ -257,7 +273,7 @@ - + {{end}} diff --git a/client/webserver/site/src/html/forms.tmpl b/client/webserver/site/src/html/forms.tmpl index 08cc9edfb5..b2366b627a 100644 --- a/client/webserver/site/src/html/forms.tmpl +++ b/client/webserver/site/src/html/forms.tmpl @@ -135,6 +135,9 @@
+
+ [[[address has been used]]] +
diff --git a/client/webserver/site/src/html/settings.tmpl b/client/webserver/site/src/html/settings.tmpl index e99927a64b..aa93c32c94 100644 --- a/client/webserver/site/src/html/settings.tmpl +++ b/client/webserver/site/src/html/settings.tmpl @@ -79,7 +79,10 @@ -

[[[Build ID]]]:

+
+ +
+

[[[Build ID]]]: {{commitHash false}}

diff --git a/client/webserver/site/src/js/app.ts b/client/webserver/site/src/js/app.ts index aa035b90f0..4b8582fa31 100644 --- a/client/webserver/site/src/js/app.ts +++ b/client/webserver/site/src/js/app.ts @@ -185,19 +185,15 @@ export default class Application { this.notes = [] this.pokes = [] this.seedGenTime = 0 - this.commitHash = process.env.COMMITHASH || '' + this.commitHash = '' this.noteReceivers = [] this.fiatRatesMap = {} this.showPopups = State.fetchLocal(State.popupsLK) === '1' this.txHistoryMap = {} this.requiredActions = {} - console.log('Bison Wallet, Build', this.commitHash.substring(0, 7)) - - // Set Bootstrap dark theme attribute if dark mode is enabled. - if (State.isDark()) { - document.body.classList.add('dark') - } + // Set dark theme. + document.body.classList.toggle('dark', State.isDark()) // Loggers can be enabled by setting a truthy value to the loggerID using // enableLogger. Settings are stored across sessions. See docstring for the @@ -247,6 +243,9 @@ export default class Application { * point. Read the id = main element and attach handlers. */ async start () { + await this.fetchBuildInfo() + console.log('Bison Wallet, Build', this.commitHash.substring(0, 8)) + // Handle back navigation from the browser. bind(window, 'popstate', (e: PopStateEvent) => { const page = e.state?.page @@ -329,6 +328,12 @@ export default class Application { return user } + async fetchBuildInfo () { + const resp = await getJSON('/api/buildinfo') + if (!this.checkResponse(resp)) return + this.commitHash = resp.revision + } + async fetchMMStatus () { this.mmStatus = await MM.status() } diff --git a/client/webserver/site/src/js/forms.ts b/client/webserver/site/src/js/forms.ts index d5b865a859..233f6adf4c 100644 --- a/client/webserver/site/src/js/forms.ts +++ b/client/webserver/site/src/js/forms.ts @@ -28,7 +28,8 @@ import { Token, WalletCreationNote, CoreNote, - PrepaidBondID + PrepaidBondID, + WalletTransaction } from './registry' import { XYRangeHandler } from './opts' import { CoinExplorers } from './coinexplorers' @@ -1864,24 +1865,36 @@ export class DepositAddress { form: PageElement page: Record assetID: number + addr: string constructor (form: PageElement) { this.form = form const page = this.page = Doc.idDescendants(form) Doc.cleanTemplates(page.unifiedReceiverTmpl) Doc.bind(page.newDepAddrBttn, 'click', async () => { this.newDepositAddress() }) - Doc.bind(page.copyAddressBtn, 'click', () => { this.copyAddress() }) + // navigator.clipboard can only be accessed on localhost or over https. + if (window.isSecureContext) { + Doc.bind(page.copyAddressBtn, 'click', () => { this.copyAddress() }) + } else { + Doc.hide(page.copyAddressBtn) + } } /* Display a deposit address. */ async setAsset (assetID: number) { this.assetID = assetID const page = this.page - Doc.hide(page.depositErr, page.depositTokenMsgBox) + Doc.hide(page.depositErr, page.depositTokenMsgBox, page.addrUsed) const asset = app().assets[assetID] page.depositLogo.src = Doc.logoPath(asset.symbol) const wallet = app().walletMap[assetID] page.depositName.textContent = asset.unitInfo.conventional.unit + const addr = this.addr = wallet.address + if ((wallet.traits & traitNewAddresser) !== 0) { + const res = await postJSON('/api/addressused', { assetID, addr }) + const used = app().checkResponse(res) && res.used + Doc.setVis(used, page.addrUsed) + } if (asset.token) { const parentAsset = app().assets[asset.token.parentID] page.depositTokenParentLogo.src = Doc.logoPath(parentAsset.symbol) @@ -1889,7 +1902,7 @@ export class DepositAddress { Doc.show(page.depositTokenMsgBox) } Doc.setVis((wallet.traits & traitNewAddresser) !== 0, page.newDepAddrBttnBox) - this.setAddress(wallet.address) + this.setAddress(addr) } setAddress (addr: string) { @@ -1940,11 +1953,20 @@ export class DepositAddress { } app().walletMap[assetID].address = res.address this.setAddress(res.address) + Doc.hide(page.addrUsed) + } + + handleTx (assetID: number, tx: WalletTransaction) { + if (assetID !== this.assetID) return + const wallet = app().walletMap[assetID] + if ((wallet.traits & traitNewAddresser) === 0) return + const { page, addr } = this + if (tx.amount > 0 && tx.recipient === addr) Doc.show(page.addrUsed) } async copyAddress () { - const page = this.page - navigator.clipboard.writeText(page.depositAddress.textContent || '') + const { page, addr } = this + navigator.clipboard.writeText(addr) .then(() => { Doc.show(page.copyAlert) setTimeout(() => { diff --git a/client/webserver/site/src/js/http.ts b/client/webserver/site/src/js/http.ts index 9c266bae20..f246f56a66 100644 --- a/client/webserver/site/src/js/http.ts +++ b/client/webserver/site/src/js/http.ts @@ -38,6 +38,7 @@ export async function getJSON (addr: string): Promise { export enum Errors { walletErr, walletAuthErr, + noAuthErr, walletBalanceErr, dupeDEXErr, assetSupportErr, diff --git a/client/webserver/site/src/js/markets.ts b/client/webserver/site/src/js/markets.ts index 18fd9cf783..901689003c 100644 --- a/client/webserver/site/src/js/markets.ts +++ b/client/webserver/site/src/js/markets.ts @@ -3004,10 +3004,10 @@ export default class MarketsPage extends BasePage { */ async handleConnNote (note: ConnEventNote) { this.marketList.setConnectionStatus(note) - if (note.connectionStatus === ConnectionStatus.Connected) { - // Having been disconnected from a DEX server, anything may have changed, - // or this may be the first opportunity to get the server's config, so - // fetch it all before reloading the markets page. + if (note.topic === 'DEXDisabled' || note.topic === 'DEXEnabled' || note.connectionStatus === ConnectionStatus.Connected) { + // Having been disconnected or connected from a DEX server, anything may + // have changed, or this may be the first opportunity to get the server's + // config, so fetch it all before reloading the markets page. await app().fetchUser() await app().loadPage('markets') } diff --git a/client/webserver/site/src/js/notifications.ts b/client/webserver/site/src/js/notifications.ts index 98863738a9..a01e8c7d89 100644 --- a/client/webserver/site/src/js/notifications.ts +++ b/client/webserver/site/src/js/notifications.ts @@ -1,8 +1,8 @@ -import { CoreNote, PageElement } from './registry' -import * as intl from './locales' -import State from './state' import { setCoinHref } from './coinexplorers' import Doc from './doc' +import * as intl from './locales' +import { CoreNote, PageElement } from './registry' +import State from './state' export const IGNORE = 0 export const DATA = 1 @@ -135,6 +135,25 @@ function isDesktopWebkit (): boolean { return window.webkit?.messageHandlers?.bwHandler !== undefined } +// Bind the webview and webkit message handlers to the window object for darwin. +// Linux and Windows handlers are binded in +// client/cmd/bisonw-desktop/app.go#L399 +if (isDesktopWebkit()) { + window.isWebview = () => { return true } + window.sendOSNotification = async (title: string, body?: string) => { + await window.webkit.messageHandlers.bwHandler.postMessage(['sendOSNotification', title, body]) + } + window.openUrl = async (url: string) => { + await window.webkit.messageHandlers.bwHandler.postMessage(['openURL', url.toString()]) + } + window.open = (url?: string | URL, target?: string, feature?: string): Window | null => { + if (url === undefined) return null + if (target !== undefined || feature !== '') console.warn('open: target and feature are not supported in webview') + window.webkit.messageHandlers.bwHandler.postMessage(['openURL', url.toString()]) + return null + } +} + // determine whether we're running in a webview or in browser, and export // the appropriate notifier accordingly. export const Notifier = isDesktopWebview() || isDesktopWebkit() ? OSDesktopNotifier : BrowserNotifier diff --git a/client/webserver/site/src/js/registry.ts b/client/webserver/site/src/js/registry.ts index d4832abee4..60ab8b7f98 100644 --- a/client/webserver/site/src/js/registry.ts +++ b/client/webserver/site/src/js/registry.ts @@ -13,6 +13,7 @@ declare global { isWebview?: () => boolean webkit: any | undefined openUrl: (url: string) => void + open: (url?: string | URL, target?: string, features?: string) => WindowProxy | null sendOSNotification (title: string, body?: string): void clearLocale (): void } @@ -64,7 +65,7 @@ export interface Exchange { candleDurs: string[] maxScore: number penaltyThreshold: number - disabled:boolean + disabled: boolean } export interface Candle { @@ -536,7 +537,7 @@ export interface AssetBookingFees extends LotFeeRange { export interface BookingFees { base: AssetBookingFees - quote:AssetBookingFees + quote: AssetBookingFees } export interface MarketReport { @@ -1258,7 +1259,7 @@ export interface WalletTransaction { } export interface TxHistoryResult { - txs : WalletTransaction[] + txs: WalletTransaction[] lastTx: boolean } diff --git a/client/webserver/site/src/js/settings.ts b/client/webserver/site/src/js/settings.ts index 5f973de5de..66a48a2a51 100644 --- a/client/webserver/site/src/js/settings.ts +++ b/client/webserver/site/src/js/settings.ts @@ -61,7 +61,6 @@ export default class SettingsPage extends BasePage { app().showPopups = show }) - page.commitHash.textContent = app().commitHash.substring(0, 7) Doc.bind(page.addADex, 'click', () => { this.dexAddrForm.refresh() this.showForm(page.dexAddrForm) diff --git a/client/webserver/site/src/js/wallets.ts b/client/webserver/site/src/js/wallets.ts index 05457af707..3df4839bc4 100644 --- a/client/webserver/site/src/js/wallets.ts +++ b/client/webserver/site/src/js/wallets.ts @@ -1849,6 +1849,8 @@ export default class WalletsPage extends BasePage { } handleTxNote (tx: WalletTransaction, newTx: boolean) { + const { selectedAssetID: assetID } = this + this.depositAddrForm.handleTx(assetID, tx) const w = app().assets[this.selectedAssetID].wallet const hideMixing = (w.traits & traitFundsMixer) !== 0 && !!this.page.hideMixTxs.checked if (hideMixing && tx.type === txTypeMixing) return @@ -1857,20 +1859,20 @@ export default class WalletsPage extends BasePage { Doc.show(this.page.txHistoryTable) Doc.hide(this.page.noTxHistory) this.page.txHistoryTableBody.appendChild(this.txHistoryDateRow(this.txDate(tx))) - this.page.txHistoryTableBody.appendChild(this.txHistoryRow(tx, this.selectedAssetID)) + this.page.txHistoryTableBody.appendChild(this.txHistoryRow(tx, assetID)) this.oldestTx = tx } else if (this.txDate(tx) !== this.txHistoryTableNewestDate()) { - this.page.txHistoryTableBody.insertBefore(this.txHistoryRow(tx, this.selectedAssetID), this.page.txHistoryTableBody.children[0]) + this.page.txHistoryTableBody.insertBefore(this.txHistoryRow(tx, assetID), this.page.txHistoryTableBody.children[0]) this.page.txHistoryTableBody.insertBefore(this.txHistoryDateRow(this.txDate(tx)), this.page.txHistoryTableBody.children[0]) } else { - this.page.txHistoryTableBody.insertBefore(this.txHistoryRow(tx, this.selectedAssetID), this.page.txHistoryTableBody.children[1]) + this.page.txHistoryTableBody.insertBefore(this.txHistoryRow(tx, assetID), this.page.txHistoryTableBody.children[1]) } return } for (const row of this.page.txHistoryTableBody.children) { const peRow = row as PageElement if (peRow.dataset.txid === tx.id) { - this.updateTxHistoryRow(peRow, tx, this.selectedAssetID) + this.updateTxHistoryRow(peRow, tx, assetID) break } } diff --git a/client/webserver/site/webpack/common.js b/client/webserver/site/webpack/common.js index 985000c145..738e1d20a7 100644 --- a/client/webserver/site/webpack/common.js +++ b/client/webserver/site/webpack/common.js @@ -1,5 +1,4 @@ const path = require('path') -const webpack = require('webpack') const { CleanWebpackPlugin } = require('clean-webpack-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin') const StyleLintPlugin = require('stylelint-webpack-plugin') @@ -38,9 +37,6 @@ module.exports = { ] }, plugins: [ - new webpack.EnvironmentPlugin({ - COMMITHASH: git('rev-parse HEAD'), - }), new CleanWebpackPlugin(), new MiniCssExtractPlugin({ filename: '../dist/style.css' diff --git a/client/webserver/template.go b/client/webserver/template.go index 0dba710eed..7992b11c08 100644 --- a/client/webserver/template.go +++ b/client/webserver/template.go @@ -153,6 +153,18 @@ func (t *templates) buildErr() error { return err } +var commitHash = func() string { + if info, ok := debug.ReadBuildInfo(); ok { + for _, setting := range info.Settings { + if setting.Key == "vcs.revision" && len(setting.Value) >= 8 { + return setting.Value + } + } + } + + return "" +}() + // exec executes the specified input template using the supplied data, and // writes the result into a string. If the template fails to execute or isn't // found, a non-nil error will be returned. Check it before writing to the @@ -188,18 +200,6 @@ func (t *templates) exec(name string, data any) (string, error) { return page.String(), err } -var commit = func() string { - if info, ok := debug.ReadBuildInfo(); ok { - for _, setting := range info.Settings { - if setting.Key == "vcs.revision" && len(setting.Value) >= 8 { - return setting.Value - } - } - } - - return hex.EncodeToString(encode.RandomBytes(4)) -}() - // templateFuncs are able to be called during template execution. var templateFuncs = template.FuncMap{ "toUpper": strings.ToUpper, @@ -228,7 +228,17 @@ var templateFuncs = template.FuncMap{ } return parts[0] }, - "commitHash": func() string { - return commit[:8] + "commitHash": func(allowRandom bool) string { + if commitHash != "" { + return commitHash[:8] + } + + if allowRandom { + // If the commit hash is not available, return a random string. + // This is useful in invalidating JS and CSS file caches. + return hex.EncodeToString(encode.RandomBytes(4)) + } + + return "unknown" }, } diff --git a/client/webserver/types.go b/client/webserver/types.go index f5b8e48be4..2515918b9c 100644 --- a/client/webserver/types.go +++ b/client/webserver/types.go @@ -144,3 +144,9 @@ type deleteRecordsForm struct { SaveOrdersToFile bool `json:"saveOrdersToFile"` SaveMatchesToFile bool `json:"saveMatchesToFile"` } + +type buildInfoResponse struct { + OK bool `json:"ok"` + Version string `json:"version"` + Revision string `json:"revision"` +} diff --git a/client/webserver/webserver.go b/client/webserver/webserver.go index 1ea09fa6fe..e9c6e42101 100644 --- a/client/webserver/webserver.go +++ b/client/webserver/webserver.go @@ -21,6 +21,7 @@ import ( "os" "path" "path/filepath" + "regexp" "runtime" "strconv" "strings" @@ -36,8 +37,10 @@ import ( "decred.org/dcrdex/client/webserver/locales" "decred.org/dcrdex/client/websocket" "decred.org/dcrdex/dex" + "decred.org/dcrdex/dex/dexnet" "decred.org/dcrdex/dex/encode" "decred.org/dcrdex/dex/encrypt" + "decred.org/dcrdex/dex/version" "github.com/decred/dcrd/certgen" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" @@ -87,6 +90,8 @@ var ( //go:embed site/dist site/src/img site/src/font staticSiteRes embed.FS + + latestVersionRegex = regexp.MustCompile(`\d+(\.\d+)+`) ) // clientCore is satisfied by core.Core. @@ -115,6 +120,7 @@ type clientCore interface { ChangeAppPass([]byte, []byte) error ResetAppPass(newPass []byte, seed string) error NewDepositAddress(assetID uint32) (string, error) + AddressUsed(assetID uint32, addr string) (bool, error) AutoWalletConfig(assetID uint32, walletType string) (map[string]string, error) User() *core.User GetDEXConfig(dexAddr string, certI any) (*core.Exchange, error) @@ -175,7 +181,7 @@ type clientCore interface { type MMCore interface { MarketReport(host string, base, quote uint32) (*mm.MarketReport, error) - StartBot(mkt *mm.StartConfig, alternateConfigPath *string, pw []byte) (err error) + StartBot(mkt *mm.StartConfig, alternateConfigPath *string, pw []byte, overrideLotSizeChange bool) (err error) StopBot(mkt *mm.MarketWithHost) error UpdateCEXConfig(updatedCfg *mm.CEXConfig) error CEXBalance(cexName string, assetID uint32) (*libxc.ExchangeBalance, error) @@ -229,7 +235,8 @@ type Config struct { CustomSiteDir string Language string Logger dex.Logger - UTC bool // for stdout http request logging + UTC bool // for stdout http request logging + AppVersion string // user app version for UI CertFile string KeyFile string // NoEmbed indicates to serve files from the system disk rather than the @@ -270,6 +277,9 @@ type WebServer struct { bondBufMtx sync.Mutex bondBuf map[uint32]valStamp + appVersion string + newAppVersionAvailable bool + useDEXBranding bool } @@ -391,6 +401,7 @@ func New(cfg *Config) (*WebServer, error) { authTokens: make(map[string]bool), cachedPasswords: make(map[string]*cachedPassword), bondBuf: map[uint32]valStamp{}, + appVersion: cfg.AppVersion, useDEXBranding: useDEXBranding, } s.lang.Store(lang) @@ -493,6 +504,7 @@ func New(cfg *Config) (*WebServer, error) { r.Get("/user", s.apiUser) r.Post("/locale", s.apiLocale) r.Post("/setlocale", s.apiSetLocale) + r.Get("/buildinfo", s.apiBuildInfo) r.Group(func(apiInit chi.Router) { apiInit.Use(s.rejectUninited) @@ -513,6 +525,7 @@ func New(cfg *Config) (*WebServer, error) { apiAuth.Post("/newwallet", s.apiNewWallet) apiAuth.Post("/openwallet", s.apiOpenWallet) apiAuth.Post("/depositaddress", s.apiNewDepositAddress) + apiAuth.Post("/addressused", s.apiAddressUsed) apiAuth.Post("/closewallet", s.apiCloseWallet) apiAuth.Post("/connectwallet", s.apiConnectWallet) apiAuth.Post("/rescanwallet", s.apiRescanWallet) @@ -590,6 +603,39 @@ func New(cfg *Config) (*WebServer, error) { return s, nil } +// fetchLatestVersion is a helper function to retrieve the latest version of the app +// from github. +func (w *WebServer) fetchLatestVersion(ctx context.Context) { + var response struct { + TagName string `json:"tag_name"` + } + + err := dexnet.Get(ctx, "https://api.github.com/repos/decred/dcrdex/releases/latest", &response, dexnet.WithSizeLimit(1<<22)) + if err != nil { + log.Debugf("Error getting latest version: %v", err) + return + } + + latestVersion := latestVersionRegex.FindString(response.TagName) + latestMajor, latestMinor, latestPatch, _, _, err := version.ParseSemVer(latestVersion) + if err != nil { + log.Debugf("Error parsing latest version: %v", err) + return + } + + currentMajor, currentMinor, currentPatch, _, _, err := version.ParseSemVer(w.appVersion) + if err != nil { + log.Debugf("Error parsing app version: %v", err) + return + } + + if latestMajor > currentMajor || + (latestMajor == currentMajor && latestMinor > currentMinor) || + (latestMajor == currentMajor && latestMinor == currentMinor && latestPatch > currentPatch) { + w.newAppVersionAvailable = true + } +} + // buildTemplates prepares the HTML templates, which are executed and served in // sendTemplate. An empty siteDir indicates that the embedded templates in the // htmlTmplSub FS should be used. If siteDir is set, the templates will be @@ -719,6 +765,23 @@ func (s *WebServer) Connect(ctx context.Context) (*sync.WaitGroup, error) { s.readNotifications(ctx) }() + wg.Add(1) + go func() { + defer wg.Done() + + // Perform initial fetch of the latest version. + s.fetchLatestVersion(ctx) + + for { + select { + case <-time.After(24 * time.Hour): + s.fetchLatestVersion(ctx) + case <-ctx.Done(): + return + } + } + }() + log.Infof("Web server listening on %s (https = %v)", s.addr, https) scheme := "http" if https { diff --git a/client/webserver/webserver_test.go b/client/webserver/webserver_test.go index 40cbf0d52c..a2a9eb759c 100644 --- a/client/webserver/webserver_test.go +++ b/client/webserver/webserver_test.go @@ -30,9 +30,10 @@ import ( ) var ( - tErr = fmt.Errorf("expected dummy error") - tLogger dex.Logger - tCtx context.Context + tErr = fmt.Errorf("expected dummy error") + tLogger dex.Logger + tCtx context.Context + testAppVersion = "1.0.3" ) type tCoin struct { @@ -62,6 +63,7 @@ func (c *tCoin) Confirmations(context.Context) (uint32, error) { } type TCore struct { + clientCore // This is here so we don't have to implement core methods we're not testing balanceErr error syncFeed core.BookFeed syncErr error @@ -393,9 +395,10 @@ func newTServer(t *testing.T, start bool) (*WebServer, *TCore, func()) { var shutdown func() ctx, killCtx := context.WithCancel(tCtx) s, err := New(&Config{ - Core: c, - Addr: "127.0.0.1:0", - Logger: tLogger, + Core: c, + Addr: "127.0.0.1:0", + Logger: tLogger, + AppVersion: testAppVersion, }) if err != nil { t.Fatalf("error creating server: %v", err) @@ -1077,3 +1080,24 @@ func Test_prepareAddr(t *testing.T) { } } } + +func TestAPIBuildInfo(t *testing.T) { + s, _, shutdown := newTServer(t, false) + defer shutdown() + + writer := new(TWriter) + reader := new(TReader) + + expectedBody := &buildInfoResponse{ + OK: true, + Version: s.appVersion, + Revision: commitHash, // this is not set in the test, so it will be empty + } + + body, err := json.Marshal(expectedBody) + if err != nil { + t.Fatalf("error marshalling expected body: %v", err) + } + + ensureResponse(t, s.apiBuildInfo, string(body), reader, writer, nil, nil) +} diff --git a/dcrdex-umbrel/README.md b/dcrdex-umbrel/README.md new file mode 100644 index 0000000000..2968e25dc0 --- /dev/null +++ b/dcrdex-umbrel/README.md @@ -0,0 +1,27 @@ +# Publishing Docker image + +The `bisonwallet` image can be built and published to Docker Hub using the following steps. This requires the use of [BuildKit](https://docs.docker.com/build/buildkit/), which is part of recent Docker releases. + +1. Log in to Docker Hub using the credentials that have write access to + +```bash +docker login +``` + +1. Build the image + +```bash +git clone https://github.com/decred/dcrdex +cd dcrdex +git checkout release-v1.x.x +docker buildx create --use +docker buildx build -f client/Dockerfile \ + --platform linux/arm64,linux/amd64 \ + --tag decred/dcrdex:v1.x.x \ + --output "type=registry" . +``` + +This is a multi-platform (targeting `amd64` and `arm64`) build which takes longer, this is normal. +If there are no error messages, at the end of the build the image will be published to Docker. + +1. Verify that the image has been published on . There should be 2 digest lines; these indicate that both target platforms have been built and are included in the published image. diff --git a/dcrdex-umbrel/data/.gitkeep b/dcrdex-umbrel/data/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/dcrdex-umbrel/docker-compose.yml b/dcrdex-umbrel/docker-compose.yml new file mode 100644 index 0000000000..799d69bf1f --- /dev/null +++ b/dcrdex-umbrel/docker-compose.yml @@ -0,0 +1,20 @@ +version: "3.7" + +services: + app_proxy: + environment: +# DCRDEX uses its own auth + PROXY_AUTH_ADD: "false" + APP_HOST: decred-dcrdex_web_1 + APP_PORT: 5758 + + web: + image: decred/dcrdex:v1.0.3@sha256:6c504ae6570ce7753d345cae3c592b411c903430405e1ab9379271124fc44088 + restart: on-failure + volumes: + - ${APP_DATA_DIR}/data:/dex/.dexc +# When a trade is being settled, the DEX client requires time +# to shut down cleanly due to the time sensitive nature of atomic +# swaps, hence the long stop_grace_period value. + stop_grace_period: 15m + entrypoint: ["/bin/sh", "-c", "exec ./bisonw --webaddr $(hostname -I|cut -d\\ -f1 ):5758"] \ No newline at end of file diff --git a/dcrdex-umbrel/images/bison.svg b/dcrdex-umbrel/images/bison.svg new file mode 100644 index 0000000000..c9be3fb50c --- /dev/null +++ b/dcrdex-umbrel/images/bison.svg @@ -0,0 +1,527 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dcrdex-umbrel/images/bisonw-logo.svg b/dcrdex-umbrel/images/bisonw-logo.svg new file mode 100644 index 0000000000..af2e5d67f3 --- /dev/null +++ b/dcrdex-umbrel/images/bisonw-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dcrdex-umbrel/images/screenshot_1.jpg b/dcrdex-umbrel/images/screenshot_1.jpg new file mode 100644 index 0000000000..894dbea50d Binary files /dev/null and b/dcrdex-umbrel/images/screenshot_1.jpg differ diff --git a/dcrdex-umbrel/images/screenshot_2.jpg b/dcrdex-umbrel/images/screenshot_2.jpg new file mode 100644 index 0000000000..c6e1d82f95 Binary files /dev/null and b/dcrdex-umbrel/images/screenshot_2.jpg differ diff --git a/dcrdex-umbrel/images/screenshot_3.jpg b/dcrdex-umbrel/images/screenshot_3.jpg new file mode 100644 index 0000000000..4828804af3 Binary files /dev/null and b/dcrdex-umbrel/images/screenshot_3.jpg differ diff --git a/dcrdex-umbrel/images/screenshot_4.jpg b/dcrdex-umbrel/images/screenshot_4.jpg new file mode 100644 index 0000000000..8bc7ff24a0 Binary files /dev/null and b/dcrdex-umbrel/images/screenshot_4.jpg differ diff --git a/dcrdex-umbrel/umbrel-app.yml b/dcrdex-umbrel/umbrel-app.yml new file mode 100644 index 0000000000..14f8c363ec --- /dev/null +++ b/dcrdex-umbrel/umbrel-app.yml @@ -0,0 +1,29 @@ +manifestVersion: 1 +id: dcrdex-umbrel +category: Finance +name: Bison Wallet +version: "1.0.3" +tagline: Multi-asset cryptocurrency wallet with integrated DEX +description: >- + Trade Bitcoin, USDC, Ethereum, Decred, Dogecoin, Zcash and more peer-to-peer using atomic swaps. + + + No trading fees. No KYC. You stay in control of your assets throughout the entire trading process. +developer: The Decred Developers +website: https://dex.decred.org +dependencies: [] +repo: https://github.com/decred/dcrdex +support: https://github.com/decred/dcrdex +port: 5758 +icon: https://raw.githubusercontent.com/decred/dcrdex/master/dcrdex-umbrel/images/bison.svg +gallery: + - https://raw.githubusercontent.com/decred/dcrdex/master/dcrdex-umbrel/images/screenshot_1.jpg + - https://raw.githubusercontent.com/decred/dcrdex/master/dcrdex-umbrel/images/screenshot_2.jpg + - https://raw.githubusercontent.com/decred/dcrdex/master/dcrdex-umbrel/images/screenshot_3.jpg + - https://raw.githubusercontent.com/decred/dcrdex/master/dcrdex-umbrel/images/screenshot_4.jpg +path: "" +defaultUsername: "" +defaultPassword: "" +torOnly: false +submitter: Decred + diff --git a/dex/networks/firo/params.go b/dex/networks/firo/params.go index b477de19f2..82325b84d3 100644 --- a/dex/networks/firo/params.go +++ b/dex/networks/firo/params.go @@ -30,6 +30,13 @@ func mustHash(hash string) *chainhash.Hash { return h } +// Clone ports. +var NetPorts = btc.NetPorts{ + Mainnet: "8888", + Testnet: "18888", + Simnet: "28888", +} + var ( UnitInfo = dex.UnitInfo{ AtomicUnit: "Sats", diff --git a/dex/testing/eth/bundler/bundler b/dex/testing/eth/bundler/bundler new file mode 100755 index 0000000000..737098a1a4 Binary files /dev/null and b/dex/testing/eth/bundler/bundler differ diff --git a/dex/testing/loadbot/go.mod b/dex/testing/loadbot/go.mod index b4552b0971..d741745973 100644 --- a/dex/testing/loadbot/go.mod +++ b/dex/testing/loadbot/go.mod @@ -1,6 +1,6 @@ module decred.org/dcrdex/dex/testing/loadbot -go 1.21 +go 1.24.8 replace decred.org/dcrdex => ../../../ @@ -17,7 +17,7 @@ require ( require ( decred.org/cspp/v2 v2.4.0 // indirect - decred.org/dcrwallet/v4 v4.3.0 // indirect + decred.org/dcrwallet/v4 v4.3.1 // indirect github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect @@ -26,19 +26,19 @@ require ( github.com/aead/siphash v1.0.1 // indirect github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect github.com/btcsuite/btcd v0.24.2-beta.rc1.0.20240625142744-cc26860b4026 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect github.com/btcsuite/btcd/btcutil v1.1.5 // indirect github.com/btcsuite/btcd/btcutil/psbt v1.1.8 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect - github.com/btcsuite/btcwallet v0.16.10-0.20240815225602-6ecae9c12fde // indirect - github.com/btcsuite/btcwallet/wallet/txauthor v1.3.4 // indirect - github.com/btcsuite/btcwallet/wallet/txrules v1.2.1 // indirect - github.com/btcsuite/btcwallet/wallet/txsizes v1.2.4 // indirect - github.com/btcsuite/btcwallet/walletdb v1.4.2 // indirect - github.com/btcsuite/btcwallet/wtxmgr v1.5.3 // indirect + github.com/btcsuite/btcwallet v0.16.10 // indirect + github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5 // indirect + github.com/btcsuite/btcwallet/wallet/txrules v1.2.2 // indirect + github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5 // indirect + github.com/btcsuite/btcwallet/walletdb v1.4.4 // indirect + github.com/btcsuite/btcwallet/wtxmgr v1.5.4 // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8 // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect @@ -109,7 +109,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/gorilla/websocket v1.5.1 // indirect github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect @@ -160,7 +160,7 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/zquestz/grab v0.0.0-20190224022517-abcee96e61b1 // indirect - go.etcd.io/bbolt v1.3.9 // indirect + go.etcd.io/bbolt v1.3.11 // indirect golang.org/x/crypto v0.33.0 // indirect golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect golang.org/x/net v0.28.0 // indirect diff --git a/dex/testing/loadbot/go.sum b/dex/testing/loadbot/go.sum index e2d033a185..be3414f824 100644 --- a/dex/testing/loadbot/go.sum +++ b/dex/testing/loadbot/go.sum @@ -40,8 +40,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= decred.org/cspp/v2 v2.4.0 h1:whb0YW+UELHJS/UfT5MBXSJXrKUVw5omhgKNhjzYix4= decred.org/cspp/v2 v2.4.0/go.mod h1:9nO3bfvCheOPIFZw5f6sRQ42CjBFB5RKSaJ9Iq6G4MA= -decred.org/dcrwallet/v4 v4.3.0 h1:JqFyUa5Xj51br1In8wzQresUrW5nuGp7cCFIxpb4VZE= -decred.org/dcrwallet/v4 v4.3.0/go.mod h1:cd0+55eXPYwYddb/8r3dRyXI+MXiqx642QisZbswzUI= +decred.org/dcrwallet/v4 v4.3.1 h1:6OZ1GS9YvLk2/SGZc2Tw11QV3sqkov431da7sBd7Bc0= +decred.org/dcrwallet/v4 v4.3.1/go.mod h1:cd0+55eXPYwYddb/8r3dRyXI+MXiqx642QisZbswzUI= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= @@ -112,8 +112,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0= @@ -141,18 +141,18 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtyd github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcwallet v0.16.10-0.20240815225602-6ecae9c12fde h1:NURMAR/mat4V2ZwZE/dXIu+pfHc3SKN/kvAcKlfs/CU= -github.com/btcsuite/btcwallet v0.16.10-0.20240815225602-6ecae9c12fde/go.mod h1:X2xDre+j1QphTRo54y2TikUzeSvreL1t1aMXrD8Kc5A= -github.com/btcsuite/btcwallet/wallet/txauthor v1.3.4 h1:poyHFf7+5+RdxNp5r2T6IBRD7RyraUsYARYbp/7t4D8= -github.com/btcsuite/btcwallet/wallet/txauthor v1.3.4/go.mod h1:GETGDQuyq+VFfH1S/+/7slLM/9aNa4l7P4ejX6dJfb0= -github.com/btcsuite/btcwallet/wallet/txrules v1.2.1 h1:UZo7YRzdHbwhK7Rhv3PO9bXgTxiOH45edK5qdsdiatk= -github.com/btcsuite/btcwallet/wallet/txrules v1.2.1/go.mod h1:MVSqRkju/IGxImXYPfBkG65FgEZYA4fXchheILMVl8g= -github.com/btcsuite/btcwallet/wallet/txsizes v1.2.4 h1:nmcKAVTv/cmYrs0A4hbiC6Qw+WTLYy/14SmTt3mLnCo= -github.com/btcsuite/btcwallet/wallet/txsizes v1.2.4/go.mod h1:YqJR8WAAHiKIPesZTr9Cx9Az4fRhRLcJ6GcxzRUZCAc= -github.com/btcsuite/btcwallet/walletdb v1.4.2 h1:zwZZ+zaHo4mK+FAN6KeK85S3oOm+92x2avsHvFAhVBE= -github.com/btcsuite/btcwallet/walletdb v1.4.2/go.mod h1:7ZQ+BvOEre90YT7eSq8bLoxTsgXidUzA/mqbRS114CQ= -github.com/btcsuite/btcwallet/wtxmgr v1.5.3 h1:QrWCio9Leh3DwkWfp+A1SURj8pYn3JuTLv3waP5uEro= -github.com/btcsuite/btcwallet/wtxmgr v1.5.3/go.mod h1:M4nQpxGTXiDlSOODKXboXX7NFthmiBNjzAKKNS7Fhjg= +github.com/btcsuite/btcwallet v0.16.10 h1:SDMS0Gp7oEJVvyZNQ6gDYkpkvp/cSMRcAAy3fvO3vTk= +github.com/btcsuite/btcwallet v0.16.10/go.mod h1:1HJXYbjJzgumlnxOC2+ViR1U+gnHWoOn7WeK5OfY1eU= +github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5 h1:Rr0njWI3r341nhSPesKQ2JF+ugDSzdPoeckS75SeDZk= +github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5/go.mod h1:+tXJ3Ym0nlQc/iHSwW1qzjmPs3ev+UVWMbGgfV1OZqU= +github.com/btcsuite/btcwallet/wallet/txrules v1.2.2 h1:YEO+Lx1ZJJAtdRrjuhXjWrYsmAk26wLTlNzxt2q0lhk= +github.com/btcsuite/btcwallet/wallet/txrules v1.2.2/go.mod h1:4v+grppsDpVn91SJv+mZT7B8hEV4nSmpREM4I8Uohws= +github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5 h1:93o5Xz9dYepBP4RMFUc9RGIFXwqP2volSWRkYJFrNtI= +github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5/go.mod h1:lQ+e9HxZ85QP7r3kdxItkiMSloSLg1PEGis5o5CXUQw= +github.com/btcsuite/btcwallet/walletdb v1.4.4 h1:BDel6iT/ltYSIYKs0YbjwnEDi7xR3yzABIsQxN2F1L8= +github.com/btcsuite/btcwallet/walletdb v1.4.4/go.mod h1:jk/hvpLFINF0C1kfTn0bfx2GbnFT+Nvnj6eblZALfjs= +github.com/btcsuite/btcwallet/wtxmgr v1.5.4 h1:hJjHy1h/dJwSfD9uDsCwcH21D1iOrus6OrI5gR9E/O0= +github.com/btcsuite/btcwallet/wtxmgr v1.5.4/go.mod h1:lAv0b1Vj9Ig5U8QFm0yiJ9WqPl8yGO/6l7JxdHY1PKE= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8 h1:nOsAWScwueMVk/VLm/dvQQD7DuanyvAUb6B3P3eT274= @@ -522,8 +522,8 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -544,8 +544,8 @@ github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4Mgqvf github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gookit/color v1.3.8/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= @@ -1118,8 +1118,8 @@ go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= -go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0= +go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= diff --git a/dex/utils/generics.go b/dex/utils/generics.go index d5c56ae4da..1ead257ada 100644 --- a/dex/utils/generics.go +++ b/dex/utils/generics.go @@ -35,6 +35,14 @@ func MapKeys[K comparable, V any](m map[K]V) []K { return ks } +func Map[F any, T any](s []F, f func(F) T) []T { + r := make([]T, len(s)) + for i, v := range s { + r[i] = f(v) + } + return r +} + func SafeSub[I constraints.Unsigned](a I, b I) I { if a < b { return 0 diff --git a/dex/ws/wslink_test.go b/dex/ws/wslink_test.go index e1a92ea4f4..6a85aa38f1 100644 --- a/dex/ws/wslink_test.go +++ b/dex/ws/wslink_test.go @@ -123,8 +123,6 @@ func TestWSLink_handleMessageRecover(t *testing.T) { wsLink.handleMessage(msg) wsLink.handler = func(msg *msgjson.Message) *msgjson.Error { - var v []int - _ = v[0] return nil } diff --git a/docs/wiki/Home.md b/docs/wiki/Home.md index 5fc5931335..ef299d06bb 100644 --- a/docs/wiki/Home.md +++ b/docs/wiki/Home.md @@ -4,4 +4,135 @@ The dcrdex wiki provides documentation for dcrdex users and developers. To get started using DCRDEX, follow the [Bison Wallet Installation and Configuration](https://github.com/decred/dcrdex/wiki/Client-Installation-and-Configuration) guide. -Also, have a look at the [README](https://github.com/decred/dcrdex/blob/master/README.md) and the [spec](https://github.com/decred/dcrdex/blob/master/spec/README.mediawiki). +This wiki provides documentation for Bison Wallet and DCRDEX users and developers. + +For a step-by-step guide of the download, installation and configuration of Bison Wallet, +see the [Getting Started](Getting-Started) section. + +If you're a developer and interested in contributing, jump to the + [Development and Contributing](Development-and-Contributing) section. + + +# What is Bison Wallet? + +Bison Wallet is a multi-coin wallet developed in concert with [DCRDEX](#what-is-dcrdex) +and [Tatanka Mesh](#tatanka-mesh). Bison Wallet leverages state-of-the-art blockchain +technology to bring more features and more privacy for your favorite assets. DCRDEX is +built-in and has advanced trading features like market-making and arbitrage with funds +directlyfrom your wallet. + +Our goal is to find a balance of convenience and privacy that works for you, +while giving you access to advanced features most wallets ignore. For many +assets, we can cut out the middleman altogether and allow you to interact +directly with the blockchain network. This type of wallet is highly-resilient to +data collection and censorship. + +We also focus on bringing advanced, asset-specific features for our wallets. +With Decred, you can use decentralized StakeShuffle mixing to further anonymize +your funds, or stake your DCR and earn some block rewards. The Zcash wallet exposes +unified addresses and shielded pools, and operates on a shielded-first principle +that makes privacy effortless. + +# What is DCRDEX? + +The [Decred Decentralized Exchange (DEX)](https://dex.decred.org/) is a system +that enables trustless exchange of different types of blockchain assets via a +familiar market-based API. DEX is a non-custodial solution for cross-chain +exchange based on atomic swap technology. DEX matches trading parties and +facilitates price discovery and the communication of swap details. + + +Some key features of the protocol are: + +- **Fees** - No trading fees are collected and there is no superfluous token +or blockchain that is used to monetize the project. +- **Fair** – orders are matched pseudorandomly within epochs to substantially +reduce manipulative, abusive trading practices by high frequency trading that +uses first-in-first-out matching. +- **Secure** – Server operators never take custody of client funds. Non-custodial +exchange is accomplished using cross-chain atomic swaps. +- **Permissionless** – The simple client-server architecture makes it easy to set +up new servers and clients and enhances censorship resistance. +- **No gatekeepers** – Projects can add support for their assets and run servers +with the markets they require. +- **Verifiable volume** – volume and trade data can be externally verified against +the corresponding blockchains and the atomic swaps that occur on-chain, preventing +wash trading. +- **Private** – Know your customer (KYC) information is not required. +- **Transparent** – By performing exchanges on-chain and using cryptographic +attestation, both clients and servers can be held accountable for malicious behavior. + +# Tatanka Mesh + +Tatanka Mesh (Tatanka, the mesh) is the evolution of DCRDEX. Where DCRDEX relies +on a central server for maintaining order books and policing trades, Tatanka is +a decentralized P2P protocol that enables a network of subscribers to +collectively perform these tasks. Here are the three critical services that +Tatanka Mesh provides. + +- Enhance the ability for users to connect and to share data both publicly and privately +- Aggregate reputation data and monitor fidelity bonds. Tatanka can limit +access to users who earn a bad reputation +- Oracle services for fiat exchange rates and blockchain transaction fee rates + +The mesh collects no fees for its services. Trades are performed using trustless +atomic swaps that exchange funds directly between wallets. + +Going P2P empowers our users to trade directly, enhancing security, +censorship-resistance, privacy. and self-sovereignty. + +# Supported Assets + +Most users will use the native wallets that are already built into Bison Wallet. +Depending on the asset, you may be able to choose from: (1) a native +wallet, (2) an external full node wallet, or (3) an Electrum-based wallet. +Consult the following table for a summary of wallet support. If there is a +checkmark in the "native" column, no external software is required. + +| Coin | native | full node | Electrum | notes | +|--------------|--------|-------------------------------------------------------------|---------------------------------------------------------------|---------------------------------------------------------------------------------------------------| +| Bitcoin | ✓ | [v27.0](https://bitcoincore.org/en/download/) | [v4.5.5](https://electrum.org/) | | +| Decred | ✓ | [v2.0.3](https://github.com/decred/decred-release/releases) | x | | +| Ethereum | ✓ | geth IPC/http/ws | N/A | see [RPC Providers for EVM-Compatible Networks](Wallet#rpc-providers-for-evm-compatible-networks) | +| Polygon | ✓ | bor IPC/http/ws | N/A | see [RPC Providers for EVM-Compatible Networks](Wallet#rpc-providers-for-evm-compatible-networks) | +| Litecoin | ✓ | [v0.21.2.1](https://litecoin.org/) | [v4.2.2](https://electrum-ltc.org/) | | +| Bitcoin Cash | ✓ | [v27.0.0](https://bitcoincashnode.org/) | x | use only Bitcoin Cash Node for full node | +| Dogecoin | x | [v1.14.7.0](https://dogecoin.com/) | x | | +| Zcash | x | [v5.4.2](https://z.cash/download/) | x | | +| Dash | x | [v20.1.1](https://github.com/dashpay/dash/releases) | x | | +| Firo | x | [v0.14.14.1](https://github.com/firoorg/firo/releases) | [v4.1.5.5](https://github.com/firoorg/electrum-firo/releases) | | + + +# Project History + +Initially proposed by Jake Yocom-Piatt in the +[Decred blog](https://blog.decred.org/2018/06/05/A-New-Kind-of-DEX/) in 2018, +DCRDEX development started in 2019 and has been fully funded by the Decred treasury. + +**Project Timeline** + +| Date | Milestone | +|---------|-------------------------------------------------------------------------------------------------------------------------| +| 2018-06 | [A New kind DEX](https://blog.decred.org/2018/06/05/A-New-Kind-of-DEX/) blog post published in the Decred blog. | +| 2019-03 | [RFP: Decred Decentralized Exchange Infrastructure](https://proposals.decred.org/record/3360c14) proposal approved. | +| 2019-06 | [Decentralized Exchange Specification Document](https://proposals.decred.org/record/94cc1ee) proposal approved. | +| 2019-08 | [Decentralized Exchange Development](https://proposals.decred.org/record/ad972c3) proposal approved. | +| 2020-10 | [DCRDEX v0.1.0](https://github.com/decred/dcrdex/releases/tag/release-v0.1.0) MVP release. | +| 2021-01 | [Decred DEX Development Phase II](https://proposals.decred.org/record/cbd0f92) proposal approved. | +| 2021-05 | [DCRDEX v0.2.0](https://github.com/decred/dcrdex/releases/tag/v0.2.0) release. | +| 2022-01 | [DCRDEX Phase 3 - Bonds, Decentralization, and Privacy](https://proposals.decred.org/record/3326c82) proposal approved. | +| 2022-02 | [DCRDEX v0.4.0](https://github.com/decred/dcrdex/releases/tag/v0.4.0) release. | +| 2022-08 | [DCRDEX v0.5.0](https://github.com/decred/dcrdex/releases/tag/v0.5.0) release. | +| 2023-01 | [DCRDEX integration on Umbrel](https://proposals.decred.org/record/8d83046) proposal approved. | +| 2023-03 | [Decred DEX - Desktop App and Packaging](https://proposals.decred.org/record/ae7c4fe) proposal approved. | +| 2023-03 | [Decred DEX - Client Development](https://proposals.decred.org/record/ca6b749) proposal approved. | +| 2023-03 | [Decred DEX - Market Maker and Arbitrage Bot Development](https://dcrdata.org/proposals) proposal approved. | +| 2023-04 | [DCRDEX v0.6.0](https://github.com/decred/dcrdex/releases/tag/v0.6.0) release. | +| 2023-06 | [DCRDEX Mesh Beginnings and Bonds Evolution](https://proposals.decred.org/record/4d2324b) proposal approved. | +| 2024-04 | [DCRDEX Monero Stage 1](https://proposals.decred.org/record/fa0ea64) proposal approved. | +| 2024-09 | [DCRDEX v1.0.0](https://github.com/decred/dcrdex/releases/tag/v0.6.0) release. | +| 2024-10 | [DCRDEX Development Phase 5.5](https://proposals.decred.org/record/0d23788) proposal approved. | + +--- + +[⤴ Back to Top](#top) diff --git a/go.mod b/go.mod index 7586f73d34..813b0805cd 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,9 @@ module decred.org/dcrdex -go 1.21 +go 1.24.8 require ( - decred.org/dcrwallet/v4 v4.3.0 - filippo.io/edwards25519 v1.0.0 + decred.org/dcrwallet/v4 v4.3.1 fyne.io/systray v1.10.1-0.20220621085403-9a2652634e93 github.com/btcsuite/btcd v0.24.2-beta.rc1.0.20240625142744-cc26860b4026 github.com/btcsuite/btcd/btcec/v2 v2.3.4 @@ -12,10 +11,10 @@ require ( github.com/btcsuite/btcd/btcutil/psbt v1.1.8 github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f - github.com/btcsuite/btcwallet v0.16.10-0.20240815225602-6ecae9c12fde - github.com/btcsuite/btcwallet/wallet/txauthor v1.3.4 - github.com/btcsuite/btcwallet/walletdb v1.4.2 - github.com/btcsuite/btcwallet/wtxmgr v1.5.3 + github.com/btcsuite/btcwallet v0.16.10 + github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5 + github.com/btcsuite/btcwallet/walletdb v1.4.4 + github.com/btcsuite/btcwallet/wtxmgr v1.5.4 github.com/davecgh/go-spew v1.1.1 github.com/dchest/blake2b v1.0.0 github.com/dcrlabs/bchwallet v0.0.0-20240114124852-0e95005810be @@ -63,7 +62,7 @@ require ( github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/tyler-smith/go-bip39 v1.1.0 - go.etcd.io/bbolt v1.3.9 + go.etcd.io/bbolt v1.3.11 golang.org/x/crypto v0.33.0 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa golang.org/x/sync v0.11.0 @@ -84,9 +83,9 @@ require ( github.com/aead/siphash v1.0.1 // indirect github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect - github.com/btcsuite/btcwallet/wallet/txrules v1.2.1 // indirect - github.com/btcsuite/btcwallet/wallet/txsizes v1.2.4 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect + github.com/btcsuite/btcwallet/wallet/txrules v1.2.2 // indirect + github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5 // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8 // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect @@ -125,7 +124,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.3.1 // indirect diff --git a/go.sum b/go.sum index 4eda26d040..481cba162c 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= decred.org/cspp/v2 v2.4.0 h1:whb0YW+UELHJS/UfT5MBXSJXrKUVw5omhgKNhjzYix4= decred.org/cspp/v2 v2.4.0/go.mod h1:9nO3bfvCheOPIFZw5f6sRQ42CjBFB5RKSaJ9Iq6G4MA= -decred.org/dcrwallet/v4 v4.3.0 h1:JqFyUa5Xj51br1In8wzQresUrW5nuGp7cCFIxpb4VZE= -decred.org/dcrwallet/v4 v4.3.0/go.mod h1:cd0+55eXPYwYddb/8r3dRyXI+MXiqx642QisZbswzUI= +decred.org/dcrwallet/v4 v4.3.1 h1:6OZ1GS9YvLk2/SGZc2Tw11QV3sqkov431da7sBd7Bc0= +decred.org/dcrwallet/v4 v4.3.1/go.mod h1:cd0+55eXPYwYddb/8r3dRyXI+MXiqx642QisZbswzUI= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= fyne.io/systray v1.10.1-0.20220621085403-9a2652634e93 h1:V2IC9t0Zj9Ur6qDbfhUuzVmIvXKFyxZXRJyigUvovs4= fyne.io/systray v1.10.1-0.20220621085403-9a2652634e93/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE= @@ -112,8 +112,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0= @@ -141,18 +141,18 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtyd github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcwallet v0.16.10-0.20240815225602-6ecae9c12fde h1:NURMAR/mat4V2ZwZE/dXIu+pfHc3SKN/kvAcKlfs/CU= -github.com/btcsuite/btcwallet v0.16.10-0.20240815225602-6ecae9c12fde/go.mod h1:X2xDre+j1QphTRo54y2TikUzeSvreL1t1aMXrD8Kc5A= -github.com/btcsuite/btcwallet/wallet/txauthor v1.3.4 h1:poyHFf7+5+RdxNp5r2T6IBRD7RyraUsYARYbp/7t4D8= -github.com/btcsuite/btcwallet/wallet/txauthor v1.3.4/go.mod h1:GETGDQuyq+VFfH1S/+/7slLM/9aNa4l7P4ejX6dJfb0= -github.com/btcsuite/btcwallet/wallet/txrules v1.2.1 h1:UZo7YRzdHbwhK7Rhv3PO9bXgTxiOH45edK5qdsdiatk= -github.com/btcsuite/btcwallet/wallet/txrules v1.2.1/go.mod h1:MVSqRkju/IGxImXYPfBkG65FgEZYA4fXchheILMVl8g= -github.com/btcsuite/btcwallet/wallet/txsizes v1.2.4 h1:nmcKAVTv/cmYrs0A4hbiC6Qw+WTLYy/14SmTt3mLnCo= -github.com/btcsuite/btcwallet/wallet/txsizes v1.2.4/go.mod h1:YqJR8WAAHiKIPesZTr9Cx9Az4fRhRLcJ6GcxzRUZCAc= -github.com/btcsuite/btcwallet/walletdb v1.4.2 h1:zwZZ+zaHo4mK+FAN6KeK85S3oOm+92x2avsHvFAhVBE= -github.com/btcsuite/btcwallet/walletdb v1.4.2/go.mod h1:7ZQ+BvOEre90YT7eSq8bLoxTsgXidUzA/mqbRS114CQ= -github.com/btcsuite/btcwallet/wtxmgr v1.5.3 h1:QrWCio9Leh3DwkWfp+A1SURj8pYn3JuTLv3waP5uEro= -github.com/btcsuite/btcwallet/wtxmgr v1.5.3/go.mod h1:M4nQpxGTXiDlSOODKXboXX7NFthmiBNjzAKKNS7Fhjg= +github.com/btcsuite/btcwallet v0.16.10 h1:SDMS0Gp7oEJVvyZNQ6gDYkpkvp/cSMRcAAy3fvO3vTk= +github.com/btcsuite/btcwallet v0.16.10/go.mod h1:1HJXYbjJzgumlnxOC2+ViR1U+gnHWoOn7WeK5OfY1eU= +github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5 h1:Rr0njWI3r341nhSPesKQ2JF+ugDSzdPoeckS75SeDZk= +github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5/go.mod h1:+tXJ3Ym0nlQc/iHSwW1qzjmPs3ev+UVWMbGgfV1OZqU= +github.com/btcsuite/btcwallet/wallet/txrules v1.2.2 h1:YEO+Lx1ZJJAtdRrjuhXjWrYsmAk26wLTlNzxt2q0lhk= +github.com/btcsuite/btcwallet/wallet/txrules v1.2.2/go.mod h1:4v+grppsDpVn91SJv+mZT7B8hEV4nSmpREM4I8Uohws= +github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5 h1:93o5Xz9dYepBP4RMFUc9RGIFXwqP2volSWRkYJFrNtI= +github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5/go.mod h1:lQ+e9HxZ85QP7r3kdxItkiMSloSLg1PEGis5o5CXUQw= +github.com/btcsuite/btcwallet/walletdb v1.4.4 h1:BDel6iT/ltYSIYKs0YbjwnEDi7xR3yzABIsQxN2F1L8= +github.com/btcsuite/btcwallet/walletdb v1.4.4/go.mod h1:jk/hvpLFINF0C1kfTn0bfx2GbnFT+Nvnj6eblZALfjs= +github.com/btcsuite/btcwallet/wtxmgr v1.5.4 h1:hJjHy1h/dJwSfD9uDsCwcH21D1iOrus6OrI5gR9E/O0= +github.com/btcsuite/btcwallet/wtxmgr v1.5.4/go.mod h1:lAv0b1Vj9Ig5U8QFm0yiJ9WqPl8yGO/6l7JxdHY1PKE= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8 h1:nOsAWScwueMVk/VLm/dvQQD7DuanyvAUb6B3P3eT274= @@ -269,8 +269,6 @@ github.com/decred/dcrd/blockchain/standalone/v2 v2.2.1 h1:zeI9CHkLM9be4QOBmIAtoP github.com/decred/dcrd/blockchain/standalone/v2 v2.2.1/go.mod h1:yXZz/EgWdGw5nqMEvyKj/iXZ9I2VSyO95xKj6mRUMIM= github.com/decred/dcrd/blockchain/v5 v5.0.1 h1:IGr8rJsgBVKDBI8STzeuGF6Mej0xbIX4gVVBA9yEMRU= github.com/decred/dcrd/blockchain/v5 v5.0.1/go.mod h1:LtSV1+u8aBQzlExAQcl4HIJ6Bfi5f6Rvws/9euH4mDA= -github.com/decred/dcrd/certgen v1.1.3 h1:MYENpBWVSP6FkkLBSSnaBGEOWobPcgYBLDDo88szi9c= -github.com/decred/dcrd/certgen v1.1.3/go.mod h1:Od5y39J+r2ZlvrizyWu2cylcYu0+emTTVm3eix4W8bw= github.com/decred/dcrd/certgen v1.2.0 h1:FF6XXV//5q38/c6QbGQdR35ZJz0GPIkejsZZU3oHuBQ= github.com/decred/dcrd/certgen v1.2.0/go.mod h1:LRh6dF2WPQeDA6QQSZE+SfK7AL6FuFtCRDHZf8DyGzg= github.com/decred/dcrd/chaincfg/chainhash v1.0.4 h1:zRCv6tdncLfLTKYqu7hrXvs7hW+8FO/NvwoFvGsrluU= @@ -282,8 +280,6 @@ github.com/decred/dcrd/connmgr/v3 v3.1.2/go.mod h1:tdbErFiNOuy/sHrX2mwaOk+r1HLs3 github.com/decred/dcrd/container/lru v1.0.0 h1:7foQymtbu18aQWYiY9RnNIeE+kvpiN+fiBQ3+viyJjI= github.com/decred/dcrd/container/lru v1.0.0/go.mod h1:vlPwj0l+IzAHhQSsbgQnJgO5Cte78+yI065V+Mc5PRQ= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= -github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/crypto/rand v1.0.1 h1:pYMgDRmRv1z1RNgAAs8izJstm4B+fLFiqGD5btOt2Wg= @@ -530,8 +526,8 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -552,8 +548,8 @@ github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4Mgqvf github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gookit/color v1.3.8/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= @@ -702,8 +698,6 @@ github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= @@ -1140,8 +1134,8 @@ go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= -go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0= +go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= @@ -1284,8 +1278,6 @@ golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1593,8 +1585,6 @@ google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210426193834-eac7f76ac494/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210521181308-5ccab8a35a9a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1623,8 +1613,6 @@ google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/server/asset/btc/btc_test.go b/server/asset/btc/btc_test.go index 72a41d09b6..87e5957396 100644 --- a/server/asset/btc/btc_test.go +++ b/server/asset/btc/btc_test.go @@ -438,7 +438,7 @@ func testRawTransactionVerbose(msgTx *wire.MsgTx, txid, blockHash *chainhash.Has } // Add a transaction output and it's getrawtransaction data. -func testAddTxOut(msgTx *wire.MsgTx, vout uint32, txHash, blockHash *chainhash.Hash, blockHeight, confirmations int64) *btcjson.GetTxOutResult { +func testAddTxOut(msgTx *wire.MsgTx, vout uint32, txHash, blockHash *chainhash.Hash, confirmations int64) *btcjson.GetTxOutResult { testChainMtx.Lock() defer testChainMtx.Unlock() txOut := testGetTxOut(confirmations, msgTx.TxOut[vout].Value, msgTx.TxOut[vout].PkScript) @@ -838,7 +838,7 @@ func TestUTXOs(t *testing.T) { msg := testMakeMsgTx(false) // For a regular test tx, the output is at output index 0. Pass nil for the // block hash and 0 for the block height and confirmations for a mempool tx. - txout := testAddTxOut(msg.tx, msg.vout, txHash, nil, 0, 0) + txout := testAddTxOut(msg.tx, msg.vout, txHash, nil, 0) // Set the value for this one. txout.Value = 5.0 // There is no block info to add, since this is a mempool transaction @@ -858,7 +858,7 @@ func TestUTXOs(t *testing.T) { // Now "mine" the transaction. testAddBlockVerbose(blockHash, nil, 1, txHeight) // Overwrite the test blockchain transaction details. - testAddTxOut(msg.tx, 0, txHash, blockHash, int64(txHeight), 1) + testAddTxOut(msg.tx, 0, txHash, blockHash, 1) // "mining" the block should cause a reorg. confs, err := utxo.Confirmations(context.Background()) if err != nil { @@ -881,7 +881,7 @@ func TestUTXOs(t *testing.T) { blockHash = testAddBlockVerbose(nil, nil, 1, txHeight) txHash = randomHash() msg = testMakeMsgTx(false) - testAddTxOut(msg.tx, msg.vout, txHash, blockHash, int64(txHeight), 1) + testAddTxOut(msg.tx, msg.vout, txHash, blockHash, 1) utxo, err = btc.utxo(txHash, msg.vout, nil) if err != nil { t.Fatalf("case 2 - unexpected error: %v", err) @@ -905,7 +905,7 @@ func TestUTXOs(t *testing.T) { msg = testMakeMsgTx(false) // make the script nonsense. msg.tx.TxOut[0].PkScript = []byte{0x00, 0x01, 0x02, 0x03} - testAddTxOut(msg.tx, msg.vout, txHash, blockHash, int64(txHeight), 1) + testAddTxOut(msg.tx, msg.vout, txHash, blockHash, 1) _, err = btc.utxo(txHash, msg.vout, nil) if err == nil { t.Fatalf("case 4 - received no error for a UTXO with wrong script type") @@ -916,7 +916,7 @@ func TestUTXOs(t *testing.T) { txHash = randomHash() blockHash = testAddBlockVerbose(nil, nil, 1, txHeight) msg = testMakeMsgTx(false) - testAddTxOut(msg.tx, msg.vout, txHash, blockHash, int64(txHeight), 1) + testAddTxOut(msg.tx, msg.vout, txHash, blockHash, 1) utxo, err = btc.utxo(txHash, msg.vout, nil) if err != nil { t.Fatalf("case 5 - received error for utxo") @@ -935,7 +935,7 @@ func TestUTXOs(t *testing.T) { t.Fatalf("case 5 - received no error for orphaned transaction") } // Now put it back in mempool and check again. - testAddTxOut(msg.tx, msg.vout, txHash, nil, 0, 0) + testAddTxOut(msg.tx, msg.vout, txHash, nil, 0) confs, err = utxo.Confirmations(context.Background()) if err != nil { t.Fatalf("case 5 - error checking confirmations on orphaned transaction back in mempool: %v", err) @@ -950,7 +950,7 @@ func TestUTXOs(t *testing.T) { txHash = randomHash() blockHash = testAddBlockVerbose(nil, nil, 1, txHeight) msgMultiSig := testMsgTxP2SHMofN(1, 2, false) - testAddTxOut(msgMultiSig.tx, msgMultiSig.vout, txHash, blockHash, int64(txHeight), 1) + testAddTxOut(msgMultiSig.tx, msgMultiSig.vout, txHash, blockHash, 1) // First try to get the UTXO without providing the raw script. _, err = btc.utxo(txHash, msgMultiSig.vout, nil) if err == nil { @@ -979,7 +979,7 @@ func TestUTXOs(t *testing.T) { txHash = randomHash() blockHash = testAddBlockVerbose(nil, nil, 1, txHeight) msgMultiSig = testMsgTxP2SHMofN(2, 2, false) - testAddTxOut(msgMultiSig.tx, msgMultiSig.vout, txHash, blockHash, int64(txHeight), 1) + testAddTxOut(msgMultiSig.tx, msgMultiSig.vout, txHash, blockHash, 1) utxo, err = btc.utxo(txHash, msgMultiSig.vout, msgMultiSig.script) if err != nil { t.Fatalf("case 7 - received error for utxo: %v", err) @@ -1000,7 +1000,7 @@ func TestUTXOs(t *testing.T) { blockHash = testAddBlockVerbose(nil, nil, 1, txHeight) txHash = randomHash() msg = testMakeMsgTx(true) // true - P2WPKH at vout 0 - testAddTxOut(msg.tx, msg.vout, txHash, blockHash, int64(txHeight), 1) + testAddTxOut(msg.tx, msg.vout, txHash, blockHash, 1) utxo, err = btc.utxo(txHash, msg.vout, nil) if err != nil { t.Fatalf("case 8 - unexpected error: %v", err) @@ -1020,7 +1020,7 @@ func TestUTXOs(t *testing.T) { txHash = randomHash() blockHash = testAddBlockVerbose(nil, nil, 1, txHeight) msgMultiSig = testMsgTxP2SHMofN(2, 2, true) - testAddTxOut(msgMultiSig.tx, msgMultiSig.vout, txHash, blockHash, int64(txHeight), 1) + testAddTxOut(msgMultiSig.tx, msgMultiSig.vout, txHash, blockHash, 1) utxo, err = btc.utxo(txHash, msgMultiSig.vout, msgMultiSig.script) if err != nil { t.Fatalf("case 9 - received error for utxo: %v", err) @@ -1045,7 +1045,7 @@ func TestUTXOs(t *testing.T) { blockHash = testAddBlockVerbose(nil, nil, 1, txHeight) txHash = randomHash() msg = testMakeMsgTx(false) - txOut := testAddTxOut(msg.tx, msg.vout, txHash, blockHash, int64(txHeight), 1) + txOut := testAddTxOut(msg.tx, msg.vout, txHash, blockHash, 1) txOut.Coinbase = true _, err = btc.utxo(txHash, msg.vout, nil) if err == nil { @@ -1072,7 +1072,7 @@ func TestUTXOs(t *testing.T) { swap := testMsgTxSwapInit(val, btc.segwit) testAddBlockVerbose(blockHash, nil, 1, txHeight) btcVal := btcutil.Amount(val).ToBTC() - testAddTxOut(swap.tx, 0, txHash, blockHash, int64(txHeight), 1).Value = btcVal + testAddTxOut(swap.tx, 0, txHash, blockHash, 1).Value = btcVal verboseTx := testChain.txRaws[*txHash] spentTxHash := randomHash() @@ -1309,7 +1309,7 @@ func TestReorg(t *testing.T) { } msg := testMakeMsgTx(false) testAddBlockVerbose(&tip.hash, nil, 1, tipHeight) - testAddTxOut(msg.tx, 0, txHash, &tip.hash, int64(tipHeight), 1) + testAddTxOut(msg.tx, 0, txHash, &tip.hash, 1) utxo, err := btc.utxo(txHash, msg.vout, nil) if err != nil { t.Fatalf("utxo error 1: %v", err) @@ -1324,7 +1324,7 @@ func TestReorg(t *testing.T) { // Orphan the block and move the transaction to mempool. btc.blockCache.reorg(int64(ancestorHeight)) - testAddTxOut(msg.tx, 0, txHash, nil, 0, 0) + testAddTxOut(msg.tx, 0, txHash, nil, 0) confs, err = utxo.Confirmations(context.Background()) if err != nil { t.Fatalf("Confirmations error after reorg: %v", err) @@ -1341,7 +1341,7 @@ func TestReorg(t *testing.T) { t.Fatalf("did not find newly connected block at height %d, likely cache sync issue", tipHeight) } testAddBlockVerbose(&tip.hash, nil, 1, tipHeight) - testAddTxOut(msg.tx, 0, txHash, &tip.hash, int64(tipHeight), 1) + testAddTxOut(msg.tx, 0, txHash, &tip.hash, 1) utxo, err = btc.utxo(txHash, msg.vout, nil) if err != nil { t.Fatalf("utxo error 2: %v", err) @@ -1350,7 +1350,7 @@ func TestReorg(t *testing.T) { // Reorg and add a single block with the transaction. btc.blockCache.reorg(int64(ancestorHeight)) newBlockHash := randomHash() - testAddTxOut(msg.tx, 0, txHash, newBlockHash, int64(ancestorHeight+1), 1) + testAddTxOut(msg.tx, 0, txHash, newBlockHash, 1) testAddBlockVerbose(newBlockHash, ancestorHash, 1, ancestorHeight+1) time.Sleep(blockPollDelay) confs, err = utxo.Confirmations(context.Background()) @@ -1379,7 +1379,7 @@ func TestAuxiliary(t *testing.T) { txHash, _ := chainhash.NewHashFromStr(txid) txHeight := rand.Uint32() blockHash := testAddBlockVerbose(nil, nil, 1, txHeight) - testAddTxOut(msg.tx, msg.vout, txHash, blockHash, int64(txHeight), maturity) + testAddTxOut(msg.tx, msg.vout, txHash, blockHash, maturity) coinID := toCoinID(txHash, msg.vout) verboseTx := testChain.txRaws[*txHash] diff --git a/tatanka/chain/utxo/btc.go b/tatanka/chain/utxo/btc.go index bdfda65e3e..a276f4017f 100644 --- a/tatanka/chain/utxo/btc.go +++ b/tatanka/chain/utxo/btc.go @@ -174,6 +174,7 @@ func (c *bitcoinChain) monitorFees(ctx context.Context) { if tip != nil && *tip == *newTip { continue } + tip = newTip c.connected.Store(true) // estimatesmartfee 1 returns extremely high rates on DCR. estimateFeeResult, err := c.cl.EstimateSmartFee(ctx, 2, chainjson.EstimateSmartFeeConservative) @@ -195,9 +196,7 @@ func (c *bitcoinChain) monitorFees(ctx context.Context) { case <-time.After(time.Second * 5): c.log.Errorf("fee channel is blocking") } - } - } func (c *bitcoinChain) callHashGetter(ctx context.Context, method string, args []any) (*chainhash.Hash, error) { diff --git a/tatanka/chain/utxo/dcr.go b/tatanka/chain/utxo/dcr.go index ed4b866c76..cb647d3307 100644 --- a/tatanka/chain/utxo/dcr.go +++ b/tatanka/chain/utxo/dcr.go @@ -218,6 +218,7 @@ func (c *decredChain) monitorFees(ctx context.Context) { if tip != nil && *tip == *newTip { continue } + tip = newTip c.connected.Store(true) // estimatesmartfee 1 returns extremely high rates on DCR. estimateFeeResult, err := c.cl.EstimateSmartFee(ctx, 2, chainjson.EstimateSmartFeeConservative) @@ -239,9 +240,7 @@ func (c *decredChain) monitorFees(ctx context.Context) { case <-time.After(time.Second * 5): c.log.Errorf("fee channel is blocking") } - } - } func (c *decredChain) CheckBond(b *tanka.Bond) error { diff --git a/tatanka/client_messages.go b/tatanka/client_messages.go index c44ca80a55..7767d87f21 100644 --- a/tatanka/client_messages.go +++ b/tatanka/client_messages.go @@ -115,7 +115,7 @@ func (t *Tatanka) handleClientConnect(cl tanka.Sender, msg *msgjson.Message) *ms pp := &peer{Peer: p, Sender: cl, rrs: rrs} if pp.banned() { - return msgjson.NewError(mj.ErrBannned, "your tier is <= 0. post some bonds") + return msgjson.NewError(mj.ErrBanned, "your tier is <= 0. post some bonds") } bondTier := p.BondTier() diff --git a/tatanka/mj/types.go b/tatanka/mj/types.go index 280c37f898..cb9aeb13a7 100644 --- a/tatanka/mj/types.go +++ b/tatanka/mj/types.go @@ -26,7 +26,7 @@ const ( ErrAuth ErrSig ErrNoConfig - ErrBannned + ErrBanned ErrFailedRelay ) diff --git a/umbrel-app-store.yml b/umbrel-app-store.yml new file mode 100644 index 0000000000..f5aa203c5d --- /dev/null +++ b/umbrel-app-store.yml @@ -0,0 +1,2 @@ +id: "decred" +name: "Decred"