Skip to content

Cálculo de Rates – Loose Shifts (V3)

Este documento describe el flujo y las llamadas clave para calcular la tasa de cambio (quote) y las tarifas asociadas en un shift suelto (sin firma) en la versión V3 de Switchain.

1. Punto de entrada: getLooseOfferV3

En lib-docs/switchain/files/generalApiResolvers.js:

1072:1090:lib-docs/switchain/files/generalApiResolvers.js
export function getLooseOfferV3({ appId, pair, chainPair, amountFrom, __DI = DI }) {
  // ... Validación de parámetros
  const exchangeRate = Promise.await(
    __DI.RatesHelpers.getExchangeRateV2({
      pair: swPair,
      amount: amountFrom
    })
  )
  // ... Aplicación de tarifas y límites
}

Pasos principales:

  1. Valida parámetros: appId, pair, chainPair, amountFrom.

  2. Verifica que el par y las cadenas estén activos.

  3. Llama a RatesHelpers.getExchangeRateV2({ pair, amount }) para obtener la estructura base:

    ts
    {
      quote,
      amountFrom,
      volume,
      exchangeRates,
      rateFees: RateItem[],
      market
    }
  4. Aplica tarifas de afiliado y own/partner con calculateRateFeesByAppIdV2({ appId, key, rateFees }).

  5. Obtiene límites (minLimit, maxLimit) vía getLimits({ pair, appId }).

  6. Extrae el minerFee filtrando adjustedRateFees.

  7. Devuelve:

    ts
    {
      pair,
      chainPair,
      key,
      quote,
      maxLimit,
      minLimit,
      minerFee
    }

2. RatesHelpers.getExchangeRateV2

En lib-docs/switchain/files/ratesHelpers.js:

70:90:lib-docs/switchain/files/ratesHelpers.js
async function getExchangeRateV2({
  pair,
  amount,
  markets = MARKETS,
  __DI = DI
}) {
  const providerRates = await Promise.all(/* … */)
  // Selección del mejor rate:
  const bestRate = max(activeRates, ({ volumeMinusFee }) => volumeMinusFee)
  // Cálculo de cotización bruta:
  const { quote } = getQuotation({ volume: bestRate.volume, amount })

  // Obtención de tradeFee y minerFee por cadena:
  const [{ fee: tradeFee }] = bestRate.exchangeRates
  const chainMinerFees = await __DI.ProfitabilityHelpers.getSymbolMinerFeeV2({
    pair,
    market
  })
  const minerFeeItems = chainMinerFees.map(ci =>
    __DI.ProfitabilityHelpers.makeMinerFeeItemV2(ci)
  )

  // Construcción inicial de rateFees:
  const rateFees = [
    __DI.ProfitabilityHelpers.makeProviderQuoteItem({ quote }),
    __DI.ProfitabilityHelpers.makeProviderFeeItem({ fee: tradeFee }),
    ...minerFeeItems
  ]

  // Cálculo de quote final:
  const { quote: quoteFinal } = __DI.ProfitabilityHelpers.calculateRatePricing({
    rateFees
  })

  return {
    quote: quoteFinal,
    amountFrom: amount,
    volume: BigNumber(quoteFinal).times(amount).toString(),
    exchangeRates: bestRate.exchangeRates,
    rateFees,
    market
  }
}

3. ProfitabilityHelpersCommon.calculateRateFeesByAppIdV2

En lib-docs/switchain/files/profitabilityHelpersCommon.js:

189:195:lib-docs/switchain/files/profitabilityHelpersCommon.js
async function calculateRateFeesByAppIdV2({
  appId,
  rateFees,
  key,
  pair,
  signature
}) {
  const ownFee = await getSpreadV2({ appId, signature, key })
  const partnerFee = await getPartnerFee({ appId, pair })
  const finalRateFees = [
    ...rateFees,
    makeOwnFeeItem({ fee: ownFee }),
    makePartnerFeeItem({ fee: partnerFee })
  ]
  const { quote } = calculateRatePricing({ rateFees: finalRateFees })
  return { quote, rateFees: finalRateFees }
}

4. Límites y resultado final

  • Los límites se obtienen con:

    js
    const { maxLimit, minLimit } = Promise.await(getLimits({ pair: swPair, appId }))

    (ubicación: generalApiResolvers.js importando offeredPairsHelpers.js).

  • El resultado final del resolver V3 es:

    ts
    {
      pair,
      chainPair,
      key,
      quote,
      maxLimit,
      minLimit,
      minerFee
    }

Con esto tienes un recorrido completo de cómo se calculan las rates para loose shifts en V3, con las referencias directas al código original.