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:
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:
Valida parámetros:
appId,pair,chainPair,amountFrom.Verifica que el par y las cadenas estén activos.
Llama a
RatesHelpers.getExchangeRateV2({ pair, amount })para obtener la estructura base:ts{ quote, amountFrom, volume, exchangeRates, rateFees: RateItem[], market }Aplica tarifas de afiliado y own/partner con
calculateRateFeesByAppIdV2({ appId, key, rateFees }).Obtiene límites (
minLimit,maxLimit) víagetLimits({ pair, appId }).Extrae el
minerFeefiltrandoadjustedRateFees.Devuelve:
ts{ pair, chainPair, key, quote, maxLimit, minLimit, minerFee }
2. RatesHelpers.getExchangeRateV2
En 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:
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:
jsconst { maxLimit, minLimit } = Promise.await(getLimits({ pair: swPair, appId }))(ubicación:
generalApiResolvers.jsimportandoofferedPairsHelpers.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.
