import test from 'node:test'; import assert from 'node:assert/strict'; import { classifyRouteDirection, computeDestinationAmountUnitsFromRoute, resolveRouteRates, } from '../src/core/route-rates.mjs'; const BTC = 'nep141:nbtc.bridge.near'; const EURE = 'nep141:eure.omft.near'; const USDC = 'nep141:usdc.omft.near'; test('generic route math handles BTC/EUR base to quote and quote to base fixtures', () => { const priceRoute = { routeId: 'btc-eur-route', source: 'btc_eur_reference', baseAssetId: BTC, quoteAssetId: EURE, }; const price = { price_route_id: 'btc-eur-route', quote_per_base: '50000', base_per_quote: '0.00002', }; const sellBtcDirection = classifyRouteDirection({ sourceAssetId: BTC, destinationAssetId: EURE, priceRoute, }); const buyBtcDirection = classifyRouteDirection({ sourceAssetId: EURE, destinationAssetId: BTC, priceRoute, }); assert.equal(sellBtcDirection, 'base_to_quote'); assert.equal(buyBtcDirection, 'quote_to_base'); const rates = resolveRouteRates({ price, priceRoute, direction: sellBtcDirection }); assert.equal(rates.ok, true); assert.equal(computeDestinationAmountUnitsFromRoute({ sourceAmountUnits: '10000', sourceDecimals: 8, destinationDecimals: 18, direction: sellBtcDirection, quotePerBase: rates.quotePerBase, basePerQuote: rates.basePerQuote, }), '5000000000000000000'); assert.equal(computeDestinationAmountUnitsFromRoute({ sourceAmountUnits: '5000000000000000000', sourceDecimals: 18, destinationDecimals: 8, direction: buyBtcDirection, quotePerBase: rates.quotePerBase, basePerQuote: rates.basePerQuote, }), '10000'); }); test('generic route math handles BTC/USDC legacy adapter fields', () => { const priceRoute = { routeId: 'btc-usdc-route', source: 'btc_usdc_reference', baseAssetId: BTC, quoteAssetId: USDC, }; const rates = resolveRouteRates({ price: { price_route_id: 'btc-usdc-route', usdc_per_btc: '80000', btc_per_usdc: '0.0000125', }, priceRoute, direction: 'quote_to_base', }); assert.equal(rates.ok, true); assert.equal(computeDestinationAmountUnitsFromRoute({ sourceAmountUnits: '10000000', sourceDecimals: 6, destinationDecimals: 8, direction: 'quote_to_base', quotePerBase: rates.quotePerBase, basePerQuote: rates.basePerQuote, }), '12500'); });