feat: add scaleQuantityWithMinimum function to normalize order quantities and implement corresponding tests

This commit is contained in:
discountry
2025-11-03 21:30:19 +08:00
parent 73a88a8a0f
commit 1832c4c13e
3 changed files with 41 additions and 2 deletions
+12
View File
@@ -46,6 +46,18 @@ export function decimalToScaled(value: number | string | bigint, decimals: numbe
return sign === -1 ? -result : result;
}
export function scaleQuantityWithMinimum(value: number | string | bigint, decimals: number): bigint {
const scaled = decimalToScaled(value, decimals);
if (scaled !== 0n) {
return scaled;
}
const numeric = typeof value === "bigint" ? Number(value) : Number(value);
if (!Number.isFinite(numeric) || numeric === 0) {
return scaled;
}
return numeric < 0 ? -1n : 1n;
}
export function scaledToDecimalString(value: bigint | number | string, decimals: number): string {
if (typeof value === "number") {
if (!Number.isFinite(value)) throw new Error(`Invalid scaled number: ${value}`);
+2 -2
View File
@@ -33,7 +33,7 @@ import {
IMMEDIATE_OR_CANCEL_EXPIRY_PLACEHOLDER,
type LighterEnvironment,
} from "./constants";
import { decimalToScaled, scaledToDecimalString } from "./decimal";
import { decimalToScaled, scaledToDecimalString, scaleQuantityWithMinimum } from "./decimal";
import { lighterOrderToAster, toAccountSnapshot, toDepth, toKlines, toOrders, toTicker } from "./mappers";
interface SimpleEvent<T> {
@@ -888,7 +888,7 @@ export class LighterGateway {
}
const side = params.side;
const isAsk = side === "SELL" ? 1 : 0;
const baseAmount = decimalToScaled(params.quantity, this.sizeDecimals);
const baseAmount = scaleQuantityWithMinimum(params.quantity, this.sizeDecimals);
const baseAmountScaledString = scaledToDecimalString(baseAmount, this.sizeDecimals);
const clientOrderIndex = BigInt(Date.now() % Number.MAX_SAFE_INTEGER);
let priceScaled = params.price != null ? decimalToScaled(params.price, this.priceDecimals) : null;