Skip to content

Commit

Permalink
scale booking fees by order reserves. allow starting with insufficien…
Browse files Browse the repository at this point in the history
…t fee avail
  • Loading branch information
buck54321 committed Jul 15, 2024
1 parent 4b3576f commit eae3899
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 22 deletions.
10 changes: 10 additions & 0 deletions client/webserver/site/src/html/mmsettings.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -484,6 +484,11 @@
<span data-fee-ticker></span> per lot
</span>
</div>
<div class="d-flex align-items-end justify-content-end">
<span class="fs14 grey me-1">x</span>
<span data-tmpl="swapReservesFactor" class="fs16"></span>
<span class="fs14 grey ms-1">reserves</span>
</div>
<div data-tmpl="redemptionFeesBox" class="flex-stretch-column">
<div class="d-flex align-items-end justify-content-end">
<span class="fs14 grey me-1">+</span>
Expand All @@ -497,6 +502,11 @@
<span data-fee-ticker></span> per redeem
</span>
</div>
<div class="d-flex align-items-end justify-content-end">
<span class="fs14 grey me-1">x</span>
<span data-tmpl="redeemReservesFactor" class="fs16"></span>
<span class="fs14 grey ms-1">reserves</span>
</div>
</div>
<div class="d-flex align-items-end justify-content-end">
<span class="fs14 grey me-1">=</span>
Expand Down
17 changes: 9 additions & 8 deletions client/webserver/site/src/js/mm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -574,8 +574,8 @@ class Bot extends BotMarket {
[quoteID]: proposedCexQuote * quoteFactor
}
}
alloc.dex[baseFeeID] = (alloc.dex[baseFeeID] ?? 0) + f.base.fees.req * baseFeeFactor
alloc.dex[quoteFeeID] = (alloc.dex[quoteFeeID] ?? 0) + f.quote.fees.req * quoteFeeFactor
alloc.dex[baseFeeID] = Math.min((alloc.dex[baseFeeID] ?? 0) + f.base.fees.req, f.base.fees.avail) * baseFeeFactor
alloc.dex[quoteFeeID] = Math.min((alloc.dex[quoteFeeID] ?? 0) + f.quote.fees.req, f.quote.fees.avail) * quoteFeeFactor

let totalUSD = (alloc.dex[baseID] / baseFactor * baseFiatRate) + (alloc.dex[quoteID] / quoteFactor * quoteFiatRate)
totalUSD += (alloc.cex[baseID] / baseFactor * baseFiatRate) + (alloc.cex[quoteID] / quoteFactor * quoteFiatRate)
Expand Down Expand Up @@ -639,18 +639,19 @@ class Bot extends BotMarket {

Doc.setVis(baseFeeID !== baseID, ...Doc.applySelector(page.allocationDialog, '[data-base-token-fees]'))
if (baseFeeID !== baseID) {
const feeReq = f.base.fees.req + (baseFeeID === quoteFeeID ? f.quote.fees.req : 0)
page.proposedDexBaseFeeAlloc.textContent = Doc.formatFourSigFigs(feeReq)
page.proposedDexBaseFeeAllocUSD.textContent = Doc.formatFourSigFigs(feeReq * baseFeeFiatRate)
const reqFees = f.base.fees.req + (baseFeeID === quoteFeeID ? f.quote.fees.req : 0)
const proposedFees = Math.min(reqFees, f.base.fees.avail)
page.proposedDexBaseFeeAlloc.textContent = Doc.formatFourSigFigs(proposedFees)
page.proposedDexBaseFeeAllocUSD.textContent = Doc.formatFourSigFigs(proposedFees * baseFeeFiatRate)
page.proposedDexBaseFeeAlloc.classList.toggle('text-warning', !f.base.fees.funded)
}

const needQuoteTokenFees = quoteFeeID !== quoteID && quoteFeeID !== baseFeeID
Doc.setVis(needQuoteTokenFees, ...Doc.applySelector(page.allocationDialog, '[data-quote-token-fees]'))
if (needQuoteTokenFees) {
const feeReq = f.quote.fees.req
page.proposedDexQuoteFeeAlloc.textContent = Doc.formatFourSigFigs(feeReq)
page.proposedDexQuoteFeeAllocUSD.textContent = Doc.formatFourSigFigs(feeReq * quoteFeeFiatRate)
const proposedFees = Math.min(f.quote.fees.req, f.quote.fees.avail)
page.proposedDexQuoteFeeAlloc.textContent = Doc.formatFourSigFigs(proposedFees)
page.proposedDexQuoteFeeAllocUSD.textContent = Doc.formatFourSigFigs(proposedFees * quoteFeeFiatRate)
page.proposedDexQuoteFeeAlloc.classList.toggle('text-warning', !f.quote.fees.funded)
}

Expand Down
9 changes: 6 additions & 3 deletions client/webserver/site/src/js/mmsettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -879,7 +879,8 @@ export default class MarketMakerSettingsPage extends BasePage {

const { commit, fees } = feesAndCommit(
baseID, quoteID, baseFees, quoteFees, lotSize, dexBaseLots, dexQuoteLots,
baseFeeAssetID, quoteFeeAssetID, baseIsAccountLocker, quoteIsAccountLocker
baseFeeAssetID, quoteFeeAssetID, baseIsAccountLocker, quoteIsAccountLocker,
cfg.baseConfig.orderReservesFactor, cfg.quoteConfig.orderReservesFactor
)

return {
Expand Down Expand Up @@ -2221,7 +2222,7 @@ class AssetPane {
this.minTransferSlider = new MiniSlider(page.minTransferSlider, (r: number) => {
const { cfg } = this
const totalInventory = this.commit()
const [minV, maxV] = [0, totalInventory]
const [minV, maxV] = [this.minTransfer.min, Math.min(this.minTransfer.min, totalInventory)]
cfg.transferFactor = r
this.minTransfer.setValue(minV + r * (maxV - minV))
})
Expand Down Expand Up @@ -2296,6 +2297,7 @@ class AssetPane {
page.bookCommitment.textContent = Doc.formatFourSigFigs(inv.book)
const feesPerLotConv = fees.bookingFeesPerLot / feeUI.conventional.conversionFactor
page.bookingFeesPerLot.textContent = Doc.formatFourSigFigs(feesPerLotConv)
page.swapReservesFactor.textContent = fees.swapReservesFactor.toFixed(2)
page.bookingFeesLots.textContent = String(lots)
inv.bookingFees = fees.bookingFees / feeUI.conventional.conversionFactor
page.bookingFees.textContent = Doc.formatFourSigFigs(inv.bookingFees)
Expand Down Expand Up @@ -2327,6 +2329,7 @@ class AssetPane {
const feesPerLotConv = fees.bookingFeesPerCounterLot / feeUI.conventional.conversionFactor
page.redemptionFeesPerLot.textContent = Doc.formatFourSigFigs(feesPerLotConv)
page.redemptionFeesLots.textContent = String(counterLots)
page.redeemReservesFactor.textContent = fees.redeemReservesFactor.toFixed(2)
}
this.updateCommitTotal()
this.updateTokenFees()
Expand Down Expand Up @@ -2354,7 +2357,7 @@ class AssetPane {
Doc.setVis(showRebalance, page.rebalanceOpts)
if (!showRebalance) return
const totalInventory = this.commit()
const [minV, maxV] = [this.minTransfer.min, totalInventory]
const [minV, maxV] = [this.minTransfer.min, Math.min(this.minTransfer.min * 2, totalInventory)]
const rangeV = maxV - minV
this.minTransfer.setValue(minV + cfg.transferFactor * rangeV)
this.minTransferSlider.setValue((cfg.transferFactor - defaultTransfer.minR) / defaultTransfer.range)
Expand Down
35 changes: 24 additions & 11 deletions client/webserver/site/src/js/mmutil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -577,12 +577,14 @@ export class BotMarket {
feesAndCommit () {
const {
baseID, quoteID, marketReport: { baseFees, quoteFees }, lotSize,
baseLots, quoteLots, baseFeeID, quoteFeeID, baseIsAccountLocker, quoteIsAccountLocker
baseLots, quoteLots, baseFeeID, quoteFeeID, baseIsAccountLocker, quoteIsAccountLocker,
cfg: { uiConfig: { baseConfig, quoteConfig } }
} = this

return feesAndCommit(
baseID, quoteID, baseFees, quoteFees, lotSize, baseLots, quoteLots,
baseFeeID, quoteFeeID, baseIsAccountLocker, quoteIsAccountLocker
baseFeeID, quoteFeeID, baseIsAccountLocker, quoteIsAccountLocker,
baseConfig.orderReservesFactor, quoteConfig.orderReservesFactor
)
}

Expand Down Expand Up @@ -874,8 +876,8 @@ export class RunningMarketMakerDisplay {
}

Doc.show(page.stats)
setSignedValue(runStats.profitLoss.profitRatio, page.profit, page.profitSign)
setSignedValue(runStats.profitLoss.profit, page.profitLoss, page.plSign)
setSignedValue(runStats.profitLoss.profitRatio, page.profit, page.profitSign, 2)
setSignedValue(runStats.profitLoss.profit, page.profitLoss, page.plSign, 2)
this.startTime = runStats.startTime

const summedBalance = (b: BotBalance) => {
Expand Down Expand Up @@ -945,8 +947,8 @@ export class RunningMarketMakerDisplay {
}
}

function setSignedValue (v: number, vEl: PageElement, signEl: PageElement) {
vEl.textContent = Doc.formatFourSigFigs(v)
function setSignedValue (v: number, vEl: PageElement, signEl: PageElement, maxDecimals?: number) {
vEl.textContent = Doc.formatFourSigFigs(v, maxDecimals)
signEl.classList.toggle('ico-plus', v > 0)
signEl.classList.toggle('text-good', v > 0)
// signEl.classList.toggle('ico-minus', v < 0)
Expand All @@ -955,7 +957,8 @@ function setSignedValue (v: number, vEl: PageElement, signEl: PageElement) {
export function feesAndCommit (
baseID: number, quoteID: number, baseFees: LotFeeRange, quoteFees: LotFeeRange,
lotSize: number, baseLots: number, quoteLots: number, baseFeeID: number, quoteFeeID: number,
baseIsAccountLocker: boolean, quoteIsAccountLocker: boolean
baseIsAccountLocker: boolean, quoteIsAccountLocker: boolean, baseOrderReservesFactor: number,
quoteOrderReservesFactor: number
) {
const quoteLot = calculateQuoteLot(lotSize, baseID, quoteID)
const [cexBaseLots, cexQuoteLots] = [quoteLots, baseLots]
Expand Down Expand Up @@ -1008,21 +1011,31 @@ export function feesAndCommit (
if (!baseIsAccountLocker && quoteFeeID !== baseFeeID) quoteRedeemReservesPerLot = quoteFees.max.redeem
}

const baseReservesFactor = 1 + baseOrderReservesFactor
const quoteReservesFactor = 1 + quoteOrderReservesFactor

const baseBookingFees = (baseBookingFeesPerLot * baseLots) * baseReservesFactor
const baseRedeemFees = (baseRedeemReservesPerLot * quoteLots) * quoteReservesFactor
const quoteBookingFees = (quoteBookingFeesPerLot * quoteLots) * quoteReservesFactor
const quoteRedeemFees = (quoteRedeemReservesPerLot * baseLots) * baseReservesFactor

const fees: BookingFees = {
base: {
...baseFees,
bookingFeesPerLot: baseBookingFeesPerLot,
bookingFeesPerCounterLot: baseRedeemReservesPerLot,
// TODO: We may want to consider the order reserves factor too, since
// booking fees for the taker are not freed immediately after matching.
bookingFees: baseBookingFeesPerLot * baseLots + baseRedeemReservesPerLot * quoteLots,
bookingFees: baseBookingFees + baseRedeemFees,
swapReservesFactor: baseReservesFactor,
redeemReservesFactor: quoteReservesFactor,
tokenFeesPerSwap: baseTokenFeesPerSwap
},
quote: {
...quoteFees,
bookingFeesPerLot: quoteBookingFeesPerLot,
bookingFeesPerCounterLot: quoteRedeemReservesPerLot,
bookingFees: quoteBookingFeesPerLot * quoteLots + quoteRedeemReservesPerLot * baseLots,
bookingFees: quoteBookingFees + quoteRedeemFees,
swapReservesFactor: quoteReservesFactor,
redeemReservesFactor: baseReservesFactor,
tokenFeesPerSwap: quoteTokenFeesPerSwap
}
}
Expand Down
2 changes: 2 additions & 0 deletions client/webserver/site/src/js/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -512,6 +512,8 @@ export interface AssetBookingFees extends LotFeeRange {
bookingFeesPerLot: number
bookingFeesPerCounterLot: number
bookingFees: number
swapReservesFactor: number // (1 + orderReservesFactor)
redeemReservesFactor: number
tokenFeesPerSwap: number
}

Expand Down

0 comments on commit eae3899

Please sign in to comment.