Some checks failed
deploy / deploy (push) Failing after 43s
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.
87 lines
2.4 KiB
JavaScript
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');
|
|
});
|