-
+
~
@@ -454,23 +452,23 @@
- Trading Tier
+ [[[Trading Tier]]]
- Trading Limit
- parcels
+ [[[Trading Limit]]]
+ lots
- Current usage
+ [[[Current Usage]]]
%
+
{{template "reputationMeter"}}
diff --git a/client/webserver/site/src/js/dexsettings.ts b/client/webserver/site/src/js/dexsettings.ts
index 9a40867a70..0158818207 100644
--- a/client/webserver/site/src/js/dexsettings.ts
+++ b/client/webserver/site/src/js/dexsettings.ts
@@ -63,7 +63,7 @@ export default class DexSettingsPage extends BasePage {
this.newWalletForm = new forms.NewWalletForm(
page.newWalletForm,
- assetID => this.newWalletCreated(assetID),
+ assetID => this.newWalletCreated(assetID, this.confirmRegisterForm.tier),
this.pwCache,
() => this.runAnimation(this.regAssetForm, page.regAssetForm)
)
@@ -168,7 +168,7 @@ export default class DexSettingsPage extends BasePage {
this.progressTierFormWithSyncedFundedWallet(assetID)
return
}
- this.walletWaitForm.setWallet(wallet, fees)
+ this.walletWaitForm.setWallet(assetID, fees, this.confirmRegisterForm.tier)
this.showForm(page.walletWait)
}
@@ -389,7 +389,7 @@ export default class DexSettingsPage extends BasePage {
return ''
}
- async newWalletCreated (assetID: number) {
+ async newWalletCreated (assetID: number, tier: number) {
this.regAssetForm.refresh()
const user = await app().fetchUser()
if (!user) return
@@ -407,7 +407,7 @@ export default class DexSettingsPage extends BasePage {
return
}
- this.walletWaitForm.setWallet(wallet, bondsFeeBuffer)
+ this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)
await this.showForm(page.walletWait)
}
}
diff --git a/client/webserver/site/src/js/forms.ts b/client/webserver/site/src/js/forms.ts
index 2743e0ed5c..ee1ab23580 100644
--- a/client/webserver/site/src/js/forms.ts
+++ b/client/webserver/site/src/js/forms.ts
@@ -927,6 +927,16 @@ export class FeeAssetSelectionForm {
Doc.show(page.assetSelection)
})
+ Doc.bind(page.whatsABond, 'click', () => {
+ Doc.hide(page.mainBondingForm)
+ Doc.show(page.whatsABondPanel)
+ })
+
+ Doc.bind(page.bondGotIt, 'click', () => {
+ Doc.show(page.mainBondingForm)
+ Doc.hide(page.whatsABondPanel)
+ })
+
app().registerNoteFeeder({
createwallet: (note: WalletCreationNote) => {
if (note.topic === 'QueuedCreationSuccess') this.walletCreated(note.assetID)
@@ -984,7 +994,7 @@ export class FeeAssetSelectionForm {
const r = cFactor(qui) / cFactor(bui)
const quoteLot = mkt.lotsize * mkt.spot.rate / OrderUtil.RateEncodingFactor * r
const s = Doc.formatCoinValue(quoteLot, qui)
- marketTmpl.quoteLotSize.textContent = `(~${s} ${qui})`
+ marketTmpl.quoteLotSize.textContent = `(~${s} ${qui.conventional.unit})`
}
return n
}
@@ -1205,17 +1215,18 @@ export class WalletWaitForm {
}
/* setWallet must be called before showing the WalletWaitForm. */
- setWallet (wallet: WalletState, bondFeeBuffer: number) {
- this.assetID = wallet.assetID
+ setWallet (assetID: number, bondFeeBuffer: number, tier: number) {
+ this.assetID = assetID
this.progressCache = []
this.progressed = false
this.funded = false
this.bondFeeBuffer = bondFeeBuffer // in case we're a token, parent's balance must cover
this.parentAssetSynced = false
const page = this.page
- const asset = app().assets[wallet.assetID]
- this.parentID = asset.token?.parentID
- const bondAsset = this.bondAsset = this.xc.bondAssets[asset.symbol]
+ const asset = app().assets[assetID]
+ const { symbol, unitInfo: ui, wallet: { balance: bal, address, synced, syncProgress }, token } = asset
+ this.parentID = token?.parentID
+ const bondAsset = this.bondAsset = this.xc.bondAssets[symbol]
const symbolize = (el: PageElement, asset: SupportedAsset) => {
Doc.empty(el)
@@ -1223,26 +1234,30 @@ export class WalletWaitForm {
}
for (const span of Doc.applySelector(this.form, '.unit')) symbolize(span, asset)
- page.logo.src = Doc.logoPath(asset.symbol)
- page.depoAddr.textContent = wallet.address
- page.fee.textContent = Doc.formatCoinValue(bondAsset.amount, asset.unitInfo)
+ page.logo.src = Doc.logoPath(symbol)
+ page.depoAddr.textContent = address
- Doc.hide(page.syncUncheck, page.syncCheck, page.balUncheck, page.balCheck, page.syncRemainBox)
+ Doc.hide(page.syncUncheck, page.syncCheck, page.balUncheck, page.balCheck, page.syncRemainBox, page.bondCostBreakdown)
Doc.show(page.balanceBox)
+ let bondLock = 2 * bondAsset.amount * tier
if (bondFeeBuffer > 0) {
- // overlap * increment + buffer
- page.totalForBond.textContent = Doc.formatCoinValue(2 * bondAsset.amount + bondFeeBuffer, asset.unitInfo)
+ Doc.show(page.bondCostBreakdown)
+ page.bondLockNoFees.textContent = Doc.formatCoinValue(bondLock, ui)
+ page.bondLockFees.textContent = Doc.formatCoinValue(bondFeeBuffer, ui)
+ bondLock += bondFeeBuffer
+ const need = Math.max(bondLock - bal.available + bal.reservesDeficit, 0)
+ page.totalForBond.textContent = Doc.formatCoinValue(need, ui)
Doc.hide(page.sendEnough) // generic msg when no fee info available when
Doc.hide(page.txFeeBox, page.sendEnoughForToken, page.txFeeBalanceBox) // for tokens
Doc.hide(page.sendEnoughWithEst) // non-tokens
- if (asset.token) {
+ if (token) {
Doc.show(page.txFeeBox, page.sendEnoughForToken, page.txFeeBalanceBox)
- const parentAsset = app().assets[asset.token.parentID]
+ const parentAsset = app().assets[token.parentID]
page.txFee.textContent = Doc.formatCoinValue(bondFeeBuffer, parentAsset.unitInfo)
page.parentFees.textContent = Doc.formatCoinValue(bondFeeBuffer, parentAsset.unitInfo)
- page.tokenFees.textContent = Doc.formatCoinValue(bondAsset.amount, asset.unitInfo)
+ page.tokenFees.textContent = Doc.formatCoinValue(need, ui)
symbolize(page.txFeeUnit, parentAsset)
symbolize(page.parentUnit, parentAsset)
symbolize(page.parentBalUnit, parentAsset)
@@ -1250,19 +1265,20 @@ export class WalletWaitForm {
} else {
Doc.show(page.sendEnoughWithEst)
}
+ page.fee.textContent = Doc.formatCoinValue(bondLock, ui)
} else { // show some generic message with no amounts, this shouldn't happen... show wallet error?
Doc.show(page.sendEnough)
}
- Doc.show(wallet.synced ? page.syncCheck : wallet.syncProgress >= 1 ? page.syncSpinner : page.syncUncheck)
- Doc.show(wallet.balance.available >= 2 * bondAsset.amount + bondFeeBuffer ? page.balCheck : page.balUncheck)
+ Doc.show(synced ? page.syncCheck : syncProgress >= 1 ? page.syncSpinner : page.syncUncheck)
+ Doc.show(bal.available >= 2 * bondAsset.amount + bondFeeBuffer ? page.balCheck : page.balUncheck)
- page.progress.textContent = (wallet.syncProgress * 100).toFixed(1)
+ page.progress.textContent = (syncProgress * 100).toFixed(1)
- if (wallet.synced) {
+ if (synced) {
this.progressed = true
}
- this.reportBalance(wallet.assetID)
+ this.reportBalance(assetID)
}
/*
diff --git a/client/webserver/site/src/js/markets.ts b/client/webserver/site/src/js/markets.ts
index cb76348ba4..38f86b98c3 100644
--- a/client/webserver/site/src/js/markets.ts
+++ b/client/webserver/site/src/js/markets.ts
@@ -747,6 +747,11 @@ export default class MarketsPage extends BasePage {
Doc.setVis(await showOrderForm(), page.orderForm, page.orderTypeBttns)
+ if (this.market) {
+ const { auth: { effectiveTier, pendingStrength } } = this.market.dex
+ Doc.setVis(effectiveTier > 0 || pendingStrength > 0, page.tradingLimits, page.reputationMeter)
+ }
+
if (app().user.experimental && this.mmRunning === undefined) {
const marketMakingStatus = await app().getMarketMakingStatus()
this.mmRunning = marketMakingStatus.running
@@ -1129,7 +1134,6 @@ export default class MarketsPage extends BasePage {
this.updateTitle()
this.reputationMeter.setHost(dex.host)
this.updateReputation()
- this.updateTradeLimits(null)
this.loadUserOrders()
}
@@ -1257,7 +1261,6 @@ export default class MarketsPage extends BasePage {
}]
}
this.drawChartLines()
- this.updateTradeLimits(order)
if (!show || !adjusted || !order.qty) {
page.orderPreview.textContent = ''
this.drawChartLines()
@@ -1272,24 +1275,6 @@ export default class MarketsPage extends BasePage {
else this.preBuy()
}
- updateTradeLimits (ord: TradeForm | null) {
- const { page, market: { cfg: mkt } } = this
- if (!ord) {
- page.orderFormParcels.textContent = '0'
- return
- }
- const [msgRate, conversionRate] = this.anyRate()
-
- let parcelWeight = ord.qty / mkt.lotsize
- if (!ord.isLimit && !ord.sell) {
- if (conversionRate) parcelWeight = ord.qty / conversionRate / mkt.lotsize
- else parcelWeight = 1 / mkt.parcelsize
- }
-
- if (!ord.isLimit || ord.tifnow || ((ord.sell && ord.rate < msgRate) || (!ord.sell && ord.rate > msgRate))) parcelWeight *= 2
- page.orderFormParcels.textContent = (parcelWeight / mkt.parcelsize).toFixed(1)
- }
-
/**
* preSell populates the max order message for the largest available sell.
*/
@@ -2432,9 +2417,10 @@ export default class MarketsPage extends BasePage {
const tier = strongTier(auth)
page.tradingTier.textContent = String(tier)
const [usedParcels, parcelLimit] = tradingLimits(host)
- page.tradingLimit.textContent = parcelLimit.toFixed(1)
- page.limitUsage.textContent = (usedParcels / parcelLimit * 100).toFixed(1)
- page.orderParcelsRemain.textContent = (parcelLimit - usedParcels).toFixed(1)
+ page.tradingLimit.textContent = String(parcelLimit * mkt.parcelsize)
+ page.limitUsage.textContent = parcelLimit > 0 ? (usedParcels / parcelLimit * 100).toFixed(1) : '0'
+
+ page.orderLimitRemain.textContent = ((parcelLimit - usedParcels) * mkt.parcelsize).toFixed(1)
page.orderTradingTier.textContent = String(tier)
this.reputationMeter.update()
@@ -2462,14 +2448,18 @@ export default class MarketsPage extends BasePage {
}
handleMatchNote (note: MatchNote) {
- this.updateReputation()
const mord = this.metaOrders[note.orderID]
+ const match = note.match
if (!mord) return this.refreshActiveOrders()
- else if (mord.ord.type === OrderUtil.Market && note.match.status === OrderUtil.NewlyMatched) { // Update the average market rate display.
+ else if (mord.ord.type === OrderUtil.Market && match.status === OrderUtil.NewlyMatched) { // Update the average market rate display.
// Fetch and use the updated order.
const ord = app().order(note.orderID)
if (ord) mord.details.rate.textContent = mord.header.rate.textContent = this.marketOrderRateString(ord, this.market)
}
+ if (
+ (match.side === OrderUtil.MatchSideMaker && match.status === OrderUtil.MakerRedeemed) ||
+ (match.side === OrderUtil.MatchSideTaker && match.status === OrderUtil.MatchComplete)
+ ) this.updateReputation()
if (app().canAccelerateOrder(mord.ord)) Doc.show(mord.details.accelerateBttn)
else Doc.hide(mord.details.accelerateBttn)
}
@@ -2479,9 +2469,8 @@ export default class MarketsPage extends BasePage {
* used to update a user's order's status.
*/
handleOrderNote (note: OrderNote) {
- this.updateReputation()
- const order = note.order
- const mord = this.metaOrders[order.id]
+ const ord = note.order
+ const mord = this.metaOrders[ord.id]
// - If metaOrder doesn't exist for the given order it means it was created
// via dexcctl and the GUI isn't aware of it or it was an inflight order.
// refreshActiveOrders must be called to grab this order.
@@ -2490,19 +2479,24 @@ export default class MarketsPage extends BasePage {
// and unlocked) has now become ready to tick. The active orders section
// needs to be refreshed.
const wasInflight = note.topic === 'AsyncOrderFailure' || note.topic === 'AsyncOrderSubmitted'
- if (!mord || wasInflight || (note.topic === 'OrderLoaded' && order.readyToTick)) {
+ if (!mord || wasInflight || (note.topic === 'OrderLoaded' && ord.readyToTick)) {
return this.refreshActiveOrders()
}
const oldStatus = mord.ord.status
- mord.ord = order
+ mord.ord = ord
if (note.topic === 'MissedCancel') Doc.show(mord.details.cancelBttn)
- if (order.filled === order.qty) Doc.hide(mord.details.cancelBttn)
- if (app().canAccelerateOrder(order)) Doc.show(mord.details.accelerateBttn)
+ if (ord.filled === ord.qty) Doc.hide(mord.details.cancelBttn)
+ if (app().canAccelerateOrder(ord)) Doc.show(mord.details.accelerateBttn)
else Doc.hide(mord.details.accelerateBttn)
this.updateMetaOrder(mord)
// Only reset markers if there is a change, since the chart is redrawn.
- if ((oldStatus === OrderUtil.StatusEpoch && order.status === OrderUtil.StatusBooked) ||
- (oldStatus === OrderUtil.StatusBooked && order.status > OrderUtil.StatusBooked)) this.setDepthMarkers()
+ if (
+ (oldStatus === OrderUtil.StatusEpoch && ord.status === OrderUtil.StatusBooked) ||
+ (oldStatus === OrderUtil.StatusBooked && ord.status > OrderUtil.StatusBooked)
+ ) {
+ this.setDepthMarkers()
+ this.updateReputation()
+ }
}
/*
@@ -2709,7 +2703,6 @@ export default class MarketsPage extends BasePage {
const page = this.page
const qty = convertToAtoms(page.mktBuyField.value || '', this.market.quoteUnitInfo.conventional.conversionFactor)
const gap = this.midGap()
- this.updateTradeLimits(this.parseOrder())
if (!gap || !qty) {
page.mktBuyLots.textContent = '0'
page.mktBuyScore.textContent = '0'
diff --git a/client/webserver/site/src/js/register.ts b/client/webserver/site/src/js/register.ts
index b90cd42100..b8df3f17d3 100644
--- a/client/webserver/site/src/js/register.ts
+++ b/client/webserver/site/src/js/register.ts
@@ -77,7 +77,7 @@ export default class RegistrationPage extends BasePage {
this.newWalletForm = new NewWalletForm(
page.newWalletForm,
- assetID => this.newWalletCreated(assetID),
+ assetID => this.newWalletCreated(assetID, this.confirmRegisterForm.tier),
this.pwCache,
() => this.animateRegAsset(page.newWalletForm)
)
@@ -106,7 +106,7 @@ export default class RegistrationPage extends BasePage {
this.animateConfirmForm(page.regAssetForm)
return
}
- this.walletWaitForm.setWallet(wallet, bondsFeeBuffer)
+ this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)
slideSwap(page.regAssetForm, page.walletWait)
return
}
@@ -207,7 +207,7 @@ export default class RegistrationPage extends BasePage {
await app().loadPage('markets')
}
- async newWalletCreated (assetID: number) {
+ async newWalletCreated (assetID: number, tier: number) {
this.regAssetForm.refresh()
const user = await app().fetchUser()
if (!user) return
@@ -222,7 +222,7 @@ export default class RegistrationPage extends BasePage {
return
}
- this.walletWaitForm.setWallet(wallet, bondsFeeBuffer)
+ this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)
await slideSwap(page.newWalletForm, page.walletWait)
}
}
diff --git a/client/webserver/site/src/js/settings.ts b/client/webserver/site/src/js/settings.ts
index ddc5707644..0a6221fd5e 100644
--- a/client/webserver/site/src/js/settings.ts
+++ b/client/webserver/site/src/js/settings.ts
@@ -86,7 +86,7 @@ export default class SettingsPage extends BasePage {
this.animateConfirmForm(page.regAssetForm)
return
}
- this.walletWaitForm.setWallet(wallet, bondsFeeBuffer)
+ this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)
this.slideSwap(page.walletWait)
return
}
@@ -106,7 +106,7 @@ export default class SettingsPage extends BasePage {
// Create a new wallet
this.newWalletForm = new forms.NewWalletForm(
page.newWalletForm,
- assetID => this.newWalletCreated(assetID),
+ assetID => this.newWalletCreated(assetID, this.confirmRegisterForm.tier),
this.pwCache,
() => this.animateRegAsset(page.newWalletForm)
)
@@ -254,7 +254,7 @@ export default class SettingsPage extends BasePage {
return res.feeBuffer
}
- async newWalletCreated (assetID: number) {
+ async newWalletCreated (assetID: number, tier: number) {
const user = await app().fetchUser()
if (!user) return
const page = this.page
@@ -269,7 +269,7 @@ export default class SettingsPage extends BasePage {
return
}
- this.walletWaitForm.setWallet(wallet, bondsFeeBuffer)
+ this.walletWaitForm.setWallet(assetID, bondsFeeBuffer, tier)
this.slideSwap(page.walletWait)
}