unrip/test/route-rates.test.mjs
philipp 729d2ade0e
Some checks failed
deploy / deploy (push) Failing after 43s
Implement pair-native trade semantics
Proof: Pair-native trade semantics and multi-asset outcome truth; strategy, request preflight, outcome attribution, valuation visibility, dashboard labels, alerts, and ops watch paths now use DB pair/asset/route metadata with nBTC/EURe compatibility and nBTC/USDC regressions covered.

Assumptions: Postgres asset, pair, strategy config, and price route rows remain canonical; supported reference adapters remain BTC/EUR and BTC/USDC; deployment is push-driven through the existing Forgejo workflow.

Still fake: Arbitrary multi-hop valuation, new execution venues, fee-complete realized PnL, venue-native terminal fill ingestion, and autonomous optimization remain unbuilt.
2026-05-18 18:52:18 +02:00

87 lines
2.4 KiB
JavaScript

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');
});